/[lmdze]/trunk/phylmd/CV_routines/cv_feed.f
ViewVC logotype

Diff of /trunk/phylmd/CV_routines/cv_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 cv_feed_m
2    
3        SUBROUTINE cv_feed(len,nd,t,q,qs,p,hm,gz &    implicit none
                         ,nk,icb,icbmax,iflag,tnk,qnk,gznk,plcl)  
             use cvparam  
       implicit none  
   
 !================================================================  
 ! Purpose: CONVECTIVE FEED  
 !================================================================  
   
   
 ! 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)  
   
 ! 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)  
   
 !-------------------------------------------------------------------  
 ! --- 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.  
 !-------------------------------------------------------------------  
4    
5        do 180 i=1,len  contains
6    
7      SUBROUTINE cv_feed(len, nd, t, q, qs, p, hm, gz, nk, icb, icbmax, iflag, &
8           tnk, qnk, gznk, plcl)
9    
10        use cv_param
11    
12        ! Purpose: CONVECTIVE FEED
13    
14        ! inputs:
15        integer, intent(in):: len, nd
16        real, intent(in):: t(len, nd)
17        real, intent(in):: q(len, nd), qs(len, nd), p(len, nd)
18        real hm(len, nd), gz(len, nd)
19    
20        ! outputs:
21        integer iflag(len)
22        integer, intent(out):: nk(len), icb(len), icbmax
23        real tnk(len), qnk(len), gznk(len), plcl(len)
24    
25        ! local variables:
26        integer i, k
27        integer ihmin(len)
28        real work(len)
29        real pnk(len), qsnk(len), rh(len), chi(len)
30    
31        !-------------------------------------------------------------------
32        ! --- Find level of minimum moist static energy
33        ! --- If level of minimum moist static energy coincides with
34        ! --- or is lower than minimum allowable parcel origin level,
35        ! --- set iflag to 6.
36        !-------------------------------------------------------------------
37    
38        do i=1, len
39         work(i)=1.0e12         work(i)=1.0e12
40         ihmin(i)=nl         ihmin(i)=nl
41   180  continue      end do
42        do 200 k=2,nlp      do k=2, nlp
43          do 190 i=1,len         do i=1, len
44           if((hm(i,k).lt.work(i)).and. &            if ((hm(i, k) < work(i)).and. &
45              (hm(i,k).lt.hm(i,k-1)))then                 (hm(i, k) < hm(i, k-1)))then
46             work(i)=hm(i,k)               work(i)=hm(i, k)
47             ihmin(i)=k               ihmin(i)=k
48           endif            endif
49   190    continue         end do
50   200  continue      end do
51        do 210 i=1,len      do i=1, len
52          ihmin(i)=min(ihmin(i),nlm)         ihmin(i) = min(ihmin(i), nlm)
53          if(ihmin(i).le.minorig)then         if (ihmin(i) <= minorig) iflag(i)=6
54            iflag(i)=6      end do
55          endif  
56   210  continue      !-------------------------------------------------------------------
57  !      ! --- Find that model level below the level of minimum moist static
58  !-------------------------------------------------------------------      ! --- energy that has the maximum value of moist static energy
59  ! --- Find that model level below the level of minimum moist static      !-------------------------------------------------------------------
 ! --- energy that has the maximum value of moist static energy  
 !-------------------------------------------------------------------  
