const C2Vector OrthoProject (const CVector &vVec, int iAxis) { switch (iAxis) { case axisX: return C2Vector(vVec.Y(), vVec.Z()); case axisY: return C2Vector(vVec.X(), vVec.Z()); case axisZ: return C2Vector(vVec.X(), vVec.Y()); default: ASSERT(false); return C2Vector(); } }
// EVALUATE THE PLASTIC POTENTIAL DERIVATIVES void BorjaCamClayExplicitFlowRule::CalculatePlasticPotentialDerivatives( const Vector& rStressVector, Vector& rFirstDerivative, Matrix & rSecondDerivative) { rFirstDerivative = ZeroVector(1); rSecondDerivative = ZeroMatrix(1,1); double M = mpYieldCriterion->GetHardeningLaw().GetProperties()[CRITICAL_STATE_LINE] ; double Friction = mpYieldCriterion->GetHardeningLaw().GetProperties()[INTERNAL_FRICTION_ANGLE]; if ( fabs( Friction) > 1e-5) return; Vector StressV = rStressVector; double MeanP = 0; for (unsigned int i=0 ; i < 3; i++) MeanP += StressV(i) / 3.0; for (unsigned int i = 0; i < 3; i++) StressV(i) -= MeanP; // COMPUTE J2; double J2InvSQ = 0; for (unsigned int i = 0; i < 3; i++) J2InvSQ += pow( StressV(i), 2.0); for (unsigned int i = 0; i < 3; i++) J2InvSQ += 2.0 * pow( StressV(i), 2.0); J2InvSQ = sqrt( J2InvSQ/2.0); if ( J2InvSQ < 1E-5) return; // J2 firstDeriv Vector C2Vector = StressV; for (unsigned int i = 3; i < 6; i++) C2Vector(i) *= 2.0; C2Vector /= 2.0* J2InvSQ; // C2Matrix Matrix C2Matrix = ZeroMatrix(6,6); for (unsigned int i = 0; i < 6; i++) { for (unsigned int j = 0; j < 6; j++) { double times = 0.5; if ( i > 2) times *= 2.0; if ( j > 2 ) times *= 2.0; C2Matrix(i,j) -= times* StressV(i)*StressV(j) / pow( J2InvSQ, 2.0); } } for (unsigned int i = 0; i < 3; i++) { C2Matrix(i,i) += 1.0; for (unsigned int j = 0; j < 3; j++) { C2Matrix(i,j) -= 1.0/3.0; } } for (unsigned int i = 3; i < 6; i++) C2Matrix(i,i) += 2.0; C2Matrix /= 2.0 * J2InvSQ; rSecondDerivative = 6.0 / ( M*M) * J2InvSQ * C2Matrix; Vector C1Der = ZeroVector(6); for (unsigned int i = 0; i < 3; i++) C1Der(i) = 1.0/3.0; for (unsigned int i = 0; i < 6; i++) { for (unsigned int j = 0; j < 6; j++) { rSecondDerivative(i,j) += 6.0/ (M*M) * C2Vector(i)*C2Vector(j) + 2.0*C1Der(i)*C1Der(j); } } }