Esporta in CSV la temperatura simulata e la lettura del sensore

Nuova azione `python main.py csv`: esporta_csv.py integra il campo FEM e scrive
output/csv/run_XXXX.csv con la temperatura vera della parete nel punto
osservato, la lettura del sensore reale e il massimo nodale istante per
istante, più un metadata.csv con una riga per analisi. La cartella è ricreata a
ogni esecuzione.

Le righe sono campionate a FEM["frequenza_campionamento_hz"],
indipendente dal passo di integrazione, e FEM["num_run"] analisi vengono
esportate di seguito: con la randomizzazione abilitata ognuna ha parametri
diversi ma riproducibili dallo stesso seed.

simula_campo_fem accetta salva_campi=False, perché all'export servono solo le
serie scalari e non i campi nodali di ogni campione, e restituisce anche la
temperatura nodale massima per campione.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-03 11:44:58 +02:00
co-authored by Claude Opus 5
parent 1631d6c94e
commit 97ebab844e
6 changed files with 221 additions and 9 deletions
+11 -3
View File
@@ -387,12 +387,16 @@ def simula_campo_fem(
durata_s: float | None = None,
mesh_dati: dict | None = None,
rng: random.Random | None = None,
salva_campi: bool = True,
) -> dict:
"""Integra il campo FEM fino a durata_s, salvando un campo ogni dt_frame_s.
"""Integra il campo FEM fino a durata_s, campionando ogni dt_frame_s.
Il campo nodale è la temperatura vera della parete; la lettura del sensore
ne è la versione degradata: inerzia del primo ordine, rumore gaussiano e
quantizzazione, questi ultimi due applicati a ogni campionamento.
Con `salva_campi = False` i campi nodali non vengono accumulati (utile per
l'export CSV, che usa solo le serie scalari): `campi` resta una lista vuota.
"""
if rng is None:
rng = random.Random(FEM["seed"])
@@ -415,7 +419,7 @@ def simula_campo_fem(
tau_sensore = max(sensore["costante_tempo_s"], 1e-9)
tempi, campi, x_riferimenti = [], [], []
T_vere, T_lette = [], []
T_vere, T_lette, T_massime = [], [], []
prossimo_frame_t = 0.0
t = 0.0
@@ -430,10 +434,12 @@ def simula_campo_fem(
letta = quantizza(letta, sensore["quantizzazione_C"])
tempi.append(t)
campi.append(T.copy())
if salva_campi:
campi.append(T.copy())
x_riferimenti.append(x_rif)
T_vere.append(float(T[indice_sensore]))
T_lette.append(letta)
T_massime.append(float(T.max()))
prossimo_frame_t += dt_frame_s
t += dt
@@ -446,6 +452,8 @@ def simula_campo_fem(
"x_riferimenti": np.array(x_riferimenti),
"T_vere": np.array(T_vere),
"T_lette": np.array(T_lette),
"T_massime": np.array(T_massime),
"cfg": cfg,
"sorgente": sorgente,
"T_ambiente_C": stato["T_ambiente_C"],
"skin_depth_m": stato["skin_depth_m"],