GEOS
PoromechanicsBase.hpp
Go to the documentation of this file.
1 /*
2  * ------------------------------------------------------------------------------------------------------------
3  * SPDX-License-Identifier: LGPL-2.1-only
4  *
5  * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC
6  * Copyright (c) 2018-2024 TotalEnergies
7  * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University
8  * Copyright (c) 2023-2024 Chevron
9  * Copyright (c) 2019- GEOS/GEOSX Contributors
10  * All rights reserved
11  *
12  * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details.
13  * ------------------------------------------------------------------------------------------------------------
14  */
15 
20 #ifndef GEOS_PHYSICSSOLVERS_MULTIPHYSICS_POROMECHANICSKERNELS_POROMECHANICSBASE_HPP_
21 #define GEOS_PHYSICSSOLVERS_MULTIPHYSICS_POROMECHANICSKERNELS_POROMECHANICSBASE_HPP_
22 
23 #include "finiteElement/BilinearFormUtilities.hpp"
24 #include "finiteElement/LinearFormUtilities.hpp"
27 
28 namespace geos
29 {
30 
31 namespace poromechanicsKernels
32 {
33 
49 template< typename SUBREGION_TYPE,
50  typename CONSTITUTIVE_TYPE,
51  typename FE_TYPE >
53  public finiteElement::ImplicitKernelBase< SUBREGION_TYPE,
54  CONSTITUTIVE_TYPE,
55  FE_TYPE,
56  3,
57  3 >
58 {
59 public:
60 
62  using Base = finiteElement::ImplicitKernelBase< SUBREGION_TYPE,
63  CONSTITUTIVE_TYPE,
64  FE_TYPE,
65  3,
66  3 >;
67 
74  using Base::m_dofNumber;
78  using Base::m_meshData;
79 
85  PoromechanicsBase( NodeManager const & nodeManager,
86  EdgeManager const & edgeManager,
87  FaceManager const & faceManager,
88  localIndex const targetRegionIndex,
89  SUBREGION_TYPE const & elementSubRegion,
90  FE_TYPE const & finiteElementSpace,
91  CONSTITUTIVE_TYPE & inputConstitutiveType,
92  arrayView1d< globalIndex const > const inputDispDofNumber,
93  globalIndex const rankOffset,
95  arrayView1d< real64 > const inputRhs,
96  real64 const inputDt,
97  real64 const (&gravityVector)[3],
98  string const inputFlowDofKey,
99  string const fluidModelKey ):
100  Base( nodeManager,
101  edgeManager,
102  faceManager,
103  targetRegionIndex,
104  elementSubRegion,
105  finiteElementSpace,
106  inputConstitutiveType,
107  inputDispDofNumber,
108  rankOffset,
109  inputMatrix,
110  inputRhs,
111  inputDt ),
112  m_X( nodeManager.referencePosition() ),
113  m_disp( nodeManager.getField< fields::solidMechanics::totalDisplacement >() ),
114  m_uhat( nodeManager.getField< fields::solidMechanics::incrementalDisplacement >() ),
115  m_gravityVector{ gravityVector[0], gravityVector[1], gravityVector[2] },
116  m_gravityAcceleration( LvArray::tensorOps::l2Norm< 3 >( gravityVector ) ),
117  m_solidDensity( inputConstitutiveType.getDensity() ),
118  m_flowDofNumber( elementSubRegion.template getReference< array1d< globalIndex > >( inputFlowDofKey ) ),
119  m_pressure_n( elementSubRegion.template getField< fields::flow::pressure_n >() ),
120  m_pressure( elementSubRegion.template getField< fields::flow::pressure >() )
121  {
122  GEOS_UNUSED_VAR( fluidModelKey );
123  }
124 
125  //*****************************************************************************
134  {
135 public:
136 
137  static constexpr int numDispDofPerElem = Base::StackVariables::maxNumRows;
138 
142  Base::StackVariables(),
143  xLocal(),
144  u_local(),
145  uhat_local(),
146  localResidualMomentum( Base::StackVariables::localResidual ),
149  localPressureDofIndex{ 0 }
150  {}
151 
152 #if !defined(CALC_FEM_SHAPE_IN_KERNEL)
154  int xLocal;
155 #else
157  real64 xLocal[numNodesPerElem][3];
158 #endif
159 
160  // Storage for displacements
161 
166 
167 
168  // Storage for helper variables used in the quadrature point kernel
169 
171  real64 strainIncrement[6]{};
172 
174  real64 totalStress[6]{};
176  typename CONSTITUTIVE_TYPE::KernelWrapper::DiscretizationOps stiffness;
178  real64 dTotalStress_dPressure[6]{};
180  real64 dTotalStress_dTemperature[6]{};
181 
183  real64 bodyForce[3]{};
185  real64 dBodyForce_dVolStrainIncrement[3]{};
187  real64 dBodyForce_dPressure[3]{};
188 
190  real64 temperature{}; // for stress computation
192  real64 deltaTemperatureFromLastStep{}; // for porosity update
193 
194  // Storage for residual and degrees of freedom
195 
197  real64 ( &localResidualMomentum )[numDispDofPerElem];
199  real64 ( &dLocalResidualMomentum_dDisplacement )[numDispDofPerElem][numDispDofPerElem];
201  real64 dLocalResidualMomentum_dPressure[numDispDofPerElem][1]{};
202 
204  globalIndex localPressureDofIndex{};
205 
206  };
207  //*****************************************************************************
208 
219  void setup( localIndex const k,
220  StackVariables & stack ) const
221  {
222  integer constexpr numDims = 3;
223 
224  m_finiteElementSpace.template setup< FE_TYPE >( k, m_meshData, stack.feStack );
225  localIndex const numSupportPoints =
226  m_finiteElementSpace.template numSupportPoints< FE_TYPE >( stack.feStack );
227 
228  for( localIndex a=0; a<numSupportPoints; ++a )
229  {
230  localIndex const localNodeIndex = m_elemsToNodes( k, a );
231 
232  for( integer i = 0; i < numDims; ++i )
233  {
234 #if defined(CALC_FEM_SHAPE_IN_KERNEL)
235  stack.xLocal[a][i] = m_X[localNodeIndex][i];
236 #endif
237  stack.u_local[a][i] = m_disp[localNodeIndex][i];
238  stack.uhat_local[a][i] = m_uhat[localNodeIndex][i];
239  stack.localRowDofIndex[a*numDims+i] = m_dofNumber[localNodeIndex]+i;
240  stack.localColDofIndex[a*numDims+i] = m_dofNumber[localNodeIndex]+i;
241  }
242  }
243 
244  stack.localPressureDofIndex = m_flowDofNumber[k];
245 
246  // Add stabilization to block diagonal parts of the local dResidualMomentum_dDisplacement (this
247  // is a no-operation with FEM classes)
248  real64 const stabilizationScaling = computeStabilizationScaling( k );
249  m_finiteElementSpace.template addGradGradStabilizationMatrix
250  < FE_TYPE, numDofPerTrialSupportPoint, false >( stack.feStack,
252  -stabilizationScaling );
253  m_finiteElementSpace.template
254  addEvaluatedGradGradStabilizationVector< FE_TYPE,
255  numDofPerTrialSupportPoint >
256  ( stack.feStack,
257  stack.uhat_local,
258  reinterpret_cast< real64 (&)[numNodesPerElem][numDofPerTestSupportPoint] >(stack.localResidualMomentum),
259  -stabilizationScaling );
260  }
261 
271  {
272  // TODO: generalize this to other constitutive models (currently we assume linear elasticity).
273  return 2.0 * m_constitutiveUpdate.getShearModulus( k );
274  }
275 
276 protected:
277 
280 
283 
286 
288  real64 const m_gravityVector[3]{};
291 
294 
297 
302 
303 };
304 
305 
306 } // namespace poromechanicsKernels
307 
308 } // namespace geos
309 
310 #endif // GEOS_PHYSICSSOLVERS_MULTIPHYSICS_POROMECHANICSKERNELS_POROMECHANICSBASE_HPP_
#define GEOS_HOST_DEVICE
Marks a host-device function.
Definition: GeosxMacros.hpp:49
#define GEOS_UNUSED_VAR(...)
Mark an unused variable and silence compiler warnings.
Definition: GeosxMacros.hpp:84
#define GEOS_FORCE_INLINE
Marks a function or lambda for inlining.
Definition: GeosxMacros.hpp:51
This class provides an interface to ObjectManagerBase in order to manage edge data.
Definition: EdgeManager.hpp:43
The FaceManager class provides an interface to ObjectManagerBase in order to manage face data.
Definition: FaceManager.hpp:44
The NodeManager class provides an interface to ObjectManagerBase in order to manage node data.
Definition: NodeManager.hpp:46
Define the base interface for implicit finite element kernels.
traits::ViewTypeConst< typename SUBREGION_TYPE::NodeMapType::base_type > const m_elemsToNodes
The element to nodes map.
Definition: KernelBase.hpp:257
FE_TYPE::template MeshData< SUBREGION_TYPE > m_meshData
Data structure containing mesh data used to setup the finite element.
arrayView1d< globalIndex const > const m_dofNumber
The global degree of freedom number.
CONSTITUTIVE_TYPE::KernelWrapper const m_constitutiveUpdate
Definition: KernelBase.hpp:264
Defines the kernel structure for solving quasi-static poromechanics.
arrayView1d< real64 const > const m_pressure
The rank-global fluid pressure.
arrayView2d< real64 const > m_solidDensity
The rank global density.
GEOS_HOST_DEVICE GEOS_FORCE_INLINE void setup(localIndex const k, StackVariables &stack) const
Copy global values from primary field to a local stack array.
arrayView2d< real64 const, nodes::REFERENCE_POSITION_USD > const m_X
The array containing the nodal position array.
arrayView2d< real64 const, nodes::INCR_DISPLACEMENT_USD > const m_uhat
The rank-global incremental displacement array.
real64 const m_gravityVector[3]
The gravity vector.
arrayView2d< real64 const, nodes::TOTAL_DISPLACEMENT_USD > const m_disp
The rank-global displacement array.
GEOS_HOST_DEVICE GEOS_FORCE_INLINE real64 computeStabilizationScaling(localIndex const k) const
Get a parameter representative of the stiffness, used as physical scaling for the stabilization matri...
arrayView1d< globalIndex const > const m_flowDofNumber
The global degree of freedom number.
real64 const m_gravityAcceleration
The L2-norm of the gravity vector.
arrayView1d< real64 const > const m_pressure_n
The rank-global fluid pressure at the previous converged time step.
PoromechanicsBase(NodeManager const &nodeManager, EdgeManager const &edgeManager, FaceManager const &faceManager, localIndex const targetRegionIndex, SUBREGION_TYPE const &elementSubRegion, FE_TYPE const &finiteElementSpace, CONSTITUTIVE_TYPE &inputConstitutiveType, arrayView1d< globalIndex const > const inputDispDofNumber, globalIndex const rankOffset, CRSMatrixView< real64, globalIndex const > const inputMatrix, arrayView1d< real64 > const inputRhs, real64 const inputDt, real64 const (&gravityVector)[3], string const inputFlowDofKey, string const fluidModelKey)
Constructor.
ArrayView< T, 1 > arrayView1d
Alias for 1D array view.
Definition: DataTypes.hpp:180
LvArray::CRSMatrixView< T, COL_INDEX, localIndex const, LvArray::ChaiBuffer > CRSMatrixView
Alias for CRS Matrix View.
Definition: DataTypes.hpp:310
GEOS_GLOBALINDEX_TYPE globalIndex
Global index type (for indexing objects across MPI partitions).
Definition: DataTypes.hpp:88
double real64
64-bit floating point type.
Definition: DataTypes.hpp:99
GEOS_LOCALINDEX_TYPE localIndex
Local index type (for indexing objects within an MPI partition).
Definition: DataTypes.hpp:85
std::int32_t integer
Signed integer type.
Definition: DataTypes.hpp:82
ArrayView< T, 2, USD > arrayView2d
Alias for 2D array view.
Definition: DataTypes.hpp:196
Array< T, 1 > array1d
Alias for 1D array.
Definition: DataTypes.hpp:176
Kernel variables allocated on the stack.
Definition: KernelBase.hpp:137
real64(& dLocalResidualMomentum_dDisplacement)[numDispDofPerElem][numDispDofPerElem]
Derivative of linear momentum balance residual wrt displacement.
globalIndex localPressureDofIndex
C-array storage for the element local row degrees of freedom.
CONSTITUTIVE_TYPE::KernelWrapper::DiscretizationOps stiffness
Derivative of total stress wrt displacement.
real64 uhat_local[numNodesPerElem][numDofPerTrialSupportPoint]
Stack storage for the element local nodal incremental displacement.
real64 u_local[numNodesPerElem][numDofPerTrialSupportPoint]
Stack storage for the element local nodal displacement.
real64 dLocalResidualMomentum_dPressure[numDispDofPerElem][1]
Derivative of linear momentum balance residual wrt pressure.
real64(& localResidualMomentum)[numDispDofPerElem]
Linear momentum balance residual.