1*c6583b63SJunchao Zhang #include <petsc/private/vecimpl_kokkos.hpp> 2*c6583b63SJunchao Zhang #include <petsc/private/dmdaimpl.h> 3*c6583b63SJunchao Zhang #include <petscdmda_kokkos.hpp> 4*c6583b63SJunchao Zhang 5*c6583b63SJunchao Zhang /* Use macro instead of inlined function just to avoid annoying warnings like: 'dof' may be used uninitialized in this function [-Wmaybe-uninitialized] */ 6*c6583b63SJunchao Zhang #define DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof) \ 7*c6583b63SJunchao Zhang do { \ 8*c6583b63SJunchao Zhang PetscErrorCode ierr; \ 9*c6583b63SJunchao Zhang ierr = DMDAGetCorners(da,&xs,&ys,&zs,&xm,&ym,&zm);CHKERRQ(ierr); \ 10*c6583b63SJunchao Zhang ierr = DMDAGetGhostCorners(da,&gxs,&gys,&gzs,&gxm,&gym,&gzm);CHKERRQ(ierr); \ 11*c6583b63SJunchao Zhang ierr = DMDAGetInfo(da,&dim,NULL,NULL,NULL,NULL,NULL,NULL,&dof,NULL,NULL,NULL,NULL,NULL);CHKERRQ(ierr); \ 12*c6583b63SJunchao Zhang /* Handle case where user passes in global vector as opposed to local */ \ 13*c6583b63SJunchao Zhang ierr = VecGetLocalSize(vec,&N);CHKERRQ(ierr); \ 14*c6583b63SJunchao Zhang if (N == xm*ym*zm*dof) { \ 15*c6583b63SJunchao Zhang gxm = xm; gym = ym; gzm = zm; \ 16*c6583b63SJunchao Zhang gxs = xs; gys = ys; gzs = zs; \ 17*c6583b63SJunchao Zhang } else if (N != gxm*gym*gzm*dof) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_ARG_INCOMP,"Vector local size %D is not compatible with DMDA local sizes %D %D\n",N,xm*ym*zm*dof,gxm*gym*gzm*dof); \ 18*c6583b63SJunchao Zhang if (dim != 1) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"KokkosOffsetView is 1D but DMDA is %DD\n",dim); \ 19*c6583b63SJunchao Zhang } while (0) 20*c6583b63SJunchao Zhang 21*c6583b63SJunchao Zhang template<class MemorySpace> 22*c6583b63SJunchao Zhang PetscErrorCode DMDAVecGetKokkosOffsetView_Private(DM da,Vec vec,PetscScalarKokkosOffsetView1DType<MemorySpace> *ov,PetscBool overwrite) 23*c6583b63SJunchao Zhang { 24*c6583b63SJunchao Zhang PetscErrorCode ierr; 25*c6583b63SJunchao Zhang PetscInt xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof; 26*c6583b63SJunchao Zhang PetscScalarKokkosViewType<MemorySpace> kv; 27*c6583b63SJunchao Zhang 28*c6583b63SJunchao Zhang PetscFunctionBegin; 29*c6583b63SJunchao Zhang PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA); 30*c6583b63SJunchao Zhang PetscValidHeaderSpecific(vec,VEC_CLASSID,2); 31*c6583b63SJunchao Zhang PetscValidPointer(ov,3); 32*c6583b63SJunchao Zhang DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof); 33*c6583b63SJunchao Zhang if (overwrite) {ierr = VecGetKokkosViewWrite(vec,&kv);CHKERRQ(ierr);} 34*c6583b63SJunchao Zhang else {ierr = VecGetKokkosView(vec,&kv);CHKERRQ(ierr);} 35*c6583b63SJunchao Zhang *ov = PetscScalarKokkosOffsetView1DType<MemorySpace>(kv,{gxs*dof}); /* View to OffsetView by giving the start. The extent is already known. */ 36*c6583b63SJunchao Zhang PetscFunctionReturn(0); 37*c6583b63SJunchao Zhang } 38*c6583b63SJunchao Zhang 39*c6583b63SJunchao Zhang template<class MemorySpace> 40*c6583b63SJunchao Zhang PetscErrorCode DMDAVecRestoreKokkosOffsetView_Private(DM da,Vec vec,PetscScalarKokkosOffsetView1DType<MemorySpace> *ov,PetscBool overwrite) 41*c6583b63SJunchao Zhang { 42*c6583b63SJunchao Zhang PetscErrorCode ierr; 43*c6583b63SJunchao Zhang PetscScalarKokkosViewType<MemorySpace> kv; 44*c6583b63SJunchao Zhang 45*c6583b63SJunchao Zhang PetscFunctionBegin; 46*c6583b63SJunchao Zhang PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA); 47*c6583b63SJunchao Zhang PetscValidHeaderSpecific(vec,VEC_CLASSID,2); 48*c6583b63SJunchao Zhang PetscValidPointer(ov,3); 49*c6583b63SJunchao Zhang kv = ov->view(); /* OffsetView to View */ 50*c6583b63SJunchao Zhang if (overwrite) {ierr = VecRestoreKokkosViewWrite(vec,&kv);CHKERRQ(ierr);} 51*c6583b63SJunchao Zhang else {ierr = VecRestoreKokkosView(vec,&kv);CHKERRQ(ierr);} 52*c6583b63SJunchao Zhang PetscFunctionReturn(0); 53*c6583b63SJunchao Zhang } 54*c6583b63SJunchao Zhang 55*c6583b63SJunchao Zhang template<class MemorySpace> 56*c6583b63SJunchao Zhang PetscErrorCode DMDAVecGetKokkosOffsetView(DM da,Vec vec,ConstPetscScalarKokkosOffsetView1DType<MemorySpace> *ov) 57*c6583b63SJunchao Zhang { 58*c6583b63SJunchao Zhang PetscErrorCode ierr; 59*c6583b63SJunchao Zhang PetscInt xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof; 60*c6583b63SJunchao Zhang ConstPetscScalarKokkosViewType<MemorySpace> kv; 61*c6583b63SJunchao Zhang 62*c6583b63SJunchao Zhang PetscFunctionBegin; 63*c6583b63SJunchao Zhang PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA); 64*c6583b63SJunchao Zhang PetscValidHeaderSpecific(vec,VEC_CLASSID,2); 65*c6583b63SJunchao Zhang PetscValidPointer(ov,3); 66*c6583b63SJunchao Zhang DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof); 67*c6583b63SJunchao Zhang ierr = VecGetKokkosView(vec,&kv);CHKERRQ(ierr); 68*c6583b63SJunchao Zhang *ov = ConstPetscScalarKokkosOffsetView1DType<MemorySpace>(kv,{gxs*dof}); /* View to OffsetView */ 69*c6583b63SJunchao Zhang PetscFunctionReturn(0); 70*c6583b63SJunchao Zhang } 71*c6583b63SJunchao Zhang 72*c6583b63SJunchao Zhang template<class MemorySpace> 73*c6583b63SJunchao Zhang PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM da,Vec vec,ConstPetscScalarKokkosOffsetView1DType<MemorySpace> *ov) 74*c6583b63SJunchao Zhang { 75*c6583b63SJunchao Zhang PetscErrorCode ierr; 76*c6583b63SJunchao Zhang ConstPetscScalarKokkosViewType<MemorySpace> kv; 77*c6583b63SJunchao Zhang 78*c6583b63SJunchao Zhang PetscFunctionBegin; 79*c6583b63SJunchao Zhang PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA); 80*c6583b63SJunchao Zhang PetscValidHeaderSpecific(vec,VEC_CLASSID,2); 81*c6583b63SJunchao Zhang PetscValidPointer(ov,3); 82*c6583b63SJunchao Zhang kv = ov->view(); 83*c6583b63SJunchao Zhang ierr = VecRestoreKokkosView(vec,&kv);CHKERRQ(ierr); 84*c6583b63SJunchao Zhang PetscFunctionReturn(0); 85*c6583b63SJunchao Zhang } 86*c6583b63SJunchao Zhang 87*c6583b63SJunchao Zhang template<class MemorySpace> 88*c6583b63SJunchao Zhang PetscErrorCode DMDAVecGetKokkosOffsetView_Private(DM da,Vec vec,PetscScalarKokkosOffsetView2DType<MemorySpace> *ov,PetscBool overwrite) 89*c6583b63SJunchao Zhang { 90*c6583b63SJunchao Zhang PetscErrorCode ierr; 91*c6583b63SJunchao Zhang PetscInt xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof; 92*c6583b63SJunchao Zhang PetscScalarKokkosViewType<MemorySpace> kv; 93*c6583b63SJunchao Zhang 94*c6583b63SJunchao Zhang PetscFunctionBegin; 95*c6583b63SJunchao Zhang PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA); 96*c6583b63SJunchao Zhang PetscValidHeaderSpecific(vec,VEC_CLASSID,2); 97*c6583b63SJunchao Zhang PetscValidPointer(ov,3); 98*c6583b63SJunchao Zhang DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof); 99*c6583b63SJunchao Zhang if (overwrite) {ierr = VecGetKokkosViewWrite(vec,&kv);CHKERRQ(ierr);} 100*c6583b63SJunchao Zhang else {ierr = VecGetKokkosView(vec,&kv);CHKERRQ(ierr);} 101*c6583b63SJunchao Zhang *ov = PetscScalarKokkosOffsetView2DType<MemorySpace>(kv.data(), {gxs*dof,(gxs+gxm)*dof}, {gys*dof,(gys+gym)*dof}); /* View to OffsetView */ 102*c6583b63SJunchao Zhang PetscFunctionReturn(0); 103*c6583b63SJunchao Zhang } 104*c6583b63SJunchao Zhang 105*c6583b63SJunchao Zhang template<class MemorySpace> 106*c6583b63SJunchao Zhang PetscErrorCode DMDAVecRestoreKokkosOffsetView_Private(DM da,Vec vec,PetscScalarKokkosOffsetView2DType<MemorySpace> *ov,PetscBool overwrite) 107*c6583b63SJunchao Zhang { 108*c6583b63SJunchao Zhang PetscErrorCode ierr; 109*c6583b63SJunchao Zhang PetscScalarKokkosViewType<MemorySpace> kv; 110*c6583b63SJunchao Zhang 111*c6583b63SJunchao Zhang PetscFunctionBegin; 112*c6583b63SJunchao Zhang PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA); 113*c6583b63SJunchao Zhang PetscValidHeaderSpecific(vec,VEC_CLASSID,2); 114*c6583b63SJunchao Zhang PetscValidPointer(ov,3); 115*c6583b63SJunchao Zhang // kv = ov->view(); /* 2D OffsetView => 2D View => 1D View. Why does it not work? */ 116*c6583b63SJunchao Zhang kv = PetscScalarKokkosViewType<MemorySpace>(ov->data(),ov->extent(0)*ov->extent(1)); 117*c6583b63SJunchao Zhang if (overwrite) {ierr = VecRestoreKokkosViewWrite(vec,&kv);CHKERRQ(ierr);} 118*c6583b63SJunchao Zhang else {ierr = VecRestoreKokkosView(vec,&kv);CHKERRQ(ierr);} 119*c6583b63SJunchao Zhang PetscFunctionReturn(0); 120*c6583b63SJunchao Zhang } 121*c6583b63SJunchao Zhang 122*c6583b63SJunchao Zhang template<class MemorySpace> 123*c6583b63SJunchao Zhang PetscErrorCode DMDAVecGetKokkosOffsetView(DM da,Vec vec,ConstPetscScalarKokkosOffsetView2DType<MemorySpace> *ov) 124*c6583b63SJunchao Zhang { 125*c6583b63SJunchao Zhang PetscErrorCode ierr; 126*c6583b63SJunchao Zhang PetscInt xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof; 127*c6583b63SJunchao Zhang ConstPetscScalarKokkosViewType<MemorySpace> kv; 128*c6583b63SJunchao Zhang 129*c6583b63SJunchao Zhang PetscFunctionBegin; 130*c6583b63SJunchao Zhang PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA); 131*c6583b63SJunchao Zhang PetscValidHeaderSpecific(vec,VEC_CLASSID,2); 132*c6583b63SJunchao Zhang PetscValidPointer(ov,3); 133*c6583b63SJunchao Zhang DMDA_VEC_GET_SHAPE(da,vec,xs,ys,zs,xm,ym,zm,gxs,gys,gzs,gxm,gym,gzm,N,dim,dof); 134*c6583b63SJunchao Zhang ierr = VecGetKokkosView(vec,&kv);CHKERRQ(ierr); 135*c6583b63SJunchao Zhang *ov = ConstPetscScalarKokkosOffsetView2DType<MemorySpace>(kv.data(), {gxs*dof,(gxs+gxm)*dof}, {gys*dof,(gys+gym)*dof}); /* View to OffsetView */ 136*c6583b63SJunchao Zhang PetscFunctionReturn(0); 137*c6583b63SJunchao Zhang } 138*c6583b63SJunchao Zhang 139*c6583b63SJunchao Zhang template<class MemorySpace> 140*c6583b63SJunchao Zhang PetscErrorCode DMDAVecRestoreKokkosOffsetView(DM da,Vec vec,ConstPetscScalarKokkosOffsetView2DType<MemorySpace> *ov) 141*c6583b63SJunchao Zhang { 142*c6583b63SJunchao Zhang PetscErrorCode ierr; 143*c6583b63SJunchao Zhang ConstPetscScalarKokkosViewType<MemorySpace> kv; 144*c6583b63SJunchao Zhang 145*c6583b63SJunchao Zhang PetscFunctionBegin; 146*c6583b63SJunchao Zhang PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA); 147*c6583b63SJunchao Zhang PetscValidHeaderSpecific(vec,VEC_CLASSID,2); 148*c6583b63SJunchao Zhang PetscValidPointer(ov,3); 149*c6583b63SJunchao Zhang kv = ConstPetscScalarKokkosViewType<MemorySpace>(ov->data(),ov->extent(0)*ov->extent(1)); 150*c6583b63SJunchao Zhang ierr = VecRestoreKokkosView(vec,&kv);CHKERRQ(ierr); 151*c6583b63SJunchao Zhang PetscFunctionReturn(0); 152*c6583b63SJunchao Zhang } 153*c6583b63SJunchao Zhang 154*c6583b63SJunchao Zhang 155*c6583b63SJunchao Zhang /* Function template explicit instantiation */ 156*c6583b63SJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView (DM,Vec,ConstPetscScalarKokkosOffsetView1D*); 157*c6583b63SJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView (DM,Vec,ConstPetscScalarKokkosOffsetView1D*); 158*c6583b63SJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView (DM da,Vec vec,PetscScalarKokkosOffsetView1D* ov) {return DMDAVecGetKokkosOffsetView_Private(da,vec,ov,PETSC_FALSE);} 159*c6583b63SJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView (DM da,Vec vec,PetscScalarKokkosOffsetView1D* ov) {return DMDAVecRestoreKokkosOffsetView_Private(da,vec,ov,PETSC_FALSE);} 160*c6583b63SJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewWrite (DM da,Vec vec,PetscScalarKokkosOffsetView1D* ov) {return DMDAVecGetKokkosOffsetView_Private(da,vec,ov,PETSC_TRUE);} 161*c6583b63SJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewWrite(DM da,Vec vec,PetscScalarKokkosOffsetView1D* ov) {return DMDAVecRestoreKokkosOffsetView_Private(da,vec,ov,PETSC_TRUE);} 162*c6583b63SJunchao Zhang 163*c6583b63SJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView (DM,Vec,ConstPetscScalarKokkosOffsetView2D*); 164*c6583b63SJunchao Zhang template PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView (DM,Vec,ConstPetscScalarKokkosOffsetView2D*); 165*c6583b63SJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetView (DM da,Vec vec,PetscScalarKokkosOffsetView2D* ov) {return DMDAVecGetKokkosOffsetView_Private(da,vec,ov,PETSC_FALSE);} 166*c6583b63SJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetView (DM da,Vec vec,PetscScalarKokkosOffsetView2D* ov) {return DMDAVecRestoreKokkosOffsetView_Private(da,vec,ov,PETSC_FALSE);} 167*c6583b63SJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecGetKokkosOffsetViewWrite (DM da,Vec vec,PetscScalarKokkosOffsetView2D* ov) {return DMDAVecGetKokkosOffsetView_Private(da,vec,ov,PETSC_TRUE);} 168*c6583b63SJunchao Zhang template<> PETSC_VISIBILITY_PUBLIC PetscErrorCode DMDAVecRestoreKokkosOffsetViewWrite(DM da,Vec vec,PetscScalarKokkosOffsetView2D* ov) {return DMDAVecRestoreKokkosOffsetView_Private(da,vec,ov,PETSC_TRUE);} 169*c6583b63SJunchao Zhang 170