#include <WellContributions.hpp>

Inheritance diagram for Opm::WellContributions< Scalar >:
Inheritance graph

Public Types

enum class  MatrixType { C , D , B }
 StandardWell has C, D and B matrices that need to be copied. More...
 
using UMFPackIndex = SuiteSparse_long
 

Public Member Functions

unsigned int getNumWells ()
 
void addNumBlocks (unsigned int numBlocks)
 
void alloc ()
 Allocate memory for the StandardWells. More...
 
virtual ~WellContributions ()
 Empty destructor. More...
 
void setBlockSize (unsigned int dim, unsigned int dim_wells)
 
void setVectorSize (unsigned N)
 
void addMatrix (MatrixType type, int *colIndices, Scalar *values, unsigned int val_size)
 
void addMultisegmentWellContribution (unsigned int dim, unsigned int dim_wells, unsigned int Mb, std::vector< Scalar > &Bvalues, std::vector< unsigned int > &BcolIndices, std::vector< unsigned int > &BrowPointers, unsigned int DnumBlocks, Scalar *Dvalues, UMFPackIndex *DcolPointers, UMFPackIndex *DrowIndices, std::vector< Scalar > &Cvalues)
 

Static Public Member Functions

static std::unique_ptr< WellContributionscreate (const std::string &accelerator_mode, bool useWellConn)
 

Protected Member Functions

virtual void APIalloc ()
 API specific allocation. More...
 
virtual void APIaddMatrix (MatrixType, int *, Scalar *, unsigned int)
 Api specific upload of matrix. More...
 

Protected Attributes

bool allocated = false
 
unsigned int N
 
unsigned int dim
 
unsigned int dim_wells
 
unsigned int num_blocks = 0
 
unsigned int num_std_wells = 0
 
unsigned int num_ms_wells = 0
 
unsigned int num_blocks_so_far = 0
 
unsigned int num_std_wells_so_far = 0
 
std::vector< unsigned int > val_pointers
 
std::vector< std::unique_ptr< MultisegmentWellContribution< Scalar > > > multisegments
 

Detailed Description

template<class Scalar>
class Opm::WellContributions< Scalar >

This class serves to eliminate the need to include the WellContributions into the matrix (with –matrix-add-well-contributions=true) for the cusparseSolver or openclSolver. If the –matrix-add-well-contributions commandline parameter is true, this class should still be used, but be empty. StandardWell and MultisegmentWell are supported for both cusparseSolver and openclSolver. A single instance (or pointer) of this class is passed to the BdaSolver. For StandardWell, this class contains all the data and handles the computation. For MultisegmentWell, the vector 'multisegments' contains all the data. For more information, check the MultisegmentWellContribution class. A StandardWell uses C, D and B and performs y -= (C^T * (D^-1 * (B*x))) B and C are vectors, disguised as matrices and contain blocks of StandardWell::numEq by StandardWell::numStaticWellEq D is a block, disguised as matrix, the square block has size StandardWell::numStaticWellEq. D is actually stored as D^-1 B*x and D*B*x are a vector with numStaticWellEq doubles C*D*B*x is a blocked matrix with a symmetric sparsity pattern, contains square blocks with size numEq. For every columnindex i, j in StandardWell::duneB_, there is a block on (i, j) in C*D*B*x.

This class is used in 3 phases:

  • get total size of all wellcontributions that must be stored here
  • allocate memory
  • copy data of wellcontributions

Member Typedef Documentation

◆ UMFPackIndex

template<class Scalar >
using Opm::WellContributions< Scalar >::UMFPackIndex = SuiteSparse_long

Member Enumeration Documentation

◆ MatrixType

template<class Scalar >
enum class Opm::WellContributions::MatrixType
strong

StandardWell has C, D and B matrices that need to be copied.

Enumerator

Constructor & Destructor Documentation

◆ ~WellContributions()

template<class Scalar >
virtual Opm::WellContributions< Scalar >::~WellContributions ( )
virtual

Empty destructor.

Member Function Documentation

◆ addMatrix()

template<class Scalar >
void Opm::WellContributions< Scalar >::addMatrix ( MatrixType  type,
int *  colIndices,
Scalar *  values,
unsigned int  val_size 
)

Store a matrix in this object, in blocked csr format, can only be called after alloc() is called

Parameters
[in]typeindicate if C, D or B is sent
[in]colIndicescolumnindices of blocks in C or B, ignored for D
[in]valuesarray of nonzeroes
[in]val_sizenumber of blocks in C or B, ignored for D

◆ addMultisegmentWellContribution()

