From 29b2bcad454524b43865aeae9bc558eb62fee9cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Atgeirr=20Fl=C3=B8=20Rasmussen?= Date: Thu, 25 Oct 2012 14:47:26 +0200 Subject: [PATCH 1/2] Added new tof computation utility. This program assumes that grid, porosity, flux field and sources are available to read from files. It does not compute any flux field itself. --- examples/compute_tof_from_files.cpp | 173 ++++++++++++++++++++++++++++ 1 file changed, 173 insertions(+) create mode 100644 examples/compute_tof_from_files.cpp diff --git a/examples/compute_tof_from_files.cpp b/examples/compute_tof_from_files.cpp new file mode 100644 index 000000000..30b76f7b8 --- /dev/null +++ b/examples/compute_tof_from_files.cpp @@ -0,0 +1,173 @@ +/* + Copyright 2012 SINTEF ICT, Applied Mathematics. + + This file is part of the Open Porous Media project (OPM). + + OPM is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OPM is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with OPM. If not, see . +*/ + + +#if HAVE_CONFIG_H +#include "config.h" +#endif // HAVE_CONFIG_H + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + + +namespace +{ + void warnIfUnusedParams(const Opm::parameter::ParameterGroup& param) + { + if (param.anyUnused()) { + std::cout << "-------------------- Warning: unused parameters: --------------------\n"; + param.displayUsage(); + std::cout << "-------------------------------------------------------------------------" << std::endl; + } + } +} // anon namespace + + + +// ----------------- Main program ----------------- +int +main(int argc, char** argv) +{ + using namespace Opm; + + parameter::ParameterGroup param(argc, argv, false); + + // Read grid. + GridManager grid_manager(param.get("grid_filename")); + const UnstructuredGrid& grid = *grid_manager.c_grid(); + + // Read porosity, compute pore volume. + std::vector porevol; + { + std::ifstream poro_stream(param.get("poro_filename").c_str()); + std::istream_iterator beg(poro_stream); + std::istream_iterator end; + porevol.assign(beg, end); // Now contains poro. + if (int(porevol.size()) != grid.number_of_cells) { + THROW("Size of porosity field differs from number of cells."); + } + for (int i = 0; i < grid.number_of_cells; ++i) { + porevol[i] *= grid.cell_volumes[i]; + } + } + + // Read flux. + std::vector flux; + { + std::ifstream flux_stream(param.get("flux_filename").c_str()); + std::istream_iterator beg(flux_stream); + std::istream_iterator end; + flux.assign(beg, end); + if (int(flux.size()) != grid.number_of_faces) { + THROW("Size of flux field differs from number of faces."); + } + } + + // Read source terms. + std::vector src; + { + std::ifstream src_stream(param.get("src_filename").c_str()); + std::istream_iterator beg(src_stream); + std::istream_iterator end; + src.assign(beg, end); + if (int(src.size()) != grid.number_of_cells) { + THROW("Size of source term field differs from number of cells."); + } + } + + // Choice of tof solver. + bool use_dg = param.getDefault("use_dg", false); + int dg_degree = -1; + bool use_cvi = false; + if (use_dg) { + dg_degree = param.getDefault("dg_degree", 0); + use_cvi = param.getDefault("use_cvi", false); + } + + // Write parameters used for later reference. + bool output = param.getDefault("output", true); + std::ofstream epoch_os; + std::string output_dir; + if (output) { + output_dir = + param.getDefault("output_dir", std::string("output")); + boost::filesystem::path fpath(output_dir); + try { + create_directories(fpath); + } + catch (...) { + THROW("Creating directories failed: " << fpath); + } + param.writeParam(output_dir + "/simulation.param"); + } + + // Issue a warning if any parameters were unused. + warnIfUnusedParams(param); + + // Solve time-of-flight. + Opm::time::StopWatch transport_timer; + transport_timer.start(); + std::vector tof; + if (use_dg) { + Opm::TransportModelTracerTofDiscGal tofsolver(grid, use_cvi); + tofsolver.solveTof(&flux[0], &porevol[0], &src[0], dg_degree, tof); + } else { + Opm::TransportModelTracerTof tofsolver(grid); + tofsolver.solveTof(&flux[0], &porevol[0], &src[0], tof); + } + transport_timer.stop(); + double tt = transport_timer.secsSinceStart(); + std::cout << "Transport solver took: " << tt << " seconds." << std::endl; + + // Output. + if (output) { + std::string tof_filename = output_dir + "/tof.txt"; + std::ofstream tof_stream(tof_filename.c_str()); + std::copy(tof.begin(), tof.end(), std::ostream_iterator(tof_stream, "\n")); + } +} From 43162d7d99255d66390d4fd82387d8ee6c78bc43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Atgeirr=20Fl=C3=B8=20Rasmussen?= Date: Mon, 29 Oct 2012 08:27:59 +0100 Subject: [PATCH 2/2] Increased number of digits in output. --- examples/compute_tof_from_files.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/compute_tof_from_files.cpp b/examples/compute_tof_from_files.cpp index 30b76f7b8..012def4e6 100644 --- a/examples/compute_tof_from_files.cpp +++ b/examples/compute_tof_from_files.cpp @@ -168,6 +168,7 @@ main(int argc, char** argv) if (output) { std::string tof_filename = output_dir + "/tof.txt"; std::ofstream tof_stream(tof_filename.c_str()); + tof_stream.precision(16); std::copy(tof.begin(), tof.end(), std::ostream_iterator(tof_stream, "\n")); } }