Flow through a 3D hourglass/silo

Problem description

A 3D hour glass/silo is simulated, i.e. a cylindrical domain with a neck in the middle (see snapshot on the right). Particles are inserted into the upper half of the domain and flow into the lower half due to gravity.

Here a short ParaView animation of the code's output.

This code illustrates the effect of friction in DPM simulations. If the friction is high enough, arching is observed at the neck, where particles interlock to obstruct the flow. It also illustrates how to use AxisymmetricIntersectionOfWalls to set up axisymmetrical shapes, i.e. the outer cylinder and the neck.

Defining an axisymmetric wall

The outer wall is defined by an AxisymmetricIntersectionOfWalls object:

w1.setSpecies(speciesHandler.getObject(0));
w1.setPosition(Vec3D(mid.X, mid.Y, 0));
w1.setAxis(Vec3D(0, 0, 1));
w1.addObject(Vec3D(1, 0, 0), Vec3D((getXMax() - getXMin()) / 2.0, 0, 0));
// Display the cylinder only, when not coinciding with the neck
std::vector<Mdouble> displayedSegmentsCylinder = {-constants::inf, mid.Z - contractionHeight, mid.Z + contractionHeight, constants::inf};
w1.setDisplayedSegments(displayedSegmentsCylinder);
wallHandler.copyAndAddObject(w1);
Use AxisymmetricIntersectionOfWalls to Screw Screw::read Screw::read Screw::read define axisymmetric ...
Definition: AxisymmetricIntersectionOfWalls.h:105
void setAxis(Vec3D a)
Definition: AxisymmetricIntersectionOfWalls.cc:149
void setDisplayedSegments(const std::vector< Mdouble > &displayedSegments)
Sets the displayed segments.
Definition: AxisymmetricIntersectionOfWalls.h:189
virtual void setPosition(const Vec3D &position)
Sets the position of this BaseInteractable.
Definition: BaseInteractable.h:218
void addObject(Vec3D normal, Vec3D point)
Adds a wall to the set of infinite walls, given a normal vector pointing into the wall (i....
Definition: IntersectionOfWalls.cc:117
void setSpecies(const ParticleSpecies *species)
sets species of subwalls as well
Definition: IntersectionOfWalls.cc:51
Definition: Kernel/Math/Vector.h:30
const Mdouble inf
Definition: GeneralDefine.h:23

The neck is also defined by an AxisymmetricIntersectionOfWalls object:

w2.setSpecies(speciesHandler.getObject(0));
w2.setPosition(Vec3D(mid.X, mid.Y, 0));
w2.setAxis(Vec3D(0, 0, 1));
std::vector<Vec3D> points(3);
//define the neck as a prism through corners of your prismatic wall in clockwise direction
points[0] = Vec3D(halfWidth, 0.0, mid.Z + contractionHeight);
points[1] = Vec3D(halfWidth - contractionWidth, 0.0, mid.Z);
points[2] = Vec3D(halfWidth, 0.0, mid.Z - contractionHeight);
// Display the neck only until reaching the cylinder
std::vector<Mdouble> displayedSegmentsPrism = {mid.Z - contractionHeight, mid.Z + contractionHeight};
w2.setDisplayedSegments(displayedSegmentsPrism);
w2.createOpenPrism(points);
wallHandler.copyAndAddObject(w2);
void createOpenPrism(std::vector< Vec3D > points, Vec3D prismAxis)
Creates an open prism which is a polygon between the points, except the first and last point,...
Definition: IntersectionOfWalls.cc:446

(Return to Overview of advanced tutorials)