1! Test code contributed by Thibaut Appel <t.appel17@imperial.ac.uk> 2 3 program test_assembly 4 5#include <petsc/finclude/petscmat.h> 6 7 use PetscMat 8 use ISO_Fortran_Env, only : output_unit, real64 9 10 implicit none 11 PetscInt, parameter :: wp = real64, n = 10 12 PetscScalar, parameter :: zero = 0.0, one = 1.0 13 Mat :: L 14 PetscInt :: istart, iend, row, i1, i0 15 PetscErrorCode :: ierr 16 17 PetscInt cols(1),rows(1) 18 PetscScalar vals(1) 19 20 call PetscInitialize(PETSC_NULL_CHARACTER,ierr) 21 if (ierr .ne. 0) then 22 print*,'Unable to initialize PETSc' 23 stop 24 endif 25 26 i0 = 0 27 i1 = 1 28 29 call MatCreate(PETSC_COMM_WORLD,L,ierr); CHKERRA(ierr) 30 call MatSetType(L,MATAIJ,ierr); CHKERRA(ierr) 31 call MatSetSizes(L,PETSC_DECIDE,PETSC_DECIDE,n,n,ierr); CHKERRA(ierr) 32 33 call MatSeqAIJSetPreallocation(L,i1,PETSC_NULL_INTEGER,ierr); CHKERRA(ierr) 34 call MatMPIAIJSetPreallocation(L,i1,PETSC_NULL_INTEGER,i0,PETSC_NULL_INTEGER,ierr); CHKERRA(ierr) ! No allocated non-zero in off-diagonal part 35 call MatSetOption(L,MAT_IGNORE_ZERO_ENTRIES,PETSC_TRUE,ierr); CHKERRA(ierr) 36 call MatSetOption(L,MAT_NEW_NONZERO_ALLOCATION_ERR,PETSC_TRUE,ierr); CHKERRA(ierr) 37 call MatSetOption(L,MAT_NO_OFF_PROC_ENTRIES,PETSC_TRUE,ierr); CHKERRA(ierr) 38 39 call MatGetOwnershipRange(L,istart,iend,ierr); CHKERRA(ierr) 40 41 ! assembling a diagonal matrix 42 do row = istart,iend-1 43 44 cols = [row]; vals = [one]; rows = [row]; 45 call MatSetValues(L,i1,rows,i1,cols,vals,ADD_VALUES,ierr); CHKERRA(ierr) 46 47 end do 48 49 call MatAssemblyBegin(L,MAT_FINAL_ASSEMBLY,ierr); CHKERRA(ierr) 50 call MatAssemblyEnd(L,MAT_FINAL_ASSEMBLY,ierr); CHKERRA(ierr) 51 52 call MatSetOption(L,MAT_NEW_NONZERO_LOCATION_ERR,PETSC_TRUE,ierr); CHKERRA(ierr) 53 54 !call MatZeroEntries(L,ierr); CHKERRA(ierr) 55 56 ! assembling a diagonal matrix, adding a zero value to non-diagonal part 57 do row = istart,iend-1 58 59 if (row == 0) then 60 cols = [n-1] 61 vals = [zero] 62 rows = [row] 63 call MatSetValues(L,i1,rows,i1,cols,vals,ADD_VALUES,ierr); CHKERRA(ierr) 64 end if 65 cols = [row]; vals = [one] ; rows = [ row]; 66 call MatSetValues(L,i1,rows,i1,cols,vals,ADD_VALUES,ierr); CHKERRA(ierr) 67 68 end do 69 70 call MatAssemblyBegin(L,MAT_FINAL_ASSEMBLY,ierr); CHKERRA(ierr) 71 call MatAssemblyEnd(L,MAT_FINAL_ASSEMBLY,ierr); CHKERRA(ierr) 72 call MatDestroy(L,ierr); CHKERRA(ierr) 73 74 call PetscFinalize(ierr) 75 76end program test_assembly 77 78!/*TEST 79! 80! build: 81! requires: complex 82! 83! test: 84! nsize: 2 85! 86!TEST*/ 87