/[lmdze]/trunk/phylmd/CV3_routines/cv3_feed.f
ViewVC logotype

Diff of /trunk/phylmd/CV3_routines/cv3_feed.f

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

revision 102 by guez, Fri Apr 25 14:58:31 2014 UTC revision 103 by guez, Fri Aug 29 13:00:05 2014 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 cv3_param_m  
       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, intent(in):: 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, hm, gz, nk, icb, icbmax, &
8           iflag, 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 hm(len, nd), 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        integer ihmin(len)
39        real work(len)
40        real pnk(len), qsnk(len), rh(len), chi(len)
41        real A, B ! convect3
42    
43        !--------------------------------------------------------------------
44    
45        plcl=0.0
46    
47        ! --- Origin level of ascending parcels for convect3:
48    
49        do i=1, len
50           nk(i)=minorig
51        end do
52    
53        ! --- Check whether parcel level temperature and specific humidity
54        ! --- are reasonable
55    
56        do i=1, len
57           if ((t(i, nk(i)) < 250. .or. q(i, nk(i)) <= 0.) .and. iflag(i) == 0) &
58                iflag(i)=7
59        end do
60    
61        ! --- Calculate lifted condensation level of air at parcel origin level
62        ! --- (Within 0.2% of formula of Bolton, MON. WEA. REV., 1980)
63    
64        A = 1669.0 ! convect3
65        B = 122.0 ! convect3
66    
67        do i=1, len
68           if (iflag(i).ne.7) then
69              tnk(i)=t(i, nk(i))
70              qnk(i)=q(i, nk(i))
71              gznk(i)=gz(i, nk(i))
72              pnk(i)=p(i, nk(i))
73              qsnk(i)=qs(i, nk(i))
74    
75              rh(i)=qnk(i)/qsnk(i)
76              chi(i)=tnk(i)/(A-B*rh(i)-tnk(i)) ! convect3
77              plcl(i)=pnk(i)*(rh(i)**chi(i))
78              if ((plcl(i) < 200. .or. plcl(i) >= 2000.) .and. iflag(i) == 0) &
79                   iflag(i) = 8
80           endif
81        end do
82    
83        ! --- Calculate first level above lcl (=icb)
84    
85        do i=1, len
86         icb(i)=nlm         icb(i)=nlm
87   270  continue      end do
88  !  
89  ! la modification consiste a comparer plcl a ph et non a p:      ! la modification consiste a comparer plcl a ph et non a p:
90  ! icb est defini par :  ph(icb)<plcl<ph(icb-1)      ! icb est defini par : ph(icb) < plcl < ph(icb - 1)
91  !@      do 290 k=minorig,nl      do k=3, nl-1 ! modification pour que icb soit supérieur ou égal à 2
92        do 290 k=3,nl-1 ! modif pour que icb soit sup/egal a 2         do i=1, len
93          do 280 i=1,len            if(ph(i, k) < plcl(i)) icb(i) = min(icb(i), k)
94            if( ph(i,k).lt.plcl(i) ) icb(i)=min(icb(i),k)         end do
95   280    continue      end do
96   290  continue  
97  !      do i=1, len
98        do 300 i=1,len         if((icb(i) == nlm).and.(iflag(i) == 0))iflag(i)=9
99  !@        if((icb(i).ge.nlm).and.(iflag(i).eq.0))iflag(i)=9      end do
100          if((icb(i).eq.nlm).and.(iflag(i).eq.0))iflag(i)=9  
101   300  continue      do i=1, len
102           icb(i) = icb(i)-1 ! icb sup ou egal a 2
103        do 400 i=1,len      end do
104          icb(i) = icb(i)-1 ! icb sup ou egal a 2  
105   400  continue      ! Compute icbmax.
106  !  
107  ! Compute icbmax.      icbmax=2
108  !      do i=1, len
109        icbmax=2         if (iflag(i) < 7) icbmax=max(icbmax, icb(i)) ! sb Jun7th02
110        do 310 i=1,len      end do
111  !!        icbmax=max(icbmax,icb(i))  
112         if (iflag(i).lt.7) icbmax=max(icbmax,icb(i)) ! sb Jun7th02    end SUBROUTINE cv3_feed
  310  continue  
113    
114        return  end module cv3_feed_m
       end  

Legend:
Removed from v.102  
changed lines
  Added in v.103

  ViewVC Help
Powered by ViewVC 1.1.21