15f2c45f1SShri Abhyankar #define PETSCDM_DLL 25f2c45f1SShri Abhyankar #include <petsc-private/dmnetworkimpl.h> /*I "petscdmnetwork.h" I*/ 35f2c45f1SShri Abhyankar #include <petscdmda.h> 45f2c45f1SShri Abhyankar 55f2c45f1SShri Abhyankar #undef __FUNCT__ 65f2c45f1SShri Abhyankar #define __FUNCT__ "DMSetFromOptions_Network" 7*1a1499c8SBarry Smith PetscErrorCode DMSetFromOptions_Network(PetscOptionsObjectType *PetscOptionsObject,DM dm) 85f2c45f1SShri Abhyankar { 95f2c45f1SShri Abhyankar PetscErrorCode ierr; 105f2c45f1SShri Abhyankar 115f2c45f1SShri Abhyankar PetscFunctionBegin; 125f2c45f1SShri Abhyankar PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 13*1a1499c8SBarry Smith ierr = PetscOptionsHead(PetscOptionsObject,"DMNetwork Options");CHKERRQ(ierr); 145f2c45f1SShri Abhyankar ierr = PetscOptionsTail();CHKERRQ(ierr); 155f2c45f1SShri Abhyankar PetscFunctionReturn(0); 165f2c45f1SShri Abhyankar } 175f2c45f1SShri Abhyankar 185f2c45f1SShri Abhyankar /* External function declarations here */ 195f2c45f1SShri Abhyankar extern PetscErrorCode DMCreateMatrix_Network(DM, Mat*); 205f2c45f1SShri Abhyankar extern PetscErrorCode DMDestroy_Network(DM); 215f2c45f1SShri Abhyankar extern PetscErrorCode DMView_Network(DM, PetscViewer); 225f2c45f1SShri Abhyankar extern PetscErrorCode DMGlobalToLocalBegin_Network(DM, Vec, InsertMode, Vec); 235f2c45f1SShri Abhyankar extern PetscErrorCode DMGlobalToLocalEnd_Network(DM, Vec, InsertMode, Vec); 245f2c45f1SShri Abhyankar extern PetscErrorCode DMLocalToGlobalBegin_Network(DM, Vec, InsertMode, Vec); 255f2c45f1SShri Abhyankar extern PetscErrorCode DMLocalToGlobalEnd_Network(DM, Vec, InsertMode, Vec); 265f2c45f1SShri Abhyankar extern PetscErrorCode DMSetUp_Network(DM); 278415c774SShri Abhyankar extern PetscErrorCode DMClone_Network(DM, DM*); 285f2c45f1SShri Abhyankar 295f2c45f1SShri Abhyankar 305f2c45f1SShri Abhyankar #undef __FUNCT__ 315f2c45f1SShri Abhyankar #define __FUNCT__ "DMCreateGlobalVector_Network" 325f2c45f1SShri Abhyankar static PetscErrorCode DMCreateGlobalVector_Network(DM dm,Vec *vec) 335f2c45f1SShri Abhyankar { 345f2c45f1SShri Abhyankar PetscErrorCode ierr; 355f2c45f1SShri Abhyankar DM_Network *network = (DM_Network*) dm->data; 365f2c45f1SShri Abhyankar 375f2c45f1SShri Abhyankar PetscFunctionBegin; 385f2c45f1SShri Abhyankar ierr = DMCreateGlobalVector(network->plex,vec);CHKERRQ(ierr); 395f2c45f1SShri Abhyankar ierr = VecSetDM(*vec,dm);CHKERRQ(ierr); 405f2c45f1SShri Abhyankar PetscFunctionReturn(0); 415f2c45f1SShri Abhyankar } 425f2c45f1SShri Abhyankar 435f2c45f1SShri Abhyankar #undef __FUNCT__ 445f2c45f1SShri Abhyankar #define __FUNCT__ "DMCreateLocalVector_Network" 455f2c45f1SShri Abhyankar static PetscErrorCode DMCreateLocalVector_Network(DM dm,Vec *vec) 465f2c45f1SShri Abhyankar { 475f2c45f1SShri Abhyankar PetscErrorCode ierr; 485f2c45f1SShri Abhyankar DM_Network *network = (DM_Network*) dm->data; 495f2c45f1SShri Abhyankar 505f2c45f1SShri Abhyankar PetscFunctionBegin; 515f2c45f1SShri Abhyankar ierr = DMCreateLocalVector(network->plex,vec);CHKERRQ(ierr); 525f2c45f1SShri Abhyankar ierr = VecSetDM(*vec,dm);CHKERRQ(ierr); 535f2c45f1SShri Abhyankar PetscFunctionReturn(0); 545f2c45f1SShri Abhyankar } 555f2c45f1SShri Abhyankar 565f2c45f1SShri Abhyankar #undef __FUNCT__ 575f2c45f1SShri Abhyankar #define __FUNCT__ "DMInitialize_Network" 585f2c45f1SShri Abhyankar PetscErrorCode DMInitialize_Network(DM dm) 595f2c45f1SShri Abhyankar { 605f2c45f1SShri Abhyankar 615f2c45f1SShri Abhyankar PetscFunctionBegin; 625f2c45f1SShri Abhyankar 635f2c45f1SShri Abhyankar dm->ops->view = NULL; 645f2c45f1SShri Abhyankar dm->ops->setfromoptions = DMSetFromOptions_Network; 658415c774SShri Abhyankar dm->ops->clone = DMClone_Network; 665f2c45f1SShri Abhyankar dm->ops->setup = DMSetUp_Network; 675f2c45f1SShri Abhyankar dm->ops->createglobalvector = DMCreateGlobalVector_Network; 685f2c45f1SShri Abhyankar dm->ops->createlocalvector = DMCreateLocalVector_Network; 695f2c45f1SShri Abhyankar dm->ops->getlocaltoglobalmapping = NULL; 705f2c45f1SShri Abhyankar dm->ops->createfieldis = NULL; 715f2c45f1SShri Abhyankar dm->ops->createcoordinatedm = NULL; 725f2c45f1SShri Abhyankar dm->ops->getcoloring = 0; 735f2c45f1SShri Abhyankar dm->ops->creatematrix = DMCreateMatrix_Network; 745f2c45f1SShri Abhyankar dm->ops->createinterpolation = 0; 755f2c45f1SShri Abhyankar dm->ops->getaggregates = 0; 765f2c45f1SShri Abhyankar dm->ops->getinjection = 0; 775f2c45f1SShri Abhyankar dm->ops->refine = 0; 785f2c45f1SShri Abhyankar dm->ops->coarsen = 0; 795f2c45f1SShri Abhyankar dm->ops->refinehierarchy = 0; 805f2c45f1SShri Abhyankar dm->ops->coarsenhierarchy = 0; 815f2c45f1SShri Abhyankar dm->ops->globaltolocalbegin = DMGlobalToLocalBegin_Network; 825f2c45f1SShri Abhyankar dm->ops->globaltolocalend = DMGlobalToLocalEnd_Network; 835f2c45f1SShri Abhyankar dm->ops->localtoglobalbegin = DMLocalToGlobalBegin_Network; 845f2c45f1SShri Abhyankar dm->ops->localtoglobalend = DMLocalToGlobalEnd_Network; 855f2c45f1SShri Abhyankar dm->ops->destroy = DMDestroy_Network; 865f2c45f1SShri Abhyankar dm->ops->createsubdm = NULL; 875f2c45f1SShri Abhyankar dm->ops->locatepoints = NULL; 885f2c45f1SShri Abhyankar PetscFunctionReturn(0); 895f2c45f1SShri Abhyankar } 905f2c45f1SShri Abhyankar 918415c774SShri Abhyankar #undef __FUNCT__ 928415c774SShri Abhyankar #define __FUNCT__ "DMClone_Network" 938415c774SShri Abhyankar PetscErrorCode DMClone_Network(DM dm, DM *newdm) 948415c774SShri Abhyankar { 958415c774SShri Abhyankar DM_Network *network = (DM_Network *) dm->data; 968415c774SShri Abhyankar PetscErrorCode ierr; 978415c774SShri Abhyankar 988415c774SShri Abhyankar PetscFunctionBegin; 998415c774SShri Abhyankar network->refct++; 1008415c774SShri Abhyankar (*newdm)->data = network; 1018415c774SShri Abhyankar ierr = PetscObjectChangeTypeName((PetscObject) *newdm, DMNETWORK);CHKERRQ(ierr); 1028415c774SShri Abhyankar ierr = DMInitialize_Network(*newdm);CHKERRQ(ierr); 1038415c774SShri Abhyankar PetscFunctionReturn(0); 1048415c774SShri Abhyankar } 1058415c774SShri Abhyankar 1065f2c45f1SShri Abhyankar /*MC 1075f2c45f1SShri Abhyankar DMNETWORK = "network" - A DM object that encapsulates an unstructured network. The implementation is based on the DM object 1085f2c45f1SShri Abhyankar DMPlex that manages unstructured grids. Distributed networks use a non-overlapping partitioning of 1095f2c45f1SShri Abhyankar the edges. In the local representation, Vecs contain all unknowns in the interior and shared boundary. 1105f2c45f1SShri Abhyankar This is specified by a PetscSection object. Ownership in the global representation is determined by 1115f2c45f1SShri Abhyankar ownership of the underlying DMPlex points. This is specified by another PetscSection object. 1125f2c45f1SShri Abhyankar 1135f2c45f1SShri Abhyankar Level: intermediate 1145f2c45f1SShri Abhyankar 1155f2c45f1SShri Abhyankar .seealso: DMType, DMNetworkCreate(), DMCreate(), DMSetType() 1165f2c45f1SShri Abhyankar M*/ 1175f2c45f1SShri Abhyankar 1185f2c45f1SShri Abhyankar #undef __FUNCT__ 1195f2c45f1SShri Abhyankar #define __FUNCT__ "DMCreate_Network" 1205f2c45f1SShri Abhyankar PETSC_EXTERN PetscErrorCode DMCreate_Network(DM dm) 1215f2c45f1SShri Abhyankar { 1225f2c45f1SShri Abhyankar DM_Network *network; 1235f2c45f1SShri Abhyankar PetscErrorCode ierr; 1245f2c45f1SShri Abhyankar 1255f2c45f1SShri Abhyankar PetscFunctionBegin; 1265f2c45f1SShri Abhyankar PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 1275f2c45f1SShri Abhyankar ierr = PetscNewLog(dm,&network);CHKERRQ(ierr); 1285f2c45f1SShri Abhyankar dm->data = network; 1295f2c45f1SShri Abhyankar 1305f2c45f1SShri Abhyankar network->refct = 1; 1315f2c45f1SShri Abhyankar network->NNodes = -1; 1325f2c45f1SShri Abhyankar network->NEdges = -1; 1335f2c45f1SShri Abhyankar network->nNodes = -1; 1345f2c45f1SShri Abhyankar network->nEdges = -1; 1355f2c45f1SShri Abhyankar 1365f2c45f1SShri Abhyankar ierr = DMInitialize_Network(dm);CHKERRQ(ierr); 1375f2c45f1SShri Abhyankar PetscFunctionReturn(0); 1385f2c45f1SShri Abhyankar } 1395f2c45f1SShri Abhyankar 1405f2c45f1SShri Abhyankar #undef __FUNCT__ 1415f2c45f1SShri Abhyankar #define __FUNCT__ "DMNetworkCreate" 1425f2c45f1SShri Abhyankar /*@ 1435f2c45f1SShri Abhyankar DMNetworkCreate - Creates a DMNetwork object, which encapsulates an unstructured network. 1445f2c45f1SShri Abhyankar 1455f2c45f1SShri Abhyankar Collective on MPI_Comm 1465f2c45f1SShri Abhyankar 1475f2c45f1SShri Abhyankar Input Parameter: 1485f2c45f1SShri Abhyankar . comm - The communicator for the DMNetwork object 1495f2c45f1SShri Abhyankar 1505f2c45f1SShri Abhyankar Output Parameter: 1515f2c45f1SShri Abhyankar . network - The DMNetwork object 1525f2c45f1SShri Abhyankar 1535f2c45f1SShri Abhyankar Level: beginner 1545f2c45f1SShri Abhyankar 1555f2c45f1SShri Abhyankar .keywords: DMNetwork, create 1565f2c45f1SShri Abhyankar @*/ 1575f2c45f1SShri Abhyankar PetscErrorCode DMNetworkCreate(MPI_Comm comm, DM *network) 1585f2c45f1SShri Abhyankar { 1595f2c45f1SShri Abhyankar PetscErrorCode ierr; 1605f2c45f1SShri Abhyankar 1615f2c45f1SShri Abhyankar PetscFunctionBegin; 1625f2c45f1SShri Abhyankar PetscValidPointer(network,2); 1635f2c45f1SShri Abhyankar ierr = DMCreate(comm, network);CHKERRQ(ierr); 1645f2c45f1SShri Abhyankar ierr = DMSetType(*network, DMNETWORK);CHKERRQ(ierr); 1655f2c45f1SShri Abhyankar PetscFunctionReturn(0); 1665f2c45f1SShri Abhyankar } 167