- Timestamp:
- Oct 19, 2023, 4:02:57 PM (8 months ago)
- Location:
- LMDZ6/branches/LMDZ_ECRad
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/branches/LMDZ_ECRad
- Property svn:mergeinfo changed
-
LMDZ6/branches/LMDZ_ECRad/libf/phylmd/surf_landice_mod.F90
r4482 r4727 12 12 rmu0, lwdownm, albedo, pphi1, & 13 13 swnet, lwnet, tsurf, p1lay, & 14 cdragh, cdragm, precip_rain, precip_snow, temp_air, spechum, &14 cdragh, cdragm, precip_rain, precip_snow, precip_bs, temp_air, spechum, & 15 15 AcoefH, AcoefQ, BcoefH, BcoefQ, & 16 16 AcoefU, AcoefV, BcoefU, BcoefV, & 17 AcoefQBS, BcoefQBS, & 17 18 ps, u1, v1, gustiness, rugoro, pctsrf, & 18 snow, qsurf, qsol, agesno, &19 tsoil, z0m, z0h, SFRWL, alb_dir, alb_dif, evap, fluxsens, fluxlat, &19 snow, qsurf, qsol, qbs1, agesno, & 20 tsoil, z0m, z0h, SFRWL, alb_dir, alb_dif, evap, fluxsens, fluxlat, fluxbs, & 20 21 tsurf_new, dflux_s, dflux_l, & 21 22 alt, slope, cloudf, & … … 30 31 USE cpl_mod, ONLY : cpl_send_landice_fields 31 32 USE calcul_fluxs_mod 33 USE phys_local_var_mod, ONLY : zxrhoslic, zxustartlic 32 34 USE phys_output_var_mod, ONLY : snow_o,zfra_o 33 35 !FC 34 36 USE ioipsl_getin_p_mod, ONLY : getin_p 35 37 USE lmdz_blowing_snow_ini, ONLY : zeta_bs, pbst_bs, prt_bs, iflag_saltation_bs 36 38 37 39 #ifdef CPP_INLANDSIS … … 56 58 REAL, DIMENSION(klon), INTENT(IN) :: p1lay 57 59 REAL, DIMENSION(klon), INTENT(IN) :: cdragh, cdragm 58 REAL, DIMENSION(klon), INTENT(IN) :: precip_rain, precip_snow 60 REAL, DIMENSION(klon), INTENT(IN) :: precip_rain, precip_snow, precip_bs 59 61 REAL, DIMENSION(klon), INTENT(IN) :: temp_air, spechum 60 62 REAL, DIMENSION(klon), INTENT(IN) :: AcoefH, AcoefQ 61 63 REAL, DIMENSION(klon), INTENT(IN) :: BcoefH, BcoefQ 62 64 REAL, DIMENSION(klon), INTENT(IN) :: AcoefU, AcoefV, BcoefU, BcoefV 65 REAL, DIMENSION(klon), INTENT(IN) :: AcoefQBS, BcoefQBS 63 66 REAL, DIMENSION(klon), INTENT(IN) :: ps 64 REAL, DIMENSION(klon), INTENT(IN) :: u1, v1, gustiness 67 REAL, DIMENSION(klon), INTENT(IN) :: u1, v1, gustiness, qbs1 65 68 REAL, DIMENSION(klon), INTENT(IN) :: rugoro 66 69 REAL, DIMENSION(klon,nbsrf), INTENT(IN) :: pctsrf … … 94 97 !albedo SB <<< 95 98 REAL, DIMENSION(klon), INTENT(OUT) :: evap, fluxsens, fluxlat 99 REAL, DIMENSION(klon), INTENT(OUT) :: fluxbs 96 100 REAL, DIMENSION(klon), INTENT(OUT) :: tsurf_new 97 101 REAL, DIMENSION(klon), INTENT(OUT) :: dflux_s, dflux_l … … 134 138 135 139 REAL,DIMENSION(klon) :: alb1,alb2 140 REAL,DIMENSION(klon) :: precip_totsnow, evap_totsnow 136 141 REAL, DIMENSION (klon,6) :: alb6 142 REAL :: rho0, rhoice, ustart0,esalt, rhod 143 REAL :: lambdasalt,fluxsalt, csalt, nunu, aa, bb, cc 144 REAL :: tau_dens, tau_dens0, tau_densmin, rhomax, rhohard 145 REAL, DIMENSION(klon) :: ws1, rhos, ustart, qsalt, hsalt, snowini 146 REAL :: maxerosion ! in kg/s 147 137 148 ! End definition 138 149 !**************************************************************************************** … … 165 176 alb2(:) = 999999. 166 177 alb1(:) = 999999. 167 178 fluxbs(:)=0. 168 179 runoff(:) = 0. 169 180 !**************************************************************************************** … … 173 184 radsol(:) = 0.0 174 185 radsol(1:knon) = swnet(1:knon) + lwnet(1:knon) 186 187 !**************************************************************************************** 175 188 176 189 !**************************************************************************************** … … 264 277 265 278 266 267 279 ELSE 268 280 … … 314 326 flux_u1, flux_v1) 315 327 316 !****************************************************************************************317 ! Calculate snow height, age, run-off,..318 !319 !****************************************************************************************320 CALL fonte_neige(knon, is_lic, knindex, dtime, &321 tsurf, precip_rain, precip_snow, &322 snow, qsol, tsurf_new, evap)323 324 328 325 329 !**************************************************************************************** … … 327 331 ! 328 332 !**************************************************************************************** 333 329 334 CALL albsno(klon,knon,dtime,agesno(:),alb_neig(:), precip_snow(:)) 330 335 331 WHERE (snow(1 : knon) .LT. 0.0001) agesno(1 : knon) = 0. 332 zfra(1:knon) = MAX(0.0,MIN(1.0,snow(1:knon)/(snow(1:knon)+10.0))) 333 alb1(1:knon) = alb_neig(1:knon)*zfra(1:knon) + & 334 0.6 * (1.0-zfra(1:knon)) 336 337 ! EV: following lines are obsolete since we set alb1 and alb2 to constant values 338 ! I therefore comment them 339 ! alb1(1:knon) = alb_neig(1:knon)*zfra(1:knon) + & 340 ! 0.6 * (1.0-zfra(1:knon)) 335 341 ! 336 342 !IM: plusieurs choix/tests sur l'albedo des "glaciers continentaux" … … 354 360 !z0m = SQRT(z0m**2+rugoro**2) 355 361 362 363 364 ! Simple blowing snow param 365 if (ok_bs) then 366 ustart0 = 0.211 367 rhoice = 920.0 368 rho0 = 300.0 369 rhomax=450.0 370 rhohard=450.0 371 tau_dens0=86400.0*10. ! 10 days by default, in s 372 tau_densmin=21600.0 ! 1/4 days according to in situ obs by C. Amory during blowing snow + 373 ! Marshall et al. 1999 (snow densification during rain) 374 375 ! computation of threshold friction velocity 376 ! which depends on surface snow density 377 do j = 1, knon 378 ! estimation of snow density 379 ! snow density increases with snow age and 380 ! increases even faster in case of sedimentation of blowing snow or rain 381 tau_dens=max(tau_densmin, tau_dens0*exp(-abs(precip_bs(j))/pbst_bs - & 382 abs(precip_rain(j))/prt_bs)*exp(-max(tsurf(j)-272.0,0.))) 383 rhos(j)=rho0+(rhohard-rho0)*(1.-exp(-agesno(j)*86400.0/tau_dens)) 384 ! blowing snow flux formula used in MAR 385 ws1(j)=(u1(j)**2+v1(j)**2)**0.5 386 ustar(j)=(cdragm(j)*(u1(j)**2+v1(j)**2))**0.5 387 ustart(j)=ustart0*exp(max(rhoice/rho0-rhoice/rhos(j),0.))*exp(max(0.,rhos(j)-rhomax)) 388 ! we have multiplied by exp to prevent erosion when rhos>rhomax (usefull till 389 ! rhohard<450) 390 enddo 391 392 ! computation of qbs at the top of the saltation layer 393 ! two formulations possible 394 ! pay attention that qbs is a mixing ratio and has to be converted 395 ! to specific content 396 397 if (iflag_saltation_bs .eq. 1) then 398 ! expression from CRYOWRF (Sharma et al. 2022) 399 aa=2.6 400 bb=2.5 401 cc=2.0 402 lambdasalt=0.45 403 do j =1, knon 404 rhod=p1lay(j)/RD/temp_air(j) 405 nunu=max(ustar(j)/ustart(j),1.e-3) 406 fluxsalt=rhod/RG*(ustar(j)**3)*(1.-nunu**(-2)) * & 407 (aa+bb*nunu**(-2)+cc*nunu**(-1)) 408 csalt=fluxsalt/(2.8*ustart(j)) 409 hsalt(j)=0.08436*ustar(j)**1.27 410 qsalt(j)=1./rhod*csalt*lambdasalt*RG/(max(ustar(j)**2,1E-6)) & 411 * exp(-lambdasalt*RG*hsalt(j)/max(ustar(j)**2,1E-6)) 412 qsalt(j)=max(qsalt(j),0.) 413 enddo 414 415 416 else 417 ! default formulation from MAR model (Amory et al. 2021, Gallee et al. 2001) 418 do j=1, knon 419 esalt=1./(3.25*max(ustar(j),0.001)) 420 hsalt(j)=0.08436*ustar(j)**1.27 421 qsalt(j)=(max(ustar(j)**2-ustart(j)**2,0.))/(RG*hsalt(j))*esalt 422 !ep=qsalt*cdragm(j)*sqrt(u1(j)**2+v1(j)**2) 423 enddo 424 endif 425 426 ! calculation of erosion (flux positive towards the surface here) 427 ! consistent with implicit resolution of turbulent mixing equation 428 do j=1, knon 429 i = knindex(j) 430 rhod=p1lay(j)/RD/temp_air(j) 431 ! Nemoto and Nishimura 2004 show that steady-state saltation is achieved within an interval of about 10s 432 ! we thus prevent snowerosion (snow particle transfer from the saltation layer to the first model level) 433 ! to exceed (in intensity) integrated over 10s to exceed the total mass of snow particle in the saltation layer 434 ! (rho*qsalt*hsalt) 435 maxerosion=hsalt(j)*qsalt(j)*rhod/10. 436 fluxbs(j)=rhod*ws1(j)*cdragm(j)*(AcoefQBS(j)-qsalt(j)) & 437 / (1.-rhod*ws1(j)*cdragm(j)*BcoefQBS(j)*dtime) 438 !fluxbs(j)= rhod*ws1(j)*cdragm(j)*(qbs1(j)-qsalt(j)) 439 fluxbs(j)=max(-maxerosion,fluxbs(j)) 440 441 ! for outputs 442 443 zxustartlic(i) = ustart(j) 444 zxrhoslic(i) = rhos(j) 445 enddo 446 447 endif 448 449 450 451 !**************************************************************************************** 452 ! Calculate snow amount 453 ! 454 !**************************************************************************************** 455 IF (ok_bs) THEN 456 precip_totsnow(:)=precip_snow(:)+precip_bs(:) 457 evap_totsnow(:)=evap(:)-fluxbs(:) ! flux bs is positive towards the surface (snow erosion) 458 ELSE 459 precip_totsnow(:)=precip_snow(:) 460 evap_totsnow(:)=evap(:) 461 ENDIF 462 463 464 CALL fonte_neige(knon, is_lic, knindex, dtime, & 465 tsurf, precip_rain, precip_totsnow, & 466 snow, qsol, tsurf_new, evap_totsnow) 467 468 469 WHERE (snow(1 : knon) .LT. 0.0001) agesno(1 : knon) = 0. 470 zfra(1:knon) = MAX(0.0,MIN(1.0,snow(1:knon)/(snow(1:knon)+10.0))) 356 471 357 472 … … 378 493 runoff(1:knon)=run_off_lic(1:knon)/dtime 379 494 380 381 !****************************************************************************************382 495 snow_o=0. 383 496 zfra_o = 0. … … 420 533 !albedo SB <<< 421 534 422 423 424 535 425 536 END SUBROUTINE surf_landice
Note: See TracChangeset
for help on using the changeset viewer.