MercuryDPM  0.11
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
force_test_demo.cpp File Reference

Go to the source code of this file.

Classes

class  particle_particle_collision
 
class  wall_particle_collision
 

Functions

void particle_particle_test ()
 
void wall_particle_test ()
 
int main (int argc UNUSED, char *argv[] UNUSED)
 

Function Documentation

int main ( int argc  UNUSED,
char *argv[]  UNUSED 
)

Definition at line 316 of file force_test_demo.cpp.

References particle_particle_test(), and wall_particle_test().

316  {
317 
318  std::cout << std::endl << "note: analytic values are only asymptotically correct as delta->0" << std::endl;
321 
322  return 0;
323 }
void particle_particle_test()
void wall_particle_test()
void particle_particle_test ( )

Definition at line 183 of file force_test_demo.cpp.

References particle_particle_collision::en, particle_particle_collision::getCollisionTime(), RNG::getRandomNumber(), particle_particle_collision::getRelativeVelocityComponents(), particle_particle_collision::initialNormalRelativeVelocity, particle_particle_collision::initialTangentialRelativeVelocity, particle_particle_collision::m12, constants::pi, DPMBase::random, Files::setName(), RNG::setRandomSeed(), particle_particle_collision::setupInitialConditions(), DPMBase::solve(), particle_particle_collision::species, mathsFunc::square(), and particle_particle_collision::tc.

Referenced by main().

