8 ptstep, kyear, kmonth, kday, ptime, ki, ksv, ksw, ptsun, pzenith, &
9 pzenith2, pazim, pzref, puref, pu, pv, pqa, pta, prhoa, psv, pco2, &
10 hsv, prain, psnow, plw, pdir_sw, psca_sw, psw_bands, pps, ppa, &
11 psftq, psfth, psfts, psfco2, psfu, psfv, &
12 ptsrad, pdir_alb, psca_alb, pemis, ptsurf, pz0, pz0h, pqsurf, &
13 ppew_a_coef, ppew_b_coef, &
14 ppet_a_coef, ppeq_a_coef, ppet_b_coef, ppeq_b_coef, &
59 USE modd_csts, ONLY : xrd, xcpd, xp00, xlvtt, xlstt, xkarman, xtt
71 USE modi_add_forecast_to_date_surf
72 USE modi_diag_inline_flake_n
73 USE modi_diag_misc_flake_n
78 USE modi_update_rad_flake
80 USE modi_flake_interface
82 USE yomhook
,ONLY : lhook, dr_hook
83 USE parkind1
,ONLY : jprb
92 TYPE(dst_t),
INTENT(INOUT) :: dst
93 TYPE(slt_t),
INTENT(INOUT) :: slt
95 CHARACTER(LEN=6),
INTENT(IN) :: hprogram
96 CHARACTER(LEN=1),
INTENT(IN) :: hcoupling
99 INTEGER,
INTENT(IN) :: kyear
100 INTEGER,
INTENT(IN) :: kmonth
101 INTEGER,
INTENT(IN) :: kday
102 REAL,
INTENT(IN) :: ptime
103 INTEGER,
INTENT(IN) :: ki
104 INTEGER,
INTENT(IN) :: ksv
105 INTEGER,
INTENT(IN) :: ksw
106 REAL,
DIMENSION(KI),
INTENT(IN) :: ptsun
107 REAL,
INTENT(IN) :: ptstep
108 REAL,
DIMENSION(KI),
INTENT(IN) :: pzref
109 REAL,
DIMENSION(KI),
INTENT(IN) :: puref
111 REAL,
DIMENSION(KI),
INTENT(IN) :: pta
112 REAL,
DIMENSION(KI),
INTENT(IN) :: pqa
113 REAL,
DIMENSION(KI),
INTENT(IN) :: prhoa
114 REAL,
DIMENSION(KI,KSV),
INTENT(IN) :: psv
117 CHARACTER(LEN=6),
DIMENSION(KSV),
INTENT(IN):: hsv
118 REAL,
DIMENSION(KI),
INTENT(IN) :: pu
119 REAL,
DIMENSION(KI),
INTENT(IN) :: pv
120 REAL,
DIMENSION(KI,KSW),
INTENT(IN) :: pdir_sw
122 REAL,
DIMENSION(KI,KSW),
INTENT(IN) :: psca_sw
124 REAL,
DIMENSION(KSW),
INTENT(IN) :: psw_bands
125 REAL,
DIMENSION(KI),
INTENT(IN) :: pzenith
126 REAL,
DIMENSION(KI),
INTENT(IN) :: pzenith2
127 REAL,
DIMENSION(KI),
INTENT(IN) :: pazim
128 REAL,
DIMENSION(KI),
INTENT(IN) :: plw
130 REAL,
DIMENSION(KI),
INTENT(IN) :: pps
131 REAL,
DIMENSION(KI),
INTENT(IN) :: ppa
132 REAL,
DIMENSION(KI),
INTENT(IN) :: pco2
133 REAL,
DIMENSION(KI),
INTENT(IN) :: psnow
134 REAL,
DIMENSION(KI),
INTENT(IN) :: prain
137 REAL,
DIMENSION(KI),
INTENT(OUT) :: psfth
138 REAL,
DIMENSION(KI),
INTENT(OUT) :: psftq
139 REAL,
DIMENSION(KI),
INTENT(OUT) :: psfu
140 REAL,
DIMENSION(KI),
INTENT(OUT) :: psfv
141 REAL,
DIMENSION(KI),
INTENT(OUT) :: psfco2
142 REAL,
DIMENSION(KI,KSV),
INTENT(OUT):: psfts
144 REAL,
DIMENSION(KI),
INTENT(OUT) :: ptsrad
145 REAL,
DIMENSION(KI,KSW),
INTENT(OUT):: pdir_alb
146 REAL,
DIMENSION(KI,KSW),
INTENT(OUT):: psca_alb
147 REAL,
DIMENSION(KI),
INTENT(OUT) :: pemis
149 REAL,
DIMENSION(KI),
INTENT(OUT) :: ptsurf
150 REAL,
DIMENSION(KI),
INTENT(OUT) :: pz0
151 REAL,
DIMENSION(KI),
INTENT(OUT) :: pz0h
152 REAL,
DIMENSION(KI),
INTENT(OUT) :: pqsurf
154 REAL,
DIMENSION(KI),
INTENT(IN) :: ppew_a_coef
155 REAL,
DIMENSION(KI),
INTENT(IN) :: ppew_b_coef
156 REAL,
DIMENSION(KI),
INTENT(IN) :: ppet_a_coef
157 REAL,
DIMENSION(KI),
INTENT(IN) :: ppeq_a_coef
158 REAL,
DIMENSION(KI),
INTENT(IN) :: ppet_b_coef
159 REAL,
DIMENSION(KI),
INTENT(IN) :: ppeq_b_coef
160 CHARACTER(LEN=2),
INTENT(IN) :: htest
164 REAL,
DIMENSION(KI,KSW) :: zdir_alb
165 REAL,
DIMENSION(KI,KSW) :: zsca_alb
167 REAL,
DIMENSION(KI) :: zalb
168 REAL,
DIMENSION(KI) :: zswe
170 REAL,
DIMENSION(KI) :: zexna
171 REAL,
DIMENSION(KI) :: zexns
173 REAL,
DIMENSION(KI) :: zwind
174 REAL,
DIMENSION(KI) :: zglobal_sw
175 REAL,
DIMENSION(KI) :: zqa
177 REAL,
DIMENSION(KI) :: zustar
178 REAL,
DIMENSION(KI) :: zustar2
179 REAL,
DIMENSION(KI) :: zsfm
181 REAL,
DIMENSION(KI) :: zresa_water
185 REAL,
DIMENSION(KI) :: zcd
186 REAL,
DIMENSION(KI) :: zcdn
187 REAL,
DIMENSION(KI) :: zch
188 REAL,
DIMENSION(KI) :: zce
189 REAL,
DIMENSION(KI) :: zri
190 REAL,
DIMENSION(KI) :: zhu
191 REAL,
DIMENSION(KI) :: zz0h
192 REAL,
DIMENSION(KI) :: zqsat
193 REAL,
DIMENSION(KI) :: ztstep
194 REAL,
DIMENSION(KI) :: zle
195 REAL,
DIMENSION(KI) :: zlei
196 REAL,
DIMENSION(KI) :: zsubl
197 REAL,
DIMENSION(KI) :: zlwup
198 REAL,
DIMENSION(KI) :: ztrad
199 REAL,
DIMENSION(KI) :: zwork
201 REAL :: zconvertfacm0_slt, zconvertfacm0_dst
202 REAL :: zconvertfacm3_slt, zconvertfacm3_dst
203 REAL :: zconvertfacm6_slt, zconvertfacm6_dst
210 LOGICAL :: gpwg = .false.
211 LOGICAL :: ghandle_sic = .false.
215 REAL(KIND=JPRB) :: zhook_handle
219 IF (lhook) CALL dr_hook(
'COUPLING_FLAKE_N',0,zhook_handle)
220 IF (htest/=
'OK')
THEN
221 CALL
abor1_sfx(
'COUPLING_FLAKEN: FATAL ERROR DURING ARGUMENT TRANSFER')
231 zresa_water(:) = xundef
236 zglobal_sw(:) = xundef
239 zdir_alb(:,:) = xundef
240 zsca_alb(:,:) = xundef
249 zexns(:) = (pps(:)/xp00)**(xrd/xcpd)
250 zexna(:) = (ppa(:)/xp00)**(xrd/xcpd)
253 zwind(:) = sqrt(pu(:)**2+pv(:)**2)
255 zqa(:) = pqa(:)/prhoa(:)
265 fm%F%TTIME%TIME = fm%F%TTIME%TIME + ptstep
274 IF (fm%F%CFLK_FLUX==
'DEF ')
THEN
277 pta, zexna, prhoa, fm%F%XTS, zexns, pqa,prain, psnow, &
278 xtt, zwind, pzref, puref, &
279 pps, ghandle_sic, zqsat, &
280 psfth, psftq, zustar, &
281 zcd, zcdn, zch, zri, zresa_water, zz0h )
283 WHERE (fm%F%XTS(:)<xtt)
284 zle(:) = psftq(:) * xlstt
285 zlei(:) = psftq(:) * xlstt
288 zle(:) = psftq(:) * xlvtt
293 IF(cimplicit_wind==
'OLD')
THEN
295 zustar2(:) = (zcd(:)*zwind(:)*ppew_b_coef(:))/ &
296 (1.0-prhoa(:)*zcd(:)*zwind(:)*ppew_a_coef(:))
299 zustar2(:) = (zcd(:)*zwind(:)*(2.*ppew_b_coef(:)-zwind(:))) /&
300 (1.0-2.0*prhoa(:)*zcd(:)*zwind(:)*ppew_a_coef(:))
302 zwork(:) = prhoa(:)*ppew_a_coef(:)*zustar2(:) + ppew_b_coef(:)
303 zwork(:) = max(zwork(:),0.)
305 WHERE(ppew_a_coef(:)/= 0.)
306 zustar2(:) = max( ( zwork(:) - ppew_b_coef(:) ) / (prhoa(:)*ppew_a_coef(:)), 0.)
312 zsfm(:) = - prhoa(:) * zustar2(:)
313 psfu(:) = zsfm(:) * pu(:) / zwind(:)
314 psfv(:) = zsfm(:) * pv(:) / zwind(:)
318 zustar(:) = fm%F%XUSTAR(:)
319 zz0h(:) = fm%F%XZ0 (:)
326 iswb =
SIZE(psw_bands)
329 zdir_alb(:,jswb) = fm%F%XDIR_ALB(:)
330 zsca_alb(:,jswb) = fm%F%XSCA_ALB(:)
335 CALL
flake_albedo(pdir_sw,psca_sw,ksw,zdir_alb,zsca_alb,zglobal_sw,zalb)
339 psnow, zglobal_sw, plw, puref, pzref, zwind, pta, zqa, pps, &
341 fm%F%XWATER_DEPTH, fm%F%XWATER_FETCH, fm%F%XDEPTH_BS, fm%F%XT_BS, fm%F%XCORIO,&
346 fm%F%XEXTCOEF_WATER, fm%F%XEXTCOEF_ICE, fm%F%XEXTCOEF_SNOW, &
348 fm%F%XT_SNOW, fm%F%XT_ICE, fm%F%XT_MNW, fm%F%XT_WML, fm%F%XT_BOT, fm%F%XT_B1, fm%F%XCT, &
349 fm%F%XH_SNOW, fm%F%XH_ICE, fm%F%XH_ML, fm%F%XH_B1, fm%F%XTS, &
351 psfth, zle, zsfm, fm%F%XZ0, zz0h, zqsat, zri, zustar, &
352 zcd, psftq, zlei, zsubl, zlwup, zswe, &
354 fm%F%LSEDIMENTS, fm%F%LSKINTEMP, fm%F%CFLK_FLUX, ppew_a_coef, &
355 ppew_b_coef, prhoa, cimplicit_wind )
361 IF (fm%F%CFLK_FLUX==
'FLAKE')
THEN
365 psfu(:) = zsfm(:) * pu(:) / zwind(:)
366 psfv(:) = zsfm(:) * pv(:) / zwind(:)
371 zustar(:) = sqrt(abs(zsfm(:))/prhoa(:))
372 zexns(:) = (pps(:)/xp00)**(xrd/xcpd)
373 zexna(:) = (ppa(:)/xp00)**(xrd/xcpd)
376 zresa_water(:) = xcpd * prhoa(:) * (fm%F%XTS(:) - pta(:) * zexns(:)/zexna(:)) &
377 / (psfth(:) * zexns(:))
382 fm%F%XUSTAR(:) = zustar(:)
394 IF (fm%CHF%SVF%NBEQ>0)
THEN
395 IF (fm%CHF%CCH_DRY_DEP ==
"WES89")
THEN
397 psv(:,fm%CHF%SVF%NSV_CHSBEG:fm%CHF%SVF%NSV_CHSEND), &
398 fm%CHF%SVF%CSV(fm%CHF%SVF%NSV_CHSBEG:fm%CHF%SVF%NSV_CHSEND), &
399 fm%CHF%XDEP(:,1:fm%CHF%SVF%NBEQ) )
401 psfts(:,fm%CHF%SVF%NSV_CHSBEG:fm%CHF%SVF%NSV_CHSEND) = - psv(:,fm%CHF%SVF%NSV_CHSBEG:fm%CHF%SVF%NSV_CHSEND) &
402 * fm%CHF%XDEP(:,1:fm%CHF%SVF%NBEQ)
403 IF (fm%CHF%SVF%NAEREQ > 0 )
THEN
404 CALL
ch_aer_dep(psv(:,fm%CHF%SVF%NSV_AERBEG:fm%CHF%SVF%NSV_AEREND),&
405 psfts(:,fm%CHF%SVF%NSV_AERBEG:fm%CHF%SVF%NSV_AEREND),&
406 zustar,zresa_water,pta,prhoa)
410 psfts(:,fm%CHF%SVF%NSV_CHSBEG:fm%CHF%SVF%NSV_CHSEND) =0.
411 IF(fm%CHF%SVF%NSV_AERBEG.LT.fm%CHF%SVF%NSV_AEREND) psfts(:,fm%CHF%SVF%NSV_AERBEG:fm%CHF%SVF%NSV_AEREND) =0.
415 IF (fm%CHF%SVF%NDSTEQ>0)
THEN
416 CALL
dslt_dep(psv(:,fm%CHF%SVF%NSV_DSTBEG:fm%CHF%SVF%NSV_DSTEND), psfts(:,fm%CHF%SVF%NSV_DSTBEG:fm%CHF%SVF%NSV_DSTEND), &
417 zustar, zresa_water, pta, prhoa, dst%XEMISSIG_DST, dst%XEMISRADIUS_DST, &
418 jpmode_dst, xdensity_dst, xmolarweight_dst, zconvertfacm0_dst, &
419 zconvertfacm6_dst, zconvertfacm3_dst, lvarsig_dst, lrgfix_dst, &
423 psfts(:,fm%CHF%SVF%NSV_DSTBEG:fm%CHF%SVF%NSV_DSTEND), &
425 dst%XEMISRADIUS_DST, &
431 lvarsig_dst, lrgfix_dst )
435 IF (fm%CHF%SVF%NSLTEQ>0)
THEN
436 CALL
dslt_dep(psv(:,fm%CHF%SVF%NSV_SLTBEG:fm%CHF%SVF%NSV_SLTEND), psfts(:,fm%CHF%SVF%NSV_SLTBEG:fm%CHF%SVF%NSV_SLTEND), &
437 zustar, zresa_water, pta, prhoa, slt%XEMISSIG_SLT, slt%XEMISRADIUS_SLT, &
438 jpmode_slt, xdensity_slt, xmolarweight_slt, zconvertfacm0_slt, &
439 zconvertfacm6_slt, zconvertfacm3_slt, lvarsig_slt, lrgfix_slt, &
443 psfts(:,fm%CHF%SVF%NSV_SLTBEG:fm%CHF%SVF%NSV_SLTEND), &
445 slt%XEMISRADIUS_SLT, &
451 lvarsig_slt, lrgfix_slt )
459 IF (fm%F%CFLK_FLUX==
'FLAKE')
THEN
463 WHERE (abs((fm%F%XTS(:) - pta(:) * zexns(:)/zexna(:))) > 1.e-2 .AND. zwind(:)/=0.)
464 zch = max(zeps,psfth / (xcpd * prhoa(:) * zwind(:) * (fm%F%XTS(:) - pta(:) * zexns(:)/zexna(:))) * zexns(:))
467 zcdn(:) = (xkarman/log(puref(:)/fm%F%XZ0(:)))**2
468 zcd(:) = max(zeps,zcd(:))
473 ptstep, pta, zqa, ppa, pps, prhoa, pu, &
474 pv, pzref, puref, prain, psnow, &
475 zcd, zcdn, zch, zri, zhu, &
476 zz0h, zqsat, psfth, psftq, psfu, psfv, &
477 pdir_sw, psca_sw, plw, zdir_alb, zsca_alb, &
478 zle, zlei, zsubl, zlwup, zalb, zswe )
483 fm%F%XT_WML,fm%F%XT_BOT,fm%F%XH_ML,fm%F%XCT,fm%F%XWATER_DEPTH)
491 ptsurf(:) = fm%F%XTS (:)
492 pz0(:) = fm%F%XZ0 (:)
501 CALL
update_rad_flake(fm%F%CFLK_ALB,fm%F%XTS,pzenith2,fm%F%XH_ICE,fm%F%XH_SNOW,fm%F%XICE_ALB,fm%F%XSNOW_ALB, &
502 fm%F%XDIR_ALB,fm%F%XSCA_ALB,fm%F%XEMIS,pdir_alb,psca_alb,pemis,ptsrad )
504 IF (lhook) CALL dr_hook(
'COUPLING_FLAKE_N',1,zhook_handle)
subroutine diag_inline_flake_n(DGF, F, PTSTEP, PTA, PQA, PPA, PPS, PRHOA, PZONA, PMERA, PHT, PHW, PRAIN, PSNOW, PCD, PCDN, PCH, PRI, PHU, PZ0H, PQSAT, PSFTH, PSFTQ, PSFZON, PSFMER, PDIR_SW, PSCA_SW, PLW, PDIR_ALB, PSCA_ALB, PLE, PLEI, PSUBL, PLWUP, PALB, PSWE)
subroutine diag_misc_flake_n(DGMF, PT_WML, PT_BOT, PH_ML, PCT, PWATER_DEPTH)
subroutine ch_aer_dep(PSVT, PFSVT, PUSTAR, PRESA, PTA, PRHODREF)
subroutine flake_interface(KI,
subroutine abor1_sfx(YTEXT)
subroutine flake_albedo(PDIR_SW, PSCA_SW, KSW, PDIR_ALB, PSCA_ALB, PGLOBAL_SW, PALB)
subroutine massflux2momentflux(PFLUX, PRHODREF, PEMISRADIUS, PEMISSIG, KMDE, PCONVERTFACM0, PCONVERTFACM6, PCONVERTFACM3, OVARSIG, ORGFIX)
subroutine coupling_flake_n(FM, DST, SLT, HPROGRAM, HCOUPLING, PTSTEP, KYEAR, KMONTH, KDAY, PTIME, KI, KSV, KSW, PTSUN, PZENITH, PZENITH2, PAZIM, PZREF, PUREF, PU, PV, PQA, PTA, PRHOA, PSV, PCO2, HSV, PRAIN, PSNOW, PLW, PDIR_SW, PSCA_SW, PSW_BANDS, PPS, PPA, PSFTQ, PSFTH, PSFTS, PSFCO2, PSFU, PSFV, PTSRAD, PDIR_ALB, PSCA_ALB, PEMIS, PTSURF, PZ0, PZ0H, PQSURF, PPEW_A_COEF, PPEW_B_COEF, PPET_A_COEF, PPEQ_A_COEF, PPET_B_COEF, PPEQ_B_COEF, HTEST)
subroutine dslt_dep(PSVT, PFSVT, PUSTAR, PRESA, PTA, PRHODREF, PEMISSIG, PEMISRADIUS, KPMODE, PDENSITY, PMOLARWEIGHT, PCONVERTFACM0, PCONVERTFACM6, PCONVERTFACM3, OVARSIG, ORGFIX, HVERMOD)
subroutine add_forecast_to_date_surf(KYEAR, KMONTH, KDAY, PSEC)
subroutine ch_dep_water(PRESA, PUSTAR, PTA, PTRAD, PSV, HSV, PDEP)
subroutine water_flux(PZ0SEA, PTA, PEXNA, PRHOA, PSST, PEXNS, PQA, PRR, PRS, PTT, PVMOD, PZREF, PUREF, PPS, OHANDLE_SIC, PQSAT, PSFTH, PSFTQ, PUSTAR, PCD, PCDN, PCH, PRI, PRESA, PZ0HSEA)
subroutine update_rad_flake(HALB, PTS, PZENITH, PH_ICE, PH_SNOW, PICE_ALB, PSNOW_ALB, PDIR_ALB, PSCA_ALB, PEMIS, PDIR_ALB_ATMOS, PSCA_ALB_ATMOS, PEMIS_ATMOS, PTRAD)