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: */
 14: int MeshOrdering_Triangular_2D_RCM(Mesh mesh, MatOrderingType type, AO *ordering)
 15: {
 16:   int        numNodes  = mesh->numNodes;
 17:   PetscTruth constrain = PETSC_FALSE;
 18:   int       *AppOrdering;   /* The initial ordering (0, 1, ...) */
 19:   int       *PetscOrdering; /* The RCM ordering */
 20:   int       *offsets, *adj; /* The graph in CSR format */
 21:   int       *mask;          /* Nodes with >0 are ignored, and once a node is seen it gets its number */
 22:   int       *levels;        /* The level structure of the mesh */
 23:   int        numVertices, numEdges;
 24:   int        i;
 25:   PetscTruth opt;
 26:   int        ierr;

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

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

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