/** * \file * \copyright * Copyright (c) 2012-2021, OpenGeoSys Community (http://www.opengeosys.org) * Distributed under a Modified BSD License. * See accompanying file LICENSE.txt or * http://www.opengeosys.org/project/license * */ #include "ProcessUtils.h" #include "BaseLib/ConfigTree.h" #include "ProcessLib/ProcessVariable.h" namespace { ProcessLib::ProcessVariable& findVariableByName( std::vector const& variables, std::string const& name, std::string const& tag) { // Find corresponding variable by name. auto variable = std::find_if(variables.cbegin(), variables.cend(), [&name](ProcessLib::ProcessVariable const& v) { return v.getName() == name; }); if (variable == variables.end()) { OGS_FATAL( "There is no entry of the defined process variable '{:s}' in the " "provided variables list (see tag ). A " "definition is required for config tag <{:s}>.", name, tag); } DBUG("Found process variable '{:s}' for config tag <{:s}>.", variable->getName(), tag); // Const cast is needed because of variables argument constness. return const_cast(*variable); } } // namespace namespace ProcessLib { ProcessVariable& findProcessVariable( std::vector const& variables, BaseLib::ConfigTree const& pv_config, std::string const& tag) { // Find process variable name in process config. //! \ogs_file_special std::string const name = pv_config.getConfigParameter(tag); return findVariableByName(variables, name, tag); } std::vector> findProcessVariables( std::vector const& variables, BaseLib::ConfigTree const& pv_config, std::initializer_list tags) { std::vector> vars; vars.reserve(variables.size()); if (variables.size() > tags.size()) DBUG("Found multiple process variables with a same tag."); for (auto& tag : tags) { auto vars_per_tag = findProcessVariables(variables, pv_config, tag); vars.insert(vars.end(), vars_per_tag.begin(), vars_per_tag.end()); } return vars; } std::vector> findProcessVariables( std::vector const& variables, BaseLib::ConfigTree const& pv_config, std::string const& tag) { std::vector> vars; //! \ogs_file_special auto var_names = pv_config.getConfigParameterList(tag); if (var_names.empty()) { OGS_FATAL("No entity is found with config tag <{:s}>.", tag); } std::vector cached_var_names; for (std::string const& var_name : var_names) { vars.emplace_back(findVariableByName(variables, var_name, tag)); cached_var_names.push_back(var_name); } // Eliminate duplicates in the set of variable names BaseLib::makeVectorUnique(cached_var_names); if (cached_var_names.size() != var_names.size()) { OGS_FATAL("Found duplicates with config tag <{:s}>.", tag); } return vars; } } // namespace ProcessLib