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