Esempio n. 1
0
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 ] ; }
Esempio n. 3
0
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);
}