5 #ifndef _CRMATRIXRECT_H_
6 #define _CRMATRIXRECT_H_
27 template<
class T_Coeff,
class X,
class B>
69 _coeffs[_pairToCol[np][1]] += c;
75 _coeffs[_pairToCol[np][1]] += c10;
131 for(
int nr=0; nr<nRows; nr++)
133 y[nr] =
_diag[nr]*x[nr];
134 for (
int nb =
_row[nr]; nb<
_row[nr+1]; nb++)
136 const int j =
_col[nb];
153 for(
int nr=0; nr<nRows; nr++)
155 y[nr] +=
_diag[nr]*x[nr];
156 for (
int nb =
_row[nr]; nb<
_row[nr+1]; nb++)
158 const int j =
_col[nb];
186 shared_ptr<CRConnectivity>
193 dynamic_cast<const Array<int>&
>(gCoarseIndex);
195 const int nCoarseRows = coarseRowSite.
getCount();
197 shared_ptr<CRConnectivity> coarseCR(
new CRConnectivity(coarseRowSite,coarseColSite));
200 coarseCR->initCount();
204 coarseCounted =
false;
206 for(
int nrCoarse=0; nrCoarse<nCoarseRows; nrCoarse++)
208 const int nFine = coarseToFine.
getCount(nrCoarse);
209 for(
int nfr=0; nfr<nFine; nfr++)
211 const int nrFine = coarseToFine(nrCoarse,nfr);
213 for (
int nb =
_row[nrFine]; nb<
_row[nrFine+1]; nb++)
215 const int nc =
_col[nb];
216 const int ncCoarse = coarseIndex[nc];
217 if (ncCoarse>=0 && nrCoarse!=ncCoarse && !coarseCounted[ncCoarse])
219 coarseCounted[ncCoarse] =
true;
220 coarseCR->addCount(nrCoarse,1);
226 for(
int nfr=0; nfr<nFine; nfr++)
228 const int nrFine = coarseToFine(nrCoarse,nfr);
230 for (
int nb =
_row[nrFine]; nb<
_row[nrFine+1]; nb++)
232 const int nc =
_col[nb];
233 const int ncCoarse = coarseIndex[nc];
235 coarseCounted[ncCoarse] =
false;
240 coarseCR->finishCount();
242 for(
int nrCoarse=0; nrCoarse<nCoarseRows; nrCoarse++)
244 const int nFine = coarseToFine.
getCount(nrCoarse);
245 for(
int nfr=0; nfr<nFine; nfr++)
247 const int nrFine = coarseToFine(nrCoarse,nfr);
249 for (
int nb =
_row[nrFine]; nb<
_row[nrFine+1]; nb++)
251 const int nc =
_col[nb];
252 const int ncCoarse = coarseIndex[nc];
253 if (ncCoarse>=0 && nrCoarse!=ncCoarse && !coarseCounted[ncCoarse])
255 coarseCounted[ncCoarse] =
true;
256 coarseCR->add(nrCoarse,ncCoarse);
262 for(
int nfr=0; nfr<nFine; nfr++)
264 const int nrFine = coarseToFine(nrCoarse,nfr);
266 for (
int nb =
_row[nrFine]; nb<
_row[nrFine+1]; nb++)
268 const int nc =
_col[nb];
269 const int ncCoarse = coarseIndex[nc];
271 coarseCounted[ncCoarse] =
false;
276 coarseCR->finishAdd();
293 dynamic_cast<const Array<int>&
>(gCoarseIndex);
295 const int nCoarseRows = coarseConnectivity.
getRowDim();
297 shared_ptr<CRMatrixRect> coarseMatrix(
new CRMatrixRect(coarseConnectivity));
306 coarseOffDiag.
zero();
312 for(
int nrCoarse=0; nrCoarse<nCoarseRows; nrCoarse++)
316 for(
int nb=coarseConnRow[nrCoarse]; nb<coarseConnRow[nrCoarse+1]; nb++)
317 coarseCoeffPos[coarseConnCol[nb]] = nb;
320 const int nFine = coarseToFine.
getCount(nrCoarse);
321 for(
int nfr=0; nfr<nFine; nfr++)
323 const int nrFine = coarseToFine(nrCoarse,nfr);
325 coarseDiag[nrCoarse] +=
_diag[nrFine];
327 for (
int nb =
_row[nrFine]; nb<
_row[nrFine+1]; nb++)
329 const int nc =
_col[nb];
330 const int ncCoarse = coarseIndex[nc];
332 if (ncCoarse<0)
continue;
334 if (nrCoarse!=ncCoarse)
336 const int pos = coarseCoeffPos[ncCoarse];
341 coarseDiag[nrCoarse] +=
_offDiag[nb];
const Array< int > & getCol() const
int getCount(const int i) const
const Array< int > & getRow() const
const CRConnectivity & getConnectivity() const
virtual void multiplyAndAdd(IContainer &yB, const IContainer &xB) const
virtual void initAssembly()
virtual void multiply(IContainer &yB, const IContainer &xB) const
PairWiseAssembler(Array< OffDiag > &coeffs, const Array< Vector< int, 2 > > &pairToCol)
DEFINE_TYPENAME("CRMatrixRect<"+NumTypeTraits< Coeff >::getTypeName()+","+NumTypeTraits< X >::getTypeName()+","+NumTypeTraits< B >::getTypeName()+">")
const CRConnectivity & _conn
Array< Coeff > & getDiag()
void addCoeff10(const int np, const OffDiag &c10)
Array< OffDiag > & _coeffs
OffDiag & getCoeff01(const int np)
const Array< int > & _row
const Array< int > & _col
const Array< Vector< int, 2 > > & _pairToCol
OffDiag & getCoeff10(const int np)
PairWiseAssembler & getPairWiseAssembler(const CRConnectivity &pairs)
Array< Coeff > & getOffDiag()
void addCoeffsSymmetric(const int np, const OffDiag &c)
PairWiseAssemblerMap _pairWiseAssemblers
CRMatrixRect(const CRConnectivity &conn)
virtual shared_ptr< Matrix > createCoarseMatrix(const IContainer &gCoarseIndex, const CRConnectivity &coarseToFine, const CRConnectivity &coarseConnectivity)
shared_ptr< CRConnectivity > createCoarseConnectivity(const IContainer &gCoarseIndex, const CRConnectivity &coarseToFine, const StorageSite &coarseRowSite, const StorageSite &coarseColSite)
const StorageSite & getRowSite() const
void addCoeffs(const int np, const OffDiag &c01, const OffDiag &c10)
void addCoeff01(const int np, const OffDiag &c01)
Array< Coeff > CoeffArray
map< const CRConnectivity *, PairWiseAssembler * > PairWiseAssemblerMap
const PairToColMapping & getPairToColMapping(const CRConnectivity &pairs) const
const Array< Coeff > & getDiag() const
const Array< Coeff > & getOffDiag() const