xref: /petsc/src/dm/impls/network/networkcreate.c (revision 4dc485aae907f1a91f24656518abc2c3a96d817a) !
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