Interaction.h
Go to the documentation of this file.
1 // This file is part of the MercuryDPM project (https://www.mercurydpm.org).
2 // Copyright (c), The MercuryDPM Developers Team. All rights reserved.
3 // License: BSD 3-Clause License; see the LICENSE file in the root directory.
4 
5 #ifndef INTERACTION_H
6 #define INTERACTION_H
7 
10 #include "InteractionHandler.h"
11 #include "BaseInteractable.h"
12 
13 //used for mpi
14 #include "MpiContainer.h"
15 #include "MPIInteraction.h"
16 #include "Logger.h"
17 
18 class BaseInteractable;
19 
20 template<class NormalForceSpecies, class FrictionForceSpecies, class AdhesiveForceSpecies>
21 class Species;
22 
92 //this class combines normal and tangential force laws
93 template<class NormalForceInteraction, class FrictionForceInteraction=EmptyFrictionInteraction, class AdhesiveForceInteraction=EmptyAdhesiveInteraction>
94 class Interaction : public NormalForceInteraction, public FrictionForceInteraction, public AdhesiveForceInteraction
95 {
96 public:
97 
99  Interaction(BaseInteractable* P, BaseInteractable* I, unsigned timeStamp);
100 
102  Interaction();
103 
105  Interaction(const Interaction& p);
106 
108  virtual ~Interaction();
109 
112 
114  void computeForce() final;
115 
118 
120  void read(std::istream& is) final;
121 
123  void write(std::ostream& os) const final;
124 
126  std::string getName() const final;
127 
129  Mdouble getElasticEnergy() const final;
130 
132  void integrate(Mdouble timeStep) final;
133 
135  void reverseHistory() final;
136 
137  void rotateHistory(Matrix3D& rotationMatrix) final;
138 
139  void actionsAfterTimeStep();
140 
144  Mdouble getElasticEnergyAtEquilibrium(Mdouble adhesiveForce) const;
145 
146  void getMPIInteraction(void* historyDataArray, unsigned int index) const final;
147 
148  //if resetPointers is true, then the pointers in the interaction will be set to nullptr, indicating it is a dummyInteraction
149  //and that it is not actually linked to real particles (which might not be in the domain)
150  void setMPIInteraction(void* historyDataArray, unsigned int index, const bool resetPointers) final;
151 
152  void getInteractionDetails(void* interactionDataArray, unsigned int index, unsigned int& identificationP,
153  unsigned int& identificationI, bool& isWallInteraction, unsigned& timeStamp);
154 
155  void createMPIType() final;
156 
157  void* createMPIInteractionDataArray(unsigned int numberOfInteractions) const final;
158 
159  void deleteMPIInteractionDataArray(void* dataArray) final;
160 };
161 
162 template<class NormalForceInteraction, class FrictionForceInteraction, class AdhesiveForceInteraction>
163 Interaction<NormalForceInteraction, FrictionForceInteraction, AdhesiveForceInteraction>::Interaction(
164  BaseInteractable* P, BaseInteractable* I, unsigned timeStamp)
165  : BaseInteraction(P, I, timeStamp), NormalForceInteraction(P, I, timeStamp),
166  FrictionForceInteraction(P, I, timeStamp), AdhesiveForceInteraction(P, I, timeStamp)
167 {
168 #ifdef DEBUG_CONSTRUCTOR
169  std::cout<<"Interaction::Interaction() finished"<<std::endl;
170 #endif
171 }
172 
173 
174 template<class NormalForceInteraction, class FrictionForceInteraction, class AdhesiveForceInteraction>
176  : BaseInteraction(), NormalForceInteraction(), FrictionForceInteraction(), AdhesiveForceInteraction()
177 {
178 #ifdef DEBUG_CONSTRUCTOR
179  std::cout<<"Interaction::Interaction() finished"<<std::endl;
180 #endif
181 }
182 
183 template<class NormalForceInteraction, class FrictionForceInteraction, class AdhesiveForceInteraction>
185  const Interaction& p)
186  : BaseInteraction(p), NormalForceInteraction(p), FrictionForceInteraction(p), AdhesiveForceInteraction(p)
187 {
188 #ifdef DEBUG_CONSTRUCTOR
189  std::cout<<"Interaction::Interaction(const Interaction &p finished"<<std::endl;
190 #endif
191 }
192 
193 template<class NormalForceInteraction, class FrictionForceInteraction, class AdhesiveForceInteraction>
195 {
196 #ifdef DEBUG_DESTRUCTOR
197  std::cout<<"Interaction::~Interaction() finished"<<std::endl;
198 #endif
199 }
200 
204 template<class NormalForceInteraction, class FrictionForceInteraction, class AdhesiveForceInteraction>
207 {
208  return new Interaction(*this);
209 }
210 
215 template<class NormalForceInteraction, class FrictionForceInteraction, class AdhesiveForceInteraction>
216 void
218 {
222 
223 }
224 
229 template<class NormalForceInteraction, class FrictionForceInteraction, class AdhesiveForceInteraction>
231 {
235 }
236 
242 template<class NormalForceInteraction, class FrictionForceInteraction, class AdhesiveForceInteraction>
244 {
245  NormalForceInteraction::reverseHistory();
246  FrictionForceInteraction::reverseHistory();
247  AdhesiveForceInteraction::reverseHistory();
248 }
249 
250 template<class NormalForceInteraction, class FrictionForceInteraction, class AdhesiveForceInteraction>
252  Matrix3D& rotationMatrix)
253 {
254  NormalForceInteraction::rotateHistory(rotationMatrix);
255  FrictionForceInteraction::rotateHistory(rotationMatrix);
256  AdhesiveForceInteraction::rotateHistory(rotationMatrix);
257 }
258 
263 template<class NormalForceInteraction, class FrictionForceInteraction, class AdhesiveForceInteraction>
265 {
266  return NormalForceInteraction::getBaseName() + FrictionForceInteraction::getBaseName() +
267  AdhesiveForceInteraction::getBaseName() + "Interaction";
268 }
269 
275 template<class NormalForceInteraction, class FrictionForceInteraction, class AdhesiveForceInteraction>
276 void
278 {
279  FrictionForceInteraction::integrate(timeStep);
280 }
281 
290 template<class NormalForceInteraction, class FrictionForceInteraction, class AdhesiveForceInteraction>
292 {
293  NormalForceInteraction::computeNormalForce();
294  FrictionForceInteraction::computeFrictionForce();
295  AdhesiveForceInteraction::computeAdhesionForce();
296 }
297 
304 template<class NormalForceInteraction, class FrictionForceInteraction, class AdhesiveForceInteraction>
305 Mdouble
307 {
308  return NormalForceInteraction::getElasticEnergy() + FrictionForceInteraction::getElasticEnergy() +
309  AdhesiveForceInteraction::getElasticEnergy();
310 }
311 
312 template<class NormalForceInteraction, class FrictionForceInteraction, class AdhesiveForceInteraction>
314 {
315  NormalForceInteraction::actionsAfterTimeStep();
316  FrictionForceInteraction::actionsAfterTimeStep();
317  AdhesiveForceInteraction::actionsAfterTimeStep();
318 }
319 
323 template<class NormalForceInteraction, class FrictionForceInteraction, class AdhesiveForceInteraction>
324 Mdouble
326  Mdouble adhesiveForce) const
327 {
328  return NormalForceInteraction::getElasticEnergyAtEquilibrium(adhesiveForce);
329 };
330 
331 
332 template<class NormalForceInteraction, class FrictionForceInteraction, class AdhesiveForceInteraction>
334  void* interactionDataArray, unsigned int index) const
335 {
337 
338  interactionData.copyFromInteraction(this);
339 
341  array[index] = interactionData;
342 }
343 
344 template<class NormalForceInteraction, class FrictionForceInteraction, class AdhesiveForceInteraction>
346  void* interactionDataArray, unsigned int index, const bool resetPointers)
347 {
350 
351  //Copy the interaction data into the interaction
352  interactionData.copyToInteraction(this, resetPointers);
353 }
354 
355 template<class NormalForceInteraction, class FrictionForceInteraction, class AdhesiveForceInteraction>
357  void* interactionDataArray, unsigned int index, unsigned int& identificationP, unsigned int& identificationI,
358  bool& isWallInteraction, unsigned& timeStamp)
359 {
362 
363  identificationP = interactionData.P;
364  identificationI = interactionData.I;
365  isWallInteraction = interactionData.isWallInteraction;
366  timeStamp = interactionData.timeStamp;
367 }
368 
369 
370 template<class NormalForceInteraction, class FrictionForceInteraction, class AdhesiveForceInteraction>
371 void*
373  unsigned int numberOfInteractions) const
374 {
376  void* interactionArray = static_cast<void*>(array);
377  return interactionArray;
378 }
379 
380 template<class NormalForceInteraction, class FrictionForceInteraction, class AdhesiveForceInteraction>
381 void
383  void* dataArray)
384 {
386  delete[] array;
387 }
388 
389 template<class NormalForceInteraction, class FrictionForceInteraction, class AdhesiveForceInteraction>
391 {
392 #ifdef MERCURYDPM_USE_MPI
393  MPIContainer& communicator = MPIContainer::Instance();
395 
396  communicator.createMercuryMPIType(dummyHistoryInteraction, MercuryMPIType::INTERACTION);
397 #endif
398 }
399 
400 #endif
401 
@ INTERACTION
Definition: MpiContainer.h:46
float * p
Definition: Tutorial_Map_using.cpp:9
Defines the basic properties that a interactable object can have.
Definition: BaseInteractable.h:34
Stores information about interactions between two interactable objects; often particles but could be ...
Definition: BaseInteraction.h:39
bool isWallInteraction()
Definition: BaseInteraction.cc:938
Contains information about the contact between two interactables, BaseInteraction::P_ and BaseInterac...
Definition: Interaction.h:95
Interaction()
Empty constructor.
Definition: Interaction.h:175
void createMPIType() final
Definition: Interaction.h:390
void setMPIInteraction(void *historyDataArray, unsigned int index, const bool resetPointers) final
Definition: Interaction.h:345
void * createMPIInteractionDataArray(unsigned int numberOfInteractions) const final
Definition: Interaction.h:372
Interaction< NormalForceInteraction, FrictionForceInteraction, AdhesiveForceInteraction > * copy() const final
Creates a copy of this Interaction.
Definition: Interaction.h:206
void rotateHistory(Matrix3D &rotationMatrix) final
When periodic particles are used, some interactions need certain history properties rotated (e....
Definition: Interaction.h:251
void getMPIInteraction(void *historyDataArray, unsigned int index) const final
copies the history interactions into the data array
Definition: Interaction.h:333
std::string getName() const final
Returns the name of the Interaction.
Definition: Interaction.h:264
Mdouble getElasticEnergy() const final
Returns the elastic energy stored in the Interaction.
Definition: Interaction.h:306
void getInteractionDetails(void *interactionDataArray, unsigned int index, unsigned int &identificationP, unsigned int &identificationI, bool &isWallInteraction, unsigned &timeStamp)
Definition: Interaction.h:356
void read(std::istream &is) final
Read Interaction properties from a file.
Definition: Interaction.h:230
void computeInteraction()
Computes the interaction parameters based on the forces and torques.
void deleteMPIInteractionDataArray(void *dataArray) final
Definition: Interaction.h:382
void computeForce() final
Computes the normal, tangential, and adhesive forces.
Definition: Interaction.h:291
void reverseHistory() final
Reverses the parameters of the contact force.
Definition: Interaction.h:243
void integrate(Mdouble timeStep) final
Integrates the time-dependent parameters of the contact force.
Definition: Interaction.h:277
Mdouble getElasticEnergyAtEquilibrium(Mdouble adhesiveForce) const
returns the overlap at which the repulsive elastic force equals a given adhesive force; to be impleme...
Definition: Interaction.h:325
void actionsAfterTimeStep()
Definition: Interaction.h:313
void write(std::ostream &os) const final
Writes Interaction properties to a file.
Definition: Interaction.h:217
virtual ~Interaction()
The default destructor.
Definition: Interaction.h:194
This class contains all information and functions required for communication between processors.
Definition: MpiContainer.h:109
static MPIContainer & Instance()
fetch the instance to be used for communication
Definition: MpiContainer.h:113
void createMercuryMPIType(T t, MercuryMPIType type)
Get the communicator used for MPI commands.
Definition: MpiContainer.h:543
Definition: MPIInteraction.h:27
bool isWallInteraction
Definition: MPIInteraction.h:34
unsigned int P
Definition: MPIInteraction.h:31
unsigned timeStamp
Definition: MPIInteraction.h:35
void copyToInteraction(Interaction< NormalForceInteraction, FrictionForceInteraction, AdhesiveForceInteraction > *interaction, const bool resetPointers)
Definition: MPIInteraction.h:342
void copyFromInteraction(const Interaction< NormalForceInteraction, FrictionForceInteraction, AdhesiveForceInteraction > *interaction)
Definition: MPIInteraction.h:309
unsigned int I
Definition: MPIInteraction.h:32
Implementation of a 3D matrix.
Definition: Kernel/Math/Matrix.h:17
Contains material and contact force properties.
Definition: Species.h:14
#define I
Definition: main.h:127
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::enable_if_t< dt !=data_source::global_mem, void > write(PacketType &packet_data, DataScalar ptr)
write, a template function used for storing the data to local memory. This function is used to guaran...
Definition: TensorContractionSycl.h:221
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::enable_if_t< PacketLoad, PacketType > read(const TensorMapper &tensorMapper, const StorageIndex &NCIndex, const StorageIndex &CIndex, const StorageIndex &ld)
read, a template function used for loading the data from global memory. This function is used to guar...
Definition: TensorContractionSycl.h:162
std::array< T, N > array
Definition: EmulateArray.h:231
double P
Uniform pressure.
Definition: TwenteMeshGluing.cpp:77
std::string string(const unsigned &i)
Definition: oomph_definitions.cc:286