Particle Size distribution for fine-grained soil

Asked by Hossein

Hi every body
I am trying to simulate triaxial condition on an fine-grained type of soil (CL-ML), first of all I have to match the particle size distribution according the real condition of the soil. In below I mention my code with real particle distribution in terms of psdSizes and psdCumm.
I wonder, if there is any way to match this PSD size?
I also changed the bin number but there is no improvement.

###################################
from mpl_toolkits.axes_grid1 import host_subplot
import numpy as np
import matplotlib.pyplot as plt
from yade import pack,qt

utils.readParamsFromTable(seed=1,num_spheres=15000,compFricDegree =35.0)
from yade.params import table

seed=table.seed
num_spheres=table.num_spheres# number of spheres
compFricDegree = table.compFricDegree # initial contact friction during the confining phase (will be decreased during the REFD compaction process)
confiningS=-1e5

## creat a packing with a specific particle side distribution (PSD)
psdSizes,psdCumm=[0.0000012,0.0000028,0.0000055,0.0000074,0.000010,0.000016,0.000025,0.000036,0.000074,0.00014,0.00017,0.00024,0.00029,0.00043,0.00060,0.00083,0.0014,0.002],[0.034,0.047,0.055,0.064,0.068,0.081,0.089,0.094,0.12,0.20,.23,.29,.38,.42,.57,.71,.88,1]
sp=pack.SpherePack()
mn,mx=Vector3(0,0,0),Vector3(0.01,0.01,0.01)
sp.makeCloud(minCorner=mn,maxCorner=mx,psdSizes=psdSizes,psdCumm=psdCumm,distributeMass=True,num=num_spheres,seed=seed)
#sp.psd(bins=50,mass=True)
## create material #0, which will be used as default
O.materials.append(CohFrictMat(young=2e8,poisson=.35,isCohesive=True,alphaKr=2.0,frictionAngle=radians(compFricDegree),density=2600,label='spheres'))
O.materials.append(FrictMat(young=2e8,poisson=.35,frictionAngle=0,density=0,label='frictionless'))

## create walls around the packing
walls=aabbWalls((mn,mx),thickness=0,material='frictionless')
wallIds=O.bodies.append(walls)

O.bodies.append([utils.sphere(center,rad,material='spheres') for center,rad in sp])

triax=TriaxialStressController(
 internalCompaction=False,
 goal1=confiningS,
 goal2=confiningS,
 goal3=confiningS,
 max_vel=10,
 label="triax"
)

newton=NewtonIntegrator(damping=0.4)

O.engines=[
 ForceResetter(),
 InsertionSortCollider([Bo1_Sphere_Aabb(),Bo1_Box_Aabb()]),
 InteractionLoop(
  [Ig2_Sphere_Sphere_ScGeom(),Ig2_Box_Sphere_ScGeom()],
  [Ip2_FrictMat_FrictMat_FrictPhys(),Ip2_CohFrictMat_CohFrictMat_CohFrictPhys(label="cohesiveIp")],
  #Finally, two different contact laws for sphere-box and sphere-sphere
  [Law2_ScGeom_FrictPhys_CundallStrack(),Law2_ScGeom6D_CohFrictPhys_CohesionMoment(
   useIncrementalForm=True, #useIncrementalForm is turned on as we want plasticity on the contact moments
   always_use_moment_law=False, #if we want "rolling" friction even if the contact is not cohesive (or cohesion is broken), we will have to turn this true somewhere
   label='cohesiveLaw')],
  ),
 GlobalStiffnessTimeStepper(active=1,timeStepUpdateInterval=100,timestepSafetyCoefficient=0.8),
 triax,
 newton
]
#from yade import qt
#qt.View()
file=open('psd'+'.txt',"w")
Diameter=[]
idsphere=[]
for center,rad in sp:
  Diameter.append(rad*2*1000)
for i in range(0,len(Diameter),1):
  idsphere.append(i)
file.write(str(idsphere)+" "+str(Diameter)+"\n")
file.write(str(psdSizes)+" "+str(psdCumm)+"\n")
file.write(str(Diameter)+" "+str(psdCumm)+"\n")
file.close()

plt.figure()
plt.subplot(221)
plt.plot(psdSizes,psdCumm)
plt.semilogx(*sp.psd(bins=17,mass=True))
plt.xlabel('Grain.Size(m)')
plt.ylabel('Precent.finer.by.weight')
plt.grid(True)
plt.legend(('precribed mass PSD','Size PSD of %d number spheres'%len(sp)),loc='upper left', shadow=True)

