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