Material Routines

This section covers all details about the material routine implementation, which is invoked by the finite element newton iteration with the deformation gradient F and a given materialtype defined in simulation_params in the solve function of the package.

A few general words on this:

  • I utilized multiple dispatch, i.e. a function dispatches depending on all arguments of the function, therefore we have one common interface constitutive_driver
  • constitutive_driver can be extended by your own by adding a material struct, such as DamageState or FiberDamageState and creating a function that dispatches as follow constitutive_driver(F, materialstruct::newmaterial)
  • Therefore, it should be clear that the combination of a material struct and a dispatched constitutive_driver for this struct is per definition the extension for a new material
  • Another interface constraint is update_materialstate!(material::newmaterial) which is invoked after the FE Newton. It is used to set history dependent variables.
  • In order to extend FiberDamageState and/or DamageState by its base material a new structs in the fashion of NeoHooke and StVenantKirchhoff needs to be added.
  • Additionally, based on this new type a function Ψ needs to dispatch. This function is invoked whenever derivatives of the effective energy are required.

In the following section we'll discuss Structs and Functions seperately.

Structs

The important structs of the project are the following: Firstly, the base material classes that have no history dependent behaviour and serve as the dispatch argument for Ψ

ConvexDamage.NeoHookeType
NeoHooke(μ::Float64, λ::Float64) <: Hyperelasticity

Hyperelastic material model for NeoHooke. Needed for multiple dispatch of $\psi(\boldsymbol{C},\text{material})$

Holds two Float64 fields

Fields

  • μ::Float64
  • λ::Float64
source
ConvexDamage.StVenantKirchhoffType
StVenantKirchhoff(μ::Float64, λ::Float64) <: Hyperelasticity

Hyperelastic material model for St. Venant-Kirchhoff. Needed for multiple dispatch of $\psi(\boldsymbol{C},\text{material})$

Holds two Float64 fields

Fields

  • μ::Float64
  • λ::Float64
source

Secondly, the history dependent structs that combine base material and history dependent identities

ConvexDamage.DamageType
Damage(βₖ=0.0, ψₖ=0.0, Fₖ=Tensor{2,1}([1.0]))

Base damage struct that is needed for the "quasi" - homogenized phases, denoted by + and -. Used in the actual damage struct called DamageState to store the history dependent variables ofthe weakly, strongly and homogenized damaged phase. Struct is parameterized in dim

Fields

  • βₖ::Float64 conjugated Force
  • ψₖ::Float64 maximum effective (virtually undamaged) energy
  • Fₖ::Tensor{2,dim} previous deformationgradient
source
ConvexDamage.DamageStateType
DamageState(material=mp::T) where T <: Hyperelasticity

Actual structure for the multiple dispatch of constitutive_driver. Holds temporary variables for the newton iteration and sets them as soon as the finite element newton iteration converged. The values are set by the function update_materialstate!. Parameterization of the struct is done in dim and materialtype which is the hyperelastic basematerial

Fields

  • temp_damage::Damage temp value
  • temp_damage⁺::Damage temp value
  • temp_damage¯::Damage temp value
  • damage::Damage Damage struct for homogenized phase
  • damage⁺::Damage Damage struct for strongly damaged phase
  • damage¯::Damage Damage struct for weakly damaged phase
  • material::basematerial where basematerial <: Hyperelasticity
  • temp_P::Tensor{2,dim} temp value
  • temp_σ::SymmetricTensor{2,dim} temp value
  • P::Tensor{2,dim} First Piola Kirchhoff Stresses in material point
  • σ::SymmetricTensor{2,dim} Cauchy Stresses in material point
  • temp_ξₖ::Float64 temp value
  • temp_dₖ::Float64 temp value
  • ξₖ::Float64 volume fraction
  • dₖ::Float64 polarization parameter
  • W_min::Float64 value of the convexified problem $\overline{W}$
  • W::Float64 actual value of the energy $W$
  • convex::Bool is the energy $W$ convex
  • relaxed::Bool relaxed regime

Note that all values beginning with temp are temporary variables for the newton iteration

source
ConvexDamage.FiberDamageStateType
FiberDamageState(material=mp::T) where T <: Hyperelasticity

Actual structure for the multiple dispatch of constitutive_driver. Combines an Array of length equal to the number of preferred fiber directions filled with DamageState, with the preferred fiber directions and an Array filled with the vectors of the preferred fiber directions The values are set by the function update_materialstate!. FiberDamageState is parameterized in dim and materialtype as well as the primitive type of the vector entries of 𝐀

Fields

  • 𝐀::Array{Vec{dim,T,1} undeformed preferred fiber directions as a Array filled with the the preferred directions
  • fiber_directions::Int how many preferred fiber directions
  • fiberdamagestate::Array{DamageState{1,materialtype},1} damagestates for the individual fibers
source

Based on them, constitutive_driver and the energy function Ψ dispatches.

Functions

The listed functions below are the core of the project. Everything else is standard nonlinear structural mechanics done by FEM.

ConvexDamage.ΨFunction
ψ(C, mp::NeoHooke)

implements the strain energy function of NeoHookean material which is defined by

\[\psi(\boldsymbol{C}) = \frac{\mu}{2} \cdot (I_{\boldsymbol{C}}) - \mu \cdot \log J + \frac{\lambda}{2} \cdot \log J ^2\]

where

\[I_{\boldsymbol{C}} = \text{tr} \ \boldsymbol{C} \qquad J = \sqrt{\text{det} \ \boldsymbol{C}}\]
source
ψ(C, mp::StVenantKirchhoff)

implements the strain energy function of St.Venant-Kirchhoff material which is defined by

\[\psi(\boldsymbol{C}) = \frac{\lambda}{8} \cdot (I_{\boldsymbol{C}} - 3)^2 + \frac{\mu}{4} \cdot (I_{\boldsymbol{C}}^2 - 2\ I_{\boldsymbol{C}}- 2\ II_{\boldsymbol{C}} +3)\]

where

\[I_{\boldsymbol{C}} = \text{tr} \ \boldsymbol{C} \qquad II_{\boldsymbol{C}} = \text{tr}(\text{det}\ \boldsymbol{C} \boldsymbol{C}^{-T})\]
source
ConvexDamage.constitutive_driverFunction
constitutive_driver(C, mp::NeoHooke)

Implements the constitutive response of a neohooke material without damage

source
constitutive_driver(F, damage::DamageState)

Implements the constitutive response of a continuum damage model as in Balzani and Ortiz, 2012

source
constitutive_driver(F, damage::DamageStateUnrelaxed)

Implements the unrelaxed response of a continuum damage model

source
constitutive_driver(F, damage::DamageStateReconvexify)

Implements the extension of the constitutive response of a continuum damage model as in Balzani and Ortiz, 2012 The aformentioned model is extended by rerelaxation.

source
constitutive_driver(𝐅::Tensor{2,dim}, damage::FiberDamageState{dim})

Fiber damage constitutive function that loops over all spherical integration points and over all fibers. Integrates 1D Dimensional model over fibers and thus, returns a 3D model.

source
ConvexDamage.update_materialstate!Function
update_materialstate!(damage::DamageState)

This function must be implemented by any given materialtype. Updates the hisotry (time dependent) temp values to accepted, fixed values as soon as finite element newton converges

source
update_materialstate!(damage::FiberDamageState)

updates the history (time dependent) temp values to accepted, fixed values as soon as finite element newton converges. Basically, just broadcasting the function onto the array of DamageState.

source

Fallback method that throws error

source