62 template <
class TYieldSurfaceType>
124 const double UniaxialStress,
128 const double CharacteristicLength
133 const int softening_type = r_material_properties[SOFTENING_TYPE];
134 double damage_parameter;
135 TYieldSurfaceType::CalculateDamageParameter(rValues, damage_parameter, CharacteristicLength);
137 switch (softening_type)
140 CalculateLinearDamage(UniaxialStress, rThreshold, damage_parameter, CharacteristicLength, rValues, rDamage);
152 KRATOS_ERROR <<
"SOFTENING_TYPE not defined or wrong..." << softening_type << std::endl;
155 rDamage = (rDamage > 0.99999) ? 0.99999 : rDamage;
156 rDamage = (rDamage < 0.0) ? 0.0 : rDamage;
157 rPredictiveStressVector *= (1.0 - rDamage);
169 const double UniaxialStress,
170 const double Threshold,
171 const double DamageParameter,
172 const double CharacteristicLength,
177 double initial_threshold;
178 TYieldSurfaceType::GetInitialUniaxialThreshold(rValues, initial_threshold);
179 rDamage = 1.0 - (initial_threshold / UniaxialStress) * std::exp(DamageParameter *
180 (1.0 - UniaxialStress / initial_threshold));
193 const double UniaxialStress,
194 const double Threshold,
195 const double DamageParameter,
196 const double CharacteristicLength,
202 const double max_stress = r_mat_props[MAXIMUM_STRESS];
203 const double Gf = r_mat_props[FRACTURE_ENERGY];
204 const double E = r_mat_props[YOUNG_MODULUS];
205 const bool has_symmetric_yield_stress = r_mat_props.Has(YIELD_STRESS);
206 const double yield_compression = has_symmetric_yield_stress ? r_mat_props[YIELD_STRESS] : r_mat_props[YIELD_STRESS_COMPRESSION];
207 const double yield_tension = has_symmetric_yield_stress ? r_mat_props[YIELD_STRESS] : r_mat_props[YIELD_STRESS_TENSION];
208 const double n = yield_compression / yield_tension;
210 double initial_threshold;
211 TYieldSurfaceType::GetInitialUniaxialThreshold(rValues, initial_threshold);
213 const double re = max_stress / initial_threshold;
214 const double rp = 1.5 * re;
215 const double Ad = (rp - re) / re;
216 const double Ad_tilda = Ad * (std::pow(rp, 3) - 3.0 * rp + 2.0 / 3.0) / (6.0 * re * std::pow((rp - 1.0), 2));
217 const double Hd = 1.0 / (2.0 * (
E *
Gf *
n *
n / max_stress / max_stress / CharacteristicLength - 0.5 * rp / re - Ad_tilda));
219 const double r = UniaxialStress / initial_threshold;
222 rDamage = Ad * re / r * std::pow(((r - 1.0) / (rp - 1.0)), 2);
224 rDamage = 1.0 - re / r + Hd * (1.0 - rp / r);
237 const double UniaxialStress,
238 const double Threshold,
239 const double DamageParameter,
240 const double CharacteristicLength,
245 double initial_threshold;
246 TYieldSurfaceType::GetInitialUniaxialThreshold(rValues, initial_threshold);
247 rDamage = (1.0 - initial_threshold / UniaxialStress) / (1.0 + DamageParameter);
261 const double UniaxialStress,
262 const double Threshold,
263 const double DamageParameter,
264 const double CharacteristicLength,
270 const double fracture_energy = r_mat_props[FRACTURE_ENERGY];
271 const double volumetric_fracture_energy = fracture_energy / CharacteristicLength;
272 const double yield_stress = r_mat_props[YIELD_STRESS];
273 const double E = r_mat_props[YOUNG_MODULUS];
274 const Vector& strain_damage_curve = r_mat_props[STRAIN_DAMAGE_CURVE];
275 const Vector& stress_damage_curve = r_mat_props[STRESS_DAMAGE_CURVE];
276 const SizeType curve_points = strain_damage_curve.size() - 1;
279 double volumentric_fracture_energy_first_region = 0.5 * std::pow(yield_stress, 2.0) /
E;
281 volumentric_fracture_energy_first_region += 0.5 * (stress_damage_curve[
i-1] + stress_damage_curve[
i])
282 * (strain_damage_curve[
i] - strain_damage_curve[
i-1]);
283 const double irreversibility_damage_check = (stress_damage_curve[
i] - stress_damage_curve[
i-1]) / (strain_damage_curve[
i] - strain_damage_curve[
i-1]);
284 KRATOS_ERROR_IF(irreversibility_damage_check >
E)<<
"The defined S-E curve induces negative damage at region " <<
i << std::endl;
286 KRATOS_ERROR_IF(volumentric_fracture_energy_first_region > volumetric_fracture_energy) <<
"The Fracture Energy is too low: " << fracture_energy << std::endl;
288 const double predictive_stress_end_first_region = strain_damage_curve[curve_points] *
E;
289 if (UniaxialStress < predictive_stress_end_first_region){
291 if (UniaxialStress < strain_damage_curve[
i] *
E){
292 const double current_integrated_stress = stress_damage_curve[
i-1] + (UniaxialStress /
E - strain_damage_curve[
i-1])
293 * (stress_damage_curve[
i] - stress_damage_curve[
i-1]) / (strain_damage_curve[
i] - strain_damage_curve[
i-1]);
294 rDamage = 1.0 - current_integrated_stress / UniaxialStress;
299 const double volumentric_fracture_energy_second_region = volumetric_fracture_energy - volumentric_fracture_energy_first_region;
300 rDamage = 1.0 - stress_damage_curve[curve_points] / UniaxialStress * std::exp(stress_damage_curve[curve_points] * (strain_damage_curve[curve_points] *
E - UniaxialStress) / (
E * volumentric_fracture_energy_second_region));
311 double& rInitialThreshold
314 TYieldSurfaceType::GetInitialUniaxialThreshold(rValues, rInitialThreshold);
323 KRATOS_ERROR_IF_NOT(rMaterialProperties.
Has(SOFTENING_TYPE)) <<
"SOFTENING_TYPE is not a defined value" << std::endl;
324 return TYieldSurfaceType::Check(rMaterialProperties);
340 const double I1 = rStressVector[0] + rStressVector[1] + rStressVector[2];
342 YieldSurfaceType::CalculateYieldSurfaceDerivative(rStressVector, deviator,
J2, rYieldDerivative, rValues);
static void CalculateJ2Invariant(const TVector &rStressVector, const double I1, BoundedVectorType &rDeviator, double &rJ2)
This method computes the second invariant of J.
Definition: advanced_constitutive_law_utilities.h:157
: This object integrates the predictive stress using the isotropic damage theory by means of linear/e...
Definition: generic_cl_integrator_damage.h:64
static void CalculateYieldSurfaceDerivative(const array_1d< double, VoigtSize > &rStressVector, array_1d< double, VoigtSize > &rYieldDerivative, ConstitutiveLaw::Parameters &rValues)
This method returns the derivative of the yield surface.
Definition: generic_cl_integrator_damage.h:332
static constexpr SizeType VoigtSize
The define the Voigt size, already defined in the yield surface.
Definition: generic_cl_integrator_damage.h:76
YieldSurfaceType::PlasticPotentialType PlasticPotentialType
The type of plastic potential.
Definition: generic_cl_integrator_damage.h:79
static void CalculateHardeningDamage(const double UniaxialStress, const double Threshold, const double DamageParameter, const double CharacteristicLength, ConstitutiveLaw::Parameters &rValues, double &rDamage)
This computes the damage variable according to parabolic hardening and exponential softening.
Definition: generic_cl_integrator_damage.h:192
static constexpr SizeType Dimension
The define the working dimension size, already defined in the yield surface.
Definition: generic_cl_integrator_damage.h:73
static int Check(const Properties &rMaterialProperties)
This method defines in the CL integrator.
Definition: generic_cl_integrator_damage.h:321
static void GetInitialUniaxialThreshold(ConstitutiveLaw::Parameters &rValues, double &rInitialThreshold)
This method returns the initial uniaxial stress threshold.
Definition: generic_cl_integrator_damage.h:309
GenericConstitutiveLawIntegratorDamage & operator=(GenericConstitutiveLawIntegratorDamage const &rOther)
Assignment operator.
Definition: generic_cl_integrator_damage.h:95
KRATOS_CLASS_POINTER_DEFINITION(GenericConstitutiveLawIntegratorDamage)
Counted pointer of GenericConstitutiveLawIntegratorDamage.
static void CalculateLinearDamage(const double UniaxialStress, const double Threshold, const double DamageParameter, const double CharacteristicLength, ConstitutiveLaw::Parameters &rValues, double &rDamage)
This computes the damage variable according to linear softening.
Definition: generic_cl_integrator_damage.h:236
static void CalculateCurveFittingDamage(const double UniaxialStress, const double Threshold, const double DamageParameter, const double CharacteristicLength, ConstitutiveLaw::Parameters &rValues, double &rDamage)
This computes the damage variable according to a two region curve:
Definition: generic_cl_integrator_damage.h:260
virtual ~GenericConstitutiveLawIntegratorDamage()
Destructor.
Definition: generic_cl_integrator_damage.h:101
static void IntegrateStressVector(array_1d< double, VoigtSize > &rPredictiveStressVector, const double UniaxialStress, double &rDamage, double &rThreshold, ConstitutiveLaw::Parameters &rValues, const double CharacteristicLength)
This method integrates the predictive stress vector with the CL using linear or exponential softening...
Definition: generic_cl_integrator_damage.h:122
GenericConstitutiveLawIntegratorDamage()
Initialization constructor.
Definition: generic_cl_integrator_damage.h:85
GenericConstitutiveLawIntegratorDamage(GenericConstitutiveLawIntegratorDamage const &rOther)
Copy constructor.
Definition: generic_cl_integrator_damage.h:90
static void CalculateExponentialDamage(const double UniaxialStress, const double Threshold, const double DamageParameter, const double CharacteristicLength, ConstitutiveLaw::Parameters &rValues, double &rDamage)
This computes the damage variable according to exponential softening.
Definition: generic_cl_integrator_damage.h:168
TYieldSurfaceType YieldSurfaceType
The type of yield surface.
Definition: generic_cl_integrator_damage.h:70
Properties encapsulates data shared by different Elements or Conditions. It can store any type of dat...
Definition: properties.h:69
bool Has(TVariableType const &rThisVariable) const
Definition: properties.h:578
std::size_t IndexType
The definition of the index type.
Definition: key_hash.h:35
#define KRATOS_ERROR
Definition: exception.h:161
#define KRATOS_ERROR_IF_NOT(conditional)
Definition: exception.h:163
#define KRATOS_ERROR_IF(conditional)
Definition: exception.h:162
REF: G. R. Cowper, GAUSSIAN QUADRATURE FORMULAS FOR TRIANGLES.
Definition: mesh_condition.cpp:21
KratosZeroVector< double > ZeroVector
Definition: amatrix_interface.h:561
std::size_t SizeType
The definition of the size type.
Definition: mortar_classes.h:43
E
Definition: generate_hyper_elastic_simo_taylor_neo_hookean.py:26
float J2
Definition: isotropic_damage_automatic_differentiation.py:133
I1
Definition: isotropic_damage_automatic_differentiation.py:230
Gf
Definition: isotropic_damage_automatic_differentiation.py:135
int n
manufactured solution and derivatives (u=0 at z=0 dudz=0 at z=domain_height)
Definition: ode_solve.py:402
integer i
Definition: TensorModule.f:17
Definition: constitutive_law.h:189
const Properties & GetMaterialProperties()
Definition: constitutive_law.h:457