www.mooseframework.org
Public Member Functions | Protected Member Functions | Protected Attributes | List of all members
CosseratStressDivergenceTensors Class Reference

Computes grad_i(stress_{i component}) This is exactly the same as StressDivergenceTensors, only the Jacobian entries are correct for the Cosserat case. More...

#include <CosseratStressDivergenceTensors.h>

Inheritance diagram for CosseratStressDivergenceTensors:
[legend]

Public Member Functions

 CosseratStressDivergenceTensors (const InputParameters &parameters)
 
virtual void computeJacobian () override
 
virtual void computeOffDiagJacobian (MooseVariableFEBase &jvar) override
 

Protected Member Functions

virtual Real computeQpOffDiagJacobian (unsigned int jvar)
 
virtual void initialSetup () override
 
virtual void computeResidual () override
 
virtual Real computeQpResidual () override
 
virtual Real computeQpJacobian () override
 
virtual void computeFiniteDeformJacobian ()
 
virtual void computeAverageGradientTest ()
 
virtual void computeAverageGradientPhi ()
 

Protected Attributes

const unsigned int _nrots
 Number of Cosserat rotation variables supplied by user. More...
 
std::vector< unsigned int > _wc_var
 The MOOSE variable numbers of the Cosserat rotation variables. More...
 
std::string _base_name
 
bool _use_finite_deform_jacobian
 
const MaterialProperty< RankTwoTensor > & _stress
 
const MaterialProperty< RankFourTensor > & _Jacobian_mult
 
std::vector< RankFourTensor > _finite_deform_Jacobian_mult
 
const MaterialProperty< RankTwoTensor > * _deformation_gradient
 
const MaterialProperty< RankTwoTensor > * _deformation_gradient_old
 
const MaterialProperty< RankTwoTensor > * _rotation_increment
 
const unsigned int _component
 
unsigned int _ndisp
 Coupled displacement variables. More...
 
std::vector< unsigned int > _disp_var
 
const bool _temp_coupled
 
const unsigned int _temp_var
 
const MaterialProperty< RankTwoTensor > *const _deigenstrain_dT
 d(strain)/d(temperature), if computed by ComputeThermalExpansionEigenstrain More...
 
const bool _out_of_plane_strain_coupled
 
const unsigned int _out_of_plane_strain_var
 
const unsigned int _out_of_plane_direction
 
std::vector< std::vector< Real > > _avg_grad_test
 Gradient of test function averaged over the element. Used in volumetric locking correction calculation. More...
 
std::vector< std::vector< Real > > _avg_grad_phi
 Gradient of phi function averaged over the element. Used in volumetric locking correction calculation. More...
 
bool _volumetric_locking_correction
 Flag for volumetric locking correction. More...
 
Assembly & _assembly_undisplaced
 undisplaced problem More...
 
MooseVariable & _var_undisplaced
 Reference to this Kernel's undisplaced MooseVariable object. More...
 
const VariablePhiGradient & _grad_phi_undisplaced
 Shape and test functions on the undisplaced mesh. More...
 
const VariableTestGradient & _grad_test_undisplaced
 

Detailed Description

Computes grad_i(stress_{i component}) This is exactly the same as StressDivergenceTensors, only the Jacobian entries are correct for the Cosserat case.

Definition at line 26 of file CosseratStressDivergenceTensors.h.

Constructor & Destructor Documentation

◆ CosseratStressDivergenceTensors()

CosseratStressDivergenceTensors::CosseratStressDivergenceTensors ( const InputParameters &  parameters)

Definition at line 28 of file CosseratStressDivergenceTensors.C.

29  : StressDivergenceTensors(parameters),
30  _nrots(coupledComponents("Cosserat_rotations")),
32 {
33  for (unsigned i = 0; i < _nrots; ++i)
34  _wc_var[i] = coupled("Cosserat_rotations", i);
35 }
StressDivergenceTensors(const InputParameters &parameters)
const unsigned int _nrots
Number of Cosserat rotation variables supplied by user.
std::vector< unsigned int > _wc_var
The MOOSE variable numbers of the Cosserat rotation variables.

