In [1]:
from __future__ import division
from numpy import *
%pylab inline
style.use('bmh')
cols = ['#348ABD', '#A60628', '#7A68A6', '#467821','#D55E00','#CC79A7', '#56B4E9', '#009E73', '#F0E442', '#0072B2']
Populating the interactive namespace from numpy and matplotlib

Stiffness vs. Resin type

In [110]:
from IPython.display import HTML
HTML("""
<video width="640" height="480" controls>
  <source src="springback-small.mp4" type="video/mp4">
</video>
""")
Out[110]:
In [111]:
l0 = 86*1e-3 #m
w0 = 35*1e-3 #mm
m = [11.17, 11.03, 10.71, 10.33, 11.32, 11.16, 22.57, 21.83, 26.23, 23.96] #grams
thickness = [2.58, 2.56, 2.49, 2.45, 2.49, 2.58, 3.57, 3.38, 4.1, 3.66] #thickness
thickness = [1e-3*t for t in thickness] #scale to m
resin = [
    'Boatyard Polyester','Boatyard Polyester',
    'Super Sap','Super Sap',
    'West Systems 205','West Systems 205',
    'Aqua Resin, Painted','Aqua Resin, Painted',
    'Aqua Resin, Dipped','Aqua Resin, Dipped'
]
tests = [1, 1, 2, 3, 4, 5, 6, 7, 8, 9]
colors = [0,0,1,1,2,2,3,3,4,4]
fn = lambda i: 'instron/Specimen_RawData_%d.csv'%(i+2)
data = []
for i in range(10):
    ind = tests[i]-1
    record = {'name': resin[ind], 'mass':m[ind], 'thickness':thickness[ind],'color':cols[colors[ind]]}
    with open(fn(i), 'r') as f:
        f.readline();f.readline(); #strip header
        spec_data = []
        for l in f.readlines():
             spec_data.append(map(float,l.strip('\n').split(',')))
        spec_data = asarray(spec_data)
        spec_data[:,1] -= spec_data[0,1] #subtract initial displacement
        spec_data[:,1] *= -1 #make positive
        spec_data[:,2] *= -1 #make positive
        spec_data[:,1] *= 1e-3 #scale displacement to meters
        spec_data[:,1] *= (1/l0) #scale displacement by l0 to get unitless
        spec_data[:,2] *= (l0**2)/(4*w0*thickness[ind]**3) #scale force to get pressure
        record['data'] = spec_data
    
    data.append(record)

Price

  • Super Sap, $25 / quart
  • West System, ~$30 / quart

Plotting Bending stiffness

In [100]:
figure(figsize=(8,6))
used_labels = []
for record in data:
    plot( record['data'][:,1], record['data'][:,2], c=record['color'], label=record['name'] if record['name'] not in used_labels else '')
    used_labels.append(record['name'])
xlim([0,.1])
ylim([0,3e8])
#by_label = OrderedDict(zip(gca().get_legend_handles_labels())) #reduce duplicate legend entries
#legend(by_label.values(), by_label.keys())
legend(loc=(1.01,.01))
#legend(loc='lower right')
xlabel('$d/L$ (unitless)')
ylabel('$(FL^2)/(4wh^3)$ (Pa)')
title('Bending stiffness of Composite Coupons')
Out[100]:
<matplotlib.text.Text at 0x11913e050>

Plotting Specific Bending stiffness

In [106]:
figure(figsize=(8,6))
used_labels = []
for record in data:
    plot( record['data'][:,1], record['data'][:,2]/record['mass'], c=record['color'], label=record['name'] if record['name'] not in used_labels else '')
    used_labels.append(record['name'])
xlim([0,.1])
ylim([0,2.5e7])
#by_label = OrderedDict(zip(gca().get_legend_handles_labels())) #reduce duplicate legend entries
#legend(by_label.values(), by_label.keys())
legend(loc=(1.01,.01))
#legend(loc='lower right')
xlabel('$d/L$ (unitless)')
ylabel('$(FL^2)/(4wh^3)/m$ (Pa/g)')
title('Specific Bending stiffness of Composite Coupons')
Out[106]:
<matplotlib.text.Text at 0x11a1f2490>

Microscopy for Compaction Method

