xref: /petsc/src/dm/impls/da/kokkos/dagetov.kokkos.cxx (revision 9371c9d470a9602b6d10a8bf50c9b2280a79e45a)
1c6583b63SJunchao Zhang #include <petsc/private/vecimpl_kokkos.hpp>
2c6583b63SJunchao Zhang #include <petsc/private/dmdaimpl.h>
3c6583b63SJunchao Zhang #include <petscdmda_kokkos.hpp>
4c6583b63SJunchao Zhang 
5ac09b921SBarry Smith /* SUBMANSEC = DMDA */
6ac09b921SBarry Smith 
7ac09b921SBarry Smith /* Use macro instead of inlined function to avoid annoying warnings like: 'dof' may be used uninitialized in this function [-Wmaybe-uninitialized] */
8c6583b63SJunchao Zhang #define DMDA_VEC_GET_SHAPE(da, vec, xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof) \
9c6583b63SJunchao Zhang   do { \
109566063dSJacob Faibussowitsch     PetscCall(DMDAGetCorners(da, &xs, &ys, &zs, &xm, &ym, &zm)); \
119566063dSJacob Faibussowitsch     PetscCall(DMDAGetGhostCorners(da, &gxs, &gys, &gzs, &gxm, &gym, &gzm)); \
129566063dSJacob Faibussowitsch     PetscCall(DMDAGetInfo(da, &dim, NULL, NULL, NULL, NULL, NULL, NULL, &dof, NULL, NULL, NULL, NULL, NULL)); \
13c6583b63SJunchao Zhang     /* Handle case where user passes in global vector as opposed to local */ \
149566063dSJacob Faibussowitsch     PetscCall(VecGetLocalSize(vec, &N)); \
15c6583b63SJunchao Zhang     if (N == xm * ym * zm * dof) { \
16*9371c9d4SSatish Balay       gxm = xm; \
17*9371c9d4SSatish Balay       gym = ym; \
18*9371c9d4SSatish Balay       gzm = zm; \
19*9371c9d4SSatish Balay       gxs = xs; \
20*9371c9d4SSatish Balay       gys = ys; \
21*9371c9d4SSatish Balay       gzs = zs; \
2263a3b9bcSJacob Faibussowitsch     } 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); \
23c6583b63SJunchao Zhang   } while (0)
24c6583b63SJunchao Zhang 
259dc7b89cSJunchao Zhang /* -------------------- 1D ---------------- */
26c6583b63SJunchao Zhang template <class MemorySpace>
27*9371c9d4SSatish Balay PetscErrorCode DMDAVecGetKokkosOffsetView_Private(DM da, Vec vec, PetscScalarKokkosOffsetView1DType<MemorySpace> *ov, PetscBool overwrite) {
28c6583b63SJunchao Zhang   PetscInt                               xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof;
29c6583b63SJunchao Zhang   PetscScalarKokkosViewType<MemorySpace> kv;
30c6583b63SJunchao Zhang 
31c6583b63SJunchao Zhang   PetscFunctionBegin;
32c6583b63SJunchao Zhang   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
33c6583b63SJunchao Zhang   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
34c6583b63SJunchao Zhang   PetscValidPointer(ov, 3);
35c6583b63SJunchao Zhang   DMDA_VEC_GET_SHAPE(da, vec, xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof);
369dc7b89cSJunchao Zhang   PetscCheck(dim == 1, PETSC_COMM_SELF, PETSC_ERR_ARG_CORRUPT, "KokkosOffsetView is 1D but DMDA is %dD", (int)dim);
379566063dSJacob Faibussowitsch   if (overwrite) PetscCall(VecGetKokkosViewWrite(vec, &kv));
389566063dSJacob Faibussowitsch   else PetscCall(VecGetKokkosView(vec, &kv));
399dc7b89cSJunchao Zhang   /* Construct the unmanaged OffsetView with {begin0,begin1,begins2},{end0,end1,end2} */
409dc7b89cSJunchao Zhang   *ov = PetscScalarKokkosOffsetView1DType<MemorySpace>(kv.data(), {gxs * dof}, {(gxs + gxm) * dof});
41c6583b63SJunchao Zhang   PetscFunctionReturn(0);
42c6583b63SJunchao Zhang }
43c6583b63SJunchao Zhang 
44c6583b63SJunchao Zhang template <class MemorySpace>
45*9371c9d4SSatish Balay PetscErrorCode DMDAVecRestoreKokkosOffsetView_Private(DM da, Vec vec, PetscScalarKokkosOffsetView1DType<MemorySpace> *ov, PetscBool overwrite) {
46c6583b63SJunchao Zhang   PetscScalarKokkosViewType<MemorySpace> kv;
47c6583b63SJunchao Zhang 
48c6583b63SJunchao Zhang   PetscFunctionBegin;
49c6583b63SJunchao Zhang   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
50c6583b63SJunchao Zhang   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
51c6583b63SJunchao Zhang   PetscValidPointer(ov, 3);
52c6583b63SJunchao Zhang   kv = ov->view(); /* OffsetView to View */
539566063dSJacob Faibussowitsch   if (overwrite) PetscCall(VecRestoreKokkosViewWrite(vec, &kv));
549566063dSJacob Faibussowitsch   else PetscCall(VecRestoreKokkosView(vec, &kv));
55c6583b63SJunchao Zhang   PetscFunctionReturn(0);
56c6583b63SJunchao Zhang }
57c6583b63SJunchao Zhang 
58c6583b63SJunchao Zhang template <class MemorySpace>
59*9371c9d4SSatish Balay PetscErrorCode DMDAVecGetKokkosOffsetView(DM da, Vec vec, ConstPetscScalarKokkosOffsetView1DType<MemorySpace> *ov) {
60c6583b63SJunchao Zhang   PetscInt                                    xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof;
61c6583b63SJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace> kv;
62c6583b63SJunchao Zhang 
63c6583b63SJunchao Zhang   PetscFunctionBegin;
64c6583b63SJunchao Zhang   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
65c6583b63SJunchao Zhang   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
66c6583b63SJunchao Zhang   PetscValidPointer(ov, 3);
67c6583b63SJunchao Zhang   DMDA_VEC_GET_SHAPE(da, vec, xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof);
689dc7b89cSJunchao Zhang   PetscCheck(dim == 1, PETSC_COMM_SELF, PETSC_ERR_ARG_CORRUPT, "KokkosOffsetView is 1D but DMDA is %dD", (int)dim);
699566063dSJacob Faibussowitsch   PetscCall(VecGetKokkosView(vec, &kv));
709dc7b89cSJunchao Zhang   *ov = ConstPetscScalarKokkosOffsetView1DType<MemorySpace>(kv.data(), {gxs * dof}, {(gxs + gxm) * dof});
71c6583b63SJunchao Zhang   PetscFunctionReturn(0);
72c6583b63SJunchao Zhang }
73c6583b63SJunchao Zhang 
74c6583b63SJunchao Zhang template <class MemorySpace>
75*9371c9d4SSatish Balay PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM da, Vec vec, ConstPetscScalarKokkosOffsetView1DType<MemorySpace> *ov) {
76c6583b63SJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace> kv;
77c6583b63SJunchao Zhang 
78c6583b63SJunchao Zhang   PetscFunctionBegin;
79c6583b63SJunchao Zhang   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
80c6583b63SJunchao Zhang   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
81c6583b63SJunchao Zhang   PetscValidPointer(ov, 3);
82c6583b63SJunchao Zhang   kv = ov->view();
839566063dSJacob Faibussowitsch   PetscCall(VecRestoreKokkosView(vec, &kv));
84c6583b63SJunchao Zhang   PetscFunctionReturn(0);
85c6583b63SJunchao Zhang }
86c6583b63SJunchao Zhang 
879dc7b89cSJunchao Zhang /* ============================== 2D ================================= */
88c6583b63SJunchao Zhang template <class MemorySpace>
89*9371c9d4SSatish Balay PetscErrorCode DMDAVecGetKokkosOffsetView_Private(DM da, Vec vec, PetscScalarKokkosOffsetView2DType<MemorySpace> *ov, PetscBool overwrite) {
90c6583b63SJunchao Zhang   PetscInt                               xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof;
91c6583b63SJunchao Zhang   PetscScalarKokkosViewType<MemorySpace> kv;
92c6583b63SJunchao Zhang 
93c6583b63SJunchao Zhang   PetscFunctionBegin;
94c6583b63SJunchao Zhang   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
95c6583b63SJunchao Zhang   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
96c6583b63SJunchao Zhang   PetscValidPointer(ov, 3);
97c6583b63SJunchao Zhang   DMDA_VEC_GET_SHAPE(da, vec, xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof);
989dc7b89cSJunchao Zhang   PetscCheck(dim == 2, PETSC_COMM_SELF, PETSC_ERR_ARG_CORRUPT, "KokkosOffsetView is 2D but DMDA is %dD", (int)dim);
999566063dSJacob Faibussowitsch   if (overwrite) PetscCall(VecGetKokkosViewWrite(vec, &kv));
1009566063dSJacob Faibussowitsch   else PetscCall(VecGetKokkosView(vec, &kv));
1019dc7b89cSJunchao Zhang   *ov = PetscScalarKokkosOffsetView2DType<MemorySpace>(kv.data(), {gys * dof, gxs * dof}, {(gys + gym) * dof, (gxs + gxm) * dof});
102c6583b63SJunchao Zhang   PetscFunctionReturn(0);
103c6583b63SJunchao Zhang }
104c6583b63SJunchao Zhang 
105c6583b63SJunchao Zhang template <class MemorySpace>
106*9371c9d4SSatish Balay PetscErrorCode DMDAVecRestoreKokkosOffsetView_Private(DM da, Vec vec, PetscScalarKokkosOffsetView2DType<MemorySpace> *ov, PetscBool overwrite) {
107c6583b63SJunchao Zhang   PetscScalarKokkosViewType<MemorySpace> kv;
108c6583b63SJunchao Zhang 
109c6583b63SJunchao Zhang   PetscFunctionBegin;
110c6583b63SJunchao Zhang   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
111c6583b63SJunchao Zhang   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
112c6583b63SJunchao Zhang   PetscValidPointer(ov, 3);
113c6583b63SJunchao Zhang   // kv   = ov->view(); /* 2D OffsetView => 2D View => 1D View. Why does it not work? */
114c6583b63SJunchao Zhang   kv = PetscScalarKokkosViewType<MemorySpace>(ov->data(), ov->extent(0) * ov->extent(1));
1159566063dSJacob Faibussowitsch   if (overwrite) PetscCall(VecRestoreKokkosViewWrite(vec, &kv));
1169566063dSJacob Faibussowitsch   else PetscCall(VecRestoreKokkosView(vec, &kv));
117c6583b63SJunchao Zhang   PetscFunctionReturn(0);
118c6583b63SJunchao Zhang }
119c6583b63SJunchao Zhang 
120c6583b63SJunchao Zhang template <class MemorySpace>
121*9371c9d4SSatish Balay PetscErrorCode DMDAVecGetKokkosOffsetView(DM da, Vec vec, ConstPetscScalarKokkosOffsetView2DType<MemorySpace> *ov) {
122c6583b63SJunchao Zhang   PetscInt                                    xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof;
123c6583b63SJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace> kv;
124c6583b63SJunchao Zhang 
125c6583b63SJunchao Zhang   PetscFunctionBegin;
126c6583b63SJunchao Zhang   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
127c6583b63SJunchao Zhang   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
128c6583b63SJunchao Zhang   PetscValidPointer(ov, 3);
129c6583b63SJunchao Zhang   DMDA_VEC_GET_SHAPE(da, vec, xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof);
1309dc7b89cSJunchao Zhang   PetscCheck(dim == 2, PETSC_COMM_SELF, PETSC_ERR_ARG_CORRUPT, "KokkosOffsetView is 2D but DMDA is %dD", (int)dim);
1319566063dSJacob Faibussowitsch   PetscCall(VecGetKokkosView(vec, &kv));
1329dc7b89cSJunchao Zhang   *ov = ConstPetscScalarKokkosOffsetView2DType<MemorySpace>(kv.data(), {gys * dof, gxs * dof}, {(gys + gym) * dof, (gxs + gxm) * dof});
133c6583b63SJunchao Zhang   PetscFunctionReturn(0);
134c6583b63SJunchao Zhang }
135c6583b63SJunchao Zhang 
136c6583b63SJunchao Zhang template <class MemorySpace>
137*9371c9d4SSatish Balay PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM da, Vec vec, ConstPetscScalarKokkosOffsetView2DType<MemorySpace> *ov) {
138c6583b63SJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace> kv;
139c6583b63SJunchao Zhang 
140c6583b63SJunchao Zhang   PetscFunctionBegin;
141c6583b63SJunchao Zhang   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
142c6583b63SJunchao Zhang   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
143c6583b63SJunchao Zhang   PetscValidPointer(ov, 3);
144c6583b63SJunchao Zhang   kv = ConstPetscScalarKokkosViewType<MemorySpace>(ov->data(), ov->extent(0) * ov->extent(1));
1459566063dSJacob Faibussowitsch   PetscCall(VecRestoreKokkosView(vec, &kv));
146c6583b63SJunchao Zhang   PetscFunctionReturn(0);
147c6583b63SJunchao Zhang }
148c6583b63SJunchao Zhang 
1499dc7b89cSJunchao Zhang /* ============================== 3D ================================= */
1509dc7b89cSJunchao Zhang template <class MemorySpace>
151*9371c9d4SSatish Balay PetscErrorCode DMDAVecGetKokkosOffsetView_Private(DM da, Vec vec, PetscScalarKokkosOffsetView3DType<MemorySpace> *ov, PetscBool overwrite) {
1529dc7b89cSJunchao Zhang   PetscInt                               xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof;
1539dc7b89cSJunchao Zhang   PetscScalarKokkosViewType<MemorySpace> kv;
1549dc7b89cSJunchao Zhang 
1559dc7b89cSJunchao Zhang   PetscFunctionBegin;
1569dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
1579dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
1589dc7b89cSJunchao Zhang   PetscValidPointer(ov, 3);
1599dc7b89cSJunchao Zhang   DMDA_VEC_GET_SHAPE(da, vec, xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof);
1609dc7b89cSJunchao Zhang   PetscCheck(dim == 3, PETSC_COMM_SELF, PETSC_ERR_ARG_CORRUPT, "KokkosOffsetView is 3D but DMDA is %dD", (int)dim);
1619566063dSJacob Faibussowitsch   if (overwrite) PetscCall(VecGetKokkosViewWrite(vec, &kv));
1629566063dSJacob Faibussowitsch   else PetscCall(VecGetKokkosView(vec, &kv));
1639dc7b89cSJunchao Zhang   *ov = PetscScalarKokkosOffsetView3DType<MemorySpace>(kv.data(), {gzs * dof, gys * dof, gxs * dof}, {(gzs + gzm) * dof, (gys + gym) * dof, (gxs + gxm) * dof});
1649dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
1659dc7b89cSJunchao Zhang }
1669dc7b89cSJunchao Zhang 
1679dc7b89cSJunchao Zhang template <class MemorySpace>
168*9371c9d4SSatish Balay PetscErrorCode DMDAVecRestoreKokkosOffsetView_Private(DM da, Vec vec, PetscScalarKokkosOffsetView3DType<MemorySpace> *ov, PetscBool overwrite) {
1699dc7b89cSJunchao Zhang   PetscScalarKokkosViewType<MemorySpace> kv;
1709dc7b89cSJunchao Zhang 
1719dc7b89cSJunchao Zhang   PetscFunctionBegin;
1729dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
1739dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
1749dc7b89cSJunchao Zhang   PetscValidPointer(ov, 3);
1759dc7b89cSJunchao Zhang   kv = PetscScalarKokkosViewType<MemorySpace>(ov->data(), ov->extent(0) * ov->extent(1) * ov->extent(2));
1769566063dSJacob Faibussowitsch   if (overwrite) PetscCall(VecRestoreKokkosViewWrite(vec, &kv));
1779566063dSJacob Faibussowitsch   else PetscCall(VecRestoreKokkosView(vec, &kv));
1789dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
1799dc7b89cSJunchao Zhang }
1809dc7b89cSJunchao Zhang 
1819dc7b89cSJunchao Zhang template <class MemorySpace>
182*9371c9d4SSatish Balay PetscErrorCode DMDAVecGetKokkosOffsetView(DM da, Vec vec, ConstPetscScalarKokkosOffsetView3DType<MemorySpace> *ov) {
1839dc7b89cSJunchao Zhang   PetscInt                                    xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof;
1849dc7b89cSJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace> kv;
1859dc7b89cSJunchao Zhang 
1869dc7b89cSJunchao Zhang   PetscFunctionBegin;
1879dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
1889dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
1899dc7b89cSJunchao Zhang   PetscValidPointer(ov, 3);
1909dc7b89cSJunchao Zhang   DMDA_VEC_GET_SHAPE(da, vec, xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof);
1919dc7b89cSJunchao Zhang   PetscCheck(dim == 3, PETSC_COMM_SELF, PETSC_ERR_ARG_CORRUPT, "KokkosOffsetView is 3D but DMDA is %dD", (int)dim);
1929566063dSJacob Faibussowitsch   PetscCall(VecGetKokkosView(vec, &kv));
1939dc7b89cSJunchao Zhang   *ov = ConstPetscScalarKokkosOffsetView3DType<MemorySpace>(kv.data(), {gzs * dof, gys * dof, gxs * dof}, {(gzs + gzm) * dof, (gys + gym) * dof, (gxs + gxm) * dof});
1949dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
1959dc7b89cSJunchao Zhang }
1969dc7b89cSJunchao Zhang 
1979dc7b89cSJunchao Zhang template <class MemorySpace>
198*9371c9d4SSatish Balay PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM da, Vec vec, ConstPetscScalarKokkosOffsetView3DType<MemorySpace> *ov) {
1999dc7b89cSJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace> kv;
2009dc7b89cSJunchao Zhang 
2019dc7b89cSJunchao Zhang   PetscFunctionBegin;
2029dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
2039dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
2049dc7b89cSJunchao Zhang   PetscValidPointer(ov, 3);
2059dc7b89cSJunchao Zhang   kv = ConstPetscScalarKokkosViewType<MemorySpace>(ov->data(), ov->extent(0) * ov->extent(1) * ov->extent(2));
2069566063dSJacob Faibussowitsch   PetscCall(VecRestoreKokkosView(vec, &kv));
2079dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
2089dc7b89cSJunchao Zhang }
2099dc7b89cSJunchao Zhang 
210c6583b63SJunchao Zhang /* Function template explicit instantiation */
211c6583b63SJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView(DM, Vec, ConstPetscScalarKokkosOffsetView1D *);
212c6583b63SJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM, Vec, ConstPetscScalarKokkosOffsetView1D *);
213*9371c9d4SSatish Balay template <>
214*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView(DM da, Vec vec, PetscScalarKokkosOffsetView1D *ov) {
215*9371c9d4SSatish Balay   return DMDAVecGetKokkosOffsetView_Private(da, vec, ov, PETSC_FALSE);
216*9371c9d4SSatish Balay }
217*9371c9d4SSatish Balay template <>
218*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM da, Vec vec, PetscScalarKokkosOffsetView1D *ov) {
219*9371c9d4SSatish Balay   return DMDAVecRestoreKokkosOffsetView_Private(da, vec, ov, PETSC_FALSE);
220*9371c9d4SSatish Balay }
221*9371c9d4SSatish Balay template <>
222*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewWrite(DM da, Vec vec, PetscScalarKokkosOffsetView1D *ov) {
223*9371c9d4SSatish Balay   return DMDAVecGetKokkosOffsetView_Private(da, vec, ov, PETSC_TRUE);
224*9371c9d4SSatish Balay }
225*9371c9d4SSatish Balay template <>
226*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewWrite(DM da, Vec vec, PetscScalarKokkosOffsetView1D *ov) {
227*9371c9d4SSatish Balay   return DMDAVecRestoreKokkosOffsetView_Private(da, vec, ov, PETSC_TRUE);
228*9371c9d4SSatish Balay }
229c6583b63SJunchao Zhang 
230c6583b63SJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView(DM, Vec, ConstPetscScalarKokkosOffsetView2D *);
231c6583b63SJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM, Vec, ConstPetscScalarKokkosOffsetView2D *);
232*9371c9d4SSatish Balay template <>
233*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView(DM da, Vec vec, PetscScalarKokkosOffsetView2D *ov) {
234*9371c9d4SSatish Balay   return DMDAVecGetKokkosOffsetView_Private(da, vec, ov, PETSC_FALSE);
235*9371c9d4SSatish Balay }
236*9371c9d4SSatish Balay template <>
237*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM da, Vec vec, PetscScalarKokkosOffsetView2D *ov) {
238*9371c9d4SSatish Balay   return DMDAVecRestoreKokkosOffsetView_Private(da, vec, ov, PETSC_FALSE);
239*9371c9d4SSatish Balay }
240*9371c9d4SSatish Balay template <>
241*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewWrite(DM da, Vec vec, PetscScalarKokkosOffsetView2D *ov) {
242*9371c9d4SSatish Balay   return DMDAVecGetKokkosOffsetView_Private(da, vec, ov, PETSC_TRUE);
243*9371c9d4SSatish Balay }
244*9371c9d4SSatish Balay template <>
245*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewWrite(DM da, Vec vec, PetscScalarKokkosOffsetView2D *ov) {
246*9371c9d4SSatish Balay   return DMDAVecRestoreKokkosOffsetView_Private(da, vec, ov, PETSC_TRUE);
247*9371c9d4SSatish Balay }
248c6583b63SJunchao Zhang 
2499dc7b89cSJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView(DM, Vec, ConstPetscScalarKokkosOffsetView3D *);
2509dc7b89cSJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM, Vec, ConstPetscScalarKokkosOffsetView3D *);
251*9371c9d4SSatish Balay template <>
252*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView(DM da, Vec vec, PetscScalarKokkosOffsetView3D *ov) {
253*9371c9d4SSatish Balay   return DMDAVecGetKokkosOffsetView_Private(da, vec, ov, PETSC_FALSE);
254*9371c9d4SSatish Balay }
255*9371c9d4SSatish Balay template <>
256*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM da, Vec vec, PetscScalarKokkosOffsetView3D *ov) {
257*9371c9d4SSatish Balay   return DMDAVecRestoreKokkosOffsetView_Private(da, vec, ov, PETSC_FALSE);
258*9371c9d4SSatish Balay }
259*9371c9d4SSatish Balay template <>
260*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewWrite(DM da, Vec vec, PetscScalarKokkosOffsetView3D *ov) {
261*9371c9d4SSatish Balay   return DMDAVecGetKokkosOffsetView_Private(da, vec, ov, PETSC_TRUE);
262*9371c9d4SSatish Balay }
263*9371c9d4SSatish Balay template <>
264*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewWrite(DM da, Vec vec, PetscScalarKokkosOffsetView3D *ov) {
265*9371c9d4SSatish Balay   return DMDAVecRestoreKokkosOffsetView_Private(da, vec, ov, PETSC_TRUE);
266*9371c9d4SSatish Balay }
2679dc7b89cSJunchao Zhang 
2689dc7b89cSJunchao Zhang #if !defined(KOKKOS_ENABLE_DEFAULT_DEVICE_TYPE_HOST) /* Get host views if the default memory space is not host space */
2699dc7b89cSJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView(DM, Vec, ConstPetscScalarKokkosOffsetView1DHost *);
2709dc7b89cSJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM, Vec, ConstPetscScalarKokkosOffsetView1DHost *);
271*9371c9d4SSatish Balay template <>
272*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView(DM da, Vec vec, PetscScalarKokkosOffsetView1DHost *ov) {
273*9371c9d4SSatish Balay   return DMDAVecGetKokkosOffsetView_Private(da, vec, ov, PETSC_FALSE);
274*9371c9d4SSatish Balay }
275*9371c9d4SSatish Balay template <>
276*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM da, Vec vec, PetscScalarKokkosOffsetView1DHost *ov) {
277*9371c9d4SSatish Balay   return DMDAVecRestoreKokkosOffsetView_Private(da, vec, ov, PETSC_FALSE);
278*9371c9d4SSatish Balay }
279*9371c9d4SSatish Balay template <>
280*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewWrite(DM da, Vec vec, PetscScalarKokkosOffsetView1DHost *ov) {
281*9371c9d4SSatish Balay   return DMDAVecGetKokkosOffsetView_Private(da, vec, ov, PETSC_TRUE);
282*9371c9d4SSatish Balay }
283*9371c9d4SSatish Balay template <>
284*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewWrite(DM da, Vec vec, PetscScalarKokkosOffsetView1DHost *ov) {
285*9371c9d4SSatish Balay   return DMDAVecRestoreKokkosOffsetView_Private(da, vec, ov, PETSC_TRUE);
286*9371c9d4SSatish Balay }
2879dc7b89cSJunchao Zhang 
2889dc7b89cSJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView(DM, Vec, ConstPetscScalarKokkosOffsetView2DHost *);
2899dc7b89cSJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM, Vec, ConstPetscScalarKokkosOffsetView2DHost *);
290*9371c9d4SSatish Balay template <>
291*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView(DM da, Vec vec, PetscScalarKokkosOffsetView2DHost *ov) {
292*9371c9d4SSatish Balay   return DMDAVecGetKokkosOffsetView_Private(da, vec, ov, PETSC_FALSE);
293*9371c9d4SSatish Balay }
294*9371c9d4SSatish Balay template <>
295*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM da, Vec vec, PetscScalarKokkosOffsetView2DHost *ov) {
296*9371c9d4SSatish Balay   return DMDAVecRestoreKokkosOffsetView_Private(da, vec, ov, PETSC_FALSE);
297*9371c9d4SSatish Balay }
298*9371c9d4SSatish Balay template <>
299*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewWrite(DM da, Vec vec, PetscScalarKokkosOffsetView2DHost *ov) {
300*9371c9d4SSatish Balay   return DMDAVecGetKokkosOffsetView_Private(da, vec, ov, PETSC_TRUE);
301*9371c9d4SSatish Balay }
302*9371c9d4SSatish Balay template <>
303*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewWrite(DM da, Vec vec, PetscScalarKokkosOffsetView2DHost *ov) {
304*9371c9d4SSatish Balay   return DMDAVecRestoreKokkosOffsetView_Private(da, vec, ov, PETSC_TRUE);
305*9371c9d4SSatish Balay }
3069dc7b89cSJunchao Zhang 
3079dc7b89cSJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView(DM, Vec, ConstPetscScalarKokkosOffsetView3DHost *);
3089dc7b89cSJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM, Vec, ConstPetscScalarKokkosOffsetView3DHost *);
309*9371c9d4SSatish Balay template <>
310*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView(DM da, Vec vec, PetscScalarKokkosOffsetView3DHost *ov) {
311*9371c9d4SSatish Balay   return DMDAVecGetKokkosOffsetView_Private(da, vec, ov, PETSC_FALSE);
312*9371c9d4SSatish Balay }
313*9371c9d4SSatish Balay template <>
314*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM da, Vec vec, PetscScalarKokkosOffsetView3DHost *ov) {
315*9371c9d4SSatish Balay   return DMDAVecRestoreKokkosOffsetView_Private(da, vec, ov, PETSC_FALSE);
316*9371c9d4SSatish Balay }
317*9371c9d4SSatish Balay template <>
318*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewWrite(DM da, Vec vec, PetscScalarKokkosOffsetView3DHost *ov) {
319*9371c9d4SSatish Balay   return DMDAVecGetKokkosOffsetView_Private(da, vec, ov, PETSC_TRUE);
320*9371c9d4SSatish Balay }
321*9371c9d4SSatish Balay template <>
322*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewWrite(DM da, Vec vec, PetscScalarKokkosOffsetView3DHost *ov) {
323*9371c9d4SSatish Balay   return DMDAVecRestoreKokkosOffsetView_Private(da, vec, ov, PETSC_TRUE);
324*9371c9d4SSatish Balay }
3259dc7b89cSJunchao Zhang #endif
3269dc7b89cSJunchao Zhang 
3279dc7b89cSJunchao Zhang /* ============================== 2D including DOF ================================= */
3289dc7b89cSJunchao Zhang template <class MemorySpace>
329*9371c9d4SSatish Balay PetscErrorCode DMDAVecGetKokkosOffsetViewDOF_Private(DM da, Vec vec, PetscScalarKokkosOffsetView2DType<MemorySpace> *ov, PetscBool overwrite) {
3309dc7b89cSJunchao Zhang   PetscInt                               xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof;
3319dc7b89cSJunchao Zhang   PetscScalarKokkosViewType<MemorySpace> kv;
3329dc7b89cSJunchao Zhang 
3339dc7b89cSJunchao Zhang   PetscFunctionBegin;
3349dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
3359dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
3369dc7b89cSJunchao Zhang   PetscValidPointer(ov, 3);
3379dc7b89cSJunchao Zhang   DMDA_VEC_GET_SHAPE(da, vec, xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof);
3389dc7b89cSJunchao Zhang   PetscCheck(dim == 1, PETSC_COMM_SELF, PETSC_ERR_ARG_CORRUPT, "KokkosOffsetView is 2D but DMDA is %dD", (int)dim);
3399566063dSJacob Faibussowitsch   if (overwrite) PetscCall(VecGetKokkosViewWrite(vec, &kv));
3409566063dSJacob Faibussowitsch   else PetscCall(VecGetKokkosView(vec, &kv));
3419dc7b89cSJunchao Zhang   *ov = PetscScalarKokkosOffsetView2DType<MemorySpace>(kv.data(), {gxs, 0}, {gxs + gxm, dof});
3429dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
3439dc7b89cSJunchao Zhang }
3449dc7b89cSJunchao Zhang 
3459dc7b89cSJunchao Zhang template <class MemorySpace>
346*9371c9d4SSatish Balay PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF_Private(DM da, Vec vec, PetscScalarKokkosOffsetView2DType<MemorySpace> *ov, PetscBool overwrite) {
3479dc7b89cSJunchao Zhang   PetscScalarKokkosViewType<MemorySpace> kv;
3489dc7b89cSJunchao Zhang 
3499dc7b89cSJunchao Zhang   PetscFunctionBegin;
3509dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
3519dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
3529dc7b89cSJunchao Zhang   PetscValidPointer(ov, 3);
3539dc7b89cSJunchao Zhang   kv = PetscScalarKokkosViewType<MemorySpace>(ov->data(), ov->extent(0) * ov->extent(1));
3549566063dSJacob Faibussowitsch   if (overwrite) PetscCall(VecRestoreKokkosViewWrite(vec, &kv));
3559566063dSJacob Faibussowitsch   else PetscCall(VecRestoreKokkosView(vec, &kv));
3569dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
3579dc7b89cSJunchao Zhang }
3589dc7b89cSJunchao Zhang 
3599dc7b89cSJunchao Zhang template <class MemorySpace>
360*9371c9d4SSatish Balay PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM da, Vec vec, ConstPetscScalarKokkosOffsetView2DType<MemorySpace> *ov) {
3619dc7b89cSJunchao Zhang   PetscInt                                    xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof;
3629dc7b89cSJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace> kv;
3639dc7b89cSJunchao Zhang 
3649dc7b89cSJunchao Zhang   PetscFunctionBegin;
3659dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
3669dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
3679dc7b89cSJunchao Zhang   PetscValidPointer(ov, 3);
3689dc7b89cSJunchao Zhang   DMDA_VEC_GET_SHAPE(da, vec, xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof);
3699dc7b89cSJunchao Zhang   PetscCheck(dim == 1, PETSC_COMM_SELF, PETSC_ERR_ARG_CORRUPT, "KokkosOffsetView is 2D but DMDA is %dD", (int)dim);
3709566063dSJacob Faibussowitsch   PetscCall(VecGetKokkosView(vec, &kv));
3719dc7b89cSJunchao Zhang   *ov = ConstPetscScalarKokkosOffsetView2DType<MemorySpace>(kv.data(), {gxs, 0}, {gxs + gxm, dof});
3729dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
3739dc7b89cSJunchao Zhang }
3749dc7b89cSJunchao Zhang 
3759dc7b89cSJunchao Zhang template <class MemorySpace>
376*9371c9d4SSatish Balay PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM da, Vec vec, ConstPetscScalarKokkosOffsetView2DType<MemorySpace> *ov) {
3779dc7b89cSJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace> kv;
3789dc7b89cSJunchao Zhang 
3799dc7b89cSJunchao Zhang   PetscFunctionBegin;
3809dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
3819dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
3829dc7b89cSJunchao Zhang   PetscValidPointer(ov, 3);
3839dc7b89cSJunchao Zhang   kv = ConstPetscScalarKokkosViewType<MemorySpace>(ov->data(), ov->extent(0) * ov->extent(1));
3849566063dSJacob Faibussowitsch   PetscCall(VecRestoreKokkosView(vec, &kv));
3859dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
3869dc7b89cSJunchao Zhang }
3879dc7b89cSJunchao Zhang 
3889dc7b89cSJunchao Zhang /* ============================== 3D including DOF ================================= */
3899dc7b89cSJunchao Zhang template <class MemorySpace>
390*9371c9d4SSatish Balay PetscErrorCode DMDAVecGetKokkosOffsetViewDOF_Private(DM da, Vec vec, PetscScalarKokkosOffsetView3DType<MemorySpace> *ov, PetscBool overwrite) {
3919dc7b89cSJunchao Zhang   PetscInt                               xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof;
3929dc7b89cSJunchao Zhang   PetscScalarKokkosViewType<MemorySpace> kv;
3939dc7b89cSJunchao Zhang 
3949dc7b89cSJunchao Zhang   PetscFunctionBegin;
3959dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
3969dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
3979dc7b89cSJunchao Zhang   PetscValidPointer(ov, 3);
3989dc7b89cSJunchao Zhang   DMDA_VEC_GET_SHAPE(da, vec, xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof);
3999dc7b89cSJunchao Zhang   PetscCheck(dim == 2, PETSC_COMM_SELF, PETSC_ERR_ARG_CORRUPT, "KokkosOffsetView is 3D but DMDA is %dD", (int)dim);
4009566063dSJacob Faibussowitsch   if (overwrite) PetscCall(VecGetKokkosViewWrite(vec, &kv));
4019566063dSJacob Faibussowitsch   else PetscCall(VecGetKokkosView(vec, &kv));
4029dc7b89cSJunchao Zhang   *ov = PetscScalarKokkosOffsetView3DType<MemorySpace>(kv.data(), {gys, gxs, 0}, {gys + gym, gxs + gxm, dof});
4039dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
4049dc7b89cSJunchao Zhang }
4059dc7b89cSJunchao Zhang 
4069dc7b89cSJunchao Zhang template <class MemorySpace>
407*9371c9d4SSatish Balay PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF_Private(DM da, Vec vec, PetscScalarKokkosOffsetView3DType<MemorySpace> *ov, PetscBool overwrite) {
4089dc7b89cSJunchao Zhang   PetscScalarKokkosViewType<MemorySpace> kv;
4099dc7b89cSJunchao Zhang 
4109dc7b89cSJunchao Zhang   PetscFunctionBegin;
4119dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
4129dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
4139dc7b89cSJunchao Zhang   PetscValidPointer(ov, 3);
4149dc7b89cSJunchao Zhang   kv = PetscScalarKokkosViewType<MemorySpace>(ov->data(), ov->extent(0) * ov->extent(1) * ov->extent(2));
4159566063dSJacob Faibussowitsch   if (overwrite) PetscCall(VecRestoreKokkosViewWrite(vec, &kv));
4169566063dSJacob Faibussowitsch   else PetscCall(VecRestoreKokkosView(vec, &kv));
4179dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
4189dc7b89cSJunchao Zhang }
4199dc7b89cSJunchao Zhang 
4209dc7b89cSJunchao Zhang template <class MemorySpace>
421*9371c9d4SSatish Balay PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM da, Vec vec, ConstPetscScalarKokkosOffsetView3DType<MemorySpace> *ov) {
4229dc7b89cSJunchao Zhang   PetscInt                                    xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof;
4239dc7b89cSJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace> kv;
4249dc7b89cSJunchao Zhang 
4259dc7b89cSJunchao Zhang   PetscFunctionBegin;
4269dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
4279dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
4289dc7b89cSJunchao Zhang   PetscValidPointer(ov, 3);
4299dc7b89cSJunchao Zhang   DMDA_VEC_GET_SHAPE(da, vec, xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof);
4309dc7b89cSJunchao Zhang   PetscCheck(dim == 2, PETSC_COMM_SELF, PETSC_ERR_ARG_CORRUPT, "KokkosOffsetView is 3D but DMDA is %dD", (int)dim);
4319566063dSJacob Faibussowitsch   PetscCall(VecGetKokkosView(vec, &kv));
4329dc7b89cSJunchao Zhang   *ov = ConstPetscScalarKokkosOffsetView3DType<MemorySpace>(kv.data(), {gys, gxs, 0}, {gys + gym, gxs + gxm, dof});
4339dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
4349dc7b89cSJunchao Zhang }
4359dc7b89cSJunchao Zhang 
4369dc7b89cSJunchao Zhang template <class MemorySpace>
437*9371c9d4SSatish Balay PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM da, Vec vec, ConstPetscScalarKokkosOffsetView3DType<MemorySpace> *ov) {
4389dc7b89cSJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace> kv;
4399dc7b89cSJunchao Zhang 
4409dc7b89cSJunchao Zhang   PetscFunctionBegin;
4419dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
4429dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
4439dc7b89cSJunchao Zhang   PetscValidPointer(ov, 3);
4449dc7b89cSJunchao Zhang   kv = ConstPetscScalarKokkosViewType<MemorySpace>(ov->data(), ov->extent(0) * ov->extent(1) * ov->extent(2));
4459566063dSJacob Faibussowitsch   PetscCall(VecRestoreKokkosView(vec, &kv));
4469dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
4479dc7b89cSJunchao Zhang }
4489dc7b89cSJunchao Zhang 
4499dc7b89cSJunchao Zhang /* ============================== 4D including DOF ================================= */
4509dc7b89cSJunchao Zhang template <class MemorySpace>
451*9371c9d4SSatish Balay PetscErrorCode DMDAVecGetKokkosOffsetViewDOF_Private(DM da, Vec vec, PetscScalarKokkosOffsetView4DType<MemorySpace> *ov, PetscBool overwrite) {
4529dc7b89cSJunchao Zhang   PetscInt                               xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof;
4539dc7b89cSJunchao Zhang   PetscScalarKokkosViewType<MemorySpace> kv;
4549dc7b89cSJunchao Zhang 
4559dc7b89cSJunchao Zhang   PetscFunctionBegin;
4569dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
4579dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
4589dc7b89cSJunchao Zhang   PetscValidPointer(ov, 3);
4599dc7b89cSJunchao Zhang   DMDA_VEC_GET_SHAPE(da, vec, xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof);
4609dc7b89cSJunchao Zhang   PetscCheck(dim == 3, PETSC_COMM_SELF, PETSC_ERR_ARG_CORRUPT, "KokkosOffsetView is 4D but DMDA is %dD", (int)dim);
4619566063dSJacob Faibussowitsch   if (overwrite) PetscCall(VecGetKokkosViewWrite(vec, &kv));
4629566063dSJacob Faibussowitsch   else PetscCall(VecGetKokkosView(vec, &kv));
4639dc7b89cSJunchao Zhang   *ov = PetscScalarKokkosOffsetView4DType<MemorySpace>(kv.data(), {gzs, gys, gxs, 0}, {gzs + gzm, gys + gym, gxs + gxm, dof});
4649dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
4659dc7b89cSJunchao Zhang }
4669dc7b89cSJunchao Zhang 
4679dc7b89cSJunchao Zhang template <class MemorySpace>
468*9371c9d4SSatish Balay PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF_Private(DM da, Vec vec, PetscScalarKokkosOffsetView4DType<MemorySpace> *ov, PetscBool overwrite) {
4699dc7b89cSJunchao Zhang   PetscScalarKokkosViewType<MemorySpace> kv;
4709dc7b89cSJunchao Zhang 
4719dc7b89cSJunchao Zhang   PetscFunctionBegin;
4729dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
4739dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
4749dc7b89cSJunchao Zhang   PetscValidPointer(ov, 3);
4759dc7b89cSJunchao Zhang   kv = PetscScalarKokkosViewType<MemorySpace>(ov->data(), ov->extent(0) * ov->extent(1) * ov->extent(2) * ov->extent(3));
4769566063dSJacob Faibussowitsch   if (overwrite) PetscCall(VecRestoreKokkosViewWrite(vec, &kv));
4779566063dSJacob Faibussowitsch   else PetscCall(VecRestoreKokkosView(vec, &kv));
4789dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
4799dc7b89cSJunchao Zhang }
4809dc7b89cSJunchao Zhang 
4819dc7b89cSJunchao Zhang template <class MemorySpace>
482*9371c9d4SSatish Balay PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM da, Vec vec, ConstPetscScalarKokkosOffsetView4DType<MemorySpace> *ov) {
4839dc7b89cSJunchao Zhang   PetscInt                                    xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof;
4849dc7b89cSJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace> kv;
4859dc7b89cSJunchao Zhang 
4869dc7b89cSJunchao Zhang   PetscFunctionBegin;
4879dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
4889dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
4899dc7b89cSJunchao Zhang   PetscValidPointer(ov, 3);
4909dc7b89cSJunchao Zhang   DMDA_VEC_GET_SHAPE(da, vec, xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof);
4919dc7b89cSJunchao Zhang   PetscCheck(dim == 3, PETSC_COMM_SELF, PETSC_ERR_ARG_CORRUPT, "KokkosOffsetView is 4D but DMDA is %dD", (int)dim);
4929566063dSJacob Faibussowitsch   PetscCall(VecGetKokkosView(vec, &kv));
4939dc7b89cSJunchao Zhang   *ov = ConstPetscScalarKokkosOffsetView4DType<MemorySpace>(kv.data(), {gzs, gys, gxs, 0}, {gzs + gzm, gys + gym, gxs + gxm, dof});
4949dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
4959dc7b89cSJunchao Zhang }
4969dc7b89cSJunchao Zhang 
4979dc7b89cSJunchao Zhang template <class MemorySpace>
498*9371c9d4SSatish Balay PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM da, Vec vec, ConstPetscScalarKokkosOffsetView4DType<MemorySpace> *ov) {
4999dc7b89cSJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace> kv;
5009dc7b89cSJunchao Zhang 
5019dc7b89cSJunchao Zhang   PetscFunctionBegin;
5029dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
5039dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec, VEC_CLASSID, 2);
5049dc7b89cSJunchao Zhang   PetscValidPointer(ov, 3);
5059dc7b89cSJunchao Zhang   kv = ConstPetscScalarKokkosViewType<MemorySpace>(ov->data(), ov->extent(0) * ov->extent(1) * ov->extent(2) * ov->extent(3));
5069566063dSJacob Faibussowitsch   PetscCall(VecRestoreKokkosView(vec, &kv));
5079dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
5089dc7b89cSJunchao Zhang }
5099dc7b89cSJunchao Zhang 
5109dc7b89cSJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM, Vec, ConstPetscScalarKokkosOffsetView2D *);
5119dc7b89cSJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM, Vec, ConstPetscScalarKokkosOffsetView2D *);
512*9371c9d4SSatish Balay template <>
513*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM da, Vec vec, PetscScalarKokkosOffsetView2D *ov) {
514*9371c9d4SSatish Balay   return DMDAVecGetKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_FALSE);
515*9371c9d4SSatish Balay }
516*9371c9d4SSatish Balay template <>
517*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM da, Vec vec, PetscScalarKokkosOffsetView2D *ov) {
518*9371c9d4SSatish Balay   return DMDAVecRestoreKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_FALSE);
519*9371c9d4SSatish Balay }
520*9371c9d4SSatish Balay template <>
521*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOFWrite(DM da, Vec vec, PetscScalarKokkosOffsetView2D *ov) {
522*9371c9d4SSatish Balay   return DMDAVecGetKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_TRUE);
523*9371c9d4SSatish Balay }
524*9371c9d4SSatish Balay template <>
525*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOFWrite(DM da, Vec vec, PetscScalarKokkosOffsetView2D *ov) {
526*9371c9d4SSatish Balay   return DMDAVecRestoreKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_TRUE);
527*9371c9d4SSatish Balay }
5289dc7b89cSJunchao Zhang 
5299dc7b89cSJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM, Vec, ConstPetscScalarKokkosOffsetView3D *);
5309dc7b89cSJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM, Vec, ConstPetscScalarKokkosOffsetView3D *);
531*9371c9d4SSatish Balay template <>
532*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM da, Vec vec, PetscScalarKokkosOffsetView3D *ov) {
533*9371c9d4SSatish Balay   return DMDAVecGetKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_FALSE);
534*9371c9d4SSatish Balay }
535*9371c9d4SSatish Balay template <>
536*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM da, Vec vec, PetscScalarKokkosOffsetView3D *ov) {
537*9371c9d4SSatish Balay   return DMDAVecRestoreKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_FALSE);
538*9371c9d4SSatish Balay }
539*9371c9d4SSatish Balay template <>
540*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOFWrite(DM da, Vec vec, PetscScalarKokkosOffsetView3D *ov) {
541*9371c9d4SSatish Balay   return DMDAVecGetKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_TRUE);
542*9371c9d4SSatish Balay }
543*9371c9d4SSatish Balay template <>
544*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOFWrite(DM da, Vec vec, PetscScalarKokkosOffsetView3D *ov) {
545*9371c9d4SSatish Balay   return DMDAVecRestoreKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_TRUE);
546*9371c9d4SSatish Balay }
5479dc7b89cSJunchao Zhang 
5489dc7b89cSJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM, Vec, ConstPetscScalarKokkosOffsetView4D *);
5499dc7b89cSJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM, Vec, ConstPetscScalarKokkosOffsetView4D *);
550*9371c9d4SSatish Balay template <>
551*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM da, Vec vec, PetscScalarKokkosOffsetView4D *ov) {
552*9371c9d4SSatish Balay   return DMDAVecGetKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_FALSE);
553*9371c9d4SSatish Balay }
554*9371c9d4SSatish Balay template <>
555*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM da, Vec vec, PetscScalarKokkosOffsetView4D *ov) {
556*9371c9d4SSatish Balay   return DMDAVecRestoreKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_FALSE);
557*9371c9d4SSatish Balay }
558*9371c9d4SSatish Balay template <>
559*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOFWrite(DM da, Vec vec, PetscScalarKokkosOffsetView4D *ov) {
560*9371c9d4SSatish Balay   return DMDAVecGetKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_TRUE);
561*9371c9d4SSatish Balay }
562*9371c9d4SSatish Balay template <>
563*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOFWrite(DM da, Vec vec, PetscScalarKokkosOffsetView4D *ov) {
564*9371c9d4SSatish Balay   return DMDAVecRestoreKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_TRUE);
565*9371c9d4SSatish Balay }
5669dc7b89cSJunchao Zhang 
5679dc7b89cSJunchao Zhang #if !defined(KOKKOS_ENABLE_DEFAULT_DEVICE_TYPE_HOST) /* Get host views if the default memory space is not host space */
5689dc7b89cSJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM, Vec, ConstPetscScalarKokkosOffsetView2DHost *);
5699dc7b89cSJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM, Vec, ConstPetscScalarKokkosOffsetView2DHost *);
570*9371c9d4SSatish Balay template <>
571*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM da, Vec vec, PetscScalarKokkosOffsetView2DHost *ov) {
572*9371c9d4SSatish Balay   return DMDAVecGetKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_FALSE);
573*9371c9d4SSatish Balay }
574*9371c9d4SSatish Balay template <>
575*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM da, Vec vec, PetscScalarKokkosOffsetView2DHost *ov) {
576*9371c9d4SSatish Balay   return DMDAVecRestoreKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_FALSE);
577*9371c9d4SSatish Balay }
578*9371c9d4SSatish Balay template <>
579*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOFWrite(DM da, Vec vec, PetscScalarKokkosOffsetView2DHost *ov) {
580*9371c9d4SSatish Balay   return DMDAVecGetKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_TRUE);
581*9371c9d4SSatish Balay }
582*9371c9d4SSatish Balay template <>
583*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOFWrite(DM da, Vec vec, PetscScalarKokkosOffsetView2DHost *ov) {
584*9371c9d4SSatish Balay   return DMDAVecRestoreKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_TRUE);
585*9371c9d4SSatish Balay }
5869dc7b89cSJunchao Zhang 
5879dc7b89cSJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM, Vec, ConstPetscScalarKokkosOffsetView3DHost *);
5889dc7b89cSJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM, Vec, ConstPetscScalarKokkosOffsetView3DHost *);
589*9371c9d4SSatish Balay template <>
590*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM da, Vec vec, PetscScalarKokkosOffsetView3DHost *ov) {
591*9371c9d4SSatish Balay   return DMDAVecGetKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_FALSE);
592*9371c9d4SSatish Balay }
593*9371c9d4SSatish Balay template <>
594*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM da, Vec vec, PetscScalarKokkosOffsetView3DHost *ov) {
595*9371c9d4SSatish Balay   return DMDAVecRestoreKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_FALSE);
596*9371c9d4SSatish Balay }
597*9371c9d4SSatish Balay template <>
598*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOFWrite(DM da, Vec vec, PetscScalarKokkosOffsetView3DHost *ov) {
599*9371c9d4SSatish Balay   return DMDAVecGetKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_TRUE);
600*9371c9d4SSatish Balay }
601*9371c9d4SSatish Balay template <>
602*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOFWrite(DM da, Vec vec, PetscScalarKokkosOffsetView3DHost *ov) {
603*9371c9d4SSatish Balay   return DMDAVecRestoreKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_TRUE);
604*9371c9d4SSatish Balay }
6059dc7b89cSJunchao Zhang 
6069dc7b89cSJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM, Vec, ConstPetscScalarKokkosOffsetView4DHost *);
6079dc7b89cSJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM, Vec, ConstPetscScalarKokkosOffsetView4DHost *);
608*9371c9d4SSatish Balay template <>
609*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM da, Vec vec, PetscScalarKokkosOffsetView4DHost *ov) {
610*9371c9d4SSatish Balay   return DMDAVecGetKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_FALSE);
611*9371c9d4SSatish Balay }
612*9371c9d4SSatish Balay template <>
613*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM da, Vec vec, PetscScalarKokkosOffsetView4DHost *ov) {
614*9371c9d4SSatish Balay   return DMDAVecRestoreKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_FALSE);
615*9371c9d4SSatish Balay }
616*9371c9d4SSatish Balay template <>
617*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOFWrite(DM da, Vec vec, PetscScalarKokkosOffsetView4DHost *ov) {
618*9371c9d4SSatish Balay   return DMDAVecGetKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_TRUE);
619*9371c9d4SSatish Balay }
620*9371c9d4SSatish Balay template <>
621*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOFWrite(DM da, Vec vec, PetscScalarKokkosOffsetView4DHost *ov) {
622*9371c9d4SSatish Balay   return DMDAVecRestoreKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_TRUE);
623*9371c9d4SSatish Balay }
6249dc7b89cSJunchao Zhang #endif
625