示例#1
0
sys.path.append('.')
import clDem
from minieigen import *
from math import *
import pylab

N = 50
supports = [
    0,
    49,
]
r = .005
E = 1e4
rho = 1e3

sim = clDem.Simulation(breakTension=True, trackEnergy=True, opts='')
sim.scene.materials = [clDem.ElastMat(young=1e4, density=1e4)]
sim.scene.gravity = (0, 0, -10)
sim.scene.damping = 0.
sim.scene.dt = -.01

sim.par.append(clDem.mkSphere((0, 0, 0), .005, sim, matId=0, fixed=True))
sim.par.append(clDem.mkSphere((0, 0, .015), .005, sim, matId=0, fixed=False))

import woo.cld

woo.master.scene = woo.cld.CLDemField.clDemToWoo(sim,
                                                 stepPeriod=1,
                                                 relTol=1e-8)
#pylab.plot(zCoord,label='z-coord'); pylab.legend(loc='lower left'); pylab.twinx(); pylab.plot(f1z,c='red',label='F1z'); pylab.legend(); pylab.show()
示例#2
0
sim = clDem.Simulation(pNum,
                       dNum,
                       charLen=charLen,
                       ktDivKn=ktDivKn,
                       trackEnergy=True)
sim.scene.materials = [clDem.ElastMat(density=rho, young=E)]
sim.scene.gravity = (0, 0, -10)
sim.scene.damping = .4
sim.scene.verletDist = .3 * r

for i in range(0, N):
    sim.par.append(
        clDem.mkSphere((2 * r * i * .9, 0, 0),
                       r,
                       sim,
                       matId=0,
                       fixed=(i in supports)))

sim.scene.dt = dtFrac * sim.pWaveDt()


def wooCopy(sim):
    'Python-based copy of the cldem scene *sim*; returns new Scene instance'
    import _clDem
    import woo.utils
    demField = woo.dem.DemField(gravity=sim.scene.gravity,
                                loneMask=sim.scene.loneGroups)
    clField = woo.cld.CLDemField(sim)
    S = woo.core.Scene()  # reinitialize everything
    S.fields = [demField, clField]
示例#3
0
dNum=int(sys.argv[2]) if len(sys.argv)>2 else -1

N=100
r=.005

sim=clDem.Simulation(pNum,dNum,breakTension=True,trackEnergy=True)

sim.scene.materials=[clDem.ElastMat(young=1e6,density=1e4)]
sim.scene.gravity=(0,0,-10)
sim.scene.damping=.1
sim.scene.verletDist=r # collision detection in this case
sim.maxScheduledSteps=10

dim=40,40

for x0,x1 in itertools.product(range(0,dim[0]),range(0,dim[1])):
	sim.par.append(clDem.mkSphere((x0*2*r,x1*2*r,0),r,sim,matId=0,fixed=True))
for i in range(0,N):
	sim.par.append(clDem.mkSphere((random.random()*dim[0]*2*r,random.random()*dim[1]*2*r,2*r+.1*i*2*r),r,sim,matId=0,fixed=False))
	sim.par[-1].vel=(0,0,random.random()*-.05)
sim.scene.dt=.2*sim.pWaveDt()

#sim.run(1)
#for i in range(0,500):
#	sim.run(10) # do not reset arrays anymore
#	print 'E',sim.scene.energyTotal(),sim.scene.energyError();
#	print 'saved',sim.saveVtk('/tmp/jump')
import woo, woo.cld
S=woo.master.scene=woo.cld.CLDemField.clDemToWoo(sim,100,relTol=0)

示例#4
0
rho = 1e4

sim = clDem.Simulation(pNum, dNum)  # pass from command-line

sim.scene.materials = [clDem.ElastMat(young=E, density=rho)]
sim.scene.gravity = (0, 0, -10)
sim.scene.damping = .2
sim.scene.verletDist = float('nan')  # no collision detection

for n, m in itertools.product(range(0, N), range(0,
                                                 M)):  # m advances the fastest
    isSupp = (m == 0 or n == 0 or (m == M - 1 and n < N / 2))
    sim.par.append(
        clDem.mkSphere((2 * r * m * .999999, 2 * r * n * .9999999, 0),
                       r,
                       sim,
                       matId=0,
                       fixed=isSupp))
    pid = len(sim.par) - 1
    assert (pid == n * M + m)
    if n > 0:
        sim.con.append(clDem.Contact(ids=(pid, pid - M)))  # contact below
    if m > 0: sim.con.append(clDem.Contact(ids=(pid, pid - 1)))  # contact left

