From ada947e74981a758cce5ff78efa99800ff588461 Mon Sep 17 00:00:00 2001
From: Dmitri Naumov <dmitri.naumov@ufz.de>
Date: Fri, 21 Jun 2019 15:36:05 +0200
Subject: [PATCH] Change map of processes to vector.

The name is already included in the process.
---
 Applications/ApplicationsLib/ProjectData.cpp | 16 ++++++++++------
 Applications/ApplicationsLib/ProjectData.h   |  6 +++---
 Applications/CLI/ogs.cpp                     |  2 +-
 ProcessLib/CreateProcessData.cpp             |  9 ++++++---
 ProcessLib/CreateProcessData.h               |  2 +-
 ProcessLib/CreateTimeLoop.cpp                |  2 +-
 ProcessLib/CreateTimeLoop.h                  |  2 +-
 ProcessLib/ProcessData.h                     |  6 +-----
 8 files changed, 24 insertions(+), 21 deletions(-)

diff --git a/Applications/ApplicationsLib/ProjectData.cpp b/Applications/ApplicationsLib/ProjectData.cpp
index 57161cbfbbc..7189bc26a34 100644
--- a/Applications/ApplicationsLib/ProjectData.cpp
+++ b/Applications/ApplicationsLib/ProjectData.cpp
@@ -921,10 +921,15 @@ void ProjectData::parseProcesses(BaseLib::ConfigTree const& processes_config,
             OGS_FATAL("Unknown process type: %s", type.c_str());
         }
 
-        BaseLib::insertIfKeyUniqueElseError(_processes,
-                                            name,
-                                            std::move(process),
-                                            "The process name is not unique");
+        if (BaseLib::containsIf(
+                _processes,
+                [&name](std::unique_ptr<ProcessLib::Process> const& p) {
+                    return p->name == name;
+                }))
+        {
+            OGS_FATAL("The process name '%s' is not unique.", name.c_str());
+        }
+        _processes.push_back(std::move(process));
     }
 }
 
@@ -1020,10 +1025,9 @@ void ProjectData::parseChemicalSystem(
         "Ready for initializing interface to a chemical solver for water "
         "chemistry calculation.");
 