plt.subplot(222)
plt.ylabel('Sphere Diameter(mm)')
plt.xlabel('Sphere id')
plt.grid(True)
plt.plot(idsphere,Diameter,linestyle='-',color='g',linewidth=2)
plt.show()

Question information

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

Hello,

> In below I mention my code ...

if your problem is initial particles size distribution, try to make the code a MWE [1], i.e. delete materials, walls, O.engines etc.
You will make your code look shorter and attract (or at least not discourage) others to help :-)

> I wonder, if there is any way to match this PSD size?

15,000 particles is probably too little for the method used and for the used PSD.
Increasing number of particles, I got better and better match (although it takes longer and longer due to makeCloud implementation).
For 500,000 particles the match was significantly better( thought not perfect at all)

Alternatively, you can use a different method for particle size generation.

Cheers
Jan

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

Revision history for this message
Hossein (hossein75) said :
#2

Thanks Jan

Another way to match the PSD is to change the (mass = false ) and then the PSG will be exactly matched. Consequently,
the runtime will increased dramatically. For example, the pack with the desire void ratio (almost 0.8) was created after 4 hour !

Do you know a way to overcome this huge runtime?

Cheers,
Hossein

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

Hi Hossein,

here is the problem. You want to have in your simulation particles that differ in size by three orders of magnitude. From your PSD one can find out that 3,4% of the mass are particles with a diameter of 1.2 microns (0.0000012 m). On the other side, you have 12% of particles with a diameter of 2 mm (0.002 m). Quick math can lead to the conclusion that for one big particle you need around 10^9 of the smallest particles. This explains why increasing the number of particles improves PSD a little bit.

You should consider upscaling particles. It would be nice to be able to simulate cohesive soil with a real PSD, but consider the cost. Try to simulate a smaller volume of the soil (let's say 3% of current volume), only with the smallest particles. Probably, you will find out that the simulation runs extremely slow.

Also, please don't set "mass = false". In such a case the algorithm only counts the number of the particles, not the mass.

Cheers,
Karol

Revision history for this message
Hossein (hossein75) said :
#4

Thanks Karol

I already read some articles in terms of up-scaling. For example, in some simulations for fine cohesive particles the size of particles
was increased 10^3 times! I employed this idea on YADE but the problem is still unsolved. So, I'm interested in :

1) What type of up-scaling must be consider ?

2) What do you mean by smaller volume ? a smaller cubic?( which can lead to decrease the number of particles )
    or
 Should I just pick a small range of PSD sizes ? (for instance, in the middle of the PSD sizes)

Cheers,
Hossein

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

Hi Hossein,

what do you mean by:

>I employed this idea on YADE but the problem is still unsolved.

Did you scale all the particles? If so the packing problem would remain the same.

>1) What type of up-scaling must be consider ?

There are different strategies od upscaling. It depends on what you want to simulate, and what effect you want to observe/emphasize. I cannot give you the universal formula, because there is none. Just try different scenarios and try to validate your model, by comparison, to the experiment (your or others). Maybe you should start with one sphere size (the biggest) and when it works add smaller particles if necessary.

2) What do you mean by smaller volume ? a smaller cubic?( which can lead to decrease the number of particles )

Modeling smaller volumes with small particles was just supposed to be an exercise, so you could experience how the size of the particles influences the speed of simulation.

Cheers,
Karol

Revision history for this message
Hossein (hossein75) said :
#6

Thanks Karol

Since, The particles are small, I increased all the sizes 10^3 times, because I read in some articles that this solution can decrease
runtime as much as errors in soil simulation , but the problem did not solved.

furthermore, I have another problem except PSD sizes :
  I have to simulate fine-grained type of soil (silty-clay). In the case of unsaturated condition I'm using 2phase-flow engine however, I
guess since the particles are too small there is an error (rmin>rmax), therefore I couldn't simulate the drainage mechanism.

I would appreciate your answer

Cheers,

Hossein

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

Hi,

so you can see that increasing all the particles proportionally is not a solution. Particle size ratio is the problem. First simulate uniformly sized particles, and later try to make simulation more complex.

I can't help with flow engine. You should start new topic with proper title, so the right people could find your question.

Cheers,
Karol

Revision history for this message
Hossein (hossein75) said :
#8

 Thanks Karol