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

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

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

revision 82 by guez, Wed Mar 5 14:57:53 2014 UTC revision 97 by guez, Fri Apr 25 14:58:31 2014 UTC
# Line 1  Line 1 
1    module cv3_prelim_m
2    
3        SUBROUTINE cv3_prelim(len,nd,ndp1,t,q,p,ph &    implicit none
                           ,lv,cpn,tv,gz,h,hm,th)  
             use cv3_param_m  
             use cvthermo  
       implicit none  
   
 !=====================================================================  
 ! --- CALCULATE ARRAYS OF GEOPOTENTIAL, HEAT CAPACITY & STATIC ENERGY  
 ! "ori": from convect4.3 (vectorized)  
 ! "convect3": to be exactly consistent with convect3  
 !=====================================================================  
   
 ! inputs:  
       integer len, nd, ndp1  
       real, intent(in):: t(len,nd)  
       real, intent(in):: q(len,nd)  
       real p(len,nd), ph(len,ndp1)  
   
 ! outputs:  
       real lv(len,nd), cpn(len,nd), tv(len,nd)  
       real gz(len,nd), h(len,nd), hm(len,nd)  
       real th(len,nd)  
   
 ! local variables:  
       integer k, i  
       real rdcp  
       real tvx,tvy ! convect3  
       real cpx(len,nd)  
   
   
   
 ! ori      do 110 k=1,nlp  
       do 110 k=1,nl ! convect3  
         do 100 i=1,len  
 !debug          lv(i,k)= lv0-clmcpv*(t(i,k)-t0)  
           lv(i,k)= lv0-clmcpv*(t(i,k)-273.15)  
           cpn(i,k)=cpd*(1.0-q(i,k))+cpv*q(i,k)  
           cpx(i,k)=cpd*(1.0-q(i,k))+cl*q(i,k)  
 ! ori          tv(i,k)=t(i,k)*(1.0+q(i,k)*epsim1)  
           tv(i,k)=t(i,k)*(1.0+q(i,k)/eps-q(i,k))  
           rdcp=(rrd*(1.-q(i,k))+q(i,k)*rrv)/cpn(i,k)  
           th(i,k)=t(i,k)*(1000.0/p(i,k))**rdcp  
  100    continue  
  110  continue  
 !  
 ! gz = phi at the full levels (same as p).  
 !  
       do 120 i=1,len  
         gz(i,1)=0.0  
  120  continue  
 ! ori      do 140 k=2,nlp  
       do 140 k=2,nl ! convect3  
         do 130 i=1,len  
         tvx=t(i,k)*(1.+q(i,k)/eps-q(i,k))       !convect3  
         tvy=t(i,k-1)*(1.+q(i,k-1)/eps-q(i,k-1)) !convect3  
         gz(i,k)=gz(i,k-1)+0.5*rrd*(tvx+tvy)     &  
                 *(p(i,k-1)-p(i,k))/ph(i,k)      !convect3  
   
 ! ori         gz(i,k)=gz(i,k-1)+hrd*(tv(i,k-1)+tv(i,k))  
 ! ori    &         *(p(i,k-1)-p(i,k))/ph(i,k)  
  130    continue  
  140  continue  
 !  
 ! h  = phi + cpT (dry static energy).  
 ! hm = phi + cp(T-Tbase)+Lq  
 !  
 ! ori      do 170 k=1,nlp  
       do 170 k=1,nl ! convect3  
         do 160 i=1,len  
           h(i,k)=gz(i,k)+cpn(i,k)*t(i,k)  
           hm(i,k)=gz(i,k)+cpx(i,k)*(t(i,k)-t(i,1))+lv(i,k)*q(i,k)  
  160    continue  
  170  continue  
4    
5        return  contains
6        end  
7      SUBROUTINE cv3_prelim(len, nd, ndp1, t, q, p, ph, lv, cpn, tv, gz, h, hm, th)
8    
9        USE cv3_param_m, ONLY: nl
10        USE cvthermo, ONLY: cl, clmcpv, cpd, cpv, eps, lv0, rrd, rrv
11    
12        ! Calculate arrays of geopotential, heat capacity and static energy
13    
14        integer, intent(in):: len, nd, ndp1
15        real, intent(in):: t(len, nd)
16        real, intent(in):: q(len, nd)
17        real, intent(in):: p(len, nd), ph(len, ndp1)
18    
19        ! outputs:
20        real lv(len, nd), cpn(len, nd), tv(len, nd)
21        real gz(len, nd), h(len, nd), hm(len, nd)
22        real th(len, nd)
23    
24        ! Local:
25        integer k, i
26        real rdcp
27        real tvx, tvy
28        real cpx(len, nd)
29    
30        !--------------------------------------------------------------
31    
32        do k=1, nl
33           do i=1, len
34              lv(i, k)= lv0-clmcpv*(t(i, k)-273.15)
35              cpn(i, k)=cpd*(1.0-q(i, k)) + cpv*q(i, k)
36              cpx(i, k)=cpd*(1.0-q(i, k)) + cl*q(i, k)
37              tv(i, k)=t(i, k)*(1.0 + q(i, k)/eps-q(i, k))
38              rdcp=(rrd*(1.-q(i, k)) + q(i, k)*rrv)/cpn(i, k)
39              th(i, k)=t(i, k)*(1000.0/p(i, k))**rdcp
40           end do
41        end do
42    
43        ! gz = phi at the full levels (same as p).
44    
45        do i=1, len
46           gz(i, 1)=0.0
47        end do
48    
49        do k=2, nl
50           do i=1, len
51              tvx=t(i, k)*(1. + q(i, k)/eps-q(i, k))
52              tvy=t(i, k-1)*(1. + q(i, k-1)/eps-q(i, k-1))
53              gz(i, k)=gz(i, k-1) + 0.5*rrd*(tvx + tvy) &
54                   *(p(i, k-1)-p(i, k))/ph(i, k)
55           end do
56        end do
57    
58        ! h = phi + cpT (dry static energy).
59        ! hm = phi + cp(T-Tbase) + Lq
60    
61        do k=1, nl
62           do i=1, len
63              h(i, k)=gz(i, k) + cpn(i, k)*t(i, k)
64              hm(i, k)=gz(i, k) + cpx(i, k)*(t(i, k)-t(i, 1)) + lv(i, k)*q(i, k)
65           end do
66        end do
67    
68      end SUBROUTINE cv3_prelim
69    
70    end module cv3_prelim_m

Legend:
Removed from v.82  
changed lines
  Added in v.97

  ViewVC Help
Powered by ViewVC 1.1.21