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