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

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

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

revision 190 by guez, Thu Apr 14 15:15:56 2016 UTC revision 201 by guez, Mon Jun 6 17:42:15 2016 UTC
# Line 4  module cv30_closure_m Line 4  module cv30_closure_m
4    
5  contains  contains
6    
7    SUBROUTINE cv30_closure(nloc, ncum, nd, icb, inb, pbase, p, ph, tv, buoy, &    SUBROUTINE cv30_closure(icb, inb, pbase, p, ph, tv, buoy, sig, w0, cape, m)
        sig, w0, cape, m)  
8    
9        ! CLOSURE
10      ! Vectorization: S. Bony      ! Vectorization: S. Bony
11    
12      use cv30_param_m, only: alpha, beta, dtcrit, minorig, nl      use cv30_param_m, only: alpha, beta, dtcrit, minorig, nl
13      use cv_thermo_m, only: rrd      USE dimphy, ONLY: klev, klon
14        use suphec_m, only: rd
15    
16      ! input:      ! input:
17      integer, intent(in):: ncum, nd, nloc      integer, intent(in):: icb(:), inb(:) ! (ncum)
18      integer, intent(in):: icb(nloc), inb(nloc)      real pbase(klon)
19      real pbase(nloc)      real p(:, :) ! (klon, klev)
20      real p(nloc, nd), ph(nloc, nd+1)      real, intent(in):: ph(:, :)  ! (ncum, klev + 1)
21      real tv(nloc, nd), buoy(nloc, nd)      real tv(klon, klev), buoy(klon, klev)
22    
23      ! input/output:      ! input/output:
24      real sig(nloc, nd), w0(nloc, nd)      real sig(klon, klev), w0(klon, klev)
25    
26      ! output:      ! output:
27      real cape(nloc)      real cape(klon)
28      real m(nloc, nd)      real m(klon, klev)
29    
30      ! Local:      ! Local:
31        integer ncum
32      integer i, j, k, icbmax      integer i, j, k, icbmax
33      real deltap, fac, w, amu      real deltap, fac, w, amu
34      real dtmin(nloc, nd), sigold(nloc, nd)      real dtmin(klon, klev), sigold(klon, klev)
35    
36      !-------------------------------------------------------      !-------------------------------------------------------
37    
38        ncum = size(icb)
39    
40      ! Initialization      ! Initialization
41    
42      do k=1, nl      do k=1, nl
# Line 47  contains Line 51  contains
51    
52      do k=1, nl-1      do k=1, nl-1
53         do i=1, ncum         do i=1, ncum
54            if ((inb(i) < (nl-1)).and.(k >= (inb(i)+1)))then            if ((inb(i) < (nl-1)).and.(k >= (inb(i) + 1)))then
55               sig(i, k)=beta*sig(i, k) &               sig(i, k)=beta*sig(i, k) &
56                    +2.*alpha*buoy(i, inb(i))*ABS(buoy(i, inb(i)))                    + 2.*alpha*buoy(i, inb(i))*ABS(buoy(i, inb(i)))
57               sig(i, k)=AMAX1(sig(i, k), 0.0)               sig(i, k)=AMAX1(sig(i, k), 0.0)
58               w0(i, k)=beta*w0(i, k)               w0(i, k)=beta*w0(i, k)
59            endif            endif
# Line 80  contains Line 84  contains
84    
85      do k=1, nl-1      do k=1, nl-1
86         do i=1, ncum         do i=1, ncum
87            if (sig(i, nd) < 1.5.or.sig(i, nd) > 12.0)then            if (sig(i, klev) < 1.5.or.sig(i, klev) > 12.0)then
88               sig(i, k)=0.0               sig(i, k)=0.0
89               w0(i, k)=0.0               w0(i, k)=0.0
90            endif            endif
# Line 106  contains Line 110  contains
110      do i=1, ncum      do i=1, ncum
111         do k=1, nl         do k=1, nl
112            do j=minorig, nl            do j=minorig, nl
113               if ((k >= (icb(i)+1)).and.(k <= inb(i)).and. &               if ((k >= (icb(i) + 1)).and.(k <= inb(i)).and. &
114                    (j >= icb(i)).and.(j <= (k-1)))then                    (j >= icb(i)).and.(j <= (k-1)))then
115                  dtmin(i, k)=AMIN1(dtmin(i, k), buoy(i, j))                  dtmin(i, k)=AMIN1(dtmin(i, k), buoy(i, j))
116               endif               endif
# Line 114  contains Line 118  contains
118         end do         end do
119      end do      end do
120    
121      ! the interval on which cape is computed starts at pbase :      ! The interval on which cape is computed starts at pbase:
122    
123      do k=1, nl      do k=1, nl
124         do i=1, ncum         do i=1, ncum
125              if ((k >= (icb(i) + 1)).and.(k <= inb(i))) then
           if ((k >= (icb(i)+1)).and.(k <= inb(i))) then  
   
