Source code for pythermica.plot_variables
# -*- coding: utf-8 -*-
"""
Created on Wed Jun 9 17:39:13 2021
@author: Zineb Bouaoudate
"""
import numpy as np
import matplotlib.pyplot as plt
import h5py as hp
import os, sys, glob
#=============================================================================
from .thermal_results import Thermica
from pathlib import Path
from tqdm.auto import tqdm
plot_style = {
"axes.grid": True,
"axes.grid.axis": 'y',
"axes.labelsize": 12,
"axes.titlesize": 16,
"figure.autolayout": True,
"figure.dpi": 300,
"figure.figsize": [6.4, 4.8],
"font.family": "STIXGeneral",
"grid.alpha": 0.5,
"grid.color": "grey",
"grid.linestyle": "dotted",
"grid.linewidth": 0.8,
"image.aspect": "auto",
"image.cmap": "plasma",
"image.interpolation": "nearest",
"image.origin": "lower",
"lines.linewidth": 1,
"lines.markersize": 5,
"mathtext.fontset": "stix",
"savefig.format": "eps",
"xtick.labelsize": 10,
"xtick.minor.visible": True,
"xtick.top": True,
"ytick.labelsize": 10,
"ytick.minor.visible": True,
"ytick.right": True,
"savefig.facecolor": "w"
}
plt.rcParams.update(plot_style)
[docs]def figure_over_nodes(therm_results,
temperatures,
times,
n_orbits,
path_list, case_names,
nodes_to_process = ["/Powercard P60", "/Printed Circuits",
"/Transponders (1)", "/Batteries"] ,
path_root = "./",
name_yaxis="Temperature",
filename_prefix="",
progress_bar=True):
"""
generate a bunch of figures to compare simulations
"""
n_path = len(path_list)
period = times[0][-1] / n_orbits
nodes_processed = []
for i, name in enumerate(nodes_to_process):
if name[0] != "/":
nodes_to_process[i] = "/"+name
list_names_unique = therm_results[0].names_unique
for idx_node, node_label in tqdm(enumerate(list_names_unique),
total=len(list_names_unique),
desc=name_yaxis,
disable=not progress_bar):
"""looping over all the object names, hopping they are the same between the different cases"""
if node_label in nodes_to_process:
nodes_processed.append(nodes_to_process)
temperatures_node_average = [] # n_path lists of node-averaged temperature corresponding to n_path cases
temperature_max = [] # maximum temperatures corresponding to n_path cases
temperature_min = [] # minimum temperatures corresponding to n_path cases
temperature_time_average = [] # time-averaged temperatures corresponding to n_path cases
plt.figure(figsize=(10,4))
for idx_path in range(n_path):
index_nodes = []
for i, node in enumerate(therm_results[idx_path].nodes_value):
if node in therm_results[idx_path].nodes_per_names[idx_node]:
index_nodes.append(i)
index_nodes = np.array(index_nodes) # index of nodes corresponding to label
# print("the nodes for "+node_label+" are :", nodes_list_for_label)
# print("the index nodes are :", index_nodes)
_max_temp = []
_min_temp = []
_average_temp = []
for _temp in temperatures[idx_path].T[:, index_nodes]:
_max_temp.append(max(_temp))
_min_temp.append(min(_temp))
_average_temp.append(np.mean(_temp))
temperatures_node_average.append(_average_temp)
temperature_max.append(max(_max_temp))
temperature_min.append(min(_min_temp))
temperature_time_average.append(np.mean(_average_temp))
line, = plt.plot(times[idx_path], temperatures_node_average[idx_path],
label=case_names[idx_path] + f" (max= {temperature_max[idx_path]:2.2f}, min=" +
f"{temperature_min[idx_path]:2.2f}, average=" +
f"{temperature_time_average[idx_path]:2.2f} over {len(index_nodes)} nodes)")
for _temp in temperatures[idx_path].T[:, index_nodes].T:
plt.plot(times[idx_path], _temp, color=line.get_color(), alpha=0.3)
plt.hlines(temperature_time_average[idx_path],
times[idx_path][0],
times[idx_path][-1],
colors=line.get_color())
thermobject = therm_results[0]
solarFlux, time_sf = thermobject.read_solarflux("Results", "Direct Solar", "Flux")
solarFlux = solarFlux.mean(axis=0)
mask_flux = solarFlux > 0
mask_no = solarFlux < 0
solarFlux[mask_flux] = max(temperature_max)
solarFlux[mask_no] = min(temperature_min)
plt.fill_between(time_sf,
solarFlux,
min(temperature_min),
color="y", alpha=0.5, zorder=-999,
linewidth=0)
plt.vlines([period*k for k in range(1, n_orbits+1)], max(temperature_max), min(temperature_min), linestyles="--")
plt.title(node_label[1:])
plt.xlabel('Time (hr)')
plt.ylabel(name_yaxis)
plt.legend(loc="upper center", bbox_to_anchor=(0.5, -0.15))
plt.tight_layout()
figure_name = filename_prefix + node_label[1:] + '.png' # droping the first char which is "/"
p_root = Path(path_root)
p_img_root = p_root / "images"
if not p_img_root.exists():
p_img_root.mkdir()
plt.savefig(p_img_root / figure_name)
plt.close()
for node in nodes_to_process:
if node not in nodes_processed:
pass # print(f"WARNING ! the node {node} has not been processed")
[docs]def totalInternalDissipation(therm_results,
internal_dissipations,
time,
n_orbits,
path_list,
case_names,
nodes_to_process = None ,
path_root = "./",
filename_prefix="Total_IQ"):
"""
generate a bunch of figures to compare simulations
"""
n_path = len(path_list)
period = time[0][-1] / n_orbits
plt.figure(figsize=(10,4))
for idx_path in range(n_path):
total_IQ = np.zeros_like(time[idx_path])
if nodes_to_process is None :
list_to_process = therm_results[idx_path].names_unique
else :
list_to_process = nodes_to_process
for i, name in enumerate(list_to_process):
if name[0] != "/":
list_to_process[i] = "/"+name
for idx_node, node_label in enumerate(therm_results[idx_path].names_unique):
"""looping over all the object names, hopping they are the same between the different cases"""
if node_label in list_to_process:
index_nodes = []
for i, node in enumerate(therm_results[idx_path].nodes_value):
if node in therm_results[idx_path].nodes_per_names[idx_node]:
index_nodes.append(i)
index_nodes = np.array(index_nodes) # index of nodes corresponding to label
# print("the nodes for "+node_label+" are :", nodes_list_for_label)
# print("the index nodes are :", index_nodes)
for _IQ in internal_dissipations[idx_path][index_nodes, :]:
total_IQ += _IQ
line, = plt.plot(time[idx_path], total_IQ,
label=case_names[idx_path],
)
ax = plt.gca()
for k in range(1, n_orbits+1):
ax.axvline(period*k, ls="--")
titletext = "Total internal dissipation power"
# if nodes_to_process is not None:
# titletext += "\n"
# for nodename in nodes_to_process:
# titletext += nodename + ", "
plt.title(titletext)
plt.xlabel('Time (hr)')
plt.ylabel("internal dissipations [W]")
# plt.legend(loc="upper center", bbox_to_anchor=(0.5, -0.15))
p_root = Path(path_root)
p_img_root = p_root / "images"
if not p_img_root.exists():
p_img_root.mkdir()
figure_name = filename_prefix + '.png'
plt.savefig(p_img_root / figure_name)
plt.close()