Actual source code: ex212f.F90

  1: !
  2: !  Program to test recently added F90 features for Mat
  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_MAT_NULLSPACE,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*/