xref: /petsc/src/mat/tests/ex81.c (revision 3e662e0b84908e4f96ebbc649bff52cb1d2f6c56)
18c78258cSHong Zhang 
28c78258cSHong Zhang static char help[] = "Tests MatOption MAT_FORCE_DIAGONAL_ENTRIES.\n\n";
38c78258cSHong Zhang 
48c78258cSHong Zhang #include <petscmat.h>
58c78258cSHong Zhang 
68c78258cSHong Zhang int main(int argc,char **args)
78c78258cSHong Zhang {
88c78258cSHong Zhang   Mat            A,B;
98c78258cSHong Zhang   Vec            diag;
108c78258cSHong Zhang   PetscInt       i,n = 10,col[3],test;
118c78258cSHong Zhang   PetscErrorCode ierr;
128c78258cSHong Zhang   PetscScalar    v[3];
138c78258cSHong Zhang 
148c78258cSHong Zhang   ierr = PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr;
158c78258cSHong Zhang   ierr = PetscOptionsGetInt(NULL,NULL,"-n",&n,NULL);CHKERRQ(ierr);
168c78258cSHong Zhang 
178c78258cSHong Zhang   /* Create A which has empty 0-th row and column */
188c78258cSHong Zhang   ierr = MatCreate(PETSC_COMM_WORLD,&A);CHKERRQ(ierr);
198c78258cSHong Zhang   ierr = MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,n,n);CHKERRQ(ierr);
208c78258cSHong Zhang   ierr = MatSetType(A,MATAIJ);CHKERRQ(ierr);
218c78258cSHong Zhang   ierr = MatSetFromOptions(A);CHKERRQ(ierr);
228c78258cSHong Zhang   ierr = MatSetUp(A);CHKERRQ(ierr);
238c78258cSHong Zhang 
248c78258cSHong Zhang   v[0] = -1.; v[1] = 2.; v[2] = -1.;
258c78258cSHong Zhang   for (i=2; i<n-1; i++) {
268c78258cSHong Zhang     col[0] = i-1; col[1] = i; col[2] = i+1;
278c78258cSHong Zhang     ierr = MatSetValues(A,1,&i,3,col,v,INSERT_VALUES);CHKERRQ(ierr);
288c78258cSHong Zhang   }
298c78258cSHong Zhang   i    = 1; col[0] = 1; col[1] = 2;
308c78258cSHong Zhang   ierr = MatSetValues(A,1,&i,2,col,v+1,INSERT_VALUES);CHKERRQ(ierr);
318c78258cSHong Zhang   i    = n - 1; col[0] = n - 2; col[1] = n - 1;
328c78258cSHong Zhang   ierr = MatSetValues(A,1,&i,2,col,v,INSERT_VALUES);CHKERRQ(ierr);
338c78258cSHong Zhang   ierr = MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
348c78258cSHong Zhang   ierr = MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
358c78258cSHong Zhang 
368c78258cSHong Zhang   for (test = 0; test < 2; test++) {
378c78258cSHong Zhang     ierr = MatProductCreate(A,A,NULL,&B);CHKERRQ(ierr);
388c78258cSHong Zhang 
398c78258cSHong Zhang     if (test == 0) {
408c78258cSHong Zhang       /* Compute B = A*A; B misses 0-th diagonal */
418c78258cSHong Zhang       ierr = MatProductSetType(B,MATPRODUCT_AB);CHKERRQ(ierr);
42*3e662e0bSHong Zhang       ierr = MatSetOptionsPrefix(B,"AB_");CHKERRQ(ierr);
438c78258cSHong Zhang     } else {
448c78258cSHong Zhang       /* Compute B = A^t*A; B misses 0-th diagonal */
458c78258cSHong Zhang       ierr = MatProductSetType(B,MATPRODUCT_AtB);CHKERRQ(ierr);
46*3e662e0bSHong Zhang       ierr = MatSetOptionsPrefix(B,"AtB_");CHKERRQ(ierr);
478c78258cSHong Zhang     }
488c78258cSHong Zhang 
498c78258cSHong Zhang     /* Force allocate missing diagonal entries of B */
508c78258cSHong Zhang     ierr = MatSetOption(B,MAT_FORCE_DIAGONAL_ENTRIES,PETSC_TRUE);CHKERRQ(ierr);
518c78258cSHong Zhang     ierr = MatProductSetFromOptions(B);CHKERRQ(ierr);
528c78258cSHong Zhang 
538c78258cSHong Zhang     ierr = MatProductSymbolic(B);CHKERRQ(ierr);
548c78258cSHong Zhang     ierr = MatProductNumeric(B);CHKERRQ(ierr);
558c78258cSHong Zhang 
568c78258cSHong Zhang     ierr = MatSetOption(B,MAT_NEW_NONZERO_LOCATION_ERR,PETSC_TRUE);CHKERRQ(ierr);
578c78258cSHong Zhang 
588c78258cSHong Zhang     /* Insert entries to diagonal of B */
598c78258cSHong Zhang     ierr = MatCreateVecs(B,NULL,&diag);CHKERRQ(ierr);
608c78258cSHong Zhang     ierr = MatGetDiagonal(B,diag);CHKERRQ(ierr);
618c78258cSHong Zhang     ierr = VecSetValue(diag,0,100.0,INSERT_VALUES);CHKERRQ(ierr);
628c78258cSHong Zhang     ierr = VecAssemblyBegin(diag);CHKERRQ(ierr);
638c78258cSHong Zhang     ierr = VecAssemblyEnd(diag);CHKERRQ(ierr);
648c78258cSHong Zhang 
658c78258cSHong Zhang     ierr = MatDiagonalSet(B,diag,INSERT_VALUES);CHKERRQ(ierr);
668c78258cSHong Zhang     if (test == 1) {
678c78258cSHong Zhang       ierr = MatView(B,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
688c78258cSHong Zhang     }
698c78258cSHong Zhang     ierr = MatDestroy(&B);CHKERRQ(ierr);
708c78258cSHong Zhang     ierr = VecDestroy(&diag);CHKERRQ(ierr);
718c78258cSHong Zhang   }
728c78258cSHong Zhang 
738c78258cSHong Zhang   ierr = MatDestroy(&A);CHKERRQ(ierr);
748c78258cSHong Zhang   ierr = PetscFinalize();
758c78258cSHong Zhang   return ierr;
768c78258cSHong Zhang }
778c78258cSHong Zhang 
788c78258cSHong Zhang /*TEST
798c78258cSHong Zhang 
808c78258cSHong Zhang    test:
818c78258cSHong Zhang      output_file: output/ex81_1.out
828c78258cSHong Zhang 
838c78258cSHong Zhang    test:
848c78258cSHong Zhang      suffix: 2
85*3e662e0bSHong Zhang      args: -AtB_mat_product_algorithm at*b
868c78258cSHong Zhang      output_file: output/ex81_1.out
878c78258cSHong Zhang 
888c78258cSHong Zhang    test:
898c78258cSHong Zhang      suffix: 3
90*3e662e0bSHong Zhang      args: -AtB_mat_product_algorithm outerproduct
918c78258cSHong Zhang      output_file: output/ex81_1.out
928c78258cSHong Zhang 
938c78258cSHong Zhang    test:
948c78258cSHong Zhang      suffix: 4
958c78258cSHong Zhang      nsize: 3
96*3e662e0bSHong Zhang      args: -AtB_mat_product_algorithm nonscalable
978c78258cSHong Zhang      output_file: output/ex81_3.out
988c78258cSHong Zhang 
998c78258cSHong Zhang    test:
1008c78258cSHong Zhang      suffix: 5
1018c78258cSHong Zhang      nsize: 3
102*3e662e0bSHong Zhang      args: -AtB_mat_product_algorithm scalable
1038c78258cSHong Zhang      output_file: output/ex81_3.out
1048c78258cSHong Zhang 
1058c78258cSHong Zhang    test:
1068c78258cSHong Zhang      suffix: 6
1078c78258cSHong Zhang      nsize: 3
108*3e662e0bSHong Zhang      args: -AtB_mat_product_algorithm at*b
1098c78258cSHong Zhang      output_file: output/ex81_3.out
1108c78258cSHong Zhang 
1118c78258cSHong Zhang TEST*/
112