#ifndef FESA_ANALYSIS_PREPARED_ANALYSIS_H_ #define FESA_ANALYSIS_PREPARED_ANALYSIS_H_ #include #include #include #include "fesa/analysis/analysis_procedure.h" #include "fesa/analysis/prepared_analysis_outcome.h" #include "fesa/core/diagnostic.h" #include "fesa/core/status.h" #include "fesa/model/domain.h" namespace fesa { class ParallelFor; class LinearSolver; class TangentSolver; class EigenSolver; class LinearStaticProcedureExecutor; class LinearFrequencyProcedureExecutor; class EigenResultsWriter; class NewtonIterationLogWriter; class NonlinearResultsWriter; class NonlinearStaticProcedureExecutor; class ResultsWriter; class HhtDynamicProcedureExecutor; class DynamicResultsWriter; class ThermalResultsWriter; class SolidResultsWriter; class SolidFrequencyProcedureExecutor; class SolidStaticProcedureExecutor; class SolidHhtDynamicProcedureExecutor; class TransientHeatProcedureExecutor; struct DerivedOutputPaths; /// @brief Owns one parsed and semantically mapped analysis input. struct PreparedAnalysisInput { Domain domain; std::vector diagnostics; }; /// @brief Parses and maps an input file exactly once for procedure execution. /// @param input_path Source Abaqus input path. /// @return A movable Domain and sorted mapping diagnostics, or an input /// failure. Result PrepareAnalysisInput( const std::filesystem::path& input_path); /// @brief Creates exactly one selected family with caller-owned adapters. /// @note Domain and adapters remain alive and unmoved throughout execution. Result> CreateAnalysisProcedure( const Domain &domain, const ParallelFor ¶llel_for, LinearSolver &linear_solver, TangentSolver &tangent_solver, const EigenSolver &eigen_solver, NewtonIterationLogWriter &log); /// @brief Executes a caller-selected procedure through the common interface. Result ExecutePreparedAnalysis(const Domain &domain, AnalysisProcedure &procedure); /// @brief Selects the approved procedure from a prepared Domain. /// @pre The executors and log outlive this call. /// @param thermal_executor Required only for a thermal Domain, whose structural /// step collection is empty; absence returns a solver failure. /// @return A validated procedure outcome without opening a result file. Result ExecutePreparedAnalysis( const Domain& domain, LinearStaticProcedureExecutor& linear_executor, NonlinearStaticProcedureExecutor& nonlinear_executor, const LinearFrequencyProcedureExecutor& frequency_executor, NewtonIterationLogWriter& log, const HhtDynamicProcedureExecutor* dynamic_executor = nullptr, const TransientHeatProcedureExecutor* thermal_executor = nullptr, const SolidStaticProcedureExecutor* solid_static_executor = nullptr, const SolidFrequencyProcedureExecutor* solid_frequency_executor = nullptr, const SolidHhtDynamicProcedureExecutor* solid_dynamic_executor = nullptr); /// @brief Writes an already computed outcome to its authoritative result file. /// @pre The Newton log has closed successfully before this function is called. /// @param thermal_writer Required only for a thermal outcome; absence returns /// an output failure without opening the final result. /// @return Success after the selected writer atomically finalizes its result. Status FinalizePreparedAnalysisResult( const DerivedOutputPaths& paths, const Domain& domain, const PreparedAnalysisOutcome& outcome, const std::vector& diagnostics, ResultsWriter& linear_writer, NonlinearResultsWriter& nonlinear_writer, EigenResultsWriter& eigen_writer, DynamicResultsWriter* dynamic_writer = nullptr, ThermalResultsWriter* thermal_writer = nullptr, SolidResultsWriter* solid_writer = nullptr); } // namespace fesa #endif // FESA_ANALYSIS_PREPARED_ANALYSIS_H_