#include "fesa/analysis/transient_heat_procedure.h" #include #include "fesa/assembly/thermal_assembler.h" #include "thermal_transient_algebra.h" namespace fesa { TransientHeatProcedureExecutor::TransientHeatProcedureExecutor( const ParallelFor& parallel_for, LinearSolver& linear_solver) : parallel_for_{parallel_for}, linear_solver_{linear_solver} {} Result TransientHeatProcedureExecutor::Execute( const Domain& domain) const { auto model = AnalysisModel::Create(domain); if (!model.HasValue()) return Result::Failure(model.GetStatus()); auto dofs = DofManager::CreateThermal(model.Value()); if (!dofs.HasValue()) return Result::Failure(dofs.GetStatus()); auto assembly = AssembleThermal(model.Value(), dofs.Value(), parallel_for_); if (!assembly.HasValue()) return Result::Failure(assembly.GetStatus()); auto state = ThermalAnalysisState::Create(model.Value(), dofs.Value(), assembly.Value()); if (!state.HasValue()) return Result::Failure(state.GetStatus()); const Status completed = thermal_transient_internal::RunThermalHistory( assembly.Value(), dofs.Value(), state.Value(), linear_solver_, [&](const Vector& temperature) { return assembly.Value().RecoverFlux(temperature, parallel_for_); }); if (!completed.IsOk()) return Result::Failure(completed); return Result::Success( {std::move(state.Value()), domain.Warnings()}); } } // namespace fesa