Example #1
0
def get_time(path, time=None, datahier = None):
    if time is not None:
        time = "{:.10f}".format(time)
    from pyphare.pharesee.hierarchy import hierarchy_from
    datahier = hierarchy_from(h5_filename=path+"/EM_E.h5", time=time, hier=datahier)
    datahier = hierarchy_from(h5_filename=path+"/EM_B.h5", time=time, hier=datahier)
    return datahier
Example #2
0
def main():
    config()
    simulator = Simulator(gv.sim)
    simulator.initialize()
    simulator.run()

    if cpp.mpi_rank() == 0:
        b = hierarchy_from(h5_filename="phare_outputs/EM_B.h5")
        plot(b)
Example #3
0
    def _test_dump_diags(self, dim, **simInput):
        test_id = self.ddt_test_id()
        for key in ["cells", "dl", "boundary_types"]:
            simInput[key] = [simInput[key] for d in range(dim)]

        for interp in range(1, 4):
            local_out = f"{out}_dim{dim}_interp{interp}_mpi_n_{cpp.mpi_size()}_id{test_id}"
            simInput["diag_options"]["options"]["dir"] = local_out

            simulation = ph.Simulation(**simInput)
            self.assertTrue(len(simulation.cells) == dim)

            dump_all_diags(setup_model().populations)
            self.simulator = Simulator(
                simulation).initialize().advance().reset()

            self.assertTrue(
                any([
                    diagInfo.quantity.endswith("tags")
                    for diagInfo in ph.global_vars.sim.diagnostics
                ]))

            checks = 0
            found = 0
            for diagInfo in ph.global_vars.sim.diagnostics:
                h5_filepath = os.path.join(local_out,
                                           h5_filename_from(diagInfo))
                self.assertTrue(os.path.exists(h5_filepath))

                h5_file = h5py.File(h5_filepath, "r")
                self.assertTrue("0.0000000000"
                                in h5_file[h5_time_grp_key])  # init dump
                n_patches = len(
                    list(h5_file[h5_time_grp_key]["0.0000000000"]
                         ["pl0"].keys()))

                if h5_filepath.endswith("tags.h5"):
                    found = 1
                    hier = hierarchy_from(h5_filename=h5_filepath)
                    patches = hier.level(0).patches
                    tag_found = 0
                    for patch in patches:
                        self.assertTrue(len(patch.patch_datas.items()))
                        for qty_name, pd in patch.patch_datas.items():
                            self.assertTrue((pd.dataset[:] >= 0).all())
                            self.assertTrue((pd.dataset[:] < 2).all())
                            tag_found |= (pd.dataset[:] == 1).any()
                        checks += 1

            self.assertEqual(found, 1)
            self.assertEqual(tag_found, 1)
            self.assertEqual(checks, n_patches)
            self.simulator = None
            ph.global_vars.sim = None
