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