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"
31 
33 
34 namespace geos
35 {
36 
43 {
44 public:
45 
47  static string coupledSolverAttributePrefix() { return "solid"; }
48 
55  {
56  QuasiStatic,
59  };
60 
66  SolidMechanicsLagrangianFEM( const string & name,
67  Group * const parent );
68 
69 
72 
73  SolidMechanicsLagrangianFEM & operator=( SolidMechanicsLagrangianFEM const & ) = delete;
75 
79  virtual ~SolidMechanicsLagrangianFEM() override;
80 
84  static string catalogName() { return "SolidMechanicsLagrangianFEM"; }
88  string getCatalogName() const override { return catalogName(); }
89 
90  virtual void initializePreSubGroups() override;
91 
92  virtual void registerDataOnMesh( Group & meshBodies ) override;
93 
100  virtual
101  real64 solverStep( real64 const & time_n,
102  real64 const & dt,
103  integer const cycleNumber,
104  DomainPartition & domain ) override;
105 
106  virtual
107  real64 explicitStep( real64 const & time_n,
108  real64 const & dt,
109  integer const cycleNumber,
110  DomainPartition & domain ) override;
111 
112  virtual void
113  implicitStepSetup( real64 const & time_n,
114  real64 const & dt,
115  DomainPartition & domain ) override;
116 
117  virtual void
118  setupDofs( DomainPartition const & domain,
119  DofManager & dofManager ) const override;
120 
121  virtual void
123  DofManager & dofManager,
124  CRSMatrix< real64, globalIndex > & localMatrix,
125  ParallelVector & rhs,
126  ParallelVector & solution,
127  bool const setSparsity = false ) override;
128 
129  virtual void
130  assembleSystem( real64 const time,
131  real64 const dt,
132  DomainPartition & domain,
133  DofManager const & dofManager,
134  CRSMatrixView< real64, globalIndex const > const & localMatrix,
135  arrayView1d< real64 > const & localRhs ) override;
136 
137  virtual void
138  applySystemSolution( DofManager const & dofManager,
139  arrayView1d< real64 const > const & localSolution,
140  real64 const scalingFactor,
141  real64 const dt,
142  DomainPartition & domain ) override;
143 
144  virtual void updateState( DomainPartition & domain ) override
145  {
146  // There should be nothing to update
147  GEOS_UNUSED_VAR( domain );
148  };
149 
150  virtual void applyBoundaryConditions( real64 const time,
151  real64 const dt,
152  DomainPartition & domain,
153  DofManager const & dofManager,
154  CRSMatrixView< real64, globalIndex const > const & localMatrix,
155  arrayView1d< real64 > const & localRhs ) override;
156 
157  virtual real64
158  calculateResidualNorm( real64 const & time_n,
159  real64 const & dt,
160  DomainPartition const & domain,
161  DofManager const & dofManager,
162  arrayView1d< real64 const > const & localRhs ) override;
163 
164  virtual void resetStateToBeginningOfStep( DomainPartition & domain ) override;
165 
166  virtual void implicitStepComplete( real64 const & time,
167  real64 const & dt,
168  DomainPartition & domain ) override;
169 
173  template< typename CONSTITUTIVE_BASE,
174  typename KERNEL_WRAPPER,
175  typename ... PARAMS >
176  real64 assemblyLaunch( MeshLevel & mesh,
177  DofManager const & dofManager,
178  string_array const & regionNames,
179  string const & materialNamesString,
180  CRSMatrixView< real64, globalIndex const > const & localMatrix,
181  arrayView1d< real64 > const & localRhs,
182  real64 const dt,
183  PARAMS && ... params );
184 
185 
186  template< typename ... PARAMS >
187  real64 explicitKernelDispatch( MeshLevel & mesh,
188  string_array const & targetRegions,
189  string const & finiteElementName,
190  real64 const dt,
191  std::string const & elementListName );
192 
203  DofManager const & dofManager,
204  DomainPartition & domain,
205  CRSMatrixView< real64, globalIndex const > const & localMatrix,
206  arrayView1d< real64 > const & localRhs );
207 
208  void applyTractionBC( real64 const time,
209  DofManager const & dofManager,
210  DomainPartition & domain,
211  arrayView1d< real64 > const & localRhs );
212 
213  void applyChomboPressure( DofManager const & dofManager,
214  DomainPartition & domain,
215  arrayView1d< real64 > const & localRhs );
216 
217 
218  void applyContactConstraint( DofManager const & dofManager,
219  DomainPartition & domain,
220  CRSMatrixView< real64, globalIndex const > const & localMatrix,
221  arrayView1d< real64 > const & localRhs );
222 
223  virtual real64
225  DofManager const & dofManager,
226  arrayView1d< real64 const > const & localSolution ) override;
227 
228  void enableFixedStressPoromechanicsUpdate();
229 
230  virtual void saveSequentialIterationState( DomainPartition & domain ) override;
231 
233  {
234  static constexpr char const * newmarkGammaString() { return "newmarkGamma"; }
235  static constexpr char const * newmarkBetaString() { return "newmarkBeta"; }
236  static constexpr char const * massDampingString() { return "massDamping"; }
237  static constexpr char const * stiffnessDampingString() { return "stiffnessDamping"; }
238  static constexpr char const * timeIntegrationOptionString() { return "timeIntegrationOption"; }
239  static constexpr char const * maxNumResolvesString() { return "maxNumResolves"; }
240  static constexpr char const * strainTheoryString() { return "strainTheory"; }
241  static constexpr char const * solidMaterialNamesString() { return "solidMaterialNames"; }
242  static constexpr char const * contactRelationNameString() { return "contactRelationName"; }
243  static constexpr char const * noContactRelationNameString() { return "NOCONTACT"; }
244  static constexpr char const * maxForceString() { return "maxForce"; }
245  static constexpr char const * elemsAttachedToSendOrReceiveNodesString() { return "elemsAttachedToSendOrReceiveNodes"; }
246  static constexpr char const * elemsNotAttachedToSendOrReceiveNodesString() { return "elemsNotAttachedToSendOrReceiveNodes"; }
247  static constexpr char const * surfaceGeneratorNameString() { return "surfaceGeneratorName"; }
248 
249  static constexpr char const * sendOrReceiveNodesString() { return "sendOrReceiveNodes";}
250  static constexpr char const * nonSendOrReceiveNodesString() { return "nonSendOrReceiveNodes";}
251  static constexpr char const * targetNodesString() { return "targetNodes";}
252  static constexpr char const * forceString() { return "Force";}
253 
254  static constexpr char const * contactPenaltyStiffnessString() { return "contactPenaltyStiffness"; }
255 
256  };
257 
258  SortedArray< localIndex > & getElemsAttachedToSendOrReceiveNodes( ElementSubRegionBase & subRegion )
259  {
260  return subRegion.getReference< SortedArray< localIndex > >( viewKeyStruct::elemsAttachedToSendOrReceiveNodesString() );
261  }
262 
263  SortedArray< localIndex > & getElemsNotAttachedToSendOrReceiveNodes( ElementSubRegionBase & subRegion )
264  {
265  return subRegion.getReference< SortedArray< localIndex > >( viewKeyStruct::elemsNotAttachedToSendOrReceiveNodesString() );
266  }
267 
268  real64 & getMaxForce() { return m_maxForce; }
269  real64 const & getMaxForce() const { return m_maxForce; }
270 
271  arrayView1d< ParallelVector > const & getRigidBodyModes() const
272  {
273  return m_rigidBodyModes;
274  }
275 
276  array1d< ParallelVector > & getRigidBodyModes()
277  {
278  return m_rigidBodyModes;
279  }
280 
281 protected:
282  virtual void postInputInitialization() override;
283 
285 
286  virtual void setConstitutiveNamesCallSuper( ElementSubRegionBase & subRegion ) const override;
287 
288  real64 m_newmarkGamma;
289  real64 m_newmarkBeta;
290  real64 m_massDamping;
291  real64 m_stiffnessDamping;
292  TimeIntegrationOption m_timeIntegrationOption;
293  real64 m_maxForce = 0.0;
294  integer m_maxNumResolves;
295  integer m_strainTheory;
296 // MPI_iCommData m_iComm;
297  bool m_isFixedStressPoromechanicsUpdate;
298 
301 
302  real64 m_contactPenaltyStiffness;
303 
304 private:
305 
306  string m_contactRelationName;
307 
308  PhysicsSolverBase *m_surfaceGenerator;
309  string m_surfaceGeneratorName;
310 };
311 
313  "QuasiStatic",
314  "ImplicitDynamic",
315  "ExplicitDynamic" );
316 
317 //**********************************************************************************************************************
318 //**********************************************************************************************************************
319 //**********************************************************************************************************************
320 
321 
322 template< typename CONSTITUTIVE_BASE,
323  typename KERNEL_WRAPPER,
324  typename ... PARAMS >
325 real64 SolidMechanicsLagrangianFEM::assemblyLaunch( MeshLevel & mesh,
326  DofManager const & dofManager,
327  string_array const & regionNames,
328  string const & materialNamesString,
329  CRSMatrixView< real64, globalIndex const > const & localMatrix,
330  arrayView1d< real64 > const & localRhs,
331  real64 const dt,
332  PARAMS && ... params )
333 {
335 
336  NodeManager const & nodeManager = mesh.getNodeManager();
337 
338  string const dofKey = dofManager.getKey( fields::solidMechanics::totalDisplacement::key() );
339  arrayView1d< globalIndex const > const & dofNumber = nodeManager.getReference< globalIndex_array >( dofKey );
340 
341  real64 const gravityVectorData[3] = LVARRAY_TENSOROPS_INIT_LOCAL_3( gravityVector() );
342 
343  KERNEL_WRAPPER kernelWrapper( dofNumber,
344  dofManager.rankOffset(),
345  localMatrix,
346  localRhs,
347  dt,
348  gravityVectorData,
349  std::forward< PARAMS >( params )... );
350 
351  return finiteElement::
352  regionBasedKernelApplication< parallelDevicePolicy< >,
353  CONSTITUTIVE_BASE,
354  CellElementSubRegion >( mesh,
355  regionNames,
356  this->getDiscretizationName(),
357  materialNamesString,
358  kernelWrapper );
359 
360 }
361 
362 } /* namespace geos */
363 
364 #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:44
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
virtual void registerDataOnMesh(Group &meshBodies) override
Register wrappers that contain data on the mesh objects.
virtual ~SolidMechanicsLagrangianFEM() override
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.
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 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
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
array1d< globalIndex > globalIndex_array
A 1-dimensional array of geos::globalIndex types.
Definition: DataTypes.hpp:402
ENUM_STRINGS(LinearSolverParameters::SolverType, "direct", "cg", "gmres", "fgmres", "bicgstab", "preconditioner")
Declare strings associated with enumeration values.
std::string string
String type.
Definition: DataTypes.hpp:91
double real64
64-bit floating point type.
Definition: DataTypes.hpp:99
std::int32_t integer
Signed integer type.
Definition: DataTypes.hpp:82
LvArray::CRSMatrix< T, COL_INDEX, localIndex, LvArray::ChaiBuffer > CRSMatrix
Alias for CRS Matrix class.
Definition: DataTypes.hpp:306
LvArray::SortedArray< T, localIndex, LvArray::ChaiBuffer > SortedArray
A sorted array of local indices.
Definition: DataTypes.hpp:267
std::vector< string > string_array
A 1-dimensional array of geos::string types.
Definition: DataTypes.hpp:393
Array< T, 1 > array1d
Alias for 1D array.
Definition: DataTypes.hpp:176
LAInterface::ParallelVector ParallelVector
Alias for ParallelVector.
Structure to hold scoped key names.