60 #ifdef EPETRA_ENABLE_DEBUG 66 template<
typename int_type>
68 int NumRemotePIDs,
const int * UserRemotePIDs,
69 const int & UserNumExportIDs,
const int * UserExportLIDs,
const int * UserExportPIDs)
81 int_type *TargetGIDs = 0;
83 TargetGIDs =
new int_type[NumTargetIDs];
87 int_type * SourceGIDs = 0;
89 SourceGIDs =
new int_type[NumSourceIDs];
93 int MinIDs =
EPETRA_MIN(NumSourceIDs, NumTargetIDs);
96 for (i=0; i< MinIDs; i++)
if (TargetGIDs[i]==SourceGIDs[i])
NumSameIDs_++;
else break;
108 int_type * RemoteGIDs=0;
122 if (sourceMap.
MyGID(TargetGIDs[i])) {
135 ReportError(
"Warning in Epetra_Import: Serial Import has remote IDs. (Importing to Subset of Target Map)", 1);
138 int * RemotePIDs = 0;
143 #ifdef EPETRA_ENABLE_DEBUG 148 printf(
"[%d] UserRemotePIDs count wrong %d != %d\n",sourceMap.
Comm().
MyPID(),NumRemotePIDs,
NumRemoteIDs_);
153 ReportError(
"Epetra_Import: UserRemotePIDs count wrong",-1);
159 for(i=0; i<
NumRemoteIDs_; i++) RemotePIDs[i] = UserRemotePIDs[i];
166 if( RemotePIDs[i] == -1 ) ++cnt;
174 if( RemotePIDs[i] != -1 ) {
175 NewRemoteGIDs[cnt] = RemoteGIDs[i];
176 NewRemotePIDs[cnt] = RemotePIDs[i];
177 NewRemoteLIDs[cnt] = targetMap.
LID(RemoteGIDs[i]);
181 delete [] RemoteGIDs;
182 delete [] RemotePIDs;
184 RemoteGIDs = NewRemoteGIDs;
185 RemotePIDs = NewRemotePIDs;
187 ReportError(
"Warning in Epetra_Import: Target IDs not found in Source Map (Do you want to import to subset of Target Map?)", 1);
191 delete [] RemoteGIDs;
193 delete [] RemotePIDs;
217 throw ReportError(
"Epetra_Import::Epetra_Import: GlobalIndices Internal Error", -1);
238 bool Deterministic =
true;
247 if (ierr!=0)
throw ReportError(
"Error in Epetra_Distributor.CreateFromRecvs()", ierr);
253 if (NumTargetIDs>0)
delete [] TargetGIDs;
254 if (NumSourceIDs>0)
delete [] SourceGIDs;
257 #ifdef EPETRA_ENABLE_DEBUG 263 Source[i] = (
int) (Source.
Map().
GID(i) % INT_MAX);
268 bool test_passed=
true;
270 if(Target[i] != Target.
Map().
GID(i) % INT_MAX) test_passed=
false;
274 printf(
"[%d] PROCESSOR has a mismatch... prepearing to crash or hang!\n",sourceMap.
Comm().
MyPID());
279 throw ReportError(
"Epetra_Import: ERROR. User provided IDs do not match what an import generates.");
288 template<
typename int_type>
301 int_type *TargetGIDs = 0;
302 if (NumTargetIDs>0) {
303 TargetGIDs =
new int_type[NumTargetIDs];
307 int_type * SourceGIDs = 0;
308 if (NumSourceIDs>0) {
309 SourceGIDs =
new int_type[NumSourceIDs];
313 int MinIDs =
EPETRA_MIN(NumSourceIDs, NumTargetIDs);
317 for (i=0; i< MinIDs; i++)
if (TargetGIDs[i]==SourceGIDs[i])
NumSameIDs_++;
else break;
329 int_type * RemoteGIDs=0;
343 if (sourceMap.
MyGID(TargetGIDs[i])) {
356 ReportError(
"Warning in Epetra_Import: Serial Import has remote IDs. (Importing to Subset of Target Map)", 1);
359 int * RemotePIDs = 0;
364 #ifdef EPETRA_ENABLE_DEBUG 365 if(NumRemotePIDs!=-1){
370 printf(
"[%d] UserRemotePIDs count wrong %d != %d\n",sourceMap.
Comm().
MyPID(),NumRemotePIDs,
NumRemoteIDs_);
375 throw ReportError(
"Epetra_Import: UserRemotePIDs count wrong",-1);
382 for(i=0; i<
NumRemoteIDs_; i++) RemotePIDs[i] = UserRemotePIDs[i];
386 if (ierr)
throw ReportError(
"Error in sourceMap.RemoteIDList call", ierr);
393 if( RemotePIDs[i] == -1 ) ++cnt;
401 if( RemotePIDs[i] != -1 ) {
402 NewRemoteGIDs[cnt] = RemoteGIDs[i];
403 NewRemotePIDs[cnt] = RemotePIDs[i];
404 NewRemoteLIDs[cnt] = targetMap.
LID(RemoteGIDs[i]);
408 delete [] RemoteGIDs;
409 delete [] RemotePIDs;
411 RemoteGIDs = NewRemoteGIDs;
412 RemotePIDs = NewRemotePIDs;
414 ReportError(
"Warning in Epetra_Import: Target IDs not found in Source Map (Do you want to import to subset of Target Map?)", 1);
418 delete [] RemoteGIDs;
420 delete [] RemotePIDs;
442 throw ReportError(
"Epetra_Import::Epetra_Import: GlobalIndices Internal Error", -1);
449 bool Deterministic =
true;
450 int_type* tmp_ExportLIDs;
453 if (ierr!=0)
throw ReportError(
"Error in Epetra_Distributor.CreateFromRecvs()", ierr);
467 delete[] tmp_ExportLIDs;
473 tmp_ExportLIDs[i] = sourceMap.
LID(tmp_ExportLIDs[i]);
477 ExportLIDs_ =
reinterpret_cast<int *
>(tmp_ExportLIDs);
481 throw ReportError(
"Epetra_Import::Epetra_Import: GlobalIndices Internal Error", -1);
488 if (NumTargetIDs>0)
delete [] TargetGIDs;
489 if (NumSourceIDs>0)
delete [] SourceGIDs;
497 TargetMap_(targetMap),
498 SourceMap_(sourceMap),
513 throw ReportError(
"Epetra_Import::Epetra_Import: GlobalIndicesTypeMatch failed", -1);
516 #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
517 Construct<int>(targetMap, sourceMap,NumRemotePIDs,RemotePIDs);
519 throw ReportError(
"Epetra_Import::Epetra_Import: ERROR, GlobalIndicesInt but no API for it.",-1);
522 #ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
523 Construct<long long>(targetMap, sourceMap,NumRemotePIDs,RemotePIDs);
525 throw ReportError(
"Epetra_Import::Epetra_Import: ERROR, GlobalIndicesLongLong but no API for it.",-1);
528 throw ReportError(
"Epetra_Import::Epetra_Import: Bad global indices type", -1);
535 const int & numExportIDs,
const int * theExportLIDs,
const int * theExportPIDs)
537 TargetMap_(targetMap),
538 SourceMap_(sourceMap),
553 throw ReportError(
"Epetra_Import::Epetra_Import: GlobalIndicesTypeMatch failed", -1);
556 #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
557 Construct_Expert<int>(targetMap, sourceMap,NumRemotePIDs,RemotePIDs,numExportIDs,theExportLIDs,theExportPIDs);
559 throw ReportError(
"Epetra_Import::Epetra_Import: ERROR, GlobalIndicesInt but no API for it.",-1);
562 #ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
563 Construct_Expert<long long>(targetMap, sourceMap,NumRemotePIDs,RemotePIDs,numExportIDs,theExportLIDs,theExportPIDs);
565 throw ReportError(
"Epetra_Import::Epetra_Import: ERROR, GlobalIndicesLongLong but no API for it.",-1);
568 throw ReportError(
"Epetra_Import::Epetra_Import: Bad global indices type", -1);
575 TargetMap_(targetMap),
576 SourceMap_(sourceMap),
591 throw ReportError(
"Epetra_Import::Epetra_Import: GlobalIndicesTypeMatch failed", -1);
594 #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
595 Construct<int>(targetMap, sourceMap);
597 throw ReportError(
"Epetra_Import::Epetra_Import: ERROR, GlobalIndicesInt but no API for it.",-1);
600 #ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
601 Construct<long long>(targetMap, sourceMap);
603 throw ReportError(
"Epetra_Import::Epetra_Import: ERROR, GlobalIndicesLongLong but no API for it.",-1);
606 throw ReportError(
"Epetra_Import::Epetra_Import: Bad global indices type", -1);
613 TargetMap_(Importer.TargetMap_),
614 SourceMap_(Importer.SourceMap_),
615 NumSameIDs_(Importer.NumSameIDs_),
616 NumPermuteIDs_(Importer.NumPermuteIDs_),
619 NumRemoteIDs_(Importer.NumRemoteIDs_),
621 NumExportIDs_(Importer.NumExportIDs_),
624 NumSend_(Importer.NumSend_),
625 NumRecv_(Importer.NumRecv_),
672 TargetMap_(Exporter.SourceMap_),
673 SourceMap_(Exporter.TargetMap_),
674 NumSameIDs_(Exporter.NumSameIDs_),
675 NumPermuteIDs_(Exporter.NumPermuteIDs_),
678 NumRemoteIDs_(Exporter.NumExportIDs_),
680 NumExportIDs_(Exporter.NumRemoteIDs_),
683 NumSend_(Exporter.NumRecv_),
684 NumRecv_(Exporter.NumSend_),
712 if(!D)
throw ReportError(
"Epetra_Import: Can't have ExportPIDs w/o an Epetra::MpiDistributor.",-1);
715 const int NumReceives = D->NumReceives();
716 const int *ProcsFrom = D->ProcsFrom();
717 const int *LengthsFrom = D->LengthsFrom();
722 for (i = 0, j = 0; i < NumReceives; ++i) {
723 const int pid = ProcsFrom[i];
724 for (
int k = 0; k < LengthsFrom[i]; ++k) {
730 throw ReportError(
"Epetra_Import: Can't have ExportPIDs w/o an Epetra::MpiDistributor.",-2);
754 const bool sortIDs =
false;
757 const int myRank = comm.
MyPID();
758 const int numProcs = comm.
NumProc();
761 os <<
"Import Data Members:" << std::endl;
765 for (
int p = 0; p < numProcs; ++p) {
767 os <<
"Image ID : " << myRank << std::endl;
769 os <<
"permuteFromLIDs:";
775 permuteFromLIDs.begin());
777 std::sort (permuteFromLIDs.begin(), permuteFromLIDs.end());
781 os << permuteFromLIDs[i];
790 os <<
"permuteToLIDs :";
796 permuteToLIDs.begin());
798 std::sort (permuteToLIDs.begin(), permuteToLIDs.end());
802 os << permuteToLIDs[i];
811 os <<
"remoteLIDs :";
819 std::sort (remoteLIDs.begin(), remoteLIDs.end());
842 int* intCompanions[1];
843 intCompanions[0] = &exportLIDs[0];
845 0, (
double**) NULL, 1, intCompanions, 0, 0);
849 os <<
"exportLIDs :";
864 os <<
"exportImageIDs :";
887 os <<
"Number of sends: " <<
NumSend_ << std::endl;
888 os <<
"Number of recvs: " <<
NumRecv_ << std::endl;
897 const bool printMaps =
false;
903 os << std::endl << std::endl <<
"Source Map:" << std::endl << std::flush;
910 os << std::endl << std::endl <<
"Target Map:" << std::endl << std::flush;
918 os << std::endl << std::endl <<
"Distributor:" << std::endl << std::flush;
923 os <<
" is NULL." << std::endl;
const Epetra_BlockMap & Map() const
Returns the address of the Epetra_BlockMap for this multi-vector.
int MyGlobalElements(int *MyGlobalElementList) const
Puts list of global elements on this processor into the user-provided array.
virtual ~Epetra_Import(void)
Epetra_Import destructor.
bool DistributedGlobal() const
Returns true if map is defined across more than one processor.
Epetra_Distributor & Distributor() const
Epetra_IntVector: A class for constructing and using dense integer vectors on a parallel computer...
Epetra_BlockMap TargetMap_
virtual void Print(std::ostream &os) const =0
int MyLength() const
Returns the local vector length on the calling processor of vectors in the multi-vector.
Epetra_Export: This class builds an export object for efficient exporting of off-processor elements...
int PutValue(int Value)
Set all elements of the vector to Value.
int CreateFromSendsAndRecvs(const int &NumExportIDs, const int *ExportPIDs, const int &NumRemoteIDs, const int *RemoteGIDs, const int *RemotePIDs, bool Deterministic)
Create a communication plan from send list and a recv list.
MPI implementation of Epetra_Distributor.
virtual int ReportError(const std::string Message, int ErrorCode) const
Error reporting method.
virtual int MinAll(double *PartialMins, double *GlobalMins, int Count) const =0
Epetra_Comm Global Min function.
Epetra_Import: This class builds an import object for efficient importing of off-processor elements...
virtual Epetra_Distributor * ReverseClone()=0
Create and extract the reverse version of the distributor.
virtual void Barrier() const =0
Epetra_Comm Barrier function.
virtual int MyPID() const =0
Return my process ID.
Epetra_Util: The Epetra Util Wrapper Class.
bool MyGID(int GID_in) const
Returns true if the GID passed in belongs to the calling processor in this map, otherwise returns fal...
Epetra_Comm: The Epetra Communication Abstract Base Class.
void Construct(const Epetra_BlockMap &targetMap, const Epetra_BlockMap &sourceMap, int NumRemotePIDs=-1, const int *UserRemotePIDs=0)
Epetra_Distributor * Distor_
Epetra_Object: The base Epetra class.
virtual void Print(std::ostream &os) const
Print object to an output stream.
bool GlobalIndicesInt() const
Returns true if map create with int NumGlobalElements.
int NumMyElements() const
Number of elements on the calling processor.
Epetra_BlockMap: A class for partitioning block element vectors and matrices.
const Epetra_Comm & Comm() const
Access function for Epetra_Comm communicator.
int RemoteIDList(int NumIDs, const int *GIDList, int *PIDList, int *LIDList) const
Returns the processor IDs and corresponding local index value for a given list of global indices...
int LID(int GID) const
Returns local ID of global ID, return -1 if not found on this processor.
Epetra_Distributor * Distor_
virtual int CreateFromRecvs(const int &NumRemoteIDs, const int *RemoteGIDs, const int *RemotePIDs, bool Deterministic, int &NumExportIDs, int *&ExportGIDs, int *&ExportPIDs)=0
Create Distributor object using list of Remote global IDs and corresponding PIDs. ...
virtual int NumProc() const =0
Returns total number of processes.
void Construct_Expert(const Epetra_BlockMap &TargetMap, const Epetra_BlockMap &SourceMap, int NumRemotePIDs, const int *RemotePIDs, const int &NumExportIDs, const int *ExportLIDs, const int *ExportPIDs)
bool GlobalIndicesTypeMatch(const Epetra_BlockMap &other) const
virtual Epetra_Distributor * CreateDistributor() const =0
Create a distributor object.
int MaxElementSize() const
Maximum element size across all processors.
virtual void Print(std::ostream &os) const
Print object to an output stream Print method.
static void Sort(bool SortAscending, int NumKeys, T *Keys, int NumDoubleCompanions, double **DoubleCompanions, int NumIntCompanions, int **IntCompanions, int NumLongLongCompanions, long long **LongLongCompanions)
Epetra_Util Sort Routine (Shell sort)
bool GlobalIndicesLongLong() const
Returns true if map create with long long NumGlobalElements.
virtual Epetra_Distributor * Clone()=0
Epetra_Distributor clone constructor.
int Import(const Epetra_SrcDistObject &A, const Epetra_Import &Importer, Epetra_CombineMode CombineMode, const Epetra_OffsetIndex *Indexor=0)
Imports an Epetra_DistObject using the Epetra_Import object.
int GID(int LID) const
Returns global ID of local ID, return IndexBase-1 if not found on this processor. ...
Epetra_BlockMap SourceMap_
Epetra_Import(const Epetra_BlockMap &TargetMap, const Epetra_BlockMap &SourceMap)
Constructs a Epetra_Import object from the source and target maps.