xref: /petsc/src/dm/impls/network/networkview.c (revision d2fd593289181a4ba3c3886bbf269a930248cfe8)
1*d2fd5932SHong Zhang #include <petsc/private/dmnetworkimpl.h> /*I  "petscdmnetwork.h"  I*/
2*d2fd5932SHong Zhang 
3*d2fd5932SHong Zhang PetscErrorCode DMView_Network(DM dm, PetscViewer viewer)
4*d2fd5932SHong Zhang {
5*d2fd5932SHong Zhang   PetscBool   iascii;
6*d2fd5932SHong Zhang   PetscMPIInt rank;
7*d2fd5932SHong Zhang 
8*d2fd5932SHong Zhang   PetscFunctionBegin;
9*d2fd5932SHong Zhang   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
10*d2fd5932SHong Zhang   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2);
11*d2fd5932SHong Zhang   PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)dm), &rank));
12*d2fd5932SHong Zhang   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii));
13*d2fd5932SHong Zhang   if (iascii) {
14*d2fd5932SHong Zhang     const PetscInt *cone, *vtx, *edges;
15*d2fd5932SHong Zhang     PetscInt        vfrom, vto, i, j, nv, ne, nsv, p, nsubnet;
16*d2fd5932SHong Zhang     DM_Network     *network = (DM_Network *)dm->data;
17*d2fd5932SHong Zhang 
18*d2fd5932SHong Zhang     nsubnet = network->cloneshared->Nsubnet; /* num of subnetworks */
19*d2fd5932SHong Zhang     if (rank == 0) {
20*d2fd5932SHong Zhang       PetscCall(PetscPrintf(PETSC_COMM_SELF, "  NSubnets: %" PetscInt_FMT "; NEdges: %" PetscInt_FMT "; NVertices: %" PetscInt_FMT "; NSharedVertices: %" PetscInt_FMT ".\n", nsubnet, network->cloneshared->NEdges, network->cloneshared->NVertices,
21*d2fd5932SHong Zhang                             network->cloneshared->Nsvtx));
22*d2fd5932SHong Zhang     }
23*d2fd5932SHong Zhang 
24*d2fd5932SHong Zhang     PetscCall(DMNetworkGetSharedVertices(dm, &nsv, NULL));
25*d2fd5932SHong Zhang     PetscCall(PetscViewerASCIIPushSynchronized(viewer));
26*d2fd5932SHong Zhang     PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "  [%d] nEdges: %" PetscInt_FMT "; nVertices: %" PetscInt_FMT "; nSharedVertices: %" PetscInt_FMT "\n", rank, network->cloneshared->nEdges, network->cloneshared->nVertices, nsv));
27*d2fd5932SHong Zhang 
28*d2fd5932SHong Zhang     for (i = 0; i < nsubnet; i++) {
29*d2fd5932SHong Zhang       PetscCall(DMNetworkGetSubnetwork(dm, i, &nv, &ne, &vtx, &edges));
30*d2fd5932SHong Zhang       if (ne) {
31*d2fd5932SHong Zhang         PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "     Subnet %" PetscInt_FMT ": nEdges %" PetscInt_FMT ", nVertices(include shared vertices) %" PetscInt_FMT "\n", i, ne, nv));
32*d2fd5932SHong Zhang         for (j = 0; j < ne; j++) {
33*d2fd5932SHong Zhang           p = edges[j];
34*d2fd5932SHong Zhang           PetscCall(DMNetworkGetConnectedVertices(dm, p, &cone));
35*d2fd5932SHong Zhang           PetscCall(DMNetworkGetGlobalVertexIndex(dm, cone[0], &vfrom));
36*d2fd5932SHong Zhang           PetscCall(DMNetworkGetGlobalVertexIndex(dm, cone[1], &vto));
37*d2fd5932SHong Zhang           PetscCall(DMNetworkGetGlobalEdgeIndex(dm, edges[j], &p));
38*d2fd5932SHong Zhang           PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "       edge %" PetscInt_FMT ": %" PetscInt_FMT " ----> %" PetscInt_FMT "\n", p, vfrom, vto));
39*d2fd5932SHong Zhang         }
40*d2fd5932SHong Zhang       }
41*d2fd5932SHong Zhang     }
42*d2fd5932SHong Zhang 
43*d2fd5932SHong Zhang     /* Shared vertices */
44*d2fd5932SHong Zhang     PetscCall(DMNetworkGetSharedVertices(dm, NULL, &vtx));
45*d2fd5932SHong Zhang     if (nsv) {
46*d2fd5932SHong Zhang       PetscInt        gidx;
47*d2fd5932SHong Zhang       PetscBool       ghost;
48*d2fd5932SHong Zhang       const PetscInt *sv = NULL;
49*d2fd5932SHong Zhang 
50*d2fd5932SHong Zhang       PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "     SharedVertices:\n"));
51*d2fd5932SHong Zhang       for (i = 0; i < nsv; i++) {
52*d2fd5932SHong Zhang         PetscCall(DMNetworkIsGhostVertex(dm, vtx[i], &ghost));
53*d2fd5932SHong Zhang         if (ghost) continue;
54*d2fd5932SHong Zhang 
55*d2fd5932SHong Zhang         PetscCall(DMNetworkSharedVertexGetInfo(dm, vtx[i], &gidx, &nv, &sv));
56*d2fd5932SHong Zhang         PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "       svtx %" PetscInt_FMT ": global index %" PetscInt_FMT ", subnet[%" PetscInt_FMT "].%" PetscInt_FMT " ---->\n", i, gidx, sv[0], sv[1]));
57*d2fd5932SHong Zhang         for (j = 1; j < nv; j++) PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "                                           ----> subnet[%" PetscInt_FMT "].%" PetscInt_FMT "\n", sv[2 * j], sv[2 * j + 1]));
58*d2fd5932SHong Zhang       }
59*d2fd5932SHong Zhang     }
60*d2fd5932SHong Zhang     PetscCall(PetscViewerFlush(viewer));
61*d2fd5932SHong Zhang     PetscCall(PetscViewerASCIIPopSynchronized(viewer));
62*d2fd5932SHong Zhang   } else PetscCheck(iascii, PetscObjectComm((PetscObject)dm), PETSC_ERR_SUP, "Viewer type %s not yet supported for DMNetwork writing", ((PetscObject)viewer)->type_name);
63*d2fd5932SHong Zhang   PetscFunctionReturn(PETSC_SUCCESS);
64*d2fd5932SHong Zhang }
65