triaxial test with CohFrictMat

Asked by Fereshteh Salehi

Hello everybody when I run this triaxial test code In the case where setCohesionNow=True
I get this error terminate called after throwing an instance of 'std::runtime_error'
  what(): Undefined or ambiguous IPhys dispatch for types FrictMat and CohFrictMat.(core dump)
Please guide me.

from yade import pack
############################################
### DEFINING VARIABLES AND MATERIALS ###
############################################

# The following 5 lines will be used later for batch execution
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.34#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.02 # 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(.8,.8,.8) # corners of the initial packing

## create materials for spheres and trash
O.materials.append(FrictMat(young=young,poisson=0.5,frictionAngle=radians(compFricDegree),density=2600,label='spheres'))
O.materials.append(CohFrictMat(young=1e6,poisson=0.1,density=1400,label='trash',frictionAngle=radians(compFricDegree),
    isCohesive=True,
    normalCohesion=50000000,
    shearCohesion=50000000,
))
O.materials.append(FrictMat(young=young,poisson=0.5,frictionAngle=0,density=0,label='walls'))

## create walls around the packing
walls=aabbWalls([mn,mx],thickness=0,material='walls')
wallIds=O.bodies.append(walls)

## use a SpherePack object to generate a random loose particles packing
sp=pack.SpherePack()
spSmall = pack.SpherePack()
spBig = pack.SpherePack()

sp.makeCloud((0,0,0),(.8,.8,.8),psdSizes=[.01,.0105,.011,.078,.08,.081],psdCumm=[0,.97,.9868,.987,.99,1],distributeMass=False,seed=1)

for ss in sp: #split SpherePack into two other packs based on the particle size
  r = ss[1]
  if r > .05/2:# please note that you feed diameters nor radii in psdSizes, that is why I divide it by 2
    spBig.add(ss[0],ss[1])

  else:
    spSmall.add(ss[0],ss[1])
# add only the spheres that you want to replace and replace them with clump1
spSmall.toSimulation(material='spheres')
ct1 = clumpTemplate([1,1],[[0,0,0],[0,0,1]])

O.bodies.replaceByClumps( [ct1] , [1], discretization = 20 )
for b in O.bodies:
        if b.isClumpMember: b.shape.color=(1,1,1)
####product trash#####
a=[0,.005,.01,.015,.02,.025,.03,.035]
b=[0,.005,.01,.015,.02,.025,.03,.035,.04,.045,.05,.055,.06,.065,.07,.075]
c=[.005]
d=[]
e=[.005]
g=e*128
for i in a:
 for j in b:
  for k in c:
   d.append((i,j,k))
#add the remaining spheres stored in the other sphere pack
spBig.toSimulation(material='trash')
ct2 = clumpTemplate(g,d)
aa=O.bodies.replaceByClumps( [ct2] , [1], discretization = 20 )
for ii in aa:
  xx=ii[1]
  for jj in xx:
    O.bodies[jj].shape.color=(1,1,0)

#O.dt = 0
#O.step()
#for i in O.interactions:
    #i.phys.unp = i.geom.penetrationDepth

#############################
### DEFINING ENGINES ###
############################

triax=TriaxialStressController(
 ## TriaxialStressController will be used to control stress and strain. It controls particles size and plates positions.
 ## this control of boundary conditions was used for instance in http://dx.doi.org/10.1016/j.ijengsci.2008.07.002
 maxMultiplier=1.+2e4/young, # spheres growing factor (fast growth)
 finalMaxMultiplier=1.+2e3/young, # spheres growing factor (slow growth)
 thickness = 0,
 ## switch stress/strain control using a bitmask. What is a bitmask, huh?!
 ## Say x=1 if stess is controlled on x, else x=0. Same for for y and z, which are 1 or 0.
 ## Then an integer uniquely defining the combination of all these tests is: mask = x*1 + y*2 + z*4
 ## to put it differently, the mask is the integer whose binary representation is xyz, i.e.
 ## "100" (1) means "x", "110" (3) means "x and y", "111" (7) means "x and y and z", etc.
 stressMask = 7,
 internalCompaction=False, # 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_CohFrictMat_CohFrictMat_CohFrictPhys(
            setCohesionNow=True,
            setCohesionOnNewContacts=False,
            )],
        [Law2_ScGeom6D_CohFrictPhys_CohesionMoment(),Law2_ScGeom_FrictPhys_CundallStrack()]
 ),
 ## We will use the global stiffness of each body to determine an optimal timestep (see https://yade-dem.org/w/images/1/1b/Chareyre&Villard2005_licensed.pdf)
 GlobalStiffnessTimeStepper(active=1,timeStepUpdateInterval=100,timestepSafetyCoefficient=0.8),
 triax,
 TriaxialStateRecorder(iterPeriod=100,file='WallStresses'+table.key),
 newton
]

