From b35d5a36cb38f443d5e23f975b8dc21d4ec10db2 Mon Sep 17 00:00:00 2001
From: Christoph Alt <christoph.alt@fau.de>
Date: Thu, 16 Feb 2023 14:11:40 +0100
Subject: [PATCH] added parsing function for fe2ti

---
 cbutil/processing_functions.py | 19 +++++++++++
 tests/test_string_process.py   | 62 +++++++++++++++++++++++++++++++++-
 2 files changed, 80 insertions(+), 1 deletion(-)

diff --git a/cbutil/processing_functions.py b/cbutil/processing_functions.py
index 8505e1f..44e47bd 100644
--- a/cbutil/processing_functions.py
+++ b/cbutil/processing_functions.py
@@ -8,3 +8,22 @@ def mesa_pd_text(line: str):
         return m.group(1), float(m.group(2))
 
     raise ValueError()
+
+
+def fe2ti_parse_complete_timing(line: str) -> dict:
+    if not line.startswith("Absolut"):
+        raise ValueError()
+    pattern = r'([A-Za-z][A-Za-z _]+):\s*(\d+\.\d+)s\s*'
+    return {name: float(value) for name, value in re.findall(pattern, line)}
+
+
+def fe2ti_intermediate(line: str) -> dict:
+    pattern_step_info = r'([A-Za-z_]+)\s+(\d+)\s*'
+    step_info = {name: cnt for name, cnt in re.findall(pattern_step_info, line)}
+    if not step_info:
+        raise ValueError("Empty Step Info")
+    pattern_fields = r'\s*([A-za-z_|0-9]+):\s*((\d+\.\d+e-\d+)|(\d+\.\d+)|(\d+))s?\s*'
+    fields = {name: float(value) for name, value, *_ in re.findall(pattern_fields, line)}
+    if not fields:
+        raise ValueError("Empty fields")
+    return {'step_info': step_info, 'fields': fields}
diff --git a/tests/test_string_process.py b/tests/test_string_process.py
index cd43254..2cc2d92 100644
--- a/tests/test_string_process.py
+++ b/tests/test_string_process.py
@@ -1,7 +1,9 @@
 from cbutil.postprocessing import process_linewise
-from cbutil.processing_functions import mesa_pd_text
+from cbutil.processing_functions import mesa_pd_text, fe2ti_parse_complete_timing, fe2ti_intermediate
 from cbutil.util import read_file_line_wise
 
+import pytest
+
 
 def id(x):
     return x
@@ -38,3 +40,61 @@ def test_mesa_pd():
 
     for key, value in process_linewise(mesa_pd_text, read_file_line_wise(mesa_pd_example_output)):
         assert value == expected[key]
+
+
+TEST_STR_TOTAL = "Absolut_gesamt: 49.09s  Time to solution:  48.95s Create Macro Problem:  0.02s Comm_dup_etc: 0.05s"
+TEST_STR_INTERMEDIATE = "load_step 00 lll_pen 00 Newton_load 01 Newton_gesamt 01   micro_solve:  15.61s Comm_for_couple: 0.02s  Time_for_EV: 0.00s  Macro_Solve:  0.56s  Assembly_Macro:  0.55s  KSP_Macro:  0.00s   VecConvert:  0.00s  iter_macro: 01  Micro_HDF5:  0.00s  Comp_W: 0.00s  Ass_Maj: 0.00s  Comm_FLC: 0.00s  FLC_Comp: 0.00s  Ausw_Norm: 0.00s  TimeDest: 0.00  DestBDDC: 0.00  SendBDDC: 0.00  CreateArrBDDC: 0.00 BDDC_Part: 0.00s  PartAss: 0.00s  PartKSP: 0.00s  PartConv: 0.00s  TimeDefo: 0.01s  TimeInt: 0.00s  ||delta_u||: 3.054712e-04"
+
+
+def test_fe2ti():
+    expected = {
+        "Absolut_gesamt": 49.09,
+        "Time to solution":  48.95,
+        "Create Macro Problem":  0.02,
+        "Comm_dup_etc": 0.05,
+
+    }
+    assert fe2ti_parse_complete_timing(TEST_STR_TOTAL) == expected
+    with pytest.raises(ValueError):
+        fe2ti_parse_complete_timing(TEST_STR_INTERMEDIATE)
+
+
+def test_fe2ti_intermedate():
+    expected = {
+        "step_info": {
+            "load_step": "00",
+            "lll_pen": "00",
+            "Newton_load": "01",
+            "Newton_gesamt": "01",
+        },
+        "fields": {
+            "micro_solve":  15.61,
+            "Comm_for_couple": 0.02,
+            "Time_for_EV": 0.00,
+            "Macro_Solve":  0.56,
+            "Assembly_Macro":  0.55,
+            "KSP_Macro":  0.00,
+            "VecConvert":  0.00,
+            "iter_macro": 1.0,
+            "Micro_HDF5":  0.00,
+            "Comp_W": 0.00,
+            "Ass_Maj": 0.00,
+            "Comm_FLC": 0.00,
+            "FLC_Comp": 0.00,
+            "Ausw_Norm": 0.00,
+            "TimeDest": 0.00,
+            "DestBDDC": 0.00,
+            "SendBDDC": 0.00,
+            "CreateArrBDDC": 0.00,
+            "BDDC_Part": 0.00,
+            "PartAss": 0.00,
+            "PartKSP": 0.00,
+            "PartConv": 0.00,
+            "TimeDefo": 0.01,
+            "TimeInt": 0.00,
+            "||delta_u||": 3.054712e-04,
+        },
+    }
+    assert fe2ti_intermediate(TEST_STR_INTERMEDIATE) == expected
+    with pytest.raises(ValueError):
+        fe2ti_intermediate(TEST_STR_TOTAL)
-- 
GitLab