126               deltap = MIN(pbase(i), ph(i, k-1))-MIN(pbase(i), ph(i, k))               deltap = MIN(pbase(i), ph(i, k-1))-MIN(pbase(i), ph(i, k))
127               cape(i)=cape(i)+rrd*buoy(i, k-1)*deltap/p(i, k-1)               cape(i)=cape(i) + rd*buoy(i, k-1)*deltap/p(i, k-1)
128               cape(i)=AMAX1(0.0, cape(i))               cape(i)=AMAX1(0.0, cape(i))
129               sigold(i, k)=sig(i, k)               sigold(i, k)=sig(i, k)
130    
131               sig(i, k)=beta*sig(i, k)+alpha*dtmin(i, k)*ABS(dtmin(i, k))               sig(i, k)=beta*sig(i, k) + alpha*dtmin(i, k)*ABS(dtmin(i, k))
132               sig(i, k)=amax1(sig(i, k), 0.0)               sig(i, k)=amax1(sig(i, k), 0.0)
133               sig(i, k)=amin1(sig(i, k), 0.01)               sig(i, k)=amin1(sig(i, k), 0.01)
134               fac=AMIN1(((dtcrit-dtmin(i, k))/dtcrit), 1.0)               fac=AMIN1(((dtcrit-dtmin(i, k))/dtcrit), 1.0)
135               w=(1.-beta)*fac*SQRT(cape(i))+beta*w0(i, k)               w=(1.-beta)*fac*SQRT(cape(i)) + beta*w0(i, k)
136               amu=0.5*(sig(i, k)+sigold(i, k))*w               amu=0.5*(sig(i, k) + sigold(i, k))*w
137               m(i, k)=amu*0.007*p(i, k)*(ph(i, k)-ph(i, k+1))/tv(i, k)               m(i, k)=amu*0.007*p(i, k)*(ph(i, k)-ph(i, k + 1))/tv(i, k)
138               w0(i, k)=w               w0(i, k)=w
139            endif            endif
140    
# Line 140  contains Line 142  contains
142      end do      end do
143    
144      do i=1, ncum      do i=1, ncum
145         w0(i, icb(i))=0.5*w0(i, icb(i)+1)         w0(i, icb(i))=0.5*w0(i, icb(i) + 1)
146         m(i, icb(i))=0.5*m(i, icb(i)+1) &         m(i, icb(i))=0.5*m(i, icb(i) + 1) &
147              *(ph(i, icb(i))-ph(i, icb(i)+1)) &              *(ph(i, icb(i))-ph(i, icb(i) + 1)) &
148              /(ph(i, icb(i)+1)-ph(i, icb(i)+2))              /(ph(i, icb(i) + 1)-ph(i, icb(i) + 2))
149         sig(i, icb(i))=sig(i, icb(i)+1)         sig(i, icb(i))=sig(i, icb(i) + 1)
150         sig(i, icb(i)-1)=sig(i, icb(i))         sig(i, icb(i)-1)=sig(i, icb(i))
151      end do      end do
152    

Legend:
Removed from v.190  
changed lines
  Added in v.201

  ViewVC Help
Powered by ViewVC 1.1.21