core dumped after replacing boundary walls

Asked by Leonard

Hi,

I'd like to ask that if is it possible to replace (or enlarge) the boundary walls after the sample is made?

The reason why I want to replace or enlarge the boundary walls is that, I simulated triaxial compression tests before, in this case the boundary walls work well. Now I want to simulate triaxial extension tests on the same samples, and I found that the size of the wall is not enough when the axial strain reaches to a certain value, please see one example at [1].

The problem in [1] I think is that the size of walls are small because I didn't adjust oversizeFactors in [2]. The way I came up with is to erase the old walls and add new walls into it at the begining of deviatoric loading. But then I had the core dumped problem when I started the deviatoric loading after replacing the walls.

The MWE below can show this problem. Please click run to start the deviatoric loading and the core domped will occur.

from yade import pack

nRead=readParamsFromTable(
 num_spheres=1000,# number of spheres
 compFricDegree = 30, # contact friction during the confining phase
 key='_triax_base_', # put you simulation's name here
 unknownOk=True
)
from yade.params import table

num_spheres=table.num_spheres# number of spheres
key=table.key
targetPorosity = 0.43 #the porosity we want for the packing
compFricDegree = table.compFricDegree # initial contact friction during the confining phase (will be decreased during the REFD compaction process)
finalFricDegree = 30 # contact friction during the deviatoric loading
rate=-0.1 # loading rate (strain rate)
damp=0.2 # damping coefficient
stabilityThreshold=0.01 # we test unbalancedForce against this value in different loops (see below)
young=5e6 # contact stiffness
mn,mx=Vector3(0,0,0),Vector3(1,1,1) # corners of the initial packing

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) #"seed" make the "random" generation always the same
O.bodies.append([sphere(center,rad,material='spheres') for center,rad in sp])

triax=TriaxialStressController(
 maxMultiplier=1.+2e4/young, # spheres growing factor (fast growth)
 finalMaxMultiplier=1.+2e3/young, # spheres growing factor (slow growth)
 thickness = 0,

 stressMask = 7,
 internalCompaction=True, # If true the confining pressure is generated by growing particles
)

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,
 TriaxialStateRecorder(iterPeriod=100,file='WallStresses'+table.key),
 newton,
]

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

triax.goal1=triax.goal2=triax.goal3=-100000

while 1:
  O.run(1000, True)
  unb=unbalancedForce()
  print 'unbalanced force:',unb,' mean stress: ',triax.meanStress
  if unb<stabilityThreshold and abs(-100000-triax.meanStress)/100000<0.001:
    break

print "### Isotropic state saved ###"

import sys #this is only for the flush() below
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)

O.save('compactedState'+key+'.yade.gz')
print "### Compacted state saved ###"

triax.internalCompaction=False

setContactFriction(radians(finalFricDegree))

triax.stressMask = 5
triax.goal2=rate
triax.goal1=-100000
triax.goal3=-100000
newton.damping=0.1

print "click run to start deviatoric loading"
#################################### replacing walls
print "Here I'd like to enlarge the size of the boundary walls"

newWalls=aabbWalls(thickness=0,oversizeFactor=5,material='walls')
newWalls=O.bodies.append(newWalls)

for i in range(6):
  O.bodies.erase(i)
#########################################

def stop():
 if -triax.strain[1]>0.15:
  O.pause()
  print "deviatoric loading finished"

O.engines=O.engines+[PyRunner(iterPeriod=1,command='stop()',label='stop')]

If it is not possible to replace the walls, do you have any other idea to enlarge the walls? As my target is to simulate the triaxial extension test to a large strain level.

Thanks
Leonard

[1]https://we.tl/t-OMx1y0hzgN
[2]https://yade-dev.gitlab.io/trunk/yade.utils.html?highlight=aabbwalls#yade.utils.aabbWalls

Question information

Language:
English Edit question
Status:
Solved
For:
Yade Edit question
Assignee:
No assignee Edit question
Solved by:
Leonard
Solved:
Last query:
Last reply:
Revision history for this message
Bruno Chareyre (bruno-chareyre) said :
#1

Hi,
This script will not run with python3.

Questions coming to mind, though:
- why not defining larger walls in the first place?
- why not changing the size of the existing walls instead of erasing them and inserting new ones with different "id's" (that's most likely the core dump explanation since TriaxialStressController keeps looking for the older ones).

Bruno

Revision history for this message
Leonard (z2521899293) said :
#2

Hi Bruno,

>> This script will not run with python3.
Yes, my yade version is 2018.02b so it doesn't work with python3.

>>why not defining larger walls in the first place?
Previously I was working on triaxial compression tests and I already have lots of DEM samples. I'd like to use the same samples in triaxial extension tests for the purpose of (1) saving time (2) they are exactly the same as the one used in triaixal compression tests.

>>why not changing the size of the existing walls
Yes, this is actually what I want. Do you have any idea of how to change the size of the existing walls?

Thanks
Leonard

Revision history for this message
Jérôme Duriez (jduriez) said :
#3

> Do you have any idea of how to change the size of the existing walls?

b.shape.extents = b.shape.extents * 10 # b = O.bodies[triax.wall_back_id]

should probably do the trick (for one boundary, repeat with appropriate ids for the 5 others)

Revision history for this message
Leonard (z2521899293) said :
#4

Hi Jérôme,

Yes, your answer can perfectly solve the problem.

Thanks
Leonard

Revision history for this message
Bruno Chareyre (bruno-chareyre) said :
#5

> b.shape.extents = b.shape.extents * 10

Perfect answer.
Remember that it only works if thickness is null.

B