void TensorMechanicsPlasticMohrCoulombMulti::perturbStress(const RankTwoTensor & stress, std::vector<Real> & eigvals, std::vector<RankTwoTensor> & deigvals) const { Real small_perturbation; RankTwoTensor shifted_stress = stress; while (eigvals[0] > eigvals[1] - 0.1*_shift || eigvals[1] > eigvals[2] - 0.1*_shift) { for (unsigned i = 0; i < 3; ++i) for (unsigned j = 0; j <= i; ++j) { small_perturbation = 0.1*_shift*2*(MooseRandom::rand() - 0.5); shifted_stress(i, j) += small_perturbation; shifted_stress(j, i) += small_perturbation; } shifted_stress.dsymmetricEigenvalues(eigvals, deigvals); } }
void TensorMechanicsPlasticTensileMulti::dyieldFunction_dstressV(const RankTwoTensor & stress, const Real & /*intnl*/, std::vector<RankTwoTensor> & df_dstress) const { std::vector<Real> eigvals; stress.dsymmetricEigenvalues(eigvals, df_dstress); if (eigvals[0] > eigvals[1] - 0.1*_shift || eigvals[1] > eigvals[2] - 0.1*_shift) { Real small_perturbation; RankTwoTensor shifted_stress = stress; while (eigvals[0] > eigvals[1] - 0.1*_shift || eigvals[1] > eigvals[2] - 0.1*_shift) { for (unsigned i = 0; i < 3; ++i) for (unsigned j = 0; j <= i; ++j) { small_perturbation = 0.1*_shift*2*(MooseRandom::rand() - 0.5); shifted_stress(i, j) += small_perturbation; shifted_stress(j, i) += small_perturbation; } shifted_stress.dsymmetricEigenvalues(eigvals, df_dstress); } } }