Simulators handle WPOLYMER keyword.

They do this by using the class PolymerInflowFromDeck
instead of PolymerInflowBasic if there is a WPOLYMER
keyword somewhere in the deck epochs. If there is no
WPOLYMER, the parameters 'poly_start_days' etc. will
be used to construct an instance of PolymerInflowBasic
instead.
This commit is contained in:
Atgeirr Flø Rasmussen 2012-10-04 16:00:33 +02:00
parent f2e7c0bece
commit e13e77a7bb
6 changed files with 78 additions and 18 deletions

View File

@ -44,6 +44,7 @@
#include <opm/polymer/PolymerBlackoilState.hpp> #include <opm/polymer/PolymerBlackoilState.hpp>
#include <opm/core/simulator/WellState.hpp> #include <opm/core/simulator/WellState.hpp>
#include <opm/polymer/SimulatorCompressiblePolymer.hpp> #include <opm/polymer/SimulatorCompressiblePolymer.hpp>
#include <opm/polymer/PolymerInflow.hpp>
#include <opm/polymer/PolymerProperties.hpp> #include <opm/polymer/PolymerProperties.hpp>
#include <boost/scoped_ptr.hpp> #include <boost/scoped_ptr.hpp>
@ -237,12 +238,16 @@ main(int argc, char** argv)
SimulatorReport rep; SimulatorReport rep;
if (!use_deck) { if (!use_deck) {
// Simple simulation without a deck. // Simple simulation without a deck.
PolymerInflowBasic polymer_inflow(param.getDefault("poly_start_days", 300.0)*Opm::unit::day,
param.getDefault("poly_end_days", 800.0)*Opm::unit::day,
param.getDefault("poly_amount", poly_props.cMax()));
SimulatorCompressiblePolymer simulator(param, SimulatorCompressiblePolymer simulator(param,
*grid->c_grid(), *grid->c_grid(),
*props, *props,
poly_props, poly_props,
rock_comp->isActive() ? rock_comp.get() : 0, rock_comp->isActive() ? rock_comp.get() : 0,
0, // wells 0, // wells
polymer_inflow,
src, src,
bcs.c_bcs(), bcs.c_bcs(),
linsolver, linsolver,
@ -262,6 +267,15 @@ main(int argc, char** argv)
deck->setCurrentEpoch(deck->numberOfEpochs() - 1); deck->setCurrentEpoch(deck->numberOfEpochs() - 1);
simtimer.init(*deck); simtimer.init(*deck);
const double total_time = simtimer.totalTime(); const double total_time = simtimer.totalTime();
// Check for WPOLYMER presence in last epoch to decide
// polymer injection control type.
const bool use_wpolymer = deck->hasField("WPOLYMER");
if (use_wpolymer) {
if (param.has("poly_start_days")) {
MESSAGE("Warning: Using WPOLYMER to control injection since it was found in deck. "
"You seem to be trying to control it via parameter poly_start_days (etc.) as well.");
}
}
for (int epoch = 0; epoch < deck->numberOfEpochs(); ++epoch) { for (int epoch = 0; epoch < deck->numberOfEpochs(); ++epoch) {
// Set epoch index. // Set epoch index.
deck->setCurrentEpoch(epoch); deck->setCurrentEpoch(epoch);
@ -283,8 +297,20 @@ main(int argc, char** argv)
<< "\n (number of steps: " << "\n (number of steps: "
<< simtimer.numSteps() - step << ")\n\n" << std::flush; << simtimer.numSteps() - step << ")\n\n" << std::flush;
// Create new wells, well_state // Create new wells, polymer inflow controls.
WellsManager wells(*deck, *grid->c_grid(), props->permeability()); WellsManager wells(*deck, *grid->c_grid(), props->permeability());
boost::scoped_ptr<PolymerInflowInterface> polymer_inflow;
if (use_wpolymer) {
if (wells.c_wells() == 0) {
THROW("Cannot control polymer injection via WPOLYMER without wells.");
}
polymer_inflow.reset(new PolymerInflowFromDeck(*deck, *wells.c_wells(), props->numCells()));
} else {
polymer_inflow.reset(new PolymerInflowBasic(param.getDefault("poly_start_days", 300.0)*Opm::unit::day,
param.getDefault("poly_end_days", 800.0)*Opm::unit::day,
param.getDefault("poly_amount", poly_props.cMax())));
}
// @@@ HACK: we should really make a new well state and // @@@ HACK: we should really make a new well state and
// properly transfer old well state to it every epoch, // properly transfer old well state to it every epoch,
// since number of wells may change etc. // since number of wells may change etc.
@ -299,6 +325,7 @@ main(int argc, char** argv)
poly_props, poly_props,
rock_comp->isActive() ? rock_comp.get() : 0, rock_comp->isActive() ? rock_comp.get() : 0,
wells.c_wells(), wells.c_wells(),
*polymer_inflow,
src, src,
bcs.c_bcs(), bcs.c_bcs(),
linsolver, linsolver,

View File

@ -44,6 +44,7 @@
#include <opm/polymer/PolymerState.hpp> #include <opm/polymer/PolymerState.hpp>
#include <opm/core/simulator/WellState.hpp> #include <opm/core/simulator/WellState.hpp>
#include <opm/polymer/SimulatorPolymer.hpp> #include <opm/polymer/SimulatorPolymer.hpp>
#include <opm/polymer/PolymerInflow.hpp>
#include <opm/polymer/PolymerProperties.hpp> #include <opm/polymer/PolymerProperties.hpp>
#include <boost/scoped_ptr.hpp> #include <boost/scoped_ptr.hpp>
@ -241,12 +242,16 @@ main(int argc, char** argv)
SimulatorReport rep; SimulatorReport rep;
if (!use_deck) { if (!use_deck) {
// Simple simulation without a deck. // Simple simulation without a deck.
PolymerInflowBasic polymer_inflow(param.getDefault("poly_start_days", 300.0)*Opm::unit::day,
param.getDefault("poly_end_days", 800.0)*Opm::unit::day,
param.getDefault("poly_amount", poly_props.cMax()));
SimulatorPolymer simulator(param, SimulatorPolymer simulator(param,
*grid->c_grid(), *grid->c_grid(),
*props, *props,
poly_props, poly_props,
rock_comp->isActive() ? rock_comp.get() : 0, rock_comp->isActive() ? rock_comp.get() : 0,
0, // wells 0, // wells
polymer_inflow,
src, src,
bcs.c_bcs(), bcs.c_bcs(),
linsolver, linsolver,
@ -266,6 +271,15 @@ main(int argc, char** argv)
deck->setCurrentEpoch(deck->numberOfEpochs() - 1); deck->setCurrentEpoch(deck->numberOfEpochs() - 1);
simtimer.init(*deck); simtimer.init(*deck);
const double total_time = simtimer.totalTime(); const double total_time = simtimer.totalTime();
// Check for WPOLYMER presence in last epoch to decide
// polymer injection control type.
const bool use_wpolymer = deck->hasField("WPOLYMER");
if (use_wpolymer) {
if (param.has("poly_start_days")) {
MESSAGE("Warning: Using WPOLYMER to control injection since it was found in deck. "
"You seem to be trying to control it via parameter poly_start_days (etc.) as well.");
}
}
for (int epoch = 0; epoch < deck->numberOfEpochs(); ++epoch) { for (int epoch = 0; epoch < deck->numberOfEpochs(); ++epoch) {
// Set epoch index. // Set epoch index.
deck->setCurrentEpoch(epoch); deck->setCurrentEpoch(epoch);
@ -287,8 +301,20 @@ main(int argc, char** argv)
<< "\n (number of steps: " << "\n (number of steps: "
<< simtimer.numSteps() - step << ")\n\n" << std::flush; << simtimer.numSteps() - step << ")\n\n" << std::flush;
// Create new wells, well_state // Create new wells, polymer inflow controls.
WellsManager wells(*deck, *grid->c_grid(), props->permeability()); WellsManager wells(*deck, *grid->c_grid(), props->permeability());
boost::scoped_ptr<PolymerInflowInterface> polymer_inflow;
if (use_wpolymer) {
if (wells.c_wells() == 0) {
THROW("Cannot control polymer injection via WPOLYMER without wells.");
}
polymer_inflow.reset(new PolymerInflowFromDeck(*deck, *wells.c_wells(), props->numCells()));
} else {
polymer_inflow.reset(new PolymerInflowBasic(param.getDefault("poly_start_days", 300.0)*Opm::unit::day,
param.getDefault("poly_end_days", 800.0)*Opm::unit::day,
param.getDefault("poly_amount", poly_props.cMax())));
}
// @@@ HACK: we should really make a new well state and // @@@ HACK: we should really make a new well state and
// properly transfer old well state to it every epoch, // properly transfer old well state to it every epoch,
// since number of wells may change etc. // since number of wells may change etc.
@ -303,6 +329,7 @@ main(int argc, char** argv)
poly_props, poly_props,
rock_comp->isActive() ? rock_comp.get() : 0, rock_comp->isActive() ? rock_comp.get() : 0,
wells.c_wells(), wells.c_wells(),
*polymer_inflow,
src, src,
bcs.c_bcs(), bcs.c_bcs(),
linsolver, linsolver,

View File

@ -93,6 +93,7 @@ namespace Opm
const PolymerProperties& poly_props, const PolymerProperties& poly_props,
const RockCompressibility* rock_comp_props, const RockCompressibility* rock_comp_props,
const Wells* wells, const Wells* wells,
const PolymerInflowInterface& polymer_inflow,
const std::vector<double>& src, const std::vector<double>& src,
const FlowBoundaryConditions* bcs, const FlowBoundaryConditions* bcs,
LinearSolverInterface& linsolver, LinearSolverInterface& linsolver,
@ -119,6 +120,7 @@ namespace Opm
const PolymerProperties& poly_props_; const PolymerProperties& poly_props_;
const RockCompressibility* rock_comp_props_; const RockCompressibility* rock_comp_props_;
const Wells* wells_; const Wells* wells_;
const PolymerInflowInterface& polymer_inflow_;
const std::vector<double>& src_; const std::vector<double>& src_;
const FlowBoundaryConditions* bcs_; const FlowBoundaryConditions* bcs_;
const LinearSolverInterface& linsolver_; const LinearSolverInterface& linsolver_;
@ -130,7 +132,6 @@ namespace Opm
std::vector< std::vector<int> > columns_; std::vector< std::vector<int> > columns_;
// Misc. data // Misc. data
std::vector<int> allcells_; std::vector<int> allcells_;
boost::scoped_ptr<PolymerInflowInterface> poly_inflow_;
}; };
@ -142,12 +143,14 @@ namespace Opm
const PolymerProperties& poly_props, const PolymerProperties& poly_props,
const RockCompressibility* rock_comp_props, const RockCompressibility* rock_comp_props,
const Wells* wells, const Wells* wells,
const PolymerInflowInterface& polymer_inflow,
const std::vector<double>& src, const std::vector<double>& src,
const FlowBoundaryConditions* bcs, const FlowBoundaryConditions* bcs,
LinearSolverInterface& linsolver, LinearSolverInterface& linsolver,
const double* gravity) const double* gravity)
{ {
pimpl_.reset(new Impl(param, grid, props, poly_props, rock_comp_props, wells, src, bcs, linsolver, gravity)); pimpl_.reset(new Impl(param, grid, props, poly_props, rock_comp_props,
wells, polymer_inflow, src, bcs, linsolver, gravity));
} }
@ -171,6 +174,7 @@ namespace Opm
const PolymerProperties& poly_props, const PolymerProperties& poly_props,
const RockCompressibility* rock_comp_props, const RockCompressibility* rock_comp_props,
const Wells* wells, const Wells* wells,
const PolymerInflowInterface& polymer_inflow,
const std::vector<double>& src, const std::vector<double>& src,
const FlowBoundaryConditions* bcs, const FlowBoundaryConditions* bcs,
LinearSolverInterface& linsolver, LinearSolverInterface& linsolver,
@ -180,6 +184,7 @@ namespace Opm
poly_props_(poly_props), poly_props_(poly_props),
rock_comp_props_(rock_comp_props), rock_comp_props_(rock_comp_props),
wells_(wells), wells_(wells),
polymer_inflow_(polymer_inflow),
src_(src), src_(src),
bcs_(bcs), bcs_(bcs),
linsolver_(linsolver), linsolver_(linsolver),
@ -228,11 +233,6 @@ namespace Opm
extractColumn(grid_, columns_); extractColumn(grid_, columns_);
} }
// Polymer inflow control.
poly_inflow_.reset(new PolymerInflowBasic(param.getDefault("poly_start_days", 300.0)*Opm::unit::day,
param.getDefault("poly_end_days", 800.0)*Opm::unit::day,
param.getDefault("poly_amount", poly_props.cMax())));
// Misc init. // Misc init.
const int num_cells = grid.number_of_cells; const int num_cells = grid.number_of_cells;
allcells_.resize(num_cells); allcells_.resize(num_cells);
@ -324,7 +324,7 @@ namespace Opm
// Find inflow rate. // Find inflow rate.
const double current_time = timer.currentTime(); const double current_time = timer.currentTime();
double stepsize = timer.currentStepLength(); double stepsize = timer.currentStepLength();
poly_inflow_->getInflowValues(current_time, current_time + stepsize, polymer_inflow_c); polymer_inflow_.getInflowValues(current_time, current_time + stepsize, polymer_inflow_c);
// Solve transport. // Solve transport.
transport_timer.start(); transport_timer.start();

View File

@ -33,6 +33,7 @@ namespace Opm
class BlackoilPropertiesInterface; class BlackoilPropertiesInterface;
class PolymerProperties; class PolymerProperties;
class RockCompressibility; class RockCompressibility;
class PolymerInflowInterface;
class LinearSolverInterface; class LinearSolverInterface;
class SimulatorTimer; class SimulatorTimer;
class PolymerBlackoilState; class PolymerBlackoilState;
@ -64,6 +65,7 @@ namespace Opm
/// \param[in] poly_props polymer properties /// \param[in] poly_props polymer properties
/// \param[in] rock_comp if non-null, rock compressibility properties /// \param[in] rock_comp if non-null, rock compressibility properties
/// \param[in] wells if non-null, wells data structure /// \param[in] wells if non-null, wells data structure
/// \param[in] polymer_inflow polymer inflow controls
/// \param[in] src source terms /// \param[in] src source terms
/// \param[in] bcs boundary conditions, treat as all noflow if null /// \param[in] bcs boundary conditions, treat as all noflow if null
/// \param[in] linsolver linear solver /// \param[in] linsolver linear solver
@ -74,6 +76,7 @@ namespace Opm
const PolymerProperties& poly_props, const PolymerProperties& poly_props,
const RockCompressibility* rock_comp_props, const RockCompressibility* rock_comp_props,
const Wells* wells, const Wells* wells,
const PolymerInflowInterface& polymer_inflow,
const std::vector<double>& src, const std::vector<double>& src,
const FlowBoundaryConditions* bcs, const FlowBoundaryConditions* bcs,
LinearSolverInterface& linsolver, LinearSolverInterface& linsolver,

View File

@ -90,6 +90,7 @@ namespace Opm
const PolymerProperties& poly_props, const PolymerProperties& poly_props,
const RockCompressibility* rock_comp_props, const RockCompressibility* rock_comp_props,
const Wells* wells, const Wells* wells,
const PolymerInflowInterface& polymer_inflow,
const std::vector<double>& src, const std::vector<double>& src,
const FlowBoundaryConditions* bcs, const FlowBoundaryConditions* bcs,
LinearSolverInterface& linsolver, LinearSolverInterface& linsolver,
@ -116,6 +117,7 @@ namespace Opm
const PolymerProperties& poly_props_; const PolymerProperties& poly_props_;
const RockCompressibility* rock_comp_props_; const RockCompressibility* rock_comp_props_;
const Wells* wells_; const Wells* wells_;
const PolymerInflowInterface& polymer_inflow_;
const std::vector<double>& src_; const std::vector<double>& src_;
const FlowBoundaryConditions* bcs_; const FlowBoundaryConditions* bcs_;
const LinearSolverInterface& linsolver_; const LinearSolverInterface& linsolver_;
@ -127,7 +129,6 @@ namespace Opm
std::vector< std::vector<int> > columns_; std::vector< std::vector<int> > columns_;
// Misc. data // Misc. data
std::vector<int> allcells_; std::vector<int> allcells_;
boost::scoped_ptr<PolymerInflowInterface> poly_inflow_;
}; };
@ -139,12 +140,14 @@ namespace Opm
const PolymerProperties& poly_props, const PolymerProperties& poly_props,
const RockCompressibility* rock_comp_props, const RockCompressibility* rock_comp_props,
const Wells* wells, const Wells* wells,
const PolymerInflowInterface& polymer_inflow,
const std::vector<double>& src, const std::vector<double>& src,
const FlowBoundaryConditions* bcs, const FlowBoundaryConditions* bcs,
LinearSolverInterface& linsolver, LinearSolverInterface& linsolver,
const double* gravity) const double* gravity)
{ {
pimpl_.reset(new Impl(param, grid, props, poly_props, rock_comp_props, wells, src, bcs, linsolver, gravity)); pimpl_.reset(new Impl(param, grid, props, poly_props, rock_comp_props,
wells, polymer_inflow, src, bcs, linsolver, gravity));
} }
@ -168,6 +171,7 @@ namespace Opm
const PolymerProperties& poly_props, const PolymerProperties& poly_props,
const RockCompressibility* rock_comp_props, const RockCompressibility* rock_comp_props,
const Wells* wells, const Wells* wells,
const PolymerInflowInterface& polymer_inflow,
const std::vector<double>& src, const std::vector<double>& src,
const FlowBoundaryConditions* bcs, const FlowBoundaryConditions* bcs,
LinearSolverInterface& linsolver, LinearSolverInterface& linsolver,
@ -177,6 +181,7 @@ namespace Opm
poly_props_(poly_props), poly_props_(poly_props),
rock_comp_props_(rock_comp_props), rock_comp_props_(rock_comp_props),
wells_(wells), wells_(wells),
polymer_inflow_(polymer_inflow),
src_(src), src_(src),
bcs_(bcs), bcs_(bcs),
linsolver_(linsolver), linsolver_(linsolver),
@ -224,11 +229,6 @@ namespace Opm
extractColumn(grid_, columns_); extractColumn(grid_, columns_);
} }
// Polymer inflow control.
poly_inflow_.reset(new PolymerInflowBasic(param.getDefault("poly_start_days", 300.0)*Opm::unit::day,
param.getDefault("poly_end_days", 800.0)*Opm::unit::day,
param.getDefault("poly_amount", poly_props.cMax())));
// Misc init. // Misc init.
const int num_cells = grid.number_of_cells; const int num_cells = grid.number_of_cells;
allcells_.resize(num_cells); allcells_.resize(num_cells);
@ -320,7 +320,7 @@ namespace Opm
// Find inflow rate. // Find inflow rate.
const double current_time = timer.currentTime(); const double current_time = timer.currentTime();
double stepsize = timer.currentStepLength(); double stepsize = timer.currentStepLength();
poly_inflow_->getInflowValues(current_time, current_time + stepsize, polymer_inflow_c); polymer_inflow_.getInflowValues(current_time, current_time + stepsize, polymer_inflow_c);
// Solve transport. // Solve transport.
transport_timer.start(); transport_timer.start();

