SURFEX v8.1
General documentation of Surfex
gwf.F90
Go to the documentation of this file.
1 ! ###################################################################
2  SUBROUTINE gwf (TPG, &
3  KLON,KLAT,OPRINT,PTSTEP_RUN,PTSTEP,OMASK,PNUM_AQUI, &
4  PDRAIN,PLEN,PWIDTH,PHC_BED,PTOPO_RIV,PTAUG, &
5  PAREA,PTRANS,PWEFF,PTABGW_F,PTABGW_H,PHS, &
6  PHGROUND,PHG_OLD,PSURF_STO,PQGCELL,PWTD,PFWTD, &
7  PHGHS,PGOUT,PGNEG, &
8  PGSTO_ALL,PGSTO2_ALL,PGIN_ALL,PGOUT_ALL )
9 ! ###################################################################
10 !
11 !-------------------------------------------------------------------------------
12 !
13 !* 0. DECLARATIONS
14 ! ------------
15 !
16 !!
17 !!
18 !!
19 !! AUTHOR
20 !! ------
21 !! J.P Vergnes *Meteo France*
22 !!
23 !! MODIFICATIONS
24 !! -------------
25 !! Original 08/12
26 !! 09/16 B. Decharme limit wtd to -1000m
27 !-------------------------------------------------------------------------------
28 !
29 USE modd_trip_grid, ONLY : trip_grid_t
30 !
31 USE modd_trip_par
32 !
33 USE modi_get_lat_gwf
34 USE modi_gwf_int
35 USE modi_gwf_budget
36 USE modi_gwf_solver
37 USE modi_gwf_cpl_update
38 !
39 USE yomhook ,ONLY : lhook, dr_hook
40 USE parkind1 ,ONLY : jprb
41 !
42 IMPLICIT NONE
43 !
44 !* 0.1 declarations of arguments
45 !
46 !
47 TYPE(trip_grid_t), INTENT(INOUT) :: TPG
48 !
49 INTEGER, INTENT(IN) :: KLON
50 INTEGER, INTENT(IN) :: KLAT
51 LOGICAL, INTENT(IN) :: OPRINT
52 !
53 REAL, INTENT(IN) :: PTSTEP_RUN
54 REAL, INTENT(IN) :: PTSTEP
55 !
56 LOGICAL, DIMENSION(:,:), INTENT(IN) :: OMASK ! Aquifer mask
57 !
58 REAL, DIMENSION(:,:), INTENT(IN) :: PNUM_AQUI ! Aquifer ref number
59 REAL, DIMENSION(:,:), INTENT(IN) :: PDRAIN ! Input drainage [kg/s]
60 REAL, DIMENSION(:,:), INTENT(IN) :: PLEN ! river length [m]
61 REAL, DIMENSION(:,:), INTENT(IN) :: PWIDTH ! river widths [m]
62 REAL, DIMENSION(:,:), INTENT(IN) :: PHC_BED ! River bed depth [m]
63 REAL, DIMENSION(:,:), INTENT(IN) :: PTOPO_RIV ! River elevatation [m]
64 REAL, DIMENSION(:,:), INTENT(IN) :: PTAUG ! ground water transfer time [s]
65 REAL, DIMENSION(:,:), INTENT(IN) :: PAREA ! Grid-cell area [m2]
66 REAL, DIMENSION(:,:), INTENT(IN) :: PTRANS ! Transmissivity [m2/s]
67 REAL, DIMENSION(:,:), INTENT(IN) :: PWEFF ! Effective porosity [-]
68 !
69 REAL, DIMENSION(:,:,:), INTENT(IN) :: PTABGW_F ! Groundwater fraction [-]
70 REAL, DIMENSION(:,:,:), INTENT(IN) :: PTABGW_H ! Topo height [m]
71 !
72 REAL, DIMENSION(:,:), INTENT(IN) :: PHS ! river height at t [m]
73 !
74 REAL, DIMENSION(:,:), INTENT(INOUT) :: PHGROUND ! water table elevation [m]
75 REAL, DIMENSION(:,:), INTENT(INOUT) :: PHG_OLD ! water table elevation at t-1 [m]
76 !
77 REAL, DIMENSION(:,:), INTENT(INOUT), OPTIONAL :: PSURF_STO ! river channel storage at t [kg]
78 !
79 REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PQGCELL
80 REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PWTD
81 REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PFWTD
82 REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PHGHS
83 REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PGOUT
84 REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PGNEG
85 !
86 REAL, INTENT(OUT), OPTIONAL :: PGSTO_ALL
87 REAL, INTENT(OUT), OPTIONAL :: PGSTO2_ALL
88 REAL, INTENT(OUT), OPTIONAL :: PGIN_ALL
89 REAL, INTENT(OUT), OPTIONAL :: PGOUT_ALL
90 !
91 !* 0.2 declarations of local parameter
92 !
93 REAL, PARAMETER :: ZEPSILON = 1.e-12
94 INTEGER, PARAMETER :: IITERMAX = 100
95 !
96 REAL, PARAMETER :: ZGWDZMIN = 10.0 ! Thickness to start to decrease lateral Transmissivity [m]
97 REAL, PARAMETER :: ZGWERR = 0.01 ! Limit of 1cm to limit negatif ground_sto [m]
98 !
99 !
100 !* 0.3 declarations of local variables
101 !
102 !
103 REAL, DIMENSION(KLAT) :: ZLAT
104 REAL :: ZGRID_RES
105 !
106 REAL, DIMENSION(KLON,KLAT) :: ZHDRAIN_RIV !
107 REAL, DIMENSION(KLON,KLAT) :: ZRIVERBED !
108 REAL, DIMENSION(KLON,KLAT) :: ZGWDEEP !
109 REAL, DIMENSION(KLON,KLAT) :: ZCRIV !
110 REAL, DIMENSION(KLON,KLAT) :: ZCC !
111 REAL, DIMENSION(KLON,KLAT) :: ZCR !
112 REAL, DIMENSION(KLON,KLAT) :: ZHCOF !
113 REAL, DIMENSION(KLON,KLAT) :: ZRHS !
114 REAL, DIMENSION(KLON,KLAT) :: ZQDRAIN
115 REAL, DIMENSION(KLON,KLAT) :: ZTAUG
116 REAL, DIMENSION(KLON,KLAT) :: ZSLOPE
117 REAL, DIMENSION(KLON,KLAT) :: ZTRANS
118 !
119 REAL :: ZEVOL !
120 REAL :: ZNPTS ! Number of points in aquifer basins
121 !
122 INTEGER :: IITER, JLON, JLAT
123 !
124 REAL(KIND=JPRB) :: ZHOOK_HANDLE
125 !
126 !-------------------------------------------------------------------------------
127 !
128 ! * 1. INITIALIZATION
129 ! --------------
130 !
131 IF (lhook) CALL dr_hook('GWF',0,zhook_handle)
132 !
133 ! * Initialisation variables
134 !
135 zhcof(:,:) = xundef
136 zrhs(:,:) = xundef
137 zgwdeep(:,:) = 0.0
138 zcr(:,:) = 0.0
139 zcc(:,:) = 0.0
140 zcriv(:,:) = 0.0
141 zqdrain(:,:) = 0.0
142 ztrans(:,:) = 0.0
143 !
144 ! * groundwater mask
145 !
146 znpts = REAL(count(omask(:,:)))
147 !
148 ! * save old hground
149 !
150 phg_old(:,:) = phground(:,:)
151 !
152 ! * Niveau de drainage en riviere
153 !
154 zriverbed(:,:) = ptopo_riv(:,:) - phc_bed(:,:)
155 zhdrain_riv(:,:) = zriverbed(:,:) + min(phc_bed(:,:),phs(:,:))
156 !
157 ! * grid
158 !
159  CALL get_lat_gwf(tpg, &
160  klat,zgrid_res,zlat)
161 !
162 ! * Coefficients nappe/riviere
163 !
164 WHERE(omask(:,:))
165  zslope(:,:) = min(1.0,max(0.0,phground(:,:)-zriverbed(:,:))/phc_bed(:,:))
166  ztaug (:,:) = ptaug(:,:)-(ptaug(:,:)-xday)*zslope(:,:)
167  zcriv (:,:) = pwidth(:,:) * plen(:,:)/ztaug(:,:)
168 ENDWHERE
169 !
170 ! * Transmissivity
171 !
172 WHERE(omask(:,:))
173  zslope(:,:) = min(1.0,max(0.0,phground(:,:)-ptopo_riv(:,:)+xgwdzmax-zgwerr)/zgwdzmin)
174  ztrans(:,:) = ptrans(:,:)*zslope(:,:)
175 ENDWHERE
176 !
177  CALL gwf_int(klon,klat,zgrid_res,zlat,omask,pnum_aqui,ztrans,zcr,zcc)
178 !
179 ! * 2. ITERATION LOOP
180 ! --------------
181 !
182 zevol = 1.0
183 iiter = 0
184 !
185 DO WHILE (zevol>zepsilon.AND.iiter<=iitermax)
186 !
187  DO jlat=1, klat
188  DO jlon=1, klon
189 !
190  IF(omask(jlon,jlat))THEN
191 
192 ! initialisations des coefficients
193  IF(phground(jlon,jlat)<zhdrain_riv(jlon,jlat).AND.phs(jlon,jlat)<=xhsmin)THEN
194  zcriv(jlon,jlat) = 0.0
195  ENDIF
196  IF(phground(jlon,jlat)<zriverbed(jlon,jlat))THEN
197  zcriv(jlon,jlat) = 0.0
198  zgwdeep(jlon,jlat) = max(0.,(phs(jlon,jlat)-xhsmin))*pwidth(jlon,jlat)*plen(jlon,jlat)/ztaug(jlon,jlat)
199  ENDIF
200 !
201 ! formulation des coefficients
202  zhcof(jlon,jlat) = zcriv(jlon,jlat) + (pweff(jlon,jlat)*parea(jlon,jlat)/ptstep_run)
203  zrhs(jlon,jlat) = pdrain(jlon,jlat)/xrholw + zgwdeep(jlon,jlat) + zcriv(jlon,jlat)*zhdrain_riv(jlon,jlat) &
204  + (pweff(jlon,jlat)*parea(jlon,jlat)/ptstep_run)*phg_old(jlon,jlat)
205 !
206  ENDIF
207 !
208  ENDDO
209  ENDDO
210 !
211 ! approximation
212  CALL gwf_solver(klon,klat,znpts,omask,zhcof,zrhs,zcr,zcc,phground,zevol)
213 !
214  iiter = iiter +1
215 !
216 ENDDO
217 !
218 IF(.NOT.PRESENT(psurf_sto))THEN
219  IF (lhook) CALL dr_hook('GWF',1,zhook_handle)
220  RETURN
221 ENDIF
222 !
223 ! * 3. WATER BUDGET
224 ! ------------
225 !
226  CALL gwf_budget(klon,klat,omask,phground,zhdrain_riv, &
227  zgwdeep,zcr,zcc,zcriv,pqgcell,zqdrain )
228 !
229 DO jlat=1, klat
230  DO jlon=1, klon
231  IF(omask(jlon,jlat))THEN
232  phghs(jlon,jlat) = phground(jlon,jlat)-zhdrain_riv(jlon,jlat)
233  pgout(jlon,jlat) = max(0.0,zqdrain(jlon,jlat))
234  pgneg(jlon,jlat) = min(0.0,zqdrain(jlon,jlat))
235  psurf_sto(jlon,jlat) = psurf_sto(jlon,jlat)+pgneg(jlon,jlat)*ptstep_run
236  ELSE
237  pgout(jlon,jlat) = pdrain(jlon,jlat)
238  pgneg(jlon,jlat) = 0.0
239  ENDIF
240  ENDDO
241 ENDDO
242 !
243 ! * 4. GLOBAL BUDGET
244 ! -------------
245 !
246 IF(oprint)THEN
247 !
248  pgsto_all = 0.0
249  pgsto2_all = 0.0
250  pgin_all = 0.0
251  pgout_all = 0.0
252 !
253 !
254  DO jlat=1, klat
255  DO jlon=1, klon
256  IF(omask(jlon,jlat))THEN
257  pgsto_all = pgsto_all + pweff(jlon,jlat)*phg_old(jlon,jlat)*xrholw
258  pgsto2_all = pgsto2_all + pweff(jlon,jlat)*phground(jlon,jlat)*xrholw
259  pgin_all = pgin_all + pdrain(jlon,jlat)*ptstep_run/(ptstep*parea(jlon,jlat))
260  pgout_all = pgout_all + (pgout(jlon,jlat)+pgneg(jlon,jlat)-pqgcell(jlon,jlat)) &
261  * ptstep_run/(ptstep*parea(jlon,jlat))
262  ENDIF
263  ENDDO
264  ENDDO
265 !
266 ENDIF
267 !
268 ! * 5. WTD COUPLING
269 ! ------------
270 !
271 pwtd(:,:) = xundef
272 pfwtd(:,:) = xundef
273 phg_old(:,:) = xundef
274 !
275  CALL gwf_cpl_update(ptabgw_h,ptabgw_f,omask,ptopo_riv, &
276  phc_bed,phground,phg_old,pwtd,pfwtd)
277 !
278 IF (lhook) CALL dr_hook('GWF',1,zhook_handle)
279 !
280 END SUBROUTINE gwf
subroutine gwf_int(KLON, KLAT, PGRID_RES, PLAT, OMASK, PNUM_AQUI, PTRANS
Definition: gwf_int.F90:3
real, save xday
subroutine get_lat_gwf(TPG, KLAT, PRES, PLAT)
Definition: get_lat_gwf.F90:4
subroutine gwf_cpl_update(PTABGW_H, PTABGW_F, OMASK_GW, PTOPO_RIV, PHC_BED, PHGROUND, PHG_OLD, PWTD, PFWTD)
real, save xrholw
subroutine gwf(TPG,
Definition: gwf.F90:3
integer, parameter jprb
Definition: parkind1.F90:32
real, save xgwdzmax
logical lhook
Definition: yomhook.F90:15
subroutine gwf_budget(KLON, KLAT, OMASK, PHGROUND, PHDRAIN_RIV, PGWDEEP, PCR, PCC, PCRIV, PQGCELL, PQDRAIN)
Definition: gwf_budget.F90:4
real, save xhsmin
subroutine gwf_solver(KLON, KLAT, PNPTS, OMASK, PHCOF, PRHS, PCR, PCC, PH
Definition: gwf_solver.F90:3
real, save xundef
static int count
Definition: memory_hook.c:21