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