SubcriticalMaserBoundary Class Reference

Variation on the PeriodicBoundary which also has an outflow part. More...

#include <SubcriticalMaserBoundary.h>

+ Inheritance diagram for SubcriticalMaserBoundary:

Public Member Functions

 SubcriticalMaserBoundary ()
 MaserBoundary constructor. More...
 
 SubcriticalMaserBoundary (const PeriodicBoundary &periodicBoundary)
 Maserboundary constructor that takes a periodic boundary, and converts it to a maser boundary. More...
 
SubcriticalMaserBoundarycopy () const override
 Creates a copy of this maser on the heap. More...
 
void set (Vec3D normal, Vec3D planewiseShift, Mdouble distanceLeft, Mdouble distanceRight)
 Sets all boundary properties at once and adds particles of the handler to the maser. This deactivates the Maser. More...
 
void set (Vec3D normal, Mdouble distanceLeft, Mdouble distanceRight)
 Sets the Maser's normal and positions, and sets the planewise shift to zero. This deactivates the Maser. More...
 
void setPlanewiseShift (Vec3D planewiseShift)
 Sets a planewise direction to the shift. Doesn't change the normal or the positions. More...
 
void setShift (Vec3D shift)
 Sets the shift of the Maser. Usually don't use this directly, use set() or setPlanewiseShift() instead. More...
 
void read (std::istream &is) override
 reads boundary properties from istream More...
 
void write (std::ostream &os) const override
 writes boundary properties to ostream More...
 
std::string getName () const override
 Returns the name of the object. More...
 
void createPeriodicParticle (BaseParticle *p, ParticleHandler &pH) override
 Creates periodic particles when the particle is a maser particle and is sufficiently close to one of the boundary walls. More...
 
void createPeriodicParticles (ParticleHandler &pH) override
 
bool checkBoundaryAfterParticleMoved (BaseParticle *p, ParticleHandler &pH) const
 Shifts the particle to its 'periodic' position if it is a maser particle and has crossed either of the walls. Creates a 'normal' particle at its current position if it is a maser particle which crossed the RIGHT boundary wall. More...
 
void checkBoundaryAfterParticlesMove (ParticleHandler &pH) override
 Evaluates what the particles have to do after they have changed position. More...
 
void addParticleToMaser (BaseParticle *p)
 Converts a 'normal' particle into a maser particle. More...
 
void removeParticleFromMaser (BaseParticle *p)
 Convert a maser particle into a 'normal' particle. More...
 
bool isMaserParticle (BaseParticle *p) const
 Returns true if the particle is a Maser particle, and false otherwise. More...
 
bool isNormalParticle (BaseParticle *p) const
 Returns true if the particle is a Normal particle, and false otherwise. More...
 
void actionsBeforeTimeLoop () override
 Does everything that needs to be done for this boundary between setupInitialConditions and the time loop, in this case, it activates the maser. More...
 
void activateMaser ()
 Opens the gap, and transforms particles to maser particles. Also calls turnOnCopying(). More...
 
void deactivateMaser ()
 Stops copying particles (and act merely as a chute) More...
 
Mdouble getDistanceLeft () const
 
Mdouble getDistanceRight () const
 
- Public Member Functions inherited from BaseBoundary
 BaseBoundary ()
 default constructor. More...
 
 BaseBoundary (const BaseBoundary &b)
 copy constructor More...
 
 ~BaseBoundary () override
 destructor More...
 
virtual void createPeriodicParticle (BaseParticle *p UNUSED, ParticleHandler &pH UNUSED)
 Creates a periodic particle in case of periodic boundaries in serial build. More...
 
virtual void createPeriodicParticles (ParticleHandler &pH UNUSED)
 Creates periodic copies of given particle in case of periodic boundaries. More...
 
virtual void checkBoundaryBeforeTimeStep (DPMBase *md)
 Virtual function that does things before each time step. More...
 
virtual void modifyGhostAfterCreation (BaseParticle *particle, int i)
 
virtual void writeVTK (std::fstream &file)
 
void setHandler (BoundaryHandler *handler)
 Sets the boundary's BoundaryHandler. More...
 
BoundaryHandlergetHandler () const
 Returns the boundary's BoundaryHandler. More...
 
- Public Member Functions inherited from BaseObject
 BaseObject ()=default
 Default constructor. More...
 
 BaseObject (const BaseObject &p)=default
 Copy constructor, copies all the objects BaseObject contains. More...
 
virtual ~BaseObject ()=default
 virtual destructor More...
 
virtual void moveInHandler (unsigned int index)
 Except that it is virtual, it does the same thing as setIndex() does. More...
 
void setIndex (unsigned int index)
 Allows one to assign an index to an object in the handler/container. More...
 
void setId (unsigned long id)
 Assigns a unique identifier to each object in the handler (container) which remains constant even after the object is deleted from the container/handler. More...
 
unsigned int getIndex () const
 Returns the index of the object in the handler. More...
 
unsigned int getId () const
 Returns the unique identifier of any particular object. More...
 
void setGroupId (unsigned groupId)
 
unsigned getGroupId () const
 

Protected Member Functions

void shiftPosition (BaseParticle *p) const
 Shifts the particle to its 'periodic' position. More...
 
BaseParticlecreateGhostCopy (BaseParticle *p) const
 Creates a copy of the input particle, that gets removed again in DPMBase::removeDuplicatePeriodicParticles. More...
 
bool isClosestToRightBoundary (const BaseParticle *const p) const
 Returns whether the given particle is closer to the right boundary of the periodic part. More...
 
