xref: /petsc/src/dm/impls/da/kokkos/dagetov.kokkos.cxx (revision 9dc7b89c67bc73276ac9486e039061dd02e08fe5)
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 { \
8c6583b63SJunchao Zhang   PetscErrorCode ierr; \
9c6583b63SJunchao Zhang   ierr = DMDAGetCorners(da,&xs,&ys,&zs,&xm,&ym,&zm);CHKERRQ(ierr); \
10c6583b63SJunchao Zhang   ierr = DMDAGetGhostCorners(da,&gxs,&gys,&gzs,&gxm,&gym,&gzm);CHKERRQ(ierr); \
11c6583b63SJunchao Zhang   ierr = DMDAGetInfo(da,&dim,NULL,NULL,NULL,NULL,NULL,NULL,&dof,NULL,NULL,NULL,NULL,NULL);CHKERRQ(ierr); \
12c6583b63SJunchao Zhang   /* Handle case where user passes in global vector as opposed to local */ \
13c6583b63SJunchao Zhang   ierr = VecGetLocalSize(vec,&N);CHKERRQ(ierr); \
14c6583b63SJunchao Zhang   if (N == xm*ym*zm*dof) { \
15c6583b63SJunchao Zhang     gxm = xm; gym = ym; gzm = zm; \
16c6583b63SJunchao Zhang     gxs = xs; gys = ys; gzs = zs; \
17*9dc7b89cSJunchao 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); \
18c6583b63SJunchao Zhang } while (0)
19c6583b63SJunchao Zhang 
20*9dc7b89cSJunchao Zhang /* -------------------- 1D ---------------- */
21c6583b63SJunchao Zhang template<class MemorySpace>
22c6583b63SJunchao Zhang PetscErrorCode DMDAVecGetKokkosOffsetView_Private(DM da,Vec vec,PetscScalarKokkosOffsetView1DType<MemorySpace> *ov,PetscBool overwrite)
23c6583b63SJunchao Zhang {
24c6583b63SJunchao Zhang   PetscErrorCode                               ierr;
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);
33*9dc7b89cSJunchao Zhang   PetscCheck(dim == 1,PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"KokkosOffsetView is 1D but DMDA is %dD",(int)dim);
34c6583b63SJunchao Zhang   if (overwrite) {ierr = VecGetKokkosViewWrite(vec,&kv);CHKERRQ(ierr);}
35c6583b63SJunchao Zhang   else {ierr = VecGetKokkosView(vec,&kv);CHKERRQ(ierr);}
36*9dc7b89cSJunchao Zhang   /* Construct the unmanaged OffsetView with {begin0,begin1,begins2},{end0,end1,end2} */
37*9dc7b89cSJunchao 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   PetscErrorCode                               ierr;
45c6583b63SJunchao Zhang   PetscScalarKokkosViewType<MemorySpace>       kv;
46c6583b63SJunchao Zhang 
47c6583b63SJunchao Zhang   PetscFunctionBegin;
48c6583b63SJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
49c6583b63SJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
50c6583b63SJunchao Zhang   PetscValidPointer(ov,3);
51c6583b63SJunchao Zhang   kv   = ov->view(); /* OffsetView to View */
52c6583b63SJunchao Zhang   if (overwrite) {ierr = VecRestoreKokkosViewWrite(vec,&kv);CHKERRQ(ierr);}
53c6583b63SJunchao Zhang   else {ierr = VecRestoreKokkosView(vec,&kv);CHKERRQ(ierr);}
54c6583b63SJunchao Zhang   PetscFunctionReturn(0);
55c6583b63SJunchao Zhang }
56c6583b63SJunchao Zhang 
57c6583b63SJunchao Zhang template<class MemorySpace>
58c6583b63SJunchao Zhang PetscErrorCode DMDAVecGetKokkosOffsetView(DM da,Vec vec,ConstPetscScalarKokkosOffsetView1DType<MemorySpace> *ov)
59c6583b63SJunchao Zhang {
60c6583b63SJunchao Zhang   PetscErrorCode                               ierr;
61c6583b63SJunchao Zhang   PetscInt                                     xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof;
62c6583b63SJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace>  kv;
63c6583b63SJunchao Zhang 
64c6583b63SJunchao Zhang   PetscFunctionBegin;
65c6583b63SJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
66c6583b63SJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
67c6583b63SJunchao Zhang   PetscValidPointer(ov,3);
68c6583b63SJunchao Zhang   DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof);
69*9dc7b89cSJunchao Zhang   PetscCheck(dim == 1,PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"KokkosOffsetView is 1D but DMDA is %dD",(int)dim);
70c6583b63SJunchao Zhang   ierr = VecGetKokkosView(vec,&kv);CHKERRQ(ierr);
71*9dc7b89cSJunchao Zhang   *ov  = ConstPetscScalarKokkosOffsetView1DType<MemorySpace>(kv.data(),{gxs*dof},{(gxs+gxm)*dof});
72c6583b63SJunchao Zhang   PetscFunctionReturn(0);
73c6583b63SJunchao Zhang }
74c6583b63SJunchao Zhang 
75c6583b63SJunchao Zhang template<class MemorySpace>
76c6583b63SJunchao Zhang PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM da,Vec vec,ConstPetscScalarKokkosOffsetView1DType<MemorySpace> *ov)
77c6583b63SJunchao Zhang {
78c6583b63SJunchao Zhang   PetscErrorCode                               ierr;
79c6583b63SJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace>  kv;
80c6583b63SJunchao Zhang 
81c6583b63SJunchao Zhang   PetscFunctionBegin;
82c6583b63SJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
83c6583b63SJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
84c6583b63SJunchao Zhang   PetscValidPointer(ov,3);
85c6583b63SJunchao Zhang   kv   = ov->view();
86c6583b63SJunchao Zhang   ierr = VecRestoreKokkosView(vec,&kv);CHKERRQ(ierr);
87c6583b63SJunchao Zhang   PetscFunctionReturn(0);
88c6583b63SJunchao Zhang }
89c6583b63SJunchao Zhang 
90*9dc7b89cSJunchao Zhang /* ============================== 2D ================================= */
91c6583b63SJunchao Zhang template<class MemorySpace>
92c6583b63SJunchao Zhang PetscErrorCode DMDAVecGetKokkosOffsetView_Private(DM da,Vec vec,PetscScalarKokkosOffsetView2DType<MemorySpace> *ov,PetscBool overwrite)
93c6583b63SJunchao Zhang {
94c6583b63SJunchao Zhang   PetscErrorCode                               ierr;
95c6583b63SJunchao Zhang   PetscInt                                     xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof;
96c6583b63SJunchao Zhang   PetscScalarKokkosViewType<MemorySpace>       kv;
97c6583b63SJunchao Zhang 
98c6583b63SJunchao Zhang   PetscFunctionBegin;
99c6583b63SJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
100c6583b63SJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
101c6583b63SJunchao Zhang   PetscValidPointer(ov,3);
102c6583b63SJunchao Zhang   DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof);
103*9dc7b89cSJunchao Zhang   PetscCheck(dim == 2,PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"KokkosOffsetView is 2D but DMDA is %dD",(int)dim);
104c6583b63SJunchao Zhang   if (overwrite) {ierr = VecGetKokkosViewWrite(vec,&kv);CHKERRQ(ierr);}
105c6583b63SJunchao Zhang   else {ierr = VecGetKokkosView(vec,&kv);CHKERRQ(ierr);}
106*9dc7b89cSJunchao Zhang   *ov  = PetscScalarKokkosOffsetView2DType<MemorySpace>(kv.data(),{gys*dof,gxs*dof},{(gys+gym)*dof,(gxs+gxm)*dof});
107c6583b63SJunchao Zhang   PetscFunctionReturn(0);
108c6583b63SJunchao Zhang }
109c6583b63SJunchao Zhang 
110c6583b63SJunchao Zhang template<class MemorySpace>
111c6583b63SJunchao Zhang PetscErrorCode DMDAVecRestoreKokkosOffsetView_Private(DM da,Vec vec,PetscScalarKokkosOffsetView2DType<MemorySpace> *ov,PetscBool overwrite)
112c6583b63SJunchao Zhang {
113c6583b63SJunchao Zhang   PetscErrorCode                             ierr;
114c6583b63SJunchao Zhang   PetscScalarKokkosViewType<MemorySpace>     kv;
115c6583b63SJunchao Zhang 
116c6583b63SJunchao Zhang   PetscFunctionBegin;
117c6583b63SJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
118c6583b63SJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
119c6583b63SJunchao Zhang   PetscValidPointer(ov,3);
120c6583b63SJunchao Zhang   // kv   = ov->view(); /* 2D OffsetView => 2D View => 1D View. Why does it not work? */
121c6583b63SJunchao Zhang   kv   = PetscScalarKokkosViewType<MemorySpace>(ov->data(),ov->extent(0)*ov->extent(1));
122c6583b63SJunchao Zhang   if (overwrite) {ierr = VecRestoreKokkosViewWrite(vec,&kv);CHKERRQ(ierr);}
123c6583b63SJunchao Zhang   else {ierr = VecRestoreKokkosView(vec,&kv);CHKERRQ(ierr);}
124c6583b63SJunchao Zhang   PetscFunctionReturn(0);
125c6583b63SJunchao Zhang }
126c6583b63SJunchao Zhang 
127c6583b63SJunchao Zhang template<class MemorySpace>
128c6583b63SJunchao Zhang PetscErrorCode DMDAVecGetKokkosOffsetView(DM da,Vec vec,ConstPetscScalarKokkosOffsetView2DType<MemorySpace> *ov)
129c6583b63SJunchao Zhang {
130c6583b63SJunchao Zhang   PetscErrorCode                               ierr;
131c6583b63SJunchao Zhang   PetscInt                                     xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof;
132c6583b63SJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace>  kv;
133c6583b63SJunchao Zhang 
134c6583b63SJunchao Zhang   PetscFunctionBegin;
135c6583b63SJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
136c6583b63SJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
137c6583b63SJunchao Zhang   PetscValidPointer(ov,3);
138c6583b63SJunchao Zhang   DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof);
139*9dc7b89cSJunchao Zhang   PetscCheck(dim == 2,PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"KokkosOffsetView is 2D but DMDA is %dD",(int)dim);
140c6583b63SJunchao Zhang   ierr = VecGetKokkosView(vec,&kv);CHKERRQ(ierr);
141*9dc7b89cSJunchao Zhang   *ov  = ConstPetscScalarKokkosOffsetView2DType<MemorySpace>(kv.data(),{gys*dof,gxs*dof},{(gys+gym)*dof,(gxs+gxm)*dof});
142c6583b63SJunchao Zhang   PetscFunctionReturn(0);
143c6583b63SJunchao Zhang }
144c6583b63SJunchao Zhang 
145c6583b63SJunchao Zhang template<class MemorySpace>
146c6583b63SJunchao Zhang PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM da,Vec vec,ConstPetscScalarKokkosOffsetView2DType<MemorySpace> *ov)
147c6583b63SJunchao Zhang {
148c6583b63SJunchao Zhang   PetscErrorCode                               ierr;
149c6583b63SJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace>  kv;
150c6583b63SJunchao Zhang 
151c6583b63SJunchao Zhang   PetscFunctionBegin;
152c6583b63SJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
153c6583b63SJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
154c6583b63SJunchao Zhang   PetscValidPointer(ov,3);
155c6583b63SJunchao Zhang   kv   = ConstPetscScalarKokkosViewType<MemorySpace>(ov->data(),ov->extent(0)*ov->extent(1));
156c6583b63SJunchao Zhang   ierr = VecRestoreKokkosView(vec,&kv);CHKERRQ(ierr);
157c6583b63SJunchao Zhang   PetscFunctionReturn(0);
158c6583b63SJunchao Zhang }
159c6583b63SJunchao Zhang 
160*9dc7b89cSJunchao Zhang /* ============================== 3D ================================= */
161*9dc7b89cSJunchao Zhang template<class MemorySpace>
162*9dc7b89cSJunchao Zhang PetscErrorCode DMDAVecGetKokkosOffsetView_Private(DM da,Vec vec,PetscScalarKokkosOffsetView3DType<MemorySpace> *ov,PetscBool overwrite)
163*9dc7b89cSJunchao Zhang {
164*9dc7b89cSJunchao Zhang   PetscErrorCode                               ierr;
165*9dc7b89cSJunchao Zhang   PetscInt                                     xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof;
166*9dc7b89cSJunchao Zhang   PetscScalarKokkosViewType<MemorySpace>       kv;
167*9dc7b89cSJunchao Zhang 
168*9dc7b89cSJunchao Zhang   PetscFunctionBegin;
169*9dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
170*9dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
171*9dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
172*9dc7b89cSJunchao Zhang   DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof);
173*9dc7b89cSJunchao Zhang   PetscCheck(dim == 3,PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"KokkosOffsetView is 3D but DMDA is %dD",(int)dim);
174*9dc7b89cSJunchao Zhang   if (overwrite) {ierr = VecGetKokkosViewWrite(vec,&kv);CHKERRQ(ierr);}
175*9dc7b89cSJunchao Zhang   else {ierr = VecGetKokkosView(vec,&kv);CHKERRQ(ierr);}
176*9dc7b89cSJunchao Zhang   *ov  = PetscScalarKokkosOffsetView3DType<MemorySpace>(kv.data(),{gzs*dof,gys*dof,gxs*dof},{(gzs+gzm)*dof,(gys+gym)*dof,(gxs+gxm)*dof});
177*9dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
178*9dc7b89cSJunchao Zhang }
179*9dc7b89cSJunchao Zhang 
180*9dc7b89cSJunchao Zhang template<class MemorySpace>
181*9dc7b89cSJunchao Zhang PetscErrorCode DMDAVecRestoreKokkosOffsetView_Private(DM da,Vec vec,PetscScalarKokkosOffsetView3DType<MemorySpace> *ov,PetscBool overwrite)
182*9dc7b89cSJunchao Zhang {
183*9dc7b89cSJunchao Zhang   PetscErrorCode                             ierr;
184*9dc7b89cSJunchao Zhang   PetscScalarKokkosViewType<MemorySpace>     kv;
185*9dc7b89cSJunchao Zhang 
186*9dc7b89cSJunchao Zhang   PetscFunctionBegin;
187*9dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
188*9dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
189*9dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
190*9dc7b89cSJunchao Zhang   kv   = PetscScalarKokkosViewType<MemorySpace>(ov->data(),ov->extent(0)*ov->extent(1)*ov->extent(2));
191*9dc7b89cSJunchao Zhang   if (overwrite) {ierr = VecRestoreKokkosViewWrite(vec,&kv);CHKERRQ(ierr);}
192*9dc7b89cSJunchao Zhang   else {ierr = VecRestoreKokkosView(vec,&kv);CHKERRQ(ierr);}
193*9dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
194*9dc7b89cSJunchao Zhang }
195*9dc7b89cSJunchao Zhang 
196*9dc7b89cSJunchao Zhang template<class MemorySpace>
197*9dc7b89cSJunchao Zhang PetscErrorCode DMDAVecGetKokkosOffsetView(DM da,Vec vec,ConstPetscScalarKokkosOffsetView3DType<MemorySpace> *ov)
198*9dc7b89cSJunchao Zhang {
199*9dc7b89cSJunchao Zhang   PetscErrorCode                               ierr;
200*9dc7b89cSJunchao Zhang   PetscInt                                     xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof;
201*9dc7b89cSJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace>  kv;
202*9dc7b89cSJunchao Zhang 
203*9dc7b89cSJunchao Zhang   PetscFunctionBegin;
204*9dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
205*9dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
206*9dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
207*9dc7b89cSJunchao Zhang   DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof);
208*9dc7b89cSJunchao Zhang   PetscCheck(dim == 3,PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"KokkosOffsetView is 3D but DMDA is %dD",(int)dim);
209*9dc7b89cSJunchao Zhang   ierr = VecGetKokkosView(vec,&kv);CHKERRQ(ierr);
210*9dc7b89cSJunchao Zhang   *ov  = ConstPetscScalarKokkosOffsetView3DType<MemorySpace>(kv.data(),{gzs*dof,gys*dof,gxs*dof},{(gzs+gzm)*dof,(gys+gym)*dof,(gxs+gxm)*dof});
211*9dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
212*9dc7b89cSJunchao Zhang }
213*9dc7b89cSJunchao Zhang 
214*9dc7b89cSJunchao Zhang template<class MemorySpace>
215*9dc7b89cSJunchao Zhang PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM da,Vec vec,ConstPetscScalarKokkosOffsetView3DType<MemorySpace> *ov)
216*9dc7b89cSJunchao Zhang {
217*9dc7b89cSJunchao Zhang   PetscErrorCode                               ierr;
218*9dc7b89cSJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace>  kv;
219*9dc7b89cSJunchao Zhang 
220*9dc7b89cSJunchao Zhang   PetscFunctionBegin;
221*9dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
222*9dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
223*9dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
224*9dc7b89cSJunchao Zhang   kv   = ConstPetscScalarKokkosViewType<MemorySpace>(ov->data(),ov->extent(0)*ov->extent(1)*ov->extent(2));
225*9dc7b89cSJunchao Zhang   ierr = VecRestoreKokkosView(vec,&kv);CHKERRQ(ierr);
226*9dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
227*9dc7b89cSJunchao Zhang }
228*9dc7b89cSJunchao Zhang 
229c6583b63SJunchao Zhang /* Function template explicit instantiation */
230c6583b63SJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView         (DM,Vec,  ConstPetscScalarKokkosOffsetView1D*);
231c6583b63SJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView     (DM,Vec,  ConstPetscScalarKokkosOffsetView1D*);
232c6583b63SJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView         (DM da,Vec vec,PetscScalarKokkosOffsetView1D* ov) {return DMDAVecGetKokkosOffsetView_Private(da,vec,ov,PETSC_FALSE);}
233c6583b63SJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView     (DM da,Vec vec,PetscScalarKokkosOffsetView1D* ov) {return DMDAVecRestoreKokkosOffsetView_Private(da,vec,ov,PETSC_FALSE);}
234c6583b63SJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewWrite    (DM da,Vec vec,PetscScalarKokkosOffsetView1D* ov) {return DMDAVecGetKokkosOffsetView_Private(da,vec,ov,PETSC_TRUE);}
235c6583b63SJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewWrite(DM da,Vec vec,PetscScalarKokkosOffsetView1D* ov) {return DMDAVecRestoreKokkosOffsetView_Private(da,vec,ov,PETSC_TRUE);}
236c6583b63SJunchao Zhang 
237c6583b63SJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView         (DM,Vec,  ConstPetscScalarKokkosOffsetView2D*);
238c6583b63SJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView     (DM,Vec,  ConstPetscScalarKokkosOffsetView2D*);
239c6583b63SJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView         (DM da,Vec vec,PetscScalarKokkosOffsetView2D* ov) {return DMDAVecGetKokkosOffsetView_Private(da,vec,ov,PETSC_FALSE);}
240c6583b63SJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView     (DM da,Vec vec,PetscScalarKokkosOffsetView2D* ov) {return DMDAVecRestoreKokkosOffsetView_Private(da,vec,ov,PETSC_FALSE);}
241c6583b63SJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewWrite    (DM da,Vec vec,PetscScalarKokkosOffsetView2D* ov) {return DMDAVecGetKokkosOffsetView_Private(da,vec,ov,PETSC_TRUE);}
242c6583b63SJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewWrite(DM da,Vec vec,PetscScalarKokkosOffsetView2D* ov) {return DMDAVecRestoreKokkosOffsetView_Private(da,vec,ov,PETSC_TRUE);}
243c6583b63SJunchao Zhang 
244*9dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView         (DM,Vec,  ConstPetscScalarKokkosOffsetView3D*);
245*9dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView     (DM,Vec,  ConstPetscScalarKokkosOffsetView3D*);
246*9dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView         (DM da,Vec vec,PetscScalarKokkosOffsetView3D* ov) {return DMDAVecGetKokkosOffsetView_Private(da,vec,ov,PETSC_FALSE);}
247*9dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView     (DM da,Vec vec,PetscScalarKokkosOffsetView3D* ov) {return DMDAVecRestoreKokkosOffsetView_Private(da,vec,ov,PETSC_FALSE);}
248*9dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewWrite    (DM da,Vec vec,PetscScalarKokkosOffsetView3D* ov) {return DMDAVecGetKokkosOffsetView_Private(da,vec,ov,PETSC_TRUE);}
249*9dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewWrite(DM da,Vec vec,PetscScalarKokkosOffsetView3D* ov) {return DMDAVecRestoreKokkosOffsetView_Private(da,vec,ov,PETSC_TRUE);}
250*9dc7b89cSJunchao Zhang 
251*9dc7b89cSJunchao Zhang #if !defined(KOKKOS_ENABLE_DEFAULT_DEVICE_TYPE_HOST) /* Get host views if the default memory space is not host space */
252*9dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView         (DM,Vec,  ConstPetscScalarKokkosOffsetView1DHost*);
253*9dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView     (DM,Vec,  ConstPetscScalarKokkosOffsetView1DHost*);
254*9dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView         (DM da,Vec vec,PetscScalarKokkosOffsetView1DHost* ov) {return DMDAVecGetKokkosOffsetView_Private(da,vec,ov,PETSC_FALSE);}
255*9dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView     (DM da,Vec vec,PetscScalarKokkosOffsetView1DHost* ov) {return DMDAVecRestoreKokkosOffsetView_Private(da,vec,ov,PETSC_FALSE);}
256*9dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewWrite    (DM da,Vec vec,PetscScalarKokkosOffsetView1DHost* ov) {return DMDAVecGetKokkosOffsetView_Private(da,vec,ov,PETSC_TRUE);}
257*9dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewWrite(DM da,Vec vec,PetscScalarKokkosOffsetView1DHost* ov) {return DMDAVecRestoreKokkosOffsetView_Private(da,vec,ov,PETSC_TRUE);}
258*9dc7b89cSJunchao Zhang 
259*9dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView         (DM,Vec,  ConstPetscScalarKokkosOffsetView2DHost*);
260*9dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView     (DM,Vec,  ConstPetscScalarKokkosOffsetView2DHost*);
261*9dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView         (DM da,Vec vec,PetscScalarKokkosOffsetView2DHost* ov) {return DMDAVecGetKokkosOffsetView_Private(da,vec,ov,PETSC_FALSE);}
262*9dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView     (DM da,Vec vec,PetscScalarKokkosOffsetView2DHost* ov) {return DMDAVecRestoreKokkosOffsetView_Private(da,vec,ov,PETSC_FALSE);}
263*9dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewWrite    (DM da,Vec vec,PetscScalarKokkosOffsetView2DHost* ov) {return DMDAVecGetKokkosOffsetView_Private(da,vec,ov,PETSC_TRUE);}
264*9dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewWrite(DM da,Vec vec,PetscScalarKokkosOffsetView2DHost* ov) {return DMDAVecRestoreKokkosOffsetView_Private(da,vec,ov,PETSC_TRUE);}
265*9dc7b89cSJunchao Zhang 
266*9dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView         (DM,Vec,  ConstPetscScalarKokkosOffsetView3DHost*);
267*9dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView     (DM,Vec,  ConstPetscScalarKokkosOffsetView3DHost*);
268*9dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView         (DM da,Vec vec,PetscScalarKokkosOffsetView3DHost* ov) {return DMDAVecGetKokkosOffsetView_Private(da,vec,ov,PETSC_FALSE);}
269*9dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView     (DM da,Vec vec,PetscScalarKokkosOffsetView3DHost* ov) {return DMDAVecRestoreKokkosOffsetView_Private(da,vec,ov,PETSC_FALSE);}
270*9dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewWrite    (DM da,Vec vec,PetscScalarKokkosOffsetView3DHost* ov) {return DMDAVecGetKokkosOffsetView_Private(da,vec,ov,PETSC_TRUE);}
271*9dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewWrite(DM da,Vec vec,PetscScalarKokkosOffsetView3DHost* ov) {return DMDAVecRestoreKokkosOffsetView_Private(da,vec,ov,PETSC_TRUE);}
272*9dc7b89cSJunchao Zhang #endif
273*9dc7b89cSJunchao Zhang 
274*9dc7b89cSJunchao Zhang /* ============================== 2D including DOF ================================= */
275*9dc7b89cSJunchao Zhang template<class MemorySpace>
276*9dc7b89cSJunchao Zhang PetscErrorCode DMDAVecGetKokkosOffsetViewDOF_Private(DM da,Vec vec,PetscScalarKokkosOffsetView2DType<MemorySpace> *ov,PetscBool overwrite)
277*9dc7b89cSJunchao Zhang {
278*9dc7b89cSJunchao Zhang   PetscErrorCode                               ierr;
279*9dc7b89cSJunchao Zhang   PetscInt                                     xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof;
280*9dc7b89cSJunchao Zhang   PetscScalarKokkosViewType<MemorySpace>       kv;
281*9dc7b89cSJunchao Zhang 
282*9dc7b89cSJunchao Zhang   PetscFunctionBegin;
283*9dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
284*9dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
285*9dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
286*9dc7b89cSJunchao Zhang   DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof);
287*9dc7b89cSJunchao Zhang   PetscCheck(dim == 1,PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"KokkosOffsetView is 2D but DMDA is %dD",(int)dim);
288*9dc7b89cSJunchao Zhang   if (overwrite) {ierr = VecGetKokkosViewWrite(vec,&kv);CHKERRQ(ierr);}
289*9dc7b89cSJunchao Zhang   else {ierr = VecGetKokkosView(vec,&kv);CHKERRQ(ierr);}
290*9dc7b89cSJunchao Zhang   *ov  = PetscScalarKokkosOffsetView2DType<MemorySpace>(kv.data(),{gxs,0},{gxs+gxm,dof});
291*9dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
292*9dc7b89cSJunchao Zhang }
293*9dc7b89cSJunchao Zhang 
294*9dc7b89cSJunchao Zhang template<class MemorySpace>
295*9dc7b89cSJunchao Zhang PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF_Private(DM da,Vec vec,PetscScalarKokkosOffsetView2DType<MemorySpace> *ov,PetscBool overwrite)
296*9dc7b89cSJunchao Zhang {
297*9dc7b89cSJunchao Zhang   PetscErrorCode                             ierr;
298*9dc7b89cSJunchao Zhang   PetscScalarKokkosViewType<MemorySpace>     kv;
299*9dc7b89cSJunchao Zhang 
300*9dc7b89cSJunchao Zhang   PetscFunctionBegin;
301*9dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
302*9dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
303*9dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
304*9dc7b89cSJunchao Zhang   kv   = PetscScalarKokkosViewType<MemorySpace>(ov->data(),ov->extent(0)*ov->extent(1));
305*9dc7b89cSJunchao Zhang   if (overwrite) {ierr = VecRestoreKokkosViewWrite(vec,&kv);CHKERRQ(ierr);}
306*9dc7b89cSJunchao Zhang   else {ierr = VecRestoreKokkosView(vec,&kv);CHKERRQ(ierr);}
307*9dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
308*9dc7b89cSJunchao Zhang }
309*9dc7b89cSJunchao Zhang 
310*9dc7b89cSJunchao Zhang template<class MemorySpace>
311*9dc7b89cSJunchao Zhang PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM da,Vec vec,ConstPetscScalarKokkosOffsetView2DType<MemorySpace> *ov)
312*9dc7b89cSJunchao Zhang {
313*9dc7b89cSJunchao Zhang   PetscErrorCode                               ierr;
314*9dc7b89cSJunchao Zhang   PetscInt                                     xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof;
315*9dc7b89cSJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace>  kv;
316*9dc7b89cSJunchao Zhang 
317*9dc7b89cSJunchao Zhang   PetscFunctionBegin;
318*9dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
319*9dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
320*9dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
321*9dc7b89cSJunchao Zhang   DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof);
322*9dc7b89cSJunchao Zhang   PetscCheck(dim == 1,PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"KokkosOffsetView is 2D but DMDA is %dD",(int)dim);
323*9dc7b89cSJunchao Zhang   ierr = VecGetKokkosView(vec,&kv);CHKERRQ(ierr);
324*9dc7b89cSJunchao Zhang   *ov  = ConstPetscScalarKokkosOffsetView2DType<MemorySpace>(kv.data(),{gxs,0},{gxs+gxm,dof});
325*9dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
326*9dc7b89cSJunchao Zhang }
327*9dc7b89cSJunchao Zhang 
328*9dc7b89cSJunchao Zhang template<class MemorySpace>
329*9dc7b89cSJunchao Zhang PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM da,Vec vec,ConstPetscScalarKokkosOffsetView2DType<MemorySpace> *ov)
330*9dc7b89cSJunchao Zhang {
331*9dc7b89cSJunchao Zhang   PetscErrorCode                               ierr;
332*9dc7b89cSJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace>  kv;
333*9dc7b89cSJunchao Zhang 
334*9dc7b89cSJunchao Zhang   PetscFunctionBegin;
335*9dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
336*9dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
337*9dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
338*9dc7b89cSJunchao Zhang   kv   = ConstPetscScalarKokkosViewType<MemorySpace>(ov->data(),ov->extent(0)*ov->extent(1));
339*9dc7b89cSJunchao Zhang   ierr = VecRestoreKokkosView(vec,&kv);CHKERRQ(ierr);
340*9dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
341*9dc7b89cSJunchao Zhang }
342*9dc7b89cSJunchao Zhang 
343*9dc7b89cSJunchao Zhang /* ============================== 3D including DOF ================================= */
344*9dc7b89cSJunchao Zhang template<class MemorySpace>
345*9dc7b89cSJunchao Zhang PetscErrorCode DMDAVecGetKokkosOffsetViewDOF_Private(DM da,Vec vec,PetscScalarKokkosOffsetView3DType<MemorySpace> *ov,PetscBool overwrite)
346*9dc7b89cSJunchao Zhang {
347*9dc7b89cSJunchao Zhang   PetscErrorCode                               ierr;
348*9dc7b89cSJunchao Zhang   PetscInt                                     xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof;
349*9dc7b89cSJunchao Zhang   PetscScalarKokkosViewType<MemorySpace>       kv;
350*9dc7b89cSJunchao Zhang 
351*9dc7b89cSJunchao Zhang   PetscFunctionBegin;
352*9dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
353*9dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
354*9dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
355*9dc7b89cSJunchao Zhang   DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof);
356*9dc7b89cSJunchao Zhang   PetscCheck(dim == 2,PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"KokkosOffsetView is 3D but DMDA is %dD",(int)dim);
357*9dc7b89cSJunchao Zhang   if (overwrite) {ierr = VecGetKokkosViewWrite(vec,&kv);CHKERRQ(ierr);}
358*9dc7b89cSJunchao Zhang   else {ierr = VecGetKokkosView(vec,&kv);CHKERRQ(ierr);}
359*9dc7b89cSJunchao Zhang   *ov  = PetscScalarKokkosOffsetView3DType<MemorySpace>(kv.data(),{gys,gxs,0},{gys+gym,gxs+gxm,dof});
360*9dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
361*9dc7b89cSJunchao Zhang }
362*9dc7b89cSJunchao Zhang 
363*9dc7b89cSJunchao Zhang template<class MemorySpace>
364*9dc7b89cSJunchao Zhang PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF_Private(DM da,Vec vec,PetscScalarKokkosOffsetView3DType<MemorySpace> *ov,PetscBool overwrite)
365*9dc7b89cSJunchao Zhang {
366*9dc7b89cSJunchao Zhang   PetscErrorCode                             ierr;
367*9dc7b89cSJunchao Zhang   PetscScalarKokkosViewType<MemorySpace>     kv;
368*9dc7b89cSJunchao Zhang 
369*9dc7b89cSJunchao Zhang   PetscFunctionBegin;
370*9dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
371*9dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
372*9dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
373*9dc7b89cSJunchao Zhang   kv   = PetscScalarKokkosViewType<MemorySpace>(ov->data(),ov->extent(0)*ov->extent(1)*ov->extent(2));
374*9dc7b89cSJunchao Zhang   if (overwrite) {ierr = VecRestoreKokkosViewWrite(vec,&kv);CHKERRQ(ierr);}
375*9dc7b89cSJunchao Zhang   else {ierr = VecRestoreKokkosView(vec,&kv);CHKERRQ(ierr);}
376*9dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
377*9dc7b89cSJunchao Zhang }
378*9dc7b89cSJunchao Zhang 
379*9dc7b89cSJunchao Zhang template<class MemorySpace>
380*9dc7b89cSJunchao Zhang PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM da,Vec vec,ConstPetscScalarKokkosOffsetView3DType<MemorySpace> *ov)
381*9dc7b89cSJunchao Zhang {
382*9dc7b89cSJunchao Zhang   PetscErrorCode                               ierr;
383*9dc7b89cSJunchao Zhang   PetscInt                                     xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof;
384*9dc7b89cSJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace>  kv;
385*9dc7b89cSJunchao Zhang 
386*9dc7b89cSJunchao Zhang   PetscFunctionBegin;
387*9dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
388*9dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
389*9dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
390*9dc7b89cSJunchao Zhang   DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof);
391*9dc7b89cSJunchao Zhang   PetscCheck(dim == 2,PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"KokkosOffsetView is 3D but DMDA is %dD",(int)dim);
392*9dc7b89cSJunchao Zhang   ierr = VecGetKokkosView(vec,&kv);CHKERRQ(ierr);
393*9dc7b89cSJunchao Zhang   *ov  = ConstPetscScalarKokkosOffsetView3DType<MemorySpace>(kv.data(),{gys,gxs,0},{gys+gym,gxs+gxm,dof});
394*9dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
395*9dc7b89cSJunchao Zhang }
396*9dc7b89cSJunchao Zhang 
397*9dc7b89cSJunchao Zhang template<class MemorySpace>
398*9dc7b89cSJunchao Zhang PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM da,Vec vec,ConstPetscScalarKokkosOffsetView3DType<MemorySpace> *ov)
399*9dc7b89cSJunchao Zhang {
400*9dc7b89cSJunchao Zhang   PetscErrorCode                               ierr;
401*9dc7b89cSJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace>  kv;
402*9dc7b89cSJunchao Zhang 
403*9dc7b89cSJunchao Zhang   PetscFunctionBegin;
404*9dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
405*9dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
406*9dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
407*9dc7b89cSJunchao Zhang   kv   = ConstPetscScalarKokkosViewType<MemorySpace>(ov->data(),ov->extent(0)*ov->extent(1)*ov->extent(2));
408*9dc7b89cSJunchao Zhang   ierr = VecRestoreKokkosView(vec,&kv);CHKERRQ(ierr);
409*9dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
410*9dc7b89cSJunchao Zhang }
411*9dc7b89cSJunchao Zhang 
412*9dc7b89cSJunchao Zhang /* ============================== 4D including DOF ================================= */
413*9dc7b89cSJunchao Zhang template<class MemorySpace>
414*9dc7b89cSJunchao Zhang PetscErrorCode DMDAVecGetKokkosOffsetViewDOF_Private(DM da,Vec vec,PetscScalarKokkosOffsetView4DType<MemorySpace> *ov,PetscBool overwrite)
415*9dc7b89cSJunchao Zhang {
416*9dc7b89cSJunchao Zhang   PetscErrorCode                               ierr;
417*9dc7b89cSJunchao Zhang   PetscInt                                     xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof;
418*9dc7b89cSJunchao Zhang   PetscScalarKokkosViewType<MemorySpace>       kv;
419*9dc7b89cSJunchao Zhang 
420*9dc7b89cSJunchao Zhang   PetscFunctionBegin;
421*9dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
422*9dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
423*9dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
424*9dc7b89cSJunchao Zhang   DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof);
425*9dc7b89cSJunchao Zhang   PetscCheck(dim == 3,PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"KokkosOffsetView is 4D but DMDA is %dD",(int)dim);
426*9dc7b89cSJunchao Zhang   if (overwrite) {ierr = VecGetKokkosViewWrite(vec,&kv);CHKERRQ(ierr);}
427*9dc7b89cSJunchao Zhang   else {ierr = VecGetKokkosView(vec,&kv);CHKERRQ(ierr);}
428*9dc7b89cSJunchao Zhang   *ov  = PetscScalarKokkosOffsetView4DType<MemorySpace>(kv.data(),{gzs,gys,gxs,0},{gzs+gzm,gys+gym,gxs+gxm,dof});
429*9dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
430*9dc7b89cSJunchao Zhang }
431*9dc7b89cSJunchao Zhang 
432*9dc7b89cSJunchao Zhang template<class MemorySpace>
433*9dc7b89cSJunchao Zhang PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF_Private(DM da,Vec vec,PetscScalarKokkosOffsetView4DType<MemorySpace> *ov,PetscBool overwrite)
434*9dc7b89cSJunchao Zhang {
435*9dc7b89cSJunchao Zhang   PetscErrorCode                             ierr;
436*9dc7b89cSJunchao Zhang   PetscScalarKokkosViewType<MemorySpace>     kv;
437*9dc7b89cSJunchao Zhang 
438*9dc7b89cSJunchao Zhang   PetscFunctionBegin;
439*9dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
440*9dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
441*9dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
442*9dc7b89cSJunchao Zhang   kv   = PetscScalarKokkosViewType<MemorySpace>(ov->data(),ov->extent(0)*ov->extent(1)*ov->extent(2)*ov->extent(3));
443*9dc7b89cSJunchao Zhang   if (overwrite) {ierr = VecRestoreKokkosViewWrite(vec,&kv);CHKERRQ(ierr);}
444*9dc7b89cSJunchao Zhang   else {ierr = VecRestoreKokkosView(vec,&kv);CHKERRQ(ierr);}
445*9dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
446*9dc7b89cSJunchao Zhang }
447*9dc7b89cSJunchao Zhang 
448*9dc7b89cSJunchao Zhang template<class MemorySpace>
449*9dc7b89cSJunchao Zhang PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM da,Vec vec,ConstPetscScalarKokkosOffsetView4DType<MemorySpace> *ov)
450*9dc7b89cSJunchao Zhang {
451*9dc7b89cSJunchao Zhang   PetscErrorCode                               ierr;
452*9dc7b89cSJunchao Zhang   PetscInt                                     xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof;
453*9dc7b89cSJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace>  kv;
454*9dc7b89cSJunchao Zhang 
455*9dc7b89cSJunchao Zhang   PetscFunctionBegin;
456*9dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
457*9dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
458*9dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
459*9dc7b89cSJunchao Zhang   DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof);
460*9dc7b89cSJunchao Zhang   PetscCheck(dim == 3,PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"KokkosOffsetView is 4D but DMDA is %dD",(int)dim);
461*9dc7b89cSJunchao Zhang   ierr = VecGetKokkosView(vec,&kv);CHKERRQ(ierr);
462*9dc7b89cSJunchao Zhang   *ov  = ConstPetscScalarKokkosOffsetView4DType<MemorySpace>(kv.data(),{gzs,gys,gxs,0},{gzs+gzm,gys+gym,gxs+gxm,dof});
463*9dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
464*9dc7b89cSJunchao Zhang }
465*9dc7b89cSJunchao Zhang 
466*9dc7b89cSJunchao Zhang template<class MemorySpace>
467*9dc7b89cSJunchao Zhang PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM da,Vec vec,ConstPetscScalarKokkosOffsetView4DType<MemorySpace> *ov)
468*9dc7b89cSJunchao Zhang {
469*9dc7b89cSJunchao Zhang   PetscErrorCode                               ierr;
470*9dc7b89cSJunchao Zhang   ConstPetscScalarKokkosViewType<MemorySpace>  kv;
471*9dc7b89cSJunchao Zhang 
472*9dc7b89cSJunchao Zhang   PetscFunctionBegin;
473*9dc7b89cSJunchao Zhang   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
474*9dc7b89cSJunchao Zhang   PetscValidHeaderSpecific(vec,VEC_CLASSID,2);
475*9dc7b89cSJunchao Zhang   PetscValidPointer(ov,3);
476*9dc7b89cSJunchao Zhang   kv   = ConstPetscScalarKokkosViewType<MemorySpace>(ov->data(),ov->extent(0)*ov->extent(1)*ov->extent(2)*ov->extent(3));
477*9dc7b89cSJunchao Zhang   ierr = VecRestoreKokkosView(vec,&kv);CHKERRQ(ierr);
478*9dc7b89cSJunchao Zhang   PetscFunctionReturn(0);
479*9dc7b89cSJunchao Zhang }
480*9dc7b89cSJunchao Zhang 
481*9dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF         (DM,Vec,  ConstPetscScalarKokkosOffsetView2D*);
482*9dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF     (DM,Vec,  ConstPetscScalarKokkosOffsetView2D*);
483*9dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF         (DM da,Vec vec,PetscScalarKokkosOffsetView2D* ov) {return DMDAVecGetKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_FALSE);}
484*9dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF     (DM da,Vec vec,PetscScalarKokkosOffsetView2D* ov) {return DMDAVecRestoreKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_FALSE);}
485*9dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOFWrite    (DM da,Vec vec,PetscScalarKokkosOffsetView2D* ov) {return DMDAVecGetKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_TRUE);}
486*9dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOFWrite(DM da,Vec vec,PetscScalarKokkosOffsetView2D* ov) {return DMDAVecRestoreKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_TRUE);}
487*9dc7b89cSJunchao Zhang 
488*9dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF         (DM,Vec,  ConstPetscScalarKokkosOffsetView3D*);
489*9dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF     (DM,Vec,  ConstPetscScalarKokkosOffsetView3D*);
490*9dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF         (DM da,Vec vec,PetscScalarKokkosOffsetView3D* ov) {return DMDAVecGetKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_FALSE);}
491*9dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF     (DM da,Vec vec,PetscScalarKokkosOffsetView3D* ov) {return DMDAVecRestoreKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_FALSE);}
492*9dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOFWrite    (DM da,Vec vec,PetscScalarKokkosOffsetView3D* ov) {return DMDAVecGetKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_TRUE);}
493*9dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOFWrite(DM da,Vec vec,PetscScalarKokkosOffsetView3D* ov) {return DMDAVecRestoreKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_TRUE);}
494*9dc7b89cSJunchao Zhang 
495*9dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF         (DM,Vec,  ConstPetscScalarKokkosOffsetView4D*);
496*9dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF     (DM,Vec,  ConstPetscScalarKokkosOffsetView4D*);
497*9dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF         (DM da,Vec vec,PetscScalarKokkosOffsetView4D* ov) {return DMDAVecGetKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_FALSE);}
498*9dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF     (DM da,Vec vec,PetscScalarKokkosOffsetView4D* ov) {return DMDAVecRestoreKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_FALSE);}
499*9dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOFWrite    (DM da,Vec vec,PetscScalarKokkosOffsetView4D* ov) {return DMDAVecGetKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_TRUE);}
500*9dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOFWrite(DM da,Vec vec,PetscScalarKokkosOffsetView4D* ov) {return DMDAVecRestoreKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_TRUE);}
501*9dc7b89cSJunchao Zhang 
502*9dc7b89cSJunchao Zhang #if !defined(KOKKOS_ENABLE_DEFAULT_DEVICE_TYPE_HOST) /* Get host views if the default memory space is not host space */
503*9dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF         (DM,Vec,  ConstPetscScalarKokkosOffsetView2DHost*);
504*9dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF     (DM,Vec,  ConstPetscScalarKokkosOffsetView2DHost*);
505*9dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF         (DM da,Vec vec,PetscScalarKokkosOffsetView2DHost* ov) {return DMDAVecGetKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_FALSE);}
506*9dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF     (DM da,Vec vec,PetscScalarKokkosOffsetView2DHost* ov) {return DMDAVecRestoreKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_FALSE);}
507*9dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOFWrite    (DM da,Vec vec,PetscScalarKokkosOffsetView2DHost* ov) {return DMDAVecGetKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_TRUE);}
508*9dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOFWrite(DM da,Vec vec,PetscScalarKokkosOffsetView2DHost* ov) {return DMDAVecRestoreKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_TRUE);}
509*9dc7b89cSJunchao Zhang 
510*9dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF         (DM,Vec,  ConstPetscScalarKokkosOffsetView3DHost*);
511*9dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF     (DM,Vec,  ConstPetscScalarKokkosOffsetView3DHost*);
512*9dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF         (DM da,Vec vec,PetscScalarKokkosOffsetView3DHost* ov) {return DMDAVecGetKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_FALSE);}
513*9dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF     (DM da,Vec vec,PetscScalarKokkosOffsetView3DHost* ov) {return DMDAVecRestoreKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_FALSE);}
514*9dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOFWrite    (DM da,Vec vec,PetscScalarKokkosOffsetView3DHost* ov) {return DMDAVecGetKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_TRUE);}
515*9dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOFWrite(DM da,Vec vec,PetscScalarKokkosOffsetView3DHost* ov) {return DMDAVecRestoreKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_TRUE);}
516*9dc7b89cSJunchao Zhang 
517*9dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF         (DM,Vec,  ConstPetscScalarKokkosOffsetView4DHost*);
518*9dc7b89cSJunchao Zhang template   PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF     (DM,Vec,  ConstPetscScalarKokkosOffsetView4DHost*);
519*9dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF         (DM da,Vec vec,PetscScalarKokkosOffsetView4DHost* ov) {return DMDAVecGetKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_FALSE);}
520*9dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF     (DM da,Vec vec,PetscScalarKokkosOffsetView4DHost* ov) {return DMDAVecRestoreKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_FALSE);}
521*9dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOFWrite    (DM da,Vec vec,PetscScalarKokkosOffsetView4DHost* ov) {return DMDAVecGetKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_TRUE);}
522*9dc7b89cSJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOFWrite(DM da,Vec vec,PetscScalarKokkosOffsetView4DHost* ov) {return DMDAVecRestoreKokkosOffsetViewDOF_Private(da,vec,ov,PETSC_TRUE);}
523*9dc7b89cSJunchao Zhang #endif
524