TMM4175 Polymer Composites

Home About Python Links Next Previous Table of Contents

Tsai-Wu criterion

The Tsai-Wu failure criterion is a specialization of the general quadratic failure criterion and is expressed in the form

\begin{equation} \begin{split} f = & F_1\sigma_1 + F_2\sigma_2 + F_3\sigma_3 + F_{11}\sigma_1^2 + F_{22}\sigma_2^2 + F_{33}\sigma_3^2+ \\ & F_{44}\tau_{23}^2 + F_{55}\tau_{13}^2 + F_{66}\tau_{12}^2 + 2F_{23}\sigma_2\sigma_3 + 2F_{13}\sigma_1\sigma_3 + 2F_{12}\sigma_1\sigma_2 \end{split} \tag{1} \end{equation}

where failure is predicted when $f\geq1$

The coefficients are expressed by the basic strength parameters,

\begin{equation} \begin{aligned} &F_1=\frac{1}{X_T}-\frac{1}{X_C}, \quad F_2=\frac{1}{Y_T}-\frac{1}{Y_C}, \quad F_3=\frac{1}{Z_T}-\frac{1}{Z_C} \\ &F_{11}=\frac{1}{X_T X_C}, \quad F_{22}=\frac{1}{Y_TY_C}, \quad F_{33}=\frac{1}{Z_TZ_C} \\ &F_{44}=\frac{1}{S_{23}^2}, \quad F_{55}=\frac{1}{S_{13}^2}, \quad F_{66}=\frac{1}{S_{12}^2} \\ &F_{23}=f_{23}\sqrt{F_{22}F_{33}}, \quad F_{13}=f_{13}\sqrt{F_{11}F_{33}}, \quad F_{12}=f_{12}\sqrt{F_{11}F_{22}} \end{aligned} \tag{2} \end{equation}

where $f_{12},f_{13},f_{23}$ are experimentally determined interaction coefficients.

Solving the quadratic equation:

\begin{equation} \begin{split} & (F_1\sigma_1 + F_2\sigma_2 + F_3\sigma_3)R + \\ &(F_{11}\sigma_1^2 + F_{22}\sigma_2^2 + F_{33}\sigma_3^2 + F_{44}\tau_{23}^2 + F_{55}\tau_{13}^2 + F_{66}\tau_{12}^2 + 2F_{23}\sigma_2\sigma_3 + 2F_{13}\sigma_1\sigma_3 + 2F_{12}\sigma_1\sigma_2)R^2 = 1 \end{split} \tag{3} \end{equation}

Such that

\begin{equation} \begin{aligned} &a=F_{11}\sigma_1^2 + F_{22}\sigma_2^2 + F_{33}\sigma_3^2 + F_{44}\tau_{23}^2 + F_{55}\tau_{13}^2 + F_{66}\tau_{12}^2 + 2F_{23}\sigma_2\sigma_3 + 2F_{13}\sigma_1\sigma_3 + 2F_{12}\sigma_1\sigma_2 \\ &b= F_1\sigma_1 + F_2\sigma_2 + F_3\sigma_3 \\ &c=-1 \end{aligned} \tag{4} \end{equation}

and

\begin{equation} R=\frac{-b+\sqrt{b^2 -4ac}}{2a} \tag{5} \end{equation}

Observe that the parameter $a$ can be zero. In such a case the $R$ will be undefined. In those cases we just return zero as written in this code:

