FEBio  1.5.0
FEBio/FEDamageTransIsoMooneyRivlin.h
00001 #pragma once
00002 #include "FEUncoupledMaterial.h"
00003 
00004 //-----------------------------------------------------------------------------
00005 // We first define a material point that stores the damage variable.
00006 class FETIMRDamageMaterialPoint : public FEMaterialPoint
00007 {
00008 public:
00009         FETIMRDamageMaterialPoint(FEMaterialPoint *pt) : FEMaterialPoint(pt) {}
00010 
00011         FEMaterialPoint* Copy()
00012         {
00013                 FETIMRDamageMaterialPoint* pt = new FETIMRDamageMaterialPoint(*this);
00014                 if (m_pt) pt->m_pt = m_pt->Copy();
00015                 return pt;
00016         }
00017 
00018         void Init(bool bflag)
00019         {
00020                 FEElasticMaterialPoint& pt = *m_pt->ExtractData<FEElasticMaterialPoint>();
00021                 if (bflag)
00022                 {
00023                         // intialize data to zero
00024                         m_MEmax = 0;
00025                         m_MEtrial = 0;
00026                         m_Dm = 1;
00027 
00028                         m_FEmax = 0;
00029                         m_FEtrial = 0;
00030                         m_Df = 1;
00031                 }
00032                 else
00033                 {
00034                         m_MEmax = max(m_MEmax, m_MEtrial);
00035                         m_FEmax = max(m_FEmax, m_FEtrial);
00036                 }
00037 
00038                 // don't forget to intialize the nested data
00039                 if (m_pt) m_pt->Init(bflag);
00040         }
00041 
00042         void Serialize(DumpFile& ar)
00043         {
00044                 if (ar.IsSaving())
00045                 {
00046                         ar << m_MEmax << m_FEmax;
00047                 }
00048                 else
00049                 {
00050                         ar >> m_MEmax >> m_FEmax;
00051                 }
00052         }
00053 
00054 public:
00055         // matrix
00056         double  m_MEtrial;                      
00057         double  m_MEmax;                        
00058         double  m_Dm;                           
00059 
00060         // fiber
00061         double  m_FEtrial;                      
00062         double  m_FEmax;                        
00063         double  m_Df;                           
00064 };
00065 
00066 //-----------------------------------------------------------------------------
00067 class FEDamageTransIsoMooneyRivlin : public FEUncoupledMaterial
00068 {
00069 public:
00070         FEDamageTransIsoMooneyRivlin(void);
00071 
00072 public:
00073         // Mooney-Rivlin parameters
00074         double  m_c1;   
00075         double  m_c2;   
00076 
00077         // fiber parameters
00078         double  m_c3;
00079         double  m_c4;
00080 
00081         // Matrix damage parameters
00082         double  m_Mbeta;                
00083         double  m_Msmin;                
00084         double  m_Msmax;                
00085 
00086         // Fiber damage parameters
00087         double  m_Fbeta;
00088         double  m_Fsmin;
00089         double  m_Fsmax;
00090 
00091 public:
00092         // returns a pointer to a new material point object
00093         virtual FEMaterialPoint* CreateMaterialPointData() { return new FETIMRDamageMaterialPoint(new FEElasticMaterialPoint); }
00094 
00095 public:
00097         mat3ds DevStress(FEMaterialPoint& pt);
00098 
00100         tens4ds DevTangent(FEMaterialPoint& pt);
00101 
00103         void Init();
00104 
00105 protected:
00106         mat3ds MatrixStress(FEMaterialPoint& mp);
00107         mat3ds FiberStress (FEMaterialPoint& mp);
00108         tens4ds MatrixTangent(FEMaterialPoint& pt);
00109         tens4ds FiberTangent (FEMaterialPoint& pt);
00110 
00111 protected:
00112         // calculate damage reduction factor for matrix
00113         double MatrixDamage(FEMaterialPoint& pt);
00114 
00115         // calculate damage reduction factor for fibers
00116         double FiberDamage(FEMaterialPoint& pt);
00117 
00118         double MatrixDamageDerive(FEMaterialPoint& pt);
00119         double FiberDamageDerive(FEMaterialPoint& pt);
00120 
00121 public:
00122         // declare as registered
00123         DECLARE_REGISTERED(FEDamageTransIsoMooneyRivlin);
00124 
00125         // declare the parameter list
00126         DECLARE_PARAMETER_LIST();
00127 };