Mdouble getDistance (BaseParticle *p) const
 Returns the distance of the wall to the particle. More...
 

Protected Attributes

Vec3D normal_
 Normal unit vector of both maser walls. Points in the flowing direction. More...
 
Mdouble distanceLeft_
 position of left boundary wall, s.t. normal*x=position_left More...
 
Mdouble distanceRight_
 position of right boundary wall, s.t. normal*x=position_right More...
 
Vec3D shift_
 Direction in which particles are to be shifted when they cross the boundary. More...
 
std::map< const ParticleSpecies *, const ParticleSpecies * > speciesConversionNormalToMaser_
 List of 'normal' particles' species, and their maser counterparts. More...
 
std::map< const ParticleSpecies *, const ParticleSpecies * > speciesConversionMaserToNormal_
 List of 'maser' particles' species, and their normal counterparts. More...
 
bool maserIsActivated_
 Flag whether or not the gap is created and particles transformed already. More...
 

Detailed Description

Variation on the PeriodicBoundary which also has an outflow part.

Creates a boundary which divides the domain into two parts: a periodic domain and an outflow domain. Any particle flowing through the right of the periodic domain is moved to both the left side of the periodic domain (as with a PeriodicBoundary), and also copied the left side of the outflow domain. Furthermore, the particles near the right side of the periodic domain also exert forces on the left side of the outflow domain, and vice versa. The left side of the periodic domain does not influence the right side of the periodic domain. When a particle in the outflow domain tries to enter the periodic domain, it gets removed. If a particle tries to leave the periodic domain to the left, it gets removed.

The difference between SubcriticalMaserBoundary (formerly known as MaserBoundaryOldStyle) and ConstantMassFlowMaserBoundary (formerly known simply as MaserBoundary) is that in ConstantMassFlowMaserBoundary, the left hand side of the periodic box does not have any influence on the rest of the flow, but the right side of the periodic box and the left side of the outflow domain interact. The ConstantMassFlowMaserBoundary is most useful for fast (supercritical) flows, and for flows for which the flux across the boundary needs to be controlled. The SubcriticalMaserBoundary is more useful for slow flows, as the ConstantMassFlowMaserBoundary might generate "pulse-waves" in those cases.

For a compact overview of the behaviour of SubcriticalMaserBoundary, please look at the output of SubcriticalMaserBoundarySelfTest.

Todo:
Which Maser is it used in Denissen2019? To cite the Maser: I. F. C. Denissen, T. Weinhart, A. Te Voortwis, S. Luding, J. M. N. T. Gray and A. R. Thornton, Bulbous head formation in bidisperse shallow granular flow over an inclined plane. Journal of Fluid Mechanics, 866:263–297, mar 2019.

Constructor & Destructor Documentation

◆ SubcriticalMaserBoundary() [1/2]

SubcriticalMaserBoundary::SubcriticalMaserBoundary ( )

MaserBoundary constructor.

MaserBoundary constructor, sets all scalars to non-sensible values.

34 {
35 #ifdef MERCURYDPM_USE_MPI
36  logger(WARN,"Make sure the whole maser boundary is on one processor when using parallel code");
37 #endif
38  distanceLeft_ = std::numeric_limits<double>::quiet_NaN();
39  distanceRight_ = std::numeric_limits<double>::quiet_NaN();
40  maserIsActivated_ = false;
41 }
Logger< MERCURYDPM_LOGLEVEL > logger("MercuryKernel")
Definition of different loggers with certain modules. A user can define its own custom logger here.
@ WARN
Mdouble distanceRight_
position of right boundary wall, s.t. normal*x=position_right
Definition: SubcriticalMaserBoundary.h:242
Mdouble distanceLeft_
position of left boundary wall, s.t. normal*x=position_left
Definition: SubcriticalMaserBoundary.h:237
bool maserIsActivated_
Flag whether or not the gap is created and particles transformed already.
Definition: SubcriticalMaserBoundary.h:266

References distanceLeft_, distanceRight_, logger, maserIsActivated_, and WARN.

Referenced by copy().

◆ SubcriticalMaserBoundary() [2/2]

SubcriticalMaserBoundary::SubcriticalMaserBoundary ( const PeriodicBoundary periodicBoundary)
explicit

Maserboundary constructor that takes a periodic boundary, and converts it to a maser boundary.

MaserBoundary constructor from a periodic boundary. It copies the properties of the periodic boundary, and then immediately opens the maser. Do not insert particles for the maser after this constructor.

Parameters
[in]periodicBoundaryThe periodic boundary on which this maser boundary is based.
48  : BaseBoundary(
49  periodicBoundary)
50 {
51  logger(INFO, "Constructor SubcriticalMaserBoundary(const PeriodicBoundary&) started");
52  distanceLeft_ = periodicBoundary.getDistanceLeft();
53  distanceRight_ = periodicBoundary.getDistanceRight();
54  normal_ = periodicBoundary.getNormal();
55  shift_ = periodicBoundary.getShift();
56  maserIsActivated_ = false;
57 
58  logger(INFO, "going to activate the maser");
59  //assume that the maser should be activated immediately when it gets constructed from a periodic boundary
60  activateMaser();
61 }
@ INFO
BaseBoundary()
default constructor.
Definition: BaseBoundary.cc:32
Vec3D getShift() const
Returns the vector going from the left to the right side of the periodic boundary.
Definition: PeriodicBoundary.cc:159
Mdouble getDistanceRight() const
Returns the distance of the right wall to the origin, in normal direction.
Definition: PeriodicBoundary.cc:151
Mdouble getDistanceLeft() const
Returns the distance of the left wall to the origin, in normal direction.
Definition: PeriodicBoundary.cc:143
Vec3D getNormal() const
returns the vector normal to the periodic boundary
Definition: PeriodicBoundary.cc:135
Vec3D normal_
Normal unit vector of both maser walls. Points in the flowing direction.
Definition: SubcriticalMaserBoundary.h:232
Vec3D shift_
Direction in which particles are to be shifted when they cross the boundary.
Definition: SubcriticalMaserBoundary.h:251
void activateMaser()
Opens the gap, and transforms particles to maser particles. Also calls turnOnCopying().
Definition: SubcriticalMaserBoundary.cc:406