Member Function Documentation

◆ computeAverageGradientPhi()

void StressDivergenceTensors::computeAverageGradientPhi ( )
protectedvirtualinherited

Reimplemented in StressDivergenceRZTensors.

Definition at line 402 of file StressDivergenceTensors.C.

Referenced by StressDivergenceTensors::computeJacobian(), and StressDivergenceTensors::computeOffDiagJacobian().

403 {
404  // Calculate volume average derivatives for phi
405  _avg_grad_phi.resize(_phi.size());
406  for (_i = 0; _i < _phi.size(); ++_i)
407  {
408  _avg_grad_phi[_i].resize(3);
409  for (unsigned int component = 0; component < _mesh.dimension(); ++component)
410  {
411  _avg_grad_phi[_i][component] = 0.0;
412  for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
413  _avg_grad_phi[_i][component] += _grad_phi[_i][_qp](component) * _JxW[_qp] * _coord[_qp];
414 
415  _avg_grad_phi[_i][component] /= _current_elem_volume;
416  }
417  }
418 }
std::vector< std::vector< Real > > _avg_grad_phi
Gradient of phi function averaged over the element. Used in volumetric locking correction calculation...
Real component(const SymmTensor &symm_tensor, unsigned int index)

◆ computeAverageGradientTest()

void StressDivergenceTensors::computeAverageGradientTest ( )
protectedvirtualinherited

Reimplemented in StressDivergenceRZTensors.

Definition at line 386 of file StressDivergenceTensors.C.

Referenced by StressDivergenceTensors::computeJacobian(), StressDivergenceTensors::computeOffDiagJacobian(), and StressDivergenceTensors::computeResidual().

387 {
388  // Calculate volume averaged value of shape function derivative
389  _avg_grad_test.resize(_test.size());
390  for (_i = 0; _i < _test.size(); ++_i)
391  {
392  _avg_grad_test[_i].resize(3);
393  _avg_grad_test[_i][_component] = 0.0;
394  for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
395  _avg_grad_test[_i][_component] += _grad_test[_i][_qp](_component) * _JxW[_qp] * _coord[_qp];
396 
397  _avg_grad_test[_i][_component] /= _current_elem_volume;
398  }
399 }
std::vector< std::vector< Real > > _avg_grad_test
Gradient of test function averaged over the element. Used in volumetric locking correction calculatio...

◆ computeFiniteDeformJacobian()

void StressDivergenceTensors::computeFiniteDeformJacobian ( )
protectedvirtualinherited

Definition at line 329 of file StressDivergenceTensors.C.

Referenced by StressDivergenceTensors::computeJacobian(), and StressDivergenceTensors::computeOffDiagJacobian().

