Ignore:
Timestamp:
Jun 20, 2019, 4:11:54 PM (5 years ago)
Author:
aboissinot
Message:

Update the thermal plume model:

  • check formulae consistency between thermcell_plume and thercell_closure
  • compute correctly thermal plume height
  • fix alimentation computation in the first unstable layer
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/LMDZ.GENERIC/libf/phystd/thermcell_closure.F90

    r2127 r2143  
    33!
    44SUBROUTINE thermcell_closure(ngrid,nlay,ptimestep,rho,zlev,                   &
    5                              lmax,alim_star,zmax,wmax,f)
     5                             lmax,alim_star,zmin,zmax,wmax,f)
     6     
    67     
    78!===============================================================================
     
    1314! 2. On ne garde qu'une version des couples wmax,zmax et wmax_sec,zmax_sec
    1415! l'idee etant que le choix se fasse a l'appel de thermcell_closure
    15 ! 3. Vectorisation en mettant les boucles en l l'exterieur avec des if
     16! 3. Vectorisation en mettant les boucles en l a l'exterieur avec des if
    1617!===============================================================================
    1718     
     
    3536      REAL zlev(ngrid,nlay)
    3637      REAL alim_star(ngrid,nlay)
     38      REAL zmin(ngrid)
    3739      REAL zmax(ngrid)
    3840      REAL wmax(ngrid)
     
    5153      REAL alim_star_tot(ngrid)
    5254      REAL alim_star2(ngrid)
    53       REAL zdenom(ngrid)
     55      REAL plume_height(ngrid)
    5456     
    5557!===============================================================================
     
    6466      llmax = 1
    6567     
     68      DO ig=1,ngrid
     69         plume_height(ig) = zmax(ig) - zmin(ig)
     70      ENDDO
     71     
    6672!===============================================================================
    6773! Closure
     
    7379     
    7480      DO ig=1,ngrid
    75          IF (lmax(ig).GT.llmax) THEN
     81         IF (lmax(ig) > llmax) THEN
    7682            llmax = lmax(ig)
    7783         ENDIF
     
    8692            IF (l < lmax(ig)) THEN
    8793               alim_star2(ig) = alim_star2(ig) + alim_star(ig,l)**2           &
    88                &              / (rho(ig,l) * (zlev(ig,l+1) - zlev(ig,l)))
     94               &              / (rho(ig,l) * (zlev(ig,l+1) - zlev(ig,l)))        ! => intergration is ok because alim_star = a* dz
    8995               alim_star_tot(ig) = alim_star_tot(ig) + alim_star(ig,l)
    9096            ENDIF
     
    9399     
    94100      DO ig=1,ngrid
    95          IF (alim_star2(ig).GT.0.) THEN
    96             f(ig) = wmax(ig) * alim_star_tot(ig)                              &
    97             &     / (max(1.,zmax(ig)) * r_aspect_thermals * alim_star2(ig))
     101         IF ((alim_star2(ig) > 0.).and.(plume_height(ig) > 0.)) THEN
     102            f(ig) = wmax(ig) * alim_star_tot(ig)                              &  ! => normalization is ok
     103            &     / (plume_height(ig) * r_aspect_thermals * alim_star2(ig))
    98104         ELSE
    99105            f(ig) = 0.
     
    101107      ENDDO
    102108     
     109      print *, 'A*2 ', alim_star2(1)
     110      print *, 'A*  ', alim_star_tot(1)
     111      print *, 'H   ', plume_height(1)
     112      print *, 'wmax', wmax(1)
    103113     
    104114RETURN
Note: See TracChangeset for help on using the changeset viewer.