SURFEX v8.1
General documentation of Surfex
gwf_cpl_update.F90
Go to the documentation of this file.
1  SUBROUTINE gwf_cpl_update(PTABGW_H,PTABGW_F,OMASK_GW,PTOPO_RIV, &
2  PHC_BED,PHGROUND,PHG_OLD,PWTD,PFWTD )
3 ! ##########################################################################
4 !
5 !!**** *GWF_CPL_UPDATE*
6 !!
7 !! PURPOSE
8 !! -------
9 !
10 ! update groundwater diag
11 !
12 !!** METHOD
13 !! ------
14 !
15 ! Direct calculation
16 !
17 !! EXTERNAL
18 !! --------
19 !
20 ! None
21 !!
22 !! IMPLICIT ARGUMENTS
23 !! ------------------
24 !!
25 !!
26 !! REFERENCE
27 !! ---------
28 !!
29 !! AUTHOR
30 !! ------
31 !! B. Decharme
32 !!
33 !! MODIFICATIONS
34 !! -------------
35 !! Original 01/11/06
36 !-------------------------------------------------------------------------------
37 !
38 !* 0. DECLARATIONS
39 ! ------------
40 !
41 USE modn_trip, ONLY : lgwsubf, xgwsubd
42 !
43 USE modi_abort_trip
44 !
45 USE yomhook ,ONLY : lhook, dr_hook
46 USE parkind1 ,ONLY : jprb
47 !
48 IMPLICIT NONE
49 !
50 !* 0.1 declarations of arguments
51 !
52 REAL, DIMENSION(:,:,:), INTENT(IN) :: PTABGW_H
53 REAL, DIMENSION(:,:,:), INTENT(IN) :: PTABGW_F
54 LOGICAL, DIMENSION(:,:), INTENT(IN) :: OMASK_GW
55 REAL, DIMENSION(:,:), INTENT(IN) :: PTOPO_RIV
56 REAL, DIMENSION(:,:), INTENT(IN) :: PHC_BED
57 REAL, DIMENSION(:,:), INTENT(IN) :: PHGROUND
58 !
59 REAL, DIMENSION(:,:), INTENT(INOUT) :: PHG_OLD
60 REAL, DIMENSION(:,:), INTENT(OUT) :: PWTD
61 REAL, DIMENSION(:,:), INTENT(OUT) :: PFWTD
62 !
63 !* 0.2 declarations of local variables
64 !
65 INTEGER, DIMENSION(SIZE(PTABGW_H,1),SIZE(PTABGW_H,2)) :: ISUP
66 INTEGER, DIMENSION(SIZE(PTABGW_H,1),SIZE(PTABGW_H,2)) :: IINF
67 LOGICAL, DIMENSION(SIZE(PTABGW_H,1),SIZE(PTABGW_H,2)) :: LMASK
68 REAL, DIMENSION(SIZE(PTABGW_H,1),SIZE(PTABGW_H,2)) :: ZSLOPE
69 REAL, DIMENSION(SIZE(PTABGW_H,1),SIZE(PTABGW_H,2)) :: ZHGROUND
70 !
71 INTEGER :: ILON, ILAT, JLON, JLAT, JFRAC, INFRAC
72 !
73 REAL(KIND=JPRB) :: ZHOOK_HANDLE
74 !
75 IF (lhook) CALL dr_hook('GWF_CPL_UPDATE',0,zhook_handle)
76 !
77 !-------------------------------------------------------------------------------
78 ! * Init
79 !-------------------------------------------------------------------------------
80 !
81 ilon = SIZE(ptabgw_h,1)
82 ilat = SIZE(ptabgw_h,2)
83 infrac = SIZE(ptabgw_h,3)
84 !
85 zhground(:,:) = 0.0
86 zslope(:,:) = 0.0
87 
88 lmask(:,:) = (omask_gw(:,:).AND.phground(:,:)/=phg_old(:,:))
89 !
90 !-------------------------------------------------------------------------------
91 ! * Evolution of water table depth
92 !-------------------------------------------------------------------------------
93 !
94 WHERE(lmask(:,:))
95  pwtd(:,:) = phground(:,:)-ptopo_riv(:,:)
96 ENDWHERE
97 !
98 !-------------------------------------------------------------------------------
99 ! * Evolution of the fraction of water table to rise
100 !-------------------------------------------------------------------------------
101 !
102 IF(.NOT.lgwsubf)THEN
103 !
104 ! No sub-grid fraction
105 !
106  WHERE(omask_gw(:,:))
107  pfwtd(:,:) = 1.0
108  ENDWHERE
109 !
110 ELSE
111 !
112 ! Adjust depth before computed sub-grid fraction
113 !
114  WHERE(lmask(:,:))
115  zslope(:,:) = min(1.0,max(0.0,phground(:,:)-(ptopo_riv(:,:)-phc_bed(:,:)))/phc_bed(:,:))
116  zhground(:,:) = phground(:,:) + zslope(:,:)*xgwsubd
117  ENDWHERE
118 !
119 ! Compute sub-grid fraction as in Verges et al., JGR, 2014
120 !
121  WHERE(lmask(:,:).AND.zhground(:,:)<=ptabgw_h(:,:,1))
122  pfwtd(:,:) = min(1.0,ptabgw_f(:,:,1))
123  lmask(:,:) = .false.
124  ELSEWHERE(lmask(:,:).AND.zhground(:,:)>=ptabgw_h(:,:,infrac))
125  pfwtd(:,:) = min(1.0,ptabgw_f(:,:,infrac))
126  lmask(:,:) = .false.
127  ENDWHERE
128 !
129  isup(:,:)=0
130  iinf(:,:)=0
131 !
132  DO jlat=1,ilat
133  DO jlon=1,ilon
134  IF(lmask(jlon,jlat))THEN
135  DO jfrac=1,infrac-1
136  IF(zhground(jlon,jlat)>=ptabgw_h(jlon,jlat,jfrac))THEN
137  isup(jlon,jlat)=jfrac+1
138  iinf(jlon,jlat)=jfrac
139  ENDIF
140  ENDDO
141  IF(iinf(jlon,jlat)==0.or.isup(jlon,jlat)==0)then
142  WRITE(6,*)'IINF,ISUP,JLON,JLAT',iinf(jlon,jlat),isup(jlon,jlat),jlon,jlat
143  CALL flush(6)
144  WRITE(6,*)'JFRAC PHGROUND ZHGROUND PTABGW_H(JFRAC)'
145  WRITE(6,*)jfrac,phground(jlon,jlat),zhground(jlon,jlat),ptabgw_h(jlon,jlat,jfrac)
146  CALL flush(6)
147  CALL abort_trip('GWF_CPL_UPDATE:Problem with IINF or ISUP')
148  ENDIF
149  ENDIF
150  ENDDO
151  ENDDO
152 !
153  DO jlat=1,ilat
154  DO jlon=1,ilon
155  IF(lmask(jlon,jlat))THEN
156  pfwtd(jlon,jlat) = ptabgw_f(jlon,jlat,iinf(jlon,jlat)) &
157  + (zhground(jlon,jlat )-ptabgw_h(jlon,jlat,iinf(jlon,jlat))) &
158  * (ptabgw_f(jlon,jlat,isup(jlon,jlat))-ptabgw_f(jlon,jlat,iinf(jlon,jlat))) &
159  / (ptabgw_h(jlon,jlat,isup(jlon,jlat))-ptabgw_h(jlon,jlat,iinf(jlon,jlat)))
160  pfwtd(jlon,jlat) = min(1.0,pfwtd(jlon,jlat))
161  ENDIF
162  ENDDO
163  ENDDO
164 !
165 ENDIF
166 !
167 !-------------------------------------------------------------------------------
168 ! * Update the old groundwater height
169 !-------------------------------------------------------------------------------
170 !
171 phg_old(:,:)=phground(:,:)
172 !
173 IF (lhook) CALL dr_hook('GWF_CPL_UPDATE',1,zhook_handle)
174 !
175 END SUBROUTINE gwf_cpl_update
176 
subroutine gwf_cpl_update(PTABGW_H, PTABGW_F, OMASK_GW, PTOPO_RIV, PHC_BED, PHGROUND, PHG_OLD, PWTD, PFWTD)
integer, parameter jprb
Definition: parkind1.F90:32
real xgwsubd
Definition: modn_trip.F90:57
logical lgwsubf
Definition: modn_trip.F90:54
logical lhook
Definition: yomhook.F90:15
subroutine abort_trip(YTEXT)
Definition: abort_trip.F90:3