From e6988874d5c2c58bcdb6526e986e3c40f7ccff9d Mon Sep 17 00:00:00 2001 From: Lars Bilke <lars.bilke@ufz.de> Date: Tue, 29 Sep 2020 10:00:48 +0200 Subject: [PATCH] [T] Added ExtractBoundary test driven by Parsl. --- Applications/Utils/ExtractBoundary.py | 78 +++++++++++++++++++++++++++ Applications/Utils/Tests.cmake | 9 +++- scripts/cmake/Find.cmake | 1 + scripts/test/requirements.txt | 1 + 4 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 Applications/Utils/ExtractBoundary.py diff --git a/Applications/Utils/ExtractBoundary.py b/Applications/Utils/ExtractBoundary.py new file mode 100644 index 00000000000..57dd8b36981 --- /dev/null +++ b/Applications/Utils/ExtractBoundary.py @@ -0,0 +1,78 @@ +# Usage, e.g.: +# python3 ExtractBoundary.py ./snakemake.yaml + +import os, parsl, sys, yaml +from parsl import python_app, bash_app +from parsl.data_provider.files import File + +output_path = "FileIO" +elem_types = ['tri', 'quad'] + +parsl.load() + +config = dict() +with open(sys.argv[1]) as f: + config = yaml.safe_load(f) + +os.environ["PATH"] += os.pathsep + os.pathsep.join([config['BIN_DIR']]) +os.chdir(f"{config['Data_BINARY_DIR']}/{output_path}") + +print(f"{config['Data_BINARY_DIR']}/{output_path}") + + +# Apps +@bash_app +def generate_meshes(elem_type, outputs=[], + stderr=parsl.AUTO_LOGNAME, stdout=parsl.AUTO_LOGNAME): + return f"""generateStructuredMesh -e {elem_type} \ + --lx 1 --ly 1 \ + --nx 10 --ny 10 \ + -o input_square_1x1_{elem_type}.vtu""" + + +@bash_app +def extract_boundary(elem_type, inputs=[], outputs=[], + stderr=parsl.AUTO_LOGNAME, stdout=parsl.AUTO_LOGNAME): + return f"""ExtractBoundary -i {inputs[0].filepath} \ + -o square_1x1_{elem_type}_boundary.vtu""" + + +# compares the files in inputs[0] and inputs[1] +@bash_app +def vtk_diff(fields, inputs=[], outputs=[], + stderr=parsl.AUTO_LOGNAME, stdout=parsl.AUTO_LOGNAME): + script = "" + for field in fields: + field_a = field[0] + offset = 0 + if len(field) == 4: + offset = 1 + field_b = field[0 + offset] + abs_tol = field[1 + offset] + rel_tol = field[2 + offset] + + script += f"""rm {outputs[0]} || true + vtkdiff {inputs[0]} {inputs[1]} \ + -a {field_a} -b {field_b} \ + --abs {abs_tol} --rel {rel_tol} > {outputs[0]} + """ + return script + + +# Workflow +for elem_type in elem_types: + gm = generate_meshes(elem_type, outputs=[File(f"input_square_1x1_{elem_type}.vtu")]) + eb = extract_boundary(elem_type, inputs=[gm.outputs[0]], outputs=[File(f"square_1x1_{elem_type}_boundary.vtu")]) + diff = vtk_diff( + fields=[ + # second field name can be omitted if identical + ["bulk_node_ids", 0, 0], + ["bulk_element_ids", 0, 0], + ["bulk_face_ids", 0, 0] + ], + inputs=[ + eb.outputs[0], + f"{config['Data_SOURCE_DIR']}/{output_path}/{eb.outputs[0].filename}" + ], + outputs=[File(f"square_1x1_{elem_type}_boundary_diff.out")]) + print(diff.result()) diff --git a/Applications/Utils/Tests.cmake b/Applications/Utils/Tests.cmake index a6ac899544c..a92b1df6ede 100644 --- a/Applications/Utils/Tests.cmake +++ b/Applications/Utils/Tests.cmake @@ -307,13 +307,20 @@ AddTest( ) if(SNAKEMAKE AND NOT OGS_USE_MPI) - add_test(NAME workflow_ExtractBoundary + add_test(NAME snakemake_ExtractBoundary COMMAND ${SNAKEMAKE} -j 1 --configfile ${PROJECT_BINARY_DIR}/snakemake.yaml -s ${CMAKE_CURRENT_SOURCE_DIR}/ExtractBoundary.smk ) endif() +if(PARSL AND NOT OGS_USE_MPI) + add_test(NAME parsl_ExtractBoundary + COMMAND ${Python3_EXECUTABLE} + ${CMAKE_CURRENT_SOURCE_DIR}/ExtractBoundary.py + ${PROJECT_BINARY_DIR}/snakemake.yaml + ) +endif() AddTest( NAME partmesh_with_field_data diff --git a/scripts/cmake/Find.cmake b/scripts/cmake/Find.cmake index f46ec0a8fca..60fe82bccff 100644 --- a/scripts/cmake/Find.cmake +++ b/scripts/cmake/Find.cmake @@ -55,6 +55,7 @@ find_program(MODULE_CMD modulecmd PATHS /usr/local/modules/3.2.10-1/Modules/3.2.10/bin) find_program(SNAKEMAKE snakemake) +find_program(PARSL parsl-visualize) ###################### ### Find libraries ### diff --git a/scripts/test/requirements.txt b/scripts/test/requirements.txt index 5033e136ebf..9bb620c9799 100644 --- a/scripts/test/requirements.txt +++ b/scripts/test/requirements.txt @@ -1 +1,2 @@ snakemake==5.19.3 +parsl==1.0.0 -- GitLab