Ignore:
Timestamp:
Mar 24, 2015, 2:28:51 PM (9 years ago)
Author:
fhourdin
Message:

Revisite de la formule des flux de surface
(en priorité sur l'océan) en tenant compte des bourrasques de
vent et de la différence entre les hauteurs de rugosités pour
la quantité de mouvement, l'enthalpie et éventuellement l'humidité.

Etape 2 :

  • Séparation des z0 pour la quantité de mouvement et l'enthalpie.

rugs (ou frugs, rugos, yrugos ...) disparait au profit de z0m, z0h.
Les variables qui étaient à la fois dans pbl_surface_init et

  • dans l'interface de pbl_surface sont suprimées de pbl_surface_init.

On travaille directement pour ces variables (evap, z0, qsol, agesno)
avec les versions de phys_state_var_mod (qui étaient
précédemment dans phys_local_var_mod

  • Nouveaux paramètres de contrôle :
    • iflag_z0_oce (par défaut 0, et seule option active jusque là)
    • z0m_seaice_omp, z0h_seaice_omp, comme leur nom l'indique (utilisées dans surf_landice
    • z0min appliqué sur z0m et z0h dans pbl_surface
  • Introduction des fonction phyeta0_get et phyetat0_srf pour lire

les conditions de initiales dans startphy.
Du coup une seule ligne suffit pour lire et contrôler d'éventuels
problèmes.

  • Pour la variable fxrugs, elle est remplacée par z0m(:,nbsrf+1)

Ce choix déjà utilisé pour d'autres variables pourrait être
systématiser pour alléger l'interface de pbl_surface_mod.

  • Dans les sorties, les variables rugs* ont été remplacées par

des z0m* et z0h*

  • Nettoyage des anciens alb1/alb2 dans les lectures/écritures

des états de redémarrage (et dans pbl_surface_mod.F90).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • LMDZ5/trunk/libf/phylmd/cdrag.F90

    r2232 r2243  
    44 SUBROUTINE cdrag( knon,  nsrf,   &
    55     speed, t1,    q1,    zgeop1, &
    6      psol,  tsurf, qsurf, rugos,  &
     6     psol,  tsurf, qsurf, z0m, z0h,  &
    77     pcfm,  pcfh,  zri,   pref )
    88
     
    4545! tsurf---input-R- temperature de l'air a la surface
    4646! qsurf---input-R- humidite de l'air a la surface
    47 ! rugos---input-R- rugosite
     47! z0m, z0h---input-R- rugosite
    4848!! u1, v1 are removed, speed is used. Fuxing WANG, 04/03/2015,
    4949!! u1------input-R- vent zonal au 1er niveau du modele
     
    7171  REAL, DIMENSION(klon), INTENT(IN)        :: tsurf ! Surface temperature (K)
    7272  REAL, DIMENSION(klon), INTENT(IN)        :: qsurf ! Surface humidity (Kg/Kg)
    73   REAL, DIMENSION(klon), INTENT(IN)        :: rugos ! Rugosity at surface (m)
     73  REAL, DIMENSION(klon), INTENT(IN)        :: z0m, z0h ! Rugosity at surface (m)
    7474!  paprs, pplay u1, v1: to be deleted
    7575!  they were in the old clcdrag. Fuxing WANG, 04/03/2015
     
    113113  REAL, DIMENSION(klon) :: zcfh1, zcfh2 ! Drag coefficient for heat flux
    114114  LOGICAL, PARAMETER    :: zxli=.FALSE. ! calcul des cdrags selon Laurent Li
    115   REAL, DIMENSION(klon) :: zcdn         ! Drag coefficient in neutral conditions
     115  REAL, DIMENSION(klon) :: zcdn_m, zcdn_h         ! Drag coefficient in neutral conditions
    116116!
    117117! Fonctions thermodynamiques et fonctions d'instabilite
     
    174174          *(1.+RETV*max(q1(i),0.0)) ! negative q1 set to zero
    175175     zri(i) = zgeop1(i)*(ztvd-ztsolv)/(zdu2*ztvd)
    176      zcdn(i) = (CKAP/LOG(1.+zgeop1(i)/(RG*rugos(i))))**2
     176
     177
     178! Coefficients CD neutres pour m et h
     179     zcdn_m(i) = (CKAP/LOG(1.+zgeop1(i)/(RG*z0m(i))))**2
     180     zcdn_h(i) = (CKAP/LOG(1.+zgeop1(i)/(RG*z0h(i))))**2
    177181
    178182     IF (zri(i) .GT. 0.) THEN      ! situation stable
     
    181185           zscf = SQRT(1.+CD*ABS(zri(i)))
    182186           friv = AMAX1(1. / (1.+2.*CB*zri(i)/ZSCF), f_ri_cd_min)
    183            zcfm1(i) = zcdn(i) * friv
     187           zcfm1(i) = zcdn_m(i) * friv
    184188           frih = AMAX1(1./ (1.+3.*CB*zri(i)*ZSCF), f_ri_cd_min )
    185189!!$ PB     zcfh1(i) = zcdn(i) * frih
    186190!!$ PB     zcfh1(i) = f_cdrag_stable * zcdn(i) * frih
    187            zcfh1(i) = f_cdrag_ter * zcdn(i) * frih
    188            IF(nsrf.EQ.is_oce) zcfh1(i) = f_cdrag_oce * zcdn(i) * frih
     191           zcfh1(i) = f_cdrag_ter * zcdn_h(i) * frih
     192           IF(nsrf.EQ.is_oce) zcfh1(i) = f_cdrag_oce * zcdn_h(i) * frih
    189193!!$ PB
    190194           pcfm(i) = zcfm1(i)
    191195           pcfh(i) = zcfh1(i)
    192196        ELSE
    193            pcfm(i) = zcdn(i)* fsta(zri(i))
    194            pcfh(i) = zcdn(i)* fsta(zri(i))
     197           pcfm(i) = zcdn_m(i)* fsta(zri(i))
     198           pcfh(i) = zcdn_h(i)* fsta(zri(i))
    195199        ENDIF
    196200     ELSE                          ! situation instable
    197201        IF (.NOT.zxli) THEN
    198            zucf = 1./(1.+3.0*CB*CC*zcdn(i)*SQRT(ABS(zri(i)) &
    199                 *(1.0+zgeop1(i)/(RG*rugos(i)))))
    200            zcfm2(i) = zcdn(i)*amax1((1.-2.0*CB*zri(i)*zucf),f_ri_cd_min)
    201 !!$ PB     zcfh2(i) = zcdn(i)*amax1((1.-3.0*cb*zri(i)*zucf),f_ri_cd_min)
    202            zcfh2(i) = f_cdrag_ter*zcdn(i)*amax1((1.-3.0*CB*zri(i)*zucf),f_ri_cd_min)
     202           zucf = 1./(1.+3.0*CB*CC*zcdn_m(i)*SQRT(ABS(zri(i)) &
     203                *(1.0+zgeop1(i)/(RG*z0m(i)))))
     204           zcfm2(i) = zcdn_m(i)*amax1((1.-2.0*CB*zri(i)*zucf),f_ri_cd_min)
     205!!$ PB     zcfh2(i) = zcdn_h(i)*amax1((1.-3.0*cb*zri(i)*zucf),f_ri_cd_min)
     206           zcfh2(i) = f_cdrag_ter*zcdn_h(i)*amax1((1.-3.0*CB*zri(i)*zucf),f_ri_cd_min)
    203207           pcfm(i) = zcfm2(i)
    204208           pcfh(i) = zcfh2(i)
    205209        ELSE
    206            pcfm(i) = zcdn(i)* fins(zri(i))
    207            pcfh(i) = zcdn(i)* fins(zri(i))
     210           pcfm(i) = zcdn_m(i)* fins(zri(i))
     211           pcfh(i) = zcdn_h(i)* fins(zri(i))
    208212        ENDIF
    209213! cdrah sur l'ocean cf. Miller et al. (1992)
    210         zcr = (0.0016/(zcdn(i)*SQRT(zdu2)))*ABS(ztvd-ztsolv)**(1./3.)
    211         IF(nsrf.EQ.is_oce) pcfh(i) =f_cdrag_oce* zcdn(i)*(1.0+zcr**1.25)**(1./1.25)
     214        zcr = (0.0016/(zcdn_m(i)*SQRT(zdu2)))*ABS(ztvd-ztsolv)**(1./3.)
     215        IF(nsrf.EQ.is_oce) pcfh(i) =f_cdrag_oce* zcdn_h(i)*(1.0+zcr**1.25)**(1./1.25)
    212216     ENDIF
    213217  END DO
Note: See TracChangeset for help on using the changeset viewer.