void test_MatrixGraph_test8(MPI_Comm comm, int numProcs, int localProc) { FEI_COUT << "testing matrix-graph with 'diagonal' connectivity block..."; try { fei::SharedPtr<fei::VectorSpace> rowspace(new fei::VectorSpace(comm)); fei::SharedPtr<fei::VectorSpace> colspace; int rowfield = 0, rowfieldsize = 1; rowspace->defineFields(1, &rowfield, &rowfieldsize); int idType = 0; rowspace->defineIDTypes(1, &idType); fei::MatrixGraph_Impl2 mgraph(rowspace, colspace); int numIDs = 4; int patternID = mgraph.definePattern(numIDs, idType, rowfield); fei::Pattern* pattern = mgraph.getPattern(patternID); if (pattern->getNumIndices() != 4*rowfieldsize) { FEI_OSTRINGSTREAM osstr; osstr << "test_MatrixGraph_test8, line "<<__LINE__<<FEI_ENDL; throw std::runtime_error(osstr.str()); } int blockID = 0; int numConnLists = 1; bool diagonal = true; mgraph.initConnectivityBlock(blockID, numConnLists, patternID, diagonal); std::vector<int> ids(numIDs); for(int i=0; i<numIDs; ++i) { ids[i] = i; } mgraph.initConnectivity(blockID, 0, &ids[0]); mgraph.initComplete(); fei::SharedPtr<fei::SparseRowGraph> localSRGraph = mgraph.createGraph(false); if ((int)localSRGraph->packedColumnIndices.size() != numIDs) { FEI_OSTRINGSTREAM osstr; osstr << "test_MatrixGraph_test8, line "<<__LINE__<<FEI_ENDL; throw std::runtime_error(osstr.str()); } } catch(std::runtime_error& exc) { FEI_OSTRINGSTREAM osstr; osstr << "test_MatrixGraph_test8, caught exception: " << exc.what(); throw std::runtime_error(osstr.str()); } FEI_COUT << "ok" << FEI_ENDL; }
void test_MatrixGraph_test7(MPI_Comm comm, int numProcs, int localProc) { fei::SharedPtr<fei::VectorSpace> rowspace(new fei::VectorSpace(comm)); fei::SharedPtr<fei::VectorSpace> colspace(new fei::VectorSpace(comm)); int rowfield = 0, rowfieldsize = 1; int colfield = 1, colfieldsize = 3; rowspace->defineFields(1, &rowfield, &rowfieldsize); colspace->defineFields(1, &colfield, &colfieldsize); fei::MatrixGraph_Impl2 mgraph(rowspace, colspace); int pID = mgraph.definePattern(4, 0, colfield); fei::Pattern* pattern = mgraph.getPattern(pID); if (pattern->getNumIndices() != 4*colfieldsize) { FEI_COUT << "getNumIndices: " << pattern->getNumIndices()<<", colfieldsize: " << colfieldsize<<FEI_ENDL; FEI_OSTRINGSTREAM osstr; osstr << "test_MatrixGraph_test7, line "<<__LINE__<<FEI_ENDL; throw std::runtime_error(osstr.str()); } }
void test_Matrix_unit2(MPI_Comm comm, int numProcs, int localProc) { if (numProcs > 1) { return; } FEI_COUT << "testing fei::Matrix_Impl..."; fei::SharedPtr<fei::VectorSpace> rowspace(new fei::VectorSpace(comm)); fei::SharedPtr<fei::VectorSpace> colspace; int rowfield = 0, rowfieldsize = 1; int idType = 0; rowspace->defineFields(1, &rowfield, &rowfieldsize); rowspace->defineIDTypes(1, &idType); fei::SharedPtr<fei::MatrixGraph> mgraph(new fei::MatrixGraph_Impl2(rowspace, colspace)); int patternID1 = mgraph->definePattern(2, idType, rowfield); fei::Pattern* rowpattern = mgraph->getPattern(patternID1); mgraph->initConnectivityBlock(0, 1, patternID1); std::vector<int> ids(2); ids[0] = 0; ids[1] = 1; int err = mgraph->initConnectivity(0, 0, &ids[0]); if (err) { FEI_OSTRINGSTREAM osstr; osstr << "test_Matrix_unit2, initConnectivity returned err="<<err; throw std::runtime_error(osstr.str()); } err = mgraph->initComplete(); if (err) { FEI_OSTRINGSTREAM osstr; osstr << "test_Matrix_unit2, initComplete returned err="<<err; throw std::runtime_error(osstr.str()); } bool factory_created = false; fei::SharedPtr<fei::Factory> factory; try { factory = fei::create_fei_Factory(comm, "Trilinos"); factory_created = true; } catch(...) {} if (!factory_created) { FEI_COUT << "failed to create Trilinos factory."<<FEI_ENDL; return; } fei::SharedPtr<fei::Matrix> feimat = factory->createMatrix(mgraph); int numrowindices = rowpattern->getNumIndices(); std::vector<double> coefs(numrowindices*numrowindices, 1.0); std::vector<double*> coefs_2D(numrowindices); for(int i=0; i<numrowindices; ++i) { coefs_2D[i] = &(coefs[i*numrowindices]); } err = feimat->sumIn(0, 0, &coefs_2D[0]); if (err) { FEI_OSTRINGSTREAM osstr; osstr << "test_Matrix_unit2, feimat->sumIn returned err="<<err; throw std::runtime_error(osstr.str()); } err = feimat->globalAssemble(); if (err) { FEI_OSTRINGSTREAM osstr; osstr << "test_Matrix_unit2, feimat->globalAssemble returned err="<<err; throw std::runtime_error(osstr.str()); } err = feimat->writeToFile("feimat2.mtx", false); if (err) { FEI_OSTRINGSTREAM osstr; osstr << "test_Matrix_unit2, feimat->writeToFile returned err="<<err; throw std::runtime_error(osstr.str()); } fei::FillableMat feimat_ss; err = fei_test_utils::copy_feiMatrix_to_FillableMat(*feimat, feimat_ss); if (err) { FEI_OSTRINGSTREAM osstr; osstr << "test_Matrix_unit2, copy_feiMatrix_to_FillableMat returned err="<<err; throw std::runtime_error(osstr.str()); } fei_test_utils::writeMatrix("feimat_ss2.mtx", feimat_ss); FEI_COUT << "ok"<<FEI_ENDL; }
void test_Matrix_unit4(MPI_Comm comm, int numProcs, int localProc) { if (numProcs > 1) { return; } FEI_COUT << "testing fei::Matrix_Impl with FEI_BLOCK_DIAGONAL_ROW..."; fei::SharedPtr<fei::VectorSpace> rowspace(new fei::VectorSpace(comm)); fei::SharedPtr<fei::VectorSpace> colspace; int rowfield = 0, rowfieldsize = 2; int idType = 0; rowspace->defineFields(1, &rowfield, &rowfieldsize); rowspace->defineIDTypes(1, &idType); fei::SharedPtr<fei::MatrixGraph> mgraph(new fei::MatrixGraph_Impl2(rowspace, colspace)); int patternID1 = mgraph->definePattern(2, idType, rowfield); fei::Pattern* rowpattern = mgraph->getPattern(patternID1); bool diagonal = true; mgraph->initConnectivityBlock(0, 1, patternID1, diagonal); std::vector<int> ids(2); ids[0] = 0; ids[1] = 1; int err = mgraph->initConnectivity(0, 0, &ids[0]); if (err) { FEI_OSTRINGSTREAM osstr; osstr << "test_Matrix_unit4, initConnectivity returned err="<<err; throw std::runtime_error(osstr.str()); } err = mgraph->initComplete(); if (err) { FEI_OSTRINGSTREAM osstr; osstr << "test_Matrix_unit4, initComplete returned err="<<err; throw std::runtime_error(osstr.str()); } fei::SharedPtr<fei::Factory> factory; try { factory = fei::create_fei_Factory(comm, "Trilinos"); } catch(...) { FEI_COUT << "Trilinos not available."<<FEI_ENDL; return; } fei::Param blktrue("BLOCK_MATRIX", true); fei::Param blkfalse("BLOCK_MATRIX", false); fei::ParameterSet paramset; paramset.add(blktrue); factory->parameters(paramset); fei::SharedPtr<fei::Matrix> feiblkmat = factory->createMatrix(mgraph); paramset.add(blkfalse); factory->parameters(paramset); fei::SharedPtr<fei::Matrix> feimat = factory->createMatrix(mgraph); int numrowindices = rowpattern->getNumIndices(); std::vector<double> coefs(numrowindices*rowfieldsize*rowfieldsize, 1.0); std::vector<double*> coefs_2D(numrowindices*rowfieldsize); int offset = 0; for(int i=0; i<numrowindices*rowfieldsize; ++i) { coefs_2D[i] = &(coefs[offset]); offset += rowfieldsize; } err = feimat->sumIn(0, 0, &coefs_2D[0], FEI_BLOCK_DIAGONAL_ROW); if (err) { FEI_OSTRINGSTREAM osstr; osstr << "test_Matrix_unit4, feimat->sumIn returned err="<<err; throw std::runtime_error(osstr.str()); } err = feiblkmat->sumIn(0, 0, &coefs_2D[0], FEI_BLOCK_DIAGONAL_ROW); if (err) { FEI_OSTRINGSTREAM osstr; osstr << "test_Matrix_unit4, feiblkmat->sumIn returned err="<<err; throw std::runtime_error(osstr.str()); } err = feimat->globalAssemble(); if (err) { FEI_OSTRINGSTREAM osstr; osstr << "test_Matrix_unit4, feimat->globalAssemble returned err="<<err; throw std::runtime_error(osstr.str()); } err = feiblkmat->globalAssemble(); if (err) { FEI_OSTRINGSTREAM osstr; osstr << "test_Matrix_unit4, feimat->globalAssemble returned err="<<err; throw std::runtime_error(osstr.str()); } feimat->writeToFile("feimat_blkdiag.mtx"); feiblkmat->writeToFile("feiblkmat_blkdiag.mtx"); FEI_COUT << "ok"<<FEI_ENDL; }
TEUCHOS_UNIT_TEST(MatGraph, MatGraph_test1) { int numprocs = fei::numProcs(MPI_COMM_WORLD); if (numprocs > 1) return; //two id-types: 0, 1: int idT[] = {0, 1}; snl_fei::RecordCollection* recColls[] = {NULL,NULL}; //set up a pattern for an element that has 6 ids: 3 nodes and 3 edges. const int numIDs = 6; //assume 0 is the node-type and 1 is the edge-type: int idTypes[] = {0, 0, 0, 1, 1, 1}; //for the first pattern, only the edge ids will have a field attached: int fieldsPerID[] = {0, 0, 0, 1, 1, 1}; int fieldID = 0; int fieldSize = 1; int fieldIDs[] = {fieldID, fieldID, fieldID}; int fieldSizes[] = {fieldSize, fieldSize, fieldSize}; fei::Pattern pattern1(numIDs, &idTypes[0], &recColls[0], &fieldsPerID[0], &fieldIDs[0], &fieldSizes[0]); //declare a vector-space, do some rudimentary initializations: fei::SharedPtr<fei::VectorSpace> rowspace(new fei::VectorSpace(MPI_COMM_WORLD)); rowspace->defineIDTypes(2, &idT[0]); rowspace->defineFields(1, &fieldID, &fieldSize); fei::SharedPtr<fei::VectorSpace> colspace; //declare a matrix-graph: fei::MatrixGraph_Impl2 mgraph(rowspace, colspace); int patternID1 = mgraph.definePattern(numIDs, &idTypes[0], &fieldsPerID[0], &fieldIDs[0]); //unit-test: make sure the matrix-graph's pattern is the same as our //explicitly-declared pattern: fei::Pattern* pttn1 = mgraph.getPattern(patternID1); TEUCHOS_TEST_EQUALITY(pattern1 == *pttn1, true, out, success); //now declare a second pattern which is the same except now fields are //attached to nodes instead of edges: fieldsPerID[0] = 1; fieldsPerID[1] = 1; fieldsPerID[2] = 1; fieldsPerID[3] = 0; fieldsPerID[4] = 0; fieldsPerID[5] = 0; fei::Pattern pattern2(numIDs, &idTypes[0], &recColls[0], &fieldsPerID[0], &fieldIDs[0], &fieldSizes[0]); int patternID2 = mgraph.definePattern(numIDs, &idTypes[0], &fieldsPerID[0], &fieldIDs[0]); fei::Pattern* pttn2 = mgraph.getPattern(patternID2); TEUCHOS_TEST_EQUALITY(pattern2 == *pttn2, true, out, success); //declare two element-blocks, one for each pattern. each element block will have //just one element: mgraph.initConnectivityBlock(0, 1, patternID1); mgraph.initConnectivityBlock(1, 1, patternID2); //Two-element mesh, each element has 3 vertex-nodes, and 3 edges: /* 0 1 o---4--o \ | \ \ | \ 5 6 7 \ | \ \ | \ o---8--o 2 3 */ //the first element has nodes 0, 1, 2 and edges 4, 5, 6: int ids0[] = {0, 1, 2, 4, 5, 6}; mgraph.initConnectivity(0, 0, &ids0[0]); //the second element has nodes 1, 2, 3 and edges 6, 7, 8: int ids1[] = {1, 2, 3, 6, 7, 8}; mgraph.initConnectivity(1, 0, &ids1[0]); mgraph.initComplete(); fei::SharedPtr<fei::SparseRowGraph> srg = mgraph.createGraph(false); //The way we set things up, the graph should have 6 rows, //with 3 nonzeros per row: TEUCHOS_TEST_EQUALITY(srg->rowNumbers.size(), 6, out, success); TEUCHOS_TEST_EQUALITY(srg->packedColumnIndices.size(), 18, out, success); }