/[lmdze]/trunk/Sources/phylmd/CV30_routines/cv30_feed.f
ViewVC logotype

Diff of /trunk/Sources/phylmd/CV30_routines/cv30_feed.f

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

trunk/libf/phylmd/CV3_routines/cv3_feed.f90 revision 52 by guez, Fri Sep 23 12:28:01 2011 UTC trunk/Sources/phylmd/CV30_routines/cv3_feed.f revision 184 by guez, Wed Mar 16 14:50:46 2016 UTC
# Line 1  Line 1 
1    module cv3_feed_m
2    
3        SUBROUTINE cv3_feed(len,nd,t,q,qs,p,ph,hm,gz &    implicit none
                         ,nk,icb,icbmax,iflag,tnk,qnk,gznk,plcl)  
             use cvparam3  
       implicit none  
   
 !================================================================  
 ! Purpose: CONVECTIVE FEED  
 !  
 ! Main differences with cv_feed:  
 !   - ph added in input  
 !     - here, nk(i)=minorig  
 !     - icb defined differently (plcl compared with ph instead of p)  
 !  
 ! Main differences with convect3:  
 !     - we do not compute dplcldt and dplcldr of CLIFT anymore  
 !     - values iflag different (but tests identical)  
 !   - A,B explicitely defined (!...)  
 !================================================================  
   
   
 ! inputs:  
         integer len, nd  
       real, intent(in):: t(len,nd)  
       real q(len,nd), qs(len,nd), p(len,nd)  
       real hm(len,nd), gz(len,nd)  
       real ph(len,nd+1)  
   
 ! outputs:  
         integer iflag(len), nk(len), icb(len), icbmax  
       real tnk(len), qnk(len), gznk(len), plcl(len)  
   
 ! local variables:  
       integer i, k  
       integer ihmin(len)  
       real work(len)  
       real pnk(len), qsnk(len), rh(len), chi(len)  
       real A, B ! convect3  
 !ym  
       plcl=0.0  
 !@ !-------------------------------------------------------------------  
 !@ ! --- Find level of minimum moist static energy  
 !@ ! --- If level of minimum moist static energy coincides with  
 !@ ! --- or is lower than minimum allowable parcel origin level,  
 !@ ! --- set iflag to 6.  
 !@ !-------------------------------------------------------------------  
 !@  
 !@       do 180 i=1,len  
 !@        work(i)=1.0e12  
 !@        ihmin(i)=nl  
 !@  180  continue  
 !@       do 200 k=2,nlp  
 !@         do 190 i=1,len  
 !@          if((hm(i,k).lt.work(i)).and.  
 !@      &      (hm(i,k).lt.hm(i,k-1)))then  
 !@            work(i)=hm(i,k)  
 !@            ihmin(i)=k  
 !@          endif  
 !@  190    continue  
 !@  200  continue  
 !@       do 210 i=1,len  
 !@         ihmin(i)=min(ihmin(i),nlm)  
 !@         if(ihmin(i).le.minorig)then  
 !@           iflag(i)=6  
 !@         endif  
 !@  210  continue  
 !@ c  
 !@ !-------------------------------------------------------------------  
 !@ ! --- Find that model level below the level of minimum moist static  
 !@ ! --- energy that has the maximum value of moist static energy  
 !@ !-------------------------------------------------------------------  
 !@  
 !@       do 220 i=1,len  
 !@        work(i)=hm(i,minorig)  
 !@        nk(i)=minorig  
 !@  220  continue  
 !@       do 240 k=minorig+1,nl  
 !@         do 230 i=1,len  
 !@          if((hm(i,k).gt.work(i)).and.(k.le.ihmin(i)))then  
 !@            work(i)=hm(i,k)  
 !@            nk(i)=k  
 !@          endif  
 !@  230     continue  
 !@  240  continue  
   
 !-------------------------------------------------------------------  
 ! --- Origin level of ascending parcels for convect3:  
 !-------------------------------------------------------------------  
   
          do 220 i=1,len  
           nk(i)=minorig  
   220    continue  
   
 !-------------------------------------------------------------------  
 ! --- Check whether parcel level temperature and specific humidity  
 ! --- are reasonable  
 !-------------------------------------------------------------------  
        do 250 i=1,len  
        if( (     ( t(i,nk(i)).lt.250.0    ) &  
              .or.( q(i,nk(i)).le.0.0      )     ) &  
          .and. &  
              ( iflag(i).eq.0) ) iflag(i)=7  
  250   continue  
 !-------------------------------------------------------------------  
 ! --- Calculate lifted condensation level of air at parcel origin level  
 ! --- (Within 0.2% of formula of Bolton, MON. WEA. REV.,1980)  
 !-------------------------------------------------------------------  
   
        A = 1669.0 ! convect3  
        B = 122.0  ! convect3  
   
        do 260 i=1,len  
   
         if (iflag(i).ne.7) then ! modif sb Jun7th 2002  
   
         tnk(i)=t(i,nk(i))  
         qnk(i)=q(i,nk(i))  
         gznk(i)=gz(i,nk(i))  
         pnk(i)=p(i,nk(i))  
         qsnk(i)=qs(i,nk(i))  
 !  
         rh(i)=qnk(i)/qsnk(i)  
 ! ori        rh(i)=min(1.0,rh(i)) ! removed for convect3  
 ! ori        chi(i)=tnk(i)/(1669.0-122.0*rh(i)-tnk(i))  
         chi(i)=tnk(i)/(A-B*rh(i)-tnk(i)) ! convect3  
         plcl(i)=pnk(i)*(rh(i)**chi(i))  
         if(((plcl(i).lt.200.0).or.(plcl(i).ge.2000.0)) &  
          .and.(iflag(i).eq.0))iflag(i)=8  
   
         endif ! iflag=7  
   
  260   continue  
   
 !-------------------------------------------------------------------  
 ! --- Calculate first level above lcl (=icb)  
 !-------------------------------------------------------------------  
   
 !@      do 270 i=1,len  
 !@       icb(i)=nlm  
 !@ 270  continue  
 !@c  
 !@      do 290 k=minorig,nl  
 !@        do 280 i=1,len  
 !@          if((k.ge.(nk(i)+1)).and.(p(i,k).lt.plcl(i)))  
 !@     &    icb(i)=min(icb(i),k)  
 !@ 280    continue  
 !@ 290  continue  
 !@c  
 !@      do 300 i=1,len  
 !@        if((icb(i).ge.nlm).and.(iflag(i).eq.0))iflag(i)=9  
 !@ 300  continue  
   
       do 270 i=1,len  
        icb(i)=nlm  
  270  continue  
 !  
 ! la modification consiste a comparer plcl a ph et non a p:  
 ! icb est defini par :  ph(icb)<plcl<ph(icb-1)  
 !@      do 290 k=minorig,nl  
       do 290 k=3,nl-1 ! modif pour que icb soit sup/egal a 2  
         do 280 i=1,len  
           if( ph(i,k).lt.plcl(i) ) icb(i)=min(icb(i),k)  
  280    continue  
  290  continue  
 !  
       do 300 i=1,len  
 !@        if((icb(i).ge.nlm).and.(iflag(i).eq.0))iflag(i)=9  
         if((icb(i).eq.nlm).and.(iflag(i).eq.0))iflag(i)=9  
  300  continue  
   
       do 400 i=1,len  
         icb(i) = icb(i)-1 ! icb sup ou egal a 2  
  400  continue  
 !  
 ! Compute icbmax.  
 !  
       icbmax=2  
       do 310 i=1,len  
 !!        icbmax=max(icbmax,icb(i))  
        if (iflag(i).lt.7) icbmax=max(icbmax,icb(i)) ! sb Jun7th02  
  310  continue  