Example #4
0
    def _test_dump_diags(self, dim, **simInput):
        test_id = self.ddt_test_id()

        # configure simulation dim sized values
        for key in ["cells", "dl", "boundary_types"]:
            simInput[key] = [simInput[key] for d in range(dim)]
        b0 = [[10 for i in range(dim)], [19 for i in range(dim)]]
        simInput["refinement_boxes"] = {"L0": {"B0": b0}}

        for interp in range(1, 4):
            print("_test_dump_diags dim/interp:{}/{}".format(dim, interp))

            local_out = f"{out}_dim{dim}_interp{interp}_mpi_n_{cpp.mpi_size()}_id{test_id}"
            simInput["diag_options"]["options"]["dir"] = local_out

            simulation = ph.Simulation(**simInput)
            self.assertTrue(len(simulation.cells) == dim)

            dump_all_diags(setup_model().populations)
            self.simulator = Simulator(simulation).initialize().advance()

            for diagInfo in ph.global_vars.sim.diagnostics:
                # diagInfo.quantity starts with a / this interferes with os.path.join, hence   [1:]
                h5_filename = os.path.join(local_out, (diagInfo.quantity + ".h5").replace('/', '_')[1:])
                print("h5_filename", h5_filename)

                h5_file = h5py.File(h5_filename, "r")
                self.assertTrue("t0.000000" in h5_file) #    init dump

                self.assertTrue("t0.000100" in h5_file)
                self.assertTrue("pl1" in h5_file["t0.000100"])
                self.assertFalse("pl0" in h5_file["t0.000100"])

                self.assertTrue("t0.001000" in h5_file) # advance dump


                # SEE https://github.com/PHAREHUB/PHARE/issues/275
                if dim == 1: # REMOVE WHEN PHARESEE SUPPORTS 2D
                    self.assertTrue(os.path.exists(h5_filename))
                    hier = hierarchy_from(h5_filename=h5_filename)
                    if h5_filename.endswith("domain.h5"):
                        for patch in hier.level(0).patches:
                            for qty_name, pd in patch.patch_datas.items():
                                splits = pd.dataset.split(ph.global_vars.sim)
                                self.assertTrue(splits.size() == pd.dataset.size() * 2)
                                print("splits.iCell", splits.iCells)
                                print("splits.delta", splits.deltas)
                                print("splits.weight", splits.weights)
                                print("splits.charge", splits.charges)
                                print("splits.v", splits.v)

            self.simulator = None
            ph.global_vars.sim = None
    def test_hierarchy_timestamp_cadence(self, refinement_boxes):
        dim = refinement_boxes["L0"]["B0"].ndim

        time_step = .001
        # time_step_nbr chosen to force diagnostics dumping double imprecision cadence calculations accuracy testing
        time_step_nbr = 101
        final_time = time_step * time_step_nbr

        for trailing in [0, 1]:  # 1 = skip init dumps
            for i in [2, 3]:
                simInput = simArgs.copy()
                diag_outputs = f"phare_outputs_hierarchy_timestamp_cadence_{dim}_{self.ddt_test_id()}_{i}"
                simInput["diag_options"]["options"]["dir"] = diag_outputs
                simInput["time_step_nbr"] = time_step_nbr

                ph.global_vars.sim = None
                simulation = ph.Simulation(**simInput)
                setup_model(10)

                timestamps = np.arange(0, final_time, time_step * i)[trailing:]
                for quantity in ["B"]:
                    ElectromagDiagnostics(
                        quantity=quantity,
                        write_timestamps=timestamps,
                        compute_timestamps=timestamps,
                        flush_every=ElectromagDiagnostics.h5_flush_never,
                    )

                Simulator(simulation).run()

                for diagInfo in simulation.diagnostics:
                    h5_filename = os.path.join(diag_outputs,
                                               h5_filename_from(diagInfo))
                    self.assertTrue(os.path.exists(h5_filename))

                    hier = hierarchy_from(h5_filename=h5_filename)

                    time_hier_keys = list(hier.time_hier.keys())
                    self.assertEqual(len(time_hier_keys), len(timestamps))

                    for i, timestamp in enumerate(time_hier_keys):
                        self.assertEqual(hier.format_timestamp(timestamps[i]),
                                         timestamp)
