xref: /petsc/src/mat/tests/ex259.c (revision 732aec7a18f2199fb53bb9a2f3aef439a834ce31)
126cec326SBarry Smith static char help[] = "Test of setting values in a matrix without preallocation\n\n";
226cec326SBarry Smith 
326cec326SBarry Smith #include <petscmat.h>
426cec326SBarry Smith 
ex1_nonsquare_bs1(void)526cec326SBarry Smith PetscErrorCode ex1_nonsquare_bs1(void)
626cec326SBarry Smith {
726cec326SBarry Smith   Mat       A;
826cec326SBarry Smith   PetscInt  M, N, m, n, bs = 1;
926cec326SBarry Smith   char      type[16];
1026cec326SBarry Smith   PetscBool flg;
1126cec326SBarry Smith 
1226cec326SBarry Smith   /*
1326cec326SBarry Smith      Create the matrix
1426cec326SBarry Smith   */
1526cec326SBarry Smith   PetscFunctionBegin;
1626cec326SBarry Smith   M = 10;
1726cec326SBarry Smith   N = 12;
1826cec326SBarry Smith   PetscCall(MatCreate(PETSC_COMM_WORLD, &A));
1926cec326SBarry Smith   PetscCall(PetscOptionsGetString(NULL, NULL, "-type", type, sizeof(type), &flg));
2026cec326SBarry Smith   if (flg) PetscCall(MatSetType(A, type));
2126cec326SBarry Smith   else PetscCall(MatSetType(A, MATAIJ));
2226cec326SBarry Smith   PetscCall(MatSetSizes(A, PETSC_DECIDE, PETSC_DECIDE, M, N));
2326cec326SBarry Smith   PetscCall(PetscOptionsGetInt(NULL, NULL, "-bs", &bs, NULL));
2426cec326SBarry Smith   PetscCall(MatSetBlockSize(A, bs));
2526cec326SBarry Smith   PetscCall(MatSetFromOptions(A));
2626cec326SBarry Smith 
2726cec326SBarry Smith   /*
2826cec326SBarry Smith      Get the sizes of the matrix
2926cec326SBarry Smith   */
3026cec326SBarry Smith   PetscCall(MatGetLocalSize(A, &m, &n));
3126cec326SBarry Smith 
3226cec326SBarry Smith   /*
3326cec326SBarry Smith      Insert non-zero pattern (e.g. perform a sweep over the grid).
3426cec326SBarry Smith      You can use MatSetValues(), MatSetValuesBlocked() or MatSetValue().
3526cec326SBarry Smith   */
3626cec326SBarry Smith   {
3726cec326SBarry Smith     PetscInt    ii, jj;
3826cec326SBarry Smith     PetscScalar vv = 22.0;
3926cec326SBarry Smith 
4026cec326SBarry Smith     ii = 3;
4126cec326SBarry Smith     jj = 3;
4226cec326SBarry Smith     PetscCall(MatSetValue(A, ii, jj, vv, INSERT_VALUES));
4326cec326SBarry Smith 
4426cec326SBarry Smith     ii = 7;
4526cec326SBarry Smith     jj = 4;
4626cec326SBarry Smith     PetscCall(MatSetValue(A, ii, jj, vv, INSERT_VALUES));
4726cec326SBarry Smith     PetscCall(MatSetValue(A, jj, ii, vv, INSERT_VALUES));
4826cec326SBarry Smith 
4926cec326SBarry Smith     ii = 9;
5026cec326SBarry Smith     jj = 7;
5126cec326SBarry Smith     PetscCall(MatSetValue(A, ii, jj, vv, INSERT_VALUES));
5226cec326SBarry Smith     PetscCall(MatSetValue(A, jj, ii, vv, INSERT_VALUES));
5326cec326SBarry Smith   }
5426cec326SBarry Smith   PetscCall(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY));
5526cec326SBarry Smith   PetscCall(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY));
5626cec326SBarry Smith 
5726cec326SBarry Smith   PetscCall(PetscViewerPushFormat(PETSC_VIEWER_STDOUT_WORLD, PETSC_VIEWER_ASCII_COMMON));
5826cec326SBarry Smith   PetscCall(MatView(A, PETSC_VIEWER_STDOUT_WORLD));
5926cec326SBarry Smith 
6026cec326SBarry Smith   /*
6126cec326SBarry Smith      Insert same location non-zero values into A.
6226cec326SBarry Smith   */
6326cec326SBarry Smith   {
6426cec326SBarry Smith     PetscInt    ii, jj;
6526cec326SBarry Smith     PetscScalar vv;
6626cec326SBarry Smith 
6726cec326SBarry Smith     ii = 3;
6826cec326SBarry Smith     jj = 3;
6926cec326SBarry Smith     vv = 0.3;
7026cec326SBarry Smith     PetscCall(MatSetValue(A, ii, jj, vv, INSERT_VALUES));
7126cec326SBarry Smith 
7226cec326SBarry Smith     ii = 7;
7326cec326SBarry Smith     jj = 4;
7426cec326SBarry Smith     vv = 3.3;
7526cec326SBarry Smith     PetscCall(MatSetValue(A, ii, jj, vv, INSERT_VALUES));
7626cec326SBarry Smith     PetscCall(MatSetValue(A, jj, ii, vv, INSERT_VALUES));
7726cec326SBarry Smith 
7826cec326SBarry Smith     ii = 9;
7926cec326SBarry Smith     jj = 7;
8026cec326SBarry Smith     vv = 4.3;
8126cec326SBarry Smith     PetscCall(MatSetValue(A, ii, jj, vv, INSERT_VALUES));
8226cec326SBarry Smith     PetscCall(MatSetValue(A, jj, ii, vv, INSERT_VALUES));
8326cec326SBarry Smith   }
8426cec326SBarry Smith   PetscCall(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY));
8526cec326SBarry Smith   PetscCall(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY));
8626cec326SBarry Smith 
8726cec326SBarry Smith   PetscCall(MatView(A, PETSC_VIEWER_STDOUT_WORLD));
8826cec326SBarry Smith 
8926cec326SBarry Smith   PetscCall(MatDestroy(&A));
9026cec326SBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
9126cec326SBarry Smith }
9226cec326SBarry Smith 
main(int argc,char ** args)9326cec326SBarry Smith int main(int argc, char **args)
9426cec326SBarry Smith {
9526cec326SBarry Smith   PetscFunctionBeginUser;
96*c8025a54SPierre Jolivet   PetscCall(PetscInitialize(&argc, &args, NULL, help));
9726cec326SBarry Smith   PetscCall(ex1_nonsquare_bs1());
9826cec326SBarry Smith   PetscCall(PetscFinalize());
9926cec326SBarry Smith   return 0;
10026cec326SBarry Smith }
10126cec326SBarry Smith 
10226cec326SBarry Smith /*TEST
10326cec326SBarry Smith 
10426cec326SBarry Smith    testset:
10526cec326SBarry Smith      args: -bs {{1 2}} -type {{aij baij sbaij}}
10626cec326SBarry Smith      filter: grep -v "type:"
10726cec326SBarry Smith      test:
10826cec326SBarry Smith      test:
10926cec326SBarry Smith        suffix: 2
11026cec326SBarry Smith        nsize: 2
11126cec326SBarry Smith 
11226cec326SBarry Smith TEST*/
113