Here we compare a few proposed methods for easy hand layup. First, dry fiber is wet out with Super Sap epoxy. In the first method, coupons are squeegied to remove excess resin and let to cure. In the second, coupons are placed under hydrostatic compaction (a garbage bag). In the third, coupons are placed in a vacuum bag (Space Saver) and put under vacuum. In the fourth, coupons are covered with a perforated bleeder layer, followed by a breather layer (quilting batting), and then placed under vacuum as before. In the final method, coupons are placed between two boards and clamped.

The microscope photographs show approximately 3mm thick samples with back and front illumination. A helpful way to gauge compaction is to look at the distance between fibers running in plane and out of plane.

The resounding message of the microscopy and instron testing is that providing an easy path for resin evacuation is almost more important than compaction force.

Squeegie

Hydrostatic

Vacuum without Bleeder/Breather

Vacuum with Bleeder/Breather

Clamps

Specific Stiffness vs. Compaction Method

In [19]:
labels = [
    'Squeegie','Squeegie',
    'Hydrostatic','Hydrostatic',
    'Vacuum without bleeder','Vacuum without bleeder',
    'Vacuum with bleeder','Vacuum with bleeder',
    'Clamps','Clamps']
l0 = 75*1e-3 #m, three point bending width
#dimensions to use for density
lengths = 1e-3*asarray([111.38,109.53,110.94,110.37,110.15,112.64,105.83,106.40,111.15,110.24])
widths = 1e-3*asarray([[33.08,33.61],[32.78,33.40],[32.09,32.78],[31.83,32.96],[32.37,32.98],[33.05,33.10],[32.63,34.13],[33.23,33.55],[32.32,33.02],[33.58,32.34]]) #mm
thicknesses = 1e-3*asarray([
        [3.76,3.91,4.15],
        [3.65,3.95,3.76],
        [3.53,4.32,3.71],
        [3.98,4.10,4.49],
        [3.77,3.94,3.84],
        [3.70,4.16,3.93],
        [3.29,3.27,3.05],
        [2.87,3.03,2.98],
        [1.96,2.35,2.42],
        [2.23,2.53,2.31],
    ]) #thickness at end, middle, other end.
masses = [14.96,13.72,16.00,17.30,15.83,16.65,12.67,11.53,8.76,9.61] #grams
#plotting
colors = [0,0,1,1,2,2,3,3,4,4]
fn = lambda i: 'instron-compaction/Specimen_RawData_%d.csv'%(i+1)
data = []
for ind in range(10):
    record = {'name': labels[ind], 
              'mass':masses[ind], 
              'thickness':sum(thicknesses[ind])/3,
              'width':sum(widths[ind])/2,
              'length':lengths[ind],
              'color':cols[colors[ind]]}
    record['volume'] = record['length']*record['width']*record['thickness']
    record['density'] = record['mass']/record['volume']
    with open(fn(ind), 'r') as f:
        f.readline();f.readline(); #strip header
        spec_data = []
        for l in f.readlines():
             spec_data.append(map(float,l.strip('\n').split(',')))
        spec_data = asarray(spec_data)
        spec_data[:,1] *= -1 #make positive
        spec_data[:,2] *= -1 #make positive        
        spec_data -= spec_data[0] #subtract initial displacement
        spec_data[:,1] *= 1e-3 #scale displacement to meters
        spec_data[:,1] *= (1/l0) #scale displacement by l0 to get unitless
        spec_data[:,2] *= (l0**2)/(4*record['width']*record['thickness']**3) #scale force to get pressure units
        record['data'] = spec_data
    
    data.append(record)
In [3]:
#Bending Stiffness
figure(figsize=(10,8))
used_labels = []
for record in data:
    plot( record['data'][:,1], record['data'][:,2], c=record['color'], label=record['name'] if record['name'] not in used_labels else '')
    used_labels.append(record['name'])
xlim([0,.11])
ylim([0,4e8])

legend(loc='upper left')
xlabel('$d/L$ (unitless)')
ylabel('Bending Stress $(FL^2)/(4wh^3)$ (Pa)')
title('Bending stiffness of Composite Coupons')
Out[3]:
<matplotlib.text.Text at 0x10d4b2250>
In [4]:
#Specific Stiffness
figure(figsize=(10,8))
used_labels = []
for record in data:
    plot( record['data'][:,1], record['data'][:,2]/record['density'], c=record['color'], label=record['name'] if record['name'] not in used_labels else '')
    used_labels.append(record['name'])
