diff --git a/ProcessLib/CreateProcessData.cpp b/ProcessLib/CreateProcessData.cpp index f925d3e6a3f0ec00fa048a3a3beaad3a4b806d8e..a4aa35128fab03d67ef1cec5e9634506f06bd770 100644 --- a/ProcessLib/CreateProcessData.cpp +++ b/ProcessLib/CreateProcessData.cpp @@ -7,9 +7,10 @@ * */ +#include "BaseLib/Algorithm.h" + #include "NumLib/ODESolver/TimeDiscretizationBuilder.h" #include "NumLib/TimeStepping/CreateTimeStepper.h" -#include "ProcessLib/Output/CreateProcessOutput.h" #include "CreateProcessData.h" @@ -20,8 +21,7 @@ static std::unique_ptr<ProcessData> makeProcessData( NumLib::NonlinearSolverBase& nonlinear_solver, Process& process, std::unique_ptr<NumLib::TimeDiscretization>&& time_disc, - std::unique_ptr<NumLib::ConvergenceCriterion>&& conv_crit, - ProcessOutput&& process_output) + std::unique_ptr<NumLib::ConvergenceCriterion>&& conv_crit) { using Tag = NumLib::NonlinearSolverTag; @@ -31,8 +31,7 @@ static std::unique_ptr<ProcessData> makeProcessData( { return std::make_unique<ProcessData>( std::move(timestepper), *nonlinear_solver_picard, - std::move(conv_crit), std::move(time_disc), process, - std::move(process_output)); + std::move(conv_crit), std::move(time_disc), process); } if (auto* nonlinear_solver_newton = dynamic_cast<NumLib::NonlinearSolver<Tag::Newton>*>( @@ -40,8 +39,7 @@ static std::unique_ptr<ProcessData> makeProcessData( { return std::make_unique<ProcessData>( std::move(timestepper), *nonlinear_solver_newton, - std::move(conv_crit), std::move(time_disc), process, - std::move(process_output)); + std::move(conv_crit), std::move(time_disc), process); } OGS_FATAL("Encountered unknown nonlinear solver type. Aborting"); @@ -83,13 +81,22 @@ std::vector<std::unique_ptr<ProcessData>> createPerProcessData( //! \ogs_file_param{prj__time_loop__processes__process__convergence_criterion} pcs_config.getConfigSubtree("convergence_criterion")); - ProcessOutput process_output = - //! \ogs_file_param{prj__time_loop__processes__process__output} - createProcessOutput(pcs_config.getConfigSubtree("output")); + auto output = pcs_config.getConfigSubtreeOptional("output"); + if (output) + { + OGS_FATAL( + "In order to make the specification of output in the project " + "file consistent, the variables output tags were moved from " + "xpath " + "'//OpenGeoSysProject/time_loop/processes/process/output' " + "to the global output section, i.e., to the xpath " + "'//OpenGeoSysProject/time_loop/output'. This has to be done " + "in the current project file!"); + } per_process_data.emplace_back(makeProcessData( std::move(timestepper), nl_slv, pcs, std::move(time_disc), - std::move(conv_crit), std::move(process_output))); + std::move(conv_crit))); } if (per_process_data.size() != processes.size()) diff --git a/ProcessLib/Output/CreateOutput.cpp b/ProcessLib/Output/CreateOutput.cpp index 6cfdceccb11b39c76608369165deba1048471849..2e0555aefa9de61051e7fb8d35e5592dbe42976b 100644 --- a/ProcessLib/Output/CreateOutput.cpp +++ b/ProcessLib/Output/CreateOutput.cpp @@ -116,7 +116,8 @@ std::unique_ptr<Output> createOutput(const BaseLib::ConfigTree& config, return std::make_unique<Output>(output_directory, prefix, compress_output, data_mode, output_iteration_results, std::move(repeats_each_steps), - std::move(fixed_output_times)); + std::move(fixed_output_times), + std::move(process_output)); } } // namespace ProcessLib diff --git a/ProcessLib/Output/Output.cpp b/ProcessLib/Output/Output.cpp index e62fc84c96f04ffd61f57d4babd6d2ab259db5a0..9313ba9ffe644960c22334763f9c167c9d25b403 100644 --- a/ProcessLib/Output/Output.cpp +++ b/ProcessLib/Output/Output.cpp @@ -85,14 +85,16 @@ Output::Output(std::string output_directory, std::string prefix, bool const compress_output, std::string const& data_mode, bool const output_nonlinear_iteration_results, std::vector<PairRepeatEachSteps> repeats_each_steps, - std::vector<double>&& fixed_output_times) + std::vector<double>&& fixed_output_times, + ProcessOutput&& process_output) : _output_directory(std::move(output_directory)), _output_file_prefix(std::move(prefix)), _output_file_compression(compress_output), _output_file_data_mode(convertVtkDataMode(data_mode)), _output_nonlinear_iteration_results(output_nonlinear_iteration_results), _repeats_each_steps(std::move(repeats_each_steps)), - _fixed_output_times(std::move(fixed_output_times)) + _fixed_output_times(std::move(fixed_output_times)), + _process_output(std::move(process_output)) { } @@ -135,7 +137,6 @@ Output::ProcessData* Output::findProcessData(Process const& process, void Output::doOutputAlways(Process const& process, const int process_id, - ProcessOutput const& process_output, unsigned timestep, const double t, GlobalVector const& x) @@ -148,7 +149,7 @@ void Output::doOutputAlways(Process const& process, process.getProcessVariables(process_id), process.getSecondaryVariables(), process.getIntegrationPointWriter(), - process_output); + _process_output); // For the staggered scheme for the coupling, only the last process, which // gives the latest solution within a coupling loop, is allowed to make @@ -176,14 +177,13 @@ void Output::doOutputAlways(Process const& process, void Output::doOutput(Process const& process, const int process_id, - ProcessOutput const& process_output, unsigned timestep, const double t, GlobalVector const& x) { if (shallDoOutput(timestep, t)) { - doOutputAlways(process, process_id, process_output, timestep, t, x); + doOutputAlways(process, process_id, timestep, t, x); } #ifdef USE_INSITU // Note: last time step may be output twice: here and in @@ -194,14 +194,13 @@ void Output::doOutput(Process const& process, void Output::doOutputLastTimestep(Process const& process, const int process_id, - ProcessOutput const& process_output, unsigned timestep, const double t, GlobalVector const& x) { if (!shallDoOutput(timestep, t)) { - doOutputAlways(process, process_id, process_output, timestep, t, x); + doOutputAlways(process, process_id, timestep, t, x); } #ifdef USE_INSITU InSituLib::CoProcess(process.getMesh(), t, timestep, true); @@ -210,7 +209,6 @@ void Output::doOutputLastTimestep(Process const& process, void Output::doOutputNonlinearIteration(Process const& process, const int process_id, - ProcessOutput const& process_output, const unsigned timestep, const double t, GlobalVector const& x, const unsigned iteration) @@ -228,7 +226,7 @@ void Output::doOutputNonlinearIteration(Process const& process, process.getProcessVariables(process_id), process.getSecondaryVariables(), process.getIntegrationPointWriter(), - process_output); + _process_output); // For the staggered scheme for the coupling, only the last process, which // gives the latest solution within a coupling loop, is allowed to make diff --git a/ProcessLib/Output/Output.h b/ProcessLib/Output/Output.h index 4200f0c6de6c1e73463ccedfd17e741951ad5ee0..d45d39135c7a08c099e2a71eff9b626cf82f6d2b 100644 --- a/ProcessLib/Output/Output.h +++ b/ProcessLib/Output/Output.h @@ -43,7 +43,8 @@ public: bool const compress_output, std::string const& data_mode, bool const output_nonlinear_iteration_results, std::vector<PairRepeatEachSteps> repeats_each_steps, - std::vector<double>&& fixed_output_times); + std::vector<double>&& fixed_output_times, + ProcessOutput&& process_output); //! TODO doc. Opens a PVD file for each process. void addProcess(ProcessLib::Process const& process, const int process_id); @@ -51,14 +52,12 @@ public: //! Writes output for the given \c process if it should be written in the //! given \c timestep. void doOutput(Process const& process, const int process_id, - ProcessOutput const& process_output, unsigned timestep, - const double t, GlobalVector const& x); + unsigned timestep, const double t, GlobalVector const& x); //! Writes output for the given \c process if it has not been written yet. //! This method is intended for doing output after the last timestep in //! order to make sure that its results are written. void doOutputLastTimestep(Process const& process, const int process_id, - ProcessOutput const& process_output, unsigned timestep, const double t, GlobalVector const& x); @@ -66,14 +65,13 @@ public: //! This method will always write. //! It is intended to write output in error handling routines. void doOutputAlways(Process const& process, const int process_id, - ProcessOutput const& process_output, unsigned timestep, - const double t, GlobalVector const& x); + unsigned timestep, const double t, + GlobalVector const& x); //! Writes output for the given \c process. //! To be used for debug output after an iteration of the nonlinear solver. void doOutputNonlinearIteration(Process const& process, const int process_id, - ProcessOutput const& process_output, const unsigned timestep, const double t, GlobalVector const& x, const unsigned iteration); @@ -118,6 +116,8 @@ private: //! Determines if there should be output at the given \c timestep or \c t. bool shallDoOutput(unsigned timestep, double const t); + + ProcessOutput const _process_output; }; diff --git a/ProcessLib/ProcessData.h b/ProcessLib/ProcessData.h index 8a23399e92d7c52cf01545173dd89bfe15fbb4b2..a46eb3e082652c9f390b82548e353e2cbb84dd61 100644 --- a/ProcessLib/ProcessData.h +++ b/ProcessLib/ProcessData.h @@ -14,8 +14,6 @@ #include "NumLib/ODESolver/Types.h" #include "NumLib/TimeStepping/Algorithms/TimeStepAlgorithm.h" -#include "ProcessLib/Output/ProcessOutput.h" - #include "CoupledSolutionsForStaggeredScheme.h" namespace ProcessLib @@ -32,16 +30,14 @@ struct ProcessData NumLib::NonlinearSolver<NLTag>& nonlinear_solver, std::unique_ptr<NumLib::ConvergenceCriterion>&& conv_crit_, std::unique_ptr<NumLib::TimeDiscretization>&& time_disc_, - Process& process_, - ProcessOutput&& process_output_) + Process& process_) : timestepper(std::move(timestepper_)), nonlinear_solver_tag(NLTag), nonlinear_solver(nonlinear_solver), nonlinear_solver_converged(true), conv_crit(std::move(conv_crit_)), time_disc(std::move(time_disc_)), - process(process_), - process_output(std::move(process_output_)) + process(process_) { } @@ -54,8 +50,7 @@ struct ProcessData time_disc(std::move(pd.time_disc)), tdisc_ode_sys(std::move(pd.tdisc_ode_sys)), mat_strg(pd.mat_strg), - process(pd.process), - process_output(std::move(pd.process_output)) + process(pd.process) { pd.mat_strg = nullptr; } @@ -85,6 +80,5 @@ struct ProcessData int process_id = 0; Process& process; - ProcessOutput process_output; }; } // namespace ProcessLib diff --git a/ProcessLib/UncoupledProcessesTimeLoop.cpp b/ProcessLib/UncoupledProcessesTimeLoop.cpp index 19450c9ea720cbb8a64d332d6de21ec29fd73ae8..65e9d4d3d2bc88e71a10fe254d34de54e4a49208 100644 --- a/ProcessLib/UncoupledProcessesTimeLoop.cpp +++ b/ProcessLib/UncoupledProcessesTimeLoop.cpp @@ -258,7 +258,6 @@ bool solveOneTimeStepOneProcess(int const process_id, GlobalVector& x, auto const post_iteration_callback = [&](unsigned iteration, GlobalVector const& x) { output_control.doOutputNonlinearIteration(process, process_id, - process_data.process_output, timestep, t, x, iteration); }; @@ -662,9 +661,7 @@ bool UncoupledProcessesTimeLoop::solveUncoupledEquationSystems( if (!process_data->timestepper->isSolutionErrorComputationNeeded()) { // save unsuccessful solution - _output->doOutputAlways(pcs, process_id, - process_data->process_output, - timestep_id, t, x); + _output->doOutputAlways(pcs, process_id, timestep_id, t, x); OGS_FATAL(nonlinear_fixed_dt_fails_info.data()); } @@ -757,7 +754,6 @@ bool UncoupledProcessesTimeLoop::solveCoupledEquationSystemsByStaggeredScheme( { // save unsuccessful solution _output->doOutputAlways(process_data->process, process_id, - process_data->process_output, timestep_id, t, x); OGS_FATAL(nonlinear_fixed_dt_fails_info.data()); } @@ -870,12 +866,12 @@ void UncoupledProcessesTimeLoop::outputSolutions( process_data->process .setCoupledTermForTheStaggeredSchemeToLocalAssemblers(); (output_object.*output_class_member)( - pcs, process_id, process_data->process_output, timestep, t, x); + pcs, process_id, timestep, t, x); } else { (output_object.*output_class_member)( - pcs, process_id, process_data->process_output, timestep, t, x); + pcs, process_id, timestep, t, x); } ++process_id;