60    
61        do 220 i=1,len      do i=1, len
62         work(i)=hm(i,minorig)         work(i)=hm(i, minorig)
63         nk(i)=minorig         nk(i)=minorig
64   220  continue      end do
65        do 240 k=minorig+1,nl      do k=minorig+1, nl
66          do 230 i=1,len         do i=1, len
67           if((hm(i,k).gt.work(i)).and.(k.le.ihmin(i)))then            if ((hm(i, k) > work(i)).and.(k <= ihmin(i)))then
68             work(i)=hm(i,k)               work(i)=hm(i, k)
69             nk(i)=k               nk(i)=k
70           endif            endif
71   230     continue         end do
72   240  continue      end do
73  !-------------------------------------------------------------------      !-------------------------------------------------------------------
74  ! --- Check whether parcel level temperature and specific humidity      ! --- Check whether parcel level temperature and specific humidity
75  ! --- are reasonable      ! --- are reasonable
76  !-------------------------------------------------------------------      !-------------------------------------------------------------------
77         do 250 i=1,len      do i=1, len
78         if(((t(i,nk(i)).lt.250.0).or. &         if (((t(i, nk(i)) < 250.0).or. &
79              (q(i,nk(i)).le.0.0).or. &              (q(i, nk(i)) <= 0.0).or. &
80              (p(i,ihmin(i)).lt.400.0)).and. &              (p(i, ihmin(i)) < 400.0)).and. &
81              (iflag(i).eq.0))iflag(i)=7              (iflag(i) == 0))iflag(i)=7
82   250   continue      end do
83  !-------------------------------------------------------------------      !-------------------------------------------------------------------
84  ! --- Calculate lifted condensation level of air at parcel origin level      ! --- Calculate lifted condensation level of air at parcel origin level
85  ! --- (Within 0.2% of formula of Bolton, MON. WEA. REV.,1980)      ! --- (Within 0.2% of formula of Bolton, MON. WEA. REV., 1980)
86  !-------------------------------------------------------------------      !-------------------------------------------------------------------
87         do 260 i=1,len      do i=1, len
88          tnk(i)=t(i,nk(i))         tnk(i)=t(i, nk(i))
89          qnk(i)=q(i,nk(i))         qnk(i)=q(i, nk(i))
90          gznk(i)=gz(i,nk(i))         gznk(i)=gz(i, nk(i))
91          pnk(i)=p(i,nk(i))         pnk(i)=p(i, nk(i))
92          qsnk(i)=qs(i,nk(i))         qsnk(i)=qs(i, nk(i))
93  !  
94          rh(i)=qnk(i)/qsnk(i)         rh(i)=qnk(i)/qsnk(i)
95          rh(i)=min(1.0,rh(i))         rh(i)=min(1.0, rh(i))
96          chi(i)=tnk(i)/(1669.0-122.0*rh(i)-tnk(i))         chi(i)=tnk(i)/(1669.0-122.0*rh(i)-tnk(i))
97          plcl(i)=pnk(i)*(rh(i)**chi(i))         plcl(i)=pnk(i)*(rh(i)**chi(i))
98          if(((plcl(i).lt.200.0).or.(plcl(i).ge.2000.0)) &         if (((plcl(i) < 200.0).or.(plcl(i) >= 2000.0)) &
99           .and.(iflag(i).eq.0))iflag(i)=8              .and.(iflag(i) == 0))iflag(i)=8
100   260   continue      end do
101  !-------------------------------------------------------------------      !-------------------------------------------------------------------
102  ! --- Calculate first level above lcl (=icb)      ! --- Calculate first level above lcl (=icb)
103  !-------------------------------------------------------------------      !-------------------------------------------------------------------
104        do 270 i=1,len      do i=1, len
105         icb(i)=nlm         icb(i)=nlm
106   270  continue      end do
107  !  
108        do 290 k=minorig,nl      do k=minorig, nl
109          do 280 i=1,len         do i=1, len
110            if((k.ge.(nk(i)+1)).and.(p(i,k).lt.plcl(i))) &            if ((k >= (nk(i)+1)).and.(p(i, k) < plcl(i))) &
111            icb(i)=min(icb(i),k)                 icb(i)=min(icb(i), k)
112   280    continue         end do
113   290  continue      end do
114  !  
115        do 300 i=1,len      do i=1, len
116          if((icb(i).ge.nlm).and.(iflag(i).eq.0))iflag(i)=9         if ((icb(i) >= nlm).and.(iflag(i) == 0))iflag(i)=9
117   300  continue      end do
118  !  
119  ! Compute icbmax.      ! Compute icbmax.
120  !  
121        icbmax=2      icbmax=2
122        do 310 i=1,len      do i=1, len
123          icbmax=max(icbmax,icb(i))         icbmax=max(icbmax, icb(i))
124   310  continue      end do
125    
126      end SUBROUTINE cv_feed
127    
128        return  end module cv_feed_m
       end  

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

  ViewVC Help
Powered by ViewVC 1.1.21