1! Test MatCreateNest() with NULL index sets 2 3program main 4#include <petsc/finclude/petscmat.h> 5 use petscmat 6 implicit none 7 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 15 16 PetscCallA(PetscInitialize(ierr)) 17 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)) 27 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)) 33 34 ! test MatCopy() 35 PetscCallA(MatDuplicate(A, MAT_DO_NOT_COPY_VALUES, Acopy, ierr)) 36 PetscCallA(MatCopy(A, Acopy, DIFFERENT_NONZERO_PATTERN, ierr)) 37 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)) 45 46end program 47 48!/*TEST 49! 50! test: 51! nsize: 2 52! 53!TEST*/ 54