/[lmdze]/trunk/phylmd/cltrac.f
ViewVC logotype

Diff of /trunk/phylmd/cltrac.f

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

revision 265 by guez, Tue Mar 20 09:35:59 2018 UTC revision 270 by guez, Wed Jul 11 12:28:35 2018 UTC
# Line 6  contains Line 6  contains
6    
7    SUBROUTINE cltrac(dtime, coef, t, tr, flux, paprs, pplay, delp, d_tr)    SUBROUTINE cltrac(dtime, coef, t, tr, flux, paprs, pplay, delp, d_tr)
8    
9      ! From LMDZ4/libf/phylmd/cltrac.F,v 1.1.1.1 2004/05/19 12:53:07      ! From LMDZ4/libf/phylmd/cltrac.F, version 1.1.1.1 2004/05/19 12:53:07
10    
11        USE dimphy, only: klon, klev
12        USE suphec_m, only: rd, rg
13    
14        ! Auteur : O. Boucher (LOA/LMD), date: 1996/11/27
15        ! inspir\'e de clvent
16    
17        ! Objet: diffusion verticale de traceurs avec flux fix\'e \`a la
18        ! surface ou flux du type c-drag
19    
20        REAL, INTENT(IN):: dtime ! intervalle du temps (en second)
21    
22        REAL, INTENT(IN):: coef(:, 2:) ! (klon, 2:klev)
23        ! coefficient d'echange (m**2/s) l>1
24    
25        REAL, INTENT(IN):: t(klon, klev) ! temperature (K)
26        REAL, INTENT(IN):: tr(klon, klev) ! la q. de traceurs
27        REAL, INTENT(IN):: flux(klon) ! le flux de traceurs a la surface
28        REAL, INTENT(IN):: paprs(klon, klev+1) ! pression a inter-couche (Pa)
29        REAL, INTENT(IN):: pplay(klon, klev) ! pression au milieu de couche (Pa)
30        REAL, INTENT(IN):: delp(klon, klev) ! epaisseur de couche (Pa)
31        REAL, INTENT(out):: d_tr(klon, klev) ! le changement de tr
32    
33        ! Local:
34        
35        real tr0(klon)
36        ! tr0 traceurs a la surface ou dans l'ocean (non active)
37    
     USE dimensions  
     USE dimphy  
     USE suphec_m  
     ! ======================================================================  
     ! Auteur(s): O. Boucher (LOA/LMD) date: 19961127  
     ! inspire de clvent  
     ! Objet: diffusion verticale de traceurs avec flux fixe a la surface  
     ! ou/et flux du type c-drag  
     ! ======================================================================  
     ! Arguments:  
     ! dtime----input-R- intervalle du temps (en second)  
     ! coef-----input-R- le coefficient d'echange (m**2/s) l>1  
     ! tr-------input-R- la q. de traceurs  
     ! flux-----input-R- le flux de traceurs a la surface  
     ! paprs----input-R- pression a inter-couche (Pa)  
     ! pplay----input-R- pression au milieu de couche (Pa)  
     ! delp-----input-R- epaisseur de couche (Pa)  
     ! cdrag----input-R- cdrag pour le flux de surface (non active)  
     ! tr0------input-R- traceurs a la surface ou dans l'ocean (non active)  
     ! d_tr-----output-R- le changement de tr  
     ! flux_tr--output-R- flux de tr  
     ! ======================================================================  
     REAL, INTENT (IN) :: dtime  
     REAL coef(:, 2:) ! (klon, 2:klev)  
     REAL, INTENT (IN) :: t(klon, klev) ! temperature (K)  
     REAL tr(klon, klev)  
     REAL, INTENT (IN) :: paprs(klon, klev+1)  
     REAL, INTENT (IN) :: pplay(klon, klev)  
     REAL delp(klon, klev)  
     REAL d_tr(klon, klev)  
     REAL flux(klon), cdrag(klon), tr0(klon)  
     ! REAL flux_tr(klon,klev)  
     ! ======================================================================  
     ! ======================================================================  
38      INTEGER i, k      INTEGER i, k
39      REAL zx_ctr(klon, 2:klev)      REAL zx_ctr(klon, 2:klev)
40      REAL zx_dtr(klon, 2:klev)      REAL zx_dtr(klon, 2:klev)
# Line 49  contains Line 42  contains
42      REAL zx_coef(klon, klev)      REAL zx_coef(klon, klev)
43      REAL local_tr(klon, klev)      REAL local_tr(klon, klev)
44      REAL zx_alf1(klon), zx_alf2(klon), zx_flux(klon)      REAL zx_alf1(klon), zx_alf2(klon), zx_flux(klon)
45      ! ======================================================================  
46        !-----------------------------------------------------------------------
47    
48      DO k = 1, klev      DO k = 1, klev
49         DO i = 1, klon         DO i = 1, klon
50            local_tr(i, k) = tr(i, k)            local_tr(i, k) = tr(i, k)
51         END DO         END DO
52      END DO      END DO
53    
   
     ! ======================================================================  
54      DO i = 1, klon      DO i = 1, klon
55         zx_alf1(i) = (paprs(i,1)-pplay(i,2))/(pplay(i,1)-pplay(i,2))         zx_alf1(i) = (paprs(i, 1)-pplay(i, 2))/(pplay(i, 1)-pplay(i, 2))
56         zx_alf2(i) = 1.0 - zx_alf1(i)         zx_alf2(i) = 1.0 - zx_alf1(i)
57         zx_flux(i) = -flux(i)*dtime*rg         zx_flux(i) = -flux(i)*dtime*rg
58         ! --pour le moment le flux est prescrit         ! pour le moment le flux est prescrit
59         ! --cdrag et zx_coef(1) vaut 0         ! zx_coef(1) vaut 0
        cdrag(i) = 0.0  