import woo, woo.cld, woo.gl
S = woo.master.scene = woo.cld.CLDemField.clDemToWoo(sim,
                                                     stepPeriod=100,
                                                     relTol=-1e-3)
#S.engines=S.engines[:-1]
#S.fields=S.fields[:-1]
示例#5
0
sim = clDem.Simulation(pNum, dNum, breakTension=True, trackEnergy=True)

sim.scene.materials = [clDem.ElastMat(young=1e6, density=1e4)]
sim.scene.gravity = (0, 0, -10)
sim.scene.damping = .1
sim.scene.verletDist = r  # collision detection in this case
sim.maxScheduledSteps = 10

dim = 40, 40

for x0, x1 in itertools.product(range(0, dim[0]), range(0, dim[1])):
    sim.par.append(
        clDem.mkSphere((x0 * 2 * r, x1 * 2 * r, 0),
                       r,
                       sim,
                       matId=0,
                       fixed=True))
for i in range(0, N):
    sim.par.append(
        clDem.mkSphere(
            (random.random() * dim[0] * 2 * r,
             random.random() * dim[1] * 2 * r, 2 * r + .1 * i * 2 * r),
            r,
            sim,
            matId=0,
            fixed=False))
    sim.par[-1].vel = (0, 0, random.random() * -.05)
sim.scene.dt = .2 * sim.pWaveDt()

#sim.run(1)
示例#6
0
rho=1e4
nan=float('nan')

useL1Geom,ktDivKn,charLen,dtFrac=(
	(False,.2,nan,.05),
	(False,.8,1e5*r,.01),
)[0] # pick configuration set here

sim=clDem.Simulation(pNum,dNum,charLen=charLen,ktDivKn=ktDivKn,trackEnergy=True)
sim.scene.materials=[clDem.ElastMat(density=rho,young=E)]
sim.scene.gravity=(0,0,-10)
sim.scene.damping=.4
sim.scene.verletDist=.3*r

for i in range(0,N):
	sim.par.append(clDem.mkSphere((2*r*i*.9,0,0),r,sim,matId=0,fixed=(i in supports)))

sim.scene.dt=dtFrac*sim.pWaveDt()

def wooCopy(sim):
	'Python-based copy of the cldem scene *sim*; returns new Scene instance'
	import _clDem
	import woo.utils
	demField=woo.dem.DemField(gravity=sim.scene.gravity,loneMask=sim.scene.loneGroups)
	clField=woo.cld.CLDemField(sim)
	S=woo.core.Scene() # reinitialize everything
	S.fields=[demField,clField]
	# copy materials
	wooMat=[]
	for m in sim.scene.materials:
		if isinstance(m,_clDem.ElastMat):
示例#7
0
sim.scene.materials=[clDem.FrictMat(young=1e6,density=1e3,ktDivKn=.2,tanPhi=.5)]
sim.scene.gravity=(-4,-5,-10)
sim.scene.damping=.4
sim.scene.verletDist=.3*r
sim.scene.dt=-.4
sim.maxScheduledSteps=10

if 1:
	sim.par.append(clDem.mkWall(pos=(0,0,0),axis=2,sim=sim,matId=0,groups=0b011))
	sim.par.append(clDem.mkWall(pos=(0,0,0),axis=0,sim=sim,matId=0,groups=0b011))
	sim.par.append(clDem.mkWall(pos=(0,0,0),axis=1,sim=sim,matId=0,groups=0b011))
else:
	# ground
	for x0,x1 in itertools.product(range(0,dim[0]),range(0,dim[1])):
		sim.par.append(clDem.mkSphere((x0*2*r,x1*2*r,0),r,sim,matId=0,groups=0b011,fixed=True))

# walls/ground spheres are in loneGroups, but collide with spheres below (0b001) as well
sim.scene.loneGroups=0b010
#sim.collideGpu = True

import woo.pack
sp=woo.pack.SpherePack()
sp.makeCloud((0,0,0),2*r*Vector3(genDim),r,rRelFuzz=.5,periodic=True)
sp.translate(2*r*Vector3.Ones)
sp.cellRepeat([(dim[i]-2*margin)/genDim[i] for i in (0,1,2)])
sp.save('/tmp/spheres-%d.txt'%len(sp))
print 'saved to /tmp/spheres-%d.txt'%len(sp)
for center,radius in sp:
	sim.par.append(clDem.mkSphere(center,radius,sim,matId=0,groups=0b001,fixed=False))
	sim.par[-1].vel=(0,0,-.05)
