-
Notifications
You must be signed in to change notification settings - Fork 14
/
postprocessing.py
159 lines (136 loc) · 4.65 KB
/
postprocessing.py
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
158
159
import os
import numpy as np
import matplotlib.pyplot as plt
def plot_singular_values(
singular_values, title="", figsize=(12,8),
path="CWD", filename=None, rank=None):
"""
Plots singular values of the SVD decomposition.
:param ndarray singular_values: singular values.
:param str title: if specified, title of the plot.
:param tuple(int,int) figsize: size of the figure (width,height). \
Default is (12,8).
:param str path: if specified, the plot is saved at `path`. \
Default is CWD.
:param str filename: if specified, the plot is saved at `filename`. \
Default is None.
:param MPI_Rank rank: MPI rank for parallel SVD.
"""
if rank is not None:
if rank == 0:
plt.figure(figsize=figsize)
plt.plot(singular_values)
plt.legend()
plt.title(title)
plt.xlabel('Domain')
plt.ylabel('U magnitude')
# save or show plots
if filename:
if path == 'CWD': path = CWD
plt.savefig(os.path.join(path, filename), dpi=200)
plt.close()
else:
plt.show()
def plot_1D_modes(
modes, idxs=[0], title="", figsize=(12,8),
path="CWD", filename=None, rank=None, value='abs'):
"""
Plots modes of the SVD decomposition.
:param ndarray modes: modes.
:param str title: if specified, title of the plot.
:param tuple(int,int) figsize: size of the figure \
(width,height). Default is (12,8).
:param str path: if specified, the plot is saved \
at `path`. Default is CWD.
:param str filename: if specified, the plot \
is saved at `filename`. Default is None.
:param MPI_Rank rank: MPI rank for parallel SVD.
:param str value: whether to plot absolute \
or real value of modes.
"""
if rank is not None:
if rank == 0:
plt.figure(figsize=figsize)
if value.lower() == 'abs':
for idx in idxs:
plt.plot(np.abs(modes[:, idx]),
label='mode '+str(idx))
elif value.lower() == 'real':
for idx in idxs:
plt.plot(np.real(modes[:, idx]),
label='mode '+str(idx))
else:
raise ValueError('`value` not recognized.')
plt.legend()
plt.title(title)
plt.xlabel('Domain')
plt.ylabel('U magnitude')
# save or show plots
if filename:
if path == 'CWD': path = CWD
plt.savefig(os.path.join(path, filename), dpi=200)
plt.close()
else:
plt.show()
def plot_2D_modes(
modes, num_rows, num_cols, num_ranks, idxs=[0], title="", figsize=(12,8),
path="CWD", filename=None, rank=None, value='abs'):
"""
Plots modes of the SVD decomposition.
:param ndarray modes: modes.
:param int num_rows: number of rows (dimension 2) in the 3D dataset.
:param int num_cols: number of columns (dimension 3) in the 3D dataset.
:param int num_ranks: number of ranks for parallel SVD
:param str title: if specified, title of the plot.
:param tuple(int,int) figsize: size of the figure \
(width,height). Default is (12,8).
:param str path: if specified, the plot is saved \
at `path`. Default is CWD.
:param str filename: if specified, the plot \
is saved at `filename`. Default is None.
:param MPI_Rank rank: MPI rank for parallel SVD.
:param str value: whether to plot absolute \
or real value of modes.
"""
if rank is not None:
if rank == 0:
plt.figure(figsize=figsize)
if value.lower() == 'abs':
num_cols_rank = int(num_cols/num_ranks)
dpr = num_rows*num_cols_rank
for idx in idxs:
plot_data = np.abs(modes[:dpr, idx]).reshape(num_rows,-1)
for rank in range(1,num_ranks):
if rank !=num_ranks-1:
temp_data = np.abs(modes[rank*dpr:(rank+1)*dpr, idx]).reshape(num_rows,-1)
plot_data = np.concatenate((plot_data,temp_data),axis=-1) # Stencil decomposition
else:
temp_data = np.abs(modes[rank*dpr:, idx]).reshape(num_rows,-1)
plot_data = np.concatenate((plot_data,temp_data),axis=-1) # Stencil decomposition
plt.imshow(plot_data)
elif value.lower() == 'real':
num_cols_rank = int(num_cols/num_ranks)
dpr = num_rows*num_cols_rank
for idx in idxs:
plot_data = np.real(modes[:dpr, idx]).reshape(num_rows,-1)
for rank in range(1,num_ranks):
if rank !=num_ranks-1:
temp_data = np.real(modes[rank*dpr:(rank+1)*dpr, idx]).reshape(num_rows,-1)
plot_data = np.concatenate((plot_data,temp_data),axis=-1) # Stencil decomposition
else:
temp_data = np.real(modes[rank*dpr:, idx]).reshape(num_rows,-1)
plot_data = np.concatenate((plot_data,temp_data),axis=-1) # Stencil decomposition
plt.imshow(plot_data)
else:
raise ValueError('`value` not recognized.')
plt.legend()
plt.title(title)
plt.xlabel('X')
plt.ylabel('Y')
# save or show plots
if filename:
if path == 'CWD': path = CWD
plt.savefig(os.path.join(path, filename), dpi=200)
plt.close()
else:
plt.show()