How to generate stress in PARAVIEW when the boulder dropped on the grains, and why my amount of grains model in PARAVIEW is not as much as in YADE simulation?

Asked by Defri on 2020-12-14

Dear all,

I have some doubts:
1. Based on my script (attachment on below), why I cannot run "readParamsFromTable" from my YADE script? it appeared like this on PARAVIEW when I run script:
Traceback (most recent call last):
  File "<string>", line 3, in <module>
NameError: name 'readParamsFromTable' is not defined

What should I do?

2. How to generate stress in PARAVIEW when the boulder dropped on the grains? I don't know how to make on script using vtkExporter..please help me..

3. Why is my amount of grains model in PARAVIEW not as much as in YADE simulation? if you could run my script, I already applied Glyph method to see the particles/grains, but it is not as much as I want like in YADE.

###SCRIPT###

##Sphere Cylinder pack
readParamsFromTable(maxLoad=1000,minLoad=0)
from yade.params.table import *
from yade import export
from yade import pack, plot
from pylab import rand #for sand color

O.bodies.append(geom.facetCylinder(Vector3(1,1,25),4,50,wallMask=6))

##Define material of the grains
O.bodies[0].state.blockedDOFs='xyzXYZ'
O.bodies[0].state.vel=(0,0,0)
O.materials.append(FrictMat(young=1e7,poisson=.3,density=2000,frictionAngle=18))

sp=pack.SpherePack()
sp.makeCloud((-1.6,2.6,.1),(3,-1,20),rMean=.3,rRelFuzz=.5,num=950,)
sp.toSimulation(color=(0.6+0.15*rand(),0.5+0.15*rand(),0.15+0.15*rand()))

##Make a floor
O.bodies.append(wall((0,0,0),axis=2))

##Engines and Constitutive Law
O.engines=[ForceResetter(),
  InsertionSortCollider([Bo1_Sphere_Aabb(),Bo1_Facet_Aabb(),Bo1_Wall_Aabb()]), #move for sphere, facet, wall
  InteractionLoop([Ig2_Sphere_Sphere_ScGeom(),Ig2_Facet_Sphere_ScGeom(),Ig2_Wall_Sphere_ScGeom()], #interaction between them
   [Ip2_FrictMat_FrictMat_FrictPhys()], # ip2 list (just one list!)
   [Law2_ScGeom_FrictPhys_CundallStrack()]), # law2 list
   NewtonIntegrator(damping=.3,gravity=[0,0,-9.81]),
   PyRunner(command='checkUnbalanced()',realPeriod=2,label='checker'),
   PyRunner(iterPeriod=7000,command='doExport()'),]

O.dt=.8*PWaveTimeStep()

def checkUnbalanced():
 if O.iter<1000:return # at the very start, unbalanced force can be low as there is only few contacts, but it does not mean the packing is stable
 if unbalancedForce()>1:return # the rest will be run only if unbalanced is < 1 (stabilized packing)
 O.bodies.append([utils.sphere(center=(1,1,50),radius=3.4)])
 O.bodies[0].state.mass=2000
 O.materials.append(FrictMat(young=100e7,poisson=.2,density=2700))
 global boulder # without this line, the BOULDER variable would only exist inside this function
 boulder=O.bodies[-1] # the last particles is the boulder
 boulder.state.vel=(0,0,-.1) # start plotting the data now, it was not interesting before
 O.engines=O.engines+[PyRunner(command='addPlotData()',iterPeriod=50)]
 checker.command='unloadBoulder()'

def unloadBoulder():
 # if the force on boulder exceeds maximum load, start unloading
 if abs(O.forces.f(boulder.id)[2])>maxLoad:
  boulder.state.vel*=-1 # prescribing a velocity will therefore make it move at constant velocity (downwards)
  checker.command='stopUnloading()'

def stopUnloading():
 if abs(O.forces.f(boulder.id)[2])<minLoad:
  O.run()

def addPlotData():
  b=O.bodies[-1]
  plot.addData(position=b.state.pos[2], velocity=b.state.vel.norm(), itera=O.iter, time=O.time, time_=O.time, accel=Force/O.bodies[0].state.mass, Impact_Force=Force, itera_=O.iter)

plot.plots={'time':('velocity',), 'itera':('position',), 'time_':('accel',), 'itera_':('Impact_Force')}
plot.plot()

