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

Contents of /trunk/phylmd/cltrac.f90

Parent Directory Parent Directory | Revision Log Revision Log


Revision 328 - (show annotations)
Thu Jun 13 14:40:06 2019 UTC (4 years, 11 months ago) by guez
File size: 3250 byte(s)
Change all `.f` suffixes to `.f90`. (The opposite was done in revision
82.)  Because of change of philosopy in GNUmakefile: we already had a
rewritten rule for `.f`, so it does not make the makefile longer to
replace it by a rule for `.f90`. And it spares us options of
makedepf90 and of the compiler. Also we prepare the way for a simpler
`CMakeLists.txt`.

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, version 1.1.1.1 2004/05/19 12:53:07
10
11 USE dimphy, only: klon, klev
12 USE suphec_m, only: rd, rg
13
14 ! Auteur : O. Boucher (LOA/LMD), date: 1996/11/27
15 ! inspir\'e de clvent
16
17 ! Objet: diffusion verticale de traceurs avec flux fix\'e \`a la
18 ! surface ou flux du type c-drag
19
20 REAL, INTENT(IN):: dtime ! intervalle du temps (en second)
21
22 REAL, INTENT(IN):: coef(:, 2:) ! (klon, 2:klev)
23 ! coefficient d'echange (m**2/s) l>1
24
25 REAL, INTENT(IN):: t(klon, klev) ! temperature (K)
26 REAL, INTENT(IN):: tr(klon, klev) ! la q. de traceurs
27 REAL, INTENT(IN):: flux(klon) ! le flux de traceurs a la surface
28 REAL, INTENT(IN):: paprs(klon, klev+1) ! pression a inter-couche (Pa)
29 REAL, INTENT(IN):: pplay(klon, klev) ! pression au milieu de couche (Pa)
30 REAL, INTENT(IN):: delp(klon, klev) ! epaisseur de couche (Pa)
31 REAL, INTENT(out):: d_tr(klon, klev) ! le changement de tr
32
33 ! Local:
34
35 real tr0(klon)
36 ! tr0 traceurs a la surface ou dans l'ocean (non active)
37
38 INTEGER i, k
39 REAL zx_ctr(klon, 2:klev)
40 REAL zx_dtr(klon, 2:klev)
41 REAL zx_buf(klon)
42 REAL zx_coef(klon, klev)
43 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
55 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
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
72 DO i = 1, klon
73 zx_buf(i) = delp(i, 1) + zx_coef(i, 1)*zx_alf1(i) + zx_coef(i, 2)
74 zx_ctr(i, 2) = (local_tr(i, 1)*delp(i, 1)+zx_coef(i, 1)*tr0(i)-zx_flux(i))/ &
75 zx_buf(i)
76 zx_dtr(i, 2) = (zx_coef(i, 2)-zx_alf2(i)*zx_coef(i, 1))/zx_buf(i)
77 END DO
78
79 DO k = 3, klev
80 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 &
82 , 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 &
84 ))/zx_buf(i)
85 zx_dtr(i, k) = zx_coef(i, k)/zx_buf(i)
86 END DO
87 END DO
88 DO i = 1, klon
89 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
97
98 DO k = 1, klev
99 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

  ViewVC Help
Powered by ViewVC 1.1.21