SURFEX v8.1
General documentation of Surfex
diag_cpl_esm_isba.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 diag_cpl_esm_isba (IO, S, NK, NP, PTSTEP, PCPL_DRAIN, PCPL_RUNOFF, &
7  PCPL_EFLOOD,PCPL_PFLOOD,PCPL_IFLOOD,PCPL_ICEFLUX )
8 ! #####################################################################
9 !
10 !!**** *DIAG_CPL_ESM_ISBA*
11 !!
12 !! PURPOSE
13 !! -------
14 !
15 !
16 !!** METHOD
17 !! ------
18 !
19 !! EXTERNAL
20 !! --------
21 !!
22 !! none
23 !!
24 !! IMPLICIT ARGUMENTS
25 !! ------------------
26 !!
27 !!
28 !! REFERENCE
29 !! ---------
30 !!
31 !!
32 !! AUTHOR
33 !! ------
34 !!
35 !! B. Decharme * Meteo-France *
36 !!
37 !! MODIFICATIONS
38 !! -------------
39 !!
40 !! B. Decharme 01/16 : Bug with flood budget and add cpl keys
41 !! B. Decharme 10/2016 bug surface/groundwater coupling
42 !-------------------------------------------------------------------------------
43 !
44 !* 0. DECLARATIONS
45 ! ------------
46 !
49 !
52 !
53 USE yomhook ,ONLY : lhook, dr_hook
54 USE parkind1 ,ONLY : jprb
55 !
56 IMPLICIT NONE
57 !
58 !* 0.1 declarations of arguments
59 !
60 TYPE(isba_options_t), INTENT(INOUT) :: IO
61 TYPE(isba_s_t), INTENT(INOUT) :: S
62 TYPE(isba_nk_t), INTENT(INOUT) :: NK
63 TYPE(isba_np_t), INTENT(INOUT) :: NP
64 !
65 REAL, INTENT(IN) :: PTSTEP
66 REAL, DIMENSION(:,:), INTENT(IN) :: PCPL_DRAIN
67 REAL, DIMENSION(:,:), INTENT(IN) :: PCPL_RUNOFF
68 REAL, DIMENSION(:,:), INTENT(IN) :: PCPL_EFLOOD
69 REAL, DIMENSION(:,:), INTENT(IN) :: PCPL_PFLOOD
70 REAL, DIMENSION(:,:), INTENT(IN) :: PCPL_IFLOOD
71 REAL, DIMENSION(:,:), INTENT(IN) :: PCPL_ICEFLUX
72 !
73 !* 0.2 declarations of local variables
74 !
75 TYPE(isba_k_t), POINTER :: KK
76 TYPE(isba_p_t), POINTER :: PK
77 !
78 REAL, DIMENSION(SIZE(PCPL_DRAIN,1),SIZE(PCPL_DRAIN,2)) :: ZCPL_DRAIN
79 !
80 REAL, DIMENSION(SIZE(S%XPATCH,1)) :: ZSUMPATCH
81 REAL, DIMENSION(SIZE(S%XPATCH,1)) :: ZBUDGET
82 !
83 INTEGER :: INJ, JP, IMASK
84 INTEGER :: JI ! tile loop counter
85 !
86 REAL(KIND=JPRB) :: ZHOOK_HANDLE
87 !
88 !-------------------------------------------------------------------------------
89 !
90 IF (lhook) CALL dr_hook('DIAG_CPL_ESM_ISBA',0,zhook_handle)
91 !
92 !* Initialization
93 ! --------------
94 !
95 inj=SIZE(s%XPATCH,1)
96 !
97 zsumpatch(:) = 0.0
98 DO jp=1,io%NPATCH
99  DO ji=1,inj
100  zsumpatch(ji) = zsumpatch(ji) + s%XPATCH(ji,jp)
101  ENDDO
102 ENDDO
103 !
104 IF(io%CISBA/='DIF')THEN
105 ! prevent small negatives values with ISBA-FR
106  zcpl_drain(:,:)=max(0.0,pcpl_drain(:,:))
107 ELSE
108  zcpl_drain(:,:)=pcpl_drain(:,:)
109 ENDIF
110 !
111 !* update ISBA - RRM coupling variable (kg/m2)
112 ! -------------------------------------------
113 !
114 !kg/m²
115 DO jp=1,io%NPATCH
116  DO ji=1,inj
117 !
118  IF(zsumpatch(ji)>0.0)THEN
119  s%XCPL_DRAIN (ji) = s%XCPL_DRAIN (ji) + ptstep * zcpl_drain(ji,jp) * s%XPATCH(ji,jp)/zsumpatch(ji)
120  s%XCPL_RUNOFF(ji) = s%XCPL_RUNOFF(ji) + ptstep * pcpl_runoff(ji,jp) * s%XPATCH(ji,jp)/zsumpatch(ji)
121  ENDIF
122 !
123  IF(io%LGLACIER.AND.zsumpatch(ji)>0.0)THEN
124  s%XCPL_ICEFLUX(ji) = s%XCPL_ICEFLUX(ji) + ptstep * pcpl_iceflux(ji,jp) * s%XPATCH(ji,jp)/zsumpatch(ji)
125  ENDIF
126 !
127  IF(lcpl_flood.AND.io%LFLOOD.AND.zsumpatch(ji)>0.0)THEN
128  s%XCPL_EFLOOD (ji) = s%XCPL_EFLOOD (ji) + ptstep * pcpl_eflood(ji,jp)*s%XPATCH(ji,jp)/zsumpatch(ji)
129  s%XCPL_PFLOOD (ji) = s%XCPL_PFLOOD (ji) + ptstep * pcpl_pflood(ji,jp)*s%XPATCH(ji,jp)/zsumpatch(ji)
130  s%XCPL_IFLOOD (ji) = s%XCPL_IFLOOD (ji) + ptstep * pcpl_iflood(ji,jp)*s%XPATCH(ji,jp)/zsumpatch(ji)
131  ENDIF
132 !
133  ENDDO
134 ENDDO
135 !
136 !* update ISBA Floodplains variable for mass conservation (kg/m2)
137 ! --------------------------------------------------------------
138 !
139 IF(lcpl_flood.AND.io%LFLOOD)THEN
140  zbudget(:) = 0.0
141  DO jp = 1,io%NPATCH
142  kk => nk%AL(jp)
143  pk => np%AL(jp)
144 
145  DO ji = 1,pk%NSIZE_P
146  imask = pk%NR_P(ji)
147  zbudget(imask) = zbudget(imask) + (kk%XPIFLOOD(ji)*xtstep_cpl_land) + &
148  (s%XCPL_PFLOOD(imask)-s%XCPL_IFLOOD(imask)-s%XCPL_EFLOOD(imask))
149  ENDDO
150  ENDDO
151 
152  DO jp = 1,io%NPATCH
153  kk => nk%AL(jp)
154  pk => np%AL(jp)
155 
156  DO ji = 1,pk%NSIZE_P
157  imask = pk%NR_P(ji)
158  IF (zbudget(imask)<=0.) THEN
159  kk%XPIFLOOD(ji) = 0.0
160  kk%XFFLOOD (ji) = 0.0
161  ENDIF
162  ENDDO
163  ENDDO
164 ENDIF
165 !
166 IF (lhook) CALL dr_hook('DIAG_CPL_ESM_ISBA',1,zhook_handle)
167 !
168 END SUBROUTINE diag_cpl_esm_isba
subroutine diag_cpl_esm_isba(IO, S, NK, NP, PTSTEP, PCPL_DRAIN, P
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15