References activateMaser(), distanceLeft_, distanceRight_, PeriodicBoundary::getDistanceLeft(), PeriodicBoundary::getDistanceRight(), PeriodicBoundary::getNormal(), PeriodicBoundary::getShift(), INFO, logger, maserIsActivated_, normal_, and shift_.

Member Function Documentation

◆ actionsBeforeTimeLoop()

void SubcriticalMaserBoundary::actionsBeforeTimeLoop ( )
overridevirtual

Does everything that needs to be done for this boundary between setupInitialConditions and the time loop, in this case, it activates the maser.

The maser boundary should be activated before the time loop starts, but after all particles are added.

Reimplemented from BaseBoundary.

395 {
396  activateMaser();
397 }

References activateMaser().

◆ activateMaser()

void SubcriticalMaserBoundary::activateMaser ( )

Opens the gap, and transforms particles to maser particles. Also calls turnOnCopying().

Activate the maser by creating a gap betweeen the periodic domain and the outflow domain, and transforming all the particles in the domain to maser particles. For an explanation of the magic number 6, see the detailed documentation for gapSize_. Note that gapSize_ is set here and not in set, since it is possible that the user first adds boundaries to the domain before the particles. The maser boundary should only be activated after all particles are in.

407 {
408  if (!maserIsActivated_)
409  {
410  logger(INFO, "Going to add particles to the maser and shift the periodic maser boundaries");
412  logger(INFO, "just before particle loop");
413  for (BaseParticle* const p : pH)
414  {
415  if (getDistance(p) > 0)
416  {
418  }
419  }
420  maserIsActivated_ = true;
421  }
422  else
423  {
424  logger(WARN, "Cannot activate the maser boundary twice!");
425  }
426 }
BoundaryHandler * getHandler() const
Returns the boundary's BoundaryHandler.
Definition: BaseBoundary.cc:143
DPMBase * getDPMBase()
Gets the problem that is solved using this handler.
Definition: BaseHandler.h:725
Definition: BaseParticle.h:54
ParticleHandler particleHandler
An object of the class ParticleHandler, contains the pointers to all the particles created.
Definition: DPMBase.h:1437
Container to store all BaseParticle.
Definition: ParticleHandler.h:48
Mdouble getDistance(BaseParticle *p) const
Returns the distance of the wall to the particle.
Definition: SubcriticalMaserBoundary.h:223
void addParticleToMaser(BaseParticle *p)
Converts a 'normal' particle into a maser particle.
Definition: SubcriticalMaserBoundary.cc:315

References addParticleToMaser(), getDistance(), BaseHandler< T >::getDPMBase(), BaseBoundary::getHandler(), INFO, logger, maserIsActivated_, DPMBase::particleHandler, and WARN.

Referenced by actionsBeforeTimeLoop(), and SubcriticalMaserBoundary().

◆ addParticleToMaser()

void SubcriticalMaserBoundary::addParticleToMaser ( BaseParticle p)

Converts a 'normal' particle into a maser particle.

Turns given particle into a 'maser particle' by changing its species into a 'maser particle' copy species. If the particle species is not yet in the std::map speciesConversionNormalToMaser_, it and its maser copy species are added. This function should be called at the beginning of the simulation, right after actually filling the maser with particles, flagging each particle as one belonging to the maser.

