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