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*/