double RankinePlasticMaterial :: computeYieldValueAt(GaussPoint *gp, int isurf, const FloatArray &stressVector, const FloatArray &stressSpaceHardeningVars) { FloatArray princStress(3); this->computePrincipalValues(princStress, stressVector, principal_stress); return princStress.at(isurf) - this->k; }
void RankinePlasticMaterial :: computeStressGradientVector(FloatArray &answer, functType ftype, int isurf, GaussPoint *gp, const FloatArray &stressVector, const FloatArray &stressSpaceHardeningVars) { FloatArray princStress(3); FloatMatrix t(3, 3); // compute principal stresses and their directions this->computePrincipalValDir(princStress, t, stressVector, principal_stress); //derivation through stress transformation. The transformation matrix is stored in t. answer.resize(6); answer.at(1) = t.at(1, isurf) * t.at(1, isurf);//xx = 11 answer.at(2) = t.at(2, isurf) * t.at(2, isurf);//yy = 22 answer.at(3) = t.at(3, isurf) * t.at(3, isurf);//zz = 33 answer.at(4) = t.at(2, isurf) * t.at(3, isurf);//yz = 23 answer.at(5) = t.at(1, isurf) * t.at(3, isurf);//xz = 13 answer.at(6) = t.at(1, isurf) * t.at(2, isurf);//xy = 12 //crossSection->giveReducedCharacteristicVector(answer, gp, fullAnswer); }
double DruckerPragerCutMat :: computeYieldValueAt(GaussPoint *gp, int isurf, const FloatArray &stressVector, const FloatArray &strainSpaceHardeningVariables) { //strainSpaceHardeningVariables = kappa if ( isurf <= 3 ) { //Rankine, surfaces 1,2,3 FloatArray princStress(3); this->computePrincipalValues(princStress, stressVector, principal_stress); return princStress.at(isurf) - this->sigT; } else { //Drucker-Prager, surface 4 double volumetricStress; double DPYieldStressInShear = tau0 + H *strainSpaceHardeningVariables.at(4); double JTwo; //MaterialMode mmode = gp->giveMaterialMode(); MaterialMode mmode = _3dMat; StressVector stressVector1(stressVector, mmode); //convert from array StressVector deviatoricStress(mmode); stressVector1.computeDeviatoricVolumetricSplit(deviatoricStress, volumetricStress); JTwo = deviatoricStress.computeSecondInvariant(); return 3. * alpha * volumetricStress + sqrt(JTwo) - DPYieldStressInShear; } }
//associated and nonassociated flow rule void DruckerPragerCutMat :: computeStressGradientVector(FloatArray &answer, functType ftype, int isurf, GaussPoint *gp, const FloatArray &stressVector, const FloatArray &stressSpaceHardeningVars) { FloatArray princStress(3); FloatMatrix t(3, 3); // compute principal stresses and their directions this->computePrincipalValDir(princStress, t, stressVector, principal_stress); // derivation through stress transformation matrix. The transformation matrix is stored in t columnwise answer.resize(6); if ( isurf <= 3 ) { //Rankine associated answer.at(1) = t.at(1, isurf) * t.at(1, isurf); //xx = 11 answer.at(2) = t.at(2, isurf) * t.at(2, isurf); //yy = 22 answer.at(3) = t.at(3, isurf) * t.at(3, isurf); //zz = 33 answer.at(4) = t.at(2, isurf) * t.at(3, isurf); //yz = 23 answer.at(5) = t.at(1, isurf) * t.at(3, isurf); //xz = 13 answer.at(6) = t.at(1, isurf) * t.at(2, isurf); //xy = 12 } else { //DP nonassociated //MaterialMode mmode = gp->giveMaterialMode(); MaterialMode mmode = _3dMat; StressVector stressVector1(stressVector, mmode); //convert from array StressVector deviatoricStress(mmode); double sqrtJTwo, volumetricStress; stressVector1.computeDeviatoricVolumetricSplit(deviatoricStress, volumetricStress); sqrtJTwo = sqrt( deviatoricStress.computeSecondInvariant() ); answer.at(1) = alphaPsi + deviatoricStress.at(1) / 2. / sqrtJTwo; answer.at(2) = alphaPsi + deviatoricStress.at(2) / 2. / sqrtJTwo; answer.at(3) = alphaPsi + deviatoricStress.at(3) / 2. / sqrtJTwo; answer.at(4) = stressVector1.at(4) / sqrtJTwo; answer.at(5) = stressVector1.at(5) / sqrtJTwo; answer.at(6) = stressVector1.at(6) / sqrtJTwo; } }