OGS
DirectConditionGenerator.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 <cmath>
7#include <fstream>
8#include <limits>
9#include <memory>
10
11#include "BaseLib/Logging.h"
13#include "GeoLib/Raster.h"
14#include "MeshLib/Mesh.h"
15#include "MeshLib/Node.h"
17
18const std::vector<std::pair<std::size_t, double>>&
20 const std::string& filename)
21{
22 if (_direct_values.empty())
23 {
24 GeoLib::Raster* raster(
26 if (!raster)
27 {
28 ERR("Error in DirectConditionGenerator::directToSurfaceNodes() - "
29 "could not load raster file.");
30 return _direct_values;
31 }
32
33 Eigen::Vector3d const dir = -Eigen::Vector3d::UnitZ();
34 const std::vector<MeshLib::Node*> surface_nodes(
36 90));
37 const double no_data(raster->getHeader().no_data);
38 _direct_values.reserve(surface_nodes.size());
39 for (auto const* surface_node : surface_nodes)
40 {
41 double val(raster->getValueAtPoint(*surface_node));
42 val = (val == no_data) ? 0 : val;
43 _direct_values.emplace_back(surface_node->getID(), val);
44 }
45 delete raster;
46
47 std::for_each(surface_nodes.begin(), surface_nodes.end(),
48 std::default_delete<MeshLib::Node>());
49 }
50 else
51 ERR("Error in DirectConditionGenerator::directToSurfaceNodes() - Data "
52 "vector contains outdated values.");
53
54 return _direct_values;
55}
56
57const std::vector<std::pair<std::size_t, double>>&
59 MeshLib::Mesh& mesh, const std::string& filename, double scaling)
60{
61 if (!_direct_values.empty())
62 {
63 ERR("Error in DirectConditionGenerator::directWithSurfaceIntegration()"
64 "- Data vector contains outdated values...");
65 return _direct_values;
66 }
67
68 std::unique_ptr<GeoLib::Raster> raster(
70 if (!raster)
71 {
72 ERR("Error in DirectConditionGenerator::directWithSurfaceIntegration()"
73 "- could not load raster file.");
74 return _direct_values;
75 }
76
77 Eigen::Vector3d const dir({0.0, 0.0, -1.0});
78 double const angle(90);
80 std::unique_ptr<MeshLib::Mesh> surface_mesh(
82 prop_name));
83
84 std::vector<double> node_area_vec =
86 *surface_mesh);
87 const std::vector<MeshLib::Node*>& surface_nodes(surface_mesh->getNodes());
88 const std::size_t nNodes(surface_mesh->getNumberOfNodes());
89 const double no_data(raster->getHeader().no_data);
90
91 MeshLib::PropertyVector<int> const* node_id_pv = nullptr;
92 try
93 {
94 node_id_pv = surface_mesh->getProperties().getPropertyVector<int>(
95 prop_name, MeshLib::MeshItemType::Node, 1);
96 }
97 catch (std::runtime_error const& e)
98 {
99 WARN("{:s}", e.what());
100 return _direct_values;
101 }
102
103 _direct_values.reserve(nNodes);
104 for (std::size_t i = 0; i < nNodes; ++i)
105 {
106 double val(raster->getValueAtPoint(*surface_nodes[i]));
107 val = (val == no_data) ? 0 : ((val * node_area_vec[i]) / scaling);
108 _direct_values.emplace_back((*node_id_pv)[i], val);
109 }
110
111 return _direct_values;
112}
113
114int DirectConditionGenerator::writeToFile(const std::string& name) const
115{
116 std::ofstream out(name.c_str(), std::ios::out);
117
118 if (out)
119 {
120 for (const auto& direct_value : _direct_values)
121 {
122 out << direct_value.first << "\t" << direct_value.second << "\n";
123 }
124
125 out.close();
126 }
127 return 0;
128}
void ERR(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:40
void WARN(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:34
const std::vector< std::pair< std::size_t, double > > & directToSurfaceNodes(const MeshLib::Mesh &mesh, const std::string &filename)
std::vector< std::pair< std::size_t, double > > _direct_values
int writeToFile(const std::string &name) const
const std::vector< std::pair< std::size_t, double > > & directWithSurfaceIntegration(MeshLib::Mesh &mesh, const std::string &filename, double scaling)
static GeoLib::Raster * readRaster(std::string const &fname)
Class Raster is used for managing raster data.
Definition Raster.h:39
double getValueAtPoint(const MathLib::Point3d &pnt) const
Definition Raster.cpp:46
RasterHeader const & getHeader() const
Returns the complete header information.
Definition Raster.h:75
static std::vector< double > getSurfaceAreaForNodes(const MeshLib::Mesh &mesh)
Returns a vector of the areas assigned to each node on a surface mesh.
static MeshLib::Mesh * getMeshSurface(const MeshLib::Mesh &subsfc_mesh, Eigen::Vector3d const &dir, double angle, std::string_view subsfc_node_id_prop_name="", std::string_view subsfc_element_id_prop_name="", std::string_view face_id_prop_name="")
static std::vector< MeshLib::Node * > getSurfaceNodes(const MeshLib::Mesh &mesh, Eigen::Vector3d const &dir, double angle)
Returns the surface nodes of a mesh.
constexpr std::string_view getBulkIDString(MeshItemType mesh_item_type)