1c4762a1bSJed Brownprogram newnonzero 285835d77SBarry Smith#include <petsc/finclude/petscis.h> 3c4762a1bSJed Brown#include <petsc/finclude/petscmat.h> 4c4762a1bSJed Brown use petscmat 5c4762a1bSJed Brown implicit none 6c4762a1bSJed Brown 7c4762a1bSJed Brown Mat :: A 806946f3aSJose E. Roman PetscInt :: n, m, idxm(1), idxn(1), nl1, nl2, zero, one, i 95d83a8b1SBarry Smith PetscScalar :: v(1), value(1), values(2) 10c4762a1bSJed Brown PetscErrorCode :: ierr 1185835d77SBarry Smith IS :: is 1285835d77SBarry Smith ISLocalToGlobalMapping :: ismap 13c4762a1bSJed Brown 14d8606c27SBarry Smith PetscCallA(PetscInitialize(ierr)) 1506946f3aSJose E. Roman zero = 0 16c4762a1bSJed Brown one = 1 17c4762a1bSJed Brown n = 3 18c4762a1bSJed Brown m = n 195d83a8b1SBarry Smith PetscCallA(MatCreateAIJ(PETSC_COMM_WORLD, PETSC_DECIDE, PETSC_DECIDE, n, m, one, PETSC_NULL_INTEGER_ARRAY, zero, PETSC_NULL_INTEGER_ARRAY, A, ierr)) 20c4762a1bSJed Brown 21d8606c27SBarry Smith PetscCallA(MatGetOwnershipRange(A, nl1, nl2, ierr)) 22c4762a1bSJed Brown do i = nl1, nl2 - 1 23c4762a1bSJed Brown idxn(1) = i 24c4762a1bSJed Brown idxm(1) = i 25c4762a1bSJed Brown v(1) = 1.0 26d8606c27SBarry Smith PetscCallA(MatSetValues(A, one, idxn, one, idxm, v, INSERT_VALUES, ierr)) 27c4762a1bSJed Brown end do 28d8606c27SBarry Smith PetscCallA(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY, ierr)) 29d8606c27SBarry Smith PetscCallA(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY, ierr)) 30c4762a1bSJed Brown 31c4762a1bSJed Brown! Ignore any values set into new nonzero locations 32d8606c27SBarry Smith PetscCallA(MatSetOption(A, MAT_NEW_NONZERO_LOCATIONS, PETSC_FALSE, ierr)) 33c4762a1bSJed Brown 34c4762a1bSJed Brown idxn(1) = 0 35c4762a1bSJed Brown idxm(1) = n - 1 36*4820e4eaSBarry Smith if ((idxn(1) >= nl1) .and. (idxn(1) <= nl2 - 1)) then 37c4762a1bSJed Brown v(1) = 2.0 38d8606c27SBarry Smith PetscCallA(MatSetValues(A, one, idxn, one, idxm, v, INSERT_VALUES, ierr)) 39c4762a1bSJed Brown end if 40d8606c27SBarry Smith PetscCallA(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY, ierr)) 41d8606c27SBarry Smith PetscCallA(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY, ierr)) 42c4762a1bSJed Brown 43*4820e4eaSBarry Smith if ((idxn(1) >= nl1) .and. (idxn(1) <= nl2 - 1)) then 44d8606c27SBarry Smith PetscCallA(MatGetValues(A, one, idxn, one, idxm, v, ierr)) 45c4762a1bSJed Brown write (6, *) PetscRealPart(v) 46c4762a1bSJed Brown end if 47c4762a1bSJed Brown 4885835d77SBarry Smith PetscCallA(ISCreateStride(PETSC_COMM_WORLD, nl2 - nl1, nl1, one, is, ierr)) 4985835d77SBarry Smith PetscCallA(ISLocalToGlobalMappingCreateIS(is, ismap, ierr)) 5085835d77SBarry Smith PetscCallA(MatSetLocalToGlobalMapping(A, ismap, ismap, ierr)) 5185835d77SBarry Smith PetscCallA(ISLocalToGlobalMappingDestroy(ismap, ierr)) 5285835d77SBarry Smith PetscCallA(ISDestroy(is, ierr)) 535d83a8b1SBarry Smith PetscCallA(MatGetValuesLocal(A, one, [zero], one, [zero], value, ierr)) 545d83a8b1SBarry Smith PetscCallA(MatGetValuesLocal(A, one, [zero], one, [zero], values, ierr)) 5585835d77SBarry Smith idxn(1) = 0 565d83a8b1SBarry Smith PetscCallA(MatGetValuesLocal(A, one, idxn, one, [zero], values, ierr)) 5785835d77SBarry Smith PetscCallA(MatGetValuesLocal(A, one, idxn, one, idxn, values, ierr)) 5885835d77SBarry Smith 59d8606c27SBarry Smith PetscCallA(MatDestroy(A, ierr)) 60d8606c27SBarry Smith PetscCallA(PetscFinalize(ierr)) 61c4762a1bSJed Brown 62c4762a1bSJed Brownend program newnonzero 63c4762a1bSJed Brown 64c4762a1bSJed Brown!/*TEST 65c4762a1bSJed Brown! 66c4762a1bSJed Brown! test: 67c4762a1bSJed Brown! nsize: 2 68c4762a1bSJed Brown! filter: Error: 69c4762a1bSJed Brown! 70c4762a1bSJed Brown! test: 71dfd57a17SPierre Jolivet! requires: defined(PETSC_USE_INFO) 72c4762a1bSJed Brown! suffix: 2 73c4762a1bSJed Brown! nsize: 2 74c4762a1bSJed Brown! args: -info 75c4762a1bSJed Brown! filter: grep "Skipping" 76c4762a1bSJed Brown! 77c4762a1bSJed Brown!TEST*/ 78