unconsolidated undrained triaxial test

Asked by Seti

Hi all,

I have a general question, my understanding is we are modelling
"unconsolidated undrained (UU) triaxial test" through below script? is that correct ?
If yes, can we model CU ( consolidated undrained ) and CD (consolidated drained ) tests by yade as well?

Thanks for help
Seti

# -*- coding: utf-8 -*-
#*************************************************************************
# Copyright (C) 2010 by Bruno Chareyre *
# bruno.chareyre_at_grenoble-inp.fr *
# *
# This program is free software; it is licensed under the terms of the *
# GNU General Public License v2 or later. See file LICENSE for details. *
#*************************************************************************/

## This script details the simulation of a triaxial test on sphere packings using Yade
## See the associated pdf file for detailed exercises
## the algorithms presented here have been used in published papers, namely:
## * Chareyre et al. 2002 (http://www.geosyntheticssociety.org/Resources/Archive/GI/src/V9I2/GI-V9-N2-Paper1.pdf)
## * Chareyre and Villard 2005 (https://yade-dem.org/w/images/1/1b/Chareyre&Villard2005_licensed.pdf)
## * Scholtès et al. 2009 (http://dx.doi.org/10.1016/j.ijengsci.2008.07.002)
## * Tong et al.2012 (http://dx.doi.org/10.2516/ogst/2012032)
##
## Most of the ideas were actually developped during my PhD.
## If you want to know more on micro-macro relations evaluated by triaxial simulations
## AND if you can read some french, it is here: http://tel.archives-ouvertes.fr/docs/00/48/68/07/PDF/Thesis.pdf

from yade import pack,plot

############################################
### DEFINING VARIABLES AND MATERIALS ###
############################################

