xref: /petsc/src/dm/tests/ex10.c (revision 48a46eb9bd028bec07ec0f396b1a3abb43f14558)
1f11a936eSBarry Smith /*
25c6496baSHong Zhang     Simple example demonstrating creating a one sub-network DMNetwork in parallel.
35c6496baSHong Zhang 
45c6496baSHong Zhang     In this example vertices 0 and 1 are not connected to any edges.
5f11a936eSBarry Smith */
6f11a936eSBarry Smith 
7f11a936eSBarry Smith #include <petscdmnetwork.h>
8f11a936eSBarry Smith 
99371c9d4SSatish Balay int main(int argc, char **argv) {
10f11a936eSBarry Smith   DM              network;
11f11a936eSBarry Smith   PetscMPIInt     size, rank;
12f11a936eSBarry Smith   MPI_Comm        comm;
13eac198afSGetnet   PetscInt        e, ne, nv, v, ecompkey, vcompkey;
14f11a936eSBarry Smith   PetscInt       *edgelist = NULL;
15f11a936eSBarry Smith   const PetscInt *nodes, *edges;
16f11a936eSBarry Smith   DM              plex;
17f11a936eSBarry Smith   PetscSection    section;
18f11a936eSBarry Smith   PetscInt        Ne, Ni;
19f11a936eSBarry Smith   PetscInt        nodeOffset, k = 2, nedge;
20f11a936eSBarry Smith 
21327415f7SBarry Smith   PetscFunctionBeginUser;
229566063dSJacob Faibussowitsch   PetscCall(PetscInitialize(&argc, &argv, NULL, NULL));
239566063dSJacob Faibussowitsch   PetscCall(PetscOptionsSetValue(NULL, "-petscpartitioner_use_vertex_weights", "No"));
24f11a936eSBarry Smith   comm = PETSC_COMM_WORLD;
259566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(comm, &rank));
269566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(comm, &size));
27f11a936eSBarry Smith 
289566063dSJacob Faibussowitsch   PetscCall(DMNetworkCreate(PETSC_COMM_WORLD, &network));
29f11a936eSBarry Smith 
306aad120cSJose E. Roman   /* Register zero size components to get compkeys to be used by DMNetworkAddComponent() */
319566063dSJacob Faibussowitsch   PetscCall(DMNetworkRegisterComponent(network, "ecomp", 0, &ecompkey));
329566063dSJacob Faibussowitsch   PetscCall(DMNetworkRegisterComponent(network, "vcomp", 0, &vcompkey));
33eac198afSGetnet 
34f11a936eSBarry Smith   Ne         = 2;
35f11a936eSBarry Smith   Ni         = 1;
36f11a936eSBarry Smith   nodeOffset = (Ne + Ni) * rank; /* The global node index of the first node defined on this process */
37f11a936eSBarry Smith 
38f11a936eSBarry Smith   /* There are three nodes on each rank and two edges. The edges only connect nodes on the given rank */
39f11a936eSBarry Smith   nedge = k * Ni;
40f11a936eSBarry Smith 
415c6496baSHong Zhang   if (rank == 0) {
425c6496baSHong Zhang     nedge = 1;
439566063dSJacob Faibussowitsch     PetscCall(PetscCalloc1(2 * nedge, &edgelist));
445c6496baSHong Zhang     edgelist[0] = nodeOffset + 2;
455c6496baSHong Zhang     edgelist[1] = nodeOffset + 3;
465c6496baSHong Zhang   } else {
475c6496baSHong Zhang     nedge = 2;
489566063dSJacob Faibussowitsch     PetscCall(PetscCalloc1(2 * nedge, &edgelist));
49f11a936eSBarry Smith     edgelist[0] = nodeOffset + 0;
50f11a936eSBarry Smith     edgelist[1] = nodeOffset + 2;
51f11a936eSBarry Smith     edgelist[2] = nodeOffset + 1;
52f11a936eSBarry Smith     edgelist[3] = nodeOffset + 2;
535c6496baSHong Zhang   }
54f11a936eSBarry Smith 
559566063dSJacob Faibussowitsch   PetscCall(DMNetworkSetNumSubNetworks(network, PETSC_DECIDE, 1));
569566063dSJacob Faibussowitsch   PetscCall(DMNetworkAddSubnetwork(network, "Subnetwork 1", nedge, edgelist, NULL));
579566063dSJacob Faibussowitsch   PetscCall(DMNetworkLayoutSetUp(network));
58f11a936eSBarry Smith 
599566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Network after DMNetworkLayoutSetUp:\n"));
609566063dSJacob Faibussowitsch   PetscCall(DMView(network, PETSC_VIEWER_STDOUT_WORLD));
615c6496baSHong Zhang 
62f11a936eSBarry Smith   /* Add components and variables for the network */
639566063dSJacob Faibussowitsch   PetscCall(DMNetworkGetSubnetwork(network, 0, &nv, &ne, &nodes, &edges));
64f11a936eSBarry Smith   for (e = 0; e < ne; e++) {
65f11a936eSBarry Smith     /* The edges have no degrees of freedom */
669566063dSJacob Faibussowitsch     PetscCall(DMNetworkAddComponent(network, edges[e], ecompkey, NULL, 1));
67f11a936eSBarry Smith   }
68*48a46eb9SPierre Jolivet   for (v = 0; v < nv; v++) PetscCall(DMNetworkAddComponent(network, nodes[v], vcompkey, NULL, 2));
69f11a936eSBarry Smith 
709566063dSJacob Faibussowitsch   PetscCall(DMSetUp(network));
719566063dSJacob Faibussowitsch   PetscCall(DMNetworkGetPlex(network, &plex));
729566063dSJacob Faibussowitsch   /* PetscCall(DMView(plex,PETSC_VIEWER_STDOUT_WORLD)); */
739566063dSJacob Faibussowitsch   PetscCall(DMGetLocalSection(plex, &section));
749566063dSJacob Faibussowitsch   PetscCall(PetscSectionView(section, PETSC_VIEWER_STDOUT_WORLD));
75f11a936eSBarry Smith 
769566063dSJacob Faibussowitsch   PetscCall(PetscFree(edgelist));
77f11a936eSBarry Smith 
789566063dSJacob Faibussowitsch   PetscCall(DMNetworkDistribute(&network, 0));
799566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "\nNetwork after DMNetworkDistribute:\n"));
809566063dSJacob Faibussowitsch   PetscCall(DMView(network, PETSC_VIEWER_STDOUT_WORLD));
819566063dSJacob Faibussowitsch   PetscCall(DMNetworkGetPlex(network, &plex));
829566063dSJacob Faibussowitsch   /* PetscCall(DMView(plex,PETSC_VIEWER_STDOUT_WORLD)); */
839566063dSJacob Faibussowitsch   PetscCall(DMGetLocalSection(plex, &section));
849566063dSJacob Faibussowitsch   PetscCall(PetscSectionView(section, PETSC_VIEWER_STDOUT_WORLD));
85f11a936eSBarry Smith 
869566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&network));
879566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
88b122ec5aSJacob Faibussowitsch   return 0;
89f11a936eSBarry Smith }
90f11a936eSBarry Smith 
91f11a936eSBarry Smith /*TEST
92f11a936eSBarry Smith 
93f11a936eSBarry Smith    build:
94f11a936eSBarry Smith       requires: !complex double
95f11a936eSBarry Smith 
96f11a936eSBarry Smith    test:
97f11a936eSBarry Smith       nsize: 2
985c6496baSHong Zhang       args: -petscpartitioner_type simple
99f11a936eSBarry Smith 
100f11a936eSBarry Smith TEST*/
101