Changeset 4835 for LMDZ6/trunk/libf/phylmdiso
- Timestamp:
- Feb 29, 2024, 7:42:12 PM (12 months ago)
- Location:
- LMDZ6/trunk/libf/phylmdiso
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/trunk/libf/phylmdiso/phys_local_var_mod.F90
r4830 r4835 363 363 REAL,ALLOCATABLE,SAVE,DIMENSION(:) :: tpot, tpote, ue, uq, uwat, ve, vq, vwat, zxffonte 364 364 !$OMP THREADPRIVATE(tpot, tpote, ue, uq, uwat, ve, vq, vwat, zxffonte) 365 REAL,ALLOCATABLE,SAVE,DIMENSION(:) :: zxustartlic, zxrhoslic 366 !$OMP THREADPRIVATE(zxustartlic, zxrhoslic )365 REAL,ALLOCATABLE,SAVE,DIMENSION(:) :: zxustartlic, zxrhoslic, zxqsaltlic 366 !$OMP THREADPRIVATE(zxustartlic, zxrhoslic, zxqsaltlic) 367 367 REAL,ALLOCATABLE,SAVE,DIMENSION(:) :: zxfqcalving 368 368 !$OMP THREADPRIVATE(zxfqcalving) … … 958 958 ALLOCATE(zxtsol(klon), snow_lsc(klon), zxfqfonte(klon), zxqsurf(klon)) 959 959 ALLOCATE(zxrunofflic(klon)) 960 ALLOCATE(zxustartlic(klon), zxrhoslic(klon), zxqsaltlic(klon)) 961 zxustartlic(:)=0. ; zxrhoslic(:)=0. ; zxqsaltlic(:)=0. 960 962 ALLOCATE(rain_lsc(klon)) 961 963 ALLOCATE(rain_num(klon)) -
LMDZ6/trunk/libf/phylmdiso/phys_output_ctrlout_mod.F90
r4819 r4835 388 388 TYPE(ctrl_out), SAVE :: o_rhosnow_lic = ctrl_out((/ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11/), & 389 389 'rhosnow_lic', 'snow density lic', 'kg/m3', (/ ('', i=1, 10) /)) 390 TYPE(ctrl_out), SAVE :: o_qsalt_lic = ctrl_out((/ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11/), & 391 'qsalt_lic', 'qb in saltation layer lic', 'kg/kg', (/ ('', i=1, 10) /)) 390 392 TYPE(ctrl_out), SAVE :: o_sens_prec_liq_oce = ctrl_out((/ 5, 5, 10, 10, 5, 10, 11, 11, 11, 11/), & 391 393 'sens_rain_oce', 'Sensible heat flux of liquid prec. over ocean', 'W/m2', (/ ('', i=1, 10) /)) -
LMDZ6/trunk/libf/phylmdiso/physiq_mod.F90
r4830 r4835 1952 1952 CALL lscp_ini(pdtphys,lunout,prt_level,ok_ice_sursat,iflag_ratqs,fl_cor_ebil,RCPD,RLSTT,RLVTT,RLMLT,RVTMP2,RTT,RD,RG,RPI) 1953 1953 CALL blowing_snow_ini(RCPD, RLSTT, RLVTT, RLMLT, & 1954 RVTMP2, RTT,RD,RG )1954 RVTMP2, RTT,RD,RG, RV, RPI) 1955 1955 ! Test de coherence sur oc_cdnc utilisé uniquement par cloud_optics_prop 1956 1956 IF (ok_newmicro) then -
LMDZ6/trunk/libf/phylmdiso/surf_landice_mod.F90
r4724 r4835 35 35 USE cpl_mod, ONLY : cpl_send_landice_fields 36 36 USE calcul_fluxs_mod 37 USE phys_local_var_mod, ONLY : zxrhoslic, zxustartlic 37 USE phys_local_var_mod, ONLY : zxrhoslic, zxustartlic, zxqsaltlic 38 38 USE phys_output_var_mod, ONLY : snow_o,zfra_o 39 39 #ifdef ISO … … 50 50 !FC 51 51 USE ioipsl_getin_p_mod, ONLY : getin_p 52 USE lmdz_blowing_snow_ini, ONLY : zeta_bs, pbst_bs, prt_bs, iflag_saltation_bs53 52 USE lmdz_blowing_snow_ini, ONLY : c_esalt_bs, zeta_bs, pbst_bs, prt_bs, rhoice_bs, rhohard_bs 53 USE lmdz_blowing_snow_ini, ONLY : rhofresh_bs, tau_eqsalt_bs, tau_dens0_bs, tau_densmin_bs 54 54 #ifdef CPP_INLANDSIS 55 55 USE surf_inlandsis_mod, ONLY : surf_inlandsis … … 57 57 58 58 USE indice_sol_mod 59 60 59 61 60 ! INCLUDE "indicesol.h" … … 185 184 REAL,DIMENSION(klon) :: precip_totsnow, evap_totsnow 186 185 REAL, DIMENSION (klon,6) :: alb6 187 REAL :: rho0, rhoice, ustart0,esalt, rhod186 REAL :: esalt 188 187 REAL :: lambdasalt,fluxsalt, csalt, nunu, aa, bb, cc 189 REAL :: tau_dens, tau_dens0, tau_densmin, rhomax, rhohard 190 REAL, DIMENSION(klon) :: ws1, rhos, ustart, qsalt, hsalt, snowini 191 REAL :: maxerosion ! in kg/s 188 REAL :: tau_dens, maxerosion, fluxbs_2 189 REAL, DIMENSION(klon) :: ws1, rhod, rhos, ustart0, ustart, qsalt, hsalt 192 190 193 191 ! End definition … … 420 418 ! 421 419 !**************************************************************************************** 422 423 CALL albsno(klon,knon,dtime,agesno(:),alb_neig(:), precip_snow(:)) 424 425 426 ! EV: following lines are obsolete since we set alb1 and alb2 to constant values 427 ! I therefore comment them 428 ! alb1(1:knon) = alb_neig(1:knon)*zfra(1:knon) + & 429 ! 0.6 * (1.0-zfra(1:knon)) 420 430 421 ! 431 422 !IM: plusieurs choix/tests sur l'albedo des "glaciers continentaux" … … 450 441 451 442 452 453 ! Simple blowing snow param 454 if (ok_bs) then 455 ustart0 = 0.211 456 rhoice = 920.0 457 rho0 = 300.0 458 rhomax=450.0 459 rhohard=450.0 460 tau_dens0=86400.0*10. ! 10 days by default, in s 461 tau_densmin=21600.0 ! 1/4 days according to in situ obs by C. Amory during blowing snow + 462 ! Marshall et al. 1999 (snow densification during rain) 463 443 !**************************************************************************************** 444 ! Simple blowing snow param 445 !**************************************************************************************** 446 ! we proceed in 2 steps: 447 ! first we erode - if possible -the accumulated snow during the time step 448 ! then we update the density of the underlying layer and see if we can also erode 449 ! this layer 450 451 452 if (ok_bs) then 453 fluxbs(:)=0. 454 do j=1,klon 455 ws1(j)=(u1(j)**2+v1(j)**2)**0.5 456 ustar(j)=(cdragm(j)*(u1(j)**2+v1(j)**2))**0.5 457 rhod(j)=p1lay(j)/RD/temp_air(j) 458 ustart0(j) =(log(2.868)-log(1.625))/0.085*sqrt(cdragm(j)) 459 enddo 460 461 ! 1st step: erosion of fresh snow accumulated during the time step 462 do j=1, knon 463 464 rhos(j)=rhofresh_bs 465 ! blowing snow flux formula used in MAR 466 ustart(j)=ustart0(j)*exp(max(rhoice_bs/rhofresh_bs-rhoice_bs/rhos(j),0.))*exp(max(0.,rhos(j)-rhohard_bs)) 467 ! we have multiplied by exp to prevent erosion when rhos>rhohard_bs 468 ! computation of qbs at the top of the saltation layer 469 ! default formulation from MAR model (Amory et al. 2021, Gallee et al. 2001) 470 esalt=1./(c_esalt_bs*max(1.e-6,ustar(j))) 471 hsalt(j)=0.08436*(max(1.e-6,ustar(j))**1.27) 472 qsalt(j)=(max(ustar(j)**2-ustart(j)**2,0.))/(RG*hsalt(j))*esalt 473 ! calculation of erosion (flux positive towards the surface here) 474 ! consistent with implicit resolution of turbulent mixing equation 475 ! Nemoto and Nishimura 2004 show that steady-state saltation is achieved within a time tau_eqsalt_bs of about 10s 476 ! we thus prevent snowerosion (snow particle transfer from the saltation layer to the first model level) 477 ! integrated over tau_eqsalt_bs to exceed the total mass of snow particle in the saltation layer 478 ! (rho*qsalt*hsalt) 479 ! during this first step we also lower bound the erosion to the amount of fresh snow accumulated during the time step 480 maxerosion=min(precip_snow(j),hsalt(j)*qsalt(j)*rhod(j)/tau_eqsalt_bs) 481 482 fluxbs(j)=rhod(j)*ws1(j)*cdragm(j)*(AcoefQBS(j)-qsalt(j)) & 483 / (1.-rhod(j)*ws1(j)*cdragm(j)*BcoefQBS(j)*dtime) 484 !fluxbs(j)= rhod*ws1(j)*cdragm(j)*(qbs1(j)-qsalt(j)) 485 fluxbs(j)=max(-maxerosion,fluxbs(j)) 486 enddo 487 488 489 ! we now compute the snow age of the overlying layer (snow surface after erosion of the fresh snow accumulated during the time step) 490 ! this is done through the routine albsno 491 CALL albsno(klon,knon,dtime,agesno(:),alb_neig(:), precip_snow(:)+fluxbs(:)) 492 493 ! 2nd step: 464 494 ! computation of threshold friction velocity 465 495 ! which depends on surface snow density … … 468 498 ! snow density increases with snow age and 469 499 ! increases even faster in case of sedimentation of blowing snow or rain 470 tau_dens=max(tau_densmin , tau_dens0*exp(-abs(precip_bs(j))/pbst_bs &471 -abs(precip_rain(j))/prt_bs) *exp(-max(tsurf(j)-272.0,0.)))472 rhos(j)=rho 0+(rhohard-rho0)*(1.-exp(-agesno(j)*86400.0/tau_dens))500 tau_dens=max(tau_densmin_bs, tau_dens0_bs*exp(-abs(precip_bs(j))/pbst_bs - & 501 abs(precip_rain(j))/prt_bs)*exp(-max(tsurf(j)-RTT,0.))) 502 rhos(j)=rhofresh_bs+(rhohard_bs-rhofresh_bs)*(1.-exp(-agesno(j)*86400.0/tau_dens)) 473 503 ! blowing snow flux formula used in MAR 474 ws1(j)=(u1(j)**2+v1(j)**2)**0.5 475 ustar(j)=(cdragm(j)*(u1(j)**2+v1(j)**2))**0.5 476 ustart(j)=ustart0*exp(max(rhoice/rho0-rhoice/rhos(j),0.))*exp(max(0.,rhos(j)-rhomax)) 477 ! we have multiplied by exp to prevent erosion when rhos>rhomax (usefull till 478 ! rhohard<450) 504 ustart(j)=ustart0(j)*exp(max(rhoice_bs/rhofresh_bs-rhoice_bs/rhos(j),0.))*exp(max(0.,rhos(j)-rhohard_bs)) 505 ! we have multiplied by exp to prevent erosion when rhos>rhohard_bs 506 ! computation of qbs at the top of the saltation layer 507 ! default formulation from MAR model (Amory et al. 2021, Gallee et al. 2001) 508 esalt=c_esalt_bs*ustar(j) 509 hsalt(j)=0.08436*(max(1.e-6,ustar(j))**1.27) 510 qsalt(j)=(max(ustar(j)**2-ustart(j)**2,0.))/(RG*hsalt(j))*esalt 511 ! calculation of erosion (flux positive towards the surface here) 512 ! consistent with implicit resolution of turbulent mixing equation 513 ! Nemoto and Nishimura 2004 show that steady-state saltation is achieved within a time tau_eqsalt_bs of about 10s 514 ! we thus prevent snowerosion (snow particle transfer from the saltation layer to the first model level) 515 ! integrated over tau_eqsalt_bs to exceed the total mass of snow particle in the saltation layer 516 ! (rho*qsalt*hsalt) 517 maxerosion=hsalt(j)*qsalt(j)*rhod(j)/tau_eqsalt_bs 518 fluxbs_2=rhod(j)*ws1(j)*cdragm(j)*(AcoefQBS(j)-qsalt(j)) & 519 / (1.-rhod(j)*ws1(j)*cdragm(j)*BcoefQBS(j)*dtime) 520 !fluxbs_2= rhod*ws1(j)*cdragm(j)*(qbs1(j)-qsalt(j)) 521 fluxbs_2=max(-maxerosion,fluxbs_2) 522 fluxbs(j)=fluxbs(j)+fluxbs_2 479 523 enddo 480 481 ! computation of qbs at the top of the saltation layer 482 ! two formulations possible 483 ! pay attention that qbs is a mixing ratio and has to be converted 484 ! to specific content 485 486 if (iflag_saltation_bs .eq. 1) then 487 ! expression from CRYOWRF (Sharma et al. 2022) 488 aa=2.6 489 bb=2.5 490 cc=2.0 491 lambdasalt=0.45 492 do j =1, knon 493 rhod=p1lay(j)/RD/temp_air(j) 494 nunu=max(ustar(j)/ustart(j),1.e-3) 495 fluxsalt=rhod/RG*(ustar(j)**3)*(1.-nunu**(-2)) * & 496 (aa+bb*nunu**(-2)+cc*nunu**(-1)) 497 csalt=fluxsalt/(2.8*ustart(j)) 498 hsalt(j)=0.08436*ustar(j)**1.27 499 qsalt(j)=1./rhod*csalt*lambdasalt*RG/(max(ustar(j)**2,1E-6)) & 500 * exp(-lambdasalt*RG*hsalt(j)/max(ustar(j)**2,1E-6)) 501 qsalt(j)=max(qsalt(j),0.) 502 enddo 503 504 505 else 506 ! default formulation from MAR model (Amory et al. 2021, Gallee et al. 2001) 507 do j=1, knon 508 esalt=1./(3.25*max(ustar(j),0.001)) 509 hsalt(j)=0.08436*ustar(j)**1.27 510 qsalt(j)=(max(ustar(j)**2-ustart(j)**2,0.))/(RG*hsalt(j))*esalt 511 !ep=qsalt*cdragm(j)*sqrt(u1(j)**2+v1(j)**2) 512 enddo 513 endif 514 515 ! calculation of erosion (flux positive towards the surface here) 516 ! consistent with implicit resolution of turbulent mixing equation 517 do j=1, knon 524 525 ! for outputs 526 do j=1, knon 518 527 i = knindex(j) 519 rhod=p1lay(j)/RD/temp_air(j)520 ! Nemoto and Nishimura 2004 show that steady-state saltation is achieved within an interval of about 10s521 ! we thus prevent snowerosion (snow particle transfer from the saltation layer to the first model level)522 ! to exceed (in intensity) integrated over 10s to exceed the total mass of snow particle in the saltation layer523 ! (rho*qsalt*hsalt)524 maxerosion=hsalt(j)*qsalt(j)*rhod/10.525 fluxbs(j)=rhod*ws1(j)*cdragm(j)*(AcoefQBS(j)-qsalt(j)) &526 / (1.-rhod*ws1(j)*cdragm(j)*BcoefQBS(j)*dtime)527 !fluxbs(j)= rhod*ws1(j)*cdragm(j)*(qbs1(j)-qsalt(j))528 fluxbs(j)=max(-maxerosion,fluxbs(j))529 530 ! for outputs531 532 528 zxustartlic(i) = ustart(j) 533 529 zxrhoslic(i) = rhos(j) 534 enddo 535 536 endif 537 538 539 540 !**************************************************************************************** 541 ! Calculate surface snow amount 530 zxqsaltlic(i)=qsalt(j) 531 enddo 532 533 534 else 535 ! those lines are useful to calculate the snow age 536 CALL albsno(klon,knon,dtime,agesno(:),alb_neig(:), precip_snow(:)) 537 538 endif ! if ok_bs 539 540 541 542 543 544 545 !**************************************************************************************** 546 ! Calculate snow amount 542 547 ! 543 548 !****************************************************************************************
Note: See TracChangeset
for help on using the changeset viewer.