Actual source code: ex241f.F90

  1: !     Test code contributed by Thibaut Appel <t.appel17@imperial.ac.uk>
  2: #include <petsc/finclude/petscmat.h>
  3: program test_assembly
  4:   use petscmat

  6:   implicit none
  7:   PetscInt, parameter :: n = 10
  8:   Mat      :: L
  9:   PetscInt :: istart, iend, row
 10:   PetscErrorCode :: ierr
 11:   PetscInt cols(1), rows(1)
 12:   PetscScalar vals(1)

 14:   PetscCallA(PetscInitialize(ierr))

 16:   PetscCallA(MatCreate(PETSC_COMM_WORLD, L, ierr))
 17:   PetscCallA(MatSetType(L, MATAIJ, ierr))
 18:   PetscCallA(MatSetSizes(L, PETSC_DECIDE, PETSC_DECIDE, n, n, ierr))

 20:   PetscCallA(MatSeqAIJSetPreallocation(L, 1_PETSC_INT_KIND, PETSC_NULL_INTEGER_ARRAY, ierr))
 21:   PetscCallA(MatMPIAIJSetPreallocation(L, 1_PETSC_INT_KIND, PETSC_NULL_INTEGER_ARRAY, 0_PETSC_INT_KIND, PETSC_NULL_INTEGER_ARRAY, ierr)) ! No allocated non-zero in off-diagonal part
 22:   PetscCallA(MatSetOption(L, MAT_IGNORE_ZERO_ENTRIES, PETSC_TRUE, ierr))
 23:   PetscCallA(MatSetOption(L, MAT_NEW_NONZERO_ALLOCATION_ERR, PETSC_TRUE, ierr))
 24:   PetscCallA(MatSetOption(L, MAT_NO_OFF_PROC_ENTRIES, PETSC_TRUE, ierr))

 26:   PetscCallA(MatGetOwnershipRange(L, istart, iend, ierr))

 28:   ! assembling a diagonal matrix
 29:   do row = istart, iend - 1
 30:     cols = [row]; vals = [1.0]; rows = [row]
 31:     PetscCallA(MatSetValues(L, 1_PETSC_INT_KIND, rows, 1_PETSC_INT_KIND, cols, vals, ADD_VALUES, ierr))
 32:   end do

 34:   PetscCallA(MatAssemblyBegin(L, MAT_FINAL_ASSEMBLY, ierr))
 35:   PetscCallA(MatAssemblyEnd(L, MAT_FINAL_ASSEMBLY, ierr))

 37:   PetscCallA(MatSetOption(L, MAT_NEW_NONZERO_LOCATION_ERR, PETSC_TRUE, ierr))

 39:   !PetscCallA(MatZeroEntries(L,ierr))

 41:   ! assembling a diagonal matrix, adding a zero value to non-diagonal part
 42:   do row = istart, iend - 1

 44:     if (row == 0) then
 45:       cols = [n - 1]
 46:       vals = [0.0]
 47:       rows = [row]
 48:       PetscCallA(MatSetValues(L, 1_PETSC_INT_KIND, rows, 1_PETSC_INT_KIND, cols, vals, ADD_VALUES, ierr))
 49:     end if
 50:     cols = [row]; vals = [1.0]; rows = [row]
 51:     PetscCallA(MatSetValues(L, 1_PETSC_INT_KIND, rows, 1_PETSC_INT_KIND, cols, vals, ADD_VALUES, ierr))

 53:   end do

 55:   PetscCallA(MatAssemblyBegin(L, MAT_FINAL_ASSEMBLY, ierr))
 56:   PetscCallA(MatAssemblyEnd(L, MAT_FINAL_ASSEMBLY, ierr))
 57:   PetscCallA(MatDestroy(L, ierr))

 59:   PetscCallA(PetscFinalize(ierr))

 61: end program test_assembly

 63: !/*TEST
 64: !
 65: !   build:
 66: !      requires: complex
 67: !
 68: !   test:
 69: !      nsize: 2
 70: !      output_file: output/empty.out
 71: !
 72: !TEST*/