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

Diff of /trunk/phylmd/cltrac.f

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

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

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

  ViewVC Help
Powered by ViewVC 1.1.21