MercuryDPM 1.0.0.Alpha was released on 1st July 2022.
You can find the download instructions here: http://mercurydpm.org -> Downloads -> Release 1.0.0.Alpha
After 13 years in a self-hosted SVN repository we have moved to git hosted via bitbucket. We only moved the Trunk (now called master) with history kept back to 2018-04-09. This gives you new ways to use and develop the code and we hope this will streamline the process of reintegrating new externally developed features. The old SVN repository will remain read only for a foreseeable future, in case you need an earlier version of MercuryDPM or one of the old releases or development branches.
The new bitbucket page is found here: https://bitbucket.org/mercurydpm/mercurydpm/
- graphviz (dot) is now required to build the documentation
The following functions changed their name (the line starting with - is the old version, the line starting with + is the new version)
- setWallsWriteVTK(FileType)
+ setWallsWriteVTK(bool)
- WallHandler::readTriangleWall(std::string filename, ParticleSpecies* species, Mdouble scaleFactor)
+ WallHandler::readTriangleWall(std::string filename, ParticleSpecies* species, Mdouble scaleFactor, Vec3D shift, Vec3D velocity, Vec3D angularVelocity)
BaseParticle is now an abstract class and SphericalParticle is the new class to use in driver codes.
- Baseparticle + SphericalParticle
- BaseParticle::getWallInteractionRadius()
+ BaseParticle::getWallInteractionRadius(this)
- BaseParticle::getInteractionRadius()
+ BaseParticle::getInteractionRadius(BaseParticle*)
+ BaseParticle::getMaxInteractionRadius()
SuperQuadric class was renamed to SuperQuadricParticle
- SuperQuadric + SuperQuadricParticle
- SuperQuadric::setRadius(Mdouble radius)
+ SuperQuadricParticle::setAxesAndExponents(const Vec3D& axes, const Mdouble& eps1, const Mdouble& eps2)
- SuperQuadric::computeOverlapAlpha(const LabFixedCoordinates& contactPoint, const LabFixedCoordinates& normal)
+ SuperQuadric::overlapFromContactPoint(const LabFixedCoordinates& contactPoint, const LabFixedCoordinates& normal)
- DPMBase::broadPhase(BaseParticle* i)
- BaseWall::setVelocityControl(Vec3D forceGoal, Vec3D gainFactor, Vec3D baseVelocity)
+ BaseWall::setForceControl(Vec3D forceGoal, Vec3D gainFactor, Vec3D baseVelocity)
- setElasticModulusAndRestitutionCoefficient()
+ setEffectiveElasticModulusAndRestitutionCoefficient()
- setShearModulus()
+ setEffectiveShearModulus()
- logger.assert()
+ logger.assert_debug()
- BaseClusterInsertionBoundary::setGeometry(Vec3D posMin, Vec3D posMax, Vec3D velMin, Vec3D velMax)
+ BaseClusterInsertionBoundary::setGeometry(Vec3D posMin, Vec3D posMax)
Distributions (uniform and normal distributions) have been moved to the PSD class
- void setDistribution(Distribution distribution); - Distribution getDistribution();
-
A MPISuperQuadric class which was originally planned to replace MPIParticles when SuperQuadrics are used was added. This class however is not fully functioning at the moment and is replaced by MPIParticle in the whole code for now.
-
The Chute and Contraction directory are not up to date and will be resurrected in the future.
-
OpenMP version of MercuryCG is not yet implemented.
MercuryMPITests/ForceLawsMPI2Test.cpp
- a new test that checks if history parameters like
slidingSpring
andmaxOverlap
are preserved when a contact jumps from one MPI domain to another
SelfTests/Boundaries/PSDSelfTest.cpp
- a new test for the PSD class
SelfTests/Boundaries/MultiplePSDSelfTest.cpp
- a new test for the new insertionBoundary implementation for multiple PSDs in a single InsertionBoundaries
SelfTests/Boundaries/PSDManualInsertionSelfTest.cpp
- a new test for the manual insertion routine of the PSD class
SelfTests/Interactions/ConstantRestitutionSelfTest.cpp
- a new test for
BaseSpecies::constantRestitution
SelfTests/Walls/UnionOfWallsSelfTest.cpp
- a new test for BasicUnionOfWalls
UnitTests/ScrewUnitTest.cpp
- a new test for the single helix screw wall
MercuryCG/MercuryCG.cpp
- added ability to calculate partial fields for mixtures using the command line
- new option
-averagebeyonddomain 0
to ignore particles outside the domain
MercuryCG/CGSelectRegionSelfTest.cpp
- a new test for MercuryCG
SelfTests/Interactions/TorsionFrictionSelfTest.cpp
- a new test for FrictionInteraction
SelfTests/Walls/STLRotationSelfTest.cpp
- a new test for rotation of STL walls
SelfTests/ComputeVolumeFractionSelfTest.cpp
- a new test for Volume fraction computation by CG
MercurySimpleDemos/SelfTestData/HourGlass3DSelfTest.cpp
- Corrected SelfTestData
Sinter/SinterBed2SelfTest.cpp
- Replaced SelfTestData
Chute/ChuteWithWedge.cpp
- added a new driver which considers the flow in a chute past a wedge
SuperQuadricDemos/EllipsoidsBouncingOnWallDemo.cpp
- a new driver showing a demo of a non-speherical particle simulation*
UnitTests/NurbsSurfaceUnitTest.cpp
UnitTests/NurbsWallSelfTest.cpp
UnitTests/NurbsWallUnitTest.cpp
- added new selfTests to test the new NURBS class
Tutorials/Tutorial10MPI.cpp
- added new driver which is a new version of Tutorial10 and shows how to do it in parallel
Demos/IndustrialMixers
- added VerticalMixer, HorizontalMixer and NautaMixer as new demos to show an example of industrial mixing
SimpleDrum/MonodispersedDrum.cpp
- added a new directory for drum demos and created a simple demo
Template
- added a new folder containing a TemplateDriver.cpp which can be utilized to write new drivers
Papers/MercuryDPM2019/GetDistanceAndNormalForIntersectionOfWalls.cpp
Papers/MercuryDPM2019/GetDistanceAndNormalForScrew.cpp
Papers/MercuryDPM2019/PlotSilo.cpp
Papers/MercuryDPM2019/PlotPolygon.cpp
Papers/MercuryDPM2019/PlotNurbs.cpp
Papers/MercuryDPM2019/PlotCoil.cpp
- added codes to reproduce images for the MercuryDPM2019 paper
SelfTests/Interactions/RollingFrictionSelfTest.cpp
- added a new SelfTest for the RollingFriction
SelfTests/Boundaries/CubeDeletionBoundarySelfTest.cpp
SelfTests/Boundaries/DeletionBoundarySelfTest.cpp*
- added new SelfTests for the new DeletionBoundary and CubeDeletionBoundary
Clusters/RandomClusterInsertionBoundaryDemo.cpp
- added a demo for a randomized Cluster insertion
UnitTests/FixedClusterInsertionBoundaryUnitTest.cpp
UnitTests/RandomClusterInsertionBoundaryUnitTest.cpp
- added new UnitTests for the new ClusterInsertionBoundaries
SpeedTest/InteractionHandlerSpeedTest.cpp
SpeedTest/ParticleHandlerSpeedTest.cpp
SpeedTest/SpeedTestWallInteractions.cpp
- added new SpeedTests for wall interactions, interaction handling and particle handling
MercurySimpleDemos/FreeCooling2DPeriodicDemo.cpp
- added a new demo for Free cooling in a periodic boundary
MercuryMPITests/InsertionBoundaryMPI2Test.cpp
MercuryMPITests/LiquidMigrationMPI2Test.cpp
- added two new MPI tests for liquid migration and insertion of particles
SelfTests/Walls/AxisymmetricWallSelfTest.cpp
- added a new SelfTest which where an intersection of walls is created in a cylindrical coordinate system
UnitTests/RandomNumbersUnitTest.cpp
- random_test was renamed to RandomNumbersUnitTest and moved to the UnitTests directory
UnitTests/LinearViscoelasticUnitTest.cpp
- added a new test which tests the LinearViscoelasticNormalSpecies
MercurySimpleDemos/REV_IsotropicCompression.cpp
MercurySimpleDemos/REV_PureShear.cpp
- added two simulations of isotropic compression and pure shear in a 3D cuboid box using the StressStrainControlBoundary
SelfTests/Interactions/ChargedBondedInteractionSelfTest.cpp
- added a new SelfTest to test the new
BaseInteraction::isBonded()
function
Papers/MercuryDPM2019/GetDistanceAndNormalForTriangleWall.cpp
Papers/MercuryDPM2019/GetDistanceAndNormalForTriangleWalls.cpp
- added two new tests for TriangleWalls, where GetDistanceAndNormalForTriangleWall.cpp checks TriangleWalls in a group
TriangleWalls/SingleSphere.cpp
- added a new test where a single sphere is rolling over a beam. This was used to test the TriangleWall implementation
SelfTests/Boundaries/DropletBoundarySelfTest.cpp
- added a new SelfTest for the new DropletBoundary
Papers/TunuguntlaBokhoveThornton2014.cpp
- added a code for the following paper https://doi.org/10.1017/jfm.2014.223
MercurySimpleDemos/MarbleRun.cpp
MercurySimpleDemos/MarbleRunWithSeesaw.cpp
- added a basic code to simulate a marble run and a marble run with a seesaw
Papers/OSBenchmark/
- added code for the OSBenchmark paper (to be released)
Segregation/SegregationNew.cpp
Segregation/Scripts/Analyse.sh
Segregation/Matlab/
-
added a code to simulate segregation on a belt
-
added a script to analyse SegregationNew.cpp as well MATLAB files
Segregation/DensitySizeSeg_Belt_WarreJan_25_75.cpp
- added belt simulation from a bachelor project
MercurySimpleDemos/FreeCooling2DinWalls.cpp
- added a simple demo where 32^2 particles with the same velocity are placed in a bi-axial box, which makes them collide with the walls and eachother. It is run once with HGrid on and off to test the working (and speedup) of the hgrid*
SimpleDrum/SquareDrumTest.cpp
- added a rolling drum with a squared geometry as demo
SelfTests/Boundaries/PSDManualInsertionSelfTest.cpp
- added a new SelfTest for the new manual insertion routine of the PSD class
UnitTests/ArcWallUnitTest.cpp
- added a new UnitTest to test the ArcWall feature
Demos/Membrane/MembraneDemo.cpp
- added a new demo to demonstrate the membrane feature
SelfTests/Boundaries/NozzleSelfTest.cpp
- added a new SelfTest to test the new nozzle feature
Demos/IndustrialMixers/SprayNozzleDemo.cpp
- added a new demo to showcase the new liquid drop insertion feature
SelfTests/Boundaries/DistributionToPSDSelfTest.cpp
- added a new SelfTest which creates a discretised normal distribution with the PSD class
MercurySimpleDemos/LeesEdwardsDemo.cpp
- added a demo to showcase the new LeesEdwardsBoundary
MercurySimpleDemos/TimeDependentPeriodicBoundaryTest.cpp
- added a new demo to showcase the new TimeDependentPeriodicBoundary feature
MercurySimpleDemos/ShiftingConstantMassFlowMaserBoundarySelfTest.cpp
- added a new demo to showcases a shifting ConstantMassFlowMaserBoundary
MercurySimpleDemos/ShiftingMaserBoundarySelfTest.cpp
- added a new demo to showcase a shifting SubcriticalMaserBoundary
MercurySimpleDemos/TimeDependentPeriodicBoundary3DSelfTest.cpp
- added a new demo to showcase a TimeDependentPeriodicBoundary in 3D
Kernel/BaseWall
- fixed a bug in
BaseWall::getInteractionWith
where particle-wall contact detection was not smooth when transitioning e.g. over a point where two TriangleWall faces touch. Now we keep only the biggest of the overlapping contacts
CMakeModules/MercuryCppFeatureCheck.cmake
-
changed current check for C++ version from supporting C++11 and C++14 to C++14 only
-
deleted current checks for gcc version 4.9 and 4.8 and replaced it with a check for version 5.0
CMAKE/FindPython.cmake
-
fixed Python not working when two versions (Python2 and Python3) where installed. It now prefers Python3 over Python2
-
replaced shebang in .py files to
usr/bin/env python3
Tools/CombineParallelRestartFiles.py
- MPI adaption
Documentation/Pages/CG.dox
- fixed typo
XBalls/xballs.c
-
removed bug that cause the
-of
option to fail -
fixed that xballs does not exit at keystroke
Kernel/VTKWriter/SphericalParticleVtkWriter
- added the angular velocity to the particle VTU output
Kernel/VTKWriter/InteractionVTKWriter
- the InteractionVTKWriter now correctly specifies the number of components for torque and force
Kernel/VTKWriter
-
added a comment line to each .vtk file that contains the time value
-
using MPI, Walls.vtu files are now only written by processor 0, because all processors create the same file
Kernel/Walls/TriangleWall
- fixed bug in restart information
Kernel/Walls/Screw
- fixed bug in contact detection on screw outer rim (overlap suddenly jumped from 0 to
thickness_
)
Kernel/Walls/IntersectionOfWalls
- fixed bug in
convertLimits
(used in writeVTK)
Kernel/Walls/AxisymmetricIntersectionOfWalls
- fixed bug in
convertLimits
(used in writeVTK)
Kernel/Walls/BasicIntersectionOfWalls.cc
- fixed bug in
getDistanceAndNormal
*Kernel/DPMBase *
-
extended the function
removeOldFiles
to remove old .vtu files in MPI mode as well -
extended the function
write
so it works well in MPI mode as well -
fixed syntax error when compiling with OMP
-
fixed a bug where VTK output numbering breaks when restarting simulations
Kernel/Math/Helpers:
- fixed bug in
readOptionalVariable
Kernel/Boundaries/StressStrainControlBoundary
-
fixed bug in
write
function -
fixed bug in
set
function, that caused a memory leak
Kernel/CG/CG.hcc
- fixed bug in
evaluateParticleAtPoint
, that prevented differential fields to be calculated
Kernel/CG/Fields/StandardFields.cc
- fixed bug, in
setFields
: the interactionForceDensity did not correctly account for the sign of the force
Kernel/CG/TimeSmoothedCG
- fixed bug that caused NaN output
Kernel/Interactions/FrictionForceInteractions/FrictionInteraction.cc
- fixed bug in
torsionSpring
implementation: wrong force was computed
Kernel/Species/Species.h
- fixed bug in constructor: BaseSpecies constructor was not called
Kernel/Math/Helpers.h
- fixed bug in
readOptionalVariable
: the string check didn't work when there was an additional space character before optional variable
Kernel/Particles/BaseParticle
-
BaseParticle::getInteractionRadius()
was computed wrong for mixed species. Now there are three functions-
BaseParticle::getMaxInteractionRadius()
gets the largest possible interaction radius for interactions of this particle with a particle of any species -
BaseParticle::getInteractionRadius(BaseParticle*)
gets the largest possible interaction radius for interactions for a given pair of particles -
BaseParticle::getInteractionRadius(BaseWall*)
gets the largest possible interaction radius for interactions for a given pair of particle-wall -
moved computation of the
interactionRadius
from the get to the set function. Therefore, two new variables where added:BaseSpecies::interactionRadius
andSpecies::maxInteractionRadius
-
*MATLAB/
- all scripts are tested and work in GNU Octave
MATLAB/LoadStatistics.m
-
reworked and moved this file which loads Mercury output files into MATLAB
-
fixed several small bugs
Kernel/Walls/TriangleWall.cc
- fixed bug in
TriangleWall::getDistanceAndNormal
which caused theedgeBranches
to be computed wrong
Kernel/Species/AdhesiveForceSpecies/ReversibleAdhesiveSpecies.cc
- fixed a bug in setting of the
InteractionDistance
. TheInteractionDistance
is now only set when there is anadhesionStiffness > 0
Kernel/Particles/BaseParticle
- moved
ComputeMass()
here to give each particle type its ownComputeMass
function. This change was necessary to prevent high computational cost fromdynamic_casts
of different particle classes (e.g. SuperQuadrics)
Kernel/Boundaries/PeriodicBoundary
- fixed a bug where the HGrid was not updated when particles where shifted due to periodicBoundaries. Now the HGrid is updated every timestep by adding the shift to the
totalRelativeMaxDisplacement
of the HGrid
Tools/MercuryData.h
- changed return value of
MercuryTimeStepIterator<NDIMS>::end()
in order to fix data2pvd tool - fixed error for data2pvd when the first line of a data file ended without a whitespace. It can now read files even if the first line of data file ends without a whitespace
Kernel/Walls/TriangleWall.h
- optimized Trianglewall contact detection. In the past there where issues with distinguishing edge and vertex contacts
Kernel/Interactions/FrictionForceInteractions/MindlinRollingTorsionInteraction.cc
- corrected MindlinRollingTorsionInteraction.
rollingRelativeVelocity
is now computed using the radius instead of the diameter
Drivers\MercuryCG\fstatistics.cpp
- fstatistics did not work well for the FiveParticles example. The problem was that some particles were unduly set as fixed in
readNextDataFile
. Now, thefixed
property is correctly set, i.e. particles that arefixed
in the restart file (and only those) arefixed
for all time steps
Drivers/MercuryCG/MercuryCG.cpp
- MercuryCG now sets an eps value for the evaluation of differential fields with numerical differentiation
Kernel/Math/Helpers
helpers::readFromCommandLine
did not read correctly when it's the last argument
MercuryMPITests/TwoByTwoDomainMPI4Test.cpp
- added a new MPI test
Configuration/Mastermake.cmake
- added a maximum test time (timeout) of 80 seconds for SelfTests and UnitTests such that tests will complete even if one hangs
Kernel/HGrid
- fixed a bug in HGrid which was causing a problem on ARM hardware
Kernel/ParticleHandler
- added two missing calls of the function
DPMBase::handleParticleRemoval
when particles are removed from the particleHandler
Documentation/Pages/Installing.dox
- fixed a broken link to the documentation's installation instructions
1. Several old branches, drivers and features were fixed, updated and merged to Trunk.
2. Added SelfTestData and InputData to several SelfTests.
3. Logger is now well documented and implemented in the whole code to speed up complex outputs.
-
developers are highly encouraged to use the
logger()
function instead ofstd::cout()
orstd::cerr()
-
logger output can now be formatted to a certain width and precision. e.g.
logger(INFO, "%10.12", normalForce
) will add the normal force with a precision of 10 decimal places and a width of 12. -
the output of a message with a certain width is now by standard left-aligned.
-
added a new class object
doFlush_
to the logger which prevents it from callingstd::endl
when in a logger statement the argumentFlusher::NOFLUSH
is called. This is especially useful for developers in write functions where sometimes there are conditional arguments which would else lead to a new invocation of the logger slowing the code. -
the logger is now responsible for the error handling of the code and has a specific code for certain errors. This is especially useful for coupled simulations where error codes can be passed to other software.
4. A new PSD class was added to enable the simulation of polydisperse particle systems.
-
a discretized PSD is now defined by a vector containing radii and probabilities from a separate RadiusAndProbability class. (
std::vector<RadiusAndProbability> particleSizeDistribution_
) -
an enum class was added to define the TYPE of PSDs. Based on this TYPE, PSDs are converted to the default cumulative number distribution function (CNDF) for the InsertionBoundary class.
-
particles can now be read in from CSV files. Therefore a PSD type object has to be created and the function
setPSDfromCSV()
has to be called.setPSDfromVector()
is deprecated and will be removed in future releases. -
a manual insertion by a fixed volume is now implemented for cases where accuracy for the inserted PSD is of great interest. In this approach particles are inserted class by class from biggest to smallest particles overfilling classes by a probability based approach. This feature is enabled the function
InsertionBoundary::setManualInsertion()
to TRUE, default is FALSE. -
the PSD class can create discretized Normal and Uniform distributions for simulation.
-
the PSD class is now able to compute the first 6 moments of the actual particle distribution.
-
other useful functions are also implemented (
getDx()
,ComputeMomenta()
, etc..). -
additional documentation was added for polydispersity in Documentation/AdditionalDocumentation.
5. The InsertionBoundary was generalized.
-
particle insertion is solely done by this class while geometry definitions of a boundary are defined in other classes, e.g. CubeInsertionBoundary, HopperInsertionBoundary, etc. Therefore all
setPSD()
,getPSD()
,getDistribution()
,setDistribution()
andgenerateParticle()
functions where moved to the InsertionBoundary class as well as the private memberspsd_
,distribution_
,radMin_
andradMax_
. -
for CubeInsertionBoundary the old interface is still active and will generate a uniform distribution on [rMin, rMax] by default. Yet, this will only work for a single species and not a vector of particle species.
-
it is now possible to include several PSDs and Species into a single insertionBoundary.
-
insertionBoundary has a new option to allow insertion without overlap check via a
CheckParticleForInteraction_
class member. -
setters and getters for a PSD and a distribution are now defined.
-
distribution::Uniform is set as default when no PSD is inserted.
6. Cleaned and updated documentation for a huge amount of driver codes and kernel features. Moreover, the FAQ for developers has been updated and most of the new features of this list are well documented.
7. Walls can now be defined by Non-Uniform Rational B-Splines (NURBS).
8. New tutorials are added, old tutorials have been extended and all of them are now well documented.
9. A DeletionBoundary and CubeDeletionBoundary is introduced which is able to delete particles being in a specific area at any timestep.
10. We added a DropletBoundary which is able to insert liquid droplets. Furthermore, a BoundaryVTKWriter is able to write the droplets into a visualizable .VTK file.
11. MercuryDPM can now insert Clusters of particles through the new FixedClusterInsertionBoundary and RandomClusterInsertionBoundary.
12. A lot of our C++ code has been reworked and optimized in terms of speed and flexibility.
-
dynamic_casts where replaced where possible.
-
normal inheritance was preferred over other solutions by adding base classes where possible (this avoids dynamic casting).
-
C++ 14 features where implemented over older C++ standards.
-
output was optimized to flush only when necessary and the whole output is now processed by our own Logger.
-
added an option to run in single precision mode.
-
MPI and OpenMP implementation.
11. Added a MarbleRun simulation to be able to test single particle motion in MercuryDPM.
12. A new Membrane class was added to simulate elastic membranes consisting of particles with a certain mass connected by springs.
-
this class assumes, that the particles are connected in a triangular mesh.
-
a hexagonal unit cell is assumed for a correct computation of the spring constant for the distance of the spring.
-
Kernel/Walls/MeshTriangle was added for the membrane class and implements a triangle whose vertex positions are defined by three particles.
13. MercuryDPM is now compatible with OpenMP (OMP). An option was added (Mercury_USE_OpenMP, default: OFF) to allow for parallel simulations with OpenMP. This defines the compiler flag MERCURY_USE_OMP, which is used for OMP-specific code.
-
OMP required the implementation of a reduced algorithms for force computation.
-
DPMBase::numberOfOMPthreads_
stores number threads used when omp is turned on, default: 1. -
DPMBase::setNumberOfOMPthreads
Warns if OMP is turned of and tests whether OMP is active. If OMP is turned on, values can be set between 1 andget_omp_max_threads()
.
14 A new Tools directory in the Kernel was created and a csvReader was added to this folder.
-
the csvReader allows to read in arbitrary data types. For now only reading in the first and the second column for a double type is implemented because it is needed for the PSD class.
-
.csv files with a byte-order-mark (BOM) will have the first three bytes of their file skipped to avoid problems (common problem for files created in Windows). All values will be read in as usual.
15. A new contact law for sintering of particles is now part of the Mercury kernel.
16. Added a new chute class which defines a chute by curvilinear coordinates.
17. Added a new TimeDependentPeriodicBoundary class which is able to create a boundary with Lees-Edwards type periodic boundary conditions.
-
a TimeDependentPeriodicBoundary is like a PeriodicBoundary, but when a particle crosses an edge it is shifted, copied and given a boost.
-
See also LeesEdwardsBoundary where particles are only shifted and not copied and given a boost.
-
this type of boundary is useful for studying shear flows.
18. Added a soft stop feature to the Kernel.
- after abortion of a code a flag is set which stops the code after the next time step and forces writing of output files.
19. Several smaller features added:
Kernel/Walls/Screw
- generalised Screw; it can now create both single and double helices
Kernel/Walls/BasicUnionOfWalls
- added new Wall type to define a union of two walls. The difference between two walls and a union is that a contact that flips from one wall to the other is preserved for a union, whereas it is considered a new contact for two separate walls
Kernel/Walls/BaseWall
-
added a function
setVelocityControl
that can be used to apply a certain pressure on a wall; the control is very simple and should be improved -
added a function
addRenderedWall
that allows you to specify a wall to be rendered in place of the actual wall. The renderer applies the position and orientation of the actual wall to the rendered wall, so the rendered wall moves like the original wall -
added function
addParticlesAtWall
, which allows you to quickly add particles touching a wall (this was previously done only in Driver codes)
Kernel/Species/BaseSpecies and Interaction/BaseInteraction
- added a property
constantRestitution
(FALSE by default). If TRUE, the normal contact law is modified to produce a restitution coefficient and collision time that is independent of mass (by making stiffness and dissipation proportional to mass). This only works right now for the LinearPlastic contact law
Kernel/Interaction/BaseInteraction
-
generalised
BaseInteraction::getEffectiveRadius
andBaseInteraction::getEffectiveMass
to use invMass and curvature instead of mass and radius; now the computation is the same for any particle or wall type -
added new function
BaseInteraction::isBonded()
which returns TRUE if the interaction is an 'internal' bond. these internal forces are not written to fstat and thus don't contribute to fstatistics
Kernel/BaseInteractable
- added functions
getInvMass
andgetCurvature
, also for walls
Kernel/Species/LinearViscoelasticNormalSpecies
Kernel/Species/LinearPlasticViscoelasticNormalSpecies
-
added a function
setRestitutionCoefficient
that sets the restitution coefficient while keeping stiffness constant -
added a function
computeBondNumberMax
to easily get the max Bond number that this contact law can produce -
added a new option
doConstantUnloadingStiffness()
to behave like Walton-Braun
Kernel/MercuryTime.h
-
added functions
tic
andtoc
, which allows you to quickly profile a code's speed -
added a new function
getWallTime()
to get the main simulation time (time of a clock on the wall) andgetCPUTime()
to get pure CPU computation time of a simulation
Kernel/Logger
- added colour to logger errors in MPI
Kernel/Math/Matrix
- added new function diag, returning the diagonal elements
Kernel/Math/Vector
- added new functions
multiplyElementwise
andsignedSquare
Kernel/Math/ExtendedMath.h
- a new constant
constants::degree
has been defined as a shortcut for pi/180
Kernel/Math/RNG
- moved seed function out of the loop, so it's only called once
Kernel/Math/Helpers:
-
added new function
readFromCommandLine
, to make it easy to interpret command line arguments -
added new function
writeCommandLineToFile
, so you can store command line arguments -
added new function
linspace(double, double, int)
which works the same way as in MATLAB -
added new function
removeFromCommandline(int& argc, char* argv[], std::string varName, int nArgs)
. This function does effectively remove specified commandline arguments from argc and argv
Kernel/GeneralDefine
- redefined
NUMBER_OF_PROCESSORS
andPROCESSOR_ID
such that they are also set (as 1 and 0) for serial codes; thus, you can write one code that can be run in serial or parallel, without the use of preprocessor directives
Kernel/File
- added function
writeFirstAndLastTimeStep
that sets the saveCount to infinity
Kernel/DPMBase
-
added parameter
readSpeciesFromDataFile
; if set to TRUE, then the info column in the data file will be interpreted as the species during restarting -
added function
fillDomainWithParticles
created an initially filled geometry (allows a quick check if the geometry is implemented correctly) -
added function
setInteractionsWriteVTK(bool)
-
added function
get/setReadInteractions()
-
added function
DPMBase::getMomentum()
andDPMBase::getAngularMomentum()
-
added function
splitDomain(DomainSplit)
, which picks a sensible domain composition for the number of processors (e.g.splitDomain(XY)
splits domain into a 6x5x1 grid for 30 processors) -
added options to
readRestartFile()
which allows to read a restart file without interactions and/or particles -
Merucry now records the time when the simulation starts
-
added time measurement of simulations.
clock_.tic()
starts measuring andclock_toc()
ends measuring time
Kernel/CG/CGHandler
- CGHandler now allows setting an initial file counter (to start reading from e.g. *.data.100)
Kernel/CG/BaseCG
- added functions
set[X,Y,Z]
andGrid(min,max,h)
, that lets you quickly define a grid of given mesh size
Kernel/Boundaries/LeesEdwardsBoundary
- added function
updateBoundaries
that lets you update the position of a LeesEdwardsBoundary, instead of completely resetting it
Kernel/Boundaries/InsertionBoundary
-
added function
insertParticles
, that lets you insert particles once, without adding the boundary to the handler -
added functions
setInitialVolume(Mdouble initialVolume)
,getInitialVolume()
andsetVolumeFlowRate_(Mdouble volumeFlowRate)
,getVolumeFlowRate_()
that let's you set an initial volume and a constant flow rate for insertion -
added function
setVariableVolumeFlowRate
, that lets you define a variable flow rate -
added
psd
anddistribution
toInsertionBoundary::write()
CMakeModules/MercuryXballs.cmake
- turning off xballs support for Windows by default
Kernel/Walls/TriangleWall.h
- The position of a TriangleWall can now be set explicitly
Kernel/Particles/SuperQuadricParticle
-
the radius of a SuperQuadric is now used to store the bounding radius. This makes contact detection more efficient
-
setting the
BoundingRadius
was reworked to be implmented in a more general way -
superquadrics without contact were added to the interactionHandler, now superquadrics without contacts are removed from the interactionHandler
Kernel/Particles/BaseParticle
- added
BaseParticle::getMomentum()
andBaseParticle::getAngularMomentum()
to automate some computations
Kernel/BaseObject
- added
groupID
which makes it easier to apply an action to a specific group in a handler, visualise a specific group, coarse-grain a specific group, etc.
Kernel/Particles/LiquidFilmParticle
- added
liquidFilmVolume
andliquidBridgeVolume
to vtk output
Kernel/Boundaries/DeletionBoundary
-
added feature to track the outflowing particles
-
added copy constructor
Kernel/MpiDataClass:
-
added new function
getMPISum()
which sums the values over all processors -
MPIParticle can now be changed from SphericalParticle to LiquidFilmParticle with a simple one-line change
Kernel/InteractionHandler
- added a new function
getLiquidBridgeVolume()
Tools/CombineParallelDataFiles.cpp
- added to create single data file from all data files created by each process when run in parallel
Tools/CombineParallelOutFiles.py
- added python script to merge .out files
Tools/CombineParallelOutFiles.py
- added python script to merge .out files
Kernel/Mercury3D
- added distance check in
Mercury3D:hGridFindContactsWithTargetCell()
which greatly speeds up simulations
Kernel/GeneralDefine
-
added
NaN
,inf
,intMax
andunsignedMax
to namespace constants -
added gas constant
R
to namespace constants
Documentation/AdditionalDocumentation/LoggerImplementationDetail.md
- added additional documentation for the logger
XBalls/xballs.c
- updated XBalls
Kernel/Particles/HeatFluidCoupledParticle
- added a new particle type that stores both temperature/heat capacity and liquid content which is adapted for the CFD-DEM studies
Kernel/Interactions/NormalForceInteractions/SinterLinInteraction.cc
Kernel/Interactions/NormalForceInteractions/SinterLinInteraction.h
Kernel/Species/NormalForceSpecies/SinterLinNormalSpecies.cc
Kernel/Species/NormalForceSpecies/SinterLinNormalSpecies.h
Kernel/Species/ThermalSinterLinFrictionReversibleAdhesiveSpecies.h
- added new species and interaction for the new sintering contact model
Configuration/Docker/dockerfile
- added a dockerfile to the configuration folder. This dockerfile is used to get Pipelines on Bitbucket running, but can also be used for other purposes