Memosa-FVM  0.2
CRMatrix< T_Diag, T_OffDiag, X > Class Template Reference

#include <CRMatrix.h>

Inheritance diagram for CRMatrix< T_Diag, T_OffDiag, X >:
Collaboration diagram for CRMatrix< T_Diag, T_OffDiag, X >:

Classes

class  PairWiseAssembler
 

Public Types

typedef T_Diag Diag
 
typedef T_OffDiag OffDiag
 
typedef Array< DiagDiagArray
 
typedef Array< int > IntArray
 
typedef Array< OffDiagOffDiagArray
 
typedef Array< X > XArray
 
typedef shared_ptr< Array< int > > IntArrayPtr
 
typedef shared_ptr< Array< Diag > > DiagArrayPtr
 
typedef shared_ptr< Array
< double > > 
ArrayDblePtr
 
typedef SpikeMatrix< Diag,
OffDiag, X > 
T_SpikeMtrx
 
typedef pair< const
StorageSite *, const
StorageSite * > 
EntryIndex
 
typedef map< EntryIndex,
shared_ptr< ArrayBase > > 
GhostArrayMap
 
typedef map< const
CRConnectivity
*, PairWiseAssembler * > 
PairWiseAssemblerMap
 

Public Member Functions

 CRMatrix (const CRConnectivity &conn)
 
 DEFINE_TYPENAME ("CRMatrix<"+NumTypeTraits< Diag >::getTypeName()+","+NumTypeTraits< OffDiag >::getTypeName()+","+NumTypeTraits< X >::getTypeName()+">")
 
virtual void initAssembly ()
 
virtual void multiply (IContainer &yB, const IContainer &xB) const
 
virtual void multiplyAndAdd (IContainer &yB, const IContainer &xB) const
 
virtual void transpose ()
 
virtual shared_ptr< ArrayBasequadProduct (const IContainer &xB) const
 
virtual void forwardGS (IContainer &xB, IContainer &bB, IContainer &) const
 
virtual void reverseGS (IContainer &xB, IContainer &bB, IContainer &) const
 
virtual void Jacobi (IContainer &xnewB, const IContainer &xoldB, const IContainer &bB) const
 
virtual void iluSolve (IContainer &xB, const IContainer &bB, const IContainer &) const
 
virtual void spikeSolve (IContainer &xB, const IContainer &bB, const IContainer &, const SpikeStorage &spike_storage) const
 
virtual void computeResidual (const IContainer &xB, const IContainer &bB, IContainer &rB) const
 
virtual void solveBoundary (IContainer &xB, IContainer &bB, IContainer &) const
 
virtual int createCoarsening (IContainer &gCoarseIndex, const int groupSize, const double weightRatioThreshold)
 
shared_ptr< CRConnectivitycreateCoarseConnectivity (const IContainer &gCoarseIndex, const CRConnectivity &coarseToFine, const StorageSite &coarseRowSite, const StorageSite &coarseColSite)
 
shared_ptr< MatrixcreateCoarseMatrix (const IContainer &gCoarseIndex, const CRConnectivity &coarseToFine, const CRConnectivity &coarseConnectivity)
 
virtual const CRConnectivitygetConnectivity () const
 
OffDiaggetCoeff (const int i, const int j)
 
bool hasCoeff (const int i, const int j)
 
Array< Diag > & getDiag ()
 
Array< OffDiag > & getOffDiag ()
 
const Array< Diag > & getDiag () const
 
const Array< OffDiag > & getOffDiag () const
 
void * getDiagData () const
 
void * getOffDiagData () const
 
int getDiagDataSize () const
 
int getOffDiagDataSize () const
 
PairWiseAssemblergetPairWiseAssembler (const CRConnectivity &pairs)
 
virtual ~CRMatrix ()
 
void setDirichlet (const int nr)
 
void eliminateRow (const int j, Array< X > &b)
 
void eliminateRowGhost (Array< X > &b)
 
virtual void printRow (const int i) const
 
void eliminateDirichlet (const int j, Array< X > &b, const X &delta_j, const bool explicitMode=false)
 
void setBoundary (const int nr)
 
virtual void eliminateBoundaryEquations (IContainer &bB)
 
virtual void setFlatMatrix (Matrix &fmg) const
 
- Public Member Functions inherited from Matrix
 Matrix ()
 
virtual ~Matrix ()
 
 DEFINE_TYPENAME ("Matrix")
 
virtual shared_ptr< MatrixcreateMergeMatrix (const LinearSystemMerger &mergeLS)
 
virtual bool isInvertible ()
 

Private Member Functions

void syncBndryCoeffs (const Array< X > &b)
 
void createScatterGatherCountsBuffer ()
 
void syncCounts ()
 
void createScatterGatherIndicesBuffer ()
 
void syncIndices ()
 
void createScatterGatherValuesCRMtrxBuffer ()
 
void syncValuesCRMtrx ()
 
void createScatterGatherValuesBBuffer (const XArray &B)
 
void syncValuesB ()
 
int get_request_size ()
 
void compute_ILU0 () const
 
void lowerSolve (XArray &y, const XArray &b) const
 
void upperSolve (XArray &x, const XArray &y) const
 

Private Attributes

const CRConnectivity_conn
 
const Array< int > & _row
 
const Array< int > & _col
 
Array< Diag_diag
 
Array< OffDiag_offDiag
 
PairWiseAssemblerMap _pairWiseAssemblers
 
Array< bool > _isBoundary
 
shared_ptr< CRConnectivity_iluConnPtr
 
IntArrayPtr _iluDiagIndexPtr
 
DiagArrayPtr _iluCoeffsPtr
 
shared_ptr< T_SpikeMtrx_spikeMtrx
 
GhostArrayMap _sendCounts
 
GhostArrayMap _recvCounts
 
GhostArrayMap _sendIndices
 
GhostArrayMap _recvIndices
 
GhostArrayMap _sendValuesCRMtrx
 
GhostArrayMap _recvValuesCRMtrx
 
GhostArrayMap _sendValuesB
 
GhostArrayMap _recvValuesB
 
map< int, int > _ghostCellBoundayMap
 

Detailed Description

template<class T_Diag, class T_OffDiag, class X>
class CRMatrix< T_Diag, T_OffDiag, X >

Sparse matrix stored using a compressed row format. The sparsity pattern is provided by a CRConnectivity object that is required at construction time. Note that we assume that diagonal is implicitly always present (i.e., col[row[i]] through col[row[i+1]] do not contain i) and store diagonal and off diagonal entries in separate arrays.

The class is templated with the types of diagonal, off-diagonal and the corresponding x arrays as template parameters.

Definition at line 87 of file CRMatrix.h.

Member Typedef Documentation

template<class T_Diag, class T_OffDiag, class X>
typedef shared_ptr< Array<double> > CRMatrix< T_Diag, T_OffDiag, X >::ArrayDblePtr

Definition at line 103 of file CRMatrix.h.

template<class T_Diag, class T_OffDiag, class X>
typedef T_Diag CRMatrix< T_Diag, T_OffDiag, X >::Diag

Definition at line 93 of file CRMatrix.h.

template<class T_Diag, class T_OffDiag, class X>
typedef Array<Diag> CRMatrix< T_Diag, T_OffDiag, X >::DiagArray

Definition at line 95 of file CRMatrix.h.

template<class T_Diag, class T_OffDiag, class X>
typedef shared_ptr< Array<Diag> > CRMatrix< T_Diag, T_OffDiag, X >::DiagArrayPtr

Definition at line 101 of file CRMatrix.h.

template<class T_Diag, class T_OffDiag, class X>
typedef pair<const StorageSite*, const StorageSite*> CRMatrix< T_Diag, T_OffDiag, X >::EntryIndex

Definition at line 106 of file CRMatrix.h.

template<class T_Diag, class T_OffDiag, class X>
typedef map<EntryIndex, shared_ptr<ArrayBase> > CRMatrix< T_Diag, T_OffDiag, X >::GhostArrayMap

Definition at line 107 of file CRMatrix.h.

template<class T_Diag, class T_OffDiag, class X>
typedef Array<int> CRMatrix< T_Diag, T_OffDiag, X >::IntArray

Definition at line 96 of file CRMatrix.h.

template<class T_Diag, class T_OffDiag, class X>
typedef shared_ptr< Array<int> > CRMatrix< T_Diag, T_OffDiag, X >::IntArrayPtr

Definition at line 100 of file CRMatrix.h.

template<class T_Diag, class T_OffDiag, class X>
typedef T_OffDiag CRMatrix< T_Diag, T_OffDiag, X >::OffDiag

Definition at line 94 of file CRMatrix.h.

template<class T_Diag, class T_OffDiag, class X>
typedef Array<OffDiag> CRMatrix< T_Diag, T_OffDiag, X >::OffDiagArray

Definition at line 98 of file CRMatrix.h.

template<class T_Diag, class T_OffDiag, class X>
typedef map<const CRConnectivity*,PairWiseAssembler*> CRMatrix< T_Diag, T_OffDiag, X >::PairWiseAssemblerMap

Definition at line 162 of file CRMatrix.h.

template<class T_Diag, class T_OffDiag, class X>
typedef SpikeMatrix< Diag, OffDiag, X> CRMatrix< T_Diag, T_OffDiag, X >::T_SpikeMtrx

Definition at line 104 of file CRMatrix.h.

template<class T_Diag, class T_OffDiag, class X>
typedef Array<X> CRMatrix< T_Diag, T_OffDiag, X >::XArray

Definition at line 99 of file CRMatrix.h.

Constructor & Destructor Documentation

template<class T_Diag, class T_OffDiag, class X>
CRMatrix< T_Diag, T_OffDiag, X >::CRMatrix ( const CRConnectivity conn)
inline

Definition at line 165 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_isBoundary, and logCtor.

Referenced by CRMatrix< T_Diag, T_OffDiag, X >::createCoarseMatrix().

165  :
166  Matrix(),
167  _conn(conn),
168  _row(_conn.getRow()),
169  _col(_conn.getCol()),
170  _diag(_conn.getRowDim()),
174  _spikeMtrx()
175  {
176 
177  logCtor();
178  _isBoundary = false;
179  }
const Array< int > & getCol() const
const Array< int > & getRow() const
shared_ptr< T_SpikeMtrx > _spikeMtrx
Definition: CRMatrix.h:1738
Matrix()
Definition: Matrix.cpp:8
const Array< int > & _col
Definition: CRMatrix.h:1720
Array< bool > _isBoundary
Definition: CRMatrix.h:1724
#define logCtor()
Definition: RLogInterface.h:26
Array< OffDiag > _offDiag
Definition: CRMatrix.h:1722
Array< Diag > _diag
Definition: CRMatrix.h:1721
const Array< int > & _row
Definition: CRMatrix.h:1719
const CRConnectivity & _conn
Definition: CRMatrix.h:1718
PairWiseAssemblerMap _pairWiseAssemblers
Definition: CRMatrix.h:1723
int getRowDim() const
int getLength() const
Definition: Array.h:87
template<class T_Diag, class T_OffDiag, class X>
virtual CRMatrix< T_Diag, T_OffDiag, X >::~CRMatrix ( )
inlinevirtual

Definition at line 878 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_pairWiseAssemblers, and logDtor.

879  {
880  for (typename PairWiseAssemblerMap::iterator pos = _pairWiseAssemblers.begin();
881  pos != _pairWiseAssemblers.end();
882  ++pos)
883  delete pos->second;
884  logDtor();
885  }
#define logDtor()
Definition: RLogInterface.h:33
PairWiseAssemblerMap _pairWiseAssemblers
Definition: CRMatrix.h:1723

Member Function Documentation

template<class T_Diag, class T_OffDiag, class X>
void CRMatrix< T_Diag, T_OffDiag, X >::compute_ILU0 ( ) const
inlineprivate

Definition at line 1546 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_col, CRMatrix< T_Diag, T_OffDiag, X >::_conn, CRMatrix< T_Diag, T_OffDiag, X >::_diag, CRMatrix< T_Diag, T_OffDiag, X >::_iluCoeffsPtr, CRMatrix< T_Diag, T_OffDiag, X >::_iluConnPtr, CRMatrix< T_Diag, T_OffDiag, X >::_iluDiagIndexPtr, CRMatrix< T_Diag, T_OffDiag, X >::_offDiag, CRMatrix< T_Diag, T_OffDiag, X >::_row, CRConnectivity::add(), CRConnectivity::addCount(), CRConnectivity::finishAdd(), CRConnectivity::finishCount(), CRConnectivity::getCol(), CRConnectivity::getColSite(), Array< T >::getLength(), CRConnectivity::getRow(), CRConnectivity::getRowSite(), StorageSite::getSelfCount(), and CRConnectivity::initCount().

Referenced by CRMatrix< T_Diag, T_OffDiag, X >::iluSolve().

1547  {
1548  const int nRows = _conn.getRowSite().getSelfCount();
1549 
1550  // create connectivity matrix for the ILU factored matrix; for ILU
1551  // 0 the only difference from this CRMatrix's connectivity is that
1552  // the diagonal is explicitly included
1553  //
1554 
1555  _iluConnPtr = shared_ptr<CRConnectivity>
1557  CRConnectivity& iluConn = *_iluConnPtr;
1558 
1559  iluConn.initCount();
1560 
1561  for(int nr=0; nr<nRows; nr++)
1562  {
1563  // add one for diagonal
1564  iluConn.addCount(nr,1);
1565  for(int nb=_row[nr]; nb<_row[nr+1]; nb++)
1566  {
1567  // only include neighbours in this matrix
1568  if (_col[nb] < nRows)
1569  iluConn.addCount(nr,1);
1570  }
1571  }
1572 
1573  iluConn.finishCount();
1574 
1575  const int nnz = iluConn.getCol().getLength();
1576  _iluCoeffsPtr = DiagArrayPtr(new DiagArray(nnz));
1577  _iluDiagIndexPtr = IntArrayPtr(new IntArray(nRows));
1578 
1579  DiagArray& iluCoeffs = *_iluCoeffsPtr;
1580  IntArray& iluDiagIndex = *_iluDiagIndexPtr;
1581 
1582  // now we can fill the iluCoeffs with this matrix's coeffs
1583  for(int nr=0; nr<nRows; nr++)
1584  {
1585  // lower coeffs first
1586  for(int nb=_row[nr]; nb<_row[nr+1]; nb++)
1587  {
1588  const int j = _col[nb];
1589  if (j < nRows && j < nr)
1590  {
1591  const int pos = iluConn.add(nr,j);
1592  iluCoeffs[pos] = _offDiag[nb];
1593  }
1594 
1595  }
1596 
1597  // add diagonal next
1598  const int pos = iluConn.add(nr,nr);
1599  iluCoeffs[pos] = _diag[nr];
1600  iluDiagIndex[nr] = pos;
1601 
1602  // finally the upper coeffs
1603  for(int nb=_row[nr]; nb<_row[nr+1]; nb++)
1604  {
1605  const int j = _col[nb];
1606  if (j < nRows && j > nr)
1607  {
1608  const int pos = iluConn.add(nr,j);
1609  iluCoeffs[pos] = _offDiag[nb];
1610  }
1611 
1612  }
1613  }
1614 
1615  // finalize the iluConnectivity
1616  iluConn.finishAdd();
1617 
1618  // ilu decomposition
1619 
1620  const IntArray& iluRow = iluConn.getRow();
1621  const IntArray& iluCol = iluConn.getCol();
1622 
1623 
1624  //work array iw(n) and diagonal pointer uptr
1625  Array<int> iw(nRows);
1626  Array<int> uptr(nRows);
1627  iw = 0;
1628  uptr = 0;
1629 
1630  const Diag unity(NumTypeTraits<Diag>::getUnity());
1631 
1632  //main loop
1633  for (int k = 0; k < nRows; k++ )
1634  {
1635  const int j1 = iluRow[k];
1636  const int j2 = iluRow[k+1];
1637  for (int j = j1; j <j2; j++ )
1638  iw[ iluCol[j] ] = j;
1639 
1640  int j = j1;
1641  do
1642  {
1643  int jrow = iluCol[j];
1644  if ( jrow < k )
1645  {
1646  const Diag t1 = iluCoeffs[j] * iluCoeffs[ uptr[jrow] ];
1647  iluCoeffs[j] = t1;
1648  //perform linear combination
1649  for (int jj = uptr[jrow]+1; jj < iluRow[jrow+1]; jj++ )
1650  {
1651  int jw = iw[ iluCol[jj] ];
1652  if ( jw != 0 )
1653  iluCoeffs[jw] -= t1 * iluCoeffs[jj];
1654  }
1655  j++;
1656  }
1657  else
1658  {
1659  uptr[k] = j;
1660  break;
1661  }
1662  }
1663  while( j < j2 );
1664 
1665  //inverting diagonal
1666  iluCoeffs[j] = unity / iluCoeffs[j];
1667  //zeroing iw
1668  for ( int i = j1; i < j2; i++ )
1669  iw[ iluCol[i] ] = 0;
1670  }
1671  }
const Array< int > & getCol() const
const Array< int > & getRow() const
int getSelfCount() const
Definition: StorageSite.h:40
shared_ptr< Array< int > > IntArrayPtr
Definition: CRMatrix.h:100
Array< int > IntArray
Definition: CRMatrix.h:96
const Array< int > & _col
Definition: CRMatrix.h:1720
shared_ptr< Array< Diag > > DiagArrayPtr
Definition: CRMatrix.h:101
Array< Diag > DiagArray
Definition: CRMatrix.h:95
Array< OffDiag > _offDiag
Definition: CRMatrix.h:1722
T_Diag Diag
Definition: CRMatrix.h:93
Array< Diag > _diag
Definition: CRMatrix.h:1721
const Array< int > & _row
Definition: CRMatrix.h:1719
const CRConnectivity & _conn
Definition: CRMatrix.h:1718
const StorageSite & getColSite() const
IntArrayPtr _iluDiagIndexPtr
Definition: CRMatrix.h:1733
int add(const int index, const int val)
shared_ptr< CRConnectivity > _iluConnPtr
Definition: CRMatrix.h:1731
const StorageSite & getRowSite() const
void addCount(const int index, const int count)
int getLength() const
Definition: Array.h:87
DiagArrayPtr _iluCoeffsPtr
Definition: CRMatrix.h:1736
template<class T_Diag, class T_OffDiag, class X>
virtual void CRMatrix< T_Diag, T_OffDiag, X >::computeResidual ( const IContainer xB,
const IContainer bB,
IContainer rB 
) const
inlinevirtual

