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