RankFourTensor TensorMechanicsPlasticMeanCapTC::consistentTangentOperator(const RankTwoTensor & trial_stress, Real intnl_old, const RankTwoTensor & stress, Real intnl, const RankFourTensor & E_ijkl, const std::vector<Real> & cumulative_pm) const { if (!_use_custom_cto) return TensorMechanicsPlasticModel::consistentTangentOperator(trial_stress, intnl_old, stress, intnl, E_ijkl, cumulative_pm); Real df_dq; Real alpha; if (trial_stress.trace() >= tensile_strength(intnl_old)) { df_dq = -dtensile_strength(intnl); alpha = 1.0; } else { df_dq = dcompressive_strength(intnl); alpha = -1.0; } RankTwoTensor elas; for (unsigned int i = 0; i < 3; ++i) for (unsigned int j = 0; j < 3; ++j) for (unsigned int k = 0; k < 3; ++k) elas(i, j) += E_ijkl(i, j, k, k); const Real hw = -df_dq + alpha * elas.trace(); return E_ijkl - alpha / hw * elas.outerProduct(elas); }
RankFourTensor TensorMechanicsPlasticJ2::consistentTangentOperator(const RankTwoTensor & trial_stress, Real intnl_old, const RankTwoTensor & stress, Real intnl, const RankFourTensor & E_ijkl, const std::vector<Real> & cumulative_pm) const { if (!_use_custom_cto) return TensorMechanicsPlasticModel::consistentTangentOperator( trial_stress, intnl_old, stress, intnl, E_ijkl, cumulative_pm); Real mu = E_ijkl(0, 1, 0, 1); Real h = 3 * mu + dyieldStrength(intnl); RankTwoTensor sij = stress.deviatoric(); Real sII = stress.secondInvariant(); Real equivalent_stress = std::sqrt(3.0 * sII); Real zeta = cumulative_pm[0] / (1.0 + 3.0 * mu * cumulative_pm[0] / equivalent_stress); return E_ijkl - 3.0 * mu * mu / sII / h * sij.outerProduct(sij) - 4.0 * mu * mu * zeta * dflowPotential_dstress(stress, intnl); }