# encoding: utf-8
# 2013 © Václav Šmilauer <eudoxos@arcig.cz>
'''
Test some parts of energy conservation in DEM simulations.
'''
import unittest
from minieigen import *
from math import *
from woo import utils
from woo.core import *
from woo.dem import *
from woo.pre import *
import woo
import woo.log
[docs]class TestInletsAndOutlets(unittest.TestCase):
[docs] def setUp(self):
self.S=Scene(fields=[DemField(gravity=(0,0,0))])
self.S.trackEnergy=True
self.mat=woo.utils.defaultMaterial()
self.vel=1.
self.rad=.1
self.m=self.mat.density*(4/3.)*pi*self.rad**3
self.Ek=.5*self.m*self.vel**2
if 0:
woo.log.setLevel('BoxOutlet',woo.log.TRACE)
woo.log.setLevel('ConveyorInlet',woo.log.TRACE)
woo.log.setLevel('RandomInlet',woo.log.TRACE)
woo.log.setLevel('DemField',woo.log.TRACE)
woo.log.setLevel('ParticleContainer',woo.log.TRACE)
[docs] def testConveyorInlet(self):
'Energy: conveyor inlet traces kinetic energy'
import os
S=self.S
S.engines=[
ConveyorInlet(maxNum=1,material=self.mat,cellLen=.3,radii=[self.rad],centers=[(0,0,0)],vel=self.vel,node=Node(pos=(0,0,0))),
BoxOutlet(inside=True,box=((-1,-1,-1),(1,1,1)))
]
S.dt=1. # produce one particle in the first step
S.one()
#print 100*'#',dict(S.energy)
#print 'Number of particles:',len(S.dem.par)
self.assertEqual(len(S.dem.par),0)
self.assertEqual(S.energy['kinOutlet'],self.Ek)
self.assertEqual(S.energy['kinInlet'],-self.Ek)
self.assertEqual(S.energy.total(),0.)
[docs] def testRandomInlet(self):
'Energy: random box factory traces kinetic energy'
S=self.S
S.engines=[
InsertionSortCollider(),
BoxInlet(maxNum=1,materials=[self.mat],
generator=MinMaxSphereGenerator(dRange=(2*self.rad,2*self.rad)),
shooter=AlignedMinMaxShooter(dir=(1,0,0),vRange=(self.vel,self.vel)),
box=((-.5,-.5,-.5),(.5,.5,.5)),
massRate=0,
),
BoxOutlet(inside=True,box=((-1,-1,-1),(1,1,1))),
]
S.dt=.05 # produce one particle in the first step
S.one()
self.assertEqual(S.energy['kinOutlet'],self.Ek)
self.assertEqual(S.energy['kinInlet'],-self.Ek)
self.assertEqual(S.energy.total(),0.)
[docs]class TestLeapfrog(unittest.TestCase):
[docs] def setUp(self):
m=woo.utils.defaultMaterial()
self.S=Scene(dtSafety=.9,trackEnergy=True,engines=DemField.minimalEngines(damping=.4),
fields=[DemField(gravity=(0,0,-10),par=[Wall.make(0,axis=2,sense=1,mat=m),
Sphere.make((0,0,.1),radius=.8,mat=m)])])
[docs] def testGravitySkip(self):
'Energy: DemData.gravitySkip'
S=self.S
for n in S.dem.nodes: n.dem.gravitySkip=True
S.dem.par[-1].vel=(0,0,-1) # so that we hit ground and have dissipation
S.run(400,True)
self.assertTrue('grav' not in S.energy)
self.assertTrue(S.energy['nonviscDamp']!=0.)
[docs] def testDampingSkip(self):
'Energy: DemData.dampingSkip'
S=self.S
for n in S.dem.nodes: n.dem.dampingSkip=True
S.run(400,True)
self.assertTrue(S.energy['grav']!=0.)
self.assertTrue('nonviscDamp' not in S.energy)