In [1]:
def fE_tsaiwu(s,m):
    s1,s2,s3,s23,s13,s12=s[0],s[1],s[2],s[3],s[4],s[5]
    XT,YT,ZT,XC,YC,ZC,S12,S13,S23 = m['XT'], m['YT'], m['ZT'], m['XC'], m['YC'], m['ZC'], m['S12'], m['S13'], m['S23']
    f12, f13, f23 = m['f12'], m['f13'], m['f23']
    F1,  F2,  F3  = (1/XT)-(1/XC) , (1/YT)-(1/YC) , (1/ZT)-(1/ZC)
    F11, F22, F33 =     1/(XT*XC) ,     1/(YT*YC) ,     1/(ZT*ZC)
    F44, F55, F66 =    1/(S23**2) ,    1/(S13**2) ,     1/(S12**2)
    F12 = f12*(F11*F22)**0.5
    F13 = f13*(F11*F33)**0.5
    F23 = f23*(F22*F33)**0.5
    a=F11*(s1**2) + F22*(s2**2) + F33*(s3**2)+ 2*(F12*s1*s2 + F13*s1*s3 + F23*s2*s3)+\
    F44*(s23**2) + F55*(s13**2) + F66*(s12**2)
    if a==0:
        return 0
    b=F1*s1 + F2*s2 +F3*s3
    c=-1
    R=(-b+(b**2-4*a*c)**0.5)/(2*a)
    fE=1/R
    return fE

Example

In [2]:
import matlib
m1=matlib.get('Carbon/Epoxy(a)')

stressCases = (150, 0, 0, 0, 0, 0) , (-120,-60,0,0,0,0) , (1000,60,0,0,0,0) , (0,0,0,0,0,150)

for s in stressCases:
    fE=fE_tsaiwu(s,m1)
    print(fE)
0.08333333333333333
0.3108541312970143
1.2686826398927051
2.1428571428571432

Failure envelope, $\sigma_2$ versus $\sigma_1$:

In [3]:
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

fig,ax = plt.subplots(figsize=(8,4))
s1,s2=[],[]

from math import cos,sin,radians
for a in np.linspace(0,360,3600):
    s1i=cos(radians(a))
    s2i=sin(radians(a))
    fe=fE_tsaiwu((s1i,s2i,0,0,0,0),m1)
    s1.append(s1i/fe)
    s2.append(s2i/fe)

ax.plot(s1,s2,'-',color='blue',label='Tsai-Wu',linewidth=1)
ax.plot((0,),(0,),'+',color='black',markersize=50)
ax.legend(loc='best')

ax.set_xlabel(r'$\sigma_1$',fontsize=14)
ax.set_ylabel(r'$\sigma_2$',fontsize=14)
ax.grid(True)

plt.tight_layout()

Failure envelope, $\sigma_2$ versus $\sigma_1$ for constant nonzero values of $\tau_{12}$:

Terms of a, b in equtions (4) containing $\tau_{12}$ are now constants and therefor terms of the constant c:

\begin{equation} \begin{aligned} & a=F_{11}\sigma_1^2 + F_{22}\sigma_2^2 + F_{33}\sigma_3^2 + F_{44}\tau_{23}^2 + F_{55}\tau_{13}^2 + 2F_{23}\sigma_2\sigma_3 + 2F_{13}\sigma_1\sigma_3 + 2F_{12}\sigma_1\sigma_2 \\ &b= F_1\sigma_1 + F_2\sigma_2 + F_3\sigma_3 \\ &c=-1 + F_{66}\tau_{12}^2 \end{aligned} \tag{6} \end{equation}

Modified function for the specific case:

In [4]:
def fE_tsaiwu_const_s12(s,m):
    s1,s2,s3,s23,s13,s12=s[0],s[1],s[2],s[3],s[4],s[5]
    XT,YT,ZT,XC,YC,ZC,S12,S13,S23 = m['XT'], m['YT'], m['ZT'], m['XC'], m['YC'], m['ZC'], m['S12'], m['S13'], m['S23']
    f12, f13, f23 = m['f12'], m['f13'], m['f23']
    F1,  F2,  F3  = (1/XT)-(1/XC) , (1/YT)-(1/YC) , (1/ZT)-(1/ZC)
    F11, F22, F33 =     1/(XT*XC) ,     1/(YT*YC) ,     1/(ZT*ZC)
    F44, F55, F66 =    1/(S23**2) ,    1/(S13**2) ,     1/(S12**2)
    F12 = f12*(F11*F22)**0.5
    F13 = f13*(F11*F33)**0.5
    F23 = f23*(F22*F33)**0.5
    a=F11*(s1**2) + F22*(s2**2) + F33*(s3**2)+ 2*(F12*s1*s2 + F13*s1*s3 + F23*s2*s3)+\
    F44*(s23**2) + F55*(s13**2)
    if a==0:
        return 0
    b=F1*s1 + F2*s2 +F3*s3
    c=-1 + F66*(s12**2)
    R=(-b+(b**2-4*a*c)**0.5)/(2*a)
    fE=1/R
    return fE

