def makePeriodicFeedPack(dim,psd,lenAxis=0,damping=.3,porosity=.5,goal=.15,maxNum=-1,dontBlock=False,returnSpherePack=False,memoizeDir=None,clumps=None,gen=None): if memoizeDir and not dontBlock: # increase number at the end for every change in the algorithm to make old feeds incompatible params=str(dim)+str(psd)+str(goal)+str(damping)+str(porosity)+str(lenAxis)+str(clumps)+('' if not gen else gen.dumps(format='expr'))+'5' import hashlib paramHash=hashlib.sha1(params).hexdigest() memoizeFile=memoizeDir+'/'+paramHash+'.perifeed' print 'Memoize file is ',memoizeFile if os.path.exists(memoizeDir+'/'+paramHash+'.perifeed'): print 'Returning memoized result' if not gen: sp=SpherePack() sp.load(memoizeFile) if returnSpherePack: return sp return zip(*sp)+[sp.cellSize[lenAxis],] else: import woo.dem sp=woo.dem.ShapePack(loadFrom=memoizeFile) return sp p3=porosity**(1/3.) if psd: rMax=psd[-1][0] elif hasattr(gen,'psdPts'): rMax=gen.psdPts[-1][0] else: raise NotImplementedError('Generators without PSD do not inform about the biggest particle radius.') minSize=rMax*5 cellSize=Vector3(max(dim[0]/p3,minSize),max(dim[1]/p3,minSize),max(dim[2]/p3,minSize)) print 'dimension',dim print 'initial cell size',cellSize print 'psd=',psd import woo.core, woo.dem, math S=woo.core.Scene(fields=[woo.dem.DemField()]) S.periodic=True S.cell.setBox(cellSize) if gen: generator=gen elif not clumps: generator=woo.dem.PsdSphereGenerator(psdPts=psd,discrete=False,mass=True) else: generator=woo.dem.PsdClumpGenerator(psdPts=psd,discrete=False,mass=True,clumps=clumps) S.engines=[ woo.dem.InsertionSortCollider([woo.dem.Bo1_Sphere_Aabb()]), woo.dem.BoxInlet( box=((0,0,0),cellSize), maxMass=-1, maxNum=maxNum, generator=generator, massRate=0, maxAttempts=5000, materials=[woo.dem.FrictMat(density=1e3,young=1e7,ktDivKn=.2,tanPhi=math.tan(.5))], shooter=None, mask=1, ) ] S.one() print 'Created %d particles, compacting...'%(len(S.dem.par)) S.dt=.9*utils.pWaveDt(S,noClumps=True) S.dtSafety=.9 if clumps: warnings.warn('utils.pWaveDt called with noClumps=True (clumps ignored), the result (S.dt=%g) might be significantly off!'%S.dt) S.engines=[ woo.dem.PeriIsoCompressor(charLen=2*rMax,stresses=[-1e8,-1e6],maxUnbalanced=goal,doneHook='print "done"; S.stop();',globalUpdateInt=1,keepProportions=True,label='peri'), # plots only useful for debugging - uncomment if needed # woo.core.PyRunner(100,'S.plot.addData(i=S.step,unb=S.lab.peri.currUnbalanced,sig=S.lab.peri.sigma)'), woo.core.PyRunner(100,'print S.lab.peri.stresses[S.lab.peri.state], S.lab.peri.sigma, S.lab.peri.currUnbalanced'), ]+utils.defaultEngines(damping=damping,dynDtPeriod=100) S.plot.plots={'i':('unb'),' i':('sig_x','sig_y','sig_z')} if dontBlock: return S S.run(); S.wait() if gen: sp=woo.dem.ShapePack() else: sp=SpherePack() sp.fromDem(S,S.dem) print 'Packing size is',sp.cellSize sp.canonicalize() if not gen: sp.makeOverlapFree() print 'Loose packing size is',sp.cellSize cc,rr=[],[] inf=float('inf') boxMin=Vector3(0,0,0); boxMax=Vector3(dim) boxMin[lenAxis]=-inf boxMax[lenAxis]=inf box=AlignedBox3(boxMin,boxMax) sp2=sp.filtered(inAlignedBox(box)) print 'Box is ',box #for c,r in sp: # if c-Vector3(r,r,r) not in box or c+Vector3(r,r,r) not in box: continue # cc.append(c); rr.append(r) if memoizeDir or returnSpherePack or gen: #sp2=SpherePack() #sp2.fromList(cc,rr) #sp2.cellSize=sp.cellSize if memoizeDir: print 'Saving to',memoizeFile # print len(sp2) sp2.save(memoizeFile) if returnSpherePack or gen: return sp2 cc,rr=sp2.toCcRr() return cc,rr,sp2.cellSize[lenAxis]
def makeBandFeedPack(dim,mat,gravity,psd=[],excessWd=None,damping=.3,porosity=.5,goal=.15,dontBlock=False,memoizeDir=None,botLine=None,leftLine=None,rightLine=None,clumps=[],returnSpherePack=False,useEnergy=True,gen=None): '''Create dense packing periodic in the +x direction, suitable for use with ConveyorInlet. :param useEnergy: use :obj:`woo.utils.unbalancedEnergy` instead of :obj:`woo.utils.unbalancedForce` as stop criterion. :param goal: target unbalanced force/energy; if unbalanced energy is used, this value is **multiplied by .2**. :param psd: particle size distribution :param mat: material for particles :param gravity: gravity acceleration (as Vector3) ''' print 'woo.pack.makeBandFeedPack(dim=%s,psd=%s,mat=%s,gravity=%s,excessWd=%s,damping=%s,dontBlock=True,botLine=%s,leftLine=%s,rightLine=%s,clumps=%s,gen=%s)'%(repr(dim),repr(psd),mat.dumps(format='expr',width=-1,noMagic=True),repr(gravity),repr(excessWd),repr(damping),repr(botLine),repr(leftLine),repr(rightLine),repr(clumps),repr(gen)) dim=list(dim) # make modifiable in case of excess width retWd=dim[1] nRepeatCells=0 # if 0, repetition is disabled # too wide band is created by repeating narrower one if excessWd: if dim[1]>excessWd[0]: print 'makeBandFeedPack: excess with %g>%g, using %g with packing repeated'%(dim[1],excessWd[0],excessWd[1]) retWd=dim[1] # this var is used at the end dim[1]=excessWd[1] nRepeatCells=int(retWd/dim[1])+1 cellSize=(dim[0],dim[1],(1+2*porosity)*dim[2]) print 'cell size',cellSize,'target height',dim[2] factoryBottom=.3*cellSize[2] if not botLine else max([b[1] for b in botLine]) # point above which are particles generated factoryLeft=0 if not leftLine else max([l[0] for l in leftLine]) #print 'factoryLeft =',factoryLeft,'leftLine =',leftLine,'cellSize =',cellSize factoryRight=cellSize[1] if not rightLine else min([r[0] for r in rightLine]) if not leftLine: leftLine=[Vector2(0,cellSize[2])] if not rightLine:rightLine=[Vector2(cellSize[1],cellSize[2])] if not botLine: botLine=[Vector2(0,0),Vector2(cellSize[1],0)] boundary2d=leftLine+botLine+rightLine # boundary clipped to the part filled by particles b2c=[Vector2(pt[0],min(pt[1],dim[2])) for pt in boundary2d] print 'Clipped boundary',b2c b2c+=[b2c[0],b2c[1]] # close the polygon area2d=.5*abs(sum([b2c[i][0]*(b2c[i+1][1]-b2c[i-1][1]) for i in range(1,len(b2c)-1)])) def printBulkParams(sp): volume=sp.solidVolume() # works with both ShapePack and SpherePack mass=volume*mat.density print 'Particle mass: %g kg (volume %g m3, mass density %g kg/m3).'%(mass,volume,mat.density) vol=area2d*sp.cellSize[0] print 'Bulk density: %g kg/m3 (area %g m2, length %g m).'%(mass/vol,area2d,sp.cellSize[0]) print 'Porosity: %g %%'%(100*(1-(mass/vol)/mat.density)) if memoizeDir and not dontBlock: params=str(dim)+str(nRepeatCells)+str(cellSize)+str(psd)+str(goal)+str(damping)+mat.dumps(format='expr')+str(gravity)+str(porosity)+str(botLine)+str(leftLine)+str(rightLine)+str(clumps)+str(useEnergy)+(gen.dumps(format='expr') if gen else '')+'ver5' import hashlib paramHash=hashlib.sha1(params).hexdigest() memoizeFile=memoizeDir+'/'+paramHash+'.bandfeed' print 'Memoize file is ',memoizeFile if os.path.exists(memoizeDir+'/'+paramHash+'.bandfeed'): print 'Returning memoized result' if not gen: sp=SpherePack() sp.load(memoizeFile) printBulkParams(sp) if returnSpherePack: return sp return zip(*sp) else: import woo.dem sp=woo.dem.ShapePack(loadFrom=memoizeFile) printBulkParams(sp) return sp import woo, woo.core, woo.dem S=woo.core.Scene(fields=[woo.dem.DemField(gravity=gravity)]) S.periodic=True S.cell.setBox(cellSize) # add limiting surface p=sweptPolylines2gtsSurface([utils.tesselatePolyline([Vector3(x,yz[0],yz[1]) for yz in boundary2d],maxDist=min(cellSize[0]/4.,cellSize[1]/4.,cellSize[2]/4.)) for x in numpy.linspace(0,cellSize[0],num=4)]) S.dem.par.add(gtsSurface2Facets(p,mask=0b011)) S.dem.loneMask=0b010 massToDo=porosity*mat.density*dim[0]*dim[1]*dim[2] print 'Will generate %g mass'%massToDo ## FIXME: decrease friction angle to help stabilization mat0,mat=mat,mat.deepcopy() mat.tanPhi=min(.2,mat0.tanPhi) if gen: generator=gen elif not clumps: generator=woo.dem.PsdSphereGenerator(psdPts=psd,discrete=False,mass=True) else: generator=woo.dem.PsdClumpGenerator(psdPts=psd,discrete=False,mass=True,clumps=clumps) # todo: move trackEnergy under useEnergy once we don't need comparisons S.trackEnergy=True if useEnergy: unbalancedFunc='woo.utils.unbalancedEnergy' # smaller goal for energy criterion goal*=.2 else: unbalancedFunc='woo.utils.unbalancedForce' S.engines=utils.defaultEngines(damping=damping,dynDtPeriod=100)+[ woo.dem.BoxInlet( box=((.01*cellSize[0],factoryLeft,factoryBottom),(cellSize[0],factoryRight,cellSize[2])), stepPeriod=200, maxMass=massToDo, massRate=0, maxAttempts=20, generator=generator, materials=[mat], shooter=woo.dem.AlignedMinMaxShooter(dir=(0,0,-1),vRange=(0,0)), mask=1, label='factory', #periSpanMask=1, # x is periodic ), #PyRunner(200,'plot.addData(uf=utils.unbalancedForce(),i=O.scene.step)'), # woo.core.PyRunner(300,'import woo\nprint "%g/%g mass, %d particles, unbalanced '+('energy' if useEnergy else 'force')+'%g/'+str(goal)+'"%(S.lab.factory.mass,S.lab.factory.maxMass,len(S.dem.par),'+unabalncedFunc+'(S))'), woo.core.PyRunner(300,'import woo\nprint "%g/%g mass, %d particles, unbalanced F: %g E: %g /'+str(goal)+'"%(S.lab.factory.mass,S.lab.factory.maxMass,len(S.dem.par),woo.utils.unbalancedForce(S),woo.utils.unbalancedEnergy(S))'), woo.core.PyRunner(300,'import woo\nif S.lab.factory.mass>=S.lab.factory.maxMass: S.engines[0].damping=1.5*%g'%damping), woo.core.PyRunner(200,'import woo\nif '+unbalancedFunc+'(S)<'+str(goal)+' and S.lab.factory.dead: S.stop()'), ] # S.dt=.7*utils.spherePWaveDt(psd[0][0],mat.density,mat.young) S.dtSafety=.9 print 'Factory box is',S.lab.factory.box S.dem.collectNodes() if dontBlock: return S else: S.run() S.wait() if gen: sp=woo.dem.ShapePack() else: sp=SpherePack() sp.fromDem(S,S.dem) sp.canonicalize() # remove what is above the requested height sp=sp.filtered(woo.pack.inAxisRange(axis=2,range=(0,dim[2])),recenter=False) printBulkParams(sp) if nRepeatCells: print 'nRepeatCells',nRepeatCells sp.cellRepeat(Vector3i(1,nRepeatCells,1)) sp.translate(Vector3(0,-dim[1]*.5*nRepeatCells,0)) sp=sp.filtered(woo.pack.inAxisRange(axis=1,range=(-retWd/2.,retWd/2.)),recenter=False) else: sp.translate(Vector3(0,-.5*dim[1],0)) # only periodic along the x-axis sp.cellSize[1]=sp.cellSize[2]=0 if memoizeDir: print 'Saving to',memoizeFile sp.saveTxt(memoizeFile) if returnSpherePack or gen: return sp return zip(*sp)
from woo.dem import * from woo.core import * from miniEigen import * from math import * from woo import utils,pack S=woo.master.scene=Scene(fields=[DemField()]) m=FrictMat(young=1e6,density=1e3,ktDivKn=2.,tanPhi=.5) for axis in 0,1,2: S.dem.par.append(utils.wall((0,0,0),axis=axis,mat=m,mask=0b011)) sp=pack.SpherePack() sp.load(sys.argv[1]) sp.cellSize=(0,0,0) # make the packing aperiodic sp.toSimulation(S,mat=m,mask=0b001) S.dem.collectNodes() S.dt=.3*utils.pWaveDt() S.engines=utils.defaultEngines(gravity=(-4,-5,-10),damping=.4,verletDist=-.3) S.loneGroups=0b010 # no contacts of walls with themselves S.run(2000) # S.wait()
import woo from woo import utils from woo.core import * from woo.dem import * from woo import plot import woo.log woo.master.usesApi=10101 m=FrictMat(density=1e3,young=1e7,ktDivKn=.2,tanPhi=.5) S=woo.master.scene=Scene(fields=[DemField(gravity=(0,0,-10))]) S.dtSafety=0.1 S.dem.par.add([ Wall.make(-.5,axis=2,sense=1,mat=m), Sphere.make((0,0,1),.5,fixed=False,wire=True,mat=m) ]) # S.dem.par[1].vel=(0,0,-1) S.dtSafety=0.06 S.engines=utils.defaultEngines(damping=.0,cp2=Cp2_FrictMat_HertzPhys(gamma=0.,en=1.,label='cp2'),law=Law2_L6Geom_HertzPhys_DMT(noAttraction=True),dynDtPeriod=10)+[ LawTester(ids=(0,1),abWeight=1.,label='tester',stages=[LawTesterStage(values=(0,0,0,0,0,0),whats='......',until='False', #,until='stage.rebound' )],done='tester.restart(); S.stop()'), PyRunner(1,'import woo; S.plot.addData(i=S.step,x=S.dem.par[1].pos,v=S.dem.par[1].vel,t=S.time,dt=S.dt,Etot=S.energy.total(),bounces=S.lab.tester.stages[0].bounces,vRel=S.lab.tester.v,**S.energy)'), ] S.trackEnergy=True S.plot.plots={'t':('x_z'),'i ':('**S.energy'),'t ':('v_z')} #,None,('Etot','g--'))}# ,'i':('v_z','vRel_xx')} S.plot.plot() S.saveTmp()
import woo from woo import utils,pack from woo.dem import * from woo.core import * from minieigen import * woo.master.usesApi=10101 woo.master.scene=S=Scene(fields=[DemField(gravity=(0,0,-10))]) mat=utils.defaultMaterial() sp=pack.SpherePack() sp.makeCloud((4,4,4),(14,14,14),.4,rRelFuzz=.5) sp.toSimulation(S,mat=mat) S.dem.par.add([utils.wall(1,axis=2,sense=0,mat=mat,glAB=((-10,-1),(20,11))),]) S.periodic=True S.cell.setBox(20,20,20) S.engines=utils.defaultEngines(damping=.4) S.dtSafety=.5 S.dt=.5*utils.pWaveDt() # to compute oscillation freqs below # create cylinders for i,x in enumerate([-2,0,2,4,6,8,10.5,12,14]): c=InfCylinder.make((x,0,3),radius=.8,axis=1,mat=mat,glAB=(-1,11)) c.angVel=(0,2.*(i+1),0) # each of cylinders will move haronically along global x and z axes (not y) c.impose=AlignedHarmonicOscillations(freqs=(1./(10000.*S.dt),float('nan'),1/(((i%3)+3)*1000.*S.dt)),amps=(.3*(i%2+1),0,.4*(i%4+1))) S.dem.par.add(c,nodes=True) try: from woo import gl S.gl.wall.div=10 S.gl.infCylinder.wire=True except ImportError: pass
from woo import * import woo.log woo.master.usesApi = 10102 woo.log.setLevel('LawTester', woo.log.INFO) woo.log.setLevel('Law2_L6Geom_PelletPhys_Pellet', woo.log.TRACE) m = FrictMat(density=1e3, young=1e7, ktDivKn=.2, tanPhi=.5) S = woo.master.scene = Scene(fields=[DemField(gravity=(0, 0, 0))]) S.dtSafety = 0.01 S.dem.par.add([ Sphere.make((0, 0, 0), .05, fixed=False, wire=True, mat=m), Sphere.make((0, .10001, 0), .05, fixed=False, wire=True, mat=m) ]) # S.engines=utils.defaultEngines(damping=.0,cp2=Cp2_FrictMat_FrictPhys(),law=Law2_L6Geom_FrictPhys_IdealElPl())+[ S.engines = utils.defaultEngines( damping=.0, cp2=Cp2_FrictMat_HertzPhys(gamma=10, en=1., alpha=.6, label='cp2'), law=Law2_L6Geom_HertzPhys_DMT(), dynDtPeriod=10 ) + [ LawTester( ids=(0, 1), abWeight=.5, smooth=1e-4, stages=[ # LawTesterStage(values=(-1e-0,0,0,0,0,0),whats='ivv...',until='stage.rebound',done='print "Rebound with v0=1e-0m/s"'),LawTesterStage(values=(1e-2,0,0,0,0,0),whats='vvv...',until='not C',done='print "Contact broken."'), LawTesterStage(values=(-1e-1, 0, 0, 0, 0, 0), whats='ivv...', until='stage.rebound', done='print "Rebound with v0=1e-1m/s"'), LawTesterStage(values=(1e-2, 0, 0, 0, 0, 0), whats='vvv...', until='not C',
from woo.core import* from woo.dem import * import woo.gl from woo import utils S=woo.master.scene=Scene(fields=[DemField(gravity=(0,0,-10))]) S.dem.par.add([ utils.wall((0,0,0),axis=2,sense=1), utils.sphere((0,0,1),.2) ]) S.dem.par[1].vel=(0,1,0) S.dt=.7*utils.pWaveDt() S.engines=utils.defaultEngines()+[woo.dem.Tracer(num=512,compress=2,stepPeriod=10,compSkip=1)] S.saveTmp() import woo.qt woo.qt.View() S.run(2000)
from woo.dem import * from woo.core import * woo.master.usesApi = 10101 woo.master.scene = S = Scene(fields=[DemField(gravity=(0, 0, -10))]) mat = woo.dem.PelletMat(young=1e6, tanPhi=.5, ktDivKn=.2, density=1000) if 1: sp = pack.SpherePack() sp.makeCloud((0, 0, 0), (10, 10, 10), .4, rRelFuzz=.5) sp.toSimulation(S, mat=mat) else: S.dem.par.add(Sphere.make((0, 0, 1), .5, mat=mat)) S.dem.par.add(Wall.make(0, axis=2, sense=1, mat=mat)) S.engines = utils.defaultEngines( damping=0., cp2=Cp2_PelletMat_PelletPhys(), law=Law2_L6Geom_PelletPhys_Pellet(plastSplit=True) ) + [ PyRunner( 1, 'S.plot.addData(i=S.step,t=S.time,Eerr=(S.energy.relErr() if S.step>100 else 0),**S.energy)' ), ] S.trackEnergy = True S.saveTmp() S.plot.plots = {'i': ('**S.energy', None, ('Eerr', 'g--'))} S.plot.plot() S.run(500) #from woo import gl #S.gl.wall.div=10
from woo import utils from woo.core import * from woo.dem import * from woo import plot from woo import * import woo.log woo.log.setLevel('LawTester',woo.log.INFO) woo.log.setLevel('Law2_L6Geom_PelletPhys_Pellet',woo.log.TRACE) m=PelletMat(density=1e3,young=1e7,ktDivKn=.2,tanPhi=.5,normPlastCoeff=1e3,kaDivKn=.05) S=woo.master.scene=Scene(fields=[DemField(gravity=(0,0,0))]) S.dem.par.add([ utils.sphere((0,0,0),.5,fixed=False,wire=True,mat=m), utils.sphere((0,1.001,0),.5,fixed=False,wire=True,mat=m) ]) S.dem.collectNodes() S.engines=utils.defaultEngines(damping=.0,cp2=Cp2_PelletMat_PelletPhys(),law=Law2_L6Geom_PelletPhys_Pellet())+[ LawTester(ids=(0,1),abWeight=.3,smooth=1e-4,stages=[ LawTesterStage(values=(-.01,0,0,0,0,0),whats='v.....',until='bool(C)',done='print "New contact is",C'), LawTesterStage(values=(-.01,0,0,0,0,0),whats='v.....',until='C and C.geom.uN<-1e-3',done='print "Compressed to",C.geom.uN'), LawTesterStage(values=(.01,0,0,0,0,0),whats='v.....',until=('C.geom.uN>-1e-4'),done='print "Unloaded to",C.geom.uN'), LawTesterStage(values=(-.01,0,0,0,0,0),whats='v.....',until='C and C.geom.uN<-2e-3',done='print "Compressed to",C.geom.uN'), LawTesterStage(values=(.01,0,0,0,0,0),whats='v.....',until=('C.geom.uN>-1e-4'),done='print "Unloaded to",C.geom.uN'), LawTesterStage(values=(-.01,0,0,0,0,0),whats='v.....',until='C and C.geom.uN<-4e-3',done='print "Compressed to",C.geom.uN'), LawTesterStage(values=(.01,0,0,0,0,0),whats='v.....',until=('C.geom.uN>-1e-4'),done='print "Unloaded to",C.geom.uN'), LawTesterStage(values=(.01,0,0,0,0,0),whats='v.....',until=('not C'),done='print "Unloaded to breakage"'), #LawTesterStage(values=(-.01,0,0,0,0,0),whats='v.....',until='C.geom.uN<-2e-2',done='print "Compressed to",C.geom.uN'), #LawTesterStage(values=(.01,0,0,0,0,0),whats='v.....',until=('C.geom.uN>-1e-3'),done='print "Unloaded to",C.geom.uN'), #LawTesterStage(values=(-.01,0,0,0,0,0),whats='v.....',until='C.geom.uN<-1e-1',done='print "Compressed to",C.geom.uN'), #LawTesterStage(values=(.01,0,0,0,0,0),whats='v.....',until='not C or C.phys.force[0]==0',done='print "Unloaded to zero force at ",(C.geom.uN if C else float("nan"))'), #LawTesterStage(values=(.01,0,0,0,0,0),whats='v.....',until=('not C'),done='print "Contact broken",S.step;'), ],
from woo import utils from woo.core import * from woo.dem import * from woo import plot from woo import * import woo.log woo.master.usesApi=10101 woo.log.setLevel('LawTester',woo.log.INFO) m=utils.defaultMaterial() S=woo.master.scene=Scene(fields=[DemField()]) S.dem.par.add([ Sphere.make((0,0,0),.5,fixed=False,wire=True,mat=m), Sphere.make((0,1.01,0),.5,fixed=False,wire=True,mat=m) ]) S.engines=utils.defaultEngines(damping=.01)+[ LawTester(ids=(0,1),abWeight=.3,smooth=1e-4,stages=[ LawTesterStage(values=(-1,0,0,0,0,0),whats='v.....',until='bool(C)',done='print "Stage finished, at step",stage.step,", contact is",C'), LawTesterStage(values=(-.01,0,0,0,0,0),whats='v.....',until='C and C.geom.uN<-1e-2',done='print "Compressed to",C.geom.uN'), LawTesterStage(values=(.01,0,0,0,0,0),whats='v.....',until=('not C'),done='print "Contact broken",S.step;'), LawTesterStage(values=(-1e5,0,0,0,0,0),whats='fvv...',until=('C and tester.fErrRel[0]<1e-1'),done='print "Force-loaded contact stabilized";'), LawTesterStage(values=(-1e5,-.01,0,0,0,0),whats='fvvvvv',until=('"plast" in E and E["plast"]>0'),done='print "Plastic sliding reached";'), LawTesterStage(values=(0,-.01,0,0,0,0),whats=('vvvvvv'),until='stage.step>5000',done='print "5000 steps sliding done";'), LawTesterStage(values=(0,0,0,0,0,0),whats='vvvvvv',until='stage.step>100',done='E["plast"]=0.'), LawTesterStage(values=(0,0,-.01,0,0,0),whats='vvvvvv',until=('E["plast"]>1000'),done='print "sliding in the z-direction reached"'), LawTesterStage(values=(0,0,0,.1,0,0),whats='vvvvvv',until='stage.step>10000',done='print "Twist done"'), LawTesterStage(values=(0,0,0,0,.1,0),whats='vvvvvv',until='stage.step>10000',done='print "Bending done"'), LawTesterStage(values=(0,0,0,0,-.1,0),whats='vvvvvv',until='stage.step>10000',done='print "Bending back"'), ], done='tester.dead=True; S.stop(); print "Everything done, making myself dead and pausing."', label='tester' ),
from woo.dem import * from woo import plot import woo.log woo.master.usesApi = 10101 m = FrictMat(density=1e3, young=1e7, ktDivKn=.2, tanPhi=.5) S = woo.master.scene = Scene(fields=[DemField(gravity=(0, 0, -10))]) S.dtSafety = 0.1 S.dem.par.add([ Wall.make(-.5, axis=2, sense=1, mat=m), Sphere.make((0, 0, 1), .5, fixed=False, wire=True, mat=m) ]) # S.dem.par[1].vel=(0,0,-1) S.dtSafety = 0.06 S.engines = utils.defaultEngines( damping=.0, cp2=Cp2_FrictMat_HertzPhys(gamma=0., en=1., label='cp2'), law=Law2_L6Geom_HertzPhys_DMT(noAttraction=True), dynDtPeriod=10 ) + [ LawTester( ids=(0, 1), abWeight=1., label='tester', stages=[ LawTesterStage( values=(0, 0, 0, 0, 0, 0), whats='......', until='False', #,until='stage.rebound' ) ], done='tester.restart(); S.stop()'),
m = HertzMat(density=1e3, young=1e7, ktDivKn=.2, tanPhi=.5, surfEnergy=10., alpha=.6) S = woo.master.scene = Scene(fields=[DemField(gravity=(0, 0, 0))]) S.dtSafety = 0.01 S.dem.par.add([ Sphere.make((0, 0, 0), .05, fixed=False, wire=True, mat=m), Sphere.make((0, .10001, 0), .05, fixed=False, wire=True, mat=m) ]) # S.engines=utils.defaultEngines(damping=.0,cp2=Cp2_FrictMat_FrictPhys(),law=Law2_L6Geom_FrictPhys_IdealElPl())+[ S.engines = utils.defaultEngines( damping=.0, cp2=Cp2_HertzMat_HertzPhys(en=1., label='cp2'), law=Law2_L6Geom_HertzPhys_DMT(), dynDtPeriod=10 ) + [ LawTester( ids=(0, 1), abWeight=.5, smooth=1e-4, stages=[ # LawTesterStage(values=(-1e-0,0,0,0,0,0),whats='ivv...',until='stage.rebound',done='print("Rebound with v0=1e-0m/s")'),LawTesterStage(values=(1e-2,0,0,0,0,0),whats='vvv...',until='not C',done='print("Contact broken.")'), LawTesterStage(values=(-1e-1, 0, 0, 0, 0, 0), whats='ivv...', until='stage.rebound', done='print("Rebound with v0=1e-1m/s")'), LawTesterStage(values=(1e-2, 0, 0, 0, 0, 0), whats='vvv...', until='not C',
from woo.core import * from woo.dem import * import woo.gl from woo import utils S = woo.master.scene = Scene(fields=[DemField(gravity=(0, 0, -10))]) S.dem.par.add( [utils.wall((0, 0, 0), axis=2, sense=1), utils.sphere((0, 0, 1), .2)]) S.dem.par[1].vel = (0, 1, 0) S.dt = .7 * utils.pWaveDt() S.engines = utils.defaultEngines() + [ woo.dem.Tracer(num=512, compress=2, stepPeriod=10, compSkip=1) ] S.saveTmp() import woo.qt woo.qt.View() S.run(2000)
from woo.dem import * from woo import plot from woo import * import woo.log woo.master.usesApi=10102 woo.log.setLevel('LawTester',woo.log.INFO) woo.log.setLevel('Law2_L6Geom_PelletPhys_Pellet',woo.log.TRACE) m=FrictMat(density=1e3,young=1e7,ktDivKn=.2,tanPhi=.5) S=woo.master.scene=Scene(fields=[DemField(gravity=(0,0,0))]) S.dtSafety=0.01 S.dem.par.add([ Sphere.make((0,0,0),.05,fixed=False,wire=True,mat=m), Sphere.make((0,.10001,0),.05,fixed=False,wire=True,mat=m) ]) # S.engines=utils.defaultEngines(damping=.0,cp2=Cp2_FrictMat_FrictPhys(),law=Law2_L6Geom_FrictPhys_IdealElPl())+[ S.engines=utils.defaultEngines(damping=.0,cp2=Cp2_FrictMat_HertzPhys(gamma=10,en=1.,alpha=.6,label='cp2'),law=Law2_L6Geom_HertzPhys_DMT(),dynDtPeriod=10)+[ LawTester(ids=(0,1),abWeight=.5,smooth=1e-4,stages=[ # LawTesterStage(values=(-1e-0,0,0,0,0,0),whats='ivv...',until='stage.rebound',done='print "Rebound with v0=1e-0m/s"'),LawTesterStage(values=(1e-2,0,0,0,0,0),whats='vvv...',until='not C',done='print "Contact broken."'), LawTesterStage(values=(-1e-1,0,0,0,0,0),whats='ivv...',until='stage.rebound',done='print "Rebound with v0=1e-1m/s"'),LawTesterStage(values=(1e-2,0,0,0,0,0),whats='vvv...',until='not C',done='print "Contact broken."'), LawTesterStage(values=(-1e-2,0,0,0,0,0),whats='ivv...',until='stage.rebound',done='print "Rebound with v0=1e-2m/s"'),LawTesterStage(values=(1e-2,0,0,0,0,0),whats='vvv...',until='not C',done='print "Contact broken."'), #LawTesterStage(values=(-1e-3,0,0,0,0,0),whats='ivv...',until='stage.rebound',done='print "Rebound with v0=1e-3m/s"'),LawTesterStage(values=(1e-3,0,0,0,0,0),whats='vvv...',until='not C',done='print "Contact broken."'), #LawTesterStage(values=(-1e-4,0,0,0,0,0),whats='ivv...',until='stage.rebound',done='print "Rebound with v0=1e-4m/s"'),LawTesterStage(values=(1e-4,0,0,0,0,0),whats='vvv...',until='not C',done='print "Contact broken."'), ], done='tester.dead=True; S.stop(); print "Everything done, making myself dead and pausing."', label='tester' ), PyRunner(10,'import woo; dd={}; dd.update(**S.lab.tester.fuv()); dd.update(**S.energy); S.plot.addData(i=S.step,dist=(S.dem.par[0].pos-S.dem.par[1].pos).norm(),v1=S.dem.par[0].vel.norm(),v2=S.dem.par[1].vel.norm(),t=S.time,bounces=S.lab.tester.stages[S.lab.tester.stage].bounces,dt=S.dt,**dd)'), ] #S.pause() S.trackEnergy=True #plot.plots={' i':(('fErrRel_xx','k'),None,'fErrAbs_xx'),'i ':('dist',None),' i ':(S.energy),' i':('f_xx',None,'f_yy','f_zz'),' i':('u_xx',None,'u_yy','u_zz'),'i ':('u_yz',None,'u_zx','u_xy')}
from woo.dem import * from woo.core import * from miniEigen import * from math import * from woo import utils, pack S = woo.master.scene = Scene(fields=[DemField()]) m = FrictMat(young=1e6, density=1e3, ktDivKn=2., tanPhi=.5) for axis in 0, 1, 2: S.dem.par.append(utils.wall((0, 0, 0), axis=axis, mat=m, mask=0b011)) sp = pack.SpherePack() sp.load(sys.argv[1]) sp.cellSize = (0, 0, 0) # make the packing aperiodic sp.toSimulation(S, mat=m, mask=0b001) S.dem.collectNodes() S.dt = .3 * utils.pWaveDt() S.engines = utils.defaultEngines(gravity=(-4, -5, -10), damping=.4, verletDist=-.3) S.loneGroups = 0b010 # no contacts of walls with themselves S.run(2000) # S.wait()
import woo from woo import utils,pack,plot from woo.dem import * from woo.core import * woo.master.scene=S=Scene(fields=[DemField(gravity=(0,0,-10))]) mat=woo.dem.PelletMat(young=1e6,tanPhi=.5,ktDivKn=.2,density=1000) if 1: sp=pack.SpherePack() sp.makeCloud((0,0,0),(10,10,10),.4,rRelFuzz=.5) sp.toSimulation(S,mat=mat) else: S.dem.par.add(utils.sphere((0,0,1),.5,mat=mat)) S.dem.par.add(utils.wall(0,axis=2,sense=1,mat=mat)) S.engines=utils.defaultEngines(damping=0.,cp2=Cp2_PelletMat_PelletPhys(),law=Law2_L6Geom_PelletPhys_Pellet(plastSplit=True))+[ PyRunner(1,'S.plot.addData(i=S.step,t=S.time,Eerr=(S.energy.relErr() if S.step>100 else 0),**S.energy)'), ] S.dt=.3*utils.pWaveDt(S) S.dem.collectNodes() S.trackEnergy=True S.saveTmp() S.plot.plots={'i':(S.energy,None,('Eerr','g--'))} S.plot.plot() S.run(500) #from woo import gl #gl.Gl1_Wall.div=10 #gl.Gl1_InfCylinder.wire=True
def setUp(self): woo.master.scene=S=Scene(fields=[DemField()]) S.engines=utils.defaultEngines() S.dem.par.add(utils.sphere((0,0,0),radius=1))
from woo import utils, pack from woo.dem import * from woo.core import * from minieigen import * woo.master.usesApi = 10101 woo.master.scene = S = Scene(fields=[DemField(gravity=(0, 0, -10))]) mat = utils.defaultMaterial() sp = pack.SpherePack() sp.makeCloud((4, 4, 4), (14, 14, 14), .4, rRelFuzz=.5) sp.toSimulation(S, mat=mat) S.dem.par.add([ utils.wall(1, axis=2, sense=0, mat=mat, glAB=((-10, -1), (20, 11))), ]) S.periodic = True S.cell.setBox(20, 20, 20) S.engines = utils.defaultEngines( damping=.4) + [POVRayExport(out='/tmp/pov', stepPeriod=20)] S.dtSafety = .5 S.dt = .5 * utils.pWaveDt() # to compute oscillation freqs below # create cylinders for i, x in enumerate([-2, 0, 2, 4, 6, 8, 10.5, 12, 14]): c = InfCylinder.make((x, 0, 3), radius=.8, axis=1, mat=mat, glAB=(-1, 11)) c.angVel = (0, 4. * (i + 1), 0) # each of cylinders will move haronically along global x and z axes (not y) c.impose = AlignedHarmonicOscillations( freqs=(1. / (10000. * S.dt), float('nan'), 1 / (((i % 3) + 3) * 1000. * S.dt)), amps=(.3 * (i % 2 + 1), 0, .4 * (i % 4 + 1))) S.dem.par.add(c) try: from woo import gl
woo.log.setLevel('LawTester', woo.log.INFO) woo.log.setLevel('Law2_L6Geom_PelletPhys_Pellet', woo.log.TRACE) m = PelletMat(density=1e3, young=1e7, ktDivKn=.2, tanPhi=.5, normPlastCoeff=1e3, kaDivKn=.05) S = woo.master.scene = Scene(fields=[DemField(gravity=(0, 0, 0))]) S.dem.par.add([ Sphere.make((0, 0, 0), .5, fixed=False, wire=True, mat=m), Sphere.make((0, 1.001, 0), .5, fixed=False, wire=True, mat=m) ]) S.engines = utils.defaultEngines( damping=.0, cp2=Cp2_PelletMat_PelletPhys(), law=Law2_L6Geom_PelletPhys_Pellet() ) + [ LawTester( ids=(0, 1), abWeight=.3, smooth=1e-4, stages=[ LawTesterStage(values=(-.01, 0, 0, 0, 0, 0), whats='v.....', until='bool(C)', done='print "New contact is",C'), LawTesterStage(values=(-.01, 0, 0, 0, 0, 0), whats='v.....', until='C and C.geom.uN<-1e-3', done='print "Compressed to",C.geom.uN'),
"""This example demonstrates GTS (http://gts.sourceforge.net/) opportunities for creating surfaces VTU-files are created in /tmp directory after simulation. If you open those with paraview (or other VTK-based) program, you can create video, make screenshots etc.""" import woo from woo import * from woo.dem import * from woo.core import * from numpy import linspace from woo import pack,qt,utils from minieigen import * from math import * S=woo.master.scene=Scene(fields=[DemField(gravity=(0,0,-9.81))]) thetas=linspace(0,2*pi,num=16,endpoint=True) meridians=pack.revolutionSurfaceMeridians([[Vector2(3+rad*sin(th),10*rad+rad*cos(th)) for th in thetas] for rad in linspace(1,2,num=10)],linspace(0,pi,num=10)) surf=pack.sweptPolylines2gtsSurface(meridians+[[Vector3(5*sin(-th),-10+5*cos(-th),30) for th in thetas]]) S.dem.par.add(pack.gtsSurface2Facets(surf)) sp=pack.SpherePack() sp.makeCloud(Vector3(-1,-9,30),Vector3(1,-13,32),.2,rRelFuzz=.3) S.dem.par.add([utils.sphere(c,r) for c,r in sp]) S.engines=utils.defaultEngines()+[VtkExport(stepPeriod=100,what=VtkExport.spheres|VtkExport.mesh,out='/tmp/p1-')] S.dt=utils.pWaveDt(S) qt.Controller() qt.View() S.saveTmp() S.run(8500)