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