1 | ! |
---|
2 | ! $Header: /home/cvsroot/LMDZ4/libf/phylmd/ajsec.F,v 1.1.1.1 2004/05/19 12:53:08 lmdzadmin Exp $ |
---|
3 | ! |
---|
4 | SUBROUTINE ajsec(paprs, pplay, t, d_t) |
---|
5 | IMPLICIT none |
---|
6 | c====================================================================== |
---|
7 | c inspiree de la base ecrite par: |
---|
8 | c Auteur(s): Z.X. Li (LMD/CNRS) date: 19930818 |
---|
9 | c Objet: ajustement sec (adaptation du GCM du LMD) |
---|
10 | c |
---|
11 | c Reecriture par S. Lebonnois en Novembre 2006 |
---|
12 | c pour prise en compte Cp variable dans atm de VENUS |
---|
13 | c====================================================================== |
---|
14 | c Arguments: |
---|
15 | c t-------input-R- Temperature |
---|
16 | c |
---|
17 | c d_t-----output-R-Incrementation de la temperature |
---|
18 | c====================================================================== |
---|
19 | #include "dimensions.h" |
---|
20 | #include "dimphy.h" |
---|
21 | #include "YOMCST.h" |
---|
22 | REAL paprs(klon,klev+1), pplay(klon,klev) |
---|
23 | REAL t(klon,klev), d_t(klon,klev) |
---|
24 | c |
---|
25 | INTEGER limbas, limhau ! les couches a ajuster |
---|
26 | ccc PARAMETER (limbas=klev-3, limhau=klev) |
---|
27 | PARAMETER (limbas=1, limhau=klev) |
---|
28 | c |
---|
29 | REAL zt(klev),t_inter(klev),zh(klev) |
---|
30 | REAL zdp(klev),zdplay(klev) |
---|
31 | REAL alpha(klev),beta(klev) |
---|
32 | real somh,somhm1 |
---|
33 | LOGICAL down |
---|
34 | INTEGER i, k, k1, k2 |
---|
35 | |
---|
36 | real cpco2,cpstar(klev),cpdyn(klev) |
---|
37 | external cpco2 |
---|
38 | save cpstar,cpdyn |
---|
39 | |
---|
40 | logical firstcall |
---|
41 | data firstcall/.true./ |
---|
42 | save firstcall |
---|
43 | c |
---|
44 | c Initialisation: |
---|
45 | c |
---|
46 | DO k = 1, klev |
---|
47 | DO i = 1, klon |
---|
48 | d_t(i,k) = 0.0 |
---|
49 | ENDDO |
---|
50 | ENDDO |
---|
51 | |
---|
52 | DO i = 1, klon |
---|
53 | c - - boucle sur les points de grille - - - - - - |
---|
54 | |
---|
55 | c------ initialisation des variables necessaires au calcul |
---|
56 | |
---|
57 | do k = 1, klev |
---|
58 | zt(k) = t(i,k) |
---|
59 | zdp(k) = paprs(i,k)-paprs(i,k+1) |
---|
60 | |
---|
61 | if (firstcall) then |
---|
62 | c CP considere: etre cohérent avec la dynamique ! (conservation...) |
---|
63 | cpdyn(k) = RCPD |
---|
64 | c cpdyn(k) = cpco2(t(i,k)) |
---|
65 | endif |
---|
66 | |
---|
67 | c enthalpie dans la couche k: c'est la grandeur qu'on mélange |
---|
68 | zh(k) = t(i,k)*zdp(k)*cpdyn(k) |
---|
69 | enddo |
---|
70 | |
---|
71 | do k = 2, klev |
---|
72 | zdplay(k) = pplay(i,k-1)-pplay(i,k) |
---|
73 | t_inter(k) = (t(i,k-1)+t(i,k))/2. |
---|
74 | if (firstcall) then |
---|
75 | cpstar(k) = cpco2(t_inter(k)) |
---|
76 | c---- |
---|
77 | c TEST si cp constant: |
---|
78 | c cpstar(k) = RCPD |
---|
79 | c print*,"ATTENTION!! CP CONSTANT DANS AJSEC",cpstar |
---|
80 | c---- |
---|
81 | c print*,cpstar |
---|
82 | endif |
---|
83 | beta(k) = RD*zdplay(k)/(2.*cpstar(k)*paprs(i,k)) |
---|
84 | c print*,beta(k),((zt(k-1)-zt(k))/(zt(k-1)+zt(k))) |
---|
85 | alpha(k) = (1.-beta(k))/(1.+beta(k))*(zdp(k)/zdp(k-1)) |
---|
86 | enddo |
---|
87 | c------------------------------------- correction des instabilites |
---|
88 | c on part du bas: |
---|
89 | k2 = limbas |
---|
90 | |
---|
91 | 8000 CONTINUE |
---|
92 | c on cherche une zone de convection |
---|
93 | k2 = k2 + 1 |
---|
94 | somh = 0. |
---|
95 | somhm1 = 0. |
---|
96 | IF (k2 .GT. limhau) goto 8001 |
---|
97 | |
---|
98 | c test instabilite initiale pour une zone |
---|
99 | IF (((zt(k2-1)-zt(k2))/(zt(k2-1)+zt(k2))).GT.beta(k2)) THEN |
---|
100 | k1 = k2 - 1 |
---|
101 | somh = zh(k1)+zh(k2) |
---|
102 | somhm1 = zh(k1) |
---|
103 | down = .FALSE. |
---|
104 | |
---|
105 | 8020 CONTINUE |
---|
106 | c calculs nouvelles temperatures entre k1 et k2 par recurrence |
---|
107 | if (down) then |
---|
108 | zt(k1) = somh /( cpdyn(k1)*zdp(k1)* |
---|
109 | . (1+somhm1/(cpdyn(k1+1)*zt(k1+1)*zdp(k1+1))*alpha(k1+1)) ) |
---|
110 | do k = k1+1, k2 |
---|
111 | zt(k) = zt(k-1)*(1-beta(k))/(1+beta(k)) |
---|
112 | enddo |
---|
113 | else |
---|
114 | zt(k2) = somh /( cpdyn(k2)*zdp(k2)* |
---|
115 | . (1+somhm1/(cpdyn(k2-1)*zt(k2-1)*zdp(k2-1))/alpha(k2)) ) |
---|
116 | do k = k2-1, k1, -1 |
---|
117 | zt(k) = zt(k+1)*(1+beta(k+1))/(1-beta(k+1)) |
---|
118 | enddo |
---|
119 | endif |
---|
120 | |
---|
121 | down = .FALSE. |
---|
122 | IF (k1 .ne. limbas) THEN |
---|
123 | c test instabilite vers le bas |
---|
124 | IF (((zt(k1-1)-zt(k1))/(zt(k1-1)+zt(k1))).GT.beta(k1)) |
---|
125 | . down = .TRUE. |
---|
126 | ENDIF |
---|
127 | IF (down) THEN |
---|
128 | k1 = k1 - 1 |
---|
129 | somhm1 = somh |
---|
130 | somh = somh + zh(k1) |
---|
131 | ELSE |
---|
132 | IF ((k2 .EQ. limhau)) GOTO 8021 |
---|
133 | c test instabilite vers le haut |
---|
134 | IF (((zt(k2)-zt(k2+1))/(zt(k2)+zt(k2+1))).LE.beta(k2+1)) |
---|
135 | c (si vrai, stable) |
---|
136 | . GOTO 8021 |
---|
137 | k2 = k2 + 1 |
---|
138 | somhm1 = somh |
---|
139 | somh = somh + zh(k2) |
---|
140 | ENDIF |
---|
141 | c on a etendu la zone, on recalcule: |
---|
142 | GOTO 8020 |
---|
143 | |
---|
144 | c sortie zone => on continue au-dessus pour chercher autre zone |
---|
145 | 8021 CONTINUE |
---|
146 | k2 = k2 + 1 |
---|
147 | ENDIF |
---|
148 | GOTO 8000 |
---|
149 | |
---|
150 | c sortie de la colonne: |
---|
151 | 8001 CONTINUE |
---|
152 | |
---|
153 | c ------------------------------------- tendances temperature |
---|
154 | |
---|
155 | DO k = 1,klev |
---|
156 | d_t(i,k) = zt(k) - t(i,k) |
---|
157 | c if(d_t(i,k).gt.0.) print*,zt(k),t(i,k) |
---|
158 | ENDDO |
---|
159 | |
---|
160 | c - - fin boucle sur les points de grille - - - - |
---|
161 | ENDDO |
---|
162 | |
---|
163 | firstcall = .false. |
---|
164 | |
---|
165 | RETURN |
---|
166 | END |
---|