[3] | 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 | cpstar(k) = RCPD |
---|
| 79 | 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 |
---|