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