#ifndef FESA_ASSEMBLY_SURFACE_PRESSURE_ASSEMBLER_H_ #define FESA_ASSEMBLY_SURFACE_PRESSURE_ASSEMBLER_H_ #include #include "fesa/analysis/analysis_model.h" #include "fesa/assembly/parallel_for.h" #include "fesa/core/diagnostic.h" #include "fesa/core/status.h" #include "fesa/fem/dof_manager.h" #include "fesa/loads/shell_surface_pressure.h" #include "fesa/math/sparse_matrix.h" #include "fesa/math/vector.h" namespace fesa { /// @brief Stores one complete full-space surface-pressure assembly candidate. struct SurfacePressureAssemblyCandidate { Vector full_external_force; SparseMatrix full_external_tangent; std::vector diagnostics; }; /// @brief Assembles active surface-pressure records into stable full DOFs. /// @param model Non-owning active model whose Domain outlives this call. /// @param dofs Owner of the stable shell scatter and full-DOF ordering. /// @param full_generalized_coordinates Full `[u1,u2,u3,phi1,phi2,phi3]` /// coordinates used only for current-configuration evaluation. /// @param load_factor Applied exactly once to every source pressure record. /// @param configuration Selects reference or current surface geometry. /// @param parallel_for Runs only index-owned local evaluator candidates. /// @return A fully validated force/tangent candidate or a structured failure. /// @note Global vector and CSR reduction occur serially after all local work. Result AssembleSurfacePressure( const AnalysisModel& model, const DofManager& dofs, const Vector& full_generalized_coordinates, double load_factor, SurfacePressureConfiguration configuration, const ParallelFor& parallel_for); } // namespace fesa #endif // FESA_ASSEMBLY_SURFACE_PRESSURE_ASSEMBLER_H_