Actual source code: ex241f.F90
1: ! Test code contributed by Thibaut Appel <t.appel17@imperial.ac.uk>
2: #include <petsc/finclude/petscmat.h>
3: program test_assembly
4: use petscmat
6: implicit none
7: PetscInt, parameter :: n = 10
8: Mat :: L
9: PetscInt :: istart, iend, row
10: PetscErrorCode :: ierr
11: PetscInt cols(1), rows(1)
12: PetscScalar vals(1)
14: PetscCallA(PetscInitialize(ierr))
16: PetscCallA(MatCreate(PETSC_COMM_WORLD, L, ierr))
17: PetscCallA(MatSetType(L, MATAIJ, ierr))
18: PetscCallA(MatSetSizes(L, PETSC_DECIDE, PETSC_DECIDE, n, n, ierr))
20: PetscCallA(MatSeqAIJSetPreallocation(L, 1_PETSC_INT_KIND, PETSC_NULL_INTEGER_ARRAY, ierr))
21: PetscCallA(MatMPIAIJSetPreallocation(L, 1_PETSC_INT_KIND, PETSC_NULL_INTEGER_ARRAY, 0_PETSC_INT_KIND, PETSC_NULL_INTEGER_ARRAY, ierr)) ! No allocated non-zero in off-diagonal part
22: PetscCallA(MatSetOption(L, MAT_IGNORE_ZERO_ENTRIES, PETSC_TRUE, ierr))
23: PetscCallA(MatSetOption(L, MAT_NEW_NONZERO_ALLOCATION_ERR, PETSC_TRUE, ierr))
24: PetscCallA(MatSetOption(L, MAT_NO_OFF_PROC_ENTRIES, PETSC_TRUE, ierr))
26: PetscCallA(MatGetOwnershipRange(L, istart, iend, ierr))
28: ! assembling a diagonal matrix
29: do row = istart, iend - 1
30: cols = [row]; vals = [1.0]; rows = [row]
31: PetscCallA(MatSetValues(L, 1_PETSC_INT_KIND, rows, 1_PETSC_INT_KIND, cols, vals, ADD_VALUES, ierr))
32: end do
34: PetscCallA(MatAssemblyBegin(L, MAT_FINAL_ASSEMBLY, ierr))
35: PetscCallA(MatAssemblyEnd(L, MAT_FINAL_ASSEMBLY, ierr))
37: PetscCallA(MatSetOption(L, MAT_NEW_NONZERO_LOCATION_ERR, PETSC_TRUE, ierr))
39: !PetscCallA(MatZeroEntries(L,ierr))
41: ! assembling a diagonal matrix, adding a zero value to non-diagonal part
42: do row = istart, iend - 1
44: if (row == 0) then
45: cols = [n - 1]
46: vals = [0.0]
47: rows = [row]
48: PetscCallA(MatSetValues(L, 1_PETSC_INT_KIND, rows, 1_PETSC_INT_KIND, cols, vals, ADD_VALUES, ierr))
49: end if
50: cols = [row]; vals = [1.0]; rows = [row]
51: PetscCallA(MatSetValues(L, 1_PETSC_INT_KIND, rows, 1_PETSC_INT_KIND, cols, vals, ADD_VALUES, ierr))
53: end do
55: PetscCallA(MatAssemblyBegin(L, MAT_FINAL_ASSEMBLY, ierr))
56: PetscCallA(MatAssemblyEnd(L, MAT_FINAL_ASSEMBLY, ierr))
57: PetscCallA(MatDestroy(L, ierr))
59: PetscCallA(PetscFinalize(ierr))
61: end program test_assembly
63: !/*TEST
64: !
65: ! build:
66: ! requires: complex
67: !
68: ! test:
69: ! nsize: 2
70: ! output_file: output/empty.out
71: !
72: !TEST*/