From 22bc9a9781d2fa6ebef62fc47b7d7f439d7682a9 Mon Sep 17 00:00:00 2001 From: Marco Garten Date: Fri, 18 Oct 2024 16:54:49 -0700 Subject: [PATCH] Unify CI test for regression and TimeAvgDiag For PICMI, the TimeAveragedDiag test is automatically disabled because we cannot simply define the necessary output intervals. We need to be able to define period=[100,69:100] like for the app input. --- .../laser_ion/CMakeLists.txt | 25 +--------- .../analysis_default_openpmd_regression.py | 1 - ...vg_diags.py => analysis_test_laser_ion.py} | 46 +++++++++++++++++-- 3 files changed, 43 insertions(+), 29 deletions(-) delete mode 120000 Examples/Physics_applications/laser_ion/analysis_default_openpmd_regression.py rename Examples/Physics_applications/laser_ion/{analysis_time_avg_diags.py => analysis_test_laser_ion.py} (53%) diff --git a/Examples/Physics_applications/laser_ion/CMakeLists.txt b/Examples/Physics_applications/laser_ion/CMakeLists.txt index 9bcf0a60370..66d53165290 100644 --- a/Examples/Physics_applications/laser_ion/CMakeLists.txt +++ b/Examples/Physics_applications/laser_ion/CMakeLists.txt @@ -6,38 +6,17 @@ add_warpx_test( 2 # dims 2 # nprocs inputs_test_2d_laser_ion_acc # inputs - analysis_default_openpmd_regression.py # analysis + analysis_test_laser_ion.py # analysis diags/diagInst/ # output OFF # dependency ) -add_warpx_test( - test_2d_laser_ion_acc_time_avg # name - 2 # dims - 2 # nprocs - inputs_test_2d_laser_ion_acc # inputs; will not be used b/c dependent test - analysis_time_avg_diags.py # analysis - diags/diagTimeAvg/ # output - test_2d_laser_ion_acc # dependency -) - add_warpx_test( test_2d_laser_ion_acc_picmi # name 2 # dims 2 # nprocs inputs_test_2d_laser_ion_acc_picmi.py # inputs - analysis_default_openpmd_regression.py # analysis + analysis_test_laser_ion.py # analysis diags/diagInst/ # output OFF # dependency ) - -# We do not have an intervals parser for PICMI yet which would accept more than a single integer for the output period -#add_warpx_test( -# test_2d_laser_ion_acc_time_avg_picmi # name -# 2 # dims -# 2 # nprocs -# inputs_test_2d_laser_ion_acc_picmi.py # inputs -# analysis_time_avg_diags.py # analysis -# diags/diagTimeAvg/ # output -# test_2d_laser_ion_acc_picmi # dependency -#) diff --git a/Examples/Physics_applications/laser_ion/analysis_default_openpmd_regression.py b/Examples/Physics_applications/laser_ion/analysis_default_openpmd_regression.py deleted file mode 120000 index 73e5ec47001..00000000000 --- a/Examples/Physics_applications/laser_ion/analysis_default_openpmd_regression.py +++ /dev/null @@ -1 +0,0 @@ -../../analysis_default_openpmd_regression.py \ No newline at end of file diff --git a/Examples/Physics_applications/laser_ion/analysis_time_avg_diags.py b/Examples/Physics_applications/laser_ion/analysis_test_laser_ion.py similarity index 53% rename from Examples/Physics_applications/laser_ion/analysis_time_avg_diags.py rename to Examples/Physics_applications/laser_ion/analysis_test_laser_ion.py index 74a4687cec4..20095288b03 100755 --- a/Examples/Physics_applications/laser_ion/analysis_time_avg_diags.py +++ b/Examples/Physics_applications/laser_ion/analysis_test_laser_ion.py @@ -1,10 +1,32 @@ #!/usr/bin/env python3 +import os +import re import sys import numpy as np import openpmd_api as io +sys.path.insert(1, "../../../../warpx/Regression/Checksum/") +from checksumAPI import evaluate_checksum + + +def analyze_openpmd_regression(output_file): + # Run checksum regression test + if re.search("single_precision", output_file): + evaluate_checksum( + test_name=test_name, + output_file=output_file, + output_format="openpmd", + rtol=2e-6, + ) + else: + evaluate_checksum( + test_name=test_name, + output_file=output_file, + output_format="openpmd", + ) + def load_field_from_iteration( series, iteration: int, field: str, coord: str = None @@ -27,15 +49,15 @@ def load_field_from_iteration( return field_data -def main(): +def compare_time_avg_with_instantaneous_diags(dir_inst: str, dir_avg: str): + """Compare instantaneous data (multiple iterations averaged in post-processing) with in-situ averaged data.""" + field = "E" coord = "z" avg_period_steps = 5 avg_output_step = 100 - path_tpl_inst = "diags/diagInst/openpmd_%T.h5" - - dir_avg = sys.argv[1] + path_tpl_inst = f"{dir_inst}/openpmd_%T.h5" path_tpl_avg = f"{dir_avg}/openpmd_%T.h5" si = io.Series(path_tpl_inst, io.Access.read_only) @@ -63,4 +85,18 @@ def main(): if __name__ == "__main__": - main() + + test_name = os.path.split(os.getcwd())[1] + inst_output_file = sys.argv[1] + + # Regression checksum test + # NOTE: works only in the example directory due to relative path import + analyze_openpmd_regression(inst_output_file) + + # TODO: implement intervals parser for PICMI that allows more complex output periods + if "picmi" not in test_name: + # Functionality test for TimeAveragedDiagnostics + compare_time_avg_with_instantaneous_diags( + dir_inst=sys.argv[1], + dir_avg="diags/diagTimeAvg/", + )