From 541475b2db37823f1fad44e6c287688a1cd9daad Mon Sep 17 00:00:00 2001 From: Tor Harald Sandve Date: Fri, 18 Mar 2016 11:13:13 +0100 Subject: [PATCH] Implement computePropertiesForWellConnectionPressures for solvent model The solvent specify part of computeWellConnectionPressures is factored out to computePropertiesForWellConnectionPressures in order to reuse the computeWellConnectionPressures from the base model. --- opm/autodiff/BlackoilSolventModel.hpp | 9 ++++- opm/autodiff/BlackoilSolventModel_impl.hpp | 45 +++++++--------------- 2 files changed, 20 insertions(+), 34 deletions(-) diff --git a/opm/autodiff/BlackoilSolventModel.hpp b/opm/autodiff/BlackoilSolventModel.hpp index 987a93db1..060c40d12 100644 --- a/opm/autodiff/BlackoilSolventModel.hpp +++ b/opm/autodiff/BlackoilSolventModel.hpp @@ -151,6 +151,7 @@ namespace Opm { using Base::updateWellControls; using Base::computeWellConnectionPressures; using Base::addWellControlEq; + using Base::computePropertiesForWellConnectionPressures; std::vector computeRelPerm(const SolutionState& state) const; @@ -204,8 +205,12 @@ namespace Opm { const SolutionState& state, WellState& xw); - void computeWellConnectionPressures(const SolutionState& state, - const WellState& xw); + void computePropertiesForWellConnectionPressures(const SolutionState& state, + const WellState& xw, + std::vector& b_perf, + std::vector& rsmax_perf, + std::vector& rvmax_perf, + std::vector& surf_dens_perf); void updateEquationsScaling(); diff --git a/opm/autodiff/BlackoilSolventModel_impl.hpp b/opm/autodiff/BlackoilSolventModel_impl.hpp index 34e9f1b54..60ba32798 100644 --- a/opm/autodiff/BlackoilSolventModel_impl.hpp +++ b/opm/autodiff/BlackoilSolventModel_impl.hpp @@ -382,10 +382,13 @@ namespace Opm { } template - void BlackoilSolventModel::computeWellConnectionPressures(const SolutionState& state, - const WellState& xw) + void BlackoilSolventModel::computePropertiesForWellConnectionPressures(const SolutionState& state, + const WellState& xw, + std::vector& b_perf, + std::vector& rsmax_perf, + std::vector& rvmax_perf, + std::vector& surf_dens_perf) { - if( ! Base::localWellsActive() ) return ; using namespace Opm::AutoDiffGrid; // 1. Compute properties required by computeConnectionPressureDelta(). @@ -421,8 +424,7 @@ namespace Opm { const PhaseUsage& pu = fluid_.phaseUsage(); DataBlock b(nperf, pu.num_phases); - std::vector rsmax_perf(nperf, 0.0); - std::vector rvmax_perf(nperf, 0.0); + const V bw = fluid_.bWat(avg_press_ad, perf_temp, well_cells).value(); if (pu.phase_used[BlackoilPhases::Aqua]) { b.col(pu.phase_pos[BlackoilPhases::Aqua]) = bw; @@ -439,6 +441,8 @@ namespace Opm { b.col(pu.phase_pos[BlackoilPhases::Liquid]) = bo; const V rssat = fluidRsSat(avg_press, perf_so, well_cells); rsmax_perf.assign(rssat.data(), rssat.data() + nperf); + } else { + rsmax_perf.assign(0.0, nperf); } V surf_dens_copy = superset(fluid_.surfaceDensity(0, well_cells), Span(nperf, pu.num_phases, 0), nperf*pu.num_phases); for (int phase = 1; phase < pu.num_phases; ++phase) { @@ -496,41 +500,18 @@ namespace Opm { const V rvsat = fluidRvSat(avg_press, perf_so, well_cells); rvmax_perf.assign(rvsat.data(), rvsat.data() + nperf); + } else { + rvmax_perf.assign(0.0, nperf); } // b and surf_dens_perf is row major, so can just copy data. - std::vector b_perf(b.data(), b.data() + nperf * pu.num_phases); - std::vector surf_dens_perf(surf_dens_copy.data(), surf_dens_copy.data() + nperf * pu.num_phases); - - // Extract well connection depths. - const V depth = cellCentroidsZToEigen(grid_); - const V pdepth = subset(depth, well_cells); - std::vector perf_depth(pdepth.data(), pdepth.data() + nperf); - - // Gravity - double grav = detail::getGravity(geo_.gravity(), dimensions(grid_)); - - // 2. Compute densities - std::vector cd = - WellDensitySegmented::computeConnectionDensities( - wells(), xw, fluid_.phaseUsage(), - b_perf, rsmax_perf, rvmax_perf, surf_dens_perf); - - // 3. Compute pressure deltas - std::vector cdp = - WellDensitySegmented::computeConnectionPressureDelta( - wells(), perf_depth, cd, grav); - - // 4. Store the results - Base::well_perforation_densities_ = Eigen::Map(cd.data(), nperf); - Base::well_perforation_pressure_diffs_ = Eigen::Map(cdp.data(), nperf); + b_perf.assign(b.data(), b.data() + nperf * pu.num_phases); + surf_dens_perf.assign(surf_dens_copy.data(), surf_dens_copy.data() + nperf * pu.num_phases); } - - template void BlackoilSolventModel::updateState(const V& dx, ReservoirState& reservoir_state,