Simulation compared to real tests
Goodmoring,
using this script [1] I've made some simulation with different value of SN parameter and PI (25000, 50000 an 75000 for SN and respectively 2500, 5000 and 7500 for PI). By comparing those result with real shear test performed on a Bristol Sand ( confining stress was set on 25, 50 and 75 kPa) I've observed that the simulated stress-strain graph is exactly the half of the stress-strain curve at each confining stress. I've tried to double SN and PI parameters on the simulation, and the results o a stress-strain curve match the real stress-strain curve at each confining stress. How is that possible? Is There something I don't understand that makes this possible, like a "trick" on the script?
Thanks for your help.
[1]
###
from yade import pack,plot,export
import math
sp=pack.
O.periodic=True
# dimensions of sample (fixed by particle size such as L/D~15)
RADIUS=0.001
length=0.06
height=length/3
width=length
thickness=RADIUS
# friction angles
compFRIC=15. # during compaction (controls porosity)
FRIC=40. # during shear
# boundary conditions
PI=5e3 # sample preparation: pressure applied for the isotropic compaction
SN=50e3 # normal stress
RATE=0.1 # shear velocity (top plate)
# simulation control
DAMPSHEAR=0
ITER=8e4
VTK=20
OUT='TEST'
####
O.cell.
O.materials.
O.materials.
upBox = utils.box(
lowBox = utils.box(
O.bodies.
sp.makeCloud(
O.bodies.
effCellVol=
volRatio=
#print 'volRatio=
O.engines=[
ForceResetter()
,InsertionSort
,InteractionLoop(
[Ig2_
[Ip2_
[Law2_
)
,GlobalStiffne
,PeriTriaxCont
,NewtonIntegra
,PyRunner(
,VTKRecorder(
]
def dataRecorder():
h=vol=
h=O.bodies[
vol=h*
contactStress=
for o in O.bodies:
if isinstance(
nb_s+=1
vol_s += 4.*pi/3.
n = 1-vol_s/vol
nbFrictCont=0.
for i in O.interactions:
if i.isReal and i.phys.
nbFrictCont+=1
plot.addData(
iter=O.iter
,contactStres
,xW=(
,height=h
,volume=vol
,porosity=n
)
def triaxDone():
global phase
volRatio=
h=O.bodies[
vol=h*
contactStress=
vol_s=
Rmin=1e6
for o in O.bodies:
if isinstance(
nbSph+=1
Rmean+
if o.shape.
if o.shape.
vol_s += 4.*pi/3.
Rmean=Rmean/nbSph
n = 1-vol_s/vol
print 'DONE! iter=',O.iter,'| sample generated: nb spheres',nbSph,', Rmean=',Rmean,', Rratio=
print 'Changing contact properties now'
tt=TriaxialCom
tt.setContactP
triax.dead=True
O.pause()
#### Initialization
print 'SAMPLE PREPARATION!'
recData.dead=True # uncomment to record what is happening during stress initialization
O.run(600000,1)
saveSolid.
#saveSolid.
O.step()
saveSolid.dead=True
O.save(
print 'Normal stress (platen) = ',O.forces.
print 'Normal stress (contacts) = ',getStress(
#### Applying normal stress
print 'NORMAL LOADING! iter=',O.iter
recData.dead=True
stage=0
stiff=fnPlaten=
def servo():
global stage,stiff,
if stage==0:
currentSN=
unbF=
#print 'SN=',SN,'| current SN = ',currentSN,' | unbF=',unbF
boundaryVel=
O.bodies[
if ( (abs(currentSN-
stage+=1
fnPlaten=
print 'Normal stress =',currentSN,' | unbF=',unbF
## the following computes the stiffness of the plate (used for stress control of the top plate)
for i in O.interactions.
stiff+
print 'DONE! iter=',O.iter
O.pause()
if stage==1:
fnDesired=
#boundaryVel=
boundaryVel=
O.bodies[
O.engines = O.engines[
O.run(35000,1)
print 'STABILIZING! iter=',O.iter
O.run(10000,1)
# coloring particles to see vertical stripes in material
dxi=4*(2*RADIUS) # can be a function of cell length dxi=O.cell.
n=int(length/dxi)
xmin=1e6
for i in range(0,n):
for o in O.bodies:
if o.id>1:
if o.state.
if (o.state.
o.shape.
for o in O.bodies:
if (o.state.
o.shape.
saveSolid.
#saveSolid.
O.step()
saveSolid.dead=True
O.save(
if recData.
print 'Normal stress (platen) = ',O.forces.
print 'Normal stress (contacts) = ',getStress(
#### preparing for shearing
Gl1_Sphere.
print 'Gluing spheres to boundary walls'
gluedSpheres=[]
## gluing particles in contact with the walls
for i in O.interactions:
if i.isReal:
if isinstance(
O.bodies[
gluedSpheres += [O.bodies[i.id2]]
if isinstance(
O.bodies[
gluedSpheres += [O.bodies[i.id1]]
for i in O.interactions:
if i.isReal and ( O.bodies[
O.bodies[
O.bodies[
O.bodies[
O.bodies[
i.phys.
print 'nb of glued spheres=
#### shearing
print 'SHEARING! iter=',O.iter
saveSolid.
O.step()
saveSolid.dead=True
O.save(
recData.dead=False
newton.
saveSolid.
saveSolid.
shearVel=0
iterShear=O.iter
while 1:
O.run(int(10),1)
if shearVel<RATE:
shearVel+
# only top wall moves
O.bodies[
## top and bottom walls move
#O.bodies[
#O.bodies[
if ( O.iter >= (int(iterShear+
print 'iter=',O.iter,' -> FINISHED!'
plot.
O.save(
sys.exit(0)
Question information
- Language:
- English Edit question
- Status:
- Answered
- For:
- Yade Edit question
- Assignee:
- No assignee Edit question
- Last query:
- Last reply:
Can you help with this problem?
Provide an answer of your own, or ask Amedeo Galletti for more information if necessary.