https://gitlab.opengeosys.org/ogs/ogs.git
Raw File
Tip revision: 59c5250eec79eed89975490fe94e71b6429833fb authored by Wenqing Wang on 21 July 2021, 13:46:52 UTC
[XDMF] applied clang-format
Tip revision: 59c5250
ProcessUtils.cpp
/**
 * \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<ProcessLib::ProcessVariable> 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 <process_variables>). 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<ProcessLib::ProcessVariable&>(*variable);
}
}  // namespace

namespace ProcessLib
{
ProcessVariable& findProcessVariable(
    std::vector<ProcessVariable> 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<std::string>(tag);
    return findVariableByName(variables, name, tag);
}

std::vector<std::reference_wrapper<ProcessVariable>> findProcessVariables(
    std::vector<ProcessVariable> const& variables,
    BaseLib::ConfigTree const& pv_config,
    std::initializer_list<std::string>
        tags)
{
    std::vector<std::reference_wrapper<ProcessVariable>> 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<std::reference_wrapper<ProcessVariable>> findProcessVariables(
    std::vector<ProcessVariable> const& variables,
    BaseLib::ConfigTree const& pv_config,
    std::string const& tag)
{
    std::vector<std::reference_wrapper<ProcessVariable>> vars;

    //! \ogs_file_special
    auto var_names = pv_config.getConfigParameterList<std::string>(tag);

    if (var_names.empty())
    {
        OGS_FATAL("No entity is found with config tag <{:s}>.", tag);
    }

    std::vector<std::string> 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
back to top