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