r = b + this*x

Reimplemented from Matrix.

Definition at line 407 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_col, CRMatrix< T_Diag, T_OffDiag, X >::_conn, CRMatrix< T_Diag, T_OffDiag, X >::_diag, CRMatrix< T_Diag, T_OffDiag, X >::_offDiag, CRMatrix< T_Diag, T_OffDiag, X >::_row, CRConnectivity::getRowSite(), and StorageSite::getSelfCount().

409  {
410  const XArray& x = dynamic_cast<const XArray&>(xB);
411  const XArray& b = dynamic_cast<const XArray&>(bB);
412  XArray& r = dynamic_cast<XArray&>(rB);
413 
414  const int nRows = _conn.getRowSite().getSelfCount();
415 
416  for(int nr=0; nr<nRows; nr++)
417  {
418 
419  r[nr] = b[nr] + _diag[nr]*x[nr];
420  for (int nb = _row[nr]; nb<_row[nr+1]; nb++)
421  {
422  const int j = _col[nb];
423  r[nr] += _offDiag[nb]*x[j];
424  }
425  }
426  }
int getSelfCount() const
Definition: StorageSite.h:40
const Array< int > & _col
Definition: CRMatrix.h:1720
Array< X > XArray
Definition: CRMatrix.h:99
Array< OffDiag > _offDiag
Definition: CRMatrix.h:1722
Array< Diag > _diag
Definition: CRMatrix.h:1721
const Array< int > & _row
Definition: CRMatrix.h:1719
const CRConnectivity & _conn
Definition: CRMatrix.h:1718
const StorageSite & getRowSite() const
template<class T_Diag, class T_OffDiag, class X>
shared_ptr<CRConnectivity> CRMatrix< T_Diag, T_OffDiag, X >::createCoarseConnectivity ( const IContainer gCoarseIndex,
const CRConnectivity coarseToFine,
const StorageSite coarseRowSite,
const StorageSite coarseColSite 
)
inlinevirtual

Create the connectivity for a coarse level matrix given the coarsening (ie. the fine to coarse index mapping) and its transpose (ie coarse to fine mapping, provided as a CRConnectivity object)

Reimplemented from Matrix.

Definition at line 598 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_col, CRMatrix< T_Diag, T_OffDiag, X >::_row, CRConnectivity::getCount(), and StorageSite::getCountLevel1().

602  {
603  const Array<int>& coarseIndex = dynamic_cast<const Array<int>& >(gCoarseIndex);
604 
605  const int nCoarseRows = coarseRowSite.getCountLevel1();
606 
607  shared_ptr<CRConnectivity> coarseCR(new CRConnectivity(coarseRowSite,coarseColSite));
608 
609 
610  coarseCR->initCount();
611 
612  Array<bool> coarseCounted(nCoarseRows);
613 
614  coarseCounted = false;
615 
616  for(int nrCoarse=0; nrCoarse<nCoarseRows; nrCoarse++)
617  {
618  const int nFine = coarseToFine.getCount(nrCoarse);
619  for(int nfr=0; nfr<nFine; nfr++)
620  {
621  const int nrFine = coarseToFine(nrCoarse,nfr);
622  for (int nb = _row[nrFine]; nb<_row[nrFine+1]; nb++)
623  {
624  const int nc = _col[nb];
625  const int ncCoarse = coarseIndex[nc];
626 
627 
628  if (ncCoarse>=0 && nrCoarse!=ncCoarse && !coarseCounted[ncCoarse])
629  {
630  coarseCounted[ncCoarse] = true;
631  coarseCR->addCount(nrCoarse,1);
632  }
633  }
634  }
635 
636  // reset counted
637  for(int nfr=0; nfr<nFine; nfr++)
638  {
639  const int nrFine = coarseToFine(nrCoarse,nfr);
640 
641  for (int nb = _row[nrFine]; nb<_row[nrFine+1]; nb++)
642  {
643  const int nc = _col[nb];
644  const int ncCoarse = coarseIndex[nc];
645  if (ncCoarse>=0)
646  coarseCounted[ncCoarse] = false;
647  }
648  }
649  }
650 
651  coarseCR->finishCount();
652 
653  for(int nrCoarse=0; nrCoarse<nCoarseRows; nrCoarse++)
654  {
655  const int nFine = coarseToFine.getCount(nrCoarse);
656  for(int nfr=0; nfr<nFine; nfr++)
657  {
658  const int nrFine = coarseToFine(nrCoarse,nfr);
659 
660  for (int nb = _row[nrFine]; nb<_row[nrFine+1]; nb++)
661  {
662  const int nc = _col[nb];
663  const int ncCoarse = coarseIndex[nc];
664  if (ncCoarse>=0 && nrCoarse!=ncCoarse && !coarseCounted[ncCoarse])
665  {
666  coarseCounted[ncCoarse] = true;
667  coarseCR->add(nrCoarse,ncCoarse);
668  }
669  }
670  }
671 
672  // reset counted
673  for(int nfr=0; nfr<nFine; nfr++)
674  {
675  const int nrFine = coarseToFine(nrCoarse,nfr);
676 
677  for (int nb = _row[nrFine]; nb<_row[nrFine+1]; nb++)
678  {
679  const int nc = _col[nb];
680  const int ncCoarse = coarseIndex[nc];
681  if (ncCoarse>=0)
682  coarseCounted[ncCoarse] = false;
683  }
684  }
685  }
686 
687 
688  coarseCR->finishAdd();
689 
690  return coarseCR;
691  }
int getCount(const int i) const
const Array< int > & _col
Definition: CRMatrix.h:1720
const Array< int > & _row
Definition: CRMatrix.h:1719
int getCountLevel1() const
Definition: StorageSite.h:72
template<class T_Diag, class T_OffDiag, class X>
shared_ptr<Matrix> CRMatrix< T_Diag, T_OffDiag, X >::createCoarseMatrix ( const IContainer gCoarseIndex,
const CRConnectivity coarseToFine,
const CRConnectivity coarseConnectivity 
)
inlinevirtual

create the coarse matrix given the coarsening and the coarse level connectivity.

Reimplemented from Matrix.

Definition at line 700 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_col, CRMatrix< T_Diag, T_OffDiag, X >::_diag, CRMatrix< T_Diag, T_OffDiag, X >::_offDiag, CRMatrix< T_Diag, T_OffDiag, X >::_row, CRMatrix< T_Diag, T_OffDiag, X >::CRMatrix(), CRConnectivity::getCol(), CRConnectivity::getCount(), CRConnectivity::getRow(), CRConnectivity::getRowDim(), and Array< T >::zero().

703  {
704  const Array<int>& coarseIndex = dynamic_cast<const Array<int>& >(gCoarseIndex);
705  const int nCoarseRows = coarseConnectivity.getRowDim();
706 
707  shared_ptr<CRMatrix> coarseMatrix(new CRMatrix(coarseConnectivity));
708 
709  Array<Diag>& coarseDiag = coarseMatrix->getDiag();
710  Array<OffDiag>& coarseOffDiag = coarseMatrix->getOffDiag();
711 
712  const Array<int>& coarseConnRow = coarseConnectivity.getRow();
713  const Array<int>& coarseConnCol = coarseConnectivity.getCol();
714 
715  coarseDiag.zero();
716  coarseOffDiag.zero();
717 
718  //used to avoid searches when inserting coeffs
719  Array<int> coarseCoeffPos(nCoarseRows);
720 
721 
722  for(int nrCoarse=0; nrCoarse<nCoarseRows; nrCoarse++)
723  {
724  // for easy indexing when inserting coefficients set col
725  // positions into the coarse connectivity
726  for(int nb=coarseConnRow[nrCoarse]; nb<coarseConnRow[nrCoarse+1]; nb++)
727  coarseCoeffPos[coarseConnCol[nb]] = nb;
728 
729  // loop over the fine rows that make up this coarse row
730  const int nFine = coarseToFine.getCount(nrCoarse);
731  for(int nfr=0; nfr<nFine; nfr++)
732  {
733  const int nrFine = coarseToFine(nrCoarse,nfr);
734 
735  coarseDiag[nrCoarse] += _diag[nrFine];
736 
737  for (int nb = _row[nrFine]; nb<_row[nrFine+1]; nb++)
738  {
739  const int nc = _col[nb];
740  const int ncCoarse = coarseIndex[nc];
741 
742  if (ncCoarse<0) continue;
743 
744  if (nrCoarse!=ncCoarse)
745  {
746  const int pos = coarseCoeffPos[ncCoarse];
747  coarseOffDiag[pos] += _offDiag[nb];
748  }
749  else
750  {
751  coarseDiag[nrCoarse] += _offDiag[nb];
752  }
753  }
754  }
755  }
756 
757  return coarseMatrix;
758  }
const Array< int > & getCol() const
int getCount(const int i) const
virtual void zero()
Definition: Array.h:281
const Array< int > & getRow() const
const Array< int > & _col
Definition: CRMatrix.h:1720
CRMatrix(const CRConnectivity &conn)
Definition: CRMatrix.h:165
Array< OffDiag > _offDiag
Definition: CRMatrix.h:1722
Array< Diag > _diag
Definition: CRMatrix.h:1721
const Array< int > & _row
Definition: CRMatrix.h:1719
int getRowDim() const
template<class T_Diag, class T_OffDiag, class X>
virtual int CRMatrix< T_Diag, T_OffDiag, X >::createCoarsening ( IContainer gCoarseIndex,
const int  groupSize,
const double  weightRatioThreshold 
)
inlinevirtual

create a matrix coarsening by agglomerating rows with neighbours that have the largest coefficients. groupSize is the approximate number of fine rows grouped in each coarse row and weightRatioThreshold is used to dtermine if the coefficient is large enough.

The coarsening is defined by the coarseIndex array that stores for each fine row the index of the coarse row into which it has been grouped. The function returns the size of the coarse level.

Reimplemented from Matrix.

Definition at line 468 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_col, CRMatrix< T_Diag, T_OffDiag, X >::_conn, CRMatrix< T_Diag, T_OffDiag, X >::_diag, CRMatrix< T_Diag, T_OffDiag, X >::_isBoundary, CRMatrix< T_Diag, T_OffDiag, X >::_offDiag, CRMatrix< T_Diag, T_OffDiag, X >::_row, fabs(), CRConnectivity::getRowSite(), StorageSite::getSelfCount(), and max().

470  {
471  Array<int>& coarseIndex = dynamic_cast<Array<int>& >(gCoarseIndex);
472 
473  const int nRows = _conn.getRowSite().getSelfCount();
474 
475  coarseIndex = -1;
476 
477  // the number of rows in the coarse level matrix
478  int nCoarseRows=0;
479 
480  // temp storage to keep track of how many in each coarse group
481  Array<int> coarseCount(nRows);
482 
483  coarseCount = 0;
484 
485  for(int nr=0; nr<nRows; nr++)
486  if (coarseIndex[nr] == -1 && !_isBoundary[nr])
487  {
488  // the row that we are going to go through looking for
489  // neighbours to group with; it starts off being the current
490  // row but for group sizes greater than 2 it will be reset
491  // to the ones that we group this one with
492 
493  int current = nr;
494 
495  int colMaxGrouped=-1; // columnn with largest coeff among grouped ones
496  int colMaxUngrouped=-1; // columnn with largest coeff among ungrouped ones
497 
498  int nGrouped;
499 
500  // assign current row to a new coarse row
501 
502  coarseIndex[current] = nCoarseRows;
503 
504  for(nGrouped=1; nGrouped<groupSize; nGrouped++)
505  {
506  // find largest coeff among both grouped and ungrouped columns
507 
508  double maxWeightUngrouped = 0;
509  double maxWeightGrouped = 0;
510  colMaxGrouped = -1;
511  colMaxUngrouped = -1;
512 
513  for(int nb=_row[current]; nb<_row[current+1]; nb++)
514  {
515  const int nc = _col[nb];
516 
517  //skip ghost and boundaries
518  if (nc < nRows && !_isBoundary[nc])
519  {
520  double diagMeasure0 =
522  double diagMeasure1 =
524  double coeffMeasure =
526 
527  double thisWeight = fabs(coeffMeasure /
528  max(diagMeasure0,diagMeasure1));
529 
530  if (coarseIndex[nc] == -1)
531  {
532  if (colMaxUngrouped == -1 || (thisWeight > maxWeightUngrouped))
533  {
534  colMaxUngrouped = nc;
535  maxWeightUngrouped = thisWeight;
536  }
537  }
538  else if (coarseIndex[nc] != coarseIndex[nr])
539  {
540  if (colMaxGrouped == -1 || (thisWeight > maxWeightGrouped))
541  {
542  colMaxGrouped = nc;
543  maxWeightGrouped = thisWeight;
544  }
545  }
546  }
547  }
548 
549  // if we found at least one ungrouped row, group it
550  // with the current one as long as it is large
551  // enough compared to already grouped ones
552 
553  if ( (colMaxUngrouped != -1) &&
554  (colMaxGrouped == -1 ||
555  (maxWeightUngrouped > weightRatioThreshold*maxWeightGrouped)))
556  {
557  coarseIndex[colMaxUngrouped] = coarseIndex[current];
558  coarseCount[coarseIndex[current]]++;
559  // next we will look at neighbours of this row
560  current = colMaxUngrouped;
561  }
562  else
563  // no point trying to find more for the current coarse group
564  break;
565  }
566 
567  // if we managed to find at least one ungrouped
568  // neighbour to group the current row with or if there
569  // is no already grouped neighbour that is too crowded
570  // then accept the new group
571  if (nGrouped > 1 || colMaxGrouped == -1 ||
572  coarseCount[coarseIndex[colMaxGrouped]] > groupSize+2)
573  {
574  coarseCount[coarseIndex[nr]]++;
575  nCoarseRows++;
576  }
577  else
578  {
579  // put the current row in an existing group
580  coarseIndex[nr] = coarseIndex[colMaxGrouped];
581  coarseCount[coarseIndex[colMaxGrouped]]++;
582  }
583  }
584 
585  return nCoarseRows;
586  }
int getSelfCount() const
Definition: StorageSite.h:40
const Array< int > & _col
Definition: CRMatrix.h:1720
Array< bool > _isBoundary
Definition: CRMatrix.h:1724
double max(double x, double y)
Definition: Octree.cpp:18
Array< OffDiag > _offDiag
Definition: CRMatrix.h:1722
Array< Diag > _diag
Definition: CRMatrix.h:1721
const Array< int > & _row
Definition: CRMatrix.h:1719
const CRConnectivity & _conn
Definition: CRMatrix.h:1718
Tangent fabs(const Tangent &a)
Definition: Tangent.h:312
const StorageSite & getRowSite() const
template<class T_Diag, class T_OffDiag, class X>
void CRMatrix< T_Diag, T_OffDiag, X >::createScatterGatherCountsBuffer ( )
inlineprivate

