fem.py risolve l'equazione del calore transitoria sulla superficie media del cilindro con elementi shell quadrangolari bilineari: la circonferenza diventa una direzione risolta (niente più attenuazione gaussiana né sink di aletta), mentre lo spessore è collassato perché con parete da 0.18 mm il numero di Biot è ~1e-7. Eulero implicito con matrice costante fattorizzata una volta per run; le matrici di elemento sono identiche per tutti gli elementi e l'assemblaggio è vettorizzato. plot_animazione_fem.py dipinge il campo calcolato direttamente sugli elementi della mesh, con ombreggiatura ricavata dalla normale radiale perché i colori delle facce cambiano a ogni fotogramma. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
86 lines
2.2 KiB
Python
86 lines
2.2 KiB
Python
# Punto di ingresso unico del progetto: seleziona da riga di comando quale
|
|
# azione eseguire.
|
|
#
|
|
# python main.py mesh # disegna la sola mesh a elementi shell
|
|
# python main.py simula # genera il dataset di run
|
|
# python main.py grafico # grafici del primo run generato
|
|
# python main.py anima # animazione 2D della sezione
|
|
# python main.py anima3d # animazione 3D isometrica del barattolo
|
|
# python main.py fem # animazione 3D del campo FEM sulla mesh shell
|
|
#
|
|
# Senza argomenti stampa l'elenco delle azioni disponibili.
|
|
|
|
import argparse
|
|
import sys
|
|
|
|
|
|
def _azione_mesh() -> None:
|
|
import plot_mesh
|
|
|
|
plot_mesh.main()
|
|
|
|
|
|
def _azione_simula() -> None:
|
|
import simulate
|
|
|
|
simulate.main()
|
|
|
|
|
|
def _azione_grafico() -> None:
|
|
import plot_csv
|
|
|
|
plot_csv.main()
|
|
|
|
|
|
def _azione_anima() -> None:
|
|
import plot_animazione
|
|
|
|
plot_animazione.main()
|
|
|
|
|
|
def _azione_anima3d() -> None:
|
|
import plot_animazione_3d
|
|
|
|
plot_animazione_3d.main()
|
|
|
|
|
|
def _azione_fem() -> None:
|
|
import plot_animazione_fem
|
|
|
|
plot_animazione_fem.main()
|
|
|
|
|
|
# Chiave da riga di comando -> (funzione, descrizione mostrata nell'help).
|
|
AZIONI = {
|
|
"mesh": (_azione_mesh, "Disegna la mesh a elementi shell della fascetta"),
|
|
"simula": (_azione_simula, "Genera il dataset di run nella cartella di output"),
|
|
"grafico": (_azione_grafico, "Grafici temperatura e flusso del primo run"),
|
|
"anima": (_azione_anima, "Animazione 2D del campo di temperatura nella sezione"),
|
|
"anima3d": (_azione_anima3d, "Animazione 3D isometrica del barattolo"),
|
|
"fem": (_azione_fem, "Animazione 3D del campo FEM sulla mesh a elementi shell"),
|
|
}
|
|
|
|
|
|
def main() -> None:
|
|
parser = argparse.ArgumentParser(
|
|
description="Simulatore termico della fascetta riscaldata a induzione.",
|
|
formatter_class=argparse.RawTextHelpFormatter,
|
|
)
|
|
parser.add_argument(
|
|
"azione",
|
|
nargs="?",
|
|
choices=list(AZIONI),
|
|
help="\n".join(f"{nome}: {descrizione}" for nome, (_, descrizione) in AZIONI.items()),
|
|
)
|
|
argomenti = parser.parse_args()
|
|
|
|
if argomenti.azione is None:
|
|
parser.print_help()
|
|
sys.exit(1)
|
|
|
|
AZIONI[argomenti.azione][0]()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|