Skip to content

Commit 3f7fefa

Browse files
committed
wip
1 parent fa838a0 commit 3f7fefa

File tree

6 files changed

+56
-34
lines changed

6 files changed

+56
-34
lines changed

.gdbinit

Lines changed: 0 additions & 3 deletions
This file was deleted.

pyphare/pyphare/pharesee/hierarchy/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ def hierarchy_from(
4141
return hierarchy_from_sim(simulator, qty, pop=pop)
4242

4343
if func is not None and hier is not None:
44+
if not callable(func):
45+
raise TypeError("func must be callable")
4446
return hierarchy_from_func(func, hier, **kwargs)
4547

4648
raise ValueError("can't make hierarchy")

pyphare/pyphare/pharesee/hierarchy/fromfunc.py

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
from pyphare.pharesee.hierarchy.hierarchy_utils import compute_hier_from
22

3-
import numpy as np
4-
53

64
def hierarchy_from_func1d(func, hier, **kwargs):
75
assert hier.ndim == 1
@@ -33,8 +31,33 @@ def compute_(patch_datas, **kwargs):
3331

3432

3533
def hierarchy_from_func(func, hier, **kwargs):
34+
35+
"""
36+
Route hierarchical computation to appropriate dimension handler.
37+
38+
Parameters
39+
----------
40+
func : callable
41+
Function to apply to coordinates of the hierarchy
42+
hier : Hierarchy
43+
Hierarchy object (1D or 2D)
44+
**kwargs : dict
45+
Additional arguments passed to func
46+
47+
Returns
48+
-------
49+
dict
50+
Computed hierarchical data
51+
52+
Raises
53+
------
54+
ValueError
55+
If hierarchy dimension is not supported
56+
"""
57+
3658
if hier.ndim == 1:
3759
return hierarchy_from_func1d(func, hier, **kwargs)
3860
if hier.ndim == 2:
3961
return hierarchy_from_func2d(func, hier, **kwargs)
40-
62+
else:
63+
raise ValueError(f"Unsupported hierarchy dimension: {hier.ndim}")

src/amr/tagging/default_hybrid_tagger_strategy.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ void DefaultHybridTaggerStrategy<HybridModel>::tag(HybridModel& model,
3636
auto& By = model.state.electromag.B.getComponent(PHARE::core::Component::Y);
3737
auto& Bz = model.state.electromag.B.getComponent(PHARE::core::Component::Z);
3838

39-
auto& N = model.state.ions.chargeDensity();
39+
// auto& N = model.state.ions.chargeDensity();
4040

4141
// we loop on cell indexes for all qties regardless of their centering
4242
auto const& [start_x, _]

tests/core/numerics/ion_updater/test_updater.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -925,13 +925,15 @@ TYPED_TEST(IonUpdaterTest, thatNoNaNsExistOnPhysicalNodesMoments)
925925
for (auto ix = ix0; ix <= ix1; ++ix)
926926
{
927927
auto& density = pop.particleDensity();
928+
auto& chargeDensity = pop.chargeDensity();
928929
auto& flux = pop.flux();
929930

930931
auto& fx = flux.getComponent(Component::X);
931932
auto& fy = flux.getComponent(Component::Y);
932933
auto& fz = flux.getComponent(Component::Z);
933934

934935
EXPECT_FALSE(std::isnan(density(ix)));
936+
EXPECT_FALSE(std::isnan(chargeDensity(ix)));
935937
EXPECT_FALSE(std::isnan(fx(ix)));
936938
EXPECT_FALSE(std::isnan(fy(ix)));
937939
EXPECT_FALSE(std::isnan(fz(ix)));

tests/simulator/initialize/test_density_init.py

Lines changed: 25 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,9 @@
2424
def ions_mass_density_func1d(x, **kwargs):
2525
masses = kwargs["masses"] # list of float : the ion pop masses
2626
densities = kwargs["densities"] # list of callable : the ion pop density profiles
27+
if len(masses) != len(densities):
28+
raise ValueError("Length of masses and densities must be equal")
2729

28-
assert len(masses) == len(densities)
2930
funcs = np.zeros((x.size, len(masses)))
3031

3132
for i, (mass, density) in enumerate(zip(masses, densities)):
@@ -37,8 +38,8 @@ def ions_mass_density_func1d(x, **kwargs):
3738
def ions_charge_density_func1d(x, **kwargs):
3839
charges = kwargs["charges"] # list of float : the ion pop charges
3940
densities = kwargs["densities"] # list of callable : the ion pop density profiles
40-
41-
assert len(charges) == len(densities)
41+
if len(charges) != len(densities):
42+
raise ValueError("Length of charges and densities must be equal")
4243

4344
funcs = np.zeros((x.size, len(charges)))
4445

@@ -52,10 +53,11 @@ def ions_charge_density_func1d(x, **kwargs):
5253
def ions_mass_density_func2d(x, y, **kwargs):
5354
masses = kwargs["masses"] # list of float : the ion pop masses
5455
densities = kwargs["densities"] # list of callable : the ion pop density profiles
56+
if len(masses) != len(densities):
57+
raise ValueError("Length of masses and densities must be equal")
5558

5659
yv, xv = np.meshgrid(y, x)
5760

58-
assert len(masses) == len(densities)
5961
funcs = np.zeros((x.size, y.size, len(masses)))
6062

6163
for i, (mass, density) in enumerate(zip(masses, densities)):
@@ -67,10 +69,11 @@ def ions_mass_density_func2d(x, y, **kwargs):
6769
def ions_charge_density_func2d(x, y, **kwargs):
6870
charges = kwargs["charges"] # list of float : the ion pop charges
6971
densities = kwargs["densities"] # list of callable : the ion pop density profiles
72+
if len(charges) != len(densities):
73+
raise ValueError("Length of charges and densities must be equal")
7074

7175
yv, xv = np.meshgrid(y, x)
7276

73-
assert len(charges) == len(densities)
7477
funcs = np.zeros((x.size, y.size, len(charges)))
7578

7679
for i, (charge, density) in enumerate(zip(charges, densities)):
@@ -140,8 +143,8 @@ def config_1d():
140143
bx=bx_1d,
141144
by=by_1d,
142145
bz=bz_1d,
143-
main={"mass": masses[0], "charge": charges[0], "density": densityMain_1d, "nbr_part_per_cell": 1000, **v_pop},
144-
beam={"mass": masses[1], "charge": charges[1], "density": densityBeam_1d, "nbr_part_per_cell": 1000, **v_pop},
146+
main={"mass": masses[0], "charge": charges[0], "density": densityMain_1d, "nbr_part_per_cell": 100, **v_pop},
147+
beam={"mass": masses[1], "charge": charges[1], "density": densityBeam_1d, "nbr_part_per_cell": 100, **v_pop},
145148
)
146149

147150
ph.ElectronModel(closure="isothermal", Te=0.0)
@@ -222,8 +225,8 @@ def config_2d():
222225
bx=bx_2d,
223226
by=by_2d,
224227
bz=bz_2d,
225-
main={"mass": masses[0], "charge": charges[0], "density": densityMain_2d, "nbr_part_per_cell": 2000, **v_pop},
226-
beam={"mass": masses[1], "charge": charges[1], "density": densityBeam_2d, "nbr_part_per_cell": 2000, **v_pop},
228+
main={"mass": masses[0], "charge": charges[0], "density": densityMain_2d, "nbr_part_per_cell": 100, **v_pop},
229+
beam={"mass": masses[1], "charge": charges[1], "density": densityBeam_2d, "nbr_part_per_cell": 100, **v_pop},
227230
)
228231

229232
ph.ElectronModel(closure="isothermal", Te=0.0)
@@ -255,23 +258,21 @@ def main():
255258
ph.global_vars.sim = None
256259
Simulator(config_2d()).run().reset()
257260

258-
259-
def assert_close_enough(h, H):
261+
def noise_level(h, H):
262+
noises = list()
260263
for lvl_h, lvl_H in zip(h.levels(time).values(), H.levels(time).values()):
261264
for patch_h, patch_H in zip(lvl_h.patches, lvl_H.patches):
262265
pd_h = patch_h.patch_datas["value"]
263266
pd_H = patch_H.patch_datas["value"]
264-
ghosts_num = pd_h.ghosts_nbr[0]
265267

266-
if pd_H.ndim == 1:
267-
dset_h = pd_h.dataset[ghosts_num:-ghosts_num]
268-
dset_H = pd_H.dataset[ghosts_num:-ghosts_num]
269-
if pd_H.ndim == 2:
270-
dset_h = pd_h.dataset[ghosts_num:-ghosts_num, ghosts_num:-ghosts_num]
271-
dset_H = pd_H.dataset[ghosts_num:-ghosts_num, ghosts_num:-ghosts_num]
268+
dset_h = pd_h[pd_h.box]
269+
dset_H = pd_H[pd_H.box]
270+
271+
noise = np.std(dset_h - dset_H)
272+
# print(f"noise = ", noise)
273+
noises.append(noise)
274+
return noises
272275

273-
for h_, H_ in zip(dset_h, dset_H):
274-
np.testing.assert_almost_equal(h_, H_, decimal=1)
275276

276277

277278
fig, ((ax1, ax2), (ax3, ax4), (ax5, ax6)) = plt.subplots(3, 2, figsize=(6, 8))
@@ -287,8 +288,8 @@ def assert_close_enough(h, H):
287288
H1 = hierarchy_from(hier=h1, func=ions_mass_density_func1d, masses=masses, densities=(densityMain_1d, densityBeam_1d))
288289
H2 = hierarchy_from(hier=h2, func=ions_charge_density_func1d, charges=charges, densities=(densityMain_1d, densityBeam_1d))
289290

290-
assert_close_enough(h1, H1)
291-
assert_close_enough(h2, H2)
291+
assert np.mean(noise_level(h1, H1)) < 0.18
292+
assert np.mean(noise_level(h2, H2)) < 0.12
292293

293294
cycle = plt.rcParams['axes.prop_cycle'].by_key()['color']
294295

@@ -313,8 +314,8 @@ def assert_close_enough(h, H):
313314
H1 = hierarchy_from(hier=h1, func=ions_mass_density_func2d, masses=masses, densities=(densityMain_2d, densityBeam_2d))
314315
H2 = hierarchy_from(hier=h2, func=ions_charge_density_func2d, charges=charges, densities=(densityMain_2d, densityBeam_2d))
315316

316-
assert_close_enough(h1, H1)
317-
assert_close_enough(h2, H2)
317+
assert np.mean(noise_level(h1, H1)) < 0.18
318+
assert np.mean(noise_level(h2, H2)) < 0.12
318319

319320
cmap = mpl.colormaps['viridis']
320321

@@ -327,8 +328,5 @@ def assert_close_enough(h, H):
327328
plt.savefig("nCheck.pdf", dpi=300)
328329

329330

330-
331-
# /home/smets/codes/far/PHARE/tests/simulator/initialize
332-
333331
if __name__ == "__main__":
334332
main()

0 commit comments

Comments
 (0)