xref: /petsc/src/mat/tests/ex212f.F90 (revision d8606c274c09e255c003062beb17b1be973467bc)
1c4762a1bSJed Brown!
2c4762a1bSJed Brown!  Program to test recently added F90 features for Mat
3c4762a1bSJed Brown!
4c4762a1bSJed Brown      program main
5c4762a1bSJed Brown
6c4762a1bSJed Brown#include <petsc/finclude/petscmat.h>
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
21*d8606c27SBarry Smith      PetscCallA(PetscInitialize(ierr))
22c4762a1bSJed Brown
23*d8606c27SBarry Smith      PetscCallA(MatCreate(PETSC_COMM_WORLD,A,ierr))
24*d8606c27SBarry Smith      PetscCallA(MatCreate(PETSC_COMM_WORLD,B,ierr))
25c4762a1bSJed Brown
26*d8606c27SBarry Smith      PetscCallA(MatGetNullSpace(A,sp,ierr))
27c4762a1bSJed Brown      if (sp .ne. PETSC_NULL_MATNULLSPACE) then; SETERRA(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Matrix null space should not exist"); endif
28c4762a1bSJed Brown
29*d8606c27SBarry Smith      PetscCallA(MatSetNullSpace(A,PETSC_NULL_MATNULLSPACE,ierr))
30*d8606c27SBarry Smith      PetscCallA(MatGetNullSpace(A,sp,ierr))
31c4762a1bSJed Brown      if (sp .ne. PETSC_NULL_MATNULLSPACE) then; SETERRA(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Matrix null space should not exist"); endif
32c4762a1bSJed Brown
33*d8606c27SBarry Smith      PetscCallA(MatNullSpaceCreate(PETSC_COMM_WORLD,PETSC_TRUE,zero,PETSC_NULL_VEC,sp,ierr))
34*d8606c27SBarry Smith      PetscCallA(MatSetNullSpace(A,sp,ierr))
35*d8606c27SBarry Smith      PetscCallA(MatGetNullSpace(A,sp1,ierr))
36c4762a1bSJed Brown      if (sp1 .eq. PETSC_NULL_MATNULLSPACE) then; SETERRA(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Matrix null space should not be null"); endif
37*d8606c27SBarry Smith      PetscCallA(MatNullSpaceDestroy(sp,ierr))
38c4762a1bSJed Brown
39*d8606c27SBarry Smith      PetscCallA(MatCreateSeqDense(PETSC_COMM_WORLD,one,one,PETSC_NULL_SCALAR,C,ierr))
40*d8606c27SBarry Smith      PetscCallA(MatSetValues(C,one,zero,one,zero,sone,INSERT_VALUES,ierr))
41*d8606c27SBarry Smith      PetscCallA(MatAssemblyBegin(C,MAT_FINAL_ASSEMBLY,ierr))
42*d8606c27SBarry Smith      PetscCallA(MatAssemblyEnd(C,MAT_FINAL_ASSEMBLY,ierr))
43*d8606c27SBarry Smith      PetscCallA(MatCreateSchurComplement(C,C,C,C,PETSC_NULL_MAT,SC,ierr))
44*d8606c27SBarry Smith      PetscCallA(MatGetOwnershipRange(SC,PETSC_NULL_INTEGER,rend,ierr))
45*d8606c27SBarry Smith      PetscCallA(VecCreateSeq(PETSC_COMM_SELF,one,x,ierr))
46*d8606c27SBarry Smith      PetscCallA(VecDuplicate(x,y,ierr))
47*d8606c27SBarry Smith      PetscCallA(VecSetValues(x,one,zero,sone,INSERT_VALUES,ierr))
48*d8606c27SBarry Smith      PetscCallA(VecAssemblyBegin(x,ierr))
49*d8606c27SBarry Smith      PetscCallA(VecAssemblyEnd(x,ierr))
50*d8606c27SBarry Smith      PetscCallA(MatMult(SC,x,y,ierr))
51*d8606c27SBarry Smith      PetscCallA(VecView(y,PETSC_VIEWER_STDOUT_SELF,ierr))
52*d8606c27SBarry Smith      PetscCallA(VecSetRandom(x,PETSC_NULL_RANDOM,ierr))
53*d8606c27SBarry Smith      PetscCallA(VecView(x,PETSC_VIEWER_STDOUT_SELF,ierr))
54c4762a1bSJed Brown
55*d8606c27SBarry Smith      PetscCallA(MatDestroy(SC,ierr))
56*d8606c27SBarry Smith      PetscCallA(MatDestroy(C,ierr))
57*d8606c27SBarry Smith      PetscCallA(VecDestroy(x,ierr))
58*d8606c27SBarry Smith      PetscCallA(VecDestroy(y,ierr))
59*d8606c27SBarry Smith      PetscCallA(MatDestroy(A,ierr))
60*d8606c27SBarry Smith      PetscCallA(MatDestroy(B,ierr))
61*d8606c27SBarry Smith      PetscCallA(PetscFinalize(ierr))
62c4762a1bSJed Brown      end
63c4762a1bSJed Brown
64c4762a1bSJed Brown!/*TEST
65c4762a1bSJed Brown!
66c4762a1bSJed Brown!   test:
67c4762a1bSJed Brown!      requires: !complex
68c4762a1bSJed Brown!
69c4762a1bSJed Brown!TEST*/
70