Definition at line 1117 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_conn, CRMatrix< T_Diag, T_OffDiag, X >::_isBoundary, CRMatrix< T_Diag, T_OffDiag, X >::_recvCounts, CRMatrix< T_Diag, T_OffDiag, X >::_sendCounts, CRConnectivity::getCount(), StorageSite::getGatherMapLevel1(), StorageSite::getGatherProcID(), Array< T >::getLength(), CRConnectivity::getRowSite(), and StorageSite::getScatterMapLevel1().

Referenced by CRMatrix< T_Diag, T_OffDiag, X >::syncBndryCoeffs().

1118  {
1119  //SENDING allocation and filling
1120  const StorageSite& site = _conn.getRowSite();
1121  const StorageSite::ScatterMap& scatterMap = site.getScatterMapLevel1();
1122  foreach(const StorageSite::ScatterMap::value_type& mpos, scatterMap){
1123  const StorageSite& oSite = *mpos.first;
1124  //checking if storage site is only site or ghost site, we only communicate ghost site ( oSite.getCount() == -1 )
1125  const Array<int>& scatterArray = *mpos.second;
1126  int boundaryCount = 0;
1127  vector<int> cellCellsCount;
1128  for (int i = 0; i < scatterArray.getLength(); i++){
1129  const int cellID = scatterArray[i];
1130  if ( _isBoundary[cellID] ){
1131  boundaryCount++;
1132  cellCellsCount.push_back( _conn.getCount( scatterArray[i] )+1 ); //adding itself
1133  }
1134  }
1135 
1136  //key site
1137  EntryIndex e(&site,&oSite);
1138  //allocate array
1139  _sendCounts[e] = shared_ptr< Array<int> > ( new Array<int> (boundaryCount) );
1140  //fill send array
1141  Array<int>& sendArray = dynamic_cast< Array<int>& > ( *_sendCounts[e] );
1142  for( int i = 0; i < boundaryCount; i++ ){
1143  sendArray[i] = cellCellsCount[i];
1144  }
1145  }
1146  //RECIEVING allocation (filling will be done by MPI Communication)
1147  const StorageSite::GatherMap& gatherMap = site.getGatherMapLevel1();
1148  foreach(const StorageSite::GatherMap::value_type& mpos, gatherMap){
1149  const StorageSite& oSite = *mpos.first;
1150  EntryIndex e(&oSite,&site);
1151  //mesh interface can be done know
1152  if (oSite.getGatherProcID() == - 1) {
1153  *_recvCounts[e] = *_sendCounts[e];
1154  }
1155  }
1156  }
pair< const StorageSite *, const StorageSite * > EntryIndex
Definition: CRMatrix.h:106
int getCount(const int i) const
GhostArrayMap _sendCounts
Definition: CRMatrix.h:1740
const GatherMap & getGatherMapLevel1() const
Definition: StorageSite.h:74
Array< bool > _isBoundary
Definition: CRMatrix.h:1724
const ScatterMap & getScatterMapLevel1() const
Definition: StorageSite.h:73
GhostArrayMap _recvCounts
Definition: CRMatrix.h:1741
int getGatherProcID() const
Definition: StorageSite.h:83
const CRConnectivity & _conn
Definition: CRMatrix.h:1718
map< const StorageSite *, shared_ptr< Array< int > > > ScatterMap
Definition: StorageSite.h:23
map< const StorageSite *, shared_ptr< Array< int > > > GatherMap
Definition: StorageSite.h:24
const StorageSite & getRowSite() const
int getLength() const
Definition: Array.h:87
template<class T_Diag, class T_OffDiag, class X>
void CRMatrix< T_Diag, T_OffDiag, X >::createScatterGatherIndicesBuffer ( )
inlineprivate

Definition at line 1214 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_conn, CRMatrix< T_Diag, T_OffDiag, X >::_isBoundary, CRMatrix< T_Diag, T_OffDiag, X >::_recvCounts, CRMatrix< T_Diag, T_OffDiag, X >::_recvIndices, CRMatrix< T_Diag, T_OffDiag, X >::_sendCounts, CRMatrix< T_Diag, T_OffDiag, X >::_sendIndices, CRConnectivity::getCount(), StorageSite::getGatherMapLevel1(), StorageSite::getGatherProcID(), Array< T >::getLength(), CRConnectivity::getLocalToGlobalMap(), CRConnectivity::getRowSite(), and StorageSite::getScatterMapLevel1().

Referenced by CRMatrix< T_Diag, T_OffDiag, X >::syncBndryCoeffs().

1215  {
1216  //SENDING allocation and filling
1217  const StorageSite& site = _conn.getRowSite();
1218  const Array<int>& localToGlobal = _conn.getLocalToGlobalMap();
1219  const StorageSite::ScatterMap& scatterMap = site.getScatterMapLevel1();
1220  foreach(const StorageSite::ScatterMap::value_type& mpos, scatterMap){
1221  const StorageSite& oSite = *mpos.first;
1222  const Array<int>& scatterArray = *mpos.second;
1223  //loop over surround indices and itself for sizing
1224  EntryIndex e(&site,&oSite);
1225  const Array<int>& send_counts = dynamic_cast< const Array<int>& > (*_sendCounts[e]);
1226  //allocate array
1227  int sendSize = 0;
1228  for ( int i = 0; i < send_counts.getLength(); i++ ){
1229  sendSize += send_counts[i];
1230  }
1231  _sendIndices[e] = shared_ptr< Array<int> > ( new Array<int> (sendSize) );
1232  //fill send array
1233  Array<int>& sendArray = dynamic_cast< Array<int>& > ( *_sendIndices[e] );
1234  int indx = 0;
1235  for( int i = 0; i < scatterArray.getLength(); i++ ){
1236  const int cellID = scatterArray[i];
1237  if ( _isBoundary[cellID] ){
1238  sendArray[indx++] = localToGlobal[cellID];
1239  for ( int j = 0; j < _conn.getCount(cellID); j++ ){
1240  sendArray[indx] = localToGlobal[ _conn(cellID,j) ];
1241  indx++;
1242  }
1243  }
1244  }
1245  }
1246  //RECIEVING allocation (filling will be done by MPI Communication)
1247  const StorageSite::GatherMap& gatherMap = site.getGatherMapLevel1();
1248  foreach(const StorageSite::GatherMap::value_type& mpos, gatherMap){
1249  const StorageSite& oSite = *mpos.first;
1250  EntryIndex e(&oSite,&site);
1251  const Array<int>& recvCounts = dynamic_cast< const Array<int>& > (*_recvCounts[e]);
1252  int recvSize = 0;
1253  for ( int i = 0; i < recvCounts.getLength(); i++ ){
1254  recvSize += recvCounts[i];
1255  }
1256  //allocate array
1257  _recvIndices[e] = shared_ptr< Array<int> > ( new Array<int> (recvSize) );
1258  //mesh interface can be done know
1259  if ( oSite.getGatherProcID() == - 1) {
1260  *_recvIndices[e] = *_sendIndices[e];
1261  }
1262  }
1263 
1264  }
pair< const StorageSite *, const StorageSite * > EntryIndex
Definition: CRMatrix.h:106
int getCount(const int i) const
GhostArrayMap _sendCounts
Definition: CRMatrix.h:1740
const GatherMap & getGatherMapLevel1() const
Definition: StorageSite.h:74
GhostArrayMap _sendIndices
Definition: CRMatrix.h:1742
Array< bool > _isBoundary
Definition: CRMatrix.h:1724
const ScatterMap & getScatterMapLevel1() const
Definition: StorageSite.h:73
GhostArrayMap _recvCounts
Definition: CRMatrix.h:1741
const Array< int > & getLocalToGlobalMap() const
int getGatherProcID() const
Definition: StorageSite.h:83
const CRConnectivity & _conn
Definition: CRMatrix.h:1718
GhostArrayMap _recvIndices
Definition: CRMatrix.h:1743
map< const StorageSite *, shared_ptr< Array< int > > > ScatterMap
Definition: StorageSite.h:23
map< const StorageSite *, shared_ptr< Array< int > > > GatherMap
Definition: StorageSite.h:24
const StorageSite & getRowSite() const
int getLength() const
Definition: Array.h:87
template<class T_Diag, class T_OffDiag, class X>
void CRMatrix< T_Diag, T_OffDiag, X >::createScatterGatherValuesBBuffer ( const XArray B)
inlineprivate

Definition at line 1434 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_conn, CRMatrix< T_Diag, T_OffDiag, X >::_isBoundary, CRMatrix< T_Diag, T_OffDiag, X >::_recvCounts, CRMatrix< T_Diag, T_OffDiag, X >::_recvValuesB, CRMatrix< T_Diag, T_OffDiag, X >::_sendCounts, CRMatrix< T_Diag, T_OffDiag, X >::_sendValuesB, StorageSite::getGatherMapLevel1(), StorageSite::getGatherProcID(), Array< T >::getLength(), CRConnectivity::getRowSite(), and StorageSite::getScatterMapLevel1().

Referenced by CRMatrix< T_Diag, T_OffDiag, X >::syncBndryCoeffs().

1435  {
1436  //SENDING allocation and filling
1437  const StorageSite& site = _conn.getRowSite();
1438  const StorageSite::ScatterMap& scatterMap = site.getScatterMapLevel1();
1439  foreach(const StorageSite::ScatterMap::value_type& mpos, scatterMap){
1440  const StorageSite& oSite = *mpos.first;
1441  const Array<int>& scatterArray = *mpos.second;
1442  //loop over surround indices and itself for sizing
1443  EntryIndex e(&site,&oSite);
1444  //decide allocation size
1445  const Array<int>& send_counts = dynamic_cast< const Array<int>& > (*_sendCounts[e]);
1446  int sendSize = send_counts.getLength();
1447  //allocate array
1448  _sendValuesB[e] = shared_ptr< Array<X> > ( new Array<X> (sendSize) );
1449  //fill send array
1450  XArray& bArray = dynamic_cast< Array<X>& > ( *_sendValuesB[e] );
1451  int indx = 0;
1452  for( int i = 0; i < scatterArray.getLength(); i++ ){
1453  const int ii = scatterArray[i];
1454  if ( _isBoundary[ii] ){
1455  bArray[indx++] = B[ii];
1456  }
1457  }
1458  }
1459  //RECIEVING allocation (filling will be done by MPI Communication)
1460  const StorageSite::GatherMap& gatherMap = site.getGatherMapLevel1();
1461  foreach(const StorageSite::GatherMap::value_type& mpos, gatherMap){
1462  const StorageSite& oSite = *mpos.first;
1463  EntryIndex e(&oSite,&site);
1464  //get recvSize
1465  const Array<int>& recvCounts = dynamic_cast< const Array<int>& > (*_recvCounts[e]);
1466  int recvSize = recvCounts.getLength();
1467  //allocate array
1468  _recvValuesB[e] = shared_ptr< Array<X> > ( new Array<X> (recvSize) );
1469  //mesh interface can be done know
1470  if ( oSite.getGatherProcID() == - 1) {
1471  *_recvValuesB[e] = *_sendValuesB[e];
1472  }
1473  }
1474 
1475  }
pair< const StorageSite *, const StorageSite * > EntryIndex
Definition: CRMatrix.h:106
GhostArrayMap _sendCounts
Definition: CRMatrix.h:1740
const GatherMap & getGatherMapLevel1() const
Definition: StorageSite.h:74
Array< bool > _isBoundary
Definition: CRMatrix.h:1724
const ScatterMap & getScatterMapLevel1() const
Definition: StorageSite.h:73
Array< X > XArray
Definition: CRMatrix.h:99
GhostArrayMap _recvCounts
Definition: CRMatrix.h:1741
GhostArrayMap _recvValuesB
Definition: CRMatrix.h:1747
int getGatherProcID() const
Definition: StorageSite.h:83
const CRConnectivity & _conn
Definition: CRMatrix.h:1718
map< const StorageSite *, shared_ptr< Array< int > > > ScatterMap
Definition: StorageSite.h:23
map< const StorageSite *, shared_ptr< Array< int > > > GatherMap
Definition: StorageSite.h:24
const StorageSite & getRowSite() const
GhostArrayMap _sendValuesB
Definition: CRMatrix.h:1746
int getLength() const
Definition: Array.h:87
template<class T_Diag, class T_OffDiag, class X>
void CRMatrix< T_Diag, T_OffDiag, X >::createScatterGatherValuesCRMtrxBuffer ( )
inlineprivate

Definition at line 1331 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_conn, CRMatrix< T_Diag, T_OffDiag, X >::_diag, CRMatrix< T_Diag, T_OffDiag, X >::_isBoundary, CRMatrix< T_Diag, T_OffDiag, X >::_recvCounts, CRMatrix< T_Diag, T_OffDiag, X >::_recvValuesCRMtrx, CRMatrix< T_Diag, T_OffDiag, X >::_sendCounts, CRMatrix< T_Diag, T_OffDiag, X >::_sendValuesCRMtrx, DiagToOffDiag(), CRMatrix< T_Diag, T_OffDiag, X >::getCoeff(), CRConnectivity::getCount(), StorageSite::getGatherMapLevel1(), StorageSite::getGatherProcID(), Array< T >::getLength(), CRConnectivity::getRowSite(), and StorageSite::getScatterMapLevel1().

Referenced by CRMatrix< T_Diag, T_OffDiag, X >::syncBndryCoeffs().