Parameters
[in,out]pThe particle which is added to the maser. Its species is 'changed' to the maser copy species.
316 {
317  // check if particle species already known by the maser
318  auto conversion = speciesConversionNormalToMaser_.find(p->getSpecies());
319  if (conversion != speciesConversionNormalToMaser_.end())
320  {
321  //species known and flagged (i.e. 'converted')
322  logger(VERBOSE, "[SubcriticalMaserBoundary::addParticleToMaser()] Species conversion already present");
323  p->setSpecies(conversion->second);
324  }
325  else
326  {
327  SpeciesHandler& speciesHandler = (getHandler()->getDPMBase()->speciesHandler);
328  // species is not yet known by the maser, it has to be added to both maps
329  ParticleSpecies* newSpecies = speciesHandler.copyAndAddObject(*(p->getSpecies()));
331  std::pair<const ParticleSpecies*, const ParticleSpecies*>(p->getSpecies(), newSpecies));
333  std::pair<const ParticleSpecies*, const ParticleSpecies*>(newSpecies, p->getSpecies()));
334  logger(INFO, "[SubcriticalMaserBoundary::addParticleToMaser()] New species conversion created");
335  logger(INFO, "Original species ID: %, new species ID: %", p->getSpecies()->getId(), newSpecies->getId());
336 
337  //Copy over the mixed species. The delete is necessary here since it is overwritten with a copy of the old mixed
338  //species, and otherwise the properties are not copied over correctly.
339  //
340  //setId and setIndex refer to the two different species which are present in this mixed species.
341  //The highest species-index should appear first and is therefore the ID, while the second species-index is the
342  //"index" of the mixed species.
343  for (const BaseSpecies* const s : speciesHandler)
344  {
345  if (s->getId() != newSpecies->getId() && s->getId() != p->getSpecies()->getId())
346  {
347  BaseSpecies* newMixed = speciesHandler.getMixedObject(s->getId(), newSpecies->getId());
348  delete newMixed;
349  const BaseSpecies* const oldMixed = speciesHandler.getMixedObject(s->getId(), p->getSpecies()->getId());
350  newMixed = oldMixed->copy();
351  newMixed->setId(newSpecies->getId());
352  newMixed->setIndex(s->getId());
353  logger(DEBUG, "mixed species of % and % is now \n %, should be \n %", s->getId(), newSpecies->getId(),
354  *newMixed, *oldMixed);
355  }
356  }
357 
358  // now the species IS added, so flag (convert) it!
359  p->setSpecies(newSpecies);
360  }
361 }
@ DEBUG
@ VERBOSE
std::enable_if<!std::is_pointer< U >::value, U * >::type copyAndAddObject(const U &object)
Creates a copy of a Object and adds it to the BaseHandler.
Definition: BaseHandler.h:379
const ParticleSpecies * getSpecies() const
Returns a pointer to the species of this BaseInteractable.
Definition: BaseInteractable.h:108
unsigned int getId() const
Returns the unique identifier of any particular object.
Definition: BaseObject.h:125
void setIndex(unsigned int index)
Allows one to assign an index to an object in the handler/container.
Definition: BaseObject.cc:64
void setId(unsigned long id)
Assigns a unique identifier to each object in the handler (container) which remains constant even aft...
Definition: BaseObject.cc:72
void setSpecies(const ParticleSpecies *species)
Definition: BaseParticle.cc:818
BaseSpecies is the class from which all other species are derived.
Definition: BaseSpecies.h:50
virtual BaseSpecies * copy() const =0
Creates a deep copy of the object from which it is called.
SpeciesHandler speciesHandler
A handler to that stores the species type i.e. LinearViscoelasticSpecies, etc.
Definition: DPMBase.h:1427
Definition: ParticleSpecies.h:37
Container to store all ParticleSpecies.
Definition: SpeciesHandler.h:37
std::map< const ParticleSpecies *, const ParticleSpecies * > speciesConversionMaserToNormal_
List of 'maser' particles' species, and their normal counterparts.
Definition: SubcriticalMaserBoundary.h:261
std::map< const ParticleSpecies *, const ParticleSpecies * > speciesConversionNormalToMaser_
List of 'normal' particles' species, and their maser counterparts.
Definition: SubcriticalMaserBoundary.h:256

References BaseSpecies::copy(), BaseHandler< T >::copyAndAddObject(), DEBUG, BaseHandler< T >::getDPMBase(), BaseBoundary::getHandler(), BaseObject::getId(), SpeciesHandler::getMixedObject(), BaseInteractable::getSpecies(), INFO, logger, BaseObject::setId(), BaseObject::setIndex(), BaseParticle::setSpecies(), speciesConversionMaserToNormal_, speciesConversionNormalToMaser_, DPMBase::speciesHandler, and VERBOSE.

Referenced by activateMaser().

◆ checkBoundaryAfterParticleMoved()

bool SubcriticalMaserBoundary::checkBoundaryAfterParticleMoved ( BaseParticle p,
ParticleHandler pH 
) const

Shifts the particle to its 'periodic' position if it is a maser particle and has crossed either of the walls. Creates a 'normal' particle at its current position if it is a maser particle which crossed the RIGHT boundary wall.

Checks whether a given particle (a) is in the Maser and (b) has crossed the closest wall. If so, shifts its position so as to have it appear at the other wall, and creates a 'real' equivalent in the outflow domain.

Parameters
[in]pThe particle to be checked and possibly shifted and copied
pHThe ParticleHandler, which is unused in this implementation
Returns
Returns true if particle p has interacted with the boundary, false otherwise
272 {
273  // check if particle passed either of the boundary walls
274  if (isMaserParticle(p) && getDistance(p) < 0)
275  {
276  // Checks if the particle is closest to the right boundary.
277  // If so, and if the Maser is turned on, then create a 'real'
278  // equivalent and move it over to the outflow domain
280  {
281  BaseParticle* pCopy = p->copy();
282  pCopy->setSpecies(speciesConversionMaserToNormal_.find(p->getSpecies())->second);
283  pH.addObject(pCopy);
284 
285  // If the (original) particle has crossed a right boundary,
286  // then shift that particle periodically.
287  shiftPosition(p);
288  }
289  else if (!maserIsActivated_)
290  {
291  shiftPosition(p);
292  }
293  }
294  return false;
295 }
virtual BaseParticle * copy() const =0
Particle copy method. It calls to copy constructor of this Particle, useful for polymorphism.
void addObject(BaseParticle *P) override
Adds a BaseParticle to the ParticleHandler.
Definition: ParticleHandler.cc:171
bool isClosestToRightBoundary(const BaseParticle *const p) const
Returns whether the given particle is closer to the right boundary of the periodic part.
Definition: SubcriticalMaserBoundary.h:211
bool isMaserParticle(BaseParticle *p) const
Returns true if the particle is a Maser particle, and false otherwise.
Definition: SubcriticalMaserBoundary.cc:373
void shiftPosition(BaseParticle *p) const
Shifts the particle to its 'periodic' position.
Definition: SubcriticalMaserBoundary.cc:172

