yade-users team mailing list archive
-
yade-users team
-
Mailing list archive
-
Message #16387
Re: [Question #661448]: randomdensepack exclusion from walls
Question #661448 on Yade changed:
https://answers.launchpad.net/yade/+question/661448
Status: Needs information => Open
JOHN gave more information on the question:
Thank you for the reply,
the problem is that it doesnt output anything
i changed the radius to
sp=pack.randomDensePack(pack.inAlignedBox((-10,40,3),20,50,10)),spheresInCell=1000,radius=.5,memoizeDb='/tmp/triaxPackCache.sqlite')
and now i get the much more informative
Traceback (most recent call last):
File "calltest.py", line 8, in <module>
run()
File "/home/john/Desktop/yade/DONE/test.py", line 44, in run
for c,r in sp:
TypeError: 'Body' object is not iterable
(+the rest of the warnigns)
my full code is
import sys
import os
os.system("ln -s /usr/bin/yade yadeimport.py")
from yadeimport import yade
import gts
from yadeimport import *
from yade import ymport
from yade import qt
import math
def printing():
for b in O.bodies:
if isinstance(b.shape,Sphere):
print b.id,b.state.pos[0],b.state.pos[1],b.state.pos[2]
def run():
facets = ymport.stl('maze4lid.stl')
rod1 = O.bodies.append(facets)
# converts facets to gts (see the other question)
s = gts.Surface()
for facet in facets:
vs = [facet.state.pos + facet.state.ori*v for v in facet.shape.vertices]
vs = [gts.Vertex(v[0],v[1],v[2]) for v in vs]
es = [gts.Edge(vs[i],vs[j]) for i,j in ((0,1),(1,2),(2,0))]
f = gts.Face(es[0],es[1],es[2])
s.add(f)
print s.is_closed()
threshold = 1e-3
s.cleanup(threshold)
print s.is_closed()
assert s.is_closed()
a=(0,-9.81,0)
# use gts to filter spheres
pred = inGtsSurface(s)
sp=pack.randomDensePack(pack.inAlignedBox((-10,40,3),(20,50,10)),spheresInCell=1000,radius=.5,memoizeDb='/tmp/triaxPackCache.sqlite')
# remove spheres completely inside walls
for c,r in sp:
if pred(c,0):
continue
O.bodies.append(sphere(c,r))
# remove spheres partially inside walls
O.dt = 0
O.step() # interactions are created afterwards
toErase = set()
for i in O.interactions:
b1,b2 = [O.bodies[i] for i in (i.id1,i.id2)]
if any(isinstance(b.shape,Facet) for b in (b1,b2)): # if facet is involved, delete
toErase.add(b1)
toErase.add(b2)
toErase = [b for b in toErase if isinstance(b.shape,Sphere)] # delete just spheres
for b in toErase: # delete the spheres
O.bodies.erase(b.id)
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,-9.81,0),damping=0.4, label='newtonInt'),
# PyRunner(iterPeriod=5,command='printing()'),
VTKRecorder(fileName='/home/john/Desktop/yade/DONE/vis/3d-vtk-',recorders=['spheres'],iterPeriod=100),
PyRunner(iterPeriod=1,command='gravity(a)'),
PyRunner(iterPeriod=1,command='checkAndDelete()'),
]
O.dt=.8*PWaveTimeStep()
O.step()
def irun(num):
O.run(num,1)
print O.time
#printing()
def strategy():
a=(9.81,0,0)
return a
def gravector(a):
b=a
def gravity(a):
newtonInt.gravity = a
def checkAndDelete():
for b in O.bodies:
if isinstance(b.shape,Sphere):
x,y,z = b.state.pos
if y<-90: # modify this condition to your needs
O.bodies.erase(b.id)
and is called via a python script
import sys
import os
from test import *
from yadeimport import *
a=(9.81,0,0)
run()
irun(1000)
a=(0,-9.81,0)
irun(3000)
(which worked untill the randomdensepack addition)
Cheers
John
--
You received this question notification because your team yade-users is
an answer contact for Yade.