1332  {
1333  //SENDING allocation and filling
1334  const StorageSite& site = _conn.getRowSite();
1335  const StorageSite::ScatterMap& scatterMap = site.getScatterMapLevel1();
1336  foreach(const StorageSite::ScatterMap::value_type& mpos, scatterMap){
1337  const StorageSite& oSite = *mpos.first;
1338  const Array<int>& scatterArray = *mpos.second;
1339  //loop over surround indices and itself for sizing
1340  EntryIndex e(&site,&oSite);
1341  //decide allocation size
1342  const Array<int>& send_counts = dynamic_cast< const Array<int>& > (*_sendCounts[e]);
1343  int sendSize = 0;
1344  for ( int i = 0; i < send_counts.getLength(); i++ ){
1345  sendSize += send_counts[i];
1346  }
1347  //allocate array
1348  _sendValuesCRMtrx[e] = shared_ptr< Array<OffDiag> > ( new Array<OffDiag> (sendSize) );
1349  //fill send array
1350  Array<OffDiag>& valueArray = dynamic_cast< Array<OffDiag>& > ( *_sendValuesCRMtrx[e] );
1351  int indx = 0;
1352  for( int i = 0; i < scatterArray.getLength(); i++ ){
1353  const int ii = scatterArray[i];
1354  if ( _isBoundary[ii] ){
1355  valueArray[indx++] = DiagToOffDiag(_diag[ii]);
1356  for ( int j = 0; j < _conn.getCount(ii); j++ ){
1357  const int jj = _conn(ii,j);
1358  valueArray[indx] = getCoeff(ii,jj);
1359  indx++;
1360  }
1361  }
1362  }
1363  }
1364  //RECIEVING allocation (filling will be done by MPI Communication)
1365  const StorageSite::GatherMap& gatherMap = site.getGatherMapLevel1();
1366  foreach(const StorageSite::GatherMap::value_type& mpos, gatherMap){
1367  const StorageSite& oSite = *mpos.first;
1368  EntryIndex e(&oSite,&site);
1369  //get recvSize
1370  const Array<int>& recvCounts = dynamic_cast< const Array<int>& > (*_recvCounts[e]);
1371  int recvSize = 0;
1372  for ( int i = 0; i < recvCounts.getLength(); i++ ){
1373  recvSize += recvCounts[i];
1374  }
1375  //allocate array
1376  _recvValuesCRMtrx[e] = shared_ptr< Array<OffDiag> > ( new Array<OffDiag> (recvSize) );
1377  //mesh interface can be done know
1378  if ( oSite.getGatherProcID() == - 1) {
1380  }
1381  }
1382 
1383  }
pair< const StorageSite *, const StorageSite * > EntryIndex
Definition: CRMatrix.h:106
int getCount(const int i) const
GhostArrayMap _sendCounts
Definition: CRMatrix.h:1740
X DiagToOffDiag(const X &x)
Definition: CRMatrix.h:25
const GatherMap & getGatherMapLevel1() const
Definition: StorageSite.h:74
OffDiag & getCoeff(const int i, const int j)
Definition: CRMatrix.h:836
Array< bool > _isBoundary
Definition: CRMatrix.h:1724
const ScatterMap & getScatterMapLevel1() const
Definition: StorageSite.h:73
GhostArrayMap _recvCounts
Definition: CRMatrix.h:1741
GhostArrayMap _sendValuesCRMtrx
Definition: CRMatrix.h:1744
Array< Diag > _diag
Definition: CRMatrix.h:1721
int getGatherProcID() const
Definition: StorageSite.h:83
GhostArrayMap _recvValuesCRMtrx
Definition: CRMatrix.h:1745
const CRConnectivity & _conn
Definition: CRMatrix.h:1718
map< const StorageSite *, shared_ptr< Array< int > > > ScatterMap
Definition: StorageSite.h:23
map< const StorageSite *, shared_ptr< Array< int > > > GatherMap
Definition: StorageSite.h:24
const StorageSite & getRowSite() const
int getLength() const
Definition: Array.h:87
template<class T_Diag, class T_OffDiag, class X>
CRMatrix< T_Diag, T_OffDiag, X >::DEFINE_TYPENAME ( "CRMatrix<"+NumTypeTraits< Diag >::getTypeName()+","+NumTypeTraits< OffDiag >::getTypeName()+","+NumTypeTraits< X >::getTypeName()+">"  )
template<class T_Diag, class T_OffDiag, class X>
virtual void CRMatrix< T_Diag, T_OffDiag, X >::eliminateBoundaryEquations ( IContainer bB)
inlinevirtual

Reimplemented from Matrix.

Definition at line 1064 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_conn, CRMatrix< T_Diag, T_OffDiag, X >::_isBoundary, CRConnectivity::CELLCELL2, CRMatrix< T_Diag, T_OffDiag, X >::eliminateRow(), CRMatrix< T_Diag, T_OffDiag, X >::eliminateRowGhost(), CRConnectivity::getConnType(), StorageSite::getCount(), CRConnectivity::getRowSite(), StorageSite::getSelfCount(), and CRMatrix< T_Diag, T_OffDiag, X >::syncBndryCoeffs().

1065  {
1066  XArray& b = dynamic_cast<XArray&>(bB);
1067  const int nRowsInterior = _conn.getRowSite().getSelfCount();
1068  const int nRowsExtra = _conn.getRowSite().getCount();
1069 
1070  for(int nr=nRowsInterior; nr<nRowsExtra; nr++)
1071  if (_isBoundary[nr])
1072  eliminateRow(nr,b);
1073 
1074  //syncing coefficients from other processors (or other mesh) to eliminate equations
1075  //const StorageSite& site = _conn.getRowSite();
1076  //if (b.getLength() == site.getCountLevel1() && site.getCountLevel1() != site.getCount() ){
1077 #ifdef FVM_PARALLEL
1078  //skip nprocs == 1
1079  if ( _conn.getConnType() == CRConnectivity::CELLCELL2 && MPI::COMM_WORLD.Get_size() > 1 ){
1080  syncBndryCoeffs(b);
1081  eliminateRowGhost(b);
1082  }
1083 
1084 #endif
1085  }
int getSelfCount() const
Definition: StorageSite.h:40
void syncBndryCoeffs(const Array< X > &b)
Definition: CRMatrix.h:1096
Array< bool > _isBoundary
Definition: CRMatrix.h:1724
Array< X > XArray
Definition: CRMatrix.h:99
void eliminateRow(const int j, Array< X > &b)
Definition: CRMatrix.h:899
void eliminateRowGhost(Array< X > &b)
Definition: CRMatrix.h:952
const CRConnectivity & _conn
Definition: CRMatrix.h:1718
const CRTYPE & getConnType() const
int getCount() const
Definition: StorageSite.h:39
const StorageSite & getRowSite() const
template<class T_Diag, class T_OffDiag, class X>
void CRMatrix< T_Diag, T_OffDiag, X >::eliminateDirichlet ( const int  j,
Array< X > &  b,
const X &  delta_j,
const bool  explicitMode = false 
)
inline

Definition at line 1041 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_col, CRMatrix< T_Diag, T_OffDiag, X >::_row, and CRMatrix< T_Diag, T_OffDiag, X >::getCoeff().

Referenced by PlateBCS< X, Diag, OffDiag >::applyDirichletBC(), and StructureBCS< X, Diag, OffDiag >::applyDirichletBC().

1043  {
1044  for (int nb = _row[j]; nb<_row[j+1]; nb++)
1045  {
1046  const int i = _col[nb];
1047  OffDiag& a_ij = getCoeff(i,j);
1048 
1049  b[i] += a_ij*delta_j;
1050 
1051  if (!explicitMode)
1053  }
1054  }
const Array< int > & _col
Definition: CRMatrix.h:1720
OffDiag & getCoeff(const int i, const int j)
Definition: CRMatrix.h:836
const Array< int > & _row
Definition: CRMatrix.h:1719
T_OffDiag OffDiag
Definition: CRMatrix.h:94
template<class T_Diag, class T_OffDiag, class X>
void CRMatrix< T_Diag, T_OffDiag, X >::eliminateRow ( const int  j,
Array< X > &  b 
)
inline

Definition at line 899 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_col, CRMatrix< T_Diag, T_OffDiag, X >::_conn, CRMatrix< T_Diag, T_OffDiag, X >::_diag, CRMatrix< T_Diag, T_OffDiag, X >::_offDiag, CRMatrix< T_Diag, T_OffDiag, X >::_row, DiagToOffDiag(), CRMatrix< T_Diag, T_OffDiag, X >::getCoeff(), CRConnectivity::getRowSite(), StorageSite::getSelfCount(), and CRMatrix< T_Diag, T_OffDiag, X >::hasCoeff().

Referenced by CRMatrix< T_Diag, T_OffDiag, X >::eliminateBoundaryEquations().

900  {
901  // in case of problems with an immersed boundary, we might call
902  // this function also for interior rows that are marked as
903  // Dirichlet but in that case we don't need to do anything since
904  // the off diagonal entries are all zero
905  const int nRowsInterior = _conn.getRowSite().getSelfCount();
906  const bool isInterior = (j<nRowsInterior);
907 
908  if (isInterior) return;
909 
910  const Diag& a_jj = _diag[j];
911  // loop over neighbours of j to determine the rows that will change
912  for (int nb = _row[j]; nb<_row[j+1]; nb++)
913  {
914  const int i = _col[nb];
915  OffDiag& a_ij = getCoeff(i,j);
916 
917  // for the ith row we need to find the indices k for which the
918  // entries will change. we do this by again going through
919  // neighbors of j
920 
921  for (int nb2 = _row[j]; nb2<_row[j+1]; nb2++)
922  {
923  const int k = _col[nb2];
924  const OffDiag& a_jk = _offDiag[nb2];
925 
926  if (i!=k)
927  {
928  if (hasCoeff(i,k))
929  {
930  OffDiag& a_ik = getCoeff(i,k);
931  a_ik -= DiagToOffDiag(a_ij*(a_jk/a_jj));
932  }
933  }
934  else
935  _diag[i] -= a_ij*(a_jk/a_jj);
936  }
937 
938  b[i] -= a_ij*(b[j]/a_jj);
940 
941  }
942 
943 
944  }
X DiagToOffDiag(const X &x)
Definition: CRMatrix.h:25
int getSelfCount() const
Definition: StorageSite.h:40
const Array< int > & _col
Definition: CRMatrix.h:1720
OffDiag & getCoeff(const int i, const int j)
Definition: CRMatrix.h:836
bool hasCoeff(const int i, const int j)
Definition: CRMatrix.h:846
Array< OffDiag > _offDiag
Definition: CRMatrix.h:1722
T_Diag Diag
Definition: CRMatrix.h:93
Array< Diag > _diag
Definition: CRMatrix.h:1721
const Array< int > & _row
Definition: CRMatrix.h:1719
const CRConnectivity & _conn
Definition: CRMatrix.h:1718
const StorageSite & getRowSite() const
T_OffDiag OffDiag
Definition: CRMatrix.h:94
template<class T_Diag, class T_OffDiag, class X>
void CRMatrix< T_Diag, T_OffDiag, X >::eliminateRowGhost ( Array< X > &  b)
inline

Definition at line 952 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_conn, CRMatrix< T_Diag, T_OffDiag, X >::_diag, CRMatrix< T_Diag, T_OffDiag, X >::_recvCounts, CRMatrix< T_Diag, T_OffDiag, X >::_recvIndices, CRMatrix< T_Diag, T_OffDiag, X >::_recvValuesB, CRMatrix< T_Diag, T_OffDiag, X >::_recvValuesCRMtrx, CRMatrix< T_Diag, T_OffDiag, X >::getCoeff(), StorageSite::getGatherMapLevel1(), Array< T >::getLength(), CRConnectivity::getRowSite(), and StorageSite::getSelfCount().

Referenced by CRMatrix< T_Diag, T_OffDiag, X >::eliminateBoundaryEquations().

953  {
954 
955  const StorageSite& site = _conn.getRowSite();
956  const int nRowsInterior = site.getSelfCount();
957  const StorageSite::GatherMap& gatherMap = site.getGatherMapLevel1();
958  //looping gathermap indices
959  foreach(const StorageSite::GatherMap::value_type& mpos, gatherMap){
960  const StorageSite& oSite = *mpos.first;
961  EntryIndex e(&oSite,&site);
962  const Array<int>& recv_counts = dynamic_cast< const Array<int>& > (*_recvCounts [e]);
963  const Array<int>& recv_indices = dynamic_cast< const Array<int>& > (*_recvIndices [e]);
964  const Array<OffDiag>& recv_values_crmtrx = dynamic_cast< const Array<OffDiag>& > (*_recvValuesCRMtrx[e]);
965  const Array<X>& recv_values_b = dynamic_cast< const Array<X>& > (*_recvValuesB[e]);
966 
967  //row and col
968  Array<int> row( recv_counts.getLength()+1);
969  row[0] = 0;
970  for ( int i = 1; i < recv_counts.getLength()+1; i++ ){
971  row[i] = row[i-1] + recv_counts[i-1] - 1;
972  }
973 
974  Array<int> boundaryPtr( recv_counts.getLength());
975  boundaryPtr[0] = 0;
976  for ( int i = 1; i < recv_counts.getLength(); i++ ){
977  boundaryPtr[i] = boundaryPtr[i-1] + recv_counts[i-1];
978  }
979  //col and offDiag
980  Array<int> col( row[recv_counts.getLength()] );
981  Array<OffDiag> offDiag( row[recv_counts.getLength()] );
982  int indx = 0;
983  int jj = 0;
984  for ( int i=0; i<recv_counts.getLength(); i++ ){
985  indx++; //skip first
986  for ( int j=1; j<recv_counts[i]; j++ ){
987  col[jj] = recv_indices[indx];
988  offDiag[jj] = recv_values_crmtrx[indx];
989  jj++; indx++;
990  }
991  }
992 
993  //over boundary cells on ghost
994  for ( int rc = 0; rc < recv_counts.getLength(); rc++ ){
995  const int pIndx = boundaryPtr[rc]; //point where the boundary location in recv_indices or recv_values_crmtrx
996  const int j = recv_indices[pIndx];
997  const OffDiag& a_jj = recv_values_crmtrx[pIndx];
998  // loop over neighbours of j to determine the rows that will change
999  for (int nb = row[rc]; nb<row[rc+1]; nb++)
1000  {
1001  const int i = col[nb];
1002  if ( i < nRowsInterior ){
1003  OffDiag& a_ij = getCoeff(i,j);
1004  // for the ith row we need to find the indices k for which the
1005  // entries will change. we do this by again going through
1006  // neighbors of j
1007  for (int nb2 = row[rc]; nb2<row[rc+1]; nb2++)
1008  {
1009  const int k = col[nb2];
1010  const OffDiag& a_jk = offDiag[nb2];
1011 
1012  if (i!=k)
1013  {
1014  OffDiag& a_ik = getCoeff(i,k);
1015  a_ik -= a_ij*(a_jk/a_jj);
1016  }
1017  else
1018  _diag[i] -= a_ij*(a_jk/a_jj);
1019  }
1020  b[i] -= a_ij*(recv_values_b[rc]/a_jj);
1022  }
1023  }
1024  }
1025  }
1026  }
pair< const StorageSite *, const StorageSite * > EntryIndex
Definition: CRMatrix.h:106
int getSelfCount() const
Definition: StorageSite.h:40
const GatherMap & getGatherMapLevel1() const
Definition: StorageSite.h:74
OffDiag & getCoeff(const int i, const int j)
Definition: CRMatrix.h:836
GhostArrayMap _recvCounts
Definition: CRMatrix.h:1741
GhostArrayMap _recvValuesB
Definition: CRMatrix.h:1747
Array< Diag > _diag
Definition: CRMatrix.h:1721
GhostArrayMap _recvValuesCRMtrx
Definition: CRMatrix.h:1745
const CRConnectivity & _conn
Definition: CRMatrix.h:1718
GhostArrayMap _recvIndices
Definition: CRMatrix.h:1743
map< const StorageSite *, shared_ptr< Array< int > > > GatherMap
Definition: StorageSite.h:24
const StorageSite & getRowSite() const
T_OffDiag OffDiag
Definition: CRMatrix.h:94
int getLength() const
Definition: Array.h:87
template<class T_Diag, class T_OffDiag, class X>
virtual void CRMatrix< T_Diag, T_OffDiag, X >::forwardGS ( IContainer xB,
IContainer bB,
IContainer  
) const
inlinevirtual

forward GaussSeidel update for this * x = b

Reimplemented from Matrix.

