1c6583b63SJunchao Zhang #include <petsc/private/vecimpl_kokkos.hpp> 2c6583b63SJunchao Zhang #include <petsc/private/dmdaimpl.h> 3c6583b63SJunchao Zhang #include <petscdmda_kokkos.hpp> 4c6583b63SJunchao Zhang 5ac09b921SBarry Smith /* SUBMANSEC = DMDA */ 6ac09b921SBarry Smith 7ac09b921SBarry 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) { \ 16*9371c9d4SSatish Balay gxm = xm; \ 17*9371c9d4SSatish Balay gym = ym; \ 18*9371c9d4SSatish Balay gzm = zm; \ 19*9371c9d4SSatish Balay gxs = xs; \ 20*9371c9d4SSatish Balay gys = ys; \ 21*9371c9d4SSatish Balay gzs = zs; \ 2263a3b9bcSJacob 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); \ 23c6583b63SJunchao Zhang } while (0) 24c6583b63SJunchao Zhang 259dc7b89cSJunchao Zhang /* -------------------- 1D ---------------- */ 26c6583b63SJunchao Zhang template <class MemorySpace> 27*9371c9d4SSatish Balay PetscErrorCode DMDAVecGetKokkosOffsetView_Private(DM da, Vec vec, PetscScalarKokkosOffsetView1DType<MemorySpace> *ov, PetscBool overwrite) { 28c6583b63SJunchao Zhang PetscInt xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof; 29c6583b63SJunchao Zhang PetscScalarKokkosViewType<MemorySpace> kv; 30c6583b63SJunchao Zhang 31c6583b63SJunchao Zhang PetscFunctionBegin; 32c6583b63SJunchao Zhang PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA); 33c6583b63SJunchao Zhang PetscValidHeaderSpecific(vec, VEC_CLASSID, 2); 34c6583b63SJunchao Zhang PetscValidPointer(ov, 3); 35c6583b63SJunchao Zhang DMDA_VEC_GET_SHAPE(da, vec, xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof); 369dc7b89cSJunchao Zhang PetscCheck(dim == 1, PETSC_COMM_SELF, PETSC_ERR_ARG_CORRUPT, "KokkosOffsetView is 1D but DMDA is %dD", (int)dim); 379566063dSJacob Faibussowitsch if (overwrite) PetscCall(VecGetKokkosViewWrite(vec, &kv)); 389566063dSJacob Faibussowitsch else PetscCall(VecGetKokkosView(vec, &kv)); 399dc7b89cSJunchao Zhang /* Construct the unmanaged OffsetView with {begin0,begin1,begins2},{end0,end1,end2} */ 409dc7b89cSJunchao Zhang *ov = PetscScalarKokkosOffsetView1DType<MemorySpace>(kv.data(), {gxs * dof}, {(gxs + gxm) * dof}); 41c6583b63SJunchao Zhang PetscFunctionReturn(0); 42c6583b63SJunchao Zhang } 43c6583b63SJunchao Zhang 44c6583b63SJunchao Zhang template <class MemorySpace> 45*9371c9d4SSatish Balay PetscErrorCode DMDAVecRestoreKokkosOffsetView_Private(DM da, Vec vec, PetscScalarKokkosOffsetView1DType<MemorySpace> *ov, PetscBool overwrite) { 46c6583b63SJunchao Zhang PetscScalarKokkosViewType<MemorySpace> kv; 47c6583b63SJunchao Zhang 48c6583b63SJunchao Zhang PetscFunctionBegin; 49c6583b63SJunchao Zhang PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA); 50c6583b63SJunchao Zhang PetscValidHeaderSpecific(vec, VEC_CLASSID, 2); 51c6583b63SJunchao Zhang PetscValidPointer(ov, 3); 52c6583b63SJunchao Zhang kv = ov->view(); /* OffsetView to View */ 539566063dSJacob Faibussowitsch if (overwrite) PetscCall(VecRestoreKokkosViewWrite(vec, &kv)); 549566063dSJacob Faibussowitsch else PetscCall(VecRestoreKokkosView(vec, &kv)); 55c6583b63SJunchao Zhang PetscFunctionReturn(0); 56c6583b63SJunchao Zhang } 57c6583b63SJunchao Zhang 58c6583b63SJunchao Zhang template <class MemorySpace> 59*9371c9d4SSatish Balay PetscErrorCode DMDAVecGetKokkosOffsetView(DM da, Vec vec, ConstPetscScalarKokkosOffsetView1DType<MemorySpace> *ov) { 60c6583b63SJunchao Zhang PetscInt xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof; 61c6583b63SJunchao Zhang ConstPetscScalarKokkosViewType<MemorySpace> kv; 62c6583b63SJunchao Zhang 63c6583b63SJunchao Zhang PetscFunctionBegin; 64c6583b63SJunchao Zhang PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA); 65c6583b63SJunchao Zhang PetscValidHeaderSpecific(vec, VEC_CLASSID, 2); 66c6583b63SJunchao Zhang PetscValidPointer(ov, 3); 67c6583b63SJunchao Zhang DMDA_VEC_GET_SHAPE(da, vec, xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof); 689dc7b89cSJunchao Zhang PetscCheck(dim == 1, PETSC_COMM_SELF, PETSC_ERR_ARG_CORRUPT, "KokkosOffsetView is 1D but DMDA is %dD", (int)dim); 699566063dSJacob Faibussowitsch PetscCall(VecGetKokkosView(vec, &kv)); 709dc7b89cSJunchao Zhang *ov = ConstPetscScalarKokkosOffsetView1DType<MemorySpace>(kv.data(), {gxs * dof}, {(gxs + gxm) * dof}); 71c6583b63SJunchao Zhang PetscFunctionReturn(0); 72c6583b63SJunchao Zhang } 73c6583b63SJunchao Zhang 74c6583b63SJunchao Zhang template <class MemorySpace> 75*9371c9d4SSatish Balay PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM da, Vec vec, ConstPetscScalarKokkosOffsetView1DType<MemorySpace> *ov) { 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> 89*9371c9d4SSatish Balay PetscErrorCode DMDAVecGetKokkosOffsetView_Private(DM da, Vec vec, PetscScalarKokkosOffsetView2DType<MemorySpace> *ov, PetscBool overwrite) { 90c6583b63SJunchao Zhang PetscInt xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof; 91c6583b63SJunchao Zhang PetscScalarKokkosViewType<MemorySpace> kv; 92c6583b63SJunchao Zhang 93c6583b63SJunchao Zhang PetscFunctionBegin; 94c6583b63SJunchao Zhang PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA); 95c6583b63SJunchao Zhang PetscValidHeaderSpecific(vec, VEC_CLASSID, 2); 96c6583b63SJunchao Zhang PetscValidPointer(ov, 3); 97c6583b63SJunchao Zhang DMDA_VEC_GET_SHAPE(da, vec, xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof); 989dc7b89cSJunchao Zhang PetscCheck(dim == 2, PETSC_COMM_SELF, PETSC_ERR_ARG_CORRUPT, "KokkosOffsetView is 2D but DMDA is %dD", (int)dim); 999566063dSJacob Faibussowitsch if (overwrite) PetscCall(VecGetKokkosViewWrite(vec, &kv)); 1009566063dSJacob Faibussowitsch else PetscCall(VecGetKokkosView(vec, &kv)); 1019dc7b89cSJunchao Zhang *ov = PetscScalarKokkosOffsetView2DType<MemorySpace>(kv.data(), {gys * dof, gxs * dof}, {(gys + gym) * dof, (gxs + gxm) * dof}); 102c6583b63SJunchao Zhang PetscFunctionReturn(0); 103c6583b63SJunchao Zhang } 104c6583b63SJunchao Zhang 105c6583b63SJunchao Zhang template <class MemorySpace> 106*9371c9d4SSatish Balay PetscErrorCode DMDAVecRestoreKokkosOffsetView_Private(DM da, Vec vec, PetscScalarKokkosOffsetView2DType<MemorySpace> *ov, PetscBool overwrite) { 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> 121*9371c9d4SSatish Balay PetscErrorCode DMDAVecGetKokkosOffsetView(DM da, Vec vec, ConstPetscScalarKokkosOffsetView2DType<MemorySpace> *ov) { 122c6583b63SJunchao Zhang PetscInt xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof; 123c6583b63SJunchao Zhang ConstPetscScalarKokkosViewType<MemorySpace> kv; 124c6583b63SJunchao Zhang 125c6583b63SJunchao Zhang PetscFunctionBegin; 126c6583b63SJunchao Zhang PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA); 127c6583b63SJunchao Zhang PetscValidHeaderSpecific(vec, VEC_CLASSID, 2); 128c6583b63SJunchao Zhang PetscValidPointer(ov, 3); 129c6583b63SJunchao Zhang DMDA_VEC_GET_SHAPE(da, vec, xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof); 1309dc7b89cSJunchao Zhang PetscCheck(dim == 2, PETSC_COMM_SELF, PETSC_ERR_ARG_CORRUPT, "KokkosOffsetView is 2D but DMDA is %dD", (int)dim); 1319566063dSJacob Faibussowitsch PetscCall(VecGetKokkosView(vec, &kv)); 1329dc7b89cSJunchao Zhang *ov = ConstPetscScalarKokkosOffsetView2DType<MemorySpace>(kv.data(), {gys * dof, gxs * dof}, {(gys + gym) * dof, (gxs + gxm) * dof}); 133c6583b63SJunchao Zhang PetscFunctionReturn(0); 134c6583b63SJunchao Zhang } 135c6583b63SJunchao Zhang 136c6583b63SJunchao Zhang template <class MemorySpace> 137*9371c9d4SSatish Balay PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM da, Vec vec, ConstPetscScalarKokkosOffsetView2DType<MemorySpace> *ov) { 138c6583b63SJunchao Zhang ConstPetscScalarKokkosViewType<MemorySpace> kv; 139c6583b63SJunchao Zhang 140c6583b63SJunchao Zhang PetscFunctionBegin; 141c6583b63SJunchao Zhang PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA); 142c6583b63SJunchao Zhang PetscValidHeaderSpecific(vec, VEC_CLASSID, 2); 143c6583b63SJunchao Zhang PetscValidPointer(ov, 3); 144c6583b63SJunchao Zhang kv = ConstPetscScalarKokkosViewType<MemorySpace>(ov->data(), ov->extent(0) * ov->extent(1)); 1459566063dSJacob Faibussowitsch PetscCall(VecRestoreKokkosView(vec, &kv)); 146c6583b63SJunchao Zhang PetscFunctionReturn(0); 147c6583b63SJunchao Zhang } 148c6583b63SJunchao Zhang 1499dc7b89cSJunchao Zhang /* ============================== 3D ================================= */ 1509dc7b89cSJunchao Zhang template <class MemorySpace> 151*9371c9d4SSatish Balay PetscErrorCode DMDAVecGetKokkosOffsetView_Private(DM da, Vec vec, PetscScalarKokkosOffsetView3DType<MemorySpace> *ov, PetscBool overwrite) { 1529dc7b89cSJunchao Zhang PetscInt xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof; 1539dc7b89cSJunchao Zhang PetscScalarKokkosViewType<MemorySpace> kv; 1549dc7b89cSJunchao Zhang 1559dc7b89cSJunchao Zhang PetscFunctionBegin; 1569dc7b89cSJunchao Zhang PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA); 1579dc7b89cSJunchao Zhang PetscValidHeaderSpecific(vec, VEC_CLASSID, 2); 1589dc7b89cSJunchao Zhang PetscValidPointer(ov, 3); 1599dc7b89cSJunchao Zhang DMDA_VEC_GET_SHAPE(da, vec, xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof); 1609dc7b89cSJunchao Zhang PetscCheck(dim == 3, PETSC_COMM_SELF, PETSC_ERR_ARG_CORRUPT, "KokkosOffsetView is 3D but DMDA is %dD", (int)dim); 1619566063dSJacob Faibussowitsch if (overwrite) PetscCall(VecGetKokkosViewWrite(vec, &kv)); 1629566063dSJacob Faibussowitsch else PetscCall(VecGetKokkosView(vec, &kv)); 1639dc7b89cSJunchao Zhang *ov = PetscScalarKokkosOffsetView3DType<MemorySpace>(kv.data(), {gzs * dof, gys * dof, gxs * dof}, {(gzs + gzm) * dof, (gys + gym) * dof, (gxs + gxm) * dof}); 1649dc7b89cSJunchao Zhang PetscFunctionReturn(0); 1659dc7b89cSJunchao Zhang } 1669dc7b89cSJunchao Zhang 1679dc7b89cSJunchao Zhang template <class MemorySpace> 168*9371c9d4SSatish Balay PetscErrorCode DMDAVecRestoreKokkosOffsetView_Private(DM da, Vec vec, PetscScalarKokkosOffsetView3DType<MemorySpace> *ov, PetscBool overwrite) { 1699dc7b89cSJunchao Zhang PetscScalarKokkosViewType<MemorySpace> kv; 1709dc7b89cSJunchao Zhang 1719dc7b89cSJunchao Zhang PetscFunctionBegin; 1729dc7b89cSJunchao Zhang PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA); 1739dc7b89cSJunchao Zhang PetscValidHeaderSpecific(vec, VEC_CLASSID, 2); 1749dc7b89cSJunchao Zhang PetscValidPointer(ov, 3); 1759dc7b89cSJunchao Zhang kv = PetscScalarKokkosViewType<MemorySpace>(ov->data(), ov->extent(0) * ov->extent(1) * ov->extent(2)); 1769566063dSJacob Faibussowitsch if (overwrite) PetscCall(VecRestoreKokkosViewWrite(vec, &kv)); 1779566063dSJacob Faibussowitsch else PetscCall(VecRestoreKokkosView(vec, &kv)); 1789dc7b89cSJunchao Zhang PetscFunctionReturn(0); 1799dc7b89cSJunchao Zhang } 1809dc7b89cSJunchao Zhang 1819dc7b89cSJunchao Zhang template <class MemorySpace> 182*9371c9d4SSatish Balay PetscErrorCode DMDAVecGetKokkosOffsetView(DM da, Vec vec, ConstPetscScalarKokkosOffsetView3DType<MemorySpace> *ov) { 1839dc7b89cSJunchao Zhang PetscInt xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof; 1849dc7b89cSJunchao Zhang ConstPetscScalarKokkosViewType<MemorySpace> kv; 1859dc7b89cSJunchao Zhang 1869dc7b89cSJunchao Zhang PetscFunctionBegin; 1879dc7b89cSJunchao Zhang PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA); 1889dc7b89cSJunchao Zhang PetscValidHeaderSpecific(vec, VEC_CLASSID, 2); 1899dc7b89cSJunchao Zhang PetscValidPointer(ov, 3); 1909dc7b89cSJunchao Zhang DMDA_VEC_GET_SHAPE(da, vec, xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof); 1919dc7b89cSJunchao Zhang PetscCheck(dim == 3, PETSC_COMM_SELF, PETSC_ERR_ARG_CORRUPT, "KokkosOffsetView is 3D but DMDA is %dD", (int)dim); 1929566063dSJacob Faibussowitsch PetscCall(VecGetKokkosView(vec, &kv)); 1939dc7b89cSJunchao Zhang *ov = ConstPetscScalarKokkosOffsetView3DType<MemorySpace>(kv.data(), {gzs * dof, gys * dof, gxs * dof}, {(gzs + gzm) * dof, (gys + gym) * dof, (gxs + gxm) * dof}); 1949dc7b89cSJunchao Zhang PetscFunctionReturn(0); 1959dc7b89cSJunchao Zhang } 1969dc7b89cSJunchao Zhang 1979dc7b89cSJunchao Zhang template <class MemorySpace> 198*9371c9d4SSatish Balay PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM da, Vec vec, ConstPetscScalarKokkosOffsetView3DType<MemorySpace> *ov) { 1999dc7b89cSJunchao Zhang ConstPetscScalarKokkosViewType<MemorySpace> kv; 2009dc7b89cSJunchao Zhang 2019dc7b89cSJunchao Zhang PetscFunctionBegin; 2029dc7b89cSJunchao Zhang PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA); 2039dc7b89cSJunchao Zhang PetscValidHeaderSpecific(vec, VEC_CLASSID, 2); 2049dc7b89cSJunchao Zhang PetscValidPointer(ov, 3); 2059dc7b89cSJunchao Zhang kv = ConstPetscScalarKokkosViewType<MemorySpace>(ov->data(), ov->extent(0) * ov->extent(1) * ov->extent(2)); 2069566063dSJacob Faibussowitsch PetscCall(VecRestoreKokkosView(vec, &kv)); 2079dc7b89cSJunchao Zhang PetscFunctionReturn(0); 2089dc7b89cSJunchao Zhang } 2099dc7b89cSJunchao Zhang 210c6583b63SJunchao Zhang /* Function template explicit instantiation */ 211c6583b63SJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView(DM, Vec, ConstPetscScalarKokkosOffsetView1D *); 212c6583b63SJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM, Vec, ConstPetscScalarKokkosOffsetView1D *); 213*9371c9d4SSatish Balay template <> 214*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView(DM da, Vec vec, PetscScalarKokkosOffsetView1D *ov) { 215*9371c9d4SSatish Balay return DMDAVecGetKokkosOffsetView_Private(da, vec, ov, PETSC_FALSE); 216*9371c9d4SSatish Balay } 217*9371c9d4SSatish Balay template <> 218*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM da, Vec vec, PetscScalarKokkosOffsetView1D *ov) { 219*9371c9d4SSatish Balay return DMDAVecRestoreKokkosOffsetView_Private(da, vec, ov, PETSC_FALSE); 220*9371c9d4SSatish Balay } 221*9371c9d4SSatish Balay template <> 222*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewWrite(DM da, Vec vec, PetscScalarKokkosOffsetView1D *ov) { 223*9371c9d4SSatish Balay return DMDAVecGetKokkosOffsetView_Private(da, vec, ov, PETSC_TRUE); 224*9371c9d4SSatish Balay } 225*9371c9d4SSatish Balay template <> 226*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewWrite(DM da, Vec vec, PetscScalarKokkosOffsetView1D *ov) { 227*9371c9d4SSatish Balay return DMDAVecRestoreKokkosOffsetView_Private(da, vec, ov, PETSC_TRUE); 228*9371c9d4SSatish Balay } 229c6583b63SJunchao Zhang 230c6583b63SJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView(DM, Vec, ConstPetscScalarKokkosOffsetView2D *); 231c6583b63SJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM, Vec, ConstPetscScalarKokkosOffsetView2D *); 232*9371c9d4SSatish Balay template <> 233*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView(DM da, Vec vec, PetscScalarKokkosOffsetView2D *ov) { 234*9371c9d4SSatish Balay return DMDAVecGetKokkosOffsetView_Private(da, vec, ov, PETSC_FALSE); 235*9371c9d4SSatish Balay } 236*9371c9d4SSatish Balay template <> 237*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM da, Vec vec, PetscScalarKokkosOffsetView2D *ov) { 238*9371c9d4SSatish Balay return DMDAVecRestoreKokkosOffsetView_Private(da, vec, ov, PETSC_FALSE); 239*9371c9d4SSatish Balay } 240*9371c9d4SSatish Balay template <> 241*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewWrite(DM da, Vec vec, PetscScalarKokkosOffsetView2D *ov) { 242*9371c9d4SSatish Balay return DMDAVecGetKokkosOffsetView_Private(da, vec, ov, PETSC_TRUE); 243*9371c9d4SSatish Balay } 244*9371c9d4SSatish Balay template <> 245*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewWrite(DM da, Vec vec, PetscScalarKokkosOffsetView2D *ov) { 246*9371c9d4SSatish Balay return DMDAVecRestoreKokkosOffsetView_Private(da, vec, ov, PETSC_TRUE); 247*9371c9d4SSatish Balay } 248c6583b63SJunchao Zhang 2499dc7b89cSJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView(DM, Vec, ConstPetscScalarKokkosOffsetView3D *); 2509dc7b89cSJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM, Vec, ConstPetscScalarKokkosOffsetView3D *); 251*9371c9d4SSatish Balay template <> 252*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView(DM da, Vec vec, PetscScalarKokkosOffsetView3D *ov) { 253*9371c9d4SSatish Balay return DMDAVecGetKokkosOffsetView_Private(da, vec, ov, PETSC_FALSE); 254*9371c9d4SSatish Balay } 255*9371c9d4SSatish Balay template <> 256*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM da, Vec vec, PetscScalarKokkosOffsetView3D *ov) { 257*9371c9d4SSatish Balay return DMDAVecRestoreKokkosOffsetView_Private(da, vec, ov, PETSC_FALSE); 258*9371c9d4SSatish Balay } 259*9371c9d4SSatish Balay template <> 260*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewWrite(DM da, Vec vec, PetscScalarKokkosOffsetView3D *ov) { 261*9371c9d4SSatish Balay return DMDAVecGetKokkosOffsetView_Private(da, vec, ov, PETSC_TRUE); 262*9371c9d4SSatish Balay } 263*9371c9d4SSatish Balay template <> 264*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewWrite(DM da, Vec vec, PetscScalarKokkosOffsetView3D *ov) { 265*9371c9d4SSatish Balay return DMDAVecRestoreKokkosOffsetView_Private(da, vec, ov, PETSC_TRUE); 266*9371c9d4SSatish Balay } 2679dc7b89cSJunchao Zhang 2689dc7b89cSJunchao Zhang #if !defined(KOKKOS_ENABLE_DEFAULT_DEVICE_TYPE_HOST) /* Get host views if the default memory space is not host space */ 2699dc7b89cSJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView(DM, Vec, ConstPetscScalarKokkosOffsetView1DHost *); 2709dc7b89cSJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM, Vec, ConstPetscScalarKokkosOffsetView1DHost *); 271*9371c9d4SSatish Balay template <> 272*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView(DM da, Vec vec, PetscScalarKokkosOffsetView1DHost *ov) { 273*9371c9d4SSatish Balay return DMDAVecGetKokkosOffsetView_Private(da, vec, ov, PETSC_FALSE); 274*9371c9d4SSatish Balay } 275*9371c9d4SSatish Balay template <> 276*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM da, Vec vec, PetscScalarKokkosOffsetView1DHost *ov) { 277*9371c9d4SSatish Balay return DMDAVecRestoreKokkosOffsetView_Private(da, vec, ov, PETSC_FALSE); 278*9371c9d4SSatish Balay } 279*9371c9d4SSatish Balay template <> 280*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewWrite(DM da, Vec vec, PetscScalarKokkosOffsetView1DHost *ov) { 281*9371c9d4SSatish Balay return DMDAVecGetKokkosOffsetView_Private(da, vec, ov, PETSC_TRUE); 282*9371c9d4SSatish Balay } 283*9371c9d4SSatish Balay template <> 284*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewWrite(DM da, Vec vec, PetscScalarKokkosOffsetView1DHost *ov) { 285*9371c9d4SSatish Balay return DMDAVecRestoreKokkosOffsetView_Private(da, vec, ov, PETSC_TRUE); 286*9371c9d4SSatish Balay } 2879dc7b89cSJunchao Zhang 2889dc7b89cSJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView(DM, Vec, ConstPetscScalarKokkosOffsetView2DHost *); 2899dc7b89cSJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM, Vec, ConstPetscScalarKokkosOffsetView2DHost *); 290*9371c9d4SSatish Balay template <> 291*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView(DM da, Vec vec, PetscScalarKokkosOffsetView2DHost *ov) { 292*9371c9d4SSatish Balay return DMDAVecGetKokkosOffsetView_Private(da, vec, ov, PETSC_FALSE); 293*9371c9d4SSatish Balay } 294*9371c9d4SSatish Balay template <> 295*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM da, Vec vec, PetscScalarKokkosOffsetView2DHost *ov) { 296*9371c9d4SSatish Balay return DMDAVecRestoreKokkosOffsetView_Private(da, vec, ov, PETSC_FALSE); 297*9371c9d4SSatish Balay } 298*9371c9d4SSatish Balay template <> 299*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewWrite(DM da, Vec vec, PetscScalarKokkosOffsetView2DHost *ov) { 300*9371c9d4SSatish Balay return DMDAVecGetKokkosOffsetView_Private(da, vec, ov, PETSC_TRUE); 301*9371c9d4SSatish Balay } 302*9371c9d4SSatish Balay template <> 303*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewWrite(DM da, Vec vec, PetscScalarKokkosOffsetView2DHost *ov) { 304*9371c9d4SSatish Balay return DMDAVecRestoreKokkosOffsetView_Private(da, vec, ov, PETSC_TRUE); 305*9371c9d4SSatish Balay } 3069dc7b89cSJunchao Zhang 3079dc7b89cSJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView(DM, Vec, ConstPetscScalarKokkosOffsetView3DHost *); 3089dc7b89cSJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM, Vec, ConstPetscScalarKokkosOffsetView3DHost *); 309*9371c9d4SSatish Balay template <> 310*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView(DM da, Vec vec, PetscScalarKokkosOffsetView3DHost *ov) { 311*9371c9d4SSatish Balay return DMDAVecGetKokkosOffsetView_Private(da, vec, ov, PETSC_FALSE); 312*9371c9d4SSatish Balay } 313*9371c9d4SSatish Balay template <> 314*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM da, Vec vec, PetscScalarKokkosOffsetView3DHost *ov) { 315*9371c9d4SSatish Balay return DMDAVecRestoreKokkosOffsetView_Private(da, vec, ov, PETSC_FALSE); 316*9371c9d4SSatish Balay } 317*9371c9d4SSatish Balay template <> 318*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewWrite(DM da, Vec vec, PetscScalarKokkosOffsetView3DHost *ov) { 319*9371c9d4SSatish Balay return DMDAVecGetKokkosOffsetView_Private(da, vec, ov, PETSC_TRUE); 320*9371c9d4SSatish Balay } 321*9371c9d4SSatish Balay template <> 322*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewWrite(DM da, Vec vec, PetscScalarKokkosOffsetView3DHost *ov) { 323*9371c9d4SSatish Balay return DMDAVecRestoreKokkosOffsetView_Private(da, vec, ov, PETSC_TRUE); 324*9371c9d4SSatish Balay } 3259dc7b89cSJunchao Zhang #endif 3269dc7b89cSJunchao Zhang 3279dc7b89cSJunchao Zhang /* ============================== 2D including DOF ================================= */ 3289dc7b89cSJunchao Zhang template <class MemorySpace> 329*9371c9d4SSatish Balay PetscErrorCode DMDAVecGetKokkosOffsetViewDOF_Private(DM da, Vec vec, PetscScalarKokkosOffsetView2DType<MemorySpace> *ov, PetscBool overwrite) { 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 == 1, PETSC_COMM_SELF, PETSC_ERR_ARG_CORRUPT, "KokkosOffsetView is 2D but DMDA is %dD", (int)dim); 3399566063dSJacob Faibussowitsch if (overwrite) PetscCall(VecGetKokkosViewWrite(vec, &kv)); 3409566063dSJacob Faibussowitsch else PetscCall(VecGetKokkosView(vec, &kv)); 3419dc7b89cSJunchao Zhang *ov = PetscScalarKokkosOffsetView2DType<MemorySpace>(kv.data(), {gxs, 0}, {gxs + gxm, dof}); 3429dc7b89cSJunchao Zhang PetscFunctionReturn(0); 3439dc7b89cSJunchao Zhang } 3449dc7b89cSJunchao Zhang 3459dc7b89cSJunchao Zhang template <class MemorySpace> 346*9371c9d4SSatish Balay PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF_Private(DM da, Vec vec, PetscScalarKokkosOffsetView2DType<MemorySpace> *ov, PetscBool overwrite) { 3479dc7b89cSJunchao Zhang PetscScalarKokkosViewType<MemorySpace> kv; 3489dc7b89cSJunchao Zhang 3499dc7b89cSJunchao Zhang PetscFunctionBegin; 3509dc7b89cSJunchao Zhang PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA); 3519dc7b89cSJunchao Zhang PetscValidHeaderSpecific(vec, VEC_CLASSID, 2); 3529dc7b89cSJunchao Zhang PetscValidPointer(ov, 3); 3539dc7b89cSJunchao Zhang kv = PetscScalarKokkosViewType<MemorySpace>(ov->data(), ov->extent(0) * ov->extent(1)); 3549566063dSJacob Faibussowitsch if (overwrite) PetscCall(VecRestoreKokkosViewWrite(vec, &kv)); 3559566063dSJacob Faibussowitsch else PetscCall(VecRestoreKokkosView(vec, &kv)); 3569dc7b89cSJunchao Zhang PetscFunctionReturn(0); 3579dc7b89cSJunchao Zhang } 3589dc7b89cSJunchao Zhang 3599dc7b89cSJunchao Zhang template <class MemorySpace> 360*9371c9d4SSatish Balay PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM da, Vec vec, ConstPetscScalarKokkosOffsetView2DType<MemorySpace> *ov) { 3619dc7b89cSJunchao Zhang PetscInt xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof; 3629dc7b89cSJunchao Zhang ConstPetscScalarKokkosViewType<MemorySpace> kv; 3639dc7b89cSJunchao Zhang 3649dc7b89cSJunchao Zhang PetscFunctionBegin; 3659dc7b89cSJunchao Zhang PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA); 3669dc7b89cSJunchao Zhang PetscValidHeaderSpecific(vec, VEC_CLASSID, 2); 3679dc7b89cSJunchao Zhang PetscValidPointer(ov, 3); 3689dc7b89cSJunchao Zhang DMDA_VEC_GET_SHAPE(da, vec, xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof); 3699dc7b89cSJunchao Zhang PetscCheck(dim == 1, PETSC_COMM_SELF, PETSC_ERR_ARG_CORRUPT, "KokkosOffsetView is 2D but DMDA is %dD", (int)dim); 3709566063dSJacob Faibussowitsch PetscCall(VecGetKokkosView(vec, &kv)); 3719dc7b89cSJunchao Zhang *ov = ConstPetscScalarKokkosOffsetView2DType<MemorySpace>(kv.data(), {gxs, 0}, {gxs + gxm, dof}); 3729dc7b89cSJunchao Zhang PetscFunctionReturn(0); 3739dc7b89cSJunchao Zhang } 3749dc7b89cSJunchao Zhang 3759dc7b89cSJunchao Zhang template <class MemorySpace> 376*9371c9d4SSatish Balay PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM da, Vec vec, ConstPetscScalarKokkosOffsetView2DType<MemorySpace> *ov) { 3779dc7b89cSJunchao Zhang ConstPetscScalarKokkosViewType<MemorySpace> kv; 3789dc7b89cSJunchao Zhang 3799dc7b89cSJunchao Zhang PetscFunctionBegin; 3809dc7b89cSJunchao Zhang PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA); 3819dc7b89cSJunchao Zhang PetscValidHeaderSpecific(vec, VEC_CLASSID, 2); 3829dc7b89cSJunchao Zhang PetscValidPointer(ov, 3); 3839dc7b89cSJunchao Zhang kv = ConstPetscScalarKokkosViewType<MemorySpace>(ov->data(), ov->extent(0) * ov->extent(1)); 3849566063dSJacob Faibussowitsch PetscCall(VecRestoreKokkosView(vec, &kv)); 3859dc7b89cSJunchao Zhang PetscFunctionReturn(0); 3869dc7b89cSJunchao Zhang } 3879dc7b89cSJunchao Zhang 3889dc7b89cSJunchao Zhang /* ============================== 3D including DOF ================================= */ 3899dc7b89cSJunchao Zhang template <class MemorySpace> 390*9371c9d4SSatish Balay PetscErrorCode DMDAVecGetKokkosOffsetViewDOF_Private(DM da, Vec vec, PetscScalarKokkosOffsetView3DType<MemorySpace> *ov, PetscBool overwrite) { 3919dc7b89cSJunchao Zhang PetscInt xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof; 3929dc7b89cSJunchao Zhang PetscScalarKokkosViewType<MemorySpace> kv; 3939dc7b89cSJunchao Zhang 3949dc7b89cSJunchao Zhang PetscFunctionBegin; 3959dc7b89cSJunchao Zhang PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA); 3969dc7b89cSJunchao Zhang PetscValidHeaderSpecific(vec, VEC_CLASSID, 2); 3979dc7b89cSJunchao Zhang PetscValidPointer(ov, 3); 3989dc7b89cSJunchao Zhang DMDA_VEC_GET_SHAPE(da, vec, xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof); 3999dc7b89cSJunchao Zhang PetscCheck(dim == 2, PETSC_COMM_SELF, PETSC_ERR_ARG_CORRUPT, "KokkosOffsetView is 3D but DMDA is %dD", (int)dim); 4009566063dSJacob Faibussowitsch if (overwrite) PetscCall(VecGetKokkosViewWrite(vec, &kv)); 4019566063dSJacob Faibussowitsch else PetscCall(VecGetKokkosView(vec, &kv)); 4029dc7b89cSJunchao Zhang *ov = PetscScalarKokkosOffsetView3DType<MemorySpace>(kv.data(), {gys, gxs, 0}, {gys + gym, gxs + gxm, dof}); 4039dc7b89cSJunchao Zhang PetscFunctionReturn(0); 4049dc7b89cSJunchao Zhang } 4059dc7b89cSJunchao Zhang 4069dc7b89cSJunchao Zhang template <class MemorySpace> 407*9371c9d4SSatish Balay PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF_Private(DM da, Vec vec, PetscScalarKokkosOffsetView3DType<MemorySpace> *ov, PetscBool overwrite) { 4089dc7b89cSJunchao Zhang PetscScalarKokkosViewType<MemorySpace> kv; 4099dc7b89cSJunchao Zhang 4109dc7b89cSJunchao Zhang PetscFunctionBegin; 4119dc7b89cSJunchao Zhang PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA); 4129dc7b89cSJunchao Zhang PetscValidHeaderSpecific(vec, VEC_CLASSID, 2); 4139dc7b89cSJunchao Zhang PetscValidPointer(ov, 3); 4149dc7b89cSJunchao Zhang kv = PetscScalarKokkosViewType<MemorySpace>(ov->data(), ov->extent(0) * ov->extent(1) * ov->extent(2)); 4159566063dSJacob Faibussowitsch if (overwrite) PetscCall(VecRestoreKokkosViewWrite(vec, &kv)); 4169566063dSJacob Faibussowitsch else PetscCall(VecRestoreKokkosView(vec, &kv)); 4179dc7b89cSJunchao Zhang PetscFunctionReturn(0); 4189dc7b89cSJunchao Zhang } 4199dc7b89cSJunchao Zhang 4209dc7b89cSJunchao Zhang template <class MemorySpace> 421*9371c9d4SSatish Balay PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM da, Vec vec, ConstPetscScalarKokkosOffsetView3DType<MemorySpace> *ov) { 4229dc7b89cSJunchao Zhang PetscInt xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof; 4239dc7b89cSJunchao Zhang ConstPetscScalarKokkosViewType<MemorySpace> kv; 4249dc7b89cSJunchao Zhang 4259dc7b89cSJunchao Zhang PetscFunctionBegin; 4269dc7b89cSJunchao Zhang PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA); 4279dc7b89cSJunchao Zhang PetscValidHeaderSpecific(vec, VEC_CLASSID, 2); 4289dc7b89cSJunchao Zhang PetscValidPointer(ov, 3); 4299dc7b89cSJunchao Zhang DMDA_VEC_GET_SHAPE(da, vec, xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof); 4309dc7b89cSJunchao Zhang PetscCheck(dim == 2, PETSC_COMM_SELF, PETSC_ERR_ARG_CORRUPT, "KokkosOffsetView is 3D but DMDA is %dD", (int)dim); 4319566063dSJacob Faibussowitsch PetscCall(VecGetKokkosView(vec, &kv)); 4329dc7b89cSJunchao Zhang *ov = ConstPetscScalarKokkosOffsetView3DType<MemorySpace>(kv.data(), {gys, gxs, 0}, {gys + gym, gxs + gxm, dof}); 4339dc7b89cSJunchao Zhang PetscFunctionReturn(0); 4349dc7b89cSJunchao Zhang } 4359dc7b89cSJunchao Zhang 4369dc7b89cSJunchao Zhang template <class MemorySpace> 437*9371c9d4SSatish Balay PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM da, Vec vec, ConstPetscScalarKokkosOffsetView3DType<MemorySpace> *ov) { 4389dc7b89cSJunchao Zhang ConstPetscScalarKokkosViewType<MemorySpace> kv; 4399dc7b89cSJunchao Zhang 4409dc7b89cSJunchao Zhang PetscFunctionBegin; 4419dc7b89cSJunchao Zhang PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA); 4429dc7b89cSJunchao Zhang PetscValidHeaderSpecific(vec, VEC_CLASSID, 2); 4439dc7b89cSJunchao Zhang PetscValidPointer(ov, 3); 4449dc7b89cSJunchao Zhang kv = ConstPetscScalarKokkosViewType<MemorySpace>(ov->data(), ov->extent(0) * ov->extent(1) * ov->extent(2)); 4459566063dSJacob Faibussowitsch PetscCall(VecRestoreKokkosView(vec, &kv)); 4469dc7b89cSJunchao Zhang PetscFunctionReturn(0); 4479dc7b89cSJunchao Zhang } 4489dc7b89cSJunchao Zhang 4499dc7b89cSJunchao Zhang /* ============================== 4D including DOF ================================= */ 4509dc7b89cSJunchao Zhang template <class MemorySpace> 451*9371c9d4SSatish Balay PetscErrorCode DMDAVecGetKokkosOffsetViewDOF_Private(DM da, Vec vec, PetscScalarKokkosOffsetView4DType<MemorySpace> *ov, PetscBool overwrite) { 4529dc7b89cSJunchao Zhang PetscInt xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof; 4539dc7b89cSJunchao Zhang PetscScalarKokkosViewType<MemorySpace> kv; 4549dc7b89cSJunchao Zhang 4559dc7b89cSJunchao Zhang PetscFunctionBegin; 4569dc7b89cSJunchao Zhang PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA); 4579dc7b89cSJunchao Zhang PetscValidHeaderSpecific(vec, VEC_CLASSID, 2); 4589dc7b89cSJunchao Zhang PetscValidPointer(ov, 3); 4599dc7b89cSJunchao Zhang DMDA_VEC_GET_SHAPE(da, vec, xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof); 4609dc7b89cSJunchao Zhang PetscCheck(dim == 3, PETSC_COMM_SELF, PETSC_ERR_ARG_CORRUPT, "KokkosOffsetView is 4D but DMDA is %dD", (int)dim); 4619566063dSJacob Faibussowitsch if (overwrite) PetscCall(VecGetKokkosViewWrite(vec, &kv)); 4629566063dSJacob Faibussowitsch else PetscCall(VecGetKokkosView(vec, &kv)); 4639dc7b89cSJunchao Zhang *ov = PetscScalarKokkosOffsetView4DType<MemorySpace>(kv.data(), {gzs, gys, gxs, 0}, {gzs + gzm, gys + gym, gxs + gxm, dof}); 4649dc7b89cSJunchao Zhang PetscFunctionReturn(0); 4659dc7b89cSJunchao Zhang } 4669dc7b89cSJunchao Zhang 4679dc7b89cSJunchao Zhang template <class MemorySpace> 468*9371c9d4SSatish Balay PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF_Private(DM da, Vec vec, PetscScalarKokkosOffsetView4DType<MemorySpace> *ov, PetscBool overwrite) { 4699dc7b89cSJunchao Zhang PetscScalarKokkosViewType<MemorySpace> kv; 4709dc7b89cSJunchao Zhang 4719dc7b89cSJunchao Zhang PetscFunctionBegin; 4729dc7b89cSJunchao Zhang PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA); 4739dc7b89cSJunchao Zhang PetscValidHeaderSpecific(vec, VEC_CLASSID, 2); 4749dc7b89cSJunchao Zhang PetscValidPointer(ov, 3); 4759dc7b89cSJunchao Zhang kv = PetscScalarKokkosViewType<MemorySpace>(ov->data(), ov->extent(0) * ov->extent(1) * ov->extent(2) * ov->extent(3)); 4769566063dSJacob Faibussowitsch if (overwrite) PetscCall(VecRestoreKokkosViewWrite(vec, &kv)); 4779566063dSJacob Faibussowitsch else PetscCall(VecRestoreKokkosView(vec, &kv)); 4789dc7b89cSJunchao Zhang PetscFunctionReturn(0); 4799dc7b89cSJunchao Zhang } 4809dc7b89cSJunchao Zhang 4819dc7b89cSJunchao Zhang template <class MemorySpace> 482*9371c9d4SSatish Balay PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM da, Vec vec, ConstPetscScalarKokkosOffsetView4DType<MemorySpace> *ov) { 4839dc7b89cSJunchao Zhang PetscInt xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof; 4849dc7b89cSJunchao Zhang ConstPetscScalarKokkosViewType<MemorySpace> kv; 4859dc7b89cSJunchao Zhang 4869dc7b89cSJunchao Zhang PetscFunctionBegin; 4879dc7b89cSJunchao Zhang PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA); 4889dc7b89cSJunchao Zhang PetscValidHeaderSpecific(vec, VEC_CLASSID, 2); 4899dc7b89cSJunchao Zhang PetscValidPointer(ov, 3); 4909dc7b89cSJunchao Zhang DMDA_VEC_GET_SHAPE(da, vec, xs, ys, zs, xm, ym, zm, gxs, gys, gzs, gxm, gym, gzm, N, dim, dof); 4919dc7b89cSJunchao Zhang PetscCheck(dim == 3, PETSC_COMM_SELF, PETSC_ERR_ARG_CORRUPT, "KokkosOffsetView is 4D but DMDA is %dD", (int)dim); 4929566063dSJacob Faibussowitsch PetscCall(VecGetKokkosView(vec, &kv)); 4939dc7b89cSJunchao Zhang *ov = ConstPetscScalarKokkosOffsetView4DType<MemorySpace>(kv.data(), {gzs, gys, gxs, 0}, {gzs + gzm, gys + gym, gxs + gxm, dof}); 4949dc7b89cSJunchao Zhang PetscFunctionReturn(0); 4959dc7b89cSJunchao Zhang } 4969dc7b89cSJunchao Zhang 4979dc7b89cSJunchao Zhang template <class MemorySpace> 498*9371c9d4SSatish Balay PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM da, Vec vec, ConstPetscScalarKokkosOffsetView4DType<MemorySpace> *ov) { 4999dc7b89cSJunchao Zhang ConstPetscScalarKokkosViewType<MemorySpace> kv; 5009dc7b89cSJunchao Zhang 5019dc7b89cSJunchao Zhang PetscFunctionBegin; 5029dc7b89cSJunchao Zhang PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA); 5039dc7b89cSJunchao Zhang PetscValidHeaderSpecific(vec, VEC_CLASSID, 2); 5049dc7b89cSJunchao Zhang PetscValidPointer(ov, 3); 5059dc7b89cSJunchao Zhang kv = ConstPetscScalarKokkosViewType<MemorySpace>(ov->data(), ov->extent(0) * ov->extent(1) * ov->extent(2) * ov->extent(3)); 5069566063dSJacob Faibussowitsch PetscCall(VecRestoreKokkosView(vec, &kv)); 5079dc7b89cSJunchao Zhang PetscFunctionReturn(0); 5089dc7b89cSJunchao Zhang } 5099dc7b89cSJunchao Zhang 5109dc7b89cSJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM, Vec, ConstPetscScalarKokkosOffsetView2D *); 5119dc7b89cSJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM, Vec, ConstPetscScalarKokkosOffsetView2D *); 512*9371c9d4SSatish Balay template <> 513*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM da, Vec vec, PetscScalarKokkosOffsetView2D *ov) { 514*9371c9d4SSatish Balay return DMDAVecGetKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_FALSE); 515*9371c9d4SSatish Balay } 516*9371c9d4SSatish Balay template <> 517*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM da, Vec vec, PetscScalarKokkosOffsetView2D *ov) { 518*9371c9d4SSatish Balay return DMDAVecRestoreKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_FALSE); 519*9371c9d4SSatish Balay } 520*9371c9d4SSatish Balay template <> 521*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOFWrite(DM da, Vec vec, PetscScalarKokkosOffsetView2D *ov) { 522*9371c9d4SSatish Balay return DMDAVecGetKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_TRUE); 523*9371c9d4SSatish Balay } 524*9371c9d4SSatish Balay template <> 525*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOFWrite(DM da, Vec vec, PetscScalarKokkosOffsetView2D *ov) { 526*9371c9d4SSatish Balay return DMDAVecRestoreKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_TRUE); 527*9371c9d4SSatish Balay } 5289dc7b89cSJunchao Zhang 5299dc7b89cSJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM, Vec, ConstPetscScalarKokkosOffsetView3D *); 5309dc7b89cSJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM, Vec, ConstPetscScalarKokkosOffsetView3D *); 531*9371c9d4SSatish Balay template <> 532*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM da, Vec vec, PetscScalarKokkosOffsetView3D *ov) { 533*9371c9d4SSatish Balay return DMDAVecGetKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_FALSE); 534*9371c9d4SSatish Balay } 535*9371c9d4SSatish Balay template <> 536*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM da, Vec vec, PetscScalarKokkosOffsetView3D *ov) { 537*9371c9d4SSatish Balay return DMDAVecRestoreKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_FALSE); 538*9371c9d4SSatish Balay } 539*9371c9d4SSatish Balay template <> 540*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOFWrite(DM da, Vec vec, PetscScalarKokkosOffsetView3D *ov) { 541*9371c9d4SSatish Balay return DMDAVecGetKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_TRUE); 542*9371c9d4SSatish Balay } 543*9371c9d4SSatish Balay template <> 544*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOFWrite(DM da, Vec vec, PetscScalarKokkosOffsetView3D *ov) { 545*9371c9d4SSatish Balay return DMDAVecRestoreKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_TRUE); 546*9371c9d4SSatish Balay } 5479dc7b89cSJunchao Zhang 5489dc7b89cSJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM, Vec, ConstPetscScalarKokkosOffsetView4D *); 5499dc7b89cSJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM, Vec, ConstPetscScalarKokkosOffsetView4D *); 550*9371c9d4SSatish Balay template <> 551*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM da, Vec vec, PetscScalarKokkosOffsetView4D *ov) { 552*9371c9d4SSatish Balay return DMDAVecGetKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_FALSE); 553*9371c9d4SSatish Balay } 554*9371c9d4SSatish Balay template <> 555*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM da, Vec vec, PetscScalarKokkosOffsetView4D *ov) { 556*9371c9d4SSatish Balay return DMDAVecRestoreKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_FALSE); 557*9371c9d4SSatish Balay } 558*9371c9d4SSatish Balay template <> 559*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOFWrite(DM da, Vec vec, PetscScalarKokkosOffsetView4D *ov) { 560*9371c9d4SSatish Balay return DMDAVecGetKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_TRUE); 561*9371c9d4SSatish Balay } 562*9371c9d4SSatish Balay template <> 563*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOFWrite(DM da, Vec vec, PetscScalarKokkosOffsetView4D *ov) { 564*9371c9d4SSatish Balay return DMDAVecRestoreKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_TRUE); 565*9371c9d4SSatish Balay } 5669dc7b89cSJunchao Zhang 5679dc7b89cSJunchao Zhang #if !defined(KOKKOS_ENABLE_DEFAULT_DEVICE_TYPE_HOST) /* Get host views if the default memory space is not host space */ 5689dc7b89cSJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM, Vec, ConstPetscScalarKokkosOffsetView2DHost *); 5699dc7b89cSJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM, Vec, ConstPetscScalarKokkosOffsetView2DHost *); 570*9371c9d4SSatish Balay template <> 571*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM da, Vec vec, PetscScalarKokkosOffsetView2DHost *ov) { 572*9371c9d4SSatish Balay return DMDAVecGetKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_FALSE); 573*9371c9d4SSatish Balay } 574*9371c9d4SSatish Balay template <> 575*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM da, Vec vec, PetscScalarKokkosOffsetView2DHost *ov) { 576*9371c9d4SSatish Balay return DMDAVecRestoreKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_FALSE); 577*9371c9d4SSatish Balay } 578*9371c9d4SSatish Balay template <> 579*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOFWrite(DM da, Vec vec, PetscScalarKokkosOffsetView2DHost *ov) { 580*9371c9d4SSatish Balay return DMDAVecGetKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_TRUE); 581*9371c9d4SSatish Balay } 582*9371c9d4SSatish Balay template <> 583*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOFWrite(DM da, Vec vec, PetscScalarKokkosOffsetView2DHost *ov) { 584*9371c9d4SSatish Balay return DMDAVecRestoreKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_TRUE); 585*9371c9d4SSatish Balay } 5869dc7b89cSJunchao Zhang 5879dc7b89cSJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM, Vec, ConstPetscScalarKokkosOffsetView3DHost *); 5889dc7b89cSJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM, Vec, ConstPetscScalarKokkosOffsetView3DHost *); 589*9371c9d4SSatish Balay template <> 590*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM da, Vec vec, PetscScalarKokkosOffsetView3DHost *ov) { 591*9371c9d4SSatish Balay return DMDAVecGetKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_FALSE); 592*9371c9d4SSatish Balay } 593*9371c9d4SSatish Balay template <> 594*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM da, Vec vec, PetscScalarKokkosOffsetView3DHost *ov) { 595*9371c9d4SSatish Balay return DMDAVecRestoreKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_FALSE); 596*9371c9d4SSatish Balay } 597*9371c9d4SSatish Balay template <> 598*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOFWrite(DM da, Vec vec, PetscScalarKokkosOffsetView3DHost *ov) { 599*9371c9d4SSatish Balay return DMDAVecGetKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_TRUE); 600*9371c9d4SSatish Balay } 601*9371c9d4SSatish Balay template <> 602*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOFWrite(DM da, Vec vec, PetscScalarKokkosOffsetView3DHost *ov) { 603*9371c9d4SSatish Balay return DMDAVecRestoreKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_TRUE); 604*9371c9d4SSatish Balay } 6059dc7b89cSJunchao Zhang 6069dc7b89cSJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM, Vec, ConstPetscScalarKokkosOffsetView4DHost *); 6079dc7b89cSJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM, Vec, ConstPetscScalarKokkosOffsetView4DHost *); 608*9371c9d4SSatish Balay template <> 609*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOF(DM da, Vec vec, PetscScalarKokkosOffsetView4DHost *ov) { 610*9371c9d4SSatish Balay return DMDAVecGetKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_FALSE); 611*9371c9d4SSatish Balay } 612*9371c9d4SSatish Balay template <> 613*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOF(DM da, Vec vec, PetscScalarKokkosOffsetView4DHost *ov) { 614*9371c9d4SSatish Balay return DMDAVecRestoreKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_FALSE); 615*9371c9d4SSatish Balay } 616*9371c9d4SSatish Balay template <> 617*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewDOFWrite(DM da, Vec vec, PetscScalarKokkosOffsetView4DHost *ov) { 618*9371c9d4SSatish Balay return DMDAVecGetKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_TRUE); 619*9371c9d4SSatish Balay } 620*9371c9d4SSatish Balay template <> 621*9371c9d4SSatish Balay PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewDOFWrite(DM da, Vec vec, PetscScalarKokkosOffsetView4DHost *ov) { 622*9371c9d4SSatish Balay return DMDAVecRestoreKokkosOffsetViewDOF_Private(da, vec, ov, PETSC_TRUE); 623*9371c9d4SSatish Balay } 6249dc7b89cSJunchao Zhang #endif 625