1af0996ceSBarry Smith #include <petsc/private/dmnetworkimpl.h> /*I "petscdmnetwork.h" I*/ 25f2c45f1SShri Abhyankar #include <petscdmplex.h> 35f2c45f1SShri Abhyankar #include <petscsf.h> 45f2c45f1SShri Abhyankar 55f2c45f1SShri Abhyankar /*@ 6556ed216SShri Abhyankar DMNetworkGetPlex - Gets the Plex DM associated with this network DM 7556ed216SShri Abhyankar 8556ed216SShri Abhyankar Not collective 9556ed216SShri Abhyankar 10556ed216SShri Abhyankar Input Parameters: 11556ed216SShri Abhyankar + netdm - the dm object 12556ed216SShri Abhyankar - plexmdm - the plex dm object 13556ed216SShri Abhyankar 14556ed216SShri Abhyankar Level: Advanced 15556ed216SShri Abhyankar 16556ed216SShri Abhyankar .seealso: DMNetworkCreate() 17556ed216SShri Abhyankar @*/ 18556ed216SShri Abhyankar PetscErrorCode DMNetworkGetPlex(DM netdm, DM *plexdm) 19556ed216SShri Abhyankar { 20556ed216SShri Abhyankar DM_Network *network = (DM_Network*) netdm->data; 21556ed216SShri Abhyankar 22556ed216SShri Abhyankar PetscFunctionBegin; 23556ed216SShri Abhyankar *plexdm = network->plex; 24556ed216SShri Abhyankar PetscFunctionReturn(0); 25556ed216SShri Abhyankar } 26556ed216SShri Abhyankar 27556ed216SShri Abhyankar /*@ 28e2aaf10cSShri Abhyankar DMNetworkSetSizes - Sets the number of subnetworks,local and global vertices and edges for each subnetwork. 295f2c45f1SShri Abhyankar 305f2c45f1SShri Abhyankar Collective on DM 315f2c45f1SShri Abhyankar 325f2c45f1SShri Abhyankar Input Parameters: 335f2c45f1SShri Abhyankar + dm - the dm object 34e2aaf10cSShri Abhyankar . Nsubnet - number of subnetworks 35e2aaf10cSShri Abhyankar . nV - number of local vertices for each subnetwork 36e2aaf10cSShri Abhyankar . nE - number of local edges for each subnetwork 37e2aaf10cSShri Abhyankar . NV - number of global vertices (or PETSC_DETERMINE) for each subnetwork 38e2aaf10cSShri Abhyankar - NE - number of global edges (or PETSC_DETERMINE) for each subnetwork 395f2c45f1SShri Abhyankar 405f2c45f1SShri Abhyankar Notes 415f2c45f1SShri Abhyankar If one processor calls this with NV (NE) of PETSC_DECIDE then all processors must, otherwise the prgram will hang. 425f2c45f1SShri Abhyankar 435f2c45f1SShri Abhyankar You cannot change the sizes once they have been set 445f2c45f1SShri Abhyankar 451b266c99SBarry Smith Level: intermediate 461b266c99SBarry Smith 471b266c99SBarry Smith .seealso: DMNetworkCreate() 485f2c45f1SShri Abhyankar @*/ 49e2aaf10cSShri Abhyankar PetscErrorCode DMNetworkSetSizes(DM dm, PetscInt Nsubnet, PetscInt nV[], PetscInt nE[], PetscInt NV[], PetscInt NE[]) 505f2c45f1SShri Abhyankar { 515f2c45f1SShri Abhyankar PetscErrorCode ierr; 525f2c45f1SShri Abhyankar DM_Network *network = (DM_Network*) dm->data; 53e2aaf10cSShri Abhyankar PetscInt a[2],b[2],i; 545f2c45f1SShri Abhyankar 555f2c45f1SShri Abhyankar PetscFunctionBegin; 565f2c45f1SShri Abhyankar PetscValidHeaderSpecific(dm,DM_CLASSID,1); 57e2aaf10cSShri Abhyankar if (Nsubnet <= 0) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_INCOMP,"Number of subnetworks %D cannot be less than 1",Nsubnet); 58e2aaf10cSShri Abhyankar 59e2aaf10cSShri Abhyankar if(Nsubnet > 0) PetscValidLogicalCollectiveInt(dm,Nsubnet,2); 60e2aaf10cSShri Abhyankar if(network->nsubnet != 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_INCOMP,"Network sizes alread set, cannot resize the network"); 61e2aaf10cSShri Abhyankar 62e2aaf10cSShri Abhyankar network->nsubnet = Nsubnet; 63e2aaf10cSShri Abhyankar ierr = PetscCalloc1(Nsubnet,&network->subnet);CHKERRQ(ierr); 64e2aaf10cSShri Abhyankar for(i=0; i < network->nsubnet; i++) { 65e2aaf10cSShri Abhyankar if (NV[i] > 0) PetscValidLogicalCollectiveInt(dm,NV[i],5); 66e2aaf10cSShri Abhyankar if (NE[i] > 0) PetscValidLogicalCollectiveInt(dm,NE[i],6); 67e2aaf10cSShri Abhyankar if (NV[i] > 0 && nV[i] > NV[i]) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_ARG_INCOMP,"Subnetwork %D: Local vertex size %D cannot be larger than global vertex size %D",i,nV[i],NV[i]); 68e2aaf10cSShri Abhyankar if (NE[i] > 0 && nE[i] > NE[i]) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_ARG_INCOMP,"Subnetwork %D: Local edge size %D cannot be larger than global edge size %D",i,nE[i],NE[i]); 69e2aaf10cSShri Abhyankar a[0] = nV[i]; a[1] = nE[i]; 70b2566f29SBarry Smith ierr = MPIU_Allreduce(a,b,2,MPIU_INT,MPI_SUM,PetscObjectComm((PetscObject)dm));CHKERRQ(ierr); 71e2aaf10cSShri Abhyankar network->subnet[i].Nvtx = b[0]; network->subnet[i].Nedge = b[1]; 72e2aaf10cSShri Abhyankar 73e2aaf10cSShri Abhyankar network->subnet[i].id = i; 74e2aaf10cSShri Abhyankar 75e2aaf10cSShri Abhyankar network->subnet[i].nvtx = nV[i]; 76e2aaf10cSShri Abhyankar network->subnet[i].vStart = network->nVertices; 77e2aaf10cSShri Abhyankar network->subnet[i].vEnd = network->subnet[i].vStart + network->subnet[i].Nvtx; 78e2aaf10cSShri Abhyankar network->nVertices += network->subnet[i].nvtx; 79e2aaf10cSShri Abhyankar network->NVertices += network->subnet[i].Nvtx; 80e2aaf10cSShri Abhyankar 81e2aaf10cSShri Abhyankar network->subnet[i].nedge = nE[i]; 82e2aaf10cSShri Abhyankar network->subnet[i].eStart = network->nEdges; 83e2aaf10cSShri Abhyankar network->subnet[i].eEnd = network->subnet[i].eStart + network->subnet[i].Nedge; 84e2aaf10cSShri Abhyankar network->nEdges += network->subnet[i].nedge; 85e2aaf10cSShri Abhyankar network->NEdges += network->subnet[i].Nedge; 865f2c45f1SShri Abhyankar } 875f2c45f1SShri Abhyankar PetscFunctionReturn(0); 885f2c45f1SShri Abhyankar } 895f2c45f1SShri Abhyankar 905f2c45f1SShri Abhyankar /*@ 915f2c45f1SShri Abhyankar DMNetworkSetEdgeList - Sets the list of local edges (vertex connectivity) for the network 925f2c45f1SShri Abhyankar 935f2c45f1SShri Abhyankar Logically collective on DM 945f2c45f1SShri Abhyankar 955f2c45f1SShri Abhyankar Input Parameters: 96e2aaf10cSShri Abhyankar . edges - list of edges for each subnetwork 975f2c45f1SShri Abhyankar 985f2c45f1SShri Abhyankar Notes: 995f2c45f1SShri Abhyankar There is no copy involved in this operation, only the pointer is referenced. The edgelist should 1005f2c45f1SShri Abhyankar not be destroyed before the call to DMNetworkLayoutSetUp 1015f2c45f1SShri Abhyankar 1025f2c45f1SShri Abhyankar Level: intermediate 1035f2c45f1SShri Abhyankar 1045f2c45f1SShri Abhyankar .seealso: DMNetworkCreate, DMNetworkSetSizes 1055f2c45f1SShri Abhyankar @*/ 106e2aaf10cSShri Abhyankar PetscErrorCode DMNetworkSetEdgeList(DM dm, int *edgelist[]) 1075f2c45f1SShri Abhyankar { 1085f2c45f1SShri Abhyankar DM_Network *network = (DM_Network*) dm->data; 109e2aaf10cSShri Abhyankar PetscInt i; 1105f2c45f1SShri Abhyankar 1115f2c45f1SShri Abhyankar PetscFunctionBegin; 112e2aaf10cSShri Abhyankar for(i=0; i < network->nsubnet; i++) { 113e2aaf10cSShri Abhyankar network->subnet[i].edgelist = edgelist[i]; 114e2aaf10cSShri Abhyankar } 1155f2c45f1SShri Abhyankar PetscFunctionReturn(0); 1165f2c45f1SShri Abhyankar } 1175f2c45f1SShri Abhyankar 1185f2c45f1SShri Abhyankar /*@ 1195f2c45f1SShri Abhyankar DMNetworkLayoutSetUp - Sets up the bare layout (graph) for the network 1205f2c45f1SShri Abhyankar 1215f2c45f1SShri Abhyankar Collective on DM 1225f2c45f1SShri Abhyankar 1235f2c45f1SShri Abhyankar Input Parameters 1245f2c45f1SShri Abhyankar . DM - the dmnetwork object 1255f2c45f1SShri Abhyankar 1265f2c45f1SShri Abhyankar Notes: 1275f2c45f1SShri Abhyankar This routine should be called after the network sizes and edgelists have been provided. It creates 1285f2c45f1SShri Abhyankar the bare layout of the network and sets up the network to begin insertion of components. 1295f2c45f1SShri Abhyankar 1305f2c45f1SShri Abhyankar All the components should be registered before calling this routine. 1315f2c45f1SShri Abhyankar 1325f2c45f1SShri Abhyankar Level: intermediate 1335f2c45f1SShri Abhyankar 1345f2c45f1SShri Abhyankar .seealso: DMNetworkSetSizes, DMNetworkSetEdgeList 1355f2c45f1SShri Abhyankar @*/ 1365f2c45f1SShri Abhyankar PetscErrorCode DMNetworkLayoutSetUp(DM dm) 1375f2c45f1SShri Abhyankar { 1385f2c45f1SShri Abhyankar PetscErrorCode ierr; 1395f2c45f1SShri Abhyankar DM_Network *network = (DM_Network*) dm->data; 1405f2c45f1SShri Abhyankar PetscInt dim = 1; /* One dimensional network */ 1415f2c45f1SShri Abhyankar PetscInt numCorners=2; 1425f2c45f1SShri Abhyankar PetscInt spacedim=2; 1435f2c45f1SShri Abhyankar double *vertexcoords=NULL; 144e2aaf10cSShri Abhyankar PetscInt i,j; 1455f2c45f1SShri Abhyankar PetscInt ndata; 146e2aaf10cSShri Abhyankar PetscInt ctr=0; 1475f2c45f1SShri Abhyankar 1485f2c45f1SShri Abhyankar PetscFunctionBegin; 1496fefedf4SHong Zhang if (network->nVertices) { 1506fefedf4SHong Zhang ierr = PetscCalloc1(numCorners*network->nVertices,&vertexcoords);CHKERRQ(ierr); 1515f2c45f1SShri Abhyankar } 152e2aaf10cSShri Abhyankar 153e2aaf10cSShri Abhyankar /* Create the edgelist for the network by concatenating edgelists of the subnetworks */ 154e2aaf10cSShri Abhyankar ierr = PetscCalloc1(2*network->nEdges,&network->edges);CHKERRQ(ierr); 155e2aaf10cSShri Abhyankar for(i=0; i < network->nsubnet; i++) { 156e2aaf10cSShri Abhyankar for(j = 0; j < network->subnet[i].nedge; j++) { 157e2aaf10cSShri Abhyankar network->edges[2*ctr] = network->subnet[i].vStart + network->subnet[i].edgelist[2*j]; 158e2aaf10cSShri Abhyankar network->edges[2*ctr+1] = network->subnet[i].vStart + network->subnet[i].edgelist[2*j+1]; 159e2aaf10cSShri Abhyankar ctr++; 160e2aaf10cSShri Abhyankar } 161e2aaf10cSShri Abhyankar } 162e2aaf10cSShri Abhyankar 1636500d4abSHong Zhang #if 1 164e2aaf10cSShri Abhyankar for(i=0; i < network->nEdges; i++) { 165e2aaf10cSShri Abhyankar ierr = PetscPrintf(PETSC_COMM_SELF,"[%D %D]",network->edges[2*i],network->edges[2*i+1]);CHKERRQ(ierr); 166e2aaf10cSShri Abhyankar } 167e2aaf10cSShri Abhyankar #endif 168e2aaf10cSShri Abhyankar 1696fefedf4SHong Zhang ierr = DMPlexCreateFromCellList(PetscObjectComm((PetscObject)dm),dim,network->nEdges,network->nVertices,numCorners,PETSC_FALSE,network->edges,spacedim,vertexcoords,&network->plex);CHKERRQ(ierr); 1706fefedf4SHong Zhang if (network->nVertices) { 1715f2c45f1SShri Abhyankar ierr = PetscFree(vertexcoords);CHKERRQ(ierr); 1725f2c45f1SShri Abhyankar } 173e2aaf10cSShri Abhyankar ierr = PetscFree(network->edges);CHKERRQ(ierr); 174e2aaf10cSShri Abhyankar 1755f2c45f1SShri Abhyankar ierr = DMPlexGetChart(network->plex,&network->pStart,&network->pEnd);CHKERRQ(ierr); 1765f2c45f1SShri Abhyankar ierr = DMPlexGetHeightStratum(network->plex,0,&network->eStart,&network->eEnd);CHKERRQ(ierr); 1775f2c45f1SShri Abhyankar ierr = DMPlexGetHeightStratum(network->plex,1,&network->vStart,&network->vEnd);CHKERRQ(ierr); 1785f2c45f1SShri Abhyankar 1795f2c45f1SShri Abhyankar ierr = PetscSectionCreate(PetscObjectComm((PetscObject)dm),&network->DataSection);CHKERRQ(ierr); 1805f2c45f1SShri Abhyankar ierr = PetscSectionCreate(PetscObjectComm((PetscObject)dm),&network->DofSection);CHKERRQ(ierr); 1815f2c45f1SShri Abhyankar ierr = PetscSectionSetChart(network->DataSection,network->pStart,network->pEnd);CHKERRQ(ierr); 1825f2c45f1SShri Abhyankar ierr = PetscSectionSetChart(network->DofSection,network->pStart,network->pEnd);CHKERRQ(ierr); 1835f2c45f1SShri Abhyankar 1842727e31bSShri Abhyankar /* Create vertices and edges array for the subnetworks */ 1852727e31bSShri Abhyankar for(j=0; j < network->nsubnet; j++) { 1862727e31bSShri Abhyankar ierr = PetscCalloc1(network->subnet[j].nedge,&network->subnet[j].edges);CHKERRQ(ierr); 1872727e31bSShri Abhyankar ierr = PetscCalloc1(network->subnet[j].nvtx,&network->subnet[j].vertices);CHKERRQ(ierr); 1882727e31bSShri Abhyankar /* Temporarily setting nvtx and nedge to 0 so we can use them as counters in the below for loop. 1892727e31bSShri Abhyankar These get updated when the vertices and edges are added. */ 1902727e31bSShri Abhyankar network->subnet[j].nvtx = network->subnet[j].nedge = 0; 1912727e31bSShri Abhyankar } 1922727e31bSShri Abhyankar 1935f2c45f1SShri Abhyankar network->dataheadersize = sizeof(struct _p_DMNetworkComponentHeader)/sizeof(DMNetworkComponentGenericDataType); 1946caa05f4SBarry Smith ierr = PetscCalloc1(network->pEnd-network->pStart,&network->header);CHKERRQ(ierr); 195e2aaf10cSShri Abhyankar for(i=network->eStart; i < network->eEnd; i++) { 196e2aaf10cSShri Abhyankar network->header[i].index = i; /* Global edge number */ 197e2aaf10cSShri Abhyankar for(j=0; j < network->nsubnet; j++) { 198e2aaf10cSShri Abhyankar if((network->subnet[j].eStart <= i) && (i < network->subnet[j].eEnd)) { 199e2aaf10cSShri Abhyankar network->header[i].subnetid = j; /* Subnetwork id */ 2002727e31bSShri Abhyankar network->subnet[j].edges[network->subnet[j].nedge++] = i; 201e2aaf10cSShri Abhyankar break; 202e2aaf10cSShri Abhyankar } 2037b6afd5bSHong Zhang } 2045f2c45f1SShri Abhyankar network->header[i].ndata = 0; 2055f2c45f1SShri Abhyankar ndata = network->header[i].ndata; 2065f2c45f1SShri Abhyankar ierr = PetscSectionAddDof(network->DataSection,i,network->dataheadersize);CHKERRQ(ierr); 2075f2c45f1SShri Abhyankar network->header[i].offset[ndata] = 0; 2085f2c45f1SShri Abhyankar } 209e2aaf10cSShri Abhyankar 210e2aaf10cSShri Abhyankar for(i=network->vStart; i < network->vEnd; i++) { 211e2aaf10cSShri Abhyankar network->header[i].index = i - network->vStart; 212e2aaf10cSShri Abhyankar for(j=0; j < network->nsubnet; j++) { 213e2aaf10cSShri Abhyankar if((network->subnet[j].vStart <= i-network->vStart) && (i-network->vStart < network->subnet[j].vEnd)) { 214e2aaf10cSShri Abhyankar network->header[i].subnetid = j; 2152727e31bSShri Abhyankar network->subnet[j].vertices[network->subnet[j].nvtx++] = i; 216e2aaf10cSShri Abhyankar break; 217e2aaf10cSShri Abhyankar } 218e2aaf10cSShri Abhyankar } 219e2aaf10cSShri Abhyankar network->header[i].ndata = 0; 220e2aaf10cSShri Abhyankar ndata = network->header[i].ndata; 221e2aaf10cSShri Abhyankar ierr = PetscSectionAddDof(network->DataSection,i,network->dataheadersize);CHKERRQ(ierr); 222e2aaf10cSShri Abhyankar network->header[i].offset[ndata] = 0; 223e2aaf10cSShri Abhyankar } 224e2aaf10cSShri Abhyankar 225854ce69bSBarry Smith ierr = PetscMalloc1(network->pEnd-network->pStart,&network->cvalue);CHKERRQ(ierr); 2266500d4abSHong Zhang PetscFunctionReturn(0); 2276500d4abSHong Zhang } 228e2aaf10cSShri Abhyankar 2296500d4abSHong Zhang PetscErrorCode DMNetworkLayoutSetUpCoupled(DM dm) 2306500d4abSHong Zhang { 2316500d4abSHong Zhang PetscErrorCode ierr; 2326500d4abSHong Zhang DM_Network *network = (DM_Network*) dm->data; 2336500d4abSHong Zhang PetscInt dim = 1; /* One dimensional network */ 234*991cf414SHong Zhang PetscInt numCorners=2,spacedim=2; 2356500d4abSHong Zhang double *vertexcoords=NULL; 236*991cf414SHong Zhang PetscInt i,j,ndata,ctr=0; 237*991cf414SHong Zhang PetscInt *edgelist_couple=NULL,k,netid,vid; 2386500d4abSHong Zhang 2396500d4abSHong Zhang PetscFunctionBegin; 2406500d4abSHong Zhang printf("DMNetworkLayoutSetUpCoupled...\n"); 2416500d4abSHong Zhang if (network->nVertices) { 2426500d4abSHong Zhang ierr = PetscCalloc1(numCorners*network->nVertices,&vertexcoords);CHKERRQ(ierr); 2436500d4abSHong Zhang } 2446500d4abSHong Zhang 2456500d4abSHong Zhang /* Create the edgelist for the network by concatenating edgelists of the subnetworks */ 2466500d4abSHong Zhang ierr = PetscCalloc1(2*network->nEdges,&network->edges);CHKERRQ(ierr); 2476500d4abSHong Zhang for (i=0; i < network->nsubnet-1; i++) { 2486500d4abSHong Zhang for (j = 0; j < network->subnet[i].nedge; j++) { 2496500d4abSHong Zhang network->edges[2*ctr] = network->subnet[i].vStart + network->subnet[i].edgelist[2*j]; 2506500d4abSHong Zhang network->edges[2*ctr+1] = network->subnet[i].vStart + network->subnet[i].edgelist[2*j+1]; 2516500d4abSHong Zhang ctr++; 2526500d4abSHong Zhang } 2536500d4abSHong Zhang } 2546500d4abSHong Zhang i = network->nsubnet-1; /* coupling subnet */ 255*991cf414SHong Zhang edgelist_couple = network->subnet[i].edgelist; 2566500d4abSHong Zhang k = 0; 2576500d4abSHong Zhang for (j = 0; j < network->subnet[i].nedge; j++) { 2586500d4abSHong Zhang netid = edgelist_couple[k]; vid = edgelist_couple[k+1]; 2596500d4abSHong Zhang network->edges[2*ctr] = network->subnet[netid].vStart + vid; k += 2; 2606500d4abSHong Zhang 2616500d4abSHong Zhang netid = edgelist_couple[k]; vid = edgelist_couple[k+1]; 262*991cf414SHong Zhang network->edges[2*ctr+1] = network->subnet[netid].vStart + vid; k+=2; 2636500d4abSHong Zhang ctr++; 2646500d4abSHong Zhang } 2656500d4abSHong Zhang 2666500d4abSHong Zhang #if 1 2676500d4abSHong Zhang for(i=0; i < network->nEdges; i++) { 2686500d4abSHong Zhang ierr = PetscPrintf(PETSC_COMM_SELF,"[%D %D]",network->edges[2*i],network->edges[2*i+1]);CHKERRQ(ierr); 2696500d4abSHong Zhang printf("\n"); 2706500d4abSHong Zhang } 2716500d4abSHong Zhang #endif 2726500d4abSHong Zhang 2736500d4abSHong Zhang ierr = DMPlexCreateFromCellList(PetscObjectComm((PetscObject)dm),dim,network->nEdges,network->nVertices,numCorners,PETSC_FALSE,network->edges,spacedim,vertexcoords,&network->plex);CHKERRQ(ierr); 2746500d4abSHong Zhang if (network->nVertices) { 2756500d4abSHong Zhang ierr = PetscFree(vertexcoords);CHKERRQ(ierr); 2766500d4abSHong Zhang } 2776500d4abSHong Zhang ierr = PetscFree(network->edges);CHKERRQ(ierr); 2786500d4abSHong Zhang 2796500d4abSHong Zhang ierr = DMPlexGetChart(network->plex,&network->pStart,&network->pEnd);CHKERRQ(ierr); 2806500d4abSHong Zhang ierr = DMPlexGetHeightStratum(network->plex,0,&network->eStart,&network->eEnd);CHKERRQ(ierr); 2816500d4abSHong Zhang ierr = DMPlexGetHeightStratum(network->plex,1,&network->vStart,&network->vEnd);CHKERRQ(ierr); 2826500d4abSHong Zhang 2836500d4abSHong Zhang ierr = PetscSectionCreate(PetscObjectComm((PetscObject)dm),&network->DataSection);CHKERRQ(ierr); 2846500d4abSHong Zhang ierr = PetscSectionCreate(PetscObjectComm((PetscObject)dm),&network->DofSection);CHKERRQ(ierr); 2856500d4abSHong Zhang ierr = PetscSectionSetChart(network->DataSection,network->pStart,network->pEnd);CHKERRQ(ierr); 2866500d4abSHong Zhang ierr = PetscSectionSetChart(network->DofSection,network->pStart,network->pEnd);CHKERRQ(ierr); 2876500d4abSHong Zhang 2886500d4abSHong Zhang /* Create vertices and edges array for the subnetworks */ 2896500d4abSHong Zhang for(j=0; j < network->nsubnet; j++) { 2906500d4abSHong Zhang ierr = PetscCalloc1(network->subnet[j].nedge,&network->subnet[j].edges);CHKERRQ(ierr); 2916500d4abSHong Zhang ierr = PetscCalloc1(network->subnet[j].nvtx,&network->subnet[j].vertices);CHKERRQ(ierr); 2926500d4abSHong Zhang /* Temporarily setting nvtx and nedge to 0 so we can use them as counters in the below for loop. 2936500d4abSHong Zhang These get updated when the vertices and edges are added. */ 2946500d4abSHong Zhang network->subnet[j].nvtx = network->subnet[j].nedge = 0; 2956500d4abSHong Zhang } 2966500d4abSHong Zhang 2976500d4abSHong Zhang network->dataheadersize = sizeof(struct _p_DMNetworkComponentHeader)/sizeof(DMNetworkComponentGenericDataType); 2986500d4abSHong Zhang ierr = PetscCalloc1(network->pEnd-network->pStart,&network->header);CHKERRQ(ierr); 2996500d4abSHong Zhang for(i=network->eStart; i < network->eEnd; i++) { 3006500d4abSHong Zhang network->header[i].index = i; /* Global edge number */ 3016500d4abSHong Zhang for(j=0; j < network->nsubnet; j++) { 3026500d4abSHong Zhang if((network->subnet[j].eStart <= i) && (i < network->subnet[j].eEnd)) { 3036500d4abSHong Zhang network->header[i].subnetid = j; /* Subnetwork id */ 3046500d4abSHong Zhang network->subnet[j].edges[network->subnet[j].nedge++] = i; 3056500d4abSHong Zhang break; 3066500d4abSHong Zhang } 3076500d4abSHong Zhang } 3086500d4abSHong Zhang network->header[i].ndata = 0; 3096500d4abSHong Zhang ndata = network->header[i].ndata; 3106500d4abSHong Zhang ierr = PetscSectionAddDof(network->DataSection,i,network->dataheadersize);CHKERRQ(ierr); 3116500d4abSHong Zhang network->header[i].offset[ndata] = 0; 3126500d4abSHong Zhang } 3136500d4abSHong Zhang 3146500d4abSHong Zhang for(i=network->vStart; i < network->vEnd; i++) { 3156500d4abSHong Zhang network->header[i].index = i - network->vStart; 3166500d4abSHong Zhang for(j=0; j < network->nsubnet; j++) { 3176500d4abSHong Zhang if((network->subnet[j].vStart <= i-network->vStart) && (i-network->vStart < network->subnet[j].vEnd)) { 3186500d4abSHong Zhang network->header[i].subnetid = j; 3196500d4abSHong Zhang network->subnet[j].vertices[network->subnet[j].nvtx++] = i; 3206500d4abSHong Zhang break; 3216500d4abSHong Zhang } 3226500d4abSHong Zhang } 3236500d4abSHong Zhang network->header[i].ndata = 0; 3246500d4abSHong Zhang ndata = network->header[i].ndata; 3256500d4abSHong Zhang ierr = PetscSectionAddDof(network->DataSection,i,network->dataheadersize);CHKERRQ(ierr); 3266500d4abSHong Zhang network->header[i].offset[ndata] = 0; 3276500d4abSHong Zhang } 3286500d4abSHong Zhang 3296500d4abSHong Zhang ierr = PetscMalloc1(network->pEnd-network->pStart,&network->cvalue);CHKERRQ(ierr); 3305f2c45f1SShri Abhyankar PetscFunctionReturn(0); 3315f2c45f1SShri Abhyankar } 3325f2c45f1SShri Abhyankar 33394ef8ddeSSatish Balay /*@C 3342727e31bSShri Abhyankar DMNetworkGetSubnetworkInfo - Returns the info for the subnetwork 3352727e31bSShri Abhyankar 3362727e31bSShri Abhyankar Input Parameters 3372727e31bSShri Abhyankar + dm - the number object 3382727e31bSShri Abhyankar - id - the ID (integer) of the subnetwork 3392727e31bSShri Abhyankar 3402727e31bSShri Abhyankar Output Parameters 3412727e31bSShri Abhyankar + nv - number of vertices (local) 3422727e31bSShri Abhyankar . ne - number of edges (local) 3432727e31bSShri Abhyankar . vtx - local vertices for this subnetwork 3442727e31bSShri Abhyankar . edge - local edges for this subnetwork 3452727e31bSShri Abhyankar 3462727e31bSShri Abhyankar Notes: 3472727e31bSShri Abhyankar Cannot call this routine before DMNetworkLayoutSetup() 3482727e31bSShri Abhyankar 3492727e31bSShri Abhyankar .seealso: DMNetworkLayoutSetUp, DMNetworkCreate 3502727e31bSShri Abhyankar @*/ 3512727e31bSShri Abhyankar PetscErrorCode DMNetworkGetSubnetworkInfo(DM netdm,PetscInt id,PetscInt *nv, PetscInt *ne,const PetscInt **vtx, const PetscInt **edge) 3522727e31bSShri Abhyankar { 3532727e31bSShri Abhyankar DM_Network *network = (DM_Network*) netdm->data; 3542727e31bSShri Abhyankar 3552727e31bSShri Abhyankar PetscFunctionBegin; 3562727e31bSShri Abhyankar *nv = network->subnet[id].nvtx; 3572727e31bSShri Abhyankar *ne = network->subnet[id].nedge; 3582727e31bSShri Abhyankar *vtx = network->subnet[id].vertices; 3592727e31bSShri Abhyankar *edge = network->subnet[id].edges; 3602727e31bSShri Abhyankar PetscFunctionReturn(0); 3612727e31bSShri Abhyankar } 3622727e31bSShri Abhyankar 3632727e31bSShri Abhyankar /*@C 3645f2c45f1SShri Abhyankar DMNetworkRegisterComponent - Registers the network component 3655f2c45f1SShri Abhyankar 3665f2c45f1SShri Abhyankar Logically collective on DM 3675f2c45f1SShri Abhyankar 3685f2c45f1SShri Abhyankar Input Parameters 3695f2c45f1SShri Abhyankar + dm - the network object 3705f2c45f1SShri Abhyankar . name - the component name 3715f2c45f1SShri Abhyankar - size - the storage size in bytes for this component data 3725f2c45f1SShri Abhyankar 3735f2c45f1SShri Abhyankar Output Parameters 3745f2c45f1SShri Abhyankar . key - an integer key that defines the component 3755f2c45f1SShri Abhyankar 3765f2c45f1SShri Abhyankar Notes 3775f2c45f1SShri Abhyankar This routine should be called by all processors before calling DMNetworkLayoutSetup(). 3785f2c45f1SShri Abhyankar 3795f2c45f1SShri Abhyankar Level: intermediate 3805f2c45f1SShri Abhyankar 3815f2c45f1SShri Abhyankar .seealso: DMNetworkLayoutSetUp, DMNetworkCreate 3825f2c45f1SShri Abhyankar @*/ 3835f2c45f1SShri Abhyankar PetscErrorCode DMNetworkRegisterComponent(DM dm,const char *name,PetscInt size,PetscInt *key) 3845f2c45f1SShri Abhyankar { 3855f2c45f1SShri Abhyankar PetscErrorCode ierr; 3865f2c45f1SShri Abhyankar DM_Network *network = (DM_Network*) dm->data; 3875f2c45f1SShri Abhyankar DMNetworkComponent *component=&network->component[network->ncomponent]; 3885f2c45f1SShri Abhyankar PetscBool flg=PETSC_FALSE; 3895f2c45f1SShri Abhyankar PetscInt i; 3905f2c45f1SShri Abhyankar 3915f2c45f1SShri Abhyankar PetscFunctionBegin; 3925f2c45f1SShri Abhyankar 3935f2c45f1SShri Abhyankar for (i=0; i < network->ncomponent; i++) { 3945f2c45f1SShri Abhyankar ierr = PetscStrcmp(component->name,name,&flg);CHKERRQ(ierr); 3955f2c45f1SShri Abhyankar if (flg) { 3965f2c45f1SShri Abhyankar *key = i; 3975f2c45f1SShri Abhyankar PetscFunctionReturn(0); 3985f2c45f1SShri Abhyankar } 3996d64e262SShri Abhyankar } 4006d64e262SShri Abhyankar if(network->ncomponent == MAX_COMPONENTS) { 4016d64e262SShri Abhyankar SETERRQ1(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_OUTOFRANGE,"Number of components registered exceeds the max %D",MAX_COMPONENTS); 4025f2c45f1SShri Abhyankar } 4035f2c45f1SShri Abhyankar 4045f2c45f1SShri Abhyankar ierr = PetscStrcpy(component->name,name);CHKERRQ(ierr); 4055f2c45f1SShri Abhyankar component->size = size/sizeof(DMNetworkComponentGenericDataType); 4065f2c45f1SShri Abhyankar *key = network->ncomponent; 4075f2c45f1SShri Abhyankar network->ncomponent++; 4085f2c45f1SShri Abhyankar PetscFunctionReturn(0); 4095f2c45f1SShri Abhyankar } 4105f2c45f1SShri Abhyankar 4115f2c45f1SShri Abhyankar /*@ 4125f2c45f1SShri Abhyankar DMNetworkGetVertexRange - Get the bounds [start, end) for the vertices. 4135f2c45f1SShri Abhyankar 4145f2c45f1SShri Abhyankar Not Collective 4155f2c45f1SShri Abhyankar 4165f2c45f1SShri Abhyankar Input Parameters: 4175f2c45f1SShri Abhyankar + dm - The DMNetwork object 4185f2c45f1SShri Abhyankar 4195f2c45f1SShri Abhyankar Output Paramters: 4205f2c45f1SShri Abhyankar + vStart - The first vertex point 4215f2c45f1SShri Abhyankar - vEnd - One beyond the last vertex point 4225f2c45f1SShri Abhyankar 4235f2c45f1SShri Abhyankar Level: intermediate 4245f2c45f1SShri Abhyankar 4255f2c45f1SShri Abhyankar .seealso: DMNetworkGetEdgeRange 4265f2c45f1SShri Abhyankar @*/ 4275f2c45f1SShri Abhyankar PetscErrorCode DMNetworkGetVertexRange(DM dm,PetscInt *vStart,PetscInt *vEnd) 4285f2c45f1SShri Abhyankar { 4295f2c45f1SShri Abhyankar DM_Network *network = (DM_Network*)dm->data; 4305f2c45f1SShri Abhyankar 4315f2c45f1SShri Abhyankar PetscFunctionBegin; 4325f2c45f1SShri Abhyankar if (vStart) *vStart = network->vStart; 4335f2c45f1SShri Abhyankar if (vEnd) *vEnd = network->vEnd; 4345f2c45f1SShri Abhyankar PetscFunctionReturn(0); 4355f2c45f1SShri Abhyankar } 4365f2c45f1SShri Abhyankar 4375f2c45f1SShri Abhyankar /*@ 4385f2c45f1SShri Abhyankar DMNetworkGetEdgeRange - Get the bounds [start, end) for the edges. 4395f2c45f1SShri Abhyankar 4405f2c45f1SShri Abhyankar Not Collective 4415f2c45f1SShri Abhyankar 4425f2c45f1SShri Abhyankar Input Parameters: 4435f2c45f1SShri Abhyankar + dm - The DMNetwork object 4445f2c45f1SShri Abhyankar 4455f2c45f1SShri Abhyankar Output Paramters: 4465f2c45f1SShri Abhyankar + eStart - The first edge point 4475f2c45f1SShri Abhyankar - eEnd - One beyond the last edge point 4485f2c45f1SShri Abhyankar 4495f2c45f1SShri Abhyankar Level: intermediate 4505f2c45f1SShri Abhyankar 4515f2c45f1SShri Abhyankar .seealso: DMNetworkGetVertexRange 4525f2c45f1SShri Abhyankar @*/ 4535f2c45f1SShri Abhyankar PetscErrorCode DMNetworkGetEdgeRange(DM dm,PetscInt *eStart,PetscInt *eEnd) 4545f2c45f1SShri Abhyankar { 4555f2c45f1SShri Abhyankar DM_Network *network = (DM_Network*)dm->data; 4565f2c45f1SShri Abhyankar 4575f2c45f1SShri Abhyankar PetscFunctionBegin; 4585f2c45f1SShri Abhyankar if (eStart) *eStart = network->eStart; 4595f2c45f1SShri Abhyankar if (eEnd) *eEnd = network->eEnd; 4605f2c45f1SShri Abhyankar PetscFunctionReturn(0); 4615f2c45f1SShri Abhyankar } 4625f2c45f1SShri Abhyankar 4637b6afd5bSHong Zhang /*@ 464e85e6aecSHong Zhang DMNetworkGetGlobalEdgeIndex - Get the user global numbering for the edge. 4657b6afd5bSHong Zhang 4667b6afd5bSHong Zhang Not Collective 4677b6afd5bSHong Zhang 4687b6afd5bSHong Zhang Input Parameters: 4697b6afd5bSHong Zhang + dm - DMNetwork object 470e85e6aecSHong Zhang - p - edge point 4717b6afd5bSHong Zhang 4727b6afd5bSHong Zhang Output Paramters: 473e85e6aecSHong Zhang . index - user global numbering for the edge 4747b6afd5bSHong Zhang 4757b6afd5bSHong Zhang Level: intermediate 4767b6afd5bSHong Zhang 477e85e6aecSHong Zhang .seealso: DMNetworkGetGlobalVertexIndex 4787b6afd5bSHong Zhang @*/ 479e85e6aecSHong Zhang PetscErrorCode DMNetworkGetGlobalEdgeIndex(DM dm,PetscInt p,PetscInt *index) 4807b6afd5bSHong Zhang { 4817b6afd5bSHong Zhang PetscErrorCode ierr; 4827b6afd5bSHong Zhang DM_Network *network = (DM_Network*)dm->data; 4837b6afd5bSHong Zhang PetscInt offsetp; 4847b6afd5bSHong Zhang DMNetworkComponentHeader header; 4857b6afd5bSHong Zhang 4867b6afd5bSHong Zhang PetscFunctionBegin; 4877b6afd5bSHong Zhang ierr = PetscSectionGetOffset(network->DataSection,p,&offsetp);CHKERRQ(ierr); 4887b6afd5bSHong Zhang header = (DMNetworkComponentHeader)(network->componentdataarray+offsetp); 489e85e6aecSHong Zhang *index = header->index; 4907b6afd5bSHong Zhang PetscFunctionReturn(0); 4917b6afd5bSHong Zhang } 4927b6afd5bSHong Zhang 4935f2c45f1SShri Abhyankar /*@ 494e85e6aecSHong Zhang DMNetworkGetGlobalVertexIndex - Get the user global numbering for the vertex. 495e85e6aecSHong Zhang 496e85e6aecSHong Zhang Not Collective 497e85e6aecSHong Zhang 498e85e6aecSHong Zhang Input Parameters: 499e85e6aecSHong Zhang + dm - DMNetwork object 500e85e6aecSHong Zhang - p - vertex point 501e85e6aecSHong Zhang 502e85e6aecSHong Zhang Output Paramters: 503e85e6aecSHong Zhang . index - user global numbering for the vertex 504e85e6aecSHong Zhang 505e85e6aecSHong Zhang Level: intermediate 506e85e6aecSHong Zhang 507e85e6aecSHong Zhang .seealso: DMNetworkGetGlobalEdgeIndex 508e85e6aecSHong Zhang @*/ 509e85e6aecSHong Zhang PetscErrorCode DMNetworkGetGlobalVertexIndex(DM dm,PetscInt p,PetscInt *index) 510e85e6aecSHong Zhang { 511e85e6aecSHong Zhang PetscErrorCode ierr; 512e85e6aecSHong Zhang DM_Network *network = (DM_Network*)dm->data; 513e85e6aecSHong Zhang PetscInt offsetp; 514e85e6aecSHong Zhang DMNetworkComponentHeader header; 515e85e6aecSHong Zhang 516e85e6aecSHong Zhang PetscFunctionBegin; 517e85e6aecSHong Zhang ierr = PetscSectionGetOffset(network->DataSection,p,&offsetp);CHKERRQ(ierr); 518e85e6aecSHong Zhang header = (DMNetworkComponentHeader)(network->componentdataarray+offsetp); 519e85e6aecSHong Zhang *index = header->index; 520e85e6aecSHong Zhang PetscFunctionReturn(0); 521e85e6aecSHong Zhang } 522e85e6aecSHong Zhang 523c3b11c7cSShri Abhyankar /* 524c3b11c7cSShri Abhyankar DMNetworkGetComponentKeyOffset - Gets the type along with the offset for indexing the 525c3b11c7cSShri Abhyankar component value from the component data array 526c3b11c7cSShri Abhyankar 527c3b11c7cSShri Abhyankar Not Collective 528c3b11c7cSShri Abhyankar 529c3b11c7cSShri Abhyankar Input Parameters: 530c3b11c7cSShri Abhyankar + dm - The DMNetwork object 531c3b11c7cSShri Abhyankar . p - vertex/edge point 532c3b11c7cSShri Abhyankar - compnum - component number 533c3b11c7cSShri Abhyankar 534c3b11c7cSShri Abhyankar Output Parameters: 535c3b11c7cSShri Abhyankar + compkey - the key obtained when registering the component 536c3b11c7cSShri Abhyankar - offset - offset into the component data array associated with the vertex/edge point 537c3b11c7cSShri Abhyankar 538c3b11c7cSShri Abhyankar Notes: 539c3b11c7cSShri Abhyankar Typical usage: 540c3b11c7cSShri Abhyankar 541c3b11c7cSShri Abhyankar DMNetworkGetComponentDataArray(dm, &arr); 542c3b11c7cSShri Abhyankar DMNetworkGetVertex/EdgeRange(dm,&Start,&End); 543c3b11c7cSShri Abhyankar Loop over vertices or edges 544c3b11c7cSShri Abhyankar DMNetworkGetNumComponents(dm,v,&numcomps); 545c3b11c7cSShri Abhyankar Loop over numcomps 546c3b11c7cSShri Abhyankar DMNetworkGetComponentKeyOffset(dm,v,compnum,&key,&offset); 547c3b11c7cSShri Abhyankar compdata = (UserCompDataType)(arr+offset); 548c3b11c7cSShri Abhyankar 549c3b11c7cSShri Abhyankar Level: intermediate 550c3b11c7cSShri Abhyankar 551c3b11c7cSShri Abhyankar .seealso: DMNetworkGetNumComponents, DMNetworkGetComponentDataArray, 552c3b11c7cSShri Abhyankar */ 553c3b11c7cSShri Abhyankar PetscErrorCode DMNetworkGetComponentKeyOffset(DM dm,PetscInt p, PetscInt compnum, PetscInt *compkey, PetscInt *offset) 554c3b11c7cSShri Abhyankar { 555c3b11c7cSShri Abhyankar PetscErrorCode ierr; 556c3b11c7cSShri Abhyankar PetscInt offsetp; 557c3b11c7cSShri Abhyankar DMNetworkComponentHeader header; 558c3b11c7cSShri Abhyankar DM_Network *network = (DM_Network*)dm->data; 559c3b11c7cSShri Abhyankar 560c3b11c7cSShri Abhyankar PetscFunctionBegin; 561c3b11c7cSShri Abhyankar ierr = PetscSectionGetOffset(network->DataSection,p,&offsetp);CHKERRQ(ierr); 562c3b11c7cSShri Abhyankar header = (DMNetworkComponentHeader)(network->componentdataarray+offsetp); 563c3b11c7cSShri Abhyankar if (compkey) *compkey = header->key[compnum]; 564c3b11c7cSShri Abhyankar if (offset) *offset = offsetp+network->dataheadersize+header->offset[compnum]; 565c3b11c7cSShri Abhyankar PetscFunctionReturn(0); 566c3b11c7cSShri Abhyankar } 567c3b11c7cSShri Abhyankar 568c3b11c7cSShri Abhyankar /*@ 569c3b11c7cSShri Abhyankar DMNetworkGetComponent - Returns the network component and its key 570c3b11c7cSShri Abhyankar 571c3b11c7cSShri Abhyankar Not Collective 572c3b11c7cSShri Abhyankar 573c3b11c7cSShri Abhyankar Input Parameters 574c3b11c7cSShri Abhyankar + dm - DMNetwork object 575c3b11c7cSShri Abhyankar . p - edge or vertex point 576c3b11c7cSShri Abhyankar - compnum - component number 577c3b11c7cSShri Abhyankar 578c3b11c7cSShri Abhyankar Output Parameters: 579c3b11c7cSShri Abhyankar + compkey - the key set for this computing during registration 580c3b11c7cSShri Abhyankar - component - the component data 581c3b11c7cSShri Abhyankar 582c3b11c7cSShri Abhyankar Notes: 583c3b11c7cSShri Abhyankar Typical usage: 584c3b11c7cSShri Abhyankar 585c3b11c7cSShri Abhyankar DMNetworkGetVertex/EdgeRange(dm,&Start,&End); 586c3b11c7cSShri Abhyankar Loop over vertices or edges 587c3b11c7cSShri Abhyankar DMNetworkGetNumComponents(dm,v,&numcomps); 588c3b11c7cSShri Abhyankar Loop over numcomps 589c3b11c7cSShri Abhyankar DMNetworkGetComponent(dm,v,compnum,&key,&component); 590c3b11c7cSShri Abhyankar 591c3b11c7cSShri Abhyankar Level: intermediate 592c3b11c7cSShri Abhyankar 593c3b11c7cSShri Abhyankar .seealso: DMNetworkGetNumComponents, DMNetworkGetVariableOffset 594c3b11c7cSShri Abhyankar @*/ 595c3b11c7cSShri Abhyankar PetscErrorCode DMNetworkGetComponent(DM dm, PetscInt p, PetscInt compnum, PetscInt *key, void **component) 596c3b11c7cSShri Abhyankar { 597c3b11c7cSShri Abhyankar PetscErrorCode ierr; 598c3b11c7cSShri Abhyankar DM_Network *network = (DM_Network*)dm->data; 599c3b11c7cSShri Abhyankar PetscInt offsetd; 600c3b11c7cSShri Abhyankar 601c3b11c7cSShri Abhyankar PetscFunctionBegin; 602c3b11c7cSShri Abhyankar 603c3b11c7cSShri Abhyankar ierr = DMNetworkGetComponentKeyOffset(dm,p,compnum,key,&offsetd);CHKERRQ(ierr); 604c3b11c7cSShri Abhyankar *component = network->componentdataarray+offsetd; 605c3b11c7cSShri Abhyankar 606c3b11c7cSShri Abhyankar PetscFunctionReturn(0); 607c3b11c7cSShri Abhyankar } 608c3b11c7cSShri Abhyankar 609e85e6aecSHong Zhang /*@ 610325661f6SSatish Balay DMNetworkAddComponent - Adds a network component at the given point (vertex/edge) 6115f2c45f1SShri Abhyankar 6125f2c45f1SShri Abhyankar Not Collective 6135f2c45f1SShri Abhyankar 6145f2c45f1SShri Abhyankar Input Parameters: 6155f2c45f1SShri Abhyankar + dm - The DMNetwork object 6165f2c45f1SShri Abhyankar . p - vertex/edge point 6175f2c45f1SShri Abhyankar . componentkey - component key returned while registering the component 6185f2c45f1SShri Abhyankar - compvalue - pointer to the data structure for the component 6195f2c45f1SShri Abhyankar 6205f2c45f1SShri Abhyankar Level: intermediate 6215f2c45f1SShri Abhyankar 6225f2c45f1SShri Abhyankar .seealso: DMNetworkGetVertexRange, DMNetworkGetEdgeRange, DMNetworkRegisterComponent 6235f2c45f1SShri Abhyankar @*/ 6245f2c45f1SShri Abhyankar PetscErrorCode DMNetworkAddComponent(DM dm, PetscInt p,PetscInt componentkey,void* compvalue) 6255f2c45f1SShri Abhyankar { 6265f2c45f1SShri Abhyankar DM_Network *network = (DM_Network*)dm->data; 62743a39a44SBarry Smith DMNetworkComponent *component = &network->component[componentkey]; 6285f2c45f1SShri Abhyankar DMNetworkComponentHeader header = &network->header[p]; 6295f2c45f1SShri Abhyankar DMNetworkComponentValue cvalue = &network->cvalue[p]; 6305f2c45f1SShri Abhyankar PetscErrorCode ierr; 6315f2c45f1SShri Abhyankar 6325f2c45f1SShri Abhyankar PetscFunctionBegin; 633fa58f0a9SHong Zhang if (header->ndata == MAX_DATA_AT_POINT) SETERRQ1(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_OUTOFRANGE,"Number of components at a point exceeds the max %D",MAX_DATA_AT_POINT); 634fa58f0a9SHong Zhang 63543a39a44SBarry Smith header->size[header->ndata] = component->size; 63643a39a44SBarry Smith ierr = PetscSectionAddDof(network->DataSection,p,component->size);CHKERRQ(ierr); 6375f2c45f1SShri Abhyankar header->key[header->ndata] = componentkey; 6385f2c45f1SShri Abhyankar if (header->ndata != 0) header->offset[header->ndata] = header->offset[header->ndata-1] + header->size[header->ndata-1]; 6395f2c45f1SShri Abhyankar 6405f2c45f1SShri Abhyankar cvalue->data[header->ndata] = (void*)compvalue; 6415f2c45f1SShri Abhyankar header->ndata++; 6425f2c45f1SShri Abhyankar PetscFunctionReturn(0); 6435f2c45f1SShri Abhyankar } 6445f2c45f1SShri Abhyankar 6455f2c45f1SShri Abhyankar /*@ 6465f2c45f1SShri Abhyankar DMNetworkGetNumComponents - Get the number of components at a vertex/edge 6475f2c45f1SShri Abhyankar 6485f2c45f1SShri Abhyankar Not Collective 6495f2c45f1SShri Abhyankar 6505f2c45f1SShri Abhyankar Input Parameters: 6515f2c45f1SShri Abhyankar + dm - The DMNetwork object 6525f2c45f1SShri Abhyankar . p - vertex/edge point 6535f2c45f1SShri Abhyankar 6545f2c45f1SShri Abhyankar Output Parameters: 6555f2c45f1SShri Abhyankar . numcomponents - Number of components at the vertex/edge 6565f2c45f1SShri Abhyankar 6575f2c45f1SShri Abhyankar Level: intermediate 6585f2c45f1SShri Abhyankar 6595f2c45f1SShri Abhyankar .seealso: DMNetworkRegisterComponent, DMNetworkAddComponent 6605f2c45f1SShri Abhyankar @*/ 6615f2c45f1SShri Abhyankar PetscErrorCode DMNetworkGetNumComponents(DM dm,PetscInt p,PetscInt *numcomponents) 6625f2c45f1SShri Abhyankar { 6635f2c45f1SShri Abhyankar PetscErrorCode ierr; 6645f2c45f1SShri Abhyankar PetscInt offset; 6655f2c45f1SShri Abhyankar DM_Network *network = (DM_Network*)dm->data; 6665f2c45f1SShri Abhyankar 6675f2c45f1SShri Abhyankar PetscFunctionBegin; 6685f2c45f1SShri Abhyankar ierr = PetscSectionGetOffset(network->DataSection,p,&offset);CHKERRQ(ierr); 6695f2c45f1SShri Abhyankar *numcomponents = ((DMNetworkComponentHeader)(network->componentdataarray+offset))->ndata; 6705f2c45f1SShri Abhyankar PetscFunctionReturn(0); 6715f2c45f1SShri Abhyankar } 6725f2c45f1SShri Abhyankar 6735f2c45f1SShri Abhyankar /*@ 6745f2c45f1SShri Abhyankar DMNetworkGetVariableOffset - Get the offset for accessing the variable associated with the given vertex/edge from the local vector. 6755f2c45f1SShri Abhyankar 6765f2c45f1SShri Abhyankar Not Collective 6775f2c45f1SShri Abhyankar 6785f2c45f1SShri Abhyankar Input Parameters: 6795f2c45f1SShri Abhyankar + dm - The DMNetwork object 6805f2c45f1SShri Abhyankar - p - the edge/vertex point 6815f2c45f1SShri Abhyankar 6825f2c45f1SShri Abhyankar Output Parameters: 6835f2c45f1SShri Abhyankar . offset - the offset 6845f2c45f1SShri Abhyankar 6855f2c45f1SShri Abhyankar Level: intermediate 6865f2c45f1SShri Abhyankar 6875f2c45f1SShri Abhyankar .seealso: DMNetworkGetVariableGlobalOffset, DMGetLocalVector 6885f2c45f1SShri Abhyankar @*/ 6895f2c45f1SShri Abhyankar PetscErrorCode DMNetworkGetVariableOffset(DM dm,PetscInt p,PetscInt *offset) 6905f2c45f1SShri Abhyankar { 6915f2c45f1SShri Abhyankar PetscErrorCode ierr; 6925f2c45f1SShri Abhyankar DM_Network *network = (DM_Network*)dm->data; 6935f2c45f1SShri Abhyankar 6945f2c45f1SShri Abhyankar PetscFunctionBegin; 6955f78ed8bSShri Abhyankar ierr = PetscSectionGetOffset(network->plex->defaultSection,p,offset);CHKERRQ(ierr); 6965f2c45f1SShri Abhyankar PetscFunctionReturn(0); 6975f2c45f1SShri Abhyankar } 6985f2c45f1SShri Abhyankar 6995f2c45f1SShri Abhyankar /*@ 7005f2c45f1SShri Abhyankar DMNetworkGetVariableGlobalOffset - Get the global offset for the variable associated with the given vertex/edge from the global vector. 7015f2c45f1SShri Abhyankar 7025f2c45f1SShri Abhyankar Not Collective 7035f2c45f1SShri Abhyankar 7045f2c45f1SShri Abhyankar Input Parameters: 7055f2c45f1SShri Abhyankar + dm - The DMNetwork object 7065f2c45f1SShri Abhyankar - p - the edge/vertex point 7075f2c45f1SShri Abhyankar 7085f2c45f1SShri Abhyankar Output Parameters: 7095f2c45f1SShri Abhyankar . offsetg - the offset 7105f2c45f1SShri Abhyankar 7115f2c45f1SShri Abhyankar Level: intermediate 7125f2c45f1SShri Abhyankar 7135f2c45f1SShri Abhyankar .seealso: DMNetworkGetVariableOffset, DMGetLocalVector 7145f2c45f1SShri Abhyankar @*/ 7155f2c45f1SShri Abhyankar PetscErrorCode DMNetworkGetVariableGlobalOffset(DM dm,PetscInt p,PetscInt *offsetg) 7165f2c45f1SShri Abhyankar { 7175f2c45f1SShri Abhyankar PetscErrorCode ierr; 7185f2c45f1SShri Abhyankar DM_Network *network = (DM_Network*)dm->data; 7195f2c45f1SShri Abhyankar 7205f2c45f1SShri Abhyankar PetscFunctionBegin; 7215f78ed8bSShri Abhyankar ierr = PetscSectionGetOffset(network->plex->defaultGlobalSection,p,offsetg);CHKERRQ(ierr); 7226fefedf4SHong Zhang if (*offsetg < 0) *offsetg = -(*offsetg + 1); /* Convert to actual global offset for ghost vertex */ 7235f2c45f1SShri Abhyankar PetscFunctionReturn(0); 7245f2c45f1SShri Abhyankar } 7255f2c45f1SShri Abhyankar 72624121865SAdrian Maldonado /*@ 72724121865SAdrian Maldonado DMNetworkGetEdgeOffset - Get the offset for accessing the variable associated with the given edge from the local subvector. 72824121865SAdrian Maldonado 72924121865SAdrian Maldonado Not Collective 73024121865SAdrian Maldonado 73124121865SAdrian Maldonado Input Parameters: 73224121865SAdrian Maldonado + dm - The DMNetwork object 73324121865SAdrian Maldonado - p - the edge point 73424121865SAdrian Maldonado 73524121865SAdrian Maldonado Output Parameters: 73624121865SAdrian Maldonado . offset - the offset 73724121865SAdrian Maldonado 73824121865SAdrian Maldonado Level: intermediate 73924121865SAdrian Maldonado 74024121865SAdrian Maldonado .seealso: DMNetworkGetVariableGlobalOffset, DMGetLocalVector 74124121865SAdrian Maldonado @*/ 74224121865SAdrian Maldonado PetscErrorCode DMNetworkGetEdgeOffset(DM dm,PetscInt p,PetscInt *offset) 74324121865SAdrian Maldonado { 74424121865SAdrian Maldonado PetscErrorCode ierr; 74524121865SAdrian Maldonado DM_Network *network = (DM_Network*)dm->data; 74624121865SAdrian Maldonado 74724121865SAdrian Maldonado PetscFunctionBegin; 74824121865SAdrian Maldonado 74924121865SAdrian Maldonado ierr = PetscSectionGetOffset(network->edge.DofSection,p,offset);CHKERRQ(ierr); 75024121865SAdrian Maldonado PetscFunctionReturn(0); 75124121865SAdrian Maldonado } 75224121865SAdrian Maldonado 75324121865SAdrian Maldonado /*@ 75424121865SAdrian Maldonado DMNetworkGetVertexOffset - Get the offset for accessing the variable associated with the given vertex from the local subvector. 75524121865SAdrian Maldonado 75624121865SAdrian Maldonado Not Collective 75724121865SAdrian Maldonado 75824121865SAdrian Maldonado Input Parameters: 75924121865SAdrian Maldonado + dm - The DMNetwork object 76024121865SAdrian Maldonado - p - the vertex point 76124121865SAdrian Maldonado 76224121865SAdrian Maldonado Output Parameters: 76324121865SAdrian Maldonado . offset - the offset 76424121865SAdrian Maldonado 76524121865SAdrian Maldonado Level: intermediate 76624121865SAdrian Maldonado 76724121865SAdrian Maldonado .seealso: DMNetworkGetVariableGlobalOffset, DMGetLocalVector 76824121865SAdrian Maldonado @*/ 76924121865SAdrian Maldonado PetscErrorCode DMNetworkGetVertexOffset(DM dm,PetscInt p,PetscInt *offset) 77024121865SAdrian Maldonado { 77124121865SAdrian Maldonado PetscErrorCode ierr; 77224121865SAdrian Maldonado DM_Network *network = (DM_Network*)dm->data; 77324121865SAdrian Maldonado 77424121865SAdrian Maldonado PetscFunctionBegin; 77524121865SAdrian Maldonado 77624121865SAdrian Maldonado p -= network->vStart; 77724121865SAdrian Maldonado 77824121865SAdrian Maldonado ierr = PetscSectionGetOffset(network->vertex.DofSection,p,offset);CHKERRQ(ierr); 77924121865SAdrian Maldonado PetscFunctionReturn(0); 78024121865SAdrian Maldonado } 7815f2c45f1SShri Abhyankar /*@ 7825f2c45f1SShri Abhyankar DMNetworkAddNumVariables - Add number of variables associated with a given point. 7835f2c45f1SShri Abhyankar 7845f2c45f1SShri Abhyankar Not Collective 7855f2c45f1SShri Abhyankar 7865f2c45f1SShri Abhyankar Input Parameters: 7875f2c45f1SShri Abhyankar + dm - The DMNetworkObject 7885f2c45f1SShri Abhyankar . p - the vertex/edge point 7895f2c45f1SShri Abhyankar - nvar - number of additional variables 7905f2c45f1SShri Abhyankar 7915f2c45f1SShri Abhyankar Level: intermediate 7925f2c45f1SShri Abhyankar 7935f2c45f1SShri Abhyankar .seealso: DMNetworkSetNumVariables 7945f2c45f1SShri Abhyankar @*/ 7955f2c45f1SShri Abhyankar PetscErrorCode DMNetworkAddNumVariables(DM dm,PetscInt p,PetscInt nvar) 7965f2c45f1SShri Abhyankar { 7975f2c45f1SShri Abhyankar PetscErrorCode ierr; 7985f2c45f1SShri Abhyankar DM_Network *network = (DM_Network*)dm->data; 7995f2c45f1SShri Abhyankar 8005f2c45f1SShri Abhyankar PetscFunctionBegin; 8015f2c45f1SShri Abhyankar ierr = PetscSectionAddDof(network->DofSection,p,nvar);CHKERRQ(ierr); 8025f2c45f1SShri Abhyankar PetscFunctionReturn(0); 8035f2c45f1SShri Abhyankar } 8045f2c45f1SShri Abhyankar 80527f51fceSHong Zhang /*@ 80627f51fceSHong Zhang DMNetworkGetNumVariables - Gets number of variables for a vertex/edge point. 80727f51fceSHong Zhang 80827f51fceSHong Zhang Not Collective 80927f51fceSHong Zhang 81027f51fceSHong Zhang Input Parameters: 81127f51fceSHong Zhang + dm - The DMNetworkObject 81227f51fceSHong Zhang - p - the vertex/edge point 81327f51fceSHong Zhang 81427f51fceSHong Zhang Output Parameters: 81527f51fceSHong Zhang . nvar - number of variables 81627f51fceSHong Zhang 81727f51fceSHong Zhang Level: intermediate 81827f51fceSHong Zhang 81927f51fceSHong Zhang .seealso: DMNetworkAddNumVariables, DMNetworkSddNumVariables 82027f51fceSHong Zhang @*/ 82127f51fceSHong Zhang PetscErrorCode DMNetworkGetNumVariables(DM dm,PetscInt p,PetscInt *nvar) 82227f51fceSHong Zhang { 82327f51fceSHong Zhang PetscErrorCode ierr; 82427f51fceSHong Zhang DM_Network *network = (DM_Network*)dm->data; 82527f51fceSHong Zhang 82627f51fceSHong Zhang PetscFunctionBegin; 82727f51fceSHong Zhang ierr = PetscSectionGetDof(network->DofSection,p,nvar);CHKERRQ(ierr); 82827f51fceSHong Zhang PetscFunctionReturn(0); 82927f51fceSHong Zhang } 83027f51fceSHong Zhang 8315f2c45f1SShri Abhyankar /*@ 8325f2c45f1SShri Abhyankar DMNetworkSetNumVariables - Sets number of variables for a vertex/edge point. 8335f2c45f1SShri Abhyankar 8345f2c45f1SShri Abhyankar Not Collective 8355f2c45f1SShri Abhyankar 8365f2c45f1SShri Abhyankar Input Parameters: 8375f2c45f1SShri Abhyankar + dm - The DMNetworkObject 8385f2c45f1SShri Abhyankar . p - the vertex/edge point 8395f2c45f1SShri Abhyankar - nvar - number of variables 8405f2c45f1SShri Abhyankar 8415f2c45f1SShri Abhyankar Level: intermediate 8425f2c45f1SShri Abhyankar 8435f2c45f1SShri Abhyankar .seealso: DMNetworkAddNumVariables 8445f2c45f1SShri Abhyankar @*/ 8455f2c45f1SShri Abhyankar PetscErrorCode DMNetworkSetNumVariables(DM dm,PetscInt p,PetscInt nvar) 8465f2c45f1SShri Abhyankar { 8475f2c45f1SShri Abhyankar PetscErrorCode ierr; 8485f2c45f1SShri Abhyankar DM_Network *network = (DM_Network*)dm->data; 8495f2c45f1SShri Abhyankar 8505f2c45f1SShri Abhyankar PetscFunctionBegin; 8515f2c45f1SShri Abhyankar ierr = PetscSectionSetDof(network->DofSection,p,nvar);CHKERRQ(ierr); 8525f2c45f1SShri Abhyankar PetscFunctionReturn(0); 8535f2c45f1SShri Abhyankar } 8545f2c45f1SShri Abhyankar 8555f2c45f1SShri Abhyankar /* Sets up the array that holds the data for all components and its associated section. This 8565f2c45f1SShri Abhyankar function is called during DMSetUp() */ 8575f2c45f1SShri Abhyankar PetscErrorCode DMNetworkComponentSetUp(DM dm) 8585f2c45f1SShri Abhyankar { 8595f2c45f1SShri Abhyankar PetscErrorCode ierr; 8605f2c45f1SShri Abhyankar DM_Network *network = (DM_Network*)dm->data; 8615f2c45f1SShri Abhyankar PetscInt arr_size; 8625f2c45f1SShri Abhyankar PetscInt p,offset,offsetp; 8635f2c45f1SShri Abhyankar DMNetworkComponentHeader header; 8645f2c45f1SShri Abhyankar DMNetworkComponentValue cvalue; 8655f2c45f1SShri Abhyankar DMNetworkComponentGenericDataType *componentdataarray; 8665f2c45f1SShri Abhyankar PetscInt ncomp, i; 8675f2c45f1SShri Abhyankar 8685f2c45f1SShri Abhyankar PetscFunctionBegin; 8695f2c45f1SShri Abhyankar ierr = PetscSectionSetUp(network->DataSection);CHKERRQ(ierr); 8705f2c45f1SShri Abhyankar ierr = PetscSectionGetStorageSize(network->DataSection,&arr_size);CHKERRQ(ierr); 87175b160a0SShri Abhyankar ierr = PetscMalloc1(arr_size,&network->componentdataarray);CHKERRQ(ierr); 8725f2c45f1SShri Abhyankar componentdataarray = network->componentdataarray; 8735f2c45f1SShri Abhyankar for (p = network->pStart; p < network->pEnd; p++) { 8745f2c45f1SShri Abhyankar ierr = PetscSectionGetOffset(network->DataSection,p,&offsetp);CHKERRQ(ierr); 8755f2c45f1SShri Abhyankar /* Copy header */ 8765f2c45f1SShri Abhyankar header = &network->header[p]; 877302440fdSBarry Smith ierr = PetscMemcpy(componentdataarray+offsetp,header,network->dataheadersize*sizeof(DMNetworkComponentGenericDataType));CHKERRQ(ierr); 8785f2c45f1SShri Abhyankar /* Copy data */ 8795f2c45f1SShri Abhyankar cvalue = &network->cvalue[p]; 8805f2c45f1SShri Abhyankar ncomp = header->ndata; 8815f2c45f1SShri Abhyankar for (i = 0; i < ncomp; i++) { 8825f2c45f1SShri Abhyankar offset = offsetp + network->dataheadersize + header->offset[i]; 883302440fdSBarry Smith ierr = PetscMemcpy(componentdataarray+offset,cvalue->data[i],header->size[i]*sizeof(DMNetworkComponentGenericDataType));CHKERRQ(ierr); 8845f2c45f1SShri Abhyankar } 8855f2c45f1SShri Abhyankar } 8865f2c45f1SShri Abhyankar PetscFunctionReturn(0); 8875f2c45f1SShri Abhyankar } 8885f2c45f1SShri Abhyankar 8895f2c45f1SShri Abhyankar /* Sets up the section for dofs. This routine is called during DMSetUp() */ 8905f2c45f1SShri Abhyankar PetscErrorCode DMNetworkVariablesSetUp(DM dm) 8915f2c45f1SShri Abhyankar { 8925f2c45f1SShri Abhyankar PetscErrorCode ierr; 8935f2c45f1SShri Abhyankar DM_Network *network = (DM_Network*)dm->data; 8945f2c45f1SShri Abhyankar 8955f2c45f1SShri Abhyankar PetscFunctionBegin; 8965f2c45f1SShri Abhyankar ierr = PetscSectionSetUp(network->DofSection);CHKERRQ(ierr); 8975f2c45f1SShri Abhyankar PetscFunctionReturn(0); 8985f2c45f1SShri Abhyankar } 8995f2c45f1SShri Abhyankar 9005f2c45f1SShri Abhyankar /*@C 9015f2c45f1SShri Abhyankar DMNetworkGetComponentDataArray - Returns the component data array 9025f2c45f1SShri Abhyankar 9035f2c45f1SShri Abhyankar Not Collective 9045f2c45f1SShri Abhyankar 9055f2c45f1SShri Abhyankar Input Parameters: 9065f2c45f1SShri Abhyankar . dm - The DMNetwork Object 9075f2c45f1SShri Abhyankar 9085f2c45f1SShri Abhyankar Output Parameters: 9095f2c45f1SShri Abhyankar . componentdataarray - array that holds data for all components 9105f2c45f1SShri Abhyankar 9115f2c45f1SShri Abhyankar Level: intermediate 9125f2c45f1SShri Abhyankar 913a730d845SHong Zhang .seealso: DMNetworkGetComponentKeyOffset, DMNetworkGetNumComponents 9145f2c45f1SShri Abhyankar @*/ 9155f2c45f1SShri Abhyankar PetscErrorCode DMNetworkGetComponentDataArray(DM dm,DMNetworkComponentGenericDataType **componentdataarray) 9165f2c45f1SShri Abhyankar { 9175f2c45f1SShri Abhyankar DM_Network *network = (DM_Network*)dm->data; 9185f2c45f1SShri Abhyankar 9195f2c45f1SShri Abhyankar PetscFunctionBegin; 9205f2c45f1SShri Abhyankar *componentdataarray = network->componentdataarray; 9215f2c45f1SShri Abhyankar PetscFunctionReturn(0); 9225f2c45f1SShri Abhyankar } 9235f2c45f1SShri Abhyankar 92424121865SAdrian Maldonado /* Get a subsection from a range of points */ 92524121865SAdrian Maldonado PetscErrorCode DMNetworkGetSubSection_private(PetscSection master, PetscInt pstart, PetscInt pend,PetscSection *subsection) 92624121865SAdrian Maldonado { 92724121865SAdrian Maldonado PetscErrorCode ierr; 92824121865SAdrian Maldonado PetscInt i, nvar; 92924121865SAdrian Maldonado 93024121865SAdrian Maldonado PetscFunctionBegin; 93124121865SAdrian Maldonado ierr = PetscSectionCreate(PetscObjectComm((PetscObject)master), subsection);CHKERRQ(ierr); 93224121865SAdrian Maldonado ierr = PetscSectionSetChart(*subsection, 0, pend - pstart);CHKERRQ(ierr); 93324121865SAdrian Maldonado for (i = pstart; i < pend; i++) { 93424121865SAdrian Maldonado ierr = PetscSectionGetDof(master,i,&nvar);CHKERRQ(ierr); 93524121865SAdrian Maldonado ierr = PetscSectionSetDof(*subsection, i - pstart, nvar);CHKERRQ(ierr); 93624121865SAdrian Maldonado } 93724121865SAdrian Maldonado 93824121865SAdrian Maldonado ierr = PetscSectionSetUp(*subsection);CHKERRQ(ierr); 93924121865SAdrian Maldonado PetscFunctionReturn(0); 94024121865SAdrian Maldonado } 94124121865SAdrian Maldonado 94224121865SAdrian Maldonado /* Create a submap of points with a GlobalToLocal structure */ 94324121865SAdrian Maldonado PetscErrorCode DMNetworkSetSubMap_private(PetscInt pstart, PetscInt pend, ISLocalToGlobalMapping *map) 94424121865SAdrian Maldonado { 94524121865SAdrian Maldonado PetscErrorCode ierr; 94624121865SAdrian Maldonado PetscInt i, *subpoints; 94724121865SAdrian Maldonado 94824121865SAdrian Maldonado PetscFunctionBegin; 94924121865SAdrian Maldonado /* Create index sets to map from "points" to "subpoints" */ 95024121865SAdrian Maldonado ierr = PetscMalloc1(pend - pstart, &subpoints);CHKERRQ(ierr); 95124121865SAdrian Maldonado for (i = pstart; i < pend; i++) { 95224121865SAdrian Maldonado subpoints[i - pstart] = i; 95324121865SAdrian Maldonado } 954459726d8SSatish Balay ierr = ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD,1,pend-pstart,subpoints,PETSC_COPY_VALUES,map);CHKERRQ(ierr); 95524121865SAdrian Maldonado ierr = PetscFree(subpoints);CHKERRQ(ierr); 95624121865SAdrian Maldonado PetscFunctionReturn(0); 95724121865SAdrian Maldonado } 95824121865SAdrian Maldonado 95924121865SAdrian Maldonado /*@ 96024121865SAdrian Maldonado DMNetworkAssembleGraphStructures - Assembles vertex and edge data structures. Must be called after DMNetworkDistribute. 96124121865SAdrian Maldonado 96224121865SAdrian Maldonado Collective 96324121865SAdrian Maldonado 96424121865SAdrian Maldonado Input Parameters: 96524121865SAdrian Maldonado . dm - The DMNetworkObject 96624121865SAdrian Maldonado 96724121865SAdrian Maldonado Note: the routine will create alternative orderings for the vertices and edges. Assume global network points are: 96824121865SAdrian Maldonado 96924121865SAdrian Maldonado points = [0 1 2 3 4 5 6] 97024121865SAdrian Maldonado 97124121865SAdrian Maldonado where edges = [0, 3] and vertices = [4, 6]. The new orderings will be specific to the subset (i.e vertices = [0, 2]). 97224121865SAdrian Maldonado 97324121865SAdrian Maldonado With this new ordering a local PetscSection, global PetscSection and PetscSF will be created specific to the subset. 97424121865SAdrian Maldonado 97524121865SAdrian Maldonado Level: intermediate 97624121865SAdrian Maldonado 97724121865SAdrian Maldonado @*/ 97824121865SAdrian Maldonado PetscErrorCode DMNetworkAssembleGraphStructures(DM dm) 97924121865SAdrian Maldonado { 98024121865SAdrian Maldonado PetscErrorCode ierr; 98124121865SAdrian Maldonado MPI_Comm comm; 9829852e123SBarry Smith PetscMPIInt rank, size; 98324121865SAdrian Maldonado DM_Network *network = (DM_Network*)dm->data; 98424121865SAdrian Maldonado 985eab1376dSHong Zhang PetscFunctionBegin; 98624121865SAdrian Maldonado ierr = PetscObjectGetComm((PetscObject)dm,&comm);CHKERRQ(ierr); 98724121865SAdrian Maldonado ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr); 9889852e123SBarry Smith ierr = MPI_Comm_size(comm, &size);CHKERRQ(ierr); 98924121865SAdrian Maldonado 99024121865SAdrian Maldonado /* Create maps for vertices and edges */ 99124121865SAdrian Maldonado ierr = DMNetworkSetSubMap_private(network->vStart,network->vEnd,&network->vertex.mapping);CHKERRQ(ierr); 99224121865SAdrian Maldonado ierr = DMNetworkSetSubMap_private(network->eStart,network->eEnd,&network->edge.mapping);CHKERRQ(ierr); 99324121865SAdrian Maldonado 99424121865SAdrian Maldonado /* Create local sub-sections */ 99524121865SAdrian Maldonado ierr = DMNetworkGetSubSection_private(network->DofSection,network->vStart,network->vEnd,&network->vertex.DofSection);CHKERRQ(ierr); 99624121865SAdrian Maldonado ierr = DMNetworkGetSubSection_private(network->DofSection,network->eStart,network->eEnd,&network->edge.DofSection);CHKERRQ(ierr); 99724121865SAdrian Maldonado 9989852e123SBarry Smith if (size > 1) { 99924121865SAdrian Maldonado ierr = PetscSFGetSubSF(network->plex->sf, network->vertex.mapping, &network->vertex.sf);CHKERRQ(ierr); 100024121865SAdrian Maldonado ierr = PetscSectionCreateGlobalSection(network->vertex.DofSection, network->vertex.sf, PETSC_FALSE, PETSC_FALSE, &network->vertex.GlobalDofSection);CHKERRQ(ierr); 100124121865SAdrian Maldonado ierr = PetscSFGetSubSF(network->plex->sf, network->edge.mapping, &network->edge.sf);CHKERRQ(ierr); 100224121865SAdrian Maldonado ierr = PetscSectionCreateGlobalSection(network->edge.DofSection, network->edge.sf, PETSC_FALSE, PETSC_FALSE, &network->edge.GlobalDofSection);CHKERRQ(ierr); 100324121865SAdrian Maldonado } else { 100424121865SAdrian Maldonado /* create structures for vertex */ 100524121865SAdrian Maldonado ierr = PetscSectionClone(network->vertex.DofSection,&network->vertex.GlobalDofSection);CHKERRQ(ierr); 100624121865SAdrian Maldonado /* create structures for edge */ 100724121865SAdrian Maldonado ierr = PetscSectionClone(network->edge.DofSection,&network->edge.GlobalDofSection);CHKERRQ(ierr); 100824121865SAdrian Maldonado } 100924121865SAdrian Maldonado 101024121865SAdrian Maldonado 101124121865SAdrian Maldonado /* Add viewers */ 101224121865SAdrian Maldonado ierr = PetscObjectSetName((PetscObject)network->edge.GlobalDofSection,"Global edge dof section");CHKERRQ(ierr); 101324121865SAdrian Maldonado ierr = PetscObjectSetName((PetscObject)network->vertex.GlobalDofSection,"Global vertex dof section");CHKERRQ(ierr); 101424121865SAdrian Maldonado ierr = PetscSectionViewFromOptions(network->edge.GlobalDofSection, NULL, "-edge_global_section_view");CHKERRQ(ierr); 101524121865SAdrian Maldonado ierr = PetscSectionViewFromOptions(network->vertex.GlobalDofSection, NULL, "-vertex_global_section_view");CHKERRQ(ierr); 101624121865SAdrian Maldonado 101724121865SAdrian Maldonado PetscFunctionReturn(0); 101824121865SAdrian Maldonado } 10197b6afd5bSHong Zhang 10205f2c45f1SShri Abhyankar /*@ 10215f2c45f1SShri Abhyankar DMNetworkDistribute - Distributes the network and moves associated component data. 10225f2c45f1SShri Abhyankar 10235f2c45f1SShri Abhyankar Collective 10245f2c45f1SShri Abhyankar 10255f2c45f1SShri Abhyankar Input Parameter: 1026d3464fd4SAdrian Maldonado + DM - the DMNetwork object 10275f2c45f1SShri Abhyankar - overlap - The overlap of partitions, 0 is the default 10285f2c45f1SShri Abhyankar 10295f2c45f1SShri Abhyankar Notes: 10308b171c8eSHong Zhang Distributes the network with <overlap>-overlapping partitioning of the edges. 10315f2c45f1SShri Abhyankar 10325f2c45f1SShri Abhyankar Level: intermediate 10335f2c45f1SShri Abhyankar 10345f2c45f1SShri Abhyankar .seealso: DMNetworkCreate 10355f2c45f1SShri Abhyankar @*/ 1036d3464fd4SAdrian Maldonado PetscErrorCode DMNetworkDistribute(DM *dm,PetscInt overlap) 10375f2c45f1SShri Abhyankar { 1038d3464fd4SAdrian Maldonado MPI_Comm comm; 10395f2c45f1SShri Abhyankar PetscErrorCode ierr; 1040d3464fd4SAdrian Maldonado PetscMPIInt size; 1041d3464fd4SAdrian Maldonado DM_Network *oldDMnetwork = (DM_Network*)((*dm)->data); 1042d3464fd4SAdrian Maldonado DM_Network *newDMnetwork; 10435f2c45f1SShri Abhyankar PetscSF pointsf; 10445f2c45f1SShri Abhyankar DM newDM; 104551ac5effSHong Zhang PetscPartitioner part; 1046b9c6e19dSShri Abhyankar PetscInt j,e,v,offset; 1047b9c6e19dSShri Abhyankar DMNetworkComponentHeader header; 10485f2c45f1SShri Abhyankar 10495f2c45f1SShri Abhyankar PetscFunctionBegin; 1050d3464fd4SAdrian Maldonado 1051d3464fd4SAdrian Maldonado ierr = PetscObjectGetComm((PetscObject)*dm,&comm);CHKERRQ(ierr); 1052d3464fd4SAdrian Maldonado ierr = MPI_Comm_size(comm, &size);CHKERRQ(ierr); 1053d3464fd4SAdrian Maldonado if (size == 1) PetscFunctionReturn(0); 1054d3464fd4SAdrian Maldonado 1055d3464fd4SAdrian Maldonado ierr = DMNetworkCreate(PetscObjectComm((PetscObject)*dm),&newDM);CHKERRQ(ierr); 10565f2c45f1SShri Abhyankar newDMnetwork = (DM_Network*)newDM->data; 10575f2c45f1SShri Abhyankar newDMnetwork->dataheadersize = sizeof(struct _p_DMNetworkComponentHeader)/sizeof(DMNetworkComponentGenericDataType); 105851ac5effSHong Zhang 105951ac5effSHong Zhang /* Enable runtime options for petscpartitioner */ 106051ac5effSHong Zhang ierr = DMPlexGetPartitioner(oldDMnetwork->plex,&part);CHKERRQ(ierr); 106151ac5effSHong Zhang ierr = PetscPartitionerSetFromOptions(part);CHKERRQ(ierr); 106251ac5effSHong Zhang 10635f2c45f1SShri Abhyankar /* Distribute plex dm and dof section */ 106480cf41d5SMatthew G. Knepley ierr = DMPlexDistribute(oldDMnetwork->plex,overlap,&pointsf,&newDMnetwork->plex);CHKERRQ(ierr); 106551ac5effSHong Zhang 10665f2c45f1SShri Abhyankar /* Distribute dof section */ 1067d3464fd4SAdrian Maldonado ierr = PetscSectionCreate(PetscObjectComm((PetscObject)*dm),&newDMnetwork->DofSection);CHKERRQ(ierr); 10685f2c45f1SShri Abhyankar ierr = PetscSFDistributeSection(pointsf,oldDMnetwork->DofSection,NULL,newDMnetwork->DofSection);CHKERRQ(ierr); 1069d3464fd4SAdrian Maldonado ierr = PetscSectionCreate(PetscObjectComm((PetscObject)*dm),&newDMnetwork->DataSection);CHKERRQ(ierr); 107051ac5effSHong Zhang 10715f2c45f1SShri Abhyankar /* Distribute data and associated section */ 107231da1fc8SHong Zhang ierr = DMPlexDistributeData(newDMnetwork->plex,pointsf,oldDMnetwork->DataSection,MPIU_INT,(void*)oldDMnetwork->componentdataarray,newDMnetwork->DataSection,(void**)&newDMnetwork->componentdataarray);CHKERRQ(ierr); 107324121865SAdrian Maldonado 10745f2c45f1SShri Abhyankar ierr = PetscSectionGetChart(newDMnetwork->DataSection,&newDMnetwork->pStart,&newDMnetwork->pEnd);CHKERRQ(ierr); 10755f2c45f1SShri Abhyankar ierr = DMPlexGetHeightStratum(newDMnetwork->plex,0, &newDMnetwork->eStart,&newDMnetwork->eEnd);CHKERRQ(ierr); 10765f2c45f1SShri Abhyankar ierr = DMPlexGetHeightStratum(newDMnetwork->plex,1,&newDMnetwork->vStart,&newDMnetwork->vEnd);CHKERRQ(ierr); 10775f2c45f1SShri Abhyankar newDMnetwork->nEdges = newDMnetwork->eEnd - newDMnetwork->eStart; 10786fefedf4SHong Zhang newDMnetwork->nVertices = newDMnetwork->vEnd - newDMnetwork->vStart; 10796fefedf4SHong Zhang newDMnetwork->NVertices = oldDMnetwork->NVertices; 10805f2c45f1SShri Abhyankar newDMnetwork->NEdges = oldDMnetwork->NEdges; 108124121865SAdrian Maldonado 10825f2c45f1SShri Abhyankar /* Set Dof section as the default section for dm */ 10835f2c45f1SShri Abhyankar ierr = DMSetDefaultSection(newDMnetwork->plex,newDMnetwork->DofSection);CHKERRQ(ierr); 10845f2c45f1SShri Abhyankar ierr = DMGetDefaultGlobalSection(newDMnetwork->plex,&newDMnetwork->GlobalDofSection);CHKERRQ(ierr); 10855f2c45f1SShri Abhyankar 1086b9c6e19dSShri Abhyankar /* Set up subnetwork info in the newDM */ 1087b9c6e19dSShri Abhyankar newDMnetwork->nsubnet = oldDMnetwork->nsubnet; 1088b9c6e19dSShri Abhyankar ierr = PetscCalloc1(newDMnetwork->nsubnet,&newDMnetwork->subnet);CHKERRQ(ierr); 1089b9c6e19dSShri Abhyankar /* Copy over the global number of vertices and edges in each subnetwork. Note that these are already 1090b9c6e19dSShri Abhyankar calculated in DMNetworkLayoutSetUp() 1091b9c6e19dSShri Abhyankar */ 1092b9c6e19dSShri Abhyankar for(j=0; j < newDMnetwork->nsubnet; j++) { 1093b9c6e19dSShri Abhyankar newDMnetwork->subnet[j].Nvtx = oldDMnetwork->subnet[j].Nvtx; 1094b9c6e19dSShri Abhyankar newDMnetwork->subnet[j].Nedge = oldDMnetwork->subnet[j].Nedge; 1095b9c6e19dSShri Abhyankar } 1096b9c6e19dSShri Abhyankar 1097b9c6e19dSShri Abhyankar for(e = newDMnetwork->eStart; e < newDMnetwork->eEnd; e++ ) { 1098b9c6e19dSShri Abhyankar ierr = PetscSectionGetOffset(newDMnetwork->DataSection,e,&offset);CHKERRQ(ierr); 1099b9c6e19dSShri Abhyankar header = (DMNetworkComponentHeader)(newDMnetwork->componentdataarray+offset);CHKERRQ(ierr); 1100b9c6e19dSShri Abhyankar newDMnetwork->subnet[header->subnetid].nedge++; 1101b9c6e19dSShri Abhyankar } 1102b9c6e19dSShri Abhyankar 1103b9c6e19dSShri Abhyankar for(v = newDMnetwork->vStart; v < newDMnetwork->vEnd; v++ ) { 1104b9c6e19dSShri Abhyankar ierr = PetscSectionGetOffset(newDMnetwork->DataSection,v,&offset);CHKERRQ(ierr); 1105b9c6e19dSShri Abhyankar header = (DMNetworkComponentHeader)(newDMnetwork->componentdataarray+offset);CHKERRQ(ierr); 1106b9c6e19dSShri Abhyankar newDMnetwork->subnet[header->subnetid].nvtx++; 1107b9c6e19dSShri Abhyankar } 1108b9c6e19dSShri Abhyankar 1109b9c6e19dSShri Abhyankar /* Now create the vertices and edge arrays for the subnetworks */ 1110b9c6e19dSShri Abhyankar for(j=0; j < newDMnetwork->nsubnet; j++) { 1111b9c6e19dSShri Abhyankar ierr = PetscCalloc1(newDMnetwork->subnet[j].nedge,&newDMnetwork->subnet[j].edges);CHKERRQ(ierr); 1112b9c6e19dSShri Abhyankar ierr = PetscCalloc1(newDMnetwork->subnet[j].nvtx,&newDMnetwork->subnet[j].vertices);CHKERRQ(ierr); 1113b9c6e19dSShri Abhyankar /* Temporarily setting nvtx and nedge to 0 so we can use them as counters in the below for loop. 1114b9c6e19dSShri Abhyankar These get updated when the vertices and edges are added. */ 1115b9c6e19dSShri Abhyankar newDMnetwork->subnet[j].nvtx = newDMnetwork->subnet[j].nedge = 0; 1116b9c6e19dSShri Abhyankar } 1117b9c6e19dSShri Abhyankar 1118b9c6e19dSShri Abhyankar /* Set the vertices and edges in each subnetwork */ 1119b9c6e19dSShri Abhyankar for(e = newDMnetwork->eStart; e < newDMnetwork->eEnd; e++ ) { 1120b9c6e19dSShri Abhyankar ierr = PetscSectionGetOffset(newDMnetwork->DataSection,e,&offset);CHKERRQ(ierr); 1121b9c6e19dSShri Abhyankar header = (DMNetworkComponentHeader)(newDMnetwork->componentdataarray+offset);CHKERRQ(ierr); 1122b9c6e19dSShri Abhyankar newDMnetwork->subnet[header->subnetid].edges[newDMnetwork->subnet[header->subnetid].nedge++] = e; 1123b9c6e19dSShri Abhyankar } 1124b9c6e19dSShri Abhyankar 1125b9c6e19dSShri Abhyankar for(v = newDMnetwork->vStart; v < newDMnetwork->vEnd; v++ ) { 1126b9c6e19dSShri Abhyankar ierr = PetscSectionGetOffset(newDMnetwork->DataSection,v,&offset);CHKERRQ(ierr); 1127b9c6e19dSShri Abhyankar header = (DMNetworkComponentHeader)(newDMnetwork->componentdataarray+offset);CHKERRQ(ierr); 1128b9c6e19dSShri Abhyankar newDMnetwork->subnet[header->subnetid].vertices[newDMnetwork->subnet[header->subnetid].nvtx++] = v; 1129b9c6e19dSShri Abhyankar } 1130b9c6e19dSShri Abhyankar 113124121865SAdrian Maldonado /* Destroy point SF */ 113224121865SAdrian Maldonado ierr = PetscSFDestroy(&pointsf);CHKERRQ(ierr); 113324121865SAdrian Maldonado 1134d3464fd4SAdrian Maldonado ierr = DMDestroy(dm);CHKERRQ(ierr); 1135d3464fd4SAdrian Maldonado *dm = newDM; 11365f2c45f1SShri Abhyankar PetscFunctionReturn(0); 11375f2c45f1SShri Abhyankar } 11385f2c45f1SShri Abhyankar 113924121865SAdrian Maldonado /*@C 114024121865SAdrian Maldonado PetscSFGetSubSF - Returns an SF for a specific subset of points. Leaves are re-numbered to reflect the new ordering. 114124121865SAdrian Maldonado 114224121865SAdrian Maldonado Input Parameters: 114324121865SAdrian Maldonado + masterSF - the original SF structure 114424121865SAdrian Maldonado - map - a ISLocalToGlobal mapping that contains the subset of points 114524121865SAdrian Maldonado 114624121865SAdrian Maldonado Output Parameters: 114724121865SAdrian Maldonado . subSF - a subset of the masterSF for the desired subset. 114824121865SAdrian Maldonado */ 114924121865SAdrian Maldonado 115024121865SAdrian Maldonado PetscErrorCode PetscSFGetSubSF(PetscSF mastersf, ISLocalToGlobalMapping map, PetscSF *subSF) { 115124121865SAdrian Maldonado 115224121865SAdrian Maldonado PetscErrorCode ierr; 115324121865SAdrian Maldonado PetscInt nroots, nleaves, *ilocal_sub; 115424121865SAdrian Maldonado PetscInt i, *ilocal_map, nroots_sub, nleaves_sub = 0; 115524121865SAdrian Maldonado PetscInt *local_points, *remote_points; 115624121865SAdrian Maldonado PetscSFNode *iremote_sub; 115724121865SAdrian Maldonado const PetscInt *ilocal; 115824121865SAdrian Maldonado const PetscSFNode *iremote; 115924121865SAdrian Maldonado 116024121865SAdrian Maldonado PetscFunctionBegin; 116124121865SAdrian Maldonado ierr = PetscSFGetGraph(mastersf,&nroots,&nleaves,&ilocal,&iremote);CHKERRQ(ierr); 116224121865SAdrian Maldonado 116324121865SAdrian Maldonado /* Look for leaves that pertain to the subset of points. Get the local ordering */ 116424121865SAdrian Maldonado ierr = PetscMalloc1(nleaves,&ilocal_map);CHKERRQ(ierr); 116524121865SAdrian Maldonado ierr = ISGlobalToLocalMappingApply(map,IS_GTOLM_MASK,nleaves,ilocal,NULL,ilocal_map);CHKERRQ(ierr); 116624121865SAdrian Maldonado for (i = 0; i < nleaves; i++) { 116724121865SAdrian Maldonado if (ilocal_map[i] != -1) nleaves_sub += 1; 116824121865SAdrian Maldonado } 116924121865SAdrian Maldonado /* Re-number ilocal with subset numbering. Need information from roots */ 117024121865SAdrian Maldonado ierr = PetscMalloc2(nroots,&local_points,nroots,&remote_points);CHKERRQ(ierr); 117124121865SAdrian Maldonado for (i = 0; i < nroots; i++) local_points[i] = i; 117224121865SAdrian Maldonado ierr = ISGlobalToLocalMappingApply(map,IS_GTOLM_MASK,nroots,local_points,NULL,local_points);CHKERRQ(ierr); 117324121865SAdrian Maldonado ierr = PetscSFBcastBegin(mastersf, MPIU_INT, local_points, remote_points);CHKERRQ(ierr); 117424121865SAdrian Maldonado ierr = PetscSFBcastEnd(mastersf, MPIU_INT, local_points, remote_points);CHKERRQ(ierr); 117524121865SAdrian Maldonado /* Fill up graph using local (that is, local to the subset) numbering. */ 11764b70a8deSAdrian Maldonado ierr = PetscMalloc1(nleaves_sub,&ilocal_sub);CHKERRQ(ierr); 11774b70a8deSAdrian Maldonado ierr = PetscMalloc1(nleaves_sub,&iremote_sub);CHKERRQ(ierr); 117824121865SAdrian Maldonado nleaves_sub = 0; 117924121865SAdrian Maldonado for (i = 0; i < nleaves; i++) { 118024121865SAdrian Maldonado if (ilocal_map[i] != -1) { 118124121865SAdrian Maldonado ilocal_sub[nleaves_sub] = ilocal_map[i]; 11824b70a8deSAdrian Maldonado iremote_sub[nleaves_sub].rank = iremote[i].rank; 118324121865SAdrian Maldonado iremote_sub[nleaves_sub].index = remote_points[ilocal[i]]; 118424121865SAdrian Maldonado nleaves_sub += 1; 118524121865SAdrian Maldonado } 118624121865SAdrian Maldonado } 118724121865SAdrian Maldonado ierr = PetscFree2(local_points,remote_points);CHKERRQ(ierr); 118824121865SAdrian Maldonado ierr = ISLocalToGlobalMappingGetSize(map,&nroots_sub);CHKERRQ(ierr); 118924121865SAdrian Maldonado 119024121865SAdrian Maldonado /* Create new subSF */ 119124121865SAdrian Maldonado ierr = PetscSFCreate(PETSC_COMM_WORLD,subSF);CHKERRQ(ierr); 119224121865SAdrian Maldonado ierr = PetscSFSetFromOptions(*subSF);CHKERRQ(ierr); 11934b70a8deSAdrian Maldonado ierr = PetscSFSetGraph(*subSF,nroots_sub,nleaves_sub,ilocal_sub,PETSC_OWN_POINTER,iremote_sub,PETSC_COPY_VALUES);CHKERRQ(ierr); 119424121865SAdrian Maldonado ierr = PetscFree(ilocal_map);CHKERRQ(ierr); 11954b70a8deSAdrian Maldonado ierr = PetscFree(iremote_sub);CHKERRQ(ierr); 119624121865SAdrian Maldonado PetscFunctionReturn(0); 119724121865SAdrian Maldonado } 119824121865SAdrian Maldonado 11995f2c45f1SShri Abhyankar /*@C 12005f2c45f1SShri Abhyankar DMNetworkGetSupportingEdges - Return the supporting edges for this vertex point 12015f2c45f1SShri Abhyankar 12025f2c45f1SShri Abhyankar Not Collective 12035f2c45f1SShri Abhyankar 12045f2c45f1SShri Abhyankar Input Parameters: 12055f2c45f1SShri Abhyankar + dm - The DMNetwork object 12065f2c45f1SShri Abhyankar - p - the vertex point 12075f2c45f1SShri Abhyankar 12085f2c45f1SShri Abhyankar Output Paramters: 12095f2c45f1SShri Abhyankar + nedges - number of edges connected to this vertex point 12105f2c45f1SShri Abhyankar - edges - List of edge points 12115f2c45f1SShri Abhyankar 12125f2c45f1SShri Abhyankar Level: intermediate 12135f2c45f1SShri Abhyankar 12145f2c45f1SShri Abhyankar Fortran Notes: 12155f2c45f1SShri Abhyankar Since it returns an array, this routine is only available in Fortran 90, and you must 12165f2c45f1SShri Abhyankar include petsc.h90 in your code. 12175f2c45f1SShri Abhyankar 1218d842c372SHong Zhang .seealso: DMNetworkCreate, DMNetworkGetConnectedVertices 12195f2c45f1SShri Abhyankar @*/ 12205f2c45f1SShri Abhyankar PetscErrorCode DMNetworkGetSupportingEdges(DM dm,PetscInt vertex,PetscInt *nedges,const PetscInt *edges[]) 12215f2c45f1SShri Abhyankar { 12225f2c45f1SShri Abhyankar PetscErrorCode ierr; 12235f2c45f1SShri Abhyankar DM_Network *network = (DM_Network*)dm->data; 12245f2c45f1SShri Abhyankar 12255f2c45f1SShri Abhyankar PetscFunctionBegin; 12265f2c45f1SShri Abhyankar ierr = DMPlexGetSupportSize(network->plex,vertex,nedges);CHKERRQ(ierr); 12275f2c45f1SShri Abhyankar ierr = DMPlexGetSupport(network->plex,vertex,edges);CHKERRQ(ierr); 12285f2c45f1SShri Abhyankar PetscFunctionReturn(0); 12295f2c45f1SShri Abhyankar } 12305f2c45f1SShri Abhyankar 12315f2c45f1SShri Abhyankar /*@C 1232d842c372SHong Zhang DMNetworkGetConnectedVertices - Return the connected vertices for this edge point 12335f2c45f1SShri Abhyankar 12345f2c45f1SShri Abhyankar Not Collective 12355f2c45f1SShri Abhyankar 12365f2c45f1SShri Abhyankar Input Parameters: 12375f2c45f1SShri Abhyankar + dm - The DMNetwork object 12385f2c45f1SShri Abhyankar - p - the edge point 12395f2c45f1SShri Abhyankar 12405f2c45f1SShri Abhyankar Output Paramters: 12415f2c45f1SShri Abhyankar . vertices - vertices connected to this edge 12425f2c45f1SShri Abhyankar 12435f2c45f1SShri Abhyankar Level: intermediate 12445f2c45f1SShri Abhyankar 12455f2c45f1SShri Abhyankar Fortran Notes: 12465f2c45f1SShri Abhyankar Since it returns an array, this routine is only available in Fortran 90, and you must 12475f2c45f1SShri Abhyankar include petsc.h90 in your code. 12485f2c45f1SShri Abhyankar 12495f2c45f1SShri Abhyankar .seealso: DMNetworkCreate, DMNetworkGetSupportingEdges 12505f2c45f1SShri Abhyankar @*/ 1251d842c372SHong Zhang PetscErrorCode DMNetworkGetConnectedVertices(DM dm,PetscInt edge,const PetscInt *vertices[]) 12525f2c45f1SShri Abhyankar { 12535f2c45f1SShri Abhyankar PetscErrorCode ierr; 12545f2c45f1SShri Abhyankar DM_Network *network = (DM_Network*)dm->data; 12555f2c45f1SShri Abhyankar 12565f2c45f1SShri Abhyankar PetscFunctionBegin; 12575f2c45f1SShri Abhyankar ierr = DMPlexGetCone(network->plex,edge,vertices);CHKERRQ(ierr); 12585f2c45f1SShri Abhyankar PetscFunctionReturn(0); 12595f2c45f1SShri Abhyankar } 12605f2c45f1SShri Abhyankar 12615f2c45f1SShri Abhyankar /*@ 12625f2c45f1SShri Abhyankar DMNetworkIsGhostVertex - Returns TRUE if the vertex is a ghost vertex 12635f2c45f1SShri Abhyankar 12645f2c45f1SShri Abhyankar Not Collective 12655f2c45f1SShri Abhyankar 12665f2c45f1SShri Abhyankar Input Parameters: 12675f2c45f1SShri Abhyankar + dm - The DMNetwork object 12685f2c45f1SShri Abhyankar . p - the vertex point 12695f2c45f1SShri Abhyankar 12705f2c45f1SShri Abhyankar Output Parameter: 12715f2c45f1SShri Abhyankar . isghost - TRUE if the vertex is a ghost point 12725f2c45f1SShri Abhyankar 12735f2c45f1SShri Abhyankar Level: intermediate 12745f2c45f1SShri Abhyankar 1275d842c372SHong Zhang .seealso: DMNetworkCreate, DMNetworkGetConnectedVertices, DMNetworkGetVertexRange 12765f2c45f1SShri Abhyankar @*/ 12775f2c45f1SShri Abhyankar PetscErrorCode DMNetworkIsGhostVertex(DM dm,PetscInt p,PetscBool *isghost) 12785f2c45f1SShri Abhyankar { 12795f2c45f1SShri Abhyankar PetscErrorCode ierr; 12805f2c45f1SShri Abhyankar DM_Network *network = (DM_Network*)dm->data; 12815f2c45f1SShri Abhyankar PetscInt offsetg; 12825f2c45f1SShri Abhyankar PetscSection sectiong; 12835f2c45f1SShri Abhyankar 12845f2c45f1SShri Abhyankar PetscFunctionBegin; 12855f2c45f1SShri Abhyankar *isghost = PETSC_FALSE; 12865f2c45f1SShri Abhyankar ierr = DMGetDefaultGlobalSection(network->plex,§iong);CHKERRQ(ierr); 12875f2c45f1SShri Abhyankar ierr = PetscSectionGetOffset(sectiong,p,&offsetg);CHKERRQ(ierr); 12885f2c45f1SShri Abhyankar if (offsetg < 0) *isghost = PETSC_TRUE; 12895f2c45f1SShri Abhyankar PetscFunctionReturn(0); 12905f2c45f1SShri Abhyankar } 12915f2c45f1SShri Abhyankar 12925f2c45f1SShri Abhyankar PetscErrorCode DMSetUp_Network(DM dm) 12935f2c45f1SShri Abhyankar { 12945f2c45f1SShri Abhyankar PetscErrorCode ierr; 12955f2c45f1SShri Abhyankar DM_Network *network=(DM_Network*)dm->data; 12965f2c45f1SShri Abhyankar 12975f2c45f1SShri Abhyankar PetscFunctionBegin; 12985f2c45f1SShri Abhyankar ierr = DMNetworkComponentSetUp(dm);CHKERRQ(ierr); 12995f2c45f1SShri Abhyankar ierr = DMNetworkVariablesSetUp(dm);CHKERRQ(ierr); 13005f2c45f1SShri Abhyankar 13015f2c45f1SShri Abhyankar ierr = DMSetDefaultSection(network->plex,network->DofSection);CHKERRQ(ierr); 13025f2c45f1SShri Abhyankar ierr = DMGetDefaultGlobalSection(network->plex,&network->GlobalDofSection);CHKERRQ(ierr); 13035f2c45f1SShri Abhyankar PetscFunctionReturn(0); 13045f2c45f1SShri Abhyankar } 13055f2c45f1SShri Abhyankar 13061ad426b7SHong Zhang /*@ 130717df6e9eSHong Zhang DMNetworkHasJacobian - Sets global flag for using user's sub Jacobian matrices 13081ad426b7SHong Zhang -- replaced by DMNetworkSetOption(network,userjacobian,PETSC_TURE)? 13091ad426b7SHong Zhang 13101ad426b7SHong Zhang Collective 13111ad426b7SHong Zhang 13121ad426b7SHong Zhang Input Parameters: 131383b2e829SHong Zhang + dm - The DMNetwork object 131483b2e829SHong Zhang . eflg - turn the option on (PETSC_TRUE) or off (PETSC_FALSE) if user provides Jacobian for edges 131583b2e829SHong Zhang - vflg - turn the option on (PETSC_TRUE) or off (PETSC_FALSE) if user provides Jacobian for vertices 13161ad426b7SHong Zhang 13171ad426b7SHong Zhang Level: intermediate 13181ad426b7SHong Zhang 13191ad426b7SHong Zhang @*/ 132083b2e829SHong Zhang PetscErrorCode DMNetworkHasJacobian(DM dm,PetscBool eflg,PetscBool vflg) 13211ad426b7SHong Zhang { 13221ad426b7SHong Zhang DM_Network *network=(DM_Network*)dm->data; 13238675203cSHong Zhang PetscErrorCode ierr; 13241ad426b7SHong Zhang 13251ad426b7SHong Zhang PetscFunctionBegin; 132683b2e829SHong Zhang network->userEdgeJacobian = eflg; 132783b2e829SHong Zhang network->userVertexJacobian = vflg; 13288675203cSHong Zhang 13298675203cSHong Zhang if (eflg && !network->Je) { 13308675203cSHong Zhang ierr = PetscCalloc1(3*network->nEdges,&network->Je);CHKERRQ(ierr); 13318675203cSHong Zhang } 13328675203cSHong Zhang 13338675203cSHong Zhang if (vflg && !network->Jv) { 13348675203cSHong Zhang PetscInt i,*vptr,nedges,vStart=network->vStart; 13358675203cSHong Zhang PetscInt nVertices = network->nVertices,nedges_total; 13368675203cSHong Zhang const PetscInt *edges; 13378675203cSHong Zhang 13388675203cSHong Zhang /* count nvertex_total */ 13398675203cSHong Zhang nedges_total = 0; 13408675203cSHong Zhang ierr = PetscMalloc1(nVertices+1,&vptr);CHKERRQ(ierr); 13418675203cSHong Zhang 13428675203cSHong Zhang vptr[0] = 0; 13438675203cSHong Zhang for (i=0; i<nVertices; i++) { 13448675203cSHong Zhang ierr = DMNetworkGetSupportingEdges(dm,i+vStart,&nedges,&edges);CHKERRQ(ierr); 13458675203cSHong Zhang nedges_total += nedges; 13468675203cSHong Zhang vptr[i+1] = vptr[i] + 2*nedges + 1; 13478675203cSHong Zhang } 13488675203cSHong Zhang 13498675203cSHong Zhang ierr = PetscCalloc1(2*nedges_total+nVertices,&network->Jv);CHKERRQ(ierr); 13508675203cSHong Zhang network->Jvptr = vptr; 13518675203cSHong Zhang } 13521ad426b7SHong Zhang PetscFunctionReturn(0); 13531ad426b7SHong Zhang } 13541ad426b7SHong Zhang 13551ad426b7SHong Zhang /*@ 135683b2e829SHong Zhang DMNetworkEdgeSetMatrix - Sets user-provided Jacobian matrices for this edge to the network 135783b2e829SHong Zhang 135883b2e829SHong Zhang Not Collective 135983b2e829SHong Zhang 136083b2e829SHong Zhang Input Parameters: 136183b2e829SHong Zhang + dm - The DMNetwork object 136283b2e829SHong Zhang . p - the edge point 13633e97b6e8SHong Zhang - J - array (size = 3) of Jacobian submatrices for this edge point: 13643e97b6e8SHong Zhang J[0]: this edge 1365d842c372SHong Zhang J[1] and J[2]: connected vertices, obtained by calling DMNetworkGetConnectedVertices() 136683b2e829SHong Zhang 136783b2e829SHong Zhang Level: intermediate 136883b2e829SHong Zhang 136983b2e829SHong Zhang .seealso: DMNetworkVertexSetMatrix 137083b2e829SHong Zhang @*/ 137183b2e829SHong Zhang PetscErrorCode DMNetworkEdgeSetMatrix(DM dm,PetscInt p,Mat J[]) 137283b2e829SHong Zhang { 137383b2e829SHong Zhang DM_Network *network=(DM_Network*)dm->data; 137483b2e829SHong Zhang 137583b2e829SHong Zhang PetscFunctionBegin; 13768675203cSHong Zhang if (!network->Je) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ORDER,"Must call DMNetworkHasJacobian() collectively before calling DMNetworkEdgeSetMatrix"); 13778675203cSHong Zhang 13788675203cSHong Zhang if (J) { 1379883e35e8SHong Zhang network->Je[3*p] = J[0]; 1380883e35e8SHong Zhang network->Je[3*p+1] = J[1]; 1381883e35e8SHong Zhang network->Je[3*p+2] = J[2]; 13828675203cSHong Zhang } 138383b2e829SHong Zhang PetscFunctionReturn(0); 138483b2e829SHong Zhang } 138583b2e829SHong Zhang 138683b2e829SHong Zhang /*@ 138776ddfea5SHong Zhang DMNetworkVertexSetMatrix - Sets user-provided Jacobian matrix for this vertex to the network 13881ad426b7SHong Zhang 13891ad426b7SHong Zhang Not Collective 13901ad426b7SHong Zhang 13911ad426b7SHong Zhang Input Parameters: 13921ad426b7SHong Zhang + dm - The DMNetwork object 13931ad426b7SHong Zhang . p - the vertex point 13943e97b6e8SHong Zhang - J - array of Jacobian (size = 2*(num of supporting edges) + 1) submatrices for this vertex point: 13953e97b6e8SHong Zhang J[0]: this vertex 13963e97b6e8SHong Zhang J[1+2*i]: i-th supporting edge 13973e97b6e8SHong Zhang J[1+2*i+1]: i-th connected vertex 13981ad426b7SHong Zhang 13991ad426b7SHong Zhang Level: intermediate 14001ad426b7SHong Zhang 140183b2e829SHong Zhang .seealso: DMNetworkEdgeSetMatrix 14021ad426b7SHong Zhang @*/ 1403883e35e8SHong Zhang PetscErrorCode DMNetworkVertexSetMatrix(DM dm,PetscInt p,Mat J[]) 14045f2c45f1SShri Abhyankar { 14055f2c45f1SShri Abhyankar PetscErrorCode ierr; 14065f2c45f1SShri Abhyankar DM_Network *network=(DM_Network*)dm->data; 14078675203cSHong Zhang PetscInt i,*vptr,nedges,vStart=network->vStart; 1408883e35e8SHong Zhang const PetscInt *edges; 14095f2c45f1SShri Abhyankar 14105f2c45f1SShri Abhyankar PetscFunctionBegin; 14118675203cSHong Zhang if (!network->Jv) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ORDER,"Must call DMNetworkHasJacobian() collectively before calling DMNetworkVertexSetMatrix"); 1412883e35e8SHong Zhang 14138675203cSHong Zhang if (J) { 1414883e35e8SHong Zhang vptr = network->Jvptr; 14153e97b6e8SHong Zhang network->Jv[vptr[p-vStart]] = J[0]; /* Set Jacobian for this vertex */ 14163e97b6e8SHong Zhang 14173e97b6e8SHong Zhang /* Set Jacobian for each supporting edge and connected vertex */ 1418883e35e8SHong Zhang ierr = DMNetworkGetSupportingEdges(dm,p,&nedges,&edges);CHKERRQ(ierr); 1419883e35e8SHong Zhang for (i=1; i<=2*nedges; i++) network->Jv[vptr[p-vStart]+i] = J[i]; 14208675203cSHong Zhang } 1421883e35e8SHong Zhang PetscFunctionReturn(0); 1422883e35e8SHong Zhang } 1423883e35e8SHong Zhang 1424e0f69777SHong Zhang PETSC_STATIC_INLINE PetscErrorCode MatSetPreallocationDenseblock_private(PetscInt nrows,PetscInt *rows,PetscInt ncols,PetscBool ghost,Vec vdnz,Vec vonz) 14255cf7da58SHong Zhang { 14265cf7da58SHong Zhang PetscErrorCode ierr; 14275cf7da58SHong Zhang PetscInt j; 14285cf7da58SHong Zhang PetscScalar val=(PetscScalar)ncols; 14295cf7da58SHong Zhang 14305cf7da58SHong Zhang PetscFunctionBegin; 14315cf7da58SHong Zhang if (!ghost) { 14325cf7da58SHong Zhang for (j=0; j<nrows; j++) { 14335cf7da58SHong Zhang ierr = VecSetValues(vdnz,1,&rows[j],&val,ADD_VALUES);CHKERRQ(ierr); 14345cf7da58SHong Zhang } 14355cf7da58SHong Zhang } else { 14365cf7da58SHong Zhang for (j=0; j<nrows; j++) { 14375cf7da58SHong Zhang ierr = VecSetValues(vonz,1,&rows[j],&val,ADD_VALUES);CHKERRQ(ierr); 14385cf7da58SHong Zhang } 14395cf7da58SHong Zhang } 14405cf7da58SHong Zhang PetscFunctionReturn(0); 14415cf7da58SHong Zhang } 14425cf7da58SHong Zhang 1443e0f69777SHong Zhang PETSC_STATIC_INLINE PetscErrorCode MatSetPreallocationUserblock_private(Mat Ju,PetscInt nrows,PetscInt *rows,PetscInt ncols,PetscBool ghost,Vec vdnz,Vec vonz) 14445cf7da58SHong Zhang { 14455cf7da58SHong Zhang PetscErrorCode ierr; 14465cf7da58SHong Zhang PetscInt j,ncols_u; 14475cf7da58SHong Zhang PetscScalar val; 14485cf7da58SHong Zhang 14495cf7da58SHong Zhang PetscFunctionBegin; 14505cf7da58SHong Zhang if (!ghost) { 14515cf7da58SHong Zhang for (j=0; j<nrows; j++) { 14525cf7da58SHong Zhang ierr = MatGetRow(Ju,j,&ncols_u,NULL,NULL);CHKERRQ(ierr); 14535cf7da58SHong Zhang val = (PetscScalar)ncols_u; 14545cf7da58SHong Zhang ierr = VecSetValues(vdnz,1,&rows[j],&val,ADD_VALUES);CHKERRQ(ierr); 14555cf7da58SHong Zhang ierr = MatRestoreRow(Ju,j,&ncols_u,NULL,NULL);CHKERRQ(ierr); 14565cf7da58SHong Zhang } 14575cf7da58SHong Zhang } else { 14585cf7da58SHong Zhang for (j=0; j<nrows; j++) { 14595cf7da58SHong Zhang ierr = MatGetRow(Ju,j,&ncols_u,NULL,NULL);CHKERRQ(ierr); 14605cf7da58SHong Zhang val = (PetscScalar)ncols_u; 14615cf7da58SHong Zhang ierr = VecSetValues(vonz,1,&rows[j],&val,ADD_VALUES);CHKERRQ(ierr); 14625cf7da58SHong Zhang ierr = MatRestoreRow(Ju,j,&ncols_u,NULL,NULL);CHKERRQ(ierr); 14635cf7da58SHong Zhang } 14645cf7da58SHong Zhang } 14655cf7da58SHong Zhang PetscFunctionReturn(0); 14665cf7da58SHong Zhang } 14675cf7da58SHong Zhang 1468e0f69777SHong Zhang PETSC_STATIC_INLINE PetscErrorCode MatSetPreallocationblock_private(Mat Ju,PetscInt nrows,PetscInt *rows,PetscInt ncols,PetscBool ghost,Vec vdnz,Vec vonz) 14695cf7da58SHong Zhang { 14705cf7da58SHong Zhang PetscErrorCode ierr; 14715cf7da58SHong Zhang 14725cf7da58SHong Zhang PetscFunctionBegin; 14735cf7da58SHong Zhang if (Ju) { 14745cf7da58SHong Zhang ierr = MatSetPreallocationUserblock_private(Ju,nrows,rows,ncols,ghost,vdnz,vonz);CHKERRQ(ierr); 14755cf7da58SHong Zhang } else { 14765cf7da58SHong Zhang ierr = MatSetPreallocationDenseblock_private(nrows,rows,ncols,ghost,vdnz,vonz);CHKERRQ(ierr); 14775cf7da58SHong Zhang } 14785cf7da58SHong Zhang PetscFunctionReturn(0); 14795cf7da58SHong Zhang } 14805cf7da58SHong Zhang 1481e0f69777SHong Zhang PETSC_STATIC_INLINE PetscErrorCode MatSetDenseblock_private(PetscInt nrows,PetscInt *rows,PetscInt ncols,PetscInt cstart,Mat *J) 1482883e35e8SHong Zhang { 1483883e35e8SHong Zhang PetscErrorCode ierr; 1484883e35e8SHong Zhang PetscInt j,*cols; 1485883e35e8SHong Zhang PetscScalar *zeros; 1486883e35e8SHong Zhang 1487883e35e8SHong Zhang PetscFunctionBegin; 1488883e35e8SHong Zhang ierr = PetscCalloc2(ncols,&cols,nrows*ncols,&zeros);CHKERRQ(ierr); 1489883e35e8SHong Zhang for (j=0; j<ncols; j++) cols[j] = j+ cstart; 1490883e35e8SHong Zhang ierr = MatSetValues(*J,nrows,rows,ncols,cols,zeros,INSERT_VALUES);CHKERRQ(ierr); 1491883e35e8SHong Zhang ierr = PetscFree2(cols,zeros);CHKERRQ(ierr); 14921ad426b7SHong Zhang PetscFunctionReturn(0); 14931ad426b7SHong Zhang } 1494a4e85ca8SHong Zhang 1495e0f69777SHong Zhang PETSC_STATIC_INLINE PetscErrorCode MatSetUserblock_private(Mat Ju,PetscInt nrows,PetscInt *rows,PetscInt ncols,PetscInt cstart,Mat *J) 14963e97b6e8SHong Zhang { 14973e97b6e8SHong Zhang PetscErrorCode ierr; 14983e97b6e8SHong Zhang PetscInt j,M,N,row,col,ncols_u; 14993e97b6e8SHong Zhang const PetscInt *cols; 15003e97b6e8SHong Zhang PetscScalar zero=0.0; 15013e97b6e8SHong Zhang 15023e97b6e8SHong Zhang PetscFunctionBegin; 15033e97b6e8SHong Zhang ierr = MatGetSize(Ju,&M,&N);CHKERRQ(ierr); 15043e97b6e8SHong Zhang if (nrows != M || ncols != N) SETERRQ4(PetscObjectComm((PetscObject)Ju),PETSC_ERR_USER,"%D by %D must equal %D by %D",nrows,ncols,M,N); 15053e97b6e8SHong Zhang 15063e97b6e8SHong Zhang for (row=0; row<nrows; row++) { 15073e97b6e8SHong Zhang ierr = MatGetRow(Ju,row,&ncols_u,&cols,NULL);CHKERRQ(ierr); 15083e97b6e8SHong Zhang for (j=0; j<ncols_u; j++) { 15093e97b6e8SHong Zhang col = cols[j] + cstart; 15103e97b6e8SHong Zhang ierr = MatSetValues(*J,1,&rows[row],1,&col,&zero,INSERT_VALUES);CHKERRQ(ierr); 15113e97b6e8SHong Zhang } 15123e97b6e8SHong Zhang ierr = MatRestoreRow(Ju,row,&ncols_u,&cols,NULL);CHKERRQ(ierr); 15133e97b6e8SHong Zhang } 15143e97b6e8SHong Zhang PetscFunctionReturn(0); 15153e97b6e8SHong Zhang } 15161ad426b7SHong Zhang 1517e0f69777SHong Zhang PETSC_STATIC_INLINE PetscErrorCode MatSetblock_private(Mat Ju,PetscInt nrows,PetscInt *rows,PetscInt ncols,PetscInt cstart,Mat *J) 1518a4e85ca8SHong Zhang { 1519a4e85ca8SHong Zhang PetscErrorCode ierr; 1520f4431b8cSHong Zhang 1521a4e85ca8SHong Zhang PetscFunctionBegin; 1522a4e85ca8SHong Zhang if (Ju) { 1523a4e85ca8SHong Zhang ierr = MatSetUserblock_private(Ju,nrows,rows,ncols,cstart,J);CHKERRQ(ierr); 1524a4e85ca8SHong Zhang } else { 1525a4e85ca8SHong Zhang ierr = MatSetDenseblock_private(nrows,rows,ncols,cstart,J);CHKERRQ(ierr); 1526a4e85ca8SHong Zhang } 1527a4e85ca8SHong Zhang PetscFunctionReturn(0); 1528a4e85ca8SHong Zhang } 1529a4e85ca8SHong Zhang 153024121865SAdrian Maldonado /* Creates a GlobalToLocal mapping with a Local and Global section. This is akin to the routine DMGetLocalToGlobalMapping but without the need of providing a dm. 153124121865SAdrian Maldonado */ 153224121865SAdrian Maldonado PetscErrorCode CreateSubGlobalToLocalMapping_private(PetscSection globalsec, PetscSection localsec, ISLocalToGlobalMapping *ltog) 153324121865SAdrian Maldonado { 153424121865SAdrian Maldonado PetscErrorCode ierr; 153524121865SAdrian Maldonado PetscInt i, size, dof; 153624121865SAdrian Maldonado PetscInt *glob2loc; 153724121865SAdrian Maldonado 153824121865SAdrian Maldonado PetscFunctionBegin; 153924121865SAdrian Maldonado ierr = PetscSectionGetStorageSize(localsec,&size);CHKERRQ(ierr); 154024121865SAdrian Maldonado ierr = PetscMalloc1(size,&glob2loc);CHKERRQ(ierr); 154124121865SAdrian Maldonado 154224121865SAdrian Maldonado for (i = 0; i < size; i++) { 154324121865SAdrian Maldonado ierr = PetscSectionGetOffset(globalsec,i,&dof);CHKERRQ(ierr); 154424121865SAdrian Maldonado dof = (dof >= 0) ? dof : -(dof + 1); 154524121865SAdrian Maldonado glob2loc[i] = dof; 154624121865SAdrian Maldonado } 154724121865SAdrian Maldonado 154824121865SAdrian Maldonado ierr = ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD,1,size,glob2loc,PETSC_OWN_POINTER,ltog);CHKERRQ(ierr); 154924121865SAdrian Maldonado #if 0 155024121865SAdrian Maldonado ierr = PetscIntView(size,glob2loc,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); 155124121865SAdrian Maldonado #endif 155224121865SAdrian Maldonado PetscFunctionReturn(0); 155324121865SAdrian Maldonado } 155424121865SAdrian Maldonado 155501ad2aeeSHong Zhang #include <petsc/private/matimpl.h> 15561ad426b7SHong Zhang PetscErrorCode DMCreateMatrix_Network(DM dm,Mat *J) 15571ad426b7SHong Zhang { 15581ad426b7SHong Zhang PetscErrorCode ierr; 155924121865SAdrian Maldonado PetscMPIInt rank, size; 15601ad426b7SHong Zhang DM_Network *network = (DM_Network*) dm->data; 1561a4e85ca8SHong Zhang PetscInt eStart,eEnd,vStart,vEnd,rstart,nrows,*rows,localSize; 1562840c2264SHong Zhang PetscInt cstart,ncols,j,e,v; 156324121865SAdrian Maldonado PetscBool ghost,ghost_vc,ghost2,isNest; 1564a4e85ca8SHong Zhang Mat Juser; 1565bfbc38dcSHong Zhang PetscSection sectionGlobal; 1566447d78afSSatish Balay PetscInt nedges,*vptr=NULL,vc,*rows_v; /* suppress maybe-uninitialized warning */ 1567a4e85ca8SHong Zhang const PetscInt *edges,*cone; 15685cf7da58SHong Zhang MPI_Comm comm; 156924121865SAdrian Maldonado MatType mtype; 15705cf7da58SHong Zhang Vec vd_nz,vo_nz; 15715cf7da58SHong Zhang PetscInt *dnnz,*onnz; 15725cf7da58SHong Zhang PetscScalar *vdnz,*vonz; 15731ad426b7SHong Zhang 15741ad426b7SHong Zhang PetscFunctionBegin; 157524121865SAdrian Maldonado mtype = dm->mattype; 157624121865SAdrian Maldonado ierr = PetscStrcmp(mtype, MATNEST, &isNest);CHKERRQ(ierr); 157724121865SAdrian Maldonado 157824121865SAdrian Maldonado if (isNest) { 15790731d606SHong Zhang /* ierr = DMCreateMatrix_Network_Nest(); */ 158024121865SAdrian Maldonado PetscInt eDof, vDof; 158124121865SAdrian Maldonado Mat j11, j12, j21, j22, bA[2][2]; 158224121865SAdrian Maldonado ISLocalToGlobalMapping eISMap, vISMap; 158324121865SAdrian Maldonado 158424121865SAdrian Maldonado ierr = PetscObjectGetComm((PetscObject)dm,&comm);CHKERRQ(ierr); 158524121865SAdrian Maldonado ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr); 158624121865SAdrian Maldonado ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); 158724121865SAdrian Maldonado 158824121865SAdrian Maldonado ierr = PetscSectionGetConstrainedStorageSize(network->edge.GlobalDofSection,&eDof);CHKERRQ(ierr); 158924121865SAdrian Maldonado ierr = PetscSectionGetConstrainedStorageSize(network->vertex.GlobalDofSection,&vDof);CHKERRQ(ierr); 159024121865SAdrian Maldonado 159101ad2aeeSHong Zhang ierr = MatCreate(comm, &j11);CHKERRQ(ierr); 159224121865SAdrian Maldonado ierr = MatSetSizes(j11, eDof, eDof, PETSC_DETERMINE, PETSC_DETERMINE);CHKERRQ(ierr); 159324121865SAdrian Maldonado ierr = MatSetType(j11, MATMPIAIJ);CHKERRQ(ierr); 159424121865SAdrian Maldonado 159501ad2aeeSHong Zhang ierr = MatCreate(comm, &j12);CHKERRQ(ierr); 159624121865SAdrian Maldonado ierr = MatSetSizes(j12, eDof, vDof, PETSC_DETERMINE ,PETSC_DETERMINE);CHKERRQ(ierr); 159724121865SAdrian Maldonado ierr = MatSetType(j12, MATMPIAIJ);CHKERRQ(ierr); 159824121865SAdrian Maldonado 159901ad2aeeSHong Zhang ierr = MatCreate(comm, &j21);CHKERRQ(ierr); 160024121865SAdrian Maldonado ierr = MatSetSizes(j21, vDof, eDof, PETSC_DETERMINE, PETSC_DETERMINE);CHKERRQ(ierr); 160124121865SAdrian Maldonado ierr = MatSetType(j21, MATMPIAIJ);CHKERRQ(ierr); 160224121865SAdrian Maldonado 160301ad2aeeSHong Zhang ierr = MatCreate(comm, &j22);CHKERRQ(ierr); 160424121865SAdrian Maldonado ierr = MatSetSizes(j22, vDof, vDof, PETSC_DETERMINE, PETSC_DETERMINE);CHKERRQ(ierr); 160524121865SAdrian Maldonado ierr = MatSetType(j22, MATMPIAIJ);CHKERRQ(ierr); 160624121865SAdrian Maldonado 16073f6a6bdaSHong Zhang bA[0][0] = j11; 16083f6a6bdaSHong Zhang bA[0][1] = j12; 16093f6a6bdaSHong Zhang bA[1][0] = j21; 16103f6a6bdaSHong Zhang bA[1][1] = j22; 161124121865SAdrian Maldonado 161224121865SAdrian Maldonado ierr = CreateSubGlobalToLocalMapping_private(network->edge.GlobalDofSection,network->edge.DofSection,&eISMap);CHKERRQ(ierr); 161324121865SAdrian Maldonado ierr = CreateSubGlobalToLocalMapping_private(network->vertex.GlobalDofSection,network->vertex.DofSection,&vISMap);CHKERRQ(ierr); 161424121865SAdrian Maldonado 161524121865SAdrian Maldonado ierr = MatSetLocalToGlobalMapping(j11,eISMap,eISMap);CHKERRQ(ierr); 161624121865SAdrian Maldonado ierr = MatSetLocalToGlobalMapping(j12,eISMap,vISMap);CHKERRQ(ierr); 161724121865SAdrian Maldonado ierr = MatSetLocalToGlobalMapping(j21,vISMap,eISMap);CHKERRQ(ierr); 161824121865SAdrian Maldonado ierr = MatSetLocalToGlobalMapping(j22,vISMap,vISMap);CHKERRQ(ierr); 161924121865SAdrian Maldonado 162024121865SAdrian Maldonado ierr = MatSetUp(j11);CHKERRQ(ierr); 162124121865SAdrian Maldonado ierr = MatSetUp(j12);CHKERRQ(ierr); 162224121865SAdrian Maldonado ierr = MatSetUp(j21);CHKERRQ(ierr); 162324121865SAdrian Maldonado ierr = MatSetUp(j22);CHKERRQ(ierr); 162424121865SAdrian Maldonado 162501ad2aeeSHong Zhang ierr = MatCreateNest(comm,2,NULL,2,NULL,&bA[0][0],J);CHKERRQ(ierr); 162624121865SAdrian Maldonado ierr = MatSetUp(*J);CHKERRQ(ierr); 162724121865SAdrian Maldonado ierr = MatNestSetVecType(*J,VECNEST);CHKERRQ(ierr); 162824121865SAdrian Maldonado ierr = MatDestroy(&j11);CHKERRQ(ierr); 162924121865SAdrian Maldonado ierr = MatDestroy(&j12);CHKERRQ(ierr); 163024121865SAdrian Maldonado ierr = MatDestroy(&j21);CHKERRQ(ierr); 163124121865SAdrian Maldonado ierr = MatDestroy(&j22);CHKERRQ(ierr); 163224121865SAdrian Maldonado 163324121865SAdrian Maldonado ierr = MatAssemblyBegin(*J,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 163424121865SAdrian Maldonado ierr = MatAssemblyEnd(*J,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 163524121865SAdrian Maldonado 163624121865SAdrian Maldonado /* Free structures */ 163724121865SAdrian Maldonado ierr = ISLocalToGlobalMappingDestroy(&eISMap);CHKERRQ(ierr); 163824121865SAdrian Maldonado ierr = ISLocalToGlobalMappingDestroy(&vISMap);CHKERRQ(ierr); 163924121865SAdrian Maldonado 164024121865SAdrian Maldonado PetscFunctionReturn(0); 164124121865SAdrian Maldonado } else if (!network->userEdgeJacobian && !network->userVertexJacobian) { 1642a4e85ca8SHong Zhang /* user does not provide Jacobian blocks */ 1643bfbc38dcSHong Zhang ierr = DMCreateMatrix(network->plex,J);CHKERRQ(ierr); 1644bfbc38dcSHong Zhang ierr = MatSetDM(*J,dm);CHKERRQ(ierr); 16451ad426b7SHong Zhang PetscFunctionReturn(0); 16461ad426b7SHong Zhang } 16471ad426b7SHong Zhang 1648bfbc38dcSHong Zhang ierr = MatCreate(PetscObjectComm((PetscObject)dm),J);CHKERRQ(ierr); 16492a945128SHong Zhang ierr = DMGetDefaultGlobalSection(network->plex,§ionGlobal);CHKERRQ(ierr); 1650bfbc38dcSHong Zhang ierr = PetscSectionGetConstrainedStorageSize(sectionGlobal,&localSize);CHKERRQ(ierr); 1651bfbc38dcSHong Zhang ierr = MatSetSizes(*J,localSize,localSize,PETSC_DETERMINE,PETSC_DETERMINE);CHKERRQ(ierr); 16522a945128SHong Zhang 16532a945128SHong Zhang ierr = MatSetType(*J,MATAIJ);CHKERRQ(ierr); 16542a945128SHong Zhang ierr = MatSetFromOptions(*J);CHKERRQ(ierr); 165589898e50SHong Zhang 165689898e50SHong Zhang /* (1) Set matrix preallocation */ 165789898e50SHong Zhang /*------------------------------*/ 1658840c2264SHong Zhang ierr = PetscObjectGetComm((PetscObject)dm,&comm);CHKERRQ(ierr); 1659840c2264SHong Zhang ierr = VecCreate(comm,&vd_nz);CHKERRQ(ierr); 1660840c2264SHong Zhang ierr = VecSetSizes(vd_nz,localSize,PETSC_DECIDE);CHKERRQ(ierr); 1661840c2264SHong Zhang ierr = VecSetFromOptions(vd_nz);CHKERRQ(ierr); 1662840c2264SHong Zhang ierr = VecSet(vd_nz,0.0);CHKERRQ(ierr); 1663840c2264SHong Zhang ierr = VecDuplicate(vd_nz,&vo_nz);CHKERRQ(ierr); 1664840c2264SHong Zhang 166589898e50SHong Zhang /* Set preallocation for edges */ 166689898e50SHong Zhang /*-----------------------------*/ 1667840c2264SHong Zhang ierr = DMNetworkGetEdgeRange(dm,&eStart,&eEnd);CHKERRQ(ierr); 1668840c2264SHong Zhang 1669bdcb62a2SHong Zhang ierr = PetscMalloc1(localSize,&rows);CHKERRQ(ierr); 1670840c2264SHong Zhang for (e=eStart; e<eEnd; e++) { 1671840c2264SHong Zhang /* Get row indices */ 1672840c2264SHong Zhang ierr = DMNetworkGetVariableGlobalOffset(dm,e,&rstart);CHKERRQ(ierr); 1673840c2264SHong Zhang ierr = DMNetworkGetNumVariables(dm,e,&nrows);CHKERRQ(ierr); 1674840c2264SHong Zhang if (nrows) { 1675840c2264SHong Zhang for (j=0; j<nrows; j++) rows[j] = j + rstart; 1676840c2264SHong Zhang 16775cf7da58SHong Zhang /* Set preallocation for conntected vertices */ 1678d842c372SHong Zhang ierr = DMNetworkGetConnectedVertices(dm,e,&cone);CHKERRQ(ierr); 1679840c2264SHong Zhang for (v=0; v<2; v++) { 1680840c2264SHong Zhang ierr = DMNetworkGetNumVariables(dm,cone[v],&ncols);CHKERRQ(ierr); 1681840c2264SHong Zhang 16828675203cSHong Zhang if (network->Je) { 1683840c2264SHong Zhang Juser = network->Je[3*e+1+v]; /* Jacobian(e,v) */ 16848675203cSHong Zhang } else Juser = NULL; 1685840c2264SHong Zhang ierr = DMNetworkIsGhostVertex(dm,cone[v],&ghost);CHKERRQ(ierr); 16865cf7da58SHong Zhang ierr = MatSetPreallocationblock_private(Juser,nrows,rows,ncols,ghost,vd_nz,vo_nz);CHKERRQ(ierr); 1687840c2264SHong Zhang } 1688840c2264SHong Zhang 168989898e50SHong Zhang /* Set preallocation for edge self */ 1690840c2264SHong Zhang cstart = rstart; 16918675203cSHong Zhang if (network->Je) { 1692840c2264SHong Zhang Juser = network->Je[3*e]; /* Jacobian(e,e) */ 16938675203cSHong Zhang } else Juser = NULL; 16945cf7da58SHong Zhang ierr = MatSetPreallocationblock_private(Juser,nrows,rows,nrows,PETSC_FALSE,vd_nz,vo_nz);CHKERRQ(ierr); 1695840c2264SHong Zhang } 1696840c2264SHong Zhang } 1697840c2264SHong Zhang 169889898e50SHong Zhang /* Set preallocation for vertices */ 169989898e50SHong Zhang /*--------------------------------*/ 1700840c2264SHong Zhang ierr = DMNetworkGetVertexRange(dm,&vStart,&vEnd);CHKERRQ(ierr); 17018675203cSHong Zhang if (vEnd - vStart) vptr = network->Jvptr; 1702840c2264SHong Zhang 1703840c2264SHong Zhang for (v=vStart; v<vEnd; v++) { 1704840c2264SHong Zhang /* Get row indices */ 1705840c2264SHong Zhang ierr = DMNetworkGetVariableGlobalOffset(dm,v,&rstart);CHKERRQ(ierr); 1706840c2264SHong Zhang ierr = DMNetworkGetNumVariables(dm,v,&nrows);CHKERRQ(ierr); 1707840c2264SHong Zhang if (!nrows) continue; 1708840c2264SHong Zhang 1709bdcb62a2SHong Zhang ierr = DMNetworkIsGhostVertex(dm,v,&ghost);CHKERRQ(ierr); 1710bdcb62a2SHong Zhang if (ghost) { 1711bdcb62a2SHong Zhang ierr = PetscMalloc1(nrows,&rows_v);CHKERRQ(ierr); 1712bdcb62a2SHong Zhang } else { 1713bdcb62a2SHong Zhang rows_v = rows; 1714bdcb62a2SHong Zhang } 1715bdcb62a2SHong Zhang 1716bdcb62a2SHong Zhang for (j=0; j<nrows; j++) rows_v[j] = j + rstart; 1717840c2264SHong Zhang 1718840c2264SHong Zhang /* Get supporting edges and connected vertices */ 1719840c2264SHong Zhang ierr = DMNetworkGetSupportingEdges(dm,v,&nedges,&edges);CHKERRQ(ierr); 1720840c2264SHong Zhang 1721840c2264SHong Zhang for (e=0; e<nedges; e++) { 1722840c2264SHong Zhang /* Supporting edges */ 1723840c2264SHong Zhang ierr = DMNetworkGetVariableGlobalOffset(dm,edges[e],&cstart);CHKERRQ(ierr); 1724840c2264SHong Zhang ierr = DMNetworkGetNumVariables(dm,edges[e],&ncols);CHKERRQ(ierr); 1725840c2264SHong Zhang 17268675203cSHong Zhang if (network->Jv) { 1727840c2264SHong Zhang Juser = network->Jv[vptr[v-vStart]+2*e+1]; /* Jacobian(v,e) */ 17288675203cSHong Zhang } else Juser = NULL; 1729bdcb62a2SHong Zhang ierr = MatSetPreallocationblock_private(Juser,nrows,rows_v,ncols,ghost,vd_nz,vo_nz);CHKERRQ(ierr); 1730840c2264SHong Zhang 1731840c2264SHong Zhang /* Connected vertices */ 1732d842c372SHong Zhang ierr = DMNetworkGetConnectedVertices(dm,edges[e],&cone);CHKERRQ(ierr); 1733840c2264SHong Zhang vc = (v == cone[0]) ? cone[1]:cone[0]; 1734840c2264SHong Zhang ierr = DMNetworkIsGhostVertex(dm,vc,&ghost_vc);CHKERRQ(ierr); 1735840c2264SHong Zhang 1736840c2264SHong Zhang ierr = DMNetworkGetNumVariables(dm,vc,&ncols);CHKERRQ(ierr); 1737840c2264SHong Zhang 17388675203cSHong Zhang if (network->Jv) { 1739840c2264SHong Zhang Juser = network->Jv[vptr[v-vStart]+2*e+2]; /* Jacobian(v,vc) */ 17408675203cSHong Zhang } else Juser = NULL; 1741e102a522SHong Zhang if (ghost_vc||ghost) { 1742e102a522SHong Zhang ghost2 = PETSC_TRUE; 1743e102a522SHong Zhang } else { 1744e102a522SHong Zhang ghost2 = PETSC_FALSE; 1745e102a522SHong Zhang } 1746e102a522SHong Zhang ierr = MatSetPreallocationblock_private(Juser,nrows,rows_v,ncols,ghost2,vd_nz,vo_nz);CHKERRQ(ierr); 1747840c2264SHong Zhang } 1748840c2264SHong Zhang 174989898e50SHong Zhang /* Set preallocation for vertex self */ 1750840c2264SHong Zhang ierr = DMNetworkIsGhostVertex(dm,v,&ghost);CHKERRQ(ierr); 1751840c2264SHong Zhang if (!ghost) { 1752840c2264SHong Zhang ierr = DMNetworkGetVariableGlobalOffset(dm,v,&cstart);CHKERRQ(ierr); 17538675203cSHong Zhang if (network->Jv) { 1754840c2264SHong Zhang Juser = network->Jv[vptr[v-vStart]]; /* Jacobian(v,v) */ 17558675203cSHong Zhang } else Juser = NULL; 1756bdcb62a2SHong Zhang ierr = MatSetPreallocationblock_private(Juser,nrows,rows_v,nrows,PETSC_FALSE,vd_nz,vo_nz);CHKERRQ(ierr); 1757840c2264SHong Zhang } 1758bdcb62a2SHong Zhang if (ghost) { 1759bdcb62a2SHong Zhang ierr = PetscFree(rows_v);CHKERRQ(ierr); 1760bdcb62a2SHong Zhang } 1761840c2264SHong Zhang } 1762840c2264SHong Zhang 1763840c2264SHong Zhang ierr = VecAssemblyBegin(vd_nz);CHKERRQ(ierr); 1764840c2264SHong Zhang ierr = VecAssemblyBegin(vo_nz);CHKERRQ(ierr); 17655cf7da58SHong Zhang 17665cf7da58SHong Zhang ierr = PetscMalloc2(localSize,&dnnz,localSize,&onnz);CHKERRQ(ierr); 17675cf7da58SHong Zhang 17685cf7da58SHong Zhang ierr = VecAssemblyEnd(vd_nz);CHKERRQ(ierr); 1769840c2264SHong Zhang ierr = VecAssemblyEnd(vo_nz);CHKERRQ(ierr); 1770840c2264SHong Zhang 1771840c2264SHong Zhang ierr = VecGetArray(vd_nz,&vdnz);CHKERRQ(ierr); 1772840c2264SHong Zhang ierr = VecGetArray(vo_nz,&vonz);CHKERRQ(ierr); 1773840c2264SHong Zhang for (j=0; j<localSize; j++) { 1774e102a522SHong Zhang dnnz[j] = (PetscInt)PetscRealPart(vdnz[j]); 1775e102a522SHong Zhang onnz[j] = (PetscInt)PetscRealPart(vonz[j]); 1776840c2264SHong Zhang } 1777840c2264SHong Zhang ierr = VecRestoreArray(vd_nz,&vdnz);CHKERRQ(ierr); 1778840c2264SHong Zhang ierr = VecRestoreArray(vo_nz,&vonz);CHKERRQ(ierr); 1779840c2264SHong Zhang ierr = VecDestroy(&vd_nz);CHKERRQ(ierr); 1780840c2264SHong Zhang ierr = VecDestroy(&vo_nz);CHKERRQ(ierr); 1781840c2264SHong Zhang 17825cf7da58SHong Zhang ierr = MatSeqAIJSetPreallocation(*J,0,dnnz);CHKERRQ(ierr); 17835cf7da58SHong Zhang ierr = MatMPIAIJSetPreallocation(*J,0,dnnz,0,onnz);CHKERRQ(ierr); 17845cf7da58SHong Zhang ierr = MatSetOption(*J,MAT_NEW_NONZERO_ALLOCATION_ERR,PETSC_TRUE);CHKERRQ(ierr); 17855cf7da58SHong Zhang 17865cf7da58SHong Zhang ierr = PetscFree2(dnnz,onnz);CHKERRQ(ierr); 17875cf7da58SHong Zhang 178889898e50SHong Zhang /* (2) Set matrix entries for edges */ 178989898e50SHong Zhang /*----------------------------------*/ 17901ad426b7SHong Zhang for (e=eStart; e<eEnd; e++) { 1791bfbc38dcSHong Zhang /* Get row indices */ 17921ad426b7SHong Zhang ierr = DMNetworkGetVariableGlobalOffset(dm,e,&rstart);CHKERRQ(ierr); 179317df6e9eSHong Zhang ierr = DMNetworkGetNumVariables(dm,e,&nrows);CHKERRQ(ierr); 17944b976069SHong Zhang if (nrows) { 179517df6e9eSHong Zhang for (j=0; j<nrows; j++) rows[j] = j + rstart; 17961ad426b7SHong Zhang 1797bfbc38dcSHong Zhang /* Set matrix entries for conntected vertices */ 1798d842c372SHong Zhang ierr = DMNetworkGetConnectedVertices(dm,e,&cone);CHKERRQ(ierr); 1799bfbc38dcSHong Zhang for (v=0; v<2; v++) { 1800bfbc38dcSHong Zhang ierr = DMNetworkGetVariableGlobalOffset(dm,cone[v],&cstart);CHKERRQ(ierr); 1801883e35e8SHong Zhang ierr = DMNetworkGetNumVariables(dm,cone[v],&ncols);CHKERRQ(ierr); 18023e97b6e8SHong Zhang 18038675203cSHong Zhang if (network->Je) { 1804a4e85ca8SHong Zhang Juser = network->Je[3*e+1+v]; /* Jacobian(e,v) */ 18058675203cSHong Zhang } else Juser = NULL; 1806a4e85ca8SHong Zhang ierr = MatSetblock_private(Juser,nrows,rows,ncols,cstart,J);CHKERRQ(ierr); 1807bfbc38dcSHong Zhang } 180817df6e9eSHong Zhang 1809bfbc38dcSHong Zhang /* Set matrix entries for edge self */ 18103e97b6e8SHong Zhang cstart = rstart; 18118675203cSHong Zhang if (network->Je) { 1812a4e85ca8SHong Zhang Juser = network->Je[3*e]; /* Jacobian(e,e) */ 18138675203cSHong Zhang } else Juser = NULL; 1814a4e85ca8SHong Zhang ierr = MatSetblock_private(Juser,nrows,rows,nrows,cstart,J);CHKERRQ(ierr); 18151ad426b7SHong Zhang } 18164b976069SHong Zhang } 18171ad426b7SHong Zhang 1818bfbc38dcSHong Zhang /* Set matrix entries for vertices */ 181983b2e829SHong Zhang /*---------------------------------*/ 18201ad426b7SHong Zhang for (v=vStart; v<vEnd; v++) { 1821bfbc38dcSHong Zhang /* Get row indices */ 1822596e729fSHong Zhang ierr = DMNetworkGetVariableGlobalOffset(dm,v,&rstart);CHKERRQ(ierr); 1823596e729fSHong Zhang ierr = DMNetworkGetNumVariables(dm,v,&nrows);CHKERRQ(ierr); 18244b976069SHong Zhang if (!nrows) continue; 1825596e729fSHong Zhang 1826bdcb62a2SHong Zhang ierr = DMNetworkIsGhostVertex(dm,v,&ghost);CHKERRQ(ierr); 1827bdcb62a2SHong Zhang if (ghost) { 1828bdcb62a2SHong Zhang ierr = PetscMalloc1(nrows,&rows_v);CHKERRQ(ierr); 1829bdcb62a2SHong Zhang } else { 1830bdcb62a2SHong Zhang rows_v = rows; 1831bdcb62a2SHong Zhang } 1832bdcb62a2SHong Zhang for (j=0; j<nrows; j++) rows_v[j] = j + rstart; 1833596e729fSHong Zhang 1834bfbc38dcSHong Zhang /* Get supporting edges and connected vertices */ 1835596e729fSHong Zhang ierr = DMNetworkGetSupportingEdges(dm,v,&nedges,&edges);CHKERRQ(ierr); 1836596e729fSHong Zhang 1837596e729fSHong Zhang for (e=0; e<nedges; e++) { 1838bfbc38dcSHong Zhang /* Supporting edges */ 1839596e729fSHong Zhang ierr = DMNetworkGetVariableGlobalOffset(dm,edges[e],&cstart);CHKERRQ(ierr); 1840596e729fSHong Zhang ierr = DMNetworkGetNumVariables(dm,edges[e],&ncols);CHKERRQ(ierr); 1841596e729fSHong Zhang 18428675203cSHong Zhang if (network->Jv) { 1843a4e85ca8SHong Zhang Juser = network->Jv[vptr[v-vStart]+2*e+1]; /* Jacobian(v,e) */ 18448675203cSHong Zhang } else Juser = NULL; 1845bdcb62a2SHong Zhang ierr = MatSetblock_private(Juser,nrows,rows_v,ncols,cstart,J);CHKERRQ(ierr); 1846596e729fSHong Zhang 1847bfbc38dcSHong Zhang /* Connected vertices */ 1848d842c372SHong Zhang ierr = DMNetworkGetConnectedVertices(dm,edges[e],&cone);CHKERRQ(ierr); 18492a945128SHong Zhang vc = (v == cone[0]) ? cone[1]:cone[0]; 18502a945128SHong Zhang 185144aca652SHong Zhang ierr = DMNetworkGetVariableGlobalOffset(dm,vc,&cstart);CHKERRQ(ierr); 185244aca652SHong Zhang ierr = DMNetworkGetNumVariables(dm,vc,&ncols);CHKERRQ(ierr); 1853a4e85ca8SHong Zhang 18548675203cSHong Zhang if (network->Jv) { 1855a4e85ca8SHong Zhang Juser = network->Jv[vptr[v-vStart]+2*e+2]; /* Jacobian(v,vc) */ 18568675203cSHong Zhang } else Juser = NULL; 1857bdcb62a2SHong Zhang ierr = MatSetblock_private(Juser,nrows,rows_v,ncols,cstart,J);CHKERRQ(ierr); 1858596e729fSHong Zhang } 1859596e729fSHong Zhang 1860bfbc38dcSHong Zhang /* Set matrix entries for vertex self */ 18611ad426b7SHong Zhang if (!ghost) { 1862596e729fSHong Zhang ierr = DMNetworkGetVariableGlobalOffset(dm,v,&cstart);CHKERRQ(ierr); 18638675203cSHong Zhang if (network->Jv) { 1864a4e85ca8SHong Zhang Juser = network->Jv[vptr[v-vStart]]; /* Jacobian(v,v) */ 18658675203cSHong Zhang } else Juser = NULL; 1866bdcb62a2SHong Zhang ierr = MatSetblock_private(Juser,nrows,rows_v,nrows,cstart,J);CHKERRQ(ierr); 1867bdcb62a2SHong Zhang } 1868bdcb62a2SHong Zhang if (ghost) { 1869bdcb62a2SHong Zhang ierr = PetscFree(rows_v);CHKERRQ(ierr); 1870bdcb62a2SHong Zhang } 18711ad426b7SHong Zhang } 1872a4e85ca8SHong Zhang ierr = PetscFree(rows);CHKERRQ(ierr); 1873bdcb62a2SHong Zhang 18741ad426b7SHong Zhang ierr = MatAssemblyBegin(*J,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 18751ad426b7SHong Zhang ierr = MatAssemblyEnd(*J,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 1876dd6f46cdSHong Zhang 18775f2c45f1SShri Abhyankar ierr = MatSetDM(*J,dm);CHKERRQ(ierr); 18785f2c45f1SShri Abhyankar PetscFunctionReturn(0); 18795f2c45f1SShri Abhyankar } 18805f2c45f1SShri Abhyankar 18815f2c45f1SShri Abhyankar PetscErrorCode DMDestroy_Network(DM dm) 18825f2c45f1SShri Abhyankar { 18835f2c45f1SShri Abhyankar PetscErrorCode ierr; 18845f2c45f1SShri Abhyankar DM_Network *network = (DM_Network*) dm->data; 18852727e31bSShri Abhyankar PetscInt j; 18865f2c45f1SShri Abhyankar 18875f2c45f1SShri Abhyankar PetscFunctionBegin; 18888415c774SShri Abhyankar if (--network->refct > 0) PetscFunctionReturn(0); 188983b2e829SHong Zhang if (network->Je) { 189083b2e829SHong Zhang ierr = PetscFree(network->Je);CHKERRQ(ierr); 189183b2e829SHong Zhang } 189283b2e829SHong Zhang if (network->Jv) { 1893883e35e8SHong Zhang ierr = PetscFree(network->Jvptr);CHKERRQ(ierr); 189483b2e829SHong Zhang ierr = PetscFree(network->Jv);CHKERRQ(ierr); 18951ad426b7SHong Zhang } 189613c2a604SAdrian Maldonado 189713c2a604SAdrian Maldonado ierr = ISLocalToGlobalMappingDestroy(&network->vertex.mapping);CHKERRQ(ierr); 189813c2a604SAdrian Maldonado ierr = PetscSectionDestroy(&network->vertex.DofSection);CHKERRQ(ierr); 189913c2a604SAdrian Maldonado ierr = PetscSectionDestroy(&network->vertex.GlobalDofSection);CHKERRQ(ierr); 190013c2a604SAdrian Maldonado if (network->vertex.sf) { 190113c2a604SAdrian Maldonado ierr = PetscSFDestroy(&network->vertex.sf);CHKERRQ(ierr); 190213c2a604SAdrian Maldonado } 190313c2a604SAdrian Maldonado /* edge */ 190413c2a604SAdrian Maldonado ierr = ISLocalToGlobalMappingDestroy(&network->edge.mapping);CHKERRQ(ierr); 190513c2a604SAdrian Maldonado ierr = PetscSectionDestroy(&network->edge.DofSection);CHKERRQ(ierr); 190613c2a604SAdrian Maldonado ierr = PetscSectionDestroy(&network->edge.GlobalDofSection);CHKERRQ(ierr); 190713c2a604SAdrian Maldonado if (network->edge.sf) { 190813c2a604SAdrian Maldonado ierr = PetscSFDestroy(&network->edge.sf);CHKERRQ(ierr); 190913c2a604SAdrian Maldonado } 19105f2c45f1SShri Abhyankar ierr = DMDestroy(&network->plex);CHKERRQ(ierr); 19115f2c45f1SShri Abhyankar network->edges = NULL; 19125f2c45f1SShri Abhyankar ierr = PetscSectionDestroy(&network->DataSection);CHKERRQ(ierr); 19135f2c45f1SShri Abhyankar ierr = PetscSectionDestroy(&network->DofSection);CHKERRQ(ierr); 191483b2e829SHong Zhang 19152727e31bSShri Abhyankar for(j=0; j < network->nsubnet; j++) { 19162727e31bSShri Abhyankar ierr = PetscFree(network->subnet[j].edges);CHKERRQ(ierr); 19172727e31bSShri Abhyankar ierr = PetscFree(network->subnet[j].vertices);CHKERRQ(ierr); 19182727e31bSShri Abhyankar } 1919e2aaf10cSShri Abhyankar ierr = PetscFree(network->subnet);CHKERRQ(ierr); 19205f2c45f1SShri Abhyankar ierr = PetscFree(network->componentdataarray);CHKERRQ(ierr); 19215f2c45f1SShri Abhyankar ierr = PetscFree(network->cvalue);CHKERRQ(ierr); 19225f2c45f1SShri Abhyankar ierr = PetscFree(network->header);CHKERRQ(ierr); 19235f2c45f1SShri Abhyankar ierr = PetscFree(network);CHKERRQ(ierr); 19245f2c45f1SShri Abhyankar PetscFunctionReturn(0); 19255f2c45f1SShri Abhyankar } 19265f2c45f1SShri Abhyankar 19275f2c45f1SShri Abhyankar PetscErrorCode DMView_Network(DM dm, PetscViewer viewer) 19285f2c45f1SShri Abhyankar { 19295f2c45f1SShri Abhyankar PetscErrorCode ierr; 19305f2c45f1SShri Abhyankar DM_Network *network = (DM_Network*) dm->data; 19315f2c45f1SShri Abhyankar 19325f2c45f1SShri Abhyankar PetscFunctionBegin; 19335f2c45f1SShri Abhyankar ierr = DMView(network->plex,viewer);CHKERRQ(ierr); 19345f2c45f1SShri Abhyankar PetscFunctionReturn(0); 19355f2c45f1SShri Abhyankar } 19365f2c45f1SShri Abhyankar 19375f2c45f1SShri Abhyankar PetscErrorCode DMGlobalToLocalBegin_Network(DM dm, Vec g, InsertMode mode, Vec l) 19385f2c45f1SShri Abhyankar { 19395f2c45f1SShri Abhyankar PetscErrorCode ierr; 19405f2c45f1SShri Abhyankar DM_Network *network = (DM_Network*) dm->data; 19415f2c45f1SShri Abhyankar 19425f2c45f1SShri Abhyankar PetscFunctionBegin; 19435f2c45f1SShri Abhyankar ierr = DMGlobalToLocalBegin(network->plex,g,mode,l);CHKERRQ(ierr); 19445f2c45f1SShri Abhyankar PetscFunctionReturn(0); 19455f2c45f1SShri Abhyankar } 19465f2c45f1SShri Abhyankar 19475f2c45f1SShri Abhyankar PetscErrorCode DMGlobalToLocalEnd_Network(DM dm, Vec g, InsertMode mode, Vec l) 19485f2c45f1SShri Abhyankar { 19495f2c45f1SShri Abhyankar PetscErrorCode ierr; 19505f2c45f1SShri Abhyankar DM_Network *network = (DM_Network*) dm->data; 19515f2c45f1SShri Abhyankar 19525f2c45f1SShri Abhyankar PetscFunctionBegin; 19535f2c45f1SShri Abhyankar ierr = DMGlobalToLocalEnd(network->plex,g,mode,l);CHKERRQ(ierr); 19545f2c45f1SShri Abhyankar PetscFunctionReturn(0); 19555f2c45f1SShri Abhyankar } 19565f2c45f1SShri Abhyankar 19575f2c45f1SShri Abhyankar PetscErrorCode DMLocalToGlobalBegin_Network(DM dm, Vec l, InsertMode mode, Vec g) 19585f2c45f1SShri Abhyankar { 19595f2c45f1SShri Abhyankar PetscErrorCode ierr; 19605f2c45f1SShri Abhyankar DM_Network *network = (DM_Network*) dm->data; 19615f2c45f1SShri Abhyankar 19625f2c45f1SShri Abhyankar PetscFunctionBegin; 19635f2c45f1SShri Abhyankar ierr = DMLocalToGlobalBegin(network->plex,l,mode,g);CHKERRQ(ierr); 19645f2c45f1SShri Abhyankar PetscFunctionReturn(0); 19655f2c45f1SShri Abhyankar } 19665f2c45f1SShri Abhyankar 19675f2c45f1SShri Abhyankar PetscErrorCode DMLocalToGlobalEnd_Network(DM dm, Vec l, InsertMode mode, Vec g) 19685f2c45f1SShri Abhyankar { 19695f2c45f1SShri Abhyankar PetscErrorCode ierr; 19705f2c45f1SShri Abhyankar DM_Network *network = (DM_Network*) dm->data; 19715f2c45f1SShri Abhyankar 19725f2c45f1SShri Abhyankar PetscFunctionBegin; 19735f2c45f1SShri Abhyankar ierr = DMLocalToGlobalEnd(network->plex,l,mode,g);CHKERRQ(ierr); 19745f2c45f1SShri Abhyankar PetscFunctionReturn(0); 19755f2c45f1SShri Abhyankar } 1976