Files
simulatore-induttori/config.py
T
davide c67f6f8da6 Scambia calore su tutto il contorno e per conduzione circonferenziale
- Convezione anche sui bordi laterali x = 0 e x = lunghezza (nuovo
  coefficiente h_bordi_W_m2K in ARIA)
- Termine di conduzione lungo y verso il resto della fascetta, assunto a
  temperatura ambiente: q_y = -k*(T - T_amb)/L_y^2 con L_y configurabile
  (lunghezza_conduzione_y_mm in FASCETTA)
- La temperatura iniziale del campo e' la temperatura ambiente del run
  (rimosso temperatura_iniziale_C)
- Fisica estratta in prepara_stato_termico e passo_implicito, condivise
  tra simulate.py e plot_animazione.py per evitare duplicazione
- Entrambi i termini sono lineari e restano nella matrice fattorizzata
  una volta per run

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-05 19:22:51 +02:00

178 lines
6.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Configurazione per il simulatore termico 2D della sezione di una fascetta.
#
# Geometria e modello fisico:
# - La fascetta è un anello cilindrico con diametro "diametro_mm", spessore
# "spessore_mm" e lunghezza "lunghezza_mm".
# - Il dominio simulato è la sezione rettangolare lunghezza × spessore.
# - Sistema di coordinate: origine (0, 0) nel vertice in alto a sinistra
# della sezione. x = direzione della lunghezza (da 0 a lunghezza),
# z = direzione dello spessore (0 = lato esterno, dove agiscono le
# sorgenti; spessore = lato interno, osservato dal sensore).
# - y è la coordinata circonferenziale: non è risolta spazialmente, l'offset
# y del percorso delle sorgenti è collassato in un'attenuazione gaussiana
# del flusso.
# - Le sorgenti a induzione si muovono in direzione -x sul lato esterno.
# - Il riscaldamento a induzione è approssimato come riscaldamento volumetrico
# che decade esponenzialmente con la profondità z secondo la skin depth.
# - La sezione scambia per convezione con l'aria su tutti e quattro i lati
# (esterno, interno e i due bordi in x) e per conduzione lungo y con il
# resto della fascetta, assunto a temperatura ambiente.
# - La temperatura iniziale della fascetta è pari alla temperatura ambiente.
# - Il sensore è un pirometro a infrarossi posto all'interno della fascetta,
# a distanza "distanza_parete_mm" dalla parete interna: misura senza
# contatto la temperatura della superficie interna nel punto x = "x_mm".
#
# Unità di misura:
# - lunghezza: m (mm dove indicato dal suffisso)
# - tempo: s
# - temperatura: °C
# - flusso termico: W/m²
# - coefficiente di convezione: W/(m² K)
SIMULAZIONE = {
# Numero di file CSV da generare.
"num_run": 2,
# Tempo simulato totale.
"durata_s": 30.0,
# Frequenza di campionamento CSV.
# Esempio: 2 Hz significa una riga ogni 0.5 s.
"frequenza_campionamento_hz": 10.0,
# Passo di integrazione numerica interna.
# Può essere inferiore al periodo di campionamento CSV.
"dt_interno_s": 0.0002,
# Seed per la riproducibilità.
"seed": 42,
# Cartella di output.
"cartella_output": "dataset",
}
FASCETTA = {
# Diametro della fascetta [mm].
"diametro_mm": 70.0,
# Lunghezza della fascetta lungo x [mm].
"lunghezza_mm": 100.0,
# Spessore della parete [mm].
"spessore_mm": 0.12,
# Numero di celle del volume finito lungo x (lunghezza).
"n_nodi_x": 100,
# Numero di celle del volume finito lungo z (spessore).
# Più nodi = maggiore risoluzione spaziale, simulazione più lenta.
"n_nodi_z": 15,
# Distanza caratteristica lungo y (direzione circonferenziale) su cui la
# sezione scambia calore per conduzione con il resto della fascetta,
# assunto a temperatura ambiente.
"lunghezza_conduzione_y_mm": 25.0,
# Deve corrispondere a una chiave in materials.py.
"materiale": "banda_stagnata",
}
ARIA = {
# Temperatura dell'aria ambiente.
"temperatura_ambiente_C": 25.0,
# Coefficiente di convezione sul lato esterno (z = 0, lato sorgenti).
"h_esterno_W_m2K": 12.0,
# Coefficiente di convezione sul lato interno (z = spessore, lato sensore).
"h_interno_W_m2K": 8.0,
# Coefficiente di convezione sui bordi laterali (x = 0 e x = lunghezza).
"h_bordi_W_m2K": 10.0,
}
SORGENTE = {
# Distanza dal sensore, all'inizio della corsa, della sorgente del
# gruppo più vicina al sensore (quella che lo raggiunge per prima).
"x_inizio_m": 1.0,
# Distanza dal sensore, alla fine della corsa, della sorgente del
# gruppo più lontana dal sensore (quella che lo supera per ultima).
"x_fine_m": 5.0,
# Offset circonferenziale (y) tra il percorso delle sorgenti e il punto
# osservato dal sensore. Se diverso da zero, la sorgente passa a lato,
# riducendo il picco.
"offset_y_percorso_m": 0.0,
# Velocità delle sorgenti lungo x. Il segno indica il verso di marcia.
"velocita_m_s": -2.0,
# Numero di sorgenti equidistanti che si muovono insieme come un gruppo
# rigido (stessa velocità, sigma, flusso ed efficienza).
"numero_sorgenti": 3,
# Distanza lungo x tra sorgenti consecutive del gruppo.
"distanza_sorgenti_m": 0.5,
# Raggio del punto gaussiano. Valore più alto = impronta termica più larga.
"sigma_punto_m": 0.012,
# Flusso termico incidente massimo prima della correzione per efficienza.
"flusso_termico_picco_W_m2": 5500000.0,
# Frazione del flusso incidente che diventa effettivamente calore nella fascetta.
"efficienza_riscaldamento": 0.35,
# Frequenza di induzione usata per stimare la skin depth se skin_depth_fissa_m è None.
"frequenza_hz": 20000.0,
# Override della skin depth. Usare None per calcolarla dalle proprietà elettriche del materiale.
# Esempio: 0.0002 significa 0.2 mm.
"skin_depth_fissa_m": None,
# Annulla il flusso termico una volta che la sorgente ha superato x_fine_m.
"zero_dopo_fine": True,
}
SENSORE = {
# Coordinata x del punto della superficie interna osservato dal sensore [mm].
"x_mm": 50.0,
# Distanza del sensore dalla parete interna lungo z [mm].
# Il sensore è a infrarossi: la distanza non influenza la misura,
# è registrata solo come geometria del setup.
"distanza_parete_mm": 10.0,
# Inerzia del sensore del primo ordine.
# Valore più alto = risposta del sensore più lenta.
"costante_tempo_s": 0.05,
# Deviazione standard del rumore gaussiano.
"rumore_std_C": 0.15,
# Risoluzione del sensore: passo di quantizzazione della lettura.
# Esempio: 0.25 significa che i valori sono arrotondati a 0.25 °C.
# Usare 0.0 per disabilitare.
"quantizzazione_C": 0.25,
}
RANDOMIZZAZIONE = {
# Se abilitata, ogni run varia leggermente alcuni parametri.
"abilitata": True,
# Deviazioni standard relative.
"velocita_std_rel": 0.007,
"flusso_picco_std_rel": 0.007,
"sigma_punto_std_rel": 0.007,
# Deviazioni standard assolute.
"temperatura_ambiente_std_C": 0.5,
"rumore_sensore_std_rel": 0.25,
# Offset casuale uniforme del percorso della sorgente in y.
# Esempio: +/- 0.012 m significa che l'induttore può passare fino a 12 mm
# dalla linea ideale allineata con il sensore.
"offset_y_max_assoluto_m": 0.001,
}