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