1 static char help[] = "Test of setting values in a matrix without preallocation\n\n"; 2 3 #include <petscmat.h> 4 5 PetscErrorCode ex1_nonsquare_bs1(void) 6 { 7 Mat A; 8 PetscInt M, N, m, n, bs = 1; 9 char type[16]; 10 PetscBool flg; 11 12 /* 13 Create the matrix 14 */ 15 PetscFunctionBegin; 16 M = 10; 17 N = 12; 18 PetscCall(MatCreate(PETSC_COMM_WORLD, &A)); 19 PetscCall(PetscOptionsGetString(NULL, NULL, "-type", type, sizeof(type), &flg)); 20 if (flg) PetscCall(MatSetType(A, type)); 21 else PetscCall(MatSetType(A, MATAIJ)); 22 PetscCall(MatSetSizes(A, PETSC_DECIDE, PETSC_DECIDE, M, N)); 23 PetscCall(PetscOptionsGetInt(NULL, NULL, "-bs", &bs, NULL)); 24 PetscCall(MatSetBlockSize(A, bs)); 25 PetscCall(MatSetFromOptions(A)); 26 27 /* 28 Get the sizes of the matrix 29 */ 30 PetscCall(MatGetLocalSize(A, &m, &n)); 31 32 /* 33 Insert non-zero pattern (e.g. perform a sweep over the grid). 34 You can use MatSetValues(), MatSetValuesBlocked() or MatSetValue(). 35 */ 36 { 37 PetscInt ii, jj; 38 PetscScalar vv = 22.0; 39 40 ii = 3; 41 jj = 3; 42 PetscCall(MatSetValue(A, ii, jj, vv, INSERT_VALUES)); 43 44 ii = 7; 45 jj = 4; 46 PetscCall(MatSetValue(A, ii, jj, vv, INSERT_VALUES)); 47 PetscCall(MatSetValue(A, jj, ii, vv, INSERT_VALUES)); 48 49 ii = 9; 50 jj = 7; 51 PetscCall(MatSetValue(A, ii, jj, vv, INSERT_VALUES)); 52 PetscCall(MatSetValue(A, jj, ii, vv, INSERT_VALUES)); 53 } 54 PetscCall(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY)); 55 PetscCall(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY)); 56 57 PetscCall(PetscViewerPushFormat(PETSC_VIEWER_STDOUT_WORLD, PETSC_VIEWER_ASCII_COMMON)); 58 PetscCall(MatView(A, PETSC_VIEWER_STDOUT_WORLD)); 59 60 /* 61 Insert same location non-zero values into A. 62 */ 63 { 64 PetscInt ii, jj; 65 PetscScalar vv; 66 67 ii = 3; 68 jj = 3; 69 vv = 0.3; 70 PetscCall(MatSetValue(A, ii, jj, vv, INSERT_VALUES)); 71 72 ii = 7; 73 jj = 4; 74 vv = 3.3; 75 PetscCall(MatSetValue(A, ii, jj, vv, INSERT_VALUES)); 76 PetscCall(MatSetValue(A, jj, ii, vv, INSERT_VALUES)); 77 78 ii = 9; 79 jj = 7; 80 vv = 4.3; 81 PetscCall(MatSetValue(A, ii, jj, vv, INSERT_VALUES)); 82 PetscCall(MatSetValue(A, jj, ii, vv, INSERT_VALUES)); 83 } 84 PetscCall(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY)); 85 PetscCall(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY)); 86 87 PetscCall(MatView(A, PETSC_VIEWER_STDOUT_WORLD)); 88 89 PetscCall(MatDestroy(&A)); 90 PetscFunctionReturn(PETSC_SUCCESS); 91 } 92 93 int main(int argc, char **args) 94 { 95 PetscFunctionBeginUser; 96 PetscCall(PetscInitialize(&argc, &args, (char *)0, help)); 97 PetscCall(ex1_nonsquare_bs1()); 98 PetscCall(PetscFinalize()); 99 return 0; 100 } 101 102 /*TEST 103 104 testset: 105 args: -bs {{1 2}} -type {{aij baij sbaij}} 106 filter: grep -v "type:" 107 test: 108 test: 109 suffix: 2 110 nsize: 2 111 112 TEST*/ 113