예제 #1
0
void
ComputeSmallStrain::computeProperties()
{
  Real volumetric_strain = 0.0;
  for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
  {
    //strain = (grad_disp + grad_disp^T)/2
    RankTwoTensor grad_tensor((*_grad_disp[0])[_qp], (*_grad_disp[1])[_qp], (*_grad_disp[2])[_qp]);

    _total_strain[_qp] = ( grad_tensor + grad_tensor.transpose() )/2.0;

    if (_volumetric_locking_correction)
      volumetric_strain +=  _total_strain[_qp].trace() * _JxW[_qp] * _coord[_qp];
  }

  if (_volumetric_locking_correction)
    volumetric_strain /= _current_elem_volume;

  for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
  {
    if (_volumetric_locking_correction)
    {
      Real trace = _total_strain[_qp].trace();
      _total_strain[_qp](0,0) += (volumetric_strain - trace) / 3.0;
      _total_strain[_qp](1,1) += (volumetric_strain - trace) / 3.0;
      _total_strain[_qp](2,2) += (volumetric_strain - trace) / 3.0;
    }

    _mechanical_strain[_qp] = _total_strain[_qp];

    //Remove the Eigen strain
    for (auto es : _eigenstrains)
      _mechanical_strain[_qp] -= (*es)[_qp];
  }
}
예제 #2
0
void
LinearElasticMaterial::computeQpStrain()
{
  //strain = (grad_disp + grad_disp^T)/2
  RankTwoTensor grad_tensor(_grad_disp_x[_qp], _grad_disp_y[_qp], _grad_disp_z[_qp]);

  _elastic_strain[_qp] = (grad_tensor + grad_tensor.transpose()) / 2.0;
  _total_strain[_qp] = _elastic_strain[_qp];
}
예제 #3
0
void
ComputeSmallStrain::computeQpProperties()
{
  //strain = (grad_disp + grad_disp^T)/2
  RankTwoTensor grad_tensor((*_grad_disp[0])[_qp], (*_grad_disp[1])[_qp], (*_grad_disp[2])[_qp]);

  _total_strain[_qp] = ( grad_tensor + grad_tensor.transpose() )/2.0;

  _mechanical_strain[_qp] = _total_strain[_qp];

  //Remove the Eigen strain
  _mechanical_strain[_qp] -= _stress_free_strain[_qp];
}
void
ComputeCrackTipEnrichmentSmallStrain::computeQpProperties()
{
  crackTipEnrichementFunctionAtPoint(_q_point[_qp], _B);
  unsigned int crack_front_point_index =
      crackTipEnrichementFunctionDerivativeAtPoint(_q_point[_qp], _dBx);

  for (unsigned int i = 0; i < 4; ++i)
    rotateFromCrackFrontCoordsToGlobal(_dBx[i], _dBX[i], crack_front_point_index);

  _sln = _nl->currentSolution();

  for (unsigned int m = 0; m < _ndisp; ++m)
  {
    _enrich_disp[m] = 0.0;
    _grad_enrich_disp[m].zero();
    for (unsigned int i = 0; i < _current_elem->n_nodes(); ++i)
    {
      Node * node_i = _current_elem->get_node(i);
      for (unsigned int j = 0; j < 4; ++j)
      {
        dof_id_type dof = node_i->dof_number(_nl->number(), _enrich_variable[j][m]->number(), 0);
        Real soln = (*_sln)(dof);
        _enrich_disp[m] += (*_fe_phi)[i][_qp] * (_B[j] - _BI[i][j]) * soln;
        RealVectorValue grad_B(_dBX[j]);
        _grad_enrich_disp[m] +=
            ((*_fe_dphi)[i][_qp] * (_B[j] - _BI[i][j]) + (*_fe_phi)[i][_qp] * grad_B) * soln;
      }
    }
  }

  RankTwoTensor grad_tensor_enrich(
      _grad_enrich_disp[0], _grad_enrich_disp[1], _grad_enrich_disp[2]);

  RankTwoTensor enrich_strain = (grad_tensor_enrich + grad_tensor_enrich.transpose()) / 2.0;

  RankTwoTensor grad_tensor((*_grad_disp[0])[_qp], (*_grad_disp[1])[_qp], (*_grad_disp[2])[_qp]);

  _total_strain[_qp] = (grad_tensor + grad_tensor.transpose()) / 2.0;

  _total_strain[_qp] += enrich_strain;

  _mechanical_strain[_qp] = _total_strain[_qp];

  // Remove the Eigen strain
  for (auto es : _eigenstrains)
    _mechanical_strain[_qp] -= (*es)[_qp];
}
예제 #5
0
void
ComputeSmallStrain::computeProperties()
{
  for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
  {
//    if (_ndisplacements < 3)
//      (*_grad_displacements[2])[_qp] = _zero;

    //strain = (grad_disp + grad_disp^T)/2
    RankTwoTensor grad_tensor((*_grad_disp[0])[_qp], (*_grad_disp[1])[_qp], (*_grad_disp[2])[_qp]);

    _total_strain[_qp] = ( grad_tensor + grad_tensor.transpose() )/2.0;

    _mechanical_strain[_qp] = _total_strain[_qp];

    //Remove thermal expansion
    _mechanical_strain[_qp].addIa(-_thermal_expansion_coeff*( _T[_qp] - _T0 ));

    //Remove the Eigen strain
    _mechanical_strain[_qp] -= _stress_free_strain[_qp];
  }
}