/[lmdze]/trunk/libf/phylmd/ajsec.f90
ViewVC logotype

Contents of /trunk/libf/phylmd/ajsec.f90

Parent Directory Parent Directory | Revision Log Revision Log


Revision 53 - (show annotations)
Fri Oct 7 13:11:58 2011 UTC (12 years, 7 months ago) by guez
File size: 2901 byte(s)


1 module ajsec_m
2
3 IMPLICIT none
4
5 contains
6
7 SUBROUTINE ajsec(paprs, pplay, t, q, d_t, d_q)
8
9 ! From LMDZ4/libf/phylmd/ajsec.F, version 1.1.1.1 2004/05/19 12:53:08
10
11 ! Author: Z. X. Li (LMD/CNRS) date: 1993/08/18
12 ! Objet : ajustement sec
13
14 USE dimphy, ONLY : klev, klon
15 USE suphec_m, ONLY : rcpd, rkappa
16
17 REAL, intent(in):: paprs(klon, klev+1)
18 real, intent(in):: pplay(klon, klev)
19 REAL, intent(in):: t(klon, klev) ! temperature
20 real, intent(in):: q(klon, klev)
21 REAL, intent(out):: d_t(klon, klev) ! incrémentation de la température
22 REAL, intent(out):: d_q(klon, klev)
23
24 ! Local:
25 INTEGER, PARAMETER:: limbas=1, limhau=klev ! les couches à ajuster
26 LOGICAL, PARAMETER:: mixq = .FALSE.
27 REAL, dimension(klon, limbas: limhau):: zh, zq, zpk, zpkdp
28 REAL hm, sm, qm
29 LOGICAL down
30 INTEGER i, k, k1, k2
31
32 !--------------------------------------------------------------------
33
34 zpk = pplay(:, limbas: limhau)**RKAPPA
35 zh = RCPD * t(:, limbas: limhau) / zpk
36 zq = q(:, limbas: limhau)
37 forall (k = limbas: limhau) &
38 zpkdp(:, k) = zpk(:, k) * (paprs(:, k) - paprs(:, k+1))
39
40 ! Correction des profils instables :
41 DO i = 1, klon
42 IF (any((/(zh(i, k) < zh(i, k - 1), k = limbas + 1, limhau)/))) THEN
43 ! Profil instable, à modifier
44 k2 = limbas
45 do while (k2 <= limhau - 1)
46 k2 = k2 + 1
47 IF (zh(i, k2) < zh(i, k2-1)) THEN
48 k1 = k2 - 1
49 k = k1
50 sm = zpkdp(i, k2)
51 hm = zh(i, k2)
52 qm = zq(i, k2)
53 do
54 sm = sm + zpkdp(i, k)
55 hm = hm + zpkdp(i, k) * (zh(i, k)-hm) / sm
56 qm = qm + zpkdp(i, k) * (zq(i, k)-qm) / sm
57 down = .FALSE.
58 IF (k1 /= limbas) THEN
59 IF (hm < zh(i, k1-1)) down = .TRUE.
60 ENDIF
61 IF (down) THEN
62 k1 = k1 - 1
63 k = k1
64 ELSE
65 IF (k2 == limhau) exit
66 IF (zh(i, k2 + 1) >= hm) exit
67 k2 = k2 + 1
68 k = k2
69 ENDIF
70 end do
71
72 ! nouveau profil : constant (valeur moyenne)
73 DO k = k1, k2
74 zh(i, k) = hm
75 zq(i, k) = qm
76 ENDDO
77 k2 = k2 + 1
78 ENDIF
79 end do
80 ENDIF
81 end DO
82
83 d_t(:, : limbas - 1) = 0.
84 d_t(:, limbas: limhau) = zh * zpk / RCPD - t(:, limbas: limhau)
85 d_t(:, limhau + 1:) = 0.
86
87 if (mixq) then
88 d_q(:, : limbas - 1) = 0.
89 d_q(:, limbas: limhau) = zq - q(:, limbas: limhau)
90 d_q(:, limhau + 1:) = 0.
91 else
92 d_q = 0.
93 end if
94
95 END SUBROUTINE ajsec
96
97 end module ajsec_m

  ViewVC Help
Powered by ViewVC 1.1.21