static void zoltanObjList(void *data, int nGidEnt, int nLidEnt, ZOLTAN_ID_PTR gids, ZOLTAN_ID_PTR lids, int wdim, float *wgts, int *ierr) { const Adapter *adp = static_cast<Adapter *>(data); *ierr = ZOLTAN_OK; size_t mynObj = adp->getLocalNumIDs(); const typename Adapter::zgid_t *myids = NULL; adp->getIDsView(myids); for (size_t i = 0; i < mynObj; i++) { gids[i] = ZOLTAN_ID_TYPE(myids[i]); // TODO TRAITS CONVERSION MAY BE NEEDED lids[i] = ZOLTAN_ID_TYPE(i); // TODO TRAITS CONVERSION MAY BE NEEDED } if (wdim) { int mywdim = adp->getNumWeightsPerID(); for (int w = 0; w < wdim; w++) { if (w < mywdim) { // copy weights from adapter const typename Adapter::scalar_t *mywgts; int mystride; adp->getWeightsView(mywgts, mystride, w); for (size_t i = 0; i < mynObj; i++) wgts[i*wdim+w] = float(mywgts[i*mystride]); } else { // provide uniform weights for (size_t i = 0; i < mynObj; i++) wgts[i*wdim+w] = 1.; } } } }
int main(int argc, char *argv[]) { Teuchos::GlobalMPISession session(&argc, &argv); int ierr = 0; /////////////////////////////////////////////////////////// // Test conversions into integers // Assignments that should always work // (since the zgno value fits in an integer) int intIdx; try { int zgno = 123; Zoltan2::TPL_Traits<int,int>::ASSIGN_TPL_T(intIdx, zgno); } catch (std::exception &e) { PRINTMSG("FAIL: int to int"); ierr++; } try { unsigned int zgno = 123; Zoltan2::TPL_Traits<int,unsigned int>::ASSIGN_TPL_T(intIdx, zgno); } catch (std::exception &e) { PRINTMSG("FAIL: unsigned int to int"); ierr++; } try { long zgno = 123; Zoltan2::TPL_Traits<int,long>::ASSIGN_TPL_T(intIdx, zgno); } catch (std::exception &e) { PRINTMSG("FAIL: long to int"); ierr++; } try { size_t zgno = 123; Zoltan2::TPL_Traits<int,size_t>::ASSIGN_TPL_T(intIdx, zgno); } catch (std::exception &e) { PRINTMSG("FAIL: size_t to int"); ierr++; } // Assignments that should not work try { long long zgno = (long long)1 << 40; Zoltan2::TPL_Traits<int,long long>::ASSIGN_TPL_T(intIdx, zgno); } catch (std::exception &e) { PRINTMSG("GOOD: big long long to int throws exception"); } try { size_t zgno = (size_t)1 << 40; Zoltan2::TPL_Traits<int,size_t>::ASSIGN_TPL_T(intIdx, zgno); } catch (std::exception &e) { PRINTMSG("GOOD: big size_t to int throws exception"); } try { unsigned zgno = (1 << 31) + 1; Zoltan2::TPL_Traits<int,unsigned>::ASSIGN_TPL_T(intIdx, zgno); } catch (std::exception &e) { PRINTMSG("GOOD: huge unsigned to int throws exception"); } /////////////////////////////////////////////////////////// // Test conversions into size_t // Assignments that should always work size_t sizetIdx; try { long long zgno = (long long)1 << 40; Zoltan2::TPL_Traits<size_t,long long>::ASSIGN_TPL_T(sizetIdx, zgno); } catch (std::exception &e) { PRINTMSG("FAIL: big long long to size_t"); ierr++; } try { size_t zgno = (size_t)1 << 40; Zoltan2::TPL_Traits<size_t,size_t>::ASSIGN_TPL_T(sizetIdx, zgno); } catch (std::exception &e) { PRINTMSG("FAIL: big size_t to size_t"); ierr++; } /////////////////////////////////////////////////////////// // Test conversions into int64_t // Assignments that should always work int64_t int64Idx; try { long long zgno = (long long)1 << 40; Zoltan2::TPL_Traits<int64_t,long long>::ASSIGN_TPL_T(int64Idx, zgno); } catch (std::exception &e) { PRINTMSG("FAIL: big long long to int64_t"); ierr++; } try { size_t zgno = (size_t)1 << 40; Zoltan2::TPL_Traits<int64_t,size_t>::ASSIGN_TPL_T(int64Idx, zgno); } catch (std::exception &e) { PRINTMSG("FAIL: big size_t to int64_t"); ierr++; } // Assignments that should not work try { size_t zgno = ((size_t)1 << 63) + 1 ; Zoltan2::TPL_Traits<int64_t,size_t>::ASSIGN_TPL_T(int64Idx, zgno); } catch (std::exception &e) { PRINTMSG("GOOD: huge size_t to int64_t threw exception"); } #ifdef HAVE_ZOLTAN2_SCOTCH /////////////////////////////////////////////////////////// // Test conversions into SCOTCH_Num SCOTCH_Num scotchIdx; // Assignments that should always work // (since the zgno value fits in an integer) try { int zgno = 123; Zoltan2::TPL_Traits<SCOTCH_Num,int>::ASSIGN_TPL_T(scotchIdx, zgno); } catch (std::exception &e) { PRINTMSG("FAIL: int to SCOTCH_Num"); ierr++; } try { unsigned int zgno = 123; Zoltan2::TPL_Traits<SCOTCH_Num,unsigned int>::ASSIGN_TPL_T(scotchIdx, zgno); } catch (std::exception &e) { PRINTMSG("FAIL: unsigned int to SCOTCH_Num"); ierr++; } try { long zgno = 123; Zoltan2::TPL_Traits<SCOTCH_Num,long>::ASSIGN_TPL_T(scotchIdx, zgno); } catch (std::exception &e) { PRINTMSG("FAIL: long to SCOTCH_Num"); ierr++; } try { size_t zgno = 123; Zoltan2::TPL_Traits<SCOTCH_Num,size_t>::ASSIGN_TPL_T(scotchIdx, zgno); } catch (std::exception &e) { PRINTMSG("FAIL: size_t to SCOTCH_Num"); ierr++; } if (sizeof(SCOTCH_Num) == 8) { try { long long zgno = (long long)1 << 40; Zoltan2::TPL_Traits<SCOTCH_Num,long long>::ASSIGN_TPL_T(scotchIdx, zgno); } catch (std::exception &e) { PRINTMSG("FAIL: big unsigned int to SCOTCH_Num"); ierr++; } try { size_t zgno = (size_t)1 << 40; Zoltan2::TPL_Traits<SCOTCH_Num,size_t>::ASSIGN_TPL_T(scotchIdx, zgno); } catch (std::exception &e) { PRINTMSG("FAIL: big size_t to SCOTCH_Num"); ierr++; } } // Assignments that should not work if (sizeof(SCOTCH_Num) == 4) { try { long long zgno = (long long)1 << 40; Zoltan2::TPL_Traits<SCOTCH_Num,long long>::ASSIGN_TPL_T(scotchIdx, zgno); } catch (std::exception &e) { PRINTMSG("GOOD: big long long to 4-byte SCOTCH_Num throws exception"); } try { size_t zgno = (size_t)1 << 40; Zoltan2::TPL_Traits<SCOTCH_Num,size_t>::ASSIGN_TPL_T(scotchIdx, zgno); } catch (std::exception &e) { PRINTMSG("GOOD: big size_t to 4-byte SCOTCH_Num throws exception"); } } #endif // HAVE_ZOLTAN2_SCOTCH #ifdef PARMETIS_IS_OK /////////////////////////////////////////////////////////// // Test conversions into ParMETIS' idx_t idx_t parmetisIdx; // Assignments that should always work // (since the zgno value fits in an integer) try { int zgno = 123; Zoltan2::TPL_Traits<idx_t,int>::ASSIGN_TPL_T(parmetisIdx, zgno); } catch (std::exception &e) { PRINTMSG("FAIL: int to ParMETIS' idx_t"); ierr++; } try { unsigned int zgno = 123; Zoltan2::TPL_Traits<idx_t,unsigned int>::ASSIGN_TPL_T(parmetisIdx, zgno); } catch (std::exception &e) { PRINTMSG("FAIL: unsigned int to ParMETIS' idx_t"); ierr++; } try { long zgno = 123; Zoltan2::TPL_Traits<idx_t,long>::ASSIGN_TPL_T(parmetisIdx, zgno); } catch (std::exception &e) { PRINTMSG("FAIL: long to ParMETIS' idx_t"); ierr++; } try { size_t zgno = 123; Zoltan2::TPL_Traits<idx_t,size_t>::ASSIGN_TPL_T(parmetisIdx, zgno); } catch (std::exception &e) { PRINTMSG("FAIL: size_t to ParMETIS' idx_t"); ierr++; } if (sizeof(idx_t) == 8) { try { long long zgno = (long long)1 << 40; Zoltan2::TPL_Traits<idx_t,long long>::ASSIGN_TPL_T(parmetisIdx, zgno); } catch (std::exception &e) { PRINTMSG("FAIL: big unsigned int to ParMETIS' idx_t"); ierr++; } try { size_t zgno = (size_t)1 << 40; Zoltan2::TPL_Traits<idx_t,size_t>::ASSIGN_TPL_T(parmetisIdx, zgno); } catch (std::exception &e) { PRINTMSG("FAIL: big size_t to ParMETIS' idx_t"); ierr++; } } // Assignments that should not work if (sizeof(idx_t) == 4) { try { long long zgno = (long long)1 << 40; Zoltan2::TPL_Traits<idx_t,long long>::ASSIGN_TPL_T(parmetisIdx, zgno); } catch (std::exception &e) { PRINTMSG("GOOD: big long long to 4-byte ParMETIS' idx_t throws exception"); } try { size_t zgno = (size_t)1 << 40; Zoltan2::TPL_Traits<idx_t,size_t>::ASSIGN_TPL_T(parmetisIdx, zgno); } catch (std::exception &e) { PRINTMSG("GOOD: big size_t to 4-byte ParMETIS' idx_t throws exception"); } } #endif /////////////////////////////////////////////////////////// // Test conversions into ZOLTAN_ID_PTR ZOLTAN_ID_PTR zoltanGID = new ZOLTAN_ID_TYPE[4]; { typedef char test_t; test_t zgno = 'a'; zoltanGID[0] = 0; zoltanGID[1] = 0; zoltanGID[2] = 0; zoltanGID[3] = 0; Zoltan2::TPL_Traits<ZOLTAN_ID_PTR,test_t>::ASSIGN_TPL_T(zoltanGID, zgno); if (zoltanGID[0] != ZOLTAN_ID_TYPE(zgno) || zoltanGID[1] != 0 || zoltanGID[2] != 0 || zoltanGID[3] != 0) { PRINTMSG("FAIL: int to ZOLTAN_ID_PTR"); ierr++; } } { typedef short test_t; test_t zgno = 63; zoltanGID[0] = 0; zoltanGID[1] = 0; zoltanGID[2] = 0; zoltanGID[3] = 0; Zoltan2::TPL_Traits<ZOLTAN_ID_PTR,test_t>::ASSIGN_TPL_T(zoltanGID, zgno); if (zoltanGID[0] != ZOLTAN_ID_TYPE(zgno) || zoltanGID[1] != 0 || zoltanGID[2] != 0 || zoltanGID[3] != 0) { PRINTMSG("FAIL: int to ZOLTAN_ID_PTR"); ierr++; } } { typedef int test_t; test_t zgno = 123; zoltanGID[0] = 0; zoltanGID[1] = 0; zoltanGID[2] = 0; zoltanGID[3] = 0; Zoltan2::TPL_Traits<ZOLTAN_ID_PTR,test_t>::ASSIGN_TPL_T(zoltanGID, zgno); if (zoltanGID[0] != ZOLTAN_ID_TYPE(zgno) || zoltanGID[1] != 0 || zoltanGID[2] != 0 || zoltanGID[3] != 0) { PRINTMSG("FAIL: int to ZOLTAN_ID_PTR"); ierr++; } } { typedef unsigned int test_t; test_t zgno = 456; zoltanGID[0] = 0; zoltanGID[1] = 0; zoltanGID[2] = 0; zoltanGID[3] = 0; Zoltan2::TPL_Traits<ZOLTAN_ID_PTR,test_t>::ASSIGN_TPL_T(zoltanGID, zgno); if (zoltanGID[0] != zgno || zoltanGID[1] != 0 || zoltanGID[2] != 0 || zoltanGID[3] != 0) { PRINTMSG("FAIL: unsigned int to ZOLTAN_ID_PTR"); ierr++; } } { typedef long long test_t; test_t zgno = ((test_t)1 << 34) + (test_t)17; zoltanGID[0] = 0; zoltanGID[1] = 0; zoltanGID[2] = 0; zoltanGID[3] = 0; Zoltan2::TPL_Traits<ZOLTAN_ID_PTR,test_t>::ASSIGN_TPL_T(zoltanGID, zgno); if (zoltanGID[0] != 17 || zoltanGID[1] != 4 || zoltanGID[2] != 0 || zoltanGID[3] != 0) { PRINTMSG("FAIL: long long to ZOLTAN_ID_PTR"); ierr++; } } { typedef unsigned long long test_t; test_t zgno = ((test_t)1 << 36) + (test_t)25; zoltanGID[0] = 0; zoltanGID[1] = 0; zoltanGID[2] = 0; zoltanGID[3] = 0; Zoltan2::TPL_Traits<ZOLTAN_ID_PTR,test_t>::ASSIGN_TPL_T(zoltanGID, zgno); if (zoltanGID[0] != 25 || zoltanGID[1] != 16 || zoltanGID[2] != 0 || zoltanGID[3] != 0) { PRINTMSG("FAIL: unsigned long long to ZOLTAN_ID_PTR"); ierr++; } } { typedef size_t test_t; test_t zgno = 0; for (size_t i = 0; i < 8*sizeof(test_t); i++) zgno += (test_t)1<<i; zoltanGID[0] = 0; zoltanGID[1] = 0; zoltanGID[2] = 0; zoltanGID[3] = 0; Zoltan2::TPL_Traits<ZOLTAN_ID_PTR,test_t>::ASSIGN_TPL_T(zoltanGID, zgno); int num_gid = sizeof(test_t) / sizeof(ZOLTAN_ID_TYPE); for (int i = 0; i < num_gid; i++) if (zoltanGID[i] != std::numeric_limits<ZOLTAN_ID_TYPE>::max()) { PRINTMSG("FAIL: size_t to ZOLTAN_ID_PTR"); ierr++; } for (int i = num_gid; i < 4; i++) if (zoltanGID[i] != 0) { PRINTMSG("FAIL: size_t to ZOLTAN_ID_PTR"); ierr++; } } delete [] zoltanGID; /////////////////////////////////////////////////////////// if (ierr == 0) std::cout << "PASS" << std::endl; else std::cout << "FAIL" << std::endl; return 0; }