Example #6
0
    def getHierarchy(self,
                     interp_order,
                     refinement_boxes,
                     qty,
                     nbr_part_per_cell=100,
                     diag_outputs="phare_outputs",
                     density=lambda x: 0.3 + 1. / np.cosh((x - 6) / 4.)**2,
                     beam=False,
                     smallest_patch_size=10,
                     largest_patch_size=10,
                     cells=120,
                     dl=0.1):

        from pyphare.pharein import global_vars
        global_vars.sim = None
        startMPI()
        Simulation(smallest_patch_size=smallest_patch_size,
                   largest_patch_size=largest_patch_size,
                   time_step_nbr=30000,
                   final_time=30.,
                   boundary_types="periodic",
                   cells=cells,
                   dl=dl,
                   interp_order=interp_order,
                   refinement_boxes=refinement_boxes,
                   diag_options={
                       "format": "phareh5",
                       "options": {
                           "dir": diag_outputs,
                           "mode": "overwrite"
                       }
                   })

        def beam_density(x):
            return np.zeros_like(x) + 0.3

        def by(x):
            from pyphare.pharein.global_vars import sim
            L = sim.simulation_domain()
            return 0.1 * np.cos(2 * np.pi * x / L[0])

        def bz(x):
            from pyphare.pharein.global_vars import sim
            L = sim.simulation_domain()
            return 0.1 * np.sin(2 * np.pi * x / L[0])

        def bx(x):
            return 1.

        def vx(x):
            from pyphare.pharein.global_vars import sim
            L = sim.simulation_domain()
            return 0.1 * np.cos(2 * np.pi * x / L[0]) + 0.2

        def vy(x):
            from pyphare.pharein.global_vars import sim
            L = sim.simulation_domain()
            return 0.1 * np.cos(2 * np.pi * x / L[0])

        def vz(x):
            from pyphare.pharein.global_vars import sim
            L = sim.simulation_domain()
            return 0.1 * np.sin(2 * np.pi * x / L[0])

        def vthx(x):
            return 0.01 + np.zeros_like(x)

        def vthy(x):
            return 0.01 + np.zeros_like(x)

        def vthz(x):
            return 0.01 + np.zeros_like(x)

        if beam:
            MaxwellianFluidModel(bx=bx,
                                 by=by,
                                 bz=bz,
                                 protons={
                                     "charge": 1,
                                     "density": density,
                                     "vbulkx": vx,
                                     "vbulky": vy,
                                     "vbulkz": vz,
                                     "vthx": vthx,
                                     "vthy": vthy,
                                     "vthz": vthz,
                                     "nbr_part_per_cell": nbr_part_per_cell,
                                     "init": {
                                         "seed": 1337
                                     }
                                 },
                                 beam={
                                     "charge": 1,
                                     "density": beam_density,
                                     "vbulkx": vx,
                                     "vbulky": vy,
                                     "vbulkz": vz,
                                     "vthx": vthx,
                                     "vthy": vthy,
                                     "vthz": vthz,
                                     "nbr_part_per_cell": nbr_part_per_cell,
                                     "init": {
                                         "seed": 1337
                                     }
                                 })

        else:
            MaxwellianFluidModel(bx=bx,
                                 by=by,
                                 bz=bz,
                                 protons={
                                     "charge": 1,
                                     "density": density,
                                     "vbulkx": vx,
                                     "vbulky": vy,
                                     "vbulkz": vz,
                                     "vthx": vthx,
                                     "vthy": vthy,
                                     "vthz": vthz,
                                     "nbr_part_per_cell": nbr_part_per_cell,
                                     "init": {
                                         "seed": 1337
                                     }
                                 })

        ElectronModel(closure="isothermal", Te=0.12)

        for quantity in ["E", "B"]:
            ElectromagDiagnostics(quantity=quantity,
                                  write_timestamps=np.zeros(1),
                                  compute_timestamps=np.zeros(1))

        for quantity in ["density", "bulkVelocity"]:
            FluidDiagnostics(quantity=quantity,
                             write_timestamps=np.zeros(1),
                             compute_timestamps=np.zeros(1))

        poplist = ["protons", "beam"] if beam else ["protons"]
        for pop in poplist:
            for quantity in ["density", "flux"]:
                FluidDiagnostics(quantity=quantity,
                                 write_timestamps=np.zeros(1),
                                 compute_timestamps=np.zeros(1),
                                 population_name=pop)

            for quantity in ['domain', 'levelGhost', 'patchGhost']:
                ParticleDiagnostics(quantity=quantity,
                                    compute_timestamps=np.zeros(1),
                                    write_timestamps=np.zeros(1),
                                    population_name=pop)

        simulator = Simulator(global_vars.sim)
        simulator.initialize()

        if qty == "b":
            b_hier = hierarchy_from(h5_filename=diag_outputs + "/EM_B.h5")
            return b_hier

        is_particle_type = qty == "particles" or qty == "particles_patch_ghost"

        if is_particle_type:
            particle_hier = None

        if qty == "particles":
            particle_hier = hierarchy_from(h5_filename=diag_outputs +
                                           "/ions_pop_protons_domain.h5")
            particle_hier = hierarchy_from(h5_filename=diag_outputs +
                                           "/ions_pop_protons_levelGhost.h5",
                                           hier=particle_hier)

        if is_particle_type:
            particle_hier = hierarchy_from(h5_filename=diag_outputs +
                                           "/ions_pop_protons_patchGhost.h5",
                                           hier=particle_hier)

        if qty == "particles":
            merge_particles(particle_hier)

        if is_particle_type:
            return particle_hier

        if qty == "moments":
            mom_hier = hierarchy_from(h5_filename=diag_outputs +
                                      "/ions_density.h5")
            mom_hier = hierarchy_from(h5_filename=diag_outputs +
                                      "/ions_bulkVelocity.h5",
                                      hier=mom_hier)
            mom_hier = hierarchy_from(h5_filename=diag_outputs +
                                      "/ions_pop_protons_density.h5",
                                      hier=mom_hier)
            mom_hier = hierarchy_from(h5_filename=diag_outputs +
                                      "/ions_pop_protons_flux.h5",
                                      hier=mom_hier)
            if beam:
                mom_hier = hierarchy_from(h5_filename=diag_outputs +
                                          "/ions_pop_beam_density.h5",
                                          hier=mom_hier)
                mom_hier = hierarchy_from(h5_filename=diag_outputs +
                                          "/ions_pop_beam_flux.h5",
                                          hier=mom_hier)
            return mom_hier