# The following 5 lines will be used later for batch execution
nRead=readParamsFromTable(
 num_spheres=1000,# number of spheres
 compFricDegree =36.28, # 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.42 #the porosity we want for the packing
compFricDegree = 40# contact friction during the deviatoric loading
rate=-0.1 # loading rate (strain rate)
damp=0.3 # damping coefficient
stabilityThreshold=0.01 # we test unbalancedForce against this value in different loops (see below)
young=229e6# contact stiffness
mn,mx=Vector3(0,0,0),Vector3(0.09,0.18,0.09) # corners of the initial packing

## create materials for spheres and plates
O.materials.append(CohFrictMat(alphaKr=0.5,young=young,poisson=0.25,frictionAngle=radians(40),normalCohesion=7.5e1,shearCohesion=2.25e1,momentRotationLaw=True,etaRoll=0.001,density=2600,isCohesive=True,label='spheres'))
O.materials.append(CohFrictMat(young=young,poisson=0.25,frictionAngle=radians(40),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()

clumps=False #turn this true for the same example with clumps
if clumps:
 ## approximate mean rad of the futur dense packing for latter use
 volume = (mx[0]-mn[0])*(mx[1]-mn[1])*(mx[2]-mn[2])
 mean_rad = pow(0.09*volume/num_spheres,0.3333)
 ## define a unique clump type (we could have many, see clumpCloud documentation)
 c1=pack.SpherePack([((-0.2*mean_rad,0,0),0.5*mean_rad),((0.2*mean_rad,0,0),0.5*mean_rad)])
 ## generate positions and input them in the simulation
 sp.makeClumpCloud(mn,mx,[c1],periodic=False)
 sp.toSimulation(material='spheres')
 O.bodies.updateClumpProperties()#get more accurate clump masses/volumes/inertia
else:
 sp.makeCloud(mn,mx,-1,0.3333,num_spheres,False, 0.95,seed=1) #"seed" make the "random" generation always the same
 #sp.makeCloud(mn,mx,0.066,num_spheres) #"seed" make the "random" generation always the same
 O.bodies.append([sphere(center,rad,material='spheres') for center,rad in sp])
 #or alternatively (higher level function doing exactly the same):
 #sp.toSimulation(material='spheres')

############################
### 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=True, # If true the confining pressure is generated by growing particles
)

newton=NewtonIntegrator(damping=damp)
########################################
#Modified engine
##################################
O.engines=[
        ForceResetter(),
        InsertionSortCollider([Bo1_Sphere_Aabb(),Bo1_Box_Aabb()]),
        InteractionLoop(
                [Ig2_Sphere_Sphere_ScGeom(),Ig2_Box_Sphere_ScGeom()],
                [Ip2_FrictMat_FrictMat_FrictPhys(),Ip2_CohFrictMat_CohFrictMat_CohFrictPhys(label="cohesiveIp")],
  #[Ip2_CohFrictMat_CohFrictMat_CohFrictPhys(setCohesionNow=True,label="cohesiveIp")],
                [Law2_ScGeom_FrictPhys_CundallStrack(),Law2_ScGeom_CohFrictPhys_CohesionMoment(
   useIncrementalForm=True, #useIncrementalForm is turned on as we want plasticity on the contact moments
   always_use_moment_law=True, #if we want "rolling" friction even if the contact is not cohesive (or cohesion is broken), we will have to turn this true somewhere
   label='cohesiveLaw')]
  #[Law2_ScGeom_CohFrictPhys_CohesionMoment(
   #useIncrementalForm=True, #useIncrementalForm is turned on as we want plasticity on the contact moments
   #always_use_moment_law=True, #if we want "rolling" friction even if the contact is not cohesive (or cohesion is broken), we will have to turn this true somewhere
   #label='cohesiveLaw')]
        ),
        ## 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='150e3,test orig 229,damp0.3,rate 0.005,NEW50,alphaKr=0.5,young229,e1e1,poisson=0.25,frictionAngle=radians(40),,etaRoll=0.025,density=2600,wall36.28,'+key),
        newton
]

##########################################################
#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()]
 #),
 ## 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()

## UNCOMMENT THE FOLLOWING SECTIONS ONE BY ONE
## DEPENDING ON YOUR EDITOR, IT COULD BE DONE
## BY SELECTING THE CODE BLOCKS BETWEEN THE SUBTITLES
## AND PRESSING CTRL+SHIFT+D
#if nRead==0: yade.qt.Controller(), yade.qt.View()
print 'Number of elements: ', len(O.bodies)
print 'Box Volume: ', triax.boxVolume
#######################################
### 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=-150000

#while 1:
  #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('compactedStateBEL20,young=63.9e8'+key+'.yade.gz')
print "### Compacted state saved ###"

##############################
### 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=-150000
triax.goal3=-150000

##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(100,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')}
plot.plots={'e22':('s11','s22')}

## 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('resultsBEL20,young=63.9e82222'+key)
##or even generate a script for gnuplot. Open another terminal and type "gnuplot plotScriptKEY.gnuplot:
plot.saveGnuplot('plotScriptBEL20,young=63.9e8222'+key)
rr=yade.qt.Renderer()
rr.shape=False
rr.intrPhys=True

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
Amiya Prakash Das (amiya0703) said :
#1

Hi

This is a CD test. Surely you can do undrained test also:

Set
stressMask = 0
triax.goal2=-rate
triax.goal1=triax.goal3=rate/2

You can try...

Best
Amiya

Revision history for this message
Seti (seti) said :
#2

Hi Amiya,

Thanks for reply, how about UU?

Thanks,
Seti

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

Hi,
I don't see a need to distinguish CD/CU/UU here. The real question is if one step can be "U" and as Amiya replied: yes it is.
Note that simulating the first "U" in "UU" is not a very sensible perspective since there is nothing to actually simulate (no movement).
Bruno

Revision history for this message
Seti (seti) said :
#4

Hi Bruno,

Thanks for help, so we as per Amiya comment I understood how model CD & CU ,however I am not sure about your comment regards UU test. my understanding is in UU test although we have grains movement the volume of sample remains the same?

Would you please advise me in this regards?

thanks,
Seti

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

The consolidation stage is supposed to be isotropic. If it is isotropic + constant volume then there is really nothing happening, the boundaries do not move, and the stress is constant.
"But the stress must be increased", you may think. Yes, if you think in terms of total stress on a saturated sample in lab tests, but you don't simulate the saturating fluid, so what you have for stress in the simulation should be understood as effective stress. And of course (do you agree?) the effective stress is not changing during a "U" consolidation.
Bruno

Revision history for this message
Seti (seti) said :
#6

Thanks Bruno,

It makes sense - Considering your comments- my physical samples be completely aggregated, if I want to skip the consolidation part ( I know by this assumption we change the condition to USC test when there is confining pressure around the sample) - how should I edit the current script to address my requirements -

P.S. I need to model UU & CU.

Thanks

Seti

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

For CU, see #1 by Amiya.
For UU, again, there is nothing to do. Just as textbooks (should) tell you, conducting UU tests with different confining pressure is pointless because all tests are exactly the same from the solid phase point of view (i.e. in terms of effective stress). If you run one CU simulation with confining p=100, giving q_peak=300 , you can call it UU on a material pre-consolidated at 100.
You can then pretend this very same result q_peak=300 reflects the results of UU tests with p=200, 300 400,... since there is strictly no difference neither from theoretical nor computational points of view. I fail to see the point of such a trick, though.
Conducting UU tests with different confining pressure is pointless, that's it.
Bruno

Revision history for this message
Seti (seti) said :
#8

Hi Bruno,

Thanks for your help. Would you please kindly confirm if there is same concept in below script - aggregated sample?
SignaT: pre-stress,...

Regards,
seti
################################################################################
#
# Triaxial test. Axial strain rate is prescribed and transverse prestress.
# Test is possible on prism or cylinder
# An independent c++ engine may be created from this script in the future.
#
################################################################################
from yade import pack, plot
import os

# default parameters or from table
readParamsFromTable(noTableOk=True,
 # type of test ['cyl','cube']
 testType = 'cyl',

 # material parameters
 young = 30e6,
 poisson = .2,
 frictionAngle = 0.27,
 sigmaT = 1.5e3,
 epsCrackOnset = 1e-4,
 relDuctility = 10,

 # prestress
 preStress = -1.5e5,
 # axial strain rate
 strainRate = -1,

 # assamlby parameters
 rParticle = .075e-3, #
 width = 2e-3,
 height = 5e-3,
 bcCoeff = 5,

 # facets division
 nw = 24,
 nh = 15,

 # output specifications
 fileName = 'young = 30e6,frictionAngle = 1.5',
 exportDir = '/tmp',
 runGnuplot = False,
 runInGui = True,
)
from yade.params.table import *
assert testType in ['cyl','cube']

# materials
concMat = O.materials.append(CpmMat(
 young=young,frictionAngle=frictionAngle,poisson=poisson,sigmaT=sigmaT,
 epsCrackOnset=epsCrackOnset,relDuctility=relDuctility
))
frictMat = O.materials.append(FrictMat(
 young=young,poisson=poisson,frictionAngle=frictionAngle
))

# spheres
pred = pack.inCylinder((0,0,0),(0,0,height),.5*width) if testType=='cyl' else pack.inAlignedBox((-.5*width,-.5*width,0),(.5*width,.5*width,height)) if testType=='cube' else None
sp=SpherePack()
sp = pack.randomDensePack(pred,spheresInCell=2000,radius=rParticle,memoizeDb='/tmp/triaxTestOnCylinder.sqlite',returnSpherePack=True)
spheres=sp.toSimulation(color=(0,1,1),material=concMat)

# bottom and top of specimen. Will have prescribed velocity
bot = [O.bodies[s] for s in spheres if O.bodies[s].state.pos[2]<rParticle*bcCoeff]
top = [O.bodies[s] for s in spheres if O.bodies[s].state.pos[2]>height-rParticle*bcCoeff]
vel = strainRate*(height-rParticle*2*bcCoeff)
for s in bot:
 s.shape.color = (1,0,0)
 s.state.blockedDOFs = 'xyzXYZ'
 s.state.vel = (0,0,-vel)
for s in top:
 s.shape.color = Vector3(0,1,0)
 s.state.blockedDOFs = 'xyzXYZ'
 s.state.vel = (0,0,vel)
print 'Number of elements: ', len(O.bodies)
print 'Timestep',O.dt
print 'young = 30e6,frictionAngle = 0.27,preStress = -1.5e5,sigmaT = 1.5e2'

# facets
facets = []
if testType == 'cyl':
 rCyl2 = .5*width / cos(pi/float(nw))
 for r in xrange(nw):
  for h in xrange(nh):
   v1 = Vector3( rCyl2*cos(2*pi*(r+0)/float(nw)), rCyl2*sin(2*pi*(r+0)/float(nw)), height*(h+0)/float(nh) )
   v2 = Vector3( rCyl2*cos(2*pi*(r+1)/float(nw)), rCyl2*sin(2*pi*(r+1)/float(nw)), height*(h+0)/float(nh) )
   v3 = Vector3( rCyl2*cos(2*pi*(r+1)/float(nw)), rCyl2*sin(2*pi*(r+1)/float(nw)), height*(h+1)/float(nh) )
   v4 = Vector3( rCyl2*cos(2*pi*(r+0)/float(nw)), rCyl2*sin(2*pi*(r+0)/float(nw)), height*(h+1)/float(nh) )
   f1 = facet((v1,v2,v3),color=(0,0,1),material=frictMat)
   f2 = facet((v1,v3,v4),color=(0,0,1),material=frictMat)
   facets.extend((f1,f2))
elif testType == 'cube':
 nw2 = nw/4
 for r in xrange(nw2):
  for h in xrange(nh):
   v11 = Vector3( -.5*width + (r+0)*width/nw2, -.5*width, height*(h+0)/float(nh) )
   v12 = Vector3( -.5*width + (r+1)*width/nw2, -.5*width, height*(h+0)/float(nh) )
   v13 = Vector3( -.5*width + (r+1)*width/nw2, -.5*width, height*(h+1)/float(nh) )
   v14 = Vector3( -.5*width + (r+0)*width/nw2, -.5*width, height*(h+1)/float(nh) )
   f11 = facet((v11,v12,v13),color=(0,0,1),material=frictMat)
   f12 = facet((v11,v13,v14),color=(0,0,1),material=frictMat)
   v21 = Vector3( +.5*width, -.5*width + (r+0)*width/nw2, height*(h+0)/float(nh) )
   v22 = Vector3( +.5*width, -.5*width + (r+1)*width/nw2, height*(h+0)/float(nh) )
   v23 = Vector3( +.5*width, -.5*width + (r+1)*width/nw2, height*(h+1)/float(nh) )
   v24 = Vector3( +.5*width, -.5*width + (r+0)*width/nw2, height*(h+1)/float(nh) )
   f21 = facet((v21,v22,v23),color=(0,0,1),material=frictMat)
   f22 = facet((v21,v23,v24),color=(0,0,1),material=frictMat)
   v31 = Vector3( +.5*width - (r+0)*width/nw2, +.5*width, height*(h+0)/float(nh) )
   v32 = Vector3( +.5*width - (r+1)*width/nw2, +.5*width, height*(h+0)/float(nh) )
   v33 = Vector3( +.5*width - (r+1)*width/nw2, +.5*width, height*(h+1)/float(nh) )
   v34 = Vector3( +.5*width - (r+0)*width/nw2, +.5*width, height*(h+1)/float(nh) )
   f31 = facet((v31,v32,v33),color=(0,0,1),material=frictMat)
   f32 = facet((v31,v33,v34),color=(0,0,1),material=frictMat)
   v41 = Vector3( -.5*width, +.5*width - (r+0)*width/nw2, height*(h+0)/float(nh) )
   v42 = Vector3( -.5*width, +.5*width - (r+1)*width/nw2, height*(h+0)/float(nh) )
   v43 = Vector3( -.5*width, +.5*width - (r+1)*width/nw2, height*(h+1)/float(nh) )
   v44 = Vector3( -.5*width, +.5*width - (r+0)*width/nw2, height*(h+1)/float(nh) )
   f41 = facet((v41,v42,v43),color=(0,0,1),material=frictMat)
   f42 = facet((v41,v43,v44),color=(0,0,1),material=frictMat)
   facets.extend((f11,f12,f21,f22,f31,f32,f41,f42))
O.bodies.append(facets)
mass = O.bodies[0].state.mass
for f in facets:
 f.state.mass = mass
 f.state.blockedDOFs = 'XYZz'
#############################################
plot.plots={'eps':('sigma')} #,'sigma.50')},'t':('eps')} #'sigma.25','sigma.50','sigma.75')}

O.saveTmp('initial');

O.timingEnabled=False

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

# plots
plot.plots = { 'e':('s',), }
def plotAddData():
 f1 = sum(O.forces.f(b.id)[2] for b in top)
 f2 = sum(O.forces.f(b.id)[2] for b in bot)
 f = .5*(f2-f1)
 s = f/(pi*.25*width*width) if testType=='cyl' else f/(width*width) if testType=='cube' else None
 e = (top[0].state.displ()[2] - bot[0].state.displ()[2]) / (height-rParticle*2*bcCoeff)
 plot.addData(
  i = O.iter,
  s = s,
  e = e,
  f1 = f1,
  f2 = f2
 )

# apply prestress to facets
def addForces():
 for f in facets:
  n = f.shape.normal
  a = f.shape.area
  O.forces.addF(f.id,preStress*a*n)

# stop condition and exit of the simulation
def stopIfDamaged(maxEps=5e-2):
 extremum = max(abs(s) for s in plot.data['s'])
 s = abs(plot.data['s'][-1])
 e = abs(plot.data['e'][-1])
 if O.iter < 1000 or s > .5*extremum and e < maxEps:
  return
 f = os.path.join(exportDir,fileName)
 print 'gnuplot',plot.saveGnuplot(f,term='png')
 if runGnuplot:
  import subprocess
  os.chdir(exportDir)
  subprocess.Popen(['gnuplot',f+'.gnuplot']).wait()
 print 'Simulation finished'
 O.pause()
 #sys.exit(0) # results in some threading exception

O.dt=.5*utils.PWaveTimeStep()
enlargeFactor=1.5
O.engines=[
 ForceResetter(),
 InsertionSortCollider([
  Bo1_Sphere_Aabb(aabbEnlargeFactor=enlargeFactor,label='bo1s'),
  Bo1_Facet_Aabb()
 ]),
 InteractionLoop(
  [
   Ig2_Sphere_Sphere_ScGeom(interactionDetectionFactor=enlargeFactor,label='ss2d3dg'),
   Ig2_Facet_Sphere_ScGeom(),
  ],
  [
   Ip2_CpmMat_CpmMat_CpmPhys(cohesiveThresholdIter=O.iter+5),
   Ip2_FrictMat_CpmMat_FrictPhys(),
   Ip2_FrictMat_FrictMat_FrictPhys(),
  ],
  [
   Law2_ScGeom_CpmPhys_Cpm(),
   Law2_ScGeom_FrictPhys_CundallStrack(),
  ],
 ),
 PyRunner(iterPeriod=1,command="addForces()"),
 NewtonIntegrator(damping=.3),
 CpmStateUpdater(iterPeriod=50,label='cpmStateUpdater'),
 PyRunner(command='plotAddData()',iterPeriod=10),
 PyRunner(iterPeriod=50,command='stopIfDamaged()'),
]

# run one step
O.step()

# reset interaction detection enlargement
bo1s.aabbEnlargeFactor=ss2d3dg.interactionDetectionFactor=1.0

# initialize auto-updated plot
if runInGui:
 plot.plot()
 try:
  from yade import qt
  renderer=qt.Renderer()
  # uncomment following line to exagerate displacement
  #renderer.dispScale=(100,100,100)
 except:
  pass

#O.run()
# run

O.run(5000,True)
plot.saveDataTxt('preStress5000-2 = -1.5e5')

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

Hi, I would suggest to get confirmation by your own validations, based on the output (e.g. is volume constant when supposed to be?) rather than me reading superficially the script. I'm less efficient than your computer at interpretating python langage. ;)
Bruno

Revision history for this message
Seti (seti) said :
#10

Wise answer! As always - thanks :)

Can you help with this problem?

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

To post a message you must log in.