Linear Viscoelastic Power Law model
Theory
The present model is an implementation of an linear viscoelastic power law based on an approximation using a Kelvin chain. The constitutive law is given in total form as
relating the nominal stress tensor \(\sig\) to the elastic strain tensor \(\epsE\) in terms of the isotropic fourth order stiffness tensor \(\Cel\). Where \(\eps\) is the total strain and \(\epsVE\) is the viscoelastic strain.
The rate of the compliance function of the material is given as
where \(n\) is the power law exponent, \(m\) is the power law compliance parameter, \(t\) is the time, and \(\tau\) is a reference time. The viscoelastic compliance is approximated by a Kelvin Chain.
The evolution of the viscoelastic strain \(\epsVE\) is defined as
in terms of the unit compliance tensor \(\DelNu\). The unit compliance tensor is defined as
with the Young’s modulus \(E\) and the Poisson’s ratio \(\nu\).
Here we approximate a target power-law creep compliance \(J(t)\) by a Kelvin chain (generalized Kelvin–Voigt / Prony series) so the viscoelastic strain rate becomes a finite sum of exponentials that’s efficient to evaluate. The continuous form
is replaced by
where \(J_i\) and \(\tau_i\) are the partial compliances and retardation times. For a specific compliance target the \(\{J_i,\tau_i\}\) are chosen so that \(J_N(t)\) tracks \(J(t)\) over the time window of interest, while the rate kernel \(\dot J_N\) approximates
The Post–Widder inversion formula provides a way to recover an approximate retardation spectrum from a known compliance function \(J(t)\).
The order \(k\) defines the order of approximation of the actual continous spectrum. If it tends to infinity the continous spectrum is recovered. The discrete spectrum of the Kelvin chain is here used to calculate the stiffnesses or compliances for chosen retardation times by fitting the approximation of the continous spectrum.
A detailed description of the employed approach can be found, e.g., in Bazant & Jirasek (2018) Creep and Hygrothermal Effects in Concrete Structures.
Implementation
-
class LinearViscoelasticPowerLaw : public MarmotMaterialHypoElastic
Inheritance diagram for Marmot::Materials::LinearViscoelasticPowerLaw:
![digraph {
graph [bgcolor="#00000000"]
node [shape=rectangle style=filled fillcolor="#FFFFFF" font=Helvetica padding=2]
edge [color="#1414CE"]
"1" [label="Marmot::Materials::LinearViscoelasticPowerLaw" tooltip="Marmot::Materials::LinearViscoelasticPowerLaw" fillcolor="#BFBFBF"]
"4" [label="MarmotMaterial" tooltip="MarmotMaterial"]
"2" [label="MarmotMaterialHypoElastic" tooltip="MarmotMaterialHypoElastic"]
"3" [label="MarmotMaterialMechanical" tooltip="MarmotMaterialMechanical"]
"1" -> "2" [dir=forward tooltip="public-inheritance"]
"2" -> "3" [dir=forward tooltip="public-inheritance"]
"3" -> "4" [dir=forward tooltip="public-inheritance"]
}](../../_images/graphviz-87cea04b90fa2a3e8ca525a54b0187675c588441.png)
Collaboration diagram for Marmot::Materials::LinearViscoelasticPowerLaw:
![digraph {
graph [bgcolor="#00000000"]
node [shape=rectangle style=filled fillcolor="#FFFFFF" font=Helvetica padding=2]
edge [color="#1414CE"]
"1" [label="Marmot::Materials::LinearViscoelasticPowerLaw" tooltip="Marmot::Materials::LinearViscoelasticPowerLaw" fillcolor="#BFBFBF"]
"4" [label="MarmotMaterial" tooltip="MarmotMaterial"]
"2" [label="MarmotMaterialHypoElastic" tooltip="MarmotMaterialHypoElastic"]
"3" [label="MarmotMaterialMechanical" tooltip="MarmotMaterialMechanical"]
"1" -> "2" [dir=forward tooltip="public-inheritance"]
"2" -> "3" [dir=forward tooltip="public-inheritance"]
"3" -> "4" [dir=forward tooltip="public-inheritance"]
}](../../_images/graphviz-87cea04b90fa2a3e8ca525a54b0187675c588441.png)
Implementation of an isotropic linear viscoelastic material using a Power Law compliance function and assuming constant Poisson’s ratio generalized for 3D stress states.
Public Functions
-
LinearViscoelasticPowerLaw(const double *materialProperties, int nMaterialProperties, int materialLabel)
-
virtual void computeStress(double *stress, double *dStressDDStrain, const double *dStrain, const double *timeOld, const double dT, double &pNewDT)
For a given linearized strain increment \(\Delta\boldsymbol{\varepsilon}\) at the old and the current time, compute the Cauchy stress and the algorithmic tangent \(\frac{\partial\boldsymbol{\sigma}^{(n+1)}}{\partial\boldsymbol{\varepsilon}^{(n+1)}}\).
- Parameters:
stress – [inout] Cauchy stress
dStressDDstrain – [inout] Algorithmic tangent representing the derivative of the Cauchy stress tensor with respect to the linearized strain
dStrain – [in] linearized strain increment
timeOld – [in] Old (pseudo-)time
dt – [in] (Pseudo-)time increment from the old (pseudo-)time to the current (pseudo-)time
pNewDT – [inout] Suggestion for a new time increment
-
virtual int getNumberOfRequiredStateVars()
- Returns:
Number of state variables required by the material.
-
virtual void assignStateVars(double *stateVars_, int nStateVars)
Assign state variable array to material.
- Parameters:
stateVars – [inout] Pointer to state variable array.
nStateVars – [in] Number of state variables.
Private Members
-
const double &E
Young’s modulus.
E represents the Young’s modulus for isotropic linear elasticity. It is a reference variable to materialProperties[0].
-
const double &nu
Poisson’s ratio.
nu represents Poisson’s ratio for isotropic linear elasticity. It is a reference variable to materialProperties[1].
-
const double &m
power law compliance parameter
m represents the power law compliance parameter. It is a reference variable to materialProperties[2].
-
const double &n
power law exponent
n represents the power law exponent. It is a reference variable to materialProperties[3].
-
const size_t nKelvin
number of Kelvin units to approximate the viscoelastic compliance
nKelvin represents the number of Kelvin units to approximate the power law function. It is a reference variable to materialProperties[4].
-
const double &minTau
minimal retardation time used in the viscoelastic Kelvin chain
minTau represents the minimal retardation time used in the Kelvin chain. It is a reference variable to materialProperties[5].
-
const double &timeToDays
ratio of simulation time to days
timeToDays represents the ratio of simulation time to days. It is a reference variable to materialProperties[6].
-
std::unique_ptr<LinearViscoelasticPowerLawStateVarManager> stateVarManager
-
KelvinChain::Properties elasticModuli
Young’s modulus of the nKelvin Kelvin units.
-
KelvinChain::Properties retardationTimes
retardation times of the nKelvin Kelvin units
-
double zerothKelvinChainCompliance
compliance of the zeroth Kelvin unit
Private Static Attributes
-
static int powerLawApproximationOrder = 2
-
class LinearViscoelasticPowerLawStateVarManager : public MarmotStateVarVectorManager
Inheritance diagram for Marmot::Materials::LinearViscoelasticPowerLaw::LinearViscoelasticPowerLawStateVarManager:
![digraph {
graph [bgcolor="#00000000"]
node [shape=rectangle style=filled fillcolor="#FFFFFF" font=Helvetica padding=2]
edge [color="#1414CE"]
"1" [label="Marmot::Materials::LinearViscoelasticPowerLaw::LinearViscoelasticPowerLawStateVarManager" tooltip="Marmot::Materials::LinearViscoelasticPowerLaw::LinearViscoelasticPowerLawStateVarManager" fillcolor="#BFBFBF"]
"2" [label="MarmotStateVarVectorManager" tooltip="MarmotStateVarVectorManager"]
"1" -> "2" [dir=forward tooltip="public-inheritance"]
}](../../_images/graphviz-10b48e1f7797e293873af7dccddb28d1e31e2627.png)
Collaboration diagram for Marmot::Materials::LinearViscoelasticPowerLaw::LinearViscoelasticPowerLawStateVarManager:
![digraph {
graph [bgcolor="#00000000"]
node [shape=rectangle style=filled fillcolor="#FFFFFF" font=Helvetica padding=2]
edge [color="#1414CE"]
"1" [label="Marmot::Materials::LinearViscoelasticPowerLaw::LinearViscoelasticPowerLawStateVarManager" tooltip="Marmot::Materials::LinearViscoelasticPowerLaw::LinearViscoelasticPowerLawStateVarManager" fillcolor="#BFBFBF"]
"2" [label="MarmotStateVarVectorManager" tooltip="MarmotStateVarVectorManager"]
"3" [label="MarmotStateVarVectorManager::StateVarVectorLayout" tooltip="MarmotStateVarVectorManager::StateVarVectorLayout"]
"1" -> "2" [dir=forward tooltip="public-inheritance"]
"2" -> "3" [dir=forward tooltip="usage"]
}](../../_images/graphviz-f0b65c167d29276b35b477df58e0ff260527c6ad.png)
Public Functions
-
inline LinearViscoelasticPowerLawStateVarManager(double *theStateVarVector, int nKelvinUnits)
Public Members
-
KelvinChain::mapStateVarMatrix kelvinStateVars
Public Static Attributes
-
static const auto layout =
makeLayout( {{ .name = "kelvinStateVars", .length = 0 },} )
-
inline LinearViscoelasticPowerLawStateVarManager(double *theStateVarVector, int nKelvinUnits)
-
LinearViscoelasticPowerLaw(const double *materialProperties, int nMaterialProperties, int materialLabel)