21 _coarseToFineMappings(),
22 _coarseConnectivities(),
35 const Index& col)
const
51 const Index& col)
const
60 foreach(MatrixMap::value_type& pos,
_matrices)
61 pos.second->initAssembly();
74 for(
int i=0; i<yLen; i++)
79 for(
int j=0; j<xLen; j++)
104 for(
int i=0; i<yLen; i++)
108 for(
int j=0; j<xLen; j++)
134 for(
int i=0; i<xLen; i++)
144 for(
int j=0; j<xLen; j++)
147 if ((rowIndex!=colIndex) &&
hasMatrix(rowIndex,colIndex))
178 for(
int i=0; i<xLen; i++)
188 for(
int j=0; j<xLen; j++)
191 if ((rowIndex!=colIndex) &&
hasMatrix(rowIndex,colIndex))
199 mII.
Jacobi((*xnew)[rowIndex],x[rowIndex],r);
205 for(
int i=0; i<xLen; i++)
210 const ArrayBase& xnewI = (*xnew)[rowIndex];
225 foreach(
const MatrixMap::value_type& pos,
_matrices)
229 if (k.first == k.second)
231 pos.second->transpose();
236 if ( (transposedMap.count(k) + transposedMap.count(kt)) == 0)
238 shared_ptr<Matrix> mIJ = pos.second;
246 transposedMap[k] = mJI;
247 transposedMap[kt] = mIJ;
251 transposedMap[kt] = mIJ;
254 transposedMap[k] = shared_ptr<Matrix>();
261 foreach(
const MatrixMap::value_type& pos, transposedMap)
285 for(
int i=0; i<xLen; i++)
291 mII.
iluSolve(x[rowIndex],b[rowIndex],temp);
307 for(
int i=0; i<xLen; i++)
313 mII.
spikeSolve(x[rowIndex], b[rowIndex], temp, spike_storage);
330 for(
int i=0; i<xLen; i++)
339 for(
int j=0; j<xLen; j++)
342 if ((rowIndex!=colIndex) &&
hasMatrix(rowIndex,colIndex))
366 for(
int i=xLen-1; i>=0; i--)
376 for(
int j=0; j<xLen; j++)
379 if ((rowIndex!=colIndex) &&
hasMatrix(rowIndex,colIndex))
412 for(
int i=0; i<xLen; i++)
423 for(
int j=0; j<xLen; j++)
451 const double weightRatioThreshold)
454 const int xLen = coarseIndex.
getLength();
458 for(
int i=0; i<xLen; i++)
468 groupSize,weightRatioThreshold);
478 const int xLen = coarseIndexField.
getLength();
481 for(
int i=0; i<xLen; i++)
488 int coarseGhostSize=0;
489 const int coarseSize =
_coarseSizes.find(rowIndex)->second;
499 typedef map<const StorageSite*, vector<const Array<int>* > > IndicesMap;
500 IndicesMap toIndicesMap;
502 foreach(
const StorageSite::GatherMap::value_type pos, gatherMap)
507 toIndicesMap[&oSite].push_back(&toIndices);
510 foreach(
const StorageSite::GatherMap::value_type pos, gatherMapLevel1)
515 toIndicesMap[&oSite].push_back(&toIndices);
518 foreach(IndicesMap::value_type pos, toIndicesMap)
521 const vector<const Array<int>* > toIndicesArrays = pos.second;
524 map<int,int> otherToMyMapping;
527 foreach(
const Array<int>* toIndicesPtr, toIndicesArrays)
530 const int nGhostRows = toIndices.
getLength();
531 for(
int ng=0; ng<nGhostRows; ng++)
533 const int fineIndex = toIndices[ng];
534 const int coarseOtherIndex = coarseIndex[fineIndex];
536 if (coarseOtherIndex < 0)
539 if (otherToMyMapping.find(coarseOtherIndex) !=
540 otherToMyMapping.end())
542 coarseIndex[fineIndex] = otherToMyMapping[coarseOtherIndex];
546 coarseIndex[fineIndex] = coarseGhostSize+coarseSize;
547 otherToMyMapping[coarseOtherIndex] = coarseIndex[fineIndex];
548 gatherSet.
insert( coarseIndex[fineIndex] );
554 const int coarseMappersSize = otherToMyMapping.size();
556 shared_ptr<Array<int> > coarseToIndices(
new Array<int>(coarseMappersSize));
558 for(
int n = 0; n < gatherSet.
size(); n++)
560 (*coarseToIndices)[n] = gatherSet.
getData().at(n);
563 SSPair sskey(&site,&oSite);
571 IndicesMap fromIndicesMap;
573 foreach(
const StorageSite::GatherMap::value_type pos, scatterMap)
578 fromIndicesMap[&oSite].push_back(&fromIndices);
581 foreach(
const StorageSite::GatherMap::value_type pos, scatterMapLevel1)
586 fromIndicesMap[&oSite].push_back(&fromIndices);
589 foreach(IndicesMap::value_type pos, fromIndicesMap)
592 const vector<const Array<int>* > fromIndicesArrays = pos.second;
596 foreach(
const Array<int>* fromIndicesPtr, fromIndicesArrays)
598 const Array<int>& fromIndices = *fromIndicesPtr;
599 const int nGhostRows = fromIndices.
getLength();
600 for(
int ng=0; ng<nGhostRows; ng++)
602 const int fineIndex = fromIndices[ng];
603 const int coarseOtherIndex = coarseIndex[fineIndex];
604 if (coarseOtherIndex >= 0)
605 scatterSet.
insert( coarseOtherIndex );
610 const int coarseMappersSize = scatterSet.
size();
612 shared_ptr<Array<int> > coarseFromIndices(
new Array<int>(coarseMappersSize));
614 for(
int n = 0; n < scatterSet.
size(); n++ ) {
615 (*coarseFromIndices)[n] = scatterSet.
getData().at(n);
618 SSPair sskey(&site,&oSite);
630 const int xLen = coarseIndexField.
getLength();
632 for(
int i=0; i<xLen; i++)
644 dynamic_cast<const Array<int>&
>(coarseIndexField[rowIndex]);
646 shared_ptr<CRConnectivity> coarseToFine(
new CRConnectivity(coarseSite,fineSite));
648 coarseToFine->initCount();
652 for(
int nr=0; nr<nFineRows; nr++){
653 if (coarseIndex[nr]>=0)
654 coarseToFine->addCount(coarseIndex[nr],1);
658 coarseToFine->finishCount();
660 for(
int nr=0; nr<nFineRows; nr++)
661 if (coarseIndex[nr]>=0)
662 coarseToFine->add(coarseIndex[nr],nr);
664 coarseToFine->finishAdd();
673 const int xLen = coarseIndex.
getLength();
676 for(
int i=0; i<xLen; i++)
684 for(
int j=0; j<xLen; j++)
693 shared_ptr<CRConnectivity> coarseConnectivity
696 coarseRowSite,coarseColSite));
707 const int xLen = coarseIndex.
getLength();
709 for(
int i=0; i<xLen; i++)
715 for(
int j=0; j<xLen; j++)
725 shared_ptr<Matrix> coarseMatrix
728 coarseConnectivity));
741 const int xLen = fineResidualField.
getLength();
744 for(
int i=0; i<xLen; i++)
750 const Index coarseRowIndex(rowIndex.first,&coarseRowSite);
753 dynamic_cast<const ArrayBase&
>(fineResidualField[rowIndex]);
756 dynamic_cast<const ArrayBase&
>(coarseIndex[rowIndex]);
760 fineResidual.
inject(coarseB,fineToCoarse,rowIndex.second->getSelfCount());
770 const int xLen = fineSolutionField.
getLength();
773 for(
int i=0; i<xLen; i++)
779 const Index coarseRowIndex(rowIndex.first,&coarseRowSite);
782 scale = &((*scaleField)[*(coarseRowIndex.first)]);
785 fineSolution.
correct(coarseSolutionField[coarseRowIndex],
786 coarseIndex[rowIndex],
788 rowIndex.second->getSelfCount());
795 MultiFieldMatrix::getMinSize(
const MPI::Intracomm& comm )
const
798 foreach(
const MatrixMap::value_type& pos,
_matrices)
802 if (k.first == k.second)
804 size += k.first.second->getCount();
810 comm.Allreduce(MPI::IN_PLACE, &size, count, MPI::INT, MPI::MIN);
819 MultiFieldMatrix::getMergeSize(
const MPI::Intracomm& comm )
const
822 foreach(
const MatrixMap::value_type& pos,
_matrices)
826 if (k.first == k.second)
828 size += k.first.second->getCount();
834 comm.Allreduce(MPI::IN_PLACE, &size, count, MPI::INT, MPI::SUM);
848 foreach(
const MatrixMap::value_type& pos,
_matrices)
852 if (k.first == k.second)
854 size += k.first.second->getCount();
860 MPI::COMM_WORLD.Allreduce(MPI::IN_PLACE, &size, count, MPI::INT, MPI::MIN);
873 foreach(
const MatrixMap::value_type& pos,
_matrices)
877 if (k.first == k.second)
879 size += k.first.second->getCount();
893 for(
int i=0; i<xLen; i++)
896 for(
int j=0; j<xLen; j++)
MatrixSizeMap _coarseGhostSizes
Matrix & getMatrix(const Index &rowIndex, const Index &colIndex)
virtual ~MultiFieldMatrix()
virtual void iluSolve(IContainer &xB, const IContainer &bB, IContainer &tempB) const
void createCoarseToFineMapping(const MultiField &coarseIndexField)
void correctSolution(const MultiField &coarseIndex, MultiField &fineSolutionField, MFRPtr scaleField, const MultiField &coarseSolutionField)
virtual void forwardGS(IContainer &xB, const IContainer &bB, IContainer &temp) const
void createCoarseConnectivity(MultiField &coarseIndex)
virtual shared_ptr< CRConnectivity > createCoarseConnectivity(const IContainer &coarseIndex, const CRConnectivity &coarseToFine, const StorageSite &coarseRowSite, const StorageSite &coarseColSite)
bool hasMatrix(const Index &rowIndex, const Index &colIndex) const
const GatherMap & getGatherMapLevel1() const
virtual void copyPartial(const IContainer &oc, const int iBeg, const int iEnd)=0
const ScatterMap & getScatterMapLevel1() const
void createCoarsening(MultiField &coarseIndex, const int groupSize, const double weightRatioThreshold)
virtual void correct(const IContainer &coarseI, const IContainer &coarseIndexI, const IContainer *scaleI, const int length)=0
void syncGather(const ArrayIndex &i)
CoarseToFineMappingMap _coarseToFineMappings
StorageSiteMap _coarseSites
virtual void multiplyAndAdd(IContainer &yB, const IContainer &xB) const
virtual void multiplyAndAdd(IContainer &yB, const IContainer &xB) const
virtual void zeroPartial(const int iBeg, const int iEnd)=0
virtual void iluSolve(IContainer &xB, const IContainer &bB, const IContainer &residual) const
virtual void spikeSolve(IContainer &xB, const IContainer &bB, const IContainer &residual, const SpikeStorage &spike_storage) const
shared_ptr< MultiFieldReduction > reduceSum() const
virtual void Jacobi(IContainer &xnew, const IContainer &xold, const IContainer &b) const
virtual shared_ptr< Matrix > createCoarseMatrix(const IContainer &coarseIndex, const CRConnectivity &coarseToFine, const CRConnectivity &coarseConnectivity)
virtual void spikeSolve(IContainer &xB, const IContainer &bB, IContainer &tempB, const SpikeStorage &spike_storage) const
MultiField::ArrayIndex Index
virtual void reverseGS(IContainer &xB, const IContainer &bB, IContainer &temp) const
MatrixMap _coarseMatrices
virtual void computeResidual(const IContainer &xB, const IContainer &bB, IContainer &rB) const
virtual void Jacobi(IContainer &xB, const IContainer &bB, IContainer &tempB) const
void createCoarseMatrices(MultiField &coarseIndex)
int getCountLevel1() const
void removeMatrix(const Index &rowIndex, const Index &colIndex)
CoarseConnectivitiesMap _coarseConnectivities
const ScatterMap & getScatterMap() const
MatrixMappersMap _coarseGatherMaps
map< const StorageSite *, shared_ptr< Array< int > > > ScatterMap
const vector< int > & getData() const
map< EntryIndex, shared_ptr< Matrix > > MatrixMap
virtual void forwardGS(IContainer &xB, IContainer &bB, IContainer &residual) const
MatrixMappersMap _coarseScatterMaps
const GatherMap & getGatherMap() const
virtual void reverseGS(IContainer &xB, IContainer &bB, IContainer &residual) const
shared_ptr< MultiFieldReduction > MFRPtr
map< const StorageSite *, shared_ptr< Array< int > > > GatherMap
void addArray(const ArrayIndex &aIndex, shared_ptr< ArrayBase > a)
void syncScatter(const ArrayIndex &i)
pair< Index, Index > EntryIndex
virtual void solveBoundary(IContainer &xB, IContainer &bB, IContainer &residual) const
virtual void multiply(IContainer &yB, const IContainer &xB) const
const ArrayIndex getArrayIndex(const int i) const
void syncGhostCoarsening(MultiField &coarseIndexField)
virtual int createCoarsening(IContainer &coarseIndex, const int groupSize, const double weighRatioThreshold)
virtual void copyFrom(const IContainer &a)=0
MatrixSizeMap _coarseSizes
pair< const StorageSite *, const StorageSite * > SSPair
void injectResidual(const MultiField &coarseIndex, const MultiField &fineResidualField, MultiField &coarseBField)
virtual shared_ptr< IContainer > newClone() const
virtual void inject(IContainer &coarseI, const IContainer &coarseIndexI, const int length) const =0
virtual void solveBoundary(IContainer &xB, const IContainer &bB, IContainer &temp) const
MFRPtr quadProduct(const MultiField &x) const
virtual shared_ptr< ArrayBase > quadProduct(const IContainer &xB) const