330 {
331  const RankTwoTensor I(RankTwoTensor::initIdentity);
332  const RankFourTensor II_ijkl = I.mixedProductIkJl(I);
333 
334  // Bring back to unrotated config
335  const RankTwoTensor unrotated_stress =
336  (*_rotation_increment)[_qp].transpose() * _stress[_qp] * (*_rotation_increment)[_qp];
337 
338  // Incremental deformation gradient Fhat
339  const RankTwoTensor Fhat =
340  (*_deformation_gradient)[_qp] * (*_deformation_gradient_old)[_qp].inverse();
341  const RankTwoTensor Fhatinv = Fhat.inverse();
342 
343  const RankTwoTensor rot_times_stress = (*_rotation_increment)[_qp] * unrotated_stress;
344  const RankFourTensor dstress_drot =
345  I.mixedProductIkJl(rot_times_stress) + I.mixedProductJkIl(rot_times_stress);
346  const RankFourTensor rot_rank_four =
347  (*_rotation_increment)[_qp].mixedProductIkJl((*_rotation_increment)[_qp]);
348  const RankFourTensor drot_dUhatinv = Fhat.mixedProductIkJl(I);
349 
350  const RankTwoTensor A = I - Fhatinv;
351 
352  // Ctilde = Chat^-1 - I
353  const RankTwoTensor Ctilde = A * A.transpose() - A - A.transpose();
354  const RankFourTensor dCtilde_dFhatinv =
355  -I.mixedProductIkJl(A) - I.mixedProductJkIl(A) + II_ijkl + I.mixedProductJkIl(I);
356 
357  // Second order approximation of Uhat - consistent with strain increment definition
358  // const RankTwoTensor Uhat = I - 0.5 * Ctilde - 3.0/8.0 * Ctilde * Ctilde;
359 
360  RankFourTensor dUhatinv_dCtilde =
361  0.5 * II_ijkl - 1.0 / 8.0 * (I.mixedProductIkJl(Ctilde) + Ctilde.mixedProductIkJl(I));
362  RankFourTensor drot_dFhatinv = drot_dUhatinv * dUhatinv_dCtilde * dCtilde_dFhatinv;
363 
364  drot_dFhatinv -= Fhat.mixedProductIkJl((*_rotation_increment)[_qp].transpose());
365  _finite_deform_Jacobian_mult[_qp] = dstress_drot * drot_dFhatinv;
366 
367  const RankFourTensor dstrain_increment_dCtilde =
368  -0.5 * II_ijkl + 0.25 * (I.mixedProductIkJl(Ctilde) + Ctilde.mixedProductIkJl(I));
370  rot_rank_four * _Jacobian_mult[_qp] * dstrain_increment_dCtilde * dCtilde_dFhatinv;
371  _finite_deform_Jacobian_mult[_qp] += Fhat.mixedProductJkIl(_stress[_qp]);
372 
373  const RankFourTensor dFhat_dFhatinv = -Fhat.mixedProductIkJl(Fhat.transpose());
374  const RankTwoTensor dJ_dFhatinv = dFhat_dFhatinv.innerProductTranspose(Fhat.ddet());
375 
376  // Component from Jacobian derivative
377  _finite_deform_Jacobian_mult[_qp] += _stress[_qp].outerProduct(dJ_dFhatinv);
378 
379  // Derivative of Fhatinv w.r.t. undisplaced coordinates
380  const RankTwoTensor Finv = (*_deformation_gradient)[_qp].inverse();
381  const RankFourTensor dFhatinv_dGradu = -Fhatinv.mixedProductIkJl(Finv.transpose());
382  _finite_deform_Jacobian_mult[_qp] = _finite_deform_Jacobian_mult[_qp] * dFhatinv_dGradu;
383 }
const MaterialProperty< RankTwoTensor > * _rotation_increment
std::vector< RankFourTensor > _finite_deform_Jacobian_mult
const MaterialProperty< RankFourTensor > & _Jacobian_mult
const MaterialProperty< RankTwoTensor > & _stress

◆ computeJacobian()

void StressDivergenceTensors::computeJacobian ( )
overridevirtualinherited

Reimplemented from ALEKernel.

Definition at line 154 of file StressDivergenceTensors.C.

155 {
157  {
160  }
161 
163  {
164  _finite_deform_Jacobian_mult.resize(_qrule->n_points());
165 
166  for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
168 
170  }
171  else
172  Kernel::computeJacobian();
173 }
bool _volumetric_locking_correction
Flag for volumetric locking correction.
std::vector< RankFourTensor > _finite_deform_Jacobian_mult
virtual void computeFiniteDeformJacobian()
virtual void computeJacobian() override
Definition: ALEKernel.C:35

◆ computeOffDiagJacobian()

void StressDivergenceTensors::computeOffDiagJacobian ( MooseVariableFEBase &  jvar)
overridevirtualinherited

Reimplemented from ALEKernel.

Definition at line 176 of file StressDivergenceTensors.C.