Definition at line 303 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_col, CRMatrix< T_Diag, T_OffDiag, X >::_conn, CRMatrix< T_Diag, T_OffDiag, X >::_diag, CRMatrix< T_Diag, T_OffDiag, X >::_offDiag, CRMatrix< T_Diag, T_OffDiag, X >::_row, CRConnectivity::getRowSite(), and StorageSite::getSelfCount().

304  {
305  XArray& x = dynamic_cast<XArray&>(xB);
306  const XArray& b = dynamic_cast<const XArray&>(bB);
307 
308  const int nRows = _conn.getRowSite().getSelfCount();
309 
310  X sum;
311  for(int nr=0; nr<nRows; nr++)
312  {
313  sum = b[nr];
314  for (int nb = _row[nr]; nb<_row[nr+1]; nb++)
315  {
316  const int j = _col[nb];
317  sum += _offDiag[nb]*x[j];
318  }
319  x[nr] = -sum/_diag[nr];
320  }
321  }
int getSelfCount() const
Definition: StorageSite.h:40
const Array< int > & _col
Definition: CRMatrix.h:1720
Array< X > XArray
Definition: CRMatrix.h:99
Array< OffDiag > _offDiag
Definition: CRMatrix.h:1722
Array< Diag > _diag
Definition: CRMatrix.h:1721
const Array< int > & _row
Definition: CRMatrix.h:1719
const CRConnectivity & _conn
Definition: CRMatrix.h:1718
const StorageSite & getRowSite() const
template<class T_Diag, class T_OffDiag, class X>
int CRMatrix< T_Diag, T_OffDiag, X >::get_request_size ( )
inlineprivate

Definition at line 1525 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_conn, StorageSite::getGatherProcID(), CRConnectivity::getRowSite(), and StorageSite::getScatterMapLevel1().

Referenced by CRMatrix< T_Diag, T_OffDiag, X >::syncCounts(), CRMatrix< T_Diag, T_OffDiag, X >::syncIndices(), CRMatrix< T_Diag, T_OffDiag, X >::syncValuesB(), and CRMatrix< T_Diag, T_OffDiag, X >::syncValuesCRMtrx().

1526  {
1527  int indx = 0;
1528  const StorageSite& site = _conn.getRowSite();
1529  const StorageSite::ScatterMap& scatterMap = site.getScatterMapLevel1();
1530  foreach(const StorageSite::ScatterMap::value_type& mpos, scatterMap){
1531  const StorageSite& oSite = *mpos.first;
1532  //checking if storage site is only site or ghost site, we only communicate ghost site ( oSite.getCount() == -1 )
1533  if ( oSite.getGatherProcID() != -1 )
1534  indx++;
1535  }
1536  return indx;
1537  }
const ScatterMap & getScatterMapLevel1() const
Definition: StorageSite.h:73
int getGatherProcID() const
Definition: StorageSite.h:83
const CRConnectivity & _conn
Definition: CRMatrix.h:1718
map< const StorageSite *, shared_ptr< Array< int > > > ScatterMap
Definition: StorageSite.h:23
const StorageSite & getRowSite() const
template<class T_Diag, class T_OffDiag, class X>
OffDiag& CRMatrix< T_Diag, T_OffDiag, X >::getCoeff ( const int  i,
const int  j 
)
inline

Definition at line 836 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_col, CRMatrix< T_Diag, T_OffDiag, X >::_offDiag, and CRMatrix< T_Diag, T_OffDiag, X >::_row.

Referenced by CRMatrix< T_Diag, T_OffDiag, X >::createScatterGatherValuesCRMtrxBuffer(), LinearizeInterfaceJump< X, Diag, OffDiag >::discretize(), LinearizeInterfaceJumpUnconnected< X, Diag, OffDiag >::discretize(), LinearizeDielectric< X, Diag, OffDiag >::discretize(), BatteryLinearizePotentialInterface< X, Diag, OffDiag >::discretize(), BatteryLinearizeThermalInterface< X, Diag, OffDiag >::discretize(), LinearizePotentialInterface< X, Diag, OffDiag >::discretize(), BatteryPCLinearizeInterface_BV< X, Diag, OffDiag, otherMeshDiag >::discretize(), BatteryLinearizeSpeciesInterface< X, Diag, OffDiag >::discretize(), LinearizeSpeciesInterface< X, Diag, OffDiag >::discretize(), StructureSourceDiscretization< T, Diag, OffDiag >::discretizeFaces(), StructurePlasticDiscretization< T, Diag, OffDiag >::discretizeFaces(), PlateSourceDiscretization< T, Diag, OffDiag >::discretizeFaces(), CRMatrix< T_Diag, T_OffDiag, X >::eliminateDirichlet(), CRMatrix< T_Diag, T_OffDiag, X >::eliminateRow(), CRMatrix< T_Diag, T_OffDiag, X >::eliminateRowGhost(), and BatteryModel< T >::Impl::printMatrixElementsOnFace().

837  {
838  for (int nnb = _row[i]; nnb<_row[i+1]; nnb++)
839  {
840  if (_col[nnb] == j)
841  return _offDiag[nnb];
842  }
843  throw CException("invalid indices");
844  }
const Array< int > & _col
Definition: CRMatrix.h:1720
Array< OffDiag > _offDiag
Definition: CRMatrix.h:1722
const Array< int > & _row
Definition: CRMatrix.h:1719
template<class T_Diag, class T_OffDiag, class X>
virtual const CRConnectivity& CRMatrix< T_Diag, T_OffDiag, X >::getConnectivity ( ) const
inlinevirtual
template<class T_Diag, class T_OffDiag, class X>
Array<Diag>& CRMatrix< T_Diag, T_OffDiag, X >::getDiag ( )
inline

Definition at line 856 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_diag.

Referenced by Underrelaxer< X, Diag, OffDiag >::discretize(), CollisionTermDiscretization< X, Diag, OffDiag >::discretize(), PhononCollisionDiscretization< X, Diag, OffDiag >::discretize(), LinearizeInterfaceJump< X, Diag, OffDiag >::discretize(), TrapBandTunnelingDiscretization< X, Diag, OffDiag >::discretize(), LinearizeInterfaceJumpUnconnected< X, Diag, OffDiag >::discretize(), TimeDerivativeDiscretization< X, Diag, OffDiag >::discretize(), DriftDiscretization< X, Diag, OffDiag >::discretize(), SourceDiscretizationforFracture< T, Diag, OffDiag >::discretize(), BatteryPCTimeDerivativeDiscretization< X, Diag, OffDiag >::discretize(), LinearizeDielectric< X, Diag, OffDiag >::discretize(), PhononConvectionDiscretization< X, Diag, OffDiag >::discretize(), TimeDerivativeDiscretization_Kmodel< X, Diag, OffDiag >::discretize(), IbmDiscretization< X, Diag, OffDiag >::discretize(), ConvectionDiscretization< X, Diag, OffDiag >::discretize(), BatteryLinearizePotentialInterface< X, Diag, OffDiag >::discretize(), BatteryLinearizeThermalInterface< X, Diag, OffDiag >::discretize(), LinearizePotentialInterface< X, Diag, OffDiag >::discretize(), BatteryPCLinearizeInterface_BV< X, Diag, OffDiag, otherMeshDiag >::discretize(), BatteryLinearizeSpeciesInterface< X, Diag, OffDiag >::discretize(), TimeDerivativeStructureDiscretization< X, Diag, OffDiag >::discretize(), GenericKineticIBDiscretization< X, Diag, OffDiag >::discretize(), ConvectionDiscretization_Kmodel< X, Diag, OffDiag >::discretize(), LinearizeSpeciesInterface< X, Diag, OffDiag >::discretize(), TimeDerivativePlateDiscretization< X, Diag, OffDiag >::discretize(), ElecDiffusionDiscretization< X, Diag, OffDiag >::discretize(), CaptureDiscretization< X, Diag, OffDiag >::discretize(), DiffusionDiscretization< X, Diag, OffDiag >::discretize(), EmissionDiscretization< X, Diag, OffDiag >::discretize(), SourceDiscretizationdissi< X, Diag, OffDiag >::discretize(), TunnelingDiscretization< X, Diag, OffDiag >::discretize(), BatteryPCDiffusionDiscretization< X, Diag, OffDiag >::discretize(), WallDiscretization< X, Diag, OffDiag >::discretize(), PlateSourceDiscretization< T, Diag, OffDiag >::discretize(), StructureSourceDiscretization< T, Diag, OffDiag >::discretizeFaces(), StructurePlasticDiscretization< T, Diag, OffDiag >::discretizeFaces(), PlateSourceDiscretization< T, Diag, OffDiag >::discretizeFaces(), FlowModel< T >::Impl::dumpContinuityMatrix(), ThermalModel< T >::Impl::dumpMatrix(), VacancyModel< T >::Impl::dumpMatrix(), PlateModel< T >::Impl::dumpMatrix(), BatteryModel< T >::Impl::printMatrixElementsOnFace(), FlowModel< T >::Impl::setDirichlet(), CRMatrix< T_Diag, T_OffDiag, X >::setFlatMatrix(), and FlowModel< T >::Impl::solveMomentum().

856 {return _diag;}
Array< Diag > _diag
Definition: CRMatrix.h:1721
template<class T_Diag, class T_OffDiag, class X>
const Array<Diag>& CRMatrix< T_Diag, T_OffDiag, X >::getDiag ( ) const
inline

Definition at line 859 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_diag.

859 {return _diag;}
Array< Diag > _diag
Definition: CRMatrix.h:1721
template<class T_Diag, class T_OffDiag, class X>
void* CRMatrix< T_Diag, T_OffDiag, X >::getDiagData ( ) const
inlinevirtual

Reimplemented from Matrix.

Definition at line 862 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_diag, and Array< T >::getData().

862 { return _diag.getData(); }
Array< Diag > _diag
Definition: CRMatrix.h:1721
virtual void * getData() const
Definition: Array.h:275
template<class T_Diag, class T_OffDiag, class X>
int CRMatrix< T_Diag, T_OffDiag, X >::getDiagDataSize ( ) const
inlinevirtual

Reimplemented from Matrix.

Definition at line 864 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_diag, and Array< T >::getDataSize().

864 { return _diag.getDataSize(); }
Array< Diag > _diag
Definition: CRMatrix.h:1721
virtual int getDataSize() const
Definition: Array.h:276
template<class T_Diag, class T_OffDiag, class X>
const Array<OffDiag>& CRMatrix< T_Diag, T_OffDiag, X >::getOffDiag ( ) const
inline

Definition at line 860 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_offDiag.

860 {return _offDiag;}
Array< OffDiag > _offDiag
Definition: CRMatrix.h:1722
template<class T_Diag, class T_OffDiag, class X>
void* CRMatrix< T_Diag, T_OffDiag, X >::getOffDiagData ( ) const
inlinevirtual

Reimplemented from Matrix.

Definition at line 863 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_offDiag, and Array< T >::getData().

863 { return _offDiag.getData(); }
Array< OffDiag > _offDiag
Definition: CRMatrix.h:1722
virtual void * getData() const
Definition: Array.h:275
template<class T_Diag, class T_OffDiag, class X>
int CRMatrix< T_Diag, T_OffDiag, X >::getOffDiagDataSize ( ) const
inlinevirtual

Reimplemented from Matrix.

Definition at line 865 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_offDiag, and Array< T >::getDataSize().

865 { return _offDiag.getDataSize(); }
Array< OffDiag > _offDiag
Definition: CRMatrix.h:1722
virtual int getDataSize() const
Definition: Array.h:276
template<class T_Diag, class T_OffDiag, class X>
PairWiseAssembler& CRMatrix< T_Diag, T_OffDiag, X >::getPairWiseAssembler ( const CRConnectivity pairs)
inline

Definition at line 867 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_conn, CRMatrix< T_Diag, T_OffDiag, X >::_offDiag, CRMatrix< T_Diag, T_OffDiag, X >::_pairWiseAssemblers, and CRConnectivity::getPairToColMapping().

Referenced by DriftDiscretization< X, Diag, OffDiag >::discretize(), GenericIBDiscretization< X, Diag, OffDiag >::discretize(), PhononConvectionDiscretization< X, Diag, OffDiag >::discretize(), ConvectionDiscretization< X, Diag, OffDiag >::discretize(), GenericKineticIBDiscretization< X, Diag, OffDiag >::discretize(), ConvectionDiscretization_Kmodel< X, Diag, OffDiag >::discretize(), ElecDiffusionDiscretization< X, Diag, OffDiag >::discretize(), DiffusionDiscretization< X, Diag, OffDiag >::discretize(), BatteryPCDiffusionDiscretization< X, Diag, OffDiag >::discretize(), WallDiscretization< X, Diag, OffDiag >::discretize(), StructureSourceDiscretization< T, Diag, OffDiag >::discretizeFaces(), StructurePlasticDiscretization< T, Diag, OffDiag >::discretizeFaces(), and PlateSourceDiscretization< T, Diag, OffDiag >::discretizeFaces().

868  {
869  if (_pairWiseAssemblers.find(&pairs) == _pairWiseAssemblers.end())
870  {
871  _pairWiseAssemblers[&pairs] =
872  new PairWiseAssembler(_offDiag,
873  _conn.getPairToColMapping(pairs));
874  }
875  return *_pairWiseAssemblers[&pairs];
876  }
Array< OffDiag > _offDiag
Definition: CRMatrix.h:1722
const CRConnectivity & _conn
Definition: CRMatrix.h:1718
PairWiseAssemblerMap _pairWiseAssemblers
Definition: CRMatrix.h:1723
const PairToColMapping & getPairToColMapping(const CRConnectivity &pairs) const
template<class T_Diag, class T_OffDiag, class X>
bool CRMatrix< T_Diag, T_OffDiag, X >::hasCoeff ( const int  i,
const int  j 
)
inline

Definition at line 846 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_col, and CRMatrix< T_Diag, T_OffDiag, X >::_row.

Referenced by StructureSourceDiscretization< T, Diag, OffDiag >::discretizeFaces(), StructurePlasticDiscretization< T, Diag, OffDiag >::discretizeFaces(), and CRMatrix< T_Diag, T_OffDiag, X >::eliminateRow().

847  {
848  for (int nnb = _row[i]; nnb<_row[i+1]; nnb++)
849  {
850  if (_col[nnb] == j)
851  return true;
852  }
853  return false;
854  }
const Array< int > & _col
Definition: CRMatrix.h:1720
const Array< int > & _row
Definition: CRMatrix.h:1719
template<class T_Diag, class T_OffDiag, class X>
virtual void CRMatrix< T_Diag, T_OffDiag, X >::iluSolve ( IContainer xB,
const IContainer bB,
const IContainer  
) const
inlinevirtual

Reimplemented from Matrix.

Definition at line 376 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_iluConnPtr, CRMatrix< T_Diag, T_OffDiag, X >::compute_ILU0(), CRMatrix< T_Diag, T_OffDiag, X >::lowerSolve(), Array< T >::newClone(), and CRMatrix< T_Diag, T_OffDiag, X >::upperSolve().

377  {
378  XArray& x = dynamic_cast<XArray&>(xB);
379  shared_ptr<XArray> y = dynamic_pointer_cast<XArray>(x.newClone());
380  const XArray& b = dynamic_cast<const XArray&>(bB);
381 
382  if (!_iluConnPtr)
383  compute_ILU0();
384 
385  lowerSolve(*y,b);
386  upperSolve(x,*y);
387  }
void upperSolve(XArray &x, const XArray &y) const
Definition: CRMatrix.h:1697
void compute_ILU0() const
Definition: CRMatrix.h:1546
Array< X > XArray
Definition: CRMatrix.h:99
shared_ptr< CRConnectivity > _iluConnPtr
Definition: CRMatrix.h:1731
void lowerSolve(XArray &y, const XArray &b) const
Definition: CRMatrix.h:1676
template<class T_Diag, class T_OffDiag, class X>
virtual void CRMatrix< T_Diag, T_OffDiag, X >::initAssembly ( )
inlinevirtual