Example #7
0
    def getHierarchy(self,
                     interp_order,
                     refinement_boxes,
                     qty,
                     diag_outputs,
                     nbr_part_per_cell=100,
                     density=_density,
                     extra_diag_options={},
                     beam=False,
                     time_step_nbr=1,
                     smallest_patch_size=None,
                     largest_patch_size=10,
                     cells=120,
                     dl=0.1,
                     ndim=1):
        diag_outputs = f"phare_outputs/init/{diag_outputs}"
        from pyphare.pharein import global_vars
        global_vars.sim = None

        if smallest_patch_size is None:
            from pyphare.pharein.simulation import check_patch_size
            _, smallest_patch_size = check_patch_size(
                ndim, interp_order=interp_order, cells=cells)

        extra_diag_options["mode"] = "overwrite"
        extra_diag_options["dir"] = diag_outputs
        self.register_diag_dir_for_cleanup(diag_outputs)
        Simulation(
            smallest_patch_size=smallest_patch_size,
            largest_patch_size=largest_patch_size,
            time_step_nbr=time_step_nbr,
            final_time=30.,
            boundary_types=["periodic"] * ndim,
            cells=[cells] * ndim,
            dl=[dl] * ndim,
            interp_order=interp_order,
            refinement_boxes=refinement_boxes,
            diag_options={
                "format": "phareh5",
                "options": extra_diag_options
            },
            strict=True,
        )

        def beam_density(*xyz):
            return np.zeros_like(xyz[0]) + 0.3

        def bx(*xyz):
            return 1.

        def by(*xyz):
            from pyphare.pharein.global_vars import sim
            L = sim.simulation_domain()
            _ = lambda i: 0.1 * np.cos(2 * np.pi * xyz[i] / L[i])
            return np.asarray([_(i) for i, v in enumerate(xyz)]).prod(axis=0)

        def bz(*xyz):
            from pyphare.pharein.global_vars import sim
            L = sim.simulation_domain()
            _ = lambda i: 0.1 * np.sin(2 * np.pi * xyz[i] / L[i])
            return np.asarray([_(i) for i, v in enumerate(xyz)]).prod(axis=0)

        def vx(*xyz):
            from pyphare.pharein.global_vars import sim
            L = sim.simulation_domain()
            _ = lambda i: 0.1 * np.cos(2 * np.pi * xyz[i] / L[i])
            return np.asarray([_(i) for i, v in enumerate(xyz)]).prod(axis=0)

        def vy(*xyz):
            from pyphare.pharein.global_vars import sim
            L = sim.simulation_domain()
            _ = lambda i: 0.1 * np.cos(2 * np.pi * xyz[i] / L[i])
            return np.asarray([_(i) for i, v in enumerate(xyz)]).prod(axis=0)

        def vz(*xyz):
            from pyphare.pharein.global_vars import sim
            L = sim.simulation_domain()
            _ = lambda i: 0.1 * np.sin(2 * np.pi * xyz[i] / L[i])
            return np.asarray([_(i) for i, v in enumerate(xyz)]).prod(axis=0)

        def vth(*xyz):
            return 0.01 + np.zeros_like(xyz[0])

        def vthx(*xyz):
            return vth(*xyz)

        def vthy(*xyz):
            return vth(*xyz)

        def vthz(*xyz):
            return vth(*xyz)

        if beam:
            MaxwellianFluidModel(bx=bx,
                                 by=by,
                                 bz=bz,
                                 protons={
                                     "charge": 1,
                                     "density": density,
                                     "vbulkx": vx,
                                     "vbulky": vy,
                                     "vbulkz": vz,
                                     "vthx": vthx,
                                     "vthy": vthy,
                                     "vthz": vthz,
                                     "nbr_part_per_cell": nbr_part_per_cell,
                                     "init": {
                                         "seed": 1337
                                     }
                                 },
                                 beam={
                                     "charge": 1,
                                     "density": beam_density,
                                     "vbulkx": vx,
                                     "vbulky": vy,
                                     "vbulkz": vz,
                                     "vthx": vthx,
                                     "vthy": vthy,
                                     "vthz": vthz,
                                     "nbr_part_per_cell": nbr_part_per_cell,
                                     "init": {
                                         "seed": 1337
                                     }
                                 })

        else:
            MaxwellianFluidModel(bx=bx,
                                 by=by,
                                 bz=bz,
                                 protons={
                                     "charge": 1,
                                     "density": density,
                                     "vbulkx": vx,
                                     "vbulky": vy,
                                     "vbulkz": vz,
                                     "vthx": vthx,
                                     "vthy": vthy,
                                     "vthz": vthz,
                                     "nbr_part_per_cell": nbr_part_per_cell,
                                     "init": {
                                         "seed": 1337
                                     }
                                 })

        ElectronModel(closure="isothermal", Te=0.12)

        for quantity in ["E", "B"]:
            ElectromagDiagnostics(quantity=quantity,
                                  write_timestamps=np.zeros(time_step_nbr),
                                  compute_timestamps=np.zeros(time_step_nbr))

        for quantity in ["density", "bulkVelocity"]:
            FluidDiagnostics(quantity=quantity,
                             write_timestamps=np.zeros(time_step_nbr),
                             compute_timestamps=np.zeros(time_step_nbr))

        poplist = ["protons", "beam"] if beam else ["protons"]
        for pop in poplist:
            for quantity in ["density", "flux"]:
                FluidDiagnostics(quantity=quantity,
                                 write_timestamps=np.zeros(time_step_nbr),
                                 compute_timestamps=np.zeros(time_step_nbr),
                                 population_name=pop)

            for quantity in ['domain', 'levelGhost', 'patchGhost']:
                ParticleDiagnostics(quantity=quantity,
                                    compute_timestamps=np.zeros(time_step_nbr),
                                    write_timestamps=np.zeros(time_step_nbr),
                                    population_name=pop)

        Simulator(global_vars.sim).initialize().reset()

        eb_hier = None
        if qty in ["e", "eb"]:
            eb_hier = hierarchy_from(h5_filename=diag_outputs + "/EM_E.h5",
                                     hier=eb_hier)
        if qty in ["b", "eb"]:
            eb_hier = hierarchy_from(h5_filename=diag_outputs + "/EM_B.h5",
                                     hier=eb_hier)
        if qty in ["e", "b", "eb"]:
            return eb_hier

        is_particle_type = qty == "particles" or qty == "particles_patch_ghost"

        if is_particle_type:
            particle_hier = None

        if qty == "particles":
            particle_hier = hierarchy_from(h5_filename=diag_outputs +
                                           "/ions_pop_protons_domain.h5")
            particle_hier = hierarchy_from(h5_filename=diag_outputs +
                                           "/ions_pop_protons_levelGhost.h5",
                                           hier=particle_hier)

        if is_particle_type:
            particle_hier = hierarchy_from(h5_filename=diag_outputs +
                                           "/ions_pop_protons_patchGhost.h5",
                                           hier=particle_hier)

        if qty == "particles":
            merge_particles(particle_hier)

        if is_particle_type:
            return particle_hier

        if qty == "moments":
            mom_hier = hierarchy_from(h5_filename=diag_outputs +
                                      "/ions_density.h5")
            mom_hier = hierarchy_from(h5_filename=diag_outputs +
                                      "/ions_bulkVelocity.h5",
                                      hier=mom_hier)
            mom_hier = hierarchy_from(h5_filename=diag_outputs +
                                      "/ions_pop_protons_density.h5",
                                      hier=mom_hier)
            mom_hier = hierarchy_from(h5_filename=diag_outputs +
                                      "/ions_pop_protons_flux.h5",
                                      hier=mom_hier)
            if beam:
                mom_hier = hierarchy_from(h5_filename=diag_outputs +
                                          "/ions_pop_beam_density.h5",
                                          hier=mom_hier)
                mom_hier = hierarchy_from(h5_filename=diag_outputs +
                                          "/ions_pop_beam_flux.h5",
                                          hier=mom_hier)
            return mom_hier