-    auto const& process = _processes.begin()->second;
     if (auto const* component_transport_process = dynamic_cast<
             ProcessLib::ComponentTransport::ComponentTransportProcess const*>(
-            process.get()))
+            _processes[0].get()))
     {
         auto const chemical_solver =
             //! \ogs_file_attr{prj__chemical_system__chemical_solver}
diff --git a/Applications/ApplicationsLib/ProjectData.h b/Applications/ApplicationsLib/ProjectData.h
index a488bc280e9..4c1706781bf 100644
--- a/Applications/ApplicationsLib/ProjectData.h
+++ b/Applications/ApplicationsLib/ProjectData.h
@@ -72,8 +72,8 @@ public:
     //
 
     /// Provides read access to the process container.
-    std::map<std::string, std::unique_ptr<ProcessLib::Process>> const&
-    getProcesses() const
+    std::vector<std::unique_ptr<ProcessLib::Process>> const& getProcesses()
+        const
     {
         return _processes;
     }
@@ -118,7 +118,7 @@ private:
 
     std::unique_ptr<MaterialPropertyLib::Medium> _medium;
     std::vector<std::unique_ptr<MeshLib::Mesh>> _mesh_vec;
-    std::map<std::string, std::unique_ptr<ProcessLib::Process>> _processes;
+    std::vector<std::unique_ptr<ProcessLib::Process>> _processes;
     std::vector<ProcessLib::ProcessVariable> _process_variables;
 
     /// Buffer for each parameter config passed to the process.
diff --git a/Applications/CLI/ogs.cpp b/Applications/CLI/ogs.cpp
index 4b433084fb8..6ed80a84731 100644
--- a/Applications/CLI/ogs.cpp
+++ b/Applications/CLI/ogs.cpp
@@ -220,7 +220,7 @@ int main(int argc, char* argv[])
             INFO("Initialize processes.");
             for (auto& p : project.getProcesses())
             {
-                p.second->initialize();
+                p->initialize();
             }
 
             // Check intermediately that config parsing went fine.
diff --git a/ProcessLib/CreateProcessData.cpp b/ProcessLib/CreateProcessData.cpp
index c5a2d33315f..5067876bbd9 100644
--- a/ProcessLib/CreateProcessData.cpp
+++ b/ProcessLib/CreateProcessData.cpp
@@ -47,7 +47,7 @@ static std::unique_ptr<ProcessData> makeProcessData(
 
 std::vector<std::unique_ptr<ProcessData>> createPerProcessData(
     BaseLib::ConfigTree const& config,
-    const std::map<std::string, std::unique_ptr<Process>>& processes,
+    std::vector<std::unique_ptr<Process>> const& processes,
     std::map<std::string, std::unique_ptr<NumLib::NonlinearSolverBase>> const&
         nonlinear_solvers)
 {
@@ -58,8 +58,11 @@ std::vector<std::unique_ptr<ProcessData>> createPerProcessData(
     {
         //! \ogs_file_attr{prj__time_loop__processes__process__ref}
         auto const pcs_name = pcs_config.getConfigAttribute<std::string>("ref");
-        auto& pcs = *BaseLib::getOrError(
-            processes, pcs_name,
+        auto& pcs = *BaseLib::getIfOrError(
+            processes,
+            [&pcs_name](std::unique_ptr<Process> const& p) {
+                return p->name == pcs_name;
+            },
             "A process with the given name has not been defined.");
 
         auto const nl_slv_name =
diff --git a/ProcessLib/CreateProcessData.h b/ProcessLib/CreateProcessData.h
index 7a127d553b9..f0e7b48d29a 100644
--- a/ProcessLib/CreateProcessData.h
+++ b/ProcessLib/CreateProcessData.h
@@ -15,7 +15,7 @@ namespace ProcessLib
 {
 std::vector<std::unique_ptr<ProcessData>> createPerProcessData(
     BaseLib::ConfigTree const& config,
-    const std::map<std::string, std::unique_ptr<Process>>& processes,
+    std::vector<std::unique_ptr<Process>> const& processes,
     std::map<std::string, std::unique_ptr<NumLib::NonlinearSolverBase>> const&
         nonlinear_solvers);
 
diff --git a/ProcessLib/CreateTimeLoop.cpp b/ProcessLib/CreateTimeLoop.cpp
index 71bbe024db3..03ef0251b35 100644
--- a/ProcessLib/CreateTimeLoop.cpp
+++ b/ProcessLib/CreateTimeLoop.cpp
@@ -22,7 +22,7 @@ namespace ProcessLib
 {
 std::unique_ptr<TimeLoop> createTimeLoop(
     BaseLib::ConfigTree const& config, std::string const& output_directory,
-    const std::map<std::string, std::unique_ptr<Process>>& processes,
+    const std::vector<std::unique_ptr<Process>>& processes,
     const std::map<std::string, std::unique_ptr<NumLib::NonlinearSolverBase>>&
         nonlinear_solvers,
     std::vector<std::unique_ptr<MeshLib::Mesh>> const& meshes,
diff --git a/ProcessLib/CreateTimeLoop.h b/ProcessLib/CreateTimeLoop.h
index 167e0e68ccb..556a87ac01d 100644
--- a/ProcessLib/CreateTimeLoop.h
+++ b/ProcessLib/CreateTimeLoop.h
@@ -47,7 +47,7 @@ namespace ProcessLib
 //! Builds a TimeLoop from the given configuration.
 std::unique_ptr<TimeLoop> createTimeLoop(
     BaseLib::ConfigTree const& config, std::string const& output_directory,
-    std::map<std::string, std::unique_ptr<Process>> const& processes,
+    std::vector<std::unique_ptr<Process>> const& processes,
     std::map<std::string, std::unique_ptr<NumLib::NonlinearSolverBase>> const&
         nonlinear_solvers,
     std::vector<std::unique_ptr<MeshLib::Mesh>> const& meshes,
diff --git a/ProcessLib/ProcessData.h b/ProcessLib/ProcessData.h
index e1d9321c616..2041b9aba23 100644
--- a/ProcessLib/ProcessData.h
+++ b/ProcessLib/ProcessData.h
@@ -15,11 +15,7 @@
 #include "NumLib/TimeStepping/Algorithms/TimeStepAlgorithm.h"
 
 #include "CoupledSolutionsForStaggeredScheme.h"
-
-namespace ProcessLib
-{
-class Process;
-}
+#include "Process.h"
 
 namespace ProcessLib
 {
-- 
GitLab