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

Diff of /trunk/Sources/phylmd/cltrac.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 120 by guez, Tue Jan 13 14:56:15 2015 UTC
# Line 1  Line 1 
1    module cltrac_m
2    
 ! $Header: /home/cvsroot/LMDZ4/libf/phylmd/cltrac.F,v 1.1.1.1 2004/05/19  
 ! 12:53:07 lmdzadmin Exp $  
   
 SUBROUTINE cltrac(dtime, coef, t, tr, flux, paprs, pplay, delp, d_tr)  
   USE dimens_m  
   USE dimphy  
   USE suphec_m  
3    IMPLICIT NONE    IMPLICIT NONE
   ! ======================================================================  
   ! 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(klon, 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)  
   ! ======================================================================  
   ! ======================================================================  
   INTEGER i, k  
   REAL zx_ctr(klon, 2:klev)  
   REAL zx_dtr(klon, 2:klev)  
   REAL zx_buf(klon)  
   REAL zx_coef(klon, klev)  
   REAL local_tr(klon, klev)  
   REAL zx_alf1(klon), zx_alf2(klon), zx_flux(klon)  
   ! ======================================================================  
   DO k = 1, klev  
     DO i = 1, klon  
       local_tr(i, k) = tr(i, k)  
     END DO  
   END DO  
4    
5    contains
6    
7      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
10    
11        USE dimens_m
12        USE dimphy
13        USE suphec_m
14        ! ======================================================================
15        ! Auteur(s): O. Boucher (LOA/LMD) date: 19961127
16        ! inspire de clvent
17        ! Objet: diffusion verticale de traceurs avec flux fixe a la surface
18        ! ou/et flux du type c-drag
19        ! ======================================================================
20        ! Arguments:
21        ! dtime----input-R- intervalle du temps (en second)
22        ! coef-----input-R- le coefficient d'echange (m**2/s) l>1
23        ! tr-------input-R- la q. de traceurs
24        ! flux-----input-R- le flux de traceurs a la surface
25        ! paprs----input-R- pression a inter-couche (Pa)
26        ! pplay----input-R- pression au milieu de couche (Pa)
27        ! delp-----input-R- epaisseur de couche (Pa)
28        ! cdrag----input-R- cdrag pour le flux de surface (non active)
29        ! tr0------input-R- traceurs a la surface ou dans l'ocean (non active)
30        ! d_tr-----output-R- le changement de tr
31        ! flux_tr--output-R- flux de tr
32        ! ======================================================================
33        REAL, INTENT (IN) :: dtime
34        REAL coef(klon, klev)
35        REAL, INTENT (IN) :: t(klon, klev) ! temperature (K)
36        REAL tr(klon, klev)
37        REAL, INTENT (IN) :: paprs(klon, klev+1)
38        REAL, INTENT (IN) :: pplay(klon, klev)
39        REAL delp(klon, klev)
40        REAL d_tr(klon, klev)
41        REAL flux(klon), cdrag(klon), tr0(klon)
42        ! REAL flux_tr(klon,klev)
43        ! ======================================================================
44        ! ======================================================================
45        INTEGER i, k
46        REAL zx_ctr(klon, 2:klev)
47        REAL zx_dtr(klon, 2:klev)
48        REAL zx_buf(klon)
49        REAL zx_coef(klon, klev)
50        REAL local_tr(klon, klev)
51        REAL zx_alf1(klon), zx_alf2(klon), zx_flux(klon)
52        ! ======================================================================
53        DO k = 1, klev
54           DO i = 1, klon
55              local_tr(i, k) = tr(i, k)
56           END DO
57        END DO
58    
   ! ======================================================================  
   DO i = 1, klon  
     zx_alf1(i) = (paprs(i,1)-pplay(i,2))/(pplay(i,1)-pplay(i,2))  
     zx_alf2(i) = 1.0 - zx_alf1(i)  
     zx_flux(i) = -flux(i)*dtime*rg  
     ! --pour le moment le flux est prescrit  
     ! --cdrag et zx_coef(1) vaut 0  
     cdrag(i) = 0.0  
     tr0(i) = 0.0  
     zx_coef(i, 1) = cdrag(i)*dtime*rg  
   END DO  
   ! ======================================================================  
   DO k = 2, klev  
     DO i = 1, klon  
       zx_coef(i, k) = coef(i, k)*rg/(pplay(i,k-1)-pplay(i,k))* &  
         (paprs(i,k)*2/(t(i,k)+t(i,k-1))/rd)**2  
       zx_coef(i, k) = zx_coef(i, k)*dtime*rg  
     END DO  
   END DO  
   ! ======================================================================  
   DO i = 1, klon  
     zx_buf(i) = delp(i, 1) + zx_coef(i, 1)*zx_alf1(i) + zx_coef(i, 2)  
     zx_ctr(i, 2) = (local_tr(i,1)*delp(i,1)+zx_coef(i,1)*tr0(i)-zx_flux(i))/ &  
       zx_buf(i)  
     zx_dtr(i, 2) = (zx_coef(i,2)-zx_alf2(i)*zx_coef(i,1))/zx_buf(i)  
   END DO  
