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