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

Contents of /trunk/phylmd/cltrac.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 120 - (show 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 module cltrac_m
2
3 IMPLICIT NONE
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
59
60 ! ======================================================================
61 DO i = 1, klon
62 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 END DO
71 ! ======================================================================
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 DO i = 1, klon
81 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
96 DO i = 1, klon
97 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
100 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 end module cltrac_m

  ViewVC Help
Powered by ViewVC 1.1.21