1! 2! Tests MatGetNullSpace() and PetscObjectIsNull() 3! 4 program main 5 6#include <petsc/finclude/petscmat.h> 7 use petscmat 8 implicit none 9 10 PetscErrorCode ierr 11 Mat A,B 12 Mat C,SC 13 MatNullSpace sp,sp1 14 PetscInt one,zero,rend 15 PetscScalar sone 16 Vec x,y 17 18 zero = 0 19 one = 1 20 sone = 1 21 PetscCallA(PetscInitialize(ierr)) 22 23 PetscCallA(MatCreate(PETSC_COMM_WORLD,A,ierr)) 24 PetscCallA(MatCreate(PETSC_COMM_WORLD,B,ierr)) 25 26 PetscCallA(MatGetNullSpace(A,sp,ierr)) 27 PetscCheckA(PetscObjectIsNull(sp),PETSC_COMM_SELF,PETSC_ERR_PLIB,'Matrix null space should not exist') 28 29 PetscCallA(MatSetNullSpace(A,PETSC_NULL_MATNULLSPACE,ierr)) 30 PetscCallA(MatGetNullSpace(A,sp,ierr)) 31 PetscCheckA(PetscObjectIsNull(sp),PETSC_COMM_SELF,PETSC_ERR_PLIB,'Matrix null space should not exist') 32 33 PetscCallA(MatNullSpaceCreate(PETSC_COMM_WORLD,PETSC_TRUE,zero,PETSC_NULL_VEC_ARRAY,sp,ierr)) 34 PetscCallA(MatSetNullSpace(A,sp,ierr)) 35 PetscCallA(MatGetNullSpace(A,sp1,ierr)) 36 PetscCheckA(.not. PetscObjectIsNull(sp),PETSC_COMM_SELF,PETSC_ERR_PLIB,'Matrix null space should not exist') 37 PetscCallA(MatNullSpaceDestroy(sp,ierr)) 38 39 PetscCallA(MatCreateSeqDense(PETSC_COMM_WORLD,one,one,PETSC_NULL_SCALAR_ARRAY,C,ierr)) 40 PetscCallA(MatSetValues(C,one,[zero],one,[zero],[sone],INSERT_VALUES,ierr)) 41 PetscCallA(MatAssemblyBegin(C,MAT_FINAL_ASSEMBLY,ierr)) 42 PetscCallA(MatAssemblyEnd(C,MAT_FINAL_ASSEMBLY,ierr)) 43 PetscCallA(MatCreateSchurComplement(C,C,C,C,PETSC_NULL_MAT,SC,ierr)) 44 PetscCallA(MatGetOwnershipRange(SC,PETSC_NULL_INTEGER,rend,ierr)) 45 PetscCallA(VecCreateSeq(PETSC_COMM_SELF,one,x,ierr)) 46 PetscCallA(VecDuplicate(x,y,ierr)) 47 PetscCallA(VecSetValues(x,one,[zero],[sone],INSERT_VALUES,ierr)) 48 PetscCallA(VecAssemblyBegin(x,ierr)) 49 PetscCallA(VecAssemblyEnd(x,ierr)) 50 PetscCallA(MatMult(SC,x,y,ierr)) 51 PetscCallA(VecView(y,PETSC_VIEWER_STDOUT_SELF,ierr)) 52 PetscCallA(VecSetRandom(x,PETSC_NULL_RANDOM,ierr)) 53 PetscCallA(VecView(x,PETSC_VIEWER_STDOUT_SELF,ierr)) 54 55 PetscCallA(MatDestroy(SC,ierr)) 56 PetscCallA(MatDestroy(C,ierr)) 57 PetscCallA(VecDestroy(x,ierr)) 58 PetscCallA(VecDestroy(y,ierr)) 59 PetscCallA(MatDestroy(A,ierr)) 60 PetscCallA(MatDestroy(B,ierr)) 61 PetscCallA(PetscFinalize(ierr)) 62 end 63 64!/*TEST 65! 66! test: 67! requires: !complex 68! 69!TEST*/ 70