xref: /petsc/src/dm/impls/patch/patch.c (revision 3a19ef87c57d96a00c8e8b5d38d585840d49a0e4)
1*3a19ef87SMatthew G Knepley #include <petsc-private/patchimpl.h>   /*I      "petscdmpatch.h"   I*/
2*3a19ef87SMatthew G Knepley #include <petscdmda.h>
3*3a19ef87SMatthew G Knepley 
4*3a19ef87SMatthew G Knepley #undef __FUNCT__
5*3a19ef87SMatthew G Knepley #define __FUNCT__ "DMPatchView_Ascii"
6*3a19ef87SMatthew G Knepley PetscErrorCode DMPatchView_Ascii(DM dm, PetscViewer viewer)
7*3a19ef87SMatthew G Knepley {
8*3a19ef87SMatthew G Knepley   DM_Patch         *mesh = (DM_Patch *) dm->data;
9*3a19ef87SMatthew G Knepley   PetscViewerFormat format;
10*3a19ef87SMatthew G Knepley   PetscInt          p;
11*3a19ef87SMatthew G Knepley   PetscErrorCode    ierr;
12*3a19ef87SMatthew G Knepley 
13*3a19ef87SMatthew G Knepley   PetscFunctionBegin;
14*3a19ef87SMatthew G Knepley   ierr = PetscViewerGetFormat(viewer, &format);CHKERRQ(ierr);
15*3a19ef87SMatthew G Knepley   /* if (format == PETSC_VIEWER_ASCII_INFO_DETAIL) */
16*3a19ef87SMatthew G Knepley   ierr = PetscViewerASCIIPrintf(viewer, "%D patches\n", mesh->numPatches);CHKERRQ(ierr);
17*3a19ef87SMatthew G Knepley   for(p = 0; p < mesh->numPatches; ++p) {
18*3a19ef87SMatthew G Knepley     ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
19*3a19ef87SMatthew G Knepley     ierr = PetscViewerASCIIPrintf(viewer, "Patch %D\n", p);CHKERRQ(ierr);
20*3a19ef87SMatthew G Knepley     ierr = DMView(mesh->patches[p], viewer);CHKERRQ(ierr);
21*3a19ef87SMatthew G Knepley     ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
22*3a19ef87SMatthew G Knepley   }
23*3a19ef87SMatthew G Knepley   ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
24*3a19ef87SMatthew G Knepley   ierr = PetscViewerASCIIPrintf(viewer, "Coarse DM\n");CHKERRQ(ierr);
25*3a19ef87SMatthew G Knepley   ierr = DMView(mesh->dmCoarse, viewer);CHKERRQ(ierr);
26*3a19ef87SMatthew G Knepley   ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
27*3a19ef87SMatthew G Knepley   PetscFunctionReturn(0);
28*3a19ef87SMatthew G Knepley }
29*3a19ef87SMatthew G Knepley 
30*3a19ef87SMatthew G Knepley #undef __FUNCT__
31*3a19ef87SMatthew G Knepley #define __FUNCT__ "DMView_Patch"
32*3a19ef87SMatthew G Knepley PetscErrorCode DMView_Patch(DM dm, PetscViewer viewer)
33*3a19ef87SMatthew G Knepley {
34*3a19ef87SMatthew G Knepley   PetscBool      iascii, isbinary;
35*3a19ef87SMatthew G Knepley   PetscErrorCode ierr;
36*3a19ef87SMatthew G Knepley 
37*3a19ef87SMatthew G Knepley   PetscFunctionBegin;
38*3a19ef87SMatthew G Knepley   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
39*3a19ef87SMatthew G Knepley   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2);
40*3a19ef87SMatthew G Knepley   ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERASCII, &iascii);CHKERRQ(ierr);
41*3a19ef87SMatthew G Knepley   ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERBINARY, &isbinary);CHKERRQ(ierr);
42*3a19ef87SMatthew G Knepley   if (iascii) {
43*3a19ef87SMatthew G Knepley     ierr = DMPatchView_Ascii(dm, viewer);CHKERRQ(ierr);
44*3a19ef87SMatthew G Knepley #if 0
45*3a19ef87SMatthew G Knepley   } else if (isbinary) {
46*3a19ef87SMatthew G Knepley     ierr = DMPatchView_Binary(dm, viewer);CHKERRQ(ierr);
47*3a19ef87SMatthew G Knepley #endif
48*3a19ef87SMatthew G Knepley   } else SETERRQ1(((PetscObject)viewer)->comm,PETSC_ERR_SUP,"Viewer type %s not supported by this mesh object", ((PetscObject)viewer)->type_name);
49*3a19ef87SMatthew G Knepley   PetscFunctionReturn(0);
50*3a19ef87SMatthew G Knepley }
51*3a19ef87SMatthew G Knepley 
52*3a19ef87SMatthew G Knepley #undef __FUNCT__
53*3a19ef87SMatthew G Knepley #define __FUNCT__ "DMDestroy_Patch"
54*3a19ef87SMatthew G Knepley PetscErrorCode DMDestroy_Patch(DM dm)
55*3a19ef87SMatthew G Knepley {
56*3a19ef87SMatthew G Knepley   DM_Patch      *mesh = (DM_Patch *) dm->data;
57*3a19ef87SMatthew G Knepley   PetscInt       p;
58*3a19ef87SMatthew G Knepley   PetscErrorCode ierr;
59*3a19ef87SMatthew G Knepley 
60*3a19ef87SMatthew G Knepley   PetscFunctionBegin;
61*3a19ef87SMatthew G Knepley   if (--mesh->refct > 0) {PetscFunctionReturn(0);}
62*3a19ef87SMatthew G Knepley   for(p = 0; p < mesh->numPatches; ++p) {
63*3a19ef87SMatthew G Knepley     ierr = DMDestroy(&mesh->patches[p]);CHKERRQ(ierr);
64*3a19ef87SMatthew G Knepley   }
65*3a19ef87SMatthew G Knepley   ierr = PetscFree(mesh->patches);CHKERRQ(ierr);
66*3a19ef87SMatthew G Knepley   ierr = DMDestroy(&mesh->dmCoarse);CHKERRQ(ierr);
67*3a19ef87SMatthew G Knepley   /* This was originally freed in DMDestroy(), but that prevents reference counting of backend objects */
68*3a19ef87SMatthew G Knepley   ierr = PetscFree(mesh);CHKERRQ(ierr);
69*3a19ef87SMatthew G Knepley   PetscFunctionReturn(0);
70*3a19ef87SMatthew G Knepley }
71*3a19ef87SMatthew G Knepley 
72*3a19ef87SMatthew G Knepley #undef __FUNCT__
73*3a19ef87SMatthew G Knepley #define __FUNCT__ "DMSetUp_Patch"
74*3a19ef87SMatthew G Knepley PetscErrorCode DMSetUp_Patch(DM dm)
75*3a19ef87SMatthew G Knepley {
76*3a19ef87SMatthew G Knepley   DM_Patch      *mesh = (DM_Patch *) dm->data;
77*3a19ef87SMatthew G Knepley   PetscInt       p;
78*3a19ef87SMatthew G Knepley   PetscErrorCode ierr;
79*3a19ef87SMatthew G Knepley 
80*3a19ef87SMatthew G Knepley   PetscFunctionBegin;
81*3a19ef87SMatthew G Knepley   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
82*3a19ef87SMatthew G Knepley   for(p = 0; p < mesh->numPatches; ++p) {
83*3a19ef87SMatthew G Knepley     ierr = DMSetUp(mesh->patches[p]);CHKERRQ(ierr);
84*3a19ef87SMatthew G Knepley   }
85*3a19ef87SMatthew G Knepley   PetscFunctionReturn(0);
86*3a19ef87SMatthew G Knepley }
87*3a19ef87SMatthew G Knepley 
88*3a19ef87SMatthew G Knepley #undef __FUNCT__
89*3a19ef87SMatthew G Knepley #define __FUNCT__ "DMCreateGlobalVector_Patch"
90*3a19ef87SMatthew G Knepley PetscErrorCode DMCreateGlobalVector_Patch(DM dm, Vec *g)
91*3a19ef87SMatthew G Knepley {
92*3a19ef87SMatthew G Knepley   DM_Patch      *mesh = (DM_Patch *) dm->data;
93*3a19ef87SMatthew G Knepley   PetscInt       p;
94*3a19ef87SMatthew G Knepley   PetscErrorCode ierr;
95*3a19ef87SMatthew G Knepley 
96*3a19ef87SMatthew G Knepley   PetscFunctionBegin;
97*3a19ef87SMatthew G Knepley   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
98*3a19ef87SMatthew G Knepley   ierr = DMCreateGlobalVector(mesh->activePatch, g);CHKERRQ(ierr);
99*3a19ef87SMatthew G Knepley   PetscFunctionReturn(0);
100*3a19ef87SMatthew G Knepley }
101*3a19ef87SMatthew G Knepley 
102*3a19ef87SMatthew G Knepley #undef __FUNCT__
103*3a19ef87SMatthew G Knepley #define __FUNCT__ "DMCreateLocalVector_Patch"
104*3a19ef87SMatthew G Knepley PetscErrorCode DMCreateLocalVector_Patch(DM dm, Vec *l)
105*3a19ef87SMatthew G Knepley {
106*3a19ef87SMatthew G Knepley   DM_Patch      *mesh = (DM_Patch *) dm->data;
107*3a19ef87SMatthew G Knepley   PetscInt       p;
108*3a19ef87SMatthew G Knepley   PetscErrorCode ierr;
109*3a19ef87SMatthew G Knepley 
110*3a19ef87SMatthew G Knepley   PetscFunctionBegin;
111*3a19ef87SMatthew G Knepley   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
112*3a19ef87SMatthew G Knepley   ierr = DMCreateLocalVector(mesh->activePatch, l);CHKERRQ(ierr);
113*3a19ef87SMatthew G Knepley   PetscFunctionReturn(0);
114*3a19ef87SMatthew G Knepley }
115*3a19ef87SMatthew G Knepley 
116*3a19ef87SMatthew G Knepley #undef __FUNCT__
117*3a19ef87SMatthew G Knepley #define __FUNCT__ "DMPatchGetActivePatch"
118*3a19ef87SMatthew G Knepley PetscErrorCode DMPatchGetActivePatch(DM dm, PetscInt *patch)
119*3a19ef87SMatthew G Knepley {
120*3a19ef87SMatthew G Knepley   DM_Patch *mesh;
121*3a19ef87SMatthew G Knepley 
122*3a19ef87SMatthew G Knepley   PetscFunctionBegin;
123*3a19ef87SMatthew G Knepley   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
124*3a19ef87SMatthew G Knepley   PetscValidPointer(patch, 2);
125*3a19ef87SMatthew G Knepley   mesh = (DM_Patch *) dm->data;
126*3a19ef87SMatthew G Knepley   *patch = mesh->activePatch;
127*3a19ef87SMatthew G Knepley   PetscFunctionReturn(0);
128*3a19ef87SMatthew G Knepley }
129*3a19ef87SMatthew G Knepley 
130*3a19ef87SMatthew G Knepley #undef __FUNCT__
131*3a19ef87SMatthew G Knepley #define __FUNCT__ "DMPatchSetActivePatch"
132*3a19ef87SMatthew G Knepley PetscErrorCode DMPatchSetActivePatch(DM dm, PetscInt patch)
133*3a19ef87SMatthew G Knepley {
134*3a19ef87SMatthew G Knepley   DM_Patch *mesh;
135*3a19ef87SMatthew G Knepley 
136*3a19ef87SMatthew G Knepley   PetscFunctionBegin;
137*3a19ef87SMatthew G Knepley   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
138*3a19ef87SMatthew G Knepley   mesh = (DM_Patch *) dm->data;
139*3a19ef87SMatthew G Knepley   mesh->activePatch = patch;
140*3a19ef87SMatthew G Knepley   PetscFunctionReturn(0);
141*3a19ef87SMatthew G Knepley }
142*3a19ef87SMatthew G Knepley 
143*3a19ef87SMatthew G Knepley #undef __FUNCT__
144*3a19ef87SMatthew G Knepley #define __FUNCT__ "DMCreateSubDM_Patch"
145*3a19ef87SMatthew G Knepley PetscErrorCode DMCreateSubDM_Patch(DM dm, PetscInt numFields, PetscInt fields[], IS *is, DM *subdm)
146*3a19ef87SMatthew G Knepley {
147*3a19ef87SMatthew G Knepley   PetscFunctionBegin;
148*3a19ef87SMatthew G Knepley   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
149*3a19ef87SMatthew G Knepley   SETERRQ(((PetscObject) dm)->comm, PETSC_ERR_SUP, "Tell me to code this");
150*3a19ef87SMatthew G Knepley   PetscFunctionReturn(0);
151*3a19ef87SMatthew G Knepley }
152