template<class Scalar >
void Opm::WellContributions< Scalar >::addMultisegmentWellContribution ( unsigned int  dim,
unsigned int  dim_wells,
unsigned int  Mb,
std::vector< Scalar > &  Bvalues,
std::vector< unsigned int > &  BcolIndices,
std::vector< unsigned int > &  BrowPointers,
unsigned int  DnumBlocks,
Scalar *  Dvalues,
UMFPackIndex DcolPointers,
UMFPackIndex DrowIndices,
std::vector< Scalar > &  Cvalues 
)

Add a MultisegmentWellContribution, actually creates an object on heap that is destroyed in the destructor Matrices C and B are passed in Blocked CSR, matrix D in CSC

Parameters
[in]dimsize of blocks in vectors x and y, equal to MultisegmentWell::numEq
[in]dim_wellssize of blocks of C, B and D, equal to MultisegmentWell::numWellEq
[in]Mbnumber of blockrows in C, B and D
[in]Bvaluesnonzero values of matrix B
[in]BcolIndicescolumnindices of blocks of matrix B
[in]BrowPointersrowpointers of matrix B
[in]DnumBlocksnumber of blocks in D
[in]Dvaluesnonzero values of matrix D
[in]DcolPointerscolumnpointers of matrix D
[in]DrowIndicesrowindices of matrix D
[in]Cvaluesnonzero values of matrix C

◆ addNumBlocks()

template<class Scalar >
void Opm::WellContributions< Scalar >::addNumBlocks ( unsigned int  numBlocks)

Indicate how large the next StandardWell is, this function cannot be called after alloc() is called

Parameters
[in]numBlocksnumber of blocks in C and B of next StandardWell

◆ alloc()

template<class Scalar >
void Opm::WellContributions< Scalar >::alloc ( )

Allocate memory for the StandardWells.

◆ APIaddMatrix()

template<class Scalar >
virtual void Opm::WellContributions< Scalar >::APIaddMatrix ( MatrixType  ,
int *  ,
Scalar *  ,
unsigned int   
)
inlineprotectedvirtual

◆ APIalloc()

template<class Scalar >
virtual void Opm::WellContributions< Scalar >::APIalloc ( )
inlineprotectedvirtual

◆ create()

template<class Scalar >
static std::unique_ptr< WellContributions > Opm::WellContributions< Scalar >::create ( const std::string &  accelerator_mode,
bool  useWellConn 
)
static

◆ getNumWells()

template<class Scalar >
unsigned int Opm::WellContributions< Scalar >::getNumWells ( )
inline

◆ setBlockSize()

template<class Scalar >
void Opm::WellContributions< Scalar >::setBlockSize ( unsigned int  dim,
unsigned int  dim_wells 
)

Indicate how large the blocks of the StandardWell (C and B) are

Parameters
[in]dimnumber of columns
[in]dim_wellsnumber of rows

◆ setVectorSize()

template<class Scalar >
void Opm::WellContributions< Scalar >::setVectorSize ( unsigned  N)

Set size of vector that the wells are applied to

Parameters
[in]Nsize of vector

Member Data Documentation

◆ allocated

template<class Scalar >
bool Opm::WellContributions< Scalar >::allocated = false
protected

◆ dim

template<class Scalar >
unsigned int Opm::WellContributions< Scalar >::dim
protected

◆ dim_wells

template<class Scalar >
unsigned int Opm::WellContributions< Scalar >::dim_wells
protected

◆ multisegments

template<class Scalar >
std::vector<std::unique_ptr<MultisegmentWellContribution<Scalar> > > Opm::WellContributions< Scalar >::multisegments
protected

◆ N

template<class Scalar >
unsigned int Opm::WellContributions< Scalar >::N
protected

◆ num_blocks

template<class Scalar >
unsigned int Opm::WellContributions< Scalar >::num_blocks = 0
protected

◆ num_blocks_so_far

template<class Scalar >
unsigned int Opm::WellContributions< Scalar >::num_blocks_so_far = 0
protected

◆ num_ms_wells

template<class Scalar >
unsigned int Opm::WellContributions< Scalar >::num_ms_wells = 0
protected

◆ num_std_wells

template<class Scalar >
unsigned int Opm::WellContributions< Scalar >::num_std_wells = 0
protected

◆ num_std_wells_so_far

template<class Scalar >
unsigned int Opm::WellContributions< Scalar >::num_std_wells_so_far = 0
protected

◆ val_pointers

template<class Scalar >
std::vector<unsigned int> Opm::WellContributions< Scalar >::val_pointers
protected

The documentation for this class was generated from the following files: