Actual source code: ex6f.F90

  1: !
  2: !     Demonstrates use of MatShellSetContext() and MatShellGetContext()
  3: !
  4: !     Contributed by:  Samuel Lanthaler
  5: !
  6: MODULE solver_context_ex6f
  7: #include "petsc/finclude/petsc.h"
  8:   USE petscsys
  9:   USE petscmat
 10:   IMPLICIT NONE
 11:   TYPE :: MatCtx
 12:     PetscReal :: lambda, kappa
 13:     PetscReal :: h
 14:   END TYPE MatCtx
 15: END MODULE solver_context_ex6f

 17: MODULE solver_context_interfaces_ex6f
 18:   USE solver_context_ex6f
 19:   IMPLICIT NONE

 21: ! ----------------------------------------------------
 22:   INTERFACE MatCreateShell
 23:     SUBROUTINE MatCreateShell(comm, mloc, nloc, m, n, ctx, mat, ierr)
 24:       USE solver_context_ex6f
 25:       MPI_Comm :: comm
 26:       PetscInt :: mloc, nloc, m, n
 27:       TYPE(MatCtx) :: ctx
 28:       Mat :: mat
 29:       PetscErrorCode :: ierr
 30:     END SUBROUTINE MatCreateShell
 31:   END INTERFACE MatCreateShell
 32: ! ----------------------------------------------------

 34: ! ----------------------------------------------------
 35:   INTERFACE MatShellSetContext
 36:     SUBROUTINE MatShellSetContext(mat, ctx, ierr)
 37:       USE solver_context_ex6f
 38:       Mat :: mat
 39:       TYPE(MatCtx) :: ctx
 40:       PetscErrorCode :: ierr
 41:     END SUBROUTINE MatShellSetContext
 42:   END INTERFACE MatShellSetContext
 43: ! ----------------------------------------------------

 45: ! ----------------------------------------------------
 46:   INTERFACE MatShellGetContext
 47:     SUBROUTINE MatShellGetContext(mat, ctx, ierr)
 48:       USE solver_context_ex6f
 49:       Mat :: mat
 50:       TYPE(MatCtx), POINTER :: ctx
 51:       PetscErrorCode :: ierr
 52:     END SUBROUTINE MatShellGetContext
 53:   END INTERFACE MatShellGetContext

 55: END MODULE solver_context_interfaces_ex6f

 57: ! ----------------------------------------------------
 58: !                    main program
 59: ! ----------------------------------------------------
 60: PROGRAM main
 61: #include "petsc/finclude/petsc.h"
 62:   USE solver_context_interfaces_ex6f
 63:   IMPLICIT NONE
 64:   Mat :: F
 65:   TYPE(MatCtx) :: ctxF
 66:   TYPE(MatCtx), POINTER :: ctxF_pt
 67:   PetscErrorCode :: ierr
 68:   PetscInt :: n = 128

 70:   PetscCallA(PetscInitialize(ierr))
 71:   ctxF%lambda = 3.14d0
 72:   PetscCallA(MatCreateShell(PETSC_COMM_WORLD, n, n, n, n, ctxF, F, ierr))
 73:   PetscCallA(MatShellSetContext(F, ctxF, ierr))
 74:   PRINT *, 'ctxF%lambda = ', ctxF%lambda

 76:   PetscCallA(MatShellGetContext(F, ctxF_pt, ierr))
 77:   PRINT *, 'ctxF_pt%lambda = ', ctxF_pt%lambda

 79:   PetscCallA(MatDestroy(F, ierr))
 80:   PetscCallA(PetscFinalize(ierr))
 81: END PROGRAM main

 83: !/*TEST
 84: !
 85: !     build:
 86: !       requires: double
 87: !
 88: !     test:
 89: !
 90: !TEST*/