@@ -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 )
0 commit comments