Ejemplo n.º 1
0
void
RankTwoTensorTest::dthirdInvariantTest()
{
  // this derivative is less trivial
  // so let's check with a finite-difference approximation
  Real ep = 1E-5; // small finite-difference parameter
  Real thirdInvariant; // thirdInvariant provided by RankTwoTensor
  RankTwoTensor deriv; // derivative of thirdInvariant provided by RankTwoTensor
  RankTwoTensor mep; // the RankTwoTensor with successive entries shifted by ep

  thirdInvariant = _m3.thirdInvariant();
  deriv = _m3.dthirdInvariant();
  mep = _m3;
  for (unsigned i = 0 ; i < 3 ; ++i)
    for (unsigned j = 0 ; j < 3 ; ++j)
    {
      mep(i, j) += ep;
      CPPUNIT_ASSERT_DOUBLES_EQUAL((mep.thirdInvariant() - thirdInvariant)/ep, deriv(i, j), 10*ep);
      mep(i, j) -= ep;
    }

  thirdInvariant = _unsymmetric1.thirdInvariant();
  deriv = _unsymmetric1.dthirdInvariant();
  mep = _unsymmetric1;
  for (unsigned i = 0 ; i < 3 ; ++i)
    for (unsigned j = 0 ; j < 3 ; ++j)
    {
      mep(i, j) += ep;
      CPPUNIT_ASSERT_DOUBLES_EQUAL((mep.thirdInvariant() - thirdInvariant)/ep, deriv(i, j), 10*ep);
      mep(i, j) -= ep;

      // since thirdInvariant is explicitly symmeterised, we can also do
      mep(i, j) += 0.5*ep;
      mep(j, i) += 0.5*ep;
      CPPUNIT_ASSERT_DOUBLES_EQUAL((mep.thirdInvariant() - thirdInvariant)/ep, deriv(i, j), 10*ep);
      mep(i, j) -= 0.5*ep;
      mep(j, i) -= 0.5*ep;
    }
}