2026-05-13 21:21:53 +02:00
|
|
|
|
import sys
|
|
|
|
|
|
import os
|
|
|
|
|
|
|
|
|
|
|
|
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
|
|
|
|
|
|
|
|
|
|
from fdm.solver import solve
|
|
|
|
|
|
from fdm.visualizer import visualize_fdm
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def print_header():
|
|
|
|
|
|
print("=" * 38)
|
|
|
|
|
|
print(" Heat Equation — FDM Solver")
|
|
|
|
|
|
print(" ∂T/∂t = α ∂²T/∂x²")
|
|
|
|
|
|
print("=" * 38)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def main_menu():
|
|
|
|
|
|
print("\nInitializing solver...")
|
|
|
|
|
|
print("Ready.\n")
|
|
|
|
|
|
|
|
|
|
|
|
T, x_vals, t_vals = None, None, None
|
|
|
|
|
|
|
|
|
|
|
|
while True:
|
|
|
|
|
|
print("\n" + "-" * 30)
|
|
|
|
|
|
print(" MAIN MENU")
|
|
|
|
|
|
print("-" * 30)
|
2026-05-14 12:16:17 +02:00
|
|
|
|
print("1. Risolvi")
|
|
|
|
|
|
print("2. Visualizza")
|
2026-05-13 21:21:53 +02:00
|
|
|
|
print("0. Esci")
|
|
|
|
|
|
print("-" * 30)
|
|
|
|
|
|
|
2026-05-14 12:16:17 +02:00
|
|
|
|
choice = input("Select an option (0-2): ").strip()
|
2026-05-13 21:21:53 +02:00
|
|
|
|
|
|
|
|
|
|
if choice == "1":
|
|
|
|
|
|
T, x_vals, t_vals = solve()
|
|
|
|
|
|
print(f"Soluzione completata. Shape T: {T.shape}")
|
|
|
|
|
|
print(f"T range: [{T.min():.2f}, {T.max():.2f}] °C")
|
|
|
|
|
|
|
2026-05-14 12:16:17 +02:00
|
|
|
|
elif choice == "2":
|
2026-05-13 21:21:53 +02:00
|
|
|
|
if T is None:
|
|
|
|
|
|
print("Eseguire prima l'opzione 1.")
|
|
|
|
|
|
else:
|
|
|
|
|
|
visualize_fdm(T, x_vals, t_vals)
|
|
|
|
|
|
|
|
|
|
|
|
elif choice == "0":
|
|
|
|
|
|
print("Uscita.")
|
|
|
|
|
|
sys.exit(0)
|
|
|
|
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
|
print("Scelta non valida.")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
|
print_header()
|
|
|
|
|
|
main_menu()
|