Files
simulatore-induttori/config.py
T
davideandClaude Opus 5 1631d6c94e Rimuove il modello ai volumi finiti lasciando la sola analisi FEM
Il progetto conteneva due discretizzazioni indipendenti della stessa fisica:
i volumi finiti sulla sezione x-z di simulate.py (con generazione del dataset
CSV e le sue animazioni 2D/3D) e gli elementi finiti sulla mesh shell di
fem.py. Resta solo il secondo, che risolve la circonferenza invece di
collassarla in un'attenuazione gaussiana.

Eliminati simulate.py, plot_csv.py, plot_animazione.py e plot_animazione_3d.py.
Il FEM dipendeva da simulate.py per la cinematica del gruppo di sorgenti e per
la configurazione del run, quindi fem.py assorbe _x_riferimento_iniziale_m,
_x_riferimento_finale_m, _intervallo_attivo e configurazione_randomizzata; la
lettura del sensore (inerzia, rumore, quantizzazione) è ora applicata dentro
simula_campo_fem e la skin depth resta calcolata dalla frequenza dell'induttore
come sola grandezza diagnostica, dato che nel modello shell lo spessore è
collassato.

config.py perde i parametri che servivano solo ai volumi finiti (griglia
n_nodi_x/n_nodi_z, campionamento e cartella del dataset, numero di processi) e
guadagna FEM["durata_s"], FEM["seed"] e USCITA["cartella"]: le immagini e le
animazioni vanno in output/ invece che in dataset/.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-03 11:44:58 +02:00

166 lines
5.6 KiB
Python

# Configurazione dell'analisi termica a elementi finiti della fascetta.
#
# Geometria e modello fisico:
# - La fascetta è un anello cilindrico con diametro "diametro_mm", spessore
# "spessore_mm" e lunghezza "lunghezza_mm".
# - Il dominio discretizzato è la superficie media del cilindro (mesh a
# elementi shell quadrangolari, vedi mesh.py): x = asse della fascetta,
# s = R·theta = coordinata circonferenziale. Lo spessore non è
# discretizzato, la temperatura è uniforme attraverso la parete.
# - Le sorgenti a induzione si muovono lungo x sulla superficie esterna, con
# un'impronta gaussiana isotropa nel piano (x, s).
# - La superficie scambia per convezione con l'aria sulla faccia esterna e su
# quella interna, più i due bordi anulari x = 0 e x = lunghezza.
# - 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",
# sul piano circonferenziale theta = 0.
#
# Unità di misura:
# - lunghezza: m (mm dove indicato dal suffisso)
# - tempo: s
# - temperatura: °C
# - flusso termico: W/m²
# - coefficiente di convezione: W/(m² K)
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.18,
# Deve corrispondere a una chiave in materials.py.
"materiale": "banda_stagnata",
}
MESH = {
# Numero di elementi shell lungo l'asse x (lunghezza della fascetta).
"n_elementi_x": 40,
# Numero di elementi shell lungo la circonferenza.
# La mesh è chiusa su se stessa: non c'è una riga di nodi duplicata.
"n_elementi_circonferenza": 48,
}
FEM = {
# Passo di integrazione temporale del solutore a elementi finiti.
"dt_s": 0.001,
# Tempo simulato totale dell'analisi transitoria.
"durata_s": 30.0,
# Seed per la riproducibilità di randomizzazione e rumore del sensore.
"seed": 42,
}
ARIA = {
# Temperatura dell'aria ambiente.
"temperatura_ambiente_C": 25.0,
# Coefficiente di convezione sulla faccia esterna (lato sorgenti).
"h_esterno_W_m2K": 12.0,
# Coefficiente di convezione sulla faccia interna (lato sensore).
"h_interno_W_m2K": 8.0,
# Coefficiente di convezione sui bordi anulari (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": 5.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": -1.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": 1.0,
# 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": 4434000.0,
# Frazione del flusso incidente che diventa effettivamente calore nella fascetta.
"efficienza_riscaldamento": 0.35,
# Frequenza di induzione dell'induttore, 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 lo spessore [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.01,
# 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 analisi varia leggermente alcuni parametri.
"abilitata": False,
# 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,
}
USCITA = {
# Cartella in cui salvare immagini e animazioni quando il backend
# matplotlib non è interattivo.
"cartella": "output",
}