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