View File

@ -33,6 +33,7 @@ namespace Opm
class IncompPropertiesInterface; class IncompPropertiesInterface;
class PolymerProperties; class PolymerProperties;
class RockCompressibility; class RockCompressibility;
class PolymerInflowInterface;
class LinearSolverInterface; class LinearSolverInterface;
class SimulatorTimer; class SimulatorTimer;
class PolymerState; class PolymerState;
@ -64,6 +65,7 @@ namespace Opm
/// \param[in] poly_props polymer properties /// \param[in] poly_props polymer properties
/// \param[in] rock_comp if non-null, rock compressibility properties /// \param[in] rock_comp if non-null, rock compressibility properties
/// \param[in] wells if non-null, wells data structure /// \param[in] wells if non-null, wells data structure
/// \param[in] polymer_inflow polymer inflow controls
/// \param[in] src source terms /// \param[in] src source terms
/// \param[in] bcs boundary conditions, treat as all noflow if null /// \param[in] bcs boundary conditions, treat as all noflow if null
/// \param[in] linsolver linear solver /// \param[in] linsolver linear solver
@ -74,6 +76,7 @@ namespace Opm
const PolymerProperties& poly_props, const PolymerProperties& poly_props,
const RockCompressibility* rock_comp_props, const RockCompressibility* rock_comp_props,
const Wells* wells, const Wells* wells,
const PolymerInflowInterface& polymer_inflow,
const std::vector<double>& src, const std::vector<double>& src,
const FlowBoundaryConditions* bcs, const FlowBoundaryConditions* bcs,
LinearSolverInterface& linsolver, LinearSolverInterface& linsolver,