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