#Display spheres with 2 colors for seeing rotations better
Gl1_Sphere.stripes=0
if nRead==0: yade.qt.Controller(), yade.qt.View()

#######################################
### APPLYING CONFINING PRESSURE ###
#######################################

#the value of (isotropic) confining stress defines the target stress to be applied in all three directions
triax.goal1=triax.goal2=triax.goal3=-10000

while 1:
 print(O.iter)
 O.run(1000, True)
  ##the global unbalanced force on dynamic bodies, thus excluding boundaries, which are not at equilibrium
 unb=unbalancedForce()
 print ('unbalanced force:',unb,' mean stress: ',triax.meanStress)
 if unb<stabilityThreshold and abs(-10000-triax.meanStress)/10000<0.001:
  break

O.save('confinedState'+key+'.yade.gz')
#print ("### Isotropic state saved ###")

###################################################
### REACHING A SPECIFIED POROSITY PRECISELY ###
###################################################

### We will reach a prescribed value of porosity with the REFD algorithm
### (see http://dx.doi.org/10.2516/ogst/2012032 and
### http://www.geosyntheticssociety.org/Resources/Archive/GI/src/V9I2/GI-V9-N2-Paper1.pdf)

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()
 ## while we run steps, triax will tend to grow particles as the packing
 ## keeps shrinking as a consequence of decreasing friction. Consequently
 ## porosity will decrease
 O.run(500,1)

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

##We move to deviatoric loading, let us turn internal compaction off to keep particles sizes constant
triax.internalCompaction=False

## Change contact friction (remember that decreasing it would generate instantaneous instabilities)
setContactFriction(radians(finalFricDegree))

##set stress control on x and z, we will impose strain rate on y
triax.stressMask = 5
##now goal2 is the target strain rate
triax.goal2=rate
## we define the lateral stresses during the test, here the same 10kPa as for the initial confinement.
triax.goal1=-10000
triax.goal3=-10000

##we can change damping here. What is the effect in your opinion?
newton.damping=0.1

##Save temporary state in live memory. This state will be reloaded from the interface with the "reload" button.
O.saveTmp()

#####################################################
### Example of how to record and plot data ###
#####################################################

from yade import plot

### a function saving variables
def history():
 plot.addData(e11=-triax.strain[0], e22=-triax.strain[1], e33=-triax.strain[2],
        ev=-triax.strain[0]-triax.strain[1]-triax.strain[2],
      s11=-triax.stress(triax.wall_right_id)[0],
      s22=-triax.stress(triax.wall_top_id)[1],
      s33=-triax.stress(triax.wall_front_id)[2],
      i=O.iter)

if 1:
  ## include a periodic engine calling that function in the simulation loop
 O.engines=O.engines[0:5]+[PyRunner(iterPeriod=20,command='history()',label='recorder')]+O.engines[5:7]
  ##O.engines.insert(4,PyRunner(iterPeriod=20,command='history()',label='recorder'))
else:
  ## With the line above, we are recording some variables twice. We could in fact replace the previous
  ## TriaxialRecorder
  ## by our periodic engine. Uncomment the following line:
 O.engines[4]=PyRunner(iterPeriod=20,command='history()',label='recorder')

O.run(100000,True)
### declare what is to plot. "None" is for separating y and y2 axis
plot.plots={'i':('e11','e22','e33',None,'s11','s22','s33')}
### the traditional triaxial curves would be more like this:
##plot.plots={'e22':('s11','s22','s33',None,'ev')}

## display on the screen (doesn't work on VMware image it seems)
plot.plot()

##### PLAY THE SIMULATION HERE WITH "PLAY" BUTTON OR WITH THE COMMAND O.run(N) #####

## In that case we can still save the data to a text file at the the end of the simulation, with:
plot.saveDataTxt('results'+key)
##or even generate a script for gnuplot. Open another terminal and type "gnuplot plotScriptKEY.gnuplot:
plot.saveGnuplot('plotScript'+key)

Question information

Language:
English Edit question
Status:
Answered
For:
Yade Edit question
Assignee:
No assignee Edit question
Last query:
Last reply:
Revision history for this message
Jérôme Duriez (jduriez) said :
#1

Hi,

The script has a number of other flaws, for instance the fact that it is desired to use Law2_ScGeom6D_CohFrictPhys_CohesionMoment but there is nowhere something (in the Ig2) that computes ScGeom6D.

See https://yade-dem.org/doc/user.html#base-engines.

And probably it would be better to avoid mixing FrictMat and CohFrictMat. If you want to have non-cohesive contacts, just use another CohFrictMat with zero cohesive properties (and the script will be much simpler to design and understand).

Note also your triax-cohesive.py example (which actually follows another point of view than my previous sentence, so you will have the choice..)

Can you help with this problem?

Provide an answer of your own, or ask Fereshteh Salehi for more information if necessary.

To post a message you must log in.