File: post_proc.py

package info (click to toggle)
dolfinx-mpc 0.9.3-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 1,188 kB
  • sloc: python: 7,263; cpp: 5,462; makefile: 69; sh: 4
file content (157 lines) | stat: -rw-r--r-- 5,019 bytes parent folder | download | duplicates (2)
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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
from __future__ import annotations

import matplotlib.pyplot as plt
import numpy as np

# Res 0.1 31776, 0.05 234546, 0.025 1801086, 0.02 3488856, 0.0175 5147961,0.015 7960200
dofs = [31776, 234546, 1801086, 3488856, 5147961, 7960200]


def visualize_side_by_side(dofs):
    fig, ax = plt.subplots()
    plt.grid("on", zorder=1)
    procs = []
    first = True
    slaves = []
    totals = np.zeros(len(dofs))
    for i, dof in enumerate(dofs):
        infile = open("results_bench_{0:d}.txt".format(dof), "r")

        # Read problem info
        procs.append(int(infile.readline().split(": ")[-1].strip("\n")))
        # Skip num dofs
        infile.readline()
        slaves.append(int(infile.readline().split(": ")[-1].strip("\n")))
        solve_iterations = int(infile.readline().split(": ")[-1].strip("\n"))
        # Skip info line
        infile.readline()
        # Read timings
        operations = infile.readlines()
        colors = [
            "tab:blue",
            "tab:brown",
            "tab:orange",
            "tab:green",
            "tab:red",
            "tab:purple",
            "tab:cyan",
            "tab:olive",
        ]
        total_time = 0
        for j, line in enumerate(operations):
            data = line.strip("\n").split(" ")
            if data[0] == "Backsubstitution":
                continue
            if first:
                plt.bar(
                    i,
                    float(data[2]),
                    0.5,
                    bottom=total_time,
                    label=data[0],
                    color=colors[j],
                    zorder=2,
                )
            else:
                plt.bar(i, float(data[2]), 0.5, bottom=total_time, color=colors[j], zorder=2)
            if data[0] == "Solve":
                ax.annotate(
                    "{0:d}".format(solve_iterations),
                    xy=(i, total_time + float(data[2]) / 2),
                    xytext=(0, 0),
                    textcoords="offset points",
                    ha="center",
                    va="bottom",
                )

            total_time += float(data[2])
        first = False
        totals[i] = total_time
    ax.set_xticks(range(len(dofs)))
    labels = dofs
    ax.set_xticklabels(labels)
    assert np.allclose(procs, procs[0])

    # Shrink current axis by 20%
    box = ax.get_position()
    ax.set_position([box.x0, box.y0, box.width * 0.8, box.height])
    ax.legend(bbox_to_anchor=(0.95, 0.5))
    plt.xlabel("Degrees of freedom")

    plt.title(f"Average runtime of operations with {procs[0]} MPI ranks")
    plt.ylabel("Runtime (s)")
    plt.savefig("comparison_bars.png")
    # Second figure
    plt.figure()
    plt.ylabel("Runtime (s)")
    plt.xlabel("Degrees of freedom")
    power_min = int(np.log10(min(dofs)))
    power_max = int(np.log10(max(dofs)) + 1)
    power_tmin = int(np.log10(min(totals)) - 1)
    power_tmax = int(np.log10(max(totals)) + 1)

    plt.axis((10**power_min, 10**power_max, 10**power_tmin, 10**power_tmax))
    plt.plot(dofs, totals, "-ro", label="Simulations")
    # 7
    plt.plot([3.1 * 10**4, 3.1 * 10**7], [4.3 * 10**-1, 4.3 * 10**2], "--g", label="Order 1")
    # 6 procs
    # plt.plot([3.1 * 10**4, 3.1 * 10**7], [4.8 * 10**-1, 4.8 * 10**2], "--g", label="Order 1")
    # 4 procs
    # plt.plot([3.1 * 10**4, 3.1 * 10**7], [5.7 * 10**-1, 5.7 * 10**2], "--g", label="Order 1")
    plt.title(f"Total runtime of core operations with {procs[0]} MPI ranks")
    plt.legend()
    plt.grid()
    plt.xscale("log")
    plt.yscale("log")
    plt.savefig("comparison.png")


def visualize_single(dof):
    infile = open("results_bench_{0:d}.txt".format(dof), "r")

    # Read problem info
    procs = infile.readline().split(": ")[-1].strip("\n")
    # Skip num dofs
    infile.readline()
    slaves = int(infile.readline().split(": ")[-1].strip("\n"))
    infile.readline()
    # solve_iterations = int(infile.readline().split(": ")[-1].strip("\n"))
    # Skip info line
    infile.readline()
    # Read timings
    operations = infile.readlines()
    colors = [
        "tab:blue",
        "tab:brown",
        "tab:orange",
        "tab:green",
        "tab:red",
        "tab:purple",
        "tab:cyan",
        "tab:olive",
    ]
    fig, ax = plt.subplots()
    plt.grid("on", zorder=1)

    for j, line in enumerate(operations):
        data = line.strip("\n").split(" ")
        if data[0] == "Backsubstitution":
            continue
        plt.bar(j, float(data[2]), 0.5, label=data[0], color=colors[j], zorder=2)

    ax.set_xticks([])
    # ax.set_yscale("log")
    plt.legend()

    plt.ylabel("Runtime (s)")
    # Shrink current axis by 20%
    # box = ax.get_position()
    # ax.set_position([box.x0, box.y0, box.width * 0.8, box.height])
    # ax.legend(bbox_to_anchor=(0.95, 0.5))
    plt.title(f"Average runtime of operations with {dof} ({slaves} slaves) on {procs} MPI ranks")

    plt.savefig(f"comparison_{slaves}.png")


visualize_single(max(dofs))
visualize_side_by_side(dofs)