示例#8
0
# encoding: utf-8
import sys
sys.path.append('.')
import clDem
from minieigen import *
from math import *
import pylab

N=50
supports=[0,49,];
r=.005
E=1e4
rho=1e3

sim=clDem.Simulation(breakTension=True,trackEnergy=True,opts='')
sim.scene.materials=[clDem.ElastMat(young=1e4,density=1e4)]
sim.scene.gravity=(0,0,-10)
sim.scene.damping=0.
sim.scene.dt=-.01

sim.par.append(clDem.mkSphere((0,0,0),.005,sim,matId=0,fixed=True))
sim.par.append(clDem.mkSphere((0,0,.015),.005,sim,matId=0,fixed=False))

import woo.cld
woo.master.scene=woo.cld.CLDemField.clDemToWoo(sim,stepPeriod=1,relTol=1e-8)
#pylab.plot(zCoord,label='z-coord'); pylab.legend(loc='lower left'); pylab.twinx(); pylab.plot(f1z,c='red',label='F1z'); pylab.legend(); pylab.show()
示例#9
0
import pylab, itertools, random

pNum=int(sys.argv[1]) if len(sys.argv)>1 else -1
dNum=int(sys.argv[2]) if len(sys.argv)>2 else -1

sim=clDem.Simulation(pNum,dNum,breakTension=True,trackEnergy=True)

r=0.1
sim.scene.materials=[clDem.ElastMat(young=1e6,density=1e3)]
sim.scene.gravity=(0,0,-10)
sim.scene.damping=.4
sim.scene.verletDist=.2*r # collision detection in this case
sim.maxScheduledSteps=1

sim.par.append(clDem.mkWall(pos=(-10,-10,5),axis=2,sim=sim,matId=0))
sim.par.append(clDem.mkSphere(pos=(2,2,5+1.1*r),radius=r,sim=sim,matId=0))
sim.par[-1].vel=(0,0,-.0005)

sim.scene.dt=.2*sim.pWaveDt()

sim.run(1)
#for i in range(0,len(sim.par)):
#	print i,sim.getBbox(i)

if 1:
	from woo import *
	import woo.cld
	import woo.log
	import woo.gl
	S=woo.master.scene
	#woo.log.setLevel('GLViewer',woo.log.TRACE)
示例#10
0
sim.scene.materials=[clDem.ElastMat(young=1e6,density=1e3)] #,ktDivKn=.2,tanPhi=.5)]
sim.scene.gravity=(0,0,-10)
sim.scene.damping=.1
sim.maxScheduledSteps=10
sim.scene.dt=-.3

# stand-alone sphere
# sim.par.append(clDem.mkSphere([0,0,0],.5,sim=sim))
# clumps
relPos=[(0,-.5,-.5),(0,.5,0),(.5,0,0),(0,0,.5)]
coords=[(-2,0,0),] #,(2,0,0),(0,2,0),(0,-2,0)]
for i,cc in enumerate(coords):
	# This shorthand command does something like this:
	# O.bodies.appendClumped([utils.sphere(...),utils.sphere(...),utils.sphere(...)])
	# and returns tuple of clumpId,[bodyId1,bodyId2,bodyId3]
	clump,spheres=sim.addClump([clDem.mkSphere([relPos[j][0]+coords[i][0],relPos[j][1]+coords[i][1],relPos[j][2]+coords[i][2]],.5,sim=sim) for j in range(0,i+3)])
	print clump,spheres
sim.par.append(clDem.mkWall(pos=(0,0,-1.3),axis=2,sim=sim,matId=0,groups=0b011))

# visualization
#O.scene.fields=[woo.cld.CLDemField(sim)]
#O.scene.engines=[woo.cld.CLDemRun(stepPeriod=1),]

S=woo.master.scene=woo.cld.CLDemField.clDemToWoo(sim,stepPeriod=1,relTol=-1e-5)
#print O.scene.engines[-1].raiseLimit
#O.scene.engines[-1].raiseLimit=1e11
#O.scene.engines=O.scene.engines+[woo.core.PyRunner('import woo; sim=woo.O.scene.fields[-1].sim; print woo.O.dem.par[1].pos,sim.par[1].pos')]
#globals()['sim']=sim