Implements Matrix.

Definition at line 188 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_diag, CRMatrix< T_Diag, T_OffDiag, X >::_isBoundary, CRMatrix< T_Diag, T_OffDiag, X >::_offDiag, and Array< T >::zero().

189  {
190  _diag.zero();
191  _offDiag.zero();
192  _isBoundary = false;
193  }
virtual void zero()
Definition: Array.h:281
Array< bool > _isBoundary
Definition: CRMatrix.h:1724
Array< OffDiag > _offDiag
Definition: CRMatrix.h:1722
Array< Diag > _diag
Definition: CRMatrix.h:1721
template<class T_Diag, class T_OffDiag, class X>
virtual void CRMatrix< T_Diag, T_OffDiag, X >::Jacobi ( IContainer xnewB,
const IContainer xoldB,
const IContainer bB 
) const
inlinevirtual

Jacobi update for this * x = b

Reimplemented from Matrix.

Definition at line 353 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_col, CRMatrix< T_Diag, T_OffDiag, X >::_conn, CRMatrix< T_Diag, T_OffDiag, X >::_diag, CRMatrix< T_Diag, T_OffDiag, X >::_offDiag, CRMatrix< T_Diag, T_OffDiag, X >::_row, CRConnectivity::getRowSite(), and StorageSite::getSelfCount().

355  {
356  XArray& xnew = dynamic_cast<XArray&>(xnewB);
357  const XArray& xold = dynamic_cast<const XArray&>(xoldB);
358  const XArray& b = dynamic_cast<const XArray&>(bB);
359 
360  const int nRows = _conn.getRowSite().getSelfCount();
361 
362  X sum;
363  for(int nr=0; nr<nRows; nr++)
364  {
365  sum = b[nr];
366  for (int nb = _row[nr]; nb<_row[nr+1]; nb++)
367  {
368  const int j = _col[nb];
369  sum += _offDiag[nb]*xold[j];
370  }
371  xnew[nr] = -sum/_diag[nr];
372  }
373 
374  }
int getSelfCount() const
Definition: StorageSite.h:40
const Array< int > & _col
Definition: CRMatrix.h:1720
Array< X > XArray
Definition: CRMatrix.h:99
Array< OffDiag > _offDiag
Definition: CRMatrix.h:1722
Array< Diag > _diag
Definition: CRMatrix.h:1721
const Array< int > & _row
Definition: CRMatrix.h:1719
const CRConnectivity & _conn
Definition: CRMatrix.h:1718
const StorageSite & getRowSite() const
template<class T_Diag, class T_OffDiag, class X>
void CRMatrix< T_Diag, T_OffDiag, X >::lowerSolve ( XArray y,
const XArray b 
) const
inlineprivate

Definition at line 1676 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_conn, CRMatrix< T_Diag, T_OffDiag, X >::_iluCoeffsPtr, CRMatrix< T_Diag, T_OffDiag, X >::_iluConnPtr, CRMatrix< T_Diag, T_OffDiag, X >::_iluDiagIndexPtr, CRConnectivity::getRowSite(), and StorageSite::getSelfCount().

Referenced by CRMatrix< T_Diag, T_OffDiag, X >::iluSolve().

1677  {
1678  const IntArray& iluRow = _iluConnPtr->getRow();
1679  const IntArray& iluCol = _iluConnPtr->getCol();
1680  const IntArray& iluDiagIndex = *_iluDiagIndexPtr;
1681  const DiagArray& iluCoeffs = *_iluCoeffsPtr;
1682 
1683  const int nRows = _conn.getRowSite().getSelfCount();
1684 
1685  for (int j = 0; j < nRows; j++)
1686  {
1687  X yj = -b[j];
1688  for ( int k = iluRow[j]; k < iluDiagIndex[j]; k++ )
1689  {
1690  yj -= iluCoeffs[k] * y[ iluCol[k] ];
1691  }
1692  y[j] = yj;
1693  }
1694  }
int getSelfCount() const
Definition: StorageSite.h:40
Array< int > IntArray
Definition: CRMatrix.h:96
Array< Diag > DiagArray
Definition: CRMatrix.h:95
const CRConnectivity & _conn
Definition: CRMatrix.h:1718
IntArrayPtr _iluDiagIndexPtr
Definition: CRMatrix.h:1733
shared_ptr< CRConnectivity > _iluConnPtr
Definition: CRMatrix.h:1731
const StorageSite & getRowSite() const
DiagArrayPtr _iluCoeffsPtr
Definition: CRMatrix.h:1736
template<class T_Diag, class T_OffDiag, class X>
virtual void CRMatrix< T_Diag, T_OffDiag, X >::multiply ( IContainer yB,
const IContainer xB 
) const
inlinevirtual

y = this * x

Reimplemented from Matrix.

Definition at line 200 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_col, CRMatrix< T_Diag, T_OffDiag, X >::_conn, CRMatrix< T_Diag, T_OffDiag, X >::_diag, CRMatrix< T_Diag, T_OffDiag, X >::_offDiag, CRMatrix< T_Diag, T_OffDiag, X >::_row, StorageSite::getCount(), and CRConnectivity::getRowSite().

201  {
202  XArray& y = dynamic_cast<XArray&>(yB);
203  const XArray& x = dynamic_cast<const XArray&>(xB);
204 
205  const int nRows = _conn.getRowSite().getCount();
206  for(int nr=0; nr<nRows; nr++)
207  {
208  y[nr] = _diag[nr]*x[nr];
209  for (int nb = _row[nr]; nb<_row[nr+1]; nb++)
210  {
211  const int j = _col[nb];
212  y[nr] += _offDiag[nb]*x[j];
213  }
214 
215  }
216  }
const Array< int > & _col
Definition: CRMatrix.h:1720
Array< X > XArray
Definition: CRMatrix.h:99
Array< OffDiag > _offDiag
Definition: CRMatrix.h:1722
Array< Diag > _diag
Definition: CRMatrix.h:1721
const Array< int > & _row
Definition: CRMatrix.h:1719
const CRConnectivity & _conn
Definition: CRMatrix.h:1718
int getCount() const
Definition: StorageSite.h:39
const StorageSite & getRowSite() const
template<class T_Diag, class T_OffDiag, class X>
virtual void CRMatrix< T_Diag, T_OffDiag, X >::multiplyAndAdd ( IContainer yB,
const IContainer xB 
) const
inlinevirtual

y += this * x

Reimplemented from Matrix.

Definition at line 223 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_col, CRMatrix< T_Diag, T_OffDiag, X >::_conn, CRMatrix< T_Diag, T_OffDiag, X >::_diag, CRMatrix< T_Diag, T_OffDiag, X >::_offDiag, CRMatrix< T_Diag, T_OffDiag, X >::_row, StorageSite::getCount(), and CRConnectivity::getRowSite().

224  {
225  XArray& y = dynamic_cast<XArray&>(yB);
226  const XArray& x = dynamic_cast<const XArray&>(xB);
227 
228  const int nRows = _conn.getRowSite().getCount();
229  for(int nr=0; nr<nRows; nr++)
230  {
231  y[nr] += _diag[nr]*x[nr];
232  for (int nb = _row[nr]; nb<_row[nr+1]; nb++)
233  {
234  const int j = _col[nb];
235  y[nr] += _offDiag[nb]*x[j];
236  }
237  }
238 
239  }
const Array< int > & _col
Definition: CRMatrix.h:1720
Array< X > XArray
Definition: CRMatrix.h:99
Array< OffDiag > _offDiag
Definition: CRMatrix.h:1722
Array< Diag > _diag
Definition: CRMatrix.h:1721
const Array< int > & _row
Definition: CRMatrix.h:1719
const CRConnectivity & _conn
Definition: CRMatrix.h:1718
int getCount() const
Definition: StorageSite.h:39
const StorageSite & getRowSite() const
template<class T_Diag, class T_OffDiag, class X>
virtual void CRMatrix< T_Diag, T_OffDiag, X >::printRow ( const int  i) const
inlinevirtual

Reimplemented from Matrix.

Definition at line 1028 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_col, CRMatrix< T_Diag, T_OffDiag, X >::_diag, CRMatrix< T_Diag, T_OffDiag, X >::_offDiag, and CRMatrix< T_Diag, T_OffDiag, X >::_row.

1029  {
1030  cout << "coeff (" << i << "," << i << ") = " << _diag[i] << endl;
1031 
1032  for (int nb = _row[i]; nb<_row[i+1]; nb++)
1033  {
1034  const int j = _col[nb];
1035  cout << "coeff (" << i << "," << j << ") = " << _offDiag[nb] << endl;
1036  }
1037  }
const Array< int > & _col
Definition: CRMatrix.h:1720
Array< OffDiag > _offDiag
Definition: CRMatrix.h:1722
Array< Diag > _diag
Definition: CRMatrix.h:1721
const Array< int > & _row
Definition: CRMatrix.h:1719
template<class T_Diag, class T_OffDiag, class X>
virtual shared_ptr<ArrayBase> CRMatrix< T_Diag, T_OffDiag, X >::quadProduct ( const IContainer xB) const
inlinevirtual

compute x^T * this * x; return as a new Array of length 1

Reimplemented from Matrix.

Definition at line 274 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_col, CRMatrix< T_Diag, T_OffDiag, X >::_conn, CRMatrix< T_Diag, T_OffDiag, X >::_diag, CRMatrix< T_Diag, T_OffDiag, X >::_offDiag, CRMatrix< T_Diag, T_OffDiag, X >::_row, CRConnectivity::getRowSite(), and StorageSite::getSelfCount().

275  {
276 
277  X sum( NumTypeTraits<X>::getZero());
278  const XArray& x = dynamic_cast<const XArray&>(xB);
279 
280  const int nRows = _conn.getRowSite().getSelfCount();
281  for(int nr=0; nr<nRows; nr++)
282  {
283  X sum_n = _diag[nr]*x[nr];
284  for (int nb = _row[nr]; nb<_row[nr+1]; nb++)
285  {
286  const int j = _col[nb];
287  sum_n += _offDiag[nb]*x[j];
288  }
289 
290  sum += sum_n*x[nr];
291  }
292 
293  XArray *p = new XArray(1);
294  (*p)[0] = sum;
295  return shared_ptr<ArrayBase>(p);
296  }
int getSelfCount() const
Definition: StorageSite.h:40
const Array< int > & _col
Definition: CRMatrix.h:1720
Array< X > XArray
Definition: CRMatrix.h:99
Array< OffDiag > _offDiag
Definition: CRMatrix.h:1722
Array< Diag > _diag
Definition: CRMatrix.h:1721
const Array< int > & _row
Definition: CRMatrix.h:1719
const CRConnectivity & _conn
Definition: CRMatrix.h:1718
const StorageSite & getRowSite() const
template<class T_Diag, class T_OffDiag, class X>
virtual void CRMatrix< T_Diag, T_OffDiag, X >::reverseGS ( IContainer xB,
IContainer bB,
IContainer  
) const
inlinevirtual

reverse GaussSeidel update for this * x = b

Reimplemented from Matrix.

Definition at line 328 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_col, CRMatrix< T_Diag, T_OffDiag, X >::_conn, CRMatrix< T_Diag, T_OffDiag, X >::_diag, CRMatrix< T_Diag, T_OffDiag, X >::_offDiag, CRMatrix< T_Diag, T_OffDiag, X >::_row, CRConnectivity::getRowSite(), and StorageSite::getSelfCount().

329  {
330  XArray& x = dynamic_cast<XArray&>(xB);
331  const XArray& b = dynamic_cast<const XArray&>(bB);
332 
333  const int nRows = _conn.getRowSite().getSelfCount();
334 
335  X sum;
336  for(int nr=nRows-1; nr>=0; nr--)
337  {
338  sum = b[nr];
339  for (int nb = _row[nr]; nb<_row[nr+1]; nb++)
340  {
341  const int j = _col[nb];
342  sum += _offDiag[nb]*x[j];
343  }
344  x[nr] = -sum/_diag[nr];
345  }
346  }
int getSelfCount() const
Definition: StorageSite.h:40
const Array< int > & _col
Definition: CRMatrix.h:1720
Array< X > XArray
Definition: CRMatrix.h:99
Array< OffDiag > _offDiag
Definition: CRMatrix.h:1722
Array< Diag > _diag
Definition: CRMatrix.h:1721
const Array< int > & _row
Definition: CRMatrix.h:1719
const CRConnectivity & _conn
Definition: CRMatrix.h:1718
const StorageSite & getRowSite() const
template<class T_Diag, class T_OffDiag, class X>
void CRMatrix< T_Diag, T_OffDiag, X >::setBoundary ( const int  nr)
inline

Definition at line 1056 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_isBoundary.

Referenced by PlateBCS< X, Diag, OffDiag >::applyCantileverBC(), BaseGenericBCS< Vector< T, N >, DiagonalTensor< T, N >, T >::applyConvectionBC(), BaseGenericBCS< Vector< T, N >, DiagonalTensor< T, N >, T >::applyDielectricInterfaceBC(), BaseGenericPhononBCS< X, Diag, OffDiag >::applyExtrapolationBC(), BaseGenericKineticBCS< X, Diag, OffDiag >::applyExtrapolationBC(), BaseGenericBCS< Vector< T, N >, DiagonalTensor< T, N >, T >::applyExtrapolationBC(), BaseGenericBCS< Vector< T, N >, DiagonalTensor< T, N >, T >::applyMixedBC(), StructureBCS< X, Diag, OffDiag >::applyNeumannBC(), BaseGenericBCS< Vector< T, N >, DiagonalTensor< T, N >, T >::applyNeumannBC(), PlateBCS< X, Diag, OffDiag >::applyNeumannBC(), BaseGenericBCS< Vector< T, N >, DiagonalTensor< T, N >, T >::applyRadiationBC(), BatteryPC_BCS< X, Diag, OffDiag >::applySingleEquationNeumannBC(), GenericBCS< X, Diag, OffDiag >::applySymmetryBC(), GenericBCS< Vector< T, N >, DiagonalTensor< T, N >, T >::applySymmetryBC(), GenericBCS< Vector< T, N >, DiagonalTensor< T, N >, DiagonalTensor< T, N > >::applySymmetryBC(), GenericBCS< Vector< T, N >, SquareTensor< T, N >, SquareTensor< T, N > >::applySymmetryBC(), StructureBCS< X, Diag, OffDiag >::applyZeroDerivativeBC(), and PlateBCS< X, Diag, OffDiag >::applyZeroDerivativeBC().

1057  {
1058  _isBoundary[nr] = true;
1059  }
Array< bool > _isBoundary
Definition: CRMatrix.h:1724
template<class T_Diag, class T_OffDiag, class X>
virtual void CRMatrix< T_Diag, T_OffDiag, X >::setFlatMatrix ( Matrix fmg) const
inlinevirtual

Reimplemented from Matrix.

Definition at line 1087 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::getConnectivity(), CRMatrix< T_Diag, T_OffDiag, X >::getDiag(), CRMatrix< T_Diag, T_OffDiag, X >::getOffDiag(), and setFlatCoeffs().

1088  {
1092  }
Array< Diag > & getDiag()
Definition: CRMatrix.h:856
virtual const CRConnectivity & getConnectivity() const
Definition: CRMatrix.h:834
Array< OffDiag > & getOffDiag()
Definition: CRMatrix.h:857
void setFlatCoeffs(Array< double > &flatCoeffs, const CRConnectivity &flatConnectivity, const Array< T_Diag > &diag, const Array< T_OffDiag > &offDiag, const CRConnectivity &connectivity)
Definition: CRMatrix.h:37
template<class T_Diag, class T_OffDiag, class X>
virtual void CRMatrix< T_Diag, T_OffDiag, X >::solveBoundary ( IContainer xB,
IContainer bB,
IContainer  
) const
inlinevirtual