References ParticleHandler::addObject(), BaseParticle::copy(), getDistance(), BaseInteractable::getSpecies(), isClosestToRightBoundary(), isMaserParticle(), maserIsActivated_, BaseParticle::setSpecies(), shiftPosition(), and speciesConversionMaserToNormal_.

Referenced by checkBoundaryAfterParticlesMove().

◆ checkBoundaryAfterParticlesMove()

void SubcriticalMaserBoundary::checkBoundaryAfterParticlesMove ( ParticleHandler pH)
overridevirtual

Evaluates what the particles have to do after they have changed position.

Reimplemented from BaseBoundary.

298 {
299  for (BaseParticle* p : pH)
300  {
302  }
303 }
bool checkBoundaryAfterParticleMoved(BaseParticle *p, ParticleHandler &pH) const
Shifts the particle to its 'periodic' position if it is a maser particle and has crossed either of th...
Definition: SubcriticalMaserBoundary.cc:271

References checkBoundaryAfterParticleMoved().

◆ copy()

SubcriticalMaserBoundary * SubcriticalMaserBoundary::copy ( ) const
overridevirtual

Creates a copy of this maser on the heap.

Copy method, creates a copy of the object on the heap and returns a pointer to it.

Returns
pointer to the copy

Implements BaseBoundary.

69 {
70  return new SubcriticalMaserBoundary(*this);
71 }
SubcriticalMaserBoundary()
MaserBoundary constructor.
Definition: SubcriticalMaserBoundary.cc:33

References SubcriticalMaserBoundary().

◆ createGhostCopy()

BaseParticle * SubcriticalMaserBoundary::createGhostCopy ( BaseParticle p) const
protected

Creates a copy of the input particle, that gets removed again in DPMBase::removeDuplicatePeriodicParticles.

Helper function for createPeriodicParticles. It makes a copy of the particle p, and labels the copy as a ghost particle. Same function as in PeriodicBoundary.

Parameters
[in]pParticle that needs to be copied
Returns
Copy of particle p, labeled as a ghost particle
247 {
248  // Copy the particle and its interactions
249  BaseParticle* pGhost = p->copy();
251 
252  //Set the 'last' particle. If Particle is multiply shifted, get correct original particle
253  BaseParticle* last = p;
254  while (last->getPeriodicFromParticle() != nullptr)
255  {
256  last = last->getPeriodicFromParticle();
257  }
258  pGhost->setPeriodicFromParticle(last);
259  return pGhost;
260 }
void copyInteractionsForPeriodicParticles(const BaseInteractable &p)
Copies interactions to this BaseInteractable whenever a periodic copy made.
Definition: BaseInteractable.cc:386
void setPeriodicFromParticle(BaseParticle *p)
Assigns the pointer to the 'original' particle this one's a periodic copy of (used in periodic bounda...
Definition: BaseParticle.h:441
BaseParticle * getPeriodicFromParticle() const
Returns the 'original' particle this one's a periodic copy of.
Definition: BaseParticle.h:341

References BaseParticle::copy(), BaseInteractable::copyInteractionsForPeriodicParticles(), BaseParticle::getPeriodicFromParticle(), and BaseParticle::setPeriodicFromParticle().

Referenced by createPeriodicParticle().

◆ createPeriodicParticle()

void SubcriticalMaserBoundary::createPeriodicParticle ( BaseParticle p,
ParticleHandler pH 
)
override

Creates periodic particles when the particle is a maser particle and is sufficiently close to one of the boundary walls.

Checks the distance of given particle to the closest of both walls, and creates a periodic copy of the particle if needed (i.e. if the particle is closer to the periodic wall than the radius of the largest particle in the system). Note that this is the same function as in PeriodicBoundary, but with the extra check to make sure that only maser particles on the right side of the domain are periodic particles, to prevent double forces on the right side of the periodic domain.

Parameters
[in]pParticle to be checked and possibly periodically copied
[in,out]pHSystem's ParticleHandler, (1) from which the interaction radius of its largest particle is retrieved to determine the maximum distance from the wall at which a particle should still have a periodic copy created, and (2) to which a possible periodic copy of the particle will be added
199 {
201  {
202  // check if particle is near the boundaries of the maser domain
203  const Mdouble periodicDistance = p->getMaxInteractionRadius() + 2.0* pH.getLargestParticle()->getMaxInteractionRadius();
204  if (getDistance(p) < periodicDistance)
205  {
206  //furthermore, if the particle is on the right it has to be copied over to the outflow domain
208  {
209  BaseParticle* pGhost = createGhostCopy(p);
210 
211  // shift to the periodic location
212  shiftPosition(pGhost);
213 
214  // add the periodic particle to the handler
215  pH.addObject(pGhost);
216  }
217  else if (!maserIsActivated_)
218  {
219  BaseParticle* pGhost = createGhostCopy(p);
220 
221  // shift to the periodic location
222  shiftPosition(pGhost);
223 
224  // add the periodic particle to the handler
225  pH.addObject(pGhost);
226  }
227  }
228  }
229 }
double Mdouble
Definition: GeneralDefine.h:34
Mdouble getMaxInteractionRadius() const
Returns the particle's interaction radius, which might be different from radius_ (e....
Definition: BaseParticle.h:362
BaseParticle * getLargestParticle() const
Returns the pointer of the largest particle in the particle handler. When mercury is running in paral...
Definition: ParticleHandler.cc:534
BaseParticle * createGhostCopy(BaseParticle *p) const
Creates a copy of the input particle, that gets removed again in DPMBase::removeDuplicatePeriodicPart...
Definition: SubcriticalMaserBoundary.cc:246