4    
5        return  contains
6        end  
7      SUBROUTINE cv3_feed(len, nd, t, q, qs, p, ph, gz, nk, icb, icbmax, iflag, &
8           tnk, qnk, gznk, plcl)
9    
10        ! Purpose: convective feed
11    
12        ! Main differences with cv_feed:
13        ! - ph added in input
14        ! - here, nk(i) = minorig
15        ! - icb defined differently (plcl compared with ph instead of p)
16    
17        use cv3_param_m, only: minorig, nl, nlm
18    
19        integer, intent(in):: len, nd
20        real, intent(in):: t(len, nd)
21        real, intent(in):: q(len, nd), qs(len, nd), p(len, nd)
22        real, intent(in):: ph(len, nd+1)
23        real, intent(in):: gz(len, nd)
24    
25        ! outputs:
26        integer, intent(out):: nk(len), icb(len), icbmax
27        integer, intent(inout):: iflag(len)
28        real tnk(len), qnk(len), gznk(len)
29        real, intent(out):: plcl(len)
30    
31        ! Local:
32        integer i, k
33        real pnk(len), qsnk(len), rh(len), chi(len)
34        real, parameter:: A = 1669., B = 122.
35    
36        !--------------------------------------------------------------------
37    
38        plcl = 0.
39    
40        ! Origin level of ascending parcels
41    
42        do i = 1, len
43           nk(i) = minorig
44        end do
45    
46        ! Check whether parcel level temperature and specific humidity
47        ! are reasonable
48    
49        do i = 1, len
50           if ((t(i, nk(i)) < 250. .or. q(i, nk(i)) <= 0.) .and. iflag(i) == 0) &
51                iflag(i) = 7
52        end do
53    
54        ! Calculate lifted condensation level of air at parcel origin level
55        ! (within 0.2% of formula of Bolton, Mon. Wea. Rev., 1980)
56    
57        do i = 1, len
58           if (iflag(i) /= 7) then
59              tnk(i) = t(i, nk(i))
60              qnk(i) = q(i, nk(i))
61              gznk(i) = gz(i, nk(i))
62              pnk(i) = p(i, nk(i))
63              qsnk(i) = qs(i, nk(i))
64    
65              rh(i) = qnk(i)/qsnk(i)
66              chi(i) = tnk(i)/(A-B*rh(i)-tnk(i))
67              plcl(i) = pnk(i)*(rh(i)**chi(i))
68              if ((plcl(i) < 200. .or. plcl(i) >= 2000.) .and. iflag(i) == 0) &
69                   iflag(i) = 8
70           endif
71        end do
72    
73        ! Calculate first level above lcl (= icb)
74    
75        do i = 1, len
76           icb(i) = nlm
77        end do
78    
79        ! La modification consiste \`a comparer plcl \`a ph et non \`a p:
80        ! icb est d\'efini par : ph(icb) < plcl < ph(icb - 1)
81        do k = 3, nl-1 ! modification pour que icb soit supérieur ou égal à 2
82           do i = 1, len
83              if (ph(i, k) < plcl(i)) icb(i) = min(icb(i), k)
84           end do
85        end do
86    
87        do i = 1, len
88           if ((icb(i) == nlm).and.(iflag(i) == 0)) iflag(i) = 9
89        end do
90    
91        do i = 1, len
92           icb(i) = icb(i)-1 ! icb >= 2
93        end do
94    
95        ! Compute icbmax
96    
97        icbmax = 2
98    
99        do i = 1, len
100           if (iflag(i) < 7) icbmax = max(icbmax, icb(i))
101        end do
102    
103      end SUBROUTINE cv3_feed
104    
105    end module cv3_feed_m

Legend:
Removed from v.52  
changed lines
  Added in v.184

  ViewVC Help
Powered by ViewVC 1.1.21