29template <
int DisplacementDim>
31 std::string
const& phasefield_model)
33 if (phasefield_model ==
"AT1")
37 if (phasefield_model ==
"AT2")
41 if (phasefield_model ==
"COHESIVE")
46 "phasefield_model must be 'AT1', 'AT2' or 'COHESIVE' but '{}' "
48 phasefield_model.c_str());
57template <
int DisplacementDim>
59 std::optional<std::string>
const& softening_curve)
63 if (*softening_curve ==
"Linear")
67 if (*softening_curve ==
"Exponential")
72 "softening_curve must be 'Linear' or 'Exponential' but '{}' "
74 softening_curve->c_str());
89template <
int DisplacementDim>
91 std::string
const& energy_split_model)
93 if (energy_split_model ==
"Isotropic")
97 if (energy_split_model ==
"VolumetricDeviatoric")
101 if (energy_split_model ==
"Spectral")
105 if (energy_split_model ==
"EffectiveStress")
109 if (energy_split_model ==
"OrthoVolDev")
113 if (energy_split_model ==
"OrthoMasonry")
118 "energy_split_model must be 'Isotropic', 'VolumetricDeviatoric', "
119 "'EffectiveStress', 'OrthoVolDev' or 'OrthoMasonry' but '{}' was given",
120 energy_split_model.c_str());
129 double const ls) = 0;
131 double const ls) = 0;
133 double const ls) = 0;
141 double const )
override
143 return d_ip * d_ip * (1. - k) + k;
146 double const )
override
148 return 2. * (1. - k) * d_ip;
151 double const )
override
153 return 2. * (1. - k);
169 double const ls)
override
171 double const m1 = 4.0 *
lch / acos(-1.) / ls;
176 double const m2 = std::pow(2., 5. / 3.) - 3.;
177 double const n = 2.5;
178 return std::pow(d_ip, n) /
180 m1 * (1. - d_ip) * (1. + m2 * (1. - d_ip))) *
186 double const m2 = -0.5;
188 return std::pow(d_ip, n) /
190 m1 * (1. - d_ip) * (1. + m2 * (1. - d_ip))) *
197 double const ls)
override
199 double const m1 = 4.0 *
lch / acos(-1.) / ls;
204 double const m2 = std::pow(2., 5. / 3.) - 3.;
205 double const n = 2.5;
206 double const a1 = std::pow(d_ip, n) +
207 m1 * (1. - d_ip) * (1. + m2 * (1. - d_ip));
208 double const a2 = n * std::pow(d_ip, n - 1.) -
209 2. * m1 * m2 * (1. - d_ip) - m1;
211 (n * std::pow(d_ip, n - 1.) * a1 -
212 std::pow(d_ip, n) * a2) /
217 double const m2 = -0.5;
219 double const a1 = std::pow(d_ip, n) +
220 m1 * (1. - d_ip) * (1. + m2 * (1. - d_ip));
221 double const a2 = n * std::pow(d_ip, n - 1.) -
222 2. * m1 * m2 * (1. - d_ip) - m1;
224 (n * std::pow(d_ip, n - 1.) * a1 -
225 std::pow(d_ip, n) * a2) /
231 double const ls)
override
233 double const m1 = 4.0 *
lch / acos(-1.) / ls;
238 double const m2 = std::pow(2., 5. / 3.) - 3.;
239 double const n = 2.5;
240 double a1 = std::pow(d_ip, n) +
241 m1 * (1. - d_ip) * (1. + m2 * (1. - d_ip));
242 double a2 = n * std::pow(d_ip, n - 1.) -
243 2. * m1 * m2 * (1. - d_ip) - m1;
245 (2. * a2 * a2 * std::pow(d_ip, n) -
246 a1 * std::pow(d_ip, n) *
248 n * std::pow(d_ip, n - 2.) * (n - 1.)) -
249 2. * a1 * a2 * n * std::pow(d_ip, n - 1.) +
250 a1 * a1 * n * std::pow(d_ip, n - 2.) * (n - 1.)) /
255 double const m2 = -0.5;
257 double const a1 = std::pow(d_ip, n) +
258 m1 * (1. - d_ip) * (1. + m2 * (1. - d_ip));
259 double const a2 = n * std::pow(d_ip, n - 1.) -
260 2. * m1 * m2 * (1. - d_ip) - m1;
262 (2. * a2 * a2 * std::pow(d_ip, n) -
263 a1 * std::pow(d_ip, n) *
265 n * std::pow(d_ip, n - 2.) * (n - 1.)) -
266 2. * a1 * a2 * n * std::pow(d_ip, n - 1.) +
267 a1 * a1 * n * std::pow(d_ip, n - 2.) * (n - 1.)) /
274template <
int DisplacementDim>
279 switch (phasefield_model)
282 return std::make_unique<COHESIVE_DegradationDerivative>(
283 lch, softening_curve);
285 return std::make_unique<AT_DegradationDerivative>();
289template <
typename T_DNDX,
typename T_N,
typename T_W,
typename T_D,
290 typename T_LOCAL_JAC,
typename T_LOCAL_RHS>
292 T_D& d, T_LOCAL_JAC& local_Jac,
293 T_LOCAL_RHS local_rhs,
294 double const gc,
double const ls,
297 switch (phasefield_model)
301 auto const local_Jac_AT1 =
302 (gc * 0.75 * dNdx.transpose() * dNdx * ls * w).eval();
303 local_Jac.noalias() += local_Jac_AT1;
305 local_rhs.noalias() -=
306 gc * (-0.375 * N.transpose() / ls) * w + local_Jac_AT1 * d;
311 auto const local_Jac_AT2 =
312 (gc * (N.transpose() * N / ls + dNdx.transpose() * dNdx * ls) *
315 local_Jac.noalias() += local_Jac_AT2;
317 local_rhs.noalias() -=
318 local_Jac_AT2 * d - gc * (N.transpose() / ls) * w;
323 auto const local_Jac_COHESIVE =
324 (2.0 / std::numbers::pi * gc *
325 (-N.transpose() * N / ls + dNdx.transpose() * dNdx * ls) * w)
328 local_Jac.noalias() += local_Jac_COHESIVE;
330 local_rhs.noalias() -= local_Jac_COHESIVE * d;
335 OGS_FATAL(
"Invalid phase field model specified.");
340template <
typename T_VECTOR,
typename T_MATRIX,
int DisplacementDim>
342 T_VECTOR& sigma, T_VECTOR& sigma_tensile, T_VECTOR& sigma_compressive,
343 T_VECTOR& eps_tensile, T_MATRIX& D, T_MATRIX& C_tensile,
344 T_MATRIX& C_compressive,
double& strain_energy_tensile,
345 double& elastic_energy,
double const degradation, T_VECTOR
const& eps,
350 auto linear_elastic_mp =
352 DisplacementDim
> const&>(solid_material)
353 .getMaterialProperties();
355 auto const lambda = linear_elastic_mp.lambda(t, x);
356 auto const bulk_modulus = linear_elastic_mp.bulk_modulus(t, x);
357 auto const mu = linear_elastic_mp.mu(t, x);
358 switch (energy_split_model)
362 std::tie(sigma, sigma_tensile, D, strain_energy_tensile,
363 elastic_energy, C_tensile, C_compressive) =
366 degradation, bulk_modulus, mu, eps);
371 std::tie(sigma, sigma_tensile, D, strain_energy_tensile,
372 elastic_energy, C_tensile, C_compressive) =
374 DisplacementDim>(degradation, bulk_modulus, mu, eps);
379 std::tie(sigma, sigma_tensile, D, strain_energy_tensile,
380 elastic_energy, C_tensile, C_compressive) =
383 degradation, lambda, mu, eps);
388 std::tie(sigma, sigma_tensile, D, strain_energy_tensile,
389 elastic_energy, C_tensile, C_compressive) =
390 MaterialLib::Solids::Phasefield::
391 calculateIsotropicDegradedStressWithRankineEnergy<
392 DisplacementDim>(degradation, bulk_modulus, mu, eps);
397 double temperature = 0.;
400 DisplacementDim
> const&>(solid_material)
401 .getElasticTensor(t, x, temperature);
403 std::tie(eps_tensile, sigma, sigma_tensile, sigma_compressive, D,
404 strain_energy_tensile, elastic_energy, C_tensile,
407 degradation, eps, C_ortho);
412 double temperature = 0.;
415 DisplacementDim
> const&>(solid_material)
416 .getElasticTensor(t, x, temperature);
418 std::tie(eps_tensile, sigma, sigma_tensile, D,
419 strain_energy_tensile, elastic_energy, C_tensile,
422 degradation, eps, C_ortho);
426 OGS_FATAL(
"Invalid energy split model specified.");
double degradation(double const d_ip, double const k, double const) override
double degradationDf1(double const d_ip, double const k, double const) override
double degradationDf2(double const, double const k, double const) override
SofteningCurve softening_curve
double degradationDf1(double const d_ip, double const k, double const ls) override
double degradationDf2(double const d_ip, double const k, double const ls) override
double degradation(double const d_ip, double const k, double const ls) override
COHESIVE_DegradationDerivative(double const Parameter_lch, SofteningCurve Parameter_softening_curve)
virtual double degradationDf2(double const d_ip, double const k, double const ls)=0
virtual double degradation(double const d_ip, double const k, double const ls)=0
virtual ~DegradationDerivative()=default
virtual double degradationDf1(double const d_ip, double const k, double const ls)=0
std::tuple< MathLib::KelvinVector::KelvinVectorType< DisplacementDim >, MathLib::KelvinVector::KelvinVectorType< DisplacementDim >, MathLib::KelvinVector::KelvinVectorType< DisplacementDim >, MathLib::KelvinVector::KelvinVectorType< DisplacementDim >, MathLib::KelvinVector::KelvinMatrixType< DisplacementDim >, double, double, MathLib::KelvinVector::KelvinMatrixType< DisplacementDim >, MathLib::KelvinVector::KelvinMatrixType< DisplacementDim > > calculateOrthoVolDevDegradedStress(double const degradation, MathLib::KelvinVector::KelvinVectorType< DisplacementDim > const &eps, MathLib::KelvinVector::KelvinMatrixType< DisplacementDim > const &C_ortho)
void calculateStress(T_VECTOR &sigma, T_VECTOR &sigma_tensile, T_VECTOR &sigma_compressive, T_VECTOR &eps_tensile, T_MATRIX &D, T_MATRIX &C_tensile, T_MATRIX &C_compressive, double &strain_energy_tensile, double &elastic_energy, double const degradation, T_VECTOR const &eps, EnergySplitModel const &energy_split_model, double const t, ParameterLib::SpatialPosition const &x, MaterialLib::Solids::MechanicsBase< DisplacementDim > const &solid_material)
std::tuple< MathLib::KelvinVector::KelvinVectorType< DisplacementDim >, MathLib::KelvinVector::KelvinVectorType< DisplacementDim >, MathLib::KelvinVector::KelvinMatrixType< DisplacementDim >, double, double, MathLib::KelvinVector::KelvinMatrixType< DisplacementDim >, MathLib::KelvinVector::KelvinMatrixType< DisplacementDim > > calculateIsotropicDegradedStress(double const degradation, double const bulk_modulus, double const mu, MathLib::KelvinVector::KelvinVectorType< DisplacementDim > const &eps)
std::tuple< MathLib::KelvinVector::KelvinVectorType< DisplacementDim >, MathLib::KelvinVector::KelvinVectorType< DisplacementDim >, MathLib::KelvinVector::KelvinMatrixType< DisplacementDim >, double, double, MathLib::KelvinVector::KelvinMatrixType< DisplacementDim >, MathLib::KelvinVector::KelvinMatrixType< DisplacementDim > > calculateSpectralDegradedStress(double const degradation, double const lambda, double const mu, MathLib::KelvinVector::KelvinVectorType< DisplacementDim > const &eps)
void calculateCrackLocalJacobianAndResidual(T_DNDX &dNdx, T_N &N, T_W &w, T_D &d, T_LOCAL_JAC &local_Jac, T_LOCAL_RHS local_rhs, double const gc, double const ls, PhaseFieldModel &phasefield_model)
std::unique_ptr< DegradationDerivative > creatDegradationDerivative(PhaseFieldModel const &phasefield_model, double const lch, SofteningCurve const &softening_curve)
std::tuple< MathLib::KelvinVector::KelvinVectorType< DisplacementDim >, MathLib::KelvinVector::KelvinVectorType< DisplacementDim >, MathLib::KelvinVector::KelvinMatrixType< DisplacementDim >, double, double, MathLib::KelvinVector::KelvinMatrixType< DisplacementDim >, MathLib::KelvinVector::KelvinMatrixType< DisplacementDim > > calculateVolDevDegradedStress(double const degradation, double const bulk_modulus, double const mu, MathLib::KelvinVector::KelvinVectorType< DisplacementDim > const &eps)
PhaseFieldModel convertStringToPhaseFieldModel(std::string const &phasefield_model)
SofteningCurve convertStringToSofteningCurve(std::optional< std::string > const &softening_curve)
EnergySplitModel convertStringToEnergySplitModel(std::string const &energy_split_model)
std::tuple< MathLib::KelvinVector::KelvinVectorType< DisplacementDim >, MathLib::KelvinVector::KelvinVectorType< DisplacementDim >, MathLib::KelvinVector::KelvinVectorType< DisplacementDim >, MathLib::KelvinVector::KelvinMatrixType< DisplacementDim >, double, double, MathLib::KelvinVector::KelvinMatrixType< DisplacementDim >, MathLib::KelvinVector::KelvinMatrixType< DisplacementDim > > calculateOrthoMasonryDegradedStress(double const degradation, MathLib::KelvinVector::KelvinVectorType< DisplacementDim > const &eps, MathLib::KelvinVector::KelvinMatrixType< DisplacementDim > const &C_ortho)
Eigen::Matrix< double, kelvin_vector_dimensions(DisplacementDim), kelvin_vector_dimensions(DisplacementDim), Eigen::RowMajor > KelvinMatrixType