References ParticleHandler::addObject(), createGhostCopy(), getDistance(), ParticleHandler::getLargestParticle(), BaseParticle::getMaxInteractionRadius(), isClosestToRightBoundary(), isMaserParticle(), maserIsActivated_, and shiftPosition().

Referenced by createPeriodicParticles().

◆ createPeriodicParticles()

void SubcriticalMaserBoundary::createPeriodicParticles ( ParticleHandler pH)
override
232 {
233  unsigned numberOfParticles = pH.getSize();
234  for (unsigned i = 0; i < numberOfParticles; i++)
235  {
237  }
238 }
unsigned int getSize() const
Gets the size of the particleHandler (including mpi and periodic particles)
Definition: BaseHandler.h:655
T * getObject(const unsigned int id)
Gets a pointer to the Object at the specified index in the BaseHandler.
Definition: BaseHandler.h:613
void createPeriodicParticle(BaseParticle *p, ParticleHandler &pH) override
Creates periodic particles when the particle is a maser particle and is sufficiently close to one of ...
Definition: SubcriticalMaserBoundary.cc:198
const std::complex< Mdouble > i
Definition: ExtendedMath.h:51

References createPeriodicParticle(), BaseHandler< T >::getObject(), BaseHandler< T >::getSize(), and constants::i.

◆ deactivateMaser()

void SubcriticalMaserBoundary::deactivateMaser ( )

Stops copying particles (and act merely as a chute)

closing the maser: do exactly the opposite of activating the maser: close the gap by moving all particles, and assign the "normal" species to all maser particles again.

431 {
432  if (maserIsActivated_)
433  {
434  for (BaseParticle* const p : getHandler()->getDPMBase()->particleHandler)
435  {
436  if (getDistance(p) > 0)
437  {
439  }
440  }
441  maserIsActivated_ = false;
442  logger(INFO, "The Maser is no longer copying particles.");
443  }
444  else
445  {
446  logger(WARN, "Cannot close the maser if it is not active");
447  }
448 }
void removeParticleFromMaser(BaseParticle *p)
Convert a maser particle into a 'normal' particle.
Definition: SubcriticalMaserBoundary.cc:363

References getDistance(), BaseBoundary::getHandler(), INFO, logger, maserIsActivated_, removeParticleFromMaser(), and WARN.

◆ getDistance()

Mdouble SubcriticalMaserBoundary::getDistance ( BaseParticle p) const
inlineprotected

Returns the distance of the wall to the particle.

Parameters
[in]pPointer to the particle of which we want to know the distance to the wall to
Returns
Distance of the particle to the boundary: positive means the particle is inside the periodic part of the boundary, negative means it's outside.
224  {
225  const Mdouble distance = Vec3D::dot(p->getPosition(), normal_);
226  return std::min(distance - distanceLeft_, distanceRight_ - distance);
227  }
const Vec3D & getPosition() const
Returns the position of this BaseInteractable.
Definition: BaseInteractable.h:218
static Mdouble dot(const Vec3D &a, const Vec3D &b)
Calculates the dot product of two Vec3D: .
Definition: Vector.cc:76

References distanceLeft_, distanceRight_, Vec3D::dot(), BaseInteractable::getPosition(), and normal_.

Referenced by activateMaser(), checkBoundaryAfterParticleMoved(), createPeriodicParticle(), and deactivateMaser().

◆ getDistanceLeft()

Mdouble SubcriticalMaserBoundary::getDistanceLeft ( ) const
451 {
452  return distanceLeft_;
453 }

References distanceLeft_.

◆ getDistanceRight()

Mdouble SubcriticalMaserBoundary::getDistanceRight ( ) const
456 {
457  return distanceRight_;
458 }

References distanceRight_.

◆ getName()

std::string SubcriticalMaserBoundary::getName ( ) const
overridevirtual

Returns the name of the object.

Returns the name of the object class

Returns
the object's class' name, i.e. 'MaserBoundary'

Implements BaseObject.

164 {
165  return "SubcriticalMaserBoundary";
166 }

◆ isClosestToRightBoundary()

bool SubcriticalMaserBoundary::isClosestToRightBoundary ( const BaseParticle *const  p) const
inlineprotected

Returns whether the given particle is closer to the right boundary of the periodic part.

Parameters
[in]pParticle for which we would like to know whether it is closest to the right boundary
Returns
True if p is closer to the right boundary, false otherwise
212  {
213  const Mdouble distance = Vec3D::dot(p->getPosition(), normal_);
214  return (distanceRight_ - distance < distance - distanceLeft_);
215  }

References distanceLeft_, distanceRight_, Vec3D::dot(), BaseInteractable::getPosition(), and normal_.

Referenced by checkBoundaryAfterParticleMoved(), createPeriodicParticle(), and shiftPosition().

◆ isMaserParticle()

bool SubcriticalMaserBoundary::isMaserParticle ( BaseParticle p) const

Returns true if the particle is a Maser particle, and false otherwise.

One checks if the particle is in the Maser, by checking whether its species is found in the list of maser particle species

