plot of surface displacement, total displacement and force at left of box

Asked by henry

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

Question information

Language:
English Edit question
Status:
Solved
For:
Yade Edit question
Assignee:
No assignee Edit question
Solved by:
henry
Solved:
Last query:
Last reply:
Revision history for this message
Robert Caulk (rcaulk) said :
#1

Hello,

state.disp() is a vector [1] representing the current position - reference position.

You probably want the magnitude of the displacement:

import numpy.linalg as la
tDispl = la.norm(O.bodies[1].state.displ())

or maybe you are only interested in one of the components:

tDispl = O.bodies[1].state.displ()[0]

Best,

Robert

[1] https://yade-dem.org/doc/yade.wrapper.html#yade.wrapper.State.displ

Revision history for this message
Jan Stránský (honzik) said :
#2

Hello,

> import numpy.linalg as la
> tDispl = la.norm(O.bodies[1].state.displ())

just
O.bodies[1].state.displ().norm()
is also ok

to use multiple graphs, do not repeat keys in plot.plots, i.e. use
 plot.plots = {'i':'surfDspl','i ':'fLeft','i ':'tDspl'} # note 1 and 2 spaces anted 2nd and 3rd 'i'

let us know
cheers
Jan

Revision history for this message
henry (henrykod) said :
#3

Thanks Prof.

"O.bodies[1].state.displ().norm()"

worked for me.
Cheers