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 [2]:
from IPython.display import HTML
HTML("""
<video width="640" height="480" controls>
  <source src="springback-small.mp4" type="video/mp4">
</video>
""")
Out[2]:
In [3]:
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_data_2016.10.12/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 [4]:
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[4]:
<matplotlib.text.Text at 0x107658690>

Plotting Specific Bending stiffness¶

In [5]:
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[5]:
<matplotlib.text.Text at 0x107ac5050>

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 [6]:
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_data_2016.11.08/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 [7]:
#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[7]:
<matplotlib.text.Text at 0x107c693d0>
In [8]:
#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[8]:
<matplotlib.text.Text at 0x1080e7b50>

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 [9]:
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_data_2016.12.14/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 [10]:
#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')
Out[10]:
<matplotlib.text.Text at 0x1060dcdd0>
In [11]:
#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[11]:
<matplotlib.text.Text at 0x108318990>