c4level3_electrolysis.txt 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. @startuml C4_Flower_Functional_Logic
  2. !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml
  3. ' LAYOUT TOP_DOWN
  4. LAYOUT_WITH_LEGEND()
  5. title Diagramme C4 (Niveau 3) - Logique Fonctionnelle & Physique
  6. Container(main, "Sim Launcher", "C / Julia", "Configure la physique (Re, CFL, Géométrie) et alloue la mémoire.")
  7. Container_Boundary(sim_core, "Cœur de Simulation (Boucle Temporelle)") {
  8. Component(time_loop, "Orchestrateur Temporel", "run_forward!", "QUOI: Séquence les opérateurs (Fluide -> Elec -> Transport).\nPOURQUOI: Faire avancer l'état physique du temps t au temps t+dt.")
  9. Component(timestep, "Contrôleur de Stabilité (CFL)", "adapt_timestep!", "QUOI: Calcule dt = min(dx/u, dx²/D).\nPOURQUOI: Garantir que la simulation ne diverge pas (explose) numériquement.")
  10. Component(memory, "État Physique (State)", "Structs", "QUOI: Stocke les champs (u,v,p,phi) et l'interface.\nPOURQUOI: Maintenir la continuité de la physique entre les itérations.")
  11. ' --- SOUS-SYSTÈME ELECTROLYSE ---
  12. Boundary(mod_elec, "Module Électrolyse (Résolution du Potentiel)", "electrolysis.c") {
  13. Component(updater_sigma, "Calcul Conductivité (Sigma)", "update_electrical_conductivity", "QUOI: Mappe la Phase (Liq/Gaz) vers la Conductivité (10.0 / 0.0).\nPOURQUOI: Le courant ne passe que dans le liquide (Loi d'Ohm locale).")
  14. Component(solver_poisson, "Solveur de Poisson", "solve_poisson_loop", "QUOI: Résout l'équation div(sigma * grad(phi)) = 0.\nPOURQUOI: Trouver le Potentiel Électrique qui respecte la conservation de la charge.")
  15. Component(flux_calc, "Calcul de Flux (Loi d'Ohm)", "compute_current_density", "QUOI: Calcule J = -sigma * grad(phi) par différences finies.\nPOURQUOI: Connaître la densité de courant (A/m²) pour la réaction électrochimique.")
  16. }
  17. ' --- SOUS-SYSTÈME FLUIDE ---
  18. Boundary(mod_ns, "Module Navier-Stokes (Dynamique des Fluides)", "navier_stokes.c") {
  19. Component(ns_solver, "Solveur de Mouvement", "run_navier_stokes!", "QUOI: Résout Navier-Stokes + Incompressibilité.\nPOURQUOI: Déplacer le fluide et l'interface sous l'effet des forces.")
  20. }
  21. ' --- OUTILS MATHS ---
  22. Component(lin_alg, "Algèbre Linéaire", "Ax = b Solver", "QUOI: Inverse la matrice Laplacienne.\nPOURQUOI: Outil mathématique nécessaire pour résoudre l'équation de Poisson.")
  23. ' --- SORTIES ---
  24. Component(io_pdi, "Export Données", "PDI / HDF5", "QUOI: Écrit les champs 2D/3D sur disque.\nPOURQUOI: Permettre la visualisation (Paraview) et le post-traitement scientifique.")
  25. }
  26. ' --- FLUX DE DONNÉES ET CAUSALITÉ ---
  27. Rel(main, memory, "Initialise (t=0)")
  28. Rel(main, time_loop, "Lance")
  29. ' Déroulement d'un pas de temps
  30. Rel(time_loop, timestep, "1. Vérifie stabilité")
  31. Rel(time_loop, ns_solver, "2. Bouge le fluide")
  32. Rel(time_loop, solver_poisson, "3. Établit le champ électrique")
  33. Rel(time_loop, io_pdi, "4. Sauvegarde")
  34. ' Logique Interne Electrolyse
  35. Rel(solver_poisson, updater_sigma, "A. Prépare le milieu (Où est le liquide ?)")
  36. Rel(updater_sigma, memory, "Lit LevelSet / Écrit Sigma")
  37. Rel(solver_poisson, lin_alg, "B. Résout l'équilibre (Matrice)")
  38. Rel(lin_alg, memory, "Met à jour Phi (Potentiel)")
  39. Rel(solver_poisson, flux_calc, "C. Dérive le courant (Post-process)")
  40. Rel(flux_calc, memory, "Lit Phi / Écrit J (Vecteur)")
  41. ' Liens transverses
  42. Rel(timestep, memory, "Lit Vitesse Max")
  43. @enduml