Esempio n. 1
0
    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)
Esempio n. 2
0
    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()
Esempio n. 3
0
        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)
Esempio n. 4
0
    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()