Example #8
0
    def getHierarchy(self,
                     interp_order,
                     refinement_boxes,
                     qty,
                     diag_outputs,
                     nbr_part_per_cell=100,
                     density=_density,
                     smallest_patch_size=None,
                     largest_patch_size=20,
                     cells=120,
                     time_step=0.001,
                     model_init={},
                     dl=0.2,
                     extra_diag_options={},
                     time_step_nbr=1,
                     timestamps=None,
                     ndim=1,
                     block_merging_particles=False):

        diag_outputs = f"phare_outputs/advance/{diag_outputs}"
        from pyphare.pharein import global_vars
        global_vars.sim = None
        if smallest_patch_size is None:
            from pyphare.pharein.simulation import check_patch_size
            _, smallest_patch_size = check_patch_size(
                ndim, interp_order=interp_order, cells=cells)

        extra_diag_options["mode"] = "overwrite"
        extra_diag_options["dir"] = diag_outputs
        self.register_diag_dir_for_cleanup(diag_outputs)
        Simulation(
            smallest_patch_size=smallest_patch_size,
            largest_patch_size=largest_patch_size,
            time_step_nbr=time_step_nbr,
            time_step=time_step,
            boundary_types=["periodic"] * ndim,
            cells=np_array_ify(cells, ndim),
            dl=np_array_ify(dl, ndim),
            interp_order=interp_order,
            refinement_boxes=refinement_boxes,
            diag_options={
                "format": "phareh5",
                "options": extra_diag_options
            },
            strict=True,
        )

        def S(x, x0, l):
            return 0.5 * (1 + np.tanh((x - x0) / l))

        def bx(*xyz):
            return 1.

        def by(*xyz):
            from pyphare.pharein.global_vars import sim
            L = sim.simulation_domain()
            _ = lambda i: 0.1 * np.cos(2 * np.pi * xyz[i] / L[i])
            return np.asarray([_(i) for i, v in enumerate(xyz)]).prod(axis=0)

        def bz(*xyz):
            from pyphare.pharein.global_vars import sim
            L = sim.simulation_domain()
            _ = lambda i: 0.1 * np.cos(2 * np.pi * xyz[i] / L[i])
            return np.asarray([_(i) for i, v in enumerate(xyz)]).prod(axis=0)

        def vx(*xyz):
            from pyphare.pharein.global_vars import sim
            L = sim.simulation_domain()
            _ = lambda i: 0.1 * np.cos(2 * np.pi * xyz[i] / L[i])
            return np.asarray([_(i) for i, v in enumerate(xyz)]).prod(axis=0)

        def vy(*xyz):
            from pyphare.pharein.global_vars import sim
            L = sim.simulation_domain()
            _ = lambda i: 0.1 * np.cos(2 * np.pi * xyz[i] / L[i])
            return np.asarray([_(i) for i, v in enumerate(xyz)]).prod(axis=0)

        def vz(*xyz):
            from pyphare.pharein.global_vars import sim
            L = sim.simulation_domain()
            _ = lambda i: 0.1 * np.cos(2 * np.pi * xyz[i] / L[i])
            return np.asarray([_(i) for i, v in enumerate(xyz)]).prod(axis=0)

        def vth(*xyz):
            return 0.01 + np.zeros_like(xyz[0])

        def vthx(*xyz):
            return vth(*xyz)

        def vthy(*xyz):
            return vth(*xyz)

        def vthz(*xyz):
            return vth(*xyz)

        MaxwellianFluidModel(bx=bx,
                             by=by,
                             bz=bz,
                             protons={
                                 "charge": 1,
                                 "density": density,
                                 "vbulkx": vx,
                                 "vbulky": vy,
                                 "vbulkz": vz,
                                 "vthx": vthx,
                                 "vthy": vthy,
                                 "vthz": vthz,
                                 "nbr_part_per_cell": nbr_part_per_cell,
                                 "init": model_init,
                             })

        ElectronModel(closure="isothermal", Te=0.12)

        if timestamps is None:
            timestamps = all_timestamps(global_vars.sim)

        for quantity in ["E", "B"]:
            ElectromagDiagnostics(quantity=quantity,
                                  write_timestamps=timestamps,
                                  compute_timestamps=timestamps)

        for quantity in ["density", "bulkVelocity"]:
            FluidDiagnostics(quantity=quantity,
                             write_timestamps=timestamps,
                             compute_timestamps=timestamps)

        poplist = ["protons"]
        for pop in poplist:
            for quantity in ["density", "flux"]:
                FluidDiagnostics(quantity=quantity,
                                 write_timestamps=timestamps,
                                 compute_timestamps=timestamps,
                                 population_name=pop)

            for quantity in ['domain', 'levelGhost', 'patchGhost']:
                ParticleDiagnostics(quantity=quantity,
                                    compute_timestamps=timestamps,
                                    write_timestamps=timestamps,
                                    population_name=pop)

        Simulator(global_vars.sim).run()

        eb_hier = None
        if qty in ["e", "eb", "fields"]:
            eb_hier = hierarchy_from(h5_filename=diag_outputs + "/EM_E.h5",
                                     hier=eb_hier)
        if qty in ["b", "eb", "fields"]:
            eb_hier = hierarchy_from(h5_filename=diag_outputs + "/EM_B.h5",
                                     hier=eb_hier)
        if qty in ["e", "b", "eb"]:
            return eb_hier

        is_particle_type = qty == "particles" or qty == "particles_patch_ghost"

        if is_particle_type:
            particle_hier = None

        if qty == "particles":
            particle_hier = hierarchy_from(h5_filename=diag_outputs +
                                           "/ions_pop_protons_domain.h5")
            particle_hier = hierarchy_from(h5_filename=diag_outputs +
                                           "/ions_pop_protons_levelGhost.h5",
                                           hier=particle_hier)

        if is_particle_type:
            particle_hier = hierarchy_from(h5_filename=diag_outputs +
                                           "/ions_pop_protons_patchGhost.h5",
                                           hier=particle_hier)

        if not block_merging_particles and qty == "particles":
            merge_particles(particle_hier)

        if is_particle_type:
            return particle_hier

        if qty == "moments" or qty == "fields":
            mom_hier = hierarchy_from(h5_filename=diag_outputs +
                                      "/ions_density.h5",
                                      hier=eb_hier)
            mom_hier = hierarchy_from(h5_filename=diag_outputs +
                                      "/ions_bulkVelocity.h5",
                                      hier=mom_hier)
            mom_hier = hierarchy_from(h5_filename=diag_outputs +
                                      "/ions_pop_protons_density.h5",
                                      hier=mom_hier)
            mom_hier = hierarchy_from(h5_filename=diag_outputs +
                                      "/ions_pop_protons_flux.h5",
                                      hier=mom_hier)
            return mom_hier
