diff --git a/Applications/DataExplorer/DataView/DirectConditionGenerator.cpp b/Applications/DataExplorer/DataView/DirectConditionGenerator.cpp index 4bbc1edf03a509a82ef8e6cff6819041fef88ce7..329b88a0685be8661631a0d02087bced553f7e26 100644 --- a/Applications/DataExplorer/DataView/DirectConditionGenerator.cpp +++ b/Applications/DataExplorer/DataView/DirectConditionGenerator.cpp @@ -13,6 +13,7 @@ */ #include <fstream> +#include <memory> // ThirdParty/logog #include "logog/include/logog.hpp" @@ -61,33 +62,53 @@ const std::vector< std::pair<std::size_t,double> >& DirectConditionGenerator::di const std::vector< std::pair<std::size_t,double> >& DirectConditionGenerator::directWithSurfaceIntegration(MeshLib::Mesh &mesh, const std::string &filename, double scaling) { - if (_direct_values.empty()) - { - GeoLib::Raster* raster (FileIO::AsciiRasterInterface::readRaster(filename)); - if (!raster) { - ERR("Error in DirectConditionGenerator::directWithSurfaceIntegration() - could not load raster file."); - return _direct_values; - } + if (!_direct_values.empty()) { + ERR( + "Error in DirectConditionGenerator::directWithSurfaceIntegration()" + "- Data vector contains outdated values..."); + return _direct_values; + } - const MathLib::Vector3 dir(0,0,-1); - MeshLib::Mesh* sfc_mesh (MeshLib::MeshSurfaceExtraction::getMeshSurface(mesh, dir, true)); - std::vector<double> node_area_vec = - MeshLib::MeshSurfaceExtraction::getSurfaceAreaForNodes(*sfc_mesh); - const std::vector<MeshLib::Node*> &surface_nodes (sfc_mesh->getNodes()); - const std::size_t nNodes(sfc_mesh->getNNodes()); - const double no_data (raster->getNoDataValue()); - _direct_values.reserve(nNodes); - for (std::size_t i=0; i<nNodes; ++i) - { - double val (raster->getValueAtPoint(*surface_nodes[i])); - val = (val == no_data) ? 0 : ((val*node_area_vec[i])/scaling); - _direct_values.push_back (std::pair<std::size_t, double>(surface_nodes[i]->getID(), val)); - } + std::unique_ptr<GeoLib::Raster> raster( + FileIO::AsciiRasterInterface::readRaster(filename)); + if (!raster) { + ERR( + "Error in DirectConditionGenerator::directWithSurfaceIntegration()" + "- could not load raster file."); + return _direct_values; + } - delete raster; + MathLib::Vector3 const dir(0.0, 0.0, -1.0); + double const angle(90); + std::string const prop_name("OriginalSubsurfaceNodeIDs"); + std::unique_ptr<MeshLib::Mesh> surface_mesh( + MeshLib::MeshSurfaceExtraction::getMeshSurface( + mesh, dir, angle, prop_name)); + + std::vector<double> node_area_vec = + MeshLib::MeshSurfaceExtraction::getSurfaceAreaForNodes(*surface_mesh); + const std::vector<MeshLib::Node*> &surface_nodes(surface_mesh->getNodes()); + const std::size_t nNodes(surface_mesh->getNNodes()); + const double no_data(raster->getNoDataValue()); + + boost::optional<MeshLib::PropertyVector<int> const&> opt_node_id_pv( + surface_mesh->getProperties().getPropertyVector<int>(prop_name)); + if (!opt_node_id_pv) { + ERR( + "Need subsurface node ids, but the property \"%s\" is not " + "available.", + prop_name.c_str()); + return _direct_values; + } + + MeshLib::PropertyVector<int> const& node_id_pv(*opt_node_id_pv); + _direct_values.reserve(nNodes); + for (std::size_t i=0; i<nNodes; ++i) + { + double val(raster->getValueAtPoint(*surface_nodes[i])); + val = (val == no_data) ? 0 : ((val*node_area_vec[i])/scaling); + _direct_values.push_back(std::pair<std::size_t, double>(node_id_pv[i], val)); } - else - std::cout << "Error in DirectConditionGenerator::directWithSurfaceIntegration() - Data vector contains outdated values..." << std::endl; return _direct_values; }