xref: /petsc/src/dm/impls/da/kokkos/dagetov.kokkos.cxx (revision ac09b9214d23ea9ad238aa607de9fa447fd4e91b)
1c6583b63SJunchao Zhang #include <petsc/private/vecimpl_kokkos.hpp>
2c6583b63SJunchao Zhang #include <petsc/private/dmdaimpl.h>
3c6583b63SJunchao Zhang #include <petscdmda_kokkos.hpp>
4c6583b63SJunchao Zhang 
5*ac09b921SBarry Smith /* SUBMANSEC = DMDA */
6*ac09b921SBarry Smith 
7*ac09b921SBarry 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) { \
16c6583b63SJunchao Zhang     gxm = xm; gym = ym; gzm = zm; \
17c6583b63SJunchao Zhang     gxs = xs; gys = ys; gzs = zs; \
1863a3b9bcSJacob 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); \
19c6583b63SJunchao Zhang } while (0)
20c6583b63SJunchao Zhang 
219dc7b89cSJunchao Zhang /* -------------------- 1D ---------------- */
22c6583b63SJunchao Zhang template<class MemorySpace>
23c6583b63SJunchao Zhang PetscErrorCode DMDAVecGetKokkosOffsetView_Private(DM da,Vec vec,PetscScalarKokkosOffsetView1DType<MemorySpace> *ov,PetscBool overwrite)
24c6583b63SJunchao Zhang {
25c6583b63SJunchao Zhang   PetscInt                               xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof;
26c6583b63SJunchao Zhang   PetscScalarKokkosViewType<MemorySpace> kv;
27c6583b63SJunchao Zhang 
28c6583b63SJunchao Zhang   PetscFunctionBegin;
29c6583b63SJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
30c6583b63SJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
31c6583b63SJunchao Zhang   PetscValidPointer(ov,3);
32c6583b63SJunchao Zhang   DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof);
339dc7b89cSJunchao Zhang   PetscCheck(dim == 1,PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"KokkosOffsetView is 1D but DMDA is %dD",(int)dim);
349566063dSJacob Faibussowitsch   if (overwrite) PetscCall(VecGetKokkosViewWrite(vec,&kv));
359566063dSJacob Faibussowitsch   else PetscCall(VecGetKokkosView(vec,&kv));
369dc7b89cSJunchao Zhang   /* Construct the unmanaged OffsetView with {begin0,begin1,begins2},{end0,end1,end2} */
379dc7b89cSJunchao Zhang   *ov  = PetscScalarKokkosOffsetView1DType<MemorySpace>(kv.data(),{gxs*dof},{(gxs+gxm)*dof});
38c6583b63SJunchao Zhang   PetscFunctionReturn(0);
39c6583b63SJunchao Zhang }
40c6583b63SJunchao Zhang 
41c6583b63SJunchao Zhang template<class MemorySpace>
42c6583b63SJunchao Zhang PetscErrorCode DMDAVecRestoreKokkosOffsetView_Private(DM da,Vec vec,PetscScalarKokkosOffsetView1DType<MemorySpace> *ov,PetscBool overwrite)
43c6583b63SJunchao Zhang {
44c6583b63SJunchao Zhang   PetscScalarKokkosViewType<MemorySpace> kv;
45c6583b63SJunchao Zhang 
46c6583b63SJunchao Zhang   PetscFunctionBegin;
47c6583b63SJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
48c6583b63SJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
49c6583b63SJunchao Zhang   PetscValidPointer(ov,3);
50c6583b63SJunchao Zhang   kv   = ov->view(); /* OffsetView to View */
519566063dSJacob Faibussowitsch   if (overwrite) PetscCall(VecRestoreKokkosViewWrite(vec,&kv));
529566063dSJacob Faibussowitsch   else PetscCall(VecRestoreKokkosView(vec,&kv));
53c6583b63SJunchao Zhang   PetscFunctionReturn(0);
54c6583b63SJunchao Zhang }
55c6583b63SJunchao Zhang 
56c6583b63SJunchao Zhang template<class MemorySpace>
57c6583b63SJunchao Zhang PetscErrorCode DMDAVecGetKokkosOffsetView(DM da,Vec vec,ConstPetscScalarKokkosOffsetView1DType<MemorySpace> *ov)
58c6583b63SJunchao Zhang {
59c6583b63SJunchao Zhang   PetscInt                                    xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof;
60c6583b63SJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace> kv;
61c6583b63SJunchao Zhang 
62c6583b63SJunchao Zhang   PetscFunctionBegin;
63c6583b63SJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
64c6583b63SJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
65c6583b63SJunchao Zhang   PetscValidPointer(ov,3);
66c6583b63SJunchao Zhang   DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof);
679dc7b89cSJunchao Zhang   PetscCheck(dim == 1,PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"KokkosOffsetView is 1D but DMDA is %dD",(int)dim);
689566063dSJacob Faibussowitsch   PetscCall(VecGetKokkosView(vec,&kv));
699dc7b89cSJunchao Zhang   *ov  = ConstPetscScalarKokkosOffsetView1DType<MemorySpace>(kv.data(),{gxs*dof},{(gxs+gxm)*dof});
70c6583b63SJunchao Zhang   PetscFunctionReturn(0);
71c6583b63SJunchao Zhang }
72c6583b63SJunchao Zhang 
73c6583b63SJunchao Zhang template<class MemorySpace>
74c6583b63SJunchao Zhang PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM da,Vec vec,ConstPetscScalarKokkosOffsetView1DType<MemorySpace> *ov)
75c6583b63SJunchao Zhang {
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>
89c6583b63SJunchao Zhang PetscErrorCode DMDAVecGetKokkosOffsetView_Private(DM da,Vec vec,PetscScalarKokkosOffsetView2DType<MemorySpace> *ov,PetscBool overwrite)
90c6583b63SJunchao Zhang {
91c6583b63SJunchao Zhang   PetscInt                               xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof;
92c6583b63SJunchao Zhang   PetscScalarKokkosViewType<MemorySpace> kv;
93c6583b63SJunchao Zhang 
94c6583b63SJunchao Zhang   PetscFunctionBegin;
95c6583b63SJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
96c6583b63SJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
97c6583b63SJunchao Zhang   PetscValidPointer(ov,3);
98c6583b63SJunchao Zhang   DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof);
999dc7b89cSJunchao Zhang   PetscCheck(dim == 2,PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"KokkosOffsetView is 2D but DMDA is %dD",(int)dim);
1009566063dSJacob Faibussowitsch   if (overwrite) PetscCall(VecGetKokkosViewWrite(vec,&kv));
1019566063dSJacob Faibussowitsch   else PetscCall(VecGetKokkosView(vec,&kv));
1029dc7b89cSJunchao Zhang   *ov  = PetscScalarKokkosOffsetView2DType<MemorySpace>(kv.data(),{gys*dof,gxs*dof},{(gys+gym)*dof,(gxs+gxm)*dof});
103c6583b63SJunchao Zhang   PetscFunctionReturn(0);
104c6583b63SJunchao Zhang }
105c6583b63SJunchao Zhang 
106c6583b63SJunchao Zhang template<class MemorySpace>
107c6583b63SJunchao Zhang PetscErrorCode DMDAVecRestoreKokkosOffsetView_Private(DM da,Vec vec,PetscScalarKokkosOffsetView2DType<MemorySpace> *ov,PetscBool overwrite)
108c6583b63SJunchao Zhang {
109c6583b63SJunchao Zhang   PetscScalarKokkosViewType<MemorySpace> kv;
110c6583b63SJunchao Zhang 
111c6583b63SJunchao Zhang   PetscFunctionBegin;
112c6583b63SJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
113c6583b63SJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
114c6583b63SJunchao Zhang   PetscValidPointer(ov,3);
115c6583b63SJunchao Zhang   // kv   = ov->view(); /* 2D OffsetView => 2D View => 1D View. Why does it not work? */
116c6583b63SJunchao Zhang   kv   = PetscScalarKokkosViewType<MemorySpace>(ov->data(),ov->extent(0)*ov->extent(1));
1179566063dSJacob Faibussowitsch   if (overwrite) PetscCall(VecRestoreKokkosViewWrite(vec,&kv));
1189566063dSJacob Faibussowitsch   else PetscCall(VecRestoreKokkosView(vec,&kv));
119c6583b63SJunchao Zhang   PetscFunctionReturn(0);
120c6583b63SJunchao Zhang }
121c6583b63SJunchao Zhang 
122c6583b63SJunchao Zhang template<class MemorySpace>
123c6583b63SJunchao Zhang PetscErrorCode DMDAVecGetKokkosOffsetView(DM da,Vec vec,ConstPetscScalarKokkosOffsetView2DType<MemorySpace> *ov)
124c6583b63SJunchao Zhang {
125c6583b63SJunchao Zhang   PetscInt                                    xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof;
126c6583b63SJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace> kv;
127c6583b63SJunchao Zhang 
128c6583b63SJunchao Zhang   PetscFunctionBegin;
129c6583b63SJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
130c6583b63SJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
131c6583b63SJunchao Zhang   PetscValidPointer(ov,3);
132c6583b63SJunchao Zhang   DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof);
1339dc7b89cSJunchao Zhang   PetscCheck(dim == 2,PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"KokkosOffsetView is 2D but DMDA is %dD",(int)dim);
1349566063dSJacob Faibussowitsch   PetscCall(VecGetKokkosView(vec,&kv));
1359dc7b89cSJunchao Zhang   *ov  = ConstPetscScalarKokkosOffsetView2DType<MemorySpace>(kv.data(),{gys*dof,gxs*dof},{(gys+gym)*dof,(gxs+gxm)*dof});
136c6583b63SJunchao Zhang   PetscFunctionReturn(0);
137c6583b63SJunchao Zhang }
138c6583b63SJunchao Zhang 
139c6583b63SJunchao Zhang template<class MemorySpace>
140c6583b63SJunchao Zhang PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM da,Vec vec,ConstPetscScalarKokkosOffsetView2DType<MemorySpace> *ov)
141c6583b63SJunchao Zhang {
142c6583b63SJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace> kv;
143c6583b63SJunchao Zhang 
144c6583b63SJunchao Zhang   PetscFunctionBegin;
145c6583b63SJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
146c6583b63SJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
147c6583b63SJunchao Zhang   PetscValidPointer(ov,3);
148c6583b63SJunchao Zhang   kv   = ConstPetscScalarKokkosViewType<MemorySpace>(ov->data(),ov->extent(0)*ov->extent(1));
1499566063dSJacob Faibussowitsch   PetscCall(VecRestoreKokkosView(vec,&kv));
150c6583b63SJunchao Zhang   PetscFunctionReturn(0);
151c6583b63SJunchao Zhang }
152c6583b63SJunchao Zhang 
1539dc7b89cSJunchao Zhang /* ============================== 3D ================================= */
1549dc7b89cSJunchao Zhang template<class MemorySpace>
1559dc7b89cSJunchao Zhang PetscErrorCode DMDAVecGetKokkosOffsetView_Private(DM da,Vec vec,PetscScalarKokkosOffsetView3DType<MemorySpace> *ov,PetscBool overwrite)
1569dc7b89cSJunchao Zhang {
1579dc7b89cSJunchao Zhang   PetscInt                                     xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof;
1589dc7b89cSJunchao Zhang   PetscScalarKokkosViewType<MemorySpace>       kv;
1599dc7b89cSJunchao Zhang 
1609dc7b89cSJunchao Zhang   PetscFunctionBegin;
1619dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
1629dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
1639dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
1649dc7b89cSJunchao Zhang   DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof);
1659dc7b89cSJunchao Zhang   PetscCheck(dim == 3,PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"KokkosOffsetView is 3D but DMDA is %dD",(int)dim);
1669566063dSJacob Faibussowitsch   if (overwrite) PetscCall(VecGetKokkosViewWrite(vec,&kv));
1679566063dSJacob Faibussowitsch   else PetscCall(VecGetKokkosView(vec,&kv));
1689dc7b89cSJunchao Zhang   *ov  = PetscScalarKokkosOffsetView3DType<MemorySpace>(kv.data(),{gzs*dof,gys*dof,gxs*dof},{(gzs+gzm)*dof,(gys+gym)*dof,(gxs+gxm)*dof});
1699dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
1709dc7b89cSJunchao Zhang }
1719dc7b89cSJunchao Zhang 
1729dc7b89cSJunchao Zhang template<class MemorySpace>
1739dc7b89cSJunchao Zhang PetscErrorCode DMDAVecRestoreKokkosOffsetView_Private(DM da,Vec vec,PetscScalarKokkosOffsetView3DType<MemorySpace> *ov,PetscBool overwrite)
1749dc7b89cSJunchao Zhang {
1759dc7b89cSJunchao Zhang   PetscScalarKokkosViewType<MemorySpace>     kv;
1769dc7b89cSJunchao Zhang 
1779dc7b89cSJunchao Zhang   PetscFunctionBegin;
1789dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
1799dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
1809dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
1819dc7b89cSJunchao Zhang   kv   = PetscScalarKokkosViewType<MemorySpace>(ov->data(),ov->extent(0)*ov->extent(1)*ov->extent(2));
1829566063dSJacob Faibussowitsch   if (overwrite) PetscCall(VecRestoreKokkosViewWrite(vec,&kv));
1839566063dSJacob Faibussowitsch   else PetscCall(VecRestoreKokkosView(vec,&kv));
1849dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
1859dc7b89cSJunchao Zhang }
1869dc7b89cSJunchao Zhang 
1879dc7b89cSJunchao Zhang template<class MemorySpace>
1889dc7b89cSJunchao Zhang PetscErrorCode DMDAVecGetKokkosOffsetView(DM da,Vec vec,ConstPetscScalarKokkosOffsetView3DType<MemorySpace> *ov)
1899dc7b89cSJunchao Zhang {
1909dc7b89cSJunchao Zhang   PetscInt                                     xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof;
1919dc7b89cSJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace>  kv;
1929dc7b89cSJunchao Zhang 
1939dc7b89cSJunchao Zhang   PetscFunctionBegin;
1949dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
1959dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
1969dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
1979dc7b89cSJunchao Zhang   DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof);
1989dc7b89cSJunchao Zhang   PetscCheck(dim == 3,PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"KokkosOffsetView is 3D but DMDA is %dD",(int)dim);
1999566063dSJacob Faibussowitsch   PetscCall(VecGetKokkosView(vec,&kv));
2009dc7b89cSJunchao Zhang   *ov  = ConstPetscScalarKokkosOffsetView3DType<MemorySpace>(kv.data(),{gzs*dof,gys*dof,gxs*dof},{(gzs+gzm)*dof,(gys+gym)*dof,(gxs+gxm)*dof});
2019dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
2029dc7b89cSJunchao Zhang }
2039dc7b89cSJunchao Zhang 
2049dc7b89cSJunchao Zhang template<class MemorySpace>
2059dc7b89cSJunchao Zhang PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM da,Vec vec,ConstPetscScalarKokkosOffsetView3DType<MemorySpace> *ov)
2069dc7b89cSJunchao Zhang {
2079dc7b89cSJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace>  kv;
2089dc7b89cSJunchao Zhang 
2099dc7b89cSJunchao Zhang   PetscFunctionBegin;
2109dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
2119dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
2129dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
2139dc7b89cSJunchao Zhang   kv   = ConstPetscScalarKokkosViewType<MemorySpace>(ov->data(),ov->extent(0)*ov->extent(1)*ov->extent(2));
2149566063dSJacob Faibussowitsch   PetscCall(VecRestoreKokkosView(vec,&kv));
2159dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
2169dc7b89cSJunchao Zhang }
2179dc7b89cSJunchao Zhang 
218c6583b63SJunchao Zhang /* Function template explicit instantiation */
219c6583b63SJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView         (DM,Vec,  ConstPetscScalarKokkosOffsetView1D*);
220c6583b63SJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView     (DM,Vec,  ConstPetscScalarKokkosOffsetView1D*);
221c6583b63SJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView         (DM da,Vec vec,PetscScalarKokkosOffsetView1D* ov) {return DMDAVecGetKokkosOffsetView_Private(da,vec,ov,PETSC_FALSE);}
222c6583b63SJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView     (DM da,Vec vec,PetscScalarKokkosOffsetView1D* ov) {return DMDAVecRestoreKokkosOffsetView_Private(da,vec,ov,PETSC_FALSE);}
223c6583b63SJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewWrite    (DM da,Vec vec,PetscScalarKokkosOffsetView1D* ov) {return DMDAVecGetKokkosOffsetView_Private(da,vec,ov,PETSC_TRUE);}
224c6583b63SJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewWrite(DM da,Vec vec,PetscScalarKokkosOffsetView1D* ov) {return DMDAVecRestoreKokkosOffsetView_Private(da,vec,ov,PETSC_TRUE);}
225c6583b63SJunchao Zhang 
226c6583b63SJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView         (DM,Vec,  ConstPetscScalarKokkosOffsetView2D*);
227c6583b63SJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView     (DM,Vec,  ConstPetscScalarKokkosOffsetView2D*);
228c6583b63SJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView         (DM da,Vec vec,PetscScalarKokkosOffsetView2D* ov) {return DMDAVecGetKokkosOffsetView_Private(da,vec,ov,PETSC_FALSE);}
229c6583b63SJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView     (DM da,Vec vec,PetscScalarKokkosOffsetView2D* ov) {return DMDAVecRestoreKokkosOffsetView_Private(da,vec,ov,PETSC_FALSE);}
230c6583b63SJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewWrite    (DM da,Vec vec,PetscScalarKokkosOffsetView2D* ov) {return DMDAVecGetKokkosOffsetView_Private(da,vec,ov,PETSC_TRUE);}
231c6583b63SJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewWrite(DM da,Vec vec,PetscScalarKokkosOffsetView2D* ov) {return DMDAVecRestoreKokkosOffsetView_Private(da,vec,ov,PETSC_TRUE);}
232c6583b63SJunchao Zhang 
2339dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView         (DM,Vec,  ConstPetscScalarKokkosOffsetView3D*);
2349dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView     (DM,Vec,  ConstPetscScalarKokkosOffsetView3D*);
2359dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView         (DM da,Vec vec,PetscScalarKokkosOffsetView3D* ov) {return DMDAVecGetKokkosOffsetView_Private(da,vec,ov,PETSC_FALSE);}
2369dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView     (DM da,Vec vec,PetscScalarKokkosOffsetView3D* ov) {return DMDAVecRestoreKokkosOffsetView_Private(da,vec,ov,PETSC_FALSE);}
2379dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewWrite    (DM da,Vec vec,PetscScalarKokkosOffsetView3D* ov) {return DMDAVecGetKokkosOffsetView_Private(da,vec,ov,PETSC_TRUE);}
2389dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewWrite(DM da,Vec vec,PetscScalarKokkosOffsetView3D* ov) {return DMDAVecRestoreKokkosOffsetView_Private(da,vec,ov,PETSC_TRUE);}
2399dc7b89cSJunchao Zhang 
2409dc7b89cSJunchao Zhang #if !defined(KOKKOS_ENABLE_DEFAULT_DEVICE_TYPE_HOST) /* Get host views if the default memory space is not host space */
2419dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView         (DM,Vec,  ConstPetscScalarKokkosOffsetView1DHost*);
2429dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView     (DM,Vec,  ConstPetscScalarKokkosOffsetView1DHost*);
2439dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView         (DM da,Vec vec,PetscScalarKokkosOffsetView1DHost* ov) {return DMDAVecGetKokkosOffsetView_Private(da,vec,ov,PETSC_FALSE);}
2449dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView     (DM da,Vec vec,PetscScalarKokkosOffsetView1DHost* ov) {return DMDAVecRestoreKokkosOffsetView_Private(da,vec,ov,PETSC_FALSE);}
2459dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewWrite    (DM da,Vec vec,PetscScalarKokkosOffsetView1DHost* ov) {return DMDAVecGetKokkosOffsetView_Private(da,vec,ov,PETSC_TRUE);}
2469dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewWrite(DM da,Vec vec,PetscScalarKokkosOffsetView1DHost* ov) {return DMDAVecRestoreKokkosOffsetView_Private(da,vec,ov,PETSC_TRUE);}
2479dc7b89cSJunchao Zhang 
2489dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView         (DM,Vec,  ConstPetscScalarKokkosOffsetView2DHost*);
2499dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView     (DM,Vec,  ConstPetscScalarKokkosOffsetView2DHost*);
2509dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView         (DM da,Vec vec,PetscScalarKokkosOffsetView2DHost* ov) {return DMDAVecGetKokkosOffsetView_Private(da,vec,ov,PETSC_FALSE);}
2519dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView     (DM da,Vec vec,PetscScalarKokkosOffsetView2DHost* ov) {return DMDAVecRestoreKokkosOffsetView_Private(da,vec,ov,PETSC_FALSE);}
2529dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewWrite    (DM da,Vec vec,PetscScalarKokkosOffsetView2DHost* ov) {return DMDAVecGetKokkosOffsetView_Private(da,vec,ov,PETSC_TRUE);}
2539dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewWrite(DM da,Vec vec,PetscScalarKokkosOffsetView2DHost* ov) {return DMDAVecRestoreKokkosOffsetView_Private(da,vec,ov,PETSC_TRUE);}
2549dc7b89cSJunchao Zhang 
2559dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView         (DM,Vec,  ConstPetscScalarKokkosOffsetView3DHost*);
2569dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView     (DM,Vec,  ConstPetscScalarKokkosOffsetView3DHost*);
2579dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView         (DM da,Vec vec,PetscScalarKokkosOffsetView3DHost* ov) {return DMDAVecGetKokkosOffsetView_Private(da,vec,ov,PETSC_FALSE);}
2589dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView     (DM da,Vec vec,PetscScalarKokkosOffsetView3DHost* ov) {return DMDAVecRestoreKokkosOffsetView_Private(da,vec,ov,PETSC_FALSE);}
2599dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewWrite    (DM da,Vec vec,PetscScalarKokkosOffsetView3DHost* ov) {return DMDAVecGetKokkosOffsetView_Private(da,vec,ov,PETSC_TRUE);}
2609dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewWrite(DM da,Vec vec,PetscScalarKokkosOffsetView3DHost* ov) {return DMDAVecRestoreKokkosOffsetView_Private(da,vec,ov,PETSC_TRUE);}
2619dc7b89cSJunchao Zhang #endif
2629dc7b89cSJunchao Zhang 
2639dc7b89cSJunchao Zhang /* ============================== 2D including DOF ================================= */
2649dc7b89cSJunchao Zhang template<class MemorySpace>
2659dc7b89cSJunchao Zhang PetscErrorCode DMDAVecGetKokkosOffsetViewDOF_Private(DM da,Vec vec,PetscScalarKokkosOffsetView2DType<MemorySpace> *ov,PetscBool overwrite)
2669dc7b89cSJunchao Zhang {
2679dc7b89cSJunchao Zhang   PetscInt                                     xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof;
2689dc7b89cSJunchao Zhang   PetscScalarKokkosViewType<MemorySpace>       kv;
2699dc7b89cSJunchao Zhang 
2709dc7b89cSJunchao Zhang   PetscFunctionBegin;
2719dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
2729dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
2739dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
2749dc7b89cSJunchao Zhang   DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof);
2759dc7b89cSJunchao Zhang   PetscCheck(dim == 1,PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"KokkosOffsetView is 2D but DMDA is %dD",(int)dim);
2769566063dSJacob Faibussowitsch   if (overwrite) PetscCall(VecGetKokkosViewWrite(vec,&kv));
2779566063dSJacob Faibussowitsch   else PetscCall(VecGetKokkosView(vec,&kv));
2789dc7b89cSJunchao Zhang   *ov  = PetscScalarKokkosOffsetView2DType<MemorySpace>(kv.data(),{gxs,0},{gxs+gxm,dof});
2799dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
2809dc7b89cSJunchao Zhang }
2819dc7b89cSJunchao Zhang 
2829dc7b89cSJunchao Zhang template<class MemorySpace>
2839dc7b89cSJunchao Zhang PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF_Private(DM da,Vec vec,PetscScalarKokkosOffsetView2DType<MemorySpace> *ov,PetscBool overwrite)
2849dc7b89cSJunchao Zhang {
2859dc7b89cSJunchao Zhang   PetscScalarKokkosViewType<MemorySpace>     kv;
2869dc7b89cSJunchao Zhang 
2879dc7b89cSJunchao Zhang   PetscFunctionBegin;
2889dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
2899dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
2909dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
2919dc7b89cSJunchao Zhang   kv   = PetscScalarKokkosViewType<MemorySpace>(ov->data(),ov->extent(0)*ov->extent(1));
2929566063dSJacob Faibussowitsch   if (overwrite) PetscCall(VecRestoreKokkosViewWrite(vec,&kv));
2939566063dSJacob Faibussowitsch   else PetscCall(VecRestoreKokkosView(vec,&kv));
2949dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
2959dc7b89cSJunchao Zhang }
2969dc7b89cSJunchao Zhang 
2979dc7b89cSJunchao Zhang template<class MemorySpace>
2989dc7b89cSJunchao Zhang PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM da,Vec vec,ConstPetscScalarKokkosOffsetView2DType<MemorySpace> *ov)
2999dc7b89cSJunchao Zhang {
3009dc7b89cSJunchao Zhang   PetscInt                                     xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof;
3019dc7b89cSJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace>  kv;
3029dc7b89cSJunchao Zhang 
3039dc7b89cSJunchao Zhang   PetscFunctionBegin;
3049dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
3059dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
3069dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
3079dc7b89cSJunchao Zhang   DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof);
3089dc7b89cSJunchao Zhang   PetscCheck(dim == 1,PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"KokkosOffsetView is 2D but DMDA is %dD",(int)dim);
3099566063dSJacob Faibussowitsch   PetscCall(VecGetKokkosView(vec,&kv));
3109dc7b89cSJunchao Zhang   *ov  = ConstPetscScalarKokkosOffsetView2DType<MemorySpace>(kv.data(),{gxs,0},{gxs+gxm,dof});
3119dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
3129dc7b89cSJunchao Zhang }
3139dc7b89cSJunchao Zhang 
3149dc7b89cSJunchao Zhang template<class MemorySpace>
3159dc7b89cSJunchao Zhang PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM da,Vec vec,ConstPetscScalarKokkosOffsetView2DType<MemorySpace> *ov)
3169dc7b89cSJunchao Zhang {
3179dc7b89cSJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace>  kv;
3189dc7b89cSJunchao Zhang 
3199dc7b89cSJunchao Zhang   PetscFunctionBegin;
3209dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
3219dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
3229dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
3239dc7b89cSJunchao Zhang   kv   = ConstPetscScalarKokkosViewType<MemorySpace>(ov->data(),ov->extent(0)*ov->extent(1));
3249566063dSJacob Faibussowitsch   PetscCall(VecRestoreKokkosView(vec,&kv));
3259dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
3269dc7b89cSJunchao Zhang }
3279dc7b89cSJunchao Zhang 
3289dc7b89cSJunchao Zhang /* ============================== 3D including DOF ================================= */
3299dc7b89cSJunchao Zhang template<class MemorySpace>
3309dc7b89cSJunchao Zhang PetscErrorCode DMDAVecGetKokkosOffsetViewDOF_Private(DM da,Vec vec,PetscScalarKokkosOffsetView3DType<MemorySpace> *ov,PetscBool overwrite)
3319dc7b89cSJunchao Zhang {
3329dc7b89cSJunchao Zhang   PetscInt                                     xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof;
3339dc7b89cSJunchao Zhang   PetscScalarKokkosViewType<MemorySpace>       kv;
3349dc7b89cSJunchao Zhang 
3359dc7b89cSJunchao Zhang   PetscFunctionBegin;
3369dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
3379dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
3389dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
3399dc7b89cSJunchao Zhang   DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof);
3409dc7b89cSJunchao Zhang   PetscCheck(dim == 2,PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"KokkosOffsetView is 3D but DMDA is %dD",(int)dim);
3419566063dSJacob Faibussowitsch   if (overwrite) PetscCall(VecGetKokkosViewWrite(vec,&kv));
3429566063dSJacob Faibussowitsch   else PetscCall(VecGetKokkosView(vec,&kv));
3439dc7b89cSJunchao Zhang   *ov  = PetscScalarKokkosOffsetView3DType<MemorySpace>(kv.data(),{gys,gxs,0},{gys+gym,gxs+gxm,dof});
3449dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
3459dc7b89cSJunchao Zhang }
3469dc7b89cSJunchao Zhang 
3479dc7b89cSJunchao Zhang template<class MemorySpace>
3489dc7b89cSJunchao Zhang PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF_Private(DM da,Vec vec,PetscScalarKokkosOffsetView3DType<MemorySpace> *ov,PetscBool overwrite)
3499dc7b89cSJunchao Zhang {
3509dc7b89cSJunchao Zhang   PetscScalarKokkosViewType<MemorySpace>     kv;
3519dc7b89cSJunchao Zhang 
3529dc7b89cSJunchao Zhang   PetscFunctionBegin;
3539dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
3549dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
3559dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
3569dc7b89cSJunchao Zhang   kv   = PetscScalarKokkosViewType<MemorySpace>(ov->data(),ov->extent(0)*ov->extent(1)*ov->extent(2));
3579566063dSJacob Faibussowitsch   if (overwrite) PetscCall(VecRestoreKokkosViewWrite(vec,&kv));
3589566063dSJacob Faibussowitsch   else PetscCall(VecRestoreKokkosView(vec,&kv));
3599dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
3609dc7b89cSJunchao Zhang }
3619dc7b89cSJunchao Zhang 
3629dc7b89cSJunchao Zhang template<class MemorySpace>
3639dc7b89cSJunchao Zhang PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM da,Vec vec,ConstPetscScalarKokkosOffsetView3DType<MemorySpace> *ov)
3649dc7b89cSJunchao Zhang {
3659dc7b89cSJunchao Zhang   PetscInt                                     xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof;
3669dc7b89cSJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace>  kv;
3679dc7b89cSJunchao Zhang 
3689dc7b89cSJunchao Zhang   PetscFunctionBegin;
3699dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
3709dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
3719dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
3729dc7b89cSJunchao Zhang   DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof);
3739dc7b89cSJunchao Zhang   PetscCheck(dim == 2,PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"KokkosOffsetView is 3D but DMDA is %dD",(int)dim);
3749566063dSJacob Faibussowitsch   PetscCall(VecGetKokkosView(vec,&kv));
3759dc7b89cSJunchao Zhang   *ov  = ConstPetscScalarKokkosOffsetView3DType<MemorySpace>(kv.data(),{gys,gxs,0},{gys+gym,gxs+gxm,dof});
3769dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
3779dc7b89cSJunchao Zhang }
3789dc7b89cSJunchao Zhang 
3799dc7b89cSJunchao Zhang template<class MemorySpace>
3809dc7b89cSJunchao Zhang PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM da,Vec vec,ConstPetscScalarKokkosOffsetView3DType<MemorySpace> *ov)
3819dc7b89cSJunchao Zhang {
3829dc7b89cSJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace>  kv;
3839dc7b89cSJunchao Zhang 
3849dc7b89cSJunchao Zhang   PetscFunctionBegin;
3859dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
3869dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
3879dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
3889dc7b89cSJunchao Zhang   kv   = ConstPetscScalarKokkosViewType<MemorySpace>(ov->data(),ov->extent(0)*ov->extent(1)*ov->extent(2));
3899566063dSJacob Faibussowitsch   PetscCall(VecRestoreKokkosView(vec,&kv));
3909dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
3919dc7b89cSJunchao Zhang }
3929dc7b89cSJunchao Zhang 
3939dc7b89cSJunchao Zhang /* ============================== 4D including DOF ================================= */
3949dc7b89cSJunchao Zhang template<class MemorySpace>
3959dc7b89cSJunchao Zhang PetscErrorCode DMDAVecGetKokkosOffsetViewDOF_Private(DM da,Vec vec,PetscScalarKokkosOffsetView4DType<MemorySpace> *ov,PetscBool overwrite)
3969dc7b89cSJunchao Zhang {
3979dc7b89cSJunchao Zhang   PetscInt                                     xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof;
3989dc7b89cSJunchao Zhang   PetscScalarKokkosViewType<MemorySpace>       kv;
3999dc7b89cSJunchao Zhang 
4009dc7b89cSJunchao Zhang   PetscFunctionBegin;
4019dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
4029dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
4039dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
4049dc7b89cSJunchao Zhang   DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof);
4059dc7b89cSJunchao Zhang   PetscCheck(dim == 3,PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"KokkosOffsetView is 4D but DMDA is %dD",(int)dim);
4069566063dSJacob Faibussowitsch   if (overwrite) PetscCall(VecGetKokkosViewWrite(vec,&kv));
4079566063dSJacob Faibussowitsch   else PetscCall(VecGetKokkosView(vec,&kv));
4089dc7b89cSJunchao Zhang   *ov  = PetscScalarKokkosOffsetView4DType<MemorySpace>(kv.data(),{gzs,gys,gxs,0},{gzs+gzm,gys+gym,gxs+gxm,dof});
4099dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
4109dc7b89cSJunchao Zhang }
4119dc7b89cSJunchao Zhang 
4129dc7b89cSJunchao Zhang template<class MemorySpace>
4139dc7b89cSJunchao Zhang PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF_Private(DM da,Vec vec,PetscScalarKokkosOffsetView4DType<MemorySpace> *ov,PetscBool overwrite)
4149dc7b89cSJunchao Zhang {
4159dc7b89cSJunchao Zhang   PetscScalarKokkosViewType<MemorySpace>     kv;
4169dc7b89cSJunchao Zhang 
4179dc7b89cSJunchao Zhang   PetscFunctionBegin;
4189dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
4199dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
4209dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
4219dc7b89cSJunchao Zhang   kv   = PetscScalarKokkosViewType<MemorySpace>(ov->data(),ov->extent(0)*ov->extent(1)*ov->extent(2)*ov->extent(3));
4229566063dSJacob Faibussowitsch   if (overwrite) PetscCall(VecRestoreKokkosViewWrite(vec,&kv));
4239566063dSJacob Faibussowitsch   else PetscCall(VecRestoreKokkosView(vec,&kv));
4249dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
4259dc7b89cSJunchao Zhang }
4269dc7b89cSJunchao Zhang 
4279dc7b89cSJunchao Zhang template<class MemorySpace>
4289dc7b89cSJunchao Zhang PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM da,Vec vec,ConstPetscScalarKokkosOffsetView4DType<MemorySpace> *ov)
4299dc7b89cSJunchao Zhang {
4309dc7b89cSJunchao Zhang   PetscInt                                     xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof;
4319dc7b89cSJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace>  kv;
4329dc7b89cSJunchao Zhang 
4339dc7b89cSJunchao Zhang   PetscFunctionBegin;
4349dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
4359dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
4369dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
4379dc7b89cSJunchao Zhang   DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof);
4389dc7b89cSJunchao Zhang   PetscCheck(dim == 3,PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"KokkosOffsetView is 4D but DMDA is %dD",(int)dim);
4399566063dSJacob Faibussowitsch   PetscCall(VecGetKokkosView(vec,&kv));
4409dc7b89cSJunchao Zhang   *ov  = ConstPetscScalarKokkosOffsetView4DType<MemorySpace>(kv.data(),{gzs,gys,gxs,0},{gzs+gzm,gys+gym,gxs+gxm,dof});
4419dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
4429dc7b89cSJunchao Zhang }
4439dc7b89cSJunchao Zhang 
4449dc7b89cSJunchao Zhang template<class MemorySpace>
4459dc7b89cSJunchao Zhang PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM da,Vec vec,ConstPetscScalarKokkosOffsetView4DType<MemorySpace> *ov)
4469dc7b89cSJunchao Zhang {
4479dc7b89cSJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace>  kv;
4489dc7b89cSJunchao Zhang 
4499dc7b89cSJunchao Zhang   PetscFunctionBegin;
4509dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
4519dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
4529dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
4539dc7b89cSJunchao Zhang   kv   = ConstPetscScalarKokkosViewType<MemorySpace>(ov->data(),ov->extent(0)*ov->extent(1)*ov->extent(2)*ov->extent(3));
4549566063dSJacob Faibussowitsch   PetscCall(VecRestoreKokkosView(vec,&kv));
4559dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
4569dc7b89cSJunchao Zhang }
4579dc7b89cSJunchao Zhang 
4589dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF         (DM,Vec,  ConstPetscScalarKokkosOffsetView2D*);
4599dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF     (DM,Vec,  ConstPetscScalarKokkosOffsetView2D*);
4609dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF         (DM da,Vec vec,PetscScalarKokkosOffsetView2D* ov) {return DMDAVecGetKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_FALSE);}
4619dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF     (DM da,Vec vec,PetscScalarKokkosOffsetView2D* ov) {return DMDAVecRestoreKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_FALSE);}
4629dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOFWrite    (DM da,Vec vec,PetscScalarKokkosOffsetView2D* ov) {return DMDAVecGetKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_TRUE);}
4639dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOFWrite(DM da,Vec vec,PetscScalarKokkosOffsetView2D* ov) {return DMDAVecRestoreKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_TRUE);}
4649dc7b89cSJunchao Zhang 
4659dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF         (DM,Vec,  ConstPetscScalarKokkosOffsetView3D*);
4669dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF     (DM,Vec,  ConstPetscScalarKokkosOffsetView3D*);
4679dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF         (DM da,Vec vec,PetscScalarKokkosOffsetView3D* ov) {return DMDAVecGetKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_FALSE);}
4689dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF     (DM da,Vec vec,PetscScalarKokkosOffsetView3D* ov) {return DMDAVecRestoreKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_FALSE);}
4699dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOFWrite    (DM da,Vec vec,PetscScalarKokkosOffsetView3D* ov) {return DMDAVecGetKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_TRUE);}
4709dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOFWrite(DM da,Vec vec,PetscScalarKokkosOffsetView3D* ov) {return DMDAVecRestoreKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_TRUE);}
4719dc7b89cSJunchao Zhang 
4729dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF         (DM,Vec,  ConstPetscScalarKokkosOffsetView4D*);
4739dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF     (DM,Vec,  ConstPetscScalarKokkosOffsetView4D*);
4749dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF         (DM da,Vec vec,PetscScalarKokkosOffsetView4D* ov) {return DMDAVecGetKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_FALSE);}
4759dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF     (DM da,Vec vec,PetscScalarKokkosOffsetView4D* ov) {return DMDAVecRestoreKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_FALSE);}
4769dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOFWrite    (DM da,Vec vec,PetscScalarKokkosOffsetView4D* ov) {return DMDAVecGetKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_TRUE);}
4779dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOFWrite(DM da,Vec vec,PetscScalarKokkosOffsetView4D* ov) {return DMDAVecRestoreKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_TRUE);}
4789dc7b89cSJunchao Zhang 
4799dc7b89cSJunchao Zhang #if !defined(KOKKOS_ENABLE_DEFAULT_DEVICE_TYPE_HOST) /* Get host views if the default memory space is not host space */
4809dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF         (DM,Vec,  ConstPetscScalarKokkosOffsetView2DHost*);
4819dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF     (DM,Vec,  ConstPetscScalarKokkosOffsetView2DHost*);
4829dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF         (DM da,Vec vec,PetscScalarKokkosOffsetView2DHost* ov) {return DMDAVecGetKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_FALSE);}
4839dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF     (DM da,Vec vec,PetscScalarKokkosOffsetView2DHost* ov) {return DMDAVecRestoreKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_FALSE);}
4849dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOFWrite    (DM da,Vec vec,PetscScalarKokkosOffsetView2DHost* ov) {return DMDAVecGetKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_TRUE);}
4859dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOFWrite(DM da,Vec vec,PetscScalarKokkosOffsetView2DHost* ov) {return DMDAVecRestoreKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_TRUE);}
4869dc7b89cSJunchao Zhang 
4879dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF         (DM,Vec,  ConstPetscScalarKokkosOffsetView3DHost*);
4889dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF     (DM,Vec,  ConstPetscScalarKokkosOffsetView3DHost*);
4899dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF         (DM da,Vec vec,PetscScalarKokkosOffsetView3DHost* ov) {return DMDAVecGetKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_FALSE);}
4909dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF     (DM da,Vec vec,PetscScalarKokkosOffsetView3DHost* ov) {return DMDAVecRestoreKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_FALSE);}
4919dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOFWrite    (DM da,Vec vec,PetscScalarKokkosOffsetView3DHost* ov) {return DMDAVecGetKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_TRUE);}
4929dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOFWrite(DM da,Vec vec,PetscScalarKokkosOffsetView3DHost* ov) {return DMDAVecRestoreKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_TRUE);}
4939dc7b89cSJunchao Zhang 
4949dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF         (DM,Vec,  ConstPetscScalarKokkosOffsetView4DHost*);
4959dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF     (DM,Vec,  ConstPetscScalarKokkosOffsetView4DHost*);
4969dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF         (DM da,Vec vec,PetscScalarKokkosOffsetView4DHost* ov) {return DMDAVecGetKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_FALSE);}
4979dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF     (DM da,Vec vec,PetscScalarKokkosOffsetView4DHost* ov) {return DMDAVecRestoreKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_FALSE);}
4989dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOFWrite    (DM da,Vec vec,PetscScalarKokkosOffsetView4DHost* ov) {return DMDAVecGetKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_TRUE);}
4999dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOFWrite(DM da,Vec vec,PetscScalarKokkosOffsetView4DHost* ov) {return DMDAVecRestoreKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_TRUE);}
5009dc7b89cSJunchao Zhang #endif
501