Multiple failure envelopes:

In [5]:
fig,ax = plt.subplots(figsize=(12,8))
s1a,s2a,s1b,s2b,s1c,s2c,s1d,s2d,s1e,s2e=[],[],[],[],[],[],[],[],[],[]

from math import cos,sin,radians
for a in np.linspace(0,360,3600):
    s1i=cos(radians(a))
    s2i=sin(radians(a))
    fea=fE_tsaiwu_const_s12((s1i,s2i,0,0,0,0),m1)
    feb=fE_tsaiwu_const_s12((s1i,s2i,0,0,0,20),m1)
    fec=fE_tsaiwu_const_s12((s1i,s2i,0,0,0,40),m1)
    fed=fE_tsaiwu_const_s12((s1i,s2i,0,0,0,50),m1)
    fee=fE_tsaiwu_const_s12((s1i,s2i,0,0,0,60),m1)
    s1a.append(s1i/fea)
    s2a.append(s2i/fea)
    s1b.append(s1i/feb)
    s2b.append(s2i/feb)
    s1c.append(s1i/fec)
    s2c.append(s2i/fec)
    s1d.append(s1i/fed)
    s2d.append(s2i/fed)
    s1e.append(s1i/fee)
    s2e.append(s2i/fee)

ax.plot(s1a,s2a,'-',color='blue',label=r'Tsai-Wu, $\tau_{12}$=0',linewidth=1)
ax.plot(s1b,s2b,'-',color='red',label=r'Tsai-Wu, $\tau_{12}$=20',linewidth=1)
ax.plot(s1c,s2c,'-',color='green',label=r'Tsai-Wu, $\tau_{12}$=40',linewidth=1)
ax.plot(s1d,s2d,'-',color='orange',label=r'Tsai-Wu, $\tau_{12}$=50',linewidth=1)
ax.plot(s1e,s2e,'-',color='cyan',label=r'Tsai-Wu, $\tau_{12}$=60',linewidth=1)
ax.plot((0,),(0,),'+',color='black',markersize=50)
ax.legend(loc='best')

ax.set_xlabel(r'$\sigma_1$',fontsize=14)
ax.set_ylabel(r'$\sigma_2$',fontsize=14)
ax.grid(True)

plt.tight_layout()

Inconsistency of the criterion

Imagine now that we, for whatever reason, find it reasonable to use a lower value of the transverse tensile strength $X_T$:

In [6]:
m1['YT']=25

Then, construct the failure envelopes for both cases:

In [7]:
fig,ax = plt.subplots(figsize=(8,4))
s1b,s2b=[],[]

from math import cos,sin,radians
for a in np.linspace(0,360,3600):
    s1i=cos(radians(a))
    s2i=sin(radians(a))
    fe=fE_tsaiwu((s1i,s2i,0,0,0,0),m1)
    # then scaling by the load-proportionality ratio (1/fE):
    s1b.append(s1i/fe)
    s2b.append(s2i/fe)

ax.plot(s1,s2,'-',color='blue',label=r'Tsai-Wu, $Y_T$=50',linewidth=1)
ax.plot(s1b,s2b,'-',color='red',label=r'Tsai-Wu, $Y_T$=25',linewidth=1)
ax.plot((0,),(0,),'+',color='black',markersize=50)
ax.legend(loc='best')

ax.set_xlabel(r'$\sigma_1$',fontsize=14)
ax.set_ylabel(r'$\sigma_2$',fontsize=14)
#ax.set_xticks([0])
#ax.set_yticks([0])
ax.grid(True)

plt.tight_layout()

So, reduced transverse tensile strength implies improved capacity in compression-compression?

To be discussed in lectures

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.