Species.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 SPECIES_H
6 #define SPECIES_H
7 
8 #include "MixedSpecies.h"
9 #include "ParticleSpecies.h"
13 
14 class BaseInteraction;
15 
107 template<class NormalForceSpecies, class FrictionForceSpecies = EmptyFrictionSpecies, class AdhesiveForceSpecies = EmptyAdhesiveSpecies>
108 class Species final
110 {
111 public:
113 
122 
123 
126 
128  Species(const Species& s);
129 
131  virtual ~Species();
132 
137 
141  void copyInto(BaseSpecies* bs) const final;
142 
147  BaseSpecies* copyMixed() const final;
148 
150  void read(std::istream& is) final;
151 
153  void write(std::ostream& os) const final;
154 
156  std::string getName() const final;
157 
163  getNewInteraction(BaseInteractable* const P, BaseInteractable* const I, unsigned timeStamp) const final;
164 
165  //used to create a dummy for MPI purposes (I need a prototype of the interaction)
167 
168  void deleteEmptyInteraction(BaseInteraction* interaction) const final;
169 
173  bool getUseAngularDOFs() const final;
174 
178  void mixAll(BaseSpecies* const S, BaseSpecies* const T) final;
179 
180  void actionsAfterTimeStep(BaseParticle* particle) const final {
181  NormalForceSpecies::actionsAfterTimeStep(particle);
182  }
183 };
184 
185 template<class NormalForceSpecies, class FrictionForceSpecies, class AdhesiveForceSpecies>
188 {
189  normalForce_ = this;
190  frictionForce_ = this;
191  adhesiveForce_ = this;
195  logger(DEBUG, "Species::Species() finished");
196 }
197 
201 template<class NormalForceSpecies, class FrictionForceSpecies, class AdhesiveForceSpecies>
204 {
205  normalForce_ = this;
206  frictionForce_ = this;
207  adhesiveForce_ = this;
211  logger(DEBUG, "Species::Species(const Species &p) finished");
212 }
213 
214 template<class NormalForceSpecies, class FrictionForceSpecies, class AdhesiveForceSpecies>
216 {
217  logger(DEBUG, "Species::~Species() finished");
218 }
219 
227 template<class NormalForceSpecies, class FrictionForceSpecies, class AdhesiveForceSpecies>
230 ::copy() const
231 {
232  return new Species(*this);
233 }
234 
236 template<class NormalForceSpecies, class FrictionForceSpecies, class AdhesiveForceSpecies>
238 ::copyMixed() const
239 {
241 }
242 
252 template<class NormalForceSpecies, class FrictionForceSpecies, class AdhesiveForceSpecies>
255 {
256  if (bs == nullptr)
257  {
258  logger(WARN, "Error in %::copyInto: cannot copy into a nullptr");
259  return;
260  }
262  if (s == nullptr)
263  {
264  logger(WARN, "Error in %::copyInto: copying of species failed", getName());
265  return;
266  }
267  *s = *this;
268 }
269 
276 template<class NormalForceSpecies, class FrictionForceSpecies, class AdhesiveForceSpecies>
278 ::write(std::ostream& os) const
279 {
284 }
285 
289 template<class NormalForceSpecies, class FrictionForceSpecies, class AdhesiveForceSpecies>
291 {
296  // ensure that interaction distance is recomputed after restarting
297  AdhesiveForceSpecies::setInteractionDistance();
298 }
299 
314 template<class NormalForceSpecies, class FrictionForceSpecies, class AdhesiveForceSpecies>
316 {
317  return NormalForceSpecies::getBaseName()
318  + FrictionForceSpecies::getBaseName()
319  + AdhesiveForceSpecies::getBaseName() + "Species";
320 }
321 
330 template<class NormalForceSpecies, class FrictionForceSpecies, class AdhesiveForceSpecies>
333  BaseInteractable* const I,
334  unsigned timeStamp) const
335 {
336  return new InteractionType(P, I, timeStamp);
337 }
338 
339 template<class NormalForceSpecies, class FrictionForceSpecies, class AdhesiveForceSpecies>
341 {
343 }
344 
345 template<class NormalForceSpecies, class FrictionForceSpecies, class AdhesiveForceSpecies>
347  BaseInteraction* interaction) const
348 {
351  delete interactionDestroyer;
352 }
353 
360 template<class NormalForceSpecies, class FrictionForceSpecies, class AdhesiveForceSpecies>
362 {
363  return FrictionForceSpecies::getUseAngularDOFs();
364 }
365 
374 template<class NormalForceSpecies, class FrictionForceSpecies, class AdhesiveForceSpecies>
376  BaseSpecies* const T UNUSED)
377 {
378  logger(ERROR, "%::mix() This function should not be called", getName());
379 }
380 
381 #endif
std::string getName(int argc, char *argv[])
Definition: CombineParallelDataFiles.cpp:16
#define UNUSED
Definition: GeneralDefine.h:18
Logger< MERCURYDPM_LOGLEVEL > logger("MercuryKernel")
Definition of different loggers with certain modules. A user can define its own custom logger here.
LL< Log::ERROR > ERROR
Error log level.
Definition: Logger.cc:32
LL< Log::WARN > WARN
Warning log level.
Definition: Logger.cc:33
@ DEBUG
Defines a short-range (non-contact) force parallel to the contact normal, usually adhesive.
void setBaseSpecies(BaseSpecies *baseSpecies)
Definition: BaseForce.h:21
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
Definition: BaseParticle.h:33
BaseSpecies is the class from which all other species are derived.
Definition: BaseSpecies.h:29
BaseAdhesiveForce * adhesiveForce_
A pointer to the adhesive force parameters.
Definition: BaseSpecies.h:166
BaseFrictionForce * frictionForce_
A pointer to the friction force parameters.
Definition: BaseSpecies.h:159
BaseNormalForce * normalForce_
A pointer to the normal force parameters.
Definition: BaseSpecies.h:152
In case one doesn't want to have an adhesive (short range non contact) interaction between the intera...
Definition: EmptyAdhesiveInteraction.h:24
Defines a contact force orthogonal to the contact normal.
Contains information about the contact between two interactables, BaseInteraction::P_ and BaseInterac...
Definition: Interaction.h:95
Contains contact force properties for contacts between particles with two different species.
Definition: MixedSpecies.h:22
Defines a contact force parallel to the contact normal.
Definition: ParticleSpecies.h:16
void write(std::ostream &os) const override
Writes the species properties to an output stream.
Definition: ParticleSpecies.cc:57
void read(std::istream &is) override
Reads the species properties from an input stream.
Definition: ParticleSpecies.cc:69
Contains material and contact force properties.
Definition: Species.h:14
void write(std::ostream &os) const final
Writes the Species properties to an output stream.
Definition: Species.h:278
void mixAll(BaseSpecies *const S, BaseSpecies *const T) final
This function should not be called.
Definition: Species.h:375
BaseSpecies * copyMixed() const final
Creates a new MixedSpecies with the same force properties as the Species from which it is called.
Definition: Species.h:238
virtual ~Species()
The default destructor.
Definition: Species.h:215
void actionsAfterTimeStep(BaseParticle *particle) const final
Definition: Species.h:180
BaseInteraction * getEmptyInteraction() const final
Definition: Species.h:340
MixedSpecies< NormalForceSpecies, FrictionForceSpecies, AdhesiveForceSpecies > MixedSpeciesType
The correct MixedSpecies type for this Species.
Definition: Species.h:120
void copyInto(BaseSpecies *bs) const final
Definition: Species.h:254
bool getUseAngularDOFs() const final
Returns true if torques have to be calculated.
Definition: Species.h:361
Species< NormalForceSpecies, FrictionForceSpecies, AdhesiveForceSpecies > * copy() const final
Creates a deep copy of the Species from which it is called.
Definition: Species.h:230
Interaction< typename NormalForceSpecies::InteractionType, typename FrictionForceSpecies::InteractionType, typename AdhesiveForceSpecies::InteractionType > InteractionType
Definition: Species.h:121
Species()
The default constructor.
Definition: Species.h:186
void deleteEmptyInteraction(BaseInteraction *interaction) const final
Definition: Species.h:346
BaseInteraction * getNewInteraction(BaseInteractable *const P, BaseInteractable *const I, unsigned timeStamp) const final
When a contact between two particles is determined, an Interaction object is created,...
Definition: Species.h:332
Species(const Species &s)
The default copy constructor.
Definition: Species.h:202
void read(std::istream &is) final
Called by SpeciesHandler::readAndAddObject.
Definition: Species.h:290
std::string getName() const final
Returns the name of the Species as it is used in the restart file.
Definition: Species.h:315
RealScalar s
Definition: level1_cplx_impl.h:130
#define I
Definition: main.h:127
#define DEBUG
Definition: main.h:181
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
double P
Uniform pressure.
Definition: TwenteMeshGluing.cpp:77
std::string string(const unsigned &i)
Definition: oomph_definitions.cc:286
@ S
Definition: quadtree.h:62