How to reach confinement for triaxial test without using particle growing

Asked by Leonard on 2019-11-26

Hi,
In [1], it shows a method to reach isotropic state by using particle growing (internalCompaction=True). However, if we use this method, there will be a scale up from initial (i.e. input) particle size distribution, like Figure 1 in [2]. What I want to achieve is to reach isotropic state without particle growing, something like the PSD curve in Figure 9 in [3]. So I set internalCompaction=False in order to keep constant particle size. The problem is when I set internalCompaction=False, the size of the sample changed.
For example, the size of initial packing is 0.7*0.7*1.4 (i.e. mn,mx=Vector3(0,0,0),Vector3(0.7,0.7,1.4)), when I set internalCompaction=True, after compacted state completed, the size of the packing stays around 0.7*0.7*1.4. However, when I set internalCompaction=False, after compacted state completed, the size of the packing is changed to 0.26*0.26*0.9, and in this case, I can not obtain a reasonable sample in terms of size. The following MWE may show this question by changing internalCompaction= True to False.
###########
from yade import pack, plot
nRead=readParamsFromTable(
 num_spheres=1000,
 compFricDegree = 30,
 key='_triax_base_',
 unknownOk=True
)
from yade.params import table

num_spheres=table.num_spheres
key=table.key
targetPorosity = 0.43
compFricDegree = table.compFricDegree
finalFricDegree = 30
rate=-0.02
damp=0.2
stabilityThreshold=0.01
young=5e6
mn,mx=Vector3(0,0,0),Vector3(0.7,0.7,1.4)

O.materials.append(FrictMat(young=young,poisson=0.5,frictionAngle=radians(compFricDegree),density=2600,label='spheres'))
O.materials.append(FrictMat(young=young,poisson=0.5,frictionAngle=0,density=0,label='walls'))
walls=aabbWalls([mn,mx],thickness=0,material='walls')
wallIds=O.bodies.append(walls)

sp=pack.SpherePack()
sp.makeCloud(mn,mx,-1,0.3333,num_spheres,False, 0.95,seed=1)
O.bodies.append([sphere(center,rad,material='spheres') for center,rad in sp])

Gl1_Sphere.quality=3

### DEFINING ENGINES ###
triax=TriaxialStressController(
 maxMultiplier=1.+2e4/young,
 finalMaxMultiplier=1.+2e3/young,
 thickness = 0,
 stressMask = 7,
 internalCompaction=True,## please change True to False here to look at what I say
)

newton=NewtonIntegrator(damping=damp)

O.engines=[
 ForceResetter(),
 InsertionSortCollider([Bo1_Sphere_Aabb(),Bo1_Box_Aabb()]),
 InteractionLoop(
  [Ig2_Sphere_Sphere_ScGeom(),Ig2_Box_Sphere_ScGeom()],
  [Ip2_FrictMat_FrictMat_FrictPhys()],
  [Law2_ScGeom_FrictPhys_CundallStrack()]
 ),
 GlobalStiffnessTimeStepper(active=1,timeStepUpdateInterval=100,timestepSafetyCoefficient=0.8),
 triax,
 newton
]

Gl1_Sphere.stripes=0
if nRead==0: yade.qt.Controller(), yade.qt.View()

### APPLYING CONFINING PRESSURE ###
triax.goal1=triax.goal2=triax.goal3=-10000
while 1:
 O.run(1000, True)
 unb=unbalancedForce()
 print 'unbalanced force:',unb,' mean stress: ',triax.meanStress
 if unb<stabilityThreshold and abs(-10000-triax.meanStress)/10000<0.001:
  break

print "### Isotropic state saved ###"
### REACHING A SPECIFIED POROSITY PRECISELY ###
import sys
while triax.porosity>targetPorosity:
 # we decrease friction value and apply it to all the bodies and contacts
 compFricDegree = 0.95*compFricDegree
 setContactFriction(radians(compFricDegree))
 print "\r Friction: ",compFricDegree," porosity:",triax.porosity,
 sys.stdout.flush()
 O.run(500,1)
print "### Compacted state saved ###"
########################

Could you please give some instructions?
Thanks,
Leonard

[1]https://github.com/yade/trunk/blob/master/examples/triax-tutorial/script-session2.py
[2]https://link.springer.com/article/10.1007/s11440-017-0593-6
[3]https://link.springer.com/article/10.1007%2Fs10035-016-0687-0

Question information

Language:
English Edit question
Status:
Solved
For:
Yade Edit question
Assignee:
No assignee Edit question
Solved by:
Leonard
Solved:
2019-11-27
Last query:
2019-11-27
Last reply:
2019-11-27
Chu (arcoubuntu) said : #1

Hi,

When you set internalCompaction=False, the TriaxialStressController achieves the goal by moving wall, so the size of sample changed.
In my opinion, if you need specific PSD , size and porosity, you may need to set a reasonable number of spheres.

Regards,
Chu

Hi,

> However, if we use this method, there will be a scale up from initial (i.e. input) particle size distribution

Which should be perfectly fine if you set the input sizes smaller than what you really want in the end.
How smaller they should be can be deduced directly from target number, sizes, and porosity.
Bruno

Leonard (z2521899293) said : #3

Thanks Chu and Bruno, I will try in this way!
Cheers
Leonard