20 #ifndef GEOS_PHYSICSSOLVERS_SOLIDMECHANICS_KERNELS_EXPLICITFINITESTRAIN_IMPL_HPP_
21 #define GEOS_PHYSICSSOLVERS_SOLIDMECHANICS_KERNELS_EXPLICITFINITESTRAIN_IMPL_HPP_
23 #include "constitutive/solid/SolidUtilities.hpp"
25 #include "ExplicitSmallStrain_impl.hpp"
26 #include "finiteElement/Kinematics.h"
31 namespace solidMechanicsLagrangianFEMKernels
34 template<
typename SUBREGION_TYPE,
35 typename CONSTITUTIVE_TYPE,
41 SUBREGION_TYPE
const & elementSubRegion,
42 FE_TYPE
const & finiteElementSpace,
43 CONSTITUTIVE_TYPE & inputConstitutiveType,
45 string const elementListName ):
52 inputConstitutiveType,
57 template<
typename SUBREGION_TYPE,
58 typename CONSTITUTIVE_TYPE,
67 localIndex const nodeIndex = m_elemsToNodes( k, a );
68 for(
int i=0; i<numDofPerTrialSupportPoint; ++i )
70 stack.
xLocal[ a ][ i ] = m_X[ nodeIndex ][ i ];
71 stack.
uLocal[ a ][ i ] = m_u[ nodeIndex ][ i ];
72 stack.
varLocal[ a ][ i ] = m_vel[ nodeIndex ][ i ];
77 template<
typename SUBREGION_TYPE,
78 typename CONSTITUTIVE_TYPE,
86 real64 dNdX[ numNodesPerElem ][ 3 ];
87 real64 const detJ = FE_TYPE::calcGradN( q, stack.
xLocal, dNdX );
89 real64 dUhatdX[3][3] = { {0} };
90 real64 dUdX[3][3] = { {0} };
92 real64 Ldt[3][3] = { {0} };
93 real64 fInv[3][3] = { {0} };
95 finiteElement::feOps::gradient( dNdX, stack.
varLocal, dUhatdX );
96 finiteElement::feOps::gradient( dNdX, stack.
uLocal, dUdX );
98 LvArray::tensorOps::scale< 3, 3 >( dUhatdX, m_dt );
101 LvArray::tensorOps::scaledCopy< 3, 3 >( F, dUhatdX, 0.5 );
102 LvArray::tensorOps::add< 3, 3 >( F, dUdX );
103 LvArray::tensorOps::addIdentity< 3 >( F, 1.0 );
104 LvArray::tensorOps::invert< 3 >( fInv, F );
107 LvArray::tensorOps::Rij_eq_AikBkj< 3, 3, 3 >( Ldt, dUhatdX, fInv );
110 LvArray::tensorOps::copy< 3, 3 >( F, dUhatdX );
111 LvArray::tensorOps::add< 3, 3 >( F, dUdX );
112 LvArray::tensorOps::addIdentity< 3 >( F, 1.0 );
113 real64 const detF = LvArray::tensorOps::invert< 3 >( fInv, F );
117 HughesWinget( Rot, Dadt, Ldt );
120 constitutive::SolidUtilities::
121 hypoUpdate_StressOnly( m_constitutiveUpdate,
122 k, q, m_dt, Dadt, Rot, stress );
125 LvArray::tensorOps::Rij_eq_symAikBjk< 3 >( P, stress, fInv );
126 LvArray::tensorOps::scale< 3, 3 >( P, -detJ * detF );
128 finiteElement::feOps::plusGradNajAij( dNdX, P, stack.
fLocal );
132 template<
typename SUBREGION_TYPE,
133 typename CONSTITUTIVE_TYPE,
135 template<
typename POLICY,
136 typename KERNEL_TYPE >
139 KERNEL_TYPE
const & kernelComponent )
141 return Base::template kernelLaunch< POLICY, KERNEL_TYPE >( numElems, kernelComponent );
#define GEOS_HOST_DEVICE
Marks a host-device function.
This class provides an interface to ObjectManagerBase in order to manage edge data.
The FaceManager class provides an interface to ObjectManagerBase in order to manage face data.
The NodeManager class provides an interface to ObjectManagerBase in order to manage node data.
GEOS_HOST_DEVICE void quadraturePointKernel(localIndex const k, localIndex const q, StackVariables &stack) const
Performs a state update at a quadrature point.
ExplicitFiniteStrain(NodeManager &nodeManager, EdgeManager const &edgeManager, FaceManager const &faceManager, localIndex const targetRegionIndex, SUBREGION_TYPE const &elementSubRegion, FE_TYPE const &finiteElementSpace, CONSTITUTIVE_TYPE &inputConstitutiveType, real64 const dt, string const elementListName)
Constructor.
GEOS_HOST_DEVICE void setup(localIndex const k, StackVariables &stack) const
Performs the setup phase for the kernel.
static real64 kernelLaunch(localIndex const numElems, KERNEL_TYPE const &kernelComponent)
Kernel Launcher.
Implements kernels for solving the equations of motion using the explicit Newmark method under the sm...
double real64
64-bit floating point type.
GEOS_LOCALINDEX_TYPE localIndex
Local index type (for indexing objects within an MPI partition).
Kernel variables allocated on the stack.
real64 uLocal[numNodesPerElem][numDofPerTrialSupportPoint]
Local stack storage for nodal displacements.
real64 varLocal[numNodesPerElem][numDofPerTestSupportPoint]
C-array stack storage for element local primary variable values.
real64 fLocal[numNodesPerElem][numDofPerTrialSupportPoint]
C-array stack storage for the element local force.
real64 xLocal[numNodesPerElem][3]
C-array stack storage for element local the nodal positions.