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 setSparsity = true ) override;
115 
116  virtual void
118  DofManager & dofManager,
119  CRSMatrix< real64, globalIndex > & localMatrix,
120  SparsityPattern< globalIndex > & pattern ) override;
121 
122  virtual std::unique_ptr< PreconditionerBase< LAInterface > >
123  createPreconditioner( DomainPartition & domain ) const override;
124 
125  virtual void
126  assembleSystem( real64 const time,
127  real64 const dt,
128  DomainPartition & domain,
129  DofManager const & dofManager,
130  CRSMatrixView< real64, globalIndex const > const & localMatrix,
131  arrayView1d< real64 > const & localRhs ) override;
132 
133  virtual void solveLinearSystem( DofManager const & dofManager,
134  ParallelMatrix & matrix,
135  ParallelVector & rhs,
136  ParallelVector & solution ) override;
137 
138  virtual void
139  applySystemSolution( DofManager const & dofManager,
140  arrayView1d< real64 const > const & localSolution,
141  real64 const scalingFactor,
142  real64 const dt,
143  DomainPartition & domain ) override;
144 
145  virtual void updateState( DomainPartition & domain ) override
146  {
147  // There should be nothing to update
148  GEOS_UNUSED_VAR( domain );
149  };
150 
151  virtual void applyBoundaryConditions( real64 const time,
152  real64 const dt,
153  DomainPartition & domain,
154  DofManager const & dofManager,
155  CRSMatrixView< real64, globalIndex const > const & localMatrix,
156  arrayView1d< real64 > const & localRhs ) override;
157 
158  virtual real64
159  calculateResidualNorm( real64 const & time_n,
160  real64 const & dt,
161  DomainPartition const & domain,
162  DofManager const & dofManager,
163  arrayView1d< real64 const > const & localRhs ) override;
164 
165  virtual void resetStateToBeginningOfStep( DomainPartition & domain ) override;
166 
167  virtual void implicitStepComplete( real64 const & time,
168  real64 const & dt,
169  DomainPartition & domain ) override;
170 
174  template< typename TYPE_LIST,
175  typename KERNEL_WRAPPER,
176  typename ... PARAMS >
177  real64 assemblyLaunch( MeshLevel & mesh,
178  DofManager const & dofManager,
179  string_array const & regionNames,
180  string const & materialNamesString,
181  CRSMatrixView< real64, globalIndex const > const & localMatrix,
182  arrayView1d< real64 > const & localRhs,
183  real64 const dt,
184  PARAMS && ... params );
185 
186  real64 explicitKernelDispatch( MeshLevel & mesh,
187  string_array const & targetRegions,
188  string const & finiteElementName,
189  real64 const dt,
190  std::string const & elementListName );
191 
202  DofManager const & dofManager,
203  DomainPartition & domain,
204  CRSMatrixView< real64, globalIndex const > const & localMatrix,
205  arrayView1d< real64 > const & localRhs );
206 
207  void applyTractionBC( real64 const time,
208  DofManager const & dofManager,
209  DomainPartition & domain,
210  arrayView1d< real64 > const & localRhs );
211 
212  void applyChomboPressure( DofManager const & dofManager,
213  DomainPartition & domain,
214  arrayView1d< real64 > const & localRhs );
215 
216 
217  void applyContactConstraint( DofManager const & dofManager,
218  DomainPartition & domain,
219  CRSMatrixView< real64, globalIndex const > const & localMatrix,
220  arrayView1d< real64 > const & localRhs );
221 
222  virtual real64
224  DofManager const & dofManager,
225  arrayView1d< real64 const > const & localSolution ) override;
226 
227  void enableFixedStressPoromechanicsUpdate();
228 
229  virtual void saveSequentialIterationState( DomainPartition & domain ) override;
230 
232  {
233  static constexpr char const * newmarkGammaString() { return "newmarkGamma"; }
234  static constexpr char const * newmarkBetaString() { return "newmarkBeta"; }
235  static constexpr char const * massDampingString() { return "massDamping"; }
236  static constexpr char const * stiffnessDampingString() { return "stiffnessDamping"; }
237  static constexpr char const * timeIntegrationOptionString() { return "timeIntegrationOption"; }
238  static constexpr char const * maxNumResolvesString() { return "maxNumResolves"; }
239  static constexpr char const * strainTheoryString() { return "strainTheory"; }
240  static constexpr char const * solidMaterialNamesString() { return "solidMaterialNames"; }
241  static constexpr char const * contactRelationNameString() { return "contactRelationName"; }
242  static constexpr char const * noContactRelationNameString() { return "NOCONTACT"; }
243  static constexpr char const * maxForceString() { return "maxForce"; }
244  static constexpr char const * elemsAttachedToSendOrReceiveNodesString() { return "elemsAttachedToSendOrReceiveNodes"; }
245  static constexpr char const * elemsNotAttachedToSendOrReceiveNodesString() { return "elemsNotAttachedToSendOrReceiveNodes"; }
246  static constexpr char const * surfaceGeneratorNameString() { return "surfaceGeneratorName"; }
247 
248  static constexpr char const * sendOrReceiveNodesString() { return "sendOrReceiveNodes";}
249  static constexpr char const * nonSendOrReceiveNodesString() { return "nonSendOrReceiveNodes";}
250  static constexpr char const * targetNodesString() { return "targetNodes";}
251  static constexpr char const * forceString() { return "Force";}
252 
253  static constexpr char const * contactPenaltyStiffnessString() { return "contactPenaltyStiffness"; }
254 
255  };
256 
257  SortedArray< localIndex > & getElemsAttachedToSendOrReceiveNodes( ElementSubRegionBase & subRegion )
258  {
259  return subRegion.getReference< SortedArray< localIndex > >( viewKeyStruct::elemsAttachedToSendOrReceiveNodesString() );
260  }
261 
262  SortedArray< localIndex > & getElemsNotAttachedToSendOrReceiveNodes( ElementSubRegionBase & subRegion )
263  {
264  return subRegion.getReference< SortedArray< localIndex > >( viewKeyStruct::elemsNotAttachedToSendOrReceiveNodesString() );
265  }
266 
267  real64 & getMaxForce() { return m_maxForce; }
268  real64 const & getMaxForce() const { return m_maxForce; }
269 
270  void computeRigidBodyModes( DomainPartition & domain ) const;
271 
272  arrayView1d< ParallelVector > const & getRigidBodyModes( DomainPartition & domain ) const
273  {
274  computeRigidBodyModes( domain );
275  return m_rigidBodyModes;
276  }
277 
278  /*
279  * @brief Utility function to set the stress initialization flag
280  * @param[in] performStressInitialization true if the solver has to initialize stress, false otherwise
281  */
282  void setStressInitialization( bool const performStressInitialization )
283  {
284  m_performStressInitialization = performStressInitialization;
285  }
286 
287  TimeIntegrationOption timeIntegrationOption() const { return m_timeIntegrationOption; }
288 
289 protected:
290  virtual void postInputInitialization() override;
291 
293 
294  virtual void setConstitutiveNamesCallSuper( ElementSubRegionBase & subRegion ) const override;
295 
296  real64 m_newmarkGamma;
297  real64 m_newmarkBeta;
298  real64 m_massDamping;
299  real64 m_stiffnessDamping;
300  TimeIntegrationOption m_timeIntegrationOption;
301  real64 m_maxForce = 0.0;
302  integer m_maxNumResolves;
303  integer m_strainTheory;
304 
309 
312 
313  real64 m_contactPenaltyStiffness;
314 
315 private:
316 
317  string m_contactRelationName;
318 
319  PhysicsSolverBase *m_surfaceGenerator;
320  string m_surfaceGeneratorName;
321 };
322 
324  "QuasiStatic",
325  "ImplicitDynamic",
326  "ExplicitDynamic" );
327 
328 //**********************************************************************************************************************
329 //**********************************************************************************************************************
330 //**********************************************************************************************************************
331 
332 
333 template< typename TYPE_LIST,
334  typename KERNEL_WRAPPER,
335  typename ... PARAMS >
336 real64 SolidMechanicsLagrangianFEM::assemblyLaunch( MeshLevel & mesh,
337  DofManager const & dofManager,
338  string_array const & regionNames,
339  string const & materialNamesString,
340  CRSMatrixView< real64, globalIndex const > const & localMatrix,
341  arrayView1d< real64 > const & localRhs,
342  real64 const dt,
343  PARAMS && ... params )
344 {
346 
347  NodeManager const & nodeManager = mesh.getNodeManager();
348 
349  string const dofKey = dofManager.getKey( fields::solidMechanics::totalDisplacement::key() );
350  arrayView1d< globalIndex const > const & dofNumber = nodeManager.getReference< globalIndex_array >( dofKey );
351 
352  real64 const gravityVectorData[3] = LVARRAY_TENSOROPS_INIT_LOCAL_3( gravityVector() );
353 
354  KERNEL_WRAPPER kernelWrapper( dofNumber,
355  dofManager.rankOffset(),
356  localMatrix,
357  localRhs,
358  dt,
359  gravityVectorData,
360  std::forward< PARAMS >( params )... );
361 
362  return finiteElement::
363  regionBasedKernelApplication< parallelDevicePolicy< >,
364  TYPE_LIST >( mesh,
365  regionNames,
366  this->getDiscretizationName(),
367  materialNamesString,
368  kernelWrapper );
369 
370 }
371 
372 } /* namespace geos */
373 
374 #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 setupSystem(DomainPartition &domain, DofManager &dofManager, CRSMatrix< real64, globalIndex > &localMatrix, ParallelVector &rhs, ParallelVector &solution, bool setSparsity=true) override
Set up the linear system (DOF indices and sparsity patterns)
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 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 setSparsityPattern(DomainPartition &domain, DofManager &dofManager, CRSMatrix< real64, globalIndex > &localMatrix, SparsityPattern< globalIndex > &pattern) override
Set the sparsity pattern of the linear system matrix.
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
LvArray::SparsityPattern< COL_INDEX, INDEX_TYPE, LvArray::ChaiBuffer > SparsityPattern
Alias for Sparsity pattern class.
Definition: DataTypes.hpp:297
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.