TMM4175 Polymer Composites

Home About Python Links Next Previous Table of Contents

Maximum stress criterion

The Maximum stress failure criterion makes a simple asessment where each stress component is compared to the corresponding strength. The criterion predicts failure if one of the following six conditions is False:

\begin{equation} \begin{aligned} & -X_C < \sigma_1 < X_T && -Y_C < \sigma_2 < Y_T && -Z_C < \sigma_3 < Z_T && \mid\tau_{12}\mid <S_{12} && \mid\tau_{13}\mid < S_{13} && \mid\tau_{23}\mid < S_{23} \end{aligned} \tag{1} \end{equation}

The criterion can alternatively be formulated using a max function:

\begin{equation} f = \text{max}\Big( -\frac{\sigma_1}{X_C}, \frac{\sigma_1}{X_T}, -\frac{\sigma_2}{Y_C}, \frac{\sigma_2}{Y_T}, -\frac{\sigma_3}{Z_C}, \frac{\sigma_3}{Z_T}, \frac{|\tau_{12}|}{S_{12}}, \frac{|\tau_{13}|}{S_{13}}, \frac{|\tau_{23}|}{S_{23}}\Big) \tag{2} \end{equation}

where failure is predicted when $f \geq 1$.

The stress exposure factor is obtained by multiplying the load proportionality factor $R$ to each stress components and equating the result to unity:

\begin{equation}\text{max}\Big( -\frac{R\sigma_1}{X_C}, \frac{R\sigma_1}{X_T}, -\frac{R\sigma_2}{Y_C}, \frac{R\sigma_2}{Y_T}, -\frac{R\sigma_3}{Z_C}, \frac{R\sigma_3}{Z_T}, \frac{R|\tau_{12}|}{S_{12}}, \frac{R|\tau_{13}|}{S_{13}}, \frac{R|\tau_{23}|}{S_{23}}\Big) = 1 \tag{3} \end{equation}

such that

\begin{equation} f_E = \frac{1}{R} = \text{max}\Big( -\frac{\sigma_1}{X_C}, \frac{\sigma_1}{X_T}, -\frac{\sigma_2}{Y_C}, \frac{\sigma_2}{Y_T}, -\frac{\sigma_3}{Z_C}, \frac{\sigma_3}{Z_T}, \frac{|\tau_{12}|}{S_{12}}, \frac{|\tau_{13}|}{S_{13}}, \frac{|\tau_{23}|}{S_{23}}\Big) \tag{4} \end{equation}

Implementation:

The following function returns the stress exposure factor $f_E$ for a stress state s and material m:

In [1]:
def fE_maxstress(s,m):
    # Using local varibles for easier coding and readability..
    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']
    fE=max(s1/XT,-s1/XC,s2/YT,-s2/YC,s3/ZT,-s3/ZC,abs(s12/S12),abs(s13/S13),abs(s23/S23))
    return fE

Example:

In [2]:
import matlib
m1=matlib.get('Carbon/Epoxy(a)')
In [3]:
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_maxstress(s,m1)
    print('fE =',fE,'when stress=',s)
fE = 0.08333333333333333 when stress= (150, 0, 0, 0, 0, 0)
fE = 0.3333333333333333 when stress= (-120, -60, 0, 0, 0, 0)
fE = 1.5 when stress= (1000, 60, 0, 0, 0, 0)
fE = 2.142857142857143 when stress= (0, 0, 0, 0, 0, 150)

Failure envelope in the $\sigma_1$ - $\sigma_2$ -plane:

In [4]:
import matplotlib.pyplot as plt
%matplotlib inline

#Data points for the rectangle in the s1-s2 plane
s1=(m1['XT'],-m1['XC'],-m1['XC'],m1['XT'],m1['XT'])
s2=(m1['YT'],m1['YT'],-m1['YC'],-m1['YC'],m1['YT'])
fig,ax = plt.subplots(figsize=(8,4))
ax.plot(s1,s2,'--',color='blue',linewidth=1)

#Origo
ax.plot((0,),(0,),'+',color='black',markersize=50)

#Adding some stress states

s1a, s2a = -600, -50
s1b, s2b = 180, 0
s1c, s2c = 1000, 60

ax.scatter((s1a,s1b,s1c),(s2a,s2b,s2c),color='red')
fE1=fE_maxstress((s1a,s2a,0,0,0,0),m1)
fE2=fE_maxstress((s1b,s2b,0,0,0,0),m1)
fE3=fE_maxstress((s1c,s2c,0,0,0,0),m1)
ax.text(s1a,s2a,'  '+r'$f_E=$'+str(fE1),fontsize=14)
ax.text(s1b,s2b,'  '+r'$f_E=$'+str(fE2),fontsize=14)
ax.text(s1c,s2c,'  '+r'$f_E=$'+str(fE3),fontsize=14)
ax.set_xlabel(r'$\sigma_1$',fontsize=14)
ax.set_ylabel(r'$\sigma_2$',fontsize=14)
ax.grid(True)
plt.tight_layout()

Maximum stress envelope in the $\sigma_1$ - $\sigma_2$ -plane plane can be constructed using a more generic method where we sweep through $\theta=0...360^{\circ}$ where $\sigma_1=\cos(\theta)$ and $\sigma_2=\sin(\theta)$. This method can be utilized for most failure criteria.

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

# empty list of the stresses in the 1-2 plane:
s1,s2=[],[]

# sweeping 360 degrees using 10 points per degrees:

import numpy as np

for a in np.linspace(0,360,3600):
    s1i=np.cos(np.radians(a))
    s2i=np.sin(np.radians(a))
    fe=fE_maxstress((s1i,s2i,0,0,0,0),m1)
    # then scaling by the load-proportionality ratio (1/fE):
    s1.append(s1i/fe)
    s2.append(s2i/fe)

ax.plot(s1,s2,'--',color='blue',linewidth=1)

ax.plot((0,),(0,),'+',color='black',markersize=50)

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

ax.grid(True)

plt.tight_layout()

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.