21#ifndef OPM_WELLCONNECTIONAUXILIARYMODULE_HEADER_INCLUDED
22#define OPM_WELLCONNECTIONAUXILIARYMODULE_HEADER_INCLUDED
26#include <opm/simulators/flow/SubDomain.hpp>
28#include <opm/simulators/utils/DeferredLoggingErrorHelpers.hpp>
29#include <opm/simulators/utils/ParallelCommunication.hpp>
32#include <opm/simulators/utils/MPISerializer.hpp>
37template<
class TypeTag,
class Model>
45 using NeighborSet = typename
46 ::Opm::BaseAuxiliaryModule<TypeTag>::NeighborSet;
52 , lin_comm_(std::move(comm))
64 if (!model_.addMatrixContributions()) {
80 std::vector<int>
wellCells = model_.getCellsForConnections(well);
101 void linearize(SparseMatrixAdapter& jacobian, GlobalEqVector&
res)
override
103 OPM_BEGIN_PARALLEL_TRY_CATCH();
104 for (
const auto& well : model_) {
105 this->linearizeSingleWell(jacobian,
res, well);
107 OPM_END_PARALLEL_TRY_CATCH(
"BlackoilWellModel::linearize failed: ", lin_comm_);
112 model_.recoverWellSolutionAndUpdateWellState(
deltaX);
115 void linearizeDomain(
const Domain&
domain,
116 SparseMatrixAdapter& jacobian,
122 for (
const auto& well : model_) {
123 if (model_.well_domain().at(well->name()) ==
domain.index) {
124 this->linearizeSingleWell(jacobian,
res, well);
129 void postSolveDomain(
const GlobalEqVector&
deltaX,
const Domain&
domain)
131 model_.recoverWellSolutionAndUpdateWellStateDomain(
deltaX,
domain.index);
134 template <
class Restarter>
144 template <
class Restarter>
151 template<
class WellType>
152 void linearizeSingleWell(SparseMatrixAdapter& jacobian,
154 const WellType& well)
156 if (model_.addMatrixContributions()) {
157 well->addWellContributions(jacobian);
160 const auto& cells = well->cells();
161 linearize_res_local_.resize(cells.size());
163 for (
size_t i = 0; i < cells.size(); ++i) {
164 linearize_res_local_[i] =
res[cells[i]];
167 well->apply(linearize_res_local_);
169 for (
size_t i = 0; i < cells.size(); ++i) {
170 res[cells[i]] = linearize_res_local_[i];
175 GlobalEqVector linearize_res_local_{};
176 Parallel::Communication lin_comm_;
Base class for specifying auxiliary equations.
Base class for specifying auxiliary equations.
Definition baseauxiliarymodule.hh:56
Class for serializing and broadcasting data using MPI.
Definition MPISerializer.hpp:31
Definition WellConnectionAuxiliaryModule.hpp:39
unsigned numDofs() const override
Returns the number of additional degrees of freedom required for the auxiliary module.
Definition WellConnectionAuxiliaryModule.hpp:56
void linearize(SparseMatrixAdapter &jacobian, GlobalEqVector &res) override
Linearize the auxiliary equation.
Definition WellConnectionAuxiliaryModule.hpp:101
void serialize(Restarter &)
This method writes the complete state of the well to the harddisk.
Definition WellConnectionAuxiliaryModule.hpp:145
void addNeighbors(std::vector< NeighborSet > &neighbors) const override
Specify the additional neighboring correlations caused by the auxiliary module.
Definition WellConnectionAuxiliaryModule.hpp:62
void postSolve(GlobalEqVector &deltaX) override
This method is called after the linear solver has been called but before the solution is updated for ...
Definition WellConnectionAuxiliaryModule.hpp:110
void applyInitial() override
Set the initial condition of the auxiliary module in the solution vector.
Definition WellConnectionAuxiliaryModule.hpp:98
This file contains a set of helper functions used by VFPProd / VFPInj.
Definition blackoilboundaryratevector.hh:37
constexpr auto getPropValue()
get the value data member of a property
Definition propertysystem.hh:242
typename Properties::Detail::GetPropImpl< TypeTag, Property >::type::type GetPropType
get the type alias defined in the property (equivalent to old macro GET_PROP_TYPE(....
Definition propertysystem.hh:235
Representing a part of a grid, in a way suitable for performing local solves.
Definition SubDomain.hpp:85