1 #define PETSCDM_DLL 2 #include <petsc-private/dmnetworkimpl.h> /*I "petscdmnetwork.h" I*/ 3 #include <petscdmda.h> 4 5 #undef __FUNCT__ 6 #define __FUNCT__ "DMSetFromOptions_Network" 7 PetscErrorCode DMSetFromOptions_Network(DM dm) 8 { 9 PetscErrorCode ierr; 10 11 PetscFunctionBegin; 12 PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 13 ierr = PetscOptionsHead("DMNetwork Options");CHKERRQ(ierr); 14 ierr = PetscOptionsTail();CHKERRQ(ierr); 15 PetscFunctionReturn(0); 16 } 17 18 /* External function declarations here */ 19 extern PetscErrorCode DMCreateMatrix_Network(DM, Mat*); 20 extern PetscErrorCode DMDestroy_Network(DM); 21 extern PetscErrorCode DMView_Network(DM, PetscViewer); 22 extern PetscErrorCode DMGlobalToLocalBegin_Network(DM, Vec, InsertMode, Vec); 23 extern PetscErrorCode DMGlobalToLocalEnd_Network(DM, Vec, InsertMode, Vec); 24 extern PetscErrorCode DMLocalToGlobalBegin_Network(DM, Vec, InsertMode, Vec); 25 extern PetscErrorCode DMLocalToGlobalEnd_Network(DM, Vec, InsertMode, Vec); 26 extern PetscErrorCode DMSetUp_Network(DM); 27 28 29 #undef __FUNCT__ 30 #define __FUNCT__ "DMCreateGlobalVector_Network" 31 static PetscErrorCode DMCreateGlobalVector_Network(DM dm,Vec *vec) 32 { 33 PetscErrorCode ierr; 34 DM_Network *network = (DM_Network*) dm->data; 35 36 PetscFunctionBegin; 37 ierr = DMCreateGlobalVector(network->plex,vec);CHKERRQ(ierr); 38 ierr = VecSetDM(*vec,dm);CHKERRQ(ierr); 39 PetscFunctionReturn(0); 40 } 41 42 #undef __FUNCT__ 43 #define __FUNCT__ "DMCreateLocalVector_Network" 44 static PetscErrorCode DMCreateLocalVector_Network(DM dm,Vec *vec) 45 { 46 PetscErrorCode ierr; 47 DM_Network *network = (DM_Network*) dm->data; 48 49 PetscFunctionBegin; 50 ierr = DMCreateLocalVector(network->plex,vec);CHKERRQ(ierr); 51 ierr = VecSetDM(*vec,dm);CHKERRQ(ierr); 52 PetscFunctionReturn(0); 53 } 54 55 #undef __FUNCT__ 56 #define __FUNCT__ "DMInitialize_Network" 57 PetscErrorCode DMInitialize_Network(DM dm) 58 { 59 60 PetscFunctionBegin; 61 62 dm->ops->view = NULL; 63 dm->ops->setfromoptions = DMSetFromOptions_Network; 64 dm->ops->clone = NULL; 65 dm->ops->setup = DMSetUp_Network; 66 dm->ops->createglobalvector = DMCreateGlobalVector_Network; 67 dm->ops->createlocalvector = DMCreateLocalVector_Network; 68 dm->ops->getlocaltoglobalmapping = NULL; 69 dm->ops->createfieldis = NULL; 70 dm->ops->createcoordinatedm = NULL; 71 dm->ops->getcoloring = 0; 72 dm->ops->creatematrix = DMCreateMatrix_Network; 73 dm->ops->createinterpolation = 0; 74 dm->ops->getaggregates = 0; 75 dm->ops->getinjection = 0; 76 dm->ops->refine = 0; 77 dm->ops->coarsen = 0; 78 dm->ops->refinehierarchy = 0; 79 dm->ops->coarsenhierarchy = 0; 80 dm->ops->globaltolocalbegin = DMGlobalToLocalBegin_Network; 81 dm->ops->globaltolocalend = DMGlobalToLocalEnd_Network; 82 dm->ops->localtoglobalbegin = DMLocalToGlobalBegin_Network; 83 dm->ops->localtoglobalend = DMLocalToGlobalEnd_Network; 84 dm->ops->destroy = DMDestroy_Network; 85 dm->ops->createsubdm = NULL; 86 dm->ops->locatepoints = NULL; 87 PetscFunctionReturn(0); 88 } 89 90 /*MC 91 DMNETWORK = "network" - A DM object that encapsulates an unstructured network. The implementation is based on the DM object 92 DMPlex that manages unstructured grids. Distributed networks use a non-overlapping partitioning of 93 the edges. In the local representation, Vecs contain all unknowns in the interior and shared boundary. 94 This is specified by a PetscSection object. Ownership in the global representation is determined by 95 ownership of the underlying DMPlex points. This is specified by another PetscSection object. 96 97 Level: intermediate 98 99 .seealso: DMType, DMNetworkCreate(), DMCreate(), DMSetType() 100 M*/ 101 102 #undef __FUNCT__ 103 #define __FUNCT__ "DMCreate_Network" 104 PETSC_EXTERN PetscErrorCode DMCreate_Network(DM dm) 105 { 106 DM_Network *network; 107 PetscErrorCode ierr; 108 109 PetscFunctionBegin; 110 PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 111 ierr = PetscNewLog(dm,&network);CHKERRQ(ierr); 112 dm->data = network; 113 114 network->refct = 1; 115 network->NNodes = -1; 116 network->NEdges = -1; 117 network->nNodes = -1; 118 network->nEdges = -1; 119 120 ierr = DMInitialize_Network(dm);CHKERRQ(ierr); 121 PetscFunctionReturn(0); 122 } 123 124 #undef __FUNCT__ 125 #define __FUNCT__ "DMNetworkCreate" 126 /*@ 127 DMNetworkCreate - Creates a DMNetwork object, which encapsulates an unstructured network. 128 129 Collective on MPI_Comm 130 131 Input Parameter: 132 . comm - The communicator for the DMNetwork object 133 134 Output Parameter: 135 . network - The DMNetwork object 136 137 Level: beginner 138 139 .keywords: DMNetwork, create 140 @*/ 141 PetscErrorCode DMNetworkCreate(MPI_Comm comm, DM *network) 142 { 143 PetscErrorCode ierr; 144 145 PetscFunctionBegin; 146 PetscValidPointer(network,2); 147 ierr = DMCreate(comm, network);CHKERRQ(ierr); 148 ierr = DMSetType(*network, DMNETWORK);CHKERRQ(ierr); 149 PetscFunctionReturn(0); 150 } 151