calibration of CPM model
Hello,
I'm modeling the elastic stress-strain behavior of porous concrete cylinder under compression. I have experimental results of a porous concrete with a porosity = 0.25 and the slope of the elastic stress-strain curve (elastic modulus) is about 2e6 psi and the strength (max stress) is 1600 psi (the curve is linear elastic). I'm trying to calibrate my DEM model (single size spheres, utils.porosity(
elastic modulus of the contact
Poisson's ratio
frictionAngle
epsCrackOnset
relDuctility
sigmaT
Note that every run I use ymport and import exactly same sphere packing. I tried using packing with spheres with different sizes but the results were not much different. Could you please provide some recommendations to have my DEM model reach similar strength and E of the experimental results? Is there a cohesive contact model in Yade that can fit my case better that CPM?
My code is shown below. it consists of two codes, one for packing the spheres and the other one is for compression test simulation.
Thanks
Othman
-------
Compression test code:
from yade import plot,pack, export, ymport
from pprint import pprint
#specimen geometry
radiuscyl=.05
################ Material model parameters ################
intRadius=1.5
pervconc=
young = 3.6e6,
poisson = 0.1,
frictionAngle = atan(1.2),
epsCrackOnset = 3e-2,
relDuctility = 60,
sigmaT = 1e6,
))
################ spheres ################
spheres=
yade.qt.View()
cylheight=
print ('cylheight'
################ creating disks ################
#Wall
zMin,zMax=[pt[2] for pt in aabbExtrema()]
wallIDs = O.bodies.
walls = wallMin,wallMax = [O.bodies[i] for i in wallIDs]
#Applying force by moving the walls in constant displacement (m/second)
wallMin.state.vel = (0,0,0.000001)
wallMax.state.vel = (0,0,-0.005)
################ engines ################
O.engines=[
ForceResetter(),
InsertionSortC
InteractionLoop(
[Ig2_
[Ip2_
[Law2_
),
NewtonIntegrat
CpmStateUpdate
PyRunner(
PyRunner(
]
################ stop condition ################
def stopIfDamaged():
if O.iter < 1000: # do nothing at the beginning
return
fMax = max(plot.data["f"])
f = plot.data["f"][-1]
if f/fMax < .01:
print "Damaged, stopping."
print "f'c = ",max(plot.
print "max force = ", max (plot.data ["f"])
O.pause()
plot.
################ plot stuff ################
# see how to fix this: plot.saveDataTx
def addPlotData():
# forces of walls. f1 is "down", f2 is "up" (f1 needs to be negated for evlauation)
f1,f2 = [O.forces.f(i)[2] for i in wallIDs]
f1 *= -1
# average force (in lbf)
f = .5*(f1+f2)*.224809
# displacement (2 times each wall) (inches)
wall = O.bodies[
displacement = 39.37*2*
# stress (psi)
stress = f/(1550*
# store values
yade.plot.addData(
t = O.time,
i = O.iter,
displacement = displacement,
f1 = f1,
f2 = f2,
f = f,
strain=
stress = stress,
)
plot.plots=
O.dt = 0.
O.step(); # to create initial contacts
# now reset the interaction radius and go ahead
ss2sc.interacti
is2aabb.
O.dt = .8*PWaveTimeStep()
plot.plot()
O.run()
-------
sphere packing code:
from yade import pack, export, ymport
targetp = .25 ##specify the targeted porosity
##specimen geometry
radiuscyl=.05
heightcyl=
SphereRadius = .005205
# material parameters
O.materials.
#######
sp=pack.
sp.makeCloud(
#### cylinder extraction
pred=pack.
spFilter=
spFilter.
#######
facets=
cylinder=
yade.qt.View()
##creating disks
d1=geom.
d2=geom.
disk1IDs= O.bodies.append(d1)
disk2IDs= O.bodies.append(d2)
for i in disk1IDs:
body= O.bodies[i]
body.state.vel = (0,0,-20)
for n in disk2IDs:
body= O.bodies[n]
body.state.vel = (0,0,0)
#######
O.dt=.5*
enlargeFactor=1.5
O.engines=[
ForceResetter(),
InsertionSortC
Bo1_Sphere_
Bo1_Facet_Aabb()
]),
InteractionLoop(
[
Ig2_
Ig2_
],
[
Ip2_
Ip2_
],
[
Law2_
],
),
NewtonIntegrat
PyRunner(
]
O.run()
def stop():
if utils.porosity(
O.pause()
print 'Finished'
for i in disk1IDs: O.bodies.erase(i)
for i in disk2IDs: O.bodies.erase(i)
for i in cylinder: O.bodies.erase(i)
print ('unbalanced forces = ', utils.unbalance
print ('cylinder dimensions = ', utils.aabbDim()) # this shows the dimensions of the cylinder (Diameter in x-axis, Diameter in y-axis, height in z-axis)
print ('porosity = ', utils.porosity())
print ('No. of spheres = ', len (O.bodies))
O.wait()
export.
Question information
- Language:
- English Edit question
- Status:
- Solved
- For:
- Yade Edit question
- Assignee:
- No assignee Edit question
- Solved by:
- Othman Sh
- Solved:
- Last query:
- Last reply: