MercuryDPM  0.11
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
FreeCooling3DDemo.cpp
Go to the documentation of this file.
1 //Copyright (c) 2013-2014, 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 
27 #include<iostream>
29 
30 #include "Mercury3D.h"
31 #include "Particles/BaseParticle.h"
32 #include "Walls/InfiniteWall.h"
33 #include "MercuryTime.h"
34 
43 {
44 public:
45 
47  {
48  unsigned int N1 = static_cast<unsigned int>(pow(N, 0.33)) + 1;
49  BaseParticle p0;
50  for (unsigned int i = 0; i < N; i++)
51  {
52  unsigned int ix = static_cast<unsigned int>(i%N1);
53  unsigned int iz = static_cast<unsigned int>(i/N1/N1);
54  unsigned int iy = (i - ix - N1 * N1 * iz) / N1;
55 
56  double x = (getXMax() - getXMin()) * (ix + 1) / (N1 + 1);
57  double y = (getYMax() - getYMin()) * (iy+1) / (N1 + 1);
58  double z = (getZMax() - getZMin()) * (iz + 1) / (N1 + 1);
59 
60  p0.setPosition(Vec3D(x,y,z));
61  p0.setVelocity(20*Vec3D(0.1,0.1,0.1));
62  p0.setRadius(0.002);
64  }
65 
67  InfiniteWall w0;
68  w0.set(Vec3D(-1.0, 0.0, 0.0), Vec3D(getXMin(), 0, 0));
70  w0.set(Vec3D(1.0, 0.0, 0.0), Vec3D(getXMax(), 0, 0));
72  w0.set(Vec3D(0.0,-1.0, 0.0), Vec3D(0, getYMin(), 0));
74  w0.set(Vec3D(0.0, 1.0, 0.0), Vec3D(0, getYMax(), 0));
76  w0.set(Vec3D(0.0, 0.0,-1.0), Vec3D(0, 0, getZMin()));
78  w0.set(Vec3D(0.0, 0.0, 1.0), Vec3D(0, 0, getZMax()));
80  }
81 
83  unsigned int N;
84 };
85 
86 int main(int argc UNUSED, char *argv[] UNUSED)
87 {
88  std::cout << "In this file 10^3 particles with the same velocity are placed "
89  "in a tri-axial box. This makes them collide with the walls and eachother. "
90  "Afterwards the same run is performed with hgrid on. It tests the working "
91  "(and speedup) of the hgrid." << std::endl;
92 
93  Time time;
94  time.tic();
97  auto species = new LinearViscoelasticSpecies;
98  problem.speciesHandler.addObject(species);
99  species->setDensity(2000);
100  species->setDissipation(0.005);
101  species->setStiffness(1e3);
102 
103  problem.setXMax(0.1);
104  problem.setYMax(0.1);
105  problem.setZMax(0.1);
106  problem.N=1000;
107  problem.setName("FreeCooling3DDemo");
108  problem.setGravity(Vec3D(0.0,0.0,0.0));
109  problem.setTimeStep(5e-5);
110  problem.setSaveCount(4);
111  problem.setTimeMax(0.08);
112  problem.setSystemDimensions(3);
113 
114  problem.setHGridMaxLevels(1);
115  problem.setHGridCellOverSizeRatio(1.2);
116  problem.setHGridUpdateEachTimeStep(false);
117  problem.solve();
118 
119  std::cout << "Total time to run this simulation: " << time.toc() << "s" << std::endl;
120 }
unsigned int N
Number of particles in the system.
void setXMax(Mdouble newXMax)
If the length of the problem domain in x-direction is XMax - XMin, this method sets XMax...
Definition: DPMBase.cc:309
void solve()
The work horse of the code.
Definition: DPMBase.cc:1895
void setVelocity(const Vec3D &velocity)
set the velocity of the BaseInteractable.
void setTimeMax(Mdouble newTMax)
Allows the upper time limit to be changed.
Definition: DPMBase.cc:179
Mdouble getZMax() const
If the length of the problem domain in z-direction is ZMax - ZMin, then getZMax() returns ZMax...
Definition: DPMBase.cc:259
Mdouble getXMin() const
If the length of the problem domain in x-direction is XMax - XMin, then getXMin() returns XMin...
Definition: DPMBase.cc:224
void setHGridUpdateEachTimeStep(bool updateEachTimeStep)
Sets whether or not the HGrid must be updated every time step.
Definition: MercuryBase.cc:172
Allows for timing the algorithms; accurate up to 0.01 sec.
Definition: MercuryTime.h:40
int main(int argc UNUSED, char *argv[] UNUSED)
Mdouble getYMin() const
If the length of the problem domain in y-direction is YMax - YMin, then getYMin() returns YMin...
Definition: DPMBase.cc:238
void setZMax(Mdouble newZMax)
If the length of the problem domain in z-direction is XMax - XMin, this method sets ZMax...
Definition: DPMBase.cc:338
void tic()
This is like a start button of a stopwatch. Assigns the variable start with the current number of clo...
Definition: MercuryTime.h:48
void setSystemDimensions(unsigned int newDim)
Allows for the dimension of the simulation to be changed.
Definition: DPMBase.cc:453
void setGravity(Vec3D newGravity)
Allows to modify the gravity vector.
Definition: DPMBase.cc:431
void setRadius(const Mdouble radius)
Sets the particle's radius_ (and adjusts the mass_ accordingly, based on the particle's species) ...
Mdouble getXMax() const
If the length of the problem domain in x-direction is XMax - XMin, then getXMax() returns XMax...
Definition: DPMBase.cc:231
void setYMax(Mdouble newYMax)
If the length of the problem domain in y-direction is YMax - YMin, this method sets YMax...
Definition: DPMBase.cc:324
Mdouble toc()
This is like a stop button of a stopwatch. Assigns the variable finish to the current value of ticks ...
Definition: MercuryTime.h:58
void setName(const std::string &name)
Allows to set the name of all the files (ene, data, fstat, restart, stat)
Definition: Files.cc:149
U * copyAndAddObject(const U &O)
Creates a copy of a Object and adds it to the BaseHandler.
Definition: BaseHandler.h:268
virtual void addObject(ParticleSpecies *const S)
Adds a new ParticleSpecies to the SpeciesHandler.
This adds on the hierarchical grid code for 3D problems.
Definition: Mercury3D.h:35
ParticleHandler particleHandler
An object of the class ParticleHandler, contains the pointers to all the particles created...
Definition: DPMBase.h:878
#define UNUSED
Definition: GeneralDefine.h:37
void setHGridCellOverSizeRatio(Mdouble cellOverSizeRatio)
Sets the ratio of the smallest cell over the smallest particle.
Definition: MercuryBase.cc:487
void setSaveCount(unsigned int saveCount)
Sets File::saveCount_ for all files (ene, data, fstat, restart, stat)
Definition: Files.cc:138
Species< LinearViscoelasticNormalSpecies > LinearViscoelasticSpecies
void setHGridMaxLevels(unsigned int HGridMaxLevels)
Sets the maximum number of levels of the HGrid in this MercuryBase.
Definition: MercuryBase.cc:500
SpeciesHandler speciesHandler
A handler to that stores the species type i.e. elastic, linear visco-elastic... et cetera...
Definition: DPMBase.h:868
todo{This code is not working as is wanted}
Mdouble getYMax() const
If the length of the problem domain in y-direction is YMax - YMin, then getYMax() returns XMax...
Definition: DPMBase.cc:245
WallHandler wallHandler
An object of the class WallHandler. Contains pointers to all the walls created.
Definition: DPMBase.h:883
void setPosition(const Vec3D &position)
Sets the position of this BaseInteractable.
void set(Vec3D normal, Vec3D point)
Defines a standard wall, given an outward normal vector s.t. normal*x=normal*point for all x of the w...
Definition: InfiniteWall.cc:70
Mdouble getZMin() const
If the length of the problem domain in z-direction is ZMax - ZMin, then getZMin() returns ZMin...
Definition: DPMBase.cc:252
void setTimeStep(Mdouble newDt)
Allows the time step dt to be changed.
Definition: DPMBase.cc:353
This is a class defining walls.
Definition: InfiniteWall.h:43
Implementation of a 3D vector (by Vitaliy).
Definition: Vector.h:45
void clear()
Empties the whole BaseHandler by removing all Objects and setting all other variables to 0...
Definition: BaseHandler.h:360
void setupInitialConditions()
This function allows to set the initial conditions for our problem to be solved, by default particle ...