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