def doExport():
 vtkExporter = export.VTKExporter('1')
 vtkExporter.exportContactPoints(useRef=True, what=[('displacement','b.state.displ()')])
 vtkExporter.exportSpheres(useRef=True, what=[('displacement','b.state.displ()')])
 vtkExporter.exportFacets(numLabel=7000, what=[('displacement','b.state.displ()')])
 vtkExporter.exportInteractions(useRef=True, what=dict(kn='i.phys.kn'))
 vtkExporter.exportPeriodicCell('1')
 vtkExporter.exportPotentialBlocks(what=[('displacement','b.state.displ()')])
 vtkExporter.exportPolyhedra(what=dict(n='b.id'))

yade.qt.Controller();

O.saveTmp()
##########################################################

Thank you in advance!

Cheers!!

Question information

Language:
English Edit question
Status:
Solved
For:
Yade Edit question
Assignee:
No assignee Edit question
Solved by:
Defri
Solved:
2020-12-16
Last query:
2020-12-16
Last reply:
2020-12-16
Robert Caulk (rcaulk) said : #1

>3. Why is my amount of grains model in PARAVIEW not as much as in YADE simulation? if you could run my script, I already applied Glyph method to see the particles/grains, but it is not as much as I

Go to the glyph settings panel

Find Masking > Glyph Mode >

Then change "Uniform spatial distribution" to "All points."

>2. How to generate stress in PARAVIEW when the boulder dropped on the grains? I don't know how to make on script using vtkExporter..please help me..

You need to find a way to decide what a particle stress is and then export it. It looks like you are only exporting displacements at the moment. Why don't you use VTKRecorder to obtain and export particle stresses [1]

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

Robert Caulk (rcaulk) said : #2

> 1. Based on my script (attachment on below), why I cannot run "readParamsFromTable" from my YADE script? it appeared like this on PARAVIEW when I run script:
Traceback (most recent call last):
  File "<string>", line 3, in <module>
NameError: name 'readParamsFromTable' is not defined

What should I do?

You should probably start with some python basics. NameError is a python error, not a yade one. It means that python does not have any definition of 'readParamsFromTable'. Or more explicitly:

name 'readParamsFromTable' is not defined

So you need to think about why it is not defined. To do that let's see if I can introduce you to some python basics.

1/ importing libraries.

Python is library based, yade is essentially just a library to be imported. Hence:

from yade.params.table import *
from yade import export
from yade import pack, plot

2/ the code is sequential.

Python reads your script line by line, top to bottom.

I hope the information I have provided is sufficient for you to understand the problem on your own.

Cheers,

Robert

Jan Stránský (honzik) said : #3

Hello,

> 1. Based on my script (attachment on below), why I cannot run "readParamsFromTable" from my YADE script?

**In Yade**, readParamsFromTable is automatically imported (as all functions from utils module) in main scope.
If you run it in Yade, you should not have any problem.

Using "plain python" (or "other python", e.g. pvpython or python in paraview or jupyter notebook or ...) you need to explicitly import it, as suggested by Robert.

> it appeared like this on PARAVIEW when I run script:

