GEOS
SolidMechanicsLagrangianFEM.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_SOLIDMECHANICS_SOLIDMECHANICSLAGRANGIANFEM_HPP_
21 #define GEOS_PHYSICSSOLVERS_SOLIDMECHANICS_SOLIDMECHANICSLAGRANGIANFEM_HPP_
22 
24 #include "common/TimingMacros.hpp"
26 #include "kernels/StrainHelper.hpp"
27 #include "mesh/mpiCommunications/CommunicationTools.hpp"
28 #include "mesh/mpiCommunications/MPI_iCommData.hpp"
30 
32 
33 namespace geos
34 {
35 
42 {
43 public:
44 
46  static string coupledSolverAttributePrefix() { return "solid"; }
47 
54  {
55  QuasiStatic,
58  };
59 
65  SolidMechanicsLagrangianFEM( const string & name,
66  Group * const parent );
67 
71  static string catalogName() { return "SolidMechanicsLagrangianFEM"; }
75  string getCatalogName() const override { return catalogName(); }
76 
77  virtual void initializePreSubGroups() override;
78 
79  virtual void registerDataOnMesh( Group & meshBodies ) override;
80 
87  virtual
88  real64 solverStep( real64 const & time_n,
89  real64 const & dt,
90  integer const cycleNumber,
91  DomainPartition & domain ) override;
92 
93  virtual
94  real64 explicitStep( real64 const & time_n,
95  real64 const & dt,
96  integer const cycleNumber,
97  DomainPartition & domain ) override;
98 
99  virtual void
100  implicitStepSetup( real64 const & time_n,
101  real64 const & dt,
102  DomainPartition & domain ) override;
103 
104  virtual void
105  setupDofs( DomainPartition const & domain,
106  DofManager & dofManager ) const override;
107 
108  virtual void
110  DofManager & dofManager,
111  CRSMatrix< real64, globalIndex > & localMatrix,
112  ParallelVector & rhs,
113  ParallelVector & solution,
114  bool const setSparsity = false ) override;
115 
116  virtual std::unique_ptr< PreconditionerBase< LAInterface > >
117  createPreconditioner( DomainPartition & domain ) const override;
118 
119  virtual void
120  assembleSystem( real64 const time,
121  real64 const dt,
122  DomainPartition & domain,
123  DofManager const & dofManager,
124  CRSMatrixView< real64, globalIndex const > const & localMatrix,
125  arrayView1d< real64 > const & localRhs ) override;
126 
127  virtual void solveLinearSystem( DofManager const & dofManager,
128  ParallelMatrix & matrix,
129  ParallelVector & rhs,
130  ParallelVector & solution ) override;
131 
132  virtual void
133  applySystemSolution( DofManager const & dofManager,
134  arrayView1d< real64 const > const & localSolution,
135  real64 const scalingFactor,
136  real64 const dt,
137  DomainPartition & domain ) override;
138 
139  virtual void updateState( DomainPartition & domain ) override
140  {
141  // There should be nothing to update
142  GEOS_UNUSED_VAR( domain );
143  };
144 
145  virtual void applyBoundaryConditions( real64 const time,
146  real64 const dt,
147  DomainPartition & domain,
148  DofManager const & dofManager,
149  CRSMatrixView< real64, globalIndex const > const & localMatrix,
150  arrayView1d< real64 > const & localRhs ) override;
151 
152  virtual real64
153  calculateResidualNorm( real64 const & time_n,
154  real64 const & dt,
155  DomainPartition const & domain,
156  DofManager const & dofManager,
157  arrayView1d< real64 const > const & localRhs ) override;
158 
159  virtual void resetStateToBeginningOfStep( DomainPartition & domain ) override;
160 
161  virtual void implicitStepComplete( real64 const & time,
162  real64 const & dt,
163  DomainPartition & domain ) override;
164 
168  template< typename TYPE_LIST,
169  typename KERNEL_WRAPPER,
170  typename ... PARAMS >
171  real64 assemblyLaunch( MeshLevel & mesh,
172  DofManager const & dofManager,
173  string_array const & regionNames,
174  string const & materialNamesString,
175  CRSMatrixView< real64, globalIndex const > const & localMatrix,
176  arrayView1d< real64 > const & localRhs,
177  real64 const dt,
178  PARAMS && ... params );
179 
180  real64 explicitKernelDispatch( MeshLevel & mesh,
181  string_array const & targetRegions,
182  string const & finiteElementName,
183  real64 const dt,
184  std::string const & elementListName );
185 
196  DofManager const & dofManager,
197  DomainPartition & domain,
198  CRSMatrixView< real64, globalIndex const > const & localMatrix,
199  arrayView1d< real64 > const & localRhs );
200 
201  void applyTractionBC( real64 const time,
202  DofManager const & dofManager,
203  DomainPartition & domain,
204  arrayView1d< real64 > const & localRhs );
205 
206  void applyChomboPressure( DofManager const & dofManager,
207  DomainPartition & domain,
208  arrayView1d< real64 > const & localRhs );
209 
210 
211  void applyContactConstraint( DofManager const & dofManager,
212  DomainPartition & domain,
213  CRSMatrixView< real64, globalIndex const > const & localMatrix,
214  arrayView1d< real64 > const & localRhs );
215 
216  virtual real64
218  DofManager const & dofManager,
219  arrayView1d< real64 const > const & localSolution ) override;
220 
221  void enableFixedStressPoromechanicsUpdate();
222 
223  virtual void saveSequentialIterationState( DomainPartition & domain ) override;
224 
226  {
227  static constexpr char const * newmarkGammaString() { return "newmarkGamma"; }
228  static constexpr char const * newmarkBetaString() { return "newmarkBeta"; }
229  static constexpr char const * massDampingString() { return "massDamping"; }
230  static constexpr char const * stiffnessDampingString() { return "stiffnessDamping"; }
231  static constexpr char const * timeIntegrationOptionString() { return "timeIntegrationOption"; }
232  static constexpr char const * maxNumResolvesString() { return "maxNumResolves"; }
233  static constexpr char const * strainTheoryString() { return "strainTheory"; }
234  static constexpr char const * solidMaterialNamesString() { return "solidMaterialNames"; }
235  static constexpr char const * contactRelationNameString() { return "contactRelationName"; }
236  static constexpr char const * noContactRelationNameString() { return "NOCONTACT"; }
237  static constexpr char const * maxForceString() { return "maxForce"; }
238  static constexpr char const * elemsAttachedToSendOrReceiveNodesString() { return "elemsAttachedToSendOrReceiveNodes"; }
239  static constexpr char const * elemsNotAttachedToSendOrReceiveNodesString() { return "elemsNotAttachedToSendOrReceiveNodes"; }
240  static constexpr char const * surfaceGeneratorNameString() { return "surfaceGeneratorName"; }
241 
242  static constexpr char const * sendOrReceiveNodesString() { return "sendOrReceiveNodes";}
243  static constexpr char const * nonSendOrReceiveNodesString() { return "nonSendOrReceiveNodes";}
244  static constexpr char const * targetNodesString() { return "targetNodes";}
245  static constexpr char const * forceString() { return "Force";}
246 
247  static constexpr char const * contactPenaltyStiffnessString() { return "contactPenaltyStiffness"; }
248 
249  };
250 
251  SortedArray< localIndex > & getElemsAttachedToSendOrReceiveNodes( ElementSubRegionBase & subRegion )
252  {
253  return subRegion.getReference< SortedArray< localIndex > >( viewKeyStruct::elemsAttachedToSendOrReceiveNodesString() );
254  }
255 
256  SortedArray< localIndex > & getElemsNotAttachedToSendOrReceiveNodes( ElementSubRegionBase & subRegion )
257  {
258  return subRegion.getReference< SortedArray< localIndex > >( viewKeyStruct::elemsNotAttachedToSendOrReceiveNodesString() );
259  }
260 
261  real64 & getMaxForce() { return m_maxForce; }
262  real64 const & getMaxForce() const { return m_maxForce; }
263 
264  void computeRigidBodyModes( DomainPartition & domain ) const;
265 
266  arrayView1d< ParallelVector > const & getRigidBodyModes( DomainPartition & domain ) const
267  {
268  computeRigidBodyModes( domain );
269  return m_rigidBodyModes;
270  }
271 
272  /*
273  * @brief Utility function to set the stress initialization flag
274  * @param[in] performStressInitialization true if the solver has to initialize stress, false otherwise
275  */
276  void setStressInitialization( bool const performStressInitialization )
277  {
278  m_performStressInitialization = performStressInitialization;
279  }
280 
281  TimeIntegrationOption timeIntegrationOption() const { return m_timeIntegrationOption; }
282 
283 protected:
284  virtual void postInputInitialization() override;
285 
287 
288  virtual void setConstitutiveNamesCallSuper( ElementSubRegionBase & subRegion ) const override;
289 
290  real64 m_newmarkGamma;
291  real64 m_newmarkBeta;
292  real64 m_massDamping;
293  real64 m_stiffnessDamping;
294  TimeIntegrationOption m_timeIntegrationOption;
295  real64 m_maxForce = 0.0;
296  integer m_maxNumResolves;
297  integer m_strainTheory;
298 
303 
306 
307  real64 m_contactPenaltyStiffness;
308 
309 private:
310 
311  string m_contactRelationName;
312 
313  PhysicsSolverBase *m_surfaceGenerator;
314  string m_surfaceGeneratorName;
315 };
316 
318  "QuasiStatic",
319  "ImplicitDynamic",
320  "ExplicitDynamic" );
321 
322 //**********************************************************************************************************************
323 //**********************************************************************************************************************
324 //**********************************************************************************************************************
325 
326 
327 template< typename TYPE_LIST,
328  typename KERNEL_WRAPPER,
329  typename ... PARAMS >
330 real64 SolidMechanicsLagrangianFEM::assemblyLaunch( MeshLevel & mesh,
331  DofManager const & dofManager,
332  string_array const & regionNames,
333  string const & materialNamesString,
334  CRSMatrixView< real64, globalIndex const > const & localMatrix,
335  arrayView1d< real64 > const & localRhs,
336  real64 const dt,
337  PARAMS && ... params )
338 {
340 
341  NodeManager const & nodeManager = mesh.getNodeManager();
342 
343  string const dofKey = dofManager.getKey( fields::solidMechanics::totalDisplacement::key() );
344  arrayView1d< globalIndex const > const & dofNumber = nodeManager.getReference< globalIndex_array >( dofKey );
345 
346  real64 const gravityVectorData[3] = LVARRAY_TENSOROPS_INIT_LOCAL_3( gravityVector() );
347 
348  KERNEL_WRAPPER kernelWrapper( dofNumber,
349  dofManager.rankOffset(),
350  localMatrix,
351  localRhs,
352  dt,
353  gravityVectorData,
354  std::forward< PARAMS >( params )... );
355 
356  return finiteElement::
357  regionBasedKernelApplication< parallelDevicePolicy< >,
358  TYPE_LIST >( mesh,
359  regionNames,
360  this->getDiscretizationName(),
361  materialNamesString,
362  kernelWrapper );
363 
364 }
365 
366 } /* namespace geos */
367 
368 #endif /* GEOS_PHYSICSSOLVERS_SOLIDMECHANICS_SOLIDMECHANICSLAGRANGIANFEM_HPP_ */
#define GEOS_UNUSED_VAR(...)
Mark an unused variable and silence compiler warnings.
Definition: GeosxMacros.hpp:84
#define GEOS_MARK_FUNCTION
Mark function with both Caliper and NVTX if enabled.
The DoFManager is responsible for allocating global dofs, constructing sparsity patterns,...
Definition: DofManager.hpp:45
globalIndex rankOffset(string const &fieldName) const
string const & getKey(string const &fieldName) const
Return the key used to record the field in the DofManager.
Partition of the decomposed physical domain. It also manages the connexion information to its neighbo...
Class facilitating the representation of a multi-level discretization of a MeshBody.
Definition: MeshLevel.hpp:42
NodeManager const & getNodeManager() const
Get the node manager.
Definition: MeshLevel.hpp:155
The NodeManager class provides an interface to ObjectManagerBase in order to manage node data.
Definition: NodeManager.hpp:46
Base class for all physics solvers.
string getDiscretizationName() const
return the name of the discretization object
R1Tensor const gravityVector() const
return the value of the gravity vector specified in PhysicsSolverManager
bool m_performStressInitialization
Flag to indicate that the solver is going to perform stress initialization.
virtual void registerDataOnMesh(Group &meshBodies) override
Register wrappers that contain data on the mesh objects.
bool m_isFixedStressPoromechanicsUpdate
Flag to indicate that the solver is running in fixed stress (sequential) mode.
virtual void initializePreSubGroups() override
Called by Initialize() prior to initializing sub-Groups.
virtual void saveSequentialIterationState(DomainPartition &domain) override
Save the state of the solver for sequential iteration.
SolidMechanicsLagrangianFEM(const string &name, Group *const parent)
virtual void initializePostInitialConditionsPreSubGroups() override
Called by InitializePostInitialConditions() prior to initializing sub-Groups.
void applyDisplacementBCImplicit(real64 const time, DofManager const &dofManager, DomainPartition &domain, CRSMatrixView< real64, globalIndex const > const &localMatrix, arrayView1d< real64 > const &localRhs)
array1d< ParallelVector > m_rigidBodyModes
Rigid body modes; TODO remove mutable hack.
virtual void setConstitutiveNamesCallSuper(ElementSubRegionBase &subRegion) const override
This function sets constitutive name fields on an ElementSubRegionBase, and calls the base function i...
virtual real64 scalingForSystemSolution(DomainPartition &domain, DofManager const &dofManager, arrayView1d< real64 const > const &localSolution) override
Function to determine if the solution vector should be scaled back in order to maintain a known const...
virtual void postInputInitialization() override
static string coupledSolverAttributePrefix()
String used to form the solverName used to register single-physics solvers in CoupledSolver.
GEOS_DECLTYPE_AUTO_RETURN getReference(LOOKUP_TYPE const &lookup) const
Look up a wrapper and get reference to wrapped object.
Definition: Group.hpp:1275
virtual void applySystemSolution(DofManager const &dofManager, arrayView1d< real64 const > const &localSolution, real64 const scalingFactor, real64 const dt, DomainPartition &domain) override
Function to apply the solution vector to the state.
virtual real64 calculateResidualNorm(real64 const &time_n, real64 const &dt, DomainPartition const &domain, DofManager const &dofManager, arrayView1d< real64 const > const &localRhs) override
calculate the norm of the global system residual
virtual void implicitStepComplete(real64 const &time, real64 const &dt, DomainPartition &domain) override
perform cleanup for implicit timestep
virtual real64 explicitStep(real64 const &time_n, real64 const &dt, integer const cycleNumber, DomainPartition &domain) override
Entry function for an explicit time integration step.
virtual std::unique_ptr< PreconditionerBase< LAInterface > > createPreconditioner(DomainPartition &domain) const override
Create a preconditioner for this solver's linear system.
virtual void setupSystem(DomainPartition &domain, DofManager &dofManager, CRSMatrix< real64, globalIndex > &localMatrix, ParallelVector &rhs, ParallelVector &solution, bool const setSparsity=false) override
Set up the linear system (DOF indices and sparsity patterns)
virtual void assembleSystem(real64 const time, real64 const dt, DomainPartition &domain, DofManager const &dofManager, CRSMatrixView< real64, globalIndex const > const &localMatrix, arrayView1d< real64 > const &localRhs) override
function to assemble the linear system matrix and rhs
virtual void applyBoundaryConditions(real64 const time, real64 const dt, DomainPartition &domain, DofManager const &dofManager, CRSMatrixView< real64, globalIndex const > const &localMatrix, arrayView1d< real64 > const &localRhs) override
apply boundary condition to system
virtual void resetStateToBeginningOfStep(DomainPartition &domain) override
reset state of physics back to the beginning of the step.
virtual void updateState(DomainPartition &domain) override
Recompute all dependent quantities from primary variables (including constitutive models)
virtual real64 solverStep(real64 const &time_n, real64 const &dt, integer const cycleNumber, DomainPartition &domain) override
entry function to perform a solver step
virtual void setupDofs(DomainPartition const &domain, DofManager &dofManager) const override
Populate degree-of-freedom manager with fields relevant to this solver.
virtual void implicitStepSetup(real64 const &time_n, real64 const &dt, DomainPartition &domain) override
function to perform setup for implicit timestep
virtual void solveLinearSystem(DofManager const &dofManager, ParallelMatrix &matrix, ParallelVector &rhs, ParallelVector &solution) override
function to apply a linear system solver to the assembled system.
ArrayView< T, 1 > arrayView1d
Alias for 1D array view.
Definition: DataTypes.hpp:179
stdVector< string > string_array
A 1-dimensional array of geos::string types.
Definition: DataTypes.hpp:361
array1d< globalIndex > globalIndex_array
A 1-dimensional array of geos::globalIndex types.
Definition: DataTypes.hpp:370
LvArray::CRSMatrix< T, COL_INDEX, INDEX_TYPE, LvArray::ChaiBuffer > CRSMatrix
Alias for CRS Matrix class.
Definition: DataTypes.hpp:305
std::string string
String type.
Definition: DataTypes.hpp:90
double real64
64-bit floating point type.
Definition: DataTypes.hpp:98
LvArray::CRSMatrixView< T, COL_INDEX, INDEX_TYPE const, LvArray::ChaiBuffer > CRSMatrixView
Alias for CRS Matrix View.
Definition: DataTypes.hpp:309
LvArray::SortedArray< T, localIndex, LvArray::ChaiBuffer > SortedArray
A sorted array of local indices.
Definition: DataTypes.hpp:266
LAInterface::ParallelMatrix ParallelMatrix
Alias for ParallelMatrix.
int integer
Signed integer type.
Definition: DataTypes.hpp:81
Array< T, 1 > array1d
Alias for 1D array.
Definition: DataTypes.hpp:175
ENUM_STRINGS(LinearSolverParameters::SolverType, "direct", "cg", "gmres", "fgmres", "bicgstab", "richardson", "preconditioner")
Declare strings associated with enumeration values.
LAInterface::ParallelVector ParallelVector
Alias for ParallelVector.
Structure to hold scoped key names.