From a33f7e964b8cae2d9ac5e3733bd80ce1fd94cd7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Atgeirr=20Fl=C3=B8=20Rasmussen?= Date: Thu, 19 Sep 2013 10:09:53 +0200 Subject: [PATCH] Let sim_2p_comp_ad throw if not given an input deck. There is some code in place now to create wells for the no-deck case, but since it does not work correctly yet, the simulator intercepts this and throws. --- examples/sim_2p_comp_ad.cpp | 37 ++++++++++++++++-------- opm/autodiff/ImpesTPFAAD.cpp | 2 +- opm/autodiff/SimulatorCompressibleAd.cpp | 9 ++---- opm/autodiff/SimulatorCompressibleAd.hpp | 4 +-- 4 files changed, 29 insertions(+), 23 deletions(-) diff --git a/examples/sim_2p_comp_ad.cpp b/examples/sim_2p_comp_ad.cpp index 2bda013f6..a511d5d95 100644 --- a/examples/sim_2p_comp_ad.cpp +++ b/examples/sim_2p_comp_ad.cpp @@ -81,6 +81,11 @@ try // If we have a "deck_filename", grid and props will be read from that. bool use_deck = param.has("deck_filename"); + if (!use_deck) { + // This check should be removed when and if this simulator is verified and works without decks. + // The current code for the non-deck case fails for unknown reasons. + OPM_THROW(std::runtime_error, "This simulator cannot run without a deck with wells. Use deck_filename to specify deck."); + } boost::scoped_ptr deck; boost::scoped_ptr grid; boost::scoped_ptr props; @@ -132,12 +137,9 @@ try bool use_gravity = (gravity[0] != 0.0 || gravity[1] != 0.0 || gravity[2] != 0.0); const double *grav = use_gravity ? &gravity[0] : 0; - // Initialising src - int num_cells = grid->c_grid()->number_of_cells; - std::vector src(num_cells, 0.0); - if (use_deck) { - // Do nothing, wells will be the driving force, not source terms. - } else { + // Initialising wells if not from deck. + Wells* simple_wells = 0; + if (!use_deck) { // Compute pore volumes, in order to enable specifying injection rate // terms of total pore volume. std::vector porevol; @@ -150,8 +152,21 @@ try const double default_injection = use_gravity ? 0.0 : 0.1; const double flow_per_sec = param.getDefault("injected_porevolumes_per_day", default_injection) *tot_porevol_init/unit::day; - src[0] = flow_per_sec; - src[num_cells - 1] = -flow_per_sec; + simple_wells = create_wells(2, 2, 2); + const double inj_frac[2] = { 1.0, 0.0 }; + const int inj_cell = 0; + const double WI = 1e-8; + const double all_fluids[2] = { 1.0, 1.0 }; + int ok = add_well(INJECTOR, 0.0, 1, inj_frac, &inj_cell, &WI, "Injector", simple_wells); + ok = ok && append_well_controls(SURFACE_RATE, 0.01*flow_per_sec, all_fluids, 0, simple_wells); + const int prod_cell = grid->c_grid()->number_of_cells - 1; + ok = ok && add_well(PRODUCER, 0.0, 1, NULL, &prod_cell, &WI, "Producer", simple_wells); + ok = ok && append_well_controls(SURFACE_RATE, -0.01*flow_per_sec, all_fluids, 1, simple_wells); + if (!ok) { + OPM_THROW(std::runtime_error, "Simple well init failed."); + } + simple_wells->ctrls[0]->current = 0; + simple_wells->ctrls[1]->current = 0; } // Boundary conditions. @@ -196,13 +211,12 @@ try SimulatorReport rep; if (!use_deck) { // Simple simulation without a deck. - WellsManager wells; // no wells. + WellsManager wells(simple_wells); SimulatorCompressibleAd simulator(param, *grid->c_grid(), *props, rock_comp->isActive() ? rock_comp.get() : 0, wells, - src, bcs.c_bcs(), linsolver, grav); @@ -210,7 +224,7 @@ try simtimer.init(param); warnIfUnusedParams(param); WellState well_state; - well_state.init(0, state); + well_state.init(simple_wells, state); rep = simulator.run(simtimer, state, well_state); } else { // With a deck, we may have more epochs etc. @@ -257,7 +271,6 @@ try *props, rock_comp->isActive() ? rock_comp.get() : 0, wells, - src, bcs.c_bcs(), linsolver, grav); diff --git a/opm/autodiff/ImpesTPFAAD.cpp b/opm/autodiff/ImpesTPFAAD.cpp index 9fdf52685..4ffac1b34 100644 --- a/opm/autodiff/ImpesTPFAAD.cpp +++ b/opm/autodiff/ImpesTPFAAD.cpp @@ -183,7 +183,7 @@ namespace Opm { well_kr_ = fluid_.relperm(well_s.col(0), well_s.col(1), V::Zero(nperf,1), well_cells); const double atol = 1.0e-10; - const double rtol = 5.0e-8; + const double rtol = 5.0e-6; const int maxit = 15; assemble(dt, state, well_state); diff --git a/opm/autodiff/SimulatorCompressibleAd.cpp b/opm/autodiff/SimulatorCompressibleAd.cpp index fdd1977f2..c21ef8acf 100644 --- a/opm/autodiff/SimulatorCompressibleAd.cpp +++ b/opm/autodiff/SimulatorCompressibleAd.cpp @@ -70,7 +70,6 @@ namespace Opm const BlackoilPropertiesInterface& props, const RockCompressibility* rock_comp_props, WellsManager& wells_manager, - const std::vector& src, const FlowBoundaryConditions* bcs, LinearSolverInterface& linsolver, const double* gravity); @@ -99,7 +98,6 @@ namespace Opm const RockCompressibility* rock_comp_props_; WellsManager& wells_manager_; const Wells* wells_; - const std::vector& src_; const FlowBoundaryConditions* bcs_; const double* gravity_; // Solvers @@ -121,12 +119,11 @@ namespace Opm const BlackoilPropertiesInterface& props, const RockCompressibility* rock_comp_props, WellsManager& wells_manager, - const std::vector& src, const FlowBoundaryConditions* bcs, LinearSolverInterface& linsolver, const double* gravity) { - pimpl_.reset(new Impl(param, grid, props, rock_comp_props, wells_manager, src, bcs, linsolver, gravity)); + pimpl_.reset(new Impl(param, grid, props, rock_comp_props, wells_manager, bcs, linsolver, gravity)); } @@ -235,13 +232,12 @@ namespace Opm - // \TODO: make CompressibleTpfa take src and bcs. + // \TODO: make CompressibleTpfa take bcs. SimulatorCompressibleAd::Impl::Impl(const parameter::ParameterGroup& param, const UnstructuredGrid& grid, const BlackoilPropertiesInterface& props, const RockCompressibility* rock_comp_props, WellsManager& wells_manager, - const std::vector& src, const FlowBoundaryConditions* bcs, LinearSolverInterface& linsolver, const double* gravity) @@ -250,7 +246,6 @@ namespace Opm rock_comp_props_(rock_comp_props), wells_manager_(wells_manager), wells_(wells_manager.c_wells()), - src_(src), bcs_(bcs), gravity_(gravity), fluid_(props_), diff --git a/opm/autodiff/SimulatorCompressibleAd.hpp b/opm/autodiff/SimulatorCompressibleAd.hpp index 98f5470f9..0936ad346 100644 --- a/opm/autodiff/SimulatorCompressibleAd.hpp +++ b/opm/autodiff/SimulatorCompressibleAd.hpp @@ -62,8 +62,7 @@ namespace Opm /// \param[in] grid grid data structure /// \param[in] props fluid and rock properties /// \param[in] rock_comp_props if non-null, rock compressibility properties - /// \param[in] well_manager well manager, may manage no (null) wells - /// \param[in] src source terms + /// \param[in] well_manager well manager /// \param[in] bcs boundary conditions, treat as all noflow if null /// \param[in] linsolver linear solver /// \param[in] gravity if non-null, gravity vector @@ -72,7 +71,6 @@ namespace Opm const BlackoilPropertiesInterface& props, const RockCompressibility* rock_comp_props, WellsManager& wells_manager, - const std::vector& src, const FlowBoundaryConditions* bcs, LinearSolverInterface& linsolver, const double* gravity);