/[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/CV3_routines/cv3_feed.f revision 145 by guez, Tue Jun 16 15:23:29 2015 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  
4    
5        do 270 i=1,len  contains
6    
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        ! Main differences with convect3:
18        ! - we do not compute dplcldt and dplcldr of CLIFT anymore
19        ! - values iflag different (but tests identical)
20        ! - A, B explicitely defined (!)
21    
22        use cv3_param_m
23    
24        ! inputs:
25        integer, intent(in):: len, nd
26        real, intent(in):: t(len, nd)
27        real, intent(in):: q(len, nd), qs(len, nd), p(len, nd)
28        real gz(len, nd)
29        real, intent(in):: ph(len, nd+1)
30    
31        ! outputs:
32        integer iflag(len)
33        integer, intent(out):: nk(len), icb(len), icbmax
34        real tnk(len), qnk(len), gznk(len), plcl(len)
35    
36        ! local variables:
37        integer i, k
38        real pnk(len), qsnk(len), rh(len), chi(len)
39        real A, B ! convect3
40    
41        !--------------------------------------------------------------------
42    
43        plcl=0.0
44    
45        ! --- Origin level of ascending parcels for convect3:
46    
47        do i=1, len
48           nk(i)=minorig
49        end do
50    
51        ! --- Check whether parcel level temperature and specific humidity
52        ! --- are reasonable
53    
54        do i=1, len
55           if ((t(i, nk(i)) < 250. .or. q(i, nk(i)) <= 0.) .and. iflag(i) == 0) &
56                iflag(i)=7
57        end do
58    
59        ! --- Calculate lifted condensation level of air at parcel origin level
60        ! --- (Within 0.2% of formula of Bolton, MON. WEA. REV., 1980)
61    
62        A = 1669.0 ! convect3
63        B = 122.0 ! convect3
64    
65        do i=1, len
66           if (iflag(i).ne.7) then
67              tnk(i)=t(i, nk(i))
68              qnk(i)=q(i, nk(i))
69              gznk(i)=gz(i, nk(i))
70              pnk(i)=p(i, nk(i))
71              qsnk(i)=qs(i, nk(i))
72    
73              rh(i)=qnk(i)/qsnk(i)
74              chi(i)=tnk(i)/(A-B*rh(i)-tnk(i)) ! convect3
75              plcl(i)=pnk(i)*(rh(i)**chi(i))
76              if ((plcl(i) < 200. .or. plcl(i) >= 2000.) .and. iflag(i) == 0) &
77                   iflag(i) = 8
78           endif
79        end do
80    
81        ! --- Calculate first level above lcl (=icb)
82    
83        do i=1, len
84         icb(i)=nlm         icb(i)=nlm
85   270  continue      end do
86  !  
87  ! la modification consiste a comparer plcl a ph et non a p:      ! la modification consiste a comparer plcl a ph et non a p:
88  ! icb est defini par :  ph(icb)<plcl<ph(icb-1)      ! icb est defini par : ph(icb) < plcl < ph(icb - 1)
89  !@      do 290 k=minorig,nl      do k=3, nl-1 ! modification pour que icb soit supérieur ou égal à 2
90        do 290 k=3,nl-1 ! modif pour que icb soit sup/egal a 2         do i=1, len
91          do 280 i=1,len            if(ph(i, k) < plcl(i)) icb(i) = min(icb(i), k)
92            if( ph(i,k).lt.plcl(i) ) icb(i)=min(icb(i),k)         end do
93   280    continue      end do
94   290  continue  
95  !      do i=1, len
96        do 300 i=1,len         if((icb(i) == nlm).and.(iflag(i) == 0))iflag(i)=9
97  !@        if((icb(i).ge.nlm).and.(iflag(i).eq.0))iflag(i)=9      end do
98          if((icb(i).eq.nlm).and.(iflag(i).eq.0))iflag(i)=9  
99   300  continue      do i=1, len
100           icb(i) = icb(i)-1 ! icb sup ou egal a 2
101        do 400 i=1,len      end do
102          icb(i) = icb(i)-1 ! icb sup ou egal a 2  
103   400  continue      ! Compute icbmax.
104  !  
105  ! Compute icbmax.      icbmax=2
106  !      do i=1, len
107        icbmax=2         if (iflag(i) < 7) icbmax=max(icbmax, icb(i)) ! sb Jun7th02
108        do 310 i=1,len      end do
109  !!        icbmax=max(icbmax,icb(i))  
110         if (iflag(i).lt.7) icbmax=max(icbmax,icb(i)) ! sb Jun7th02    end SUBROUTINE cv3_feed
  310  continue  
111    
112        return  end module cv3_feed_m
       end  

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

  ViewVC Help
Powered by ViewVC 1.1.21