particle size distribution

Asked by Soheil Safari

Hello everyone;
Hope you are doing well.

I want to have a mixture consisting of two particles with different sizes.

For example a sphere packing, including 20% with 1 mm radius and 80% with 2 mm radius.

I used psdSizes and psdCumm approach but I received wrong values.
psdSizes = [0.001,0.002]
psdCumm = [0.2,1.0]

I am grateful for any hints or insights into this issue.

Many thanks in advance.

Question information

Language:
English Edit question
Status:
Solved
For:
Yade Edit question
Assignee:
No assignee Edit question
Solved by:
Jan Stránský
Solved:
Last query:
Last reply:
Revision history for this message
Best Jan Stránský (honzik) said :
#1

Hello,

in this case of bimodal distribution, you an simply use makeCloud twice (on same SpherePack (!!)):
### MWE
from yade import pack
num1 = 50
num2 = 100
sp = pack.SpherePack() # one sphere pack (!)
mi, ma = (0,0,0), (30,30,30)
sp.makeCloud(mi,ma,1,num=num1)
sp.makeCloud(mi,ma,2,num=num2)
sp.toSimulation()
###

change num1 and num2 to values satisfying your 20% / 80% (mass? volume? number? ... ?)

Cheers
Jan

Revision history for this message
Karol Brzezinski (kbrzezinski) said :
#2

Hi,

First of all, please remember to create MVE to support your question, to save some time for people who are trying to help you [1].
Secondly, note that particle size in psdSizes should be provided as diameters - not radii (hence you need to double the values).

There are multiple ways to solve your problem.
1) If you know the exact number of particles you can simply run makeCloud() twice, before appending particles to simulation;

from yade import pack

sp = pack.SpherePack()

sp.makeCloud((0,0,0),(0.05,0.05,0.05), rMean = 0.002, num = 80)
sp.makeCloud((0,0,0),(0.05,0.05,0.05), rMean = 0.001, num = 20)

sp.toSimulation()

2) The makeCloud() method is rather dedicated to continuous size distributions. But you can pass a "stepwise" distribution:

from yade import pack

psdSizes = [0.002,0.002,0.004,0.004]# you have to pass here diameter, not radius
psdCumm = [0,0.2,0.2,1.0]

sp = pack.SpherePack()

sp.makeCloud((0,0,0),(0.05,0.05,0.05), psdCumm = psdCumm, psdSizes = psdSizes, distributeMass = False)

sp.toSimulation()

# Note, that this "trick" doesn't work very well with distributeMass = True. In the example above, the NUMBER of smaller particles is 20% of the total number of particles.

3) I had to "manually" compute the proper content to obtain the prescribed mass distribution. Modification of the above example is as follows:

from yade import pack

massContentOfSmallerParticles = 0.2
smallRadius = 0.001
bigRadius = 0.002

volumeProportion = (bigRadius/smallRadius)**3
tmpNumberOfSmallerParticles = massContentOfSmallerParticles*volumeProportion
tmpNumberOfBiggerParticles = 1-massContentOfSmallerParticles
tmpTotalNumber = tmpNumberOfSmallerParticles+tmpNumberOfBiggerParticles

newContentOfSmallerParticles = tmpNumberOfSmallerParticles / tmpTotalNumber

psdSizes = [smallRadius*2,smallRadius*2,bigRadius*2,bigRadius*2]# you have to pass here diameter not radius
psdCumm = [0,newContentOfSmallerParticles,newContentOfSmallerParticles,1.0]

sp = pack.SpherePack()

sp.makeCloud((0,0,0),(0.1,0.1,0.1), psdCumm = psdCumm, psdSizes = psdSizes, distributeMass = False)

sp.toSimulation()

#### just checking the distribution
smallerParticlesMass = 0
biggerParticlesMass = 0
otherParticlesMass = 0

for b in O.bodies:
    r = b.shape.radius
    m = b.state.mass
    if r == smallRadius:
        smallerParticlesMass += m
    elif r == bigRadius:
        biggerParticlesMass += m
    else:
        otherParticlesMass += m

totalMass = smallerParticlesMass + biggerParticlesMass + otherParticlesMass

print("Content of particles with radius r = {:.3f} equals {:.1f}% [m/m].".format(smallRadius,100*smallerParticlesMass/totalMass))

Cheers,
Karol

[1] https://www.yade-dem.org/wiki/Howtoask

Revision history for this message
Soheil Safari (soheilsafari) said :
#3

Dear Jan and Karol,

Sorry for the incomplete information in my question.
Thank you very much for your detailed description and the codes. All of them work very well.

Best regards,
Soheil

Revision history for this message
Soheil Safari (soheilsafari) said :
#4

Thanks Jan Stránský, that solved my question.