1! 2! Tests MatGetNullSpace() and PetscObjectIsNull() 3! 4#include <petsc/finclude/petscmat.h> 5program main 6 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)) 62end 63 64!/*TEST 65! 66! test: 67! requires: !complex 68! 69!TEST*/ 70