File size: 4,668 Bytes
930ea3d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#!/usr/bin/env python3
import re
import sys
import os

# -------- regexes (robust to spaces & scientific notation) --------
FLOAT = r'([+-]?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?)'

# Start-of-block: Bulk Modulus line
RE_K      = re.compile(rf'^\s*Bulk\s*Modulus\s*\d*\s*=\s*{FLOAT}', re.I)

# Individual shear moduli
RE_G1     = re.compile(rf'^\s*Shear\s*Modulus\s*1\s*=\s*{FLOAT}', re.I)
RE_G2     = re.compile(rf'^\s*Shear\s*Modulus\s*2\s*=\s*{FLOAT}', re.I)

# Combined shear modulus "Shear Modulus = ..."
RE_G      = re.compile(rf'^\s*Shear\s*Modulus\s*=\s*{FLOAT}', re.I)

RE_NU     = re.compile(rf'^\s*Poisson\s*Ratio\s*=\s*{FLOAT}', re.I)
# Allow both "Youngs" and "Young's"
RE_E      = re.compile(rf"^\s*Young'?s\s*Modulus\s*=\s*{FLOAT}", re.I)

def main():
    if len(sys.argv) != 2:
        print(f"Usage: {os.path.basename(sys.argv[0])} PID", file=sys.stderr)
        sys.exit(1)
    pid = sys.argv[1]

    logfile = "log.elastic_T"
    if not os.path.exists(logfile):
        print(f"Error: {logfile} not found in current directory.", file=sys.stderr)
        sys.exit(1)

    # Store per-block values
    K_vals, G1_vals, G2_vals, G_vals, NU_vals, E_vals = [], [], [], [], [], []

    current = None  # holds the current block's values

    with open(logfile, "r") as f:
        for line in f:
            # --- Start of a new block: Bulk Modulus line ---
            m = RE_K.search(line)
            if m:
                # If previous block is complete, save it
                if current and all(v is not None for v in current.values()):
                    K_vals.append(current["K"])
                    G1_vals.append(current["G1"])
                    G2_vals.append(current["G2"])
                    G_vals.append(current["G"])
                    NU_vals.append(current["NU"])
                    E_vals.append(current["E"])

                # Start a new block
                current = {"K": None, "G1": None, "G2": None, "G": None, "NU": None, "E": None}
                current["K"] = float(m.group(1))
                continue

            # If we haven't started a block yet, skip
            if current is None:
                continue

            # --- Within a block: try to match each property line ---

            # Shear Modulus 1
            m = RE_G1.search(line)
            if m:
                current["G1"] = float(m.group(1))
                continue

            # Shear Modulus 2
            m = RE_G2.search(line)
            if m:
                current["G2"] = float(m.group(1))
                continue

            # Combined Shear Modulus
            m = RE_G.search(line)
            if m:
                # This line is "Shear Modulus = ..."
                current["G"] = float(m.group(1))
                continue

            # Poisson Ratio
            m = RE_NU.search(line)
            if m:
                current["NU"] = float(m.group(1))
                continue

            # Youngs Modulus
            m = RE_E.search(line)
            if m:
                current["E"] = float(m.group(1))
                continue

    # Flush the last block if it is complete
    if current and all(v is not None for v in current.values()):
        K_vals.append(current["K"])
        G1_vals.append(current["G1"])
        G2_vals.append(current["G2"])
        G_vals.append(current["G"])
        NU_vals.append(current["NU"])
        E_vals.append(current["E"])

    if not K_vals:
        print("Error: no complete Bulk/Shear/Poisson/Youngs blocks found.", file=sys.stderr)
        sys.exit(2)

    n_blocks = len(K_vals)

    # Compute averages
    K_avg  = sum(K_vals)  / n_blocks
    G1_avg = sum(G1_vals) / n_blocks
    G2_avg = sum(G2_vals) / n_blocks
    G_avg  = sum(G_vals)  / n_blocks
    NU_avg = sum(NU_vals) / n_blocks
    E_avg  = sum(E_vals)  / n_blocks

    def write_scalar(filename, value):
        with open(filename, "w") as fh:
            fh.write(f"{value:.10g}\n")  # single average value

    # Write one averaged value to each *_result.dat file
    write_scalar(f"{pid}_K_result.dat",   K_avg)
    write_scalar(f"{pid}_G1_result.dat",  G1_avg)
    write_scalar(f"{pid}_G2_result.dat",  G2_avg)
    write_scalar(f"{pid}_G_result.dat",   G_avg)   # combined shear modulus
    write_scalar(f"{pid}_nu_result.dat",  NU_avg)
    write_scalar(f"{pid}_E_result.dat",   E_avg)

    # Optional: quick confirmation
    print(
        f"Parsed {n_blocks} complete blocks. "
        f"Wrote averaged values to: "
        f"{pid}_K_result.dat, {pid}_G1_result.dat, {pid}_G2_result.dat, "
        f"{pid}_G_result.dat, {pid}_nu_result.dat, {pid}_E_result.dat"
    )

if __name__ == "__main__":
    main()