Skip to content

Commit aeb12c5

Browse files
committed
reafact+test: fix logger updates and included them in load_from_h5.Included domain boundaries in logger and updated test_007 to compare dict with tolerances
1 parent 9d6e9cf commit aeb12c5

File tree

2 files changed

+55
-12
lines changed

2 files changed

+55
-12
lines changed

tests/test_007_mpi_lossy_cavity.py

Lines changed: 52 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -86,13 +86,18 @@ class TestMPILossyCavity:
8686
-6.04105997e+01 ,-3.06532160e+01 ,-1.17749936e+01 ,-3.12574866e+00,
8787
-7.35339521e-01 ,-1.13085658e-01 , 7.18247535e-01 , 8.73829036e-02])
8888

89-
gridLogs = {'use_mesh_refinement': False, 'Nx': 60, 'Ny': 60, 'Nz': 140, 'dx': 0.008666666348775227, 'dy': 0.008666666348775227,
90-
'dz': 0.005714285799435207, 'stl_solids': {'cavity': 'tests/stl/007_vacuum_cavity.stl', 'shell': 'tests/stl/007_lossymetal_shell.stl'},
91-
'stl_materials': {'cavity': 'vacuum', 'shell': [30, 1.0, 30]}, 'gridInitializationTime': 0}
89+
gridLogs = {'use_mesh_refinement': False, 'Nx': 60, 'Ny': 60, 'Nz': 140, 'dx': 0.00866666634877522,
90+
'dy': 0.00866666634877522, 'dz': 0.005714285799435207,
91+
'xmin': -0.25999999046325684, 'xmax': 0.25999999046325684,
92+
'ymin': -0.25999999046325684, 'ymax': 0.25999999046325684,
93+
'zmin': -0.25, 'zmax': 0.550000011920929,
94+
'stl_solids': {'cavity': 'tests/stl/007_vacuum_cavity.stl', 'shell': 'tests/stl/007_lossymetal_shell.stl'},
95+
'stl_materials': {'cavity': 'vacuum', 'shell': [30, 1.0, 30]},
96+
'gridInitializationTime': 0}
9297

93-
solverLogs = {'use_gpu': False, 'use_mpi': False, 'background': 'pec','bc_low': ['pec', 'pec', 'pec'],
94-
'bc_high': ['pec', 'pec', 'pec'],
95-
'dt': 6.970326728398968e-12, 'solverInitializationTime': 0}
98+
solverLogs = {'use_gpu': False, 'use_mpi': False, 'background': 'pec',
99+
'bc_low': ['pec', 'pec', 'pec'], 'bc_high': ['pec', 'pec', 'pec'],
100+
'dt': 6.970326728398966e-12, 'solverInitializationTime': 0}
96101

97102
wakeSolverLogs = {'ti': 2.8516132094735135e-09, 'q': 1e-09, 'sigmaz': 0.1, 'beta': 1.0,
98103
'xsource': 0.0, 'ysource': 0.0, 'xtest': 0.0, 'ytest': 0.0, 'chargedist': None,
@@ -340,12 +345,49 @@ def test_long_impedance(self):
340345
assert np.cumsum(np.abs(wake.Z))[-1] == pytest.approx(250910.51090497518, 0.1), "Abs Impedance cumsum failed"
341346

342347
def test_log_file(self):
348+
# Helper function to compare nested dicts with float tolerance
349+
def assert_dict_allclose(d1, d2, rtol=1e-6, atol=1e-12, path=""):
350+
assert set(d1.keys()) == set(d2.keys()), \
351+
f"Key mismatch at {path}: {set(d1.keys())} != {set(d2.keys())}"
352+
353+
for k in d1:
354+
v1, v2 = d1[k], d2[k]
355+
p = f"{path}.{k}" if path else k
356+
357+
# nested dict
358+
if isinstance(v1, dict) and isinstance(v2, dict):
359+
assert_dict_allclose(v1, v2, rtol, atol, p)
360+
361+
# floats
362+
elif isinstance(v1, float) and isinstance(v2, float):
363+
assert np.isclose(v1, v2, rtol=rtol, atol=atol), \
364+
f"Float mismatch at {p}: {v1} != {v2}"
365+
366+
# lists/tuples/arrays
367+
elif isinstance(v1, (list, tuple)) and isinstance(v2, (list, tuple)):
368+
assert len(v1) == len(v2), f"Length mismatch at {p}"
369+
for i, (a, b) in enumerate(zip(v1, v2)):
370+
if isinstance(a, float) and isinstance(b, float):
371+
assert np.isclose(a, b, rtol=rtol, atol=atol), \
372+
f"Float mismatch at {p}[{i}]: {a} != {b}"
373+
else:
374+
assert a == b, f"Value mismatch at {p}[{i}]: {a} != {b}"
375+
376+
# everything else → exact match
377+
else:
378+
assert v1 == v2, f"Mismatch at {p}: {v1} != {v2}"
379+
343380
global solver
344-
solver.logger.grid["gridInitializationTime"] = 0 #times can vary
381+
# Exclude timing info from comparison as they can vary between runs
382+
solver.logger.grid["gridInitializationTime"] = 0
345383
solver.logger.solver["solverInitializationTime"] = 0
346384
solver.logger.wakeSolver["simulationTime"] = 0
385+
386+
# Check log file exists
347387
logfile = os.path.join(solver.logger.wakeSolver["results_folder"], "wakis.log")
348388
assert os.path.exists(logfile), "Log file not created"
349-
assert solver.logger.grid == self.gridLogs, "Grid logs do not match expected values"
350-
assert solver.logger.solver == self.solverLogs, "Solver logs do not match expected values"
351-
assert solver.logger.wakeSolver == self.wakeSolverLogs, "WakeSolver logs do not match expected values"
389+
390+
# Compare log dict contents
391+
assert_dict_allclose(solver.logger.grid, self.gridLogs)
392+
assert_dict_allclose(solver.logger.solver, self.solverLogs)
393+
assert_dict_allclose(solver.logger.wakeSolver, self.wakeSolverLogs)

wakis/gridFIT3D.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import h5py
1010

1111
from scipy.optimize import least_squares
12-
import time
1312

1413
from .field import Field
1514
from .logger import Logger
@@ -134,6 +133,7 @@ def __init__(self, xmin=None, xmax=None,
134133
#self.dz = np.min(np.diff(self.z))
135134
self.dz = (self.zmax - self.zmin)/self.Nz
136135
self.update_logger(['Nx', 'Ny', 'Nz', 'dx', 'dy', 'dz'])
136+
self.update_logger(['xmin', 'xmax', 'ymin', 'ymax', 'zmin', 'zmax'])
137137

138138
# stl info
139139
self.stl_solids = stl_solids
@@ -1043,8 +1043,9 @@ def load_from_h5(self, filename):
10431043
print(f' * STL solids assigned materials [eps_r, mu_r, sigma]:\n\
10441044
{list(self.stl_materials.values())}')
10451045

1046-
# update logger [TODO: add domain bounds info]
1046+
# update logger
10471047
self.update_logger(['Nx', 'Ny', 'Nz', 'dx', 'dy', 'dz'])
1048+
self.update_logger(['xmin', 'xmax', 'ymin', 'ymax', 'zmin', 'zmax'])
10481049
self.update_logger(['stl_solids', 'stl_materials'])
10491050
if self.stl_rotate != [0., 0., 0.]:
10501051
self.update_logger(['stl_rotate'])

0 commit comments

Comments
 (0)