Actual source code: rcm.c

  1: #ifdef PETSC_RCS_HEADER
  2: static char vcid[] = "$Id: rcm.c,v 1.4 2000/01/10 03:54:21 knepley Exp $";
  3: #endif

 5:  #include src/mesh/impls/triangular/triimpl.h
 6:  #include src/mat/order/order.h

  8: EXTERN_C_BEGIN
  9: /*
 10:     MeshOrdering_Triangular_2D_RCM - Find the Reverse Cuthill-McKee ordering for the nodes of a given mesh.
 11: */
 12: int MeshOrdering_Triangular_2D_RCM(Mesh mesh, MatOrderingType type, AO *ordering)
 13: {
 14:   int        numNodes  = mesh->numNodes;
 15:   PetscTruth constrain = PETSC_FALSE;
 16:   int       *AppOrdering;   /* The initial ordering (0, 1, ...) */
 17:   int       *PetscOrdering; /* The RCM ordering */
 18:   int       *offsets, *adj; /* The graph in CSR format */
 19:   int       *mask;          /* Nodes with >0 are ignored, and once a node is seen it gets its number */
 20:   int       *levels;        /* The level structure of the mesh */
 21:   int        numVertices, numEdges;
 22:   int        i;
 23:   PetscTruth opt;
 24:   int        ierr;

 26:   PetscMalloc(numNodes   * sizeof(int), &AppOrdering);
 27:   PetscMalloc(numNodes   * sizeof(int), &PetscOrdering);
 28:   PetscMalloc(numNodes   * sizeof(int), &mask);
 29:   PetscMalloc(numNodes*2 * sizeof(int), &levels);

 31:   PetscOptionsHasName(mesh->prefix, "-mesh_reorder_constrain", &opt);
 32:   if (opt == PETSC_TRUE)
 33:     constrain = PETSC_TRUE;
 34:   MeshCreateFullCSR(mesh, constrain, &numVertices, &numEdges, &offsets, &adj);
 35:   if (numVertices != numNodes) SETERRQ(PETSC_ERR_PLIB, "Invalid full graph of the mesh");
 36:   /* Identity ordering originally */
 37:   for(i = 0; i < numNodes; i++) {
 38:     PetscOrdering[i] = i;
 39:   }
 40:   /* Must shift numbering for SPARSEPAK */
 41:   for(i = 0; i < offsets[numNodes]; i++) {
 42:     adj[i]++;
 43:   }
 44:   for(i = 0; i <= numNodes; i++) {
 45:     offsets[i]++;
 46:   }
 47:   SPARSEPACKgenrcm(&numNodes, offsets, adj, AppOrdering, mask, levels);
 48:   for(i = 0; i < numNodes; i++) {
 49:     AppOrdering[i]--;
 50:   }
 51:   MeshDestroyFullCSR(mesh, offsets, adj);
 52:   /* Create the ordering object */
 53:   AOCreateBasic(mesh->comm, numNodes, AppOrdering, PetscOrdering, ordering);

 55:   PetscFree(AppOrdering);
 56:   PetscFree(PetscOrdering);
 57:   PetscFree(mask);
 58:   PetscFree(levels);
 59:   return(0);
 60: }
 61: EXTERN_C_END