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