374 {
375  // Check if the particle is in the Maser, by checking whether its
376  // species is found in the list of maser particle species
377  auto positionMaserSpeciesInMap = speciesConversionMaserToNormal_.find(p->getSpecies());
378  return (positionMaserSpeciesInMap != speciesConversionMaserToNormal_.end()); //Test if it is a maser particle
379 }

References BaseInteractable::getSpecies(), and speciesConversionMaserToNormal_.

Referenced by checkBoundaryAfterParticleMoved(), and createPeriodicParticle().

◆ isNormalParticle()

bool SubcriticalMaserBoundary::isNormalParticle ( BaseParticle p) const

Returns true if the particle is a Normal particle, and false otherwise.

One checks if the particle is a normal particle, by checking whether the species changes when we do speciesConversionNormalToMaser_().

386 {
387  auto toFindOutflowSpecies = speciesConversionNormalToMaser_.find(p->getSpecies());
388  return (toFindOutflowSpecies != speciesConversionNormalToMaser_.end());
389 }

References BaseInteractable::getSpecies(), and speciesConversionNormalToMaser_.

◆ read()

void SubcriticalMaserBoundary::read ( std::istream &  is)
overridevirtual

reads boundary properties from istream

Reads the boundary properties from an istream

Parameters
[in,out]isthe istream from which the boundary must be read

Implements BaseBoundary.

117 {
118  BaseBoundary::read(is);
119  std::string dummy;
120  is >> dummy >> normal_
121  >> dummy >> distanceLeft_
122  >> dummy >> distanceRight_
123  >> dummy >> shift_
124  >> dummy >> maserIsActivated_;
125  unsigned int n;
126  is >> dummy >> n;
127  const SpeciesHandler& speciesHandler = getHandler()->getDPMBase()->speciesHandler;
128  for (unsigned int i = 0; i < n; ++i)
129  {
130  unsigned int key;
131  unsigned int value;
132  is >> dummy >> key >> dummy >> value;
133  speciesConversionNormalToMaser_[speciesHandler.getObject(key)] = speciesHandler.getObject(value);
134  speciesConversionMaserToNormal_[speciesHandler.getObject(value)] = speciesHandler.getObject(key);
135  }
136  logger(DEBUG, "Finished reading SubcriticalMaserBoundary. \nNormal: % \nDistanceLeft: % \nDistanceRight: % "
137  ": % \nMaserIsActivated: %", normal_, distanceLeft_, distanceRight_, maserIsActivated_);
138 }
const unsigned n
Definition: CG3DPackingUnitTest.cpp:32
void read(std::istream &is) override=0
Reads the object's id_ from given istream NB: purely virtual function, overriding the version of Base...
Definition: BaseBoundary.cc:61

References DEBUG, distanceLeft_, distanceRight_, BaseHandler< T >::getDPMBase(), BaseBoundary::getHandler(), BaseHandler< T >::getObject(), constants::i, logger, maserIsActivated_, n, normal_, BaseBoundary::read(), shift_, speciesConversionMaserToNormal_, speciesConversionNormalToMaser_, and DPMBase::speciesHandler.

◆ removeParticleFromMaser()

void SubcriticalMaserBoundary::removeParticleFromMaser ( BaseParticle p)

Convert a maser particle into a 'normal' particle.

364 {
365  auto conversion = speciesConversionMaserToNormal_.find(p->getSpecies());
366  p->setSpecies(conversion->second);
367 }

References BaseInteractable::getSpecies(), BaseParticle::setSpecies(), and speciesConversionMaserToNormal_.

Referenced by deactivateMaser().

◆ set() [1/2]

void SubcriticalMaserBoundary::set ( Vec3D  normal,
Mdouble  distanceLeft,
Mdouble  distanceRight 
)

Sets the Maser's normal and positions, and sets the planewise shift to zero. This deactivates the Maser.

Set all the properties of the boundary at once.

Parameters
[in]normalNormal unit vector of the (parallel) boundary walls
[in]distanceLeftThe distance of the left wall to the origin
[in]distanceRightThe distance of the right wall to the origin
86 {
87  // factor is used to set normal to unit length
88  Mdouble scaleFactor_ = 1. / std::sqrt(Vec3D::dot(normal, normal));
89  normal_ = normal * scaleFactor_;
90  distanceLeft_ = distanceLeft * scaleFactor_;
91  distanceRight_ = distanceRight * scaleFactor_;
93  maserIsActivated_ = false;
94 }

References distanceLeft_, distanceRight_, Vec3D::dot(), maserIsActivated_, normal_, and shift_.

◆ set() [2/2]

void SubcriticalMaserBoundary::set ( Vec3D  normal,
Vec3D  planewiseShift,
Mdouble  distanceLeft,
Mdouble  distanceRight 
)

Sets all boundary properties at once and adds particles of the handler to the maser. This deactivates the Maser.

74 {
75  set(normal, distanceLeft, distanceRight);
76  setPlanewiseShift(planewiseShift);
77 }
void set(Vec3D normal, Vec3D planewiseShift, Mdouble distanceLeft, Mdouble distanceRight)
Sets all boundary properties at once and adds particles of the handler to the maser....
Definition: SubcriticalMaserBoundary.cc:73
void setPlanewiseShift(Vec3D planewiseShift)
Sets a planewise direction to the shift. Doesn't change the normal or the positions.
Definition: SubcriticalMaserBoundary.cc:101

References setPlanewiseShift().

Referenced by ChuteWithWedge::setupInitialConditions(), and SubcriticalMaserBoundarySelfTest::setupInitialConditions().

