From d0eb42c5d8a0652950620374ed680016dc233897 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Atgeirr=20Fl=C3=B8=20Rasmussen?= Date: Thu, 12 Apr 2012 13:52:41 +0200 Subject: [PATCH 1/4] Changed satRange() behaviour to use highest sw in SWOF as max (instead of 1.0). --- opm/core/fluid/SaturationPropsFromDeck.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/opm/core/fluid/SaturationPropsFromDeck.cpp b/opm/core/fluid/SaturationPropsFromDeck.cpp index 2075b999..8b614db1 100644 --- a/opm/core/fluid/SaturationPropsFromDeck.cpp +++ b/opm/core/fluid/SaturationPropsFromDeck.cpp @@ -43,6 +43,7 @@ namespace Opm } const int samples = 200; double swco = 0.0; + double swmax = 1.0; if (phase_usage_.phase_used[Aqua]) { const SWOF::table_t& swof_table = deck.getSWOF().swof_; if (swof_table.size() != 1) { @@ -58,7 +59,8 @@ namespace Opm krocw_ = krow[0]; // At connate water -> ecl. SWOF swco = sw[0]; smin_[phase_usage_.phase_pos[Aqua]] = sw[0]; - smax_[phase_usage_.phase_pos[Aqua]] = 1.0; + swmax = sw.back(); + smax_[phase_usage_.phase_pos[Aqua]] = sw.back(); } if (phase_usage_.phase_used[Vapour]) { const SGOF::table_t& sgof_table = deck.getSGOF().sgof_; @@ -79,7 +81,8 @@ namespace Opm } smax_[phase_usage_.phase_pos[Vapour]] = sg.back(); } - smin_[phase_usage_.phase_pos[Liquid]] = 0.0; + // These only consider water min/max sats. Consider gas sats? + smin_[phase_usage_.phase_pos[Liquid]] = 1.0 - swmax; smax_[phase_usage_.phase_pos[Liquid]] = 1.0 - swco; } From 8f7939ca1088b1b2061adb575d9a21c4044d8445 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Atgeirr=20Fl=C3=B8=20Rasmussen?= Date: Thu, 12 Apr 2012 14:14:24 +0200 Subject: [PATCH 2/4] Added #include for std::accumulate(). --- examples/spu_2p.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/spu_2p.cpp b/examples/spu_2p.cpp index 861ab2a2..fe1014a8 100644 --- a/examples/spu_2p.cpp +++ b/examples/spu_2p.cpp @@ -94,6 +94,7 @@ #include #include #include +#include From 9121a81165a76f1f77f0ef5e93aec5cdbc987633 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Atgeirr=20Fl=C3=B8=20Rasmussen?= Date: Thu, 12 Apr 2012 14:25:53 +0200 Subject: [PATCH 3/4] Removed unnecessary guard against using rock compressibility with segregation. --- examples/spu_2p.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/examples/spu_2p.cpp b/examples/spu_2p.cpp index fe1014a8..bf0084b1 100644 --- a/examples/spu_2p.cpp +++ b/examples/spu_2p.cpp @@ -359,11 +359,6 @@ main(int argc, char** argv) if (!use_reorder) { THROW("Cannot run implicit (non-reordering) transport solver with rock compressibility yet."); } - if (use_segregation_split) { - if (!use_gauss_seidel_gravity) { - THROW("For gravity segregation splitting, only use_gauss_seidel_gravity=true supports rock compressibility."); - } - } nl_pressure_maxiter = param.getDefault("nl_pressure_maxiter", 10); nl_pressure_tolerance = param.getDefault("nl_pressure_tolerance", 1.0); // in Pascal } From 68a2d7fe26ec7bf1be7da24429406698de28ab35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Atgeirr=20Fl=C3=B8=20Rasmussen?= Date: Thu, 12 Apr 2012 14:43:05 +0200 Subject: [PATCH 4/4] Added and implemented parameter num_transport_substeps. --- examples/spu_2p.cpp | 52 ++++++++++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/examples/spu_2p.cpp b/examples/spu_2p.cpp index bf0084b1..a6128d2b 100644 --- a/examples/spu_2p.cpp +++ b/examples/spu_2p.cpp @@ -273,6 +273,7 @@ main(int argc, char** argv) create_directories(fpath); output_interval = param.getDefault("output_interval", output_interval); } + const int num_transport_substeps = param.getDefault("num_transport_substeps", 1); // If we have a "deck_filename", grid and props will be read from that. bool use_deck = param.has("deck_filename"); @@ -556,32 +557,39 @@ main(int argc, char** argv) // Solve transport. transport_timer.start(); - if (use_reorder) { - Opm::toWaterSat(state.saturation(), reorder_sat); - reorder_model.solve(&state.faceflux()[0], &porevol[0], &reorder_src[0], - simtimer.currentStepLength(), &reorder_sat[0]); - Opm::toBothSat(reorder_sat, state.saturation()); - Opm::computeInjectedProduced(*props, state.saturation(), src, simtimer.currentStepLength(), injected, produced); - if (use_segregation_split) { - if (use_column_solver) { - if (use_gauss_seidel_gravity) { - reorder_model.solveGravity(columns, &porevol[0], simtimer.currentStepLength(), reorder_sat); - Opm::toBothSat(reorder_sat, state.saturation()); + double stepsize = simtimer.currentStepLength(); + if (num_transport_substeps != 1) { + stepsize /= double(num_transport_substeps); + std::cout << "Making " << num_transport_substeps << " transport substeps." << std::endl; + } + for (int tr_substep = 0; tr_substep < num_transport_substeps; ++tr_substep) { + if (use_reorder) { + Opm::toWaterSat(state.saturation(), reorder_sat); + reorder_model.solve(&state.faceflux()[0], &porevol[0], &reorder_src[0], + stepsize, &reorder_sat[0]); + Opm::toBothSat(reorder_sat, state.saturation()); + Opm::computeInjectedProduced(*props, state.saturation(), src, stepsize, injected, produced); + if (use_segregation_split) { + if (use_column_solver) { + if (use_gauss_seidel_gravity) { + reorder_model.solveGravity(columns, &porevol[0], stepsize, reorder_sat); + Opm::toBothSat(reorder_sat, state.saturation()); + } else { + colsolver.solve(columns, stepsize, state.saturation()); + } } else { - colsolver.solve(columns, simtimer.currentStepLength(), state.saturation()); + std::vector fluxes = state.faceflux(); + std::fill(state.faceflux().begin(), state.faceflux().end(), 0.0); + tsolver.solve(*grid->c_grid(), tsrc, stepsize, ctrl, state, linsolve, rpt); + std::cout << rpt; + state.faceflux() = fluxes; } - } else { - std::vector fluxes = state.faceflux(); - std::fill(state.faceflux().begin(), state.faceflux().end(), 0.0); - tsolver.solve(*grid->c_grid(), tsrc, simtimer.currentStepLength(), ctrl, state, linsolve, rpt); - std::cout << rpt; - state.faceflux() = fluxes; } + } else { + tsolver.solve(*grid->c_grid(), tsrc, stepsize, ctrl, state, linsolve, rpt); + std::cout << rpt; + Opm::computeInjectedProduced(*props, state.saturation(), src, stepsize, injected, produced); } - } else { - tsolver.solve(*grid->c_grid(), tsrc, simtimer.currentStepLength(), ctrl, state, linsolve, rpt); - std::cout << rpt; - Opm::computeInjectedProduced(*props, state.saturation(), src, simtimer.currentStepLength(), injected, produced); } transport_timer.stop(); double tt = transport_timer.secsSinceStart();