Actual source code: ex219f.F90
1: #include <petsc/finclude/petscmat.h>
2: program newnonzero
3: use petscmat
4: implicit none
6: Mat :: A
7: PetscInt :: n, m, idxm(1), idxn(1), nl1, nl2, zero, one, i
8: PetscScalar :: v(1), value(1), values(2)
9: PetscErrorCode :: ierr
10: IS :: is
11: ISLocalToGlobalMapping :: ismap
13: PetscCallA(PetscInitialize(ierr))
14: zero = 0
15: one = 1
16: n = 3
17: m = n
18: PetscCallA(MatCreateAIJ(PETSC_COMM_WORLD, PETSC_DECIDE, PETSC_DECIDE, n, m, one, PETSC_NULL_INTEGER_ARRAY, zero, PETSC_NULL_INTEGER_ARRAY, A, ierr))
20: PetscCallA(MatGetOwnershipRange(A, nl1, nl2, ierr))
21: do i = nl1, nl2 - 1
22: idxn(1) = i
23: idxm(1) = i
24: v(1) = 1.0
25: PetscCallA(MatSetValues(A, one, idxn, one, idxm, v, INSERT_VALUES, ierr))
26: end do
27: PetscCallA(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY, ierr))
28: PetscCallA(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY, ierr))
30: ! Ignore any values set into new nonzero locations
31: PetscCallA(MatSetOption(A, MAT_NEW_NONZERO_LOCATIONS, PETSC_FALSE, ierr))
33: idxn(1) = 0
34: idxm(1) = n - 1
35: if ((idxn(1) >= nl1) .and. (idxn(1) <= nl2 - 1)) then
36: v(1) = 2.0
37: PetscCallA(MatSetValues(A, one, idxn, one, idxm, v, INSERT_VALUES, ierr))
38: end if
39: PetscCallA(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY, ierr))
40: PetscCallA(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY, ierr))
42: if ((idxn(1) >= nl1) .and. (idxn(1) <= nl2 - 1)) then
43: PetscCallA(MatGetValues(A, one, idxn, one, idxm, v, ierr))
44: write (6, *) PetscRealPart(v)
45: end if
47: PetscCallA(ISCreateStride(PETSC_COMM_WORLD, nl2 - nl1, nl1, one, is, ierr))
48: PetscCallA(ISLocalToGlobalMappingCreateIS(is, ismap, ierr))
49: PetscCallA(MatSetLocalToGlobalMapping(A, ismap, ismap, ierr))
50: PetscCallA(ISLocalToGlobalMappingDestroy(ismap, ierr))
51: PetscCallA(ISDestroy(is, ierr))
52: PetscCallA(MatGetValuesLocal(A, one, [zero], one, [zero], value, ierr))
53: PetscCallA(MatGetValuesLocal(A, one, [zero], one, [zero], values, ierr))
54: idxn(1) = 0
55: PetscCallA(MatGetValuesLocal(A, one, idxn, one, [zero], values, ierr))
56: PetscCallA(MatGetValuesLocal(A, one, idxn, one, idxn, values, ierr))
58: PetscCallA(MatDestroy(A, ierr))
59: PetscCallA(PetscFinalize(ierr))
61: end program newnonzero
63: !/*TEST
64: !
65: ! test:
66: ! nsize: 2
67: ! filter: Error:
68: !
69: ! test:
70: ! requires: defined(PETSC_USE_INFO)
71: ! suffix: 2
72: ! nsize: 2
73: ! args: -info
74: ! filter: grep "Skipping"
75: !
76: !TEST*/