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