yade-users team mailing list archive
-
yade-users team
-
Mailing list archive
-
Message #29362
[Question #706562]: Trying to add Oedometric test
New question #706562 on Yade:
https://answers.launchpad.net/yade/+question/706562
Hello,
I am confuse by the Oedometric test provided in the example:
https://yade-dem.org/doc/tutorial-examples.html?highlight=oedometric
I don't understand where the max and min load come. I was able to add the test to my experiment, but I decided to remove it first because after the compression the sphere would be directly bounce off through the plate.
Following is my current code:
import random
import math
from yade import geom, pack, utils, plot, ymport
import pandas as pd
# Define material properties
youngModulus = 1e7
poissonRatio = 0.25
density = 2000
# Create material
material = O.materials.append(FrictMat(young=youngModulus, poisson=poissonRatio, density=density))
# Define cylinder with funnel parameters
center = (0, 0, 0)
diameter = 0.102
height = 0.18
# create cylindrical body with radius 0.102 m and height 0.064 m
cylinder = geom.facetCylinder(center=center, radius=diameter/2, height=height, segmentsNumber=80, wallMask=6)
# assign material to each body in the cylinder
for body in cylinder:
body.bodyMat = material
# add cylinder to simulation
O.bodies.append(cylinder)
# Define cylinder with funnel parameters
center1 = (0,0,height/2)
dBunker = 0.4
dOutput = 0.102
hBunker = 0
hOutput = 0.15
hPipe = 0
# create funnel as a bunker with diameter 0.102 m, height 0.064 m
funnel = geom.facetBunker(center=center1, dBunker=dBunker, dOutput=dOutput, hBunker=hBunker,hOutput=hOutput, hPipe=hPipe, segmentsNumber=80, wallMask=4)
# assign material to each body in the funnel
for body in funnel:
body.bodyMat = material
# add funnel to simulation
O.bodies.append(funnel)
# define sphere parameters and number of spheres
rMean1 = (0.0125+0.019)/4
rRelFuzz1 = (0.019-0.0125)/4/rMean1
num1 = 28
rMean2 = (0.0095+0.0125)/4
rRelFuzz2 = (0.0125-0.0095)/4/rMean2
num2 = 86
rMean3 = (0.00475+0.0095)/4
rRelFuzz3 = (0.0095-0.00475)/4/rMean3
num3 = 2071
rMean4 = (0.00236+0.00475)/4
rRelFuzz4 = (0.00475-0.00236)/4/rMean4
num4 = 18997
#create empty sphere packing
sp = pack.SpherePack()
# generate randomly sphere
sp.makeCloud((-dBunker/4,-dBunker/4,1.3*height),(dBunker/4,dBunker/4,2*height), rMean = rMean1, rRelFuzz = rRelFuzz1, num = num1)
sp.makeCloud((-dBunker/4,-dBunker/4,1.3*height),(dBunker/4,dBunker/4,2*height), rMean = rMean2, rRelFuzz = rRelFuzz2, num = num2)
sp.makeCloud((-dBunker/4,-dBunker/4,1.3*height),(dBunker/4,dBunker/4,2*height), rMean = rMean3, rRelFuzz = rRelFuzz3, num = num3)
sp.makeCloud((-dBunker/4,-dBunker/4,1.3*height),(dBunker/4,dBunker/4,2*height), rMean = rMean4, rRelFuzz = rRelFuzz4, num = num4)
# add the sphere pack to the simulation
sp.toSimulation(material = material)
for body in O.bodies:
if not isinstance(body.shape, Sphere):
continue
if body.shape.radius == rRelFuzz1: #SP
body.shape.color = (0,0,1) #blue
if body.shape.radius == rRelFuzz2: #SP1
body.shape.color = (1,0,0) #red
if body.shape.radius == rRelFuzz3: #SP2
body.shape.color = (0,1,0) #green
if body.shape.radius == rRelFuzz4: #SP3
body.shape.color = (1,1,0) #yellow
O.engines = [
ForceResetter(),
InsertionSortCollider([Bo1_Sphere_Aabb(), Bo1_Facet_Aabb()]),
InteractionLoop(
# handle sphere+sphere and facet+sphere collisions
[Ig2_Sphere_Sphere_ScGeom(), Ig2_Facet_Sphere_ScGeom()],
[Ip2_FrictMat_FrictMat_FrictPhys()],
[Law2_ScGeom_FrictPhys_CundallStrack()]
),
NewtonIntegrator(gravity=(0, 0, -9.81), damping=0.4),
# call the checkUnbalanced function (defined below) every 2 seconds
PyRunner(command='checkUnbalanced()', realPeriod=2),
# call the addPlotData function every 200 steps
PyRunner(command='addPlotData()', iterPeriod=100)
]
O.dt = .5 * PWaveTimeStep()
# enable energy tracking; any simulation parts supporting it
# can create and update arbitrary energy types, which can be
# accessed as O.energy['energyName'] subsequently
O.trackEnergy = True
# if the unbalanced forces goes below .05, the packing
# is considered stabilized, therefore we stop collected
# data history and stop
def checkUnbalanced():
if unbalancedForce() < 1e-2:
O.pause()
plot.saveDataTxt('bbb.txt.bz2')
# plot.saveGnuplot('bbb') is also possible
# collect history of data which will be plotted
def addPlotData():
# each item is given a names, by which it can be the unsed in plot.plots
# the **O.energy converts dictionary-like O.energy to plot.addData arguments
plot.addData(i=O.iter, unbalanced=unbalancedForce(), **O.energy)
# define how to plot data: 'i' (step number) on the x-axis, unbalanced force
# on the left y-axis, all energies on the right y-axis
# (O.energy.keys is function which will be called to get all defined energies)
# None separates left and right y-axis
plot.plots = {'i': ('unbalanced', None, O.energy.keys)}
# show the plot on the screen, and update while the simulation runs
plot.plot()
O.saveTmp()
--
You received this question notification because your team yade-users is
an answer contact for Yade.