From 16092a3ae94f8cd7f08d89e3f697fb05c45a31cb Mon Sep 17 00:00:00 2001
From: Thomas Fischer <thomas.fischer@ufz.de>
Date: Wed, 28 Nov 2018 13:01:01 +0100
Subject: [PATCH] [PL] Move ProcessOutput from ProcessData to Output.

If 'old' prj-file is used abort with OGS_FATAL.
---
 ProcessLib/CreateProcessData.cpp          | 29 ++++++++++++++---------
 ProcessLib/Output/CreateOutput.cpp        |  3 ++-
 ProcessLib/Output/Output.cpp              | 18 +++++++-------
 ProcessLib/Output/Output.h                | 14 +++++------
 ProcessLib/ProcessData.h                  | 12 +++-------
 ProcessLib/UncoupledProcessesTimeLoop.cpp | 10 +++-----
 6 files changed, 41 insertions(+), 45 deletions(-)

diff --git a/ProcessLib/CreateProcessData.cpp b/ProcessLib/CreateProcessData.cpp
index f925d3e6a3f..a4aa35128fa 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 6cfdceccb11..2e0555aefa9 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 e62fc84c96f..9313ba9ffe6 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 4200f0c6de6..d45d39135c7 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 8a23399e92d..a46eb3e0826 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 19450c9ea72..65e9d4d3d2b 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;
-- 
GitLab