yade-users team mailing list archive
-
yade-users team
-
Mailing list archive
-
Message #29354
[Question #706553]: About simulating constant volume condition in a triaxial test
New question #706553 on Yade:
https://answers.launchpad.net/yade/+question/706553
Hi,
I would like to simulate a constant volume condition in a triaxial test (i.e., undrained triaxial test).
In general, we can simulate the constant volume by setting triax controller like:
triax.stressMask = 0 ## all strain control
triax.goal2=rate
triax.goal1=-0.5*rate
triax.goal3=-0.5*rate
For a constant volume condition, volumetric strain should be zero theoretically, while there could be some fluctuation in volumetric strain since it is a numerical simulation. It is OK if I only have a small amount of volumetric strain during the simulation (e.g. below 1e-5). However, I always get accumulation in volumetric strain to a relative large value (e.g. up to 1e-3), which doesn't satisfy the constant volume condition.
Do you have any ideas about simulating a constant volume condition more precisely? For example, what parameters we can adjust to help us simulate constant volume more accurately?
A MWE below modified from Bruno's triaxial script shows the accumulation in volumetric strain during undrained loading.
####################
from yade import pack
nRead = readParamsFromTable(
num_spheres=1000,
compFricDegree=30,
key='_triax_base_',
unknownOk=True
)
from yade.params import table
num_spheres = table.num_spheres
key = table.key
targetPorosity = 0.43
compFricDegree = table.compFricDegree
finalFricDegree = 30
rate = -0.01
damp = 0.2
stabilityThreshold = 0.01
young = 5e6
mn, mx = Vector3(0, 0, 0), Vector3(1, 1, 1)
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)
O.bodies.append([sphere(center, rad, material='spheres') for center, rad in sp])
triax = TriaxialStressController(
maxMultiplier=1. + 2e4 / young,
finalMaxMultiplier=1. + 2e3 / young,
thickness=0,
stressMask=7,
internalCompaction=True,
)
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()]),
## 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
]
Gl1_Sphere.stripes = 0
if nRead == 0:
yade.qt.Controller(), yade.qt.View()
triax.goal1 = triax.goal2 = triax.goal3 = -10000
while 1:
O.run(1000, True)
unb=unbalancedForce()
print 'unbalanced force:',unb,' mean stress: ',triax.meanStress
if unb<stabilityThreshold and abs(-10000-triax.meanStress)/10000<0.001:
break
print "### Isotropic state saved ###"
import sys
while triax.porosity>targetPorosity:
compFricDegree = 0.95*compFricDegree
setContactFriction(radians(compFricDegree))
print "\r Friction: ",compFricDegree," porosity:",triax.porosity,
sys.stdout.flush()
O.run(500,1)
triax.internalCompaction=False
setContactFriction(radians(finalFricDegree))
triax.stressMask = 0
triax.goal2=rate
triax.goal1=-0.5*rate
triax.goal3=-0.5*rate
newton.damping=0.6
from yade import plot
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)
O.engines=O.engines[0:5]+[PyRunner(iterPeriod=20,command='history()',label='recorder')]+O.engines[5:7]
O.run(100,True)
plot.plots={'e22':('s11',None,'ev')}
plot.plot()
##############
Thanks
Leonard
--
You received this question notification because your team yade-users is
an answer contact for Yade.