177 {
179  {
182  }
183 
185  {
186  _finite_deform_Jacobian_mult.resize(_qrule->n_points());
187 
188  for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
190 
192  }
193  else
194  Kernel::computeOffDiagJacobian(jvar);
195 }
bool _volumetric_locking_correction
Flag for volumetric locking correction.
virtual void computeOffDiagJacobian(MooseVariableFEBase &jvar) override
Definition: ALEKernel.C:42
std::vector< RankFourTensor > _finite_deform_Jacobian_mult
virtual void computeFiniteDeformJacobian()

◆ computeQpJacobian()

Real StressDivergenceTensors::computeQpJacobian ( )
overrideprotectedvirtualinherited

Reimplemented in StressDivergenceRSphericalTensors, StressDivergenceRZTensors, and DynamicStressDivergenceTensors.

Definition at line 198 of file StressDivergenceTensors.C.

Referenced by DynamicStressDivergenceTensors::computeQpJacobian().

199 {
202  _component,
203  _component,
204  _grad_test[_i][_qp],
205  _grad_phi_undisplaced[_j][_qp]);
206 
207  Real sum_C3x3 = _Jacobian_mult[_qp].sum3x3();
208  RealGradient sum_C3x1 = _Jacobian_mult[_qp].sum3x1();
209 
210  Real jacobian = 0.0;
211  // B^T_i * C * B_j
213  _Jacobian_mult[_qp], _component, _component, _grad_test[_i][_qp], _grad_phi[_j][_qp]);
214 
216  {
217  // jacobian = Bbar^T_i * C * Bbar_j where Bbar = B + Bvol
218  // jacobian = B^T_i * C * B_j + Bvol^T_i * C * Bvol_j + Bvol^T_i * C * B_j + B^T_i * C * Bvol_j
219 
220  // Bvol^T_i * C * Bvol_j
221  jacobian += sum_C3x3 * (_avg_grad_test[_i][_component] - _grad_test[_i][_qp](_component)) *
222  (_avg_grad_phi[_j][_component] - _grad_phi[_j][_qp](_component)) / 9.0;
223 
224  // B^T_i * C * Bvol_j
225  jacobian += sum_C3x1(_component) * _grad_test[_i][_qp](_component) *
226  (_avg_grad_phi[_j][_component] - _grad_phi[_j][_qp](_component)) / 3.0;
227 
228  // Bvol^T_i * C * B_j
229  RankTwoTensor phi;
230  if (_component == 0)
231  {
232  phi(0, 0) = _grad_phi[_j][_qp](0);
233  phi(0, 1) = phi(1, 0) = _grad_phi[_j][_qp](1);
234  phi(0, 2) = phi(2, 0) = _grad_phi[_j][_qp](2);
235  }
236  else if (_component == 1)
237  {
238  phi(1, 1) = _grad_phi[_j][_qp](1);
239  phi(0, 1) = phi(1, 0) = _grad_phi[_j][_qp](0);
240  phi(1, 2) = phi(2, 1) = _grad_phi[_j][_qp](2);
241  }
242  else if (_component == 2)
243  {
244  phi(2, 2) = _grad_phi[_j][_qp](2);
245  phi(0, 2) = phi(2, 0) = _grad_phi[_j][_qp](0);
246  phi(1, 2) = phi(2, 1) = _grad_phi[_j][_qp](1);
247  }
248 
249  jacobian += (_Jacobian_mult[_qp] * phi).trace() *
250  (_avg_grad_test[_i][_component] - _grad_test[_i][_qp](_component)) / 3.0;
251  }
252  return jacobian;
253 }
std::vector< std::vector< Real > > _avg_grad_phi
Gradient of phi function averaged over the element. Used in volumetric locking correction calculation...
bool _volumetric_locking_correction
Flag for volumetric locking correction.
std::vector< std::vector< Real > > _avg_grad_test
Gradient of test function averaged over the element. Used in volumetric locking correction calculatio...
Real elasticJacobian(const RankFourTensor &r4t, unsigned int i, unsigned int k, const RealGradient &grad_test, const RealGradient &grad_phi)
This is used for the standard kernel stress_ij*d(test)/dx_j, when varied wrt u_k Jacobian entry: d(st...
std::vector< RankFourTensor > _finite_deform_Jacobian_mult
const MaterialProperty< RankFourTensor > & _Jacobian_mult
const VariablePhiGradient & _grad_phi_undisplaced
Shape and test functions on the undisplaced mesh.
Definition: ALEKernel.h:39

◆ computeQpOffDiagJacobian()

Real CosseratStressDivergenceTensors::computeQpOffDiagJacobian ( unsigned int  jvar)
protectedvirtual

Reimplemented from StressDivergenceTensors.

Definition at line 38 of file CosseratStressDivergenceTensors.C.

39 {
40  for (unsigned int v = 0; v < _nrots; ++v)
41  if (jvar == _wc_var[v])
43  _Jacobian_mult[_qp], _component, v, _grad_test[_i][_qp], _phi[_j][_qp]);
44 
46 }
Real elasticJacobianWC(const RankFourTensor &r4t, unsigned int i, unsigned int k, const RealGradient &grad_test, Real phi)
This is used for the standard kernel stress_ij*d(test)/dx_j, when varied wrt w_k (the cosserat rotati...
virtual Real computeQpOffDiagJacobian(unsigned int jvar) override
const MaterialProperty< RankFourTensor > & _Jacobian_mult
const unsigned int _nrots
Number of Cosserat rotation variables supplied by user.
std::vector< unsigned int > _wc_var
The MOOSE variable numbers of the Cosserat rotation variables.

◆ computeQpResidual()

Real StressDivergenceTensors::computeQpResidual ( )
overrideprotectedvirtualinherited

Reimplemented in StressDivergenceRSphericalTensors, StressDivergenceRZTensors, and DynamicStressDivergenceTensors.

Definition at line 142 of file StressDivergenceTensors.C.

Referenced by StressDivergenceTensors::computeResidual().

143 {
144  Real residual = _stress[_qp].row(_component) * _grad_test[_i][_qp];
145  // volumetric locking correction
147  residual += _stress[_qp].trace() / 3.0 *
148  (_avg_grad_test[_i][_component] - _grad_test[_i][_qp](_component));
149 
150  return residual;
151 }
bool _volumetric_locking_correction
Flag for volumetric locking correction.
std::vector< std::vector< Real > > _avg_grad_test
Gradient of test function averaged over the element. Used in volumetric locking correction calculatio...
const MaterialProperty< RankTwoTensor > & _stress

◆ computeResidual()

void StressDivergenceTensors::computeResidual ( )
overrideprotectedvirtualinherited

Definition at line 117 of file StressDivergenceTensors.C.

118 {
119  DenseVector<Number> & re = _assembly.residualBlock(_var.number());
120  _local_re.resize(re.size());
121  _local_re.zero();
122 
125 
126  precalculateResidual();
127  for (_i = 0; _i < _test.size(); ++_i)
128  for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
129  _local_re(_i) += _JxW[_qp] * _coord[_qp] * computeQpResidual();
130 
131  re += _local_re;
132 
133  if (_has_save_in)
134  {
135  Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
136  for (const auto & var : _save_in)
137  var->sys().solution().add_vector(_local_re, var->dofIndices());
138  }
139 }
bool _volumetric_locking_correction
Flag for volumetric locking correction.
virtual Real computeQpResidual() override

◆ initialSetup()

void StressDivergenceTensors::initialSetup ( )
overrideprotectedvirtualinherited

Reimplemented in StressDivergenceRSphericalTensors, and StressDivergenceRZTensors.

Definition at line 109 of file StressDivergenceTensors.C.

110 {
111  if (getBlockCoordSystem() != Moose::COORD_XYZ)
112  mooseError(
113  "The coordinate system in the Problem block must be set to XYZ for cartesian geometries.");
114 }

Member Data Documentation

◆ _assembly_undisplaced

Assembly& ALEKernel::_assembly_undisplaced
protectedinherited

undisplaced problem

Definition at line 33 of file ALEKernel.h.

◆ _avg_grad_phi

std::vector<std::vector<Real> > StressDivergenceTensors::_avg_grad_phi
protectedinherited

◆ _avg_grad_test

std::vector<std::vector<Real> > StressDivergenceTensors::_avg_grad_test
protectedinherited

◆ _base_name

std::string StressDivergenceTensors::_base_name
protectedinherited

◆ _component

const unsigned int StressDivergenceTensors::_component
protectedinherited

◆ _deformation_gradient

const MaterialProperty<RankTwoTensor>* StressDivergenceTensors::_deformation_gradient
protectedinherited

◆ _deformation_gradient_old

const MaterialProperty<RankTwoTensor>* StressDivergenceTensors::_deformation_gradient_old
protectedinherited

◆ _deigenstrain_dT

const MaterialProperty<RankTwoTensor>* const StressDivergenceTensors::_deigenstrain_dT
protectedinherited

d(strain)/d(temperature), if computed by ComputeThermalExpansionEigenstrain

Definition at line 73 of file StressDivergenceTensors.h.

◆ _disp_var

std::vector<unsigned int> StressDivergenceTensors::_disp_var
protectedinherited

◆ _finite_deform_Jacobian_mult

std::vector<RankFourTensor> StressDivergenceTensors::_finite_deform_Jacobian_mult
protectedinherited

◆ _grad_phi_undisplaced

const VariablePhiGradient& ALEKernel::_grad_phi_undisplaced
protectedinherited

Shape and test functions on the undisplaced mesh.

Definition at line 39 of file ALEKernel.h.

Referenced by StressDivergenceTensors::computeQpJacobian(), and StressDivergenceTensors::computeQpOffDiagJacobian().

◆ _grad_test_undisplaced

const VariableTestGradient& ALEKernel::_grad_test_undisplaced
protectedinherited

Definition at line 40 of file ALEKernel.h.

◆ _Jacobian_mult

const MaterialProperty<RankFourTensor>& StressDivergenceTensors::_Jacobian_mult
protectedinherited

◆ _ndisp

unsigned int StressDivergenceTensors::_ndisp
protectedinherited

◆ _nrots

const unsigned int CosseratStressDivergenceTensors::_nrots
protected

Number of Cosserat rotation variables supplied by user.

Definition at line 35 of file CosseratStressDivergenceTensors.h.

Referenced by computeQpOffDiagJacobian(), and CosseratStressDivergenceTensors().

◆ _out_of_plane_direction

const unsigned int StressDivergenceTensors::_out_of_plane_direction
protectedinherited

◆ _out_of_plane_strain_coupled

const bool StressDivergenceTensors::_out_of_plane_strain_coupled
protectedinherited

◆ _out_of_plane_strain_var

const unsigned int StressDivergenceTensors::_out_of_plane_strain_var
protectedinherited

◆ _rotation_increment

const MaterialProperty<RankTwoTensor>* StressDivergenceTensors::_rotation_increment
protectedinherited

◆ _stress

const MaterialProperty<RankTwoTensor>& StressDivergenceTensors::_stress
protectedinherited

◆ _temp_coupled

const bool StressDivergenceTensors::_temp_coupled
protectedinherited

◆ _temp_var

const unsigned int StressDivergenceTensors::_temp_var
protectedinherited

◆ _use_finite_deform_jacobian

bool StressDivergenceTensors::_use_finite_deform_jacobian
protectedinherited

◆ _var_undisplaced

MooseVariable& ALEKernel::_var_undisplaced
protectedinherited

Reference to this Kernel's undisplaced MooseVariable object.

Definition at line 36 of file ALEKernel.h.

◆ _volumetric_locking_correction

bool StressDivergenceTensors::_volumetric_locking_correction
protectedinherited

◆ _wc_var

std::vector<unsigned int> CosseratStressDivergenceTensors::_wc_var
protected

The MOOSE variable numbers of the Cosserat rotation variables.

Definition at line 38 of file CosseratStressDivergenceTensors.h.

Referenced by computeQpOffDiagJacobian(), and CosseratStressDivergenceTensors().


The documentation for this class was generated from the following files: