1c4762a1bSJed Brown#include <petsc/finclude/petscvec.h> 2c4762a1bSJed Brown#include <petsc/finclude/petscmat.h> 3*c5e229c2SMartin Diehlprogram main 4c4762a1bSJed Brown use petscvec 5c4762a1bSJed Brown use petscmat 6c4762a1bSJed Brown 7c4762a1bSJed Brown implicit none 8c4762a1bSJed Brown 9c4762a1bSJed Brown Mat A 10c4762a1bSJed Brown PetscInt, parameter :: n = 5, m = 5 11c4762a1bSJed Brown PetscScalar, parameter :: two = 2.0, one = 1.0 12c4762a1bSJed Brown PetscInt, pointer, dimension(:) :: dnnz, onnz 13c4762a1bSJed Brown PetscInt :: i, rstart, rend, M1, N1 14c4762a1bSJed Brown PetscErrorCode ierr 15c4762a1bSJed Brown 16d8606c27SBarry Smith PetscCallA(PetscInitialize(ierr)) 17c4762a1bSJed Brown 18c4762a1bSJed Brown allocate (dnnz(0:m - 1)) 19c4762a1bSJed Brown allocate (onnz(0:m - 1)) 20c4762a1bSJed Brown 21c4762a1bSJed Brown do i = 0, m - 1 22c4762a1bSJed Brown dnnz(i) = 1 23c4762a1bSJed Brown onnz(i) = 1 24c4762a1bSJed Brown end do 25c4762a1bSJed Brown 26d8606c27SBarry Smith PetscCallA(MatCreateAIJ(PETSC_COMM_WORLD, m, n, PETSC_DETERMINE, PETSC_DETERMINE, PETSC_DECIDE, dnnz, PETSC_DECIDE, onnz, A, ierr)) 27d8606c27SBarry Smith PetscCallA(MatSetFromOptions(A, ierr)) 28d8606c27SBarry Smith PetscCallA(MatSetUp(A, ierr)) 29c4762a1bSJed Brown deallocate (dnnz) 30c4762a1bSJed Brown deallocate (onnz) 31c4762a1bSJed Brown 32c4762a1bSJed Brown !/* This assembly shrinks memory because we do not insert enough number of values */ 33d8606c27SBarry Smith PetscCallA(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY, ierr)) 34d8606c27SBarry Smith PetscCallA(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY, ierr)) 35c4762a1bSJed Brown 36c4762a1bSJed Brown !/* MatResetPreallocation restores the memory required by users */ 37d8606c27SBarry Smith PetscCallA(MatResetPreallocation(A, ierr)) 38d8606c27SBarry Smith PetscCallA(MatSetOption(A, MAT_NEW_NONZERO_ALLOCATION_ERR, PETSC_TRUE, ierr)) 39d8606c27SBarry Smith PetscCallA(MatGetOwnershipRange(A, rstart, rend, ierr)) 40d8606c27SBarry Smith PetscCallA(MatGetSize(A, M1, N1, ierr)) 41c4762a1bSJed Brown do i = rstart, rend - 1 42d8606c27SBarry Smith PetscCallA(MatSetValue(A, i, i, two, INSERT_VALUES, ierr)) 43d8606c27SBarry Smith if (rend < N1) PetscCallA(MatSetValue(A, i, rend, one, INSERT_VALUES, ierr)) 44c4762a1bSJed Brown end do 45d8606c27SBarry Smith PetscCallA(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY, ierr)) 46d8606c27SBarry Smith PetscCallA(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY, ierr)) 47d8606c27SBarry Smith PetscCallA(MatView(A, PETSC_VIEWER_STDOUT_WORLD, ierr)) 48d8606c27SBarry Smith PetscCallA(MatDestroy(A, ierr)) 49d8606c27SBarry Smith PetscCallA(PetscFinalize(ierr)) 50c4762a1bSJed Brown 51c4762a1bSJed Brownend program 52c4762a1bSJed Brown 53c4762a1bSJed Brown!/*TEST 54c4762a1bSJed Brown! 55c4762a1bSJed Brown! test: 56c4762a1bSJed Brown! suffix: 1 57c4762a1bSJed Brown! output_file: output/ex4_1.out 58c4762a1bSJed Brown! 59c4762a1bSJed Brown! test: 60c4762a1bSJed Brown! suffix: 2 61c4762a1bSJed Brown! nsize: 2 62c4762a1bSJed Brown! output_file: output/ex4_2.out 63c4762a1bSJed Brown! 64c4762a1bSJed Brown!TEST*/ 65