65 MyLength_(map.NumMyPoints()),
66 GlobalLength_(map.NumGlobalPoints64()),
67 NumVectors_(numVectors),
68 UserAllocated_(false),
69 ConstantStride_(true),
70 Stride_(map.NumMyPoints()),
90 MyLength_(Source.MyLength_),
91 GlobalLength_(Source.GlobalLength_),
92 NumVectors_(Source.NumVectors_),
93 UserAllocated_(false),
94 ConstantStride_(true),
101 int ** Source_Pointers = Source.
Pointers();
112 int *
A,
int MyLDA,
int numVectors)
117 MyLength_(map.NumMyPoints()),
118 GlobalLength_(map.NumGlobalPoints64()),
119 NumVectors_(numVectors),
120 UserAllocated_(false),
121 ConstantStride_(true),
122 Stride_(map.NumMyPoints()),
142 int **ArrayOfPointers,
int numVectors)
147 MyLength_(map.NumMyPoints()),
148 GlobalLength_(map.NumGlobalPoints64()),
149 NumVectors_(numVectors),
150 UserAllocated_(false),
151 ConstantStride_(true),
152 Stride_(map.NumMyPoints()),
173 int *Indices,
int numVectors)
178 MyLength_(Source.MyLength_),
179 GlobalLength_(Source.GlobalLength_),
180 NumVectors_(numVectors),
181 UserAllocated_(false),
182 ConstantStride_(true),
191 int ** Source_Pointers = Source.
Pointers();
204 int StartIndex,
int numVectors)
209 MyLength_(Source.MyLength_),
210 GlobalLength_(Source.GlobalLength_),
211 NumVectors_(numVectors),
212 UserAllocated_(false),
213 ConstantStride_(true),
222 int ** Source_Pointers = Source.
Pointers();
263 int randval = rand();
267 int locrandval = randval;
295 #ifdef EPETRA_HAVE_OMP
296 #pragma omp parallel for default(none) shared(to,from)
297 for (
int j=0; j<myLength; j++) to[j] = from[j];
299 memcpy(to, from, myLength*
sizeof(
int));
317 int randval = rand();
321 int locrandval = randval;
362 #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
366 EPETRA_CHK_ERR(ChangeGlobalValue<int>(GlobalRow, 0, VectorIndex, OrdinalValue,
false));
371 #ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
375 EPETRA_CHK_ERR(ChangeGlobalValue<long long>(GlobalRow, 0, VectorIndex, OrdinalValue,
false));
380 #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
382 int VectorIndex,
int OrdinalValue) {
384 EPETRA_CHK_ERR(ChangeGlobalValue<int>(GlobalBlockRow, BlockRowOffset, VectorIndex, OrdinalValue,
false));
389 #ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
391 int VectorIndex,
int OrdinalValue) {
393 EPETRA_CHK_ERR(ChangeGlobalValue<long long>(GlobalBlockRow, BlockRowOffset, VectorIndex, OrdinalValue,
false));
398 #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
402 EPETRA_CHK_ERR(ChangeGlobalValue<int>(GlobalRow, 0, VectorIndex, OrdinalValue,
true));
407 #ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
411 EPETRA_CHK_ERR(ChangeGlobalValue<long long>(GlobalRow, 0, VectorIndex, OrdinalValue,
true));
416 #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
418 int VectorIndex,
int OrdinalValue) {
420 EPETRA_CHK_ERR(ChangeGlobalValue<int>(GlobalBlockRow, BlockRowOffset, VectorIndex, OrdinalValue,
true));
425 #ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
427 int VectorIndex,
int OrdinalValue) {
429 EPETRA_CHK_ERR(ChangeGlobalValue<long long>(GlobalBlockRow, BlockRowOffset, VectorIndex, OrdinalValue,
true));
442 int VectorIndex,
int OrdinalValue) {
455 int VectorIndex,
int OrdinalValue) {
461 template<
typename int_type>
463 int VectorIndex,
int OrdinalValue,
bool SumInto) {
465 if(!
Map().
template GlobalIndicesIsType<int_type>())
466 throw ReportError(
"Epetra_IntMultiVector::ChangeGlobalValues mismatch between argument types (int/long long) and map type.", -1);
474 int VectorIndex,
int OrdinalValue,
bool SumInto) {
478 if (BlockRowOffset<0 || BlockRowOffset>=
Map().ElementSize(MyBlockRow))
EPETRA_CHK_ERR(-2);
483 Pointers_[VectorIndex][entry+BlockRowOffset] += OrdinalValue;
485 Pointers_[VectorIndex][entry+BlockRowOffset] = OrdinalValue;
501 int * to =
A + i*MyLDA;
502 for (
int j=0; j<myLength; j++) *to++ = *from++;
534 int * to = ArrayOfPointers[i];
535 memcpy(to, from, myLength*
sizeof(
int));
575 #ifdef EPETRA_HAVE_OMP
576 #pragma omp parallel for default(none) shared(ScalarConstant)
578 for (
int j=0; j<myLength; j++) to[j] = ScalarConstant;
596 int *PermuteFromLIDs,
604 int **From =
A.Pointers();
608 int * ToFirstPointInElementList = 0;
609 int * FromFirstPointInElementList = 0;
610 int * FromElementSizeList = 0;
614 if (!ConstantElementSize) {
616 FromFirstPointInElementList =
A.Map().FirstPointInElementList();
617 FromElementSizeList =
A.Map().ElementSizeList();
627 if (MaxElementSize==1) {
629 NumSameEntries = NumSameIDs;
631 else if (ConstantElementSize) {
633 NumSameEntries = NumSameIDs * MaxElementSize;
637 NumSameEntries = FromFirstPointInElementList[NumSameIDs];
641 if (To==From) NumSameEntries = 0;
646 for (
int i=0; i < numVectors; i++) {
647 if (CombineMode==
Epetra_AddLocalAlso)
for (
int j=0; j<NumSameEntries; j++) To[i][j] += From[i][j];
648 else for (
int j=0; j<NumSameEntries; j++) To[i][j] = From[i][j];
652 if (NumPermuteIDs>0) {
658 if (CombineMode==
Epetra_AddLocalAlso)
for (
int j=0; j<NumPermuteIDs; j++) To[0][PermuteToLIDs[j]] += From[0][PermuteFromLIDs[j]];
659 else for (
int j=0; j<NumPermuteIDs; j++) To[0][PermuteToLIDs[j]] = From[0][PermuteFromLIDs[j]];
662 for (
int j=0; j<NumPermuteIDs; j++) {
663 jj = PermuteToLIDs[j];
664 jjj = PermuteFromLIDs[j];
665 if (CombineMode==
Epetra_AddLocalAlso)
for (
int i=0; i<numVectors; i++) To[i][jj] += From[i][jjj];
666 else for (
int i=0; i<numVectors; i++) To[i][jj] = From[i][jjj];
673 for (
int j=0; j<NumPermuteIDs; j++) {
674 jj = MaxElementSize*PermuteToLIDs[j];
675 jjj = MaxElementSize*PermuteFromLIDs[j];
676 if (CombineMode==
Epetra_AddLocalAlso)
for (
int i=0; i<numVectors; i++)
for (k=0; k<MaxElementSize; k++) To[i][jj+k] += From[i][jjj+k];
677 else for(
int i=0; i<numVectors; i++)
for (k=0; k<MaxElementSize; k++) To[i][jj+k] = From[i][jjj+k];
684 for (
int j=0; j<NumPermuteIDs; j++) {
685 jj = ToFirstPointInElementList[PermuteToLIDs[j]];
686 jjj = FromFirstPointInElementList[PermuteFromLIDs[j]];
687 int ElementSize = FromElementSizeList[PermuteFromLIDs[j]];
688 if (CombineMode==
Epetra_AddLocalAlso)
for (
int i=0; i<numVectors; i++)
for (k=0; k<ElementSize; k++) To[i][jj+k] += From[i][jjj+k];
689 else for (
int i=0; i<numVectors; i++)
for (k=0; k<ElementSize; k++) To[i][jj+k] = From[i][jjj+k];
714 int **From =
A.Pointers();
719 int * FromFirstPointInElementList = 0;
720 int * FromElementSizeList = 0;
722 if (!ConstantElementSize) {
723 FromFirstPointInElementList =
A.Map().FirstPointInElementList();
724 FromElementSizeList =
A.Map().ElementSizeList();
727 int * OrdinalExports = 0;
729 SizeOfPacket = numVectors*MaxElementSize*(int)
sizeof(
int);
731 if(SizeOfPacket*NumExportIDs>LenExports) {
732 if (LenExports>0)
delete [] Exports;
733 LenExports = SizeOfPacket*NumExportIDs;
734 OrdinalExports =
new int[numVectors*MaxElementSize*NumExportIDs];
735 Exports = (
char *) OrdinalExports;
740 if (NumExportIDs>0) {
741 ptr = (
int *) Exports;
744 if (MaxElementSize==1) {
747 for (
int j=0; j<NumExportIDs; j++)
748 *ptr++ = From[0][ExportLIDs[j]];
751 for (
int j=0; j<NumExportIDs; j++) {
753 for (
int i=0; i<numVectors; i++)
754 *ptr++ = From[i][jj];
760 else if (ConstantElementSize) {
762 for (
int j=0; j<NumExportIDs; j++) {
763 jj = MaxElementSize*ExportLIDs[j];
764 for (
int i=0; i<numVectors; i++)
765 for (k=0; k<MaxElementSize; k++)
766 *ptr++ = From[i][jj+k];
773 int thisSizeOfPacket = numVectors*MaxElementSize;
774 for (
int j=0; j<NumExportIDs; j++) {
775 ptr = (
int *) Exports + j*thisSizeOfPacket;
776 jj = FromFirstPointInElementList[ExportLIDs[j]];
777 int ElementSize = FromElementSizeList[ExportLIDs[j]];
778 for (
int i=0; i<numVectors; i++)
779 for (k=0; k<ElementSize; k++)
780 *ptr++ = From[i][jj+k];
806 if( CombineMode !=
Add
807 && CombineMode !=
Zero
814 && CombineMode !=
AbsMax )
817 if (NumImportIDs<=0)
return(0);
824 int * ToFirstPointInElementList = 0;
825 int * ToElementSizeList = 0;
827 if (!ConstantElementSize) {
835 ptr = (
int *) Imports;
838 if (MaxElementSize==1) {
841 if (CombineMode==
InsertAdd)
for (
int j=0; j<NumImportIDs; j++) To[0][ImportLIDs[j]] = 0.0;
842 if (CombineMode==
Add || CombineMode==
InsertAdd)
for (
int j=0; j<NumImportIDs; j++) To[0][ImportLIDs[j]] += *ptr++;
843 else if(CombineMode==
Insert)
for (
int j=0; j<NumImportIDs; j++) To[0][ImportLIDs[j]] = *ptr++;
844 else if(CombineMode==
AbsMax)
for (
int j=0; j<NumImportIDs; j++) {To[0][ImportLIDs[j]] =
EPETRA_MAX( To[0][ImportLIDs[j]],std::abs(*ptr)); ptr++;}
845 else if(CombineMode==
AbsMin)
for (
int j=0; j<NumImportIDs; j++) {To[0][ImportLIDs[j]] =
EPETRA_MIN( To[0][ImportLIDs[j]],std::abs(*ptr)); ptr++;}
846 else if(CombineMode==
Epetra_Max)
for (
int j=0; j<NumImportIDs; j++) {To[0][ImportLIDs[j]] =
EPETRA_MAX( To[0][ImportLIDs[j]],*ptr); ptr++;}
847 else if(CombineMode==
Epetra_Min)
for (
int j=0; j<NumImportIDs; j++) {To[0][ImportLIDs[j]] =
EPETRA_MIN( To[0][ImportLIDs[j]],*ptr); ptr++;}
848 else if(CombineMode==
Average)
for (
int j=0; j<NumImportIDs; j++) {To[0][ImportLIDs[j]] += *ptr++; To[0][ImportLIDs[j]] *= 0.5;}
874 for (
int j=0; j<NumImportIDs; j++) {
876 for (
int i=0; i<numVectors; i++) {
877 if (CombineMode==
InsertAdd) To[i][jj] = 0.0;
878 if (CombineMode==
Add || CombineMode==
InsertAdd) To[i][jj] += *ptr++;
879 else if (CombineMode==
Insert) To[i][jj] = *ptr++;
880 else if (CombineMode==
AbsMax) {To[i][jj] =
EPETRA_MAX( To[i][jj], std::abs(*ptr)); ptr++; }
881 else if (CombineMode==
AbsMin) {To[i][jj] =
EPETRA_MIN( To[i][jj], std::abs(*ptr)); ptr++; }
884 else if (CombineMode==
Average){To[i][jj] += *ptr++; To[i][jj] *= 0.5;}}
938 else if (ConstantElementSize) {
940 for (
int j=0; j<NumImportIDs; j++) {
941 jj = MaxElementSize*ImportLIDs[j];
942 for (
int i=0; i<numVectors; i++) {
943 if (CombineMode==
InsertAdd)
for (k=0; k<MaxElementSize; k++) To[i][jj+k] = 0.0;
944 if (CombineMode==
Add || CombineMode==
InsertAdd)
for (k=0; k<MaxElementSize; k++) To[i][jj+k] += *ptr++;
945 else if (CombineMode==
Insert)
for (k=0; k<MaxElementSize; k++) To[i][jj+k] = *ptr++;
946 else if (CombineMode==
AbsMax) {
for (k=0; k<MaxElementSize; k++) { To[i][jj+k] =
EPETRA_MAX( To[i][jj+k], std::abs(*ptr)); ptr++; }}
947 else if (CombineMode==
AbsMin) {
for (k=0; k<MaxElementSize; k++) { To[i][jj+k] =
EPETRA_MIN( To[i][jj+k], std::abs(*ptr)); ptr++; }}
948 else if (CombineMode==
Epetra_Max) {
for (k=0; k<MaxElementSize; k++) { To[i][jj+k] =
EPETRA_MAX( To[i][jj+k], *ptr); ptr++; }}
949 else if (CombineMode==
Epetra_Min) {
for (k=0; k<MaxElementSize; k++) { To[i][jj+k] =
EPETRA_MIN( To[i][jj+k], *ptr); ptr++; }}
950 else if (CombineMode==
Average) {
for (k=0; k<MaxElementSize; k++) { To[i][jj+k] += *ptr++; To[i][jj+k] *= 0.5;}}
1010 int thisSizeOfPacket = numVectors*MaxElementSize;
1012 for (
int j=0; j<NumImportIDs; j++) {
1013 ptr = (
int *) Imports + j*thisSizeOfPacket;
1014 jj = ToFirstPointInElementList[ImportLIDs[j]];
1015 int ElementSize = ToElementSizeList[ImportLIDs[j]];
1016 for (
int i=0; i<numVectors; i++) {
1017 if (CombineMode==
InsertAdd)
for (k=0; k<ElementSize; k++) To[i][jj+k] = 0.0;
1018 if (CombineMode==
Add || CombineMode==
InsertAdd)
for (k=0; k<ElementSize; k++) To[i][jj+k] += *ptr++;
1019 else if (CombineMode==
Insert)
for (k=0; k<ElementSize; k++) To[i][jj+k] = *ptr++;
1020 else if (CombineMode==
AbsMax) {
for (k=0; k<ElementSize; k++) { To[i][jj+k] =
EPETRA_MAX( To[i][jj+k], std::abs(*ptr)); ptr++; }}
1021 else if (CombineMode==
Epetra_Max) {
for (k=0; k<ElementSize; k++) { To[i][jj+k] =
EPETRA_MAX( To[i][jj+k], *ptr); ptr++; }}
1022 else if (CombineMode==
Epetra_Min) {
for (k=0; k<ElementSize; k++) { To[i][jj+k] =
EPETRA_MIN( To[i][jj+k], *ptr); ptr++; }}
1023 else if (CombineMode==
Average) {
for (k=0; k<ElementSize; k++) { To[i][jj+k] += *ptr++; To[i][jj+k] *= 0.5;}}
1108 int MinVal = 2000000000;
1109 if (myLength>0) MinVal = from[0];
1110 #ifdef EPETRA_HAVE_OMP
1111 #pragma omp parallel default(none) shared(MinVal)
1113 int localMinVal = MinVal;
1115 for (
int j=0; j< myLength; j++) localMinVal =
EPETRA_MIN(localMinVal,from[j]);
1116 #pragma omp critical
1123 for (
int j=0; j< myLength; j++) MinVal =
EPETRA_MIN(MinVal,from[j]);
1155 dynamic_cast<const Epetra_MpiComm*>(
Comm_);
1156 if (!epetrampicomm) {
1160 MPI_Comm mpicomm = epetrampicomm->
GetMpiComm();
1161 int numProcs = epetrampicomm->
NumProc();
1171 bool overwrite = myLength == 0 ? true :
false;
1173 int myPID = epetrampicomm->
MyPID();
1174 int* owork_ptr = owork;
1176 for(
int j=0; j<numProcs; ++j) {
1186 int val = owork_ptr[i];
1190 if (overwrite || (Result[i] > val)) Result[i] = val;
1195 if (overwrite) overwrite =
false;
1221 int MaxVal = -2000000000;
1222 if (myLength>0) MaxVal = from[0];
1223 #ifdef EPETRA_HAVE_OMP
1224 #pragma omp parallel default(none) shared(MaxVal)
1226 int localMaxVal = MaxVal;
1228 for (
int j=0; j< myLength; j++) localMaxVal =
EPETRA_MAX(localMaxVal,from[j]);
1229 #pragma omp critical
1236 for (
int j=0; j< myLength; j++) MaxVal =
EPETRA_MAX(MaxVal,from[j]);
1268 dynamic_cast<const Epetra_MpiComm*>(
Comm_);
1269 if (!epetrampicomm) {
1273 MPI_Comm mpicomm = epetrampicomm->
GetMpiComm();
1274 int numProcs = epetrampicomm->
NumProc();
1284 bool overwrite = myLength == 0 ? true :
false;
1286 int myPID = epetrampicomm->
MyPID();
1287 int* owork_ptr = owork;
1289 for(
int j=0; j<numProcs; ++j) {
1299 int val = owork_ptr[i];
1303 if (overwrite || (Result[i] < val)) Result[i] = val;
1308 if (overwrite) overwrite =
false;
1359 if (
this != &Source)
Assign(Source);
1370 +
". The A MultiVector has NumVectors = " +
toString(
A.NumVectors()), -3);
1371 if (myLength !=
A.MyLength())
1372 throw ReportError(
"Length of MultiVectors incompatible in Assign. The this MultiVector has MyLength = " +
toString(myLength)
1373 +
". The A MultiVector has MyLength = " +
toString(
A.MyLength()), -4);
1375 int ** A_Pointers =
A.Pointers();
1378 const int *
const from = A_Pointers[i];
1379 #ifdef EPETRA_HAVE_OMP
1380 #pragma omp parallel for default(none)
1382 for (
int j=0; j<myLength; j++) to[j] = from[j];
1393 if (myLength>0) source =
new int[myLength*
NumVectors_];
1401 int * tmp1 = source;
1404 for (
int j=0; j< myLength; j++) *tmp1++ = *tmp2++;
1406 if (myLength>0) target =
new int[myLength*
NumVectors_];
1410 if (myLength>0)
delete [] source;
1412 int * tmp2 = target;
1415 for (
int j=0; j< myLength; j++) *tmp1++ = *tmp2++;
1417 if (myLength>0)
delete [] target;
1441 for (
int iproc=0; iproc < NumProc; iproc++) {
1444 int NumMyElements1 =
Map(). NumMyElements();
1446 int * FirstPointInElementList1 = NULL;
1452 os <<
" MyPID"; os <<
" ";
1454 if (MaxElementSize1==1)
1458 for (
int j = 0; j < NumVectors1 ; j++)
1465 for (
int i=0; i < NumMyElements1; i++) {
1469 os << MyPID; os <<
" ";
1471 if (MaxElementSize1==1) {
1472 if(
Map().GlobalIndicesInt())
1474 #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
1476 os << MyGlobalElements1[i] <<
" ";
1478 throw ReportError(
"Epetra_IntMultiVector::Print: ERROR, GlobalIndicesInt but no API for it.",-1);
1481 else if(
Map().GlobalIndicesLongLong())
1483 #ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
1485 os << MyGlobalElements1[i] <<
" ";
1487 throw ReportError(
"Epetra_IntMultiVector::Print: ERROR, GlobalIndicesLongLong but no API for it.",-1);
1491 throw ReportError(
"Epetra_IntMultiVector::Print ERROR, Don't know map global index type.",-1);
1496 if(
Map().GlobalIndicesInt())
1498 #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
1500 os << MyGlobalElements1[i]<<
"/" << ii <<
" ";
1502 throw ReportError(
"Epetra_IntMultiVector::Print: ERROR, GlobalIndicesInt but no API for it.",-1);
1505 else if(
Map().GlobalIndicesLongLong())
1507 #ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
1509 os << MyGlobalElements1[i]<<
"/" << ii <<
" ";
1511 throw ReportError(
"Epetra_IntMultiVector::Print: ERROR, GlobalIndicesLongLong but no API for it.",-1);
1515 throw ReportError(
"Epetra_IntMultiVector::Print ERROR, Don't know map global index type.",-1);
1517 iii = FirstPointInElementList1[i]+ii;
1519 for (
int j = 0; j < NumVectors1 ; j++)
1522 os << A_Pointers[j][iii];