/// This class serves to duplicate the functionality of the MultisegmentWell
/// A MultisegmentWell uses C, D and B and performs y -= (C^T * (D^-1 * (B*x)))
/// B and C are matrices, with M rows and N columns, where N is the size of the matrix. They contain blocks of MultisegmentWell::numEq by MultisegmentWell::numWellEq.
/// D is a MxM matrix, the square blocks have size MultisegmentWell::numWellEq.
/// B*x and D*B*x are a vector with M*numWellEq doubles
/// C*D*B*x is a vector with N*numEq doubles.
classMultisegmentWellContribution
{
private:
unsignedintdim;// size of blockvectors in vectors x and y, equal to MultisegmentWell::numEq
unsignedintdim_wells;// size of blocks in C, B and D, equal to MultisegmentWell::numWellEq
unsignedintN;// number of rows in vectors x and y, N == dim*Nb
unsignedintNb;// number of blockrows in x and y
unsignedintM;// number of rows, M == dim_wells*Mb
unsignedintMb;// number of blockrows in C, D and B
#if HAVE_CUDA
cudaStream_tstream;// not actually used yet, will be when MultisegmentWellContribution are applied on GPU
#endif
// C and B are stored in BCRS format, D is stored in CSC format (Dune::UMFPack)
// Sparsity pattern for C is not stored, since it is the same as B
unsignedintDnumBlocks;// number of blocks in D
unsignedintBnumBlocks;// number of blocks in C and B