@startuml C4_Flower_Architecture
!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml

' LAYOUT TOP_DOWN
LAYOUT_WITH_LEGEND()

title Diagramme C4 Container - Architecture Actuelle de Flower.jl

Person(user, "Utilisateur / Physicien", "Configure et lance la simulation")

System_Boundary(flower_system, "Flower.jl (Simulation CFD & Electrolyse)") {

    Container(driver, "Driver / Entry Point", "Julia Script (convergence.jl)", "Point d'entrée. Parse les arguments, initialise la mémoire globale et lance la simulation.")
    
    Container(config, "Configuration Parser", "YAML / PropertyDict", "Charge les paramètres physiques et numériques (ex: convergence...Newton.yml).")

    Container(orchestrator, "Time Orchestrator", "run.jl", "Gère la boucle temporelle (while t < t_end), le pas de temps adaptatif (CFL) et l'enchaînement des solveurs.")

    Container(data_struct, "Data & Mesh Manager", "geometry.jl / common.jl", "Structure de données centrale.\nGère les Grilles Décalées (Staggered), les Champs (Vitesse, Pression, Potentiel) et les LevelSets.")

    Container_Boundary(physics_kernels, "Noyaux Physiques (Computing Kernels)") {
        Container(mod_ns, "Navier-Stokes Solver", "navier_stokes.jl", "Résout l'équation de mouvement (Momentum) et la conservation de la masse.")
        Container(mod_elec, "Electrolysis Module", "electrolysis.jl", "Résout le Potentiel Électrique, la Loi d'Ohm et la cinétique Butler-Volmer.")
        Container(mod_trans, "Transport & Phase", "transport.jl / levelset", "Gère le transport des espèces et l'interface (LevelSet/VOF).")
    }

    Container(lin_solver, "Linear Algebra Wrapper", "poisson.jl / operators.jl", "Assemble les matrices A et les vecteurs b. Appelle les solveurs creux (SparseArrays / IterativeSolvers).")

    Container(io_interface, "I/O Interface", "PDI / HDF5 / Viz", "Exporte les données pour la visualisation (Paraview) et le checkpointing via la librairie PDI.")

}

System_Ext(libpdi, "Librairie PDI", "C/C++ Library", "Gestionnaire d'événements et d'E/S haute performance.")

' Relations
Rel(user, driver, "Lance la simulation", "CLI")
Rel(driver, config, "Lit", "YAML")
Rel(driver, data_struct, "Alloue & Initialise", "Struct Numerical & Mesh")
Rel(driver, orchestrator, "Démarre", "run_forward!")

Rel(orchestrator, mod_ns, "Appelle (Time step)", "run_navier_stokes!")
Rel(orchestrator, mod_elec, "Appelle (Time step)", "solve_poisson_loop!")
Rel(orchestrator, mod_trans, "Appelle (Advection)", "transport!")
Rel(orchestrator, io_interface, "Notifie", "Events PDI")

Rel_D(mod_ns, data_struct, "Lit/Écrit", "u, v, p")
Rel_D(mod_elec, data_struct, "Lit/Écrit", "phi, sigma")
Rel_D(mod_trans, data_struct, "Lit/Écrit", "LevelSet")

Rel(mod_elec, lin_solver, "Résout Ax=b", "Laplacien Potentiel")
Rel(mod_ns, lin_solver, "Résout Ax=b", "Projection Pression")

Rel(io_interface, libpdi, "Calls", "C API")
Rel_U(io_interface, data_struct, "Lit (Pointeurs)", "Champs bruts")

@enduml