xref: /petsc/src/mat/tests/ex212f.F90 (revision 9b88ac225e01f016352a5f4cd90e158abe5f5675)
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