1 #define PETSCDM_DLL 2 #include <petsc/private/dmnetworkimpl.h> /*I "petscdmnetwork.h" I*/ 3 #include <petscdmda.h> 4 5 PetscErrorCode DMSetFromOptions_Network(PetscOptionItems *PetscOptionsObject,DM dm) 6 { 7 PetscErrorCode ierr; 8 9 PetscFunctionBegin; 10 PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 11 ierr = PetscOptionsHead(PetscOptionsObject,"DMNetwork Options");CHKERRQ(ierr); 12 ierr = PetscOptionsTail();CHKERRQ(ierr); 13 PetscFunctionReturn(0); 14 } 15 16 /* External function declarations here */ 17 extern PetscErrorCode DMCreateMatrix_Network(DM, Mat*); 18 extern PetscErrorCode DMDestroy_Network(DM); 19 extern PetscErrorCode DMView_Network(DM, PetscViewer); 20 extern PetscErrorCode DMGlobalToLocalBegin_Network(DM, Vec, InsertMode, Vec); 21 extern PetscErrorCode DMGlobalToLocalEnd_Network(DM, Vec, InsertMode, Vec); 22 extern PetscErrorCode DMLocalToGlobalBegin_Network(DM, Vec, InsertMode, Vec); 23 extern PetscErrorCode DMLocalToGlobalEnd_Network(DM, Vec, InsertMode, Vec); 24 extern PetscErrorCode DMSetUp_Network(DM); 25 extern PetscErrorCode DMClone_Network(DM, DM*); 26 27 static PetscErrorCode VecView_Network_Seq(DM networkdm,Vec X,PetscViewer viewer) 28 { 29 PetscErrorCode ierr; 30 PetscInt i,e,v,Start,End,offset,nvar; 31 const PetscScalar *xv; 32 33 PetscFunctionBegin; 34 ierr = VecGetArrayRead(X,&xv);CHKERRQ(ierr); 35 36 /* iterate over edges */ 37 ierr = DMNetworkGetEdgeRange(networkdm,&Start,&End);CHKERRQ(ierr); 38 for (e=Start; e<End; e++) { 39 ierr = DMNetworkGetVariableOffset(networkdm,e,&offset);CHKERRQ(ierr); 40 ierr = DMNetworkGetNumVariables(networkdm,e,&nvar);CHKERRQ(ierr); 41 if (!nvar) continue; 42 ierr = PetscViewerASCIIPrintf(viewer,"Edge %D:\n",e-Start);CHKERRQ(ierr); 43 for (i=offset; i< offset+nvar; i++) { 44 #if defined(PETSC_USE_COMPLEX) 45 if (PetscImaginaryPart(xv[i]) > 0.0) { 46 ierr = PetscViewerASCIIPrintf(viewer," %g + %g i\n",(double)PetscRealPart(xv[i]),(double)PetscImaginaryPart(xv[i]));CHKERRQ(ierr); 47 } else if (PetscImaginaryPart(xv[i]) < 0.0) { 48 ierr = PetscViewerASCIIPrintf(viewer," %g - %g i\n",(double)PetscRealPart(xv[i]),-(double)PetscImaginaryPart(xv[i]));CHKERRQ(ierr); 49 } else { 50 ierr = PetscViewerASCIIPrintf(viewer," %g\n",(double)PetscRealPart(xv[i]));CHKERRQ(ierr); 51 } 52 #else 53 ierr = PetscViewerASCIIPrintf(viewer," %g\n",(double)xv[i]);CHKERRQ(ierr); 54 #endif 55 } 56 } 57 58 /* iterate over vertices */ 59 ierr = DMNetworkGetVertexRange(networkdm,&Start,&End);CHKERRQ(ierr); 60 for (v=Start; v<End; v++) { 61 ierr = DMNetworkGetVariableOffset(networkdm,v,&offset);CHKERRQ(ierr); 62 ierr = DMNetworkGetNumVariables(networkdm,v,&nvar);CHKERRQ(ierr); 63 if (!nvar) continue; 64 ierr = PetscViewerASCIIPrintf(viewer,"Vertex %D:\n",v-Start);CHKERRQ(ierr); 65 for (i=offset; i< offset+nvar; i++) { 66 #if defined(PETSC_USE_COMPLEX) 67 if (PetscImaginaryPart(xv[i]) > 0.0) { 68 ierr = PetscViewerASCIIPrintf(viewer," %g + %g i\n",(double)PetscRealPart(xv[i]),(double)PetscImaginaryPart(xv[i]));CHKERRQ(ierr); 69 } else if (PetscImaginaryPart(xv[i]) < 0.0) { 70 ierr = PetscViewerASCIIPrintf(viewer," %g - %g i\n",(double)PetscRealPart(xv[i]),-(double)PetscImaginaryPart(xv[i]));CHKERRQ(ierr); 71 } else { 72 ierr = PetscViewerASCIIPrintf(viewer," %g\n",(double)PetscRealPart(xv[i]));CHKERRQ(ierr); 73 } 74 #else 75 ierr = PetscViewerASCIIPrintf(viewer," %g\n",(double)xv[i]);CHKERRQ(ierr); 76 #endif 77 } 78 } 79 ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 80 ierr = VecRestoreArrayRead(X,&xv);CHKERRQ(ierr); 81 PetscFunctionReturn(0); 82 } 83 84 PetscErrorCode VecView_Network(Vec v,PetscViewer viewer) 85 { 86 DM dm; 87 PetscErrorCode ierr; 88 PetscBool isseq; 89 90 PetscFunctionBegin; 91 printf("VecView_Network...\n"); 92 ierr = VecGetDM(v,&dm);CHKERRQ(ierr); 93 if (!dm) SETERRQ(PetscObjectComm((PetscObject)v),PETSC_ERR_ARG_WRONG,"Vector not generated from a DM"); 94 ierr = PetscObjectTypeCompare((PetscObject)v,VECSEQ,&isseq);CHKERRQ(ierr); 95 if (isseq) { 96 ierr = VecView_Network_Seq(dm,v,viewer);CHKERRQ(ierr); 97 } else { 98 printf("not done yet\n"); 99 } 100 PetscFunctionReturn(0); 101 } 102 103 static PetscErrorCode DMCreateGlobalVector_Network(DM dm,Vec *vec) 104 { 105 PetscErrorCode ierr; 106 DM_Network *network = (DM_Network*) dm->data; 107 108 PetscFunctionBegin; 109 ierr = DMCreateGlobalVector(network->plex,vec);CHKERRQ(ierr); 110 ierr = VecSetOperation(*vec, VECOP_VIEW, (void (*)(void)) VecView_Network);CHKERRQ(ierr); 111 ierr = VecSetDM(*vec,dm);CHKERRQ(ierr); 112 PetscFunctionReturn(0); 113 } 114 115 static PetscErrorCode DMCreateLocalVector_Network(DM dm,Vec *vec) 116 { 117 PetscErrorCode ierr; 118 DM_Network *network = (DM_Network*) dm->data; 119 120 PetscFunctionBegin; 121 ierr = DMCreateLocalVector(network->plex,vec);CHKERRQ(ierr); 122 ierr = VecSetDM(*vec,dm);CHKERRQ(ierr); 123 PetscFunctionReturn(0); 124 } 125 126 PetscErrorCode DMInitialize_Network(DM dm) 127 { 128 129 PetscFunctionBegin; 130 131 dm->ops->view = NULL; 132 dm->ops->setfromoptions = DMSetFromOptions_Network; 133 dm->ops->clone = DMClone_Network; 134 dm->ops->setup = DMSetUp_Network; 135 dm->ops->createglobalvector = DMCreateGlobalVector_Network; 136 dm->ops->createlocalvector = DMCreateLocalVector_Network; 137 dm->ops->getlocaltoglobalmapping = NULL; 138 dm->ops->createfieldis = NULL; 139 dm->ops->createcoordinatedm = NULL; 140 dm->ops->getcoloring = 0; 141 dm->ops->creatematrix = DMCreateMatrix_Network; 142 dm->ops->createinterpolation = 0; 143 dm->ops->getaggregates = 0; 144 dm->ops->getinjection = 0; 145 dm->ops->refine = 0; 146 dm->ops->coarsen = 0; 147 dm->ops->refinehierarchy = 0; 148 dm->ops->coarsenhierarchy = 0; 149 dm->ops->globaltolocalbegin = DMGlobalToLocalBegin_Network; 150 dm->ops->globaltolocalend = DMGlobalToLocalEnd_Network; 151 dm->ops->localtoglobalbegin = DMLocalToGlobalBegin_Network; 152 dm->ops->localtoglobalend = DMLocalToGlobalEnd_Network; 153 dm->ops->destroy = DMDestroy_Network; 154 dm->ops->createsubdm = NULL; 155 dm->ops->locatepoints = NULL; 156 PetscFunctionReturn(0); 157 } 158 159 PetscErrorCode DMClone_Network(DM dm, DM *newdm) 160 { 161 DM_Network *network = (DM_Network *) dm->data; 162 PetscErrorCode ierr; 163 164 PetscFunctionBegin; 165 network->refct++; 166 (*newdm)->data = network; 167 ierr = PetscObjectChangeTypeName((PetscObject) *newdm, DMNETWORK);CHKERRQ(ierr); 168 ierr = DMInitialize_Network(*newdm);CHKERRQ(ierr); 169 PetscFunctionReturn(0); 170 } 171 172 /*MC 173 DMNETWORK = "network" - A DM object that encapsulates an unstructured network. The implementation is based on the DM object 174 DMPlex that manages unstructured grids. Distributed networks use a non-overlapping partitioning of 175 the edges. In the local representation, Vecs contain all unknowns in the interior and shared boundary. 176 This is specified by a PetscSection object. Ownership in the global representation is determined by 177 ownership of the underlying DMPlex points. This is specified by another PetscSection object. 178 179 Level: intermediate 180 181 .seealso: DMType, DMNetworkCreate(), DMCreate(), DMSetType() 182 M*/ 183 184 PETSC_EXTERN PetscErrorCode DMCreate_Network(DM dm) 185 { 186 DM_Network *network; 187 PetscErrorCode ierr; 188 189 PetscFunctionBegin; 190 PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 191 ierr = PetscNewLog(dm,&network);CHKERRQ(ierr); 192 dm->data = network; 193 194 network->refct = 1; 195 network->NNodes = -1; 196 network->NEdges = -1; 197 network->nNodes = -1; 198 network->nEdges = -1; 199 200 201 ierr = DMInitialize_Network(dm);CHKERRQ(ierr); 202 PetscFunctionReturn(0); 203 } 204 205 /*@ 206 DMNetworkCreate - Creates a DMNetwork object, which encapsulates an unstructured network. 207 208 Collective on MPI_Comm 209 210 Input Parameter: 211 . comm - The communicator for the DMNetwork object 212 213 Output Parameter: 214 . network - The DMNetwork object 215 216 Level: beginner 217 218 .keywords: DMNetwork, create 219 @*/ 220 PetscErrorCode DMNetworkCreate(MPI_Comm comm, DM *network) 221 { 222 PetscErrorCode ierr; 223 224 PetscFunctionBegin; 225 PetscValidPointer(network,2); 226 ierr = DMCreate(comm, network);CHKERRQ(ierr); 227 ierr = DMSetType(*network, DMNETWORK);CHKERRQ(ierr); 228 PetscFunctionReturn(0); 229 } 230