SURFEX v8.1
General documentation of Surfex
gwf_solver.F90
Go to the documentation of this file.
1 ! ###############################################################################
2  SUBROUTINE gwf_solver (KLON,KLAT,PNPTS,OMASK,PHCOF,PRHS,PCR,PCC,PHGROUND,PEVOL)
3 ! ###############################################################################
4 !-------------------------------------------------------------------------------
5 !
6 !* 0. DECLARATIONS
7 ! ------------
8 !
9 USE yomhook ,ONLY : lhook, dr_hook
10 USE parkind1 ,ONLY : jprb
11 !
12 IMPLICIT NONE
13 !
14 !* 0.1 declarations of arguments
15 !
16 INTEGER, INTENT(IN) :: KLON
17 INTEGER, INTENT(IN) :: KLAT
18 !
19 REAL, INTENT(IN) :: PNPTS
20 !
21 LOGICAL, DIMENSION(:,:), INTENT(IN) :: OMASK
22 !
23 REAL, DIMENSION(:,:), INTENT(IN) :: PHCOF
24 REAL, DIMENSION(:,:), INTENT(IN) :: PRHS
25 REAL, DIMENSION(:,:), INTENT(IN) :: PCR
26 REAL, DIMENSION(:,:), INTENT(IN) :: PCC
27 !
28 REAL, DIMENSION(:,:), INTENT(INOUT) :: PHGROUND
29 REAL, INTENT(OUT) :: PEVOL
30 !
31 !* 0.2 declarations of local variables
32 !
33 INTEGER :: JLON, JLAT
34 INTEGER :: INBSOU
35 REAL :: ZHOR,ZNOM,ZDENOM,ZDIAG,ZPASD,ZDIAG_HORI
36 REAL :: ZEVOL
37 !
38 REAL(KIND=JPRB) :: ZHOOK_HANDLE
39 !-------------------------------------------------------------------------------
40 !
41 ! * 1. INITIALISATION
42 ! --------------
43 !
44 IF (lhook) CALL dr_hook('GWF_SOLVER',0,zhook_handle)
45 !
46 ! * error initialization
47 !
48 zevol = 0.
49 !
50 ! * 2. ONE ITERATION LOOP
51 ! ------------------
52 !
53 DO jlat = 1,klat
54  DO jlon = 1,klon
55 !
56  IF (omask(jlon,jlat)) THEN
57 !
58 ! skip constant head cells and no-flow
59  zhor = 0.
60  zdiag = 0.
61  znom = 0.
62  zdenom = 0.
63  zpasd = 0.
64 !
65 ! RIGHT FLUX
66  IF (jlon < klon) THEN
67  zdiag_hori = pcr(jlon,jlat)
68  zhor = zhor + zdiag_hori*phground(jlon+1,jlat)
69  zdiag = zdiag + zdiag_hori
70  ENDIF
71 !
72 ! LEFT FLUX
73  IF (jlon > 1) THEN
74  zdiag_hori = pcr(jlon-1,jlat)
75  zhor = zhor + zdiag_hori*phground(jlon-1,jlat)
76  zdiag = zdiag + zdiag_hori
77  ENDIF
78 !
79 ! BOTTOM FLUX
80  IF (jlat > 1) THEN
81  zdiag_hori = pcc(jlon,jlat-1)
82  zhor = zhor + zdiag_hori*phground(jlon,jlat-1)
83  zdiag = zdiag + zdiag_hori
84  ENDIF
85 !
86 ! TOP FLUX
87  IF (jlat < klat) THEN
88  zdiag_hori = pcc(jlon,jlat)
89  zhor = zhor + zdiag_hori*phground(jlon,jlat+1)
90  zdiag = zdiag + zdiag_hori
91  ENDIF
92 !
93 ! calcul nominateur
94  znom = zhor + prhs(jlon,jlat)
95 !
96 ! calcul dénominateur
97  zdenom = zdiag + phcof(jlon,jlat)
98 !
99 ! calcul new height
100  zpasd = znom/zdenom
101 !
102 ! calcul critère convergence
103  zevol = zevol + abs(zpasd-phground(jlon,jlat))/pnpts
104 !
105 ! update new height
106  phground(jlon,jlat) = zpasd
107 !
108  ENDIF
109 !
110  ENDDO
111 ENDDO
112 !
113 pevol = zevol
114 !
115 IF (lhook) CALL dr_hook('GWF_SOLVER',1,zhook_handle)
116 !
117 END SUBROUTINE gwf_solver
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15
subroutine gwf_solver(KLON, KLAT, PNPTS, OMASK, PHCOF, PRHS, PCR, PCC, PH
Definition: gwf_solver.F90:3