Actual source code: ex212f.F90
1: !
2: ! Tests MatGetNullSpace() and PetscObjectIsNull()
3: !
4: #include <petsc/finclude/petscmat.h>
5: program main
7: use petscmat
8: implicit none
10: PetscErrorCode ierr
11: Mat A, B
12: Mat C, SC
13: MatNullSpace sp, sp1
14: PetscInt rend
15: PetscScalar, parameter :: sone = 1.0
16: Vec x, y
18: PetscCallA(PetscInitialize(ierr))
20: PetscCallA(MatCreate(PETSC_COMM_WORLD, A, ierr))
21: PetscCallA(MatCreate(PETSC_COMM_WORLD, B, ierr))
23: PetscCallA(MatGetNullSpace(A, sp, ierr))
24: PetscCheckA(PetscObjectIsNull(sp), PETSC_COMM_SELF, PETSC_ERR_PLIB, 'Matrix null space should not exist')
26: PetscCallA(MatSetNullSpace(A, PETSC_NULL_MATNULLSPACE, ierr))
27: PetscCallA(MatGetNullSpace(A, sp, ierr))
28: PetscCheckA(PetscObjectIsNull(sp), PETSC_COMM_SELF, PETSC_ERR_PLIB, 'Matrix null space should not exist')
30: PetscCallA(MatNullSpaceCreate(PETSC_COMM_WORLD, PETSC_TRUE, 0_PETSC_INT_KIND, PETSC_NULL_VEC_ARRAY, sp, ierr))
31: PetscCallA(MatSetNullSpace(A, sp, ierr))
32: PetscCallA(MatGetNullSpace(A, sp1, ierr))
33: PetscCheckA(.not. PetscObjectIsNull(sp), PETSC_COMM_SELF, PETSC_ERR_PLIB, 'Matrix null space should not exist')
34: PetscCallA(MatNullSpaceDestroy(sp, ierr))
36: PetscCallA(MatCreateSeqDense(PETSC_COMM_WORLD, 1_PETSC_INT_KIND, 1_PETSC_INT_KIND, PETSC_NULL_SCALAR_ARRAY, C, ierr))
37: PetscCallA(MatSetValues(C, 1_PETSC_INT_KIND, [0_PETSC_INT_KIND], 1_PETSC_INT_KIND, [0_PETSC_INT_KIND], [sone], INSERT_VALUES, ierr))
38: PetscCallA(MatAssemblyBegin(C, MAT_FINAL_ASSEMBLY, ierr))
39: PetscCallA(MatAssemblyEnd(C, MAT_FINAL_ASSEMBLY, ierr))
40: PetscCallA(MatCreateSchurComplement(C, C, C, C, PETSC_NULL_MAT, SC, ierr))
41: PetscCallA(MatGetOwnershipRange(SC, PETSC_NULL_INTEGER, rend, ierr))
42: PetscCallA(VecCreateSeq(PETSC_COMM_SELF, 1_PETSC_INT_KIND, x, ierr))
43: PetscCallA(VecDuplicate(x, y, ierr))
44: PetscCallA(VecSetValues(x, 1_PETSC_INT_KIND, [0_PETSC_INT_KIND], [sone], INSERT_VALUES, ierr))
45: PetscCallA(VecAssemblyBegin(x, ierr))
46: PetscCallA(VecAssemblyEnd(x, ierr))
47: PetscCallA(MatMult(SC, x, y, ierr))
48: PetscCallA(VecView(y, PETSC_VIEWER_STDOUT_SELF, ierr))
49: PetscCallA(VecSetRandom(x, PETSC_NULL_RANDOM, ierr))
50: PetscCallA(VecView(x, PETSC_VIEWER_STDOUT_SELF, ierr))
52: PetscCallA(MatDestroy(SC, ierr))
53: PetscCallA(MatDestroy(C, ierr))
54: PetscCallA(VecDestroy(x, ierr))
55: PetscCallA(VecDestroy(y, ierr))
56: PetscCallA(MatDestroy(A, ierr))
57: PetscCallA(MatDestroy(B, ierr))
58: PetscCallA(PetscFinalize(ierr))
59: end
61: !/*TEST
62: !
63: ! test:
64: ! requires: !complex
65: !
66: !TEST*/