HG-MD  1
Public Member Functions | Private Attributes
ChuteBottom Class Reference

Used by Chute::create_bottom to create an unordered particle layer. More...

#include <ChuteBottom.h>

Inheritance diagram for ChuteBottom:
Inheritance graph
[legend]
Collaboration diagram for ChuteBottom:
Collaboration graph
[legend]

List of all members.

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

Detailed Description

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.


Constructor & Destructor Documentation

This is the default constructor. All it does is set sensible defaults.

References 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();}

Member Function Documentation

void ChuteBottom::actions_before_time_step ( ) [inline, virtual]

This is action before the time step is started.

Reimplemented from Chute.

{       };
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);
        }

References periodicbottom.

{return periodicbottom;}

References thickness.

{return thickness;}
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]

References periodicbottom.

Referenced by constructor().

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);}
        }

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();
        }

Member Data Documentation


The documentation for this class was generated from the following file:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines