Damage Model
Damage represents the progressive degradation of the material’s load-carrying capability due to microcracks, voids, or accumulated plastic deformation. As damage grows, the effective load-bearing area decreases, which increases local stresses and reduces the effective stiffness of the material. This degradation is incorporated into the constitutive model by scaling the elastic stiffness tensor and the critical resolved shear stress using a scalar damage variable (D in [0,1]), where (D=0) corresponds to an undamaged state and (D=1) represents complete loss of load-bearing capacity.
Key Classes and Concepts
Damage— reads and stores damage properties; selects between the Creep and PEEQ damage models via$DamageModel.Damage Creep— stress-based creep damage (extension of the Cailletaud model; Kachanov's law for creep). See Damage Creep below.Damage PEEQ— plastic-strain-based damage; thresholds minPEEQ_and minPEEQ_ per phase. See Damage PEEQ below.
Effective local Damage update the Critical Resolved Shear Stress
General Damage Input Parameters
| Parameter | Description |
|---|---|
DamageModel | Damage Model Selection: Creep or PEEQ |
DamageSwitch ( | Damage model activation switch for each phase: True or False |
SmoothFlag | Allowed smoothening for localized damage: True or False. Default value: False |
maxDamageAllowed | Max Value of allowed damage between 0-1. Default value: 0.95 |
Damage Creep
In order to capture damage evolution, an extension of the Cailletaud model [33] proposed in Reference 34 was used. The resolved shear stress was assumed to act as a driving force for damage accumulation, which is in accordance with Kachanov’s damage law for creep as follows:
where
In the preceding equation,
| Parameter | Description |
|---|---|
| Material constant for each phase | |
| Stress exponent for each phase |
Damage PEEQ
A damage model is used to represent the microscopic pores and cracks on a mesoscopic scale. Microcracks and pores effectively reduce the load bearing area of a hypothetical sample, thereby increasing the stresses acting on the remaining area. This effect is translated into the following model.
The locally accumulated plastic strain
The damage parameter
| Parameter | Description |
|---|---|
| Minimum plastic strain for damage initiation for each phase | |
| Maximum plastic strain for complete damage for each phase |
Usage
Input
The full @Damage and @CrystalPlasticity blocks are listed below in Input Parameters used in the above example. The minimum set of keys is:
| Key | Meaning |
|---|---|
$DamageModel | Creep or PEEQ |
$DamageSwitch_<α> | enable damage on phase Yes / No) |
$SmoothFlag | smooth localised damage (default No) |
$MaxDamage | maximum admissible damage value (default 0.95) |
For Creep: $A_<α>, $n_<α>. For PEEQ: $minPEEQ_<α>, $maxPEEQ_<α>.
Output
Damage evolution
Solve—Damage::Solve(Phase, EP, CP, BC, dt)recomputes the damage field each call:cppvoid Damage::Solve(PhaseField& Phase, ElasticProperties& EP, CrystalPlasticity& CP, BoundaryConditions& BC, double dt);VTK output with optional distorted-grid rendering:
cppvoid WriteVTK(const Settings& locSettings, const PhaseField& Phase, const ElasticProperties& EP, const int tStep, const int precision = 6, bool Distorted = false);Raw / restart I/O:
cppbool Read (const Settings& locSettings, const BoundaryConditions& BC, const int tStep) override; bool Write(const Settings& locSettings, const int tStep) const override;
Example
This example simulates polycrystalline material under mechanical loading with crystal plasticity and damage. A Voronoi tessellation seeds the polycrystal; the time loop applies strain-rate loads, solves crystal plasticity, then updates damage. Stress, strain, and damage metrics are written as VTK and CSV.
This example demonstrates the simulation of polycrystalline material behaviour under mechanical loading, incorporating crystal plasticity and damage evolution. The simulation initializes a polycrystalline microstructure using Voronoi tessellation, stabilizes the interfaces, and then enters a time loop where mechanical loads as strain rates are applied, damage is computed, and crystal plasticity is solved. The results, including phase fields, stresses, strains, and damage metrics, are outputted in VTK format for visualization and analysis. Tabulated data for stress-strain and plastic strain evolution are outputted to text files for plotting purposes.
#include "Mechanics.h"
#include "RunTimeControl.h"
#include "DoubleObstacle.h"
#include "PhaseField.h"
#include "Initializations.h"
#include "BoundaryConditions.h"
#include "InterfaceProperties.h"
#include "Tools/TimeInfo.h"
#include "TextOutput.h"
#include "MechanicalLoads.h"
using namespace std;
using namespace openphase;
int main(int argc, char *argv[])
{
#ifdef MPI_PARALLEL
int provided = 0;
MPI_Init_thread(&argc, &argv, MPI_THREAD_FUNNELED, &provided);
MPI_Comm_rank(MPI_COMM_WORLD, &MPI_RANK);
MPI_Comm_size(MPI_COMM_WORLD, &MPI_SIZE);
#endif
Settings OPSettings;
OPSettings.ReadInput();
RunTimeControl RTC (OPSettings);
PhaseField Phi (OPSettings);
DoubleObstacle DO (OPSettings);
InterfaceProperties IP (OPSettings);
BoundaryConditions BC (OPSettings);
ElasticProperties EP (OPSettings);
ElasticitySolverSpectral ES (OPSettings);
CrystalPlasticity CP (OPSettings);
MechanicalLoads ML (OPSettings);
Damage DP (OPSettings);
TimeInfo Timer(OPSettings, "Execution Time Statistics");
size_t GrainsPhase = 0;
int number_of_grains = 10;
Initializations::VoronoiTessellation(Phi, BC, number_of_grains, GrainsPhase);
for(size_t LocalStep = 0; LocalStep <= 100; LocalStep++)
{
IP .Set (Phi, BC);
DO .CalculatePhaseFieldIncrements(Phi, IP, dG);
Phi.NormalizeIncrements (BC, RTC.dt);
Phi.MergeIncrements (BC, RTC.dt);
}
string StressStrainFile = DefaultTextDir + "StressStrainFile.txt";
string PlasticStrainFile = DefaultTextDir + "PlasticStrainFile.txt";
remove(StressStrainFile. c_str());
remove(PlasticStrainFile.c_str());
EP.SetEffectiveProperties(Phi);
CP.SetInitialHardening(Phi, BC);
CP.SetGrainsProperties(Phi, EP);
//-------------------------------------------------------------------------------------------//
ConsoleOutput::WriteLineInsert("Entering the Time Loop!!!");
//-------------------------------------------------------------------------------------------//
for(RTC.tStep = RTC.tStart; RTC.tStep <= RTC.nSteps; RTC.IncrementTimeStep())
{
EP.SetEffectiveProperties(Phi, DP);
ML.Activate(Phi, EP, RTC);
ML.Apply(Phi, EP, RTC);
DP.Solve(Phi, EP, CP, BC, RTC.dt);
CP.Solve(Phi, BC, EP, ES, DP, RTC.dt);
if (RTC.WriteVTK())
{
Phi.WriteVTK (OPSettings, RTC.tStep);
DP.WriteVTK (OPSettings, Phi, EP, RTC.tStep);
}
if (RTC.WriteToScreen())
{
double I_En = DO.AverageEnergyDensity(Phi, IP);
std::string message = ConsoleOutput::GetStandard("Interface energy density", I_En);
ConsoleOutput::WriteTimeStep(RTC, message);
Timer.PrintWallClockSummary();
ConsoleOutput::WriteStandard("Average Strain", EP.AverageStrain);
ConsoleOutput::WriteStandard("Plastic Strain", EP.AveragePlasticStrain());
ConsoleOutput::WriteLine();
ConsoleOutput::WriteStandard("Max Damage", DP.MaxDamage);
ConsoleOutput::WriteStandard("Average Damage", DP.AverageDamage(Phi));
ConsoleOutput::WriteLine("#");
EP.WriteStressStrainData(RTC.tStep, RTC.SimulationTime, StressStrainFile);
CP.WriteAveragePlasticStrainCSV(EP, PlasticStrainFile, EP.AverageStrain[0]);
}
}
#ifdef MPI_PARALLEL
MPI_Finalize ();
#endif
return 0;
}Input Parameters used in the above example
Standard Open Phase Input File
!!!All values in MKS (or properly scaled) units please!!!
----------------------------------------------------------------------------
@Damage
----------------------------------------------------------------------------
Model Types : [ CREEP, PEEQ ]
$DamageModel | Damage model being used | : CREEP
$MaxDamage | Max allowable damage | : 0.90
$DamageSwitch_0 | Enable/ disable damage model | : Yes
$SmoothFlag | Enable / disable Damage smoothening | : Yes
|--------------| CREEP model parameters| ----------------------------|
// --- in each phase, here only one phase is used which is 0
$A_0 Damage Rate value : 1e-18
$n_0 Exponent value : 2
|--------------| PEEQ model parameters| -----------------------------|
$minPEEQ_0 Minimum value of PEEQ : 0.02
$maxPEEQ_0 Minimum value of PEEQ : 0.2
----------------------------------------------------------------
--------------------| End of File |-- --------------------------
----------------------------------------------------------------Dependencies
- Mechanics — continuum-mechanics and crystal-plasticity theory.
- Elastic Properties — the stiffness tensor that the damage scalar modifies.
- PhaseField — fields and increments the energy / mobility values are evaluated against. BoundaryConditions — applied throughout the simulation Settings — phase list and grid metadata.