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