yade-users team mailing list archive
-
yade-users team
-
Mailing list archive
-
Message #26783
[Question #699807]: Particle Size distribution for fine-grained soil
New question #699807 on Yade:
https://answers.launchpad.net/yade/+question/699807
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()
--
You received this question notification because your team yade-users is
an answer contact for Yade.