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

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

  ViewVC Help
Powered by ViewVC 1.1.21