from woo import qt
qt.View()
示例#11
0
M,N=100,100
r=.005
E=1e4
rho=1e4

sim=clDem.Simulation(pNum,dNum) # pass from command-line

sim.scene.materials=[clDem.ElastMat(young=E,density=rho)]
sim.scene.gravity=(0,0,-10)
sim.scene.damping=.2
sim.scene.verletDist=float('nan') # no collision detection

for n,m in itertools.product(range(0,N),range(0,M)): # m advances the fastest
	isSupp=(m==0 or n==0 or (m==M-1 and n<N/2))
	sim.par.append(clDem.mkSphere((2*r*m*.999999,2*r*n*.9999999,0),r,sim,matId=0,fixed=isSupp))
	pid=len(sim.par)-1; assert(pid==n*M+m)
	if n>0: sim.con.append(clDem.Contact(ids=(pid,pid-M))) # contact below
	if m>0: sim.con.append(clDem.Contact(ids=(pid,pid-1))) # contact left

import woo, woo.cld, woo.gl
S=woo.master.scene=woo.cld.CLDemField.clDemToWoo(sim,stepPeriod=100,relTol=-1e-3)
#S.engines=S.engines[:-1]
#S.fields=S.fields[:-1]

S.ranges=[woo.gl.Gl1_CLDemField.parRange,woo.gl.Gl1_CLDemField.conRange]
S.dt=sim.scene.dt=.2*sim.pWaveDt();

woo.gl.Gl1_CLDemField.parRange.label='|v|'
woo.gl.Gl1_CLDemField.conRange.label='Fn'
示例#12
0
文件: stream.py 项目: woodem/cl-dem0
from miniEigen import *
from math import *

# set platform and device numbers here
# if left at -1, first platform and device will be used
# you will be notified in the terminal as well
sim=clDem.Simulation(platformNum=2,deviceNum=0,breakTension=True,ktDivKn=.2,opts="-cl-strict-aliasing -I..")
sim.scene.materials=[clDem.FrictMat(young=1e6,density=1e3,ktDivKn=.2,tanPhi=.5)]
# add boundaries
for axis in 0,1,2: sim.par.append(clDem.mkWall(pos=(0,0,0),axis=axis,sim=sim,matId=0,groups=0b011))
# load spheres from file
for l in file(sys.argv[1]):
	if l.startswith('#'): continue
	x,y,z,r=[float(n) for n in l.split()]
	sim.par.append(clDem.mkSphere((x,y,z),r,sim,matId=0,groups=0b001,fixed=False))

sim.scene.gravity=(-4,-5,-10)
sim.scene.damping=.4
sim.scene.verletDist=-.3 # negative means relative to minimum sphere size
sim.scene.loneGroups=0b010  # no contacts of walls with themselves

sim.showND=0 # show NDRange for all kernels every 20 steps; set to 0 to disable

# maximum number of enqueued steps (times 7 kernels/step), before returning back to CPU
sim.maxScheduledSteps=100

if 1:
	sim.run(2000)
	print 'Done at step %d, bye.'%sim.scene.step
# show inside woo, for visualization
示例#13
0
文件: stream.py 项目: woodem/cl-dem0
                       breakTension=True,
                       ktDivKn=.2,
                       opts="-cl-strict-aliasing -I..")
sim.scene.materials = [
    clDem.FrictMat(young=1e6, density=1e3, ktDivKn=.2, tanPhi=.5)
]
# add boundaries
for axis in 0, 1, 2:
    sim.par.append(
        clDem.mkWall(pos=(0, 0, 0), axis=axis, sim=sim, matId=0, groups=0b011))
# load spheres from file
for l in file(sys.argv[1]):
    if l.startswith('#'): continue
    x, y, z, r = [float(n) for n in l.split()]
    sim.par.append(
        clDem.mkSphere((x, y, z), r, sim, matId=0, groups=0b001, fixed=False))

sim.scene.gravity = (-4, -5, -10)
sim.scene.damping = .4
sim.scene.verletDist = -.3  # negative means relative to minimum sphere size
sim.scene.loneGroups = 0b010  # no contacts of walls with themselves

sim.showND = 0  # show NDRange for all kernels every 20 steps; set to 0 to disable

# maximum number of enqueued steps (times 7 kernels/step), before returning back to CPU
sim.maxScheduledSteps = 100

if 1:
    sim.run(2000)
    print 'Done at step %d, bye.' % sim.scene.step
# show inside woo, for visualization