from pathlib import Path
from wolfgpu.gl_utils import Path, np
from wolfgpu.results_store import ResultsStore
from wolfgpu.simple_simulation import SimpleSimulation
import matplotlib.pyplot as plt
import numpy as np
import tqdm
[docs]
def plot_evolution_of_simulation_base(sim: SimpleSimulation, rs: ResultsStore):
#dx, dy = wolf2d.myparam.dxfin, wolf2d.myparam.dyfin
dx, dy = sim.param_dx, sim.param_dy
r = []
times = []
clock_times = []
for i in tqdm.tqdm(range(1,rs.nb_results)):
t,h,qx,qy,dryup_niter,clock_t = rs.get_named_result(["t","h","qx","qy","dryup_niter","clock_t"],i)
msk = h > 0
x_discharge = dx * qx[msk]
y_discharge = dy * qy[msk]
q = np.sqrt(x_discharge**2 + y_discharge**2)
r.append( [np.sum(h[msk])*dx*dy, np.sum(q), dryup_niter])
times.append(t)
clock_times.append(clock_t)
rs.close()
r = np.array(r)
fig, axs = plt.subplots(2,2)
axs[0,0].plot(times, r[:,0])
axs[0,0].set_xlabel("Sim. Time (s)")
axs[0,0].set_ylabel("Water (m³)")
axs[0,1].plot(times, r[:,1])
axs[0,1].set_xlabel("Sim. Time (s)")
axs[0,1].set_ylabel("Q (m³/s)")
#print((r[1:,2]-r[:-1,2]).tolist())
clock_times = np.array(clock_times)
axs[1,0].bar(times, np.hstack([clock_times[1:][0], clock_times[1:] - clock_times[:-1]]), width=times[-1] /(1.5*rs.nb_results))
axs[1,0].set_xlabel("Clock Time (s)")
axs[1,0].set_ylabel("Sim. Time (sec./recd)")
# dry ups tiles * loops * RK or euler
axs[1,1].bar(times, [r[0,2]] + (r[1:,2]-r[:-1,2]).tolist(), width=times[-1] /(1.5*rs.nb_results))
axs[1,1].set_xlabel("Sim. Time (s)")
axs[1,1].set_ylabel("Dried ups tiles × loops")
fig.tight_layout()
plt.show()
[docs]
def plot_evolution_of_simulation(path_to_model: Path, path_to_results_store: Path):
# FIXME Put this in another package: the simulator should not know about the ResultStore
import matplotlib.pyplot as plt
# wolf2d: prev_sim2D =prev_sim2D(dir=str(path_to_model), splash=False, in_gui=False)
rs = ResultsStore(path_to_results_store, "r")
#dx, dy = wolf2d.dx_fine, wolf2d.dy_fine
dx, dy = 1, 1
r = []
times = []
clock_times = []
for i in tqdm.tqdm(range(1,rs.nb_results)):
t,h,qx,qy,dryup_niter,clock_t = rs.get_named_result(["t","h","qx","qy","dryup_niter","clock_t"],i)
msk = h > 0
x_discharge = dx * qx[msk]
y_discharge = dy * qy[msk]
q = np.sqrt(x_discharge**2 + y_discharge**2)
r.append( [np.sum(h[msk])*dx*dy, np.sum(q), dryup_niter])
times.append(t)
clock_times.append(clock_t)
rs.close()
r = np.array(r)
fig, axs = plt.subplots(2,2)
axs[0,0].plot(times, r[:,0])
axs[0,0].set_xlabel("Sim. Time (s)")
axs[0,0].set_ylabel("Water (m³)")
axs[0,1].plot(times, r[:,1])
axs[0,1].set_xlabel("Sim. Time (s)")
axs[0,1].set_ylabel("Q (m³/s)")
#print((r[1:,2]-r[:-1,2]).tolist())
clock_times = np.array(clock_times)
axs[1,0].bar(times, np.hstack([clock_times[1:][0], clock_times[1:] - clock_times[:-1]]), width=times[-1] /(1.5*rs.nb_results))
axs[1,0].set_xlabel("Clock Time (s)")
axs[1,0].set_ylabel("Sim. Time (sec./recd)")
# dry ups tiles * loops * RK or euler
axs[1,1].bar(times, [r[0,2]] + (r[1:,2]-r[:-1,2]).tolist(), width=times[-1] /(1.5*rs.nb_results))
axs[1,1].set_xlabel("Sim. Time (s)")
axs[1,1].set_ylabel("Dried ups tiles × loops")
fig.tight_layout()
plt.show()