19 #ifndef GEOS_PHYSICSSOLVERS_SOLIDMECHANICS_KERNELS_EXPLICITFINITESTRAIN_IMPL_HPP_
20 #define GEOS_PHYSICSSOLVERS_SOLIDMECHANICS_KERNELS_EXPLICITFINITESTRAIN_IMPL_HPP_
22 #include "constitutive/solid/SolidUtilities.hpp"
24 #include "ExplicitSmallStrain_impl.hpp"
25 #include "finiteElement/Kinematics.h"
30 namespace solidMechanicsLagrangianFEMKernels
33 template<
typename SUBREGION_TYPE,
34 typename CONSTITUTIVE_TYPE,
40 SUBREGION_TYPE
const & elementSubRegion,
41 FE_TYPE
const & finiteElementSpace,
42 CONSTITUTIVE_TYPE & inputConstitutiveType,
44 string const elementListName ):
51 inputConstitutiveType,
56 template<
typename SUBREGION_TYPE,
57 typename CONSTITUTIVE_TYPE,
66 localIndex const nodeIndex = m_elemsToNodes( k, a );
67 for(
int i=0; i<numDofPerTrialSupportPoint; ++i )
69 #if defined(CALC_FEM_SHAPE_IN_KERNEL)
70 stack.
xLocal[ a ][ i ] = m_X[ nodeIndex ][ i ];
72 stack.
uLocal[ a ][ i ] = m_u[ nodeIndex ][ i ];
73 stack.
varLocal[ a ][ i ] = m_vel[ nodeIndex ][ i ];
78 template<
typename SUBREGION_TYPE,
79 typename CONSTITUTIVE_TYPE,
87 real64 dNdX[ numNodesPerElem ][ 3 ];
88 real64 const detJ = m_finiteElementSpace.template getGradN< FE_TYPE >( k, q, stack.
xLocal, dNdX );
90 real64 dUhatdX[3][3] = { {0} };
91 real64 dUdX[3][3] = { {0} };
93 real64 Ldt[3][3] = { {0} };
94 real64 fInv[3][3] = { {0} };
96 FE_TYPE::gradient( dNdX, stack.
varLocal, dUhatdX );
97 FE_TYPE::gradient( dNdX, stack.
uLocal, dUdX );
99 LvArray::tensorOps::scale< 3, 3 >( dUhatdX, m_dt );
102 LvArray::tensorOps::scaledCopy< 3, 3 >( F, dUhatdX, 0.5 );
103 LvArray::tensorOps::add< 3, 3 >( F, dUdX );
104 LvArray::tensorOps::addIdentity< 3 >( F, 1.0 );
105 LvArray::tensorOps::invert< 3 >( fInv, F );
108 LvArray::tensorOps::Rij_eq_AikBkj< 3, 3, 3 >( Ldt, dUhatdX, fInv );
111 LvArray::tensorOps::copy< 3, 3 >( F, dUhatdX );
112 LvArray::tensorOps::add< 3, 3 >( F, dUdX );
113 LvArray::tensorOps::addIdentity< 3 >( F, 1.0 );
114 real64 const detF = LvArray::tensorOps::invert< 3 >( fInv, F );
118 HughesWinget( Rot, Dadt, Ldt );
121 constitutive::SolidUtilities::
122 hypoUpdate_StressOnly( m_constitutiveUpdate,
123 k, q, m_dt, Dadt, Rot, stress );
126 LvArray::tensorOps::Rij_eq_symAikBjk< 3 >( P, stress, fInv );
127 LvArray::tensorOps::scale< 3, 3 >( P, -detJ * detF );
129 FE_TYPE::plusGradNajAij( dNdX, P, stack.
fLocal );
133 template<
typename SUBREGION_TYPE,
134 typename CONSTITUTIVE_TYPE,
136 template<
typename POLICY,
137 typename KERNEL_TYPE >
140 KERNEL_TYPE
const & kernelComponent )
142 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.
GEOSX_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.