xlim([0,.11])
ylim([0,350])

legend(loc='upper left')
xlabel('$d/L$ (unitless)')
ylabel(r'Specific Bending Stress $(FL^2)/(4wh^3)/\rho$ $(Nm/kg)$')
title('Specific Bending stiffness of Composite Coupons')
Out[4]:
<matplotlib.text.Text at 0x10dc12610>

Specific Stiffness vs. Fiber Type

We compared carbon fiber cloth with super sap in a vacuum bag, fiberglass cloth with super sap in a vacuum bag, and comingled fiberglass and polypropelyne fibers, thermally consolidated under pressure.

In [20]:
labels = [
    'Carbon Super Sap','Carbon Super Sap',
    'Fiberglass Super Sap','Fiberglass Super Sap',
    'Fiberglass Polypropylene','Fiberglass Polypropylene']
l0 = 75*1e-3 #m, three point bending width
#dimensions to use for density
lengths = asarray([4.58,4.46,4.68,4.53,4.5,4.47])/39.3
widths =  asarray([1.5,1.46,1.51,1.39,1.56,1.57])/39.3
thicknesses = asarray([.066,.061,.113,.123,.040,.044])/39.3 #thickness
masses = [7.3,7.0,14.0,14.3,6.1,6.7] #grams
#plotting
colors = [0,0,1,1,2,2,3,3]
fn = lambda i: 'instron-fiber/Specimen_RawData_%d.csv'%(i+1)
#data = [] #clear data
data = [record for record in data if record['name']=='Vacuum without bleeder'] #keep vacuum from before
for record in data:
    record['name'] = 'Burlap Super Sap'
    record['color'] = cols[4]
for ind in range(6):
    record = {'name': labels[ind], 
              'mass':masses[ind], 
              'thickness':thicknesses[ind],
              'width':widths[ind],
              'length':lengths[ind],
              'color':cols[colors[ind]]}
    record['volume'] = record['length']*record['width']*record['thickness']
    record['density'] = record['mass']/record['volume']
    with open(fn(ind), 'r') as f:
        f.readline();f.readline(); #strip header
        spec_data = []
        for l in f.readlines():
             spec_data.append(map(float,l.strip('\n').split(',')))
        spec_data = asarray(spec_data)
        spec_data[:,1] *= -1 #make positive
        spec_data[:,2] *= -1 #make positive        
        spec_data -= spec_data[0] #subtract initial displacement
        spec_data[:,1] *= 1e-3 #scale displacement to meters
        spec_data[:,1] *= (1/l0) #scale displacement by l0 to get unitless
        spec_data[:,2] *= (l0**2)/(4*record['width']*record['thickness']**3) #scale force to get pressure units
        record['data'] = spec_data
    
    data.append(record)
def smooth(y, box_pts):
    box = np.ones(box_pts)/box_pts
    y_smooth = np.convolve(y, box, mode='same')
    return y_smooth
In [ ]:
#Bending Stiffness
figure(figsize=(10,8))
used_labels = []
for record in data:
    plot( record['data'][:,1], smooth(record['data'][:,2],5), c=record['color'], label=record['name'] if record['name'] not in used_labels else '')
    used_labels.append(record['name'])
#xlim([0,.11])
ylim([0,4e8])

legend(loc='upper left')
xlabel('$d/L$ (unitless)')
ylabel('Bending Stress $(FL^2)/(4wh^3)$ (Pa)')
title('Bending stiffness of Composite Coupons')
In [21]:
#Specific Stiffness
figure(figsize=(10,8))
used_labels = []
for record in data:
    plot( record['data'][:-7,1], smooth(record['data'][:,2],7)[:-7]/record['density'], c=record['color'], label=record['name'] if record['name'] not in used_labels else '')
    used_labels.append(record['name'])
xlim([0,.11])
ylim([0,600])

legend(loc='upper left')
xlabel('$d/L$ (unitless)')
ylabel(r'Specific Bending Stress $(FL^2)/(4wh^3)/\rho$ $(Nm/kg)$')
title('Specific Bending stiffness of Composite Coupons')
Out[21]:
<matplotlib.text.Text at 0x10e98a090>
In [ ]: