Compression won't stop when the goal of TriaxialStressController is reached

Asked by Huang peilun on 2021-03-09

Hi,

I'm currently doing a simple compression test. I set the stressMask to be 0 and goal1, goal2, goal3 to be -0.1 in the TriaxialStressController. However, when the strain reaches -0.1, the compression does not stop. I continue the simulation and the strain reaches -0.7 with no tendency to stop. I'm confused why this happens. Can anyone help me out?

Here's my code:

############################################
############################################

from yade import pack

SoilMat=CohFrictMat(young=2e9,poisson=0.3,density=2650,frictionAngle=0.7,alphaKr=50,alphaKtw=50,momentRotationLaw=True)
WallMat=CohFrictMat(young=2e20,poisson=0.5,frictionAngle=0.7,density=1000,label='walls',momentRotationLaw=True)
O.materials.append((SoilMat,WallMat))

mn,mx=Vector3(0,0,0),Vector3(100,100,100)
walls=aabbWalls([mn,mx],thickness=0,material='walls')
wallIds=O.bodies.append(walls)

Particle_num=8000
sp=pack.SpherePack()
sp.makeCloud((0,0,0),(100,100,100),rMean=.5,num=Particle_num)
sp.toSimulation(material=SoilMat)

triax=TriaxialStressController(
 stressMask = 7,
 thickness = 0,
 max_vel=0.05,
 internalCompaction=True, # If true the confining pressure is generated by growing particles
 wall_bottom_activated=False,
 wall_back_activated=False,
 wall_left_activated=False,
 goal1 = -30000, goal2 = -30000, goal3 = -30000,
)

newton=NewtonIntegrator(damping=0.2)

O.engines=[
 ForceResetter(),
 InsertionSortCollider([Bo1_Box_Aabb(),Bo1_Sphere_Aabb(),Bo1_Facet_Aabb()]),
 InteractionLoop(
  [Ig2_Sphere_Sphere_ScGeom6D(),Ig2_Box_Sphere_ScGeom6D(),Ig2_Facet_Sphere_ScGeom6D()],
  [Ip2_CohFrictMat_CohFrictMat_CohFrictPhys()],
  [Law2_ScGeom6D_CohFrictPhys_CohesionMoment()]
 ),
 GlobalStiffnessTimeStepper(active=1,timeStepUpdateInterval=100,timestepSafetyCoefficient=0.8),
 triax,
 newton,
 PyRunner(command='Step1()',realPeriod=1,label='SLM'),
]

def Step1():
 print(abs((30000+triax.meanStress)/30000))
 if abs((30000+triax.meanStress)/30000)<0.05:
  triax.stressMask=0
  triax.internalCompaction=False
  triax.goal1=triax.goal2=triax.goal3=-0.1
  SLM.command='Step2()'

def Step2():
 print("%s: %s, %s" % (O.iter,triax.depth,triax.strain))

############################################
############################################

Question information

Language:
English Edit question
Status:
Solved
For:
Yade Edit question
Assignee:
No assignee Edit question
Solved by:
Robert Caulk
Solved:
2021-03-10
Last query:
2021-03-10
Last reply:
2021-03-09
Best Robert Caulk (rcaulk) said : #1

The TriaxialStressController is functioning according to the docs. You are assigning a strain rate [1]. If you want to stop at a certain strain then you need to use a PyRunner to stop the walls at your desired strain.

[1]https://yade-dem.org/doc/yade.wrapper.html#yade.wrapper.TriaxialStressController.stressMask

Huang peilun (hpl16) said : #2

Thanks Robert, but is the assigned strain rate the rate of the true (logarithmic) strain?

Jan Stránský (honzik) said : #3

Yes, the goal seems like (numerical approximation of) rate of the true (logarithmic) strain.
For strain rate getting [2] as well as strain rate -> velocity setting [3], current dimensions are used.
Anyway, you can easily test it yourself :-)
cheers
Jan

[2] https://gitlab.com/yade-dev/trunk/-/blob/master/pkg/dem/TriaxialStressController.cpp#L39
[3] https://gitlab.com/yade-dev/trunk/-/blob/master/pkg/dem/TriaxialStressController.cpp#L178

Huang peilun (hpl16) said : #4

Thanks Robert Caulk, that solved my question.

Huang peilun (hpl16) said : #5

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