SURFEX v8.1
General documentation of Surfex
trip_update_and_conserv.F90
Go to the documentation of this file.
1 ! #########
2  SUBROUTINE trip_update_and_conserv(OPRINT,OFLOOD,HGROUNDW,PAREA,PWEFF, &
3  PSURF_STO2,PFLOOD_STO2,PGROUND_STO2, &
4  PSURF_STO,PFLOOD_STO,PGROUND_STO, &
5  OMASK_GW,PHGROUND,PRECUP_ALL )
6 ! ################################################################
7 !
8 !!**** *TRIP_UPDATE_AND_CONSERV*
9 !!
10 !! PURPOSE
11 !! -------
12 !
13 ! Update all reservoir and conserve water mass as possible
14 !
15 !!** METHOD
16 !! ------
17 !
18 ! Direct calculation
19 !
20 !! EXTERNAL
21 !! --------
22 !
23 ! None
24 !!
25 !! IMPLICIT ARGUMENTS
26 !! ------------------
27 !!
28 !!
29 !! REFERENCE
30 !! ---------
31 !!
32 !! AUTHOR
33 !! ------
34 !! B. Decharme
35 !!
36 !! MODIFICATIONS
37 !! -------------
38 !! Original 01/12/13
39 !-------------------------------------------------------------------------------
40 !
41 !* 0. DECLARATIONS
42 ! ------------
43 !
44 USE modn_trip, ONLY : xcvel
45 USE modd_trip_par, ONLY : xrholw
46 !
47 !
48 USE yomhook ,ONLY : lhook, dr_hook
49 USE parkind1 ,ONLY : jprb
50 !
51 IMPLICIT NONE
52 !
53 !* 0.1 declarations of arguments
54 !
55 LOGICAL, INTENT(IN) :: OPRINT !Printable budget key
56 LOGICAL, INTENT(IN) :: OFLOOD !Flood scheme key
57  CHARACTER(LEN=3), INTENT(IN) :: HGROUNDW !Groundwater scheme key
58 LOGICAL, DIMENSION(:,:), INTENT(IN) :: OMASK_GW !Groundwater mask
59 REAL, DIMENSION(:,:), INTENT(IN) :: PAREA ! Grid-cell area [m2]
60 REAL, DIMENSION(:,:), INTENT(IN) :: PWEFF ! Effective porosity [-]
61 REAL, DIMENSION(:,:), INTENT(IN) :: PSURF_STO2 ! river channel storage [kg]
62 REAL, DIMENSION(:,:), INTENT(IN) :: PFLOOD_STO2 ! Floodplain water storage [kg]
63 REAL, DIMENSION(:,:), INTENT(IN) :: PGROUND_STO2 ! groundwater storage [kg]
64 !
65 REAL, DIMENSION(:,:), INTENT(OUT) :: PSURF_STO ! river channel storage at t+1 [kg]
66 REAL, DIMENSION(:,:), INTENT(OUT) :: PFLOOD_STO ! Floodplain water storage at t+1 [kg]
67 REAL, DIMENSION(:,:), INTENT(OUT) :: PGROUND_STO ! groundwater storage at t+1 [kg]
68 REAL, DIMENSION(:,:), INTENT(INOUT) :: PHGROUND ! water table elevation [m]
69 REAL, INTENT(OUT) :: PRECUP_ALL ! Global none conserved water mass[kg/m2]
70 !
71 !* 0.2 declarations of local variables
72 !
73 REAL, DIMENSION(SIZE(PAREA,1),SIZE(PAREA,2)) :: ZRECUP_FLD ! ensure water conservation [kg]
74 REAL, DIMENSION(SIZE(PAREA,1),SIZE(PAREA,2)) :: ZRECUP_SURF ! ensure water conservation [kg]
75 REAL, DIMENSION(SIZE(PAREA,1),SIZE(PAREA,2)) :: ZRECUP_FINAL! ensure water conservation [kg]
76 !
77 INTEGER :: ILON, ILAT, JLON, JLAT
78 !
79 REAL(KIND=JPRB) :: ZHOOK_HANDLE
80 !
81 !-------------------------------------------------------------------------------
82 !-------------------------------------------------------------------------------
83 !
84 IF (lhook) CALL dr_hook('TRIP_UPDATE_AND_CONSERV',0,zhook_handle)
85 !
86 !-------------------------------------------------------------------------------
87 ! * Init
88 !-------------------------------------------------------------------------------
89 !
90 ilon = SIZE(parea,1)
91 ilat = SIZE(parea,2)
92 !
93 zrecup_fld(:,:) = 0.0
94 zrecup_surf(:,:) = 0.0
95 zrecup_final(:,:) = 0.0
96 !
97 !-------------------------------------------------------------------------------
98 ! * Update and conserve water mass
99 !-------------------------------------------------------------------------------
100 !
101 IF(oflood)THEN
102  zrecup_fld(:,:) = min(0.0,pflood_sto2(:,:))
103  pflood_sto(:,:) = max(0.0,pflood_sto2(:,:))
104 ENDIF
105 !
106 zrecup_surf(:,:) = min(0.0,psurf_sto2(:,:)+zrecup_fld(:,:))
107 psurf_sto(:,:) = max(0.0,psurf_sto2(:,:)+zrecup_fld(:,:))
108 !
109 IF(hgroundw=='CST')THEN
110 !
111  WHERE(omask_gw(:,:))
112  zrecup_final(:,:) = min(0.0,pground_sto2(:,:)+zrecup_surf(:,:))
113  pground_sto(:,:) = max(0.0,pground_sto2(:,:)+zrecup_surf(:,:))
114  ELSEWHERE
115  zrecup_final(:,:) = zrecup_surf(:,:)
116  pground_sto(:,:) = 0.0
117  ENDWHERE
118 !
119 ELSEIF(hgroundw=='DIF')THEN
120 !
121  WHERE(omask_gw(:,:).AND.zrecup_surf(:,:)<0.0)
122  zrecup_final(:,:) = 0.0
123  phground(:,:) = phground(:,:)+zrecup_surf(:,:)/(pweff(:,:)*parea(:,:)*xrholw)
124  ELSEWHERE
125  zrecup_final(:,:) = zrecup_surf(:,:)
126  ENDWHERE
127 !
128 ELSE
129 !
130  zrecup_final(:,:) = zrecup_surf(:,:)
131 !
132 ENDIF
133 !
134 !-------------------------------------------------------------------------------
135 ! * Global unconserved water mass calculation
136 !-------------------------------------------------------------------------------
137 !
138 IF(oprint)THEN
139 !
140  precup_all = 0.0
141 !
142  DO jlat=1,ilat
143  DO jlon=1,ilon
144  precup_all = precup_all + zrecup_final(jlon,jlat)/parea(jlon,jlat)
145  ENDDO
146  ENDDO
147 !
148 ENDIF
149 !
150 IF (lhook) CALL dr_hook('TRIP_UPDATE_AND_CONSERV',1,zhook_handle)
151 !
152 !-------------------------------------------------------------------------------
153 !-------------------------------------------------------------------------------
154 END SUBROUTINE trip_update_and_conserv
subroutine trip_update_and_conserv(OPRINT, OFLOOD, HGROUNDW, PAREA, PW
real xcvel
Definition: modn_trip.F90:45
real, save xrholw
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15