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(1), 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_ARRAY, zero, PETSC_NULL_INTEGER_ARRAY, 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) >= nl1) .and. (idxn(1) <= 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) >= nl1) .and. (idxn(1) <= 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*/