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