184 {
185  std::cout << std::endl << "testing particle-particle collisions ..." << std::endl << std::endl;
186 
188 
189  problem.random.setRandomSeed(5);
190 
191  problem.setupInitialConditions();
192  Mdouble normalRelativeVelocity, tangentialRelativeVelocity, analyticTangentialRelativeVelocity;
193 
194  std::cout << "5: without tangential forces" << std::endl;
195  problem.setName("force_test5");
196  problem.solve();
197  problem.getRelativeVelocityComponents(normalRelativeVelocity, tangentialRelativeVelocity);
198  std::cout << "tangentialRelativeVelocity: analytic=" << problem.initialTangentialRelativeVelocity << ", simulation=" << tangentialRelativeVelocity << std::endl;
199  std::cout << "normalRelativeVelocity: analytic:" << -problem.en*problem.initialNormalRelativeVelocity << ", simulation=" << normalRelativeVelocity << std::endl;
200 
201  //problem.setAppend_to_files(true);
202 
203  std::cout << "6: with Coulomb friction" << std::endl;
204  Mdouble mu = problem.random.getRandomNumber(0.0,1.0);
205  problem.species->setSlidingFrictionCoefficient(mu);
206  problem.species->setSlidingDissipation(1e20);
207  //problem.species->setSlidingStiffness(0.0);
208  problem.setName("force_test6");
209  problem.solve();
210  problem.getRelativeVelocityComponents(normalRelativeVelocity, tangentialRelativeVelocity);
211  analyticTangentialRelativeVelocity = std::max(0.0,problem.initialTangentialRelativeVelocity + mu*3.5*(1+problem.en)*problem.initialNormalRelativeVelocity);
212  std::cout << "tangentialRelativeVelocity: analytic=" << analyticTangentialRelativeVelocity << ", simulation=" << tangentialRelativeVelocity << std::endl;
213  std::cout << "normalRelativeVelocity: analytic:" << -problem.en*problem.initialNormalRelativeVelocity << ", simulation=" << normalRelativeVelocity << std::endl;
214 
215  std::cout << "7: with Coulomb friction, spring activated" << std::endl;
216  problem.species->setSlidingStiffness(1.0);
217  //problem.species->setSlidingDissipation(1);
218  problem.setName("force_test7");
219  problem.solve();
220  std::cout << "tangentialRelativeVelocity: analytic=" << analyticTangentialRelativeVelocity << ", simulation=" << tangentialRelativeVelocity << std::endl;
221  std::cout << "normalRelativeVelocity: analytic:" << -problem.en*problem.initialNormalRelativeVelocity << ", simulation=" << normalRelativeVelocity << std::endl;
222 
223  std::cout << "8: with tangential viscous force" << std::endl;
224  Mdouble et = problem.random.getRandomNumber(-1.0,0.0);
225  problem.species->setSlidingFrictionCoefficient(1e20);
226  problem.species->setSlidingDissipation(-log(-et)/(2.0*problem.tc) /3.5 * 2.0 * problem.m12);
227  problem.species->setSlidingStiffness(0.0);
228  problem.setName("force_test8");
229  problem.solve();
230  problem.getRelativeVelocityComponents(normalRelativeVelocity, tangentialRelativeVelocity);
231  analyticTangentialRelativeVelocity = problem.initialTangentialRelativeVelocity * exp(-2.0*3.5*problem.species->getSlidingDissipation()/(2.0*problem.m12) * problem.getCollisionTime(2.0*problem.m12));
232  std::cout << "tangentialRelativeVelocity: analytic=" << analyticTangentialRelativeVelocity << ", simulation=" << tangentialRelativeVelocity << std::endl;
233  std::cout << "normalRelativeVelocity: analytic:" << -problem.en*problem.initialNormalRelativeVelocity << ", simulation=" << normalRelativeVelocity << std::endl;
234 
235  std::cout << "9: with tangential elastic force" << std::endl;
236  Mdouble et2 = problem.random.getRandomNumber(0.0,1.0);
237  problem.species->setSlidingFrictionCoefficient(1e20);
238  problem.species->setSlidingDissipation(0.0);
239  problem.species->setSlidingStiffness(problem.species->getStiffness()/3.5*mathsFunc::square(acos(-et2)/constants::pi));
240  problem.setName("force_test9");
241  problem.solve();
242  problem.getRelativeVelocityComponents(normalRelativeVelocity, tangentialRelativeVelocity);
243  analyticTangentialRelativeVelocity = problem.initialTangentialRelativeVelocity * cos(sqrt(problem.species->getSlidingStiffness()/problem.m12*3.5)* problem.getCollisionTime(2.0*problem.m12));
244  std::cout << "tangentialRelativeVelocity: analytic=" << analyticTangentialRelativeVelocity << ", simulation=" << tangentialRelativeVelocity << std::endl;
245  std::cout << "normalRelativeVelocity: analytic:" << -problem.en*problem.initialNormalRelativeVelocity << ", simulation=" << normalRelativeVelocity << std::endl;
246 
247 }
void solve()
The work horse of the code.
Definition: DPMBase.cc:1895
void getRelativeVelocityComponents(Mdouble &normalRelativeVelocity, Mdouble &tangentialRelativeVelocity)
double Mdouble
T square(T val)
squares a number
Definition: ExtendedMath.h:91
void setName(const std::string &name)
Allows to set the name of all the files (ene, data, fstat, restart, stat)
Definition: Files.cc:149
const Mdouble pi
Definition: ExtendedMath.h:42
virtual void setupInitialConditions()
This function allows to set the initial conditions for our problem to be solved, by default particle ...
void setRandomSeed(unsigned long int new_seed)
This is the seed for the random number generator. (note the call to seed_LFG is only required really ...
Definition: RNG.cc:46
RNG random
This is a random generator, often used for setting up the initial conditions etc...
Definition: DPMBase.h:873
LinearViscoelasticSlidingFrictionSpecies * species
Mdouble getCollisionTime(Mdouble mass)
Calculates collision time for two copies of a particle of species 0.
Mdouble getRandomNumber(Mdouble min, Mdouble max)
This is a random generating routine can be used for initial positions.
Definition: RNG.cc:69
void wall_particle_test ( )

Definition at line 249 of file force_test_demo.cpp.

References particle_particle_collision::en, particle_particle_collision::getCollisionTime(), RNG::getRandomNumber(), wall_particle_collision::getRelativeVelocityComponents(), particle_particle_collision::initialNormalRelativeVelocity, particle_particle_collision::initialTangentialRelativeVelocity, particle_particle_collision::m12, constants::pi, DPMBase::random, Files::setName(), wall_particle_collision::setupInitialConditions(), DPMBase::solve(), particle_particle_collision::species, mathsFunc::square(), and particle_particle_collision::tc.

Referenced by main().

250 {
251  std::cout << std::endl << "testing wall-particle collisions ..." << std::endl << std::endl;
252 
253  srand(5);
254 
255  wall_particle_collision problem;
256  problem.setupInitialConditions();
257 
258  Mdouble normalRelativeVelocity, tangentialRelativeVelocity, analyticTangentialRelativeVelocity;
259 
260  //problem.setAppend_to_files(true);
261 
262  std::cout << "0: without tangential forces" << std::endl;
263  problem.setName("force_test0");
264  problem.solve();
265 
266  problem.getRelativeVelocityComponents(normalRelativeVelocity, tangentialRelativeVelocity);
267  std::cout << "tangentialRelativeVelocity: analytic=" << problem.initialTangentialRelativeVelocity << ", simulation=" << tangentialRelativeVelocity << std::endl;
268  std::cout << "normalRelativeVelocity: analytic:" << -problem.en*problem.initialNormalRelativeVelocity << ", simulation=" << normalRelativeVelocity << std::endl;
269 
270  std::cout << "1: with Coulomb friction" << std::endl;
271  Mdouble mu = problem.random.getRandomNumber(0.0,1.0);
272  problem.species->setSlidingFrictionCoefficient(mu);
273  problem.species->setSlidingDissipation(1e20);
274  problem.species->setSlidingStiffness(0.0);
275  problem.setName("force_test1");
276  problem.solve();
277  problem.getRelativeVelocityComponents(normalRelativeVelocity, tangentialRelativeVelocity);
278  analyticTangentialRelativeVelocity = std::max(0.0,problem.initialTangentialRelativeVelocity + mu*3.5*(1+problem.en)*problem.initialNormalRelativeVelocity);
279  std::cout << "tangentialRelativeVelocity: analytic=" << analyticTangentialRelativeVelocity << ", simulation=" << tangentialRelativeVelocity << std::endl;
280  std::cout << "normalRelativeVelocity: analytic:" << -problem.en*problem.initialNormalRelativeVelocity << ", simulation=" << normalRelativeVelocity << std::endl;
281 
282  std::cout << "2: with Coulomb friction, spring activated" << std::endl;
283  problem.species->setSlidingStiffness(1.0);
284  problem.setName("force_test2");
285  problem.solve();
286  std::cout << "tangentialRelativeVelocity: analytic=" << analyticTangentialRelativeVelocity << ", simulation=" << tangentialRelativeVelocity << std::endl;
287  std::cout << "normalRelativeVelocity: analytic:" << -problem.en*problem.initialNormalRelativeVelocity << ", simulation=" << normalRelativeVelocity << std::endl;
288 
289  std::cout << "3: with tangential viscous force" << std::endl;
290  Mdouble et = problem.random.getRandomNumber(-1.0,0.0);
291  problem.species->setSlidingFrictionCoefficient(1e20);
292  problem.species->setSlidingDissipation(-log(-et)/(2.0*problem.tc) /3.5 * 2.0 * problem.m12);
293  problem.species->setSlidingStiffness(0.0);
294  problem.setName("force_test3");
295  problem.solve();
296  problem.getRelativeVelocityComponents(normalRelativeVelocity, tangentialRelativeVelocity);
297  analyticTangentialRelativeVelocity = problem.initialTangentialRelativeVelocity * exp(-2.0*3.5*problem.species->getSlidingDissipation()/(2.0*problem.m12) * problem.getCollisionTime(2.0*problem.m12));
298  std::cout << "tangentialRelativeVelocity: analytic=" << analyticTangentialRelativeVelocity << ", simulation=" << tangentialRelativeVelocity << std::endl;
299  std::cout << "normalRelativeVelocity: analytic:" << -problem.en*problem.initialNormalRelativeVelocity << ", simulation=" << normalRelativeVelocity << std::endl;
300 
301  std::cout << "4: with tangential elastic force" << std::endl;
302  Mdouble et2 = problem.random.getRandomNumber(0.0,1.0);
303  problem.species->setSlidingFrictionCoefficient(1e20);
304  problem.species->setSlidingDissipation(0.0);
305  problem.species->setSlidingStiffness(problem.species->getStiffness()/3.5*mathsFunc::square(acos(-et2)/constants::pi));
306  problem.setName("force_test4");
307  problem.solve();
308  problem.getRelativeVelocityComponents(normalRelativeVelocity, tangentialRelativeVelocity);
309  analyticTangentialRelativeVelocity = problem.initialTangentialRelativeVelocity * cos(sqrt(problem.species->getSlidingStiffness()/problem.m12*3.5)* problem.getCollisionTime(2.0*problem.m12));
310  std::cout << "tangentialRelativeVelocity: analytic=" << analyticTangentialRelativeVelocity << ", simulation=" << tangentialRelativeVelocity << std::endl;
311  std::cout << "normalRelativeVelocity: analytic:" << -problem.en*problem.initialNormalRelativeVelocity << ", simulation=" << normalRelativeVelocity << std::endl;
312 }
void solve()
The work horse of the code.
Definition: DPMBase.cc:1895
double Mdouble
T square(T val)
squares a number
Definition: ExtendedMath.h:91
void setName(const std::string &name)
Allows to set the name of all the files (ene, data, fstat, restart, stat)
Definition: Files.cc:149
const Mdouble pi
Definition: ExtendedMath.h:42
void getRelativeVelocityComponents(Mdouble &normalRelativeVelocity, Mdouble &tangentialRelativeVelocity)
RNG random
This is a random generator, often used for setting up the initial conditions etc...
Definition: DPMBase.h:873
LinearViscoelasticSlidingFrictionSpecies * species
void setupInitialConditions()
This function allows to set the initial conditions for our problem to be solved, by default particle ...
Mdouble getCollisionTime(Mdouble mass)
Calculates collision time for two copies of a particle of species 0.
Mdouble getRandomNumber(Mdouble min, Mdouble max)
This is a random generating routine can be used for initial positions.
Definition: RNG.cc:69