void TetMeshRenderUtil<Scalar>::initTetrahedronRenderUtil(bool auto_compute_normal) { unsigned int point_num = mesh_->vertNum(); std::vector<Vector<Scalar, 3>> pos_vec(point_num); for (unsigned int i = 0; i < point_num; ++i) pos_vec[i] = mesh_->vertPos(i); unsigned int ele_num = mesh_->eleNum(); std::vector<unsigned int> indices_vec(4 * ele_num); for(unsigned int i = 0; i < ele_num; ++i) { indices_vec[4 * i] = mesh_->eleVertIndex(i, 0); indices_vec[4 * i + 1] = mesh_->eleVertIndex(i, 1); indices_vec[4 * i + 2] = mesh_->eleVertIndex(i, 2); indices_vec[4 * i + 3] = mesh_->eleVertIndex(i, 3); } tet_render_util_->setTetrahedrons(pos_vec, indices_vec, auto_compute_normal); }
int main(int argc, char *argv[]) { int ierr = 0; int i; int forierr = 0; long long* Indices; bool debug = true; #ifdef EPETRA_MPI // Initialize MPI MPI_Init(&argc,&argv); int rank; // My process ID MPI_Comm_rank(MPI_COMM_WORLD, &rank); Epetra_MpiComm Comm( MPI_COMM_WORLD ); #else int rank = 0; Epetra_SerialComm Comm; #endif bool verbose = false; // Check if we should print results to standard out if(argc > 1) { if(argv[1][0]=='-' && argv[1][1]=='v') { verbose = true; } } //char tmp; //if (rank==0) cout << "Press any key to continue..."<< endl; //if (rank==0) cin >> tmp; //Comm.Barrier(); Comm.SetTracebackMode(0); // This should shut down any error traceback reporting int MyPID = Comm.MyPID(); int NumProc = Comm.NumProc(); if(verbose && MyPID==0) cout << Epetra_Version() << endl << endl; if(verbose) cout << "Processor "<<MyPID<<" of "<< NumProc << " is alive." << endl; bool verbose1 = verbose; // Redefine verbose to only print on PE 0 if(verbose && rank != 0) verbose = false; int NumMyEquations = 5; long long NumGlobalEquations = NumMyEquations*NumProc+EPETRA_MIN(NumProc,3); if(MyPID < 3) NumMyEquations++; // Construct a Map that puts approximately the same Number of equations on each processor Epetra_Map& Map = *new Epetra_Map(NumGlobalEquations, NumMyEquations, 0, Comm); // Get update list and number of local equations from newly created Map long long* MyGlobalElements = new long long[Map.NumMyElements()]; Map.MyGlobalElements(MyGlobalElements); // Create an integer vector NumNz that is used to build the Petra Matrix. // NumNz[i] is the Number of OFF-DIAGONAL term for the ith global equation on this processor int* NumNz = new int[NumMyEquations]; // We are building a tridiagonal matrix where each row has (-1 2 -1) // So we need 2 off-diagonal terms (except for the first and last equation) for(i=0; i<NumMyEquations; i++) if(MyGlobalElements[i]==0 || MyGlobalElements[i] == NumGlobalEquations-1) NumNz[i] = 1; else NumNz[i] = 2; // Create a Epetra_CrsGraph Epetra_CrsGraph& A = *new Epetra_CrsGraph(Copy, Map, NumNz); EPETRA_TEST_ERR(A.IndicesAreGlobal(),ierr); EPETRA_TEST_ERR(A.IndicesAreLocal(),ierr); // Add rows one-at-a-time // Need some vectors to help // Off diagonal Values will always be -1 Indices = new long long[2]; int NumEntries; forierr = 0; for(i = 0; i < NumMyEquations; i++) { if(MyGlobalElements[i] == 0) { Indices[0] = 1; NumEntries = 1; } else if(MyGlobalElements[i] == NumGlobalEquations-1) { Indices[0] = NumGlobalEquations-2; NumEntries = 1; } else { Indices[0] = MyGlobalElements[i]-1; Indices[1] = MyGlobalElements[i]+1; NumEntries = 2; } forierr += !(A.InsertGlobalIndices(MyGlobalElements[i], NumEntries, Indices)==0); forierr += !(A.InsertGlobalIndices(MyGlobalElements[i], 1, MyGlobalElements+i)>0); // Put in the diagonal entry (should cause realloc) } EPETRA_TEST_ERR(forierr,ierr); //A.PrintGraphData(cout); delete[] Indices; long long gRID = A.GRID64(0); int numIndices = A.NumGlobalIndices(gRID); std::vector<long long> indices_vec(numIndices); A.ExtractGlobalRowCopy(gRID, numIndices, numIndices, &indices_vec[0]); A.RemoveGlobalIndices(gRID); EPETRA_TEST_ERR(!(A.NumGlobalIndices(gRID)==0),ierr); if (ierr != 0) cout << "tests FAILED" << std::endl; A.InsertGlobalIndices(gRID, numIndices, &indices_vec[0]); EPETRA_TEST_ERR(!(A.NumGlobalIndices(gRID)==numIndices),ierr); if (ierr != 0) cout << "tests FAILED" << std::endl; // Finish up EPETRA_TEST_ERR(!(A.IndicesAreGlobal()),ierr); EPETRA_TEST_ERR(!(A.FillComplete()==0),ierr); EPETRA_TEST_ERR(!(A.IndicesAreLocal()),ierr); EPETRA_TEST_ERR(A.StorageOptimized(),ierr); A.OptimizeStorage(); EPETRA_TEST_ERR(!(A.StorageOptimized()),ierr); EPETRA_TEST_ERR(A.UpperTriangular(),ierr); EPETRA_TEST_ERR(A.LowerTriangular(),ierr); if (ierr != 0) cout << "tests FAILED" << std::endl; EPETRA_TEST_ERR(A.NumMyDiagonals()-NumMyEquations,ierr); if (ierr != 0) cout << "tests FAILED" << std::endl; EPETRA_TEST_ERR(A.NumMyBlockDiagonals()-NumMyEquations,ierr); if (ierr != 0) cout << "tests FAILED" << std::endl; EPETRA_TEST_ERR(A.NumGlobalDiagonals64() == NumGlobalEquations ? 0 : 1,ierr); if (ierr != 0) cout << "tests FAILED" << std::endl; EPETRA_TEST_ERR(A.NumGlobalBlockDiagonals64() == NumGlobalEquations ? 0 : 1,ierr); if (ierr != 0) cout << "tests FAILED" << std::endl; if(verbose) cout << "\n*****Testing variable entry constructor\n" << endl; int NumMyNonzeros = 3 * NumMyEquations; if(A.LRID(0) >= 0) NumMyNonzeros--; // If I own first global row, then there is one less nonzero if(A.LRID(NumGlobalEquations-1) >= 0) NumMyNonzeros--; // If I own last global row, then there is one less nonzero EPETRA_TEST_ERR(check(A, NumMyEquations, NumGlobalEquations, NumMyNonzeros, 3*NumGlobalEquations-2, MyGlobalElements, verbose),ierr); forierr = 0; for(i = 0; i < NumMyEquations; i++) forierr += !(A.NumGlobalIndices(MyGlobalElements[i])==NumNz[i]+1); EPETRA_TEST_ERR(forierr,ierr); for(i = 0; i < NumMyEquations; i++) forierr += !(A.NumMyIndices(i)==NumNz[i]+1); EPETRA_TEST_ERR(forierr,ierr); if(verbose) cout << "NumIndices function check OK" << endl; delete &A; if(debug) Comm.Barrier(); if(verbose) cout << "\n*****Testing constant entry constructor\n" << endl; Epetra_CrsGraph& AA = *new Epetra_CrsGraph(Copy, Map, 5); if(debug) Comm.Barrier(); for(i = 0; i < NumMyEquations; i++) AA.InsertGlobalIndices(MyGlobalElements[i], 1, MyGlobalElements+i); // Note: All processors will call the following Insert routines, but only the processor // that owns it will actually do anything long long One = 1; if(AA.MyGlobalRow(0)) { EPETRA_TEST_ERR(!(AA.InsertGlobalIndices(0, 0, &One)==0),ierr); } else EPETRA_TEST_ERR(!(AA.InsertGlobalIndices(0, 1, &One)==-2),ierr); EPETRA_TEST_ERR(!(AA.FillComplete()==0),ierr); EPETRA_TEST_ERR(AA.StorageOptimized(),ierr); EPETRA_TEST_ERR(!(AA.UpperTriangular()),ierr); EPETRA_TEST_ERR(!(AA.LowerTriangular()),ierr); if(debug) Comm.Barrier(); EPETRA_TEST_ERR(check(AA, NumMyEquations, NumGlobalEquations, NumMyEquations, NumGlobalEquations, MyGlobalElements, verbose),ierr); if(debug) Comm.Barrier(); forierr = 0; for(i = 0; i < NumMyEquations; i++) forierr += !(AA.NumGlobalIndices(MyGlobalElements[i])==1); EPETRA_TEST_ERR(forierr,ierr); if(verbose) cout << "NumIndices function check OK" << endl; if(debug) Comm.Barrier(); if(verbose) cout << "\n*****Testing copy constructor\n" << endl; Epetra_CrsGraph& B = *new Epetra_CrsGraph(AA); delete &AA; EPETRA_TEST_ERR(check(B, NumMyEquations, NumGlobalEquations, NumMyEquations, NumGlobalEquations, MyGlobalElements, verbose),ierr); forierr = 0; for(i = 0; i < NumMyEquations; i++) forierr += !(B.NumGlobalIndices(MyGlobalElements[i])==1); EPETRA_TEST_ERR(forierr,ierr); if(verbose) cout << "NumIndices function check OK" << endl; if(debug) Comm.Barrier(); if(verbose) cout << "\n*****Testing post construction modifications\n" << endl; EPETRA_TEST_ERR(!(B.InsertGlobalIndices(0, 1, &One)==-2),ierr); delete &B; // Release all objects delete[] MyGlobalElements; delete[] NumNz; delete ⤅ if (verbose1) { // Test ostream << operator (if verbose1) // Construct a Map that puts 2 equations on each PE int NumMyElements1 = 4; int NumMyEquations1 = NumMyElements1; long long NumGlobalEquations1 = NumMyEquations1*NumProc; Epetra_Map& Map1 = *new Epetra_Map(NumGlobalEquations1, NumMyElements1, 1, Comm); // Get update list and number of local equations from newly created Map long long* MyGlobalElements1 = new long long[Map1.NumMyElements()]; Map1.MyGlobalElements(MyGlobalElements1); // Create an integer vector NumNz that is used to build the Petra Matrix. // NumNz[i] is the Number of OFF-DIAGONAL term for the ith global equation on this processor int* NumNz1 = new int[NumMyEquations1]; // We are building a tridiagonal matrix where each row has (-1 2 -1) // So we need 2 off-diagonal terms (except for the first and last equation) for(i = 0; i < NumMyEquations1; i++) if(MyGlobalElements1[i]==1 || MyGlobalElements1[i] == NumGlobalEquations1) NumNz1[i] = 1; else NumNz1[i] = 2; // Create a Epetra_Graph using 1-based arithmetic Epetra_CrsGraph& A1 = *new Epetra_CrsGraph(Copy, Map1, NumNz1); // Add rows one-at-a-time // Need some vectors to help // Off diagonal Values will always be -1 long long* Indices1 = new long long[2]; int NumEntries1; forierr = 0; for(i = 0; i < NumMyEquations1; i++) { if(MyGlobalElements1[i]==1) { Indices1[0] = 2; NumEntries1 = 1; } else if(MyGlobalElements1[i] == NumGlobalEquations1) { Indices1[0] = NumGlobalEquations1-1; NumEntries1 = 1; } else { Indices1[0] = MyGlobalElements1[i]-1; Indices1[1] = MyGlobalElements1[i]+1; NumEntries1 = 2; } forierr += !(A1.InsertGlobalIndices(MyGlobalElements1[i], NumEntries1, Indices1)==0); forierr += !(A1.InsertGlobalIndices(MyGlobalElements1[i], 1, MyGlobalElements1+i)>0); // Put in the diagonal entry } EPETRA_TEST_ERR(forierr,ierr); // Finish up EPETRA_TEST_ERR(!(A1.FillComplete()==0),ierr); if(verbose) cout << "Print out tridiagonal matrix, each part on each processor. Index base is one.\n" << endl; cout << A1 << endl; // Release all objects delete[] NumNz1; delete[] Indices1; delete[] MyGlobalElements1; delete &A1; delete &Map1; } // Test copy constructor, op=, and reference-counting int tempierr = 0; if(verbose) cout << "\n*****Checking cpy ctr, op=, and reference counting." << endl; tempierr = checkCopyAndAssignment(Comm, verbose); EPETRA_TEST_ERR(tempierr, ierr); if(verbose && (tempierr == 0)) cout << "Checked OK." << endl; // Test shared-ownership code (not implemented yet) tempierr = 0; if(verbose) cout << "\n*****Checking shared-ownership tests." << endl; tempierr = checkSharedOwnership(Comm, verbose); EPETRA_TEST_ERR(tempierr, ierr); if(verbose && (tempierr == 0)) cout << "Checked OK." << endl; #ifdef EPETRA_MPI MPI_Finalize() ; #endif /* end main */ return(ierr); }