Ejemplo n.º 1
0
void
RankTwoTensorTest::d2thirdInvariantTest()
{
  // Here i do a finite-difference calculation of the third
  // derivative and compare with the closed-solution form
  Real ep = 1E-5; // small finite-difference parameter

  RankTwoTensor d1; // first derivative of thirdInvariant - from RankTwoTensor - do a finite-difference of this
  RankFourTensor d2; // third derivative of third Invariant - from RankTwoTensor
  RankTwoTensor mep; // matrix with shifted entries
  RankTwoTensor d1ep; // first derivative of thirdInvariant of mep


  mep = _m3;
  d1 = _m3.dthirdInvariant();
  d2 = _m3.d2thirdInvariant();
  for (unsigned i = 0; i < 3; i++)
    for (unsigned j = 0; j < 3; j++)
    {
      for (unsigned int k = 0; k < 3; k++)
        for (unsigned int l = 0; l < 3; l++)
        {
          mep(k, l) += ep;
          d1ep = mep.dthirdInvariant();
          CPPUNIT_ASSERT_DOUBLES_EQUAL((d1ep(i, j) - d1(i, j))/ep, d2(i, j, k, l), ep);
          mep(k, l) -= ep;
        }
    }


  mep = _unsymmetric1;
  d1 = _unsymmetric1.dthirdInvariant();
  d2 = _unsymmetric1.d2thirdInvariant();
  for (unsigned i = 0; i < 3; i++)
    for (unsigned j = 0; j < 3; j++)
    {
      for (unsigned int k = 0; k < 3; k++)
        for (unsigned int l = 0; l < 3; l++)
        {
          mep(k, l) += ep;
          d1ep = mep.dthirdInvariant();
          CPPUNIT_ASSERT_DOUBLES_EQUAL((d1ep(i, j) - d1(i, j))/ep, d2(i, j, k, l), ep);
          mep(k, l) -= ep;

          // note that because d1 and d2 explicitly symmeterise the matrix
          // the derivative may or may not explicitly symmeterise
          mep(k, l) += 0.5*ep;
          mep(l, k) += 0.5*ep;
          d1ep = mep.dthirdInvariant();
          CPPUNIT_ASSERT_DOUBLES_EQUAL((d1ep(i, j) - d1(i, j))/ep, d2(i, j, k, l), ep);
          mep(k, l) -= 0.5*ep;
          mep(l, k) -= 0.5*ep;
        }
    }
}