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