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

Diff of /trunk/phylmd/cltrac.f90

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

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

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

  ViewVC Help
Powered by ViewVC 1.1.21