xref: /petsc/src/mat/tests/ex212f.F90 (revision ce78bad369055609e946c9d2c25ea67a45873e27)
1c4762a1bSJed Brown!
2*ce78bad3SBarry Smith!  Tests MatGetNullSpace() and PetscObjectIsNull()
3c4762a1bSJed Brown!
4c4762a1bSJed Brown      program main
5c4762a1bSJed Brown
6c4762a1bSJed Brown#include <petsc/finclude/petscmat.h>
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
29*ce78bad3SBarry 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 Brown      end
63c4762a1bSJed Brown
64c4762a1bSJed Brown!/*TEST
65c4762a1bSJed Brown!
66c4762a1bSJed Brown!   test:
67c4762a1bSJed Brown!      requires: !complex
68c4762a1bSJed Brown!
69c4762a1bSJed Brown!TEST*/
70