program main #include #include use petscvec use petscmat implicit none Mat A PetscInt,parameter :: n=5,m=5 PetscScalar,parameter :: two =2.0, one = 1.0 PetscInt,pointer,dimension(:) :: dnnz,onnz PetscInt :: i,rstart,rend,M1,N1 PetscErrorCode ierr PetscCallA(PetscInitialize(ierr)) allocate(dnnz(0:m-1)) allocate(onnz(0:m-1)) do i=0,m-1 dnnz(i) = 1 onnz(i) = 1 end do PetscCallA(MatCreateAIJ(PETSC_COMM_WORLD,m,n,PETSC_DETERMINE,PETSC_DETERMINE,PETSC_DECIDE,dnnz,PETSC_DECIDE,onnz,A,ierr)) PetscCallA(MatSetFromOptions(A,ierr)) PetscCallA(MatSetUp(A,ierr)) deallocate(dnnz) deallocate(onnz) !/* This assembly shrinks memory because we do not insert enough number of values */ PetscCallA(MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY,ierr)) PetscCallA(MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY,ierr)) !/* MatResetPreallocation restores the memory required by users */ PetscCallA(MatResetPreallocation(A,ierr)) PetscCallA(MatSetOption(A,MAT_NEW_NONZERO_ALLOCATION_ERR,PETSC_TRUE,ierr)) PetscCallA(MatGetOwnershipRange(A,rstart,rend,ierr)) PetscCallA(MatGetSize(A,M1,N1,ierr)) do i=rstart,rend-1 PetscCallA(MatSetValue(A,i,i,two,INSERT_VALUES,ierr)) if (rend