void Foam::pamgPolicy::calcChild() { // Algorithm: // 1) Create temporary equation addressing using a double-pass algorithm. // to create the offset table. // 2) Loop through all equations and for each equation find the best fit // neighbour. If all neighbours are grouped, add equation to best group // Get addressing const label nEqns = matrix_.lduAddr().size(); const unallocLabelList& upperAddr = matrix_.lduAddr().upperAddr(); const unallocLabelList& lowerAddr = matrix_.lduAddr().lowerAddr(); // Get off-diagonal matrix coefficients const scalarField& upper = matrix_.upper(); // For each equation calculate coeffs labelList cols(upperAddr.size() + lowerAddr.size()); labelList rowOffsets(nEqns + 1); // Memory management { labelList nNbrs(nEqns, 0); forAll (upperAddr, coeffI) { nNbrs[upperAddr[coeffI]]++; } forAll (lowerAddr, coeffI) { nNbrs[lowerAddr[coeffI]]++; } rowOffsets[0] = 0; forAll (nNbrs, eqnI) { rowOffsets[eqnI + 1] = rowOffsets[eqnI] + nNbrs[eqnI]; } // Reset the list to use as counter nNbrs = 0; forAll (upperAddr, coeffI) { cols [ rowOffsets[upperAddr[coeffI]] + nNbrs[upperAddr[coeffI]] ] = coeffI; nNbrs[upperAddr[coeffI]]++; }
//! Returns an array containing the first index of a given row Index rowOffset( Index row ) const { return rowOffsets()[ row ] ; }
int test_Algebraic::serialtest1() { int i, numRows = 10; fei::SharedPtr<fei::VectorSpace> vspace(new fei::VectorSpace(comm_)); int idType = 0; vspace->defineIDTypes(1, &idType); std::vector<int> rowNumbers(numRows); for(i=0; i<numRows; ++i) { rowNumbers[i] = i; } CHK_ERR( vspace->addDOFs(idType, numRows, &rowNumbers[0]) ); CHK_ERR( vspace->initComplete() ); int index = -1; CHK_ERR( vspace->getGlobalIndex(idType, rowNumbers[3], index) ); if (index != 3) { ERReturn(-1); } int numDOF = vspace->getNumDegreesOfFreedom(idType, rowNumbers[3]); if (numDOF != 1) { ERReturn(-1); } std::vector<int> globalOffsets; vspace->getGlobalIndexOffsets(globalOffsets); if (globalOffsets[0] != 0) { ERReturn(-1); } if (globalOffsets[1] != numRows) { ERReturn(-1); } fei::SharedPtr<fei::VectorSpace> dummy; fei::MatrixGraph_Impl2 mgraph(vspace, dummy); std::vector<int> rowOffsets(numRows+1); std::vector<int> packedColumnIDs(numRows); for(i=0; i<numRows; ++i) { rowOffsets[i] = i; packedColumnIDs[i] = i; } rowOffsets[numRows] = numRows; CHK_ERR( mgraph.initConnectivity(idType, numRows, &rowNumbers[0], &rowOffsets[0], &packedColumnIDs[0]) ); CHK_ERR( mgraph.initComplete() ); fei::SharedPtr<fei::SparseRowGraph> localgraph = mgraph.createGraph(false); int mnumRows = localgraph->rowNumbers.size(); int* mrowOffsets = &(localgraph->rowOffsets[0]); int mnumNonzeros = localgraph->packedColumnIndices.size(); int* mpackedColumnIndices = &(localgraph->packedColumnIndices[0]); if (mnumRows != numRows) { ERReturn(-1); } if (mnumNonzeros != numRows) { ERReturn(-1); } for(i=0; i<numRows; ++i) { if ((mrowOffsets[i+1]-mrowOffsets[i]) != 1) { ERReturn(-1); } if (mpackedColumnIndices[i] != packedColumnIDs[i]) { ERReturn(-1); } } return(0); }