//============================================================================== int LinearProblem_CrsSingletonFilter::ConstructRedistributeExporter(Epetra_Map * SourceMap, Epetra_Map * TargetMap, Epetra_Export * & RedistributeExporter, Epetra_Map * & RedistributeMap) { int IndexBase = SourceMap->IndexBase(); if (IndexBase!=TargetMap->IndexBase()) EPETRA_CHK_ERR(-1); const Epetra_Comm & Comm = TargetMap->Comm(); int TargetNumMyElements = TargetMap->NumMyElements(); int SourceNumMyElements = SourceMap->NumMyElements(); // ContiguousTargetMap has same number of elements per PE as TargetMap, but uses contigious indexing Epetra_Map ContiguousTargetMap(-1, TargetNumMyElements, IndexBase,Comm); // Same for ContiguousSourceMap Epetra_Map ContiguousSourceMap(-1, SourceNumMyElements, IndexBase, Comm); assert(ContiguousSourceMap.NumGlobalElements()==ContiguousTargetMap.NumGlobalElements()); // Now create a vector that contains the global indices of the Source Epetra_MultiVector Epetra_IntVector SourceIndices(View, ContiguousSourceMap, SourceMap->MyGlobalElements()); // Create an exporter to send the SourceMap global IDs to the target distribution Epetra_Export Exporter(ContiguousSourceMap, ContiguousTargetMap); // Create a vector to catch the global IDs in the target distribution Epetra_IntVector TargetIndices(ContiguousTargetMap); TargetIndices.Export(SourceIndices, Exporter, Insert); // Create a new map that describes how the Source MultiVector should be laid out so that it has // the same number of elements on each processor as the TargetMap RedistributeMap = new Epetra_Map(-1, TargetNumMyElements, TargetIndices.Values(), IndexBase, Comm); // This exporter will finally redistribute the Source MultiVector to the same layout as the TargetMap RedistributeExporter = new Epetra_Export(*SourceMap, *RedistributeMap); return(0); }
//============================================================================== int Epetra_CrsSingletonFilter::ConstructRedistributeExporter(Epetra_Map * SourceMap, Epetra_Map * TargetMap, Epetra_Export * & RedistributeExporter, Epetra_Map * & RedistributeMap) { int IndexBase = SourceMap->IndexBase(); // CJ TODO FIXME long long if (IndexBase!=TargetMap->IndexBase()) EPETRA_CHK_ERR(-1); const Epetra_Comm & Comm = TargetMap->Comm(); int TargetNumMyElements = TargetMap->NumMyElements(); int SourceNumMyElements = SourceMap->NumMyElements(); // ContiguousTargetMap has same number of elements per PE as TargetMap, but uses contigious indexing Epetra_Map ContiguousTargetMap(-1, TargetNumMyElements, IndexBase,Comm); // Same for ContiguousSourceMap Epetra_Map ContiguousSourceMap(-1, SourceNumMyElements, IndexBase, Comm); assert(ContiguousSourceMap.NumGlobalElements64()==ContiguousTargetMap.NumGlobalElements64()); // Now create a vector that contains the global indices of the Source Epetra_MultiVector #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES Epetra_IntVector *SourceIndices = 0; Epetra_IntVector *TargetIndices = 0; #endif #ifndef EPETRA_NO_64BIT_GLOBAL_INDICES Epetra_LongLongVector *SourceIndices_LL = 0; Epetra_LongLongVector *TargetIndices_LL = 0; #endif if(SourceMap->GlobalIndicesInt()) #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES SourceIndices = new Epetra_IntVector(View, ContiguousSourceMap, SourceMap->MyGlobalElements()); #else throw "Epetra_CrsSingletonFilter::ConstructRedistributeExporter: GlobalIndicesInt but no int API"; #endif else if(SourceMap->GlobalIndicesLongLong())