1 2 static char help[] = "Tests MatTranspose(), MatNorm(), and MatAXPY().\n\n"; 3 4 #include <petscmat.h> 5 6 int main(int argc,char **argv) 7 { 8 Mat mat,tmat = 0; 9 PetscInt m = 4,n,i,j; 10 PetscErrorCode ierr; 11 PetscMPIInt size,rank; 12 PetscInt rstart,rend,rect = 0; 13 PetscBool flg; 14 PetscScalar v; 15 PetscReal normf,normi,norm1; 16 MatInfo info; 17 18 ierr = PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr; 19 CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-m",&m,NULL)); 20 CHKERRMPI(MPI_Comm_rank(PETSC_COMM_WORLD,&rank)); 21 CHKERRMPI(MPI_Comm_size(PETSC_COMM_WORLD,&size)); 22 n = m; 23 CHKERRQ(PetscOptionsHasName(NULL,NULL,"-rect1",&flg)); 24 if (flg) {n += 2; rect = 1;} 25 CHKERRQ(PetscOptionsHasName(NULL,NULL,"-rect2",&flg)); 26 if (flg) {n -= 2; rect = 1;} 27 28 /* Create and assemble matrix */ 29 CHKERRQ(MatCreate(PETSC_COMM_WORLD,&mat)); 30 CHKERRQ(MatSetSizes(mat,PETSC_DECIDE,PETSC_DECIDE,m,n)); 31 CHKERRQ(MatSetFromOptions(mat)); 32 CHKERRQ(MatSetUp(mat)); 33 CHKERRQ(MatGetOwnershipRange(mat,&rstart,&rend)); 34 for (i=rstart; i<rend; i++) { 35 for (j=0; j<n; j++) { 36 v = 10*i+j; 37 CHKERRQ(MatSetValues(mat,1,&i,1,&j,&v,INSERT_VALUES)); 38 } 39 } 40 CHKERRQ(MatAssemblyBegin(mat,MAT_FINAL_ASSEMBLY)); 41 CHKERRQ(MatAssemblyEnd(mat,MAT_FINAL_ASSEMBLY)); 42 43 /* Print info about original matrix */ 44 CHKERRQ(MatGetInfo(mat,MAT_GLOBAL_SUM,&info)); 45 ierr = PetscPrintf(PETSC_COMM_WORLD,"original matrix nonzeros = %" PetscInt_FMT ", allocated nonzeros = %" PetscInt_FMT "\n", 46 (PetscInt)info.nz_used,(PetscInt)info.nz_allocated);CHKERRQ(ierr); 47 CHKERRQ(MatNorm(mat,NORM_FROBENIUS,&normf)); 48 CHKERRQ(MatNorm(mat,NORM_1,&norm1)); 49 CHKERRQ(MatNorm(mat,NORM_INFINITY,&normi)); 50 CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"original: Frobenious norm = %g, one norm = %g, infinity norm = %g\n",(double)normf,(double)norm1,(double)normi)); 51 CHKERRQ(MatView(mat,PETSC_VIEWER_STDOUT_WORLD)); 52 53 /* Form matrix transpose */ 54 CHKERRQ(PetscOptionsHasName(NULL,NULL,"-in_place",&flg)); 55 if (flg) { 56 CHKERRQ(MatTranspose(mat,MAT_INPLACE_MATRIX,&mat)); /* in-place transpose */ 57 tmat = mat; mat = 0; 58 } else { /* out-of-place transpose */ 59 CHKERRQ(MatTranspose(mat,MAT_INITIAL_MATRIX,&tmat)); 60 } 61 62 /* Print info about transpose matrix */ 63 CHKERRQ(MatGetInfo(tmat,MAT_GLOBAL_SUM,&info)); 64 ierr = PetscPrintf(PETSC_COMM_WORLD,"transpose matrix nonzeros = %" PetscInt_FMT ", allocated nonzeros = %" PetscInt_FMT "\n", 65 (PetscInt)info.nz_used,(PetscInt)info.nz_allocated);CHKERRQ(ierr); 66 CHKERRQ(MatNorm(tmat,NORM_FROBENIUS,&normf)); 67 CHKERRQ(MatNorm(tmat,NORM_1,&norm1)); 68 CHKERRQ(MatNorm(tmat,NORM_INFINITY,&normi)); 69 CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"transpose: Frobenious norm = %g, one norm = %g, infinity norm = %g\n",(double)normf,(double)norm1,(double)normi)); 70 CHKERRQ(MatView(tmat,PETSC_VIEWER_STDOUT_WORLD)); 71 72 /* Test MatAXPY */ 73 if (mat && !rect) { 74 PetscScalar alpha = 1.0; 75 CHKERRQ(PetscOptionsGetScalar(NULL,NULL,"-alpha",&alpha,NULL)); 76 CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"matrix addition: B = B + alpha * A\n")); 77 CHKERRQ(MatAXPY(tmat,alpha,mat,DIFFERENT_NONZERO_PATTERN)); 78 CHKERRQ(MatView(tmat,PETSC_VIEWER_STDOUT_WORLD)); 79 } 80 81 /* Free data structures */ 82 CHKERRQ(MatDestroy(&tmat)); 83 if (mat) CHKERRQ(MatDestroy(&mat)); 84 85 ierr = PetscFinalize(); 86 return ierr; 87 } 88 89 /*TEST 90 91 test: 92 93 testset: 94 args: -rect1 95 test: 96 suffix: r1 97 output_file: output/ex49_r1.out 98 test: 99 suffix: r1_inplace 100 args: -in_place 101 output_file: output/ex49_r1.out 102 test: 103 suffix: r1_par 104 nsize: 2 105 output_file: output/ex49_r1_par.out 106 test: 107 suffix: r1_par_inplace 108 args: -in_place 109 nsize: 2 110 output_file: output/ex49_r1_par.out 111 112 TEST*/ 113