@startuml C4_Flower_Functional_Logic !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml ' LAYOUT TOP_DOWN LAYOUT_WITH_LEGEND() title Diagramme C4 (Niveau 3) - Logique Fonctionnelle & Physique Container(main, "Sim Launcher", "C / Julia", "Configure la physique (Re, CFL, Géométrie) et alloue la mémoire.") Container_Boundary(sim_core, "Cœur de Simulation (Boucle Temporelle)") { 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.") 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.") 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.") ' --- SOUS-SYSTÈME ELECTROLYSE --- Boundary(mod_elec, "Module Électrolyse (Résolution du Potentiel)", "electrolysis.c") { 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).") 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.") 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.") } ' --- SOUS-SYSTÈME FLUIDE --- Boundary(mod_ns, "Module Navier-Stokes (Dynamique des Fluides)", "navier_stokes.c") { 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.") } ' --- OUTILS MATHS --- 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.") ' --- SORTIES --- 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.") } ' --- FLUX DE DONNÉES ET CAUSALITÉ --- Rel(main, memory, "Initialise (t=0)") Rel(main, time_loop, "Lance") ' Déroulement d'un pas de temps Rel(time_loop, timestep, "1. Vérifie stabilité") Rel(time_loop, ns_solver, "2. Bouge le fluide") Rel(time_loop, solver_poisson, "3. Établit le champ électrique") Rel(time_loop, io_pdi, "4. Sauvegarde") ' Logique Interne Electrolyse Rel(solver_poisson, updater_sigma, "A. Prépare le milieu (Où est le liquide ?)") Rel(updater_sigma, memory, "Lit LevelSet / Écrit Sigma") Rel(solver_poisson, lin_alg, "B. Résout l'équilibre (Matrice)") Rel(lin_alg, memory, "Met à jour Phi (Potentiel)") Rel(solver_poisson, flux_calc, "C. Dérive le courant (Post-process)") Rel(flux_calc, memory, "Lit Phi / Écrit J (Vecteur)") ' Liens transverses Rel(timestep, memory, "Lit Vitesse Max") @enduml