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
  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(1) = PETSC_NULL_MAT
 29:   mats(2) = D
 30:   mats(3) = Id
 31:   mats(4) = PETSC_NULL_MAT
 32:   PetscCallA(MatCreateNest(PETSC_COMM_WORLD,nb,PETSC_NULL_IS_ARRAY,nb,PETSC_NULL_IS_ARRAY,mats,A,ierr))
 33:   PetscCallA(MatView(A,PETSC_VIEWER_STDOUT_WORLD,ierr))

 35:   PetscCallA(MatDestroy(Id,ierr))
 36:   PetscCallA(VecDestroy(v,ierr))
 37:   PetscCallA(VecDestroy(w,ierr))
 38:   PetscCallA(MatDestroy(D,ierr))
 39:   PetscCallA(MatDestroy(A,ierr))
 40:   PetscCallA(PetscFinalize(ierr))

 42: end program

 44: !/*TEST
 45: !
 46: !   test:
 47: !      nsize: 2
 48: !
 49: !TEST*/