HG-MD
1
|
Used by Chute::create_bottom to create an unordered particle layer. More...
#include <ChuteBottom.h>
Public Member Functions | |
ChuteBottom () | |
This is the default constructor. All it does is set sensible defaults. | |
ChuteBottom (MD &other) | |
Copy-constructor for creates an HGRID problem from an existing MD problem. | |
ChuteBottom (HGRID_base &other) | |
ChuteBottom (HGRID_3D &other) | |
ChuteBottom (Chute &other) | |
void | constructor () |
This is the actual constructor it is called do both constructors above. | |
void | make_rough_bottom (ParticleHandler &ChuteParticleHandler) |
void | setup_particles_initial_conditions () |
initialize particle position, velocity, radius | |
void | actions_before_time_step () |
This is action before the time step is started. | |
Mdouble | get_thickness () |
void | set_thickness (Mdouble new_) |
Mdouble | get_periodicbottom () |
void | set_periodicbottom (bool new_) |
Private Attributes | |
Mdouble | thickness |
bool | periodicbottom |
Used by Chute::create_bottom to create an unordered particle layer.
It creates a thick layer of particles in a box of the same x and y dimensions as the Chute, and places a thin slice of that layer as fixed particles at the base of the chute.
ChuteBottom::ChuteBottom | ( | ) | [inline] |
This is the default constructor. All it does is set sensible defaults.
References constructor().
{constructor();}
ChuteBottom::ChuteBottom | ( | MD & | other | ) | [inline] |
Copy-constructor for creates an HGRID problem from an existing MD problem.
References constructor().
: MD(other), Chute(other) {constructor();}
ChuteBottom::ChuteBottom | ( | HGRID_base & | other | ) | [inline] |
References constructor().
: MD(other), Chute(other) {constructor();}
ChuteBottom::ChuteBottom | ( | HGRID_3D & | other | ) | [inline] |
References constructor().
: MD(other), Chute(other) {constructor();}
ChuteBottom::ChuteBottom | ( | Chute & | other | ) | [inline] |
References constructor().
: MD(other), Chute(other) {constructor();}
void ChuteBottom::actions_before_time_step | ( | ) | [inline, virtual] |
void ChuteBottom::constructor | ( | ) | [inline] |
This is the actual constructor it is called do both constructors above.
Reimplemented from Chute.
References MD::set_name(), STD_save::set_options_data(), STD_save::set_options_fstat(), STD_save::set_options_restart(), set_periodicbottom(), and set_thickness().
Referenced by ChuteBottom().
{ set_name("roughbottom"); set_options_fstat(0); //set to 0 for no data creation set_options_data(1); set_options_restart(1); set_thickness(2.4); set_periodicbottom(true); }
Mdouble ChuteBottom::get_periodicbottom | ( | ) | [inline] |
References periodicbottom.
{return periodicbottom;}
Mdouble ChuteBottom::get_thickness | ( | ) | [inline] |
void ChuteBottom::make_rough_bottom | ( | ParticleHandler & | ChuteParticleHandler | ) | [inline] |
todo{Dinant is not a fan of this alogirm (i.e. poping back stuff while in iterator}
References ParticleHandler::begin(), ParticleHandler::end(), Chute::get_collision_time(), MD::get_dt(), Chute::get_InflowParticleRadius(), ParticleHandler::get_NumberOfParticles(), MD::get_ParticleHandler(), Chute::MaxInflowParticleRadius, ParticleHandler::removeParticle(), Chute::set_ChuteAngle(), Chute::set_collision_time_and_restitution_coefficient(), Chute::set_dt(), Chute::set_FixedParticleRadius(), Chute::set_InflowHeight(), MD::set_mu(), Chute::set_RandomizedBottom(), MD::set_savecount(), ParticleHandler::set_StorageCapacity(), MD::set_tmax(), MD::solve(), and thickness.
Referenced by Chute::create_bottom().
{ // set all parameters that should be different from the original chute set_ChuteAngle(0.0); set_InflowHeight(25.*get_InflowParticleRadius()); //~ set_InflowHeight(45.*get_InflowParticleRadius()); note: Changing the Inflow height was an attempt to make the bottom density homogeneous, but it did not have the desired effect set_RandomizedBottom(1); set_FixedParticleRadius(get_InflowParticleRadius()); set_collision_time_and_restitution_coefficient(get_collision_time()*10.0, 0.2); set_mu(0); set_dt(); set_dt(get_dt()*10.0); set_tmax(get_dt()*2e3); //set_number_of_saves(2); set_savecount(100); //solve solve(); //create_bottom Mdouble height = 0; for (vector<Particle*>::iterator it=get_ParticleHandler().begin(); it!=get_ParticleHandler().end(); it++) { height = max(height,(*it)->get_Position().Z); } cout << "Thickness" << thickness << endl; //now cut a slice of width 2*MaxInflowParticleRadius for (vector<Particle*>::iterator it=get_ParticleHandler().begin(); it!=get_ParticleHandler().end();) { if ((*it)->get_Position().Z < height - (1.0+thickness)*MaxInflowParticleRadius || (*it)->get_Position().Z > height - MaxInflowParticleRadius) { //delete particles outside the given range //*it = get_ParticleHandler().back(); //get_ParticleHandler().removeLastParticle(); get_ParticleHandler().removeParticle((*it)->get_Index()); } else { //fix the remaining particles on the floor (*it)->get_Position().Z -= height - MaxInflowParticleRadius; (*it)->fixParticle(); it++; } } //copy the rough bottom over ChuteParticleHandler.set_StorageCapacity(get_ParticleHandler().get_NumberOfParticles()); cout << "Chute bottom finished, consisting of " << get_ParticleHandler().get_NumberOfParticles() << " Particles" << endl; ChuteParticleHandler = get_ParticleHandler(); }
void ChuteBottom::set_periodicbottom | ( | bool | new_ | ) | [inline] |
void ChuteBottom::set_thickness | ( | Mdouble | new_ | ) | [inline] |
References thickness.
Referenced by constructor().
{ if (new_>0.0) thickness=new_; else {cerr<<"Error: thickness " << new_ << " negative"<<endl; exit(-1);} }
void ChuteBottom::setup_particles_initial_conditions | ( | ) | [inline, virtual] |
initialize particle position, velocity, radius
This initially set up the particles///.
todo{Why is this an error?}
Reimplemented from Chute.
References Particle::compute_particle_mass(), Chute::create_bottom(), cubic, Chute::FixedParticleRadius, Chute::get_FixedParticleRadius(), Chute::get_InflowParticleRadius(), Chute::get_MaxInflowParticleRadius(), Chute::get_MinInflowParticleRadius(), ParticleHandler::get_NumberOfParticles(), MD::get_ParticleHandler(), Particle::get_Position(), Particle::get_Radius(), RNG::get_RN(), MD::get_xmax(), MD::get_xmin(), MD::get_ymax(), MD::get_ymin(), MD::get_zmax(), MD::get_zmin(), HGRID_base::HGRID_actions_before_time_loop(), Chute::IsInsertable(), Chute::max_failed, Chute::num_created, Chute::P0, periodicbottom, MD::random, HGRID_base::set_HGRID_cell_to_cell_ratio(), HGRID_base::set_HGRID_max_levels(), HGRID_base::set_HGRID_num_buckets_to_power(), Particle::set_Radius(), ParticleHandler::set_StorageCapacity(), Particle::set_Velocity(), MD::Species, MD::Walls, MD::WallsPeriodic, Vec3D::X, Vec3D::Y, and Vec3D::Z.
{ get_ParticleHandler().set_StorageCapacity((int)min(3.0*get_xmax()*get_ymax()*get_zmax()/cubic(2.0*get_InflowParticleRadius()),1e6)); create_bottom(); if (periodicbottom) { Walls.resize(1); Walls.back().set(Vec3D(0.0, 0.0, -1.0), -get_zmin()+get_InflowParticleRadius()); WallsPeriodic.resize(2); WallsPeriodic[0].set(Vec3D( 1.0, 0.0, 0.0), get_xmin(), get_xmax()); WallsPeriodic[1].set(Vec3D( 0.0, 1.0, 0.0), get_ymin(), get_ymax()); } else { WallsPeriodic.resize(0); Walls.resize(5); Walls[0].set(Vec3D(0.0, 0.0, -1.0), -get_zmin()+get_InflowParticleRadius()); Walls[Walls.size()-4].set(Vec3D(-1.0, 0.0, 0.0), -get_xmin()); Walls[Walls.size()-3].set(Vec3D( 1.0, 0.0, 0.0), get_xmax()); Walls[Walls.size()-2].set(Vec3D( 0.0,-1.0, 0.0), -get_ymin()); Walls[Walls.size()-1].set(Vec3D( 0.0, 1.0, 0.0), get_ymax()); } //add particles HGRID_actions_before_time_loop(); int failed = 0, max_failed = 500; //try max_failed times to find new insertable particle while (failed<=max_failed){ P0.set_Radius(FixedParticleRadius); P0.compute_particle_mass(Species); P0.get_Position().X = random.get_RN(P0.get_Radius(), get_xmax()-P0.get_Radius()); P0.get_Position().Y = random.get_RN(P0.get_Radius(), get_ymax()-P0.get_Radius()); P0.get_Position().Z = random.get_RN(2*P0.get_Radius(), get_zmax()-P0.get_Radius()); P0.set_Velocity(Vec3D(0.0,0.0,0.0)); if (IsInsertable(P0)) { failed = 0; /*if (Particles.capacity()==Particles.size()) { cerr << "Error in creating bottom; exceeded capacity: " << Particles.size() << endl; exit(-1); }*/ //Particles.push_back (P0); //Undate the link list so this particle is back in the grid //grid->objectBucket[Particles[Particles.size()-1].bucket] = Particles.size()-1; //grid->objectBucket[Particles[Particles.size()-1].bucket] = &Particles[Particles.size()-1]; num_created++; } else failed++; } //set_Nmax(get_ParticleHandler().get_NumberOfParticles()); cout << "N=" << get_ParticleHandler().get_NumberOfParticles() << endl; //fix hgrid (there is still an issue when particles are polydispersed) //assume 1-2 levels are optimal (which is the case for mono and bidispersed) and set the cell size to min and max // !this is not optimal for polydispersed Mdouble minCell = 2.*min(get_FixedParticleRadius(),get_MinInflowParticleRadius()); Mdouble maxCell = 2.*max(get_FixedParticleRadius(),get_MaxInflowParticleRadius()); if ((minCell==maxCell)|(minCell==0.)) set_HGRID_max_levels(1); else set_HGRID_max_levels(2); set_HGRID_cell_to_cell_ratio (1.0000000001*maxCell/minCell); //optimize number of buckets set_HGRID_num_buckets_to_power(get_ParticleHandler().get_NumberOfParticles()*1.5); //end: fix hgrid //~ info(); }
bool ChuteBottom::periodicbottom [private] |
Referenced by get_periodicbottom(), set_periodicbottom(), and setup_particles_initial_conditions().
Mdouble ChuteBottom::thickness [private] |
Referenced by get_thickness(), make_rough_bottom(), and set_thickness().