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