Hopper Discharge
Tutorial Resources | |
---|---|
Data Files | Project: Open {“Hopper.p2prj” in PFC2D; “Hopper.p3prj” in PFC3D} [1] |
Introduction
Steps to perform a hopper discharge simulation are presented. The discussion focuses on the PFC3D model but also applies to PFC2D. Figures of both models are shown. This tutorial remains intentionally simple; a more advanced example is discussed in the hopper flow example application, where the influence of filling height and friction on the discharge rate are investigated.
Numerical Model
The hopper geometries, in 2D and 3D, are shown below.
The FISH function geometry specifies the dimensions of the hopper. The domain is created according to those dimensions, and the domain conditions are set to destroy balls that move outside the domain extent (refer to the model domain
command for details).
model new
model title 'Simple hopper discharge model'
fish define geometry
W = 20.0
W0 = 6.0
Theta = 30
H = 30.0
A = (W-W0)*math.tan(Theta*math.pi/180)
end
@geometry
model domain extent ([-W*1.5],[W*1.5]) ([-W*1.5],[W*1.5]) ([-H*2],[H*2])
model domain condition destroy
The hopper geometry is created using the wall generate
command to create conic and cylindrical walls.
For the cylinder, the center position of the bottom face, the radius and the height are required. The cap keyword, which controls whether the cylinder ends are closed, is set to false for both ends. The height and the minimum and maximum radii of the conic frustum top and bottom faces are specified. A minimum radius of 0 generates a cone. For the cone, the cap keyword is set so that the bottom end of the cone is capped but the top remains open.
wall generate id 1 cylinder base (0.0,0.0,@A) height [H-A] ...
radius [W*0.5] cap false false one-wall
wall generate id 2 cone radius [W0*0.5] [W*0.5] height @A cap true false
The default slots of the Contact Model Assignment Table (CMAT) are set for ball-ball and ball-facet contact types. Both slots are filled with the linear contact model but with different properties. Normal viscous damping exists for both ball-ball and ball-facet contacts.
contact cmat default type ball-ball model linear ...
property kn 5e7 ks 5e7 fric 0.577 dp_nratio 0.2
contact cmat default type ball-facet model linear ...
property kn 1e8 ks 1e8 fric 0.1 dp_nratio 0.2
A cloud of overlapping balls is created above the hopper. The density and local damping coefficients of the balls are set using the ball attribute
command. Local damping is temporarily set to a large value so that the balls will settle more quickly into the hopper.
model random 10001
ball distribute porosity 0.5 ...
box ([-W*0.35],[W*0.35]) ([-W*0.35],[W*0.35]) (@A,[1.8*H]) ...
radius 0.8 1.0
ball attribute density 1000.0 damp 0.7
The model mechanical timestep scale
command is issued to initially activate density scaling in order to quickly reach an initial equilibrium. Gravity is initialized and the model is solved to a target average ratio of 1e-3 with the model solve
command.
Note the initial use of the model cycle
command with calm keyword, to remove the kinetic energy due to the large overlaps arising from the use of the ball distribute
command. In this case, every 50 cycles, both the translational and rotational ball velocities are set to 0.
model gravity 0 0 -9.81
model cycle 1000 calm 50
model mechanical timestep scale
model solve ratio-average 1e-3
Six groups of balls are created according to the balls’ initial heights. This is useful for evaluating the flow patterns during hopper discharge. The ball plot item is colored by the textual value group in order to visualize this assignment. A rectangular box is generated to collect the balls flowing from the hopper, and the top of the box is removed.
ball delete range cylinder end-1 (0.0,0.0,0.0) end-2 (0.0,0.0,@H) ...
radius 0.0 [W*0.5] not
ball group 'LevelOne' range position-z 0.0 [H/6]
ball group 'LevelTwo' range position-z [H/6][2*H/6]
ball group 'LevelThree' range position-z [2*H/6][3*H/6]
ball group 'LevelFour' range position-z [3*H/6][4*H/6]
ball group 'LevelFive' range position-z [4*H/6][5*H/6]
ball group 'LevelSix' range position-z [5*H/6][H*2]
wall delete range position-z 0.0 set id 2
wall generate id 200 ...
box ([-W*1.25],[W*1.25]) ([-W*0.25],[W*0.25]) ([-H*1.5],0.0)
wall delete range set id 201
The following figures show the equilibrated balls in the hoppers prior to discharge.
Before discharging particles from the hopper, the local damping is set to 0, the timestep calculation mode is set to auto (see the model mechanical timestep
command), and the mechanical age is reset. The model is then solved to a target time. Snapshots of the systems during discharge are presented below.
model mechanical timestep auto
model mech time-total 0.0
model results interval mechanical 0.04
wall results active on
ball results active true add-attribute velocity
Note the use of the ball results
command before discharging the balls. The result logic provides the ability to periodically record reduced model states for post-processing purposes. These reduced states can either be saved in memory or output as binary files. In this example, in addition to the ball positions/radii, their group identifiers and velocities are recorded. The makeMovie function (see below) may be executed after the simulation is complete to sequentially load the ball results and export the plot views to bitmap files. Plot view settings (see the c plot commands) are modified as well to move the camera position. A third-party tool may then be used to produce a movie of the hopper discharge based on the exported bitmaps.
fish define makeMovie(dur,inc,name)
i = 0
curv = inc
dur = dur
namefile = name
loop while (curv <= dur)
i = i + 1
dist = 150.0/(i*0.01)
if dist > 150.0
dist = 150.0
endif
local fname = string.build('%1_%2.png',name,i)
command
model result import @i skip-fish
;plot export bitmap filename @fname
endcommand
curv = curv + inc
endloop
end
Discussion
This tutorial demonstrates the creation of a simple hopper geometry with the wall generate
command. This command can generate several simple wall geometries. The hopper is filled and the balls are equilibrated using the model mechanical timestep scale
command. Groups are subsequently defined and the balls are allowed to flow from the hopper. The post-processing visualization of dynamic problems like this one can be greatly facilitated by the result logic for balls (ball results
), clumps (clump results
), and walls (wall results
).
Endnote
[1] | These may be found in PFC3D under the “tutorials/hopper” folder in the Examples dialog ( on the menu). If this entry does not appear, please copy the application data to a new directory. (Use the menu commands . See the Copy Application Data section for details.) |
Was this helpful? ... | PFC 6.0 © 2019, Itasca | Updated: Nov 19, 2021 |