xref: /petsc/src/mat/utils/veccreatematdense.c (revision ad6ad4e1001d671871ea421207c339a82ab9a82f)
1*ad6ad4e1SHansol  Suh #include <petscmat.h>              /*I "petscmat.h" I*/
2*ad6ad4e1SHansol  Suh #include <petsc/private/vecimpl.h> /*I "petscvec.h" I*/
3*ad6ad4e1SHansol  Suh 
4*ad6ad4e1SHansol  Suh /*@
5*ad6ad4e1SHansol  Suh   VecCreateMatDense - Create a matrix that matches the type of a Vec.
6*ad6ad4e1SHansol  Suh 
7*ad6ad4e1SHansol  Suh   Collective
8*ad6ad4e1SHansol  Suh 
9*ad6ad4e1SHansol  Suh   Input Parameters:
10*ad6ad4e1SHansol  Suh + X    - the vector
11*ad6ad4e1SHansol  Suh . m    - number of local rows (or `PETSC_DECIDE` to have calculated if `M` is given)
12*ad6ad4e1SHansol  Suh . n    - number of local columns (or `PETSC_DECIDE` to have calculated if `N` is given)
13*ad6ad4e1SHansol  Suh . M    - number of global rows (or `PETSC_DECIDE` to have calculated if `m` is given)
14*ad6ad4e1SHansol  Suh . N    - number of global columns (or `PETSC_DECIDE` to have calculated if `n` is given)
15*ad6ad4e1SHansol  Suh - data - optional location of matrix data, which should have the same memory type as the vector. Pass `NULL` to have PETSc to control matrix.
16*ad6ad4e1SHansol  Suh          memory allocation.
17*ad6ad4e1SHansol  Suh 
18*ad6ad4e1SHansol  Suh   Output Parameter:
19*ad6ad4e1SHansol  Suh . A - the matrix.  `A` will have the same communicator as `X` and the same `PetscMemType`.
20*ad6ad4e1SHansol  Suh 
21*ad6ad4e1SHansol  Suh   Level: advanced
22*ad6ad4e1SHansol  Suh 
23*ad6ad4e1SHansol  Suh .seealso: [](chapter_matrices), `Mat`, `MatCreateDense()', `MatCreateDenseCUDA()`, `MatCreateDenseHIP()`, `PetscMemType`
24*ad6ad4e1SHansol  Suh @*/
25*ad6ad4e1SHansol  Suh PetscErrorCode VecCreateMatDense(Vec X, PetscInt m, PetscInt n, PetscInt M, PetscInt N, PetscScalar *data, Mat *A)
26*ad6ad4e1SHansol  Suh {
27*ad6ad4e1SHansol  Suh   VecType   root_type;
28*ad6ad4e1SHansol  Suh   PetscBool isstd, iscuda, iship;
29*ad6ad4e1SHansol  Suh   MPI_Comm  comm;
30*ad6ad4e1SHansol  Suh 
31*ad6ad4e1SHansol  Suh   PetscFunctionBegin;
32*ad6ad4e1SHansol  Suh   PetscCall(VecGetRootType_Private(X, &root_type));
33*ad6ad4e1SHansol  Suh   PetscCall(PetscObjectGetComm((PetscObject)X, &comm));
34*ad6ad4e1SHansol  Suh   PetscCall(PetscStrcmp(root_type, VECSTANDARD, &isstd));
35*ad6ad4e1SHansol  Suh   PetscCall(PetscStrcmp(root_type, VECCUDA, &iscuda));
36*ad6ad4e1SHansol  Suh   PetscCall(PetscStrcmp(root_type, VECHIP, &iship));
37*ad6ad4e1SHansol  Suh 
38*ad6ad4e1SHansol  Suh   /* For performance-portable types (Kokkos, SYCL, ...) that dispatch to */
39*ad6ad4e1SHansol  Suh   if (!(isstd || iscuda || iship)) {
40*ad6ad4e1SHansol  Suh     const PetscScalar *array;
41*ad6ad4e1SHansol  Suh     PetscMemType       memtype;
42*ad6ad4e1SHansol  Suh 
43*ad6ad4e1SHansol  Suh     PetscCall(VecGetArrayReadAndMemType(X, &array, &memtype));
44*ad6ad4e1SHansol  Suh     PetscCall(VecRestoreArrayReadAndMemType(X, &array));
45*ad6ad4e1SHansol  Suh     switch (memtype) {
46*ad6ad4e1SHansol  Suh     case PETSC_MEMTYPE_HOST:
47*ad6ad4e1SHansol  Suh       isstd = PETSC_TRUE;
48*ad6ad4e1SHansol  Suh       break;
49*ad6ad4e1SHansol  Suh     case PETSC_MEMTYPE_CUDA:
50*ad6ad4e1SHansol  Suh     case PETSC_MEMTYPE_NVSHMEM:
51*ad6ad4e1SHansol  Suh       iscuda = PETSC_TRUE;
52*ad6ad4e1SHansol  Suh       break;
53*ad6ad4e1SHansol  Suh     case PETSC_MEMTYPE_HIP:
54*ad6ad4e1SHansol  Suh       iship = PETSC_TRUE;
55*ad6ad4e1SHansol  Suh       break;
56*ad6ad4e1SHansol  Suh     default:
57*ad6ad4e1SHansol  Suh       SETERRQ(PetscObjectComm((PetscObject)X), PETSC_ERR_SUP, "Cannot figure out memory type of vector type %s", root_type);
58*ad6ad4e1SHansol  Suh     }
59*ad6ad4e1SHansol  Suh   }
60*ad6ad4e1SHansol  Suh 
61*ad6ad4e1SHansol  Suh   if (isstd) {
62*ad6ad4e1SHansol  Suh     PetscCall(MatCreateDense(comm, m, n, M, N, data, A));
63*ad6ad4e1SHansol  Suh   }
64*ad6ad4e1SHansol  Suh #if defined(PETSC_HAVE_CUDA)
65*ad6ad4e1SHansol  Suh   else if (iscuda) {
66*ad6ad4e1SHansol  Suh     PetscCall(MatCreateDenseCUDA(comm, m, n, M, N, data, A));
67*ad6ad4e1SHansol  Suh   }
68*ad6ad4e1SHansol  Suh #endif
69*ad6ad4e1SHansol  Suh #if defined(PETSC_HAVE_HIP)
70*ad6ad4e1SHansol  Suh   else if (iship) {
71*ad6ad4e1SHansol  Suh     PetscCall(MatCreateDenseHIP(comm, m, n, M, N, data, A));
72*ad6ad4e1SHansol  Suh   }
73*ad6ad4e1SHansol  Suh #endif
74*ad6ad4e1SHansol  Suh   PetscFunctionReturn(PETSC_SUCCESS);
75*ad6ad4e1SHansol  Suh }
76