Let WellModel decide whether to apply well contributions.

It queries the Well whether the jacobian also contains well contributions.
If not then it applies them in the operator in addition. Thus the
well knows whether that is needed or not.
This commit is contained in:
Markus Blatt 2018-02-26 12:23:20 +01:00
parent afb806bc3e
commit 96a636f25b
6 changed files with 20 additions and 39 deletions

View File

@ -565,11 +565,8 @@ namespace Opm {
{ {
A_.mv( x, y ); A_.mv( x, y );
if ( ! matrix_add_well_contributions_ ) // add well model modification to y
{ wellMod_.apply(x, y );
// add well model modification to y
wellMod_.apply(x, y );
}
#if HAVE_MPI #if HAVE_MPI
if( comm_ ) if( comm_ )
@ -582,11 +579,8 @@ namespace Opm {
{ {
A_.usmv(alpha,x,y); A_.usmv(alpha,x,y);
if ( ! matrix_add_well_contributions_ ) // add scaled well model modification to y
{ wellMod_.applyScaleAdd( alpha, x, y );
// add scaled well model modification to y
wellMod_.applyScaleAdd( alpha, x, y );
}
#if HAVE_MPI #if HAVE_MPI
if( comm_ ) if( comm_ )

View File

@ -157,12 +157,6 @@ namespace Opm {
const SimulatorReport& lastReport() const; const SimulatorReport& lastReport() const;
/// \! brief Modifies matrix to include influences of the well perforations.
///
/// \param mat The linear system with the assembled mass balance
/// equations
void addWellContributions(Mat& mat) const;
protected: protected:

View File

@ -294,18 +294,6 @@ namespace Opm {
} }
} }
template<typename TypeTag>
void
BlackoilWellModel<TypeTag>::
addWellContributions(Mat& mat) const
{
for(const auto& well: well_container_)
{
well->addWellContributions(mat);
}
}
// applying the well residual to reservoir residuals // applying the well residual to reservoir residuals
// r = r - duneC_^T * invDuneD_ * resWell_ // r = r - duneC_^T * invDuneD_ * resWell_
template<typename TypeTag> template<typename TypeTag>
@ -333,7 +321,8 @@ namespace Opm {
apply(const BVector& x, BVector& Ax) const apply(const BVector& x, BVector& Ax) const
{ {
// TODO: do we still need localWellsActive()? // TODO: do we still need localWellsActive()?
if ( ! localWellsActive() ) { if ( ! localWellsActive() ||
well_container_[0]->jacobianContainsWellContributions() ) {
return; return;
} }
@ -352,7 +341,8 @@ namespace Opm {
BlackoilWellModel<TypeTag>:: BlackoilWellModel<TypeTag>::
applyScaleAdd(const Scalar alpha, const BVector& x, BVector& Ax) const applyScaleAdd(const Scalar alpha, const BVector& x, BVector& Ax) const
{ {
if ( ! localWellsActive() ) { if ( ! localWellsActive() ||
well_container_[0]->jacobianContainsWellContributions() ) {
return; return;
} }

View File

@ -151,7 +151,14 @@ namespace Opm
virtual void calculateExplicitQuantities(const Simulator& ebosSimulator, virtual void calculateExplicitQuantities(const Simulator& ebosSimulator,
const WellState& well_state); // should be const? const WellState& well_state); // should be const?
virtual void addWellContributions(Mat& mat) const; virtual void addWellContributions(Mat& mat) const;
/// \brief Wether the Jacobian will also have well contributions in it.
virtual bool jacobianContainsWellContributions() const
{
return param_.matrix_add_well_contributions_;
}
protected: protected:
// protected functions from the Base class // protected functions from the Base class

View File

@ -203,7 +203,11 @@ namespace Opm
virtual void calculateExplicitQuantities(const Simulator& ebosSimulator, virtual void calculateExplicitQuantities(const Simulator& ebosSimulator,
const WellState& well_state) = 0; // should be const? const WellState& well_state) = 0; // should be const?
virtual void addWellContributions(Mat& mat) const; /// \brief Wether the Jacobian will also have well contributions in it.
virtual bool jacobianContainsWellContributions() const
{
return false;
}
// updating the voidage rates in well_state when requested // updating the voidage rates in well_state when requested
void calculateReservoirRates(WellState& well_state) const; void calculateReservoirRates(WellState& well_state) const;

View File

@ -844,14 +844,6 @@ namespace Opm
return 1.0; return 1.0;
} }
template<typename TypeTag>
void
WellInterface<TypeTag>::addWellContributions(Mat& mat) const
{
OPM_THROW(NotImplemented, "This well class does not support adding well contributions"
<< "to the matrix");
}