# How to reach confinement for triaxial test without using particle growing

Hi,
In , 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 . What I want to achieve is to reach isotropic state without particle growing, something like the PSD curve in Figure 9 in . 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.
###########
num_spheres=1000,
compFricDegree = 30,
key='_triax_base_',
unknownOk=True
)

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=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)

Gl1_Sphere.quality=3

### DEFINING ENGINES ###
triax=TriaxialStressController(
maxMultiplier=1.+2e4/young,
finalMaxMultiplier=1.+2e3/young,
thickness = 0,
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

### 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
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

## Question information

Language:
English Edit question
Status:
Solved
For:
Assignee:
No assignee Edit question
Solved by:
Leonard
Solved:
2019-11-27
Last query:
2019-11-27
2019-11-27
 Chu (arcoubuntu) said on 2019-11-27: #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

 Bruno Chareyre (bruno-chareyre) said on 2019-11-27: #2

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 on 2019-11-27: #3

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