10 from scipy.optimize
import fmin
11 import matplotlib.pyplot
as plt
19 from scipy.optimize
import minimize
26 def Serial_Computation(P, Num_Elements, Num_Modes, N_P, N_V_1, N_V_2, N_V_3, Num_Constants, constants, Scheme):
29 O_A_1 = 9 * Num_Elements * (P + 1) ** 2 * Num_Modes * m.log(Num_Modes, 2)
30 O_A_2 = Num_Elements * Num_Modes * (P + 1) ** 2
31 O_A_3 = 6 * Num_Elements * (P + 1) ** 4 * Num_Modes
32 O_A_4 = 15 * Num_Elements * (P + 1) ** 2 * Num_Modes
34 T_A = O_A_1 + O_A_2 + O_A_3 + O_A_4
36 if (Scheme ==
'IterativeFull'):
37 O_E_1 = 8 * Num_Elements * (P + 1) ** 2
38 O_E_2 = Num_Elements * (P + 1) ** 2
39 O_E_3 = Num_Elements * ((4 * P ** 3) + (18 * P ** 2) + (26 * P) + 12)
40 O_E_4 = 6 * Num_Elements * (P + 1) ** 2
42 t_e = O_E_1 + O_E_2 + O_E_3 + O_E_4
44 T_E = (N_P + N_V_1 + N_V_2 + N_V_3) * t_e
46 if (Scheme ==
'IterativeStaticCond'):
47 O_E_1 = 8 * ((P - 1) ** 2) * 4 * P * Num_Elements * Num_Modes
48 O_E_2 = (N_P + N_V_1 + N_V_2 + N_V_3) * 2 * 16 * (P ** 2) * Num_Elements
49 O_E_3 = (8 * 4 * ((P - 1) ** 2)) + (4 * ((P - 1) ** 2)) * Num_Elements * Num_Modes
50 O_E_4 = 8 * ((((P - 1) ** 2)) ** 2) * Num_Elements * Num_Modes
52 T_E = O_E_1 + O_E_2 + O_E_3 + O_E_4
56 if (Num_Constants == 1):
60 if (Num_Constants == 2):
61 T_A = T_A / constants[0]
62 T_E = T_E / constants[1]
72 def Operation_Count(P, Num_Elements, Num_Modes, N_P, N_V_1, N_V_2, N_V_3, Scheme):
75 O_A_1 = 9 * Num_Elements * (P + 1) ** 2 * Num_Modes * m.log(Num_Modes, 2)
76 O_A_2 = Num_Elements * Num_Modes * (P + 1) ** 2
77 O_A_3 = 6 * Num_Elements * (P + 1) ** 4 * Num_Modes
78 O_A_4 = 15 * Num_Elements * (P + 1) ** 2 * Num_Modes
80 T_A = O_A_1 + O_A_2 + O_A_3 + O_A_4
82 if (Scheme ==
'IterativeFull'):
83 O_E_1 = 8 * Num_Elements * (P + 1) ** 2
84 O_E_2 = Num_Elements * (P + 1) ** 2
85 O_E_3 = Num_Elements * ((4 * P ** 3) + (18 * P ** 2) + (26 * P) + 12)
86 O_E_4 = 6 * Num_Elements * (P + 1) ** 2
88 t_e = O_E_1 + O_E_2 + O_E_3 + O_E_4
90 T_E = (N_P + N_V_1 + N_V_2 + N_V_3) * t_e
92 if (Scheme ==
'IterativeStaticCond'):
93 O_E_1 = 8 * ((P - 1) ** 2) * 4 * P * Num_Elements * Num_Modes
94 O_E_2 = (N_P + N_V_1 + N_V_2 + N_V_3) * 2 * 16 * (P ** 2) * Num_Elements
95 O_E_3 = (8 * 4 * ((P - 1) ** 2)) + (4 * ((P - 1) ** 2)) * Num_Elements * Num_Modes
96 O_E_4 = 8 * ((((P - 1) ** 2)) ** 2) * Num_Elements * Num_Modes
98 T_E = O_E_1 + O_E_2 + O_E_3 + O_E_4
113 for i
in range(0, len(Data)):
115 if (Num_Constants == 1):
116 lemons.append(Data[i] - (T_A[i] + T_E[i])/constants)
118 if (Num_Constants == 2):
119 lemons.append(Data[i] - (T_A[i] / constants[0] + T_E[i] / constants[1]))
122 L_2_norm = np.linalg.norm(lemons, 2)
134 Data = np.array(Data)
139 if (Num_Constants == 1):
142 if (Num_Constants == 2):
143 inital = np.array([1e6, 1e06])
146 Fit = fmin(compare_data, inital, args=(Num_Constants, Data, T_A, T_E), xtol=0.0001, ftol=1, maxiter=1e04, maxfun=1e09)
156 def Run_Serial_Fit(Compare_Serial, Consider_Modes, Num_Constants, P, Num_Elements, Nektar_Modes, Timings, Pressure, Velocity_1, Velocity_2, Velocity_3, Scheme):
162 for i
in range(0, len(Consider_Modes)):
163 Data.append(np.mean(Timings[str(Consider_Modes[i])])/10)
170 for i
in range(0, len(Consider_Modes)):
179 for j
in range(1, Consider_Modes[i] + 1):
188 N_P += Pressure[str(j)][0]
190 Turing =
'King of Computers'
193 N_V_1 += Velocity_1[str(j)][0]
195 Turing =
'King of Computers'
198 N_V_2 += Velocity_2[str(j)][0]
200 Turing =
'King of Computers'
203 N_V_3 += Velocity_3[str(j)][0]
205 Turing =
'King of Computers'
208 (t_a, t_e) =
Operation_Count(P, Num_Elements, Consider_Modes[i], N_P, N_V_1, N_V_2, N_V_3, Scheme)
213 Fit =
Fit_Model(Num_Constants, Data, T_A, T_E)
219 if Compare_Serial
is True:
224 for i
in range(1, len(Nektar_Modes)):
225 Data.append(np.mean(Timings[str(Nektar_Modes[i])])/10)
229 for i
in range(1, len(Nektar_Modes)):
235 for j
in range(1, Nektar_Modes[i] + 1):
241 N_P += Pressure[str(j)][0]
243 Turing =
'King of Computers'
246 N_V_1 += Velocity_1[str(j)][0]
248 Turing =
'King of Computers'
251 N_V_2 += Velocity_2[str(j)][0]
253 Turing =
'King of Computers'
256 N_V_3 += Velocity_3[str(j)][0]
258 Turing =
'King of Computers'
260 Time.append(
Serial_Computation(P, Num_Elements, Nektar_Modes[i], N_P, N_V_1, N_V_2, N_V_3, Num_Constants, Fit, Scheme))
262 Nektar_Modes = list(Nektar_Modes)
268 for i
in range(0, len(Nektar_Modes)):
269 difference.append(abs(Data[i] - Time[i]))
271 mean_diff = np.mean(difference)
272 std_dev_diff = np.std(difference)
273 var_diff = np.var(difference)
276 print(
'The mean of the differences between the Data and the Model is ' + str(mean_diff))
277 print(
'The standard deviation of the differences between the Data and the Model is ' + str(std_dev_diff))
278 print(
'The variance of the differences between the Data and the Model is ' + str(var_diff))
281 fig, ax = plt.subplots()
282 ax.plot(Nektar_Modes, Data, label =
'Data')
283 ax.errorbar(Nektar_Modes, Time, label =
'Model')
284 ax.set_xlabel(
'$ N_Z $')
285 ax.set_ylabel(
'Timestep (s)')
286 ax.set_title(
'Length of Single Timestep: Model vs Data')
288 fig.savefig(
"Output/Figures/Model_vs_Data.png")