xref: /petsc/src/mat/tests/ex102.c (revision d751fb92f56777f4a566f5e5fedf76f657538c08)
1c4762a1bSJed Brown 
2c4762a1bSJed Brown static char help[] = "Tests MatCreateLRC()\n\n";
3c4762a1bSJed Brown 
4c4762a1bSJed Brown /*T
5c4762a1bSJed Brown    Concepts: Low rank correction
6c4762a1bSJed Brown 
7c4762a1bSJed Brown    Processors: n
8c4762a1bSJed Brown T*/
9c4762a1bSJed Brown 
10c4762a1bSJed Brown #include <petscmat.h>
11c4762a1bSJed Brown 
12c4762a1bSJed Brown int main(int argc,char **args)
13c4762a1bSJed Brown {
14c4762a1bSJed Brown   Vec            x,b,c=NULL;
15*d751fb92SStefano Zampini   Mat            A,U,V,LR,X,LRe;
16*d751fb92SStefano Zampini   PetscInt       M = 5, N = 7;
17c4762a1bSJed Brown   PetscErrorCode ierr;
18c4762a1bSJed Brown   PetscBool      flg;
19c4762a1bSJed Brown 
20c4762a1bSJed Brown   ierr = PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr;
21*d751fb92SStefano Zampini   ierr = PetscOptionsGetInt(NULL,NULL,"-m",&M,NULL);CHKERRQ(ierr);
22*d751fb92SStefano Zampini   ierr = PetscOptionsGetInt(NULL,NULL,"-n",&N,NULL);CHKERRQ(ierr);
23c4762a1bSJed Brown 
24c4762a1bSJed Brown   /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
25c4762a1bSJed Brown          Create the sparse matrix
26c4762a1bSJed Brown      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
27c4762a1bSJed Brown   ierr = MatCreate(PETSC_COMM_WORLD,&A);CHKERRQ(ierr);
28*d751fb92SStefano Zampini   ierr = MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,M,N);CHKERRQ(ierr);
29*d751fb92SStefano Zampini   ierr = MatSetOptionsPrefix(A,"A_");CHKERRQ(ierr);
30c4762a1bSJed Brown   ierr = MatSetFromOptions(A);CHKERRQ(ierr);
31*d751fb92SStefano Zampini   ierr = MatSeqAIJSetPreallocation(A,5,NULL);CHKERRQ(ierr);
32*d751fb92SStefano Zampini   ierr = MatMPIAIJSetPreallocation(A,5,NULL,5,NULL);CHKERRQ(ierr);
33c4762a1bSJed Brown   ierr = MatSetUp(A);CHKERRQ(ierr);
34*d751fb92SStefano Zampini   ierr = MatSetRandom(A,NULL);CHKERRQ(ierr);
35c4762a1bSJed Brown 
36c4762a1bSJed Brown   /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
37c4762a1bSJed Brown          Create the dense matrices
38c4762a1bSJed Brown      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
39c4762a1bSJed Brown   ierr = MatCreate(PETSC_COMM_WORLD,&U);CHKERRQ(ierr);
40*d751fb92SStefano Zampini   ierr = MatSetSizes(U,PETSC_DECIDE,PETSC_DECIDE,M,3);CHKERRQ(ierr);
41c4762a1bSJed Brown   ierr = MatSetType(U,MATDENSE);CHKERRQ(ierr);
42*d751fb92SStefano Zampini   ierr = MatSetOptionsPrefix(U,"U_");CHKERRQ(ierr);
43*d751fb92SStefano Zampini   ierr = MatSetFromOptions(U);CHKERRQ(ierr);
44c4762a1bSJed Brown   ierr = MatSetUp(U);CHKERRQ(ierr);
45*d751fb92SStefano Zampini   ierr = MatSetRandom(U,NULL);CHKERRQ(ierr);
46c4762a1bSJed Brown 
47c4762a1bSJed Brown   ierr = MatCreate(PETSC_COMM_WORLD,&V);CHKERRQ(ierr);
48*d751fb92SStefano Zampini   ierr = MatSetSizes(V,PETSC_DECIDE,PETSC_DECIDE,N,3);CHKERRQ(ierr);
49c4762a1bSJed Brown   ierr = MatSetType(V,MATDENSE);CHKERRQ(ierr);
50*d751fb92SStefano Zampini   ierr = MatSetOptionsPrefix(V,"V_");CHKERRQ(ierr);
51*d751fb92SStefano Zampini   ierr = MatSetFromOptions(V);CHKERRQ(ierr);
52c4762a1bSJed Brown   ierr = MatSetUp(V);CHKERRQ(ierr);
53*d751fb92SStefano Zampini   ierr = MatSetRandom(V,NULL);CHKERRQ(ierr);
54c4762a1bSJed Brown 
55c4762a1bSJed Brown   /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
56c4762a1bSJed Brown          Create a vector to hold the diagonal of C
57*d751fb92SStefano Zampini          A sequential vector can be created as well on each process
58*d751fb92SStefano Zampini          It is user responsibility to ensure the data in the vector
59*d751fb92SStefano Zampini          is consistent across processors
60c4762a1bSJed Brown      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
61c4762a1bSJed Brown   ierr = PetscOptionsHasName(NULL,NULL,"-use_c",&flg);CHKERRQ(ierr);
62c4762a1bSJed Brown   if (flg) {
63*d751fb92SStefano Zampini     ierr = VecCreateMPI(PETSC_COMM_WORLD,PETSC_DECIDE,3,&c);CHKERRQ(ierr);
64*d751fb92SStefano Zampini     ierr = VecSetRandom(c,NULL);CHKERRQ(ierr);
65c4762a1bSJed Brown   }
66c4762a1bSJed Brown 
67c4762a1bSJed Brown   /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
68c4762a1bSJed Brown          Create low rank correction matrix
69c4762a1bSJed Brown      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
70c4762a1bSJed Brown   ierr = PetscOptionsHasName(NULL,NULL,"-low_rank",&flg);CHKERRQ(ierr);
71c4762a1bSJed Brown   if (flg) {
72c4762a1bSJed Brown     /* create a low-rank matrix, with no A-matrix */
73c4762a1bSJed Brown     ierr = MatCreateLRC(NULL,U,c,V,&LR);CHKERRQ(ierr);
74*d751fb92SStefano Zampini     ierr = MatDestroy(&A);CHKERRQ(ierr);
75c4762a1bSJed Brown   } else {
76c4762a1bSJed Brown     ierr = MatCreateLRC(A,U,c,V,&LR);CHKERRQ(ierr);
77c4762a1bSJed Brown   }
78c4762a1bSJed Brown 
79c4762a1bSJed Brown   /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
80*d751fb92SStefano Zampini          Create the low rank correction matrix explicitly to check for
81*d751fb92SStefano Zampini          correctness
82*d751fb92SStefano Zampini      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
83*d751fb92SStefano Zampini   ierr = MatHermitianTranspose(V,MAT_INITIAL_MATRIX,&X);CHKERRQ(ierr);
84*d751fb92SStefano Zampini   ierr = MatDiagonalScale(X,c,NULL);CHKERRQ(ierr);
85*d751fb92SStefano Zampini   ierr = MatMatMult(U,X,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&LRe);CHKERRQ(ierr);
86*d751fb92SStefano Zampini   ierr = MatDestroy(&X);CHKERRQ(ierr);
87*d751fb92SStefano Zampini   if (A) {
88*d751fb92SStefano Zampini     ierr = MatAYPX(LRe,1.0,A,DIFFERENT_NONZERO_PATTERN);CHKERRQ(ierr);
89*d751fb92SStefano Zampini   }
90*d751fb92SStefano Zampini 
91*d751fb92SStefano Zampini   /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
92c4762a1bSJed Brown          Create test vectors
93c4762a1bSJed Brown      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
94*d751fb92SStefano Zampini   ierr = MatCreateVecs(LR,&x,&b);CHKERRQ(ierr);
95*d751fb92SStefano Zampini   ierr = VecSetRandom(x,NULL);CHKERRQ(ierr);
96c4762a1bSJed Brown   ierr = MatMult(LR,x,b);CHKERRQ(ierr);
97*d751fb92SStefano Zampini   ierr = MatMultTranspose(LR,b,x);CHKERRQ(ierr);
98c4762a1bSJed Brown   ierr = VecDestroy(&x);CHKERRQ(ierr);
99c4762a1bSJed Brown   ierr = VecDestroy(&b);CHKERRQ(ierr);
100*d751fb92SStefano Zampini 
101*d751fb92SStefano Zampini   /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
102*d751fb92SStefano Zampini          Check correctness
103*d751fb92SStefano Zampini      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
104*d751fb92SStefano Zampini   ierr = MatMultEqual(LR,LRe,10,&flg);CHKERRQ(ierr);
105*d751fb92SStefano Zampini   if (!flg) { ierr = PetscPrintf(PETSC_COMM_WORLD,"Error in MatMult\n");CHKERRQ(ierr); }
106*d751fb92SStefano Zampini #if !defined(PETSC_USE_COMPLEX)
107*d751fb92SStefano Zampini   ierr = MatMultHermitianTransposeEqual(LR,LRe,10,&flg);CHKERRQ(ierr);
108*d751fb92SStefano Zampini   if (!flg) { ierr = PetscPrintf(PETSC_COMM_WORLD,"Error in MatMultTranspose\n");CHKERRQ(ierr); }
109*d751fb92SStefano Zampini #endif
110*d751fb92SStefano Zampini 
111c4762a1bSJed Brown   ierr = MatDestroy(&A);CHKERRQ(ierr);
112*d751fb92SStefano Zampini   ierr = MatDestroy(&LRe);CHKERRQ(ierr);
113c4762a1bSJed Brown   ierr = MatDestroy(&U);CHKERRQ(ierr);
114c4762a1bSJed Brown   ierr = MatDestroy(&V);CHKERRQ(ierr);
115c4762a1bSJed Brown   ierr = VecDestroy(&c);CHKERRQ(ierr);
116c4762a1bSJed Brown   ierr = MatDestroy(&LR);CHKERRQ(ierr);
117c4762a1bSJed Brown 
118c4762a1bSJed Brown   /*
119c4762a1bSJed Brown      Always call PetscFinalize() before exiting a program.  This routine
120c4762a1bSJed Brown        - finalizes the PETSc libraries as well as MPI
121c4762a1bSJed Brown        - provides summary and diagnostic information if certain runtime
122c4762a1bSJed Brown          options are chosen (e.g., -log_view).
123c4762a1bSJed Brown   */
124c4762a1bSJed Brown   ierr = PetscFinalize();
125c4762a1bSJed Brown   return ierr;
126c4762a1bSJed Brown }
127c4762a1bSJed Brown 
128c4762a1bSJed Brown /*TEST
129c4762a1bSJed Brown 
130*d751fb92SStefano Zampini    testset:
131*d751fb92SStefano Zampini       output_file: output/ex102_1.out
132*d751fb92SStefano Zampini       nsize: {{1 2}}
133*d751fb92SStefano Zampini       args: -low_rank {{0 1}} -use_c {{0 1}}
134c4762a1bSJed Brown       test:
135*d751fb92SStefano Zampini         suffix: standard
136c4762a1bSJed Brown       test:
137*d751fb92SStefano Zampini         suffix: cuda
138*d751fb92SStefano Zampini         requires: cuda
139*d751fb92SStefano Zampini         args: -A_mat_type aijcusparse -U_mat_type densecuda -V_mat_type densecuda
140c4762a1bSJed Brown 
141c4762a1bSJed Brown TEST*/
142