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
5: use petscmat
6: use ISO_Fortran_Env, only: real64
8: implicit none
9: PetscInt, parameter :: wp = real64, n = 10
10: PetscScalar, parameter :: zero = 0.0, one = 1.0
11: Mat :: L
12: PetscInt :: istart, iend, row, i1, i0
13: PetscErrorCode :: ierr
15: PetscInt cols(1), rows(1)
16: PetscScalar vals(1)
18: PetscCallA(PetscInitialize(ierr))
20: i0 = 0
21: i1 = 1
23: PetscCallA(MatCreate(PETSC_COMM_WORLD, L, ierr))
24: PetscCallA(MatSetType(L, MATAIJ, ierr))
25: PetscCallA(MatSetSizes(L, PETSC_DECIDE, PETSC_DECIDE, n, n, ierr))
27: PetscCallA(MatSeqAIJSetPreallocation(L, i1, PETSC_NULL_INTEGER_ARRAY, ierr))
28: PetscCallA(MatMPIAIJSetPreallocation(L, i1, PETSC_NULL_INTEGER_ARRAY, i0, PETSC_NULL_INTEGER_ARRAY, ierr)) ! No allocated non-zero in off-diagonal part
29: PetscCallA(MatSetOption(L, MAT_IGNORE_ZERO_ENTRIES, PETSC_TRUE, ierr))
30: PetscCallA(MatSetOption(L, MAT_NEW_NONZERO_ALLOCATION_ERR, PETSC_TRUE, ierr))
31: PetscCallA(MatSetOption(L, MAT_NO_OFF_PROC_ENTRIES, PETSC_TRUE, ierr))
33: PetscCallA(MatGetOwnershipRange(L, istart, iend, ierr))
35: ! assembling a diagonal matrix
36: do row = istart, iend - 1
38: cols = [row]; vals = [one]; rows = [row]
39: PetscCallA(MatSetValues(L, i1, rows, i1, cols, vals, ADD_VALUES, ierr))
41: end do
43: PetscCallA(MatAssemblyBegin(L, MAT_FINAL_ASSEMBLY, ierr))
44: PetscCallA(MatAssemblyEnd(L, MAT_FINAL_ASSEMBLY, ierr))
46: PetscCallA(MatSetOption(L, MAT_NEW_NONZERO_LOCATION_ERR, PETSC_TRUE, ierr))
48: !PetscCallA(MatZeroEntries(L,ierr))
50: ! assembling a diagonal matrix, adding a zero value to non-diagonal part
51: do row = istart, iend - 1
53: if (row == 0) then
54: cols = [n - 1]
55: vals = [zero]
56: rows = [row]
57: PetscCallA(MatSetValues(L, i1, rows, i1, cols, vals, ADD_VALUES, ierr))
58: end if
59: cols = [row]; vals = [one]; rows = [row]
60: PetscCallA(MatSetValues(L, i1, rows, i1, cols, vals, ADD_VALUES, ierr))
62: end do
64: PetscCallA(MatAssemblyBegin(L, MAT_FINAL_ASSEMBLY, ierr))
65: PetscCallA(MatAssemblyEnd(L, MAT_FINAL_ASSEMBLY, ierr))
66: PetscCallA(MatDestroy(L, ierr))
68: PetscCallA(PetscFinalize(ierr))
70: end program test_assembly
72: !/*TEST
73: !
74: ! build:
75: ! requires: complex
76: !
77: ! test:
78: ! nsize: 2
79: ! output_file: output/empty.out
80: !
81: !TEST*/