コード例 #1
0
ファイル: pack.py プロジェクト: Azeko2xo/woodem
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]
コード例 #2
0
ファイル: pack.py プロジェクト: Azeko2xo/woodem
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)
コード例 #3
0
ファイル: stream-woo.py プロジェクト: woodem/cl-dem0
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()
コード例 #4
0
ファイル: hertz-fall.py プロジェクト: CrazyHeex/woo
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()

コード例 #5
0
ファイル: impose-harmonic.py プロジェクト: ngsanchez/woodem
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
コード例 #6
0
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',
コード例 #7
0
ファイル: trace.py プロジェクト: Azeko2xo/woodem
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)
コード例 #8
0
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
コード例 #9
0
ファイル: law-test-pellet.py プロジェクト: Azeko2xo/woodem
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;'),
		],
コード例 #10
0
ファイル: law-tester.py プロジェクト: yankang84/woo
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'
    ),
コード例 #11
0
ファイル: hertz-fall.py プロジェクト: yankang84/woodem
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()'),
コード例 #12
0
ファイル: law-test-hertz.py プロジェクト: woodem/woo
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',
コード例 #13
0
ファイル: trace.py プロジェクト: yankang84/woo
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)
コード例 #14
0
ファイル: law-test-hertz.py プロジェクト: CrazyHeex/woo
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')}
コード例 #15
0
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()
コード例 #16
0
ファイル: pellet-energy.py プロジェクト: Azeko2xo/woodem
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
コード例 #17
0
ファイル: io.py プロジェクト: sjl767/woo
 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))
コード例 #18
0
 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))
コード例 #19
0
ファイル: impose-harmonic.py プロジェクト: yankang84/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) + [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
コード例 #20
0
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'),
コード例 #21
0
ファイル: vtk-export.py プロジェクト: Azeko2xo/woodem
"""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)