source: trunk/LMDZ.VENUS/libf/phyvenus/ajsec.cpvariable @ 402

Last change on this file since 402 was 3, checked in by slebonnois, 14 years ago

Creation de repertoires:

  • chantiers : pour communiquer sur nos projets de modifs
  • documentation : pour stocker les docs

Ajout de:

  • libf/phytitan : physique de Titan
  • libf/chimtitan: chimie de Titan
  • libf/phyvenus : physique de Venus
File size: 4.7 KB
Line 
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
6c======================================================================
7c inspiree de la base ecrite par:
8c Auteur(s): Z.X. Li (LMD/CNRS) date: 19930818
9c Objet: ajustement sec (adaptation du GCM du LMD)
10c
11c Reecriture par S. Lebonnois en Novembre 2006
12c pour prise en compte Cp variable dans atm de VENUS
13c======================================================================
14c Arguments:
15c t-------input-R- Temperature
16c
17c d_t-----output-R-Incrementation de la temperature
18c======================================================================
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)
24c
25      INTEGER limbas, limhau ! les couches a ajuster
26ccc      PARAMETER (limbas=klev-3, limhau=klev)
27      PARAMETER (limbas=1, limhau=klev)
28c
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
43c
44c Initialisation:
45c
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
53c - - boucle sur les points de grille - - - - - -     
54
55c------ 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
62c CP considere: etre cohérent avec la dynamique ! (conservation...)
63          cpdyn(k) = RCPD
64c         cpdyn(k) = cpco2(t(i,k))
65        endif
66
67c 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))
76c----
77c TEST si cp constant:
78c         cpstar(k)  = RCPD
79c         print*,"ATTENTION!! CP CONSTANT DANS AJSEC",cpstar
80c----
81c         print*,cpstar
82        endif
83          beta(k)    = RD*zdplay(k)/(2.*cpstar(k)*paprs(i,k))
84c       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
87c------------------------------------- correction des instabilites
88c on part du bas:
89          k2 = limbas
90
91 8000     CONTINUE
92c on cherche une zone de convection
93            k2 = k2 + 1
94            somh   = 0.
95            somhm1 = 0.
96            IF (k2 .GT. limhau) goto 8001
97           
98c 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
106c 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
123c 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
133c test instabilite vers le haut
134           IF (((zt(k2)-zt(k2+1))/(zt(k2)+zt(k2+1))).LE.beta(k2+1))
135c                  (si vrai, stable)
136     .                     GOTO 8021
137                  k2 = k2 + 1
138                  somhm1 = somh
139                  somh   = somh + zh(k2)
140                ENDIF
141c on a etendu la zone, on recalcule:
142              GOTO 8020
143
144c sortie zone => on continue au-dessus pour chercher autre zone
145 8021         CONTINUE
146              k2 = k2 + 1
147            ENDIF
148          GOTO 8000
149
150c sortie de la colonne:
151 8001     CONTINUE
152
153c ------------------------------------- tendances temperature
154
155        DO k = 1,klev
156         d_t(i,k) = zt(k) - t(i,k)
157c        if(d_t(i,k).gt.0.) print*,zt(k),t(i,k)
158        ENDDO
159
160c - - fin boucle sur les points de grille - - - -     
161      ENDDO
162
163      firstcall  = .false.
164
165      RETURN
166      END
Note: See TracBrowser for help on using the repository browser.