TMM4175 Polymer Composites

Home About Python Links Table of Contents

CASE STUDY: Elastic properties of woven plies

The mechanical properties of ply materials with woven reinforcement are often limited or not supplied at all. Although the best solution obviously is to characterize the material by testing, simple estimations using micro-mechanical models and principles from laminate theory may provide reasonable values for preliminary design.

In this demonstration, we consider a plain E-glass weave in an epoxy, where the relevant elastic constants of the two (isotropic) materials are Young’s modulus and Poisson’s ratio:

In [1]:
#Ef, vf = 70000.0, 0.22
#Em, vm =  3000.0, 0.40

Ef, vf = 240000.0, 0.28
Em, vm =  3000.0, 0.40

The shear moduli are not independent constants but related by:

In [2]:
Gf=Ef/(2+2*vf)
Gm=Em/(2+2*vm)

The volume fraction of woven materials is typically less than 0.5, and without further discussion here, $V_f$ = 0.45 will be used:

In [3]:
Vf=0.45

The longitudinal modulus $E_1$ and the in-plane Poisson’s ratio $\nu_{12}$ are very accurately predicted by the simple rules of mixture, while the transverse modulus and the in-plane shear modulus are reasonably well predicted by the Halpin-Tsai models and typical values of the empirical parameters. The models and the functions are described in Micromechanical models

In [4]:
import compositelib
E1= compositelib.micmec_E1(  Vf=Vf, E1f=Ef, Em=Em )
E2= compositelib.micmec_E2c( Vf=Vf, E2f=Ef, Em=Em, xi1=1)
v12=compositelib.micmec_v12( Vf=Vf, v12f=vf, vm=vm)
G12=compositelib.micmec_G12c(Vf=Vf, G12f=Gf, Gm=Gm,xi2=1)

print('E1=',round(E1,0))
print('E2=',round(E2,0))
print('v12=',round(v12,3))
print('G12=',round(G12,0))
E1= 109650.0
E2= 7693.0
v12= 0.346
G12= 2754.0

Then, create a new material from the estimated in-plane elastic properties:

In [5]:
m_UD = {'E1':E1, 'E2':E2, 'v12':v12, 'G12':G12}

For consistency (and simplicity), the laminate must be symmetric, for example:

In [6]:
layup = [{'mat':m_UD, 'ori':0,  'thi':1},
         {'mat':m_UD, 'ori':90, 'thi':2},
         {'mat':m_UD, 'ori':0 , 'thi':1}]

Compute the laminate compliance matrix as the inverse of the laminate stiffness matrix:

In [7]:
import laminatelib
import numpy as np

ABD=laminatelib.laminateStiffnessMatrix(layup)
abd = np.linalg.inv(ABD)

The total thickness $h$ of the laminate is:

In [8]:
h=laminatelib.laminateThickness(layup)

The effective engineering constants of the laminate are:

In [9]:
E1_w = (1/abd[0,0])/h
E2_w = (1/abd[1,1])/h
G12_w= (1/abd[2,2])/h
v12_w= -abd[0,1]*E1_w

print('E1=',round(E1_w,0))
print('E2=',round(E2_w,0))
print('v12=',round(v12_w,3))
print('G12=',round(G12_w,0))
E1= 59047.0
E2= 59047.0
v12= 0.011
G12= 2754.0

In effective-properties-of-laminates you find a function that also computes the effective thermal expansion and returns a new material as a dictionary. Coefficients of thermal expansion must be added to the UD-material, and for this example, let us just guess rather than use models (left as an exercise):

In [10]:
m_UD.update({'a1':5E-6, 'a2':30E-6})

Then:

In [11]:
woven_material=laminatelib.laminateHomogenization(layup)

display(woven_material)
{'E1': 59046.72568579698,
 'E2': 59046.725685796984,
 'v12': 0.045367860171368554,
 'G12': 2753.9442403285075,
 'a1': 7.11036767593803e-06,
 'a2': 7.110367675938028e-06}

3D properties

The 3D properties may be required, for example in a FEA model. A simple homogenization method is based on averaging of the 3D stiffness matrices for the two layers. A discussion on the justification for and limitation of this approach is left as an exercise.

The assumption of transverse isotropy is reasonable. Hence, from the constants computed by micro-mechanical models:

In [12]:
E3=E2
v13=v12
v23=0.45     # Estimated based on reported values for similar materials
G13=G12
G23=E2/(2+2*v23)

Create a material for the 3D engineering constants:

In [13]:
m_UD3 = {'E1':E1,    'E2':E2,   'E3':E3,
        'v12':v12, 'v13':v13, 'v23':v23, 
        'G12':G12, 'G13':G13, 'G23':G23}

The stiffness matrix for this material and for a 0-oriented layer is:

In [14]:
C0 =compositelib.C3D(m_UD3)

The stiffness matrix for a 90-oriented layer is found by rotation:

In [15]:
C90=compositelib.C3Dtz(C0,90)

Computing the average stiffness matrix from the two layers:

In [16]:
Cav=0.5*(C0+C90)

The compliance matrix based on the average stiffness matrix is:

In [17]:
Sav=np.linalg.inv(Cav)

Finally, the engineering constants can be extracted from the compliance matrix by:

In [18]:
E1_3dw = 1/Sav[0,0]
E2_3dw = 1/Sav[1,1]
E3_3dw = 1/Sav[2,2]
G23_3dw = 1/Sav[3,3]
G13_3dw = 1/Sav[4,4]
G12_3dw = 1/Sav[5,5]
v23_3dw = -Sav[1,2]*E2_3dw
v13_3dw = -Sav[0,2]*E1_3dw
v12_3dw = -Sav[0,1]*E1_3dw
In [19]:
print('E1=',round(E1_3dw,0))
print('E2=',round(E2_3dw,0))
print('E3=',round(E3_3dw,0))
print('v12=',round(v12_3dw,3))
print('v13=',round(v13_3dw,3))
print('v23=',round(v23_3dw,3))
print('G12=',round(G12_3dw))
print('G13=',round(G13_3dw))
print('G23=',round(G23_3dw))
E1= 59052.0
E2= 59052.0
E3= 9180.0
v12= 0.045
v13= 0.462
v23= 0.462
G12= 2754
G13= 2703
G23= 2703

Disclaimer:This site is about polymer composites, designed for educational purposes. Consumption and use of any sort & kind is solely at your own risk.
Fair use: I spent some time making all the pages, and even the figures and illustrations are my own creations. Obviously, you may steal whatever you find useful here, but please show decency and give some acknowledgment if or when copying. Thanks! Contact me: nils.p.vedvik@ntnu.no www.ntnu.edu/employees/nils.p.vedvik

Copyright 2021, All right reserved, I guess.