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