# SPDX-License-Identifier: MIT
# Copyright (c) 2011–2026 Joris J.C. Remmers
from pyfem.materials.BaseMaterial import BaseMaterial
from numpy import zeros, dot
[docs]
class TransverseIsotropic( BaseMaterial ):
def __init__ ( self, props ):
self.incremental = False
#Call the BaseMaterial constructor
BaseMaterial.__init__( self, props )
#Create the hookean matrix
self.H = zeros( (6,6) )
fac = 1.0 / ((self.E1*self.E2)-(self.E1*self.nu12*self.nu12*self.E2)- \
(self.nu12*self.nu12*self.E2*self.E2)- \
(2.0*self.nu12*self.E2*self.nu12*self.nu12*self.E2)- \
(self.nu12*self.nu12*self.E2*self.E2))
self.H[0,0] = (self.E2-self.nu12*self.nu12*self.E2)*self.E1*self.E1*fac;
self.H[0,1] = (self.nu12*self.E2+self.nu12*self.nu12*self.E2)*self.E1*self.E2*fac;
self.H[0,2] = (self.nu12*self.nu12+self.nu12)*self.E2*self.E1*self.E2*fac;
self.H[1,0] = self.H[0,1];
self.H[1,1] = (self.E1-self.nu12*self.nu12*self.E2)*self.E2*self.E2*fac;
self.H[1,2] = (self.nu12*self.E1+self.nu12*self.nu12*self.E2)*self.E2*self.E2*fac;
self.H[2,0] = self.H[0,2];
self.H[2,1] = self.H[1,2];
self.H[2,2] = (self.E1-self.nu12*self.nu12*self.E2)*self.E2*self.E2*fac;
self.H[3,3] = self.G12;
self.H[4,4] = self.G12;
self.H[5,5] = self.G12;
#Set the labels for the output data in this material model
self.outLabels = [ "S11" , "S22" , "S33" , "S23" , "S13" , "S12" ]
if self.incremental:
self.setHistoryParameter( 'sigma' , zeros(6) )
self.commitHistory()
[docs]
def getStress( self, deformation ):
if self.incremental:
sigma = self.getHistoryParameter('sigma')
sigma += dot( self.H, deformation.dstrain )
self.setHistoryParameter( 'sigma' , sigma )
else:
sigma = dot( self.H, deformation.strain )
self.outData = sigma
return sigma, self.H
[docs]
def getTangent( self ):
return self.H