FEBio  1.5.0
FEBio/FETriphasic.h
00001 #pragma once
00002 #include "FEBiphasicSolute.h"
00003 #include "FESolute.h"
00004 
00005 //-----------------------------------------------------------------------------
00006 // Monovalent salt (cation + anion)
00007 
00008 class FESaltMaterialPoint : public FEMaterialPoint
00009 {
00010 public:
00011         FESaltMaterialPoint(FEMaterialPoint* ppt) : FEMaterialPoint(ppt) {}
00012         
00013         FEMaterialPoint* Copy()
00014         {
00015                 FESaltMaterialPoint* pt = new FESaltMaterialPoint(*this);
00016                 if (m_pt) pt->m_pt = m_pt->Copy();
00017                 return pt;
00018         }
00019         
00020         void Serialize(DumpFile& ar)
00021         {
00022                 if (ar.IsSaving())
00023                 {
00024                         ar << m_c[0] << m_gradc[0] << m_j[0] << m_ca[0];
00025                         ar << m_c[1] << m_gradc[1] << m_j[1] << m_ca[1];
00026                 }
00027                 else
00028                 {
00029                         ar >> m_c[0] >> m_gradc[0] >> m_j[0] >> m_ca[0];
00030                         ar >> m_c[1] >> m_gradc[1] >> m_j[1] >> m_ca[1];
00031                 }
00032                 
00033                 if (m_pt) m_pt->Serialize(ar);
00034         }
00035         
00036         void Init(bool bflag)
00037         {
00038                 if (bflag)
00039                 {
00040                         m_c[0] = m_c[1] = 0;
00041                         m_ca[0] = m_ca[1] = 0;
00042                         m_psi = m_cF = 0;
00043                         m_gradc[0] = m_gradc[1] = vec3d(0,0,0);
00044                         m_j[0] = m_j[1] = m_Ie = vec3d(0,0,0);
00045                 }
00046                 
00047                 if (m_pt) m_pt->Init(bflag);
00048         }
00049         
00050 public:
00051         // salt material data
00052         double          m_c[2];         
00053         vec3d           m_gradc[2];     
00054         vec3d           m_j[2];         
00055         double          m_ca[2];        
00056         double          m_psi;          
00057         vec3d           m_Ie;           
00058         double          m_cF;           
00059 };
00060 
00061 //-----------------------------------------------------------------------------
00063 
00064 class FETriphasic : public FEMaterial
00065 {
00066 public:
00067         FETriphasic();
00068         
00069         // returns a pointer to a new material point object
00070         FEMaterialPoint* CreateMaterialPointData() 
00071         { 
00072                 return new FESaltMaterialPoint(new FEBiphasicMaterialPoint(m_pSolid->CreateMaterialPointData()));
00073         }
00074 
00075         // return elastic material component
00076         FEElasticMaterial* GetElasticMaterial() { return m_pSolid; }
00077         
00078 public:
00079         void Init();
00080         
00082         mat3ds Stress(FEMaterialPoint& pt);
00083         
00085         tens4ds Tangent(FEMaterialPoint& pt);
00086         
00088         vec3d FluidFlux(FEMaterialPoint& pt);
00089         
00091         vec3d SoluteFlux(FEMaterialPoint& pt, const int ion);
00092         
00094         double Pressure(FEMaterialPoint& pt);
00095         
00097         double Concentration(FEMaterialPoint& pt, const int ion);
00098         
00100         double Porosity(FEMaterialPoint& pt);
00101         
00103         double FixedChargeDensity(FEMaterialPoint& pt);
00104         
00106         double ElectricPotential(FEMaterialPoint& pt, const bool eform=false);
00107         
00109         vec3d CurrentDensity(FEMaterialPoint& pt);
00110         
00112         double FluidDensity() { return m_rhoTw; }
00113         
00115         double SoluteDensity(const int ion) { return m_pSolute[ion]->Density(); }
00116         
00118         double SoluteMolarMass(const int ion) { return m_pSolute[ion]->MolarMass(); }
00119         
00121         int SoluteChargeNumber(const int ion) { return m_pSolute[ion]->ChargeNumber(); }
00122         
00124         void Serialize(DumpFile& ar);
00125         
00126 public:
00127         double                                          m_phi0;                 
00128         FEElasticMaterial*                      m_pSolid;               
00129         double                                          m_rhoTw;                
00130         FEHydraulicPermeability*        m_pPerm;                
00131         FEOsmoticCoefficient*           m_pOsmC;                
00132         vector<FESolute*>                       m_pSolute;              
00133         double                                          m_cFr;                  
00134         double                                          m_Rgas;                 
00135         double                                          m_Tabs;                 
00136         double                                          m_Fc;                   
00137         double                                          m_penalty;              
00138         
00139         // declare as registered
00140         DECLARE_REGISTERED(FETriphasic);
00141         
00142         DECLARE_PARAMETER_LIST();
00143 };