◆ setPlanewiseShift()

void SubcriticalMaserBoundary::setPlanewiseShift ( Vec3D  planewiseShift)

Sets a planewise direction to the shift. Doesn't change the normal or the positions.

Sets the shift_ vector through setting the planewise shift. We delete the component of planewiseShift that is parallel to normal_. Allows Lees–Edwards type Masers.

102 {
103  planewiseShift -= Vec3D::dot(planewiseShift, normal_) / Vec3D::dot(normal_, normal_) * normal_;
104  shift_ = normal_ * (distanceRight_ - distanceLeft_) + planewiseShift;
105 }

References distanceLeft_, distanceRight_, Vec3D::dot(), normal_, and shift_.

Referenced by set().

◆ setShift()

void SubcriticalMaserBoundary::setShift ( Vec3D  shift)

Sets the shift of the Maser. Usually don't use this directly, use set() or setPlanewiseShift() instead.

108 {
109  shift_ = shift;
110 }

References shift_.

◆ shiftPosition()

void SubcriticalMaserBoundary::shiftPosition ( BaseParticle p) const
protected

Shifts the particle to its 'periodic' position.

Shifts the particle (using the closestToLeftBoundary_ value)

Parameters
[in]pA pointer to the particle which will be shifted.
173 {
175  {
176  p->move(-shift_);
177  }
178  else // if closest to right boundary
179  {
180  p->move(shift_);
181  }
182 }
virtual void move(const Vec3D &move)
Moves this BaseInteractable by adding an amount to the position.
Definition: BaseInteractable.cc:215

References isClosestToRightBoundary(), BaseInteractable::move(), and shift_.

Referenced by checkBoundaryAfterParticleMoved(), and createPeriodicParticle().

◆ write()

void SubcriticalMaserBoundary::write ( std::ostream &  os) const
overridevirtual

writes boundary properties to ostream

Writes boundary's properties to an ostream

Parameters
[in]osthe ostream to which the boundary must be written

Implements BaseBoundary.

145 {
147  os << " normal " << normal_
148  << " distanceLeft " << distanceLeft_
149  << " distanceRight " << distanceRight_
150  << " shift " << shift_
151  << " maserIsActivated " << maserIsActivated_
152  << " numberOfMaserSpecies " << speciesConversionMaserToNormal_.size();
153  for (auto p : speciesConversionNormalToMaser_)
154  {
155  os << " outflowSpeciesIndex " << p.first->getIndex() << " maserSpeciesIndex " << p.second->getIndex();
156  }
157 }
void write(std::ostream &os) const override=0
Adds object's id_ to given ostream NB: purely virtual function, overriding the version of BaseObject.
Definition: BaseBoundary.cc:70

References distanceLeft_, distanceRight_, maserIsActivated_, normal_, shift_, speciesConversionMaserToNormal_, speciesConversionNormalToMaser_, and BaseBoundary::write().

Member Data Documentation

◆ distanceLeft_

Mdouble SubcriticalMaserBoundary::distanceLeft_
protected

position of left boundary wall, s.t. normal*x=position_left

Referenced by getDistance(), getDistanceLeft(), isClosestToRightBoundary(), read(), set(), setPlanewiseShift(), SubcriticalMaserBoundary(), and write().

◆ distanceRight_

Mdouble SubcriticalMaserBoundary::distanceRight_
protected

position of right boundary wall, s.t. normal*x=position_right

Referenced by getDistance(), getDistanceRight(), isClosestToRightBoundary(), read(), set(), setPlanewiseShift(), SubcriticalMaserBoundary(), and write().

◆ maserIsActivated_

bool SubcriticalMaserBoundary::maserIsActivated_
protected

Flag whether or not the gap is created and particles transformed already.

Referenced by activateMaser(), checkBoundaryAfterParticleMoved(), createPeriodicParticle(), deactivateMaser(), read(), set(), SubcriticalMaserBoundary(), and write().

◆ normal_

Vec3D SubcriticalMaserBoundary::normal_
protected

Normal unit vector of both maser walls. Points in the flowing direction.

Referenced by getDistance(), isClosestToRightBoundary(), read(), set(), setPlanewiseShift(), SubcriticalMaserBoundary(), and write().

◆ shift_

Vec3D SubcriticalMaserBoundary::shift_
protected

Direction in which particles are to be shifted when they cross the boundary.

I.e., the vector pointing from a point the left boundary wall to the equivalent point on the right one.

By default this is equal to normal_ * (distanceRight_ - distanceLeft_) but you can also set a planewise direction to the shift.

Referenced by read(), set(), setPlanewiseShift(), setShift(), shiftPosition(), SubcriticalMaserBoundary(), and write().

◆ speciesConversionMaserToNormal_

std::map<const ParticleSpecies*, const ParticleSpecies*> SubcriticalMaserBoundary::speciesConversionMaserToNormal_
protected

List of 'maser' particles' species, and their normal counterparts.

Referenced by addParticleToMaser(), checkBoundaryAfterParticleMoved(), isMaserParticle(), read(), removeParticleFromMaser(), and write().

◆ speciesConversionNormalToMaser_

std::map<const ParticleSpecies*, const ParticleSpecies*> SubcriticalMaserBoundary::speciesConversionNormalToMaser_
protected

List of 'normal' particles' species, and their maser counterparts.

Referenced by addParticleToMaser(), isNormalParticle(), read(), and write().


The documentation for this class was generated from the following files: