Material Point Reservoir
Introduction
Simulations in NairnMPM are currently limited to a fixed number of particles. To allow for simulations options to delete particles or inject particles, the code implements a reservoir of material points. This reservoir is currently only implemented in OSParticulas but will be moved to NairnMPM soon.
The reservoir is created automically for all simulations (unless you are using an unstructured grid, which is uncommon because many features are lost for such grids). For most simulations, the reservoir handles all options that might delete particles and happens automatically without your input commands needing extra commands to set eservoir properties. Some features (which currently are only in custom tasks) can inject particles into the simulation. To use any such custom task, your input commands should pre-fill the reservoir with particles type needed for that task..
Deleting Particles
Any feature that deletes particles, moves those particle into the reservoir. These reservoir tasks happen automatically. You input commands only need to invoke options that delete particles. The current options are:
- LeaveLimit Command - if this command's (maxNum) parameter is negative, particles that leave the grid are deleted from the simulation.
- DeleteLimit Command - if this command's (maxNum) parameter is greater than 1, particles that develop nan are deleted from the simulation.
- DeleteDamaged Custom Task - this task can delete damaged particles after decohesion.
- JWLPlusPlus Material - this material has an option to delete gas particles a sufficient distance from the ignition site.
Injecting Particles
Some simulations might work better by injecting particles as needed rather then starting will all particles already in place. In the future, built-in feature that inject particle might be added, but currently particle injection is only done in custom tasks. The only custom task that injects particles is:
- FluidSource Custom Task - to inject liquid particles at a specified rate, location, and direction.
User-written custom tasks can also inject particles and more documentation on writing such tasks will be provided soon.
Filling the Reservoir
To allow custom tasks to inject particles, the reservoir normally needs to be seeded with enough material points for the injection process. The command to fill the reservoir in scripted files is:
Fill (num),(matid),<(lx)>,<(ly)>,<(lz)>
In XML files, the reservoir is filled using a Fill element that must be within the single <MaterialPoints> element in the input file:
<MaterialPoints> <Fill num='(num)' mat='(matid)' lx='(lx)' ly='(ly)' lz='(lz)'/> </MaterialPoints>
where
- (num) is the number of material points to put into the reservoir.
- (matid) is the material ID for a previously defined material (which must be a material number in XML files).
- (lx), (ly), and (lz) optionally specify the size of the material point in length units. If these optional parameters are not provided, the material points will use the default size for the simulation (as set using the PtsPerElement command). When a custom task injects particles of a certain size, that size must made available in the reservoir by use a matching size in this command.
Adding Reservoir Methods to a Custom Task
The reservoir class is automatically added to all simulations (unless you are using an unstructured grid). To write code that uses the reservoir, your custom task should include the NairnMPM_Class/Reservoir.hpp. This header defines global variable as pointed to the create <rr>Reservoir class:
extern Reservoir *mpmReservoir
Your custom tasks can use the following features of the reservoir.
Custom Tasks Initialization
The Initialized() method is called for each custom tasks before the simulation begins. It is good practice for this method to verify the reservious is available. Typical code to start the Initialize() method is
// requires reservoir if(mpmReservoir==NULL) { throw CommonException("This custom task requires an available reservoir (i.e., a structured grid)", "MyCustomTasks::Initialize"); }