xref: /petsc/src/dm/impls/da/kokkos/dagetov.kokkos.cxx (revision b7b2c57cd5aa9b14d54c296fd363923a566b256d)
1 #include <petscdmda_kokkos.hpp>
2 #include <petsc/private/dmdaimpl.h>
3 #include <petsc/private/kokkosimpl.hpp>
4 
5 /* SUBMANSEC = DMDA */
6 
7 /* Use macro instead of inlined function to avoid annoying warnings like: 'dof' may be used uninitialized in this function [-Wmaybe-uninitialized] */
8 #define DMDA_VEC_GET_SHAPE(da, vec, xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof) \
9   do { \
10     PetscCall(DMDAGetCorners(da, &xs, &ys, &zs, &xm, &ym, &zm)); \
11     PetscCall(DMDAGetGhostCorners(da, &gxs, &gys, &gzs, &gxm, &gym, &gzm)); \
12     PetscCall(DMDAGetInfo(da, &dim, NULL, NULL, NULL, NULL, NULL, NULL, &dof, NULL, NULL, NULL, NULL, NULL)); \
13     /* Handle case where user passes in global vector as opposed to local */ \
14     PetscCall(VecGetLocalSize(vec, &N)); \
15     if (N == xm * ym * zm * dof) { \
16       gxm = xm; \
17       gym = ym; \
18       gzm = zm; \
19       gxs = xs; \
20       gys = ys; \
21       gzs = zs; \
22     } else PetscCheck(N == gxm * gym * gzm * dof, PETSC_COMM_SELF, PETSC_ERR_ARG_INCOMP, "Vector local size %" PetscInt_FMT " is not compatible with DMDA local sizes %" PetscInt_FMT " %" PetscInt_FMT, N, xm * ym * zm * dof, gxm * gym * gzm * dof); \
23   } while (0)
24 
25 /* -------------------- 1D ---------------- */
26 template <class MemorySpace>
DMDAVecGetKokkosOffsetView_Private(DM da,Vec vec,PetscScalarKokkosOffsetView1DType<MemorySpace> * ov,PetscBool overwrite)27 PetscErrorCode DMDAVecGetKokkosOffsetView_Private(DM da, Vec vec, PetscScalarKokkosOffsetView1DType<MemorySpace> *ov, PetscBool overwrite)
28 {
29   PetscInt                               xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof;
30   PetscScalarKokkosViewType<MemorySpace> kv;
31 
32   PetscFunctionBegin;
33   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
34   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
35   PetscAssertPointer(ov, 3);
36   DMDA_VEC_GET_SHAPE(da, vec, xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof);
37   PetscCheck(dim == 1, PETSC_COMM_SELF, PETSC_ERR_ARG_CORRUPT, "KokkosOffsetView is 1D but DMDA is %dD", (int)dim);
38   if (overwrite) PetscCall(VecGetKokkosViewWrite(vec, &kv));
39   else PetscCall(VecGetKokkosView(vec, &kv));
40   /* Construct the unmanaged OffsetView with {begin0,begin1,begins2},{end0,end1,end2} */
41   *ov = PetscScalarKokkosOffsetView1DType<MemorySpace>(kv.data(), {gxs * dof}, {(gxs + gxm) * dof});
42   PetscFunctionReturn(PETSC_SUCCESS);
43 }
44 
45 template <class MemorySpace>
DMDAVecRestoreKokkosOffsetView_Private(DM da,Vec vec,PetscScalarKokkosOffsetView1DType<MemorySpace> * ov,PetscBool overwrite)46 PetscErrorCode DMDAVecRestoreKokkosOffsetView_Private(DM da, Vec vec, PetscScalarKokkosOffsetView1DType<MemorySpace> *ov, PetscBool overwrite)
47 {
48   PetscScalarKokkosViewType<MemorySpace> kv;
49 
50   PetscFunctionBegin;
51   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
52   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
53   PetscAssertPointer(ov, 3);
54   kv = ov->view(); /* OffsetView to View */
55   if (overwrite) PetscCall(VecRestoreKokkosViewWrite(vec, &kv));
56   else PetscCall(VecRestoreKokkosView(vec, &kv));
57   PetscFunctionReturn(PETSC_SUCCESS);
58 }
59 
60 template <class MemorySpace>
DMDAVecGetKokkosOffsetView(DM da,Vec vec,ConstPetscScalarKokkosOffsetView1DType<MemorySpace> * ov)61 PetscErrorCode DMDAVecGetKokkosOffsetView(DM da, Vec vec, ConstPetscScalarKokkosOffsetView1DType<MemorySpace> *ov)
62 {
63   PetscInt                                    xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof;
64   ConstPetscScalarKokkosViewType<MemorySpace> kv;
65 
66   PetscFunctionBegin;
67   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
68   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
69   PetscAssertPointer(ov, 3);
70   DMDA_VEC_GET_SHAPE(da, vec, xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof);
71   PetscCheck(dim == 1, PETSC_COMM_SELF, PETSC_ERR_ARG_CORRUPT, "KokkosOffsetView is 1D but DMDA is %dD", (int)dim);
72   PetscCall(VecGetKokkosView(vec, &kv));
73   *ov = ConstPetscScalarKokkosOffsetView1DType<MemorySpace>(kv.data(), {gxs * dof}, {(gxs + gxm) * dof});
74   PetscFunctionReturn(PETSC_SUCCESS);
75 }
76 
77 template <class MemorySpace>
DMDAVecRestoreKokkosOffsetView(DM da,Vec vec,ConstPetscScalarKokkosOffsetView1DType<MemorySpace> * ov)78 PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM da, Vec vec, ConstPetscScalarKokkosOffsetView1DType<MemorySpace> *ov)
79 {
80   ConstPetscScalarKokkosViewType<MemorySpace> kv;
81 
82   PetscFunctionBegin;
83   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
84   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
85   PetscAssertPointer(ov, 3);
86   kv = ov->view();
87   PetscCall(VecRestoreKokkosView(vec, &kv));
88   PetscFunctionReturn(PETSC_SUCCESS);
89 }
90 
91 /* ============================== 2D ================================= */
92 template <class MemorySpace>
DMDAVecGetKokkosOffsetView_Private(DM da,Vec vec,PetscScalarKokkosOffsetView2DType<MemorySpace> * ov,PetscBool overwrite)93 PetscErrorCode DMDAVecGetKokkosOffsetView_Private(DM da, Vec vec, PetscScalarKokkosOffsetView2DType<MemorySpace> *ov, PetscBool overwrite)
94 {
95   PetscInt                               xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof;
96   PetscScalarKokkosViewType<MemorySpace> kv;
97 
98   PetscFunctionBegin;
99   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
100   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
101   PetscAssertPointer(ov, 3);
102   DMDA_VEC_GET_SHAPE(da, vec, xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof);
103   PetscCheck(dim == 2, PETSC_COMM_SELF, PETSC_ERR_ARG_CORRUPT, "KokkosOffsetView is 2D but DMDA is %dD", (int)dim);
104   if (overwrite) PetscCall(VecGetKokkosViewWrite(vec, &kv));
105   else PetscCall(VecGetKokkosView(vec, &kv));
106   *ov = PetscScalarKokkosOffsetView2DType<MemorySpace>(kv.data(), {gys * dof, gxs * dof}, {(gys + gym) * dof, (gxs + gxm) * dof});
107   PetscFunctionReturn(PETSC_SUCCESS);
108 }
109 
110 template <class MemorySpace>
DMDAVecRestoreKokkosOffsetView_Private(DM da,Vec vec,PetscScalarKokkosOffsetView2DType<MemorySpace> * ov,PetscBool overwrite)111 PetscErrorCode DMDAVecRestoreKokkosOffsetView_Private(DM da, Vec vec, PetscScalarKokkosOffsetView2DType<MemorySpace> *ov, PetscBool overwrite)
112 {
113   PetscScalarKokkosViewType<MemorySpace> kv;
114 
115   PetscFunctionBegin;
116   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
117   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
118   PetscAssertPointer(ov, 3);
119   // kv   = ov->view(); /* 2D OffsetView => 2D View => 1D View. Why does it not work? */
120   kv = PetscScalarKokkosViewType<MemorySpace>(ov->data(), ov->extent(0) * ov->extent(1));
121   if (overwrite) PetscCall(VecRestoreKokkosViewWrite(vec, &kv));
122   else PetscCall(VecRestoreKokkosView(vec, &kv));
123   PetscFunctionReturn(PETSC_SUCCESS);
124 }
125 
126 template <class MemorySpace>
DMDAVecGetKokkosOffsetView(DM da,Vec vec,ConstPetscScalarKokkosOffsetView2DType<MemorySpace> * ov)127 PetscErrorCode DMDAVecGetKokkosOffsetView(DM da, Vec vec, ConstPetscScalarKokkosOffsetView2DType<MemorySpace> *ov)
128 {
129   PetscInt                                    xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof;
130   ConstPetscScalarKokkosViewType<MemorySpace> kv;
131 
132   PetscFunctionBegin;
133   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
134   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
135   PetscAssertPointer(ov, 3);
136   DMDA_VEC_GET_SHAPE(da, vec, xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof);
137   PetscCheck(dim == 2, PETSC_COMM_SELF, PETSC_ERR_ARG_CORRUPT, "KokkosOffsetView is 2D but DMDA is %dD", (int)dim);
138   PetscCall(VecGetKokkosView(vec, &kv));
139   *ov = ConstPetscScalarKokkosOffsetView2DType<MemorySpace>(kv.data(), {gys * dof, gxs * dof}, {(gys + gym) * dof, (gxs + gxm) * dof});
140   PetscFunctionReturn(PETSC_SUCCESS);
141 }
142 
143 template <class MemorySpace>
DMDAVecRestoreKokkosOffsetView(DM da,Vec vec,ConstPetscScalarKokkosOffsetView2DType<MemorySpace> * ov)144 PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM da, Vec vec, ConstPetscScalarKokkosOffsetView2DType<MemorySpace> *ov)
145 {
146   ConstPetscScalarKokkosViewType<MemorySpace> kv;
147 
148   PetscFunctionBegin;
149   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
150   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
151   PetscAssertPointer(ov, 3);
152   kv = ConstPetscScalarKokkosViewType<MemorySpace>(ov->data(), ov->extent(0) * ov->extent(1));
153   PetscCall(VecRestoreKokkosView(vec, &kv));
154   PetscFunctionReturn(PETSC_SUCCESS);
155 }
156 
157 /* ============================== 3D ================================= */
158 template <class MemorySpace>
DMDAVecGetKokkosOffsetView_Private(DM da,Vec vec,PetscScalarKokkosOffsetView3DType<MemorySpace> * ov,PetscBool overwrite)159 PetscErrorCode DMDAVecGetKokkosOffsetView_Private(DM da, Vec vec, PetscScalarKokkosOffsetView3DType<MemorySpace> *ov, PetscBool overwrite)
160 {
161   PetscInt                               xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof;
162   PetscScalarKokkosViewType<MemorySpace> kv;
163 
164   PetscFunctionBegin;
165   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
166   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
167   PetscAssertPointer(ov, 3);
168   DMDA_VEC_GET_SHAPE(da, vec, xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof);
169   PetscCheck(dim == 3, PETSC_COMM_SELF, PETSC_ERR_ARG_CORRUPT, "KokkosOffsetView is 3D but DMDA is %dD", (int)dim);
170   if (overwrite) PetscCall(VecGetKokkosViewWrite(vec, &kv));
171   else PetscCall(VecGetKokkosView(vec, &kv));
172   *ov = PetscScalarKokkosOffsetView3DType<MemorySpace>(kv.data(), {gzs * dof, gys * dof, gxs * dof}, {(gzs + gzm) * dof, (gys + gym) * dof, (gxs + gxm) * dof});
173   PetscFunctionReturn(PETSC_SUCCESS);
174 }
175 
176 template <class MemorySpace>
DMDAVecRestoreKokkosOffsetView_Private(DM da,Vec vec,PetscScalarKokkosOffsetView3DType<MemorySpace> * ov,PetscBool overwrite)177 PetscErrorCode DMDAVecRestoreKokkosOffsetView_Private(DM da, Vec vec, PetscScalarKokkosOffsetView3DType<MemorySpace> *ov, PetscBool overwrite)
178 {
179   PetscScalarKokkosViewType<MemorySpace> kv;
180 
181   PetscFunctionBegin;
182   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
183   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
184   PetscAssertPointer(ov, 3);
185   kv = PetscScalarKokkosViewType<MemorySpace>(ov->data(), ov->extent(0) * ov->extent(1) * ov->extent(2));
186   if (overwrite) PetscCall(VecRestoreKokkosViewWrite(vec, &kv));
187   else PetscCall(VecRestoreKokkosView(vec, &kv));
188   PetscFunctionReturn(PETSC_SUCCESS);
189 }
190 
191 template <class MemorySpace>
DMDAVecGetKokkosOffsetView(DM da,Vec vec,ConstPetscScalarKokkosOffsetView3DType<MemorySpace> * ov)192 PetscErrorCode DMDAVecGetKokkosOffsetView(DM da, Vec vec, ConstPetscScalarKokkosOffsetView3DType<MemorySpace> *ov)
193 {
194   PetscInt                                    xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof;
195   ConstPetscScalarKokkosViewType<MemorySpace> kv;
196 
197   PetscFunctionBegin;
198   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
199   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
200   PetscAssertPointer(ov, 3);
201   DMDA_VEC_GET_SHAPE(da, vec, xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof);
202   PetscCheck(dim == 3, PETSC_COMM_SELF, PETSC_ERR_ARG_CORRUPT, "KokkosOffsetView is 3D but DMDA is %dD", (int)dim);
203   PetscCall(VecGetKokkosView(vec, &kv));
204   *ov = ConstPetscScalarKokkosOffsetView3DType<MemorySpace>(kv.data(), {gzs * dof, gys * dof, gxs * dof}, {(gzs + gzm) * dof, (gys + gym) * dof, (gxs + gxm) * dof});
205   PetscFunctionReturn(PETSC_SUCCESS);
206 }
207 
208 template <class MemorySpace>
DMDAVecRestoreKokkosOffsetView(DM da,Vec vec,ConstPetscScalarKokkosOffsetView3DType<MemorySpace> * ov)209 PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM da, Vec vec, ConstPetscScalarKokkosOffsetView3DType<MemorySpace> *ov)
210 {
211   ConstPetscScalarKokkosViewType<MemorySpace> kv;
212 
213   PetscFunctionBegin;
214   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
215   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
216   PetscAssertPointer(ov, 3);
217   kv = ConstPetscScalarKokkosViewType<MemorySpace>(ov->data(), ov->extent(0) * ov->extent(1) * ov->extent(2));
218   PetscCall(VecRestoreKokkosView(vec, &kv));
219   PetscFunctionReturn(PETSC_SUCCESS);
220 }
221 
222 /* Function template explicit instantiation */
223 template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView(DM, Vec, ConstPetscScalarKokkosOffsetView1D *);
224 template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM, Vec, ConstPetscScalarKokkosOffsetView1D *);
225 template <>
DMDAVecGetKokkosOffsetView(DM da,Vec vec,PetscScalarKokkosOffsetView1D * ov)226 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView(DM da, Vec vec, PetscScalarKokkosOffsetView1D *ov)
227 {
228   return DMDAVecGetKokkosOffsetView_Private(da, vec, ov, PETSC_FALSE);
229 }
230 template <>
DMDAVecRestoreKokkosOffsetView(DM da,Vec vec,PetscScalarKokkosOffsetView1D * ov)231 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM da, Vec vec, PetscScalarKokkosOffsetView1D *ov)
232 {
233   return DMDAVecRestoreKokkosOffsetView_Private(da, vec, ov, PETSC_FALSE);
234 }
235 template <>
DMDAVecGetKokkosOffsetViewWrite(DM da,Vec vec,PetscScalarKokkosOffsetView1D * ov)236 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewWrite(DM da, Vec vec, PetscScalarKokkosOffsetView1D *ov)
237 {
238   return DMDAVecGetKokkosOffsetView_Private(da, vec, ov, PETSC_TRUE);
239 }
240 template <>
DMDAVecRestoreKokkosOffsetViewWrite(DM da,Vec vec,PetscScalarKokkosOffsetView1D * ov)241 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewWrite(DM da, Vec vec, PetscScalarKokkosOffsetView1D *ov)
242 {
243   return DMDAVecRestoreKokkosOffsetView_Private(da, vec, ov, PETSC_TRUE);
244 }
245 
246 template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView(DM, Vec, ConstPetscScalarKokkosOffsetView2D *);
247 template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM, Vec, ConstPetscScalarKokkosOffsetView2D *);
248 template <>
DMDAVecGetKokkosOffsetView(DM da,Vec vec,PetscScalarKokkosOffsetView2D * ov)249 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView(DM da, Vec vec, PetscScalarKokkosOffsetView2D *ov)
250 {
251   return DMDAVecGetKokkosOffsetView_Private(da, vec, ov, PETSC_FALSE);
252 }
253 template <>
DMDAVecRestoreKokkosOffsetView(DM da,Vec vec,PetscScalarKokkosOffsetView2D * ov)254 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM da, Vec vec, PetscScalarKokkosOffsetView2D *ov)
255 {
256   return DMDAVecRestoreKokkosOffsetView_Private(da, vec, ov, PETSC_FALSE);
257 }
258 template <>
DMDAVecGetKokkosOffsetViewWrite(DM da,Vec vec,PetscScalarKokkosOffsetView2D * ov)259 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewWrite(DM da, Vec vec, PetscScalarKokkosOffsetView2D *ov)
260 {
261   return DMDAVecGetKokkosOffsetView_Private(da, vec, ov, PETSC_TRUE);
262 }
263 template <>
DMDAVecRestoreKokkosOffsetViewWrite(DM da,Vec vec,PetscScalarKokkosOffsetView2D * ov)264 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewWrite(DM da, Vec vec, PetscScalarKokkosOffsetView2D *ov)
265 {
266   return DMDAVecRestoreKokkosOffsetView_Private(da, vec, ov, PETSC_TRUE);
267 }
268 
269 template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView(DM, Vec, ConstPetscScalarKokkosOffsetView3D *);
270 template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM, Vec, ConstPetscScalarKokkosOffsetView3D *);
271 template <>
DMDAVecGetKokkosOffsetView(DM da,Vec vec,PetscScalarKokkosOffsetView3D * ov)272 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView(DM da, Vec vec, PetscScalarKokkosOffsetView3D *ov)
273 {
274   return DMDAVecGetKokkosOffsetView_Private(da, vec, ov, PETSC_FALSE);
275 }
276 template <>
DMDAVecRestoreKokkosOffsetView(DM da,Vec vec,PetscScalarKokkosOffsetView3D * ov)277 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM da, Vec vec, PetscScalarKokkosOffsetView3D *ov)
278 {
279   return DMDAVecRestoreKokkosOffsetView_Private(da, vec, ov, PETSC_FALSE);
280 }
281 template <>
DMDAVecGetKokkosOffsetViewWrite(DM da,Vec vec,PetscScalarKokkosOffsetView3D * ov)282 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewWrite(DM da, Vec vec, PetscScalarKokkosOffsetView3D *ov)
283 {
284   return DMDAVecGetKokkosOffsetView_Private(da, vec, ov, PETSC_TRUE);
285 }
286 template <>
DMDAVecRestoreKokkosOffsetViewWrite(DM da,Vec vec,PetscScalarKokkosOffsetView3D * ov)287 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewWrite(DM da, Vec vec, PetscScalarKokkosOffsetView3D *ov)
288 {
289   return DMDAVecRestoreKokkosOffsetView_Private(da, vec, ov, PETSC_TRUE);
290 }
291 
292 #if !defined(KOKKOS_ENABLE_UNIFIED_MEMORY) /* Get host views if the default memory space is not host space */
293 template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView(DM, Vec, ConstPetscScalarKokkosOffsetView1DHost *);
294 template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM, Vec, ConstPetscScalarKokkosOffsetView1DHost *);
295 template <>
DMDAVecGetKokkosOffsetView(DM da,Vec vec,PetscScalarKokkosOffsetView1DHost * ov)296 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView(DM da, Vec vec, PetscScalarKokkosOffsetView1DHost *ov)
297 {
298   return DMDAVecGetKokkosOffsetView_Private(da, vec, ov, PETSC_FALSE);
299 }
300 template <>
DMDAVecRestoreKokkosOffsetView(DM da,Vec vec,PetscScalarKokkosOffsetView1DHost * ov)301 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM da, Vec vec, PetscScalarKokkosOffsetView1DHost *ov)
302 {
303   return DMDAVecRestoreKokkosOffsetView_Private(da, vec, ov, PETSC_FALSE);
304 }
305 template <>
DMDAVecGetKokkosOffsetViewWrite(DM da,Vec vec,PetscScalarKokkosOffsetView1DHost * ov)306 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewWrite(DM da, Vec vec, PetscScalarKokkosOffsetView1DHost *ov)
307 {
308   return DMDAVecGetKokkosOffsetView_Private(da, vec, ov, PETSC_TRUE);
309 }
310 template <>
DMDAVecRestoreKokkosOffsetViewWrite(DM da,Vec vec,PetscScalarKokkosOffsetView1DHost * ov)311 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewWrite(DM da, Vec vec, PetscScalarKokkosOffsetView1DHost *ov)
312 {
313   return DMDAVecRestoreKokkosOffsetView_Private(da, vec, ov, PETSC_TRUE);
314 }
315 
316 template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView(DM, Vec, ConstPetscScalarKokkosOffsetView2DHost *);
317 template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM, Vec, ConstPetscScalarKokkosOffsetView2DHost *);
318 template <>
DMDAVecGetKokkosOffsetView(DM da,Vec vec,PetscScalarKokkosOffsetView2DHost * ov)319 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView(DM da, Vec vec, PetscScalarKokkosOffsetView2DHost *ov)
320 {
321   return DMDAVecGetKokkosOffsetView_Private(da, vec, ov, PETSC_FALSE);
322 }
323 template <>
DMDAVecRestoreKokkosOffsetView(DM da,Vec vec,PetscScalarKokkosOffsetView2DHost * ov)324 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM da, Vec vec, PetscScalarKokkosOffsetView2DHost *ov)
325 {
326   return DMDAVecRestoreKokkosOffsetView_Private(da, vec, ov, PETSC_FALSE);
327 }
328 template <>
DMDAVecGetKokkosOffsetViewWrite(DM da,Vec vec,PetscScalarKokkosOffsetView2DHost * ov)329 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewWrite(DM da, Vec vec, PetscScalarKokkosOffsetView2DHost *ov)
330 {
331   return DMDAVecGetKokkosOffsetView_Private(da, vec, ov, PETSC_TRUE);
332 }
333 template <>
DMDAVecRestoreKokkosOffsetViewWrite(DM da,Vec vec,PetscScalarKokkosOffsetView2DHost * ov)334 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewWrite(DM da, Vec vec, PetscScalarKokkosOffsetView2DHost *ov)
335 {
336   return DMDAVecRestoreKokkosOffsetView_Private(da, vec, ov, PETSC_TRUE);
337 }
338 
339 template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView(DM, Vec, ConstPetscScalarKokkosOffsetView3DHost *);
340 template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM, Vec, ConstPetscScalarKokkosOffsetView3DHost *);
341 template <>
DMDAVecGetKokkosOffsetView(DM da,Vec vec,PetscScalarKokkosOffsetView3DHost * ov)342 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView(DM da, Vec vec, PetscScalarKokkosOffsetView3DHost *ov)
343 {
344   return DMDAVecGetKokkosOffsetView_Private(da, vec, ov, PETSC_FALSE);
345 }
346 template <>
DMDAVecRestoreKokkosOffsetView(DM da,Vec vec,PetscScalarKokkosOffsetView3DHost * ov)347 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM da, Vec vec, PetscScalarKokkosOffsetView3DHost *ov)
348 {
349   return DMDAVecRestoreKokkosOffsetView_Private(da, vec, ov, PETSC_FALSE);
350 }
351 template <>
DMDAVecGetKokkosOffsetViewWrite(DM da,Vec vec,PetscScalarKokkosOffsetView3DHost * ov)352 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewWrite(DM da, Vec vec, PetscScalarKokkosOffsetView3DHost *ov)
353 {
354   return DMDAVecGetKokkosOffsetView_Private(da, vec, ov, PETSC_TRUE);
355 }
356 template <>
DMDAVecRestoreKokkosOffsetViewWrite(DM da,Vec vec,PetscScalarKokkosOffsetView3DHost * ov)357 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewWrite(DM da, Vec vec, PetscScalarKokkosOffsetView3DHost *ov)
358 {
359   return DMDAVecRestoreKokkosOffsetView_Private(da, vec, ov, PETSC_TRUE);
360 }
361 #endif
362 
363 /* ============================== 2D including DOF ================================= */
364 template <class MemorySpace>
DMDAVecGetKokkosOffsetViewDOF_Private(DM da,Vec vec,PetscScalarKokkosOffsetView2DType<MemorySpace> * ov,PetscBool overwrite)365 PetscErrorCode DMDAVecGetKokkosOffsetViewDOF_Private(DM da, Vec vec, PetscScalarKokkosOffsetView2DType<MemorySpace> *ov, PetscBool overwrite)
366 {
367   PetscInt                               xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof;
368   PetscScalarKokkosViewType<MemorySpace> kv;
369 
370   PetscFunctionBegin;
371   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
372   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
373   PetscAssertPointer(ov, 3);
374   DMDA_VEC_GET_SHAPE(da, vec, xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof);
375   PetscCheck(dim == 1, PETSC_COMM_SELF, PETSC_ERR_ARG_CORRUPT, "KokkosOffsetView is 2D but DMDA is %dD", (int)dim);
376   if (overwrite) PetscCall(VecGetKokkosViewWrite(vec, &kv));
377   else PetscCall(VecGetKokkosView(vec, &kv));
378   *ov = PetscScalarKokkosOffsetView2DType<MemorySpace>(kv.data(), {gxs, 0}, {gxs + gxm, dof});
379   PetscFunctionReturn(PETSC_SUCCESS);
380 }
381 
382 template <class MemorySpace>
DMDAVecRestoreKokkosOffsetViewDOF_Private(DM da,Vec vec,PetscScalarKokkosOffsetView2DType<MemorySpace> * ov,PetscBool overwrite)383 PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF_Private(DM da, Vec vec, PetscScalarKokkosOffsetView2DType<MemorySpace> *ov, PetscBool overwrite)
384 {
385   PetscScalarKokkosViewType<MemorySpace> kv;
386 
387   PetscFunctionBegin;
388   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
389   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
390   PetscAssertPointer(ov, 3);
391   kv = PetscScalarKokkosViewType<MemorySpace>(ov->data(), ov->extent(0) * ov->extent(1));
392   if (overwrite) PetscCall(VecRestoreKokkosViewWrite(vec, &kv));
393   else PetscCall(VecRestoreKokkosView(vec, &kv));
394   PetscFunctionReturn(PETSC_SUCCESS);
395 }
396 
397 template <class MemorySpace>
DMDAVecGetKokkosOffsetViewDOF(DM da,Vec vec,ConstPetscScalarKokkosOffsetView2DType<MemorySpace> * ov)398 PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM da, Vec vec, ConstPetscScalarKokkosOffsetView2DType<MemorySpace> *ov)
399 {
400   PetscInt                                    xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof;
401   ConstPetscScalarKokkosViewType<MemorySpace> kv;
402 
403   PetscFunctionBegin;
404   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
405   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
406   PetscAssertPointer(ov, 3);
407   DMDA_VEC_GET_SHAPE(da, vec, xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof);
408   PetscCheck(dim == 1, PETSC_COMM_SELF, PETSC_ERR_ARG_CORRUPT, "KokkosOffsetView is 2D but DMDA is %dD", (int)dim);
409   PetscCall(VecGetKokkosView(vec, &kv));
410   *ov = ConstPetscScalarKokkosOffsetView2DType<MemorySpace>(kv.data(), {gxs, 0}, {gxs + gxm, dof});
411   PetscFunctionReturn(PETSC_SUCCESS);
412 }
413 
414 template <class MemorySpace>
DMDAVecRestoreKokkosOffsetViewDOF(DM da,Vec vec,ConstPetscScalarKokkosOffsetView2DType<MemorySpace> * ov)415 PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM da, Vec vec, ConstPetscScalarKokkosOffsetView2DType<MemorySpace> *ov)
416 {
417   ConstPetscScalarKokkosViewType<MemorySpace> kv;
418 
419   PetscFunctionBegin;
420   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
421   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
422   PetscAssertPointer(ov, 3);
423   kv = ConstPetscScalarKokkosViewType<MemorySpace>(ov->data(), ov->extent(0) * ov->extent(1));
424   PetscCall(VecRestoreKokkosView(vec, &kv));
425   PetscFunctionReturn(PETSC_SUCCESS);
426 }
427 
428 /* ============================== 3D including DOF ================================= */
429 template <class MemorySpace>
DMDAVecGetKokkosOffsetViewDOF_Private(DM da,Vec vec,PetscScalarKokkosOffsetView3DType<MemorySpace> * ov,PetscBool overwrite)430 PetscErrorCode DMDAVecGetKokkosOffsetViewDOF_Private(DM da, Vec vec, PetscScalarKokkosOffsetView3DType<MemorySpace> *ov, PetscBool overwrite)
431 {
432   PetscInt                               xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof;
433   PetscScalarKokkosViewType<MemorySpace> kv;
434 
435   PetscFunctionBegin;
436   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
437   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
438   PetscAssertPointer(ov, 3);
439   DMDA_VEC_GET_SHAPE(da, vec, xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof);
440   PetscCheck(dim == 2, PETSC_COMM_SELF, PETSC_ERR_ARG_CORRUPT, "KokkosOffsetView is 3D but DMDA is %dD", (int)dim);
441   if (overwrite) PetscCall(VecGetKokkosViewWrite(vec, &kv));
442   else PetscCall(VecGetKokkosView(vec, &kv));
443   *ov = PetscScalarKokkosOffsetView3DType<MemorySpace>(kv.data(), {gys, gxs, 0}, {gys + gym, gxs + gxm, dof});
444   PetscFunctionReturn(PETSC_SUCCESS);
445 }
446 
447 template <class MemorySpace>
DMDAVecRestoreKokkosOffsetViewDOF_Private(DM da,Vec vec,PetscScalarKokkosOffsetView3DType<MemorySpace> * ov,PetscBool overwrite)448 PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF_Private(DM da, Vec vec, PetscScalarKokkosOffsetView3DType<MemorySpace> *ov, PetscBool overwrite)
449 {
450   PetscScalarKokkosViewType<MemorySpace> kv;
451 
452   PetscFunctionBegin;
453   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
454   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
455   PetscAssertPointer(ov, 3);
456   kv = PetscScalarKokkosViewType<MemorySpace>(ov->data(), ov->extent(0) * ov->extent(1) * ov->extent(2));
457   if (overwrite) PetscCall(VecRestoreKokkosViewWrite(vec, &kv));
458   else PetscCall(VecRestoreKokkosView(vec, &kv));
459   PetscFunctionReturn(PETSC_SUCCESS);
460 }
461 
462 template <class MemorySpace>
DMDAVecGetKokkosOffsetViewDOF(DM da,Vec vec,ConstPetscScalarKokkosOffsetView3DType<MemorySpace> * ov)463 PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM da, Vec vec, ConstPetscScalarKokkosOffsetView3DType<MemorySpace> *ov)
464 {
465   PetscInt                                    xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof;
466   ConstPetscScalarKokkosViewType<MemorySpace> kv;
467 
468   PetscFunctionBegin;
469   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
470   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
471   PetscAssertPointer(ov, 3);
472   DMDA_VEC_GET_SHAPE(da, vec, xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof);
473   PetscCheck(dim == 2, PETSC_COMM_SELF, PETSC_ERR_ARG_CORRUPT, "KokkosOffsetView is 3D but DMDA is %dD", (int)dim);
474   PetscCall(VecGetKokkosView(vec, &kv));
475   *ov = ConstPetscScalarKokkosOffsetView3DType<MemorySpace>(kv.data(), {gys, gxs, 0}, {gys + gym, gxs + gxm, dof});
476   PetscFunctionReturn(PETSC_SUCCESS);
477 }
478 
479 template <class MemorySpace>
DMDAVecRestoreKokkosOffsetViewDOF(DM da,Vec vec,ConstPetscScalarKokkosOffsetView3DType<MemorySpace> * ov)480 PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM da, Vec vec, ConstPetscScalarKokkosOffsetView3DType<MemorySpace> *ov)
481 {
482   ConstPetscScalarKokkosViewType<MemorySpace> kv;
483 
484   PetscFunctionBegin;
485   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
486   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
487   PetscAssertPointer(ov, 3);
488   kv = ConstPetscScalarKokkosViewType<MemorySpace>(ov->data(), ov->extent(0) * ov->extent(1) * ov->extent(2));
489   PetscCall(VecRestoreKokkosView(vec, &kv));
490   PetscFunctionReturn(PETSC_SUCCESS);
491 }
492 
493 /* ============================== 4D including DOF ================================= */
494 template <class MemorySpace>
DMDAVecGetKokkosOffsetViewDOF_Private(DM da,Vec vec,PetscScalarKokkosOffsetView4DType<MemorySpace> * ov,PetscBool overwrite)495 PetscErrorCode DMDAVecGetKokkosOffsetViewDOF_Private(DM da, Vec vec, PetscScalarKokkosOffsetView4DType<MemorySpace> *ov, PetscBool overwrite)
496 {
497   PetscInt                               xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof;
498   PetscScalarKokkosViewType<MemorySpace> kv;
499 
500   PetscFunctionBegin;
501   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
502   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
503   PetscAssertPointer(ov, 3);
504   DMDA_VEC_GET_SHAPE(da, vec, xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof);
505   PetscCheck(dim == 3, PETSC_COMM_SELF, PETSC_ERR_ARG_CORRUPT, "KokkosOffsetView is 4D but DMDA is %dD", (int)dim);
506   if (overwrite) PetscCall(VecGetKokkosViewWrite(vec, &kv));
507   else PetscCall(VecGetKokkosView(vec, &kv));
508   *ov = PetscScalarKokkosOffsetView4DType<MemorySpace>(kv.data(), {gzs, gys, gxs, 0}, {gzs + gzm, gys + gym, gxs + gxm, dof});
509   PetscFunctionReturn(PETSC_SUCCESS);
510 }
511 
512 template <class MemorySpace>
DMDAVecRestoreKokkosOffsetViewDOF_Private(DM da,Vec vec,PetscScalarKokkosOffsetView4DType<MemorySpace> * ov,PetscBool overwrite)513 PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF_Private(DM da, Vec vec, PetscScalarKokkosOffsetView4DType<MemorySpace> *ov, PetscBool overwrite)
514 {
515   PetscScalarKokkosViewType<MemorySpace> kv;
516 
517   PetscFunctionBegin;
518   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
519   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
520   PetscAssertPointer(ov, 3);
521   kv = PetscScalarKokkosViewType<MemorySpace>(ov->data(), ov->extent(0) * ov->extent(1) * ov->extent(2) * ov->extent(3));
522   if (overwrite) PetscCall(VecRestoreKokkosViewWrite(vec, &kv));
523   else PetscCall(VecRestoreKokkosView(vec, &kv));
524   PetscFunctionReturn(PETSC_SUCCESS);
525 }
526 
527 template <class MemorySpace>
DMDAVecGetKokkosOffsetViewDOF(DM da,Vec vec,ConstPetscScalarKokkosOffsetView4DType<MemorySpace> * ov)528 PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM da, Vec vec, ConstPetscScalarKokkosOffsetView4DType<MemorySpace> *ov)
529 {
530   PetscInt                                    xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof;
531   ConstPetscScalarKokkosViewType<MemorySpace> kv;
532 
533   PetscFunctionBegin;
534   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
535   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
536   PetscAssertPointer(ov, 3);
537   DMDA_VEC_GET_SHAPE(da, vec, xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof);
538   PetscCheck(dim == 3, PETSC_COMM_SELF, PETSC_ERR_ARG_CORRUPT, "KokkosOffsetView is 4D but DMDA is %dD", (int)dim);
539   PetscCall(VecGetKokkosView(vec, &kv));
540   *ov = ConstPetscScalarKokkosOffsetView4DType<MemorySpace>(kv.data(), {gzs, gys, gxs, 0}, {gzs + gzm, gys + gym, gxs + gxm, dof});
541   PetscFunctionReturn(PETSC_SUCCESS);
542 }
543 
544 template <class MemorySpace>
DMDAVecRestoreKokkosOffsetViewDOF(DM da,Vec vec,ConstPetscScalarKokkosOffsetView4DType<MemorySpace> * ov)545 PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM da, Vec vec, ConstPetscScalarKokkosOffsetView4DType<MemorySpace> *ov)
546 {
547   ConstPetscScalarKokkosViewType<MemorySpace> kv;
548 
549   PetscFunctionBegin;
550   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
551   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
552   PetscAssertPointer(ov, 3);
553   kv = ConstPetscScalarKokkosViewType<MemorySpace>(ov->data(), ov->extent(0) * ov->extent(1) * ov->extent(2) * ov->extent(3));
554   PetscCall(VecRestoreKokkosView(vec, &kv));
555   PetscFunctionReturn(PETSC_SUCCESS);
556 }
557 
558 template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM, Vec, ConstPetscScalarKokkosOffsetView2D *);
559 template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM, Vec, ConstPetscScalarKokkosOffsetView2D *);
560 template <>
DMDAVecGetKokkosOffsetViewDOF(DM da,Vec vec,PetscScalarKokkosOffsetView2D * ov)561 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM da, Vec vec, PetscScalarKokkosOffsetView2D *ov)
562 {
563   return DMDAVecGetKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_FALSE);
564 }
565 template <>
DMDAVecRestoreKokkosOffsetViewDOF(DM da,Vec vec,PetscScalarKokkosOffsetView2D * ov)566 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM da, Vec vec, PetscScalarKokkosOffsetView2D *ov)
567 {
568   return DMDAVecRestoreKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_FALSE);
569 }
570 template <>
DMDAVecGetKokkosOffsetViewDOFWrite(DM da,Vec vec,PetscScalarKokkosOffsetView2D * ov)571 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOFWrite(DM da, Vec vec, PetscScalarKokkosOffsetView2D *ov)
572 {
573   return DMDAVecGetKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_TRUE);
574 }
575 template <>
DMDAVecRestoreKokkosOffsetViewDOFWrite(DM da,Vec vec,PetscScalarKokkosOffsetView2D * ov)576 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOFWrite(DM da, Vec vec, PetscScalarKokkosOffsetView2D *ov)
577 {
578   return DMDAVecRestoreKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_TRUE);
579 }
580 
581 template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM, Vec, ConstPetscScalarKokkosOffsetView3D *);
582 template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM, Vec, ConstPetscScalarKokkosOffsetView3D *);
583 template <>
DMDAVecGetKokkosOffsetViewDOF(DM da,Vec vec,PetscScalarKokkosOffsetView3D * ov)584 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM da, Vec vec, PetscScalarKokkosOffsetView3D *ov)
585 {
586   return DMDAVecGetKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_FALSE);
587 }
588 template <>
DMDAVecRestoreKokkosOffsetViewDOF(DM da,Vec vec,PetscScalarKokkosOffsetView3D * ov)589 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM da, Vec vec, PetscScalarKokkosOffsetView3D *ov)
590 {
591   return DMDAVecRestoreKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_FALSE);
592 }
593 template <>
DMDAVecGetKokkosOffsetViewDOFWrite(DM da,Vec vec,PetscScalarKokkosOffsetView3D * ov)594 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOFWrite(DM da, Vec vec, PetscScalarKokkosOffsetView3D *ov)
595 {
596   return DMDAVecGetKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_TRUE);
597 }
598 template <>
DMDAVecRestoreKokkosOffsetViewDOFWrite(DM da,Vec vec,PetscScalarKokkosOffsetView3D * ov)599 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOFWrite(DM da, Vec vec, PetscScalarKokkosOffsetView3D *ov)
600 {
601   return DMDAVecRestoreKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_TRUE);
602 }
603 
604 template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM, Vec, ConstPetscScalarKokkosOffsetView4D *);
605 template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM, Vec, ConstPetscScalarKokkosOffsetView4D *);
606 template <>
DMDAVecGetKokkosOffsetViewDOF(DM da,Vec vec,PetscScalarKokkosOffsetView4D * ov)607 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM da, Vec vec, PetscScalarKokkosOffsetView4D *ov)
608 {
609   return DMDAVecGetKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_FALSE);
610 }
611 template <>
DMDAVecRestoreKokkosOffsetViewDOF(DM da,Vec vec,PetscScalarKokkosOffsetView4D * ov)612 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM da, Vec vec, PetscScalarKokkosOffsetView4D *ov)
613 {
614   return DMDAVecRestoreKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_FALSE);
615 }
616 template <>
DMDAVecGetKokkosOffsetViewDOFWrite(DM da,Vec vec,PetscScalarKokkosOffsetView4D * ov)617 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOFWrite(DM da, Vec vec, PetscScalarKokkosOffsetView4D *ov)
618 {
619   return DMDAVecGetKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_TRUE);
620 }
621 template <>
DMDAVecRestoreKokkosOffsetViewDOFWrite(DM da,Vec vec,PetscScalarKokkosOffsetView4D * ov)622 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOFWrite(DM da, Vec vec, PetscScalarKokkosOffsetView4D *ov)
623 {
624   return DMDAVecRestoreKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_TRUE);
625 }
626 
627 #if !defined(KOKKOS_ENABLE_UNIFIED_MEMORY) /* Get host views if the default memory space is not host space */
628 template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM, Vec, ConstPetscScalarKokkosOffsetView2DHost *);
629 template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM, Vec, ConstPetscScalarKokkosOffsetView2DHost *);
630 template <>
DMDAVecGetKokkosOffsetViewDOF(DM da,Vec vec,PetscScalarKokkosOffsetView2DHost * ov)631 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM da, Vec vec, PetscScalarKokkosOffsetView2DHost *ov)
632 {
633   return DMDAVecGetKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_FALSE);
634 }
635 template <>
DMDAVecRestoreKokkosOffsetViewDOF(DM da,Vec vec,PetscScalarKokkosOffsetView2DHost * ov)636 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM da, Vec vec, PetscScalarKokkosOffsetView2DHost *ov)
637 {
638   return DMDAVecRestoreKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_FALSE);
639 }
640 template <>
DMDAVecGetKokkosOffsetViewDOFWrite(DM da,Vec vec,PetscScalarKokkosOffsetView2DHost * ov)641 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOFWrite(DM da, Vec vec, PetscScalarKokkosOffsetView2DHost *ov)
642 {
643   return DMDAVecGetKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_TRUE);
644 }
645 template <>
DMDAVecRestoreKokkosOffsetViewDOFWrite(DM da,Vec vec,PetscScalarKokkosOffsetView2DHost * ov)646 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOFWrite(DM da, Vec vec, PetscScalarKokkosOffsetView2DHost *ov)
647 {
648   return DMDAVecRestoreKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_TRUE);
649 }
650 
651 template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM, Vec, ConstPetscScalarKokkosOffsetView3DHost *);
652 template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM, Vec, ConstPetscScalarKokkosOffsetView3DHost *);
653 template <>
DMDAVecGetKokkosOffsetViewDOF(DM da,Vec vec,PetscScalarKokkosOffsetView3DHost * ov)654 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM da, Vec vec, PetscScalarKokkosOffsetView3DHost *ov)
655 {
656   return DMDAVecGetKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_FALSE);
657 }
658 template <>
DMDAVecRestoreKokkosOffsetViewDOF(DM da,Vec vec,PetscScalarKokkosOffsetView3DHost * ov)659 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM da, Vec vec, PetscScalarKokkosOffsetView3DHost *ov)
660 {
661   return DMDAVecRestoreKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_FALSE);
662 }
663 template <>
DMDAVecGetKokkosOffsetViewDOFWrite(DM da,Vec vec,PetscScalarKokkosOffsetView3DHost * ov)664 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOFWrite(DM da, Vec vec, PetscScalarKokkosOffsetView3DHost *ov)
665 {
666   return DMDAVecGetKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_TRUE);
667 }
668 template <>
DMDAVecRestoreKokkosOffsetViewDOFWrite(DM da,Vec vec,PetscScalarKokkosOffsetView3DHost * ov)669 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOFWrite(DM da, Vec vec, PetscScalarKokkosOffsetView3DHost *ov)
670 {
671   return DMDAVecRestoreKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_TRUE);
672 }
673 
674 template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM, Vec, ConstPetscScalarKokkosOffsetView4DHost *);
675 template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM, Vec, ConstPetscScalarKokkosOffsetView4DHost *);
676 template <>
DMDAVecGetKokkosOffsetViewDOF(DM da,Vec vec,PetscScalarKokkosOffsetView4DHost * ov)677 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM da, Vec vec, PetscScalarKokkosOffsetView4DHost *ov)
678 {
679   return DMDAVecGetKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_FALSE);
680 }
681 template <>
DMDAVecRestoreKokkosOffsetViewDOF(DM da,Vec vec,PetscScalarKokkosOffsetView4DHost * ov)682 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM da, Vec vec, PetscScalarKokkosOffsetView4DHost *ov)
683 {
684   return DMDAVecRestoreKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_FALSE);
685 }
686 template <>
DMDAVecGetKokkosOffsetViewDOFWrite(DM da,Vec vec,PetscScalarKokkosOffsetView4DHost * ov)687 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOFWrite(DM da, Vec vec, PetscScalarKokkosOffsetView4DHost *ov)
688 {
689   return DMDAVecGetKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_TRUE);
690 }
691 template <>
DMDAVecRestoreKokkosOffsetViewDOFWrite(DM da,Vec vec,PetscScalarKokkosOffsetView4DHost * ov)692 PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOFWrite(DM da, Vec vec, PetscScalarKokkosOffsetView4DHost *ov)
693 {
694   return DMDAVecRestoreKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_TRUE);
695 }
696 #endif
697