xref: /petsc/src/mat/tests/ex241f.F90 (revision c4762a1b19cd2af06abeed90e8f9d34fb975dd94)
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