diff --git a/ProcessLib/ComponentTransport/CreateComponentTransportProcess.cpp b/ProcessLib/ComponentTransport/CreateComponentTransportProcess.cpp index 46a862793bf82d74a9a07bbf533e7b9828616178..8ffb248530d06c67e4701c48a1d629a633a1972a 100644 --- a/ProcessLib/ComponentTransport/CreateComponentTransportProcess.cpp +++ b/ProcessLib/ComponentTransport/CreateComponentTransportProcess.cpp @@ -10,6 +10,7 @@ #include "CreateComponentTransportProcess.h" +#include "ChemistryLib/ChemicalSolverInterface.h" #include "MaterialLib/MPL/CreateMaterialSpatialDistributionMap.h" #include "MeshLib/IO/readMeshFromFile.h" #include "ProcessLib/Output/CreateSecondaryVariables.h" @@ -18,6 +19,7 @@ #include "ComponentTransportProcess.h" #include "ComponentTransportProcessData.h" + namespace ProcessLib { namespace ComponentTransport @@ -141,12 +143,51 @@ std::unique_ptr<Process> createComponentTransportProcess( std::vector<std::reference_wrapper<ProcessLib::ProcessVariable>> per_process_variable; - for (auto& pv : collected_process_variables) + if (!chemical_solver_interface) { - per_process_variable.emplace_back(pv); - process_variables.push_back(std::move(per_process_variable)); + for (auto& pv : collected_process_variables) + { + per_process_variable.emplace_back(pv); + process_variables.push_back(std::move(per_process_variable)); + } } + else { + auto sort_by_component = [&per_process_variable, + collected_process_variables]( + auto const& c_name) { + auto pv = std::find_if(collected_process_variables.begin(), + collected_process_variables.end(), + [&c_name](auto const& v) -> bool { + return v.get().getName() == c_name; + }); + + if (pv == collected_process_variables.end()) + { + OGS_FATAL( + "Component {:s} given in " + "<chemical_system>/<solution>/" + "<components> is not found in specified " + "coupled processes (see " + "<process>/<process_variables>/" + "<concentration>).", + c_name); + } + + per_process_variable.emplace_back(*pv); + return std::move(per_process_variable); + }; + + auto const components = + chemical_solver_interface->getComponentList(); + // pressure + per_process_variable.emplace_back(collected_process_variables[0]); + process_variables.push_back(std::move(per_process_variable)); + // concentration + assert(components.size() + 1 == collected_process_variables.size()); + std::transform(components.begin(), components.end(), + std::back_inserter(process_variables), + sort_by_component); } }