1*054def41SToby Isaac #pragma once 2*054def41SToby Isaac #include <../src/vec/is/sf/impls/basic/sfpack.h> 3*054def41SToby Isaac #include <petsc/private/cupminterface.hpp> 4*054def41SToby Isaac #include <petsc/private/cupmatomics.hpp> 5*054def41SToby Isaac #include <petsc/private/deviceimpl.h> 6*054def41SToby Isaac 7*054def41SToby Isaac namespace Petsc 8*054def41SToby Isaac { 9*054def41SToby Isaac 10*054def41SToby Isaac namespace sf 11*054def41SToby Isaac { 12*054def41SToby Isaac 13*054def41SToby Isaac namespace cupm 14*054def41SToby Isaac { 15*054def41SToby Isaac 16*054def41SToby Isaac namespace impl 17*054def41SToby Isaac { 18*054def41SToby Isaac 19*054def41SToby Isaac template <device::cupm::DeviceType T> 20*054def41SToby Isaac struct SfInterface : device::cupm::impl::Interface<T> { 21*054def41SToby Isaac PETSC_CUPM_INHERIT_INTERFACE_TYPEDEFS_USING(T); 22*054def41SToby Isaac 23*054def41SToby Isaac private: 24*054def41SToby Isaac template <typename Type, PetscInt BS, PetscInt EQ> 25*054def41SToby Isaac static PetscErrorCode Pack(PetscSFLink, PetscInt, PetscInt, PetscSFPackOpt, const PetscInt *, const void *, void *) noexcept; 26*054def41SToby Isaac 27*054def41SToby Isaac template <typename Type, class Op, PetscInt BS, PetscInt EQ> 28*054def41SToby Isaac static PetscErrorCode UnpackAndOp(PetscSFLink, PetscInt, PetscInt, PetscSFPackOpt, const PetscInt *, void *, const void *) noexcept; 29*054def41SToby Isaac 30*054def41SToby Isaac template <typename Type, class Op, PetscInt BS, PetscInt EQ> 31*054def41SToby Isaac static PetscErrorCode FetchAndOp(PetscSFLink, PetscInt, PetscInt, PetscSFPackOpt, const PetscInt *, void *, void *) noexcept; 32*054def41SToby Isaac 33*054def41SToby Isaac template <typename Type, class Op, PetscInt BS, PetscInt EQ> 34*054def41SToby Isaac static PetscErrorCode ScatterAndOp(PetscSFLink, PetscInt, PetscInt, PetscSFPackOpt, const PetscInt *, const void *, PetscInt, PetscSFPackOpt, const PetscInt *, void *) noexcept; 35*054def41SToby Isaac 36*054def41SToby Isaac template <typename Type, PetscInt BS, PetscInt EQ> 37*054def41SToby Isaac static PetscErrorCode ScatterAndInsert(PetscSFLink, PetscInt, PetscInt, PetscSFPackOpt, const PetscInt *, const void *, PetscInt, PetscSFPackOpt, const PetscInt *, void *) noexcept; 38*054def41SToby Isaac 39*054def41SToby Isaac template <typename Type, class Op, PetscInt BS, PetscInt EQ> 40*054def41SToby Isaac static PetscErrorCode FetchAndOpLocal(PetscSFLink, PetscInt, PetscInt, PetscSFPackOpt, const PetscInt *, void *, PetscInt, PetscSFPackOpt, const PetscInt *, const void *, void *) noexcept; 41*054def41SToby Isaac 42*054def41SToby Isaac template <typename Type, PetscInt BS, PetscInt EQ> 43*054def41SToby Isaac static void PackInit_RealType(PetscSFLink) noexcept; 44*054def41SToby Isaac 45*054def41SToby Isaac template <typename Type, PetscInt BS, PetscInt EQ, PetscInt size /*sizeof(Type)*/> 46*054def41SToby Isaac struct PackInit_IntegerType_Atomic; 47*054def41SToby Isaac 48*054def41SToby Isaac template <typename Type, PetscInt BS, PetscInt EQ> 49*054def41SToby Isaac static void PackInit_IntegerType(PetscSFLink link) noexcept; 50*054def41SToby Isaac 51*054def41SToby Isaac #if PetscDefined(HAVE_COMPLEX) 52*054def41SToby Isaac template <typename Type, PetscInt BS, PetscInt EQ> 53*054def41SToby Isaac static void PackInit_ComplexType(PetscSFLink link) noexcept; 54*054def41SToby Isaac #endif 55*054def41SToby Isaac 56*054def41SToby Isaac template <typename Type> 57*054def41SToby Isaac static void PackInit_PairType(PetscSFLink link) noexcept; 58*054def41SToby Isaac 59*054def41SToby Isaac template <typename Type, PetscInt BS, PetscInt EQ> 60*054def41SToby Isaac static void PackInit_DumbType(PetscSFLink link) noexcept; 61*054def41SToby Isaac 62*054def41SToby Isaac static PetscErrorCode LinkSyncDevice(PetscSFLink) noexcept; 63*054def41SToby Isaac static PetscErrorCode LinkSyncStream(PetscSFLink) noexcept; 64*054def41SToby Isaac static PetscErrorCode LinkMemcpy(PetscSFLink, PetscMemType, void *, PetscMemType, const void *, size_t) noexcept; 65*054def41SToby Isaac static PetscErrorCode LinkDestroy_MPI(PetscSF, PetscSFLink) noexcept; 66*054def41SToby Isaac 67*054def41SToby Isaac public: 68*054def41SToby Isaac static PetscErrorCode Malloc(PetscMemType, size_t, void **) noexcept; 69*054def41SToby Isaac static PetscErrorCode Free(PetscMemType, void *) noexcept; 70*054def41SToby Isaac static PetscErrorCode LinkSetUp(PetscSF, PetscSFLink, MPI_Datatype) noexcept; 71*054def41SToby Isaac }; 72*054def41SToby Isaac 73*054def41SToby Isaac } // namespace impl 74*054def41SToby Isaac 75*054def41SToby Isaac } // namespace cupm 76*054def41SToby Isaac 77*054def41SToby Isaac } // namespace sf 78*054def41SToby Isaac 79*054def41SToby Isaac } // namespace Petsc 80