swh:1:snp:6088ab52ef49920e01e3f334cdf4d5d6c8a822b9
Raw File
Tip revision: 6d7fa1dea3d869deea52ce9e42fe2b0ec001b4b3 authored by Tom Fischer on 30 March 2022, 08:58:56 UTC
[PL] Added HM prefix to test case names
Tip revision: 6d7fa1d
Output.h
/**
 * \file
 * \copyright
 * Copyright (c) 2012-2022, OpenGeoSys Community (http://www.opengeosys.org)
 *            Distributed under a Modified BSD License.
 *              See accompanying file LICENSE.txt or
 *              http://www.opengeosys.org/project/license
 *
 */

#pragma once

#include <algorithm>
#include <iosfwd>
#include <iterator>
#include <string>
#include <vector>

namespace ChemistryLib
{
namespace PhreeqcIOData
{
class BasicOutputSetups
{
public:
    explicit BasicOutputSetups(std::string const& project_file_name,
                               bool const use_high_precision_)
        : output_file(project_file_name + "_phreeqc.out"),
          use_high_precision(use_high_precision_)
    {
    }

    static int getNumberOfItemsInDisplay()
    {
        return display_simulation_id + display_state + display_solution_id +
               display_distance + display_current_time + display_time_step +
               display_pH + display_pe;
    }

    static int getNumberOfDroppedItems()
    {
        return display_simulation_id + display_state + display_solution_id +
               display_distance + display_current_time + display_time_step;
    }

    friend std::ostream& operator<<(
        std::ostream& os, BasicOutputSetups const& basic_output_setups);

    std::string const output_file;

private:
    static const bool display_simulation_id = false;
    static const bool display_state = true;
    static const bool display_solution_id = true;
    static const bool display_distance = false;
    static const bool display_current_time = false;
    static const bool display_time_step = false;
    static const bool display_pH = true;
    static const bool display_pe = true;
    bool const use_high_precision;
};

enum class ItemType
{
    pH,
    pe,
    Component,
    EquilibriumReactant,
    KineticReactant,
    SecondaryVariable
};

struct OutputItem
{
    OutputItem(std::string name_, ItemType item_type_)
        : name(std::move(name_)), item_type(item_type_)
    {
    }

    std::string const name;
    ItemType const item_type;
};

struct Output
{
    Output(BasicOutputSetups&& basic_output_setups_,
           std::vector<OutputItem>&& accepted_items_,
           std::vector<int>&& dropped_item_ids_)
        : basic_output_setups(std::move(basic_output_setups_)),
          accepted_items(std::move(accepted_items_)),
          dropped_item_ids(std::move(dropped_item_ids_))
    {
    }

    std::vector<OutputItem> getOutputItemsByItemType(ItemType item_type) const
    {
        std::vector<OutputItem> matching_items;
        std::copy_if(accepted_items.cbegin(),
                     accepted_items.cend(),
                     std::back_inserter(matching_items),
                     [&item_type](OutputItem const& accepted_item)
                     { return accepted_item.item_type == item_type; });
        return matching_items;
    }

    friend std::ostream& operator<<(std::ostream& os, Output const& output);

    BasicOutputSetups const basic_output_setups;
    std::vector<OutputItem> const accepted_items;
    std::vector<int> const dropped_item_ids;
};
}  // namespace PhreeqcIOData
}  // namespace ChemistryLib
back to top