solve rows marked as boundary

Reimplemented from Matrix.

Definition at line 433 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_col, CRMatrix< T_Diag, T_OffDiag, X >::_conn, CRMatrix< T_Diag, T_OffDiag, X >::_diag, CRMatrix< T_Diag, T_OffDiag, X >::_isBoundary, CRMatrix< T_Diag, T_OffDiag, X >::_offDiag, CRMatrix< T_Diag, T_OffDiag, X >::_row, StorageSite::getCount(), CRConnectivity::getRowSite(), and StorageSite::getSelfCount().

434  {
435 
436  XArray& x = dynamic_cast<XArray&>(xB);
437  const XArray& b = dynamic_cast<const XArray&>(bB);
438 
439  const int nRowsInterior = _conn.getRowSite().getSelfCount();
440  const int nRowsExtra = _conn.getRowSite().getCount();
441 
442  X sum;
443  for(int nr=nRowsInterior; nr<nRowsExtra; nr++)
444  if (_isBoundary[nr])
445  {
446  sum = b[nr];
447  for (int nb = _row[nr]; nb<_row[nr+1]; nb++)
448  {
449  const int j = _col[nb];
450  sum += _offDiag[nb]*x[j];
451  }
452  x[nr] = -sum/_diag[nr];
453  }
454  }
int getSelfCount() const
Definition: StorageSite.h:40
const Array< int > & _col
Definition: CRMatrix.h:1720
Array< bool > _isBoundary
Definition: CRMatrix.h:1724
Array< X > XArray
Definition: CRMatrix.h:99
Array< OffDiag > _offDiag
Definition: CRMatrix.h:1722
Array< Diag > _diag
Definition: CRMatrix.h:1721
const Array< int > & _row
Definition: CRMatrix.h:1719
const CRConnectivity & _conn
Definition: CRMatrix.h:1718
int getCount() const
Definition: StorageSite.h:39
const StorageSite & getRowSite() const
template<class T_Diag, class T_OffDiag, class X>
virtual void CRMatrix< T_Diag, T_OffDiag, X >::spikeSolve ( IContainer xB,
const IContainer bB,
const IContainer ,
const SpikeStorage spike_storage 
) const
inlinevirtual

Reimplemented from Matrix.

Definition at line 389 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_conn, CRMatrix< T_Diag, T_OffDiag, X >::_diag, CRMatrix< T_Diag, T_OffDiag, X >::_offDiag, and CRMatrix< T_Diag, T_OffDiag, X >::_spikeMtrx.

390  {
391  if (!_spikeMtrx)
392  _spikeMtrx = shared_ptr<T_SpikeMtrx>(new T_SpikeMtrx(_conn, _diag, _offDiag, spike_storage));
393 
394  XArray& x = dynamic_cast<XArray&>(xB);
395  shared_ptr<XArray> y = dynamic_pointer_cast<XArray>(x.newClone());
396  const XArray& b = dynamic_cast<const XArray&>(bB);
397  _spikeMtrx->solve( b, x);
398 
399  }
shared_ptr< T_SpikeMtrx > _spikeMtrx
Definition: CRMatrix.h:1738
Array< X > XArray
Definition: CRMatrix.h:99
Array< OffDiag > _offDiag
Definition: CRMatrix.h:1722
Array< Diag > _diag
Definition: CRMatrix.h:1721
const CRConnectivity & _conn
Definition: CRMatrix.h:1718
SpikeMatrix< Diag, OffDiag, X > T_SpikeMtrx
Definition: CRMatrix.h:104
template<class T_Diag, class T_OffDiag, class X>
void CRMatrix< T_Diag, T_OffDiag, X >::syncBndryCoeffs ( const Array< X > &  b)
inlineprivate

Definition at line 1096 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::createScatterGatherCountsBuffer(), CRMatrix< T_Diag, T_OffDiag, X >::createScatterGatherIndicesBuffer(), CRMatrix< T_Diag, T_OffDiag, X >::createScatterGatherValuesBBuffer(), CRMatrix< T_Diag, T_OffDiag, X >::createScatterGatherValuesCRMtrxBuffer(), CRMatrix< T_Diag, T_OffDiag, X >::syncCounts(), CRMatrix< T_Diag, T_OffDiag, X >::syncIndices(), CRMatrix< T_Diag, T_OffDiag, X >::syncValuesB(), and CRMatrix< T_Diag, T_OffDiag, X >::syncValuesCRMtrx().

Referenced by CRMatrix< T_Diag, T_OffDiag, X >::eliminateBoundaryEquations().

1097  {
1098  //create recvCounts buffer
1100  //syn counts
1101  syncCounts();
1102  //create recvindices buffer
1104  //sync indices
1105  syncIndices();
1106  //create crmtrx buffer
1108  //sync values crmtrx
1109  syncValuesCRMtrx();
1110  //create b buffer
1112  //sync values b
1113  syncValuesB();
1114  }
void syncCounts()
Definition: CRMatrix.h:1158
void createScatterGatherIndicesBuffer()
Definition: CRMatrix.h:1214
void syncIndices()
Definition: CRMatrix.h:1267
void syncValuesCRMtrx()
Definition: CRMatrix.h:1386
void syncValuesB()
Definition: CRMatrix.h:1478
void createScatterGatherValuesCRMtrxBuffer()
Definition: CRMatrix.h:1331
void createScatterGatherCountsBuffer()
Definition: CRMatrix.h:1117
void createScatterGatherValuesBBuffer(const XArray &B)
Definition: CRMatrix.h:1434
template<class T_Diag, class T_OffDiag, class X>
void CRMatrix< T_Diag, T_OffDiag, X >::syncCounts ( )
inlineprivate

Definition at line 1158 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_conn, CRMatrix< T_Diag, T_OffDiag, X >::_recvCounts, CRMatrix< T_Diag, T_OffDiag, X >::_sendCounts, CRMatrix< T_Diag, T_OffDiag, X >::get_request_size(), ArrayBase::getData(), ArrayBase::getDataSize(), StorageSite::getGatherMapLevel1(), StorageSite::getGatherProcID(), CRConnectivity::getRowSite(), StorageSite::getScatterMapLevel1(), and StorageSite::getTag().

Referenced by CRMatrix< T_Diag, T_OffDiag, X >::syncBndryCoeffs().

1159  {
1160 #ifdef FVM_PARALLEL
1161  //SENDING
1162  const int request_size = get_request_size();
1163  MPI::Request request_send[ request_size ];
1164  MPI::Request request_recv[ request_size ];
1165  int indxSend = 0;
1166  int indxRecv = 0;
1167  const StorageSite& site = _conn.getRowSite();
1168  const StorageSite::ScatterMap& scatterMap = site.getScatterMapLevel1();
1169  foreach(const StorageSite::ScatterMap::value_type& mpos, scatterMap){
1170  const StorageSite& oSite = *mpos.first;
1171  EntryIndex e(&site,&oSite);
1172  //checking if storage site is only site or ghost site, we only communicate ghost site ( oSite.getCount() == -1 )
1173  ArrayBase& sendArray = *_sendCounts[e];
1174  //loop over surround indices and itself
1175  int to_where = oSite.getGatherProcID();
1176  //many interior partiton is not going to have any boundary in cellCell2 so no need to send the data
1177  if ( to_where != -1 ){
1178  int mpi_tag = oSite.getTag();
1179  request_send[indxSend++] =
1180  MPI::COMM_WORLD.Isend( sendArray.getData(), sendArray.getDataSize(), MPI::BYTE, to_where, mpi_tag );
1181  }
1182  }
1183  //RECIEVING
1184  //getting values from other meshes to fill g
1185  const StorageSite::GatherMap& gatherMap = site.getGatherMapLevel1();
1186  foreach(const StorageSite::GatherMap::value_type& mpos, gatherMap){
1187  const StorageSite& oSite = *mpos.first;
1188  //checking if storage site is only site or ghost site, we only communicate ghost site ( oSite.getCount() == -1 )
1189  EntryIndex e(&oSite,&site);
1190  int from_where = oSite.getGatherProcID();
1191  if ( from_where != -1 ){
1192  int mpi_tag = oSite.getTag();
1193  MPI::Status recv_status;
1194  while ( !(recv_status.Get_source() == from_where && recv_status.Get_tag() == mpi_tag) ){
1195  if ( MPI::COMM_WORLD.Iprobe(from_where, mpi_tag, recv_status) ){
1196  const int recv_count = recv_status.Get_count( MPI::INT );
1197  _recvCounts[e] = shared_ptr< Array<int> > ( new Array<int> (recv_count) );
1198  ArrayBase& recvArray = *_recvCounts[e];
1199  request_recv[indxRecv++] =
1200  MPI::COMM_WORLD.Irecv( recvArray.getData(), recvArray.getDataSize(), MPI::BYTE, from_where, mpi_tag );
1201  }
1202  }
1203  }
1204  }
1205 
1206  int count = get_request_size();
1207  MPI::Request::Waitall( count, request_recv );
1208  MPI::Request::Waitall( count, request_send );
1209 #endif
1210 
1211  }
pair< const StorageSite *, const StorageSite * > EntryIndex
Definition: CRMatrix.h:106
GhostArrayMap _sendCounts
Definition: CRMatrix.h:1740
virtual int getDataSize() const =0
const GatherMap & getGatherMapLevel1() const
Definition: StorageSite.h:74
const ScatterMap & getScatterMapLevel1() const
Definition: StorageSite.h:73
GhostArrayMap _recvCounts
Definition: CRMatrix.h:1741
int getTag() const
Definition: StorageSite.h:84
int getGatherProcID() const
Definition: StorageSite.h:83
const CRConnectivity & _conn
Definition: CRMatrix.h:1718
int get_request_size()
Definition: CRMatrix.h:1525
map< const StorageSite *, shared_ptr< Array< int > > > ScatterMap
Definition: StorageSite.h:23
virtual void * getData() const =0
map< const StorageSite *, shared_ptr< Array< int > > > GatherMap
Definition: StorageSite.h:24
const StorageSite & getRowSite() const
template<class T_Diag, class T_OffDiag, class X>
void CRMatrix< T_Diag, T_OffDiag, X >::syncIndices ( )
inlineprivate

Definition at line 1267 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_conn, CRMatrix< T_Diag, T_OffDiag, X >::_recvIndices, CRMatrix< T_Diag, T_OffDiag, X >::_sendIndices, CRMatrix< T_Diag, T_OffDiag, X >::get_request_size(), ArrayBase::getData(), ArrayBase::getDataSize(), StorageSite::getGatherMapLevel1(), StorageSite::getGatherProcID(), Array< T >::getLength(), CRConnectivity::getRowSite(), StorageSite::getScatterMapLevel1(), and StorageSite::getTag().

Referenced by CRMatrix< T_Diag, T_OffDiag, X >::syncBndryCoeffs().

1268  {
1269 
1270 #ifdef FVM_PARALLEL
1271  //SENDING
1272  const int request_size = get_request_size();
1273  MPI::Request request_send[ request_size ];
1274  MPI::Request request_recv[ request_size ];
1275  int indxSend = 0;
1276  int indxRecv = 0;
1277  const StorageSite& site = _conn.getRowSite();
1278  const StorageSite::ScatterMap& scatterMap = site.getScatterMapLevel1();
1279  foreach(const StorageSite::ScatterMap::value_type& mpos, scatterMap){
1280  const StorageSite& oSite = *mpos.first;
1281  EntryIndex e(&site,&oSite);
1282  //checking if storage site is only site or ghost site, we only communicate ghost site ( oSite.getCount() == -1 )
1283  ArrayBase& sendArray = *_sendIndices[e];
1284  //loop over surround indices and itself
1285  int to_where = oSite.getGatherProcID();
1286  if ( to_where != -1 ){
1287  int mpi_tag = oSite.getTag();
1288  request_send[indxSend++] =
1289  MPI::COMM_WORLD.Isend( sendArray.getData(), sendArray.getDataSize(), MPI::BYTE, to_where, mpi_tag );
1290  }
1291  }
1292  //RECIEVING
1293  //getting values from other meshes to fill g
1294  const StorageSite::GatherMap& gatherMap = site.getGatherMapLevel1();
1295  foreach(const StorageSite::GatherMap::value_type& mpos, gatherMap){
1296  const StorageSite& oSite = *mpos.first;
1297  EntryIndex e(&oSite,&site);
1298  ArrayBase& recvArray = *_recvIndices[e];
1299  int from_where = oSite.getGatherProcID();
1300  if ( from_where != -1 ){
1301  int mpi_tag = oSite.getTag();
1302  request_recv[indxRecv++] =
1303  MPI::COMM_WORLD.Irecv( recvArray.getData(), recvArray.getDataSize(), MPI::BYTE, from_where, mpi_tag );
1304  }
1305  }
1306 
1307  int count = get_request_size();
1308  MPI::Request::Waitall( count, request_recv );
1309  MPI::Request::Waitall( count, request_send );
1310 #endif
1311 
1312 #ifndef FVM_PARALLEL
1313  const StorageSite& site = _conn.getRowSite();
1314  const StorageSite::GatherMap& gatherMap = site.getGatherMapLevel1();
1315 #endif
1316  //globaltolocal
1317  const map<int,int>& globalToLocal = _conn. getGlobalToLocalMapper();
1318  foreach(const StorageSite::GatherMap::value_type& mpos, gatherMap){
1319  const StorageSite& oSite = *mpos.first;
1320  EntryIndex e(&oSite,&site);
1321  Array<int>& recv_indices = dynamic_cast< Array<int>& > (*_recvIndices[e]);
1322  for( int i=0; i < recv_indices.getLength(); i++ ){
1323  const int localID = globalToLocal.find( recv_indices[i] )->second;
1324  recv_indices[i] = localID;
1325  }
1326  }
1327 
1328  }
pair< const StorageSite *, const StorageSite * > EntryIndex
Definition: CRMatrix.h:106
virtual int getDataSize() const =0
const GatherMap & getGatherMapLevel1() const
Definition: StorageSite.h:74
GhostArrayMap _sendIndices
Definition: CRMatrix.h:1742
const ScatterMap & getScatterMapLevel1() const
Definition: StorageSite.h:73
int getTag() const
Definition: StorageSite.h:84
int getGatherProcID() const
Definition: StorageSite.h:83
const CRConnectivity & _conn
Definition: CRMatrix.h:1718
int get_request_size()
Definition: CRMatrix.h:1525
GhostArrayMap _recvIndices
Definition: CRMatrix.h:1743
map< const StorageSite *, shared_ptr< Array< int > > > ScatterMap
Definition: StorageSite.h:23
virtual void * getData() const =0
map< const StorageSite *, shared_ptr< Array< int > > > GatherMap
Definition: StorageSite.h:24
const StorageSite & getRowSite() const
int getLength() const
Definition: Array.h:87
template<class T_Diag, class T_OffDiag, class X>
void CRMatrix< T_Diag, T_OffDiag, X >::syncValuesB ( )
inlineprivate

Definition at line 1478 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_conn, CRMatrix< T_Diag, T_OffDiag, X >::_recvValuesB, CRMatrix< T_Diag, T_OffDiag, X >::_sendValuesB, CRMatrix< T_Diag, T_OffDiag, X >::get_request_size(), ArrayBase::getData(), ArrayBase::getDataSize(), StorageSite::getGatherMapLevel1(), StorageSite::getGatherProcID(), CRConnectivity::getRowSite(), StorageSite::getScatterMapLevel1(), and StorageSite::getTag().

Referenced by CRMatrix< T_Diag, T_OffDiag, X >::syncBndryCoeffs().

