def mpitest_noConflictsMaintainWithStateRetainer(self): assigned = [] with self.r.retainState(parameters.inCategory("cat1")): for ci, comp in enumerate(self.comps): comp.p.param2 = 99 * ci if ci % armi.MPI_SIZE == armi.MPI_RANK: comp.p.param1 = (armi.MPI_RANK + 1) * 30.0 assigned.append(parameters.SINCE_ANYTHING) else: self.assertNotEqual((armi.MPI_RANK + 1) * 30.0, comp.p.param1) assigned.append(parameters.NEVER) # 1st inside state retainer self.assertEqual( True, all(c.p.assigned == parameters.SINCE_ANYTHING for c in self.comps)) # confirm outside state retainer self.assertEqual(assigned, [c.p.assigned for ci, c in enumerate(self.comps)]) # this rank's "assigned" components are not assigned on the workers, and so will be updated self.assertEqual(len(self.comps), self.r.syncMpiState()) for ci, comp in enumerate(self.comps): self.assertEqual((ci % armi.MPI_SIZE + 1) * 30.0, comp.p.param1)
def mpitest_conflictsMaintainWithStateRetainer(self): with self.r.retainState(parameters.inCategory("cat2")): for _, comp in enumerate(self.comps): comp.p.param2 = 99 * armi.MPI_RANK with self.assertRaises(ValueError): self.r.syncMpiState()
def do(): # we will do this over 4 passes (there are 4 * MPI_SIZE assemblies) for passNum in range(4): with self.r.retainState(parameters.inCategory("cat2")): self.r.p.param3 = "hi" for c in self.comps: c.p.param1 = ( 99 * context.MPI_RANK ) # this will get reset after state retainer a = self.r.core[passNum * context.MPI_SIZE + context.MPI_RANK] a.p.param2 = context.MPI_RANK * 20.0 for b in a: b.p.param2 = context.MPI_RANK * 10.0 for ai, a2 in enumerate(self.r): if ai % context.MPI_SIZE != context.MPI_RANK: assert "param2" not in a2.p self.assertEqual(parameters.SINCE_ANYTHING, param1.assigned) self.assertEqual(parameters.SINCE_ANYTHING, param2.assigned) self.assertEqual(parameters.SINCE_ANYTHING, param3.assigned) self.assertEqual(parameters.SINCE_ANYTHING, a.p.assigned) self.r.syncMpiState() self.assertEqual( parameters.SINCE_ANYTHING & ~parameters.SINCE_LAST_DISTRIBUTE_STATE, param1.assigned, ) self.assertEqual( parameters.SINCE_ANYTHING & ~parameters.SINCE_LAST_DISTRIBUTE_STATE, param2.assigned, ) self.assertEqual( parameters.SINCE_ANYTHING & ~parameters.SINCE_LAST_DISTRIBUTE_STATE, param3.assigned, ) self.assertEqual( parameters.SINCE_ANYTHING & ~parameters.SINCE_LAST_DISTRIBUTE_STATE, a.p.assigned, ) self.assertEqual(parameters.NEVER, param1.assigned) self.assertEqual(parameters.SINCE_ANYTHING, param2.assigned) self.assertEqual(parameters.NEVER, param3.assigned) self.assertEqual(parameters.SINCE_ANYTHING, a.p.assigned) do_assert(passNum)
def mpitest_rxCoeffsProcess(self): """This test mimics the process for rxCoeffs when doing distributed doppler""" def do(): # we will do this over 4 passes (there are 4 * MPI_SIZE assemblies) for passNum in range(4): with self.r.retainState(parameters.inCategory("cat2")): self.r.p.param3 = "hi" for c in self.comps: c.p.param1 = ( 99 * armi.MPI_RANK ) # this will get reset after state retainer a = self.r.core[passNum * armi.MPI_SIZE + armi.MPI_RANK] a.p.param2 = armi.MPI_RANK * 20.0 for b in a: b.p.param2 = armi.MPI_RANK * 10.0 for ai, a2 in enumerate(self.r): if ai % armi.MPI_SIZE != armi.MPI_RANK: assert "param2" not in a2.p self.assertEqual(parameters.SINCE_ANYTHING, param1.assigned) self.assertEqual(parameters.SINCE_ANYTHING, param2.assigned) self.assertEqual(parameters.SINCE_ANYTHING, param3.assigned) self.assertEqual(parameters.SINCE_ANYTHING, a.p.assigned) self.r.syncMpiState() self.assertEqual( parameters.SINCE_ANYTHING & ~parameters.SINCE_LAST_DISTRIBUTE_STATE, param1.assigned, ) self.assertEqual( parameters.SINCE_ANYTHING & ~parameters.SINCE_LAST_DISTRIBUTE_STATE, param2.assigned, ) self.assertEqual( parameters.SINCE_ANYTHING & ~parameters.SINCE_LAST_DISTRIBUTE_STATE, param3.assigned, ) self.assertEqual( parameters.SINCE_ANYTHING & ~parameters.SINCE_LAST_DISTRIBUTE_STATE, a.p.assigned, ) self.assertEqual(parameters.NEVER, param1.assigned) self.assertEqual(parameters.SINCE_ANYTHING, param2.assigned) self.assertEqual(parameters.NEVER, param3.assigned) self.assertEqual(parameters.SINCE_ANYTHING, a.p.assigned) do_assert(passNum) param1 = self.r.p.paramDefs["param1"] param2 = self.r.p.paramDefs["param2"] param3 = self.r.p.paramDefs["param3"] def do_assert(passNum): # ensure all assemblies and blocks set values for param2, but param1 is empty for rank in range(armi.MPI_SIZE): a = self.r.core[passNum * armi.MPI_SIZE + rank] assert "param1" not in a.p assert "param3" not in a.p self.assertEqual(rank * 20, a.p.param2) for b in a: self.assertEqual(rank * 10, b.p.param2) assert "param1" not in b.p assert "param3" not in b.p if armi.MPI_RANK == 0: with self.r.retainState(parameters.inCategory("cat2")): armi.MPI_COMM.bcast(self.r) do() [do_assert(passNum) for passNum in range(4)] [do_assert(passNum) for passNum in range(4)] else: del self.r self.r = armi.MPI_COMM.bcast(None) do()