yade-users team mailing list archive
-
yade-users team
-
Mailing list archive
-
Message #15770
[Question #658514]: plot of surface displacement, total displacement and force at left of box
New question #658514 on Yade:
https://answers.launchpad.net/yade/+question/658514
Trying to plot graphs of forces surface displacement, total displacement and the force at the left of the box. Nothing was displaced in the graph and i get the error message : "Missing columns in plot.data, adding NaN: tDspl". Please help me debug the error. Am new to yade.
The script is attached .
from yade import pack
from math import *
from yade import plot
from yade import qt
gravity = 100
#box dimensions
widthl = .3
widthr = .3
widthc = .3
height = .3
thick = .1
deep = -.2
#size of grains
sizeMin = 40e-3
sizeMax = 60e-3
frictionAngle = .5
young = 1e8 #stiffness
poisson = 10
dt = 1e-3 #time step
nGravityDeposition = 250 #how long to run initial gravity deposition
nCycles = 3 #how many jumps to run afterwards
nStepsBetweenCycles = 200 #number of times steps between jumps
dspl = 20e-3
#how much larger the initial make cloud box should be
fillBoxHFactor = 3
from yade import polyhedra_utils
width = widthl + widthc + widthr
#mat
mat = PolyhedraMat(young=young,poisson=10,frictionAngle=frictionAngle)
O.materials.append(mat)
def computeSurfaceDisplacement():
vertices = []
for b in O.bodies:
if not isinstance(b.shape,Polyhedra): continue
pos = b.state.pos
ori = b.state.ori
vs = b.shape.v
vs = [pos + ori*v for v in vs]
vertices.extend(vs)
maxZ = max(v[2] for v in vertices)
return maxZ
def plotAddData():
sd = computeSurfaceDisplacement()
plot.addData(
i = O.iter,
tDspl = O.bodies[1].state.displ(),
fLeft = sum(O.forces.f(id)[2] for id in (2,3)),
surfDspl = sd,
)
plot.plots = {'i':'surfDspl','i':'fLeft','i':'tDspl'}
#################################
#engines
O.engines=[
ForceResetter(),
InsertionSortCollider([Bo1_Polyhedra_Aabb(),Bo1_Facet_Aabb()]),
InteractionLoop(
[Ig2_Polyhedra_Polyhedra_PolyhedraGeom(), Ig2_Facet_Polyhedra_PolyhedraGeom()],
[Ip2_PolyhedraMat_PolyhedraMat_PolyhedraPhys()],
[Law2_PolyhedraGeom_PolyhedraPhys_Volumetric()],
),
NewtonIntegrator(damping=0.4,gravity=(0,0,-gravity)),
#commnet out the original PyRunner, replace with new one
#PyRunner(iterPeriod=1,command='checker()'),
PyRunner(iterPeriod = 10,command='plotAddData()'),
]
O.dt = dt
def moveBottom():
v = dspl / O.dt
for b in movables:
b.state.vel = (0,0,-v)
def stopBottom():
for b in movables:
b.state.vel = (0,0,0)
def checker():
for i in range(nCycles):
ii = nGravityDeposition+i*nStepsBetweenCycles
if O.iter == ii:
moveBottom()
if O.iter == ii+1:
stopBottom()
if O.iter == nGravityDeposition+nCycles*nStepsBetweenCycles:
O.pause()
# box
p000 = Vector3(0,0,0)
p100 = Vector3(widthl,0,0)
p200 = Vector3(widthl+widthc,0,0)
p300 = Vector3(widthl+widthc+widthr,0,0)
pxs = (p000,p100,p200,p300)
p001,p101,p201,p301 = [p+Vector3(0,0,height) for p in pxs]
p010,p110,p210,p310 = [p+Vector3(0,thick,0) for p in pxs]
p011,p111,p211,p311 = [p+Vector3(0,thick,height) for p in pxs]
p00b,p10b,p20b,p30b = [p+Vector3(0,0,deep) for p in pxs]
p01b,p11b,p21b,p31b = [p+Vector3(0,thick,deep) for p in pxs]
def rect(vs,**kw):
v1,v2,v3,v4 = vs
return [
facet((v1,v2,v3),**kw),
facet((v1,v3,v4),**kw),
]
movables = rect((p100,p200,p210,p110)) # bottom center
rects = (
(p000,p100,p110,p010), # bottom left
(p200,p300,p310,p210), # bottom left
(p000,p010,p011,p001), # left
(p300,p310,p311,p301), # right
(p000,p100,p101,p001), # front left
(p100,p200,p201,p101), # front center
(p200,p300,p301,p201), # front right
(p010,p110,p111,p011), # back left
(p110,p210,p211,p111), # back center
(p210,p310,p311,p211), # back right
(p100,p200,p20b,p10b), # front center below
(p110,p210,p21b,p11b), # back center below
(p100,p110,p11b,p10b), # left below
(p200,p210,p21b,p20b), # right below
)
rects = movables + sum((rect(r) for r in rects),[])
O.bodies.append(rects)
# gravel
polyhedra_utils.fillBox((0,0,0),(width,thick,fillBoxHFactor*height),mat,sizemin=3*[sizeMin],sizemax=3*[sizeMax],seed=1)
###########
Thank you,
Henry
--
You received this question notification because your team yade-users is
an answer contact for Yade.