diff --git a/doc/conventions.md b/doc/conventions.md
new file mode 100644
index 000000000..fc36e63e0
--- /dev/null
+++ b/doc/conventions.md
@@ -0,0 +1,79 @@
+# PHARE Conventions
+
+### Reference document for the code base
+
+
+# Sections
+
+1. C++
+2. Python
+3. CMake
+4. Tests
+5. Etc
+
+
+
+# 1. C++
+
+## 1.1 General
+
+...
+
+
+
+
+# 2. Python
+
+## 2.1 General
+
+...
+
+## 2.2 dependencies and imports
+
+Third party depenencies are stated in the file `requirements.txt` in the project root.
+Fewer dependencies is generally better but there should be a cost/benefit assessment for adding new dependencies.
+
+### 2.2.1 Python file import structure.
+
+Generally, we want to avoid importing any dependency at the top of a python script that may rely on binary libraries.
+
+Exceptions to this are things like numpy, which are widely used and tested.
+
+Things to expressly avoid importing at the top of a python script are
+
+- h5py
+- mpi4py
+- scipy.optimize
+
+The first two are noted as they can, and will pull in system libraries such as libmpi.so and libhdf5.so, which may not be the libraries which were used during PHARE build time, this can cause issues at runtime.
+
+scipy.optimize relies on system libraries which may not be available at runtime.
+
+The gist here is to only import these libraries at function scope when you actually need them, so that python files can be imported
+or scanned for tests and not cause issues during these operations, until the functions are used at least.
+
+
+
+# 3. CMake
+
+## 3.1 General
+
+...
+
+
+
+
+# 4. Tests
+
+## 4.1 General
+
+...
+
+
+
+# 5. Etc
+
+## 5.1 General
+
+...
+
diff --git a/pyphare/pyphare/cpp/__init__.py b/pyphare/pyphare/cpp/__init__.py
index c66b11d38..e654bef75 100644
--- a/pyphare/pyphare/cpp/__init__.py
+++ b/pyphare/pyphare/cpp/__init__.py
@@ -3,27 +3,10 @@
#
-import json
-
-# continue to use override if set
-_cpp_lib_override = None
-
-
def cpp_lib(override=None):
import importlib
- global _cpp_lib_override
- if override is not None:
- _cpp_lib_override = override
- if _cpp_lib_override is not None:
- return importlib.import_module(_cpp_lib_override)
-
- if not __debug__:
- return importlib.import_module("pybindlibs.cpp")
- try:
- return importlib.import_module("pybindlibs.cpp_dbg")
- except ImportError:
- return importlib.import_module("pybindlibs.cpp")
+ return importlib.import_module("pybindlibs.cpp")
def cpp_etc_lib():
@@ -37,6 +20,8 @@ def build_config():
def build_config_as_json():
+ import json
+
return json.dumps(build_config())
diff --git a/pyphare/pyphare/pharesee/hierarchy/fromh5.py b/pyphare/pyphare/pharesee/hierarchy/fromh5.py
index f79c0cbc3..fd3266d4e 100644
--- a/pyphare/pyphare/pharesee/hierarchy/fromh5.py
+++ b/pyphare/pyphare/pharesee/hierarchy/fromh5.py
@@ -15,7 +15,7 @@
)
from ...core.gridlayout import GridLayout
from .hierarchy_utils import field_qties
-import h5py
+
from pathlib import Path
from pyphare.core.phare_utilities import listify
@@ -129,6 +129,8 @@ def h5_filename_from(diagInfo):
def get_times_from_h5(filepath, as_float=True):
+ import h5py # see doc/conventions.md section 2.1.1
+
f = h5py.File(filepath, "r")
if as_float:
times = np.array(sorted([float(s) for s in list(f[h5_time_grp_key].keys())]))
@@ -216,6 +218,7 @@ def add_time_from_h5(hier, filepath, time, **kwargs):
# add times to 'hier'
# we may have a different selection box for that time as for already existing times
# but we need to keep them, per time
+ import h5py # see doc/conventions.md section 2.1.1
h5f = h5py.File(filepath, "r")
selection_box = kwargs.get("selection_box", None)
@@ -239,6 +242,8 @@ def add_data_from_h5(hier, filepath, time):
if not hier.has_time(time):
raise ValueError("time does not exist in hierarchy")
+ import h5py # see doc/conventions.md section 2.1.1
+
h5f = h5py.File(filepath, "r")
# force using the hierarchy selection box at that time if existing
@@ -260,6 +265,8 @@ def new_from_h5(filepath, times, **kwargs):
# loads all datasets from the filepath h5 file as patchdatas
# we authorize user to pass only one selection box for all times
# but in this case they're all the same
+ import h5py # see doc/conventions.md section 2.1.1
+
selection_box = kwargs.get("selection_box", [None] * len(times))
if none_iterable(selection_box) and all_iterables(times):
selection_box = [selection_box] * len(times)
diff --git a/src/python3/CMakeLists.txt b/src/python3/CMakeLists.txt
index b6f7f220e..a05c0574c 100644
--- a/src/python3/CMakeLists.txt
+++ b/src/python3/CMakeLists.txt
@@ -13,18 +13,6 @@ set_target_properties(cpp
set_property(TARGET cpp PROPERTY INTERPROCEDURAL_OPTIMIZATION ${PHARE_INTERPROCEDURAL_OPTIMIZATION})
set_property(TARGET cpp APPEND_STRING PROPERTY LINK_FLAGS " ${PHARE_LINK_FLAGS}")
-if (CMAKE_BUILD_TYPE STREQUAL "Debug")
- pybind11_add_module(cpp_dbg cpp_simulator.cpp)
- target_link_libraries(cpp_dbg PUBLIC phare_simulator)
- target_compile_options(cpp_dbg PRIVATE ${PHARE_WERROR_FLAGS} -DPHARE_HAS_HIGHFIVE=${PHARE_HAS_HIGHFIVE} -DPHARE_DIAG_DOUBLES=1 -DPHARE_CPP_MOD_NAME=cpp_dbg)
- set_target_properties(cpp_dbg
- PROPERTIES
- LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/pybindlibs"
- )
- set_property(TARGET cpp_dbg PROPERTY INTERPROCEDURAL_OPTIMIZATION ${PHARE_INTERPROCEDURAL_OPTIMIZATION})
- set_property(TARGET cpp_dbg APPEND_STRING PROPERTY LINK_FLAGS " ${PHARE_LINK_FLAGS}")
-endif (CMAKE_BUILD_TYPE STREQUAL "Debug")
-
pybind11_add_module(cpp_etc cpp_etc.cpp)
target_compile_options(cpp_etc PRIVATE ${PHARE_WERROR_FLAGS} -DPHARE_HAS_HIGHFIVE=${PHARE_HAS_HIGHFIVE})
diff --git a/tests/amr/data/field/refine/test_refine_field.py b/tests/amr/data/field/refine/test_refine_field.py
index 188f80191..4f3d8d9da 100644
--- a/tests/amr/data/field/refine/test_refine_field.py
+++ b/tests/amr/data/field/refine/test_refine_field.py
@@ -5,8 +5,6 @@
from pyphare.core.phare_utilities import refinement_ratio
from pyphare.pharesee.hierarchy.patchdata import FieldData
-# in this module, we assume the refinement ratio is 2
-refinement_ratio = 2
# below is a drawing representing a 1D coarse FieldData, its ghost box and the
# associated refined FieldData this module aims at creating.
diff --git a/tests/core/data/gridlayout/allocSizes.py b/tests/core/data/gridlayout/allocSizes.py
index dddb39e4c..57cf9a39d 100644
--- a/tests/core/data/gridlayout/allocSizes.py
+++ b/tests/core/data/gridlayout/allocSizes.py
@@ -9,10 +9,9 @@
import os
import sys
-
-print(sys.path)
-import gridparams
import utilities
+import gridparams
+
from pyphare.core import gridlayout
@@ -69,7 +68,6 @@ def main(path="./"):
gl = gridlayout.GridLayout()
- directions = gl.directions
quantities = [
"Bx",
"By",
@@ -97,8 +95,6 @@ def main(path="./"):
dyList = [0.0, 0.1, 0.1]
dzList = [0.0, 0.0, 0.1]
- maxNbrDim = 3
-
baseName = "allocSizes"
# out_1D = open(os.path.join(path, baseName + '_1d.txt'), 'w')
diff --git a/tests/core/data/gridlayout/deriv.py b/tests/core/data/gridlayout/deriv.py
index fd850576f..9abb324b2 100644
--- a/tests/core/data/gridlayout/deriv.py
+++ b/tests/core/data/gridlayout/deriv.py
@@ -1,18 +1,17 @@
#!/usr/bin/env python
#!coding: utf-8
-import numpy as np
+import os
+import sys
import math
import scipy.misc
-
-import sys
+import numpy as np
from pyphare.core import gridlayout
-import os
-import gridparams
-import cellCenteredCoordinates
+
import utilities
import fieldNodeCoordinates
+import cellCenteredCoordinates
class DerivParams(cellCenteredCoordinates.CenteredCoordParams):
diff --git a/tests/core/data/gridlayout/fieldNodeCoordinates.py b/tests/core/data/gridlayout/fieldNodeCoordinates.py
index f37cc535c..4146fac0c 100644
--- a/tests/core/data/gridlayout/fieldNodeCoordinates.py
+++ b/tests/core/data/gridlayout/fieldNodeCoordinates.py
@@ -1,17 +1,14 @@
#!/usr/bin/env python
#!coding: utf-8
-import numpy as np
-
-# import math
+import os
import sys
+import utilities
+import numpy as np
+import cellCenteredCoordinates
from pyphare.core import gridlayout
-import os
-import gridparams
-import cellCenteredCoordinates
-import utilities
# TODO : FieldNode coords is general case of cellCenteredCoord
# Which means this has to be fully refactor
diff --git a/tests/core/data/gridlayout/gridIndexing.py b/tests/core/data/gridlayout/gridIndexing.py
index 1bb61fc42..de2748406 100644
--- a/tests/core/data/gridlayout/gridIndexing.py
+++ b/tests/core/data/gridlayout/gridIndexing.py
@@ -6,15 +6,14 @@
quantities and for all interpolation orders (1,2,3,4), in 1D, 2D and 3D.
"""
-import numpy as np
-import sys
-
-from pyphare.core import gridlayout
import os
+import sys
import utilities
import gridparams
+from pyphare.core import gridlayout
+
class IndexingParams(gridparams.GridParams):
def __init__(self, dim, interpOrder):
@@ -94,7 +93,6 @@ def main(path="./"):
gl = gridlayout.GridLayout()
- directions = gl.directions
quantities = [
"Bx",
"By",
@@ -122,8 +120,6 @@ def main(path="./"):
dyList = [0.0, 0.1, 0.1]
dzList = [0.0, 0.0, 0.1]
- maxNbrDim = 3
-
baseName = "gridIndexing"
outFilenameBase = os.path.join(path, baseName)
diff --git a/tests/core/data/gridlayout/test_linear_combinaisons_yee.py b/tests/core/data/gridlayout/test_linear_combinaisons_yee.py
index b4d5d6de3..c12c03dc8 100644
--- a/tests/core/data/gridlayout/test_linear_combinaisons_yee.py
+++ b/tests/core/data/gridlayout/test_linear_combinaisons_yee.py
@@ -1,11 +1,11 @@
#!/usr/bin/env pyhton
#!coding: utf-8
-import numpy as np
-import utilities
+
import os
import sys
+
# this script writes the following file
# in 1D, in 2D and in 3D :
# {dim} {interpOrder_i} ExToMoment
diff --git a/tests/diagnostic/__init__.py b/tests/diagnostic/__init__.py
index 370bfe7a3..421fa0dda 100644
--- a/tests/diagnostic/__init__.py
+++ b/tests/diagnostic/__init__.py
@@ -13,7 +13,7 @@ def all_timestamps(sim):
def dump_all_diags(pops=[], flush_every=100, timestamps=None):
- import pyphare.pharein as ph, numpy as np
+ import pyphare.pharein as ph
sim = ph.global_vars.sim
@@ -35,9 +35,7 @@ def dump_all_diags(pops=[], flush_every=100, timestamps=None):
"pressure_tensor",
]:
ph.FluidDiagnostics(
- quantity=quantity,
- write_timestamps=timestamps,
- flush_every=flush_every,
+ quantity=quantity, write_timestamps=timestamps, flush_every=flush_every
)
for pop in pops:
@@ -59,7 +57,5 @@ def dump_all_diags(pops=[], flush_every=100, timestamps=None):
for quantity in ["E", "B"]:
ph.ElectromagDiagnostics(
- quantity=quantity,
- write_timestamps=timestamps,
- flush_every=flush_every,
+ quantity=quantity, write_timestamps=timestamps, flush_every=flush_every
)
diff --git a/tests/diagnostic/job_1d.py.in b/tests/diagnostic/job_1d.py.in
index 66937087a..1a8b5e8b9 100644
--- a/tests/diagnostic/job_1d.py.in
+++ b/tests/diagnostic/job_1d.py.in
@@ -1,14 +1,16 @@
#!/usr/bin/env python3
import pyphare.pharein as ph
-from pyphare.pharein import ElectronModel
-from tests.simulator import basicSimulatorArgs, makeBasicModel
+
from tests.diagnostic import dump_all_diags
+from tests.simulator import basicSimulatorArgs, makeBasicModel
out = "phare_outputs/diags_1d/"
-simInput = {"diag_options": {"format": "phareh5", "options": {"dir": out, "mode" : "overwrite"}}}
+simInput = {
+ "diag_options": {"format": "phareh5", "options": {"dir": out, "mode": "overwrite"}}
+}
-ph.Simulation(**basicSimulatorArgs(dim = 1, interp = 1, **simInput))
+ph.Simulation(**basicSimulatorArgs(dim=1, interp=1, **simInput))
model = makeBasicModel()
-ElectronModel(closure="isothermal",Te = 0.12)
+ph.ElectronModel(closure="isothermal", Te=0.12)
dump_all_diags(model.populations)
diff --git a/tests/diagnostic/job_2d.py.in b/tests/diagnostic/job_2d.py.in
index 21712c2c7..921b4fb4c 100644
--- a/tests/diagnostic/job_2d.py.in
+++ b/tests/diagnostic/job_2d.py.in
@@ -1,14 +1,16 @@
#!/usr/bin/env python3
import pyphare.pharein as ph
-from pyphare.pharein import ElectronModel
-from tests.simulator import basicSimulatorArgs, makeBasicModel
+
from tests.diagnostic import dump_all_diags
+from tests.simulator import basicSimulatorArgs, makeBasicModel
out = "phare_outputs/diags_2d/"
-simInput = {"diag_options": {"format": "phareh5", "options": {"dir": out, "mode" : "overwrite"}}}
+simInput = {
+ "diag_options": {"format": "phareh5", "options": {"dir": out, "mode": "overwrite"}}
+}
-ph.Simulation(**basicSimulatorArgs(dim = 2, interp = 1, **simInput))
+ph.Simulation(**basicSimulatorArgs(dim=2, interp=1, **simInput))
model = makeBasicModel()
-ElectronModel(closure="isothermal",Te = 0.12)
+ph.ElectronModel(closure="isothermal", Te=0.12)
dump_all_diags(model.populations)
diff --git a/tests/functional/alfven_wave/alfven_wave1d.py b/tests/functional/alfven_wave/alfven_wave1d.py
index 1fe582bc1..fc9e29316 100644
--- a/tests/functional/alfven_wave/alfven_wave1d.py
+++ b/tests/functional/alfven_wave/alfven_wave1d.py
@@ -6,13 +6,11 @@
from pyphare.pharesee.run import Run
-from tests.diagnostic import all_timestamps
-
-import matplotlib.pyplot as plt
-import matplotlib as mpl
import numpy as np
+import matplotlib.pyplot as plt
+
-mpl.use("Agg")
+ph.NO_GUI()
####################################################################
diff --git a/tests/functional/harris/harris_2d.py b/tests/functional/harris/harris_2d.py
index 894493023..86773443e 100644
--- a/tests/functional/harris/harris_2d.py
+++ b/tests/functional/harris/harris_2d.py
@@ -1,8 +1,7 @@
#!/usr/bin/env python3
-import os
+
import numpy as np
-import matplotlib as mpl
from pathlib import Path
import pyphare.pharein as ph
@@ -12,7 +11,7 @@
from tests.simulator import SimulatorTest
-mpl.use("Agg")
+ph.NO_GUI()
cpp = cpp_lib()
diff --git a/tests/functional/ionIonBeam/ion_ion_beam1d.py b/tests/functional/ionIonBeam/ion_ion_beam1d.py
index 75d2f9faa..8ebd4a7f4 100644
--- a/tests/functional/ionIonBeam/ion_ion_beam1d.py
+++ b/tests/functional/ionIonBeam/ion_ion_beam1d.py
@@ -1,19 +1,17 @@
import os
+import numpy as np
import pyphare.pharein as ph
+import matplotlib.pyplot as plt
+
+from pyphare.cpp import cpp_lib
from pyphare.simulator.simulator import Simulator
from pyphare.pharesee.hierarchy.fromh5 import get_times_from_h5
from pyphare.pharesee.run import Run
+ph.NO_GUI()
-import matplotlib.pyplot as plt
-import matplotlib as mpl
-import numpy as np
-from scipy.optimize import curve_fit
-from scipy.signal import find_peaks
-
-
-mpl.use("Agg")
+cpp = cpp_lib()
def config():
@@ -108,6 +106,9 @@ def yaebx(x, a, b):
def growth_b_right_hand(run_path, time_offset):
+ from scipy.optimize import curve_fit
+ from scipy.signal import find_peaks
+
file = os.path.join(run_path, "EM_B.h5")
times = get_times_from_h5(file)
dt = times[1] - times[0]
@@ -163,7 +164,7 @@ def growth_b_right_hand(run_path, time_offset):
def main():
- from pybindlibs.cpp import mpi_rank
+ from scipy.signal import find_peaks
time_offset = 10.0
# this is an offset so the exponential fit associated to the linear phase is not performed
@@ -172,7 +173,7 @@ def main():
Simulator(config()).run()
- if mpi_rank() == 0:
+ if cpp.mpi_rank() == 0:
times, first_mode, ampl, gamma, damped_mode, omega = growth_b_right_hand(
os.path.join(os.curdir, "ion_ion_beam1d"), time_offset
)
diff --git a/tests/functional/shock/shock.py b/tests/functional/shock/shock.py
index 6cc63f297..092407773 100644
--- a/tests/functional/shock/shock.py
+++ b/tests/functional/shock/shock.py
@@ -12,7 +12,6 @@
from pyphare.cpp import cpp_lib
cpp = cpp_lib()
-startMPI()
def config(interp_order):
@@ -176,4 +175,5 @@ def main():
if __name__ == "__main__":
+ startMPI()
main()
diff --git a/tests/functional/td/td1d.py b/tests/functional/td/td1d.py
index e21d9f28d..cad492dc0 100644
--- a/tests/functional/td/td1d.py
+++ b/tests/functional/td/td1d.py
@@ -1,14 +1,10 @@
#!/usr/bin/env python3
+import numpy as np
import pyphare.pharein as ph
from pyphare.simulator.simulator import Simulator
-
-import matplotlib.pyplot as plt
-import matplotlib as mpl
-import numpy as np
-
-mpl.use("Agg")
+ph.NO_GUI()
def config():
diff --git a/tests/functional/tdtagged/td1dtagged.py b/tests/functional/tdtagged/td1dtagged.py
index 35ab9ec36..248e9f4f2 100644
--- a/tests/functional/tdtagged/td1dtagged.py
+++ b/tests/functional/tdtagged/td1dtagged.py
@@ -198,7 +198,6 @@ def by(x):
# draw level patches
for ilvl, level in BH.levels().items():
for patch in level.patches:
- dx = patch.layout.dl[0]
x0 = patch.origin[0]
x1 = (patch.box.upper[0] + 1) * patch.layout.dl[0]
for ax in (ax1, ax2, ax0):
diff --git a/tests/functional/translation/translat1d.py b/tests/functional/translation/translat1d.py
index 6a5321698..cbb2eeef4 100644
--- a/tests/functional/translation/translat1d.py
+++ b/tests/functional/translation/translat1d.py
@@ -1,17 +1,13 @@
#!/usr/bin/env python3
+import numpy as np
import pyphare.pharein as ph
from pyphare.simulator.simulator import Simulator
-import numpy as np
-import matplotlib.pyplot as plt
-import matplotlib as mpl
-
-mpl.use("Agg")
-
-
from tests.diagnostic import all_timestamps
+ph.NO_GUI()
+
def config_uni(**kwargs):
"""Configure the simulation
diff --git a/tests/initializer/job.py b/tests/initializer/job.py
index 2f4f363a7..9166f0131 100644
--- a/tests/initializer/job.py
+++ b/tests/initializer/job.py
@@ -1,14 +1,10 @@
#!/usr/bin/env python3
-import pyphare.pharein
-from pyphare.pharein import Simulation
-from pyphare.pharein import MaxwellianFluidModel
-from pyphare.pharein import ElectromagDiagnostics
-from pyphare.pharein import ElectronModel
+import pyphare.pharein as ph
# configure the simulation
-Simulation(
+ph.Simulation(
smallest_patch_size=10,
largest_patch_size=64,
time_step_nbr=1000, # number of time steps (not specified if time_step and final_time provided)
@@ -40,7 +36,7 @@
"vthz": vthz,
}
-MaxwellianFluidModel(
+ph.MaxwellianFluidModel(
bx=bx,
by=by,
bz=bz,
@@ -48,4 +44,4 @@
alpha={"charge": 1, "density": density, **vvv, "init": {"seed": 2}},
)
-ElectronModel(closure="isothermal", Te=0.12)
+ph.ElectronModel(closure="isothermal", Te=0.12)
diff --git a/tests/simulator/__init__.py b/tests/simulator/__init__.py
index 5c100634c..3e131f81a 100644
--- a/tests/simulator/__init__.py
+++ b/tests/simulator/__init__.py
@@ -1,7 +1,12 @@
+#
+#
+
import os
import unittest
+import numpy as np
from datetime import datetime
-import pyphare.pharein as ph, numpy as np
+
+import pyphare.pharein as ph
from pyphare.pharein import ElectronModel
@@ -192,55 +197,6 @@ def _diff(slice0):
return boxes
-#
-#
-
-
-def caliper_func_times_json(data_dir, mpi_rank=0):
- return f"{os.path.join(data_dir, f'func_times.{mpi_rank}.json')}"
-
-
-def caliper_recorder_cali(data_dir, mpi_rank=0):
- return f"{os.path.join(data_dir, f'recorder.{mpi_rank}.cali')}"
-
-
-CALIPER_MODES = [
- # "callpath:event:recorder:trace",
- "report,event,trace,timestamp,recorder", # light
- "alloc,aggregate,cpuinfo,memusage,debug,env,event,loop_monitor,region_monitor,textlog,io,pthread,sysalloc,recorder,report,timestamp,statistics,spot,trace,validator,mpi,mpireport,mpiflush", # heavy
-]
-
-
-def activate_caliper(data_dir, mode_idx=0):
- from pyphare.cpp import cpp_lib
-
- rank = cpp_lib().mpi_rank()
- env = os.environ
-
- # env["CALI_SERVICES_ENABLE"] = "event,trace,timer,report"
- # env["CALI_REPORT_CONFIG"] = "format json"
- # env["CALI_REPORT_FILENAME"] = "trace.json"
-
- # env[
- # "CALI_CONFIG"
- # ] = "hatchet-region-profile,topdown-counters.all,output.format=json"
-
- # # env["CALI_CONFIG_PROFILE"] = "callstack-trace"
- # env["CALI_SERVICES_ENABLE"] = CALIPER_MODES[mode_idx]
-
- # env["CALI_CONFIG"] = "hatchet-region-profile"
-
- # # env["CALI_CALLPATH_USE_NAME"] = "true"
-
- # env["CALI_REPORT_FILENAME"] = caliper_func_times_json(data_dir, rank)
- # env[
- # "CALI_REPORT_CONFIG"
- # ] = "SELECT function,time.duration ORDER BY time.duration FORMAT json"
- # env["CALI_RECORDER_FILENAME"] = caliper_recorder_cali(data_dir, rank)
-
- # print("os.environ", os.environ)
-
-
class SimulatorTest(unittest.TestCase):
test_kwargs = ["rethrow"]
diff --git a/tests/simulator/data_wrangler.py b/tests/simulator/data_wrangler.py
index 00a453ff0..f8fad0afb 100644
--- a/tests/simulator/data_wrangler.py
+++ b/tests/simulator/data_wrangler.py
@@ -3,13 +3,16 @@
# formatted with black
+import unittest
+import numpy as np
+
from pyphare.cpp import cpp_lib
+from pyphare.simulator.simulator import Simulator
-cpp = cpp_lib()
from tests.simulator import populate_simulation
-import numpy as np
-from pyphare.simulator.simulator import Simulator
-import unittest
+
+cpp = cpp_lib()
+
# TODO - validate data from somewhere!
diff --git a/tests/simulator/refined_particle_nbr.py b/tests/simulator/refined_particle_nbr.py
index 95e21dda9..51182f07f 100644
--- a/tests/simulator/refined_particle_nbr.py
+++ b/tests/simulator/refined_particle_nbr.py
@@ -2,22 +2,22 @@
#
# formatted with black
-from pyphare.cpp import cpp_lib
-
-cpp = cpp_lib()
import os
import sys
+import yaml
import unittest
-
import numpy as np
-import yaml
+
+from pyphare.cpp import cpp_lib
from pyphare.cpp import splitter_type
from pyphare.simulator.simulator import Simulator
from tests.simulator import NoOverwriteDict, populate_simulation
from tests.simulator.config import project_root
+cpp = cpp_lib()
+
class SimulatorRefinedParticleNbr(unittest.TestCase):
def __init__(self, *args, **kwargs):
diff --git a/tests/simulator/refinement/test_2d_10_core.py b/tests/simulator/refinement/test_2d_10_core.py
index e96007a3a..79c1aab5b 100644
--- a/tests/simulator/refinement/test_2d_10_core.py
+++ b/tests/simulator/refinement/test_2d_10_core.py
@@ -9,13 +9,12 @@
"""
-import matplotlib as mpl
import numpy as np
-import pyphare.core.box as boxm
import pyphare.pharein as ph
+import pyphare.core.box as boxm
from pyphare.simulator.simulator import Simulator, startMPI
-mpl.use("Agg")
+ph.NO_GUI()
def config(diag_outputs, model_init={}, refinement_boxes=None):
diff --git a/tests/simulator/refinement/test_2d_2_core.py b/tests/simulator/refinement/test_2d_2_core.py
index 066ca4b96..22e0400ae 100644
--- a/tests/simulator/refinement/test_2d_2_core.py
+++ b/tests/simulator/refinement/test_2d_2_core.py
@@ -9,13 +9,16 @@
"""
-import matplotlib as mpl
import numpy as np
-import pyphare.core.box as boxm
+
import pyphare.pharein as ph
+from pyphare.cpp import cpp_lib
+import pyphare.core.box as boxm
from pyphare.simulator.simulator import Simulator, startMPI
-mpl.use("Agg")
+from tests.simulator.test_advance import AdvanceTestBase
+
+ph.NO_GUI()
def config(diag_outputs, model_init={}, refinement_boxes=None):
@@ -144,10 +147,6 @@ def get_hier(path):
return get_time(path)
-from pyphare.cpp import cpp_lib
-
-from tests.simulator.test_advance import AdvanceTestBase
-
cpp = cpp_lib()
test = AdvanceTestBase(rethrow=True) # change to False for debugging images
L0_diags = "phare_outputs/test_homo_0"
diff --git a/tests/simulator/test_advance.py b/tests/simulator/test_advance.py
index 85b15faa5..e3eab36db 100644
--- a/tests/simulator/test_advance.py
+++ b/tests/simulator/test_advance.py
@@ -1,12 +1,13 @@
-from pyphare.cpp import cpp_lib
+#
+#
-cpp = cpp_lib()
import unittest
-
import numpy as np
-import pyphare.core.box as boxm
from ddt import ddt
+import pyphare.core.box as boxm
+
+from pyphare.cpp import cpp_lib
from pyphare.core.box import Box
from pyphare.core.phare_utilities import assert_fp_any_all_close, np_array_ify
from pyphare.pharein import ElectronModel, MaxwellianFluidModel
@@ -25,6 +26,8 @@
from tests.diagnostic import all_timestamps
from tests.simulator import SimulatorTest, diff_boxes
+cpp = cpp_lib()
+
@ddt
class AdvanceTestBase(SimulatorTest):
@@ -747,8 +750,8 @@ def _getHier(diag_dir, boxes=[]):
diag_outputs=diag_dir,
)
- L0_datahier = _getHier(f"L0_diags")
- L0L1_datahier = _getHier(f"L0L1_diags", refinement_boxes)
+ L0_datahier = _getHier("L0_diags")
+ L0L1_datahier = _getHier("L0L1_diags", refinement_boxes)
quantities = [f"{EM}{xyz}" for EM in ["E", "B"] for xyz in ["x", "y", "z"]]
checks = (
@@ -776,13 +779,9 @@ def base_test_domain_particles_on_refined_level(self, datahier, new_time=None):
def _test_domain_particles_on_refined_level(
self, ndim, interp_order, refinement_boxes, **kwargs
):
- import pyphare.pharein as ph
-
time_step_nbr = 5
time_step = 0.001
- out = "domain_particles"
-
self.base_test_domain_particles_on_refined_level(
self.getHierarchy(
ndim,
diff --git a/tests/simulator/test_diagnostic_timestamps.py b/tests/simulator/test_diagnostic_timestamps.py
index 587db70ac..2c9b624ba 100644
--- a/tests/simulator/test_diagnostic_timestamps.py
+++ b/tests/simulator/test_diagnostic_timestamps.py
@@ -1,15 +1,13 @@
#!/usr/bin/env python3
-from pyphare.cpp import cpp_lib
-cpp = cpp_lib()
import os
import unittest
-
-import h5py
import numpy as np
-import pyphare.pharein as ph
from ddt import data, ddt
+
+import pyphare.pharein as ph
+from pyphare.cpp import cpp_lib
from pyphare.core.box import Box1D
from pyphare.pharein import ElectromagDiagnostics, ElectronModel
from pyphare.pharesee.hierarchy import hierarchy_from
@@ -17,6 +15,8 @@
from pyphare.pharesee.hierarchy.hierarchy import format_timestamp
from pyphare.simulator.simulator import Simulator
+cpp = cpp_lib()
+
def setup_model(ppc):
def density(x):
@@ -102,6 +102,8 @@ def ddt_test_id(self):
return self._testMethodName.split("_")[-1]
def test_dump_diags_timestamps(self):
+ import h5py # see doc/conventions.md section 2.1.1
+
print("test_dump_diags dim/interp:{}/{}".format(1, 1))
simulation = ph.Simulation(**simArgs.copy())
diff --git a/tests/simulator/test_diagnostics.py b/tests/simulator/test_diagnostics.py
index 4763dd882..ffad698f2 100644
--- a/tests/simulator/test_diagnostics.py
+++ b/tests/simulator/test_diagnostics.py
@@ -1,24 +1,23 @@
#!/usr/bin/env python3
-from pyphare.cpp import cpp_lib
-
-cpp = cpp_lib()
-
import os
import unittest
-
-import h5py
import numpy as np
-import pyphare.pharein as ph
from ddt import data, ddt
+
+import pyphare.pharein as ph
+from pyphare.cpp import cpp_lib
+from pyphare.simulator.simulator import startMPI
+from pyphare.simulator.simulator import Simulator
+from pyphare.pharesee.hierarchy import hierarchy_from
from pyphare.pharein.simulation import supported_dimensions
from pyphare.pharesee.hierarchy.fromh5 import h5_filename_from, h5_time_grp_key
-from pyphare.pharesee.hierarchy import hierarchy_from
-from pyphare.simulator.simulator import Simulator
from tests.diagnostic import dump_all_diags
+cpp = cpp_lib()
+
def setup_model(ppc=100):
def density(*xyz):
@@ -132,11 +131,6 @@ def __init__(self, *args, **kwargs):
super(DiagnosticsTest, self).__init__(*args, **kwargs)
self.simulator = None
- def setUp(self):
- from pyphare.simulator.simulator import startMPI
-
- startMPI()
-
def tearDown(self):
if self.simulator is not None:
self.simulator.reset()
@@ -151,6 +145,8 @@ def test_dump_diags(self, simInput):
self._test_dump_diags(ndim, **simInput)
def _test_dump_diags(self, dim, **simInput):
+ import h5py # see doc/conventions.md section 2.1.1
+
test_id = self.ddt_test_id()
# configure simulation dim sized values
@@ -251,4 +247,5 @@ def _test_dump_diags(self, dim, **simInput):
if __name__ == "__main__":
+ startMPI()
unittest.main()
diff --git a/tests/simulator/test_initialization.py b/tests/simulator/test_initialization.py
index de00a9ab3..4164f1f9d 100644
--- a/tests/simulator/test_initialization.py
+++ b/tests/simulator/test_initialization.py
@@ -1,11 +1,11 @@
-from pyphare.cpp import cpp_lib
-
-cpp = cpp_lib()
+#
+#
import unittest
-
import numpy as np
from ddt import ddt
+
+from pyphare.cpp import cpp_lib
from pyphare.core.box import nDBox
from pyphare.core.phare_utilities import assert_fp_any_all_close
from pyphare.pharein import ElectronModel, MaxwellianFluidModel
@@ -24,6 +24,9 @@
from tests.simulator import SimulatorTest
+cpp = cpp_lib()
+
+
@ddt
class InitializationTest(SimulatorTest):
def _density(*xyz):
@@ -696,7 +699,6 @@ def _test_domainparticles_have_correct_split_from_coarser_particle(
def _test_patch_ghost_on_refined_level_case(self, dim, has_patch_ghost, **kwargs):
import pyphare.pharein as ph
- out = "phare_outputs"
refinement_boxes = {"L0": [nDBox(dim, 10, 19)]}
kwargs["interp_order"] = kwargs.get("interp_order", 1)
kwargs["diag_outputs"] = f"{has_patch_ghost}"
diff --git a/tests/simulator/test_load_balancing.py b/tests/simulator/test_load_balancing.py
index 6b8d80517..4ddaddf9b 100644
--- a/tests/simulator/test_load_balancing.py
+++ b/tests/simulator/test_load_balancing.py
@@ -19,11 +19,10 @@
from pyphare.cpp import cpp_lib
cpp = cpp_lib()
-startMPI()
+
ndim = 2
interp = 1
-mpi_size = cpp.mpi_size()
time_step_nbr = 3
time_step = 0.001
cells = (100, 100)
@@ -180,7 +179,7 @@ def get_particles(diag_dir, time=0):
def time_info(diag_dir, time=0):
hier = get_particles(diag_dir, time)
- per_rank = {f"p{rank}": 0 for rank in range(mpi_size)}
+ per_rank = {f"p{rank}": 0 for rank in range(cpp.mpi_size())}
def _parse_rank(patch_id):
return patch_id.split("#")[0]
@@ -207,11 +206,11 @@ def run_sim(self, diags_dir, dic={}):
@data(dict(auto=True, every=1))
@unpack
def test_raises(self, **lbkwargs):
- if mpi_size == 1: # doesn't make sense
+ if cpp.mpi_size() == 1: # doesn't make sense
return
with self.assertRaises(RuntimeError):
- diag_dir = self.run_sim(
+ self.run_sim(
self.unique_diag_dir_for_test_case(diag_outputs, ndim, interp),
dict(active=True, mode="nppc", tol=0.01, **lbkwargs),
)
@@ -227,7 +226,7 @@ def test_raises(self, **lbkwargs):
)
@unpack
def test_has_balanced(self, **lbkwargs):
- if mpi_size == 1: # doesn't make sense
+ if cpp.mpi_size() == 1: # doesn't make sense
return
diag_dir = self.run_sim(
@@ -242,7 +241,7 @@ def test_has_balanced(self, **lbkwargs):
@unittest.skip("should change with moments")
def test_has_not_balanced_as_defaults(self):
- if mpi_size == 1: # doesn't make sense
+ if cpp.mpi_size() == 1: # doesn't make sense
return
diag_dir = self.run_sim(
@@ -256,7 +255,7 @@ def test_has_not_balanced_as_defaults(self):
@unittest.skip("should change with moments")
def test_compare_is_and_is_not_balanced(self):
- if mpi_size == 1: # doesn't make sense
+ if cpp.mpi_size() == 1: # doesn't make sense
return
check_time = 0.001
@@ -282,4 +281,5 @@ def test_compare_is_and_is_not_balanced(self):
if __name__ == "__main__":
+ startMPI()
unittest.main()
diff --git a/tests/simulator/test_restarts.py b/tests/simulator/test_restarts.py
index d0e07edb4..5315ce7e7 100644
--- a/tests/simulator/test_restarts.py
+++ b/tests/simulator/test_restarts.py
@@ -1,19 +1,18 @@
-import copy
+#
+#
+import copy
import time
import datetime
import unittest
import numpy as np
-from pathlib import Path
-from datetime import timedelta
+from datetime import timedelta
from ddt import ddt, data, unpack
-from pyphare.cpp import cpp_lib
-
-cpp = cpp_lib()
-
import pyphare.pharein as ph
+
+from pyphare.cpp import cpp_lib
from pyphare.pharesee.run import Run
from pyphare.simulator.simulator import Simulator
@@ -22,6 +21,8 @@
from pyphare.pharesee.hierarchy.patchdata import ParticleData
from pyphare.pharesee.hierarchy.fromh5 import get_all_available_quantities_from_h5
+cpp = cpp_lib()
+
def permute(dic, expected_num_levels):
# from pyphare.pharein.simulation import supported_dimensions # eventually
@@ -318,9 +319,6 @@ def test_restarts_elapsed_time(self, ndim, interp, simInput, expected_num_levels
simput["interp_order"] = interp
time_step = simput["time_step"]
time_step_nbr = simput["time_step_nbr"]
-
- restart_idx = 1
- restart_time = time_step * restart_idx
timestamps = [time_step * time_step_nbr]
# first simulation
@@ -386,7 +384,7 @@ def test_mode_conserve(self, ndim=1, interp=1, simput=dup(simArgs)):
ph.global_vars.sim = ph.Simulation(**simput)
self.assertEqual(len(ph.global_vars.sim.restart_options["timestamps"]), 1)
self.assertEqual(ph.global_vars.sim.restart_options["timestamps"][0], 0.004)
- model = setup_model()
+ setup_model()
Simulator(ph.global_vars.sim).run().reset()
# second simulation (not restarted)
@@ -404,7 +402,7 @@ def test_input_validation_trailing_slash(self):
simulation_args["restart_options"]["dir"] + "//"
)
sim = ph.Simulation(**simulation_args)
- model = setup_model()
+ setup_model()
Simulator(sim).run().reset()
ph.global_vars.sim = None
@@ -423,7 +421,7 @@ def test_elapsed_timestamps_are_valid(self, elapsed_timestamps, valid):
ph.global_vars.sim = None
ph.Simulation(**simput.copy())
self.assertTrue(valid)
- except:
+ except Exception:
self.assertTrue(not valid)
diff --git a/tests/simulator/test_run.py b/tests/simulator/test_run.py
index c7ba7b46d..7d54c6fc6 100644
--- a/tests/simulator/test_run.py
+++ b/tests/simulator/test_run.py
@@ -13,7 +13,7 @@
mpl.use("Agg")
cpp = cpp_lib()
-startMPI()
+
time_step = 0.005
final_time = 0.05
@@ -272,4 +272,5 @@ def test_run(self):
if __name__ == "__main__":
import unittest
+ startMPI()
unittest.main()
diff --git a/tests/simulator/test_simulation.py b/tests/simulator/test_simulation.py
index dd684b40f..500454589 100644
--- a/tests/simulator/test_simulation.py
+++ b/tests/simulator/test_simulation.py
@@ -5,8 +5,6 @@
import numpy as np
import pyphare.pharein as ph
-from pyphare.simulator.simulator import Simulator
-
from copy import deepcopy
from tests.simulator import SimulatorTest
@@ -34,7 +32,6 @@ def test_no_numpy_on_serialization(self):
import dill
import codecs
- simput = deepcopy(simArgs)
sim = ph.Simulation(**deepcopy(simArgs))
# check is np array before serialization
diff --git a/tests/simulator/test_tagging.py.off b/tests/simulator/test_tagging.py.off
index 0785dcf77..c7a325335 100644
--- a/tests/simulator/test_tagging.py.off
+++ b/tests/simulator/test_tagging.py.off
@@ -9,7 +9,7 @@ cpp = cpp_lib()
import os
import unittest
-import h5py
+
import numpy as np
import pyphare.pharein as ph
from ddt import data, ddt
@@ -154,6 +154,8 @@ class TaggingTest(unittest.TestCase):
self._test_dump_diags(ndim, **simInput)
def _test_dump_diags(self, dim, **simInput):
+ import h5py # see doc/conventions.md section 2.1.1
+
test_id = self.ddt_test_id()
for key in ["cells", "dl", "boundary_types"]:
simInput[key] = [simInput[key] for d in range(dim)]
diff --git a/tests/simulator/test_validation.py b/tests/simulator/test_validation.py
index 7bcd5a9a5..9f5139160 100644
--- a/tests/simulator/test_validation.py
+++ b/tests/simulator/test_validation.py
@@ -2,19 +2,17 @@
#
# formatted with black
-from pyphare.cpp import cpp_lib
-
-cpp = cpp_lib()
-
-import unittest
from ddt import data, ddt
+from pyphare.cpp import cpp_lib
from pyphare.core.box import Box, Box2D
from pyphare.simulator.simulator import Simulator
from tests.simulator import NoOverwriteDict, populate_simulation
from tests.simulator import SimulatorTest
+cpp = cpp_lib()
+
out = "phare_outputs/valid/refinement_boxes/"
diags = {
"diag_options": {"format": "phareh5", "options": {"dir": out, "mode": "overwrite"}}
@@ -47,7 +45,7 @@ def _do_dim(self, dim, input, valid: bool = False):
self.simulator.setup()
self.assertTrue(valid)
self.simulator = None
- except ValueError as e:
+ except ValueError:
self.assertTrue(not valid)
"""
@@ -388,4 +386,6 @@ def test_2d_invalid(self, input):
if __name__ == "__main__":
+ import unittest
+
unittest.main()