NetDEM v1.0
Loading...
Searching...
No Matches
94_angle_repose_trimesh.cpp

This is an example of how to use the netdem library.

#include "data_dumper.hpp"
#include "gen_pack.hpp"
#include "gravity.hpp"
#include "shape_plane.hpp"
#include "simulation.hpp"
#include "stl_model.hpp"
#include <iostream>
#include <unordered_map>
using namespace netdem;
using namespace std;
void AngleRepose(bool need_make_convex, double friction, string root_dir) {
// new simulation
Simulation *sim = new Simulation();
// domain settings
sim->domain_manager.SetBound(-1, -1, -1, 1, 1, 1);
auto domain = sim->domain_manager.GetSelfSubDomain();
domain->cell_manager.SetSpacing(0.02, 0.02, 0.02);
// define contact model
LinearSpring cnt_model = LinearSpring(1.0e2, 1.0e4, 0.7, friction);
sim->scene.InsertContactModel(&cnt_model);
sim->scene.SetCollisionModel(0, 0, cnt_model.label);
// shape template
STLModel stl_model;
stl_model.InitFromSTL("data/mms_soil.stl");
if (need_make_convex) {
stl_model.MakeConvex();
stl_model.SmoothMesh(3);
stl_model.Refine(2);
}
sh.InitFromSTL(stl_model);
sh.SetSize(0.005);
sim->scene.InsertShape(&sh);
// get a pack of particles
VecXT<Particle> particle_list = PackGenerator::GetGridPack(
0.04, 0.04, 0.04, 0, 0, 0.10, 5, 5, 5, sim->scene.GetShapes());
for (auto &p : particle_list) {
p.SetDensity(265000);
p.damp_numerical = 0.7;
}
// get a box of wall with plane shapes, and insert the wall and shapes into
// the scene
WallBoxPlane wall_box(0.04, 0.04, 0.16, 0, 0, 0.04);
wall_box.ImportToScene(&(sim->scene));
// add a gravity modifier
Gravity grav;
grav.Init(sim);
sim->modifier_manager.Insert(&grav);
// add a data dumper modifier
DataDumper data_dumper;
data_dumper.Init(sim);
data_dumper.SetRootPath(root_dir);
data_dumper.SetSaveByCycles(1000);
data_dumper.SaveShapeInfoAsSTL();
data_dumper.dump_wall_info = true;
data_dumper.dump_contact_info = true;
sim->modifier_manager.Insert(&data_dumper);
sim->modifier_manager.Enable(data_dumper.label);
// random packing
sim->dem_solver.timestep = 1e-4;
for (int i = 0; i < 10; i++) {
sim->scene.InsertParticle(particle_list);
sim->Run(0.1);
}
sim->scene.gravity_coef[2] = -0.0981;
sim->Run(0.5);
// remove the side and top walls
Plane *plane_ptr;
plane_ptr = static_cast<Plane *>(sim->scene.wall_list[2]->shape);
plane_ptr->SetExtent(1.0);
sim->scene.wall_list[2]->UpdateBound();
plane_ptr = static_cast<Plane *>(sim->scene.wall_list[3]->shape);
plane_ptr->SetExtent(1.0);
sim->scene.wall_list[3]->UpdateBound();
plane_ptr = static_cast<Plane *>(sim->scene.wall_list[4]->shape);
plane_ptr->SetExtent(1.0);
sim->scene.wall_list[4]->UpdateBound();
// reposing process
sim->Run(10);
delete sim;
MPI_Finalize();
}
void SetSpacing(double s_x, double s_y, double s_z)
Set the spacing between adjacent cells in the simulation grid.
Definition cell_manager.cpp:94
std::string label
Definition contact_model.hpp:34
double timestep
Definition dem_solver.hpp:42
A class used to dump particle data into vtk files. This is a post-modifier, which will be executed at...
Definition data_dumper.hpp:12
void Init(Simulation *sim) override
Initializes the DataDumper instance.
Definition data_dumper.cpp:24
bool dump_wall_info
A flag that determines whether to dump wall information.
Definition data_dumper.hpp:21
bool dump_contact_info
A flag that determines whether to dump contact information.
Definition data_dumper.hpp:25
void SaveShapeInfoAsSTL()
Saves shape information as an STL file.
Definition data_dumper.cpp:2245
void SetSaveByCycles(double interval)
Sets the interval for saving data by cycles.
Definition data_dumper.cpp:39
void SetRootPath(std::string const &root_path)
Sets the root directory path for the output file.
Definition data_dumper.cpp:26
CellManager cell_manager
Manages the cells, which are used in the borad-phase contact detection.
Definition domain.hpp:58
void SetBound(double bmin_x, double bmin_y, double bmin_z, double bmax_x, double bmax_y, double bmax_z)
Sets the lower and upper bounds of the domain.
Definition domain_manager.cpp:83
Domain * GetSelfSubDomain()
Returns a pointer to the sub-domain that belongs to this process.
Definition domain_manager.cpp:124
A class used to apply gravity to particles in a DEM simulation.
Definition gravity.hpp:10
void Init(Simulation *sim) override
Initializes the Gravity instance.
Definition gravity.cpp:14
Contact model that uses linear spring elements to evaluate contact forces and moments.
Definition model_linear_spring.hpp:16
std::string label
Definition modifier.hpp:20
Modifier * Insert(Modifier *e)
Inserts new modifier into the simulation.
Definition modifier_manager.cpp:17
void Enable(std::string const &label)
Enables a modifier in the simulation.
A class for representing a plane with a center point and normal vector.
Definition shape_plane.hpp:22
void SetExtent(double e)
Set the extent of the Plane object.
Definition shape_plane.cpp:119
Class for working with STL models.
Definition stl_model.hpp:17
void SmoothMesh(int num_trials=1)
Smooth the vertices of the model.
Definition stl_model.cpp:373
void MakeConvex()
Make the model convex.
Definition stl_model.cpp:341
void InitFromSTL(std::string const &file)
Initialize the model from an STL file.
Definition stl_model.cpp:25
void Refine(int num_refines=1)
Refine the mesh of the model.
Definition stl_model.cpp:361
ContactModel * InsertContactModel(const ContactModel *const cm_ptr)
Insert a contact model into this scene.
Definition scene.cpp:290
Vec3d gravity_coef
The gravity acceleration vector applied to all particles in this scene.
Definition scene.hpp:65
void SetNumberOfMaterials(int num)
Set the number of materials in this scene and initialize the contact lookup table accordingly.
Definition scene.cpp:346
Shape * InsertShape(const Shape *const s_ptr)
Insert a single shape into this scene.
Definition scene.cpp:19
void SetCollisionModel(int mat_type_1, int mat_type_2, ContactModel *const cnt_model)
Set the collision model between two materials.
Definition scene.cpp:397
void RemoveWall(Wall *w_ptr)
Remove the given wall from this scene.
Definition scene.cpp:262
Particle * InsertParticle(const Particle *const p_ptr)
Insert a single particle into this scene.
Definition scene.cpp:76
VecXT< Shape * > GetShapes()
Return a vector of pointers to all shapes in this scene.
Definition scene.cpp:316
VecXT< Wall * > wall_list
A list of pointers to all walls assumed to exist in this scene. No MPI transfer is performed on wall ...
Definition scene.hpp:71
Class for managing a DEM simulation.
Definition simulation.hpp:21
DEMSolver dem_solver
Implements DEM algorithms to solve the scene.
Definition simulation.hpp:47
void Run(double time)
Runs the simulation for a specified period of time.
Definition simulation.cpp:28
DomainManager domain_manager
Manager for domain and sub-domain calculations.
Definition simulation.hpp:31
ModifierManager modifier_manager
Manages add-on features (i.e., customized evaluations not hard-coded in the DEM calculation cycle).
Definition simulation.hpp:53
Scene scene
Contains and manages basic DEM objects (e.g., shapes, particles, walls) for a DEM simulation.
Definition simulation.hpp:42
A class representing a spherical harmonics object.
Definition shape_spherical_harmonics.hpp:24
void InitFromSTL(std::string const &file)
Initialize the SphericalHarmonics object from an STL file.
void SetSize(double d) override
Set the size of the SphericalHarmonics object.
Definition shape_spherical_harmonics.cpp:175
A class for generating a box of six walls.
Definition gen_wall_box_plane.hpp:23
void ImportToScene(Scene *scene)
Imports the shapes and walls generated by the wall box into a scene.
Definition gen_wall_box_plane.hpp:102
Definition bond_entry.hpp:7
std::vector< T > VecXT
Definition utils_macros.hpp:31