# Particle Inlets

Note

The project file for this example may be viewed/run in PFC.[1] The data files used are shown at the end of this example.

Introduction

This example demonstrates usage of the Inlet logic in PFC to create particle streams during cycling. Although the discussion focuses on PFC2D, it applies to PFC3D as well.

Workflow

The Inlet logic builds upon the Brick logic: it is first required to create or import one or multiple bricks with the desired particle distributions in the model, then the information in the brick(s) can be used to create inlet(s) of particles using the inlet create command. Existing inlets may be modified with the inlet modify command.

During cycling, particles in the brick are fictitiously translated according to the specified flow-velocity vector and the current timestep. Given these updated fictitious positions, particles in the brick that fall out of the brick boundary extent are identified for insertion, and their centroid is mapped back into the brick extent. Lastly, copies of particles corresponding to the fictitious brick particles identified for insertion are actually inserted, with an initial velocity set to the the inlet flow velocity. Note that the information used for the inlets derives solely from the particles. Contacts information is not considered. Contacts are subsequently automatically created during cycling.

Simple Particle Deposition

The datafile inlet1.dat demonstrates a simple usage of the Inlet logic to create a stream of particles vertically deposited under gravity.

A cloud of balls is first generated in periodic space. This configuration is saved as a brick.

In the second stage, all balls are deleted and an inlet is created and positioned above an horizontal wall located at $$y=0. A flow velocity in the y$$-direction is specified, in the same direction than gravity. Periodic boundary conditions are activated in the lateral ($$x$$) direction.

As cycles are performed, balls are inserted in the system from the inlet. The flow-rate is a function of the solid fraction of the initial cloud of balls and of the specified flow velocity.

The ability to translate or rotate particle inlets during cycling is illustrated in inlet2.dat and discussed below.

The brick generated previously is first imported in the model, and assembled to generate a cloud of particles with larger dimensions, which is saved as a second brick.

Two inlets are then created, referring to the two bricks saved in memory, at selected locations in the system. Downward flow velocities are specified similar to the example above, and gravity is activated.

Translational velocities are then specified for the inlets. The inlet in the left-hand side of the model is specified a vertical ascending velocity, while the large inlet on the right-hand side of the model is specified a horizontal translational velocity in the $$x$$-direction.

Due to this motion, particles inserted in the system can overlap with particles inserted at previous times. As a result large forces may develop, leading to undesired behavior (see figure below).

One method to overcome this issue is to use an incremental formulation of the normal force, if the contact model permits. In this example, the linear contact model is used, for which the lin_mode property can be set to 1 to switch to an incremental formulation of the normal force.

Alternatively, a relaxation scheme can be activated to the bodies inserted in the model, using the inlet create relaxation-time or inlet create relaxation-steps keywords.

Data Files

inlet1.dat

; fname: inlet1.dat
;
; Demonstrate usage of the inlet logic to create particle streams with
; controlled flow rate while cycling
;
;=============================================================================
model new
model large-strain on
model random 10001

; Create a brick
model domain extent -0.05 0.05 condition periodic
contact cmat default model linear property kn 1e7
ball distribute porosity 0.8 radius 2e-3 3e-3
ball attribute density 2600 damp 0.7
model solve ratio-average 1e-5 cycles 100 and
ball attribute damp 0.0
brick make id 1
brick export id 1 filename 'brick1' skip-errors
model save 'brick1'
ball delete

; Use the brick as an inlet of balls in the model from a constant height
; and settle under gravity
model domain extent -0.05 0.05 -0.01 0.3 condition periodic destroy
model gravity 9.81
contact cmat default model linear method deformability emod 1e6 kratio 2.0 ...
property fric 0.25 dp_nratio 0.2 dp_mode 1
wall create name 'base' vertices (-0.05 , 0.0)  (0.0  , 0.0) ...
( 0.0  , 0.0)  (0.05 , 0.0)

inlet create id 1 brick-id 1 position (0.0,0.3) flow-vel (0.0,-0.5) active on

[global nhalt=500]
fish define halt
global halt = 0
if ball.num >= nhalt then
halt = 1
endif
end
model solve fish-halt halt
model save 'inlet1a'

[global nhalt=1000]
model solve fish-halt halt
model save 'inlet1b'

inlet modify id 1 active off
model solve ratio-average 1e-3

model save 'inlet1'
program return
;=============================================================================
;eof: inlet1.dat


inlet2.dat

; fname: inlet2.dat
;
; Demonstrate usage of the inlet logic to create particle streams with
; controled flow rate while cycling
;
;=============================================================================
model new
model large-strain on
model random 10001

; Import a brick previously created
brick import id 1 filename 'brick1'

; Assemble the brick to create a larger assembly, and save as a second brick
model domain extent -0.1 0.1 -0.05 0.05 condition periodic
brick assemble id 1 origin (-0.1,-0.05) size 2 1
brick make id 2
ball delete

; Use the two bricks as an inlets of balls
model domain extent -0.6 0.6 -0.01 1.1 condition destroy
model gravity 9.81
wall generate box -0.5 0.5 0.0 1.0 one-wall
contact cmat default model linear method deformability emod 1e6 kratio 2.0 ...
property fric 0.25 dp_nratio 0.2 dp_mode 1

inlet create id 1 brick-id 1 group '1' slot 'inlet' ...
position (-0.25,0.5) ...
flow-vel (0.0,-0.5) active on

inlet create id 2 brick-id 2 group '2' slot 'inlet' ...
position (0.25 ,1.0)  ...
flow-vel (0.0,-1.0) active on

model mechanical timestep max 1e-4
model solve time 1.0
model save 'inlet2'

; Assign translational velocities to the inlets.
; Note that overlaps create large forces and result in model instability
inlet modify id 1 velocity ( 0.0 , 0.5)
inlet modify id 2 velocity (-0.5 , 0.0)
model solve time 0.2
model save 'inlet3'

; Assign translational velocities to the inlets.
; Use the incremental normal force computation to prevent large initial forces
model restore 'inlet2'
contact cmat default property lin_mode 1
inlet modify id 1 velocity ( 0.0 , 0.5)
inlet modify id 2 velocity (-0.5 , 0.0)
model solve time 0.2
model save 'inlet4'

; Assign translational velocities to the inlets.
; Use the relaxation to prevent large initial forces to create instabilities
model restore 'inlet2'
inlet modify id 1 velocity ( 0.0 , 0.5)
inlet modify id 2 velocity (-0.5 , 0.0) relaxation-time 0.05 0.1
model solve time 0.5
model save 'inlet5'

; Assign rotational velocity to inlet 1 (with relaxation)
inlet modify id 1 velocity ( 0.0 , 0.0) ...
flow-vel (0.0,-1.0)   ...
rotation-center [inlet.pos(inlet.find(1))] ...
relaxation-time 0.05 0.1
inlet modify id 2 velocity ( 0.5 , 0.0)
model solve time 0.2
model save 'inlet6'

inlet modify id 1 active off
inlet modify id 2 active off
model solve

program return
;=============================================================================
;eof: inlet2.dat


Endnotes

 [1] To view this project in PFC, use the program menu. Help ▼ Examples…   ⮡   PFC     ⮡   Examples       ⮡   Inlet         ⮡   Inlet.prj