diff --git a/opm/autodiff/SimulatorFullyImplicitBlackoilOutput.cpp b/opm/autodiff/SimulatorFullyImplicitBlackoilOutput.cpp index 7a8ecf91b..11f5d0dc0 100644 --- a/opm/autodiff/SimulatorFullyImplicitBlackoilOutput.cpp +++ b/opm/autodiff/SimulatorFullyImplicitBlackoilOutput.cpp @@ -15,6 +15,9 @@ #include +#ifdef HAVE_DUNE_CORNERPOINT +#include +#endif namespace Opm { @@ -159,16 +162,35 @@ namespace Opm const int step, const std::string& output_dir) { - OPM_THROW(std::runtime_error, "outputStateVtk not implemented"); + // Write data in VTK format. + std::ostringstream vtkfilename; + std::ostringstream vtkpath; + vtkpath << output_dir << "/vtk_files"; + vtkpath << "/output-" << std::setw(3) << std::setfill('0') << step; + boost::filesystem::path fpath(vtkpath.str()); + try { + create_directories(fpath); + } + catch (...) { + OPM_THROW(std::runtime_error, "Creating directories failed: " << fpath); + } + vtkfilename << "output-" << std::setw(3) << std::setfill('0') << step; + Dune::VTKWriter writer(grid.leafView(), Dune::VTK::nonconforming); + writer.addCellData(state.saturation(), "saturation", state.numPhases()); + writer.addCellData(state.pressure(), "pressure", 1); + + std::vector cell_velocity; + Opm::estimateCellVelocity(AutoDiffGrid::numCells(grid), + AutoDiffGrid::numFaces(grid), + AutoDiffGrid::beginFaceCentroids(grid), + AutoDiffGrid::faceCells(grid), + AutoDiffGrid::beginCellCentroids(grid), + AutoDiffGrid::beginCellVolumes(grid), + AutoDiffGrid::dimensions(grid), + state.faceflux(), cell_velocity); + writer.addCellData(cell_velocity, "velocity", Dune::CpGrid::dimension); + writer.pwrite(vtkfilename.str(), vtkpath.str(), std::string("."), Dune::VTK::ascii); } - void outputStateMatlab(const Dune::CpGrid& grid, - const Opm::BlackoilState& state, - const int step, - const std::string& output_dir) - { - OPM_THROW(std::runtime_error, "outputStateMatlab not implemented"); - } - #endif } diff --git a/opm/autodiff/SimulatorFullyImplicitBlackoilOutput.hpp b/opm/autodiff/SimulatorFullyImplicitBlackoilOutput.hpp index 2f581c476..48ca76844 100644 --- a/opm/autodiff/SimulatorFullyImplicitBlackoilOutput.hpp +++ b/opm/autodiff/SimulatorFullyImplicitBlackoilOutput.hpp @@ -3,8 +3,17 @@ #include #include #include +#include +#include + +#include #include +#include +#include +#include + +#include #ifdef HAVE_DUNE_CORNERPOINT #include @@ -31,12 +40,51 @@ namespace Opm const Opm::BlackoilState& state, const int step, const std::string& output_dir); +#endif - - void outputStateMatlab(const Dune::CpGrid& grid, + template + void outputStateMatlab(const Grid& grid, const Opm::BlackoilState& state, const int step, - const std::string& output_dir); -#endif + const std::string& output_dir) + { + Opm::DataMap dm; + dm["saturation"] = &state.saturation(); + dm["pressure"] = &state.pressure(); + dm["surfvolume"] = &state.surfacevol(); + std::vector cell_velocity; + Opm::estimateCellVelocity(AutoDiffGrid::numCells(grid), + AutoDiffGrid::numFaces(grid), + AutoDiffGrid::beginFaceCentroids(grid), + AutoDiffGrid::faceCells(grid), + AutoDiffGrid::beginCellCentroids(grid), + AutoDiffGrid::beginCellVolumes(grid), + AutoDiffGrid::dimensions(grid), + state.faceflux(), cell_velocity); + dm["velocity"] = &cell_velocity; + + // Write data (not grid) in Matlab format + for (Opm::DataMap::const_iterator it = dm.begin(); it != dm.end(); ++it) { + std::ostringstream fname; + fname << output_dir << "/" << it->first; + boost::filesystem::path fpath = fname.str(); + try { + create_directories(fpath); + } + catch (...) { + OPM_THROW(std::runtime_error, "Creating directories failed: " << fpath); + } + fname << "/" << std::setw(3) << std::setfill('0') << step << ".txt"; + std::ofstream file(fname.str().c_str()); + if (!file) { + OPM_THROW(std::runtime_error, "Failed to open " << fname.str()); + } + file.precision(15); + const std::vector& d = *(it->second); + std::copy(d.begin(), d.end(), std::ostream_iterator(file, "\n")); + } + } + + } #endif