Actual source code: math2opusutils.cu
1: #include <petsc/private/matimpl.h>
2: #include <petsc/private/vecimpl.h>
3: #include <petscsf.h>
4: #if PetscDefined(HAVE_CUDA)
5: #include <thrust/for_each.h>
6: #include <thrust/device_vector.h>
7: #include <thrust/execution_policy.h>
8: #endif
10: PETSC_INTERN PetscErrorCode MatDenseGetH2OpusStridedSF(Mat A, PetscSF h2sf, PetscSF *osf)
11: {
12: PetscSF asf;
14: PetscFunctionBegin;
17: PetscAssertPointer(osf, 3);
18: PetscCall(PetscObjectQuery((PetscObject)A, "_math2opus_stridedsf", (PetscObject *)&asf));
19: if (!asf) {
20: PetscInt lda;
22: PetscCall(MatDenseGetLDA(A, &lda));
23: PetscCall(PetscSFCreateStridedSF(h2sf, A->cmap->N, lda, PETSC_DECIDE, &asf));
24: PetscCall(PetscObjectCompose((PetscObject)A, "_math2opus_stridedsf", (PetscObject)asf));
25: PetscCall(PetscObjectDereference((PetscObject)asf));
26: }
27: *osf = asf;
28: PetscFunctionReturn(PETSC_SUCCESS);
29: }