60         tr0(i) = 0.0         tr0(i) = 0.0
61         zx_coef(i, 1) = cdrag(i)*dtime*rg         zx_coef(i, 1) = 0.
62      END DO      END DO
63      ! ======================================================================  
64      DO k = 2, klev      DO k = 2, klev
65         DO i = 1, klon         DO i = 1, klon
66            zx_coef(i, k) = coef(i, k)*rg/(pplay(i,k-1)-pplay(i,k))* &            zx_coef(i, k) = coef(i, k)*rg/(pplay(i, k-1)-pplay(i, k))* &
67                 (paprs(i,k)*2/(t(i,k)+t(i,k-1))/rd)**2                 (paprs(i, k)*2/(t(i, k)+t(i, k-1))/rd)**2
68            zx_coef(i, k) = zx_coef(i, k)*dtime*rg            zx_coef(i, k) = zx_coef(i, k)*dtime*rg
69         END DO         END DO
70      END DO      END DO
71      ! ======================================================================  
72      DO i = 1, klon      DO i = 1, klon
73         zx_buf(i) = delp(i, 1) + zx_coef(i, 1)*zx_alf1(i) + zx_coef(i, 2)         zx_buf(i) = delp(i, 1) + zx_coef(i, 1)*zx_alf1(i) + zx_coef(i, 2)
74         zx_ctr(i, 2) = (local_tr(i,1)*delp(i,1)+zx_coef(i,1)*tr0(i)-zx_flux(i))/ &         zx_ctr(i, 2) = (local_tr(i, 1)*delp(i, 1)+zx_coef(i, 1)*tr0(i)-zx_flux(i))/ &
75              zx_buf(i)              zx_buf(i)
76         zx_dtr(i, 2) = (zx_coef(i,2)-zx_alf2(i)*zx_coef(i,1))/zx_buf(i)         zx_dtr(i, 2) = (zx_coef(i, 2)-zx_alf2(i)*zx_coef(i, 1))/zx_buf(i)
77      END DO      END DO
78    
79      DO k = 3, klev      DO k = 3, klev
80         DO i = 1, klon         DO i = 1, klon
81            zx_buf(i) = delp(i, k-1) + zx_coef(i, k) + zx_coef(i, k-1)*(1.-zx_dtr(i &            zx_buf(i) = delp(i, k-1) + zx_coef(i, k) + zx_coef(i, k-1)*(1.-zx_dtr(i &
82                 ,k-1))                 , k-1))
83            zx_ctr(i, k) = (local_tr(i,k-1)*delp(i,k-1)+zx_coef(i,k-1)*zx_ctr(i,k-1 &            zx_ctr(i, k) = (local_tr(i, k-1)*delp(i, k-1)+zx_coef(i, k-1)*zx_ctr(i, k-1 &
84                 ))/zx_buf(i)                 ))/zx_buf(i)
85            zx_dtr(i, k) = zx_coef(i, k)/zx_buf(i)            zx_dtr(i, k) = zx_coef(i, k)/zx_buf(i)
86         END DO         END DO
87      END DO      END DO
88      DO i = 1, klon      DO i = 1, klon
89         local_tr(i, klev) = (local_tr(i,klev)*delp(i,klev)+zx_coef(i,klev)*zx_ctr &         local_tr(i, klev) = (local_tr(i, klev)*delp(i, klev)+zx_coef(i, klev)*zx_ctr &
90              (i,klev))/(delp(i,klev)+zx_coef(i,klev)-zx_coef(i,klev)*zx_dtr(i,klev))              (i, klev))/(delp(i, klev)+zx_coef(i, klev)-zx_coef(i, klev)*zx_dtr(i, klev))
91      END DO      END DO
92      DO k = klev - 1, 1, -1      DO k = klev - 1, 1, -1
93         DO i = 1, klon         DO i = 1, klon
94            local_tr(i, k) = zx_ctr(i, k+1) + zx_dtr(i, k+1)*local_tr(i, k+1)            local_tr(i, k) = zx_ctr(i, k+1) + zx_dtr(i, k+1)*local_tr(i, k+1)
95         END DO         END DO
96      END DO      END DO
97      ! ======================================================================  
     ! == flux_tr est le flux de traceur (positif vers bas)  
     ! DO i = 1, klon  
     ! flux_tr(i,1) = zx_coef(i,1)/(RG*dtime)  
     ! ENDDO  
     ! DO k = 2, klev  
     ! DO i = 1, klon  
     ! flux_tr(i,k) = zx_coef(i,k)/(RG*dtime)  
     ! .               * (local_tr(i,k)-local_tr(i,k-1))  
     ! ENDDO  
     ! ENDDO  
     ! ======================================================================  
98      DO k = 1, klev      DO k = 1, klev
99         DO i = 1, klon         DO i = 1, klon
100            d_tr(i, k) = local_tr(i, k) - tr(i, k)            d_tr(i, k) = local_tr(i, k) - tr(i, k)

Legend:
Removed from v.265  
changed lines
  Added in v.270

  ViewVC Help
Powered by ViewVC 1.1.21