59    
60    DO k = 3, klev      ! ======================================================================
61      DO i = 1, klon      DO i = 1, klon
62        zx_buf(i) = delp(i, k-1) + zx_coef(i, k) + zx_coef(i, k-1)*(1.-zx_dtr(i &         zx_alf1(i) = (paprs(i,1)-pplay(i,2))/(pplay(i,1)-pplay(i,2))
63          ,k-1))         zx_alf2(i) = 1.0 - zx_alf1(i)
64        zx_ctr(i, k) = (local_tr(i,k-1)*delp(i,k-1)+zx_coef(i,k-1)*zx_ctr(i,k-1 &         zx_flux(i) = -flux(i)*dtime*rg
65          ))/zx_buf(i)         ! --pour le moment le flux est prescrit
66        zx_dtr(i, k) = zx_coef(i, k)/zx_buf(i)         ! --cdrag et zx_coef(1) vaut 0
67      END DO         cdrag(i) = 0.0
68    END DO         tr0(i) = 0.0
69    DO i = 1, klon         zx_coef(i, 1) = cdrag(i)*dtime*rg
70      local_tr(i, klev) = (local_tr(i,klev)*delp(i,klev)+zx_coef(i,klev)*zx_ctr &      END DO
71        (i,klev))/(delp(i,klev)+zx_coef(i,klev)-zx_coef(i,klev)*zx_dtr(i,klev))      ! ======================================================================
72    END DO      DO k = 2, klev
73    DO k = klev - 1, 1, -1         DO i = 1, klon
74              zx_coef(i, k) = coef(i, k)*rg/(pplay(i,k-1)-pplay(i,k))* &
75                   (paprs(i,k)*2/(t(i,k)+t(i,k-1))/rd)**2
76              zx_coef(i, k) = zx_coef(i, k)*dtime*rg
77           END DO
78        END DO
79        ! ======================================================================
80      DO i = 1, klon      DO i = 1, klon
81        local_tr(i, k) = zx_ctr(i, k+1) + zx_dtr(i, k+1)*local_tr(i, k+1)         zx_buf(i) = delp(i, 1) + zx_coef(i, 1)*zx_alf1(i) + zx_coef(i, 2)
82           zx_ctr(i, 2) = (local_tr(i,1)*delp(i,1)+zx_coef(i,1)*tr0(i)-zx_flux(i))/ &
83                zx_buf(i)
84           zx_dtr(i, 2) = (zx_coef(i,2)-zx_alf2(i)*zx_coef(i,1))/zx_buf(i)
85        END DO
86    
87        DO k = 3, klev
88           DO i = 1, klon
89              zx_buf(i) = delp(i, k-1) + zx_coef(i, k) + zx_coef(i, k-1)*(1.-zx_dtr(i &
90                   ,k-1))
91              zx_ctr(i, k) = (local_tr(i,k-1)*delp(i,k-1)+zx_coef(i,k-1)*zx_ctr(i,k-1 &
92                   ))/zx_buf(i)
93              zx_dtr(i, k) = zx_coef(i, k)/zx_buf(i)
94           END DO
95      END DO      END DO
   END DO  
   ! ======================================================================  
   ! == 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  
   ! ======================================================================  
   DO k = 1, klev  
96      DO i = 1, klon      DO i = 1, klon
97        d_tr(i, k) = local_tr(i, k) - tr(i, k)         local_tr(i, klev) = (local_tr(i,klev)*delp(i,klev)+zx_coef(i,klev)*zx_ctr &
98                (i,klev))/(delp(i,klev)+zx_coef(i,klev)-zx_coef(i,klev)*zx_dtr(i,klev))
99      END DO      END DO
100    END DO      DO k = klev - 1, 1, -1
101           DO i = 1, klon
102              local_tr(i, k) = zx_ctr(i, k+1) + zx_dtr(i, k+1)*local_tr(i, k+1)
103           END DO
104        END DO
105        ! ======================================================================
106        ! == flux_tr est le flux de traceur (positif vers bas)
107        ! DO i = 1, klon
108        ! flux_tr(i,1) = zx_coef(i,1)/(RG*dtime)
109        ! ENDDO
110        ! DO k = 2, klev
111        ! DO i = 1, klon
112        ! flux_tr(i,k) = zx_coef(i,k)/(RG*dtime)
113        ! .               * (local_tr(i,k)-local_tr(i,k-1))
114        ! ENDDO
115        ! ENDDO
116        ! ======================================================================
117        DO k = 1, klev
118           DO i = 1, klon
119              d_tr(i, k) = local_tr(i, k) - tr(i, k)
120           END DO
121        END DO
122    
123        RETURN
124      END SUBROUTINE cltrac
125    
126    RETURN  end module cltrac_m
 END SUBROUTINE cltrac  

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

  ViewVC Help
Powered by ViewVC 1.1.21