From cd50b54ddf59bc4e9f4ceab7fa001c36afaa7b02 Mon Sep 17 00:00:00 2001 From: Kai Bao Date: Fri, 16 May 2014 18:02:55 +0200 Subject: [PATCH] Finishing the modification for solver class. --- examples/test_implicit_ad.cpp | 2 +- opm/autodiff/FullyImplicitBlackoilSolver.hpp | 12 ++++++++- .../FullyImplicitBlackoilSolver_impl.hpp | 25 +++++++++++++------ .../SimulatorFullyImplicitBlackoil_impl.hpp | 2 +- 4 files changed, 31 insertions(+), 10 deletions(-) diff --git a/examples/test_implicit_ad.cpp b/examples/test_implicit_ad.cpp index 9cd736924..737793b92 100644 --- a/examples/test_implicit_ad.cpp +++ b/examples/test_implicit_ad.cpp @@ -105,7 +105,7 @@ try Opm::LinearSolverFactory linsolver(param); Opm::NewtonIterationBlackoilSimple fis_solver(linsolver); - Opm::FullyImplicitBlackoilSolver solver(*g, props, geo, 0, *wells, fis_solver); + Opm::FullyImplicitBlackoilSolver solver(param, *g, props, geo, 0, *wells, fis_solver); Opm::BlackoilState state; initStateBasic(*g, props0, param, 0.0, state); diff --git a/opm/autodiff/FullyImplicitBlackoilSolver.hpp b/opm/autodiff/FullyImplicitBlackoilSolver.hpp index d3afee547..e4f26af08 100644 --- a/opm/autodiff/FullyImplicitBlackoilSolver.hpp +++ b/opm/autodiff/FullyImplicitBlackoilSolver.hpp @@ -31,6 +31,7 @@ struct Wells; namespace Opm { + namespace parameter { class ParameterGroup; } class DerivedGeology; class RockCompressibility; class NewtonIterationBlackoilInterface; @@ -56,13 +57,16 @@ namespace Opm { /// Construct a solver. It will retain references to the /// arguments of this functions, and they are expected to /// remain in scope for the lifetime of the solver. + /// \param[in] param parameters /// \param[in] grid grid data structure /// \param[in] fluid fluid properties /// \param[in] geo rock properties /// \param[in] rock_comp_props if non-null, rock compressibility properties /// \param[in] wells well structure /// \param[in] linsolver linear solver - FullyImplicitBlackoilSolver(const Grid& grid , + + FullyImplicitBlackoilSolver(const parameter::ParameterGroup& param, + const Grid& grid , const BlackoilPropsAdInterface& fluid, const DerivedGeology& geo , const RockCompressibility* rock_comp_props, @@ -137,6 +141,9 @@ namespace Opm { HelperOps ops_; const WellOps wops_; const M grav_; + double dp_max_rel_; + double ds_max_; + double drs_max_rel_; std::vector rq_; std::vector phaseCondition_; @@ -266,6 +273,9 @@ namespace Opm { /// residual mass balance (tol_cnv). bool getConvergence(const double dt); + const double dpMaxRel () const { return dp_max_rel_; } + const double dsMax () const { return ds_max_; } + const double drsMaxRel () const { return drs_max_rel_; } }; } // namespace Opm diff --git a/opm/autodiff/FullyImplicitBlackoilSolver_impl.hpp b/opm/autodiff/FullyImplicitBlackoilSolver_impl.hpp index ebdf6e0d2..52983a7d7 100644 --- a/opm/autodiff/FullyImplicitBlackoilSolver_impl.hpp +++ b/opm/autodiff/FullyImplicitBlackoilSolver_impl.hpp @@ -35,6 +35,7 @@ #include #include #include +#include #include #include @@ -209,10 +210,10 @@ namespace { } // Anonymous namespace - template FullyImplicitBlackoilSolver:: - FullyImplicitBlackoilSolver(const Grid& grid , + FullyImplicitBlackoilSolver(const parameter::ParameterGroup& param, + const Grid& grid , const BlackoilPropsAdInterface& fluid, const DerivedGeology& geo , const RockCompressibility* rock_comp_props, @@ -235,12 +236,22 @@ namespace { , residual_ ( { std::vector(fluid.numPhases(), ADB::null()), ADB::null(), ADB::null() } ) + , dp_max_rel_ ( 0.2 ) + , ds_max_ ( 0.05 ) + , drs_max_rel_ ( 0.2 ) { + if (param.has("dp_max_rel")) { + dp_max_rel_ = param.get(std::string("dp_max_rel")); + } + if (param.has("dp_max")) { + ds_max_ = param.get("dp_max"); + } + if (param.has("drs_max_rel")) { + ds_max_ = param.get("drs_max_rel"); + } } - - template void FullyImplicitBlackoilSolver:: @@ -1224,7 +1235,7 @@ namespace { assert(varstart == dx.size()); // Pressure update. - const double dpmaxrel = 0.2; + const double dpmaxrel = dpMaxRel(); const V p_old = Eigen::Map(&state.pressure()[0], nc, 1); const V absdpmax = dpmaxrel*p_old.abs(); const V dp_limited = sign(dp) * dp.abs().min(absdpmax); @@ -1235,7 +1246,7 @@ namespace { // Saturation updates. const Opm::PhaseUsage& pu = fluid_.phaseUsage(); const DataBlock s_old = Eigen::Map(& state.saturation()[0], nc, np); - const double dsmax = 0.05; + const double dsmax = dsMax(); V so = one; V sw; V sg; @@ -1275,7 +1286,7 @@ namespace { } } - const double drsmaxrel = 0.2; + const double drsmaxrel = drsMaxRel(); const double drvmax = 1e9;//% same as in Mrst V rs; if (disgas) { diff --git a/opm/autodiff/SimulatorFullyImplicitBlackoil_impl.hpp b/opm/autodiff/SimulatorFullyImplicitBlackoil_impl.hpp index d40d2e0cd..81fa58fce 100644 --- a/opm/autodiff/SimulatorFullyImplicitBlackoil_impl.hpp +++ b/opm/autodiff/SimulatorFullyImplicitBlackoil_impl.hpp @@ -200,7 +200,7 @@ 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_(param, grid_, props_, geo_, rock_comp_props, *wells_manager.c_wells(), linsolver) /* param.getDefault("nl_pressure_residual_tolerance", 0.0), param.getDefault("nl_pressure_change_tolerance", 1.0), param.getDefault("nl_pressure_maxiter", 10),