void
LinearGeneralAnisotropicMaterial::computeQpProperties()
{
  computeQpElasticityTensor();
  computeQpStrain();
  computeQpStress();
}
예제 #2
0
void
Compute2DFiniteStrain::computeProperties()
{
  // Method from Rashid, 1993
  RankTwoTensor ave_Fhat;
  Real ave_dfgrd_det = 0.0;

  for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
  {
    // Deformation gradient calculation for 2D problems
    // Note: x_disp is the radial displacement, y_disp is the axial displacement
    RankTwoTensor A((*_grad_disp[0])[_qp], (*_grad_disp[1])[_qp], (*_grad_disp[2])[_qp]); //Deformation gradient
    RankTwoTensor Fbar((*_grad_disp_old[0])[_qp], (*_grad_disp_old[1])[_qp], (*_grad_disp_old[2])[_qp]); //Old Deformation gradient

    // Compute the displacement gradient (2,2) value for plane strain, generalized plane strain, or axisymmetric problems
    A(2,2) = computeGradDispZZ();
    Fbar(2,2) = computeGradDispZZold();

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

    A -= Fbar; //very nearly A = gradU - gradUold, adapted to cylindrical coords

    Fbar.addIa(1.0); //Fbar = ( I + gradUold)

    //Incremental deformation gradient _Fhat = I + A Fbar^-1
    _Fhat[_qp] = A * Fbar.inverse();
    _Fhat[_qp].addIa(1.0);

    // Calculate average _Fhat for volumetric locking correction
    ave_Fhat += _Fhat[_qp] * _JxW[_qp] * _coord[_qp];

    // Average deformation gradient
    ave_dfgrd_det += _deformation_gradient[_qp].det() * _JxW[_qp] * _coord[_qp];
  }

  // needed for volumetric locking correction
  ave_Fhat /= _current_elem_volume;
  // average deformation gradient
  ave_dfgrd_det /=_current_elem_volume;

  for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
  {
    // Finalize volumetric locking correction
    _Fhat[_qp] *= std::cbrt(ave_Fhat.det() / _Fhat[_qp].det());

    computeQpStrain();

    // Volumetric locking correction
    _deformation_gradient[_qp] *= std::cbrt(ave_dfgrd_det / _deformation_gradient[_qp].det());
  }
}
예제 #3
0
void
ComputeFiniteStrain::computeProperties()
{
  // Method from Rashid, 1993
  RankTwoTensor ave_Fhat;
  Real ave_dfgrd_det = 0.0;

  for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
  {
    // Deformation gradient
    RankTwoTensor A((*_grad_disp[0])[_qp], (*_grad_disp[1])[_qp], (*_grad_disp[2])[_qp]); //Deformation gradient
    RankTwoTensor Fbar((*_grad_disp_old[0])[_qp], (*_grad_disp_old[1])[_qp], (*_grad_disp_old[2])[_qp]); //Old Deformation gradient

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

    // A = gradU - gradUold
    A -= Fbar;

    // Fbar = ( I + gradUold)
    Fbar.addIa(1.0);

    // Incremental deformation gradient _Fhat = I + A Fbar^-1
    _Fhat[_qp] = A * Fbar.inverse();
    _Fhat[_qp].addIa(1.0);

    // Calculate average _Fhat for volumetric locking correction
    ave_Fhat += _Fhat[_qp] * _JxW[_qp] * _coord[_qp];

    // Average deformation gradient
    ave_dfgrd_det += _deformation_gradient[_qp].det() * _JxW[_qp] * _coord[_qp];
  }

  // needed for volumetric locking correction
  ave_Fhat /= _current_elem_volume;
  // average deformation gradient
  ave_dfgrd_det /=_current_elem_volume;

  for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
  {
    if (_volumetric_locking_correction)
    {
      // Finalize volumetric locking correction
      _Fhat[_qp] *= std::pow(ave_Fhat.det() / _Fhat[_qp].det(), 1.0/3.0);
      _deformation_gradient[_qp] *= std::pow(ave_dfgrd_det / _deformation_gradient[_qp].det(), 1.0/3.0);
    }

    computeQpStrain();
  }
}
예제 #4
0
void
FiniteStrainMaterial::computeStrain()
{
  //Method from Rashid, 1993
  std::vector<RankTwoTensor> Fhat;
  Fhat.resize(_qrule->n_points());
  RankTwoTensor ave_Fhat;
  Real volume(0);
  Real ave_dfgrd_det;

  ave_dfgrd_det=0.0;
  for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
  {
    //Deformation gradient
    RankTwoTensor A(_grad_disp_x[_qp], _grad_disp_y[_qp], _grad_disp_z[_qp]); //Deformation gradient
    RankTwoTensor Fbar(_grad_disp_x_old[_qp], _grad_disp_y_old[_qp], _grad_disp_z_old[_qp]); //Old Deformation gradient

    _dfgrd[_qp] = A;
    _dfgrd[_qp].addIa(1.0);//Gauss point deformation gradient

    A -= Fbar; //A = gradU - gradUold

    Fbar.addIa(1.0); //Fbar = ( I + gradUold)

    //Incremental deformation gradient Fhat = I + A Fbar^-1
    Fhat[_qp] = A * Fbar.inverse();
    Fhat[_qp].addIa(1.0);

    //Calculate average Fhat for volumetric locking correction
    ave_Fhat += Fhat[_qp] * _JxW[_qp];
    volume += _JxW[_qp];

    ave_dfgrd_det += _dfgrd[_qp].det() * _JxW[_qp]; //Average deformation gradient
  }

  ave_Fhat /= volume; //This is needed for volumetric locking correction
  ave_dfgrd_det /=volume; //Average deformation gradient

  for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
  {
    Real factor( std::pow( ave_Fhat.det() / Fhat[_qp].det(), 1.0/3.0));
    Fhat[_qp] *= factor; //Finalize volumetric locking correction

    computeQpStrain(Fhat[_qp]);

    factor = std::pow(ave_dfgrd_det / _dfgrd[_qp].det(), 1.0/3.0);//Volumetric locking correction
    _dfgrd[_qp] *= factor;//Volumetric locking correction
  }
}
void
ComputeRSphericalFiniteStrain::computeProperties()
{
    // Method from Rashid, 1993
    RankTwoTensor ave_Fhat;
    Real ave_dfgrd_det = 0.0;

    for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
    {
        // Deformation gradient calculation in cylindrical coordinates
        RankTwoTensor A;    // Deformation gradient
        RankTwoTensor Fbar; // Old Deformation gradient

        // Step through calculating the current and old deformation gradients
        // Only diagonal components are nonzero because this is a 1D material
        // Note: x_disp is the radial displacement
        A(0,0) = (*_grad_disp[0])[_qp](0);
        Fbar(0,0) = (*_grad_disp_old[0])[_qp](0);

        // The polar and azimuthal strains are functions of radial displacement
        if (!MooseUtils::relativeFuzzyEqual(_q_point[_qp](0), 0.0))
        {
            A(1,1) = (*_disp[0])[_qp] / _q_point[_qp](0);
            Fbar(1,1) = _disp_old_0[_qp] / _q_point[_qp](0);
        }

        // The polar and azimuthal strains are equalivalent in this 1D problem
        A(2,2) = A(1,1);
        Fbar(2,2) = Fbar(1,1);

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

        // very nearly A = gradU - gradUold, adapted to cylindrical coords
        A -= Fbar;

        // Fbar = ( I + gradUold)
        Fbar.addIa(1.0);

        // Incremental deformation gradient _Fhat = I + A Fbar^-1
        _Fhat[_qp] = A * Fbar.inverse();
        _Fhat[_qp].addIa(1.0);

        computeQpStrain();
    }
}
예제 #6
0
void
TrussMaterial::computeProperties()
{
  // check for consistency of the number of element nodes
  mooseAssert(_current_elem->n_nodes() == 2, "Truss element needs to have exactly two nodes.");

  // fetch the two end nodes for _current_elem
  std::vector<Node *> node;
  for (unsigned int i = 0; i < 2; ++i)
    node.push_back(_current_elem->get_node(i));

  // calculate original length of a truss element
  RealGradient dxyz;
  for (unsigned int i = 0; i < _ndisp; ++i)
    dxyz(i) = (*node[1])(i) - (*node[0])(i);
  _origin_length = dxyz.norm();

  // fetch the solution for the two end nodes
  NonlinearSystemBase & nonlinear_sys = _fe_problem.getNonlinearSystemBase();
  const NumericVector<Number> &sol = *nonlinear_sys.currentSolution();

  std::vector<Real> disp0, disp1;
  for (unsigned int i = 0; i < _ndisp; ++i)
  {
    disp0.push_back(sol(node[0]->dof_number(nonlinear_sys.number(), _disp_var[i]->number(), 0)));
    disp1.push_back(sol(node[1]->dof_number(nonlinear_sys.number(), _disp_var[i]->number(), 0)));
  }

  // calculate current length of a truss element
  for (unsigned int i = 0; i < _ndisp; ++i)
    dxyz(i) += disp1[i] - disp0[i];
  _current_length = dxyz.norm();

  for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
  {
    _e_over_l[_qp] = _youngs_modulus[_qp] / _origin_length;

    computeQpStrain();
    computeQpStress();
  }
}
예제 #7
0
void TensorMechanicsMaterial::computeStrain()
{
  for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
    computeQpStrain();
}