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