Example #9
0
def get_time(path, time):
    if time is not None:
        time = "{:.10f}".format(time)
    from pyphare.pharesee.hierarchy import hierarchy_from
    return hierarchy_from(h5_filename=path + "/ions_pop_protons_domain.h5",
                          time=time)
Example #10
0
    def _test_dump_diags(self, dim, **simInput):
        test_id = self.ddt_test_id()

        # configure simulation dim sized values
        for key in ["cells", "dl", "boundary_types"]:
            simInput[key] = [simInput[key] for d in range(dim)]

        b0 = [[10 for i in range(dim)], [19 for i in range(dim)]]
        simInput["refinement_boxes"] = {"L0": {"B0": b0}}

        py_attrs = [
            f"{dep}_version" for dep in ["samrai", "highfive", "pybind"]
        ]
        py_attrs += ["git_hash"]

        for interp in range(1, 4):
            print("test_dump_diags dim/interp:{}/{}".format(dim, interp))

            local_out = f"{out}_dim{dim}_interp{interp}_mpi_n_{cpp.mpi_size()}_id{test_id}"
            simInput["diag_options"]["options"]["dir"] = local_out

            simulation = ph.Simulation(**simInput)
            self.assertTrue(len(simulation.cells) == dim)

            dump_all_diags(setup_model().populations)
            self.simulator = Simulator(
                simulation).initialize().advance().reset()

            refined_particle_nbr = simulation.refined_particle_nbr

            self.assertTrue(
                any([
                    diagInfo.quantity.endswith("domain")
                    for diagInfo in ph.global_vars.sim.diagnostics
                ]))

            particle_files = 0
            for diagInfo in ph.global_vars.sim.diagnostics:
                h5_filepath = os.path.join(local_out,
                                           h5_filename_from(diagInfo))
                self.assertTrue(os.path.exists(h5_filepath))

                h5_file = h5py.File(h5_filepath, "r")

                self.assertTrue("0.0000000000"
                                in h5_file[h5_time_grp_key])  # init dump
                self.assertTrue(
                    "0.0010000000"
                    in h5_file[h5_time_grp_key])  # first advance dump

                h5_py_attrs = h5_file["py_attrs"].attrs.keys()
                for py_attr in py_attrs:
                    self.assertIn(py_attr, h5_py_attrs)

                hier = hierarchy_from(h5_filename=h5_filepath)
                if h5_filepath.endswith("domain.h5"):
                    particle_files += 1
                    self.assertTrue("pop_mass" in h5_file.attrs)

                    if "protons" in h5_filepath:
                        self.assertTrue(h5_file.attrs["pop_mass"] == 1)
                    elif "alpha" in h5_filepath:
                        self.assertTrue(h5_file.attrs["pop_mass"] == 4)
                    else:
                        raise RuntimeError("Unknown population")

                    self.assertGreater(len(hier.level(0).patches), 0)

                    for patch in hier.level(0).patches:
                        self.assertTrue(len(patch.patch_datas.items()))
                        for qty_name, pd in patch.patch_datas.items():
                            splits = pd.dataset.split(ph.global_vars.sim)
                            self.assertTrue(splits.size() > 0)
                            self.assertTrue(pd.dataset.size() > 0)
                            self.assertTrue(
                                splits.size() == pd.dataset.size() *
                                refined_particle_nbr)

            self.assertEqual(particle_files,
                             ph.global_vars.sim.model.nbr_populations())

            self.simulator = None
            ph.global_vars.sim = None
