BUGFIX Update the solution variable in ebos

Updating the solution variable in updateState() was conceptually wrong
and lead to incorrect results if the linear solver failed before the
updateState() method was called. i.e. in the first iteration.
This commit is contained in:
Tor Harald Sandve 2017-11-08 12:17:31 +01:00
parent c79dab27d5
commit 4bb5213f37

View File

@ -203,7 +203,7 @@ namespace Opm {
/// \param[in] timer simulation timer
/// \param[in, out] reservoir_state reservoir state variables
/// \param[in, out] well_state well state variables
void prepareStep(const SimulatorTimerInterface& /*timer*/,
void prepareStep(const SimulatorTimerInterface& timer,
const ReservoirState& /*reservoir_state*/,
const WellState& /* well_state */)
{
@ -211,6 +211,18 @@ namespace Opm {
updateRateConverter();
}
// update the solution variables in ebos
// if the last time step failed we need to update the curent solution
// and recalculate the Intesive Quantities.
if ( timer.lastStepFailed() ) {
ebosSimulator_.model().solution( 0 /* timeIdx */ ) = ebosSimulator_.model().solution( 1 /* timeIdx */ );
ebosSimulator_.model().invalidateIntensiveQuantitiesCache(/*timeIdx=*/0);
} else {
// set the initial solution.
ebosSimulator_.model().solution( 1 /* timeIdx */ ) = ebosSimulator_.model().solution( 0 /* timeIdx */ );
}
unsigned numDof = ebosSimulator_.model().numGridDof();
wasSwitched_.resize(numDof);
std::fill(wasSwitched_.begin(), wasSwitched_.end(), false);
@ -329,7 +341,7 @@ namespace Opm {
// Apply the update, with considering model-dependent limitations and
// chopping of the update.
updateState(x,iteration);
updateState(x);
report.update_time += perfTimer.stop();
}
@ -605,8 +617,7 @@ namespace Opm {
/// \param[in] dx updates to apply to primary variables
/// \param[in, out] reservoir_state reservoir state variables
/// \param[in, out] well_state well state variables
void updateState(const BVector& dx,
const int iterationIdx)
void updateState(const BVector& dx)
{
using namespace Opm::AutoDiffGrid;
@ -618,12 +629,6 @@ namespace Opm {
const auto& elemEndIt = gridView.template end</*codim=*/0>();
SolutionVector& solution = ebosSimulator_.model().solution( 0 /* timeIdx */ );
// Store the initial solution.
if( iterationIdx == 0 )
{
ebosSimulator_.model().solution( 1 /* timeIdx */ ) = solution;
}
for (auto elemIt = gridView.template begin</*codim=*/0>();
elemIt != elemEndIt;
++elemIt)
@ -1611,12 +1616,6 @@ namespace Opm {
{
ebosSimulator_.problem().beginTimeStep();
}
// if the last time step failed we need to update the solution varables in ebos
// and recalculate the Intesive Quantities.
if ( timer.lastStepFailed() && iterationIdx == 0 ) {
ebosSimulator_.model().solution( 0 /* timeIdx */ ) = ebosSimulator_.model().solution( 1 /* timeIdx */ );
ebosSimulator_.model().invalidateIntensiveQuantitiesCache(/*timeIdx=*/0);
}
ebosSimulator_.problem().beginIteration();
ebosSimulator_.model().linearizer().linearize();