Porosity control (fixed volume and particle size)

Asked by Adel ALBABA on 2013-10-08


I am preparing a sample of spherical particles in a box, which I am using for simulating dry granular flow in a flume. The sample I am generating has a specific volume(L,W,H) and a specific particle size. I want these two to remain fixed while setting the porosity value of the sphere package.

One option to reach a specific porosity is to use TriaxialStressController in which the test will either grow the particles or move the walls. Unfortunately, these two options will change the volume and/or particle size which are the two parameters I am trying to keep fixed.

Any ideas?


Question information

English Edit question
Yade Edit question
No assignee Edit question
Last query:
Last reply:

Hi Adel,
If you know in advance L,W,H, porosity, and size distribution, then you can deduce the number of particles that will fit in the volume.
Let you generate this number.
Next step: reach the target porosity. Be it with the triaxial engine or by gravity deposition you can use the same technique: reduce contact friction until porosity=target (care to not ask an impossible value, the minimum porosity is what you get when friction=0).


Adel ALBABA (adel-1) said : #2

Hi Bruno,

Thank you for your reply

I am using a viscoElastic contact law where TriaxialStressController doesn't work with. So I am considering gravity deposition.

The difficulty I am having is that the function "porosity" in YADE only computes the initial porosity of the package and doesn't get updated once the porosity is changed (under gravity deposition*). So how can I keep an eye on the porosity change so that I can Apply test: porosity=target ?

(*)note: I am using a projected gravity vector (gravity=(9.81*sin(theta),0,-9.81*cos(theta))) to account for the flume's orientation.


Christian Jakob (jakob-ifgt) said : #3

Hi Adel,

For calculation of porosity you may want to use yades porosity [1] or voxelPorosity [2] functions.
You can use these function in a PyRunner [3] for example:

#your model boundaries:
b=Vector3(?,?,?)#start vector
t=Vector3(?,?,?)#end vector

#add a PyRunner to your engines:
O.engines=O.engines+[PyRunner(iterPeriod=100,command='print voxelPorosity(100,b,t)')]



[1] https://yade-dem.org/doc/yade.utils.html?highlight=porosity#yade._utils.porosity
[2] https://yade-dem.org/doc/yade.utils.html?highlight=porosity#yade._utils.voxelPorosity
[3] https://yade-dem.org/doc/yade.wrapper.html?highlight=pyrunner#yade.wrapper.PyRunner

Jérôme Duriez (jduriez) said : #4

If you use the porosity() function, you need (if, as I guess, you do not perform periodic simulations) to define the total volume to consider to compute this porosity. You can have it, for your evolving sample, by calling, from time to time aabbExtrema() function.

Then, I'd say there is no reason that porosity() would compute an *initial* value of porosity

The triaxial engine doesn't care about what type of contact laws you
use. It should be ok with viscoElastic contacts. But graviational is ok
as well, no need to tackle all problems at once.
One way to compute porosity when the geometry is complex (a free
surface, for instance), is to use TesselationWrapper [1], then you get a
porosity per particle.
You can average this data in inner regions to get the average porosity.

It would probably be interesting to use this also for the flow, since it
would give for instance porosity vs. height inside the flowing material,
or porosity change along the slope.



Adel ALBABA (adel-1) said : #6

Christian, jduriez and Bruno.. Thanks for the effective solutions. That has clarified a lot of YADE capabilities.

Bruno: For free surface problems, I tried the the Tesselation.Wrapper by looping over the particles and summing the values of Voronoi’s cell of all spheres (Total Volume) where I can workout the porosity. The porosity I am getting is the same as the voxelporosity of a bounding box (which does not consider the free surface of the problem). I do not know why the Tesselation.Wrapper does not take the irregular surface into acoount ? :s

Here is the mini-scrip:

# Porosity by TesselationWrapper

for i in O.bodies:

# Porosity by aabbExtrema and voxelporosity



The fact that voxelPorosity gives the same as tesselation-based porosity is a good verification.
You need in fact to filter out particles near the free surface based on position ("inner regions" mentioned above), and keep only particles which are in the bulk.

Can you help with this problem?

Provide an answer of your own, or ask Adel ALBABA for more information if necessary.

To post a message you must log in.