Example #11
0
    def getHierarchy(self, interp_order, refinement_boxes, qty, nbr_part_per_cell=100,
                     diag_outputs="phare_outputs",
                     smallest_patch_size=5, largest_patch_size=20,
                     cells=120, time_step=0.001, model_init={},
                     dl=0.1, extra_diag_options={}, time_step_nbr=1, timestamps=None):

        from pyphare.pharein import global_vars
        global_vars.sim = None
        startMPI()
        extra_diag_options["mode"] = "overwrite"
        extra_diag_options["dir"] = diag_outputs
        Simulation(
            smallest_patch_size=smallest_patch_size,
            largest_patch_size=largest_patch_size,
            time_step_nbr=time_step_nbr,
            time_step=time_step,
            boundary_types="periodic",
            cells=cells,
            dl=dl,
            interp_order=interp_order,
            refinement_boxes=refinement_boxes,
            diag_options={"format": "phareh5",
                          "options": extra_diag_options}
        )

        def density(x):
            return 1.

        def S(x,x0,l):
            return 0.5*(1+np.tanh((x-x0)/l))

        def bx(x):
            return 1.

        def by(x):
            L = global_vars.sim.simulation_domain()[0]
            v1=-1
            v2=1.
            return v1 + (v2-v1)*(S(x,L*0.25,1) -S(x, L*0.75, 1))

        def bz(x):
            return 0.5

        def b2(x):
            return bx(x)**2 + by(x)**2 + bz(x)**2

        def T(x):
            K = 1
            return 1/density(x)*(K - b2(x)*0.5)

        def vx(x):
            return 0.

        def vy(x):
            return 0.

        def vz(x):
            return 0.

        def vthx(x):
            return T(x)

        def vthy(x):
            return T(x)

        def vthz(x):
            return T(x)


        MaxwellianFluidModel(bx=bx, by=by, bz=bz,
                             protons={"charge": 1,
                                      "density": density,
                                      "vbulkx": vx, "vbulky": vy, "vbulkz": vz,
                                      "vthx": vthx, "vthy": vthy, "vthz": vthz,
                                      "nbr_part_per_cell": nbr_part_per_cell,
                                      "init": model_init})

        ElectronModel(closure="isothermal", Te=0.12)

        if timestamps is None:
            timestamps = np.arange(0, global_vars.sim.final_time + global_vars.sim.time_step, global_vars.sim.time_step)

        for quantity in ["E", "B"]:
            ElectromagDiagnostics(
                quantity=quantity,
                write_timestamps=timestamps,
                compute_timestamps=timestamps
            )

        for quantity in ["density", "bulkVelocity"]:
            FluidDiagnostics(
                quantity=quantity,
                write_timestamps=timestamps,
                compute_timestamps=timestamps
            )

        poplist = ["protons"]
        for pop in poplist:
            for quantity in ["density", "flux"]:
                FluidDiagnostics(quantity=quantity,
                                 write_timestamps=timestamps,
                                 compute_timestamps=timestamps,
                                 population_name=pop)

            for quantity in ['domain', 'levelGhost', 'patchGhost']:
                ParticleDiagnostics(quantity=quantity,
                                    compute_timestamps=timestamps,
                                    write_timestamps=timestamps,
                                    population_name=pop)

        Simulator(global_vars.sim).initialize().run()

        eb_hier = None
        if qty in ["e", "eb"]:
            eb_hier = hierarchy_from(h5_filename=diag_outputs+"/EM_E.h5", hier=eb_hier)
        if qty in ["b", "eb"]:
            eb_hier = hierarchy_from(h5_filename=diag_outputs+"/EM_B.h5", hier=eb_hier)
        if qty in ["e", "b", "eb"]:
            return eb_hier

        is_particle_type = qty == "particles" or qty == "particles_patch_ghost"

        if is_particle_type:
            particle_hier = None

        if qty == "particles":
            particle_hier = hierarchy_from(h5_filename=diag_outputs+"/ions_pop_protons_domain.h5")
            particle_hier = hierarchy_from(h5_filename=diag_outputs+"/ions_pop_protons_levelGhost.h5", hier=particle_hier)

        if is_particle_type:
            particle_hier = hierarchy_from(h5_filename=diag_outputs+"/ions_pop_protons_patchGhost.h5", hier=particle_hier)

        if qty == "particles":
            merge_particles(particle_hier)

        if is_particle_type:
            return particle_hier

        if qty == "moments":
            mom_hier = hierarchy_from(h5_filename=diag_outputs+"/ions_density.h5")
            mom_hier = hierarchy_from(h5_filename=diag_outputs+"/ions_bulkVelocity.h5", hier=mom_hier)
            mom_hier = hierarchy_from(h5_filename=diag_outputs+"/ions_pop_protons_density.h5", hier=mom_hier)
            mom_hier = hierarchy_from(h5_filename=diag_outputs+"/ions_pop_protons_flux.h5", hier=mom_hier)
            return mom_hier