Example #1
0
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);
         }
      }

   }