From 654e8151deea67e306d0ebec7e23d69e3d57d767 Mon Sep 17 00:00:00 2001 From: Gerard Ateshian Date: Mon, 22 Apr 2024 15:19:11 -0400 Subject: [PATCH] Modified FiberExpPowSBM and FiberPowLinearSBM to use FEParamDouble properties. Introduced ReactionRateRuberti to model strain-dependent fiber degradation --- FEBioMix/FEBioMix.cpp | 2 + FEBioMix/FEFiberExpPowSBM.cpp | 31 ++++--- FEBioMix/FEFiberExpPowSBM.h | 16 ++-- FEBioMix/FEFiberPowLinearSBM.cpp | 43 +++++---- FEBioMix/FEFiberPowLinearSBM.h | 16 ++-- FEBioMix/FEReactionRateRuberti.cpp | 139 +++++++++++++++++++++++++++++ FEBioMix/FEReactionRateRuberti.h | 62 +++++++++++++ 7 files changed, 265 insertions(+), 44 deletions(-) create mode 100644 FEBioMix/FEReactionRateRuberti.cpp create mode 100644 FEBioMix/FEReactionRateRuberti.h diff --git a/FEBioMix/FEBioMix.cpp b/FEBioMix/FEBioMix.cpp index 271ebba23..3e7e24e93 100644 --- a/FEBioMix/FEBioMix.cpp +++ b/FEBioMix/FEBioMix.cpp @@ -59,6 +59,7 @@ SOFTWARE.*/ #include "FECarterHayes.h" #include "FEReactionRateConst.h" #include "FEReactionRateHuiskes.h" +#include "FEReactionRateRuberti.h" #include "FEReactionRateNims.h" #include "FEReactionRateExpSED.h" #include "FEReactionRateSoluteAsSBM.h" @@ -452,6 +453,7 @@ void FEBioMix::InitModule() REGISTER_FECORE_CLASS(FESFDSBM , "spherical fiber distribution sbm"); REGISTER_FECORE_CLASS(FEReactionRateConst , "constant reaction rate" ); REGISTER_FECORE_CLASS(FEReactionRateHuiskes , "Huiskes reaction rate" ); + REGISTER_FECORE_CLASS(FEReactionRateRuberti , "Ruberti reaction rate" ); REGISTER_FECORE_CLASS(FEReactionRateNims , "Nims reaction rate" ); REGISTER_FECORE_CLASS(FEReactionRateExpSED , "exp-sed reaction rate" ); REGISTER_FECORE_CLASS(FEReactionRateSoluteAsSBM , "solute-as-sbm reaction rate"); diff --git a/FEBioMix/FEFiberExpPowSBM.cpp b/FEBioMix/FEFiberExpPowSBM.cpp index 7d360cb16..3e668008a 100644 --- a/FEBioMix/FEFiberExpPowSBM.cpp +++ b/FEBioMix/FEFiberExpPowSBM.cpp @@ -106,7 +106,7 @@ mat3ds FEFiberExpPowSBM::Stress(FEMaterialPoint& mp) // initialize material constants double rhor = spt.m_sbmr[m_lsbm]; - double ksi = FiberModulus(rhor); + double ksi = FiberModulus(mp, rhor); // deformation gradient mat3d &F = pt.m_F; @@ -134,6 +134,9 @@ mat3ds FEFiberExpPowSBM::Stress(FEMaterialPoint& mp) // only take fibers in tension into consideration if (In_1 >= eps) { + double alpha = m_alpha(mp); + double beta = m_beta(mp); + // get the global spatial fiber direction in current configuration nt = F*n0; @@ -141,7 +144,7 @@ mat3ds FEFiberExpPowSBM::Stress(FEMaterialPoint& mp) mat3ds N = dyad(nt); // calculate strain energy derivative - Wl = ksi*pow(In_1, m_beta-1.0)*exp(m_alpha*pow(In_1, m_beta)); + Wl = ksi*pow(In_1, beta-1.0)*exp(alpha*pow(In_1, beta)); // calculate the fiber stress s = N*(2.0*Wl/J); @@ -162,7 +165,7 @@ tens4ds FEFiberExpPowSBM::Tangent(FEMaterialPoint& mp) // initialize material constants double rhor = spt.m_sbmr[m_lsbm]; - double ksi = FiberModulus(rhor); + double ksi = FiberModulus(mp, rhor); // deformation gradient mat3d &F = pt.m_F; @@ -190,6 +193,9 @@ tens4ds FEFiberExpPowSBM::Tangent(FEMaterialPoint& mp) // only take fibers in tension into consideration if (In_1 >= eps) { + double alpha = m_alpha(mp); + double beta = m_beta(mp); + // get the global spatial fiber direction in current configuration nt = F*n0; @@ -198,8 +204,8 @@ tens4ds FEFiberExpPowSBM::Tangent(FEMaterialPoint& mp) tens4ds NxN = dyad1s(N); // calculate strain energy 2nd derivative - double tmp = m_alpha*pow(In_1, m_beta); - Wll = ksi*pow(In_1, m_beta-2.0)*((tmp+1)*m_beta-1.0)*exp(tmp); + double tmp = alpha*pow(In_1, beta); + Wll = ksi*pow(In_1, beta-2.0)*((tmp+1)*beta-1.0)*exp(tmp); // calculate the fiber tangent c = NxN*(4.0*Wll/J); @@ -222,7 +228,7 @@ double FEFiberExpPowSBM::StrainEnergyDensity(FEMaterialPoint& mp) // initialize material constants double rhor = spt.m_sbmr[m_lsbm]; - double ksi = FiberModulus(rhor); + double ksi = FiberModulus(mp, rhor); // loop over all integration points double In_1; @@ -244,12 +250,15 @@ double FEFiberExpPowSBM::StrainEnergyDensity(FEMaterialPoint& mp) // only take fibers in tension into consideration if (In_1 >= eps) { + double alpha = m_alpha(mp); + double beta = m_beta(mp); + // calculate strain energy derivative - if (m_alpha > 0) { - sed = ksi/(m_alpha*m_beta)*(exp(m_alpha*pow(In_1, m_beta))-1); + if (alpha > 0) { + sed = ksi/(alpha*beta)*(exp(alpha*pow(In_1, beta))-1); } else - sed = ksi/m_beta*pow(In_1, m_beta); + sed = ksi/beta*pow(In_1, beta); } return sed; @@ -284,7 +293,7 @@ double FEFiberExpPowSBM::Tangent_SE_Density(FEMaterialPoint& mp) { FESolutesMaterialPoint& spt = *mp.ExtractData(); double rhor = spt.m_sbmr[m_lsbm]; - return StrainEnergy(mp)*m_g/rhor; + return StrainEnergy(mp)*m_g(mp)/rhor; } //----------------------------------------------------------------------------- @@ -293,6 +302,6 @@ mat3ds FEFiberExpPowSBM::Tangent_Stress_Density(FEMaterialPoint& mp) { FESolutesMaterialPoint& spt = *mp.ExtractData(); double rhor = spt.m_sbmr[m_lsbm]; - return Stress(mp)*m_g/rhor; + return Stress(mp)*m_g(mp)/rhor; } diff --git a/FEBioMix/FEFiberExpPowSBM.h b/FEBioMix/FEFiberExpPowSBM.h index 2df012c56..93d45b95f 100644 --- a/FEBioMix/FEFiberExpPowSBM.h +++ b/FEBioMix/FEFiberExpPowSBM.h @@ -29,6 +29,7 @@ SOFTWARE.*/ #pragma once #include #include +#include #include "febiomix_api.h" //----------------------------------------------------------------------------- @@ -57,7 +58,7 @@ class FEBIOMIX_API FEFiberExpPowSBM : public FEElasticMaterial, public FERemodel double Density(FEMaterialPoint& pt) override; //! return fiber modulus - double FiberModulus(double rhor) { return m_ksi0*pow(rhor/m_rho0, m_g);} + double FiberModulus(FEMaterialPoint& pt, double rhor) { return m_ksi0(pt)*pow(rhor/m_rho0(pt), m_g(pt));} //! Create material point data FEMaterialPointData* CreateMaterialPointData() override; @@ -77,13 +78,12 @@ class FEBIOMIX_API FEFiberExpPowSBM : public FEElasticMaterial, public FERemodel mat3ds Tangent_Stress_Density(FEMaterialPoint& pt) override; public: - double m_alpha; // coefficient of (In-1) in exponential - double m_beta; // power of (In-1) in exponential - double m_ksi0; // fiber modulus ksi = ksi0*(rhor/rho0)^gamma - double m_rho0; // rho0 - double m_g; // gamma -// int m_sbm; //!< global id of solid-bound molecule - int m_lsbm; //!< local id of solid-bound molecule + FEParamDouble m_alpha; // coefficient of (In-1) in exponential + FEParamDouble m_beta; // power of (In-1) in exponential + FEParamDouble m_ksi0; // fiber modulus ksi = ksi0*(rhor/rho0)^gamma + FEParamDouble m_rho0; // rho0 + FEParamDouble m_g; // gamma + int m_lsbm; //!< local id of solid-bound molecule public: FEVec3dValuator* m_fiber; //!< fiber orientation diff --git a/FEBioMix/FEFiberPowLinearSBM.cpp b/FEBioMix/FEFiberPowLinearSBM.cpp index dcda5fa27..a3562ebbd 100644 --- a/FEBioMix/FEFiberPowLinearSBM.cpp +++ b/FEBioMix/FEFiberPowLinearSBM.cpp @@ -105,12 +105,15 @@ mat3ds FEFiberPowLinearSBM::Stress(FEMaterialPoint& mp) FEElasticMaterialPoint& pt = *mp.ExtractData(); FESolutesMaterialPoint& spt = *mp.ExtractData(); + double lam0 = m_lam0(mp); + double beta = m_beta(mp); + // initialize material constants double rhor = spt.m_sbmr[m_lsbm]; - double E = FiberModulus(rhor); - double I0 = m_lam0*m_lam0; - double ksi = E/4/(m_beta-1)*pow(I0, -3./2.)*pow(I0-1, 2-m_beta); - double b = ksi*pow(I0-1, m_beta-1) + E/2/sqrt(I0); + double E = FiberModulus(mp, rhor); + double I0 = lam0*lam0; + double ksi = E/4/(beta-1)*pow(I0, -3./2.)*pow(I0-1, 2-beta); + double b = ksi*pow(I0-1, beta-1) + E/2/sqrt(I0); // deformation gradient mat3d &F = pt.m_F; @@ -146,7 +149,7 @@ mat3ds FEFiberPowLinearSBM::Stress(FEMaterialPoint& mp) // calculate the fiber stress magnitude sn = (In < I0) ? - 2*In*ksi*pow(In-1, m_beta-1) : + 2*In*ksi*pow(In-1, beta-1) : 2*b*In - E*sqrt(In); // calculate the fiber stress @@ -166,11 +169,14 @@ tens4ds FEFiberPowLinearSBM::Tangent(FEMaterialPoint& mp) FEElasticMaterialPoint& pt = *mp.ExtractData(); FESolutesMaterialPoint& spt = *mp.ExtractData(); + double lam0 = m_lam0(mp); + double beta = m_beta(mp); + // initialize material constants double rhor = spt.m_sbmr[m_lsbm]; - double E = FiberModulus(rhor); - double I0 = m_lam0*m_lam0; - double ksi = E/4/(m_beta-1)*pow(I0, -3./2.)*pow(I0-1, 2-m_beta); + double E = FiberModulus(mp, rhor); + double I0 = lam0*lam0; + double ksi = E/4/(beta-1)*pow(I0, -3./2.)*pow(I0-1, 2-beta); // deformation gradient mat3d &F = pt.m_F; @@ -207,7 +213,7 @@ tens4ds FEFiberPowLinearSBM::Tangent(FEMaterialPoint& mp) // calculate modulus cn = (In < I0) ? - 4*In*In*ksi*(m_beta-1)*pow(In-1, m_beta-2) : + 4*In*In*ksi*(beta-1)*pow(In-1, beta-2) : E*sqrt(In); // calculate the fiber tangent @@ -229,12 +235,15 @@ double FEFiberPowLinearSBM::StrainEnergyDensity(FEMaterialPoint& mp) FEElasticMaterialPoint& pt = *mp.ExtractData(); FESolutesMaterialPoint& spt = *mp.ExtractData(); + double lam0 = m_lam0(mp); + double beta = m_beta(mp); + // initialize material constants double rhor = spt.m_sbmr[m_lsbm]; - double E = FiberModulus(rhor); - double I0 = m_lam0*m_lam0; - double ksi = E/4/(m_beta-1)*pow(I0, -3./2.)*pow(I0-1, 2-m_beta); - double b = ksi*pow(I0-1, m_beta-1) + E/2/sqrt(I0); + double E = FiberModulus(mp, rhor); + double I0 = lam0*lam0; + double ksi = E/4/(beta-1)*pow(I0, -3./2.)*pow(I0-1, 2-beta); + double b = ksi*pow(I0-1, beta-1) + E/2/sqrt(I0); // loop over all integration points double In; @@ -258,8 +267,8 @@ double FEFiberPowLinearSBM::StrainEnergyDensity(FEMaterialPoint& mp) { // calculate strain energy density sed = (In < I0) ? - ksi/m_beta*pow(In-1, m_beta) : - b*(In-I0) - E*(sqrt(In)-sqrt(I0)) + ksi/m_beta*pow(I0-1, m_beta); + ksi/beta*pow(In-1, beta) : + b*(In-I0) - E*(sqrt(In)-sqrt(I0)) + ksi/beta*pow(I0-1, beta); } return sed; @@ -294,7 +303,7 @@ double FEFiberPowLinearSBM::Tangent_SE_Density(FEMaterialPoint& mp) { FESolutesMaterialPoint& spt = *mp.ExtractData(); double rhor = spt.m_sbmr[m_lsbm]; - return StrainEnergy(mp)*m_g/rhor; + return StrainEnergy(mp)*m_g(mp)/rhor; } //----------------------------------------------------------------------------- @@ -303,6 +312,6 @@ mat3ds FEFiberPowLinearSBM::Tangent_Stress_Density(FEMaterialPoint& mp) { FESolutesMaterialPoint& spt = *mp.ExtractData(); double rhor = spt.m_sbmr[m_lsbm]; - return Stress(mp)*m_g/rhor; + return Stress(mp)*m_g(mp)/rhor; } diff --git a/FEBioMix/FEFiberPowLinearSBM.h b/FEBioMix/FEFiberPowLinearSBM.h index 5a09cc8bd..0ba349fce 100644 --- a/FEBioMix/FEFiberPowLinearSBM.h +++ b/FEBioMix/FEFiberPowLinearSBM.h @@ -29,6 +29,7 @@ SOFTWARE.*/ #pragma once #include #include +#include #include "febiomix_api.h" //----------------------------------------------------------------------------- @@ -57,7 +58,7 @@ class FEBIOMIX_API FEFiberPowLinearSBM : public FEElasticMaterial, public FERemo double Density(FEMaterialPoint& pt) override; //! return fiber modulus - double FiberModulus(double rhor) { return m_E0*pow(rhor/m_rho0, m_g);} + double FiberModulus(FEMaterialPoint& pt, double rhor) { return m_E0(pt)*pow(rhor/m_rho0(pt), m_g(pt));} //! Create material point data FEMaterialPointData* CreateMaterialPointData() override; @@ -77,13 +78,12 @@ class FEBIOMIX_API FEFiberPowLinearSBM : public FEElasticMaterial, public FERemo mat3ds Tangent_Stress_Density(FEMaterialPoint& pt) override; public: - double m_E0; // fiber modulus E = E0*(rhor/rho0)^gamma - double m_lam0; // stretch ratio at end of toe region - double m_beta; // power law exponent in toe region - double m_rho0; // rho0 - double m_g; // gamma -// int m_sbm; //!< global id of solid-bound molecule - int m_lsbm; //!< local id of solid-bound molecule + FEParamDouble m_E0; // fiber modulus E = E0*(rhor/rho0)^gamma + FEParamDouble m_lam0; // stretch ratio at end of toe region + FEParamDouble m_beta; // power law exponent in toe region + FEParamDouble m_rho0; // rho0 + FEParamDouble m_g; // gamma + int m_lsbm; //!< local id of solid-bound molecule public: FEVec3dValuator* m_fiber; //!< fiber orientation diff --git a/FEBioMix/FEReactionRateRuberti.cpp b/FEBioMix/FEReactionRateRuberti.cpp new file mode 100644 index 000000000..e792e5f59 --- /dev/null +++ b/FEBioMix/FEReactionRateRuberti.cpp @@ -0,0 +1,139 @@ +/*This file is part of the FEBio source code and is licensed under the MIT license +listed below. + +See Copyright-FEBio.txt for details. + +Copyright (c) 2021 University of Utah, The Trustees of Columbia University in +the City of New York, and others. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.*/ + + + +#include "stdafx.h" +#include "FEReactionRateRuberti.h" +#include "FEBiphasic.h" +#include "FEMultiphasic.h" +#include "FESoluteInterface.h" +#include +#include + +// Material parameters for the FEMultiphasic material +BEGIN_FECORE_CLASS(FEReactionRateRuberti, FEReactionRate) + ADD_PARAMETER(m_kd, "kd"); + ADD_PARAMETER(m_sig, FE_RANGE_GREATER_OR_EQUAL(0.0), "sigma"); +END_FECORE_CLASS(); + +//----------------------------------------------------------------------------- +FEReactionRateRuberti::FEReactionRateRuberti(FEModel* pfem) : FEReactionRate(pfem) +{ + m_kd = 0; + m_sig = 0; + m_comp = -1; + m_fiber = nullptr; + m_M = 0; + m_lsbm = -1; +} + +//----------------------------------------------------------------------------- +//! initialization +bool FEReactionRateRuberti::Init() +{ + FEMultiphasic* pbm = dynamic_cast(GetAncestor()); + if (pbm == nullptr) return true; // in case material is not multiphasic + + FESoluteInterface* psi = dynamic_cast(GetAncestor()); + + FEChemicalReaction* pcm = dynamic_cast(m_pReact); + int sbm = pcm->m_vRtmp[0]->m_speciesID; + m_lsbm = pbm->FindLocalSBMID(sbm); + m_M = pbm->SBMMolarMass(m_lsbm); + + FEElasticMaterial* pem = pbm->GetSolid(); + FEElasticMixture* psm = dynamic_cast(pem); + if (psm == nullptr) return true; // in case material is not a solid mixture + + for (int i=0; iMaterials(); ++i) { + pem = psm->GetMaterial(i); + // check the types of materials that can employ this reaction rate + FERemodelingInterface* pri = dynamic_cast(pem); + if (pri) { + if (sbm == pri->m_sbm) m_comp = pri->m_comp; + } + } + if (m_comp == -1) return false; + + // get the fiber property (this remodeling rule only works with fibrous materials) + m_fiber = dynamic_cast(psm->GetMaterial(m_comp)->GetProperty("fiber")); + if (m_fiber == nullptr) return false; + + return true; +} + +//----------------------------------------------------------------------------- +//! reaction rate at material point +double FEReactionRateRuberti::ReactionRate(FEMaterialPoint& pt) +{ + FEMultiphasic* pbm = dynamic_cast(GetAncestor()); + FEBiphasicInterface* pbi = dynamic_cast(GetAncestor()); + FESoluteInterface* psi = dynamic_cast(GetAncestor()); + double phir = pbm->SolidReferentialVolumeFraction(pt); + double c = psi->SBMConcentration(pt, m_lsbm); + + mat3d Q = pbm->GetLocalCS(pt); + vec3d a0 = m_fiber->unitVector(pt); + vec3d ar = Q * a0; + FEElasticMaterialPoint& et = *pt.ExtractData(); + double lam = (et.m_F*ar).norm(); + double k = (lam > 1.0) ? m_kd(pt)*exp(-0.5*pow((lam-1)/m_sig(pt),2)) : m_kd(pt); + + return k; +} + +//----------------------------------------------------------------------------- +//! tangent of reaction rate with strain at material point +mat3ds FEReactionRateRuberti::Tangent_ReactionRate_Strain(FEMaterialPoint& pt) +{ + FEMultiphasic* pbm = dynamic_cast(GetAncestor()); + FEBiphasicInterface* pbi = dynamic_cast(GetAncestor()); + FESoluteInterface* psi = dynamic_cast(GetAncestor()); + double phir = pbm->SolidReferentialVolumeFraction(pt); + double c = psi->SBMConcentration(pt, m_lsbm); + + mat3d Q = pbm->GetLocalCS(pt); + vec3d a0 = m_fiber->unitVector(pt); + vec3d ar = Q * a0; + FEElasticMaterialPoint& et = *pt.ExtractData(); + double lam = (et.m_F*ar).norm(); + double kd = m_kd(pt); + double sig = m_sig(pt); + double k = (lam > 1.0) ? kd*exp(-0.5*pow(lam-1,2)/sig) : kd; + double dkdlam = (lam > 1.0) ? -(lam-1)/sig*kd*exp(-0.5*pow((lam-1)/sig,2)) : 0; + + mat3ds dzhatde = dyad(et.m_F*ar)*(dkdlam/lam/et.m_J); + return dzhatde; +} + +//----------------------------------------------------------------------------- +//! tangent of reaction rate with effective fluid pressure at material point +double FEReactionRateRuberti::Tangent_ReactionRate_Pressure(FEMaterialPoint& pt) +{ + return 0; +} + diff --git a/FEBioMix/FEReactionRateRuberti.h b/FEBioMix/FEReactionRateRuberti.h new file mode 100644 index 000000000..4be72644a --- /dev/null +++ b/FEBioMix/FEReactionRateRuberti.h @@ -0,0 +1,62 @@ +/*This file is part of the FEBio source code and is licensed under the MIT license +listed below. + +See Copyright-FEBio.txt for details. + +Copyright (c) 2021 University of Utah, The Trustees of Columbia University in +the City of New York, and others. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.*/ + + + +#pragma once +#include "FEChemicalReaction.h" +#include + +class FEBIOMIX_API FEReactionRateRuberti : public FEReactionRate +{ +public: + //! constructor + FEReactionRateRuberti(FEModel* pfem); + + //! initialization + bool Init() override; + + //! reaction rate at material point + double ReactionRate(FEMaterialPoint& pt) override; + + //! tangent of reaction rate with strain at material point + mat3ds Tangent_ReactionRate_Strain(FEMaterialPoint& pt) override; + + //! tangent of reaction rate with effective fluid pressure at material point + double Tangent_ReactionRate_Pressure(FEMaterialPoint& pt) override; + +public: + FEParamDouble m_kd; //!< maximum sbm degradation rate + FEParamDouble m_sig; //!< stretch standard deviation + +private: + int m_comp; //!< component of solid mixture (if applicable) + FEVec3dValuator* m_fiber; //!< fiber material + double m_M; //!< molar mass of sbm + int m_lsbm; //!< local sbm value + + DECLARE_FECORE_CLASS(); +};