Actual source code: ex269f.F90

  1: ! Test MatCreateNest() with NULL index sets

  3: program main
  4: #include <petsc/finclude/petscmat.h>
  5:   use petscmat
  6:   implicit none

  8:   Mat                   :: A, D, Id, Acopy
  9:   Mat, dimension(4)      :: mats
 10:   Vec                   :: v, w
 11:   PetscInt              :: i, rstart, rend
 12:   PetscInt, parameter    :: n = 6, nb = 2
 13:   PetscScalar, parameter :: one = 1.0, two = 2.0
 14:   PetscErrorCode        :: ierr

 16:   PetscCallA(PetscInitialize(ierr))

 18:   PetscCallA(MatCreateConstantDiagonal(PETSC_COMM_WORLD, PETSC_DETERMINE, PETSC_DETERMINE, n, n, one, Id, ierr))
 19:   PetscCallA(MatCreateVecs(Id, v, w, ierr))
 20:   PetscCallA(VecGetOwnershipRange(v, rstart, rend, ierr))
 21:   do i = rstart, rend - 1
 22:     PetscCallA(VecSetValue(v, i, two/(i + 1), INSERT_VALUES, ierr))
 23:   end do
 24:   PetscCallA(VecAssemblyBegin(v, ierr))
 25:   PetscCallA(VecAssemblyEnd(v, ierr))
 26:   PetscCallA(MatCreateDiagonal(v, D, ierr))

 28:   mats = [PETSC_NULL_MAT, D, Id, PETSC_NULL_MAT]
 29:   PetscCallA(MatCreateNest(PETSC_COMM_WORLD, nb, PETSC_NULL_IS_ARRAY, nb, PETSC_NULL_IS_ARRAY, mats, A, ierr))
 30:   PetscCallA(MatView(A, PETSC_VIEWER_STDOUT_WORLD, ierr))
 31:   PetscCallA(MatNestSetSubMats(A, nb, PETSC_NULL_IS_ARRAY, nb, PETSC_NULL_IS_ARRAY, mats, ierr))
 32:   PetscCallA(MatView(A, PETSC_VIEWER_STDOUT_WORLD, ierr))

 34:   ! test MatCopy()
 35:   PetscCallA(MatDuplicate(A, MAT_DO_NOT_COPY_VALUES, Acopy, ierr))
 36:   PetscCallA(MatCopy(A, Acopy, DIFFERENT_NONZERO_PATTERN, ierr))

 38:   PetscCallA(MatDestroy(Acopy, ierr))
 39:   PetscCallA(MatDestroy(Id, ierr))
 40:   PetscCallA(VecDestroy(v, ierr))
 41:   PetscCallA(VecDestroy(w, ierr))
 42:   PetscCallA(MatDestroy(D, ierr))
 43:   PetscCallA(MatDestroy(A, ierr))
 44:   PetscCallA(PetscFinalize(ierr))

 46: end program

 48: !/*TEST
 49: !
 50: !   test:
 51: !      nsize: 2
 52: !
 53: !TEST*/