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()
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]
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)
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]
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)
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):
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)
# 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()
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)
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()
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'
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
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