mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-25 18:55:30 -06:00
added: StandardWellEquations::extract(WellContributions&)
this adds the well matrices to a WellContributions object. this is the core of StandardWellEval::addWellContributions. use the new method in the implementation.
This commit is contained in:
@@ -24,6 +24,7 @@
|
||||
|
||||
#include <opm/common/Exceptions.hpp>
|
||||
|
||||
#include <opm/simulators/linalg/bda/WellContributions.hpp>
|
||||
#include <opm/simulators/linalg/matrixblock.hh>
|
||||
|
||||
namespace Opm
|
||||
@@ -178,6 +179,60 @@ recoverSolutionWell(const BVector& x, BVectorWell& xw) const
|
||||
invDuneD_.mv(resWell, xw);
|
||||
}
|
||||
|
||||
template<class Scalar, int numEq>
|
||||
void StandardWellEquations<Scalar,numEq>::
|
||||
extract(const int numStaticWellEq,
|
||||
WellContributions& wellContribs) const
|
||||
{
|
||||
std::vector<int> colIndices;
|
||||
std::vector<double> nnzValues;
|
||||
colIndices.reserve(duneB_.nonzeroes());
|
||||
nnzValues.reserve(duneB_.nonzeroes() * numStaticWellEq * numEq);
|
||||
|
||||
// duneC
|
||||
for (auto colC = duneC_[0].begin(),
|
||||
endC = duneC_[0].end(); colC != endC; ++colC )
|
||||
{
|
||||
colIndices.emplace_back(colC.index());
|
||||
for (int i = 0; i < numStaticWellEq; ++i) {
|
||||
for (int j = 0; j < numEq; ++j) {
|
||||
nnzValues.emplace_back((*colC)[i][j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
wellContribs.addMatrix(WellContributions::MatrixType::C,
|
||||
colIndices.data(), nnzValues.data(), duneC_.nonzeroes());
|
||||
|
||||
// invDuneD
|
||||
colIndices.clear();
|
||||
nnzValues.clear();
|
||||
colIndices.emplace_back(0);
|
||||
for (int i = 0; i < numStaticWellEq; ++i)
|
||||
{
|
||||
for (int j = 0; j < numStaticWellEq; ++j) {
|
||||
nnzValues.emplace_back(invDuneD_[0][0][i][j]);
|
||||
}
|
||||
}
|
||||
wellContribs.addMatrix(WellContributions::MatrixType::D,
|
||||
colIndices.data(), nnzValues.data(), 1);
|
||||
|
||||
// duneB
|
||||
colIndices.clear();
|
||||
nnzValues.clear();
|
||||
for (auto colB = duneB_[0].begin(),
|
||||
endB = duneB_[0].end(); colB != endB; ++colB )
|
||||
{
|
||||
colIndices.emplace_back(colB.index());
|
||||
for (int i = 0; i < numStaticWellEq; ++i) {
|
||||
for (int j = 0; j < numEq; ++j) {
|
||||
nnzValues.emplace_back((*colB)[i][j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
wellContribs.addMatrix(WellContributions::MatrixType::B,
|
||||
colIndices.data(), nnzValues.data(), duneB_.nonzeroes());
|
||||
}
|
||||
|
||||
#define INSTANCE(N) \
|
||||
template class StandardWellEquations<double,N>;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user