QuaternionWallUnitTest.cpp File Reference

Classes

class  QuaternionWallUnitTest
 

Functions

int main ()
 

Function Documentation

◆ main()

int main ( )
Todo:
why do we need to set the position?
43  {
44 
45  //setup problem
47  q.setName("QuaternionWallUnitTest");
48  q.setMin(-6,-6,-6);
49  q.setMax(6,6,6);
50  q.setDimension(3);
51  q.setGravity(Vec3D(0,0,0));
52 
53  //set time parameters
54  q.setTimeStep(0.01);
55  q.setTimeMax(20*pi);
56  q.setSaveCount(100);
57 
58  //set species
59  auto s = q.speciesHandler.copyAndAddObject(LinearViscoelasticFrictionBondedSpecies());
60  s->setDensity(6/pi);
61  s->setCollisionTimeAndNormalAndTangentialRestitutionCoefficient(1,0.5,0.5,1);
62  s->setBondForceMax(.5);
63  s->setSlidingFrictionCoefficient(0.5);
64  s->setRollingStiffness(.2*s->getStiffness());
65  s->setRollingDissipation(.2*s->getDissipation());
66  s->setRollingFrictionCoefficient(0.2);
67 
68  Mdouble angularVelocity = 0.025;
69 
70  logger(INFO, "Create cylindrical wall rotating around its axis");
71  {
72  Vec3D position = Vec3D(1.5, 0, 1.5); //position in top right corner
73 
74  //Create wall
76  w.setSpecies(s);
77  w.setPosition(position);
78  w.setAxis(Vec3D(0, 1, 0));
79  w.addObject(Vec3D(-1, 0, 0), Vec3D(.5, 0, 0));
80  w.addObject(Vec3D(0, 0, 1), Vec3D(0, 0, -1));
81  w.addObject(Vec3D(0, 0, -1), Vec3D(0, 0, 1));
82  w.setAngularVelocity(angularVelocity*Vec3D(0, 1, 0));
83  q.wallHandler.copyAndAddObject(w);
84 
85  //Create particle
87  p.setRadius(0.50001);
88  p.setVelocity(Vec3D(0, 0, 0));
89  p.setPosition(position + Vec3D(0, 0, 1));
90  q.particleHandler.copyAndAddObject(p);
91  p.setPosition(position + Vec3D(0, 0, -1));
92  q.particleHandler.copyAndAddObject(p);
93  p.setPosition(position + Vec3D(1, 0, 0));
94  q.particleHandler.copyAndAddObject(p);
95  p.setPosition(position + Vec3D(-1, 0, 0));
96  q.particleHandler.copyAndAddObject(p);
97  }
98 
99  logger(INFO, "Create cubic wall rotating around its axis");
100  {
101  Vec3D position = Vec3D(-1.5, 0, -1.5); //bottom left corner
102 
103  //Create wall
105  w.setSpecies(s);
106  w.setPosition(position);
107  w.addObject(Vec3D( 1, 0, 0), Vec3D(-.5, 0, 0));
108  w.addObject(Vec3D(-1, 0, 0), Vec3D( .5, 0, 0));
109  w.addObject(Vec3D( 0, 1, 0), Vec3D( 0,-.5, 0));
110  w.addObject(Vec3D( 0,-1, 0), Vec3D( 0, .5, 0));
111  w.addObject(Vec3D( 0, 0, 1), Vec3D( 0, 0,-.5));
112  w.addObject(Vec3D( 0, 0,-1), Vec3D( 0, 0, .5));
113  w.setAngularVelocity(angularVelocity*Vec3D(0, 1, 0));
114  q.wallHandler.copyAndAddObject(w);
115 
116  //Create particle
118  p.setRadius(0.50001);
119  p.setVelocity(Vec3D(0, 0, 0));
120  p.setPosition(position + Vec3D(0, 0, 1));
121  q.particleHandler.copyAndAddObject(p);
122  p.setPosition(position + Vec3D(0, 0, -1));
123  q.particleHandler.copyAndAddObject(p);
124  p.setPosition(position + Vec3D(1, 0, 0));
125  q.particleHandler.copyAndAddObject(p);
126  p.setPosition(position + Vec3D(-1, 0, 0));
127  q.particleHandler.copyAndAddObject(p);
128  }
129 
130  logger(INFO, "Create square outer wall rotating around the other walls");
131  {
132  //Create Wall
133  InfiniteWall w;
134  w.setSpecies(s);
135  w.setPosition(Vec3D(0,0,5));
136  w.setAngularVelocity(angularVelocity*Vec3D(0, 1, 0));
137  w.setNormal(Vec3D(0,0,1));
138  w.setPrescribedPosition(
139  [angularVelocity] (Mdouble time)
140  { return 5.0*Vec3D(sin(angularVelocity*time),0.0,cos(angularVelocity*time)); });
141  q.wallHandler.copyAndAddObject(w);
142 
144  w.setPosition(Vec3D(5,0,0));
145  w.setNormal(Vec3D(1,0,0));
146  w.setPrescribedPosition(
147  [angularVelocity] (Mdouble time)
148  { return 5.0*Vec3D(sin(angularVelocity*time+0.5*pi),0.0,cos(angularVelocity*time+0.5*pi)); });
149  q.wallHandler.copyAndAddObject(w);
150 
151  w.setPosition(Vec3D(0,0,-5));
152  w.setNormal(Vec3D(0,0,-1));
153  w.setPrescribedPosition(
154  [angularVelocity] (Mdouble time)
155  { return 5.0*Vec3D(sin(angularVelocity*time+pi),0.0,cos(angularVelocity*time+pi)); });
156  q.wallHandler.copyAndAddObject(w);
157 
158  w.setPosition(Vec3D(-5,0,0));
159  w.setNormal(Vec3D(-1,0,0));
160  w.setPrescribedPosition(
161  [angularVelocity] (Mdouble time)
162  { return 5.0*Vec3D(sin(angularVelocity*time+1.5*pi),0.0,cos(angularVelocity*time+1.5*pi)); });
163  q.wallHandler.copyAndAddObject(w);
164 
165  //Create particle
167  p.setRadius(0.50001);
168  p.setVelocity(Vec3D(0, 0, 0));
169  p.setPosition(Vec3D( 0, 0,-4.5));
170  q.particleHandler.copyAndAddObject(p);
171  p.setPosition(Vec3D(-4.5, 0, 0));
172  q.particleHandler.copyAndAddObject(p);
173  p.setPosition(Vec3D( 0, 0, 4.5));
174  q.particleHandler.copyAndAddObject(p);
175  p.setPosition(Vec3D( 4.5, 0, 0));
176  q.particleHandler.copyAndAddObject(p);
177  }
178 
179 
180  //q.wallHandler.setWriteVTK(FileType::MULTIPLE_FILES);
181  //q.setParticlesWriteVTK(true);
182 
183  //solve
184  q.solve();
185 
186  return 0;
187 }
AnnoyingScalar cos(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:136
AnnoyingScalar sin(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:137
Species< LinearViscoelasticNormalSpecies, FrictionSpecies, BondedSpecies > LinearViscoelasticFrictionBondedSpecies
Definition: LinearViscoelasticFrictionBondedSpecies.h:13
Logger< MERCURYDPM_LOGLEVEL > logger("MercuryKernel")
Definition of different loggers with certain modules. A user can define its own custom logger here.
RowVector3d w
Definition: Matrix_resize_int.cpp:3
float * p
Definition: Tutorial_Map_using.cpp:9
Use AxisymmetricIntersectionOfWalls to Screw Screw::read Screw::read Screw::read define axisymmetric ...
Definition: AxisymmetricIntersectionOfWalls.h:105
A infinite wall fills the half-space {point: (position_-point)*normal_<=0}.
Definition: InfiniteWall.h:27
A IntersectionOfWalls is convex polygon defined as an intersection of InfiniteWall's.
Definition: IntersectionOfWalls.h:38
Definition: QuaternionWallUnitTest.cpp:19
A spherical particle is the most simple particle used in MercuryDPM.
Definition: SphericalParticle.h:16
Definition: Kernel/Math/Vector.h:30
RealScalar s
Definition: level1_cplx_impl.h:130
#define INFO(i)
Definition: mumps_solver.h:54
EIGEN_DEVICE_FUNC const Scalar & q
Definition: SpecialFunctionsImpl.h:2019
const Mdouble pi
Definition: ExtendedMath.h:23

References cos(), INFO, logger, p, constants::pi, Eigen::numext::q, s, sin(), and w.