Use committed Taylor body IDs after topology sync
This commit is contained in:
@@ -249,8 +249,11 @@ def make_release(scene, plan, cfgpath, base, out, started, cap, release_dir):
|
|||||||
warm = 32 if plan['smoke'] else (512000 if scene == 'taylor' else 2048000)
|
warm = 32 if plan['smoke'] else (512000 if scene == 'taylor' else 2048000)
|
||||||
if scene == 'taylor':
|
if scene == 'taylor':
|
||||||
base.warmup(sim, warm, started, cap)
|
base.warmup(sim, warm, started, cap)
|
||||||
bodies = [sim.add_body('circle', point, 20.) for point in CENTRES]
|
first = sim.bodies.count
|
||||||
|
for point in CENTRES:
|
||||||
|
sim.add_body('circle', point, 20.) # runtime additions return staged ID -1
|
||||||
sim.sync_bodies()
|
sim.sync_bodies()
|
||||||
|
bodies = list(range(first, first+len(CENTRES)))
|
||||||
base.warmup(sim, warm-1, started, cap)
|
base.warmup(sim, warm-1, started, cap)
|
||||||
sim.run(1, zero_obs=True, sync_obs=True)
|
sim.run(1, zero_obs=True, sync_obs=True)
|
||||||
force = sum(float(sim.read_force(body)[1]) for body in bodies)
|
force = sum(float(sim.read_force(body)[1]) for body in bodies)
|
||||||
|
|||||||
@@ -182,6 +182,36 @@ class CollectionContracts(unittest.TestCase):
|
|||||||
|
|
||||||
|
|
||||||
class SelectionContracts(unittest.TestCase):
|
class SelectionContracts(unittest.TestCase):
|
||||||
|
def test_taylor_release_uses_committed_ids_not_staged_minus_one(self):
|
||||||
|
reads=[]
|
||||||
|
class Sim:
|
||||||
|
def __init__(self,*args):
|
||||||
|
self.bodies=types.SimpleNamespace(count=0)
|
||||||
|
self.stepper=types.SimpleNamespace(step_count=0)
|
||||||
|
self.initialized=False;self.pending=0
|
||||||
|
def __enter__(self):return self
|
||||||
|
def __exit__(self,*args):pass
|
||||||
|
def add_body(self,*args,**kwargs):
|
||||||
|
if self.initialized:self.pending+=1;return -1
|
||||||
|
index=self.bodies.count;self.bodies.count+=1;return index
|
||||||
|
def initialize(self):self.initialized=True
|
||||||
|
def sync_bodies(self):self.bodies.count+=self.pending;self.pending=0
|
||||||
|
def run(self,n,**kwargs):self.stepper.step_count+=n
|
||||||
|
def read_force(self,body):
|
||||||
|
if body<0:raise IndexError('staged ID')
|
||||||
|
reads.append(body);return [0.,float(body),0.]
|
||||||
|
pkg=types.ModuleType('CelerisLab');pkg.Simulation=Sim
|
||||||
|
motion=types.ModuleType('CelerisLab.body.motion');motion.Translation=None
|
||||||
|
base=types.SimpleNamespace(warmup=lambda sim,n,*args:sim.run(n),
|
||||||
|
capture_seed=lambda sim:(np.zeros(18,np.float32),np.ones(18,np.float32),
|
||||||
|
np.ones(2,np.uint16),sim.stepper.step_count))
|
||||||
|
with tempfile.TemporaryDirectory() as directory,patch.dict(sys.modules,{'CelerisLab':pkg,'CelerisLab.body.motion':motion}):
|
||||||
|
seed,force,_=driver.make_release('taylor',driver.schedule('taylor',True),'unused',base,
|
||||||
|
Path(directory),0,60,None)
|
||||||
|
self.assertEqual(reads,[3,4,5])
|
||||||
|
self.assertEqual(force,12.)
|
||||||
|
self.assertEqual(seed[3],64)
|
||||||
|
|
||||||
def test_recorded_clock_must_equal_observed_solver(self):
|
def test_recorded_clock_must_equal_observed_solver(self):
|
||||||
driver.check_clock(types.SimpleNamespace(step_count=4579200),4576000,3200)
|
driver.check_clock(types.SimpleNamespace(step_count=4579200),4576000,3200)
|
||||||
with self.assertRaisesRegex(RuntimeError,'observed solver clock'):
|
with self.assertRaisesRegex(RuntimeError,'observed solver clock'):
|
||||||
|
|||||||
Reference in New Issue
Block a user