source: trunk/LMDZ.GENERIC/libf/phystd/thermcell_closure.F90 @ 2987

Last change on this file since 2987 was 2177, checked in by aboissinot, 5 years ago

Cleanup thermal plums model subroutines
In thermcell_flux, "bidouilles" are modified:

  • now the plumes stop when the updraft fraction is greater than alpha_max
  • e > e_max is no longer permitted
  • b <= incoming mass flux is checked last
File size: 3.5 KB
RevLine 
[2060]1!
2!
3!
[2127]4SUBROUTINE thermcell_closure(ngrid,nlay,ptimestep,rho,zlev,                   &
[2143]5                             lmax,alim_star,zmin,zmax,wmax,f)
[2060]6     
[2143]7     
[2127]8!===============================================================================
9!  Purpose: fermeture, determination de f
[2060]10!
11! Modification 7 septembre 2009
12! 1. On enleve alim_star_tot des arguments pour le recalculer et etre ainis
13! coherent avec l'integrale au numerateur.
14! 2. On ne garde qu'une version des couples wmax,zmax et wmax_sec,zmax_sec
15! l'idee etant que le choix se fasse a l'appel de thermcell_closure
[2143]16! 3. Vectorisation en mettant les boucles en l a l'exterieur avec des if
[2127]17!===============================================================================
[2060]18     
19      USE thermcell_mod
20     
21      IMPLICIT NONE
22     
23     
[2127]24!===============================================================================
[2060]25! Declaration
[2127]26!===============================================================================
[2060]27     
[2127]28!     Inputs:
29!     -------
[2060]30     
[2177]31      INTEGER, INTENT(in) :: ngrid
32      INTEGER, INTENT(in) :: nlay
33      INTEGER, INTENT(in) :: lmax(ngrid)
[2060]34     
[2177]35      REAL, INTENT(in) :: ptimestep
36      REAL, INTENT(in) :: rho(ngrid,nlay)
37      REAL, INTENT(in) :: zlev(ngrid,nlay)
38      REAL, INTENT(in) :: alim_star(ngrid,nlay)
39      REAL, INTENT(in) :: zmin(ngrid)
40      REAL, INTENT(in) :: zmax(ngrid)
41      REAL, INTENT(in) :: wmax(ngrid)
[2060]42     
[2127]43!     Outputs:
44!     --------
[2060]45     
[2177]46      REAL, INTENT(out) :: f(ngrid)
[2060]47     
[2127]48!     Local:
49!     ------
[2060]50     
[2127]51      INTEGER ig, l
[2060]52      INTEGER llmax
53     
54      REAL alim_star_tot(ngrid)
55      REAL alim_star2(ngrid)
[2143]56      REAL plume_height(ngrid)
[2060]57     
[2127]58!===============================================================================
[2060]59! Initialization
[2127]60!===============================================================================
[2060]61     
62      alim_star2(:) = 0.
63      alim_star_tot(:) = 0.
64     
65      f(:) = 0.
66     
67      llmax = 1
68     
[2143]69      DO ig=1,ngrid
70         plume_height(ig) = zmax(ig) - zmin(ig)
71      ENDDO
72     
[2127]73!===============================================================================
[2060]74! Closure
[2127]75!===============================================================================
[2060]76     
[2127]77!-------------------------------------------------------------------------------
78! Indice vertical max atteint par les thermiques sur le domaine
79!-------------------------------------------------------------------------------
[2060]80     
81      DO ig=1,ngrid
[2143]82         IF (lmax(ig) > llmax) THEN
[2127]83            llmax = lmax(ig)
[2060]84         ENDIF
85      ENDDO
86     
[2127]87!-------------------------------------------------------------------------------
[2060]88! Calcul des integrales sur la verticale de alim_star et de alim_star^2/(rho dz)
[2127]89!-------------------------------------------------------------------------------
[2060]90     
[2127]91      DO l=1,llmax-1
[2060]92         DO ig=1,ngrid
[2127]93               alim_star2(ig) = alim_star2(ig) + alim_star(ig,l)**2           &
[2177]94               &              / (rho(ig,l) * (zlev(ig,l+1) - zlev(ig,l)))        ! => integration is ok because alim_star = a* dz
[2127]95               alim_star_tot(ig) = alim_star_tot(ig) + alim_star(ig,l)
[2060]96         ENDDO
97      ENDDO
98     
99      DO ig=1,ngrid
[2143]100         IF ((alim_star2(ig) > 0.).and.(plume_height(ig) > 0.)) THEN
101            f(ig) = wmax(ig) * alim_star_tot(ig)                              &  ! => normalization is ok
102            &     / (plume_height(ig) * r_aspect_thermals * alim_star2(ig))
[2127]103         ELSE
104            f(ig) = 0.
[2060]105         ENDIF
106      ENDDO
107     
[2127]108     
[2060]109RETURN
110END
Note: See TracBrowser for help on using the repository browser.