1479  {
1480  #ifdef FVM_PARALLEL
1481  //SENDING
1482  const int request_size = get_request_size();
1483  MPI::Request request_send[ request_size ];
1484  MPI::Request request_recv[ request_size ];
1485  int indxSend = 0;
1486  int indxRecv = 0;
1487  const StorageSite& site = _conn.getRowSite();
1488  const StorageSite::ScatterMap& scatterMap = site.getScatterMapLevel1();
1489  foreach(const StorageSite::ScatterMap::value_type& mpos, scatterMap){
1490  const StorageSite& oSite = *mpos.first;
1491  EntryIndex e(&site,&oSite);
1492  //checking if storage site is only site or ghost site, we only communicate ghost site ( oSite.getCount() == -1 )
1493  ArrayBase& sendArray = *_sendValuesB[e];
1494  //loop over surround indices and itself
1495  int to_where = oSite.getGatherProcID();
1496  if ( to_where != -1 ){
1497  int mpi_tag = oSite.getTag();
1498  request_send[indxSend++] =
1499  MPI::COMM_WORLD.Isend( sendArray.getData(), sendArray.getDataSize(), MPI::BYTE, to_where, mpi_tag );
1500  }
1501  }
1502  //RECIEVING
1503  //getting values from other meshes to fill g
1504  const StorageSite::GatherMap& gatherMap = site.getGatherMapLevel1();
1505  foreach(const StorageSite::GatherMap::value_type& mpos, gatherMap){
1506  const StorageSite& oSite = *mpos.first;
1507  //checking if storage site is only site or ghost site, we only communicate ghost site ( oSite.getCount() == -1 )
1508  EntryIndex e(&oSite,&site);
1509  ArrayBase& recvArray = *_recvValuesB[e];
1510  int from_where = oSite.getGatherProcID();
1511  if ( from_where != -1 ){
1512  int mpi_tag = oSite.getTag();
1513  request_recv[indxRecv++] =
1514  MPI::COMM_WORLD.Irecv( recvArray.getData(), recvArray.getDataSize(), MPI::BYTE, from_where, mpi_tag );
1515  }
1516  }
1517 
1518  int count = get_request_size();
1519  MPI::Request::Waitall( count, request_recv );
1520  MPI::Request::Waitall( count, request_send );
1521 #endif
1522 
1523  }
pair< const StorageSite *, const StorageSite * > EntryIndex
Definition: CRMatrix.h:106
virtual int getDataSize() const =0
const GatherMap & getGatherMapLevel1() const
Definition: StorageSite.h:74
const ScatterMap & getScatterMapLevel1() const
Definition: StorageSite.h:73
GhostArrayMap _recvValuesB
Definition: CRMatrix.h:1747
int getTag() const
Definition: StorageSite.h:84
int getGatherProcID() const
Definition: StorageSite.h:83
const CRConnectivity & _conn
Definition: CRMatrix.h:1718
int get_request_size()
Definition: CRMatrix.h:1525
map< const StorageSite *, shared_ptr< Array< int > > > ScatterMap
Definition: StorageSite.h:23
virtual void * getData() const =0
map< const StorageSite *, shared_ptr< Array< int > > > GatherMap
Definition: StorageSite.h:24
const StorageSite & getRowSite() const
GhostArrayMap _sendValuesB
Definition: CRMatrix.h:1746
template<class T_Diag, class T_OffDiag, class X>
void CRMatrix< T_Diag, T_OffDiag, X >::syncValuesCRMtrx ( )
inlineprivate

Definition at line 1386 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_conn, CRMatrix< T_Diag, T_OffDiag, X >::_recvValuesCRMtrx, CRMatrix< T_Diag, T_OffDiag, X >::_sendValuesCRMtrx, CRMatrix< T_Diag, T_OffDiag, X >::get_request_size(), ArrayBase::getData(), ArrayBase::getDataSize(), StorageSite::getGatherMapLevel1(), StorageSite::getGatherProcID(), CRConnectivity::getRowSite(), StorageSite::getScatterMapLevel1(), and StorageSite::getTag().

Referenced by CRMatrix< T_Diag, T_OffDiag, X >::syncBndryCoeffs().

1387  {
1388  #ifdef FVM_PARALLEL
1389  //SENDING
1390  const int request_size = get_request_size();
1391  MPI::Request request_send[ request_size ];
1392  MPI::Request request_recv[ request_size ];
1393  int indxSend = 0;
1394  int indxRecv = 0;
1395  const StorageSite& site = _conn.getRowSite();
1396  const StorageSite::ScatterMap& scatterMap = site.getScatterMapLevel1();
1397  foreach(const StorageSite::ScatterMap::value_type& mpos, scatterMap){
1398  const StorageSite& oSite = *mpos.first;
1399  EntryIndex e(&site,&oSite);
1400  //checking if storage site is only site or ghost site, we only communicate ghost site ( oSite.getCount() == -1 )
1401  ArrayBase& sendArray = *_sendValuesCRMtrx[e];
1402  //loop over surround indices and itself
1403  int to_where = oSite.getGatherProcID();
1404  if ( to_where != -1 ){
1405  int mpi_tag = oSite.getTag();
1406  request_send[indxSend++] =
1407  MPI::COMM_WORLD.Isend( sendArray.getData(), sendArray.getDataSize(), MPI::BYTE, to_where, mpi_tag );
1408  }
1409  }
1410  //RECIEVING
1411  //getting values from other meshes to fill g
1412  const StorageSite::GatherMap& gatherMap = site.getGatherMapLevel1();
1413  foreach(const StorageSite::GatherMap::value_type& mpos, gatherMap){
1414  const StorageSite& oSite = *mpos.first;
1415  //checking if storage site is only site or ghost site, we only communicate ghost site ( oSite.getCount() == -1 )
1416  EntryIndex e(&oSite,&site);
1417  ArrayBase& recvArray = *_recvValuesCRMtrx[e];
1418  int from_where = oSite.getGatherProcID();
1419  if ( from_where != -1 ){
1420  int mpi_tag = oSite.getTag();
1421  request_recv[indxRecv++] =
1422  MPI::COMM_WORLD.Irecv( recvArray.getData(), recvArray.getDataSize(), MPI::BYTE, from_where, mpi_tag );
1423  }
1424  }
1425 
1426  int count = get_request_size();
1427  MPI::Request::Waitall( count, request_recv );
1428  MPI::Request::Waitall( count, request_send );
1429 #endif
1430 
1431  }
pair< const StorageSite *, const StorageSite * > EntryIndex
Definition: CRMatrix.h:106
virtual int getDataSize() const =0
const GatherMap & getGatherMapLevel1() const
Definition: StorageSite.h:74
const ScatterMap & getScatterMapLevel1() const
Definition: StorageSite.h:73
GhostArrayMap _sendValuesCRMtrx
Definition: CRMatrix.h:1744
int getTag() const
Definition: StorageSite.h:84
int getGatherProcID() const
Definition: StorageSite.h:83
GhostArrayMap _recvValuesCRMtrx
Definition: CRMatrix.h:1745
const CRConnectivity & _conn
Definition: CRMatrix.h:1718
int get_request_size()
Definition: CRMatrix.h:1525
map< const StorageSite *, shared_ptr< Array< int > > > ScatterMap
Definition: StorageSite.h:23
virtual void * getData() const =0
map< const StorageSite *, shared_ptr< Array< int > > > GatherMap
Definition: StorageSite.h:24
const StorageSite & getRowSite() const
template<class T_Diag, class T_OffDiag, class X>
virtual void CRMatrix< T_Diag, T_OffDiag, X >::transpose ( )
inlinevirtual

Reimplemented from Matrix.

Definition at line 241 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_col, CRMatrix< T_Diag, T_OffDiag, X >::_conn, CRMatrix< T_Diag, T_OffDiag, X >::_offDiag, CRMatrix< T_Diag, T_OffDiag, X >::_row, StorageSite::getCount(), and CRConnectivity::getRowSite().

242  {
243  const int nRows = _conn.getRowSite().getCount();
244  for(int i=0; i<nRows; i++)
245  {
246  for (int nb = _row[i]; nb<_row[i+1]; nb++)
247  {
248  const int j = _col[nb];
249  bool found = false;
250 
251  for (int nb2 = _row[j]; nb2<_row[j+1]; nb2++)
252  {
253  if (_col[nb2] == i)
254  {
255  const OffDiag coeffIJ = _offDiag[nb];
256  _offDiag[nb] = _offDiag[nb2];
257  _offDiag[nb2] = coeffIJ;
258 
259  found = true;
260  }
261  }
262  if (!found)
263  throw CException("invalid connectivity for transpose");
264  }
265  }
266  }
const Array< int > & _col
Definition: CRMatrix.h:1720
Array< OffDiag > _offDiag
Definition: CRMatrix.h:1722
const Array< int > & _row
Definition: CRMatrix.h:1719
const CRConnectivity & _conn
Definition: CRMatrix.h:1718
int getCount() const
Definition: StorageSite.h:39
const StorageSite & getRowSite() const
T_OffDiag OffDiag
Definition: CRMatrix.h:94
template<class T_Diag, class T_OffDiag, class X>
void CRMatrix< T_Diag, T_OffDiag, X >::upperSolve ( XArray x,
const XArray y 
) const
inlineprivate

Definition at line 1697 of file CRMatrix.h.

References CRMatrix< T_Diag, T_OffDiag, X >::_conn, CRMatrix< T_Diag, T_OffDiag, X >::_iluCoeffsPtr, CRMatrix< T_Diag, T_OffDiag, X >::_iluConnPtr, CRMatrix< T_Diag, T_OffDiag, X >::_iluDiagIndexPtr, CRConnectivity::getRowSite(), and StorageSite::getSelfCount().

Referenced by CRMatrix< T_Diag, T_OffDiag, X >::iluSolve().

1698  {
1699  const IntArray& iluRow = _iluConnPtr->getRow();
1700  const IntArray& iluCol = _iluConnPtr->getCol();
1701  const IntArray& iluDiagIndex = *_iluDiagIndexPtr;
1702  const DiagArray& iluCoeffs = *_iluCoeffsPtr;
1703 
1704  const int nRows = _conn.getRowSite().getSelfCount();
1705 
1706  for ( int j = nRows-1; j >= 0; j-- )
1707  {
1708  X xj = y[j];
1709  for ( int k = iluDiagIndex[j]+1; k <iluRow[j+1]; k++ )
1710  {
1711  xj -= iluCoeffs[k] * x[ iluCol[k] ];
1712  }
1713  x[j] = iluCoeffs[ iluDiagIndex[j] ]*xj;
1714  }
1715  }
int getSelfCount() const
Definition: StorageSite.h:40
Array< int > IntArray
Definition: CRMatrix.h:96
Array< Diag > DiagArray
Definition: CRMatrix.h:95
const CRConnectivity & _conn
Definition: CRMatrix.h:1718
IntArrayPtr _iluDiagIndexPtr
Definition: CRMatrix.h:1733
shared_ptr< CRConnectivity > _iluConnPtr
Definition: CRMatrix.h:1731
const StorageSite & getRowSite() const
DiagArrayPtr _iluCoeffsPtr
Definition: CRMatrix.h:1736

Member Data Documentation

template<class T_Diag, class T_OffDiag, class X>
const CRConnectivity& CRMatrix< T_Diag, T_OffDiag, X >::_conn
private

Definition at line 1718 of file CRMatrix.h.

Referenced by CRMatrix< T_Diag, T_OffDiag, X >::compute_ILU0(), CRMatrix< T_Diag, T_OffDiag, X >::computeResidual(), CRMatrix< T_Diag, T_OffDiag, X >::createCoarsening(), CRMatrix< T_Diag, T_OffDiag, X >::createScatterGatherCountsBuffer(), CRMatrix< T_Diag, T_OffDiag, X >::createScatterGatherIndicesBuffer(), CRMatrix< T_Diag, T_OffDiag, X >::createScatterGatherValuesBBuffer(), CRMatrix< T_Diag, T_OffDiag, X >::createScatterGatherValuesCRMtrxBuffer(), CRMatrix< T_Diag, T_OffDiag, X >::eliminateBoundaryEquations(), CRMatrix< T_Diag, T_OffDiag, X >::eliminateRow(), CRMatrix< T_Diag, T_OffDiag, X >::eliminateRowGhost(), CRMatrix< T_Diag, T_OffDiag, X >::forwardGS(), CRMatrix< T_Diag, T_OffDiag, X >::get_request_size(), CRMatrix< T_Diag, T_OffDiag, X >::getConnectivity(), CRMatrix< T_Diag, T_OffDiag, X >::getPairWiseAssembler(), CRMatrix< T_Diag, T_OffDiag, X >::Jacobi(), CRMatrix< T_Diag, T_OffDiag, X >::lowerSolve(), CRMatrix< T_Diag, T_OffDiag, X >::multiply(), CRMatrix< T_Diag, T_OffDiag, X >::multiplyAndAdd(), CRMatrix< T_Diag, T_OffDiag, X >::quadProduct(), CRMatrix< T_Diag, T_OffDiag, X >::reverseGS(), CRMatrix< T_Diag, T_OffDiag, X >::solveBoundary(), CRMatrix< T_Diag, T_OffDiag, X >::spikeSolve(), CRMatrix< T_Diag, T_OffDiag, X >::syncCounts(), CRMatrix< T_Diag, T_OffDiag, X >::syncIndices(), CRMatrix< T_Diag, T_OffDiag, X >::syncValuesB(), CRMatrix< T_Diag, T_OffDiag, X >::syncValuesCRMtrx(), CRMatrix< T_Diag, T_OffDiag, X >::transpose(), and CRMatrix< T_Diag, T_OffDiag, X >::upperSolve().

template<class T_Diag, class T_OffDiag, class X>
map<int,int> CRMatrix< T_Diag, T_OffDiag, X >::_ghostCellBoundayMap
private

Definition at line 1748 of file CRMatrix.h.

template<class T_Diag, class T_OffDiag, class X>
DiagArrayPtr CRMatrix< T_Diag, T_OffDiag, X >::_iluCoeffsPtr
mutableprivate
template<class T_Diag, class T_OffDiag, class X>
shared_ptr<CRConnectivity> CRMatrix< T_Diag, T_OffDiag, X >::_iluConnPtr
mutableprivate
template<class T_Diag, class T_OffDiag, class X>
IntArrayPtr CRMatrix< T_Diag, T_OffDiag, X >::_iluDiagIndexPtr
mutableprivate
template<class T_Diag, class T_OffDiag, class X>
PairWiseAssemblerMap CRMatrix< T_Diag, T_OffDiag, X >::_pairWiseAssemblers
private
template<class T_Diag, class T_OffDiag, class X>
GhostArrayMap CRMatrix< T_Diag, T_OffDiag, X >::_recvIndices
private
template<class T_Diag, class T_OffDiag, class X>
GhostArrayMap CRMatrix< T_Diag, T_OffDiag, X >::_recvValuesB
private
template<class T_Diag, class T_OffDiag, class X>
GhostArrayMap CRMatrix< T_Diag, T_OffDiag, X >::_recvValuesCRMtrx
private
template<class T_Diag, class T_OffDiag, class X>
GhostArrayMap CRMatrix< T_Diag, T_OffDiag, X >::_sendIndices
private
template<class T_Diag, class T_OffDiag, class X>
GhostArrayMap CRMatrix< T_Diag, T_OffDiag, X >::_sendValuesB
private
template<class T_Diag, class T_OffDiag, class X>
GhostArrayMap CRMatrix< T_Diag, T_OffDiag, X >::_sendValuesCRMtrx
private
template<class T_Diag, class T_OffDiag, class X>
shared_ptr<T_SpikeMtrx> CRMatrix< T_Diag, T_OffDiag, X >::_spikeMtrx
mutableprivate

Definition at line 1738 of file CRMatrix.h.

Referenced by CRMatrix< T_Diag, T_OffDiag, X >::spikeSolve().


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