source: lmdz_wrf/trunk/WRFV3/lmdz/thermcell_height.F90 @ 2294

Last change on this file since 2294 was 142, checked in by lfita, 10 years ago

Incorporing all the work done in LMDZ_WRFmeas about:

1.- Chekcing for NaNs?
2.- Instabilities in thermcell (negative SQRT & robustness IF)

File size: 5.0 KB
Line 
1      SUBROUTINE thermcell_height(ngrid,nlay,lalim,lmin,linter,lmix,  &
2     &           zw2,zlev,lmax,zmax,zmax0,zmix,wmax,lev_out)                           
3
4!-----------------------------------------------------------------------------
5!thermcell_height: calcul des caracteristiques du thermique: zmax,wmax,zmix
6!-----------------------------------------------------------------------------
7      IMPLICIT NONE
8#include "iniprint.h"
9#include "thermcell.h"
10
11      INTEGER ig,l
12      INTEGER ngrid,nlay
13      INTEGER lalim(ngrid),lmin(ngrid)
14      INTEGER lmix(ngrid)
15      REAL linter(ngrid)
16      integer lev_out                           ! niveau pour les print
17
18      REAL zw2(ngrid,nlay+1)
19      REAL zlev(ngrid,nlay+1)
20
21      REAL wmax(ngrid)
22      INTEGER lmax(ngrid)
23      REAL zmax(ngrid)
24      REAL zmax0(ngrid)
25      REAL zmix(ngrid)
26      REAL num(ngrid)
27      REAL denom(ngrid)
28
29      REAL zlevinter(ngrid)
30
31!calcul de la hauteur max du thermique
32      do ig=1,ngrid
33         lmax(ig)=lalim(ig)
34      enddo
35      do ig=1,ngrid
36         do l=nlay,lalim(ig)+1,-1
37            if (zw2(ig,l).le.1.e-10) then
38               lmax(ig)=l-1
39            endif
40         enddo
41      enddo
42
43! On traite le cas particulier qu'il faudrait éviter ou le thermique
44! atteind le haut du modele ...
45      do ig=1,ngrid
46      if ( zw2(ig,nlay) > 1.e-10 ) then
47          print*,'WARNING !!!!! W2 thermiques non nul derniere couche '
48          lmax(ig)=nlay
49      endif
50      enddo
51
52! pas de thermique si couche 1 stable
53      do ig=1,ngrid
54         if (lmin(ig).gt.1) then
55             lmax(ig)=1
56             lmin(ig)=1
57             lalim(ig)=1
58         endif
59      enddo
60!   
61! Determination de zw2 max
62      do ig=1,ngrid
63         wmax(ig)=0.
64      enddo
65
66! L. Fita, LMD July 2014. Fixing the If when zw2 == 0
67      do l=1,nlay
68         do ig=1,ngrid
69            if (l.le.lmax(ig)) then
70! Previous version
71!                if (zw2(ig,l).lt.0.)then
72!                  print*,'pb2 zw2<0'
73!                endif
74!                zw2(ig,l)=sqrt(zw2(ig,l))
75!                wmax(ig)=max(wmax(ig),zw2(ig,l))
76!            else
77!                 zw2(ig,l)=0.
78!            endif
79! New version
80              if (zw2(ig,l).lt.0.)then
81                print*,'pb2 zw2<0'
82                zw2(ig,l)=0.
83                wmax(ig)=max(wmax(ig),zw2(ig,l))
84              else
85                zw2(ig,l)=sqrt(zw2(ig,l))
86                wmax(ig)=max(wmax(ig),zw2(ig,l))
87              endif 
88            else
89                 zw2(ig,l)=0.
90            endif
91
92          enddo
93      enddo
94
95!   Longueur caracteristique correspondant a la hauteur des thermiques.
96      do  ig=1,ngrid
97         zmax(ig)=0.
98         zlevinter(ig)=zlev(ig,1)
99      enddo
100
101      if (iflag_thermals_ed.ge.1) then
102
103         num(:)=0.
104         denom(:)=0.
105         do ig=1,ngrid
106          do l=1,nlay
107             num(ig)=num(ig)+zw2(ig,l)*zlev(ig,l)*(zlev(ig,l+1)-zlev(ig,l))
108             denom(ig)=denom(ig)+zw2(ig,l)*(zlev(ig,l+1)-zlev(ig,l))
109          enddo
110       enddo
111       do ig=1,ngrid
112       if (denom(ig).gt.1.e-10) then
113          zmax(ig)=2.*num(ig)/denom(ig)
114          zmax0(ig)=zmax(ig)
115       endif
116       enddo
117
118       else
119
120      do  ig=1,ngrid
121! calcul de zlevinter
122          zlevinter(ig)=(zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig)))*  &
123     &    linter(ig)+zlev(ig,lmax(ig))-lmax(ig)*(zlev(ig,lmax(ig)+1)  &
124     &    -zlev(ig,lmax(ig)))
125!pour le cas ou on prend tjs lmin=1
126!       zmax(ig)=max(zmax(ig),zlevinter(ig)-zlev(ig,lmin(ig)))
127       zmax(ig)=max(zmax(ig),zlevinter(ig)-zlev(ig,1))
128       zmax0(ig)=zmax(ig)
129      enddo
130
131
132      endif
133!endif iflag_thermals_ed
134!
135! def de  zmix continu (profil parabolique des vitesses)
136      do ig=1,ngrid
137           if (lmix(ig).gt.1) then
138! test
139              if (((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig)))  &
140     &        *((zlev(ig,lmix(ig)))-(zlev(ig,lmix(ig)+1)))  &
141     &        -(zw2(ig,lmix(ig))-zw2(ig,lmix(ig)+1))  &
142     &        *((zlev(ig,lmix(ig)-1))-(zlev(ig,lmix(ig))))).gt.1e-10)  &
143     &        then
144!             
145            zmix(ig)=((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig)))  &
146     &        *((zlev(ig,lmix(ig)))**2-(zlev(ig,lmix(ig)+1))**2)  &
147     &        -(zw2(ig,lmix(ig))-zw2(ig,lmix(ig)+1))  &
148     &        *((zlev(ig,lmix(ig)-1))**2-(zlev(ig,lmix(ig)))**2))  &
149     &        /(2.*((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig)))  &
150     &        *((zlev(ig,lmix(ig)))-(zlev(ig,lmix(ig)+1)))  &
151     &        -(zw2(ig,lmix(ig))-zw2(ig,lmix(ig)+1))  &
152     &        *((zlev(ig,lmix(ig)-1))-(zlev(ig,lmix(ig))))))
153              else
154              zmix(ig)=zlev(ig,lmix(ig))
155              print*,'pb zmix'
156              endif
157          else
158              zmix(ig)=0.
159          endif
160!test
161         if ((zmax(ig)-zmix(ig)).le.0.) then
162            zmix(ig)=0.9*zmax(ig)
163!            print*,'pb zmix>zmax'
164         endif
165      enddo
166!
167! calcul du nouveau lmix correspondant
168      do ig=1,ngrid
169         do l=1,nlay
170            if (zmix(ig).ge.zlev(ig,l).and.  &
171     &          zmix(ig).lt.zlev(ig,l+1)) then
172              lmix(ig)=l
173             endif
174          enddo
175      enddo
176!
177      return
178      end
Note: See TracBrowser for help on using the repository browser.