@@ -244,18 +244,29 @@ def _normalize_timestamps(timestep_values):
244244
245245 def _build_programmable_filter_script (self ):
246246 # Emit the control array plus one comparison array per selected simulation.
247- return f"""vars = { self .loaded_variables }
247+ return f"""import numpy as np
248+
249+ vars = { self .loaded_variables }
248250for var in vars:
249251 ctrl = inputs[0].CellData[f"{{var}}"]
252+ ctrl_np = np.asarray(ctrl)
250253
251254 output.CellData.append(ctrl, f'{{var}}')
252255 output.CellData.append(ctrl, f'{{var}}__control')
253256 for sim_index, sim_input in enumerate(inputs[1:], start=1):
254257 sim = sim_input.CellData[f"{{var}}"]
258+ sim_np = np.asarray(sim)
255259 output.CellData.append(sim, f'{{var}}__test__{{sim_index}}')
256- diff = sim - ctrl
257- comp1 = diff / ctrl
258- comp2 = (2 * diff) / (sim + ctrl)
260+
261+ # Use guarded division to avoid runtime warnings for zero-valued slices.
262+ diff = sim_np - ctrl_np
263+ comp1 = np.full(diff.shape, np.nan, dtype=np.float64)
264+ comp2 = np.full(diff.shape, np.nan, dtype=np.float64)
265+ denom_ctrl = ctrl_np
266+ denom_sum = sim_np + ctrl_np
267+ np.divide(diff, denom_ctrl, out=comp1, where=(denom_ctrl != 0))
268+ np.divide(2.0 * diff, denom_sum, out=comp2, where=(denom_sum != 0))
269+
259270 output.CellData.append(diff, f'{{var}}__diff__{{sim_index}}')
260271 output.CellData.append(comp1, f'{{var}}__comp1__{{sim_index}}')
261272 output.CellData.append(comp2, f'{{var}}__comp2__{{sim_index}}')
0 commit comments