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(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:   ! test MatCopy()
 36:   PetscCallA(MatDuplicate(A,MAT_DO_NOT_COPY_VALUES,Acopy,ierr))
 37:   PetscCallA(MatCopy(A,Acopy,DIFFERENT_NONZERO_PATTERN,ierr))

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

 47: end program

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