From 0a7c778c36b8120e17e269f98b85fcc7f787235e Mon Sep 17 00:00:00 2001 From: Joakim Hove Date: Wed, 21 Oct 2015 11:36:27 +0200 Subject: [PATCH] Changes to solver approach configuration: 1. Added new parameter group string: "solver_approach" which can take the values {direct, cpr, interleaved}. 2. Hierarchy: i If a value is set in the parameter group that takes absolute presedence. ii If the Eclipse input deck asks for CPR - you get CPR. iii You get the flow default - currently interleaved. --- examples/flow.cpp | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/examples/flow.cpp b/examples/flow.cpp index b32a427b4..4acfaee69 100644 --- a/examples/flow.cpp +++ b/examples/flow.cpp @@ -371,12 +371,33 @@ try // Solver for Newton iterations. std::unique_ptr fis_solver; - if (param.getDefault("use_interleaved", true)) { - fis_solver.reset(new NewtonIterationBlackoilInterleaved(param, parallel_information)); - } else if (param.getDefault("use_cpr", true)) { - fis_solver.reset(new NewtonIterationBlackoilCPR(param, parallel_information)); - } else { - fis_solver.reset(new NewtonIterationBlackoilSimple(param, parallel_information)); + { + const std::string cprSolver = "cpr"; + const std::string interleavedSolver = "interleaved"; + const std::string directSolver = "direct"; + const std::string flowDefaultSolver = interleavedSolver; + + std::shared_ptr simCfg = eclipseState->getSimulationConfig(); + std::string solver_approach = flowDefaultSolver; + + if (param.has("solver_approach")) { + solver_approach = param.get("solver_approach"); + } else { + if (simCfg->useCPR()) { + solver_approach = cprSolver; + } + } + + if (solver_approach == cprSolver) { + fis_solver.reset(new NewtonIterationBlackoilCPR(param, parallel_information)); + } else if (solver_approach == interleavedSolver) { + fis_solver.reset(new NewtonIterationBlackoilInterleaved(param, parallel_information)); + } else if (solver_approach == directSolver) { + fis_solver.reset(new NewtonIterationBlackoilSimple(param, parallel_information)); + } else { + OPM_THROW( std::runtime_error , "Internal error - solver approach " << solver_approach << " not recognized."); + } + } Opm::ScheduleConstPtr schedule = eclipseState->getSchedule();