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 Total, S.A
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"
28 #include "mesh/mpiCommunications/CommunicationTools.hpp"
29 #include "mesh/mpiCommunications/MPI_iCommData.hpp"
32 
34 
35 namespace geos
36 {
37 
44 {
45 public:
46 
48  static string coupledSolverAttributePrefix() { return "solid"; }
49 
56  {
57  QuasiStatic,
60  };
61 
67  SolidMechanicsLagrangianFEM( const string & name,
68  Group * const parent );
69 
70 
73 
74  SolidMechanicsLagrangianFEM & operator=( SolidMechanicsLagrangianFEM const & ) = delete;
76 
80  virtual ~SolidMechanicsLagrangianFEM() override;
81 
85  static string catalogName() { return "SolidMechanics_LagrangianFEM"; }
89  string getCatalogName() const override { return catalogName(); }
90 
91  virtual void initializePreSubGroups() override;
92 
93  virtual void registerDataOnMesh( Group & meshBodies ) override;
94 
101  virtual
102  real64 solverStep( real64 const & time_n,
103  real64 const & dt,
104  integer const cycleNumber,
105  DomainPartition & domain ) override;
106 
107  virtual
108  real64 explicitStep( real64 const & time_n,
109  real64 const & dt,
110  integer const cycleNumber,
111  DomainPartition & domain ) override;
112 
113  virtual void
114  implicitStepSetup( real64 const & time_n,
115  real64 const & dt,
116  DomainPartition & domain ) override;
117 
118  virtual void
119  setupDofs( DomainPartition const & domain,
120  DofManager & dofManager ) const override;
121 
122  virtual void
124  DofManager & dofManager,
125  CRSMatrix< real64, globalIndex > & localMatrix,
126  ParallelVector & rhs,
127  ParallelVector & solution,
128  bool const setSparsity = false ) override;
129 
130  virtual void
131  assembleSystem( real64 const time,
132  real64 const dt,
133  DomainPartition & domain,
134  DofManager const & dofManager,
135  CRSMatrixView< real64, globalIndex const > const & localMatrix,
136  arrayView1d< real64 > const & localRhs ) 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 CONSTITUTIVE_BASE,
175  typename KERNEL_WRAPPER,
176  typename ... PARAMS >
177  real64 assemblyLaunch( MeshLevel & mesh,
178  DofManager const & dofManager,
179  arrayView1d< string const > 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 
187  template< typename ... PARAMS >
188  real64 explicitKernelDispatch( MeshLevel & mesh,
189  arrayView1d< string const > const & targetRegions,
190  string const & finiteElementName,
191  real64 const dt,
192  std::string const & elementListName );
193 
204  DofManager const & dofManager,
205  DomainPartition & domain,
206  CRSMatrixView< real64, globalIndex const > const & localMatrix,
207  arrayView1d< real64 > const & localRhs );
208 
209  void applyTractionBC( real64 const time,
210  DofManager const & dofManager,
211  DomainPartition & domain,
212  arrayView1d< real64 > const & localRhs );
213 
214  void applyChomboPressure( DofManager const & dofManager,
215  DomainPartition & domain,
216  arrayView1d< real64 > const & localRhs );
217 
218 
219  void applyContactConstraint( DofManager const & dofManager,
220  DomainPartition & domain,
221  CRSMatrixView< real64, globalIndex const > const & localMatrix,
222  arrayView1d< real64 > const & localRhs );
223 
224  virtual real64
226  DofManager const & dofManager,
227  arrayView1d< real64 const > const & localSolution ) override;
228 
229  void enableFixedStressPoromechanicsUpdate();
230 
231  virtual void saveSequentialIterationState( DomainPartition & domain ) override;
232 
234  {
235  static constexpr char const * newmarkGammaString() { return "newmarkGamma"; }
236  static constexpr char const * newmarkBetaString() { return "newmarkBeta"; }
237  static constexpr char const * massDampingString() { return "massDamping"; }
238  static constexpr char const * stiffnessDampingString() { return "stiffnessDamping"; }
239  static constexpr char const * timeIntegrationOptionString() { return "timeIntegrationOption"; }
240  static constexpr char const * maxNumResolvesString() { return "maxNumResolves"; }
241  static constexpr char const * strainTheoryString() { return "strainTheory"; }
242  static constexpr char const * solidMaterialNamesString() { return "solidMaterialNames"; }
243  static constexpr char const * contactRelationNameString() { return "contactRelationName"; }
244  static constexpr char const * noContactRelationNameString() { return "NOCONTACT"; }
245  static constexpr char const * maxForceString() { return "maxForce"; }
246  static constexpr char const * elemsAttachedToSendOrReceiveNodesString() { return "elemsAttachedToSendOrReceiveNodes"; }
247  static constexpr char const * elemsNotAttachedToSendOrReceiveNodesString() { return "elemsNotAttachedToSendOrReceiveNodes"; }
248  static constexpr char const * surfaceGeneratorNameString() { return "surfaceGeneratorName"; }
249 
250  static constexpr char const * sendOrReceiveNodesString() { return "sendOrReceiveNodes";}
251  static constexpr char const * nonSendOrReceiveNodesString() { return "nonSendOrReceiveNodes";}
252  static constexpr char const * targetNodesString() { return "targetNodes";}
253  static constexpr char const * forceString() { return "Force";}
254 
255  static constexpr char const * contactPenaltyStiffnessString() { return "contactPenaltyStiffness"; }
256 
257  };
258 
259  SortedArray< localIndex > & getElemsAttachedToSendOrReceiveNodes( ElementSubRegionBase & subRegion )
260  {
261  return subRegion.getReference< SortedArray< localIndex > >( viewKeyStruct::elemsAttachedToSendOrReceiveNodesString() );
262  }
263 
264  SortedArray< localIndex > & getElemsNotAttachedToSendOrReceiveNodes( ElementSubRegionBase & subRegion )
265  {
266  return subRegion.getReference< SortedArray< localIndex > >( viewKeyStruct::elemsNotAttachedToSendOrReceiveNodesString() );
267  }
268 
269  real64 & getMaxForce() { return m_maxForce; }
270  real64 const & getMaxForce() const { return m_maxForce; }
271 
272  arrayView1d< ParallelVector > const & getRigidBodyModes() const
273  {
274  return m_rigidBodyModes;
275  }
276 
277  array1d< ParallelVector > & getRigidBodyModes()
278  {
279  return m_rigidBodyModes;
280  }
281 
282 protected:
283  virtual void postInputInitialization() override;
284 
286 
287  virtual void setConstitutiveNamesCallSuper( ElementSubRegionBase & subRegion ) const override;
288 
289  real64 m_newmarkGamma;
290  real64 m_newmarkBeta;
291  real64 m_massDamping;
292  real64 m_stiffnessDamping;
293  TimeIntegrationOption m_timeIntegrationOption;
294  real64 m_maxForce = 0.0;
295  integer m_maxNumResolves;
296  integer m_strainTheory;
297 // MPI_iCommData m_iComm;
298  bool m_isFixedStressPoromechanicsUpdate;
299 
302 
303  real64 m_contactPenaltyStiffness;
304 
305 private:
306 
307  string m_contactRelationName;
308 
309  PhysicsSolverBase *m_surfaceGenerator;
310  string m_surfaceGeneratorName;
311 };
312 
314  "QuasiStatic",
315  "ImplicitDynamic",
316  "ExplicitDynamic" );
317 
318 //**********************************************************************************************************************
319 //**********************************************************************************************************************
320 //**********************************************************************************************************************
321 
322 
323 template< typename CONSTITUTIVE_BASE,
324  typename KERNEL_WRAPPER,
325  typename ... PARAMS >
326 real64 SolidMechanicsLagrangianFEM::assemblyLaunch( MeshLevel & mesh,
327  DofManager const & dofManager,
328  arrayView1d< string const > const & regionNames,
329  string const & materialNamesString,
330  CRSMatrixView< real64, globalIndex const > const & localMatrix,
331  arrayView1d< real64 > const & localRhs,
332  real64 const dt,
333  PARAMS && ... params )
334 {
336 
337  NodeManager const & nodeManager = mesh.getNodeManager();
338 
339  string const dofKey = dofManager.getKey( fields::solidMechanics::totalDisplacement::key() );
340  arrayView1d< globalIndex const > const & dofNumber = nodeManager.getReference< globalIndex_array >( dofKey );
341 
342  real64 const gravityVectorData[3] = LVARRAY_TENSOROPS_INIT_LOCAL_3( gravityVector() );
343 
344  KERNEL_WRAPPER kernelWrapper( dofNumber,
345  dofManager.rankOffset(),
346  localMatrix,
347  localRhs,
348  dt,
349  gravityVectorData,
350  std::forward< PARAMS >( params )... );
351 
352  return finiteElement::
353  regionBasedKernelApplication< parallelDevicePolicy< >,
354  CONSTITUTIVE_BASE,
355  CellElementSubRegion >( mesh,
356  regionNames,
357  this->getDiscretizationName(),
358  materialNamesString,
359  kernelWrapper );
360 
361 }
362 
363 } /* namespace geos */
364 
365 #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:1273
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:401
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
Array< T, 1 > array1d
Alias for 1D array.
Definition: DataTypes.hpp:176
LAInterface::ParallelVector ParallelVector
Alias for ParallelVector.
Structure to hold scoped key names.