on paraview???
Even it is possible to run any python script in paraview, I would not recommend it (e.g. because of different scopes, different imports, I don't know if there is some extra performance decrease or not, etc.)
I suggest to use yade for yade tasks and paraview for paraview tasks.

> What should I do?

you should describe more in detail how you got this error, what steps you did, what commands run, where (linux console, paraview python shell, ...), etc.

cheers
Jan

Defri (daredefri) said : #4

I am sorry for the delay response.

> If you run it in Yade, you should not have any problem.

yes I run it in YADE, and as you can see in my script and if you run it, it is fine.

> I suggest to use yade for yade tasks and paraview for paraview tasks.

I just click "Run Script" in paraview, and then appeared that " NameError: name 'readParamsFromTable' is not defined "
I am using vtkRecorder

> you should describe more in detail how you got this error, what steps you did, what commands run, where (linux console, paraview python shell, ...), etc.

So I just run my script in TERMINAL of Ubuntu. I knew about "readParamsFromTable" from the example, because it showed what I need, which is the grains and the variation of size of the grains, then I followed it.

###SCRIPT###

##Sphere Cylinder pack
readParamsFromTable(maxLoad=10000,minLoad=0)
from yade.params.table import *
from yade import export
from yade import pack, plot
from pylab import rand #for sand color

O.bodies.append(geom.facetCylinder(Vector3(1,1,25),4,50,wallMask=6))

##Define material of the grains
O.bodies[0].state.blockedDOFs='xyzXYZ'
O.bodies[0].state.vel=(0,0,0)
O.materials.append(FrictMat(young=1e7,poisson=.3,density=2000,frictionAngle=18))

sp=pack.SpherePack()
sp.makeCloud((-1.6,2.6,.1),(3,-1,20),rMean=.3,rRelFuzz=.5,num=950,)
sp.toSimulation(color=(0.6+0.15*rand(),0.5+0.15*rand(),0.15+0.15*rand()))

##Make a floor
O.bodies.append(wall((0,0,0),axis=2))

##Engines and Constitutive Law
O.engines=[ForceResetter(),
  InsertionSortCollider([Bo1_Sphere_Aabb(),Bo1_Facet_Aabb(),Bo1_Wall_Aabb()]), #move for sphere, facet, wall
  InteractionLoop([Ig2_Sphere_Sphere_ScGeom(),Ig2_Facet_Sphere_ScGeom(),Ig2_Wall_Sphere_ScGeom()], #interaction between them
   [Ip2_FrictMat_FrictMat_FrictPhys()], # ip2 list (just one list!)
   [Law2_ScGeom_FrictPhys_CundallStrack()]), # law2 list
   NewtonIntegrator(damping=.3,gravity=[0,0,-9.81]),
   PyRunner(command='checkUnbalanced()',realPeriod=2,label='checker'),
   VTKRecorder(fileName='tes2',recorders=['all'],iterPeriod=500),]

O.dt=.8*PWaveTimeStep()

def checkUnbalanced():
 if O.iter<1000:return # at the very start, unbalanced force can be low as there is only few contacts, but it does not mean the packing is stable
 if unbalancedForce()>1:return # the rest will be run only if unbalanced is < 1 (stabilized packing)
 O.bodies.append([utils.sphere(center=(1,1,50),radius=3.4)])
 O.bodies[0].state.mass=2000
 O.materials.append(FrictMat(young=100e7,poisson=.2,density=2700,frictionAngle=20))
 global boulder # without this line, the BOULDER variable would only exist inside this function
 boulder=O.bodies[-1] # the last particles is the boulder
 boulder.state.vel=(0,0,-.1) # start plotting the data now, it was not interesting before
 O.engines=O.engines+[PyRunner(command='addPlotData()',iterPeriod=50)]
 checker.command='unloadBoulder()'

def unloadBoulder():
 if abs(O.forces.f(boulder.id)[2])>maxLoad:
  boulder.state.vel*=-1 # prescribing a velocity will therefore make it move at constant velocity (downwards)
  checker.command='stopUnloading()'

def stopUnloading():
 if abs(O.forces.f(boulder.id)[2])<minLoad:
  O.run()

def addPlotData():
  b=O.bodies[-1]
accel=Force/O.bodies[0].state.mass, Force=Force, itera_=O.iter)
  plot.addData(position=b.state.pos[2], velocity=b.state.vel.norm(), itera=O.iter, time=O.time, time_=O.time, accel=Force/O.bodies[0].state.mass, Impact_Force=Force, itera_=O.iter)

plot.plots={'time':('velocity',), 'itera':('position',), 'time_':('accel',), 'itera_':('Impact_Force')}
plot.plot()

O.saveTmp()

########################################################################

my another question:
why after I inputted vtkRecorder (as written on my script), only showed the initial condition (that only grains stand, not dropping like when I run Yade)?
I want to have the result of the stress (boulder dropped onto the grains).

Thank you in advance.

Jan Stránský (honzik) said : #5

> I just click "Run Script" in paraview

why?
Normally, you run the yade script with yade. The running exports some .vtk or .vtu or similar files.
In Paraview, you load these exported files and work with them. But you do not run the script again in paraview!! (at least it is the standard case and if you need it, you probably would not ask here..)
The paraview "run script" is intended for paraview scripts, e.g. you can script some repeating tasks (like take these files, create this glyphs with these parameters, color it this way, export image...).
(yes, in paraview you can run any python script, as I pointed before, but the usual way is to use it just for paraview scripts)

> I want to have the result of the stress

I would start with "any" results. If you just export position, does it work?
If you can export "something", we can proceed to stress. It does not make much sense before..

> why after I inputted vtkRecorder (as written on my script), only showed the initial condition (that only grains stand, not dropping like when I run Yade)?

sorry, I have no idea what you ask :-D what is "only showed"? where? how? what is "initial condition"? ... ?

cheers
Jan

Defri (daredefri) said : #6

Finally I have solved it...I am sorry for some repeating questions.

I just need to run it 1st then I choose which .vtu I need to address.

Thank you so much.