Siegen.h
Go to the documentation of this file.
1 //Copyright (c) 2013-2023, The MercuryDPM Developers Team. All rights reserved.
2 //For the list of developers, see <http://www.MercuryDPM.org/Team>.
3 //
4 //Redistribution and use in source and binary forms, with or without
5 //modification, are permitted provided that the following conditions are met:
6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above copyright
9 // notice, this list of conditions and the following disclaimer in the
10 // documentation and/or other materials provided with the distribution.
11 // * Neither the name MercuryDPM nor the
12 // names of its contributors may be used to endorse or promote products
13 // derived from this software without specific prior written permission.
14 //
15 //THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
16 //ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17 //WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18 //DISCLAIMED. IN NO EVENT SHALL THE MERCURYDPM DEVELOPERS TEAM BE LIABLE FOR ANY
19 //DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20 //(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21 //LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22 //ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 //(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24 //SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 
26 #include "DPMBase.h"
27 #include "Particles/BaseParticle.h"
28 #include "Walls/InfiniteWall.h"
29 #include <iostream>
30 #include <iomanip>
32 
33 class Siegen : public DPMBase{
34 public:
35 
36  //We define the particle properties for the siegen experiments and insert one particle
37  Siegen(double NormalForce_=1000e-6) : DPMBase() {
38  // User input: problem name
39  setName("Siegen");
40  NormalForce = NormalForce_;
41 
42  // User input: material parameters
43  // radius of the particle
44  Mdouble RadiusPrime = 10e-6; //m
45  //calculate rel overlap
46  Mdouble E1 = 179e9;
47  Mdouble E2 = 71e9;
48  Mdouble nu1 = 0.17;
49  Mdouble nu2 = 0.17;
50  Mdouble Estar = 1 / ((1 - nu1 * nu1) / E1 + (1 - nu2 * nu2) / E2);
51 
52  Mdouble G1 = E1 / 2 / (1 + nu1);
53  Mdouble G2 = E2 / 2 / (1 + nu2);
54  Mdouble Gstar = 1 / ((2 - nu1) / G1 + (2 - nu2) / G2);
55  //Mdouble Estar = 52.3488827e9;
56  //Mdouble Poisson = 0.17;
57  //Mdouble Gstar = 11.871e9;
58  logger(INFO, "Estar=%\n"
59  "Gstar=%", Estar, Gstar);
60  Gstar = 1.2138e9;
61  // relative overlap for given normal force
62  Mdouble Overlap = 0;
63  for (int i = 0; i < 10; i++)
64  {
65  Overlap = pow(3. / 4. * NormalForce / Estar / sqrt(RadiusPrime + Overlap), 2. / 3.);
66  }
67  relOverlap = Overlap / RadiusPrime; //wrt RadiusPrime
68  relOverlap = 0.001; //wrt RadiusPrime
69  Mdouble Radius = RadiusPrime * (1 + relOverlap);
70  logger(INFO, "relOverlap=%\n"
71  "overlap=%\n"
72  "contact radius=%\n"
73  "rel contact radius=%",
74  relOverlap, relOverlap * RadiusPrime, sqrt(relOverlap) * RadiusPrime, sqrt(relOverlap));
75  //density of SiO2
76 
78  species->setDensity(2648 / mathsFunc::cubic(1 + relOverlap)); //kg/m^3
79  //(dynamic) sliding friction
80  //setSlidingFrictionCoefficient(.23);
81  species->setSlidingFrictionCoefficient(0.23); //rough
82  //species->setSlidingFrictionCoefficientStatic(.7); //rough
83  //rolling friction
84  species->setRollingFrictionCoefficient(.00103);
85  //torsion friction
86  species->setTorsionFrictionCoefficient(.005);
87  //restitution coefficient
88  Mdouble Restitution = 0.99;
89 
90  //insert particle and get mass
91 
95  p0->setRadius(Radius);
96  Mdouble Mass = p0->getMass();
97 
98  //define material properties
99  //set normal force
100  //setStiffnessAndRestitutionCoefficient(NormalForce/(relOverlap*RadiusPrime), Restitution, Mass);
101  species->setStiffnessAndRestitutionCoefficient(NormalForce / relOverlap / RadiusPrime, Restitution, Mass);
102  //set dt accordingly
103  Mdouble tc = species->getCollisionTime(Mass);
104  //setTimeStep(tc/50.);
105  setTimeStep(7.399163453192103488e-08);
106  logger(INFO, "Mass=%\n"
107  "tc=%19\n"
108  "dt=%\n"
109  "tmax=%", Mass, tc, getTimeStep(), getTimeMax());
110  //set elastic tangential sliding force
111  species->setCollisionTimeAndNormalAndTangentialRestitutionCoefficient(tc, Restitution, Restitution, Mass);
112  //set elastic tangential rolling/torsion force
113  Mdouble factor = Gstar / Estar; //0.4 is for equal oscillation frequency
114  factor = 0.4; //0.4 is for equal oscillation frequency
115  species->setRollingStiffness(factor * species->getStiffness());
116  species->setTorsionStiffness(factor * species->getStiffness());
117 
118 // if (false) { //Hertz-Mindlin
119 // species->setStiffness(Estar);
120 // species->setSlidingStiffness(Gstar);
121 // Mdouble disp=0.0062; //en=0.99
122 // //Mdouble disp=0.0382; //en=0.88
123 // species->setDissipation(disp);
124 // species->setSlidingDissipation(disp);
125 // std::cout << "E*=" << species->getStiffness() << ", G*/E*=" << species->getSlidingStiffness()/species->getStiffness() << std::endl;
126 // //setRollingFrictionCoefficient(0);
127 // //setTorsionFrictionCoefficient(0);
128 // //setSlidingFrictionCoefficient(0);
129 // ///\todo TWnow reimplement HERTZ_MINDLIN_DERESIEWICZ
130 // //species->setForceType(ForceType::HERTZ_MINDLIN_DERESIEWICZ);
131 // }
132 
133  species->setSlidingDissipation(sqrt(factor)*species->getDissipation());
134  species->setTorsionDissipation(sqrt(factor)*species->getDissipation());
135  species->setRollingDissipation(sqrt(factor)*species->getDissipation());
136 
137  //set geometry
138  setGravity(Vec3D(0,0,0));
139  setXMax(Radius);
140  setXMin(-getXMax());
141  setYMax(2.*Radius);
142  setYMin(0);
143  setZMax(Radius);
144  setZMin(-getZMax());
145  }
146 
147  void setupInitialConditions() override {}
148 
156 };
Species< LinearViscoelasticNormalSpecies, FrictionSpecies > LinearViscoelasticFrictionSpecies
Definition: LinearViscoelasticFrictionSpecies.h:34
Logger< MERCURYDPM_LOGLEVEL > logger("MercuryKernel")
Definition of different loggers with certain modules. A user can define its own custom logger here.
@ INFO
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
Definition: BaseParticle.h:54
Mdouble getMass() const
Returns the particle's mass.
Definition: BaseParticle.h:322
virtual void setRadius(Mdouble radius)
Sets the particle's radius_ (and adjusts the mass_ accordingly, based on the particle's species)
Definition: BaseParticle.cc:553
The DPMBase header includes quite a few header files, defining all the handlers, which are essential....
Definition: DPMBase.h:77
Mdouble getXMax() const
If the length of the problem domain in x-direction is XMax - XMin, then getXMax() returns XMax.
Definition: DPMBase.h:626
SpeciesHandler speciesHandler
A handler to that stores the species type i.e. LinearViscoelasticSpecies, etc.
Definition: DPMBase.h:1427
void setYMin(Mdouble newYMin)
Sets the value of YMin, the lower bound of the problem domain in the y-direction.
Definition: DPMBase.cc:1034
void setName(const std::string &name)
Allows to set the name of all the files (ene, data, fstat, restart, stat)
Definition: DPMBase.cc:422
Mdouble getTimeStep() const
Returns the simulation time step.
Definition: DPMBase.cc:1250
void setParticleDimensions(unsigned int particleDimensions)
Sets the particle dimensionality.
Definition: DPMBase.cc:1448
void setYMax(Mdouble newYMax)
Sets the value of YMax, the upper bound of the problem domain in the y-direction.
Definition: DPMBase.cc:1191
void setZMin(Mdouble newZMin)
Sets the value of ZMin, the lower bound of the problem domain in the z-direction.
Definition: DPMBase.cc:1058
void setXMax(Mdouble newXMax)
Sets the value of XMax, the upper bound of the problem domain in the x-direction.
Definition: DPMBase.cc:1165
ParticleHandler particleHandler
An object of the class ParticleHandler, contains the pointers to all the particles created.
Definition: DPMBase.h:1437
void setZMax(Mdouble newZMax)
Sets the value of ZMax, the upper bound of the problem domain in the z-direction.
Definition: DPMBase.cc:1217
void setTimeStep(Mdouble newDt)
Sets a new value for the simulation time step.
Definition: DPMBase.cc:1234
void setSystemDimensions(unsigned int newDim)
Sets the system dimensionality.
Definition: DPMBase.cc:1417
void setXMin(Mdouble newXMin)
Sets the value of XMin, the lower bound of the problem domain in the x-direction.
Definition: DPMBase.cc:1010
Mdouble getTimeMax() const
Returns the maximum simulation duration.
Definition: DPMBase.cc:888
void setGravity(Vec3D newGravity)
Sets a new value for the gravitational acceleration.
Definition: DPMBase.cc:1383
Mdouble getZMax() const
If the length of the problem domain in z-direction is ZMax - ZMin, then getZMax() returns ZMax.
Definition: DPMBase.h:650
void setDensity(Mdouble density)
Definition: ParticleSpecies.cc:108
Definition: Siegen.h:33
Mdouble NormalForce
Definition: Siegen.h:150
LinearViscoelasticFrictionSpecies * species
Definition: Siegen.h:155
Mdouble relOverlap
Definition: Siegen.h:149
Mdouble LoopTime
Definition: Siegen.h:154
Siegen(double NormalForce_=1000e-6)
Definition: Siegen.h:37
Mdouble RelLoopSize
Definition: Siegen.h:151
void setupInitialConditions() override
This function allows to set the initial conditions for our problem to be solved, by default particle ...
Definition: Siegen.h:147
Mdouble Angle
Definition: Siegen.h:152
Mdouble TangentialVelocity
Definition: Siegen.h:153
Contains material and contact force properties.
Definition: Species.h:35
A spherical particle is the most simple particle used in MercuryDPM.
Definition: SphericalParticle.h:37
Definition: Vector.h:51
const std::complex< Mdouble > i
Definition: ExtendedMath.h:51
T cubic(const T val)
calculates the cube of a number
Definition: ExtendedMath.h:115