xref: /honee/examples/stdoutParsing.py (revision 8a8cb6e06ce4728cc6d80ca92f8de31da49852e5)
1*ae2b091fSJames Wright# SPDX-FileCopyrightText: Copyright (c) 2017-2024, HONEE contributors.
2*ae2b091fSJames Wright# SPDX-License-Identifier: Apache-2.0 OR BSD-2-Clause
3fc37ad8cSJames Wright
4fc37ad8cSJames Wrightimport re
5fc37ad8cSJames Wrightimport pandas as pd
6fc37ad8cSJames Wrightfrom pathlib import Path
7fc37ad8cSJames Wright
8fc37ad8cSJames Wright# Regex to parse STDOUT of the navierstokes run
9fc37ad8cSJames Wrightlogreg = re.compile(
10fc37ad8cSJames Wright    r".*(?:^Degree of FEM Space: (\d+)).*(?:^Global FEM nodes: (\d{2,})).*(?:^dm_plex_box_faces: (\S+)).*(?:^Time taken for solution: (\d*\.?\d+)).*(?:^Relative Error: (\d*\.?\d+))",
11fc37ad8cSJames Wright    re.DOTALL | re.MULTILINE,
12fc37ad8cSJames Wright)
13fc37ad8cSJames Wright
14fc37ad8cSJames Wright
15fc37ad8cSJames Wrightdef parseFile(file):
16fc37ad8cSJames Wright    """Returns dictionary of parsed logfile contents.
17fc37ad8cSJames Wright
18fc37ad8cSJames Wright    Parameters
19fc37ad8cSJames Wright    ----------
20fc37ad8cSJames Wright    file : Path-like object
21fc37ad8cSJames Wright        Path to the file to be parsed.
22fc37ad8cSJames Wright
23fc37ad8cSJames Wright    Returns
24fc37ad8cSJames Wright    -------
25fc37ad8cSJames Wright    dict
26fc37ad8cSJames Wright        Values of "dofs",  "time", "error", "degree", and "box_faces"'
27fc37ad8cSJames Wright    """
28fc37ad8cSJames Wright
29fc37ad8cSJames Wright    values = {}
30fc37ad8cSJames Wright    with file.open() as filer:
31fc37ad8cSJames Wright        filestring = filer.read()
32fc37ad8cSJames Wright    match = logreg.match(filestring)
33fc37ad8cSJames Wright    values["degree"] = match[1]
34fc37ad8cSJames Wright    values["dofs"] = match[2]
35fc37ad8cSJames Wright    box_faceStr = match[3]
36fc37ad8cSJames Wright    values["time"] = match[4]
37fc37ad8cSJames Wright    values["error"] = match[5]
38fc37ad8cSJames Wright
39fc37ad8cSJames Wright    # Splitting box_face argument str into individual entries
40fc37ad8cSJames Wright    box_faceList = box_faceStr.split(",")
41fc37ad8cSJames Wright    for i, box_face in enumerate(box_faceList):
42fc37ad8cSJames Wright        values["box_face" + str(i)] = box_face
43fc37ad8cSJames Wright
44fc37ad8cSJames Wright    return values
45fc37ad8cSJames Wright
46fc37ad8cSJames Wright
47fc37ad8cSJames Wrightif __name__ == "__main__":
48fc37ad8cSJames Wright    # Directory location of log files
49fc37ad8cSJames Wright    runlogDir = Path("./")
50fc37ad8cSJames Wright
51fc37ad8cSJames Wright    results = pd.DataFrame()
52fc37ad8cSJames Wright    for file in runlogDir.glob("*.log"):
53fc37ad8cSJames Wright        values = parseFile(file)
54fc37ad8cSJames Wright        results = results.append(values, ignore_index=True)
55fc37ad8cSJames Wright
56fc37ad8cSJames Wright    # Convert string values to numeric type
57fc37ad8cSJames Wright    results = results.apply(lambda col: pd.to_numeric(col, errors="coerce"))
58