xref: /petsc/src/dm/impls/da/kokkos/dagetov.kokkos.cxx (revision 9566063d113dddea24716c546802770db7481bc0)
1c6583b63SJunchao Zhang #include <petsc/private/vecimpl_kokkos.hpp>
2c6583b63SJunchao Zhang #include <petsc/private/dmdaimpl.h>
3c6583b63SJunchao Zhang #include <petscdmda_kokkos.hpp>
4c6583b63SJunchao Zhang 
5c6583b63SJunchao Zhang /* Use macro instead of inlined function just to avoid annoying warnings like: 'dof' may be used uninitialized in this function [-Wmaybe-uninitialized] */
6c6583b63SJunchao Zhang #define DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof) \
7c6583b63SJunchao Zhang do { \
8*9566063dSJacob Faibussowitsch   PetscCall(DMDAGetCorners(da,&xs,&ys,&zs,&xm,&ym,&zm)); \
9*9566063dSJacob Faibussowitsch   PetscCall(DMDAGetGhostCorners(da,&gxs,&gys,&gzs,&gxm,&gym,&gzm)); \
10*9566063dSJacob Faibussowitsch   PetscCall(DMDAGetInfo(da,&dim,NULL,NULL,NULL,NULL,NULL,NULL,&dof,NULL,NULL,NULL,NULL,NULL)); \
11c6583b63SJunchao Zhang   /* Handle case where user passes in global vector as opposed to local */ \
12*9566063dSJacob Faibussowitsch   PetscCall(VecGetLocalSize(vec,&N)); \
13c6583b63SJunchao Zhang   if (N == xm*ym*zm*dof) { \
14c6583b63SJunchao Zhang     gxm = xm; gym = ym; gzm = zm; \
15c6583b63SJunchao Zhang     gxs = xs; gys = ys; gzs = zs; \
169dc7b89cSJunchao Zhang   } else PetscCheck(N == gxm*gym*gzm*dof,PETSC_COMM_SELF,PETSC_ERR_ARG_INCOMP,"Vector local size %D is not compatible with DMDA local sizes %D %D",N,xm*ym*zm*dof,gxm*gym*gzm*dof); \
17c6583b63SJunchao Zhang } while (0)
18c6583b63SJunchao Zhang 
199dc7b89cSJunchao Zhang /* -------------------- 1D ---------------- */
20c6583b63SJunchao Zhang template<class MemorySpace>
21c6583b63SJunchao Zhang PetscErrorCode DMDAVecGetKokkosOffsetView_Private(DM da,Vec vec,PetscScalarKokkosOffsetView1DType<MemorySpace> *ov,PetscBool overwrite)
22c6583b63SJunchao Zhang {
23c6583b63SJunchao Zhang   PetscInt                               xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof;
24c6583b63SJunchao Zhang   PetscScalarKokkosViewType<MemorySpace> kv;
25c6583b63SJunchao Zhang 
26c6583b63SJunchao Zhang   PetscFunctionBegin;
27c6583b63SJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
28c6583b63SJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
29c6583b63SJunchao Zhang   PetscValidPointer(ov,3);
30c6583b63SJunchao Zhang   DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof);
319dc7b89cSJunchao Zhang   PetscCheck(dim == 1,PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"KokkosOffsetView is 1D but DMDA is %dD",(int)dim);
32*9566063dSJacob Faibussowitsch   if (overwrite) PetscCall(VecGetKokkosViewWrite(vec,&kv));
33*9566063dSJacob Faibussowitsch   else PetscCall(VecGetKokkosView(vec,&kv));
349dc7b89cSJunchao Zhang   /* Construct the unmanaged OffsetView with {begin0,begin1,begins2},{end0,end1,end2} */
359dc7b89cSJunchao Zhang   *ov  = PetscScalarKokkosOffsetView1DType<MemorySpace>(kv.data(),{gxs*dof},{(gxs+gxm)*dof});
36c6583b63SJunchao Zhang   PetscFunctionReturn(0);
37c6583b63SJunchao Zhang }
38c6583b63SJunchao Zhang 
39c6583b63SJunchao Zhang template<class MemorySpace>
40c6583b63SJunchao Zhang PetscErrorCode DMDAVecRestoreKokkosOffsetView_Private(DM da,Vec vec,PetscScalarKokkosOffsetView1DType<MemorySpace> *ov,PetscBool overwrite)
41c6583b63SJunchao Zhang {
42c6583b63SJunchao Zhang   PetscScalarKokkosViewType<MemorySpace> kv;
43c6583b63SJunchao Zhang 
44c6583b63SJunchao Zhang   PetscFunctionBegin;
45c6583b63SJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
46c6583b63SJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
47c6583b63SJunchao Zhang   PetscValidPointer(ov,3);
48c6583b63SJunchao Zhang   kv   = ov->view(); /* OffsetView to View */
49*9566063dSJacob Faibussowitsch   if (overwrite) PetscCall(VecRestoreKokkosViewWrite(vec,&kv));
50*9566063dSJacob Faibussowitsch   else PetscCall(VecRestoreKokkosView(vec,&kv));
51c6583b63SJunchao Zhang   PetscFunctionReturn(0);
52c6583b63SJunchao Zhang }
53c6583b63SJunchao Zhang 
54c6583b63SJunchao Zhang template<class MemorySpace>
55c6583b63SJunchao Zhang PetscErrorCode DMDAVecGetKokkosOffsetView(DM da,Vec vec,ConstPetscScalarKokkosOffsetView1DType<MemorySpace> *ov)
56c6583b63SJunchao Zhang {
57c6583b63SJunchao Zhang   PetscInt                                    xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof;
58c6583b63SJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace> kv;
59c6583b63SJunchao Zhang 
60c6583b63SJunchao Zhang   PetscFunctionBegin;
61c6583b63SJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
62c6583b63SJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
63c6583b63SJunchao Zhang   PetscValidPointer(ov,3);
64c6583b63SJunchao Zhang   DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof);
659dc7b89cSJunchao Zhang   PetscCheck(dim == 1,PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"KokkosOffsetView is 1D but DMDA is %dD",(int)dim);
66*9566063dSJacob Faibussowitsch   PetscCall(VecGetKokkosView(vec,&kv));
679dc7b89cSJunchao Zhang   *ov  = ConstPetscScalarKokkosOffsetView1DType<MemorySpace>(kv.data(),{gxs*dof},{(gxs+gxm)*dof});
68c6583b63SJunchao Zhang   PetscFunctionReturn(0);
69c6583b63SJunchao Zhang }
70c6583b63SJunchao Zhang 
71c6583b63SJunchao Zhang template<class MemorySpace>
72c6583b63SJunchao Zhang PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM da,Vec vec,ConstPetscScalarKokkosOffsetView1DType<MemorySpace> *ov)
73c6583b63SJunchao Zhang {
74c6583b63SJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace> kv;
75c6583b63SJunchao Zhang 
76c6583b63SJunchao Zhang   PetscFunctionBegin;
77c6583b63SJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
78c6583b63SJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
79c6583b63SJunchao Zhang   PetscValidPointer(ov,3);
80c6583b63SJunchao Zhang   kv   = ov->view();
81*9566063dSJacob Faibussowitsch   PetscCall(VecRestoreKokkosView(vec,&kv));
82c6583b63SJunchao Zhang   PetscFunctionReturn(0);
83c6583b63SJunchao Zhang }
84c6583b63SJunchao Zhang 
859dc7b89cSJunchao Zhang /* ============================== 2D ================================= */
86c6583b63SJunchao Zhang template<class MemorySpace>
87c6583b63SJunchao Zhang PetscErrorCode DMDAVecGetKokkosOffsetView_Private(DM da,Vec vec,PetscScalarKokkosOffsetView2DType<MemorySpace> *ov,PetscBool overwrite)
88c6583b63SJunchao Zhang {
89c6583b63SJunchao Zhang   PetscInt                               xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof;
90c6583b63SJunchao Zhang   PetscScalarKokkosViewType<MemorySpace> kv;
91c6583b63SJunchao Zhang 
92c6583b63SJunchao Zhang   PetscFunctionBegin;
93c6583b63SJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
94c6583b63SJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
95c6583b63SJunchao Zhang   PetscValidPointer(ov,3);
96c6583b63SJunchao Zhang   DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof);
979dc7b89cSJunchao Zhang   PetscCheck(dim == 2,PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"KokkosOffsetView is 2D but DMDA is %dD",(int)dim);
98*9566063dSJacob Faibussowitsch   if (overwrite) PetscCall(VecGetKokkosViewWrite(vec,&kv));
99*9566063dSJacob Faibussowitsch   else PetscCall(VecGetKokkosView(vec,&kv));
1009dc7b89cSJunchao Zhang   *ov  = PetscScalarKokkosOffsetView2DType<MemorySpace>(kv.data(),{gys*dof,gxs*dof},{(gys+gym)*dof,(gxs+gxm)*dof});
101c6583b63SJunchao Zhang   PetscFunctionReturn(0);
102c6583b63SJunchao Zhang }
103c6583b63SJunchao Zhang 
104c6583b63SJunchao Zhang template<class MemorySpace>
105c6583b63SJunchao Zhang PetscErrorCode DMDAVecRestoreKokkosOffsetView_Private(DM da,Vec vec,PetscScalarKokkosOffsetView2DType<MemorySpace> *ov,PetscBool overwrite)
106c6583b63SJunchao Zhang {
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));
115*9566063dSJacob Faibussowitsch   if (overwrite) PetscCall(VecRestoreKokkosViewWrite(vec,&kv));
116*9566063dSJacob Faibussowitsch   else PetscCall(VecRestoreKokkosView(vec,&kv));
117c6583b63SJunchao Zhang   PetscFunctionReturn(0);
118c6583b63SJunchao Zhang }
119c6583b63SJunchao Zhang 
120c6583b63SJunchao Zhang template<class MemorySpace>
121c6583b63SJunchao Zhang PetscErrorCode DMDAVecGetKokkosOffsetView(DM da,Vec vec,ConstPetscScalarKokkosOffsetView2DType<MemorySpace> *ov)
122c6583b63SJunchao Zhang {
123c6583b63SJunchao Zhang   PetscInt                                    xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof;
124c6583b63SJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace> kv;
125c6583b63SJunchao Zhang 
126c6583b63SJunchao Zhang   PetscFunctionBegin;
127c6583b63SJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
128c6583b63SJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
129c6583b63SJunchao Zhang   PetscValidPointer(ov,3);
130c6583b63SJunchao Zhang   DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof);
1319dc7b89cSJunchao Zhang   PetscCheck(dim == 2,PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"KokkosOffsetView is 2D but DMDA is %dD",(int)dim);
132*9566063dSJacob Faibussowitsch   PetscCall(VecGetKokkosView(vec,&kv));
1339dc7b89cSJunchao Zhang   *ov  = ConstPetscScalarKokkosOffsetView2DType<MemorySpace>(kv.data(),{gys*dof,gxs*dof},{(gys+gym)*dof,(gxs+gxm)*dof});
134c6583b63SJunchao Zhang   PetscFunctionReturn(0);
135c6583b63SJunchao Zhang }
136c6583b63SJunchao Zhang 
137c6583b63SJunchao Zhang template<class MemorySpace>
138c6583b63SJunchao Zhang PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM da,Vec vec,ConstPetscScalarKokkosOffsetView2DType<MemorySpace> *ov)
139c6583b63SJunchao Zhang {
140c6583b63SJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace> kv;
141c6583b63SJunchao Zhang 
142c6583b63SJunchao Zhang   PetscFunctionBegin;
143c6583b63SJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
144c6583b63SJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
145c6583b63SJunchao Zhang   PetscValidPointer(ov,3);
146c6583b63SJunchao Zhang   kv   = ConstPetscScalarKokkosViewType<MemorySpace>(ov->data(),ov->extent(0)*ov->extent(1));
147*9566063dSJacob Faibussowitsch   PetscCall(VecRestoreKokkosView(vec,&kv));
148c6583b63SJunchao Zhang   PetscFunctionReturn(0);
149c6583b63SJunchao Zhang }
150c6583b63SJunchao Zhang 
1519dc7b89cSJunchao Zhang /* ============================== 3D ================================= */
1529dc7b89cSJunchao Zhang template<class MemorySpace>
1539dc7b89cSJunchao Zhang PetscErrorCode DMDAVecGetKokkosOffsetView_Private(DM da,Vec vec,PetscScalarKokkosOffsetView3DType<MemorySpace> *ov,PetscBool overwrite)
1549dc7b89cSJunchao Zhang {
1559dc7b89cSJunchao Zhang   PetscInt                                     xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof;
1569dc7b89cSJunchao Zhang   PetscScalarKokkosViewType<MemorySpace>       kv;
1579dc7b89cSJunchao Zhang 
1589dc7b89cSJunchao Zhang   PetscFunctionBegin;
1599dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
1609dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
1619dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
1629dc7b89cSJunchao Zhang   DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof);
1639dc7b89cSJunchao Zhang   PetscCheck(dim == 3,PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"KokkosOffsetView is 3D but DMDA is %dD",(int)dim);
164*9566063dSJacob Faibussowitsch   if (overwrite) PetscCall(VecGetKokkosViewWrite(vec,&kv));
165*9566063dSJacob Faibussowitsch   else PetscCall(VecGetKokkosView(vec,&kv));
1669dc7b89cSJunchao Zhang   *ov  = PetscScalarKokkosOffsetView3DType<MemorySpace>(kv.data(),{gzs*dof,gys*dof,gxs*dof},{(gzs+gzm)*dof,(gys+gym)*dof,(gxs+gxm)*dof});
1679dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
1689dc7b89cSJunchao Zhang }
1699dc7b89cSJunchao Zhang 
1709dc7b89cSJunchao Zhang template<class MemorySpace>
1719dc7b89cSJunchao Zhang PetscErrorCode DMDAVecRestoreKokkosOffsetView_Private(DM da,Vec vec,PetscScalarKokkosOffsetView3DType<MemorySpace> *ov,PetscBool overwrite)
1729dc7b89cSJunchao Zhang {
1739dc7b89cSJunchao Zhang   PetscScalarKokkosViewType<MemorySpace>     kv;
1749dc7b89cSJunchao Zhang 
1759dc7b89cSJunchao Zhang   PetscFunctionBegin;
1769dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
1779dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
1789dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
1799dc7b89cSJunchao Zhang   kv   = PetscScalarKokkosViewType<MemorySpace>(ov->data(),ov->extent(0)*ov->extent(1)*ov->extent(2));
180*9566063dSJacob Faibussowitsch   if (overwrite) PetscCall(VecRestoreKokkosViewWrite(vec,&kv));
181*9566063dSJacob Faibussowitsch   else PetscCall(VecRestoreKokkosView(vec,&kv));
1829dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
1839dc7b89cSJunchao Zhang }
1849dc7b89cSJunchao Zhang 
1859dc7b89cSJunchao Zhang template<class MemorySpace>
1869dc7b89cSJunchao Zhang PetscErrorCode DMDAVecGetKokkosOffsetView(DM da,Vec vec,ConstPetscScalarKokkosOffsetView3DType<MemorySpace> *ov)
1879dc7b89cSJunchao Zhang {
1889dc7b89cSJunchao Zhang   PetscInt                                     xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof;
1899dc7b89cSJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace>  kv;
1909dc7b89cSJunchao Zhang 
1919dc7b89cSJunchao Zhang   PetscFunctionBegin;
1929dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
1939dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
1949dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
1959dc7b89cSJunchao Zhang   DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof);
1969dc7b89cSJunchao Zhang   PetscCheck(dim == 3,PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"KokkosOffsetView is 3D but DMDA is %dD",(int)dim);
197*9566063dSJacob Faibussowitsch   PetscCall(VecGetKokkosView(vec,&kv));
1989dc7b89cSJunchao Zhang   *ov  = ConstPetscScalarKokkosOffsetView3DType<MemorySpace>(kv.data(),{gzs*dof,gys*dof,gxs*dof},{(gzs+gzm)*dof,(gys+gym)*dof,(gxs+gxm)*dof});
1999dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
2009dc7b89cSJunchao Zhang }
2019dc7b89cSJunchao Zhang 
2029dc7b89cSJunchao Zhang template<class MemorySpace>
2039dc7b89cSJunchao Zhang PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM da,Vec vec,ConstPetscScalarKokkosOffsetView3DType<MemorySpace> *ov)
2049dc7b89cSJunchao Zhang {
2059dc7b89cSJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace>  kv;
2069dc7b89cSJunchao Zhang 
2079dc7b89cSJunchao Zhang   PetscFunctionBegin;
2089dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
2099dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
2109dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
2119dc7b89cSJunchao Zhang   kv   = ConstPetscScalarKokkosViewType<MemorySpace>(ov->data(),ov->extent(0)*ov->extent(1)*ov->extent(2));
212*9566063dSJacob Faibussowitsch   PetscCall(VecRestoreKokkosView(vec,&kv));
2139dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
2149dc7b89cSJunchao Zhang }
2159dc7b89cSJunchao Zhang 
216c6583b63SJunchao Zhang /* Function template explicit instantiation */
217c6583b63SJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView         (DM,Vec,  ConstPetscScalarKokkosOffsetView1D*);
218c6583b63SJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView     (DM,Vec,  ConstPetscScalarKokkosOffsetView1D*);
219c6583b63SJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView         (DM da,Vec vec,PetscScalarKokkosOffsetView1D* ov) {return DMDAVecGetKokkosOffsetView_Private(da,vec,ov,PETSC_FALSE);}
220c6583b63SJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView     (DM da,Vec vec,PetscScalarKokkosOffsetView1D* ov) {return DMDAVecRestoreKokkosOffsetView_Private(da,vec,ov,PETSC_FALSE);}
221c6583b63SJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewWrite    (DM da,Vec vec,PetscScalarKokkosOffsetView1D* ov) {return DMDAVecGetKokkosOffsetView_Private(da,vec,ov,PETSC_TRUE);}
222c6583b63SJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewWrite(DM da,Vec vec,PetscScalarKokkosOffsetView1D* ov) {return DMDAVecRestoreKokkosOffsetView_Private(da,vec,ov,PETSC_TRUE);}
223c6583b63SJunchao Zhang 
224c6583b63SJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView         (DM,Vec,  ConstPetscScalarKokkosOffsetView2D*);
225c6583b63SJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView     (DM,Vec,  ConstPetscScalarKokkosOffsetView2D*);
226c6583b63SJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView         (DM da,Vec vec,PetscScalarKokkosOffsetView2D* ov) {return DMDAVecGetKokkosOffsetView_Private(da,vec,ov,PETSC_FALSE);}
227c6583b63SJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView     (DM da,Vec vec,PetscScalarKokkosOffsetView2D* ov) {return DMDAVecRestoreKokkosOffsetView_Private(da,vec,ov,PETSC_FALSE);}
228c6583b63SJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewWrite    (DM da,Vec vec,PetscScalarKokkosOffsetView2D* ov) {return DMDAVecGetKokkosOffsetView_Private(da,vec,ov,PETSC_TRUE);}
229c6583b63SJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewWrite(DM da,Vec vec,PetscScalarKokkosOffsetView2D* ov) {return DMDAVecRestoreKokkosOffsetView_Private(da,vec,ov,PETSC_TRUE);}
230c6583b63SJunchao Zhang 
2319dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView         (DM,Vec,  ConstPetscScalarKokkosOffsetView3D*);
2329dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView     (DM,Vec,  ConstPetscScalarKokkosOffsetView3D*);
2339dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView         (DM da,Vec vec,PetscScalarKokkosOffsetView3D* ov) {return DMDAVecGetKokkosOffsetView_Private(da,vec,ov,PETSC_FALSE);}
2349dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView     (DM da,Vec vec,PetscScalarKokkosOffsetView3D* ov) {return DMDAVecRestoreKokkosOffsetView_Private(da,vec,ov,PETSC_FALSE);}
2359dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewWrite    (DM da,Vec vec,PetscScalarKokkosOffsetView3D* ov) {return DMDAVecGetKokkosOffsetView_Private(da,vec,ov,PETSC_TRUE);}
2369dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewWrite(DM da,Vec vec,PetscScalarKokkosOffsetView3D* ov) {return DMDAVecRestoreKokkosOffsetView_Private(da,vec,ov,PETSC_TRUE);}
2379dc7b89cSJunchao Zhang 
2389dc7b89cSJunchao Zhang #if !defined(KOKKOS_ENABLE_DEFAULT_DEVICE_TYPE_HOST) /* Get host views if the default memory space is not host space */
2399dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView         (DM,Vec,  ConstPetscScalarKokkosOffsetView1DHost*);
2409dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView     (DM,Vec,  ConstPetscScalarKokkosOffsetView1DHost*);
2419dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView         (DM da,Vec vec,PetscScalarKokkosOffsetView1DHost* ov) {return DMDAVecGetKokkosOffsetView_Private(da,vec,ov,PETSC_FALSE);}
2429dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView     (DM da,Vec vec,PetscScalarKokkosOffsetView1DHost* ov) {return DMDAVecRestoreKokkosOffsetView_Private(da,vec,ov,PETSC_FALSE);}
2439dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewWrite    (DM da,Vec vec,PetscScalarKokkosOffsetView1DHost* ov) {return DMDAVecGetKokkosOffsetView_Private(da,vec,ov,PETSC_TRUE);}
2449dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewWrite(DM da,Vec vec,PetscScalarKokkosOffsetView1DHost* ov) {return DMDAVecRestoreKokkosOffsetView_Private(da,vec,ov,PETSC_TRUE);}
2459dc7b89cSJunchao Zhang 
2469dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView         (DM,Vec,  ConstPetscScalarKokkosOffsetView2DHost*);
2479dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView     (DM,Vec,  ConstPetscScalarKokkosOffsetView2DHost*);
2489dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView         (DM da,Vec vec,PetscScalarKokkosOffsetView2DHost* ov) {return DMDAVecGetKokkosOffsetView_Private(da,vec,ov,PETSC_FALSE);}
2499dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView     (DM da,Vec vec,PetscScalarKokkosOffsetView2DHost* ov) {return DMDAVecRestoreKokkosOffsetView_Private(da,vec,ov,PETSC_FALSE);}
2509dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewWrite    (DM da,Vec vec,PetscScalarKokkosOffsetView2DHost* ov) {return DMDAVecGetKokkosOffsetView_Private(da,vec,ov,PETSC_TRUE);}
2519dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewWrite(DM da,Vec vec,PetscScalarKokkosOffsetView2DHost* ov) {return DMDAVecRestoreKokkosOffsetView_Private(da,vec,ov,PETSC_TRUE);}
2529dc7b89cSJunchao Zhang 
2539dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView         (DM,Vec,  ConstPetscScalarKokkosOffsetView3DHost*);
2549dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView     (DM,Vec,  ConstPetscScalarKokkosOffsetView3DHost*);
2559dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView         (DM da,Vec vec,PetscScalarKokkosOffsetView3DHost* ov) {return DMDAVecGetKokkosOffsetView_Private(da,vec,ov,PETSC_FALSE);}
2569dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView     (DM da,Vec vec,PetscScalarKokkosOffsetView3DHost* ov) {return DMDAVecRestoreKokkosOffsetView_Private(da,vec,ov,PETSC_FALSE);}
2579dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewWrite    (DM da,Vec vec,PetscScalarKokkosOffsetView3DHost* ov) {return DMDAVecGetKokkosOffsetView_Private(da,vec,ov,PETSC_TRUE);}
2589dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewWrite(DM da,Vec vec,PetscScalarKokkosOffsetView3DHost* ov) {return DMDAVecRestoreKokkosOffsetView_Private(da,vec,ov,PETSC_TRUE);}
2599dc7b89cSJunchao Zhang #endif
2609dc7b89cSJunchao Zhang 
2619dc7b89cSJunchao Zhang /* ============================== 2D including DOF ================================= */
2629dc7b89cSJunchao Zhang template<class MemorySpace>
2639dc7b89cSJunchao Zhang PetscErrorCode DMDAVecGetKokkosOffsetViewDOF_Private(DM da,Vec vec,PetscScalarKokkosOffsetView2DType<MemorySpace> *ov,PetscBool overwrite)
2649dc7b89cSJunchao Zhang {
2659dc7b89cSJunchao Zhang   PetscInt                                     xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof;
2669dc7b89cSJunchao Zhang   PetscScalarKokkosViewType<MemorySpace>       kv;
2679dc7b89cSJunchao Zhang 
2689dc7b89cSJunchao Zhang   PetscFunctionBegin;
2699dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
2709dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
2719dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
2729dc7b89cSJunchao Zhang   DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof);
2739dc7b89cSJunchao Zhang   PetscCheck(dim == 1,PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"KokkosOffsetView is 2D but DMDA is %dD",(int)dim);
274*9566063dSJacob Faibussowitsch   if (overwrite) PetscCall(VecGetKokkosViewWrite(vec,&kv));
275*9566063dSJacob Faibussowitsch   else PetscCall(VecGetKokkosView(vec,&kv));
2769dc7b89cSJunchao Zhang   *ov  = PetscScalarKokkosOffsetView2DType<MemorySpace>(kv.data(),{gxs,0},{gxs+gxm,dof});
2779dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
2789dc7b89cSJunchao Zhang }
2799dc7b89cSJunchao Zhang 
2809dc7b89cSJunchao Zhang template<class MemorySpace>
2819dc7b89cSJunchao Zhang PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF_Private(DM da,Vec vec,PetscScalarKokkosOffsetView2DType<MemorySpace> *ov,PetscBool overwrite)
2829dc7b89cSJunchao Zhang {
2839dc7b89cSJunchao Zhang   PetscScalarKokkosViewType<MemorySpace>     kv;
2849dc7b89cSJunchao Zhang 
2859dc7b89cSJunchao Zhang   PetscFunctionBegin;
2869dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
2879dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
2889dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
2899dc7b89cSJunchao Zhang   kv   = PetscScalarKokkosViewType<MemorySpace>(ov->data(),ov->extent(0)*ov->extent(1));
290*9566063dSJacob Faibussowitsch   if (overwrite) PetscCall(VecRestoreKokkosViewWrite(vec,&kv));
291*9566063dSJacob Faibussowitsch   else PetscCall(VecRestoreKokkosView(vec,&kv));
2929dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
2939dc7b89cSJunchao Zhang }
2949dc7b89cSJunchao Zhang 
2959dc7b89cSJunchao Zhang template<class MemorySpace>
2969dc7b89cSJunchao Zhang PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM da,Vec vec,ConstPetscScalarKokkosOffsetView2DType<MemorySpace> *ov)
2979dc7b89cSJunchao Zhang {
2989dc7b89cSJunchao Zhang   PetscInt                                     xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof;
2999dc7b89cSJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace>  kv;
3009dc7b89cSJunchao Zhang 
3019dc7b89cSJunchao Zhang   PetscFunctionBegin;
3029dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
3039dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
3049dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
3059dc7b89cSJunchao Zhang   DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof);
3069dc7b89cSJunchao Zhang   PetscCheck(dim == 1,PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"KokkosOffsetView is 2D but DMDA is %dD",(int)dim);
307*9566063dSJacob Faibussowitsch   PetscCall(VecGetKokkosView(vec,&kv));
3089dc7b89cSJunchao Zhang   *ov  = ConstPetscScalarKokkosOffsetView2DType<MemorySpace>(kv.data(),{gxs,0},{gxs+gxm,dof});
3099dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
3109dc7b89cSJunchao Zhang }
3119dc7b89cSJunchao Zhang 
3129dc7b89cSJunchao Zhang template<class MemorySpace>
3139dc7b89cSJunchao Zhang PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM da,Vec vec,ConstPetscScalarKokkosOffsetView2DType<MemorySpace> *ov)
3149dc7b89cSJunchao Zhang {
3159dc7b89cSJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace>  kv;
3169dc7b89cSJunchao Zhang 
3179dc7b89cSJunchao Zhang   PetscFunctionBegin;
3189dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
3199dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
3209dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
3219dc7b89cSJunchao Zhang   kv   = ConstPetscScalarKokkosViewType<MemorySpace>(ov->data(),ov->extent(0)*ov->extent(1));
322*9566063dSJacob Faibussowitsch   PetscCall(VecRestoreKokkosView(vec,&kv));
3239dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
3249dc7b89cSJunchao Zhang }
3259dc7b89cSJunchao Zhang 
3269dc7b89cSJunchao Zhang /* ============================== 3D including DOF ================================= */
3279dc7b89cSJunchao Zhang template<class MemorySpace>
3289dc7b89cSJunchao Zhang PetscErrorCode DMDAVecGetKokkosOffsetViewDOF_Private(DM da,Vec vec,PetscScalarKokkosOffsetView3DType<MemorySpace> *ov,PetscBool overwrite)
3299dc7b89cSJunchao Zhang {
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 == 2,PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"KokkosOffsetView is 3D but DMDA is %dD",(int)dim);
339*9566063dSJacob Faibussowitsch   if (overwrite) PetscCall(VecGetKokkosViewWrite(vec,&kv));
340*9566063dSJacob Faibussowitsch   else PetscCall(VecGetKokkosView(vec,&kv));
3419dc7b89cSJunchao Zhang   *ov  = PetscScalarKokkosOffsetView3DType<MemorySpace>(kv.data(),{gys,gxs,0},{gys+gym,gxs+gxm,dof});
3429dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
3439dc7b89cSJunchao Zhang }
3449dc7b89cSJunchao Zhang 
3459dc7b89cSJunchao Zhang template<class MemorySpace>
3469dc7b89cSJunchao Zhang PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF_Private(DM da,Vec vec,PetscScalarKokkosOffsetView3DType<MemorySpace> *ov,PetscBool overwrite)
3479dc7b89cSJunchao Zhang {
3489dc7b89cSJunchao Zhang   PetscScalarKokkosViewType<MemorySpace>     kv;
3499dc7b89cSJunchao Zhang 
3509dc7b89cSJunchao Zhang   PetscFunctionBegin;
3519dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
3529dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
3539dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
3549dc7b89cSJunchao Zhang   kv   = PetscScalarKokkosViewType<MemorySpace>(ov->data(),ov->extent(0)*ov->extent(1)*ov->extent(2));
355*9566063dSJacob Faibussowitsch   if (overwrite) PetscCall(VecRestoreKokkosViewWrite(vec,&kv));
356*9566063dSJacob Faibussowitsch   else PetscCall(VecRestoreKokkosView(vec,&kv));
3579dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
3589dc7b89cSJunchao Zhang }
3599dc7b89cSJunchao Zhang 
3609dc7b89cSJunchao Zhang template<class MemorySpace>
3619dc7b89cSJunchao Zhang PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM da,Vec vec,ConstPetscScalarKokkosOffsetView3DType<MemorySpace> *ov)
3629dc7b89cSJunchao Zhang {
3639dc7b89cSJunchao Zhang   PetscInt                                     xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof;
3649dc7b89cSJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace>  kv;
3659dc7b89cSJunchao Zhang 
3669dc7b89cSJunchao Zhang   PetscFunctionBegin;
3679dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
3689dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
3699dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
3709dc7b89cSJunchao Zhang   DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof);
3719dc7b89cSJunchao Zhang   PetscCheck(dim == 2,PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"KokkosOffsetView is 3D but DMDA is %dD",(int)dim);
372*9566063dSJacob Faibussowitsch   PetscCall(VecGetKokkosView(vec,&kv));
3739dc7b89cSJunchao Zhang   *ov  = ConstPetscScalarKokkosOffsetView3DType<MemorySpace>(kv.data(),{gys,gxs,0},{gys+gym,gxs+gxm,dof});
3749dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
3759dc7b89cSJunchao Zhang }
3769dc7b89cSJunchao Zhang 
3779dc7b89cSJunchao Zhang template<class MemorySpace>
3789dc7b89cSJunchao Zhang PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM da,Vec vec,ConstPetscScalarKokkosOffsetView3DType<MemorySpace> *ov)
3799dc7b89cSJunchao Zhang {
3809dc7b89cSJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace>  kv;
3819dc7b89cSJunchao Zhang 
3829dc7b89cSJunchao Zhang   PetscFunctionBegin;
3839dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
3849dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
3859dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
3869dc7b89cSJunchao Zhang   kv   = ConstPetscScalarKokkosViewType<MemorySpace>(ov->data(),ov->extent(0)*ov->extent(1)*ov->extent(2));
387*9566063dSJacob Faibussowitsch   PetscCall(VecRestoreKokkosView(vec,&kv));
3889dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
3899dc7b89cSJunchao Zhang }
3909dc7b89cSJunchao Zhang 
3919dc7b89cSJunchao Zhang /* ============================== 4D including DOF ================================= */
3929dc7b89cSJunchao Zhang template<class MemorySpace>
3939dc7b89cSJunchao Zhang PetscErrorCode DMDAVecGetKokkosOffsetViewDOF_Private(DM da,Vec vec,PetscScalarKokkosOffsetView4DType<MemorySpace> *ov,PetscBool overwrite)
3949dc7b89cSJunchao Zhang {
3959dc7b89cSJunchao Zhang   PetscInt                                     xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof;
3969dc7b89cSJunchao Zhang   PetscScalarKokkosViewType<MemorySpace>       kv;
3979dc7b89cSJunchao Zhang 
3989dc7b89cSJunchao Zhang   PetscFunctionBegin;
3999dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
4009dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
4019dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
4029dc7b89cSJunchao Zhang   DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof);
4039dc7b89cSJunchao Zhang   PetscCheck(dim == 3,PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"KokkosOffsetView is 4D but DMDA is %dD",(int)dim);
404*9566063dSJacob Faibussowitsch   if (overwrite) PetscCall(VecGetKokkosViewWrite(vec,&kv));
405*9566063dSJacob Faibussowitsch   else PetscCall(VecGetKokkosView(vec,&kv));
4069dc7b89cSJunchao Zhang   *ov  = PetscScalarKokkosOffsetView4DType<MemorySpace>(kv.data(),{gzs,gys,gxs,0},{gzs+gzm,gys+gym,gxs+gxm,dof});
4079dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
4089dc7b89cSJunchao Zhang }
4099dc7b89cSJunchao Zhang 
4109dc7b89cSJunchao Zhang template<class MemorySpace>
4119dc7b89cSJunchao Zhang PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF_Private(DM da,Vec vec,PetscScalarKokkosOffsetView4DType<MemorySpace> *ov,PetscBool overwrite)
4129dc7b89cSJunchao Zhang {
4139dc7b89cSJunchao Zhang   PetscScalarKokkosViewType<MemorySpace>     kv;
4149dc7b89cSJunchao Zhang 
4159dc7b89cSJunchao Zhang   PetscFunctionBegin;
4169dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
4179dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
4189dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
4199dc7b89cSJunchao Zhang   kv   = PetscScalarKokkosViewType<MemorySpace>(ov->data(),ov->extent(0)*ov->extent(1)*ov->extent(2)*ov->extent(3));
420*9566063dSJacob Faibussowitsch   if (overwrite) PetscCall(VecRestoreKokkosViewWrite(vec,&kv));
421*9566063dSJacob Faibussowitsch   else PetscCall(VecRestoreKokkosView(vec,&kv));
4229dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
4239dc7b89cSJunchao Zhang }
4249dc7b89cSJunchao Zhang 
4259dc7b89cSJunchao Zhang template<class MemorySpace>
4269dc7b89cSJunchao Zhang PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM da,Vec vec,ConstPetscScalarKokkosOffsetView4DType<MemorySpace> *ov)
4279dc7b89cSJunchao Zhang {
4289dc7b89cSJunchao Zhang   PetscInt                                     xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof;
4299dc7b89cSJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace>  kv;
4309dc7b89cSJunchao Zhang 
4319dc7b89cSJunchao Zhang   PetscFunctionBegin;
4329dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
4339dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
4349dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
4359dc7b89cSJunchao Zhang   DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof);
4369dc7b89cSJunchao Zhang   PetscCheck(dim == 3,PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"KokkosOffsetView is 4D but DMDA is %dD",(int)dim);
437*9566063dSJacob Faibussowitsch   PetscCall(VecGetKokkosView(vec,&kv));
4389dc7b89cSJunchao Zhang   *ov  = ConstPetscScalarKokkosOffsetView4DType<MemorySpace>(kv.data(),{gzs,gys,gxs,0},{gzs+gzm,gys+gym,gxs+gxm,dof});
4399dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
4409dc7b89cSJunchao Zhang }
4419dc7b89cSJunchao Zhang 
4429dc7b89cSJunchao Zhang template<class MemorySpace>
4439dc7b89cSJunchao Zhang PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM da,Vec vec,ConstPetscScalarKokkosOffsetView4DType<MemorySpace> *ov)
4449dc7b89cSJunchao Zhang {
4459dc7b89cSJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace>  kv;
4469dc7b89cSJunchao Zhang 
4479dc7b89cSJunchao Zhang   PetscFunctionBegin;
4489dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
4499dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
4509dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
4519dc7b89cSJunchao Zhang   kv   = ConstPetscScalarKokkosViewType<MemorySpace>(ov->data(),ov->extent(0)*ov->extent(1)*ov->extent(2)*ov->extent(3));
452*9566063dSJacob Faibussowitsch   PetscCall(VecRestoreKokkosView(vec,&kv));
4539dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
4549dc7b89cSJunchao Zhang }
4559dc7b89cSJunchao Zhang 
4569dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF         (DM,Vec,  ConstPetscScalarKokkosOffsetView2D*);
4579dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF     (DM,Vec,  ConstPetscScalarKokkosOffsetView2D*);
4589dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF         (DM da,Vec vec,PetscScalarKokkosOffsetView2D* ov) {return DMDAVecGetKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_FALSE);}
4599dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF     (DM da,Vec vec,PetscScalarKokkosOffsetView2D* ov) {return DMDAVecRestoreKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_FALSE);}
4609dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOFWrite    (DM da,Vec vec,PetscScalarKokkosOffsetView2D* ov) {return DMDAVecGetKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_TRUE);}
4619dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOFWrite(DM da,Vec vec,PetscScalarKokkosOffsetView2D* ov) {return DMDAVecRestoreKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_TRUE);}
4629dc7b89cSJunchao Zhang 
4639dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF         (DM,Vec,  ConstPetscScalarKokkosOffsetView3D*);
4649dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF     (DM,Vec,  ConstPetscScalarKokkosOffsetView3D*);
4659dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF         (DM da,Vec vec,PetscScalarKokkosOffsetView3D* ov) {return DMDAVecGetKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_FALSE);}
4669dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF     (DM da,Vec vec,PetscScalarKokkosOffsetView3D* ov) {return DMDAVecRestoreKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_FALSE);}
4679dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOFWrite    (DM da,Vec vec,PetscScalarKokkosOffsetView3D* ov) {return DMDAVecGetKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_TRUE);}
4689dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOFWrite(DM da,Vec vec,PetscScalarKokkosOffsetView3D* ov) {return DMDAVecRestoreKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_TRUE);}
4699dc7b89cSJunchao Zhang 
4709dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF         (DM,Vec,  ConstPetscScalarKokkosOffsetView4D*);
4719dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF     (DM,Vec,  ConstPetscScalarKokkosOffsetView4D*);
4729dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF         (DM da,Vec vec,PetscScalarKokkosOffsetView4D* ov) {return DMDAVecGetKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_FALSE);}
4739dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF     (DM da,Vec vec,PetscScalarKokkosOffsetView4D* ov) {return DMDAVecRestoreKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_FALSE);}
4749dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOFWrite    (DM da,Vec vec,PetscScalarKokkosOffsetView4D* ov) {return DMDAVecGetKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_TRUE);}
4759dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOFWrite(DM da,Vec vec,PetscScalarKokkosOffsetView4D* ov) {return DMDAVecRestoreKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_TRUE);}
4769dc7b89cSJunchao Zhang 
4779dc7b89cSJunchao Zhang #if !defined(KOKKOS_ENABLE_DEFAULT_DEVICE_TYPE_HOST) /* Get host views if the default memory space is not host space */
4789dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF         (DM,Vec,  ConstPetscScalarKokkosOffsetView2DHost*);
4799dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF     (DM,Vec,  ConstPetscScalarKokkosOffsetView2DHost*);
4809dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF         (DM da,Vec vec,PetscScalarKokkosOffsetView2DHost* ov) {return DMDAVecGetKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_FALSE);}
4819dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF     (DM da,Vec vec,PetscScalarKokkosOffsetView2DHost* ov) {return DMDAVecRestoreKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_FALSE);}
4829dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOFWrite    (DM da,Vec vec,PetscScalarKokkosOffsetView2DHost* ov) {return DMDAVecGetKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_TRUE);}
4839dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOFWrite(DM da,Vec vec,PetscScalarKokkosOffsetView2DHost* ov) {return DMDAVecRestoreKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_TRUE);}
4849dc7b89cSJunchao Zhang 
4859dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF         (DM,Vec,  ConstPetscScalarKokkosOffsetView3DHost*);
4869dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF     (DM,Vec,  ConstPetscScalarKokkosOffsetView3DHost*);
4879dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF         (DM da,Vec vec,PetscScalarKokkosOffsetView3DHost* ov) {return DMDAVecGetKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_FALSE);}
4889dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF     (DM da,Vec vec,PetscScalarKokkosOffsetView3DHost* ov) {return DMDAVecRestoreKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_FALSE);}
4899dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOFWrite    (DM da,Vec vec,PetscScalarKokkosOffsetView3DHost* ov) {return DMDAVecGetKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_TRUE);}
4909dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOFWrite(DM da,Vec vec,PetscScalarKokkosOffsetView3DHost* ov) {return DMDAVecRestoreKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_TRUE);}
4919dc7b89cSJunchao Zhang 
4929dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF         (DM,Vec,  ConstPetscScalarKokkosOffsetView4DHost*);
4939dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF     (DM,Vec,  ConstPetscScalarKokkosOffsetView4DHost*);
4949dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF         (DM da,Vec vec,PetscScalarKokkosOffsetView4DHost* ov) {return DMDAVecGetKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_FALSE);}
4959dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF     (DM da,Vec vec,PetscScalarKokkosOffsetView4DHost* ov) {return DMDAVecRestoreKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_FALSE);}
4969dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOFWrite    (DM da,Vec vec,PetscScalarKokkosOffsetView4DHost* ov) {return DMDAVecGetKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_TRUE);}
4979dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOFWrite(DM da,Vec vec,PetscScalarKokkosOffsetView4DHost* ov) {return DMDAVecRestoreKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_TRUE);}
4989dc7b89cSJunchao Zhang #endif
499