Actual source code: ex219f.F90
1: program newnonzero
2: #include <petsc/finclude/petscis.h>
3: #include <petsc/finclude/petscmat.h>
4: use petscmat
5: implicit none
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
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))
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))
31: ! Ignore any values set into new nonzero locations
32: PetscCallA(MatSetOption(A,MAT_NEW_NONZERO_LOCATIONS,PETSC_FALSE,ierr))
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))
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
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))
59: PetscCallA(MatDestroy(A,ierr))
60: PetscCallA(PetscFinalize(ierr))
62: end program newnonzero
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*/