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

Annotation of /trunk/phylmd/cltrac.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 120 - (hide annotations)
Tue Jan 13 14:56:15 2015 UTC (9 years, 4 months ago) by guez
File size: 4562 byte(s)
In procedure fxhyp, removed the possibility to set scal180 to
false. The useful lower bound of fhyp and xxpr is not 0. It does not
make sense to give the save attribute to is2 since fxhyp is only
called one per run. Bug fix: is2 could be used without being
defined. The bug did not appear because is2 had the save attribute so
it was initialized at 0.

1 guez 120 module cltrac_m
2 guez 3
3 guez 81 IMPLICIT NONE
4    
5 guez 120 contains
6 guez 81
7 guez 120 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 guez 81 END DO
58    
59 guez 120
60     ! ======================================================================
61 guez 81 DO i = 1, klon
62 guez 120 zx_alf1(i) = (paprs(i,1)-pplay(i,2))/(pplay(i,1)-pplay(i,2))
63     zx_alf2(i) = 1.0 - zx_alf1(i)
64     zx_flux(i) = -flux(i)*dtime*rg
65     ! --pour le moment le flux est prescrit
66     ! --cdrag et zx_coef(1) vaut 0
67     cdrag(i) = 0.0
68     tr0(i) = 0.0
69     zx_coef(i, 1) = cdrag(i)*dtime*rg
70 guez 81 END DO
71 guez 120 ! ======================================================================
72     DO k = 2, klev
73     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 guez 81 DO i = 1, klon
81 guez 120 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 guez 81 END DO
86 guez 120
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
96 guez 81 DO i = 1, klon
97 guez 120 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 guez 81 END DO
100 guez 120 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 guez 81
123 guez 120 RETURN
124     END SUBROUTINE cltrac
125    
126     end module cltrac_m

  ViewVC Help
Powered by ViewVC 1.1.21