@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