From 2cf32b6f4f60c3b2355335720a27b095905dd158 Mon Sep 17 00:00:00 2001 From: Andreas Lauser Date: Wed, 16 Oct 2013 17:54:04 +0200 Subject: [PATCH] Use EclipseWriter from opm-core Note: The interface here requires opm/opm-core#424. --- examples/sim_fibo_ad.cpp | 19 ++++++- .../SimulatorFullyImplicitBlackoil.cpp | 55 ++++++++++++------- .../SimulatorFullyImplicitBlackoil.hpp | 4 +- 3 files changed, 57 insertions(+), 21 deletions(-) diff --git a/examples/sim_fibo_ad.cpp b/examples/sim_fibo_ad.cpp index 69e47fb9a..beb729c27 100644 --- a/examples/sim_fibo_ad.cpp +++ b/examples/sim_fibo_ad.cpp @@ -35,6 +35,7 @@ #include #include +#include #include #include #include @@ -46,9 +47,11 @@ #include #include +#include #include #include +#include #include #include @@ -100,6 +103,19 @@ try deck.reset(new EclipseGridParser(deck_filename)); // Grid init grid.reset(new GridManager(*deck)); + + // use the capitalized part of the deck's filename between the + // last '/' and the last '.' character as base name. + std::string baseName = deck_filename; + auto charPos = baseName.rfind('/'); + if (charPos != std::string::npos) + baseName = baseName.substr(charPos + 1); + charPos = baseName.rfind('.'); + if (charPos != std::string::npos) + baseName = baseName.substr(0, charPos); + baseName = boost::to_upper_copy(baseName); + + Opm::EclipseWriter outputWriter(param, share_obj(*deck), share_obj(*grid->c_grid())); // Rock and fluid init props.reset(new BlackoilPropertiesFromDeck(*deck, *grid->c_grid(), param)); new_props.reset(new BlackoilPropsAdFromDeck(*deck, *grid->c_grid())); @@ -207,7 +223,8 @@ try rock_comp->isActive() ? rock_comp.get() : 0, wells, linsolver, - grav); + grav, + outputWriter); if (epoch == 0) { warnIfUnusedParams(param); } diff --git a/opm/autodiff/SimulatorFullyImplicitBlackoil.cpp b/opm/autodiff/SimulatorFullyImplicitBlackoil.cpp index fd6b983be..83f0ba3ca 100644 --- a/opm/autodiff/SimulatorFullyImplicitBlackoil.cpp +++ b/opm/autodiff/SimulatorFullyImplicitBlackoil.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -71,7 +72,8 @@ namespace Opm const RockCompressibility* rock_comp_props, WellsManager& wells_manager, LinearSolverInterface& linsolver, - const double* gravity); + const double* gravity, + EclipseWriter &writer); SimulatorReport run(SimulatorTimer& timer, BlackoilState& state, @@ -100,6 +102,7 @@ namespace Opm FullyImplicitBlackoilSolver solver_; // Misc. data std::vector allcells_; + EclipseWriter &eclipseWriter_; }; @@ -111,9 +114,11 @@ namespace Opm const RockCompressibility* rock_comp_props, WellsManager& wells_manager, LinearSolverInterface& linsolver, - const double* gravity) + const double* gravity, + EclipseWriter &eclipseWriter) + { - pimpl_.reset(new Impl(param, grid, props, rock_comp_props, wells_manager, linsolver, gravity)); + pimpl_.reset(new Impl(param, grid, props, rock_comp_props, wells_manager, linsolver, gravity, eclipseWriter)); } @@ -257,7 +262,8 @@ namespace Opm const RockCompressibility* rock_comp_props, WellsManager& wells_manager, LinearSolverInterface& linsolver, - const double* gravity) + const double* gravity, + EclipseWriter &eclipseWriter) : grid_(grid), props_(props), rock_comp_props_(rock_comp_props), @@ -265,7 +271,9 @@ namespace Opm wells_(wells_manager.c_wells()), gravity_(gravity), geo_(grid_, props_, gravity_), - solver_(grid_, props_, geo_, rock_comp_props, *wells_manager.c_wells(), linsolver) + solver_(grid_, props_, geo_, rock_comp_props, *wells_manager.c_wells(), linsolver), + eclipseWriter_(eclipseWriter) + /* param.getDefault("nl_pressure_residual_tolerance", 0.0), param.getDefault("nl_pressure_change_tolerance", 1.0), param.getDefault("nl_pressure_maxiter", 10), @@ -306,6 +314,8 @@ namespace Opm BlackoilState& state, WellState& well_state) { + eclipseWriter_.writeInit(timer, state, well_state); + // Initialisation. std::vector porevol; if (rock_comp_props_ && rock_comp_props_->isActive()) { @@ -348,7 +358,7 @@ namespace Opm std::string filename = output_dir_ + "/step_timing.param"; tstep_os.open(filename.c_str(), std::fstream::out | std::fstream::app); } - for (; !timer.done(); ++timer) { + while (!timer.done()) { // Report timestep and (optionally) write state to disk. step_timer.start(); timer.report(std::cout); @@ -382,6 +392,7 @@ namespace Opm solver_timer.stop(); const double st = solver_timer.secsSinceStart(); std::cout << "Fully implicit solver took: " << st << " seconds." << std::endl; + stime += st; sreport.pressure_time = st; @@ -465,22 +476,28 @@ namespace Opm sreport.total_time = step_timer.secsSinceStart(); if (output_) { sreport.reportParam(tstep_os); - } - } - if (output_) { - if (output_vtk_) { - outputStateVtk(grid_, state, timer.currentStepNum(), output_dir_); - } - outputStateMatlab(grid_, state, timer.currentStepNum(), output_dir_); - outputWellStateMatlab(well_state,timer.currentStepNum(), output_dir_); + if (output_vtk_) { + outputStateVtk(grid_, state, timer.currentStepNum(), output_dir_); + } + outputStateMatlab(grid_, state, timer.currentStepNum(), output_dir_); + outputWellStateMatlab(well_state,timer.currentStepNum(), output_dir_); #if 0 - outputWaterCut(watercut, output_dir_); - if (wells_) { - outputWellReport(wellreport, output_dir_); - } + outputWaterCut(watercut, output_dir_); + if (wells_) { + outputWellReport(wellreport, output_dir_); + } #endif - tstep_os.close(); + tstep_os.close(); + } + + // advance to next timestep before reporting at this location + ++timer; + + // write an output file for later inspection + if (output_) { + eclipseWriter_.writeTimeStep(timer, state, well_state); + } } total_timer.stop(); diff --git a/opm/autodiff/SimulatorFullyImplicitBlackoil.hpp b/opm/autodiff/SimulatorFullyImplicitBlackoil.hpp index bbee72380..f7c0a1b92 100644 --- a/opm/autodiff/SimulatorFullyImplicitBlackoil.hpp +++ b/opm/autodiff/SimulatorFullyImplicitBlackoil.hpp @@ -31,6 +31,7 @@ namespace Opm { namespace parameter { class ParameterGroup; } class BlackoilPropsAdInterface; + class EclipseWriter; class RockCompressibility; class WellsManager; class LinearSolverInterface; @@ -71,7 +72,8 @@ namespace Opm const RockCompressibility* rock_comp_props, WellsManager& wells_manager, LinearSolverInterface& linsolver, - const double* gravity); + const double* gravity, + EclipseWriter &writer); /// Run the simulation. /// This will run succesive timesteps until timer.done() is true. It will