xref: /petsc/src/mat/tests/ex212f.F90 (revision d5b43468fb8780a8feea140ccd6fa3e6a50411cc)
1!
2!  Program to test recently added F90 features for Mat
3!
4      program main
5
6#include <petsc/finclude/petscmat.h>
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      if (sp .ne. PETSC_NULL_MATNULLSPACE) then; SETERRA(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Matrix null space should not exist"); endif
28
29      PetscCallA(MatSetNullSpace(A,PETSC_NULL_MATNULLSPACE,ierr))
30      PetscCallA(MatGetNullSpace(A,sp,ierr))
31      if (sp .ne. PETSC_NULL_MATNULLSPACE) then; SETERRA(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Matrix null space should not exist"); endif
32
33      PetscCallA(MatNullSpaceCreate(PETSC_COMM_WORLD,PETSC_TRUE,zero,PETSC_NULL_VEC,sp,ierr))
34      PetscCallA(MatSetNullSpace(A,sp,ierr))
35      PetscCallA(MatGetNullSpace(A,sp1,ierr))
36      if (sp1 .eq. PETSC_NULL_MATNULLSPACE) then; SETERRA(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Matrix null space should not be null"); endif
37      PetscCallA(MatNullSpaceDestroy(sp,ierr))
38
39      PetscCallA(MatCreateSeqDense(PETSC_COMM_WORLD,one,one,PETSC_NULL_SCALAR,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))
62      end
63
64!/*TEST
65!
66!   test:
67!      requires: !complex
68!
69!TEST*/
70