12 #include <tclap/CmdLine.h>
29 int main(
int argc,
char* argv[])
32 "Creates a layered 3D OGS mesh from an existing 2D OGS mesh and a list "
33 "of raster files representing subsurface layers. Supported raster "
34 "formats are ArcGIS ascii rasters (*.asc) and Surfer Grids (*.grd). "
35 "Only input meshes consisting of line and triangle elements are "
36 "currently supported as mapping of quads might result in invalid mesh "
38 "OpenGeoSys-6 software, version " +
41 "Copyright (c) 2012-2021, OpenGeoSys Community "
42 "(http://www.opengeosys.org)",
45 TCLAP::SwitchArg use_ascii_arg(
"",
"ascii_output",
46 "Write VTU output in ASCII format.");
47 cmd.add(use_ascii_arg);
49 double min_thickness(std::numeric_limits<double>::epsilon());
50 TCLAP::ValueArg<double> min_thickness_arg(
52 "The minimum thickness of a layer to be integrated at any given "
54 false, min_thickness,
"floating point number");
55 cmd.add(min_thickness_arg);
57 TCLAP::ValueArg<std::string> raster_path_arg(
59 "An ascii-file containing a list of raster files, starting from top "
61 true,
"",
"file name");
62 cmd.add(raster_path_arg);
64 TCLAP::ValueArg<std::string> mesh_out_arg(
65 "o",
"output-mesh-file",
"The file name of the resulting 3D mesh.",
66 true,
"",
"file name");
67 cmd.add(mesh_out_arg);
69 TCLAP::ValueArg<std::string> mesh_arg(
"i",
"input-mesh-file",
70 "The file name of the 2D input mesh.",
71 true,
"",
"file name");
74 cmd.parse(argc, argv);
76 if (min_thickness_arg.isSet())
78 min_thickness = min_thickness_arg.getValue();
79 if (min_thickness < 0)
81 ERR(
"Minimum layer thickness must be non-negative value.");
86 INFO(
"Reading mesh '{:s}' ... ", mesh_arg.getValue());
87 std::unique_ptr<MeshLib::Mesh>
const sfc_mesh(
91 ERR(
"Error reading mesh '{:s}'.", mesh_arg.getValue());
94 if (sfc_mesh->getDimension() != 2)
96 ERR(
"Input mesh must be a 2D mesh.");
101 std::vector<std::string> raster_paths =
103 if (raster_paths.size() < 2)
105 ERR(
"At least two raster files needed to create 3D mesh.");
108 std::reverse(raster_paths.begin(), raster_paths.end());
113 if (!mapper.
createLayers(*sfc_mesh, *rasters, min_thickness))
123 std::string output_name(mesh_out_arg.getValue());
126 output_name.append(
".vtu");
129 INFO(
"Writing mesh '{:s}' ... ", output_name);
130 auto const result_mesh = mapper.
getMesh(
"SubsurfaceMesh");
131 if (result_mesh ==
nullptr)
133 ERR(
"Mapper returned empty result for 'SubsurfaceMesh'.");
137 auto const data_mode =
138 use_ascii_arg.getValue() ? vtkXMLWriter::Ascii : vtkXMLWriter::Binary;
Definition of the AsciiRasterInterface class.
void INFO(char const *fmt, Args const &... args)
void ERR(char const *fmt, Args const &... args)
Definition of the MeshLayerMapper class.
Definition of the Mesh class.
Implementation of the VtuInterface class.
virtual bool createLayers(MeshLib::Mesh const &mesh, std::vector< GeoLib::Raster const * > const &rasters, double minimum_thickness, double noDataReplacementValue=0.0) final
std::unique_ptr< MeshLib::Mesh > getMesh(std::string const &mesh_name) const
Returns a mesh of the subsurface representation.
Manipulating and adding prism element layers to an existing 2D mesh.
int main(int argc, char *argv[])
std::vector< std::string > readStringListFromFile(std::string const &filename)
Reads non-empty lines from a list of strings from a file into a vector.
bool hasFileExtension(std::string const &extension, std::string const &filename)
std::optional< std::vector< GeoLib::Raster const * > > readRasters(std::vector< std::string > const &raster_paths)
GITINFOLIB_EXPORT const std::string ogs_version
int writeVtu(MeshLib::Mesh const &mesh, std::string const &file_name, int const data_mode)
MeshLib::Mesh * readMeshFromFile(const std::string &file_name)
Definition of readMeshFromFile function.