OGS
CreateSurface.cpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
4#include "CreateSurface.h"
5
7#include "MeshLib/Mesh.h"
9#include "Surface.h"
10
11namespace ChemistryLib
12{
13namespace PhreeqcIOData
14{
15std::vector<std::variant<DensityBasedSurfaceSite, MoleBasedSurfaceSite>>
16createSurface(std::optional<BaseLib::ConfigTree> const& config,
17 MeshLib::Mesh& mesh)
18{
19 if (!config)
20 {
21 return {};
22 }
23
24 std::vector<std::variant<DensityBasedSurfaceSite, MoleBasedSurfaceSite>>
25 surface;
26
27 auto const surface_site_unit =
29 config->getConfigAttribute<std::string>("site_unit", "mole");
30
31 if (surface_site_unit == "density")
32 {
33 for (auto const& site_config :
35 config->getConfigSubtreeList("site"))
36 {
38 auto name = site_config.getConfigParameter<std::string>("name");
39
40 auto const site_density =
42 site_config.getConfigParameter<double>("site_density");
43
44 auto const specific_surface_area =
46 site_config.getConfigParameter<double>("specific_surface_area");
47
48 auto const mass =
50 site_config.getConfigParameter<double>("mass");
51
52 surface.push_back(DensityBasedSurfaceSite(
53 std::move(name), site_density, specific_surface_area, mass));
54 }
55
56 return surface;
57 }
58
59 if (surface_site_unit == "mole")
60 {
61 for (auto const& site_config :
63 config->getConfigSubtreeList("site"))
64 {
66 auto name = site_config.getConfigParameter<std::string>("name");
67
68 auto const molality = MeshLib::getOrCreateMeshProperty<double>(
70
71 surface.push_back(MoleBasedSurfaceSite(std::move(name), molality));
72 }
73
74 return surface;
75 }
76
77 OGS_FATAL("Surface site unit should be either of 'density' or 'mole'.");
78}
79} // namespace PhreeqcIOData
80} // namespace ChemistryLib
#define OGS_FATAL(...)
Definition Error.h:19
std::vector< std::variant< DensityBasedSurfaceSite, MoleBasedSurfaceSite > > createSurface(std::optional< BaseLib::ConfigTree > const &config, MeshLib::Mesh &mesh)
PropertyVector< T > * getOrCreateMeshProperty(Mesh &mesh, std::string const &property_name, MeshItemType const item_type, int const number_of_components)