OGS
RandomFieldMeshElementParameter.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
5
6#include <functional>
7#include <random>
8
10#include "MeshLib/Mesh.h"
12
13namespace ParameterLib
14{
15std::unique_ptr<ParameterBase> createRandomFieldMeshElementParameter(
16 std::string const& name, BaseLib::ConfigTree const& config,
17 MeshLib::Mesh& mesh)
18{
20 config.checkConfigParameter("type", "RandomFieldMeshElement");
21 auto const field_name =
23 config.getConfigParameter<std::string>("field_name");
24 auto const range =
26 config.getConfigParameter<std::vector<double>>("range");
27 if (range.size() != 2)
28 {
30 "The range needs to have two components, but {:d} were given.",
31 range.size());
32 }
33 auto const seed =
35 config.getConfigParameter<int>("seed");
36 DBUG("Generating field {:s} with range {:g} to {:g} and seed {:d}.",
37 field_name, range[0], range[1], seed);
38
39 std::vector<double> values(mesh.getElements().size());
40
41 std::mt19937 generator(seed);
42 std::uniform_real_distribution<> distr(range[0], range[1]);
43 auto gen = [&distr, &generator]() { return distr(generator); };
44 generate(begin(values), end(values), gen);
45
47 mesh, field_name, MeshLib::MeshItemType::Cell, 1, {values});
48
49 auto const& property =
50 mesh.getProperties().getPropertyVector<double>(field_name);
51
52 if (property->getMeshItemType() != MeshLib::MeshItemType::Cell)
53 {
54 OGS_FATAL("The mesh property `{:s}' is not an element property.",
55 field_name);
56 }
57
58 return std::make_unique<RandomFieldMeshElementParameter<double>>(name, mesh,
59 *property);
60}
61
62} // namespace ParameterLib
#define OGS_FATAL(...)
Definition Error.h:19
void DBUG(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:22
T getConfigParameter(std::string const &param) const
void checkConfigParameter(std::string const &param, std::string_view const value) const
std::vector< Element * > const & getElements() const
Get the element-vector for the mesh.
Definition Mesh.h:100
Properties & getProperties()
Definition Mesh.h:125
PropertyVector< T > const * getPropertyVector(std::string_view name) const
void addPropertyToMesh(Mesh &mesh, std::string_view name, MeshItemType item_type, std::size_t number_of_components, std::span< T const > values)
std::unique_ptr< ParameterBase > createRandomFieldMeshElementParameter(std::string const &name, BaseLib::ConfigTree const &config, MeshLib::Mesh &mesh)