diff --git a/opm/autodiff/BlackoilModelBase.hpp b/opm/autodiff/BlackoilModelBase.hpp index f32aa46fb..2d505ffb8 100644 --- a/opm/autodiff/BlackoilModelBase.hpp +++ b/opm/autodiff/BlackoilModelBase.hpp @@ -540,6 +540,7 @@ namespace Opm { int nc) const; double dpMaxRel() const { return param_.dp_max_rel_; } + double dbhpMaxRel() const {return param_.dbhp_max_rel_; } double dsMax() const { return param_.ds_max_; } double drMaxRel() const { return param_.dr_max_rel_; } double maxResidualAllowed() const { return param_.max_residual_allowed_; } diff --git a/opm/autodiff/BlackoilModelBase_impl.hpp b/opm/autodiff/BlackoilModelBase_impl.hpp index 42f00cf07..f1a94c761 100644 --- a/opm/autodiff/BlackoilModelBase_impl.hpp +++ b/opm/autodiff/BlackoilModelBase_impl.hpp @@ -1064,7 +1064,7 @@ typedef Eigen::Array(& reservoir_state.saturation()[0], nc, np); @@ -1213,7 +1213,6 @@ typedef Eigen::Array(&reservoir_state.gasoilratio()[0], nc); const V drs = isRs_ * dxvar; - const V drs_limited = sign(drs) * drs.abs().min(rs_old.abs()*drmaxrel); + const V drs_limited = sign(drs) * drs.abs().min( (rs_old.abs()*drmaxrel).max( ones*1e-6)); rs = rs_old - drs_limited; + rs = rs.max(zero); } V rv; if (has_vapoil_) { const V rv_old = Eigen::Map(&reservoir_state.rv()[0], nc); const V drv = isRv_ * dxvar; - const V drv_limited = sign(drv) * drv.abs().min(rv_old.abs()*drmaxrel); + const V drv_limited = sign(drv) * drv.abs().min( (rv_old.abs()*drmaxrel).max( ones*1e-6)); rv = rv_old - drv_limited; + rv = rv.max(zero); } // Sg is used as primal variable for water only cells. @@ -1318,11 +1295,16 @@ typedef Eigen::Array rv @@ -1345,14 +1327,37 @@ typedef Eigen::Array #include -#include - namespace Opm { @@ -44,6 +42,7 @@ namespace Opm dp_max_rel_ = param.getDefault("dp_max_rel", dp_max_rel_); ds_max_ = param.getDefault("ds_max", ds_max_); dr_max_rel_ = param.getDefault("dr_max_rel", dr_max_rel_); + dbhp_max_rel_= param.getDefault("dbhp_max_rel", dbhp_max_rel_); max_residual_allowed_ = param.getDefault("max_residual_allowed", max_residual_allowed_); tolerance_mb_ = param.getDefault("tolerance_mb", tolerance_mb_); tolerance_cnv_ = param.getDefault("tolerance_cnv", tolerance_cnv_); @@ -64,9 +63,10 @@ namespace Opm void BlackoilModelParameters::reset() { // default values for the solver parameters - dp_max_rel_ = 1.0e9; + dp_max_rel_ = 0.2; ds_max_ = 0.2; dr_max_rel_ = 1.0e9; + dbhp_max_rel_ = 1.0; max_residual_allowed_ = 1e7; tolerance_mb_ = 1.0e-5; tolerance_cnv_ = 1.0e-2; diff --git a/opm/autodiff/BlackoilModelParameters.hpp b/opm/autodiff/BlackoilModelParameters.hpp index c616b547d..037bfdfb6 100644 --- a/opm/autodiff/BlackoilModelParameters.hpp +++ b/opm/autodiff/BlackoilModelParameters.hpp @@ -36,6 +36,8 @@ namespace Opm double ds_max_; /// Max relative change in gas-oil or oil-gas ratio in single iteration. double dr_max_rel_; + /// Max relative change in bhp in single iteration. + double dbhp_max_rel_; /// Absolute max limit for residuals. double max_residual_allowed_; /// Relative mass balance tolerance (total mass balance error).