Actual source code: ex212f.F90
1: !
2: ! Tests MatGetNullSpace() and PetscObjectIsNull()
3: !
4: program main
6: #include <petsc/finclude/petscmat.h>
7: use petscmat
8: implicit none
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
18: zero = 0
19: one = 1
20: sone = 1
21: PetscCallA(PetscInitialize(ierr))
23: PetscCallA(MatCreate(PETSC_COMM_WORLD, A, ierr))
24: PetscCallA(MatCreate(PETSC_COMM_WORLD, B, ierr))
26: PetscCallA(MatGetNullSpace(A, sp, ierr))
27: PetscCheckA(PetscObjectIsNull(sp), PETSC_COMM_SELF, PETSC_ERR_PLIB, 'Matrix null space should not exist')
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')
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))
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))
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))
62: end
64: !/*TEST
65: !
66: ! test:
67: ! requires: !complex
68: !
69: !TEST*/