36 template<
class T_Diag,
class T_OffDiag>
55 const int rowDim = connectivity.
getRowDim();
57 for(
int i=0; i<rowDim; i++)
60 flatCoeffs[fp] = diag[i];
62 for(
int jp=myRow[i]; jp<myRow[i+1]; jp++)
64 const int j = myCol[jp];
68 flatCoeffs[fp] = offDiag[jp];
86 template<
class T_Diag,
class T_OffDiag,
class X>
106 typedef pair<const StorageSite*, const StorageSite*>
EntryIndex;
139 _coeffs[_pairToCol[np][1]] += c;
145 _coeffs[_pairToCol[np][1]] += c10;
206 for(
int nr=0; nr<nRows; nr++)
208 y[nr] =
_diag[nr]*x[nr];
209 for (
int nb =
_row[nr]; nb<
_row[nr+1]; nb++)
211 const int j =
_col[nb];
229 for(
int nr=0; nr<nRows; nr++)
231 y[nr] +=
_diag[nr]*x[nr];
232 for (
int nb =
_row[nr]; nb<
_row[nr+1]; nb++)
234 const int j =
_col[nb];
244 for(
int i=0; i<nRows; i++)
246 for (
int nb =
_row[i]; nb<
_row[i+1]; nb++)
248 const int j =
_col[nb];
251 for (
int nb2 = _row[j]; nb2<_row[j+1]; nb2++)
263 throw CException(
"invalid connectivity for transpose");
273 virtual shared_ptr<ArrayBase>
281 for(
int nr=0; nr<nRows; nr++)
283 X sum_n =
_diag[nr]*x[nr];
284 for (
int nb =
_row[nr]; nb<
_row[nr+1]; nb++)
286 const int j =
_col[nb];
295 return shared_ptr<ArrayBase>(p);
311 for(
int nr=0; nr<nRows; nr++)
314 for (
int nb =
_row[nr]; nb<
_row[nr+1]; nb++)
316 const int j =
_col[nb];
319 x[nr] = -sum/
_diag[nr];
336 for(
int nr=nRows-1; nr>=0; nr--)
339 for (
int nb =
_row[nr]; nb<
_row[nr+1]; nb++)
341 const int j =
_col[nb];
344 x[nr] = -sum/
_diag[nr];
357 const XArray& xold =
dynamic_cast<const XArray&
>(xoldB);
363 for(
int nr=0; nr<nRows; nr++)
366 for (
int nb =
_row[nr]; nb<
_row[nr+1]; nb++)
368 const int j =
_col[nb];
371 xnew[nr] = -sum/
_diag[nr];
379 shared_ptr<XArray> y = dynamic_pointer_cast<
XArray>(x.
newClone());
395 shared_ptr<XArray> y = dynamic_pointer_cast<
XArray>(x.newClone());
416 for(
int nr=0; nr<nRows; nr++)
419 r[nr] = b[nr] +
_diag[nr]*x[nr];
420 for (
int nb =
_row[nr]; nb<
_row[nr+1]; nb++)
422 const int j =
_col[nb];
443 for(
int nr=nRowsInterior; nr<nRowsExtra; nr++)
447 for (
int nb =
_row[nr]; nb<
_row[nr+1]; nb++)
449 const int j =
_col[nb];
452 x[nr] = -sum/
_diag[nr];
469 const double weightRatioThreshold)
485 for(
int nr=0; nr<nRows; nr++)
495 int colMaxGrouped=-1;
496 int colMaxUngrouped=-1;
502 coarseIndex[current] = nCoarseRows;
504 for(nGrouped=1; nGrouped<groupSize; nGrouped++)
508 double maxWeightUngrouped = 0;
509 double maxWeightGrouped = 0;
511 colMaxUngrouped = -1;
513 for(
int nb=
_row[current]; nb<
_row[current+1]; nb++)
515 const int nc =
_col[nb];
520 double diagMeasure0 =
522 double diagMeasure1 =
524 double coeffMeasure =
527 double thisWeight =
fabs(coeffMeasure /
528 max(diagMeasure0,diagMeasure1));
530 if (coarseIndex[nc] == -1)
532 if (colMaxUngrouped == -1 || (thisWeight > maxWeightUngrouped))
534 colMaxUngrouped = nc;
535 maxWeightUngrouped = thisWeight;
538 else if (coarseIndex[nc] != coarseIndex[nr])
540 if (colMaxGrouped == -1 || (thisWeight > maxWeightGrouped))
543 maxWeightGrouped = thisWeight;
553 if ( (colMaxUngrouped != -1) &&
554 (colMaxGrouped == -1 ||
555 (maxWeightUngrouped > weightRatioThreshold*maxWeightGrouped)))
557 coarseIndex[colMaxUngrouped] = coarseIndex[current];
558 coarseCount[coarseIndex[current]]++;
560 current = colMaxUngrouped;
571 if (nGrouped > 1 || colMaxGrouped == -1 ||
572 coarseCount[coarseIndex[colMaxGrouped]] > groupSize+2)
574 coarseCount[coarseIndex[nr]]++;
580 coarseIndex[nr] = coarseIndex[colMaxGrouped];
581 coarseCount[coarseIndex[colMaxGrouped]]++;
597 shared_ptr<CRConnectivity>
607 shared_ptr<CRConnectivity> coarseCR(
new CRConnectivity(coarseRowSite,coarseColSite));
610 coarseCR->initCount();
614 coarseCounted =
false;
616 for(
int nrCoarse=0; nrCoarse<nCoarseRows; nrCoarse++)
618 const int nFine = coarseToFine.
getCount(nrCoarse);
619 for(
int nfr=0; nfr<nFine; nfr++)
621 const int nrFine = coarseToFine(nrCoarse,nfr);
622 for (
int nb =
_row[nrFine]; nb<
_row[nrFine+1]; nb++)
624 const int nc =
_col[nb];
625 const int ncCoarse = coarseIndex[nc];
628 if (ncCoarse>=0 && nrCoarse!=ncCoarse && !coarseCounted[ncCoarse])
630 coarseCounted[ncCoarse] =
true;
631 coarseCR->addCount(nrCoarse,1);
637 for(
int nfr=0; nfr<nFine; nfr++)
639 const int nrFine = coarseToFine(nrCoarse,nfr);
641 for (
int nb =
_row[nrFine]; nb<
_row[nrFine+1]; nb++)
643 const int nc =
_col[nb];
644 const int ncCoarse = coarseIndex[nc];
646 coarseCounted[ncCoarse] =
false;
651 coarseCR->finishCount();
653 for(
int nrCoarse=0; nrCoarse<nCoarseRows; nrCoarse++)
655 const int nFine = coarseToFine.
getCount(nrCoarse);
656 for(
int nfr=0; nfr<nFine; nfr++)
658 const int nrFine = coarseToFine(nrCoarse,nfr);
660 for (
int nb =
_row[nrFine]; nb<
_row[nrFine+1]; nb++)
662 const int nc =
_col[nb];
663 const int ncCoarse = coarseIndex[nc];
664 if (ncCoarse>=0 && nrCoarse!=ncCoarse && !coarseCounted[ncCoarse])
666 coarseCounted[ncCoarse] =
true;
667 coarseCR->add(nrCoarse,ncCoarse);
673 for(
int nfr=0; nfr<nFine; nfr++)
675 const int nrFine = coarseToFine(nrCoarse,nfr);
677 for (
int nb =
_row[nrFine]; nb<
_row[nrFine+1]; nb++)
679 const int nc =
_col[nb];
680 const int ncCoarse = coarseIndex[nc];
682 coarseCounted[ncCoarse] =
false;
688 coarseCR->finishAdd();
705 const int nCoarseRows = coarseConnectivity.
getRowDim();
707 shared_ptr<CRMatrix> coarseMatrix(
new CRMatrix(coarseConnectivity));
716 coarseOffDiag.
zero();
722 for(
int nrCoarse=0; nrCoarse<nCoarseRows; nrCoarse++)
726 for(
int nb=coarseConnRow[nrCoarse]; nb<coarseConnRow[nrCoarse+1]; nb++)
727 coarseCoeffPos[coarseConnCol[nb]] = nb;
730 const int nFine = coarseToFine.
getCount(nrCoarse);
731 for(
int nfr=0; nfr<nFine; nfr++)
733 const int nrFine = coarseToFine(nrCoarse,nfr);
735 coarseDiag[nrCoarse] +=
_diag[nrFine];
737 for (
int nb =
_row[nrFine]; nb<
_row[nrFine+1]; nb++)
739 const int nc =
_col[nb];
740 const int ncCoarse = coarseIndex[nc];
742 if (ncCoarse<0)
continue;
744 if (nrCoarse!=ncCoarse)
746 const int pos = coarseCoeffPos[ncCoarse];
751 coarseDiag[nrCoarse] +=
_offDiag[nb];
767 const map<int,IntArrayPtr>& localToGlobalMap = mergeLS.getLocalToGlobal();
769 const Array<int>& selfCounts = mergeLS.getSelfCounts();
771 const map< int, IntArrayPtr >& rowMap = mergeLS.getLocalConnRow();
772 const map< int, IntArrayPtr >& colMap = mergeLS.getLocalConnCol();
773 const vector< map<int,int> >& gatherIDsLocalToGlobal = mergeLS.getGatherIDsLocalToGlobal();
775 const map<int, ArrayDblePtr> & diagMap = mergeLS.getDiag();
776 const map<int, ArrayDblePtr> & offDiagMap = mergeLS.getOffDiag();
778 const set<int>& group = mergeLS.getGroup();
780 shared_ptr<CRMatrix> mergeMatrix(
new CRMatrix(conn) );
781 mergeMatrix->initAssembly();
787 foreach (
const set<int>::value_type proc_id, group ){
789 const Array<double>& offDiag = *offDiagMap.find(proc_id)->second;
791 const Array<int>& localToGlobal = *localToGlobalMap.find(proc_id)->second;
792 const map<int,int>& gatherIDsMap = gatherIDsLocalToGlobal[proc_id];
794 const Array<int>& row = *rowMap.find(proc_id)->second;
795 const Array<int>& col = *colMap.find(proc_id)->second;
797 for (
int i = 0; i < selfCounts[proc_id]; i++ ){
798 int glbl_indx = localToGlobal[i];
799 mergeDiag[glbl_indx] = diag[i];
802 for (
int i = 0; i < selfCounts[proc_id]; i++ ){
803 int global_indx = localToGlobal[i];
804 for (
int np = row[i]; np < row[i+1]; np++ ){
805 int local_j = col[np];
810 if ( local_j < selfCounts[proc_id] )
811 global_j = localToGlobal[ local_j ];
813 global_j = gatherIDsMap.find(local_j)->second;
816 for (
int npg = mergeRow[global_indx]; npg < mergeRow[global_indx+1]; npg++ ){
817 if ( mergeCol[npg] == global_j ){
818 mergeOffDiag[npg] = offDiag[np];
838 for (
int nnb =
_row[i]; nnb<
_row[i+1]; nnb++)
848 for (
int nnb =
_row[i]; nnb<
_row[i+1]; nnb++)
889 for (
int nb =
_row[nr]; nb<
_row[nr+1]; nb++)
906 const bool isInterior = (j<nRowsInterior);
908 if (isInterior)
return;
912 for (
int nb =
_row[j]; nb<
_row[j+1]; nb++)
914 const int i =
_col[nb];
921 for (
int nb2 = _row[j]; nb2<_row[j+1]; nb2++)
923 const int k =
_col[nb2];
935 _diag[i] -= a_ij*(a_jk/a_jj);
938 b[i] -= a_ij*(b[j]/a_jj);
959 foreach(
const StorageSite::GatherMap::value_type& mpos, gatherMap){
970 for (
int i = 1; i < recv_counts.
getLength()+1; i++ ){
971 row[i] = row[i-1] + recv_counts[i-1] - 1;
976 for (
int i = 1; i < recv_counts.
getLength(); i++ ){
977 boundaryPtr[i] = boundaryPtr[i-1] + recv_counts[i-1];
984 for (
int i=0; i<recv_counts.
getLength(); i++ ){
986 for (
int j=1; j<recv_counts[i]; j++ ){
987 col[jj] = recv_indices[indx];
988 offDiag[jj] = recv_values_crmtrx[indx];
994 for (
int rc = 0; rc < recv_counts.
getLength(); rc++ ){
995 const int pIndx = boundaryPtr[rc];
996 const int j = recv_indices[pIndx];
997 const OffDiag& a_jj = recv_values_crmtrx[pIndx];
999 for (
int nb = row[rc]; nb<row[rc+1]; nb++)
1001 const int i = col[nb];
1002 if ( i < nRowsInterior ){
1007 for (
int nb2 = row[rc]; nb2<row[rc+1]; nb2++)
1009 const int k = col[nb2];
1010 const OffDiag& a_jk = offDiag[nb2];
1015 a_ik -= a_ij*(a_jk/a_jj);
1018 _diag[i] -= a_ij*(a_jk/a_jj);
1020 b[i] -= a_ij*(recv_values_b[rc]/a_jj);
1030 cout <<
"coeff (" << i <<
"," << i <<
") = " <<
_diag[i] << endl;
1032 for (
int nb =
_row[i]; nb<
_row[i+1]; nb++)
1034 const int j =
_col[nb];
1035 cout <<
"coeff (" << i <<
"," << j <<
") = " <<
_offDiag[nb] << endl;
1042 const bool explicitMode=
false)
1044 for (
int nb =
_row[j]; nb<
_row[j+1]; nb++)
1046 const int i =
_col[nb];
1049 b[i] += a_ij*delta_j;
1070 for(
int nr=nRowsInterior; nr<nRowsExtra; nr++)
1122 foreach(
const StorageSite::ScatterMap::value_type& mpos, scatterMap){
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];
1132 cellCellsCount.push_back(
_conn.
getCount( scatterArray[i] )+1 );
1142 for(
int i = 0; i < boundaryCount; i++ ){
1143 sendArray[i] = cellCellsCount[i];
1148 foreach(
const StorageSite::GatherMap::value_type& mpos, gatherMap){
1163 MPI::Request request_send[ request_size ];
1164 MPI::Request request_recv[ request_size ];
1169 foreach(
const StorageSite::ScatterMap::value_type& mpos, scatterMap){
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 );
1186 foreach(
const StorageSite::GatherMap::value_type& mpos, gatherMap){
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 );
1199 request_recv[indxRecv++] =
1200 MPI::COMM_WORLD.Irecv( recvArray.
getData(), recvArray.
getDataSize(), MPI::BYTE, from_where, mpi_tag );
1207 MPI::Request::Waitall( count, request_recv );
1208 MPI::Request::Waitall( count, request_send );
1220 foreach(
const StorageSite::ScatterMap::value_type& mpos, scatterMap){
1222 const Array<int>& scatterArray = *mpos.second;
1228 for (
int i = 0; i < send_counts.
getLength(); i++ ){
1229 sendSize += send_counts[i];
1235 for(
int i = 0; i < scatterArray.
getLength(); i++ ){
1236 const int cellID = scatterArray[i];
1238 sendArray[indx++] = localToGlobal[cellID];
1240 sendArray[indx] = localToGlobal[
_conn(cellID,j) ];
1248 foreach(
const StorageSite::GatherMap::value_type& mpos, gatherMap){
1253 for (
int i = 0; i < recvCounts.
getLength(); i++ ){
1254 recvSize += recvCounts[i];
1273 MPI::Request request_send[ request_size ];
1274 MPI::Request request_recv[ request_size ];
1279 foreach(
const StorageSite::ScatterMap::value_type& mpos, scatterMap){
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 );
1295 foreach(
const StorageSite::GatherMap::value_type& mpos, gatherMap){
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 );
1308 MPI::Request::Waitall( count, request_recv );
1309 MPI::Request::Waitall( count, request_send );
1312 #ifndef FVM_PARALLEL
1317 const map<int,int>& globalToLocal =
_conn. getGlobalToLocalMapper();
1318 foreach(
const StorageSite::GatherMap::value_type& mpos, gatherMap){
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;
1336 foreach(
const StorageSite::ScatterMap::value_type& mpos, scatterMap){
1338 const Array<int>& scatterArray = *mpos.second;
1344 for (
int i = 0; i < send_counts.
getLength(); i++ ){
1345 sendSize += send_counts[i];
1352 for(
int i = 0; i < scatterArray.
getLength(); i++ ){
1353 const int ii = scatterArray[i];
1357 const int jj =
_conn(ii,j);
1358 valueArray[indx] =
getCoeff(ii,jj);
1366 foreach(
const StorageSite::GatherMap::value_type& mpos, gatherMap){
1372 for (
int i = 0; i < recvCounts.
getLength(); i++ ){
1373 recvSize += recvCounts[i];
1391 MPI::Request request_send[ request_size ];
1392 MPI::Request request_recv[ request_size ];
1397 foreach(
const StorageSite::ScatterMap::value_type& mpos, scatterMap){
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 );
1413 foreach(
const StorageSite::GatherMap::value_type& mpos, gatherMap){
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 );
1427 MPI::Request::Waitall( count, request_recv );
1428 MPI::Request::Waitall( count, request_send );
1439 foreach(
const StorageSite::ScatterMap::value_type& mpos, scatterMap){
1441 const Array<int>& scatterArray = *mpos.second;
1452 for(
int i = 0; i < scatterArray.
getLength(); i++ ){
1453 const int ii = scatterArray[i];
1455 bArray[indx++] = B[ii];
1461 foreach(
const StorageSite::GatherMap::value_type& mpos, gatherMap){
1483 MPI::Request request_send[ request_size ];
1484 MPI::Request request_recv[ request_size ];
1489 foreach(
const StorageSite::ScatterMap::value_type& mpos, scatterMap){
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 );
1505 foreach(
const StorageSite::GatherMap::value_type& mpos, gatherMap){
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 );
1519 MPI::Request::Waitall( count, request_recv );
1520 MPI::Request::Waitall( count, request_send );
1530 foreach(
const StorageSite::ScatterMap::value_type& mpos, scatterMap){
1561 for(
int nr=0; nr<nRows; nr++)
1565 for(
int nb=
_row[nr]; nb<
_row[nr+1]; nb++)
1568 if (
_col[nb] < nRows)
1583 for(
int nr=0; nr<nRows; nr++)
1586 for(
int nb=
_row[nr]; nb<
_row[nr+1]; nb++)
1588 const int j =
_col[nb];
1589 if (j < nRows && j < nr)
1591 const int pos = iluConn.
add(nr,j);
1598 const int pos = iluConn.
add(nr,nr);
1599 iluCoeffs[pos] =
_diag[nr];
1600 iluDiagIndex[nr] = pos;
1603 for(
int nb=_row[nr]; nb<_row[nr+1]; nb++)
1605 const int j =
_col[nb];
1606 if (j < nRows && j > nr)
1608 const int pos = iluConn.
add(nr,j);
1633 for (
int k = 0; k < nRows; k++ )
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;
1643 int jrow = iluCol[j];
1646 const Diag t1 = iluCoeffs[j] * iluCoeffs[ uptr[jrow] ];
1649 for (
int jj = uptr[jrow]+1; jj < iluRow[jrow+1]; jj++ )
1651 int jw = iw[ iluCol[jj] ];
1653 iluCoeffs[jw] -= t1 * iluCoeffs[jj];
1666 iluCoeffs[j] = unity / iluCoeffs[j];
1668 for (
int i = j1; i < j2; i++ )
1669 iw[ iluCol[i] ] = 0;
1685 for (
int j = 0; j < nRows; j++)
1688 for (
int k = iluRow[j]; k < iluDiagIndex[j]; k++ )
1690 yj -= iluCoeffs[k] * y[ iluCol[k] ];
1706 for (
int j = nRows-1; j >= 0; j-- )
1709 for (
int k = iluDiagIndex[j]+1; k <iluRow[j+1]; k++ )
1711 xj -= iluCoeffs[k] * x[ iluCol[k] ];
1713 x[j] = iluCoeffs[ iluDiagIndex[j] ]*xj;
1763 template<
class T,
int N>
void * getOffDiagData() const
const Array< int > & getCol() const
pair< const StorageSite *, const StorageSite * > EntryIndex
int getCount(const int i) const
GhostArrayMap _sendCounts
X DiagToOffDiag(const X &x)
DEFINE_TYPENAME("CRMatrix<"+NumTypeTraits< Diag >::getTypeName()+","+NumTypeTraits< OffDiag >::getTypeName()+","+NumTypeTraits< X >::getTypeName()+">")
virtual int getDataSize() const =0
const Array< int > & getRow() const
CRMatrix< T, T, T > T_Matrix
virtual void Jacobi(IContainer &xnewB, const IContainer &xoldB, const IContainer &bB) const
void createScatterGatherIndicesBuffer()
shared_ptr< T_SpikeMtrx > _spikeMtrx
virtual void initAssembly()
shared_ptr< Array< int > > IntArrayPtr
void upperSolve(XArray &x, const XArray &y) const
virtual shared_ptr< ArrayBase > quadProduct(const IContainer &xB) const
const Array< int > & _col
PairWiseAssembler(Array< OffDiag > &coeffs, const Array< Vector< int, 2 > > &pairToCol)
void syncBndryCoeffs(const Array< X > &b)
CRMatrix< T_DiagTensor, T_DiagTensor, T_Vector > T_Matrix
virtual void eliminateBoundaryEquations(IContainer &bB)
const GatherMap & getGatherMapLevel1() const
OffDiag & getCoeff(const int i, const int j)
shared_ptr< Array< Diag > > DiagArrayPtr
GhostArrayMap _sendIndices
Array< bool > _isBoundary
const ScatterMap & getScatterMapLevel1() const
bool hasCoeff(const int i, const int j)
void compute_ILU0() const
double max(double x, double y)
OffDiag & getCoeff10(const int np)
void addCoeff10(const int np, const OffDiag &c10)
void eliminateRow(const int j, Array< X > &b)
const Array< OffDiag > & getOffDiag() const
Array< Diag > & getDiag()
void addCoeffsSymmetric(const int np, const OffDiag &c)
virtual int createCoarsening(IContainer &gCoarseIndex, const int groupSize, const double weightRatioThreshold)
CRMatrix(const CRConnectivity &conn)
void addCoeffs(const int np, const OffDiag &c01, const OffDiag &c10)
GhostArrayMap _recvCounts
Array< OffDiag > _offDiag
virtual const CRConnectivity & getConnectivity() const
Array< OffDiag > OffDiagArray
GhostArrayMap _sendValuesCRMtrx
int getCoeffPosition(const int i, const int j) const
GhostArrayMap _recvValuesB
Array< OffDiag > & getOffDiag()
const Array< int > & getLocalToGlobalMap() const
virtual void printRow(const int i) const
void * getDiagData() const
virtual int getDataSize() const
void eliminateRowGhost(Array< X > &b)
const Array< Diag > & getDiag() const
const Array< Vector< int, 2 > > & _pairToCol
virtual void * getData() const
shared_ptr< Matrix > createCoarseMatrix(const IContainer &gCoarseIndex, const CRConnectivity &coarseToFine, const CRConnectivity &coarseConnectivity)
int getDiagDataSize() const
int getGatherProcID() const
virtual void forwardGS(IContainer &xB, IContainer &bB, IContainer &) const
map< EntryIndex, shared_ptr< ArrayBase > > GhostArrayMap
virtual void solveBoundary(IContainer &xB, IContainer &bB, IContainer &) const
const Array< int > & _row
GhostArrayMap _recvValuesCRMtrx
int getOffDiagDataSize() const
void createScatterGatherValuesCRMtrxBuffer()
const CRConnectivity & _conn
map< int, int > _ghostCellBoundayMap
GhostArrayMap _recvIndices
virtual void iluSolve(IContainer &xB, const IContainer &bB, const IContainer &) const
const StorageSite & getColSite() const
int getCountLevel1() const
OffDiag & getCoeff01(const int np)
virtual shared_ptr< IContainer > newClone() const
map< const StorageSite *, shared_ptr< Array< int > > > ScatterMap
IntArrayPtr _iluDiagIndexPtr
Tangent fabs(const Tangent &a)
const CRTYPE & getConnType() const
void setBoundary(const int nr)
virtual void setFlatMatrix(Matrix &fmg) const
virtual void multiply(IContainer &yB, const IContainer &xB) const
void setFlatCoeffs(Array< double > &flatCoeffs, const CRConnectivity &flatConnectivity, const Array< T_Diag > &diag, const Array< T_OffDiag > &offDiag, const CRConnectivity &connectivity)
virtual void reverseGS(IContainer &xB, IContainer &bB, IContainer &) const
int add(const int index, const int val)
shared_ptr< CRConnectivity > createCoarseConnectivity(const IContainer &gCoarseIndex, const CRConnectivity &coarseToFine, const StorageSite &coarseRowSite, const StorageSite &coarseColSite)
virtual void * getData() const =0
virtual void spikeSolve(IContainer &xB, const IContainer &bB, const IContainer &, const SpikeStorage &spike_storage) const
PairWiseAssemblerMap _pairWiseAssemblers
map< const CRConnectivity *, PairWiseAssembler * > PairWiseAssemblerMap
shared_ptr< Array< double > > ArrayDblePtr
DiagonalTensor< T, N > T_DiagTensor
void createScatterGatherCountsBuffer()
shared_ptr< CRConnectivity > _iluConnPtr
map< const StorageSite *, shared_ptr< Array< int > > > GatherMap
void createScatterGatherValuesBBuffer(const XArray &B)
Array< OffDiag > & _coeffs
virtual void computeResidual(const IContainer &xB, const IContainer &bB, IContainer &rB) const
void setDirichlet(const int nr)
virtual shared_ptr< Matrix > createMergeMatrix(const LinearSystemMerger &mergeLS)
PairWiseAssembler & getPairWiseAssembler(const CRConnectivity &pairs)
const StorageSite & getRowSite() const
virtual void multiplyAndAdd(IContainer &yB, const IContainer &xB) const
GhostArrayMap _sendValuesB
void addCoeff01(const int np, const OffDiag &c01)
void addCount(const int index, const int count)
void eliminateDirichlet(const int j, Array< X > &b, const X &delta_j, const bool explicitMode=false)
SpikeMatrix< Diag, OffDiag, X > T_SpikeMtrx
const PairToColMapping & getPairToColMapping(const CRConnectivity &pairs) const
DiagArrayPtr _iluCoeffsPtr
void lowerSolve(XArray &y, const XArray &b) const