void
ComputeCosseratIncrementalSmallStrain::computeQpProperties()
{
  RankTwoTensor strain((*_grad_disp[0])[_qp], (*_grad_disp[1])[_qp], (*_grad_disp[2])[_qp]);
  RankTwoTensor strain_old((*_grad_disp_old[0])[_qp], (*_grad_disp_old[1])[_qp], (*_grad_disp_old[2])[_qp]);
  RealVectorValue wc_vector((*_wc[0])[_qp], (*_wc[1])[_qp], (*_wc[2])[_qp]);
  RealVectorValue wc_vector_old((*_wc_old[0])[_qp], (*_wc_old[1])[_qp], (*_wc_old[2])[_qp]);

  for (unsigned i = 0; i < LIBMESH_DIM; ++i)
    for (unsigned j = 0; j < LIBMESH_DIM; ++j)
      for (unsigned k = 0; k < LIBMESH_DIM; ++k)
        {
          strain(i, j) += PermutationTensor::eps(i, j, k) * wc_vector(k);
          strain_old(i, j) += PermutationTensor::eps(i, j, k) * wc_vector_old(k);
        }

  _deformation_gradient[_qp] = strain;
  _deformation_gradient[_qp].addIa(1.0); // Gauss point deformation gradient

  const RankTwoTensor total_strain_increment = strain - strain_old;

  _strain_increment[_qp] = total_strain_increment;
  _strain_increment[_qp] -= _eigenstrain_increment[_qp];

  _strain_rate[_qp] = _strain_increment[_qp]/_dt;

  _total_strain[_qp] = _total_strain_old[_qp] + total_strain_increment;
  _mechanical_strain[_qp] = _mechanical_strain_old[_qp] + _strain_increment[_qp];

  RankTwoTensor curv((*_grad_wc[0])[_qp], (*_grad_wc[1])[_qp], (*_grad_wc[2])[_qp]);
  RankTwoTensor curv_old((*_grad_wc_old[0])[_qp], (*_grad_wc_old[1])[_qp], (*_grad_wc_old[2])[_qp]);
  _curvature_increment[_qp] = curv - curv_old;
  _curvature[_qp] = _curvature_old[_qp] + _curvature_increment[_qp];
}
void
CosseratLinearElasticMaterial::computeQpStrain()
{
    RankTwoTensor strain(_grad_disp_x[_qp], _grad_disp_y[_qp], _grad_disp_z[_qp]);
    RealVectorValue wc_vector((*_wc[0])[_qp], (*_wc[1])[_qp], (*_wc[2])[_qp]);

    for (unsigned i = 0; i < LIBMESH_DIM; ++i)
        for (unsigned j = 0; j < LIBMESH_DIM; ++j)
            for (unsigned k = 0; k < LIBMESH_DIM; ++k)
                strain(i, j) += PermutationTensor::eps(i, j, k) * wc_vector(k);

    _elastic_strain[_qp] = strain;

    _curvature[_qp] = RankTwoTensor((*_grad_wc[0])[_qp], (*_grad_wc[1])[_qp], (*_grad_wc[2])[_qp]);
}
void
ComputeCosseratSmallStrain::computeQpProperties()
{
  RankTwoTensor strain((*_grad_disp[0])[_qp], (*_grad_disp[1])[_qp], (*_grad_disp[2])[_qp]);
  RealVectorValue wc_vector((*_wc[0])[_qp], (*_wc[1])[_qp], (*_wc[2])[_qp]);

  for (unsigned i = 0; i < LIBMESH_DIM; ++i)
    for (unsigned j = 0; j < LIBMESH_DIM; ++j)
      for (unsigned k = 0; k < LIBMESH_DIM; ++k)
        strain(i, j) += PermutationTensor::eps(i, j, k) * wc_vector(k);

  _total_strain[_qp] = strain;

  _mechanical_strain[_qp] = strain;
  for (auto es : _eigenstrains)
    _mechanical_strain[_qp] -= (*es)[_qp];

  _curvature[_qp] = RankTwoTensor((*_grad_wc[0])[_qp], (*_grad_wc[1])[_qp], (*_grad_wc[2])[_qp]);
}