BlackoilModelEbos: put jacobi NLDD solve in separate method

increases readability of nonlinearIterationNldd
This commit is contained in:
Arne Morten Kvarving 2023-07-03 12:40:15 +02:00
parent cc0b994eca
commit faa4bb25d7

View File

@ -542,20 +542,8 @@ namespace Opm {
const auto& domain = domains_[domain_index]; const auto& domain = domains_[domain_index];
SimulatorReportSingle local_report; SimulatorReportSingle local_report;
if (param_.local_solve_approach_ == "jacobi") { if (param_.local_solve_approach_ == "jacobi") {
auto initial_local_well_primary_vars = wellModel().getPrimaryVarsDomain(domain); solveDomainJacobi(solution, locally_solved, local_report,
auto initial_local_solution = Details::extractVector(solution, domain.cells); iteration, timer, domain);
auto res = solveDomain(domain, timer, iteration);
local_report = res.first;
if (local_report.converged) {
auto local_solution = Details::extractVector(solution, domain.cells);
Details::setGlobal(local_solution, domain.cells, locally_solved);
Details::setGlobal(initial_local_solution, domain.cells, solution);
ebosSimulator_.model().invalidateAndUpdateIntensiveQuantities(/*timeIdx=*/0, domain.view);
} else {
wellModel().setPrimaryVarsDomain(domain, initial_local_well_primary_vars);
Details::setGlobal(initial_local_solution, domain.cells, solution);
ebosSimulator_.model().invalidateAndUpdateIntensiveQuantities(/*timeIdx=*/0, domain.view);
}
} else { } else {
assert(param_.local_solve_approach_ == "gauss-seidel"); assert(param_.local_solve_approach_ == "gauss-seidel");
auto initial_local_well_primary_vars = wellModel().getPrimaryVarsDomain(domain); auto initial_local_well_primary_vars = wellModel().getPrimaryVarsDomain(domain);
@ -1846,6 +1834,30 @@ namespace Opm {
return domain_order; return domain_order;
} }
template<class GlobalEqVector>
void solveDomainJacobi(GlobalEqVector& solution,
GlobalEqVector& locally_solved,
SimulatorReportSingle& local_report,
const int iteration,
const SimulatorTimerInterface& timer,
const Domain& domain)
{
auto initial_local_well_primary_vars = wellModel().getPrimaryVarsDomain(domain);
auto initial_local_solution = Details::extractVector(solution, domain.cells);
auto res = solveDomain(domain, timer, iteration);
local_report = res.first;
if (local_report.converged) {
auto local_solution = Details::extractVector(solution, domain.cells);
Details::setGlobal(local_solution, domain.cells, locally_solved);
Details::setGlobal(initial_local_solution, domain.cells, solution);
ebosSimulator_.model().invalidateAndUpdateIntensiveQuantities(/*timeIdx=*/0, domain.view);
} else {
wellModel().setPrimaryVarsDomain(domain, initial_local_well_primary_vars);
Details::setGlobal(initial_local_solution, domain.cells, solution);
ebosSimulator_.model().invalidateAndUpdateIntensiveQuantities(/*timeIdx=*/0, domain.view);
}
}
public: public:
std::vector<bool> wasSwitched_; std::vector<bool> wasSwitched_;
}; };