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