SURFEX v8.1
General documentation of Surfex
isba_budget.F90
Go to the documentation of this file.
1 !SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
2 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
3 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SFX_LIC for details. version 1.
5 ! #########
6 SUBROUTINE isba_budget (IO, PK, PEK, DEK, OWATER_BUDGET, PTSTEP,&
7  PWG_INI, PWGI_INI, PWR_INI, PSWE_INI, PRAIN, PSNOW, PEVAP )
8 ! ###############################################################################
9 !
10 !!**** *ISBA_BUDGET * - water and energy budget for ISBA
11 !!
12 !! PURPOSE
13 !! -------
14 !
15 !!** METHOD
16 !! ------
17 !!
18 !! REFERENCE
19 !! ---------
20 !!
21 !!
22 !! AUTHOR
23 !! ------
24 !! B. Decharme
25 !!
26 !! MODIFICATIONS
27 !! -------------
28 !! Original 07/2012
29 !! B. Decharme 01/16 : Bug with flood budget
30 !!------------------------------------------------------------------
31 !
33 USE modd_isba_n, ONLY : isba_p_t, isba_pe_t
35 !
36 USE modd_surf_par, ONLY : xundef
37 USE modd_csts, ONLY : xrholw
38 !
39 !
40 USE yomhook ,ONLY : lhook, dr_hook
41 USE parkind1 ,ONLY : jprb
42 !
43 IMPLICIT NONE
44 !
45 !* 0.1 declarations of arguments
46 !
47 TYPE(isba_options_t), INTENT(INOUT) :: IO
48 TYPE(isba_p_t), INTENT(INOUT) :: PK
49 TYPE(isba_pe_t), INTENT(INOUT) :: PEK
50 TYPE(diag_evap_isba_t), INTENT(INOUT) :: DEK
51 !
52 LOGICAL, INTENT(IN) :: OWATER_BUDGET
53 !
54 REAL, INTENT(IN) :: PTSTEP ! timestep of the integration (s)
55 !
56 REAL, DIMENSION(:), INTENT(IN) :: PWG_INI ! total wg at t-1 (kg m-2)
57 REAL, DIMENSION(:), INTENT(IN) :: PWGI_INI ! total wgi at t-1 (kg m-2)
58 REAL, DIMENSION(:), INTENT(IN) :: PWR_INI ! total wr at t-1 (kg m-2)
59 REAL, DIMENSION(:), INTENT(IN) :: PSWE_INI ! total swe at t-1 (kg m-2)
60 !
61 REAL, DIMENSION(:), INTENT(IN) :: PRAIN ! Rain rate (kg/m2/s)
62 REAL, DIMENSION(:), INTENT(IN) :: PSNOW ! Snow rate (kg/m2/s)
63 REAL, DIMENSION(:), INTENT(IN) :: PEVAP ! total evaporative flux (kg/m2/s)
64 !
65 !* 0.2 declarations of local variables
66 !
67 REAL, DIMENSION(SIZE(PEK%XWR)) :: ZINPUT
68 REAL, DIMENSION(SIZE(PEK%XWR)) :: ZOUTPUT
69 REAL, DIMENSION(SIZE(PEK%XWR)) :: ZTENDENCY
70 REAL, DIMENSION(SIZE(PEK%XWR)) :: ZICEFLUX
71 REAL, DIMENSION(SIZE(PEK%XWR)) :: ZSWE_T
72 REAL, DIMENSION(SIZE(PEK%XWR)) :: ZWG_T
73 REAL, DIMENSION(SIZE(PEK%XWR)) :: ZWGI_T
74 REAL, DIMENSION(SIZE(PEK%XWR)) :: ZSNDRIFT
75 REAL, DIMENSION(SIZE(PEK%XWR)) :: ZEFLOOD
76 !
77 INTEGER :: INI, INL, INLS
78 INTEGER :: JI, JL
79 REAL(KIND=JPRB) :: ZHOOK_HANDLE
80 !
81 !-------------------------------------------------------------------------------------
82 !
83 IF (lhook) CALL dr_hook('ISBA_BUDGET',0,zhook_handle)
84 !
85 !* 1.0 Init
86 ! -----------
87 !
88 ini =SIZE(pek%XWG,1)
89 inl =SIZE(pek%XWG,2)
90 inls=SIZE(pek%TSNOW%WSNOW,2)
91 !
92 dek%XDWG (:) = xundef
93 dek%XDWGI(:) = xundef
94 dek%XDWR (:) = xundef
95 dek%XDSWE(:) = xundef
96 !
97 IF (pek%TSNOW%SCHEME=='3-L'.OR.pek%TSNOW%SCHEME=='CRO') THEN
98  zsndrift(:) = dek%XSNDRIFT(:)
99 ELSE
100  zsndrift(:) = 0.0
101 ENDIF
102 !
103 !* 2.0 Comptut isba water budget in kg/m2/s
104 ! -------------------------------------------
105 !
106 IF(owater_budget)THEN
107 !
108 ! total swe at t in kg/m2
109  zswe_t(:)=0.0
110  DO jl=1,inls
111  DO ji=1,ini
112  zswe_t(ji) = zswe_t(ji)+pek%TSNOW%WSNOW(ji,jl)
113  ENDDO
114  ENDDO
115 !
116 ! total wg and wgi at t in kg/m2
117  zwg_t(:)= 0.0
118  zwgi_t(:)= 0.0
119  IF(io%CISBA=='DIF')THEN
120  DO jl=1,inl
121  DO ji=1,ini
122  IF(pek%XWG(ji,jl)/=xundef)THEN
123  zwg_t(ji) = zwg_t(ji)+pek%XWG(ji,jl) *pk%XDZG(ji,jl)*xrholw
124  zwgi_t(ji) = zwgi_t(ji)+pek%XWGI(ji,jl)*pk%XDZG(ji,jl)*xrholw
125  ENDIF
126  ENDDO
127  ENDDO
128  ELSE
129  zwg_t(:) = pek%XWG (:,2)*pk%XDG(:,2)*xrholw
130  zwgi_t(:) = pek%XWGI(:,2)*pk%XDG(:,2)*xrholw
131  IF(io%CISBA=='3-L')THEN
132  zwg_t(:)=zwg_t(:)+pek%XWG(:,3)*(pk%XDG(:,3)-pk%XDG(:,2))*xrholw
133  ENDIF
134  ENDIF
135 !
136 ! Comptut reservoir time tendencies in kg/m2/s
137  dek%XDWG (:) = (zwg_t(:)-pwg_ini(:))/ptstep
138  dek%XDWGI(:) = (zwgi_t(:)-pwgi_ini(:))/ptstep
139  dek%XDWR (:) = (pek%XWR(:)-pwr_ini(:))/ptstep
140  dek%XDSWE(:) = (zswe_t(:)-pswe_ini(:))/ptstep
141 !
142 ! ice calving flux if used
143  IF(io%LGLACIER)THEN
144  ziceflux(:)=dek%XICEFLUX(:)
145  ELSE
146  ziceflux(:)=0.0
147  ENDIF
148 !
149 ! Floodplains evaporation (kg/m2/s)
150  zeflood(:) = dek%XLE_FLOOD(:)/pk%XLVTT(:)+dek%XLEI_FLOOD(:)/pk%XLSTT(:)
151 !
152 ! total input water in the system at t
153  zinput(:)=prain(:)+psnow(:)+dek%XIFLOOD(:)+dek%XIRRIG_FLUX(:)
154 !
155 ! total output water in the system at t
156  zoutput(:) = pevap(:)+dek%XDRAIN (:)+dek%XRUNOFF (:) &
157  + dek%XPFLOOD(:)+ziceflux(:)+zsndrift(:) - zeflood(:)
158 !
159 ! total reservoir time tendencies at "t - (t-1)"
160  ztendency(:) = dek%XDWG(:)+dek%XDWGI(:)+dek%XDWR(:)+dek%XDSWE(:)
161 !
162 ! isba water budget (dw/dt=in-out) in kg/m2/s
163  dek%XWATBUD(:)=ztendency(:)-(zinput(:)-zoutput(:))
164 !
165 ENDIF
166 !
167 !* 3.0 Comptut isba energy budget in W/m2
168 ! -----------------------------------------
169 !
170 ! not yet implemented
171 !
172 IF (lhook) CALL dr_hook('ISBA_BUDGET',1,zhook_handle)
173 !-------------------------------------------------------------------------------------
174 !
175 END SUBROUTINE isba_budget
real, parameter xundef
integer, parameter jprb
Definition: parkind1.F90:32
subroutine isba_budget(IO, PK, PEK, DEK, OWATER_BUDGET, PTSTEP, PWG_INI, PWGI_INI, PWR_INI, PSWE_INI, PRAIN, PSNOW, PEVAP)
Definition: isba_budget.F90:8
logical lhook
Definition: yomhook.F90:15
real, save xrholw
Definition: modd_csts.F90:64