xref: /petsc/src/mat/tests/ex257.c (revision 061e922f3926be00487707c73b78dd3d40309129)
1 static char help[] = "Test MatDenseGetSubMatrix() on a CUDA matrix.\n";
2 
3 #include <petscmat.h>
4 
main(int argc,char ** argv)5 int main(int argc, char **argv)
6 {
7   Mat          A, B;
8   PetscScalar *b;
9   PetscInt     n = 4, lda = 5, i, k;
10   PetscBool    cuda = PETSC_FALSE;
11 
12   PetscFunctionBeginUser;
13   PetscCall(PetscInitialize(&argc, &argv, 0, help));
14   PetscCall(PetscOptionsGetInt(NULL, NULL, "-n", &n, NULL));
15   PetscCall(PetscOptionsGetInt(NULL, NULL, "-lda", &lda, NULL));
16   PetscCall(PetscOptionsGetBool(NULL, NULL, "-cuda", &cuda, NULL));
17   PetscCheck(lda >= n, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "lda %" PetscInt_FMT " < n %" PetscInt_FMT, lda, n);
18 
19 #if defined(PETSC_HAVE_CUDA)
20   if (cuda) PetscCall(MatCreateSeqDenseCUDA(PETSC_COMM_SELF, lda, n, NULL, &A));
21   else
22 #endif
23     PetscCall(MatCreateSeqDense(PETSC_COMM_SELF, lda, n, NULL, &A));
24 
25   for (k = 0; k < 3; k++) {
26     PetscCall(MatDenseGetSubMatrix(A, 0, n, 0, n, &B));
27     PetscCall(MatDenseGetArray(B, &b));
28     for (i = 0; i < n; i++) {
29       b[i + i * lda] = 2.0 * (i + 1);
30       if (i > 0) b[i + (i - 1) * lda] = (PetscReal)(k + 1);
31     }
32     PetscCall(MatDenseRestoreArray(B, &b));
33     PetscCall(MatDenseRestoreSubMatrix(A, &B));
34     PetscCall(MatView(A, NULL));
35   }
36 
37   PetscCall(MatDestroy(&A));
38   PetscCall(PetscFinalize());
39   return 0;
40 }
41 
42 /*TEST
43 
44    testset:
45       output_file: output/ex257_1.out
46       diff_args: -j
47       test:
48          suffix: 1
49       test:
50          suffix: 1_cuda
51          args: -cuda
52          requires: cuda
53          filter: sed -e "s/seqdensecuda/seqdense/"
54 
55 TEST*/
56