5 #ifndef MERCURY_MATERIAL_H
6 #define MERCURY_MATERIAL_H
27 void setPSD(
int argc,
char *argv[]) {
28 for (
unsigned i=0;
i<argc-1; ++
i) {
29 if (!strcmp(argv[
i],
"-psd")) {
30 std::vector<DistributionElements> psdVector;
33 if (!strcmp(argv[
i + 1],
"logNormal"))
35 logger.assert_debug(argc >
i + 5,
"Error in logNormal");
37 double meanX = std::atof(argv[
i + 4]);
38 double stdX = std::atof(argv[
i + 5]);
39 if (!strcmp(argv[
i + 3],
"radius"))
42 else if (!strcmp(argv[
i + 3],
"diameter"))
47 logger(
ERROR,
"setPSD: distribution type % not known", argv[
i+3]);
49 double meanX2 = meanX*meanX;
50 double stdX2 = stdX*stdX;
51 double mean =
log(meanX2/
sqrt(meanX2+stdX2));
52 double std =
sqrt(
log(1+stdX2/meanX2));
53 double lnRMin = mean-2.5*std;
54 double lnRMax = mean+2.5*std;
56 psdVector.push_back({0.5*
exp(lnRMin), 0});
58 for (
int j = 1;
j <
n; ++
j) {
59 double lnR = lnRMin +
j / (
double)
n * (lnRMax - lnRMin);
61 value.probability = 0.5 * (1.0 + erf((lnR - mean) / (
sqrt(2) * std)));
62 psdVector.push_back(
value);
66 psdVector.push_back({0.5*
exp(lnRMax), 1});
67 if (!strcmp(argv[
i+2],
"number")) {
69 }
else if (!strcmp(argv[
i+2],
"volume")) {
72 logger(
ERROR,
"setPSD: distribution type % not known", argv[
i+2]);
77 for (
unsigned j=
i+4;
j<argc-1 && argv[
j][0]!=
'-' && argv[
j+1][0]!=
'-';
j+=2) {
78 if (!strcmp(argv[
i+3],
"radius")) {
79 value.internalVariable = std::atof(argv[
j]);
80 }
else if (!strcmp(argv[
i+3],
"diameter")) {
81 value.internalVariable = std::atof(argv[
j]) / 2.;
83 logger(
ERROR,
"setPSD: distribution type % not known", argv[
i+3]);
85 value.probability = std::atof(argv[
j+1]);
86 psdVector.push_back(
value);
88 if (!strcmp(argv[
i+1],
"cumulative")) {
89 if (!strcmp(argv[
i+2],
"number")) {
91 }
else if (!strcmp(argv[
i+2],
"volume")) {
94 logger(
ERROR,
"setPSD: distribution type % not known", argv[
i+1]);
96 }
else if (!strcmp(argv[
i+1],
"probability")) {
97 if (!strcmp(argv[
i+2],
"number")) {
99 }
else if (!strcmp(argv[
i+2],
"volume")) {
102 logger(
ERROR,
"setPSD: distribution type % not known", argv[
i+1]);
105 logger(
ERROR,
"setPSD: distribution type % not known", argv[
i+2]);
111 Mdouble particleRadius = 1.5e-3;
113 logger(
WARN,
"-psd argument not found; using default psd");
120 double restitutionCoefficient =
readFromCommandLine(argc,argv,
"-restitutionCoefficient",0.5);
132 species->setConstantRestitution(constantRestitution);
136 species->setCollisionTimeAndRestitutionCoefficient(collisionTime, restitutionCoefficient, massMin);
138 species->setSlidingFrictionCoefficient(slidingFriction);
139 species->setSlidingStiffness(2. / 7. * species->getStiffness());
140 species->setSlidingDissipation(2. / 7. * species->getDissipation());
141 species->setRollingFrictionCoefficient(rollingFriction);
142 species->setRollingStiffness(2. / 5. * species->getStiffness());
143 species->setRollingDissipation(2. / 5. * species->getDissipation());
144 species->setTorsionFrictionCoefficient(torsionFriction);
145 species->setTorsionStiffness(2. / 5. * species->getStiffness());
146 species->setTorsionDissipation(2. / 5. * species->getDissipation());
148 species->setAdhesionStiffness(species->getStiffness());
149 species->setAdhesionForceMax(9.8*massD50*bondNumber);
152 setTimeStep(0.05 * species->getCollisionTime(massMin));
157 mixedSpecies->setRollingFrictionCoefficient(0.0);
158 mixedSpecies->setSlidingFrictionCoefficient(0.0);
159 mixedSpecies->setAdhesionForceMax(0.0);
164 mixedSpecies->setRollingFrictionCoefficient(
std::max(1.0,species->getSlidingFrictionCoefficient()));
165 mixedSpecies->setSlidingFrictionCoefficient(
std::max(1.0,species->getRollingFrictionCoefficient()));
166 mixedSpecies->setAdhesionForceMax(0.0);
AnnoyingScalar sqrt(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:134
int i
Definition: BiCGSTAB_step_by_step.cpp:9
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
Species< LinearViscoelasticNormalSpecies, FrictionSpecies, ReversibleAdhesiveSpecies > LinearViscoelasticFrictionReversibleAdhesiveSpecies
Definition: LinearViscoelasticFrictionReversibleAdhesiveSpecies.h:13
Logger< MERCURYDPM_LOGLEVEL > logger("MercuryKernel")
Definition of different loggers with certain modules. A user can define its own custom logger here.
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:360
SpeciesHandler speciesHandler
A handler to that stores the species type i.e. LinearViscoelasticSpecies, etc.
Definition: DPMBase.h:1433
Mdouble getTimeStep() const
Returns the simulation time step.
Definition: DPMBase.cc:1241
void setTimeStep(Mdouble newDt)
Sets a new value for the simulation time step.
Definition: DPMBase.cc:1225
class of DistributionElements which stores internalVariables and probabilities of a distribution....
Definition: DistributionElements.h:13
Definition: Material.h:12
ParticleSpecies * frictionlessWallSpecies
Definition: Material.h:17
PSD psd
Definition: Material.h:14
Material(int argc, char *argv[])
Definition: Material.h:19
void setPSD(int argc, char *argv[])
Definition: Material.h:27
ParticleSpecies * frictionalWallSpecies
Definition: Material.h:16
ParticleSpecies * particleSpecies
Definition: Material.h:15
void setSpecies(int argc, char *argv[])
Definition: Material.h:117
This adds on the hierarchical grid code for 3D problems.
Definition: Mercury3D.h:16
Contains a vector with radii and probabilities of a user defined particle size distribution (PSD)
Definition: PSD.h:47
Mdouble getMinRadius() const
Get smallest radius of the PSD.
Definition: PSD.cc:1037
Mdouble getVolumeDx(Mdouble x) const
Calculate a certain diameter (e.g. D10, D50, D90, etc.) from a percentile x of the volume based PSD.
Definition: PSD.cc:929
static PSD getDistributionNormal(Mdouble mean, Mdouble standardDeviation, int numberOfBins)
Definition: PSD.h:145
@ PROBABILITYDENSITY_VOLUME_DISTRIBUTION
@ CUMULATIVE_VOLUME_DISTRIBUTION
@ PROBABILITYDENSITY_NUMBER_DISTRIBUTION
@ CUMULATIVE_NUMBER_DISTRIBUTION
void setPSDFromVector(std::vector< DistributionElements > psd, TYPE PSDType)
Sets the PSD from a vector with DistributionElements.
Definition: PSD.cc:513
Definition: ParticleSpecies.h:16
std::enable_if<!std::is_pointer< typename U::MixedSpeciesType >::value, typename U::MixedSpeciesType * >::type getMixedObject(const U *S, const U *T)
Definition: SpeciesHandler.h:52
#define max(a, b)
Definition: datatypes.h:23
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 exp(const bfloat16 &a)
Definition: BFloat16.h:615
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 log(const bfloat16 &a)
Definition: BFloat16.h:618
squared absolute value
Definition: GlobalFunctions.h:87
bool readFromCommandLine(int argc, char *argv[], const std::string &varName)
Returns true if command line arguments contain varName, false else.
Definition: CommandLineHelpers.cc:99
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2