Changeset 5119
- Timestamp:
- Jul 24, 2024, 6:46:45 PM (12 months ago)
- Location:
- LMDZ6/branches/Amaury_dev/libf
- Files:
-
- 113 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/branches/Amaury_dev/libf/dyn3d/advtrac.f90
r5118 r5119 17 17 USE lmdz_libmath, ONLY: minmax 18 18 USE lmdz_iniprint, ONLY: lunout, prt_level 19 USE lmdz_ssum_scopy, ONLY: scopy 19 20 20 21 IMPLICIT NONE -
LMDZ6/branches/Amaury_dev/libf/dyn3d/caladvtrac.F90
r5117 r5119 11 11 USE comconst_mod, ONLY: dtvr 12 12 USE lmdz_filtreg, ONLY: filtreg 13 USE lmdz_ssum_scopy, ONLY: scopy 13 14 14 15 IMPLICIT NONE -
LMDZ6/branches/Amaury_dev/libf/dyn3d/fluxstokenc.F90
r5118 r5119 7 7 USE IOIPSL 8 8 USE lmdz_iniprint, ONLY: lunout, prt_level 9 USE lmdz_ssum_scopy, ONLY: scopy 9 10 ! 10 11 ! Auteur : F. Hourdin -
LMDZ6/branches/Amaury_dev/libf/dyn3d/groupe.F90
r5117 r5119 4 4 5 5 USE comconst_mod, ONLY: ngroup 6 USE lmdz_ssum_scopy, ONLY: scopy 6 7 7 8 IMPLICIT NONE -
LMDZ6/branches/Amaury_dev/libf/dyn3d/integrd.F90
r5118 r5119 12 12 USE temps_mod, ONLY: dt 13 13 USE lmdz_iniprint, ONLY: lunout, prt_level 14 USE lmdz_ssum_scopy, ONLY: scopy 14 15 15 16 IMPLICIT NONE -
LMDZ6/branches/Amaury_dev/libf/dyn3d/leapfrog.F90
r5118 r5119 27 27 USE lmdz_description, ONLY: descript 28 28 USE lmdz_iniprint, ONLY: lunout, prt_level 29 USE lmdz_ssum_scopy, ONLY: scopy 29 30 30 31 IMPLICIT NONE -
LMDZ6/branches/Amaury_dev/libf/dyn3d/vlsplt.F90
r5118 r5119 3 3 ! 4 4 5 SUBROUTINE vlsplt(q,pente_max,masse,w,pbaru,pbarv,pdt,iq) 6 USE infotrac, ONLY: nqtot,tracers 5 SUBROUTINE vlsplt(q, pente_max, masse, w, pbaru, pbarv, pdt, iq) 6 USE infotrac, ONLY: nqtot, tracers 7 USE lmdz_ssum_scopy, ONLY: scopy 7 8 ! 8 9 ! Auteurs: P.Le Van, F.Hourdin, F.Forget … … 27 28 ! Arguments: 28 29 ! ---------- 29 REAL :: masse(ip1jmp1, llm),pente_max30 REAL :: pbaru( ip1jmp1,llm ),pbarv( ip1jm,llm)31 REAL :: q(ip1jmp1, llm,nqtot)32 REAL :: w(ip1jmp1, llm),pdt30 REAL :: masse(ip1jmp1, llm), pente_max 31 REAL :: pbaru(ip1jmp1, llm), pbarv(ip1jm, llm) 32 REAL :: q(ip1jmp1, llm, nqtot) 33 REAL :: w(ip1jmp1, llm), pdt 33 34 INTEGER :: iq ! CRisi 34 35 ! … … 36 37 ! --------- 37 38 ! 38 INTEGER :: ij, l39 ! 40 REAL :: zm(ip1jmp1, llm,nqtot)41 REAL :: mu(ip1jmp1, llm)42 REAL :: mv(ip1jm, llm)43 REAL :: mw(ip1jmp1, llm+1)44 REAL :: zq(ip1jmp1, llm,nqtot)39 INTEGER :: ij, l 40 ! 41 REAL :: zm(ip1jmp1, llm, nqtot) 42 REAL :: mu(ip1jmp1, llm) 43 REAL :: mv(ip1jm, llm) 44 REAL :: mw(ip1jmp1, llm + 1) 45 REAL :: zq(ip1jmp1, llm, nqtot) 45 46 REAL :: zzpbar, zzw 46 INTEGER :: ifils, iq2 ! CRisi47 48 REAL :: qmin, qmax49 DATA qmin, qmax/0.,1.e33/50 51 52 zzw= pdt53 DO l =1,llm54 DO ij = iip2, ip1jm55 mu(ij,l)=pbaru(ij,l) * zzpbar56 57 DO ij=1,ip1jm58 mv(ij,l)=pbarv(ij,l) * zzpbar59 60 DO ij=1,ip1jmp161 mw(ij,l)=w(ij,l) * zzw62 63 ENDDO 64 65 DO ij =1,ip1jmp166 mw(ij,llm+1)=0.67 ENDDO 68 69 CALL SCOPY(ijp1llm, q(1,1,iq),1,zq(1,1,iq),1)70 CALL SCOPY(ijp1llm, masse,1,zm(1,1,iq),1)71 72 do ifils =1,tracers(iq)%nqDescen73 iq2 =tracers(iq)%iqDescen(ifils)74 CALL SCOPY(ijp1llm, q(1,1,iq2),1,zq(1,1,iq2),1)75 enddo 76 77 CALL vlx(zq, pente_max,zm,mu,iq)78 CALL vly(zq, pente_max,zm,mv,iq)79 CALL vlz(zq, pente_max,zm,mw,iq)80 CALL vly(zq, pente_max,zm,mv,iq)81 CALL vlx(zq, pente_max,zm,mu,iq)82 83 DO l =1,llm84 DO ij=1,ip1jmp185 q(ij,l,iq)=zq(ij,l,iq)86 87 DO ij=1,ip1jm+1,iip188 q(ij+iim,l,iq)=q(ij,l,iq)89 47 INTEGER :: ifils, iq2 ! CRisi 48 49 REAL :: qmin, qmax 50 DATA qmin, qmax/0., 1.e33/ 51 52 zzpbar = 0.5 * pdt 53 zzw = pdt 54 DO l = 1, llm 55 DO ij = iip2, ip1jm 56 mu(ij, l) = pbaru(ij, l) * zzpbar 57 ENDDO 58 DO ij = 1, ip1jm 59 mv(ij, l) = pbarv(ij, l) * zzpbar 60 ENDDO 61 DO ij = 1, ip1jmp1 62 mw(ij, l) = w(ij, l) * zzw 63 ENDDO 64 ENDDO 65 66 DO ij = 1, ip1jmp1 67 mw(ij, llm + 1) = 0. 68 ENDDO 69 70 CALL SCOPY(ijp1llm, q(1, 1, iq), 1, zq(1, 1, iq), 1) 71 CALL SCOPY(ijp1llm, masse, 1, zm(1, 1, iq), 1) 72 73 do ifils = 1, tracers(iq)%nqDescen 74 iq2 = tracers(iq)%iqDescen(ifils) 75 CALL SCOPY(ijp1llm, q(1, 1, iq2), 1, zq(1, 1, iq2), 1) 76 enddo 77 78 CALL vlx(zq, pente_max, zm, mu, iq) 79 CALL vly(zq, pente_max, zm, mv, iq) 80 CALL vlz(zq, pente_max, zm, mw, iq) 81 CALL vly(zq, pente_max, zm, mv, iq) 82 CALL vlx(zq, pente_max, zm, mu, iq) 83 84 DO l = 1, llm 85 DO ij = 1, ip1jmp1 86 q(ij, l, iq) = zq(ij, l, iq) 87 ENDDO 88 DO ij = 1, ip1jm + 1, iip1 89 q(ij + iim, l, iq) = q(ij, l, iq) 90 ENDDO 90 91 ENDDO 91 92 ! CRisi: aussi pour les fils 92 do ifils=1,tracers(iq)%nqDescen 93 iq2=tracers(iq)%iqDescen(ifils) 94 DO l=1,llm 95 DO ij=1,ip1jmp1 96 q(ij,l,iq2)=zq(ij,l,iq2) 97 ENDDO 98 DO ij=1,ip1jm+1,iip1 99 q(ij+iim,l,iq2)=q(ij,l,iq2) 100 ENDDO 101 ENDDO 102 enddo 103 93 do ifils = 1, tracers(iq)%nqDescen 94 iq2 = tracers(iq)%iqDescen(ifils) 95 DO l = 1, llm 96 DO ij = 1, ip1jmp1 97 q(ij, l, iq2) = zq(ij, l, iq2) 98 ENDDO 99 DO ij = 1, ip1jm + 1, iip1 100 q(ij + iim, l, iq2) = q(ij, l, iq2) 101 ENDDO 102 ENDDO 103 enddo 104 104 105 105 END SUBROUTINE vlsplt 106 RECURSIVE SUBROUTINE vlx(q, pente_max,masse,u_m,iq)107 USE infotrac, ONLY: nqtot, tracers, & ! CRisi108 min_qParent,min_qMass,min_ratio ! MVals et CRisi106 RECURSIVE SUBROUTINE vlx(q, pente_max, masse, u_m, iq) 107 USE infotrac, ONLY: nqtot, tracers, & ! CRisi 108 min_qParent, min_qMass, min_ratio ! MVals et CRisi 109 109 USE lmdz_iniprint, ONLY: lunout, prt_level 110 110 … … 126 126 ! Arguments: 127 127 ! ---------- 128 REAL :: masse(ip1jmp1, llm,nqtot),pente_max129 REAL :: u_m( ip1jmp1,llm)130 REAL :: q(ip1jmp1, llm,nqtot)128 REAL :: masse(ip1jmp1, llm, nqtot), pente_max 129 REAL :: u_m(ip1jmp1, llm) 130 REAL :: q(ip1jmp1, llm, nqtot) 131 131 INTEGER :: iq ! CRisi 132 132 ! … … 134 134 ! --------- 135 135 ! 136 INTEGER :: ij, l,j,i,iju,ijq,indu(ip1jmp1),niju137 INTEGER :: n0, iadvplus(ip1jmp1,llm),nl(llm)138 ! 139 REAL :: new_m, zu_m,zdum(ip1jmp1,llm)140 REAL :: dxq(ip1jmp1, llm),dxqu(ip1jmp1)136 INTEGER :: ij, l, j, i, iju, ijq, indu(ip1jmp1), niju 137 INTEGER :: n0, iadvplus(ip1jmp1, llm), nl(llm) 138 ! 139 REAL :: new_m, zu_m, zdum(ip1jmp1, llm) 140 REAL :: dxq(ip1jmp1, llm), dxqu(ip1jmp1) 141 141 REAL :: zz(ip1jmp1) 142 REAL :: adxqu(ip1jmp1), dxqmax(ip1jmp1,llm)143 REAL :: u_mq(ip1jmp1, llm)142 REAL :: adxqu(ip1jmp1), dxqmax(ip1jmp1, llm) 143 REAL :: u_mq(ip1jmp1, llm) 144 144 145 145 ! CRisi 146 REAL :: masseq(ip1jmp1, llm,nqtot),Ratio(ip1jmp1,llm,nqtot)147 INTEGER :: ifils, iq2 ! CRisi146 REAL :: masseq(ip1jmp1, llm, nqtot), Ratio(ip1jmp1, llm, nqtot) 147 INTEGER :: ifils, iq2 ! CRisi 148 148 149 149 LOGICAL, SAVE :: first … … 152 152 ! calcul de la pente a droite et a gauche de la maille 153 153 154 155 154 IF (pente_max>-1.e-5) THEN 156 155 ! IF (pente_max.gt.10) THEN 157 156 158 ! calcul des pentes avec limitation, Van Leer scheme I: 159 ! ----------------------------------------------------- 160 161 ! calcul de la pente aux points u 162 DO l = 1, llm 163 DO ij=iip2,ip1jm-1 164 dxqu(ij)=q(ij+1,l,iq)-q(ij,l,iq) 165 ENDDO 166 DO ij=iip1+iip1,ip1jm,iip1 167 dxqu(ij)=dxqu(ij-iim) 168 ! sigu(ij)=sigu(ij-iim) 169 ENDDO 170 171 DO ij=iip2,ip1jm 172 adxqu(ij)=abs(dxqu(ij)) 173 ENDDO 174 175 ! calcul de la pente maximum dans la maille en valeur absolue 176 177 DO ij=iip2+1,ip1jm 178 dxqmax(ij,l)=pente_max* & 179 min(adxqu(ij-1),adxqu(ij)) 180 ! limitation subtile 181 ! , min(adxqu(ij-1)/sigu(ij-1),adxqu(ij)/(1.-sigu(ij))) 182 183 184 ENDDO 185 186 DO ij=iip1+iip1,ip1jm,iip1 187 dxqmax(ij-iim,l)=dxqmax(ij,l) 188 ENDDO 189 190 DO ij=iip2+1,ip1jm 191 IF(dxqu(ij-1)*dxqu(ij)>0) THEN 192 dxq(ij,l)=dxqu(ij-1)+dxqu(ij) 193 ELSE 194 ! extremum local 195 dxq(ij,l)=0. 196 ENDIF 197 dxq(ij,l)=0.5*dxq(ij,l) 198 dxq(ij,l)= & 199 sign(min(abs(dxq(ij,l)),dxqmax(ij,l)),dxq(ij,l)) 200 ENDDO 201 202 ENDDO ! l=1,llm 203 !print*,'Ok calcul des pentes' 157 ! calcul des pentes avec limitation, Van Leer scheme I: 158 ! ----------------------------------------------------- 159 160 ! calcul de la pente aux points u 161 DO l = 1, llm 162 DO ij = iip2, ip1jm - 1 163 dxqu(ij) = q(ij + 1, l, iq) - q(ij, l, iq) 164 ENDDO 165 DO ij = iip1 + iip1, ip1jm, iip1 166 dxqu(ij) = dxqu(ij - iim) 167 ! sigu(ij)=sigu(ij-iim) 168 ENDDO 169 170 DO ij = iip2, ip1jm 171 adxqu(ij) = abs(dxqu(ij)) 172 ENDDO 173 174 ! calcul de la pente maximum dans la maille en valeur absolue 175 176 DO ij = iip2 + 1, ip1jm 177 dxqmax(ij, l) = pente_max * & 178 min(adxqu(ij - 1), adxqu(ij)) 179 ! limitation subtile 180 ! , min(adxqu(ij-1)/sigu(ij-1),adxqu(ij)/(1.-sigu(ij))) 181 182 ENDDO 183 184 DO ij = iip1 + iip1, ip1jm, iip1 185 dxqmax(ij - iim, l) = dxqmax(ij, l) 186 ENDDO 187 188 DO ij = iip2 + 1, ip1jm 189 IF(dxqu(ij - 1) * dxqu(ij)>0) THEN 190 dxq(ij, l) = dxqu(ij - 1) + dxqu(ij) 191 ELSE 192 ! extremum local 193 dxq(ij, l) = 0. 194 ENDIF 195 dxq(ij, l) = 0.5 * dxq(ij, l) 196 dxq(ij, l) = & 197 sign(min(abs(dxq(ij, l)), dxqmax(ij, l)), dxq(ij, l)) 198 ENDDO 199 200 ENDDO ! l=1,llm 201 !print*,'Ok calcul des pentes' 204 202 205 203 ELSE ! (pente_max.lt.-1.e-5) 206 204 207 ! Pentes produits:208 ! ----------------209 210 211 DO ij=iip2,ip1jm-1212 dxqu(ij)=q(ij+1,l,iq)-q(ij,l,iq)213 214 DO ij=iip1+iip1,ip1jm,iip1215 dxqu(ij)=dxqu(ij-iim)216 217 218 DO ij=iip2+1,ip1jm219 zz(ij)=dxqu(ij-1)*dxqu(ij)220 zz(ij)=zz(ij)+zz(ij)221 222 dxq(ij,l)=zz(ij)/(dxqu(ij-1)+dxqu(ij))223 224 ! extremum local225 dxq(ij,l)=0.226 227 228 229 205 ! Pentes produits: 206 ! ---------------- 207 208 DO l = 1, llm 209 DO ij = iip2, ip1jm - 1 210 dxqu(ij) = q(ij + 1, l, iq) - q(ij, l, iq) 211 ENDDO 212 DO ij = iip1 + iip1, ip1jm, iip1 213 dxqu(ij) = dxqu(ij - iim) 214 ENDDO 215 216 DO ij = iip2 + 1, ip1jm 217 zz(ij) = dxqu(ij - 1) * dxqu(ij) 218 zz(ij) = zz(ij) + zz(ij) 219 IF(zz(ij)>0) THEN 220 dxq(ij, l) = zz(ij) / (dxqu(ij - 1) + dxqu(ij)) 221 ELSE 222 ! extremum local 223 dxq(ij, l) = 0. 224 ENDIF 225 ENDDO 226 227 ENDDO 230 228 231 229 ENDIF ! (pente_max.lt.-1.e-5) … … 234 232 ! ----------------------------- 235 233 236 DO l =1,llm237 DO ij=iip1+iip1,ip1jm,iip1238 dxq(ij-iim,l)=dxq(ij,l)239 240 DO ij=1,ip1jmp1241 iadvplus(ij,l)=0242 234 DO l = 1, llm 235 DO ij = iip1 + iip1, ip1jm, iip1 236 dxq(ij - iim, l) = dxq(ij, l) 237 ENDDO 238 DO ij = 1, ip1jmp1 239 iadvplus(ij, l) = 0 240 ENDDO 243 241 244 242 ENDDO … … 247 245 ! on cumule le flux correspondant a toutes les mailles dont la masse 248 246 ! au travers de la paroi pENDant le pas de temps. 249 DO l =1,llm250 DO ij=iip2,ip1jm-1251 IF (u_m(ij, l)>0.) THEN252 zdum(ij,l)=1.-u_m(ij,l)/masse(ij,l,iq)253 u_mq(ij,l)=u_m(ij,l)*(q(ij,l,iq)+0.5*zdum(ij,l)*dxq(ij,l))247 DO l = 1, llm 248 DO ij = iip2, ip1jm - 1 249 IF (u_m(ij, l)>0.) THEN 250 zdum(ij, l) = 1. - u_m(ij, l) / masse(ij, l, iq) 251 u_mq(ij, l) = u_m(ij, l) * (q(ij, l, iq) + 0.5 * zdum(ij, l) * dxq(ij, l)) 254 252 ELSE 255 zdum(ij,l)=1.+u_m(ij,l)/masse(ij+1,l,iq)256 u_mq(ij,l)=u_m(ij,l)*(q(ij+1,l,iq) &257 -0.5*zdum(ij,l)*dxq(ij+1,l))253 zdum(ij, l) = 1. + u_m(ij, l) / masse(ij + 1, l, iq) 254 u_mq(ij, l) = u_m(ij, l) * (q(ij + 1, l, iq) & 255 - 0.5 * zdum(ij, l) * dxq(ij + 1, l)) 258 256 ENDIF 259 ENDDO257 ENDDO 260 258 ENDDO 261 259 262 260 ! detection des points ou on advecte plus que la masse de la 263 261 ! maille 264 DO l =1,llm265 DO ij=iip2,ip1jm-1266 IF(zdum(ij,l)<0) THEN267 iadvplus(ij,l)=1268 u_mq(ij,l)=0.269 270 271 ENDDO 272 DO l =1,llm273 DO ij=iip1+iip1,ip1jm,iip1274 iadvplus(ij, l)=iadvplus(ij-iim,l)275 ENDDO262 DO l = 1, llm 263 DO ij = iip2, ip1jm - 1 264 IF(zdum(ij, l)<0) THEN 265 iadvplus(ij, l) = 1 266 u_mq(ij, l) = 0. 267 ENDIF 268 ENDDO 269 ENDDO 270 DO l = 1, llm 271 DO ij = iip1 + iip1, ip1jm, iip1 272 iadvplus(ij, l) = iadvplus(ij - iim, l) 273 ENDDO 276 274 ENDDO 277 275 … … 283 281 ! calcul du nombre de maille sur lequel on advecte plus que la maille. 284 282 285 n0 =0286 DO l =1,llm287 nl(l)=0288 DO ij=iip2,ip1jm289 nl(l)=nl(l)+iadvplus(ij,l)290 291 n0=n0+nl(l)283 n0 = 0 284 DO l = 1, llm 285 nl(l) = 0 286 DO ij = iip2, ip1jm 287 nl(l) = nl(l) + iadvplus(ij, l) 288 ENDDO 289 n0 = n0 + nl(l) 292 290 ENDDO 293 291 294 292 IF(n0>0) THEN 295 IF (prt_level > 2) PRINT *, &296 'Nombre de points pour lesquels on advect plus que le' &297 ,'contenu de la maille : ',n0298 299 DO l=1,llm300 301 iju=0302 ! indicage des mailles concernees par le traitement special303 DO ij=iip2,ip1jm304 IF(iadvplus(ij,l)==1.AND.mod(ij,iip1)/=0) THEN305 iju=iju+1306 indu(iju)=ij307 308 309 niju=iju310 311 ! traitement des mailles312 DO iju=1,niju313 ij=indu(iju)314 j=(ij-1)/iip1+1315 zu_m=u_m(ij,l)316 u_mq(ij,l)=0.317 318 ijq=ij319 i=ijq-(j-1)*iip1320 ! accumulation pour les mailles completements advectees321 do while(zu_m>masse(ijq,l,iq))322 u_mq(ij,l)=u_mq(ij,l)+q(ijq,l,iq) &323 *masse(ijq,l,iq)324 zu_m=zu_m-masse(ijq,l,iq)325 i=mod(i-2+iim,iim)+1326 ijq=(j-1)*iip1+i327 328 ! ajout de la maille non completement advectee329 u_mq(ij,l)=u_mq(ij,l)+zu_m* &330 (q(ijq,l,iq)+0.5*(1.-zu_m/masse(ijq,l,iq)) &331 *dxq(ijq,l))332 333 ijq=ij+1334 i=ijq-(j-1)*iip1335 ! accumulation pour les mailles completements advectees336 do while(-zu_m>masse(ijq,l,iq))337 u_mq(ij,l)=u_mq(ij,l)-q(ijq,l,iq) &338 *masse(ijq,l,iq)339 zu_m=zu_m+masse(ijq,l,iq)340 i=mod(i,iim)+1341 ijq=(j-1)*iip1+i342 343 ! ajout de la maille non completement advectee344 u_mq(ij,l)=u_mq(ij,l)+zu_m*(q(ijq,l,iq)- &345 0.5*(1.+zu_m/masse(ijq,l,iq))*dxq(ijq,l))346 347 348 349 293 IF (prt_level > 2) PRINT *, & 294 'Nombre de points pour lesquels on advect plus que le' & 295 , 'contenu de la maille : ', n0 296 297 DO l = 1, llm 298 IF(nl(l)>0) THEN 299 iju = 0 300 ! indicage des mailles concernees par le traitement special 301 DO ij = iip2, ip1jm 302 IF(iadvplus(ij, l)==1.AND.mod(ij, iip1)/=0) THEN 303 iju = iju + 1 304 indu(iju) = ij 305 ENDIF 306 ENDDO 307 niju = iju 308 309 ! traitement des mailles 310 DO iju = 1, niju 311 ij = indu(iju) 312 j = (ij - 1) / iip1 + 1 313 zu_m = u_m(ij, l) 314 u_mq(ij, l) = 0. 315 IF(zu_m>0.) THEN 316 ijq = ij 317 i = ijq - (j - 1) * iip1 318 ! accumulation pour les mailles completements advectees 319 do while(zu_m>masse(ijq, l, iq)) 320 u_mq(ij, l) = u_mq(ij, l) + q(ijq, l, iq) & 321 * masse(ijq, l, iq) 322 zu_m = zu_m - masse(ijq, l, iq) 323 i = mod(i - 2 + iim, iim) + 1 324 ijq = (j - 1) * iip1 + i 325 ENDDO 326 ! ajout de la maille non completement advectee 327 u_mq(ij, l) = u_mq(ij, l) + zu_m * & 328 (q(ijq, l, iq) + 0.5 * (1. - zu_m / masse(ijq, l, iq)) & 329 * dxq(ijq, l)) 330 ELSE 331 ijq = ij + 1 332 i = ijq - (j - 1) * iip1 333 ! accumulation pour les mailles completements advectees 334 do while(-zu_m>masse(ijq, l, iq)) 335 u_mq(ij, l) = u_mq(ij, l) - q(ijq, l, iq) & 336 * masse(ijq, l, iq) 337 zu_m = zu_m + masse(ijq, l, iq) 338 i = mod(i, iim) + 1 339 ijq = (j - 1) * iip1 + i 340 ENDDO 341 ! ajout de la maille non completement advectee 342 u_mq(ij, l) = u_mq(ij, l) + zu_m * (q(ijq, l, iq) - & 343 0.5 * (1. + zu_m / masse(ijq, l, iq)) * dxq(ijq, l)) 344 ENDIF 345 ENDDO 346 ENDIF 347 ENDDO 350 348 ENDIF ! n0.gt.0 351 349 … … 353 351 ! bouclage en latitude 354 352 !print*,'cvant bouclage en latitude' 355 DO l =1,llm356 DO ij =iip1+iip1,ip1jm,iip1357 u_mq(ij,l)=u_mq(ij-iim,l)353 DO l = 1, llm 354 DO ij = iip1 + iip1, ip1jm, iip1 355 u_mq(ij, l) = u_mq(ij - iim, l) 358 356 ENDDO 359 357 ENDDO … … 363 361 !WRITE(*,*) 'vlsplt 326: iq,nqDesc(iq)=',iq,tracers(iq)%nqDescen 364 362 365 do ifils =1,tracers(iq)%nqDescen366 iq2 =tracers(iq)%iqDescen(ifils)367 DO l =1,llm368 DO ij =iip2,ip1jm363 do ifils = 1, tracers(iq)%nqDescen 364 iq2 = tracers(iq)%iqDescen(ifils) 365 DO l = 1, llm 366 DO ij = iip2, ip1jm 369 367 ! On a besoin de q et masse seulement entre iip2 et ip1jm 370 368 !masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq) 371 ! !Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)369 ! !Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 372 370 !Mvals: veiller a ce qu'on n'ait pas de denominateur nul 373 masseq(ij, l,iq2)=max(masse(ij,l,iq)*q(ij,l,iq),min_qMass)374 IF (q(ij, l,iq)>min_qParent) THEN375 Ratio(ij, l,iq2)=q(ij,l,iq2)/q(ij,l,iq)371 masseq(ij, l, iq2) = max(masse(ij, l, iq) * q(ij, l, iq), min_qMass) 372 IF (q(ij, l, iq)>min_qParent) THEN 373 Ratio(ij, l, iq2) = q(ij, l, iq2) / q(ij, l, iq) 376 374 else 377 Ratio(ij, l,iq2)=min_ratio375 Ratio(ij, l, iq2) = min_ratio 378 376 endif 379 377 enddo 380 378 enddo 381 379 enddo 382 do ifils =1,tracers(iq)%nqChildren383 iq2 =tracers(iq)%iqDescen(ifils)384 CALL vlx(Ratio, pente_max,masseq,u_mq,iq2)380 do ifils = 1, tracers(iq)%nqChildren 381 iq2 = tracers(iq)%iqDescen(ifils) 382 CALL vlx(Ratio, pente_max, masseq, u_mq, iq2) 385 383 enddo 386 384 ! end CRisi … … 389 387 ! calcul des tENDances 390 388 391 DO l =1,llm392 DO ij=iip2+1,ip1jm393 394 new_m=max(masse(ij,l,iq)+u_m(ij-1,l)-u_m(ij,l),min_qMass)395 q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+ &396 u_mq(ij -1,l)-u_mq(ij,l)) &397 / new_m398 masse(ij,l,iq)=new_m399 400 DO ij=iip1+iip1,ip1jm,iip1401 q(ij-iim,l,iq)=q(ij,l,iq)402 masse(ij-iim,l,iq)=masse(ij,l,iq)403 389 DO l = 1, llm 390 DO ij = iip2 + 1, ip1jm 391 !MVals: veiller a ce qu'on ait pas de denominateur nul 392 new_m = max(masse(ij, l, iq) + u_m(ij - 1, l) - u_m(ij, l), min_qMass) 393 q(ij, l, iq) = (q(ij, l, iq) * masse(ij, l, iq) + & 394 u_mq(ij - 1, l) - u_mq(ij, l)) & 395 / new_m 396 masse(ij, l, iq) = new_m 397 ENDDO 398 DO ij = iip1 + iip1, ip1jm, iip1 399 q(ij - iim, l, iq) = q(ij, l, iq) 400 masse(ij - iim, l, iq) = masse(ij, l, iq) 401 ENDDO 404 402 ENDDO 405 403 … … 407 405 ! On calcule q entre iip2+1,ip1jm -> on fait pareil pour ratio 408 406 ! puis on boucle en longitude 409 do ifils =1,tracers(iq)%nqDescen410 iq2 =tracers(iq)%iqDescen(ifils)411 DO l =1,llm412 DO ij =iip2+1,ip1jm413 q(ij, l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2)407 do ifils = 1, tracers(iq)%nqDescen 408 iq2 = tracers(iq)%iqDescen(ifils) 409 DO l = 1, llm 410 DO ij = iip2 + 1, ip1jm 411 q(ij, l, iq2) = q(ij, l, iq) * Ratio(ij, l, iq2) 414 412 enddo 415 DO ij =iip1+iip1,ip1jm,iip1416 q(ij-iim,l,iq2)=q(ij,l,iq2)413 DO ij = iip1 + iip1, ip1jm, iip1 414 q(ij - iim, l, iq2) = q(ij, l, iq2) 417 415 enddo ! DO ij=ijb+iip1-1,ije,iip1 418 416 enddo !DO l=1,llm 419 417 enddo 420 418 421 422 419 END SUBROUTINE vlx 423 RECURSIVE SUBROUTINE vly(q, pente_max,masse,masse_adv_v,iq)424 USE infotrac, ONLY: nqtot, tracers, & ! CRisi425 min_qParent,min_qMass,min_ratio ! MVals et CRisi420 RECURSIVE SUBROUTINE vly(q, pente_max, masse, masse_adv_v, iq) 421 USE infotrac, ONLY: nqtot, tracers, & ! CRisi 422 min_qParent, min_qMass, min_ratio ! MVals et CRisi 426 423 ! 427 424 ! Auteurs: P.Le Van, F.Hourdin, F.Forget … … 445 442 ! Arguments: 446 443 ! ---------- 447 REAL :: masse(ip1jmp1, llm,nqtot),pente_max448 REAL :: masse_adv_v( ip1jm,llm)449 REAL :: q(ip1jmp1, llm,nqtot)444 REAL :: masse(ip1jmp1, llm, nqtot), pente_max 445 REAL :: masse_adv_v(ip1jm, llm) 446 REAL :: q(ip1jmp1, llm, nqtot) 450 447 INTEGER :: iq ! CRisi 451 448 ! … … 453 450 ! --------- 454 451 ! 455 INTEGER :: i, ij,l456 ! 457 REAL :: airej2, airejjm,airescb(iim),airesch(iim)458 REAL :: dyq(ip1jmp1, llm),dyqv(ip1jm)459 REAL :: adyqv(ip1jm), dyqmax(ip1jmp1)460 REAL :: qbyv(ip1jm, llm)461 462 REAL :: qpns, qpsn,dyn1,dys1,dyn2,dys2,newmasse,fn,fs452 INTEGER :: i, ij, l 453 ! 454 REAL :: airej2, airejjm, airescb(iim), airesch(iim) 455 REAL :: dyq(ip1jmp1, llm), dyqv(ip1jm) 456 REAL :: adyqv(ip1jm), dyqmax(ip1jmp1) 457 REAL :: qbyv(ip1jm, llm) 458 459 REAL :: qpns, qpsn, dyn1, dys1, dyn2, dys2, newmasse, fn, fs 463 460 LOGICAL, SAVE :: first 464 461 465 REAL :: convpn, convps,convmpn,convmps466 REAL :: massepn, masseps,qpn,qps467 REAL :: sinlon(iip1), sinlondlon(iip1)468 REAL :: coslon(iip1), coslondlon(iip1)469 SAVE sinlon, coslon,sinlondlon,coslondlon470 SAVE airej2, airejjm471 472 REAL :: masseq(ip1jmp1, llm,nqtot),Ratio(ip1jmp1,llm,nqtot) ! CRisi473 INTEGER :: ifils, iq2 ! CRisi462 REAL :: convpn, convps, convmpn, convmps 463 REAL :: massepn, masseps, qpn, qps 464 REAL :: sinlon(iip1), sinlondlon(iip1) 465 REAL :: coslon(iip1), coslondlon(iip1) 466 SAVE sinlon, coslon, sinlondlon, coslondlon 467 SAVE airej2, airejjm 468 469 REAL :: masseq(ip1jmp1, llm, nqtot), Ratio(ip1jmp1, llm, nqtot) ! CRisi 470 INTEGER :: ifils, iq2 ! CRisi 474 471 475 472 ! … … 482 479 483 480 IF(first) THEN 484 PRINT*,'Shema Amont nouveau appele dans Vanleer '485 first=.FALSE.486 do i=2,iip1487 coslon(i)=cos(rlonv(i))488 sinlon(i)=sin(rlonv(i))489 coslondlon(i)=coslon(i)*(rlonu(i)-rlonu(i-1))/pi490 sinlondlon(i)=sinlon(i)*(rlonu(i)-rlonu(i-1))/pi491 492 coslon(1)=coslon(iip1)493 coslondlon(1)=coslondlon(iip1)494 sinlon(1)=sinlon(iip1)495 sinlondlon(1)=sinlondlon(iip1)496 airej2 = SSUM( iim, aire(iip2), 1)497 airejjm= SSUM( iim, aire(ip1jm -iim), 1)481 PRINT*, 'Shema Amont nouveau appele dans Vanleer ' 482 first = .FALSE. 483 do i = 2, iip1 484 coslon(i) = cos(rlonv(i)) 485 sinlon(i) = sin(rlonv(i)) 486 coslondlon(i) = coslon(i) * (rlonu(i) - rlonu(i - 1)) / pi 487 sinlondlon(i) = sinlon(i) * (rlonu(i) - rlonu(i - 1)) / pi 488 ENDDO 489 coslon(1) = coslon(iip1) 490 coslondlon(1) = coslondlon(iip1) 491 sinlon(1) = sinlon(iip1) 492 sinlondlon(1) = sinlondlon(iip1) 493 airej2 = SSUM(iim, aire(iip2), 1) 494 airejjm = SSUM(iim, aire(ip1jm - iim), 1) 498 495 ENDIF 499 496 … … 502 499 503 500 DO l = 1, llm 504 !505 ! --------------------------------506 ! CALCUL EN LATITUDE507 ! --------------------------------508 509 ! On commence par calculer la valeur du traceur moyenne sur le premier cercle510 ! de latitude autour du pole (qpns pour le pole nord et qpsn pour511 ! le pole nord) qui sera utilisee pour evaluer les pentes au pole.512 513 DO i = 1, iim514 airescb(i) = aire(i+ iip1) * q(i+ iip1,l,iq)515 airesch(i) = aire(i+ ip1jm- iip1) * q(i+ ip1jm- iip1,l,iq)516 ENDDO517 qpns = SSUM( iim, airescb ,1) / airej2518 qpsn = SSUM( iim, airesch ,1) / airejjm519 520 ! calcul des pentes aux points v521 522 DO ij=1,ip1jm523 dyqv(ij)=q(ij,l,iq)-q(ij+iip1,l,iq)524 adyqv(ij)=abs(dyqv(ij))525 ENDDO526 527 ! calcul des pentes aux points scalaires528 529 DO ij=iip2,ip1jm530 dyq(ij,l)=.5*(dyqv(ij-iip1)+dyqv(ij))531 dyqmax(ij)=min(adyqv(ij-iip1),adyqv(ij))532 dyqmax(ij)=pente_max*dyqmax(ij)533 ENDDO534 535 ! calcul des pentes aux poles536 537 DO ij=1,iip1538 dyq(ij,l)=qpns-q(ij+iip1,l,iq)539 dyq(ip1jm+ij,l)=q(ip1jm+ij-iip1,l,iq)-qpsn540 ENDDO541 542 ! filtrage de la derivee543 dyn1=0.544 dys1=0.545 dyn2=0.546 dys2=0.547 DO ij=1,iim548 dyn1=dyn1+sinlondlon(ij)*dyq(ij,l)549 dys1=dys1+sinlondlon(ij)*dyq(ip1jm+ij,l)550 dyn2=dyn2+coslondlon(ij)*dyq(ij,l)551 dys2=dys2+coslondlon(ij)*dyq(ip1jm+ij,l)552 ENDDO553 DO ij=1,iip1554 dyq(ij,l)=dyn1*sinlon(ij)+dyn2*coslon(ij)555 dyq(ip1jm+ij,l)=dys1*sinlon(ij)+dys2*coslon(ij)556 ENDDO557 558 ! calcul des pentes limites aux poles559 560 goto 8888561 fn=1.562 fs=1.563 DO ij=1,iim564 IF(pente_max*adyqv(ij)<abs(dyq(ij,l))) THEN565 fn =min(pente_max*adyqv(ij)/abs(dyq(ij,l)),fn)566 ENDIF567 IF(pente_max*adyqv(ij+ip1jm-iip1)<abs(dyq(ij+ip1jm,l))) THEN568 fs=min(pente_max*adyqv(ij+ip1jm-iip1)/abs(dyq(ij+ip1jm,l)),fs)569 ENDIF570 ENDDO571 DO ij=1,iip1572 dyq(ij,l)=fn*dyq(ij,l)573 dyq(ip1jm+ij,l)=fs*dyq(ip1jm+ij,l)574 ENDDO575 8888 continue576 DO ij=1,iip1577 dyq(ij,l)=0.578 dyq(ip1jm+ij,l)=0.579 ENDDO580 581 !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC582 ! En memoire de dIFferents tests sur la583 ! limitation des pentes aux poles.584 !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC585 ! PRINT*,dyq(1)586 ! PRINT*,dyqv(iip1+1)587 ! appn=abs(dyq(1)/dyqv(iip1+1))588 ! PRINT*,dyq(ip1jm+1)589 ! PRINT*,dyqv(ip1jm-iip1+1)590 ! apps=abs(dyq(ip1jm+1)/dyqv(ip1jm-iip1+1))591 ! DO ij=2,iim592 ! appn=amax1(abs(dyq(ij)/dyqv(ij)),appn)593 ! apps=amax1(abs(dyq(ip1jm+ij)/dyqv(ip1jm-iip1+ij)),apps)594 ! ENDDO595 ! appn=min(pente_max/appn,1.)596 ! apps=min(pente_max/apps,1.)597 !598 !599 ! cas ou on a un extremum au pole600 !601 ! IF(dyqv(ismin(iim,dyqv,1))*dyqv(ismax(iim,dyqv,1)).le.0.)602 ! & appn=0.603 ! IF(dyqv(ismax(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1)*604 ! & dyqv(ismin(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1).le.0.)605 ! & apps=0.606 !607 ! limitation des pentes aux poles608 ! DO ij=1,iip1609 ! dyq(ij)=appn*dyq(ij)610 ! dyq(ip1jm+ij)=apps*dyq(ip1jm+ij)611 ! ENDDO612 !613 ! test614 ! DO ij=1,iip1615 ! dyq(iip1+ij)=0.616 ! dyq(ip1jm+ij-iip1)=0.617 ! ENDDO618 ! DO ij=1,ip1jmp1619 ! dyq(ij)=dyq(ij)*cos(rlatu((ij-1)/iip1+1))620 ! ENDDO621 !622 ! changement 10 07 96623 ! IF(dyqv(ismin(iim,dyqv,1))*dyqv(ismax(iim,dyqv,1)).le.0.)624 ! & THEN625 ! DO ij=1,iip1626 ! dyqmax(ij)=0.627 ! ENDDO628 ! ELSE629 ! DO ij=1,iip1630 ! dyqmax(ij)=pente_max*abs(dyqv(ij))631 ! ENDDO632 ! ENDIF633 !634 ! IF(dyqv(ismax(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1)*635 ! & dyqv(ismin(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1).le.0.)636 ! &THEN637 ! DO ij=ip1jm+1,ip1jmp1638 ! dyqmax(ij)=0.639 ! ENDDO640 ! ELSE641 ! DO ij=ip1jm+1,ip1jmp1642 ! dyqmax(ij)=pente_max*abs(dyqv(ij-iip1))643 ! ENDDO644 ! ENDIF645 ! fin changement 10 07 96646 !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC647 648 ! calcul des pentes limitees649 650 DO ij=iip2,ip1jm651 IF(dyqv(ij)*dyqv(ij-iip1)>0.) THEN652 dyq(ij, l)=sign(min(abs(dyq(ij,l)),dyqmax(ij)),dyq(ij,l))653 ELSE654 dyq(ij, l)=0.655 ENDIF656 ENDDO501 ! 502 ! -------------------------------- 503 ! CALCUL EN LATITUDE 504 ! -------------------------------- 505 506 ! On commence par calculer la valeur du traceur moyenne sur le premier cercle 507 ! de latitude autour du pole (qpns pour le pole nord et qpsn pour 508 ! le pole nord) qui sera utilisee pour evaluer les pentes au pole. 509 510 DO i = 1, iim 511 airescb(i) = aire(i + iip1) * q(i + iip1, l, iq) 512 airesch(i) = aire(i + ip1jm - iip1) * q(i + ip1jm - iip1, l, iq) 513 ENDDO 514 qpns = SSUM(iim, airescb, 1) / airej2 515 qpsn = SSUM(iim, airesch, 1) / airejjm 516 517 ! calcul des pentes aux points v 518 519 DO ij = 1, ip1jm 520 dyqv(ij) = q(ij, l, iq) - q(ij + iip1, l, iq) 521 adyqv(ij) = abs(dyqv(ij)) 522 ENDDO 523 524 ! calcul des pentes aux points scalaires 525 526 DO ij = iip2, ip1jm 527 dyq(ij, l) = .5 * (dyqv(ij - iip1) + dyqv(ij)) 528 dyqmax(ij) = min(adyqv(ij - iip1), adyqv(ij)) 529 dyqmax(ij) = pente_max * dyqmax(ij) 530 ENDDO 531 532 ! calcul des pentes aux poles 533 534 DO ij = 1, iip1 535 dyq(ij, l) = qpns - q(ij + iip1, l, iq) 536 dyq(ip1jm + ij, l) = q(ip1jm + ij - iip1, l, iq) - qpsn 537 ENDDO 538 539 ! filtrage de la derivee 540 dyn1 = 0. 541 dys1 = 0. 542 dyn2 = 0. 543 dys2 = 0. 544 DO ij = 1, iim 545 dyn1 = dyn1 + sinlondlon(ij) * dyq(ij, l) 546 dys1 = dys1 + sinlondlon(ij) * dyq(ip1jm + ij, l) 547 dyn2 = dyn2 + coslondlon(ij) * dyq(ij, l) 548 dys2 = dys2 + coslondlon(ij) * dyq(ip1jm + ij, l) 549 ENDDO 550 DO ij = 1, iip1 551 dyq(ij, l) = dyn1 * sinlon(ij) + dyn2 * coslon(ij) 552 dyq(ip1jm + ij, l) = dys1 * sinlon(ij) + dys2 * coslon(ij) 553 ENDDO 554 555 ! calcul des pentes limites aux poles 556 557 goto 8888 558 fn = 1. 559 fs = 1. 560 DO ij = 1, iim 561 IF(pente_max * adyqv(ij)<abs(dyq(ij, l))) THEN 562 fn = min(pente_max * adyqv(ij) / abs(dyq(ij, l)), fn) 563 ENDIF 564 IF(pente_max * adyqv(ij + ip1jm - iip1)<abs(dyq(ij + ip1jm, l))) THEN 565 fs = min(pente_max * adyqv(ij + ip1jm - iip1) / abs(dyq(ij + ip1jm, l)), fs) 566 ENDIF 567 ENDDO 568 DO ij = 1, iip1 569 dyq(ij, l) = fn * dyq(ij, l) 570 dyq(ip1jm + ij, l) = fs * dyq(ip1jm + ij, l) 571 ENDDO 572 8888 continue 573 DO ij = 1, iip1 574 dyq(ij, l) = 0. 575 dyq(ip1jm + ij, l) = 0. 576 ENDDO 577 578 !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 579 ! En memoire de dIFferents tests sur la 580 ! limitation des pentes aux poles. 581 !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 582 ! PRINT*,dyq(1) 583 ! PRINT*,dyqv(iip1+1) 584 ! appn=abs(dyq(1)/dyqv(iip1+1)) 585 ! PRINT*,dyq(ip1jm+1) 586 ! PRINT*,dyqv(ip1jm-iip1+1) 587 ! apps=abs(dyq(ip1jm+1)/dyqv(ip1jm-iip1+1)) 588 ! DO ij=2,iim 589 ! appn=amax1(abs(dyq(ij)/dyqv(ij)),appn) 590 ! apps=amax1(abs(dyq(ip1jm+ij)/dyqv(ip1jm-iip1+ij)),apps) 591 ! ENDDO 592 ! appn=min(pente_max/appn,1.) 593 ! apps=min(pente_max/apps,1.) 594 ! 595 ! 596 ! cas ou on a un extremum au pole 597 ! 598 ! IF(dyqv(ismin(iim,dyqv,1))*dyqv(ismax(iim,dyqv,1)).le.0.) 599 ! & appn=0. 600 ! IF(dyqv(ismax(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1)* 601 ! & dyqv(ismin(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1).le.0.) 602 ! & apps=0. 603 ! 604 ! limitation des pentes aux poles 605 ! DO ij=1,iip1 606 ! dyq(ij)=appn*dyq(ij) 607 ! dyq(ip1jm+ij)=apps*dyq(ip1jm+ij) 608 ! ENDDO 609 ! 610 ! test 611 ! DO ij=1,iip1 612 ! dyq(iip1+ij)=0. 613 ! dyq(ip1jm+ij-iip1)=0. 614 ! ENDDO 615 ! DO ij=1,ip1jmp1 616 ! dyq(ij)=dyq(ij)*cos(rlatu((ij-1)/iip1+1)) 617 ! ENDDO 618 ! 619 ! changement 10 07 96 620 ! IF(dyqv(ismin(iim,dyqv,1))*dyqv(ismax(iim,dyqv,1)).le.0.) 621 ! & THEN 622 ! DO ij=1,iip1 623 ! dyqmax(ij)=0. 624 ! ENDDO 625 ! ELSE 626 ! DO ij=1,iip1 627 ! dyqmax(ij)=pente_max*abs(dyqv(ij)) 628 ! ENDDO 629 ! ENDIF 630 ! 631 ! IF(dyqv(ismax(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1)* 632 ! & dyqv(ismin(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1).le.0.) 633 ! &THEN 634 ! DO ij=ip1jm+1,ip1jmp1 635 ! dyqmax(ij)=0. 636 ! ENDDO 637 ! ELSE 638 ! DO ij=ip1jm+1,ip1jmp1 639 ! dyqmax(ij)=pente_max*abs(dyqv(ij-iip1)) 640 ! ENDDO 641 ! ENDIF 642 ! fin changement 10 07 96 643 !CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 644 645 ! calcul des pentes limitees 646 647 DO ij = iip2, ip1jm 648 IF(dyqv(ij) * dyqv(ij - iip1)>0.) THEN 649 dyq(ij, l) = sign(min(abs(dyq(ij, l)), dyqmax(ij)), dyq(ij, l)) 650 ELSE 651 dyq(ij, l) = 0. 652 ENDIF 653 ENDDO 657 654 658 655 ENDDO 659 656 660 657 ! !WRITE(*,*) 'vly 756' 661 DO l =1,llm662 DO ij=1,ip1jm663 IF(masse_adv_v(ij, l)>0) THEN664 qbyv(ij,l)=q(ij+iip1,l,iq)+dyq(ij+iip1,l)* &665 0.5 *(1.-masse_adv_v(ij,l) &666 / masse(ij+iip1,l,iq))658 DO l = 1, llm 659 DO ij = 1, ip1jm 660 IF(masse_adv_v(ij, l)>0) THEN 661 qbyv(ij, l) = q(ij + iip1, l, iq) + dyq(ij + iip1, l) * & 662 0.5 * (1. - masse_adv_v(ij, l) & 663 / masse(ij + iip1, l, iq)) 667 664 ELSE 668 qbyv(ij,l)=q(ij,l,iq)-dyq(ij,l)* &669 0.5 *(1.+masse_adv_v(ij,l) &670 / masse(ij,l,iq))665 qbyv(ij, l) = q(ij, l, iq) - dyq(ij, l) * & 666 0.5 * (1. + masse_adv_v(ij, l) & 667 / masse(ij, l, iq)) 671 668 ENDIF 672 qbyv(ij, l)=masse_adv_v(ij,l)*qbyv(ij,l)673 ENDDO669 qbyv(ij, l) = masse_adv_v(ij, l) * qbyv(ij, l) 670 ENDDO 674 671 ENDDO 675 672 676 673 ! CRisi: appel récursif de l'advection sur les fils. 677 674 ! Il faut faire ça avant d'avoir mis à jour q et masse 678 679 680 do ifils =1,tracers(iq)%nqDescen681 iq2 =tracers(iq)%iqDescen(ifils)682 DO l =1,llm683 DO ij =1,ip1jmp1675 ! WRITE(*,*) 'vly 689: iq,nqDesc(iq)=',iq,tracers(iq)%nqDescen 676 677 do ifils = 1, tracers(iq)%nqDescen 678 iq2 = tracers(iq)%iqDescen(ifils) 679 DO l = 1, llm 680 DO ij = 1, ip1jmp1 684 681 ! ! attention, chaque fils doit avoir son masseq, sinon, le 1er 685 682 ! ! fils ecrase le masseq de ses freres. 686 683 ! !masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq) 687 ! !Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)684 ! !Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 688 685 ! !MVals: veiller a ce qu'on n'ait pas de denominateur nul 689 masseq(ij, l,iq2)=max(masse(ij,l,iq)*q(ij,l,iq),min_qMass)690 IF (q(ij, l,iq)>min_qParent) THEN691 Ratio(ij, l,iq2)=q(ij,l,iq2)/q(ij,l,iq)686 masseq(ij, l, iq2) = max(masse(ij, l, iq) * q(ij, l, iq), min_qMass) 687 IF (q(ij, l, iq)>min_qParent) THEN 688 Ratio(ij, l, iq2) = q(ij, l, iq2) / q(ij, l, iq) 692 689 else 693 Ratio(ij, l,iq2)=min_ratio690 Ratio(ij, l, iq2) = min_ratio 694 691 endif 695 692 enddo … … 697 694 enddo 698 695 699 do ifils =1,tracers(iq)%nqDescen700 iq2 =tracers(iq)%iqDescen(ifils)701 CALL vly(Ratio, pente_max,masseq,qbyv,iq2)702 enddo 703 704 DO l =1,llm705 DO ij=iip2,ip1jm706 newmasse=masse(ij,l,iq) &707 + masse_adv_v(ij,l)-masse_adv_v(ij-iip1,l)708 q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+qbyv(ij,l) &709 - qbyv(ij-iip1,l))/newmasse710 masse(ij,l,iq)=newmasse711 712 convpn=SSUM(iim,qbyv(1,l),1)713 convmpn=ssum(iim,masse_adv_v(1,l),1)714 massepn=ssum(iim,masse(1,l,iq),1)715 qpn=0.716 do ij=1,iim717 qpn=qpn+masse(ij,l,iq)*q(ij,l,iq)718 719 qpn=(qpn+convpn)/(massepn+convmpn)720 do ij=1,iip1721 q(ij,l,iq)=qpn722 723 convps=-SSUM(iim,qbyv(ip1jm-iim,l),1)724 convmps=-ssum(iim,masse_adv_v(ip1jm-iim,l),1)725 masseps=ssum(iim, masse(ip1jm+1,l,iq),1)726 qps=0.727 do ij = ip1jm+1,ip1jmp1-1728 qps=qps+masse(ij,l,iq)*q(ij,l,iq)729 730 qps=(qps+convps)/(masseps+convmps)731 do ij=ip1jm+1,ip1jmp1732 q(ij,l,iq)=qps733 696 do ifils = 1, tracers(iq)%nqDescen 697 iq2 = tracers(iq)%iqDescen(ifils) 698 CALL vly(Ratio, pente_max, masseq, qbyv, iq2) 699 enddo 700 701 DO l = 1, llm 702 DO ij = iip2, ip1jm 703 newmasse = masse(ij, l, iq) & 704 + masse_adv_v(ij, l) - masse_adv_v(ij - iip1, l) 705 q(ij, l, iq) = (q(ij, l, iq) * masse(ij, l, iq) + qbyv(ij, l) & 706 - qbyv(ij - iip1, l)) / newmasse 707 masse(ij, l, iq) = newmasse 708 ENDDO 709 convpn = SSUM(iim, qbyv(1, l), 1) 710 convmpn = ssum(iim, masse_adv_v(1, l), 1) 711 massepn = ssum(iim, masse(1, l, iq), 1) 712 qpn = 0. 713 do ij = 1, iim 714 qpn = qpn + masse(ij, l, iq) * q(ij, l, iq) 715 enddo 716 qpn = (qpn + convpn) / (massepn + convmpn) 717 do ij = 1, iip1 718 q(ij, l, iq) = qpn 719 enddo 720 convps = -SSUM(iim, qbyv(ip1jm - iim, l), 1) 721 convmps = -ssum(iim, masse_adv_v(ip1jm - iim, l), 1) 722 masseps = ssum(iim, masse(ip1jm + 1, l, iq), 1) 723 qps = 0. 724 do ij = ip1jm + 1, ip1jmp1 - 1 725 qps = qps + masse(ij, l, iq) * q(ij, l, iq) 726 enddo 727 qps = (qps + convps) / (masseps + convmps) 728 do ij = ip1jm + 1, ip1jmp1 729 q(ij, l, iq) = qps 730 enddo 734 731 ENDDO 735 732 736 733 ! retablir les fils en rapport de melange par rapport a l'air: 737 do ifils =1,tracers(iq)%nqDescen738 iq2 =tracers(iq)%iqDescen(ifils)739 DO l =1,llm740 DO ij =1,ip1jmp1741 q(ij, l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2)734 do ifils = 1, tracers(iq)%nqDescen 735 iq2 = tracers(iq)%iqDescen(ifils) 736 DO l = 1, llm 737 DO ij = 1, ip1jmp1 738 q(ij, l, iq2) = q(ij, l, iq) * Ratio(ij, l, iq2) 742 739 enddo 743 740 enddo … … 746 743 ! !WRITE(*,*) 'vly 853: sortie' 747 744 748 749 745 END SUBROUTINE vly 750 RECURSIVE SUBROUTINE vlz(q, pente_max,masse,w,iq)751 USE infotrac, ONLY: nqtot, tracers, & ! CRisi752 min_qParent,min_qMass,min_ratio ! MVals et CRisi746 RECURSIVE SUBROUTINE vlz(q, pente_max, masse, w, iq) 747 USE infotrac, ONLY: nqtot, tracers, & ! CRisi 748 min_qParent, min_qMass, min_ratio ! MVals et CRisi 753 749 ! 754 750 ! Auteurs: P.Le Van, F.Hourdin, F.Forget … … 768 764 ! Arguments: 769 765 ! ---------- 770 REAL :: masse(ip1jmp1, llm,nqtot),pente_max771 REAL :: q(ip1jmp1, llm,nqtot)772 REAL :: w(ip1jmp1, llm+1)766 REAL :: masse(ip1jmp1, llm, nqtot), pente_max 767 REAL :: q(ip1jmp1, llm, nqtot) 768 REAL :: w(ip1jmp1, llm + 1) 773 769 INTEGER :: iq 774 770 ! … … 776 772 ! --------- 777 773 ! 778 INTEGER :: ij, l779 ! 780 REAL :: wq(ip1jmp1, llm+1),newmasse781 782 REAL :: dzq(ip1jmp1, llm),dzqw(ip1jmp1,llm),adzqw(ip1jmp1,llm),dzqmax774 INTEGER :: ij, l 775 ! 776 REAL :: wq(ip1jmp1, llm + 1), newmasse 777 778 REAL :: dzq(ip1jmp1, llm), dzqw(ip1jmp1, llm), adzqw(ip1jmp1, llm), dzqmax 783 779 REAL :: sigw 784 780 785 REAL :: masseq(ip1jmp1, llm,nqtot),Ratio(ip1jmp1,llm,nqtot) ! CRisi786 INTEGER :: ifils, iq2 ! CRisi781 REAL :: masseq(ip1jmp1, llm, nqtot), Ratio(ip1jmp1, llm, nqtot) ! CRisi 782 INTEGER :: ifils, iq2 ! CRisi 787 783 788 784 #ifdef BIDON … … 795 791 ! On oriente tout dans le sens de la pression c'est a dire dans le 796 792 ! sens de W 797 DO l =2,llm798 DO ij=1,ip1jmp1799 dzqw(ij,l)=q(ij,l-1,iq)-q(ij,l,iq)800 adzqw(ij,l)=abs(dzqw(ij,l))801 802 ENDDO 803 804 DO l =2,llm-1805 DO ij=1,ip1jmp1806 IF(dzqw(ij,l)*dzqw(ij,l+1)>0.) THEN807 dzq(ij,l)=0.5*(dzqw(ij,l)+dzqw(ij,l+1))808 809 dzq(ij,l)=0.810 811 dzqmax=pente_max*min(adzqw(ij,l),adzqw(ij,l+1))812 dzq(ij,l)=sign(min(abs(dzq(ij,l)),dzqmax),dzq(ij,l))813 793 DO l = 2, llm 794 DO ij = 1, ip1jmp1 795 dzqw(ij, l) = q(ij, l - 1, iq) - q(ij, l, iq) 796 adzqw(ij, l) = abs(dzqw(ij, l)) 797 ENDDO 798 ENDDO 799 800 DO l = 2, llm - 1 801 DO ij = 1, ip1jmp1 802 IF(dzqw(ij, l) * dzqw(ij, l + 1)>0.) THEN 803 dzq(ij, l) = 0.5 * (dzqw(ij, l) + dzqw(ij, l + 1)) 804 ELSE 805 dzq(ij, l) = 0. 806 ENDIF 807 dzqmax = pente_max * min(adzqw(ij, l), adzqw(ij, l + 1)) 808 dzq(ij, l) = sign(min(abs(dzq(ij, l)), dzqmax), dzq(ij, l)) 809 ENDDO 814 810 ENDDO 815 811 816 812 ! !WRITE(*,*) 'vlz 954' 817 DO ij =1,ip1jmp1818 dzq(ij,1)=0.819 dzq(ij,llm)=0.813 DO ij = 1, ip1jmp1 814 dzq(ij, 1) = 0. 815 dzq(ij, llm) = 0. 820 816 ENDDO 821 817 … … 826 822 ! calcul de - d( q * w )/ d(sigma) qu'on ajoute a dq pour calculer dq 827 823 828 DO l = 1,llm-1829 do ij = 1,ip1jmp1830 IF(w(ij, l+1)>0.) THEN831 sigw=w(ij,l+1)/masse(ij,l+1,iq)832 wq(ij,l+1)=w(ij,l+1)*(q(ij,l+1,iq) &833 +0.5*(1.-sigw)*dzq(ij,l+1))824 DO l = 1, llm - 1 825 do ij = 1, ip1jmp1 826 IF(w(ij, l + 1)>0.) THEN 827 sigw = w(ij, l + 1) / masse(ij, l + 1, iq) 828 wq(ij, l + 1) = w(ij, l + 1) * (q(ij, l + 1, iq) & 829 + 0.5 * (1. - sigw) * dzq(ij, l + 1)) 834 830 ELSE 835 sigw=w(ij,l+1)/masse(ij,l,iq)836 wq(ij,l+1)=w(ij,l+1)*(q(ij,l,iq)-0.5*(1.+sigw)*dzq(ij,l))831 sigw = w(ij, l + 1) / masse(ij, l, iq) 832 wq(ij, l + 1) = w(ij, l + 1) * (q(ij, l, iq) - 0.5 * (1. + sigw) * dzq(ij, l)) 837 833 ENDIF 838 839 840 841 DO ij=1,ip1jmp1842 wq(ij,llm+1)=0.843 wq(ij,1)=0.844 834 ENDDO 835 ENDDO 836 837 DO ij = 1, ip1jmp1 838 wq(ij, llm + 1) = 0. 839 wq(ij, 1) = 0. 840 ENDDO 845 841 846 842 ! CRisi: appel récursif de l'advection sur les fils. 847 843 ! Il faut faire ça avant d'avoir mis à jour q et masse 848 844 ! !WRITE(*,*) 'vlsplt 942: iq,nqChildren(iq)=',iq,nqChildren(iq) 849 do ifils =1,tracers(iq)%nqDescen850 iq2 =tracers(iq)%iqDescen(ifils)851 DO l =1,llm852 DO ij =1,ip1jmp1845 do ifils = 1, tracers(iq)%nqDescen 846 iq2 = tracers(iq)%iqDescen(ifils) 847 DO l = 1, llm 848 DO ij = 1, ip1jmp1 853 849 ! !masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq) 854 ! !Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)850 ! !Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq) 855 851 ! !MVals: veiller a ce qu'on n'ait pas de denominateur nul 856 masseq(ij, l,iq2)=max(masse(ij,l,iq)*q(ij,l,iq),min_qMass)857 IF (q(ij, l,iq)>min_qParent) THEN858 Ratio(ij, l,iq2)=q(ij,l,iq2)/q(ij,l,iq)852 masseq(ij, l, iq2) = max(masse(ij, l, iq) * q(ij, l, iq), min_qMass) 853 IF (q(ij, l, iq)>min_qParent) THEN 854 Ratio(ij, l, iq2) = q(ij, l, iq2) / q(ij, l, iq) 859 855 else 860 Ratio(ij, l,iq2)=min_ratio856 Ratio(ij, l, iq2) = min_ratio 861 857 endif 862 858 enddo … … 864 860 enddo 865 861 866 do ifils =1,tracers(iq)%nqChildren867 iq2 =tracers(iq)%iqDescen(ifils)868 CALL vlz(Ratio, pente_max,masseq,wq,iq2)862 do ifils = 1, tracers(iq)%nqChildren 863 iq2 = tracers(iq)%iqDescen(ifils) 864 CALL vlz(Ratio, pente_max, masseq, wq, iq2) 869 865 enddo 870 866 ! end CRisi 871 867 872 DO l =1,llm873 DO ij=1,ip1jmp1874 newmasse=masse(ij,l,iq)+w(ij,l+1)-w(ij,l)875 q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+wq(ij,l+1)-wq(ij,l)) &876 / newmasse877 masse(ij,l,iq)=newmasse878 868 DO l = 1, llm 869 DO ij = 1, ip1jmp1 870 newmasse = masse(ij, l, iq) + w(ij, l + 1) - w(ij, l) 871 q(ij, l, iq) = (q(ij, l, iq) * masse(ij, l, iq) + wq(ij, l + 1) - wq(ij, l)) & 872 / newmasse 873 masse(ij, l, iq) = newmasse 874 ENDDO 879 875 ENDDO 880 876 881 877 ! retablir les fils en rapport de melange par rapport a l'air: 882 do ifils =1,tracers(iq)%nqDescen883 iq2 =tracers(iq)%iqDescen(ifils)884 DO l =1,llm885 DO ij =1,ip1jmp1886 q(ij, l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2)878 do ifils = 1, tracers(iq)%nqDescen 879 iq2 = tracers(iq)%iqDescen(ifils) 880 DO l = 1, llm 881 DO ij = 1, ip1jmp1 882 q(ij, l, iq2) = q(ij, l, iq) * Ratio(ij, l, iq2) 887 883 enddo 888 884 enddo 889 885 enddo 890 886 891 892 887 END SUBROUTINE vlz 893 888 894 SUBROUTINE minmaxq(zq, qmin,qmax,comment)889 SUBROUTINE minmaxq(zq, qmin, qmax, comment) 895 890 896 891 INCLUDE "dimensions.h" 897 892 INCLUDE "paramet.h" 898 893 899 CHARACTER(LEN =20) :: comment900 REAL :: qmin, qmax901 REAL :: zq(ip1jmp1, llm)902 REAL :: zzq(iip1, jjp1,llm)894 CHARACTER(LEN = 20) :: comment 895 REAL :: qmin, qmax 896 REAL :: zq(ip1jmp1, llm) 897 REAL :: zzq(iip1, jjp1, llm) 903 898 904 899 END SUBROUTINE minmaxq -
LMDZ6/branches/Amaury_dev/libf/dyn3d/vlspltqs.F90
r5117 r5119 26 26 USE comconst_mod, ONLY: cpp 27 27 USE logic_mod, ONLY: adv_qsat_liq 28 USE lmdz_ssum_scopy, ONLY: scopy 28 29 IMPLICIT NONE 29 30 ! … … 172 173 enddo 173 174 !WRITE(*,*) 'vlspltqs 183: fin de la routine' 174 175 175 176 176 END SUBROUTINE vlspltqs … … 505 505 ! CALL SCOPY((jjm-1)*llm,q(iip1+iip1,1),iip1,q(iip2,1),iip1) 506 506 ! CALL SCOPY((jjm-1)*llm,masse(iip1+iip1,1),iip1,masse(iip2,1),iip1) 507 508 507 509 508 END SUBROUTINE vlxqs … … 840 839 ! !WRITE(*,*) 'vly 879' 841 840 842 843 841 END SUBROUTINE vlyqs -
LMDZ6/branches/Amaury_dev/libf/dyn3d_common/com_io_dyn_mod.F90
r5116 r5119 29 29 INTEGER :: histuaveid 30 30 31 end modulecom_io_dyn_mod31 END MODULE com_io_dyn_mod -
LMDZ6/branches/Amaury_dev/libf/dyn3d_common/divgrad.f90
r5106 r5119 1 2 1 ! $Header$ 3 2 4 SUBROUTINE divgrad(klevel, h, lh, divgra)3 SUBROUTINE divgrad(klevel, h, lh, divgra) 5 4 USE lmdz_filtreg, ONLY: filtreg 5 USE lmdz_ssum_scopy, ONLY: scopy 6 6 IMPLICIT NONE 7 7 ! … … 27 27 ! 28 28 INTEGER :: klevel 29 REAL :: h( ip1jmp1,klevel ), divgra( ip1jmp1,klevel)29 REAL :: h(ip1jmp1, klevel), divgra(ip1jmp1, klevel) 30 30 ! 31 REAL :: ghy(ip1jm, llm), ghx(ip1jmp1,llm)31 REAL :: ghy(ip1jm, llm), ghx(ip1jmp1, llm) 32 32 33 INTEGER :: l, ij,iter,lh33 INTEGER :: l, ij, iter, lh 34 34 ! 35 35 ! 36 36 ! 37 CALL SCOPY ( ip1jmp1*klevel,h,1,divgra,1)37 CALL SCOPY (ip1jmp1 * klevel, h, 1, divgra, 1) 38 38 ! 39 DO iter = 1, lh39 DO iter = 1, lh 40 40 41 CALL filtreg ( divgra,jjp1,klevel,2,1,.TRUE.,1)41 CALL filtreg (divgra, jjp1, klevel, 2, 1, .TRUE., 1) 42 42 43 CALL grad (klevel,divgra, ghx , ghy)44 CALL diverg (klevel, ghx , ghy , divgra)43 CALL grad (klevel, divgra, ghx, ghy) 44 CALL diverg (klevel, ghx, ghy, divgra) 45 45 46 CALL filtreg ( divgra,jjp1,klevel,2,1,.TRUE.,1)46 CALL filtreg (divgra, jjp1, klevel, 2, 1, .TRUE., 1) 47 47 48 DO l = 1,klevel49 DO ij = 1, ip1jmp150 divgra( ij,l ) = - cdivh * divgra( ij,l)51 END DO52 END DO53 !48 DO l = 1, klevel 49 DO ij = 1, ip1jmp1 50 divgra(ij, l) = - cdivh * divgra(ij, l) 51 END DO 52 END DO 53 ! 54 54 END DO 55 55 RETURN -
LMDZ6/branches/Amaury_dev/libf/dyn3d_common/divgrad2.f90
r5106 r5119 1 2 1 ! $Header$ 3 2 4 SUBROUTINE divgrad2( klevel, h, deltapres, lh, divgra)3 SUBROUTINE divgrad2(klevel, h, deltapres, lh, divgra) 5 4 ! 6 5 ! P. Le Van … … 13 12 ! divgra est un argument de sortie pour le s-prg 14 13 ! 14 USE lmdz_ssum_scopy, ONLY: scopy 15 15 16 IMPLICIT NONE 16 17 ! … … 23 24 ! 24 25 INTEGER :: klevel 25 REAL :: h( ip1jmp1,klevel ), deltapres( ip1jmp1,klevel)26 REAL :: divgra( ip1jmp1,klevel)26 REAL :: h(ip1jmp1, klevel), deltapres(ip1jmp1, klevel) 27 REAL :: divgra(ip1jmp1, klevel) 27 28 ! 28 29 ! ....... variables locales .......... 29 30 ! 30 REAL :: signe, nudivgrs, sqrtps( ip1jmp1,llm)31 INTEGER :: l, ij,iter,lh31 REAL :: signe, nudivgrs, sqrtps(ip1jmp1, llm) 32 INTEGER :: l, ij, iter, lh 32 33 ! ................................................................... 33 34 34 35 ! 35 signe 36 signe = (-1.)**lh 36 37 nudivgrs = signe * cdivh 37 38 38 CALL SCOPY ( ip1jmp1 * klevel, h, 1, divgra, 1)39 CALL SCOPY (ip1jmp1 * klevel, h, 1, divgra, 1) 39 40 40 41 ! 41 CALL laplacien( klevel, divgra, divgra)42 CALL laplacien(klevel, divgra, divgra) 42 43 43 44 DO l = 1, klevel 44 DO ij = 1, ip1jmp145 sqrtps( ij,l ) = SQRT( deltapres(ij,l))46 ENDDO45 DO ij = 1, ip1jmp1 46 sqrtps(ij, l) = SQRT(deltapres(ij, l)) 47 ENDDO 47 48 ENDDO 48 49 ! 49 50 DO l = 1, klevel 50 51 DO ij = 1, ip1jmp1 51 divgra(ij,l) = divgra(ij,l) * sqrtps(ij,l)52 divgra(ij, l) = divgra(ij, l) * sqrtps(ij, l) 52 53 ENDDO 53 54 ENDDO … … 56 57 ! 57 58 DO iter = 1, lh - 2 58 CALL laplacien_gam ( klevel,cuvscvgam2,cvuscugam2,unsair_gam2, &59 unsapolnga2, unsapolsga2, divgra, divgra)59 CALL laplacien_gam (klevel, cuvscvgam2, cvuscugam2, unsair_gam2, & 60 unsapolnga2, unsapolsga2, divgra, divgra) 60 61 ENDDO 61 62 ! … … 64 65 DO l = 1, klevel 65 66 DO ij = 1, ip1jmp1 66 divgra(ij, l) = divgra(ij,l) * sqrtps(ij,l)67 divgra(ij, l) = divgra(ij, l) * sqrtps(ij, l) 67 68 ENDDO 68 69 ENDDO 69 70 ! 70 CALL laplacien ( klevel, divgra, divgra)71 CALL laplacien (klevel, divgra, divgra) 71 72 ! 72 DO l = 1,klevel73 DO ij = 1,ip1jmp174 divgra(ij,l) = nudivgrs * divgra(ij,l) / deltapres(ij,l)75 ENDDO73 DO l = 1, klevel 74 DO ij = 1, ip1jmp1 75 divgra(ij, l) = nudivgrs * divgra(ij, l) / deltapres(ij, l) 76 ENDDO 76 77 ENDDO 77 78 -
LMDZ6/branches/Amaury_dev/libf/dyn3d_common/exner_hyb_m.F90
r5117 r5119 3 3 IMPLICIT NONE 4 4 5 contains 5 CONTAINS 6 6 7 7 SUBROUTINE exner_hyb( ngrid, ps, p, pks, pk, pkf ) … … 145 145 END SUBROUTINE exner_hyb 146 146 147 end moduleexner_hyb_m147 END MODULE exner_hyb_m -
LMDZ6/branches/Amaury_dev/libf/dyn3d_common/exner_milieu_m.F90
r5117 r5119 3 3 IMPLICIT NONE 4 4 5 contains 5 CONTAINS 6 6 7 7 SUBROUTINE exner_milieu( ngrid, ps, p, pks, pk, pkf ) … … 124 124 END SUBROUTINE exner_milieu 125 125 126 end moduleexner_milieu_m126 END MODULE exner_milieu_m -
LMDZ6/branches/Amaury_dev/libf/dyn3d_common/fxhyp_m.F90
r5117 r5119 3 3 IMPLICIT NONE 4 4 5 contains 5 CONTAINS 6 6 7 7 SUBROUTINE fxhyp(xprimm025, rlonv, xprimv, rlonu, xprimu, xprimp025) … … 246 246 END SUBROUTINE fxhyp 247 247 248 end modulefxhyp_m248 END MODULE fxhyp_m -
LMDZ6/branches/Amaury_dev/libf/dyn3d_common/fyhyp_m.F90
r5117 r5119 3 3 IMPLICIT NONE 4 4 5 contains 5 CONTAINS 6 6 7 7 SUBROUTINE fyhyp(rlatu, yyprimu, rlatv, rlatu2, yprimu2, rlatu1, yprimu1) … … 338 338 END SUBROUTINE fyhyp 339 339 340 end modulefyhyp_m340 END MODULE fyhyp_m -
LMDZ6/branches/Amaury_dev/libf/dyn3d_common/gr_u_scal.f90
r5105 r5119 1 2 1 ! $Header$ 3 2 4 SUBROUTINE gr_u_scal(nx, x_u,x_scal)3 SUBROUTINE gr_u_scal(nx, x_u, x_scal) 5 4 !%W% %G% 6 5 !======================================================================= … … 25 24 ! 26 25 !======================================================================= 26 USE lmdz_ssum_scopy, ONLY: scopy 27 27 28 IMPLICIT NONE 28 29 !----------------------------------------------------------------------- … … 38 39 39 40 INTEGER :: nx 40 REAL :: x_u(ip1jmp1, nx),x_scal(ip1jmp1,nx)41 REAL :: x_u(ip1jmp1, nx), x_scal(ip1jmp1, nx) 41 42 42 43 ! Local: 43 44 ! ------ 44 45 45 INTEGER :: l, ij46 INTEGER :: l, ij 46 47 47 48 !----------------------------------------------------------------------- 48 49 49 DO l =1,nx50 DO ij=ip1jmp1,2,-151 x_scal(ij,l)= &52 (aireu(ij) *x_u(ij,l)+aireu(ij-1)*x_u(ij-1,l)) &53 /(aireu(ij)+aireu(ij-1))54 50 DO l = 1, nx 51 DO ij = ip1jmp1, 2, -1 52 x_scal(ij, l) = & 53 (aireu(ij) * x_u(ij, l) + aireu(ij - 1) * x_u(ij - 1, l)) & 54 / (aireu(ij) + aireu(ij - 1)) 55 ENDDO 55 56 ENDDO 56 57 57 CALL SCOPY(nx *jjp1,x_scal(iip1,1),iip1,x_scal(1,1),iip1)58 CALL SCOPY(nx * jjp1, x_scal(iip1, 1), iip1, x_scal(1, 1), iip1) 58 59 59 60 RETURN -
LMDZ6/branches/Amaury_dev/libf/dyn3d_common/gradiv.f90
r5106 r5119 1 2 1 ! $Header$ 3 2 4 SUBROUTINE gradiv(klevel, xcov, ycov, ld, gdx, gdy 3 SUBROUTINE gradiv(klevel, xcov, ycov, ld, gdx, gdy) 5 4 ! 6 5 ! Auteur : P. Le Van … … 18 17 ! 19 18 USE lmdz_filtreg, ONLY: filtreg 19 USE lmdz_ssum_scopy, ONLY: scopy 20 20 21 IMPLICIT NONE 21 22 ! … … 26 27 INTEGER :: klevel 27 28 ! 28 REAL :: xcov( ip1jmp1,klevel ), ycov( ip1jm,klevel)29 REAL :: gdx( ip1jmp1,klevel ), gdy( ip1jm,klevel)29 REAL :: xcov(ip1jmp1, klevel), ycov(ip1jm, klevel) 30 REAL :: gdx(ip1jmp1, klevel), gdy(ip1jm, klevel) 30 31 31 REAL :: div(ip1jmp1, llm)32 REAL :: div(ip1jmp1, llm) 32 33 33 INTEGER :: l, ij,iter,ld34 INTEGER :: l, ij, iter, ld 34 35 ! 35 36 ! 36 37 ! 37 CALL SCOPY( ip1jmp1*klevel,xcov,1,gdx,1)38 CALL SCOPY( ip1jm*klevel, ycov,1,gdy,1)38 CALL SCOPY(ip1jmp1 * klevel, xcov, 1, gdx, 1) 39 CALL SCOPY(ip1jm * klevel, ycov, 1, gdy, 1) 39 40 ! 40 DO iter = 1, ld41 !42 CALL diverg( klevel, gdx , gdy, div)43 CALL filtreg( div, jjp1, klevel, 2,1, .TRUE.,2)44 CALL grad( klevel, div, gdx, gdy)45 !46 DO l = 1, klevel47 DO ij = 1, ip1jmp148 gdx( ij,l ) = - gdx( ij,l) * cdivu49 END DO50 DO ij = 1, ip1jm51 gdy( ij,l ) = - gdy( ij,l) * cdivu52 END DO53 END DO54 !41 DO iter = 1, ld 42 ! 43 CALL diverg(klevel, gdx, gdy, div) 44 CALL filtreg(div, jjp1, klevel, 2, 1, .TRUE., 2) 45 CALL grad(klevel, div, gdx, gdy) 46 ! 47 DO l = 1, klevel 48 DO ij = 1, ip1jmp1 49 gdx(ij, l) = - gdx(ij, l) * cdivu 50 END DO 51 DO ij = 1, ip1jm 52 gdy(ij, l) = - gdy(ij, l) * cdivu 53 END DO 54 END DO 55 ! 55 56 END DO 56 57 RETURN -
LMDZ6/branches/Amaury_dev/libf/dyn3d_common/gradiv2.f90
r5106 r5119 1 2 1 ! $Header$ 3 2 4 SUBROUTINE gradiv2(klevel, xcov, ycov, ld, gdx, gdy 3 SUBROUTINE gradiv2(klevel, xcov, ycov, ld, gdx, gdy) 5 4 ! 6 5 ! P. Le Van … … 17 16 ! 18 17 USE lmdz_filtreg, ONLY: filtreg 18 USE lmdz_ssum_scopy, ONLY: scopy 19 19 20 IMPLICIT NONE 20 21 ! … … 27 28 28 29 INTEGER :: klevel 29 REAL :: xcov( ip1jmp1,klevel ), ycov( ip1jm,klevel)30 REAL :: gdx( ip1jmp1,klevel ), gdy( ip1jm,klevel)30 REAL :: xcov(ip1jmp1, klevel), ycov(ip1jm, klevel) 31 REAL :: gdx(ip1jmp1, klevel), gdy(ip1jm, klevel) 31 32 ! 32 33 ! ........ variables locales ......... 33 34 ! 34 REAL :: div(ip1jmp1, llm)35 REAL :: div(ip1jmp1, llm) 35 36 REAL :: signe, nugrads 36 INTEGER :: l, ij,iter,ld37 INTEGER :: l, ij, iter, ld 37 38 38 39 ! ........................................................ 39 40 ! 40 41 ! 41 CALL SCOPY( ip1jmp1 * klevel, xcov, 1, gdx, 1)42 CALL SCOPY( ip1jm * klevel, ycov, 1, gdy, 1)42 CALL SCOPY(ip1jmp1 * klevel, xcov, 1, gdx, 1) 43 CALL SCOPY(ip1jm * klevel, ycov, 1, gdy, 1) 43 44 ! 44 45 ! 45 signe 46 signe = (-1.)**ld 46 47 nugrads = signe * cdivu 47 48 ! 48 49 50 CALL divergf(klevel, gdx, gdy, div) 49 51 50 CALL divergf( klevel, gdx, gdy , div )52 IF(ld>1) THEN 51 53 52 IF( ld>1 ) THEN54 CALL laplacien (klevel, div, div) 53 55 54 CALL laplacien ( klevel, div, div )56 ! ...... Iteration de l'operateur laplacien_gam ....... 55 57 56 ! ...... Iteration de l'operateur laplacien_gam ....... 57 58 DO iter = 1, ld -2 59 CALL laplacien_gam ( klevel,cuvscvgam1,cvuscugam1,unsair_gam1, & 60 unsapolnga1, unsapolsga1, div, div ) 58 DO iter = 1, ld - 2 59 CALL laplacien_gam (klevel, cuvscvgam1, cvuscugam1, unsair_gam1, & 60 unsapolnga1, unsapolsga1, div, div) 61 61 ENDDO 62 62 63 63 ENDIF 64 64 65 66 CALL filtreg( div , jjp1, klevel, 2, 1, .TRUE., 1 ) 67 CALL grad ( klevel, div, gdx, gdy ) 65 CALL filtreg(div, jjp1, klevel, 2, 1, .TRUE., 1) 66 CALL grad (klevel, div, gdx, gdy) 68 67 69 68 ! 70 71 72 gdx( ij,l ) = gdx( ij,l) * nugrads73 74 75 gdy( ij,l ) = gdy( ij,l) * nugrads76 77 69 DO l = 1, klevel 70 DO ij = 1, ip1jmp1 71 gdx(ij, l) = gdx(ij, l) * nugrads 72 ENDDO 73 DO ij = 1, ip1jm 74 gdy(ij, l) = gdy(ij, l) * nugrads 75 ENDDO 76 ENDDO 78 77 ! 79 78 RETURN 80 79 END SUBROUTINE gradiv2 -
LMDZ6/branches/Amaury_dev/libf/dyn3d_common/inter_barxy_m.F90
r5117 r5119 10 10 public inter_barxy 11 11 12 contains 12 CONTAINS 13 13 14 14 SUBROUTINE inter_barxy(dlonid, dlatid, champ, rlonimod, rlatimod, champint) … … 448 448 END function ord_coordm 449 449 450 end moduleinter_barxy_m450 END MODULE inter_barxy_m -
LMDZ6/branches/Amaury_dev/libf/dyn3d_common/invert_zoom_x_m.F90
r5117 r5119 5 5 INTEGER, PARAMETER:: nmax = 30000 6 6 7 contains 7 CONTAINS 8 8 9 9 SUBROUTINE invert_zoom_x(xf, xtild, Xprimt, xlon, xprimm, xuv) … … 86 86 END SUBROUTINE invert_zoom_x 87 87 88 end moduleinvert_zoom_x_m88 END MODULE invert_zoom_x_m -
LMDZ6/branches/Amaury_dev/libf/dyn3d_common/laplacien.f90
r5106 r5119 1 2 1 ! $Header$ 3 2 4 SUBROUTINE laplacien( klevel, teta, divgra)3 SUBROUTINE laplacien(klevel, teta, divgra) 5 4 ! 6 5 ! P. Le Van … … 13 12 ! 14 13 USE lmdz_filtreg, ONLY: filtreg 14 USE lmdz_ssum_scopy, ONLY: scopy 15 15 16 IMPLICIT NONE 16 17 ! … … 23 24 ! 24 25 INTEGER :: klevel 25 REAL :: teta( ip1jmp1,klevel ), divgra( ip1jmp1,klevel)26 REAL :: teta(ip1jmp1, klevel), divgra(ip1jmp1, klevel) 26 27 ! 27 28 ! ............ variables locales .............. 28 29 ! 29 REAL :: ghy(ip1jm, llm), ghx(ip1jmp1,llm)30 REAL :: ghy(ip1jm, llm), ghx(ip1jmp1, llm) 30 31 ! ....................................................... 31 32 32 33 33 34 ! 34 CALL SCOPY ( ip1jmp1 * klevel, teta, 1, divgra, 1)35 CALL SCOPY (ip1jmp1 * klevel, teta, 1, divgra, 1) 35 36 36 CALL filtreg( divgra, jjp1, klevel, 2, 1, .TRUE., 1)37 CALL grad ( klevel,divgra, ghx , ghy)38 CALL divergf ( klevel, ghx , ghy , divgra)37 CALL filtreg(divgra, jjp1, klevel, 2, 1, .TRUE., 1) 38 CALL grad (klevel, divgra, ghx, ghy) 39 CALL divergf (klevel, ghx, ghy, divgra) 39 40 40 41 RETURN -
LMDZ6/branches/Amaury_dev/libf/dyn3d_common/laplacien_gam.f90
r5106 r5119 1 2 1 ! $Header$ 3 2 4 SUBROUTINE laplacien_gam( klevel, cuvsga, cvusga, unsaigam, &5 unsapolnga, unsapolsga, teta, divgra 3 SUBROUTINE laplacien_gam(klevel, cuvsga, cvusga, unsaigam, & 4 unsapolnga, unsapolsga, teta, divgra) 6 5 7 6 ! P. Le Van … … 14 13 ! divgra est un argument de sortie pour le s-prog 15 14 ! 15 USE lmdz_ssum_scopy, ONLY: scopy 16 16 17 IMPLICIT NONE 17 18 ! … … 24 25 ! 25 26 INTEGER :: klevel 26 REAL :: teta( ip1jmp1,klevel ), divgra( ip1jmp1,klevel)27 REAL :: cuvsga(ip1jm) , cvusga( ip1jmp1 ),unsaigam(ip1jmp1), &28 unsapolnga, unsapolsga27 REAL :: teta(ip1jmp1, klevel), divgra(ip1jmp1, klevel) 28 REAL :: cuvsga(ip1jm), cvusga(ip1jmp1), unsaigam(ip1jmp1), & 29 unsapolnga, unsapolsga 29 30 ! 30 31 ! ........... variables locales ................. 31 32 ! 32 REAL :: ghy(ip1jm, llm), ghx(ip1jmp1,llm)33 REAL :: ghy(ip1jm, llm), ghx(ip1jmp1, llm) 33 34 ! ...................................................... 34 35 … … 40 41 ! 41 42 42 CALL SCOPY ( ip1jmp1 * klevel, teta, 1, divgra, 1)43 CALL SCOPY (ip1jmp1 * klevel, teta, 1, divgra, 1) 43 44 ! 44 CALL grad ( klevel, divgra, ghx, ghy)45 CALL grad (klevel, divgra, ghx, ghy) 45 46 ! 46 CALL diverg_gam ( klevel, cuvsga, cvusga, unsaigam, &47 unsapolnga, unsapolsga, ghx , ghy , divgra)47 CALL diverg_gam (klevel, cuvsga, cvusga, unsaigam, & 48 unsapolnga, unsapolsga, ghx, ghy, divgra) 48 49 49 50 ! 50 51 51 52 52 RETURN 53 53 END SUBROUTINE laplacien_gam -
LMDZ6/branches/Amaury_dev/libf/dyn3d_common/misc_mod.F90
r5117 r5119 4 4 INTEGER,save :: ItCount 5 5 logical,save :: debug 6 end module misc_mod 6 END MODULE misc_mod -
LMDZ6/branches/Amaury_dev/libf/dyn3d_common/nxgraro2.f90
r5106 r5119 1 2 1 ! $Header$ 3 2 4 SUBROUTINE nxgraro2(klevel,xcov, ycov, lr, grx, gry)3 SUBROUTINE nxgraro2(klevel, xcov, ycov, lr, grx, gry) 5 4 ! 6 5 ! P.Le Van . … … 16 15 ! 17 16 USE lmdz_filtreg, ONLY: filtreg 17 USE lmdz_ssum_scopy, ONLY: scopy 18 18 19 IMPLICIT NONE 19 20 ! … … 25 26 ! 26 27 INTEGER :: klevel 27 REAL :: xcov( ip1jmp1,klevel ), ycov( ip1jm,klevel)28 REAL :: grx( ip1jmp1,klevel ), gry( ip1jm,klevel)28 REAL :: xcov(ip1jmp1, klevel), ycov(ip1jm, klevel) 29 REAL :: grx(ip1jmp1, klevel), gry(ip1jm, klevel) 29 30 ! 30 31 ! ...... variables locales ........ 31 32 ! 32 REAL :: rot(ip1jm, llm), signe, nugradrs33 INTEGER :: l, ij,iter,lr33 REAL :: rot(ip1jm, llm), signe, nugradrs 34 INTEGER :: l, ij, iter, lr 34 35 ! ........................................................ 35 36 ! 36 37 ! 37 38 ! 38 signe 39 signe = (-1.)**lr 39 40 nugradrs = signe * crot 40 41 ! 41 CALL SCOPY ( ip1jmp1* klevel, xcov, 1, grx, 1)42 CALL SCOPY ( ip1jm * klevel, ycov, 1, gry, 1)42 CALL SCOPY (ip1jmp1 * klevel, xcov, 1, grx, 1) 43 CALL SCOPY (ip1jm * klevel, ycov, 1, gry, 1) 43 44 ! 44 CALL rotatf ( klevel, grx, gry, rot)45 CALL rotatf (klevel, grx, gry, rot) 45 46 ! 46 CALL laplacien_rot ( klevel, rot, rot,grx,gry)47 CALL laplacien_rot (klevel, rot, rot, grx, gry) 47 48 48 49 ! 49 50 ! ..... Iteration de l'operateur laplacien_rotgam ..... 50 51 ! 51 DO iter = 1, lr - 252 CALL laplacien_rotgam ( klevel, rot, rot)52 DO iter = 1, lr - 2 53 CALL laplacien_rotgam (klevel, rot, rot) 53 54 ENDDO 54 55 ! 55 56 ! 56 CALL filtreg( rot, jjm, klevel, 2,1, .FALSE.,1)57 CALL nxgrad ( klevel, rot, grx, gry)57 CALL filtreg(rot, jjm, klevel, 2, 1, .FALSE., 1) 58 CALL nxgrad (klevel, rot, grx, gry) 58 59 ! 59 60 DO l = 1, klevel 60 61 gry( ij,l ) = gry( ij,l) * nugradrs62 63 64 grx( ij,l ) = grx( ij,l) * nugradrs65 61 DO ij = 1, ip1jm 62 gry(ij, l) = gry(ij, l) * nugradrs 63 ENDDO 64 DO ij = 1, ip1jmp1 65 grx(ij, l) = grx(ij, l) * nugradrs 66 ENDDO 66 67 ENDDO 67 68 ! -
LMDZ6/branches/Amaury_dev/libf/dyn3d_common/nxgrarot.f90
r5106 r5119 1 2 1 ! $Header$ 3 2 4 SUBROUTINE nxgrarot(klevel, xcov, ycov, lr, grx, gry)3 SUBROUTINE nxgrarot(klevel, xcov, ycov, lr, grx, gry) 5 4 ! *********************************************************** 6 5 ! … … 17 16 ! 18 17 USE lmdz_filtreg, ONLY: filtreg 18 USE lmdz_ssum_scopy, ONLY: scopy 19 19 20 IMPLICIT NONE 20 21 ! … … 25 26 ! 26 27 INTEGER :: klevel 27 REAL :: xcov( ip1jmp1,klevel ), ycov( ip1jm,klevel)28 REAL :: grx( ip1jmp1,klevel ), gry( ip1jm,klevel)28 REAL :: xcov(ip1jmp1, klevel), ycov(ip1jm, klevel) 29 REAL :: grx(ip1jmp1, klevel), gry(ip1jm, klevel) 29 30 ! 30 REAL :: rot(ip1jm, llm)31 REAL :: rot(ip1jm, llm) 31 32 32 INTEGER :: l, ij,iter,lr33 INTEGER :: l, ij, iter, lr 33 34 ! 34 35 ! 35 36 ! 36 CALL SCOPY ( ip1jmp1*klevel, xcov, 1, grx, 1)37 CALL SCOPY ( ip1jm*klevel, ycov, 1, gry, 1)37 CALL SCOPY (ip1jmp1 * klevel, xcov, 1, grx, 1) 38 CALL SCOPY (ip1jm * klevel, ycov, 1, gry, 1) 38 39 ! 39 DO iter = 1, lr40 CALL rotat (klevel,grx, gry, rot)41 CALL filtreg( rot, jjm, klevel, 2,1, .FALSE.,2)42 CALL nxgrad (klevel,rot, grx, gry)43 !44 DO l = 1, klevel45 DO ij = 1, ip1jm46 gry( ij,l ) = - gry( ij,l) * crot47 END DO48 DO ij = 1, ip1jmp149 grx( ij,l ) = - grx( ij,l) * crot50 END DO51 END DO52 !40 DO iter = 1, lr 41 CALL rotat (klevel, grx, gry, rot) 42 CALL filtreg(rot, jjm, klevel, 2, 1, .FALSE., 2) 43 CALL nxgrad (klevel, rot, grx, gry) 44 ! 45 DO l = 1, klevel 46 DO ij = 1, ip1jm 47 gry(ij, l) = - gry(ij, l) * crot 48 END DO 49 DO ij = 1, ip1jmp1 50 grx(ij, l) = - grx(ij, l) * crot 51 END DO 52 END DO 53 ! 53 54 END DO 54 55 RETURN -
LMDZ6/branches/Amaury_dev/libf/dyn3d_common/principal_cshift_m.F90
r5117 r5119 3 3 IMPLICIT NONE 4 4 5 contains 5 CONTAINS 6 6 7 7 SUBROUTINE principal_cshift(is2, xlon, xprimm) … … 41 41 END SUBROUTINE principal_cshift 42 42 43 end moduleprincipal_cshift_m43 END MODULE principal_cshift_m -
LMDZ6/branches/Amaury_dev/libf/dyn3d_common/sortvarc.f90
r5118 r5119 13 13 USE lmdz_filtreg, ONLY: filtreg 14 14 USE lmdz_iniprint, ONLY: lunout, prt_level 15 USE lmdz_ssum_scopy, ONLY: scopy 16 15 17 IMPLICIT NONE 16 18 -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/bands.F90
r5117 r5119 24 24 INTEGER,DIMENSION(:),ALLOCATABLE :: distrib_phys 25 25 26 contains26 CONTAINS 27 27 28 28 SUBROUTINE AllocateBands … … 483 483 END SUBROUTINE WriteBands 484 484 485 end moduleBands486 487 488 485 END MODULE Bands 486 487 488 -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/exner_hyb_loc_m.F90
r5117 r5119 3 3 IMPLICIT NONE 4 4 5 contains 5 CONTAINS 6 6 7 7 SUBROUTINE exner_hyb_loc(ngrid, ps, p, pks, pk, pkf) … … 196 196 END SUBROUTINE exner_hyb_loc 197 197 198 end moduleexner_hyb_loc_m198 END MODULE exner_hyb_loc_m -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/exner_milieu_loc_m.F90
r5117 r5119 3 3 IMPLICIT NONE 4 4 5 contains 5 CONTAINS 6 6 7 7 SUBROUTINE exner_milieu_loc( ngrid, ps, p, pks, pk, pkf ) … … 161 161 END SUBROUTINE exner_milieu_loc 162 162 163 end moduleexner_milieu_loc_m163 END MODULE exner_milieu_loc_m -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/mod_hallo.F90
r5117 r5119 65 65 END INTERFACE Register_SwapField2d_v 66 66 67 contains67 CONTAINS 68 68 69 69 SUBROUTINE Init_mod_hallo … … 1858 1858 END SUBROUTINE Scatter_field_v 1859 1859 1860 end module mod_Hallo 1861 1860 END MODULE mod_Hallo 1861 -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/parallel_lmdz.F90
r5118 r5119 76 76 TYPE(distrib), SAVE :: current_dist 77 77 78 contains 78 CONTAINS 79 79 80 80 SUBROUTINE init_parallel -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/times.F90
r5117 r5119 22 22 INTEGER, ALLOCATABLE,DIMENSION(:) :: timer_state 23 23 24 contains24 CONTAINS 25 25 26 26 SUBROUTINE init_timer … … 228 228 END FUNCTION DiffCpuTime 229 229 230 end moduletimes230 END MODULE times -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/write_field_loc.F90
r5117 r5119 10 10 end interface WriteField_v 11 11 12 contains12 CONTAINS 13 13 14 14 SUBROUTINE write_field1D_u(name,Field) … … 152 152 END SUBROUTINE write_field_v_gen 153 153 154 end modulewrite_field_loc154 END MODULE write_field_loc 155 155 -
LMDZ6/branches/Amaury_dev/libf/dyn3dmem/write_field_p.F90
r5117 r5119 6 6 end interface WriteField_p 7 7 8 contains8 CONTAINS 9 9 10 10 SUBROUTINE write_field1D_p(name,Field) … … 70 70 END SUBROUTINE write_field3D_p 71 71 72 end modulewrite_field_p72 END MODULE write_field_p 73 73 -
LMDZ6/branches/Amaury_dev/libf/dynphy_lonlat/calfis.f90
r5118 r5119 1 2 1 ! $Id$ 3 2 … … 36 35 USE comvert_mod, ONLY: preff, presnivs 37 36 USE lmdz_iniprint, ONLY: lunout, prt_level 37 USE lmdz_ssum_scopy, ONLY: scopy 38 38 39 39 IMPLICIT NONE … … 95 95 96 96 INTEGER :: ngridmx 97 PARAMETER( ngridmx = 2+(jjm-1)*iim - 1/jjm)97 PARAMETER(ngridmx = 2 + (jjm - 1) * iim - 1 / jjm) 98 98 99 99 include "comgeom2.h" … … 101 101 ! Arguments : 102 102 ! ----------- 103 LOGICAL, INTENT(IN) ::lafin ! .TRUE. for the very last CALL to physics104 REAL, INTENT(IN):: jD_cur, jH_cur105 REAL, INTENT(IN) :: pvcov(iip1,jjm,llm) ! covariant meridional velocity106 REAL, INTENT(IN) :: pucov(iip1,jjp1,llm) ! covariant zonal velocity107 REAL, INTENT(IN) :: pteta(iip1,jjp1,llm) ! potential temperature108 REAL, INTENT(IN) :: pmasse(iip1,jjp1,llm) ! mass in each cell ! not used109 REAL, INTENT(IN) :: pq(iip1,jjp1,llm,nqtot) ! tracers110 REAL, INTENT(IN) :: pphis(iip1,jjp1) ! surface geopotential111 REAL, INTENT(IN) :: pphi(iip1,jjp1,llm) ! geopotential112 113 REAL, INTENT(IN) :: pdvcov(iip1,jjm,llm) ! dynamical tendency on vcov114 REAL, INTENT(IN) :: pducov(iip1,jjp1,llm) ! dynamical tendency on ucov115 REAL, INTENT(IN) :: pdteta(iip1,jjp1,llm) ! dynamical tendency on teta103 LOGICAL, INTENT(IN) :: lafin ! .TRUE. for the very last CALL to physics 104 REAL, INTENT(IN) :: jD_cur, jH_cur 105 REAL, INTENT(IN) :: pvcov(iip1, jjm, llm) ! covariant meridional velocity 106 REAL, INTENT(IN) :: pucov(iip1, jjp1, llm) ! covariant zonal velocity 107 REAL, INTENT(IN) :: pteta(iip1, jjp1, llm) ! potential temperature 108 REAL, INTENT(IN) :: pmasse(iip1, jjp1, llm) ! mass in each cell ! not used 109 REAL, INTENT(IN) :: pq(iip1, jjp1, llm, nqtot) ! tracers 110 REAL, INTENT(IN) :: pphis(iip1, jjp1) ! surface geopotential 111 REAL, INTENT(IN) :: pphi(iip1, jjp1, llm) ! geopotential 112 113 REAL, INTENT(IN) :: pdvcov(iip1, jjm, llm) ! dynamical tendency on vcov 114 REAL, INTENT(IN) :: pducov(iip1, jjp1, llm) ! dynamical tendency on ucov 115 REAL, INTENT(IN) :: pdteta(iip1, jjp1, llm) ! dynamical tendency on teta 116 116 ! NB: pdteta is used only to compute pcvgt which is in fact not used... 117 REAL, INTENT(IN) :: pdq(iip1,jjp1,llm,nqtot) ! dynamical tendency on tracers117 REAL, INTENT(IN) :: pdq(iip1, jjp1, llm, nqtot) ! dynamical tendency on tracers 118 118 ! NB: pdq is only used to compute pcvgq which is in fact not used... 119 119 120 REAL, INTENT(IN) :: pps(iip1,jjp1) ! surface pressure (Pa)121 REAL, INTENT(IN) :: pp(iip1,jjp1,llmp1) ! pressure at mesh interfaces (Pa)122 REAL, INTENT(IN) :: ppk(iip1,jjp1,llm) ! Exner at mid-layer123 REAL, INTENT(IN) :: flxw(iip1,jjp1,llm) ! Vertical mass flux on lower mesh interfaces (kg/s) (on llm because flxw(:,:,llm+1)=0)120 REAL, INTENT(IN) :: pps(iip1, jjp1) ! surface pressure (Pa) 121 REAL, INTENT(IN) :: pp(iip1, jjp1, llmp1) ! pressure at mesh interfaces (Pa) 122 REAL, INTENT(IN) :: ppk(iip1, jjp1, llm) ! Exner at mid-layer 123 REAL, INTENT(IN) :: flxw(iip1, jjp1, llm) ! Vertical mass flux on lower mesh interfaces (kg/s) (on llm because flxw(:,:,llm+1)=0) 124 124 125 125 ! tendencies (in */s) from the physics 126 REAL, INTENT(OUT) :: pdvfi(iip1,jjm,llm) ! tendency on covariant meridional wind127 REAL, INTENT(OUT) :: pdufi(iip1,jjp1,llm) ! tendency on covariant zonal wind128 REAL, INTENT(OUT) :: pdhfi(iip1,jjp1,llm) ! tendency on potential temperature (K/s)129 REAL, INTENT(OUT) :: pdqfi(iip1,jjp1,llm,nqtot) ! tendency on tracers130 REAL, INTENT(OUT) :: pdpsfi(iip1,jjp1) ! tendency on surface pressure (Pa/s)126 REAL, INTENT(OUT) :: pdvfi(iip1, jjm, llm) ! tendency on covariant meridional wind 127 REAL, INTENT(OUT) :: pdufi(iip1, jjp1, llm) ! tendency on covariant zonal wind 128 REAL, INTENT(OUT) :: pdhfi(iip1, jjp1, llm) ! tendency on potential temperature (K/s) 129 REAL, INTENT(OUT) :: pdqfi(iip1, jjp1, llm, nqtot) ! tendency on tracers 130 REAL, INTENT(OUT) :: pdpsfi(iip1, jjp1) ! tendency on surface pressure (Pa/s) 131 131 132 132 … … 134 134 ! ----------------- 135 135 136 INTEGER :: i, j,l,ig0,ig,iq,itr136 INTEGER :: i, j, l, ig0, ig, iq, itr 137 137 REAL :: zpsrf(ngridmx) 138 REAL :: zplev(ngridmx, llm+1),zplay(ngridmx,llm)139 REAL :: zphi(ngridmx, llm),zphis(ngridmx)140 ! 141 REAL :: zrot(iip1, jjm,llm) ! AdlC May 2014142 REAL :: zufi(ngridmx, llm), zvfi(ngridmx,llm)143 REAL :: zrfi(ngridmx, llm) ! relative wind vorticity144 REAL :: ztfi(ngridmx, llm),zqfi(ngridmx,llm,nqtot)145 REAL :: zpk(ngridmx, llm)146 ! 147 REAL :: pcvgu(ngridmx, llm), pcvgv(ngridmx,llm)148 REAL :: pcvgt(ngridmx, llm), pcvgq(ngridmx,llm,2)149 ! 150 REAL :: zdufi(ngridmx, llm),zdvfi(ngridmx,llm)151 REAL :: zdtfi(ngridmx, llm),zdqfi(ngridmx,llm,nqtot)138 REAL :: zplev(ngridmx, llm + 1), zplay(ngridmx, llm) 139 REAL :: zphi(ngridmx, llm), zphis(ngridmx) 140 ! 141 REAL :: zrot(iip1, jjm, llm) ! AdlC May 2014 142 REAL :: zufi(ngridmx, llm), zvfi(ngridmx, llm) 143 REAL :: zrfi(ngridmx, llm) ! relative wind vorticity 144 REAL :: ztfi(ngridmx, llm), zqfi(ngridmx, llm, nqtot) 145 REAL :: zpk(ngridmx, llm) 146 ! 147 REAL :: pcvgu(ngridmx, llm), pcvgv(ngridmx, llm) 148 REAL :: pcvgt(ngridmx, llm), pcvgq(ngridmx, llm, 2) 149 ! 150 REAL :: zdufi(ngridmx, llm), zdvfi(ngridmx, llm) 151 REAL :: zdtfi(ngridmx, llm), zdqfi(ngridmx, llm, nqtot) 152 152 REAL :: zdpsrf(ngridmx) 153 153 ! 154 REAL :: zdufic(ngridmx, llm),zdvfic(ngridmx,llm)155 REAL :: zdtfic(ngridmx, llm),zdqfic(ngridmx,llm,nqtot)156 REAL :: jH_cur_split, zdt_split157 LOGICAL :: debut_split, lafin_split154 REAL :: zdufic(ngridmx, llm), zdvfic(ngridmx, llm) 155 REAL :: zdtfic(ngridmx, llm), zdqfic(ngridmx, llm, nqtot) 156 REAL :: jH_cur_split, zdt_split 157 LOGICAL :: debut_split, lafin_split 158 158 INTEGER :: isplit 159 159 160 REAL :: zsin(iim), zcos(iim),z1(iim)161 REAL :: zsinbis(iim), zcosbis(iim),z1bis(iim)160 REAL :: zsin(iim), zcos(iim), z1(iim) 161 REAL :: zsinbis(iim), zcosbis(iim), z1bis(iim) 162 162 REAL :: unskap, pksurcp 163 163 ! 164 REAL :: flxwfi(ngridmx, llm) ! Flux de masse verticale sur la grille physiq164 REAL :: flxwfi(ngridmx, llm) ! Flux de masse verticale sur la grille physiq 165 165 ! 166 166 167 167 REAL :: SSUM 168 168 169 LOGICAL, SAVE :: firstcal=.TRUE., debut=.TRUE.170 169 LOGICAL, SAVE :: firstcal = .TRUE., debut = .TRUE. 170 ! REAL rdayvrai 171 171 172 172 ! … … 177 177 ! 178 178 ! 179 IF ( firstcal) THEN179 IF (firstcal) THEN 180 180 debut = .TRUE. 181 IF (ngridmx/=2 +(jjm-1)*iim) THEN182 WRITE(lunout,*) 'STOP dans calfis'183 WRITE(lunout,*) &184 'La dimension ngridmx doit etre egale a 2 + (jjm-1)*iim'185 WRITE(lunout,*) ' ngridmx jjm iim '186 WRITE(lunout,*) ngridmx,jjm,iim187 CALL abort_gcm("calfis", "", 1)181 IF (ngridmx/=2 + (jjm - 1) * iim) THEN 182 WRITE(lunout, *) 'STOP dans calfis' 183 WRITE(lunout, *) & 184 'La dimension ngridmx doit etre egale a 2 + (jjm-1)*iim' 185 WRITE(lunout, *) ' ngridmx jjm iim ' 186 WRITE(lunout, *) ngridmx, jjm, iim 187 CALL abort_gcm("calfis", "", 1) 188 188 ENDIF 189 189 ELSE … … 200 200 ! ---------------------------------- 201 201 202 203 zpsrf(1) = pps(1,1) 204 205 ig0 = 2 206 DO j = 2,jjm 207 CALL SCOPY( iim,pps(1,j),1,zpsrf(ig0), 1 ) 208 ig0 = ig0+iim 209 ENDDO 210 211 zpsrf(ngridmx) = pps(1,jjp1) 202 zpsrf(1) = pps(1, 1) 203 204 ig0 = 2 205 DO j = 2, jjm 206 CALL SCOPY(iim, pps(1, j), 1, zpsrf(ig0), 1) 207 ig0 = ig0 + iim 208 ENDDO 209 210 zpsrf(ngridmx) = pps(1, jjp1) 212 211 213 212 … … 221 220 ! ... Exner = cp * ( p(l) / preff ) ** kappa .... 222 221 ! 223 unskap = 1./ kappa224 ! 225 DO l = 1, llm 226 zpk( 1,l ) = ppk(1,1,l)227 zplev( 1,l ) = pp(1,1,l)222 unskap = 1. / kappa 223 ! 224 DO l = 1, llm 225 zpk(1, l) = ppk(1, 1, l) 226 zplev(1, l) = pp(1, 1, l) 228 227 ig0 = 2 229 230 DO i =1, iim231 zpk( ig0,l ) = ppk(i,j,l)232 zplev( ig0,l ) = pp(i,j,l)233 ig0 = ig0 +1234 235 236 zpk( ngridmx,l ) = ppk(1,jjp1,l)237 zplev( ngridmx,l ) = pp(1,jjp1,l)238 ENDDO 239 zplev( 1,llmp1 ) = pp(1,1,llmp1)240 241 242 DO i =1, iim243 zplev( ig0,llmp1 ) = pp(i,j,llmp1)244 ig0 = ig0 +1245 246 247 zplev( ngridmx,llmp1 ) = pp(1,jjp1,llmp1)228 DO j = 2, jjm 229 DO i = 1, iim 230 zpk(ig0, l) = ppk(i, j, l) 231 zplev(ig0, l) = pp(i, j, l) 232 ig0 = ig0 + 1 233 ENDDO 234 ENDDO 235 zpk(ngridmx, l) = ppk(1, jjp1, l) 236 zplev(ngridmx, l) = pp(1, jjp1, l) 237 ENDDO 238 zplev(1, llmp1) = pp(1, 1, llmp1) 239 ig0 = 2 240 DO j = 2, jjm 241 DO i = 1, iim 242 zplev(ig0, llmp1) = pp(i, j, llmp1) 243 ig0 = ig0 + 1 244 ENDDO 245 ENDDO 246 zplev(ngridmx, llmp1) = pp(1, jjp1, llmp1) 248 247 ! 249 248 ! … … 252 251 ! --------------------------------------------------------------- 253 252 254 DO l =1,llm255 256 pksurcp = ppk(1,1,l) / cpp257 zplay(1,l) =preff * pksurcp ** unskap258 ztfi(1,l) = pteta(1,1,l) *pksurcp259 pcvgt(1,l) = pdteta(1,1,l) * pksurcp / pmasse(1,1,l)260 ig0= 2261 262 263 264 pksurcp = ppk(i,j,l) / cpp265 zplay(ig0,l)= preff * pksurcp ** unskap266 ztfi(ig0,l) = pteta(i,j,l)* pksurcp267 pcvgt(ig0,l) = pdteta(i,j,l) * pksurcp / pmasse(i,j,l)268 ig0= ig0 + 1269 270 271 272 pksurcp = ppk(1,jjp1,l) / cpp273 zplay(ig0,l)= preff * pksurcp ** unskap274 ztfi (ig0,l) = pteta(1,jjp1,l)* pksurcp275 pcvgt(ig0,l) = pdteta(1,jjp1,l) * pksurcp/ pmasse(1,jjp1,l)253 DO l = 1, llm 254 255 pksurcp = ppk(1, 1, l) / cpp 256 zplay(1, l) = preff * pksurcp ** unskap 257 ztfi(1, l) = pteta(1, 1, l) * pksurcp 258 pcvgt(1, l) = pdteta(1, 1, l) * pksurcp / pmasse(1, 1, l) 259 ig0 = 2 260 261 DO j = 2, jjm 262 DO i = 1, iim 263 pksurcp = ppk(i, j, l) / cpp 264 zplay(ig0, l) = preff * pksurcp ** unskap 265 ztfi(ig0, l) = pteta(i, j, l) * pksurcp 266 pcvgt(ig0, l) = pdteta(i, j, l) * pksurcp / pmasse(i, j, l) 267 ig0 = ig0 + 1 268 ENDDO 269 ENDDO 270 271 pksurcp = ppk(1, jjp1, l) / cpp 272 zplay(ig0, l) = preff * pksurcp ** unskap 273 ztfi (ig0, l) = pteta(1, jjp1, l) * pksurcp 274 pcvgt(ig0, l) = pdteta(1, jjp1, l) * pksurcp / pmasse(1, jjp1, l) 276 275 277 276 ENDDO … … 280 279 ! --------------- 281 280 ! 282 itr=0 283 DO iq=1,nqtot 284 IF(.NOT.tracers(iq)%isAdvected) CYCLE 285 itr = itr + 1 286 DO l=1,llm 287 zqfi(1,l,itr) = pq(1,1,l,iq) 288 ig0 = 2 289 DO j=2,jjm 290 DO i = 1, iim 291 zqfi(ig0,l,itr) = pq(i,j,l,iq) 292 ig0 = ig0 + 1 293 ENDDO 281 itr = 0 282 DO iq = 1, nqtot 283 IF(.NOT.tracers(iq)%isAdvected) CYCLE 284 itr = itr + 1 285 DO l = 1, llm 286 zqfi(1, l, itr) = pq(1, 1, l, iq) 287 ig0 = 2 288 DO j = 2, jjm 289 DO i = 1, iim 290 zqfi(ig0, l, itr) = pq(i, j, l, iq) 291 ig0 = ig0 + 1 294 292 ENDDO 295 zqfi(ig0,l,itr) = pq(1,jjp1,l,iq) 296 ENDDO 293 ENDDO 294 zqfi(ig0, l, itr) = pq(1, jjp1, l, iq) 295 ENDDO 297 296 ENDDO 298 297 299 298 ! convergence dynamique pour les traceurs "EAU" 300 299 ! Earth-specific treatment of first 2 tracers (water) 301 302 DO iq =1,2303 DO l=1,llm304 pcvgq(1, l,iq)= pdq(1,1,l,iq) / pmasse(1,1,l)305 ig0 306 DO j =2,jjm307 308 pcvgq(ig0,l,iq) = pdq(i,j,l,iq) / pmasse(i,j,l)309 ig0= ig0 + 1310 300 IF (planet_type=="earth") THEN 301 DO iq = 1, 2 302 DO l = 1, llm 303 pcvgq(1, l, iq) = pdq(1, 1, l, iq) / pmasse(1, 1, l) 304 ig0 = 2 305 DO j = 2, jjm 306 DO i = 1, iim 307 pcvgq(ig0, l, iq) = pdq(i, j, l, iq) / pmasse(i, j, l) 308 ig0 = ig0 + 1 309 ENDDO 311 310 ENDDO 312 pcvgq(ig0, l,iq)= pdq(1,jjp1,l,iq) / pmasse(1,jjp1,l)313 ENDDO314 ENDDO 315 311 pcvgq(ig0, l, iq) = pdq(1, jjp1, l, iq) / pmasse(1, jjp1, l) 312 ENDDO 313 ENDDO 314 endif ! of if (planet_type=="earth") 316 315 317 316 … … 319 318 ! ----------------------------------------------------- 320 319 321 CALL gr_dyn_fi(llm, iip1,jjp1,ngridmx,pphi,zphi)322 CALL gr_dyn_fi(1, iip1,jjp1,ngridmx,pphis,zphis)323 DO l =1,llm324 DO ig=1,ngridmx325 zphi(ig,l)=zphi(ig,l)-zphis(ig)326 320 CALL gr_dyn_fi(llm, iip1, jjp1, ngridmx, pphi, zphi) 321 CALL gr_dyn_fi(1, iip1, jjp1, ngridmx, pphis, zphis) 322 DO l = 1, llm 323 DO ig = 1, ngridmx 324 zphi(ig, l) = zphi(ig, l) - zphis(ig) 325 ENDDO 327 326 ENDDO 328 327 … … 330 329 ! JG : ancien calcule de omega utilise dans physiq.F. Maintenant le flux 331 330 ! de masse est calclue dans advtrac.F 332 333 334 335 336 337 338 339 331 ! DO l=1,llm 332 ! pvervel(1,l)=pw(1,1,l) * g /apoln 333 ! ig0=2 334 ! DO j=2,jjm 335 ! DO i = 1, iim 336 ! pvervel(ig0,l) = pw(i,j,l) * g * unsaire(i,j) 337 ! ig0 = ig0 + 1 338 ! ENDDO 340 339 ! ENDDO 341 342 340 ! pvervel(ig0,l)=pw(1,jjp1,l) * g /apols 341 ! ENDDO 343 342 344 343 ! … … 346 345 ! ------------ 347 346 348 DO l =1,llm349 350 DO j=2,jjm351 ig0 = 1+(j-2)*iim352 zufi(ig0+1,l)= 0.5 * &353 ( pucov(iim,j,l)/cu(iim,j) + pucov(1,j,l)/cu(1,j))354 pcvgu(ig0+1,l)= 0.5 * &355 ( pducov(iim,j,l)/cu(iim,j) + pducov(1,j,l)/cu(1,j))356 DO i=2,iim357 zufi(ig0+i,l)= 0.5 * &358 ( pucov(i-1,j,l)/cu(i-1,j) + pucov(i,j,l)/cu(i,j))359 pcvgu(ig0+i,l)= 0.5 * &360 ( pducov(i-1,j,l)/cu(i-1,j) + pducov(i,j,l)/cu(i,j))361 END DO362 END DO347 DO l = 1, llm 348 349 DO j = 2, jjm 350 ig0 = 1 + (j - 2) * iim 351 zufi(ig0 + 1, l) = 0.5 * & 352 (pucov(iim, j, l) / cu(iim, j) + pucov(1, j, l) / cu(1, j)) 353 pcvgu(ig0 + 1, l) = 0.5 * & 354 (pducov(iim, j, l) / cu(iim, j) + pducov(1, j, l) / cu(1, j)) 355 DO i = 2, iim 356 zufi(ig0 + i, l) = 0.5 * & 357 (pucov(i - 1, j, l) / cu(i - 1, j) + pucov(i, j, l) / cu(i, j)) 358 pcvgu(ig0 + i, l) = 0.5 * & 359 (pducov(i - 1, j, l) / cu(i - 1, j) + pducov(i, j, l) / cu(i, j)) 360 END DO 361 END DO 363 362 364 363 END DO … … 368 367 ! 46.1 Calcul de la vorticite et passage sur la grille physique 369 368 ! -------------------------------------------------------------- 370 DO l =1,llm371 do i =1,iim372 do j =1,jjm373 zrot(i, j,l) = (pvcov(i+1,j,l) - pvcov(i,j,l) &374 + pucov(i,j+1,l) - pucov(i,j,l)) &375 / (cu(i,j)+cu(i,j+1)) &376 / (cv(i+1,j)+cv(i,j)) *4369 DO l = 1, llm 370 do i = 1, iim 371 do j = 1, jjm 372 zrot(i, j, l) = (pvcov(i + 1, j, l) - pvcov(i, j, l) & 373 + pucov(i, j + 1, l) - pucov(i, j, l)) & 374 / (cu(i, j) + cu(i, j + 1)) & 375 / (cv(i + 1, j) + cv(i, j)) * 4 377 376 enddo 378 377 enddo … … 382 381 ! ----------- 383 382 384 DO l =1,llm385 DO j=2,jjm386 ig0=1+(j-2)*iim387 DO i=1,iim388 zvfi(ig0+i,l)= 0.5 * &389 ( pvcov(i,j-1,l)/cv(i,j-1) + pvcov(i,j,l)/cv(i,j))390 pcvgv(ig0+i,l)= 0.5 * &391 ( pdvcov(i,j-1,l)/cv(i,j-1) + pdvcov(i,j,l)/cv(i,j))392 393 zrfi(ig0 + 1,l)= 0.25 *(zrot(iim,j-1,l)+zrot(iim,j,l) &394 +zrot(1,j-1,l)+zrot(1,j,l))395 DO i=2,iim396 zrfi(ig0 + i,l)= 0.25 *(zrot(i-1,j-1,l)+zrot(i-1,j,l) &397 +zrot(i,j-1,l)+zrot(i,j,l)) ! AdlC MAY 2014398 399 383 DO l = 1, llm 384 DO j = 2, jjm 385 ig0 = 1 + (j - 2) * iim 386 DO i = 1, iim 387 zvfi(ig0 + i, l) = 0.5 * & 388 (pvcov(i, j - 1, l) / cv(i, j - 1) + pvcov(i, j, l) / cv(i, j)) 389 pcvgv(ig0 + i, l) = 0.5 * & 390 (pdvcov(i, j - 1, l) / cv(i, j - 1) + pdvcov(i, j, l) / cv(i, j)) 391 ENDDO 392 zrfi(ig0 + 1, l) = 0.25 * (zrot(iim, j - 1, l) + zrot(iim, j, l) & 393 + zrot(1, j - 1, l) + zrot(1, j, l)) 394 DO i = 2, iim 395 zrfi(ig0 + i, l) = 0.25 * (zrot(i - 1, j - 1, l) + zrot(i - 1, j, l) & 396 + zrot(i, j - 1, l) + zrot(i, j, l)) ! AdlC MAY 2014 397 ENDDO 398 ENDDO 400 399 ENDDO 401 400 … … 403 402 ! 47. champs de vents aux pole nord 404 403 ! ------------------------------ 405 406 407 408 DO l =1,llm409 410 z1(1) =(rlonu(1)-rlonu(iim)+2.*pi)*pvcov(1,1,l)/cv(1,1)411 z1bis(1)=(rlonu(1)-rlonu(iim)+2.*pi)*pdvcov(1,1,l)/cv(1,1)412 DO i=2,iim413 z1(i) =(rlonu(i)-rlonu(i-1))*pvcov(i,1,l)/cv(i,1)414 z1bis(i)=(rlonu(i)-rlonu(i-1))*pdvcov(i,1,l)/cv(i,1)415 416 417 DO i=1,iim418 zcos(i) = COS(rlonv(i))*z1(i)419 zcosbis(i)= COS(rlonv(i))*z1bis(i)420 zsin(i) = SIN(rlonv(i))*z1(i)421 zsinbis(i)= SIN(rlonv(i))*z1bis(i)422 423 424 zufi(1,l) = SSUM(iim,zcos,1)/pi425 pcvgu(1,l) = SSUM(iim,zcosbis,1)/pi426 zvfi(1,l) = SSUM(iim,zsin,1)/pi427 pcvgv(1,l) = SSUM(iim,zsinbis,1)/pi428 404 ! U = 1 / pi * integrale [ v * cos(long) * d long ] 405 ! V = 1 / pi * integrale [ v * sin(long) * d long ] 406 407 DO l = 1, llm 408 409 z1(1) = (rlonu(1) - rlonu(iim) + 2. * pi) * pvcov(1, 1, l) / cv(1, 1) 410 z1bis(1) = (rlonu(1) - rlonu(iim) + 2. * pi) * pdvcov(1, 1, l) / cv(1, 1) 411 DO i = 2, iim 412 z1(i) = (rlonu(i) - rlonu(i - 1)) * pvcov(i, 1, l) / cv(i, 1) 413 z1bis(i) = (rlonu(i) - rlonu(i - 1)) * pdvcov(i, 1, l) / cv(i, 1) 414 ENDDO 415 416 DO i = 1, iim 417 zcos(i) = COS(rlonv(i)) * z1(i) 418 zcosbis(i) = COS(rlonv(i)) * z1bis(i) 419 zsin(i) = SIN(rlonv(i)) * z1(i) 420 zsinbis(i) = SIN(rlonv(i)) * z1bis(i) 421 ENDDO 422 423 zufi(1, l) = SSUM(iim, zcos, 1) / pi 424 pcvgu(1, l) = SSUM(iim, zcosbis, 1) / pi 425 zvfi(1, l) = SSUM(iim, zsin, 1) / pi 426 pcvgv(1, l) = SSUM(iim, zsinbis, 1) / pi 427 zrfi(1, l) = 0. 429 428 ENDDO 430 429 … … 432 431 ! 48. champs de vents aux pole sud: 433 432 ! --------------------------------- 434 435 436 437 DO l =1,llm438 439 z1(1) =(rlonu(1)-rlonu(iim)+2.*pi)*pvcov(1,jjm,l)/cv(1,jjm)440 z1bis(1)=(rlonu(1)-rlonu(iim)+2.*pi)*pdvcov(1,jjm,l)/cv(1,jjm)441 DO i=2,iim442 z1(i) =(rlonu(i)-rlonu(i-1))*pvcov(i,jjm,l)/cv(i,jjm)443 z1bis(i)=(rlonu(i)-rlonu(i-1))*pdvcov(i,jjm,l)/cv(i,jjm)444 445 446 DO i=1,iim447 zcos(i) = COS(rlonv(i))*z1(i)448 zcosbis(i) = COS(rlonv(i))*z1bis(i)449 zsin(i) = SIN(rlonv(i))*z1(i)450 zsinbis(i) = SIN(rlonv(i))*z1bis(i)451 452 453 zufi(ngridmx,l) = SSUM(iim,zcos,1)/pi454 pcvgu(ngridmx,l) = SSUM(iim,zcosbis,1)/pi455 zvfi(ngridmx,l) = SSUM(iim,zsin,1)/pi456 pcvgv(ngridmx,l) = SSUM(iim,zsinbis,1)/pi457 433 ! U = 1 / pi * integrale [ v * cos(long) * d long ] 434 ! V = 1 / pi * integrale [ v * sin(long) * d long ] 435 436 DO l = 1, llm 437 438 z1(1) = (rlonu(1) - rlonu(iim) + 2. * pi) * pvcov(1, jjm, l) / cv(1, jjm) 439 z1bis(1) = (rlonu(1) - rlonu(iim) + 2. * pi) * pdvcov(1, jjm, l) / cv(1, jjm) 440 DO i = 2, iim 441 z1(i) = (rlonu(i) - rlonu(i - 1)) * pvcov(i, jjm, l) / cv(i, jjm) 442 z1bis(i) = (rlonu(i) - rlonu(i - 1)) * pdvcov(i, jjm, l) / cv(i, jjm) 443 ENDDO 444 445 DO i = 1, iim 446 zcos(i) = COS(rlonv(i)) * z1(i) 447 zcosbis(i) = COS(rlonv(i)) * z1bis(i) 448 zsin(i) = SIN(rlonv(i)) * z1(i) 449 zsinbis(i) = SIN(rlonv(i)) * z1bis(i) 450 ENDDO 451 452 zufi(ngridmx, l) = SSUM(iim, zcos, 1) / pi 453 pcvgu(ngridmx, l) = SSUM(iim, zcosbis, 1) / pi 454 zvfi(ngridmx, l) = SSUM(iim, zsin, 1) / pi 455 pcvgv(ngridmx, l) = SSUM(iim, zsinbis, 1) / pi 456 zrfi(ngridmx, l) = 0. 458 457 ENDDO 459 458 ! 460 459 ! On change de grille, dynamique vers physiq, pour le flux de masse verticale 461 CALL gr_dyn_fi(llm, iip1,jjp1,ngridmx,flxw,flxwfi)460 CALL gr_dyn_fi(llm, iip1, jjp1, ngridmx, flxw, flxwfi) 462 461 463 462 !----------------------------------------------------------------------- … … 467 466 468 467 469 470 zdt_split =dtphys/nsplit_phys471 zdufic(:, :)=0.472 zdvfic(:, :)=0.473 zdtfic(:, :)=0.474 zdqfic(:, :,:)=0.475 476 477 478 do isplit=1,nsplit_phys479 480 jH_cur_split=jH_cur+(isplit-1) * dtvr / (daysec *nsplit_phys)481 debut_split=debut.AND.isplit==1482 lafin_split=lafin.AND.isplit==nsplit_phys483 484 ! if (planet_type=="earth") THEN485 CALL call_physiq(ngridmx,llm,nqtot,tracers(:)%name, &486 debut_split,lafin_split, &487 jD_cur,jH_cur_split,zdt_split, &488 zplev,zplay, &489 zpk,zphi,zphis, &490 presnivs, &491 zufi,zvfi,zrfi,ztfi,zqfi, &492 flxwfi,pducov, &493 zdufi,zdvfi,zdtfi,zdqfi,zdpsrf)494 495 ! ELSE IF ( planet_type=="generic" ) THEN496 ! CALL physiq (ngridmx, !! ngrid497 ! . llm, !! nlayer498 ! . nqtot, !! nq499 ! . tracers(:)%name,!! tracer names from dynamical core (given in infotrac)500 ! . debut_split, !! firstcall501 ! . lafin_split, !! lastcall502 ! . jD_cur, !! pday. see leapfrog503 ! . jH_cur_split, !! ptime "fraction of day"504 ! . zdt_split, !! ptimestep505 ! . zplev, !! pplev506 ! . zplay, !! pplay507 ! . zphi, !! pphi508 ! . zufi, !! pu509 ! . zvfi, !! pv510 ! . ztfi, !! pt511 ! . zqfi, !! pq512 ! . flxwfi, !! pw !! or 0. anyway this is for diagnostic. not used in physiq.513 ! . zdufi, !! pdu514 ! . zdvfi, !! pdv515 ! . zdtfi, !! pdt516 ! . zdqfi, !! pdq517 ! . zdpsrf, !! pdpsrf518 ! . tracerdyn) !! tracerdyn <-- utilite ???519 520 ! ENDIF ! of if (planet_type=="earth")521 522 zufi(:,:)=zufi(:,:)+zdufi(:,:)*zdt_split523 zvfi(:,:)=zvfi(:,:)+zdvfi(:,:)*zdt_split524 ztfi(:,:)=ztfi(:,:)+zdtfi(:,:)*zdt_split525 zqfi(:,:,:)=zqfi(:,:,:)+zdqfi(:,:,:)*zdt_split526 527 zdufic(:,:)=zdufic(:,:)+zdufi(:,:)528 zdvfic(:,:)=zdvfic(:,:)+zdvfi(:,:)529 zdtfic(:,:)=zdtfic(:,:)+zdtfi(:,:)530 zdqfic(:,:,:)=zdqfic(:,:,:)+zdqfi(:,:,:)531 532 enddo ! of do isplit=1,nsplit_phys533 534 535 536 zdufi(:, :)=zdufic(:,:)/nsplit_phys537 zdvfi(:, :)=zdvfic(:,:)/nsplit_phys538 zdtfi(:, :)=zdtfic(:,:)/nsplit_phys539 zdqfi(:, :,:)=zdqfic(:,:,:)/nsplit_phys468 ! WRITE(lunout,*) 'PHYSIQUE AVEC NSPLIT_PHYS=',nsplit_phys 469 zdt_split = dtphys / nsplit_phys 470 zdufic(:, :) = 0. 471 zdvfic(:, :) = 0. 472 zdtfic(:, :) = 0. 473 zdqfic(:, :, :) = 0. 474 475 IF (CPPKEY_PHYS) THEN 476 477 do isplit = 1, nsplit_phys 478 479 jH_cur_split = jH_cur + (isplit - 1) * dtvr / (daysec * nsplit_phys) 480 debut_split = debut.AND.isplit==1 481 lafin_split = lafin.AND.isplit==nsplit_phys 482 483 ! if (planet_type=="earth") THEN 484 CALL call_physiq(ngridmx, llm, nqtot, tracers(:)%name, & 485 debut_split, lafin_split, & 486 jD_cur, jH_cur_split, zdt_split, & 487 zplev, zplay, & 488 zpk, zphi, zphis, & 489 presnivs, & 490 zufi, zvfi, zrfi, ztfi, zqfi, & 491 flxwfi, pducov, & 492 zdufi, zdvfi, zdtfi, zdqfi, zdpsrf) 493 494 ! ELSE IF ( planet_type=="generic" ) THEN 495 ! CALL physiq (ngridmx, !! ngrid 496 ! . llm, !! nlayer 497 ! . nqtot, !! nq 498 ! . tracers(:)%name,!! tracer names from dynamical core (given in infotrac) 499 ! . debut_split, !! firstcall 500 ! . lafin_split, !! lastcall 501 ! . jD_cur, !! pday. see leapfrog 502 ! . jH_cur_split, !! ptime "fraction of day" 503 ! . zdt_split, !! ptimestep 504 ! . zplev, !! pplev 505 ! . zplay, !! pplay 506 ! . zphi, !! pphi 507 ! . zufi, !! pu 508 ! . zvfi, !! pv 509 ! . ztfi, !! pt 510 ! . zqfi, !! pq 511 ! . flxwfi, !! pw !! or 0. anyway this is for diagnostic. not used in physiq. 512 ! . zdufi, !! pdu 513 ! . zdvfi, !! pdv 514 ! . zdtfi, !! pdt 515 ! . zdqfi, !! pdq 516 ! . zdpsrf, !! pdpsrf 517 ! . tracerdyn) !! tracerdyn <-- utilite ??? 518 519 ! ENDIF ! of if (planet_type=="earth") 520 521 zufi(:, :) = zufi(:, :) + zdufi(:, :) * zdt_split 522 zvfi(:, :) = zvfi(:, :) + zdvfi(:, :) * zdt_split 523 ztfi(:, :) = ztfi(:, :) + zdtfi(:, :) * zdt_split 524 zqfi(:, :, :) = zqfi(:, :, :) + zdqfi(:, :, :) * zdt_split 525 526 zdufic(:, :) = zdufic(:, :) + zdufi(:, :) 527 zdvfic(:, :) = zdvfic(:, :) + zdvfi(:, :) 528 zdtfic(:, :) = zdtfic(:, :) + zdtfi(:, :) 529 zdqfic(:, :, :) = zdqfic(:, :, :) + zdqfi(:, :, :) 530 531 enddo ! of do isplit=1,nsplit_phys 532 533 END IF 534 535 zdufi(:, :) = zdufic(:, :) / nsplit_phys 536 zdvfi(:, :) = zdvfic(:, :) / nsplit_phys 537 zdtfi(:, :) = zdtfic(:, :) / nsplit_phys 538 zdqfi(:, :, :) = zdqfic(:, :, :) / nsplit_phys 540 539 541 540 !----------------------------------------------------------------------- … … 546 545 ! ----------------------------------- 547 546 548 CALL gr_fi_dyn(1, ngridmx,iip1,jjp1,zdpsrf,pdpsfi)547 CALL gr_fi_dyn(1, ngridmx, iip1, jjp1, zdpsrf, pdpsfi) 549 548 ! 550 549 ! 62. enthalpie potentielle 551 550 ! --------------------- 552 551 553 DO l =1,llm554 555 DO i=1,iip1556 pdhfi(i, 1,l) = cpp * zdtfi(1,l) / ppk(i, 1 ,l)557 pdhfi(i, jjp1,l) = cpp * zdtfi(ngridmx,l)/ ppk(i,jjp1,l)558 559 560 DO j=2,jjm561 ig0=1+(j-2)*iim562 DO i=1,iim563 pdhfi(i,j,l) = cpp * zdtfi(ig0+i,l) / ppk(i,j,l)564 565 pdhfi(iip1,j,l) = pdhfi(1,j,l)566 552 DO l = 1, llm 553 554 DO i = 1, iip1 555 pdhfi(i, 1, l) = cpp * zdtfi(1, l) / ppk(i, 1, l) 556 pdhfi(i, jjp1, l) = cpp * zdtfi(ngridmx, l) / ppk(i, jjp1, l) 557 ENDDO 558 559 DO j = 2, jjm 560 ig0 = 1 + (j - 2) * iim 561 DO i = 1, iim 562 pdhfi(i, j, l) = cpp * zdtfi(ig0 + i, l) / ppk(i, j, l) 563 ENDDO 564 pdhfi(iip1, j, l) = pdhfi(1, j, l) 565 ENDDO 567 566 568 567 ENDDO … … 572 571 ! --------------------- 573 572 ! Ehouarn: removed this useless bit: was overwritten at step 63 anyways 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 573 ! DO iq=1,nqtot 574 ! DO l=1,llm 575 ! DO i=1,iip1 576 ! pdqfi(i,1,l,iq) = zdqfi(1,l,iq) 577 ! pdqfi(i,jjp1,l,iq) = zdqfi(ngridmx,l,iq) 578 ! ENDDO 579 ! DO j=2,jjm 580 ! ig0=1+(j-2)*iim 581 ! DO i=1,iim 582 ! pdqfi(i,j,l,iq) = zdqfi(ig0+i,l,iq) 583 ! ENDDO 584 ! pdqfi(iip1,j,l,iq) = pdqfi(1,j,l,iq) 585 ! ENDDO 586 ! ENDDO 587 ! ENDDO 589 588 590 589 ! 63. traceurs 591 590 ! ------------ 592 591 ! initialisation des tendances 593 pdqfi(:, :,:,:)=0.592 pdqfi(:, :, :, :) = 0. 594 593 ! 595 594 itr = 0 596 DO iq=1,nqtot 597 IF(.NOT.tracers(iq)%isAdvected) CYCLE 598 itr = itr + 1 599 DO l=1,llm 600 DO i=1,iip1 601 pdqfi(i,1,l,iq) = zdqfi(1,l,itr) 602 pdqfi(i,jjp1,l,iq) = zdqfi(ngridmx,l,itr) 595 DO iq = 1, nqtot 596 IF(.NOT.tracers(iq)%isAdvected) CYCLE 597 itr = itr + 1 598 DO l = 1, llm 599 DO i = 1, iip1 600 pdqfi(i, 1, l, iq) = zdqfi(1, l, itr) 601 pdqfi(i, jjp1, l, iq) = zdqfi(ngridmx, l, itr) 602 ENDDO 603 DO j = 2, jjm 604 ig0 = 1 + (j - 2) * iim 605 DO i = 1, iim 606 pdqfi(i, j, l, iq) = zdqfi(ig0 + i, l, itr) 603 607 ENDDO 604 DO j=2,jjm 605 ig0=1+(j-2)*iim 606 DO i=1,iim 607 pdqfi(i,j,l,iq) = zdqfi(ig0+i,l,itr) 608 ENDDO 609 pdqfi(iip1,j,l,iq) = pdqfi(1,j,l,itr) 610 ENDDO 611 ENDDO 608 pdqfi(iip1, j, l, iq) = pdqfi(1, j, l, itr) 609 ENDDO 610 ENDDO 612 611 ENDDO 613 612 … … 615 614 ! ------------ 616 615 617 DO l =1,llm618 619 DO i=1,iip1620 pdufi(i,1,l)= 0.621 pdufi(i,jjp1,l) = 0.622 623 624 DO j=2,jjm625 ig0=1+(j-2)*iim626 DO i=1,iim-1627 pdufi(i,j,l)= &628 0.5*(zdufi(ig0+i,l)+zdufi(ig0+i+1,l))*cu(i,j)629 630 pdufi(iim,j,l)= &631 0.5 *(zdufi(ig0+1,l)+zdufi(ig0+iim,l))*cu(iim,j)632 pdufi(iip1,j,l)=pdufi(1,j,l)633 616 DO l = 1, llm 617 618 DO i = 1, iip1 619 pdufi(i, 1, l) = 0. 620 pdufi(i, jjp1, l) = 0. 621 ENDDO 622 623 DO j = 2, jjm 624 ig0 = 1 + (j - 2) * iim 625 DO i = 1, iim - 1 626 pdufi(i, j, l) = & 627 0.5 * (zdufi(ig0 + i, l) + zdufi(ig0 + i + 1, l)) * cu(i, j) 628 ENDDO 629 pdufi(iim, j, l) = & 630 0.5 * (zdufi(ig0 + 1, l) + zdufi(ig0 + iim, l)) * cu(iim, j) 631 pdufi(iip1, j, l) = pdufi(1, j, l) 632 ENDDO 634 633 635 634 ENDDO … … 639 638 ! ------------ 640 639 641 DO l =1,llm642 643 DO j=2,jjm-1644 ig0=1+(j-2)*iim645 DO i=1,iim646 pdvfi(i,j,l)= &647 0.5*(zdvfi(ig0+i,l)+zdvfi(ig0+i+iim,l))*cv(i,j)648 649 pdvfi(iip1,j,l) = pdvfi(1,j,l)650 640 DO l = 1, llm 641 642 DO j = 2, jjm - 1 643 ig0 = 1 + (j - 2) * iim 644 DO i = 1, iim 645 pdvfi(i, j, l) = & 646 0.5 * (zdvfi(ig0 + i, l) + zdvfi(ig0 + i + iim, l)) * cv(i, j) 647 ENDDO 648 pdvfi(iip1, j, l) = pdvfi(1, j, l) 649 ENDDO 651 650 ENDDO 652 651 … … 654 653 ! 68. champ v pres des poles: 655 654 ! --------------------------- 656 657 658 DO l =1,llm659 660 DO i=1,iim661 pdvfi(i,1,l)= &662 zdufi(1, l)*COS(rlonv(i))+zdvfi(1,l)*SIN(rlonv(i))663 pdvfi(i,jjm,l)=zdufi(ngridmx,l)*COS(rlonv(i)) &664 + zdvfi(ngridmx,l)*SIN(rlonv(i))665 pdvfi(i,1,l)= &666 0.5 *(pdvfi(i,1,l)+zdvfi(i+1,l))*cv(i,1)667 pdvfi(i,jjm,l)= &668 0.5 *(pdvfi(i,jjm,l)+zdvfi(ngridmx-iip1+i,l))*cv(i,jjm)669 670 671 pdvfi(iip1,1,l) = pdvfi(1,1,l)672 pdvfi(iip1,jjm,l)= pdvfi(1,jjm,l)655 ! v = U * cos(long) + V * SIN(long) 656 657 DO l = 1, llm 658 659 DO i = 1, iim 660 pdvfi(i, 1, l) = & 661 zdufi(1, l) * COS(rlonv(i)) + zdvfi(1, l) * SIN(rlonv(i)) 662 pdvfi(i, jjm, l) = zdufi(ngridmx, l) * COS(rlonv(i)) & 663 + zdvfi(ngridmx, l) * SIN(rlonv(i)) 664 pdvfi(i, 1, l) = & 665 0.5 * (pdvfi(i, 1, l) + zdvfi(i + 1, l)) * cv(i, 1) 666 pdvfi(i, jjm, l) = & 667 0.5 * (pdvfi(i, jjm, l) + zdvfi(ngridmx - iip1 + i, l)) * cv(i, jjm) 668 ENDDO 669 670 pdvfi(iip1, 1, l) = pdvfi(1, 1, l) 671 pdvfi(iip1, jjm, l) = pdvfi(1, jjm, l) 673 672 674 673 ENDDO -
LMDZ6/branches/Amaury_dev/libf/dynphy_lonlat/gr_dyn_fi.f90
r5116 r5119 1 2 1 ! $Header$ 3 2 4 SUBROUTINE gr_dyn_fi(nfield,im,jm,ngrid,pdyn,pfi) 3 SUBROUTINE gr_dyn_fi(nfield, im, jm, ngrid, pdyn, pfi) 4 USE lmdz_ssum_scopy, ONLY: scopy 5 5 6 IMPLICIT NONE 6 7 !======================================================================= … … 12 13 ! ------------- 13 14 14 INTEGER :: im, jm,ngrid,nfield15 REAL :: pdyn(im, jm,nfield)16 REAL :: pfi(ngrid, nfield)15 INTEGER :: im, jm, ngrid, nfield 16 REAL :: pdyn(im, jm, nfield) 17 REAL :: pfi(ngrid, nfield) 17 18 18 INTEGER :: j, ifield,ig19 INTEGER :: j, ifield, ig 19 20 20 21 !----------------------------------------------------------------------- … … 22 23 ! ------- 23 24 24 IF (ngrid/=2 +(jm-2)*(im-1)) THEN25 25 IF (ngrid/=2 + (jm - 2) * (im - 1)) THEN 26 CALL abort_gcm("gr_dyn_fi", 'probleme de dim', 1) 26 27 end if 27 28 ! traitement des poles 28 CALL SCOPY(nfield, pdyn,im*jm,pfi,ngrid)29 CALL SCOPY(nfield, pdyn(1,jm,1),im*jm,pfi(ngrid,1),ngrid)29 CALL SCOPY(nfield, pdyn, im * jm, pfi, ngrid) 30 CALL SCOPY(nfield, pdyn(1, jm, 1), im * jm, pfi(ngrid, 1), ngrid) 30 31 31 32 ! traitement des point normaux 32 DO ifield =1,nfield33 DO j=2,jm-134 ig=2+(j-2)*(im-1)35 CALL SCOPY(im-1,pdyn(1,j,ifield),1,pfi(ig,ifield),1)36 33 DO ifield = 1, nfield 34 DO j = 2, jm - 1 35 ig = 2 + (j - 2) * (im - 1) 36 CALL SCOPY(im - 1, pdyn(1, j, ifield), 1, pfi(ig, ifield), 1) 37 ENDDO 37 38 ENDDO 38 39 -
LMDZ6/branches/Amaury_dev/libf/dynphy_lonlat/gr_fi_dyn.f90
r5105 r5119 1 2 1 ! $Header$ 3 2 4 SUBROUTINE gr_fi_dyn(nfield,ngrid,im,jm,pfi,pdyn) 3 SUBROUTINE gr_fi_dyn(nfield, ngrid, im, jm, pfi, pdyn) 4 USE lmdz_ssum_scopy, ONLY: scopy 5 5 6 IMPLICIT NONE 6 7 !======================================================================= … … 12 13 ! ------------- 13 14 14 INTEGER :: im, jm,ngrid,nfield15 REAL :: pdyn(im, jm,nfield)16 REAL :: pfi(ngrid, nfield)15 INTEGER :: im, jm, ngrid, nfield 16 REAL :: pdyn(im, jm, nfield) 17 REAL :: pfi(ngrid, nfield) 17 18 18 INTEGER :: i, j,ifield,ig19 INTEGER :: i, j, ifield, ig 19 20 20 21 !----------------------------------------------------------------------- … … 22 23 ! ------- 23 24 24 DO ifield =1,nfield25 ! traitement des poles26 DO i=1,im27 pdyn(i,1,ifield)=pfi(1,ifield)28 pdyn(i,jm,ifield)=pfi(ngrid,ifield)29 25 DO ifield = 1, nfield 26 ! traitement des poles 27 DO i = 1, im 28 pdyn(i, 1, ifield) = pfi(1, ifield) 29 pdyn(i, jm, ifield) = pfi(ngrid, ifield) 30 ENDDO 30 31 31 ! traitement des point normaux32 DO j=2,jm-133 ig=2+(j-2)*(im-1)34 CALL SCOPY(im-1,pfi(ig,ifield),1,pdyn(1,j,ifield),1)35 pdyn(im,j,ifield)=pdyn(1,j,ifield)36 32 ! traitement des point normaux 33 DO j = 2, jm - 1 34 ig = 2 + (j - 2) * (im - 1) 35 CALL SCOPY(im - 1, pfi(ig, ifield), 1, pdyn(1, j, ifield), 1) 36 pdyn(im, j, ifield) = pdyn(1, j, ifield) 37 ENDDO 37 38 ENDDO 38 39 -
LMDZ6/branches/Amaury_dev/libf/dynphy_lonlat/phylmd/test_disvert_m.F90
r5117 r5119 3 3 IMPLICIT NONE 4 4 5 contains 5 CONTAINS 6 6 7 7 SUBROUTINE test_disvert … … 65 65 END SUBROUTINE test_disvert 66 66 67 end moduletest_disvert_m67 END MODULE test_disvert_m -
LMDZ6/branches/Amaury_dev/libf/misc/lmdz_TO_MOVE_ssum_scopy.f90
r5117 r5119 3 3 ! Those are old legacy CRAY replacement functions, that are now used in several parts of the code. 4 4 5 SUBROUTINE scopy(n, sx, incx, sy, incy) 5 MODULE lmdz_ssum_scopy 6 IMPLICIT NONE; PRIVATE 7 PUBLIC ssum, scopy 8 CONTAINS 6 9 7 IMPLICIT NONE10 SUBROUTINE scopy(n, sx, incx, sy, incy) 8 11 9 INTEGER n, incx, incy, ix, iy, i 10 REAL sx((n - 1) * incx + 1), sy((n - 1) * incy + 1) 12 IMPLICIT NONE 11 13 12 iy = 1 13 ix = 1 14 DO i = 1, n 15 sy(iy) = sx(ix) 16 ix = ix + incx 17 iy = iy + incy 18 END DO 14 INTEGER n, incx, incy, ix, iy, i 15 REAL sx((n - 1) * incx + 1), sy((n - 1) * incy + 1) 19 16 20 end 17 iy = 1 18 ix = 1 19 DO i = 1, n 20 sy(iy) = sx(ix) 21 ix = ix + incx 22 iy = iy + incy 23 END DO 21 24 22 function ssum(n, sx, incx) 25 end 23 26 24 IMPLICIT NONE27 function ssum(n, sx, incx) 25 28 26 INTEGER n, incx, i, ix 27 REAL ssum, sx((n - 1) * incx + 1) 29 IMPLICIT NONE 28 30 29 ssum = 0. 30 ix = 1 31 do i = 1, n 32 ssum = ssum + sx(ix) 33 ix = ix + incx 34 END DO 31 INTEGER n, incx, i, ix 32 REAL ssum, sx((n - 1) * incx + 1) 35 33 36 end 34 ssum = 0. 35 ix = 1 36 do i = 1, n 37 ssum = ssum + sx(ix) 38 ix = ix + incx 39 END DO 37 40 41 end 42 43 END MODULE lmdz_ssum_scopy -
LMDZ6/branches/Amaury_dev/libf/misc/lmdz_assert.f90
r5117 r5119 2 2 MODULE lmdz_assert 3 3 4 IMPLICIT NONE 5 4 IMPLICIT NONE; PRIVATE 5 PUBLIC assert 6 6 INTERFACE assert 7 7 MODULE PROCEDURE assert1, assert2, assert3, assert4, assert_v 8 8 END INTERFACE 9 10 PRIVATE assert1, assert2, assert3, assert4, assert_v11 9 12 10 CONTAINS -
LMDZ6/branches/Amaury_dev/libf/misc/lmdz_assert_eq.f90
r5117 r5119 1 1 MODULE lmdz_assert_eq 2 2 3 IMPLICIT NONE 3 IMPLICIT NONE; PRIVATE 4 PUBLIC assert_eq 4 5 5 6 INTERFACE assert_eq 6 7 MODULE PROCEDURE assert_eq2, assert_eq3, assert_eq4, assert_eqn 7 8 END INTERFACE 8 9 PRIVATE assert_eq2, assert_eq3, assert_eq4, assert_eqn10 9 11 10 CONTAINS -
LMDZ6/branches/Amaury_dev/libf/misc/lmdz_coefpoly.f90
r5117 r5119 4 4 PUBLIC coefpoly 5 5 6 contains 6 CONTAINS 7 7 8 8 SUBROUTINE coefpoly(xf1, xf2, xprim1, xprim2, xtild1, xtild2, a0, a1, a2, a3) … … 51 51 END SUBROUTINE coefpoly 52 52 53 end modulelmdz_coefpoly53 END MODULE lmdz_coefpoly -
LMDZ6/branches/Amaury_dev/libf/misc/lmdz_interpolation.f90
r5117 r5119 8 8 PUBLIC locate, hunt 9 9 10 contains 10 CONTAINS 11 11 12 12 pure FUNCTION locate(xx, x) … … 137 137 END SUBROUTINE hunt 138 138 139 end modulelmdz_interpolation139 END MODULE lmdz_interpolation -
LMDZ6/branches/Amaury_dev/libf/misc/lmdz_mpi_wrappers.F90
r5103 r5119 14 14 15 15 SUBROUTINE MPI_ALLGATHER(SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNT, RECVTYPE, COMM, IERROR) 16 USE ISO_C_BINDING 16 USE ISO_C_BINDING, ONLY: C_PTR 17 17 IMPLICIT NONE 18 18 TYPE(C_PTR),VALUE :: SENDBUF , RECVBUF … … 41 41 42 42 SUBROUTINE MPI_ISEND(BUF, COUNT, DATATYPE, DEST, TAG, COMM, REQUEST, IERROR) 43 USE ISO_C_BINDING 43 USE ISO_C_BINDING, ONLY: C_PTR 44 44 IMPLICIT NONE 45 45 TYPE(C_PTR),VALUE :: BUF … … 50 50 51 51 SUBROUTINE MPI_ISSEND(BUF, COUNT, DATATYPE, DEST, TAG, COMM, REQUEST, IERROR) 52 USE ISO_C_BINDING 52 USE ISO_C_BINDING, ONLY: C_PTR 53 53 IMPLICIT NONE 54 54 TYPE(C_PTR),VALUE :: BUF … … 58 58 59 59 SUBROUTINE MPI_IRECV(BUF, COUNT, DATATYPE, SOURCE, TAG, COMM, REQUEST, IERROR) 60 USE ISO_C_BINDING 60 USE ISO_C_BINDING, ONLY: C_PTR 61 61 IMPLICIT NONE 62 62 TYPE(C_PTR),VALUE :: BUF … … 74 74 75 75 SUBROUTINE MPI_GATHERV(SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNTS, DISPLS, RECVTYPE, ROOT, COMM, IERROR) 76 USE ISO_C_BINDING 76 USE ISO_C_BINDING, ONLY: C_PTR 77 77 IMPLICIT NONE 78 78 TYPE(C_PTR),VALUE :: SENDBUF, RECVBUF … … 83 83 84 84 SUBROUTINE MPI_BCAST(BUFFER, COUNT, DATATYPE, ROOT, COMM, IERROR) 85 USE ISO_C_BINDING 85 USE ISO_C_BINDING, ONLY: C_PTR 86 86 IMPLICIT NONE 87 87 TYPE(C_PTR),VALUE :: BUFFER … … 91 91 92 92 SUBROUTINE MPI_ALLREDUCE(SENDBUF, RECVBUF, COUNT, DATATYPE, OP, COMM, IERROR) 93 USE ISO_C_BINDING 93 USE ISO_C_BINDING, ONLY: C_PTR 94 94 IMPLICIT NONE 95 95 TYPE(C_PTR),VALUE :: SENDBUF, RECVBUF … … 113 113 114 114 SUBROUTINE MPI_SCATTERV(SENDBUF, SENDCOUNTS, DISPLS, SENDTYPE, RECVBUF, RECVCOUNT, RECVTYPE, ROOT, COMM, IERROR) 115 USE ISO_C_BINDING 115 USE ISO_C_BINDING, ONLY: C_PTR 116 116 IMPLICIT NONE 117 117 TYPE(C_PTR),VALUE :: SENDBUF, RECVBUF … … 122 122 123 123 SUBROUTINE MPI_REDUCE(SENDBUF, RECVBUF, COUNT, DATATYPE, OP, ROOT, COMM, IERROR) 124 USE ISO_C_BINDING 124 USE ISO_C_BINDING, ONLY: C_PTR 125 125 IMPLICIT NONE 126 126 TYPE(C_PTR),VALUE :: SENDBUF, RECVBUF … … 130 130 131 131 SUBROUTINE MPI_RECV(BUF, COUNT, DATATYPE, SOURCE, TAG, COMM, STATUS, IERROR) 132 USE ISO_C_BINDING 132 USE ISO_C_BINDING, ONLY: C_PTR 133 133 USE lmdz_mpi, ONLY: MPI_STATUS_SIZE 134 134 IMPLICIT NONE … … 140 140 141 141 SUBROUTINE MPI_SEND(BUF, COUNT, DATATYPE, DEST, TAG, COMM, IERROR) 142 USE ISO_C_BINDING 142 USE ISO_C_BINDING, ONLY: C_PTR 143 143 IMPLICIT NONE 144 144 TYPE(C_PTR),VALUE :: BUF … … 155 155 156 156 SUBROUTINE MPI_GATHER(SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNT, RECVTYPE, ROOT, COMM, IERROR) 157 USE ISO_C_BINDING 157 USE ISO_C_BINDING, ONLY: C_PTR 158 158 IMPLICIT NONE 159 159 TYPE(C_PTR),VALUE :: SENDBUF, RECVBUF -
LMDZ6/branches/Amaury_dev/libf/misc/lmdz_new_unit.f90
r5117 r5119 1 1 module lmdz_new_unit 2 2 3 IMPLICIT NONE 3 IMPLICIT NONE; PRIVATE 4 PUBLIC new_unit 4 5 5 contains 6 CONTAINS 6 7 7 8 ! Returns an existing unit id that isn't already opened … … 20 21 END SUBROUTINE new_unit 21 22 22 end modulelmdz_new_unit23 END MODULE lmdz_new_unit -
LMDZ6/branches/Amaury_dev/libf/misc/lmdz_physical_constants.f90
r5117 r5119 1 1 MODULE lmdz_physical_constants 2 2 3 IMPLICIT NONE 3 IMPLICIT NONE; PRIVATE 4 PUBLIC k8, PI, PIO2, TWOPI, SQRT2, EULER, PI_D, PIO2_D, TWOPI_D 4 5 5 6 INTEGER, parameter :: k8 = selected_real_kind(13) -
LMDZ6/branches/Amaury_dev/libf/misc/lmdz_regr_conserv.f90
r5117 r5119 5 5 USE lmdz_interpolation, ONLY: locate 6 6 7 IMPLICIT NONE 7 IMPLICIT NONE; PRIVATE 8 PUBLIC :: regr_conserv 8 9 9 10 ! Purpose: Each procedure regrids a piecewise linear function (not necessarily … … 34 35 END INTERFACE 35 36 36 PRIVATE37 PUBLIC :: regr_conserv38 39 37 CONTAINS 40 38 -
LMDZ6/branches/Amaury_dev/libf/misc/lmdz_regr_lint.f90
r5117 r5119 5 5 USE lmdz_interpolation, ONLY: hunt 6 6 7 IMPLICIT NONE 7 IMPLICIT NONE; PRIVATE 8 PUBLIC :: regr_lint 8 9 9 10 ! Purpose: Each procedure regrids by linear interpolation along dimension "ix" … … 26 27 END INTERFACE 27 28 28 PRIVATE29 PUBLIC :: regr_lint30 29 31 30 CONTAINS -
LMDZ6/branches/Amaury_dev/libf/misc/lmdz_slopes.f90
r5117 r5119 4 4 ! Extension / factorisation: David CUGNET 5 5 6 IMPLICIT NONE 6 IMPLICIT NONE; PRIVATE 7 PUBLIC :: slopes 7 8 8 9 ! Those generic function computes second order slopes with Van … … 23 24 END INTERFACE 24 25 25 PRIVATE 26 PUBLIC :: slopes 26 27 27 28 28 CONTAINS -
LMDZ6/branches/Amaury_dev/libf/misc/lmdz_vampir.F90
r5117 r5119 13 13 INTEGER :: MPE_end(nb_inst) 14 14 15 contains 15 CONTAINS 16 16 17 17 SUBROUTINE InitVampir … … 84 84 END SUBROUTINE VTe 85 85 86 end modulelmdz_vampir86 END MODULE lmdz_vampir -
LMDZ6/branches/Amaury_dev/libf/misc/lmdz_write_field.f90
r5117 r5119 19 19 module procedure WriteField3d, WriteField2d, WriteField1d 20 20 end interface WriteField 21 contains 21 CONTAINS 22 22 23 23 function GetFieldIndex(name) … … 298 298 END SUBROUTINE write_field3D 299 299 300 end modulelmdz_write_field300 END MODULE lmdz_write_field 301 301 -
LMDZ6/branches/Amaury_dev/libf/misc/lmdz_wxios.F90
r5118 r5119 442 442 USE lmdz_geometry, ONLY: longitude, latitude, boundslon, boundslat, ind_cell_glo 443 443 USE lmdz_grid_phy, ONLY: nvertex, klon_glo 444 USE lmdz_phys_para445 444 USE lmdz_physical_constants, ONLY: PI 446 445 USE lmdz_ioipsl_getin_p, ONLY: getin_p -
LMDZ6/branches/Amaury_dev/libf/misc/lmdz_xios.F90
r5066 r5119 2 2 3 3 MODULE lmdz_xios 4 USE xios 4 USE xios ! no ONLY, on purpose 5 5 6 6 LOGICAL,PARAMETER :: using_xios = .TRUE. … … 14 14 !! => must be replaced later by official xios wrapper when available 15 15 16 LOGICAL,PARAMETER :: using_xios = .FALSE. 17 18 INTERFACE xios_send_field 19 MODULE PROCEDURE xios_send_field_scalar, xios_send_field_1d, xios_send_field_2d, xios_send_field_3d, & 20 xios_send_field_4d, xios_send_field_5d 21 END INTERFACE xios_send_field 22 23 INTERFACE xios_recv_field 24 MODULE PROCEDURE xios_recv_field_scalar, xios_recv_field_1d, xios_recv_field_2d, xios_recv_field_3d, & 25 xios_recv_field_4d 26 END INTERFACE xios_recv_field 27 28 INTERFACE xios_field_is_active 29 MODULE PROCEDURE xios_field_is_active_id,xios_field_is_active_hdl 30 END INTERFACE xios_field_is_active 31 32 INTERFACE xios_set_attr 33 MODULE PROCEDURE xios_set_fieldgroup_attr_hdl, xios_set_field_attr_hdl, xios_set_domain_attr_hdl, & 34 xios_set_axis_attr_hdl, xios_set_file_attr_hdl 35 END INTERFACE xios_set_attr 36 37 INTERFACE xios_get_handle 38 MODULE PROCEDURE xios_get_context_handle, xios_get_field_handle, xios_get_fieldgroup_handle, & 39 xios_get_domain_handle,xios_get_file_handle, xios_get_filegroup_handle 40 END INTERFACE xios_get_handle 41 42 INTERFACE xios_add_child 43 MODULE PROCEDURE xios_fieldgroup_add_child, xios_add_fieldtofile, xios_add_file 44 END INTERFACE xios_add_child 45 46 INTERFACE xios_set_current_context 47 MODULE PROCEDURE xios_set_current_context_hdl, xios_set_current_context_id 48 END INTERFACE xios_set_current_context 49 50 INTERFACE xios_get_current_context 51 MODULE PROCEDURE xios_get_current_context_hdl, xios_get_current_context_id 52 END INTERFACE xios_get_current_context 53 54 INTERFACE xios_set_start_date 55 MODULE PROCEDURE xios_set_start_date_date, xios_set_start_date_dur 56 END INTERFACE xios_set_start_date 57 58 INTERFACE xios_set_time_origin 59 MODULE PROCEDURE xios_set_time_origin_date, xios_set_time_origin_dur 60 END INTERFACE xios_set_time_origin 61 62 INTERFACE xios_is_defined_attr 63 MODULE PROCEDURE xios_is_defined_domain_attr_hdl 64 END INTERFACE xios_is_defined_attr 65 66 TYPE xios_duration 67 DOUBLE PRECISION :: year=0, month=0, day=0, hour=0, minute=0, second=0, timestep=0 68 END TYPE xios_duration 69 70 TYPE xios_date 71 INTEGER :: year=0, month=0, day=0, hour=0, minute=0, second=0 72 END TYPE xios_date 73 74 75 REAL,PARAMETER :: xios_timestep=1. 76 REAL,PARAMETER :: xios_second=1. 77 78 TYPE xios_fieldgroup 79 END TYPE xios_fieldgroup 80 81 TYPE xios_filegroup 82 END TYPE xios_filegroup 83 84 TYPE xios_context 85 END TYPE xios_context 86 87 TYPE xios_domain 88 END TYPE xios_domain 89 90 TYPE xios_axis 91 END TYPE xios_axis 92 93 TYPE xios_file 94 END TYPE xios_file 95 96 TYPE xios_field 97 END TYPE 98 99 100 CONTAINS 101 102 16 LOGICAL, PARAMETER :: using_xios = .FALSE. 17 18 INTERFACE xios_send_field 19 MODULE PROCEDURE xios_send_field_scalar, xios_send_field_1d, xios_send_field_2d, xios_send_field_3d, & 20 xios_send_field_4d, xios_send_field_5d 21 END INTERFACE xios_send_field 22 23 INTERFACE xios_recv_field 24 MODULE PROCEDURE xios_recv_field_scalar, xios_recv_field_1d, xios_recv_field_2d, xios_recv_field_3d, & 25 xios_recv_field_4d 26 END INTERFACE xios_recv_field 27 28 INTERFACE xios_field_is_active 29 MODULE PROCEDURE xios_field_is_active_id, xios_field_is_active_hdl 30 END INTERFACE xios_field_is_active 31 32 INTERFACE xios_set_attr 33 MODULE PROCEDURE xios_set_fieldgroup_attr_hdl, xios_set_field_attr_hdl, xios_set_domain_attr_hdl, & 34 xios_set_axis_attr_hdl, xios_set_file_attr_hdl 35 END INTERFACE xios_set_attr 36 37 INTERFACE xios_get_handle 38 MODULE PROCEDURE xios_get_context_handle, xios_get_field_handle, xios_get_fieldgroup_handle, & 39 xios_get_domain_handle, xios_get_file_handle, xios_get_filegroup_handle 40 END INTERFACE xios_get_handle 41 42 INTERFACE xios_add_child 43 MODULE PROCEDURE xios_fieldgroup_add_child, xios_add_fieldtofile, xios_add_file 44 END INTERFACE xios_add_child 45 46 INTERFACE xios_set_current_context 47 MODULE PROCEDURE xios_set_current_context_hdl, xios_set_current_context_id 48 END INTERFACE xios_set_current_context 49 50 INTERFACE xios_get_current_context 51 MODULE PROCEDURE xios_get_current_context_hdl, xios_get_current_context_id 52 END INTERFACE xios_get_current_context 53 54 INTERFACE xios_set_start_date 55 MODULE PROCEDURE xios_set_start_date_date, xios_set_start_date_dur 56 END INTERFACE xios_set_start_date 57 58 INTERFACE xios_set_time_origin 59 MODULE PROCEDURE xios_set_time_origin_date, xios_set_time_origin_dur 60 END INTERFACE xios_set_time_origin 61 62 INTERFACE xios_is_defined_attr 63 MODULE PROCEDURE xios_is_defined_domain_attr_hdl 64 END INTERFACE xios_is_defined_attr 65 66 TYPE xios_duration 67 DOUBLE PRECISION :: year = 0, month = 0, day = 0, hour = 0, minute = 0, second = 0, timestep = 0 68 END TYPE xios_duration 69 70 TYPE xios_date 71 INTEGER :: year = 0, month = 0, day = 0, hour = 0, minute = 0, second = 0 72 END TYPE xios_date 73 74 REAL, PARAMETER :: xios_timestep = 1. 75 REAL, PARAMETER :: xios_second = 1. 76 77 TYPE xios_fieldgroup 78 END TYPE xios_fieldgroup 79 80 TYPE xios_filegroup 81 END TYPE xios_filegroup 82 83 TYPE xios_context 84 END TYPE xios_context 85 86 TYPE xios_domain 87 END TYPE xios_domain 88 89 TYPE xios_axis 90 END TYPE xios_axis 91 92 TYPE xios_file 93 END TYPE xios_file 94 95 TYPE xios_field 96 END TYPE 97 98 99 CONTAINS 100 101 103 102 SUBROUTINE xios_initialize(client_id, local_comm, return_comm) 104 IMPLICIT NONE105 CHARACTER(LEN=*),INTENT(IN) :: client_id106 INTEGER,INTENT(IN),OPTIONAL:: local_comm107 INTEGER,INTENT(OUT),OPTIONAL:: return_comm108 INTEGER :: f_local_comm109 INTEGER :: f_return_comm110 111 END SUBROUTINE xios_initialize 112 113 SUBROUTINE xios_define_calendar(type, timestep, start_date, time_origin, &114 115 116 117 CHARACTER(len = *),INTENT(IN) :: type118 119 TYPE(xios_date),OPTIONAL, INTENT(IN) :: start_date120 TYPE(xios_date),OPTIONAL, INTENT(IN) :: time_origin121 INTEGER,OPTIONAL, INTENT(IN) :: day_length122 INTEGER,OPTIONAL, INTENT(IN) :: month_lengths(:)123 INTEGER,OPTIONAL, INTENT(IN) :: year_length124 REAL (KIND=8),OPTIONAL, INTENT(IN) :: leap_year_drift125 REAL (KIND=8),OPTIONAL, INTENT(IN) :: leap_year_drift_offset126 INTEGER,OPTIONAL, INTENT(IN) :: leap_year_month127 128 129 103 IMPLICIT NONE 104 CHARACTER(LEN = *), INTENT(IN) :: client_id 105 INTEGER, INTENT(IN), OPTIONAL :: local_comm 106 INTEGER, INTENT(OUT), OPTIONAL :: return_comm 107 INTEGER :: f_local_comm 108 INTEGER :: f_return_comm 109 110 END SUBROUTINE xios_initialize 111 112 SUBROUTINE xios_define_calendar(type, timestep, start_date, time_origin, & 113 day_length, month_lengths, year_length, & 114 leap_year_month, leap_year_drift, leap_year_drift_offset) 115 IMPLICIT NONE 116 CHARACTER(len = *), INTENT(IN) :: type 117 TYPE(xios_duration), OPTIONAL, INTENT(IN) :: timestep 118 TYPE(xios_date), OPTIONAL, INTENT(IN) :: start_date 119 TYPE(xios_date), OPTIONAL, INTENT(IN) :: time_origin 120 INTEGER, OPTIONAL, INTENT(IN) :: day_length 121 INTEGER, OPTIONAL, INTENT(IN) :: month_lengths(:) 122 INTEGER, OPTIONAL, INTENT(IN) :: year_length 123 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: leap_year_drift 124 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: leap_year_drift_offset 125 INTEGER, OPTIONAL, INTENT(IN) :: leap_year_month 126 127 END SUBROUTINE xios_define_calendar 128 130 129 SUBROUTINE xios_duration_convert_to_string(dur, str) 131 130 IMPLICIT NONE 132 131 TYPE(xios_duration), INTENT(IN) :: dur 133 132 CHARACTER(len = *), INTENT(OUT) :: str 134 str =''133 str = '' 135 134 END SUBROUTINE xios_duration_convert_to_string 136 135 … … 142 141 END FUNCTION xios_duration_convert_from_string 143 142 144 145 146 147 148 143 SUBROUTINE xios_set_timestep(timestep) 144 IMPLICIT NONE 145 TYPE(xios_duration), INTENT(IN) :: timestep 146 END SUBROUTINE xios_set_timestep 147 149 148 SUBROUTINE xios_set_start_date_date(start_date) 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 SUBROUTINE xios_send_field_scalar(name, field)170 IMPLICIT NONE171 CHARACTER(LEN =*),INTENT(IN) :: name172 REAL, INTENT(IN) :: field173 END SUBROUTINE xios_send_field_scalar 174 175 SUBROUTINE xios_send_field_1d(name, field)176 IMPLICIT NONE177 CHARACTER(LEN =*),INTENT(IN) :: name178 REAL, INTENT(IN) :: field(:)179 END SUBROUTINE xios_send_field_1d 180 181 SUBROUTINE xios_send_field_2d(name, field)182 IMPLICIT NONE183 CHARACTER(LEN =*),INTENT(IN) :: name184 REAL, INTENT(IN) :: field(:,:)185 END SUBROUTINE xios_send_field_2d 186 187 SUBROUTINE xios_send_field_3d(name, field)188 IMPLICIT NONE189 CHARACTER(LEN =*),INTENT(IN) :: name190 REAL, INTENT(IN) :: field(:,:,:)191 END SUBROUTINE xios_send_field_3d 192 193 SUBROUTINE xios_send_field_4d(name, field)194 IMPLICIT NONE195 CHARACTER(LEN =*),INTENT(IN) :: name196 REAL, INTENT(IN) :: field(:,:,:,:)197 END SUBROUTINE xios_send_field_4d 198 199 SUBROUTINE xios_send_field_5d(name, field)200 IMPLICIT NONE201 CHARACTER(LEN =*),INTENT(IN) :: name202 REAL, INTENT(IN) :: field(:,:,:,:,:)203 END SUBROUTINE xios_send_field_5d 204 205 206 SUBROUTINE xios_recv_field_scalar(name, field)207 IMPLICIT NONE208 CHARACTER(LEN =*),INTENT(IN) :: name209 REAL, INTENT(OUT) :: field210 field =0211 END SUBROUTINE xios_recv_field_scalar 212 213 SUBROUTINE xios_recv_field_1d(name, field)214 IMPLICIT NONE215 CHARACTER(LEN =*),INTENT(IN) :: name216 REAL, INTENT(OUT) :: field(:)217 field =0218 END SUBROUTINE xios_recv_field_1d 219 220 SUBROUTINE xios_recv_field_2d(name, field)221 IMPLICIT NONE222 CHARACTER(LEN =*),INTENT(IN) :: name223 REAL, INTENT(OUT) :: field(:,:)224 field =0225 END SUBROUTINE xios_recv_field_2d 226 227 SUBROUTINE xios_recv_field_3d(name, field)228 IMPLICIT NONE229 CHARACTER(LEN =*),INTENT(IN) :: name230 REAL, INTENT(OUT) :: field(:,:,:)231 field =0232 END SUBROUTINE xios_recv_field_3d 233 234 SUBROUTINE xios_recv_field_4d(name, field)235 IMPLICIT NONE236 CHARACTER(LEN =*),INTENT(IN) :: name237 REAL, INTENT(OUT) :: field(:,:,:,:)238 field =0239 END SUBROUTINE xios_recv_field_4d 149 IMPLICIT NONE 150 TYPE(xios_date), INTENT(IN) :: start_date 151 END SUBROUTINE xios_set_start_date_date 152 153 SUBROUTINE xios_set_start_date_dur(start_date) 154 IMPLICIT NONE 155 TYPE(xios_duration), INTENT(IN) :: start_date 156 END SUBROUTINE xios_set_start_date_dur 157 158 SUBROUTINE xios_set_time_origin_date(time_origin) 159 IMPLICIT NONE 160 TYPE(xios_date), INTENT(IN) :: time_origin 161 END SUBROUTINE xios_set_time_origin_date 162 163 SUBROUTINE xios_set_time_origin_dur(time_origin) 164 IMPLICIT NONE 165 TYPE(xios_duration), INTENT(IN) :: time_origin 166 END SUBROUTINE xios_set_time_origin_dur 167 168 SUBROUTINE xios_send_field_scalar(name, field) 169 IMPLICIT NONE 170 CHARACTER(LEN = *), INTENT(IN) :: name 171 REAL, INTENT(IN) :: field 172 END SUBROUTINE xios_send_field_scalar 173 174 SUBROUTINE xios_send_field_1d(name, field) 175 IMPLICIT NONE 176 CHARACTER(LEN = *), INTENT(IN) :: name 177 REAL, INTENT(IN) :: field(:) 178 END SUBROUTINE xios_send_field_1d 179 180 SUBROUTINE xios_send_field_2d(name, field) 181 IMPLICIT NONE 182 CHARACTER(LEN = *), INTENT(IN) :: name 183 REAL, INTENT(IN) :: field(:, :) 184 END SUBROUTINE xios_send_field_2d 185 186 SUBROUTINE xios_send_field_3d(name, field) 187 IMPLICIT NONE 188 CHARACTER(LEN = *), INTENT(IN) :: name 189 REAL, INTENT(IN) :: field(:, :, :) 190 END SUBROUTINE xios_send_field_3d 191 192 SUBROUTINE xios_send_field_4d(name, field) 193 IMPLICIT NONE 194 CHARACTER(LEN = *), INTENT(IN) :: name 195 REAL, INTENT(IN) :: field(:, :, :, :) 196 END SUBROUTINE xios_send_field_4d 197 198 SUBROUTINE xios_send_field_5d(name, field) 199 IMPLICIT NONE 200 CHARACTER(LEN = *), INTENT(IN) :: name 201 REAL, INTENT(IN) :: field(:, :, :, :, :) 202 END SUBROUTINE xios_send_field_5d 203 204 205 SUBROUTINE xios_recv_field_scalar(name, field) 206 IMPLICIT NONE 207 CHARACTER(LEN = *), INTENT(IN) :: name 208 REAL, INTENT(OUT) :: field 209 field = 0 210 END SUBROUTINE xios_recv_field_scalar 211 212 SUBROUTINE xios_recv_field_1d(name, field) 213 IMPLICIT NONE 214 CHARACTER(LEN = *), INTENT(IN) :: name 215 REAL, INTENT(OUT) :: field(:) 216 field = 0 217 END SUBROUTINE xios_recv_field_1d 218 219 SUBROUTINE xios_recv_field_2d(name, field) 220 IMPLICIT NONE 221 CHARACTER(LEN = *), INTENT(IN) :: name 222 REAL, INTENT(OUT) :: field(:, :) 223 field = 0 224 END SUBROUTINE xios_recv_field_2d 225 226 SUBROUTINE xios_recv_field_3d(name, field) 227 IMPLICIT NONE 228 CHARACTER(LEN = *), INTENT(IN) :: name 229 REAL, INTENT(OUT) :: field(:, :, :) 230 field = 0 231 END SUBROUTINE xios_recv_field_3d 232 233 SUBROUTINE xios_recv_field_4d(name, field) 234 IMPLICIT NONE 235 CHARACTER(LEN = *), INTENT(IN) :: name 236 REAL, INTENT(OUT) :: field(:, :, :, :) 237 field = 0 238 END SUBROUTINE xios_recv_field_4d 240 239 241 240 242 241 FUNCTION xios_is_active_field(field_id) 243 IMPLICIT NONE244 LOGICAL ::xios_is_active_field245 CHARACTER(LEN=*) :: field_id242 IMPLICIT NONE 243 LOGICAL :: xios_is_active_field 244 CHARACTER(LEN = *) :: field_id 246 245 xios_is_active_field = .TRUE. 247 246 END FUNCTION xios_is_active_field … … 249 248 LOGICAL FUNCTION xios_is_valid_field(idt) 250 249 IMPLICIT NONE 251 CHARACTER(len = *), INTENT(IN) :: idt250 CHARACTER(len = *), INTENT(IN) :: idt 252 251 xios_is_valid_field = .FALSE. 253 252 END FUNCTION xios_is_valid_field … … 255 254 LOGICAL FUNCTION xios_is_valid_file(idt) 256 255 IMPLICIT NONE 257 CHARACTER(len = *), INTENT(IN) :: idt256 CHARACTER(len = *), INTENT(IN) :: idt 258 257 xios_is_valid_file = .FALSE. 259 258 END FUNCTION xios_is_valid_file … … 261 260 LOGICAL FUNCTION xios_is_valid_axis(idt) 262 261 IMPLICIT NONE 263 CHARACTER(len = *), INTENT(IN) :: idt262 CHARACTER(len = *), INTENT(IN) :: idt 264 263 xios_is_valid_axis = .FALSE. 265 264 END FUNCTION xios_is_valid_axis … … 267 266 LOGICAL FUNCTION xios_is_valid_domain(idt) 268 267 IMPLICIT NONE 269 CHARACTER(len = *), INTENT(IN) :: idt268 CHARACTER(len = *), INTENT(IN) :: idt 270 269 xios_is_valid_domain = .FALSE. 271 270 END FUNCTION xios_is_valid_domain 272 271 273 272 274 SUBROUTINE xios_context_initialize(context_id,comm) 275 IMPLICIT NONE 276 CHARACTER(LEN=*),INTENT(IN) :: context_id 277 INTEGER, INTENT(IN) :: comm 278 279 END SUBROUTINE xios_context_initialize 280 281 282 SUBROUTINE xios_finalize 283 IMPLICIT NONE 284 285 END SUBROUTINE xios_finalize 286 287 288 SUBROUTINE xios_oasis_enddef 289 IMPLICIT NONE 290 291 END SUBROUTINE xios_oasis_enddef 292 293 294 SUBROUTINE xios_close_context_definition 295 IMPLICIT NONE 296 297 END SUBROUTINE xios_close_context_definition 298 299 300 SUBROUTINE xios_set_current_context_hdl(context, withswap) 301 IMPLICIT NONE 302 TYPE(xios_context) , INTENT(IN) :: context 303 LOGICAL , OPTIONAL, INTENT(IN) :: withswap 304 END SUBROUTINE xios_set_current_context_hdl 305 306 SUBROUTINE xios_set_current_context_id(idt) 307 IMPLICIT NONE 308 309 CHARACTER(len = *) , INTENT(IN) :: idt 310 LOGICAL :: withswap 311 END SUBROUTINE xios_set_current_context_id 312 313 314 SUBROUTINE xios_get_current_context_hdl(context) 315 IMPLICIT NONE 316 TYPE(xios_context), INTENT(OUT) :: context 317 END SUBROUTINE xios_get_current_context_hdl 318 319 SUBROUTINE xios_get_current_context_id(idt) 320 IMPLICIT NONE 321 CHARACTER(len = *) , INTENT(OUT) :: idt 322 TYPE(xios_context) :: context 323 END SUBROUTINE xios_get_current_context_id 324 325 SUBROUTINE xios_context_finalize() 326 IMPLICIT NONE 327 328 END SUBROUTINE xios_context_finalize 329 330 331 SUBROUTINE xios_solve_inheritance() 332 IMPLICIT NONE 333 334 END SUBROUTINE xios_solve_inheritance 335 336 337 338 339 273 SUBROUTINE xios_context_initialize(context_id, comm) 274 IMPLICIT NONE 275 CHARACTER(LEN = *), INTENT(IN) :: context_id 276 INTEGER, INTENT(IN) :: comm 277 278 END SUBROUTINE xios_context_initialize 279 280 281 SUBROUTINE xios_finalize 282 IMPLICIT NONE 283 284 END SUBROUTINE xios_finalize 285 286 287 SUBROUTINE xios_oasis_enddef 288 IMPLICIT NONE 289 290 END SUBROUTINE xios_oasis_enddef 291 292 293 SUBROUTINE xios_close_context_definition 294 IMPLICIT NONE 295 296 END SUBROUTINE xios_close_context_definition 297 298 299 SUBROUTINE xios_set_current_context_hdl(context, withswap) 300 IMPLICIT NONE 301 TYPE(xios_context), INTENT(IN) :: context 302 LOGICAL, OPTIONAL, INTENT(IN) :: withswap 303 END SUBROUTINE xios_set_current_context_hdl 304 305 SUBROUTINE xios_set_current_context_id(idt) 306 IMPLICIT NONE 307 308 CHARACTER(len = *), INTENT(IN) :: idt 309 LOGICAL :: withswap 310 END SUBROUTINE xios_set_current_context_id 311 312 313 SUBROUTINE xios_get_current_context_hdl(context) 314 IMPLICIT NONE 315 TYPE(xios_context), INTENT(OUT) :: context 316 END SUBROUTINE xios_get_current_context_hdl 317 318 SUBROUTINE xios_get_current_context_id(idt) 319 IMPLICIT NONE 320 CHARACTER(len = *), INTENT(OUT) :: idt 321 TYPE(xios_context) :: context 322 END SUBROUTINE xios_get_current_context_id 323 324 SUBROUTINE xios_context_finalize() 325 IMPLICIT NONE 326 327 END SUBROUTINE xios_context_finalize 328 329 330 SUBROUTINE xios_solve_inheritance() 331 IMPLICIT NONE 332 333 END SUBROUTINE xios_solve_inheritance 334 335 340 336 SUBROUTINE xios_update_calendar(step) 341 IMPLICIT NONE342 INTEGER, INTENT(IN):: step337 IMPLICIT NONE 338 INTEGER, INTENT(IN) :: step 343 339 END SUBROUTINE xios_update_calendar 344 340 345 SUBROUTINE xios_set_filegroup_attr(name, enabled)346 CHARACTER(LEN =*) :: name347 LOGICAL, OPTIONAL:: enabled341 SUBROUTINE xios_set_filegroup_attr(name, enabled) 342 CHARACTER(LEN = *) :: name 343 LOGICAL, OPTIONAL :: enabled 348 344 END SUBROUTINE xios_set_filegroup_attr 349 345 350 SUBROUTINE xios_get_axis_attr(name, n_glo,value)351 CHARACTER(LEN =*) :: name352 INTEGER, OPTIONAL:: n_glo353 REAL, OPTIONAL:: value(:)346 SUBROUTINE xios_get_axis_attr(name, n_glo, value) 347 CHARACTER(LEN = *) :: name 348 INTEGER, OPTIONAL :: n_glo 349 REAL, OPTIONAL :: value(:) 354 350 END SUBROUTINE xios_get_axis_attr 355 351 356 SUBROUTINE xios_get_context_handle(idt,ret) 357 IMPLICIT NONE 358 CHARACTER(len = *) , INTENT(IN) :: idt 359 TYPE(xios_context), INTENT(OUT):: ret 360 TYPE(xios_context) :: nothing 361 362 ret=nothing 363 END SUBROUTINE xios_get_context_handle 364 365 SUBROUTINE xios_get_domain_handle(idt,ret) 366 IMPLICIT NONE 367 CHARACTER(len = *) , INTENT(IN) :: idt 368 TYPE(xios_domain), INTENT(OUT):: ret 369 TYPE(xios_domain) :: hdl 370 ret=hdl 371 END SUBROUTINE xios_get_domain_handle 372 373 SUBROUTINE xios_get_field_handle(idt,ret) 374 IMPLICIT NONE 375 CHARACTER(len = *) , INTENT(IN) :: idt 376 TYPE(xios_field), INTENT(OUT):: ret 377 TYPE(xios_field) :: hdl 378 ret=hdl 379 END SUBROUTINE xios_get_field_handle 380 381 SUBROUTINE xios_get_fieldgroup_handle(idt,ret) 382 IMPLICIT NONE 383 CHARACTER(len = *) , INTENT(IN) :: idt 384 TYPE(xios_fieldgroup), INTENT(OUT):: ret 385 TYPE(xios_fieldgroup) :: hdl 386 ret=hdl 387 END SUBROUTINE xios_get_fieldgroup_handle 388 389 SUBROUTINE xios_get_file_handle(idt,ret) 390 IMPLICIT NONE 391 CHARACTER(len = *) , INTENT(IN) :: idt 392 TYPE(xios_file), INTENT(OUT):: ret 393 TYPE(xios_file) :: hdl 394 ret=hdl 395 END SUBROUTINE xios_get_file_handle 396 397 SUBROUTINE xios_get_filegroup_handle(idt,ret) 398 IMPLICIT NONE 399 CHARACTER(len = *) , INTENT(IN) :: idt 400 TYPE(xios_filegroup), INTENT(OUT):: ret 401 TYPE(xios_filegroup) :: hdl 402 ret=hdl 403 END SUBROUTINE xios_get_filegroup_handle 404 352 SUBROUTINE xios_get_context_handle(idt, ret) 353 IMPLICIT NONE 354 CHARACTER(len = *), INTENT(IN) :: idt 355 TYPE(xios_context), INTENT(OUT) :: ret 356 TYPE(xios_context) :: nothing 357 358 ret = nothing 359 END SUBROUTINE xios_get_context_handle 360 361 SUBROUTINE xios_get_domain_handle(idt, ret) 362 IMPLICIT NONE 363 CHARACTER(len = *), INTENT(IN) :: idt 364 TYPE(xios_domain), INTENT(OUT) :: ret 365 TYPE(xios_domain) :: hdl 366 ret = hdl 367 END SUBROUTINE xios_get_domain_handle 368 369 SUBROUTINE xios_get_field_handle(idt, ret) 370 IMPLICIT NONE 371 CHARACTER(len = *), INTENT(IN) :: idt 372 TYPE(xios_field), INTENT(OUT) :: ret 373 TYPE(xios_field) :: hdl 374 ret = hdl 375 END SUBROUTINE xios_get_field_handle 376 377 SUBROUTINE xios_get_fieldgroup_handle(idt, ret) 378 IMPLICIT NONE 379 CHARACTER(len = *), INTENT(IN) :: idt 380 TYPE(xios_fieldgroup), INTENT(OUT) :: ret 381 TYPE(xios_fieldgroup) :: hdl 382 ret = hdl 383 END SUBROUTINE xios_get_fieldgroup_handle 384 385 SUBROUTINE xios_get_file_handle(idt, ret) 386 IMPLICIT NONE 387 CHARACTER(len = *), INTENT(IN) :: idt 388 TYPE(xios_file), INTENT(OUT) :: ret 389 TYPE(xios_file) :: hdl 390 ret = hdl 391 END SUBROUTINE xios_get_file_handle 392 393 SUBROUTINE xios_get_filegroup_handle(idt, ret) 394 IMPLICIT NONE 395 CHARACTER(len = *), INTENT(IN) :: idt 396 TYPE(xios_filegroup), INTENT(OUT) :: ret 397 TYPE(xios_filegroup) :: hdl 398 ret = hdl 399 END SUBROUTINE xios_get_filegroup_handle 405 400 406 401 407 402 SUBROUTINE xios_fieldgroup_add_child(fieldgroup_hdl, field_hdl, id) 408 TYPE(xios_fieldgroup) 409 TYPE(xios_field) 410 CHARACTER(LEN =*),OPTIONAL :: id403 TYPE(xios_fieldgroup) :: fieldgroup_hdl 404 TYPE(xios_field) :: field_hdl 405 CHARACTER(LEN = *), OPTIONAL :: id 411 406 END SUBROUTINE xios_fieldgroup_add_child 412 407 413 408 SUBROUTINE xios_add_file(parent_hdl, child_hdl, child_id) 414 TYPE(xios_filegroup), INTENT(IN) :: parent_hdl415 TYPE(xios_file) , INTENT(OUT):: child_hdl416 CHARACTER(len = *), OPTIONAL, INTENT(IN):: child_id417 418 409 TYPE(xios_filegroup), INTENT(IN) :: parent_hdl 410 TYPE(xios_file), INTENT(OUT) :: child_hdl 411 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: child_id 412 TYPE(xios_file) :: hdl 413 child_hdl = hdl 419 414 END SUBROUTINE xios_add_file 420 415 421 416 SUBROUTINE xios_add_field(parent_hdl, child_hdl, child_id) 422 TYPE(xios_fieldgroup) , INTENT(IN) :: parent_hdl 423 TYPE(xios_field) , INTENT(OUT):: child_hdl 424 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: child_id 425 TYPE(xios_field) :: hdl 426 child_hdl = hdl 427 END SUBROUTINE xios_add_field 428 429 SUBROUTINE xios_add_fieldtofile(parent_hdl, child_hdl, child_id) 430 TYPE(xios_file) , INTENT(IN) :: parent_hdl 431 TYPE(xios_field) , INTENT(OUT):: child_hdl 432 CHARACTER(len = *), OPTIONAL , INTENT(IN) :: child_id 417 TYPE(xios_fieldgroup), INTENT(IN) :: parent_hdl 418 TYPE(xios_field), INTENT(OUT) :: child_hdl 419 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: child_id 433 420 TYPE(xios_field) :: hdl 434 421 child_hdl = hdl 422 END SUBROUTINE xios_add_field 423 424 SUBROUTINE xios_add_fieldtofile(parent_hdl, child_hdl, child_id) 425 TYPE(xios_file), INTENT(IN) :: parent_hdl 426 TYPE(xios_field), INTENT(OUT) :: child_hdl 427 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: child_id 428 TYPE(xios_field) :: hdl 429 child_hdl = hdl 435 430 436 431 END SUBROUTINE xios_add_fieldtofile 437 432 438 433 LOGICAL FUNCTION xios_field_is_active_id(field_id, at_current_timestep_arg) 439 440 CHARACTER(len = *), INTENT(IN) :: field_id441 LOGICAL, OPTIONAL, INTENT(IN) :: at_current_timestep_arg442 443 xios_field_is_active_id=.FALSE.444 445 446 447 448 TYPE(xios_field), INTENT(IN) :: field_hdl449 LOGICAL, OPTIONAL, INTENT(IN) :: at_current_timestep_arg450 451 452 453 454 455 SUBROUTINE xios_set_generate_rectilinear_domain_attr(id, bounds_lon_start, bounds_lon_end, bounds_lat_start,bounds_lat_end)456 CHARACTER(LEN =*) :: id434 IMPLICIT NONE 435 CHARACTER(len = *), INTENT(IN) :: field_id 436 LOGICAL, OPTIONAL, INTENT(IN) :: at_current_timestep_arg 437 438 xios_field_is_active_id = .FALSE. 439 END FUNCTION xios_field_is_active_id 440 441 LOGICAL FUNCTION xios_field_is_active_hdl(field_hdl, at_current_timestep_arg) 442 IMPLICIT NONE 443 TYPE(xios_field), INTENT(IN) :: field_hdl 444 LOGICAL, OPTIONAL, INTENT(IN) :: at_current_timestep_arg 445 446 xios_field_is_active_hdl = .FALSE. 447 END FUNCTION xios_field_is_active_hdl 448 449 450 SUBROUTINE xios_set_generate_rectilinear_domain_attr(id, bounds_lon_start, bounds_lon_end, bounds_lat_start, bounds_lat_end) 451 CHARACTER(LEN = *) :: id 457 452 REAL, OPTIONAL :: bounds_lon_start 458 453 REAL, OPTIONAL :: bounds_lon_end 459 454 REAL, OPTIONAL :: bounds_lat_start 460 455 REAL, OPTIONAL :: bounds_lat_end 461 END SUBROUTINE xios_set_generate_rectilinear_domain_attr 456 END SUBROUTINE xios_set_generate_rectilinear_domain_attr 462 457 463 458 SUBROUTINE xios_set_domain_attr & 464 (domain_id, area, bounds_lat_1d, bounds_lat_2d, bounds_lat_name, bounds_lon_1d, bounds_lon_2d &465 , bounds_lon_name, comment, data_dim, data_i_index, data_ibegin, data_j_index, data_jbegin, data_ni &466 , data_nj, dim_i_name, dim_j_name, domain_ref, i_index, ibegin, j_index, jbegin, lat_name, latvalue_1d &467 , latvalue_2d, lon_name, long_name, lonvalue_1d, lonvalue_2d, mask_1d, mask_2d, name, ni, ni_glo &468 , nj, nj_glo, nvertex, prec, radius, standard_name, type)469 470 IMPLICIT NONE 471 TYPE(xios_domain):: domain_hdl472 CHARACTER(LEN=*), INTENT(IN) ::domain_id473 REAL (KIND=8) , OPTIONAL, INTENT(IN) :: area(:,:)474 REAL (KIND=8) , OPTIONAL, INTENT(IN) :: bounds_lat_1d(:,:)475 REAL (KIND=8) , OPTIONAL, INTENT(IN) :: bounds_lat_2d(:,:,:)476 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: bounds_lat_name477 REAL (KIND=8) , OPTIONAL, INTENT(IN) :: bounds_lon_1d(:,:)478 REAL (KIND=8) , OPTIONAL, INTENT(IN) :: bounds_lon_2d(:,:,:)479 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: bounds_lon_name480 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: comment481 INTEGER, OPTIONAL, INTENT(IN) :: data_dim482 INTEGER, OPTIONAL, INTENT(IN) :: data_i_index(:)483 INTEGER, OPTIONAL, INTENT(IN) :: data_ibegin484 INTEGER, OPTIONAL, INTENT(IN) :: data_j_index(:)485 INTEGER, OPTIONAL, INTENT(IN) :: data_jbegin486 INTEGER, OPTIONAL, INTENT(IN) :: data_ni487 INTEGER, OPTIONAL, INTENT(IN) :: data_nj488 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: dim_i_name489 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: dim_j_name490 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: domain_ref491 INTEGER, OPTIONAL, INTENT(IN) :: i_index(:)492 INTEGER, OPTIONAL, INTENT(IN) :: ibegin493 INTEGER, OPTIONAL, INTENT(IN) :: j_index(:)494 INTEGER, OPTIONAL, INTENT(IN) :: jbegin495 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: lat_name496 REAL (KIND=8), OPTIONAL, INTENT(IN) :: latvalue_1d(:)497 REAL (KIND=8) , OPTIONAL, INTENT(IN) :: latvalue_2d(:,:)498 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: lon_name499 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: long_name500 REAL (KIND=8), OPTIONAL, INTENT(IN) :: lonvalue_1d(:)501 REAL (KIND=8) , OPTIONAL, INTENT(IN) :: lonvalue_2d(:,:)502 LOGICAL, OPTIONAL, INTENT(IN) :: mask_1d(:)503 LOGICAL , OPTIONAL, INTENT(IN) :: mask_2d(:,:)504 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: name505 INTEGER, OPTIONAL, INTENT(IN) :: ni506 INTEGER, OPTIONAL, INTENT(IN) :: ni_glo507 INTEGER, OPTIONAL, INTENT(IN) :: nj508 INTEGER, OPTIONAL, INTENT(IN) :: nj_glo509 INTEGER, OPTIONAL, INTENT(IN) :: nvertex510 INTEGER, OPTIONAL, INTENT(IN) :: prec511 REAL (KIND=8), OPTIONAL, INTENT(IN) :: radius512 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: standard_name513 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: type514 515 END SUBROUTINE xios_set_domain_attr 459 (domain_id, area, bounds_lat_1d, bounds_lat_2d, bounds_lat_name, bounds_lon_1d, bounds_lon_2d & 460 , bounds_lon_name, comment, data_dim, data_i_index, data_ibegin, data_j_index, data_jbegin, data_ni & 461 , data_nj, dim_i_name, dim_j_name, domain_ref, i_index, ibegin, j_index, jbegin, lat_name, latvalue_1d & 462 , latvalue_2d, lon_name, long_name, lonvalue_1d, lonvalue_2d, mask_1d, mask_2d, name, ni, ni_glo & 463 , nj, nj_glo, nvertex, prec, radius, standard_name, type) 464 465 IMPLICIT NONE 466 TYPE(xios_domain) :: domain_hdl 467 CHARACTER(LEN = *), INTENT(IN) :: domain_id 468 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: area(:, :) 469 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: bounds_lat_1d(:, :) 470 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: bounds_lat_2d(:, :, :) 471 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: bounds_lat_name 472 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: bounds_lon_1d(:, :) 473 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: bounds_lon_2d(:, :, :) 474 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: bounds_lon_name 475 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: comment 476 INTEGER, OPTIONAL, INTENT(IN) :: data_dim 477 INTEGER, OPTIONAL, INTENT(IN) :: data_i_index(:) 478 INTEGER, OPTIONAL, INTENT(IN) :: data_ibegin 479 INTEGER, OPTIONAL, INTENT(IN) :: data_j_index(:) 480 INTEGER, OPTIONAL, INTENT(IN) :: data_jbegin 481 INTEGER, OPTIONAL, INTENT(IN) :: data_ni 482 INTEGER, OPTIONAL, INTENT(IN) :: data_nj 483 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: dim_i_name 484 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: dim_j_name 485 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: domain_ref 486 INTEGER, OPTIONAL, INTENT(IN) :: i_index(:) 487 INTEGER, OPTIONAL, INTENT(IN) :: ibegin 488 INTEGER, OPTIONAL, INTENT(IN) :: j_index(:) 489 INTEGER, OPTIONAL, INTENT(IN) :: jbegin 490 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: lat_name 491 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: latvalue_1d(:) 492 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: latvalue_2d(:, :) 493 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: lon_name 494 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: long_name 495 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: lonvalue_1d(:) 496 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: lonvalue_2d(:, :) 497 LOGICAL, OPTIONAL, INTENT(IN) :: mask_1d(:) 498 LOGICAL, OPTIONAL, INTENT(IN) :: mask_2d(:, :) 499 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: name 500 INTEGER, OPTIONAL, INTENT(IN) :: ni 501 INTEGER, OPTIONAL, INTENT(IN) :: ni_glo 502 INTEGER, OPTIONAL, INTENT(IN) :: nj 503 INTEGER, OPTIONAL, INTENT(IN) :: nj_glo 504 INTEGER, OPTIONAL, INTENT(IN) :: nvertex 505 INTEGER, OPTIONAL, INTENT(IN) :: prec 506 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: radius 507 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: standard_name 508 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: type 509 510 END SUBROUTINE xios_set_domain_attr 516 511 517 512 SUBROUTINE xios_set_domain_attr_hdl & 518 (domain_hdl, area, bounds_lat_1d, bounds_lat_2d, bounds_lat_name, bounds_lon_1d, bounds_lon_2d &519 , bounds_lon_name, comment, data_dim, data_i_index, data_ibegin, data_j_index, data_jbegin, data_ni &520 , data_nj, dim_i_name, dim_j_name, domain_ref, i_index, ibegin, j_index, jbegin, lat_name, latvalue_1d &521 , latvalue_2d, lon_name, long_name, lonvalue_1d, lonvalue_2d, mask_1d, mask_2d, name, ni, ni_glo &522 , nj, nj_glo, nvertex, prec, radius, standard_name, type)523 524 IMPLICIT NONE 525 TYPE(xios_domain), INTENT(IN) :: domain_hdl526 REAL (KIND=8) , OPTIONAL, INTENT(IN) :: area(:,:)527 REAL (KIND=8) , OPTIONAL, INTENT(IN) :: bounds_lat_1d(:,:)528 REAL (KIND=8) , OPTIONAL, INTENT(IN) :: bounds_lat_2d(:,:,:)529 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: bounds_lat_name530 REAL (KIND=8) , OPTIONAL, INTENT(IN) :: bounds_lon_1d(:,:)531 REAL (KIND=8) , OPTIONAL, INTENT(IN) :: bounds_lon_2d(:,:,:)532 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: bounds_lon_name533 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: comment534 INTEGER, OPTIONAL, INTENT(IN) :: data_dim535 INTEGER, OPTIONAL, INTENT(IN) :: data_i_index(:)536 INTEGER, OPTIONAL, INTENT(IN) :: data_ibegin537 INTEGER, OPTIONAL, INTENT(IN) :: data_j_index(:)538 INTEGER, OPTIONAL, INTENT(IN) :: data_jbegin539 INTEGER, OPTIONAL, INTENT(IN) :: data_ni540 INTEGER, OPTIONAL, INTENT(IN) :: data_nj541 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: dim_i_name542 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: dim_j_name543 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: domain_ref544 INTEGER, OPTIONAL, INTENT(IN) :: i_index(:)545 INTEGER, OPTIONAL, INTENT(IN) :: ibegin546 INTEGER, OPTIONAL, INTENT(IN) :: j_index(:)547 INTEGER, OPTIONAL, INTENT(IN) :: jbegin548 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: lat_name549 REAL (KIND=8), OPTIONAL, INTENT(IN) :: latvalue_1d(:)550 REAL (KIND=8) , OPTIONAL, INTENT(IN) :: latvalue_2d(:,:)551 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: lon_name552 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: long_name553 REAL (KIND=8), OPTIONAL, INTENT(IN) :: lonvalue_1d(:)554 REAL (KIND=8) , OPTIONAL, INTENT(IN) :: lonvalue_2d(:,:)555 LOGICAL, OPTIONAL, INTENT(IN) :: mask_1d(:)556 LOGICAL , OPTIONAL, INTENT(IN) :: mask_2d(:,:)557 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: name558 INTEGER, OPTIONAL, INTENT(IN) :: ni559 INTEGER, OPTIONAL, INTENT(IN) :: ni_glo560 INTEGER, OPTIONAL, INTENT(IN) :: nj561 INTEGER, OPTIONAL, INTENT(IN) :: nj_glo562 INTEGER, OPTIONAL, INTENT(IN) :: nvertex563 INTEGER, OPTIONAL, INTENT(IN) :: prec564 REAL (KIND=8), OPTIONAL, INTENT(IN) :: radius565 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: standard_name566 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: type567 513 (domain_hdl, area, bounds_lat_1d, bounds_lat_2d, bounds_lat_name, bounds_lon_1d, bounds_lon_2d & 514 , bounds_lon_name, comment, data_dim, data_i_index, data_ibegin, data_j_index, data_jbegin, data_ni & 515 , data_nj, dim_i_name, dim_j_name, domain_ref, i_index, ibegin, j_index, jbegin, lat_name, latvalue_1d & 516 , latvalue_2d, lon_name, long_name, lonvalue_1d, lonvalue_2d, mask_1d, mask_2d, name, ni, ni_glo & 517 , nj, nj_glo, nvertex, prec, radius, standard_name, type) 518 519 IMPLICIT NONE 520 TYPE(xios_domain), INTENT(IN) :: domain_hdl 521 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: area(:, :) 522 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: bounds_lat_1d(:, :) 523 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: bounds_lat_2d(:, :, :) 524 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: bounds_lat_name 525 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: bounds_lon_1d(:, :) 526 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: bounds_lon_2d(:, :, :) 527 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: bounds_lon_name 528 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: comment 529 INTEGER, OPTIONAL, INTENT(IN) :: data_dim 530 INTEGER, OPTIONAL, INTENT(IN) :: data_i_index(:) 531 INTEGER, OPTIONAL, INTENT(IN) :: data_ibegin 532 INTEGER, OPTIONAL, INTENT(IN) :: data_j_index(:) 533 INTEGER, OPTIONAL, INTENT(IN) :: data_jbegin 534 INTEGER, OPTIONAL, INTENT(IN) :: data_ni 535 INTEGER, OPTIONAL, INTENT(IN) :: data_nj 536 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: dim_i_name 537 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: dim_j_name 538 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: domain_ref 539 INTEGER, OPTIONAL, INTENT(IN) :: i_index(:) 540 INTEGER, OPTIONAL, INTENT(IN) :: ibegin 541 INTEGER, OPTIONAL, INTENT(IN) :: j_index(:) 542 INTEGER, OPTIONAL, INTENT(IN) :: jbegin 543 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: lat_name 544 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: latvalue_1d(:) 545 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: latvalue_2d(:, :) 546 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: lon_name 547 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: long_name 548 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: lonvalue_1d(:) 549 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: lonvalue_2d(:, :) 550 LOGICAL, OPTIONAL, INTENT(IN) :: mask_1d(:) 551 LOGICAL, OPTIONAL, INTENT(IN) :: mask_2d(:, :) 552 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: name 553 INTEGER, OPTIONAL, INTENT(IN) :: ni 554 INTEGER, OPTIONAL, INTENT(IN) :: ni_glo 555 INTEGER, OPTIONAL, INTENT(IN) :: nj 556 INTEGER, OPTIONAL, INTENT(IN) :: nj_glo 557 INTEGER, OPTIONAL, INTENT(IN) :: nvertex 558 INTEGER, OPTIONAL, INTENT(IN) :: prec 559 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: radius 560 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: standard_name 561 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: type 562 568 563 END SUBROUTINE xios_set_domain_attr_hdl 569 564 570 565 571 572 566 SUBROUTINE xios_set_axis_attr & 573 (axis_id, axis_ref, axis_type, begin, bounds, bounds_name, comment, data_begin, data_index &574 , data_n, dim_name, formula, formula_bounds, formula_term, formula_term_bounds, index, label &575 , long_name, mask, n, n_distributed_partition, n_glo, name, positive, prec, standard_name, unit &576 , value)577 578 IMPLICIT NONE 579 TYPE(xios_axis):: axis_hdl580 CHARACTER(LEN=*), INTENT(IN) ::axis_id581 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: axis_ref582 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: axis_type583 INTEGER, OPTIONAL, INTENT(IN) :: begin584 REAL (KIND=8) , OPTIONAL, INTENT(IN) :: bounds(:,:)585 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: bounds_name586 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: comment587 INTEGER, OPTIONAL, INTENT(IN) :: data_begin588 INTEGER, OPTIONAL, INTENT(IN) :: data_index(:)589 INTEGER, OPTIONAL, INTENT(IN) :: data_n590 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: dim_name591 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: formula592 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: formula_bounds593 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: formula_term594 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: formula_term_bounds595 INTEGER, OPTIONAL, INTENT(IN) :: index(:)596 CHARACTER(len=*), OPTIONAL, INTENT(IN) :: label(:)597 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: long_name598 LOGICAL, OPTIONAL, INTENT(IN) :: mask(:)599 INTEGER, OPTIONAL, INTENT(IN) :: n600 INTEGER, OPTIONAL, INTENT(IN) :: n_distributed_partition601 INTEGER, OPTIONAL, INTENT(IN) :: n_glo602 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: name603 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: positive604 INTEGER, OPTIONAL, INTENT(IN) :: prec605 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: standard_name606 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: unit607 REAL (KIND=8), OPTIONAL, INTENT(IN) :: value(:)567 (axis_id, axis_ref, axis_type, begin, bounds, bounds_name, comment, data_begin, data_index & 568 , data_n, dim_name, formula, formula_bounds, formula_term, formula_term_bounds, index, label & 569 , long_name, mask, n, n_distributed_partition, n_glo, name, positive, prec, standard_name, unit & 570 , value) 571 572 IMPLICIT NONE 573 TYPE(xios_axis) :: axis_hdl 574 CHARACTER(LEN = *), INTENT(IN) :: axis_id 575 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: axis_ref 576 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: axis_type 577 INTEGER, OPTIONAL, INTENT(IN) :: begin 578 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: bounds(:, :) 579 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: bounds_name 580 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: comment 581 INTEGER, OPTIONAL, INTENT(IN) :: data_begin 582 INTEGER, OPTIONAL, INTENT(IN) :: data_index(:) 583 INTEGER, OPTIONAL, INTENT(IN) :: data_n 584 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: dim_name 585 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: formula 586 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: formula_bounds 587 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: formula_term 588 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: formula_term_bounds 589 INTEGER, OPTIONAL, INTENT(IN) :: index(:) 590 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: label(:) 591 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: long_name 592 LOGICAL, OPTIONAL, INTENT(IN) :: mask(:) 593 INTEGER, OPTIONAL, INTENT(IN) :: n 594 INTEGER, OPTIONAL, INTENT(IN) :: n_distributed_partition 595 INTEGER, OPTIONAL, INTENT(IN) :: n_glo 596 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: name 597 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: positive 598 INTEGER, OPTIONAL, INTENT(IN) :: prec 599 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: standard_name 600 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: unit 601 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: value(:) 608 602 609 603 END SUBROUTINE xios_set_axis_attr 610 604 611 605 SUBROUTINE xios_set_axis_attr_hdl & 612 (axis_hdl, axis_ref, axis_type, begin, bounds, bounds_name, comment, data_begin, data_index &613 , data_n, dim_name, formula, formula_bounds, formula_term, formula_term_bounds, index, label &614 , long_name, mask, n, n_distributed_partition, n_glo, name, positive, prec, standard_name, unit &615 , value)616 617 IMPLICIT NONE 618 TYPE(xios_axis), INTENT(IN) :: axis_hdl619 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: axis_ref620 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: axis_type621 INTEGER, OPTIONAL, INTENT(IN) :: begin622 REAL (KIND=8) , OPTIONAL, INTENT(IN) :: bounds(:,:)623 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: bounds_name624 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: comment625 INTEGER, OPTIONAL, INTENT(IN) :: data_begin626 INTEGER, OPTIONAL, INTENT(IN) :: data_index(:)627 INTEGER, OPTIONAL, INTENT(IN) :: data_n628 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: dim_name629 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: formula630 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: formula_bounds631 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: formula_term632 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: formula_term_bounds633 INTEGER, OPTIONAL, INTENT(IN) :: index(:)634 CHARACTER(len=*), OPTIONAL, INTENT(IN) :: label(:)635 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: long_name636 LOGICAL, OPTIONAL, INTENT(IN) :: mask(:)637 INTEGER, OPTIONAL, INTENT(IN) :: n638 INTEGER, OPTIONAL, INTENT(IN) :: n_distributed_partition639 INTEGER, OPTIONAL, INTENT(IN) :: n_glo640 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: name641 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: positive642 INTEGER, OPTIONAL, INTENT(IN) :: prec643 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: standard_name644 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: unit645 REAL (KIND=8), OPTIONAL, INTENT(IN) :: value(:)606 (axis_hdl, axis_ref, axis_type, begin, bounds, bounds_name, comment, data_begin, data_index & 607 , data_n, dim_name, formula, formula_bounds, formula_term, formula_term_bounds, index, label & 608 , long_name, mask, n, n_distributed_partition, n_glo, name, positive, prec, standard_name, unit & 609 , value) 610 611 IMPLICIT NONE 612 TYPE(xios_axis), INTENT(IN) :: axis_hdl 613 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: axis_ref 614 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: axis_type 615 INTEGER, OPTIONAL, INTENT(IN) :: begin 616 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: bounds(:, :) 617 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: bounds_name 618 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: comment 619 INTEGER, OPTIONAL, INTENT(IN) :: data_begin 620 INTEGER, OPTIONAL, INTENT(IN) :: data_index(:) 621 INTEGER, OPTIONAL, INTENT(IN) :: data_n 622 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: dim_name 623 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: formula 624 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: formula_bounds 625 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: formula_term 626 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: formula_term_bounds 627 INTEGER, OPTIONAL, INTENT(IN) :: index(:) 628 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: label(:) 629 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: long_name 630 LOGICAL, OPTIONAL, INTENT(IN) :: mask(:) 631 INTEGER, OPTIONAL, INTENT(IN) :: n 632 INTEGER, OPTIONAL, INTENT(IN) :: n_distributed_partition 633 INTEGER, OPTIONAL, INTENT(IN) :: n_glo 634 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: name 635 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: positive 636 INTEGER, OPTIONAL, INTENT(IN) :: prec 637 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: standard_name 638 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: unit 639 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: value(:) 646 640 647 641 END SUBROUTINE xios_set_axis_attr_hdl 648 642 649 643 SUBROUTINE xios_set_field_attr & 650 (field_id, add_offset, axis_ref, build_workflow_graph, cell_methods, cell_methods_mode, check_if_active &651 , comment, compression_level, default_value, detect_missing_value, domain_ref, enabled, expr &652 , field_ref, freq_offset, freq_op, grid_path, grid_ref, indexed_output, level, long_name, name &653 , operation, prec, read_access, scalar_ref, scale_factor, standard_name, ts_enabled, ts_split_freq &654 , unit, valid_max, valid_min)655 656 IMPLICIT NONE 657 TYPE(xios_field):: field_hdl658 CHARACTER(LEN=*), INTENT(IN) ::field_id659 REAL (KIND=8), OPTIONAL, INTENT(IN) :: add_offset660 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: axis_ref661 LOGICAL, OPTIONAL, INTENT(IN) :: build_workflow_graph662 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: cell_methods663 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: cell_methods_mode664 LOGICAL, OPTIONAL, INTENT(IN) :: check_if_active665 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: comment666 INTEGER, OPTIONAL, INTENT(IN) :: compression_level667 REAL (KIND=8), OPTIONAL, INTENT(IN) :: default_value668 LOGICAL, OPTIONAL, INTENT(IN) :: detect_missing_value669 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: domain_ref670 LOGICAL, OPTIONAL, INTENT(IN) :: enabled671 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: expr672 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: field_ref673 TYPE(xios_duration), OPTIONAL, INTENT(IN) :: freq_offset674 TYPE(xios_duration), OPTIONAL, INTENT(IN) :: freq_op675 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: grid_path676 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: grid_ref677 LOGICAL, OPTIONAL, INTENT(IN) :: indexed_output678 INTEGER, OPTIONAL, INTENT(IN) :: level679 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: long_name680 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: name681 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: operation682 INTEGER, OPTIONAL, INTENT(IN) :: prec683 LOGICAL, OPTIONAL, INTENT(IN) :: read_access684 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: scalar_ref685 REAL (KIND=8), OPTIONAL, INTENT(IN) :: scale_factor686 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: standard_name687 LOGICAL, OPTIONAL, INTENT(IN) :: ts_enabled688 TYPE(xios_duration), OPTIONAL, INTENT(IN) :: ts_split_freq689 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: unit690 REAL (KIND=8), OPTIONAL, INTENT(IN) :: valid_max691 REAL (KIND=8), OPTIONAL, INTENT(IN) :: valid_min644 (field_id, add_offset, axis_ref, build_workflow_graph, cell_methods, cell_methods_mode, check_if_active & 645 , comment, compression_level, default_value, detect_missing_value, domain_ref, enabled, expr & 646 , field_ref, freq_offset, freq_op, grid_path, grid_ref, indexed_output, level, long_name, name & 647 , operation, prec, read_access, scalar_ref, scale_factor, standard_name, ts_enabled, ts_split_freq & 648 , unit, valid_max, valid_min) 649 650 IMPLICIT NONE 651 TYPE(xios_field) :: field_hdl 652 CHARACTER(LEN = *), INTENT(IN) :: field_id 653 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: add_offset 654 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: axis_ref 655 LOGICAL, OPTIONAL, INTENT(IN) :: build_workflow_graph 656 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: cell_methods 657 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: cell_methods_mode 658 LOGICAL, OPTIONAL, INTENT(IN) :: check_if_active 659 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: comment 660 INTEGER, OPTIONAL, INTENT(IN) :: compression_level 661 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: default_value 662 LOGICAL, OPTIONAL, INTENT(IN) :: detect_missing_value 663 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: domain_ref 664 LOGICAL, OPTIONAL, INTENT(IN) :: enabled 665 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: expr 666 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: field_ref 667 TYPE(xios_duration), OPTIONAL, INTENT(IN) :: freq_offset 668 TYPE(xios_duration), OPTIONAL, INTENT(IN) :: freq_op 669 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: grid_path 670 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: grid_ref 671 LOGICAL, OPTIONAL, INTENT(IN) :: indexed_output 672 INTEGER, OPTIONAL, INTENT(IN) :: level 673 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: long_name 674 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: name 675 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: operation 676 INTEGER, OPTIONAL, INTENT(IN) :: prec 677 LOGICAL, OPTIONAL, INTENT(IN) :: read_access 678 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: scalar_ref 679 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: scale_factor 680 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: standard_name 681 LOGICAL, OPTIONAL, INTENT(IN) :: ts_enabled 682 TYPE(xios_duration), OPTIONAL, INTENT(IN) :: ts_split_freq 683 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: unit 684 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: valid_max 685 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: valid_min 692 686 693 687 END SUBROUTINE xios_set_field_attr 694 688 695 689 SUBROUTINE xios_set_field_attr_hdl & 696 ( field_hdl, add_offset, axis_ref, build_workflow_graph, cell_methods, cell_methods_mode, check_if_active & 697 , comment, compression_level, default_value, detect_missing_value, domain_ref, enabled, expr & 698 , field_ref, freq_offset, freq_op, grid_path, grid_ref, indexed_output, level, long_name, name & 699 , operation, prec, read_access, scalar_ref, scale_factor, standard_name, ts_enabled, ts_split_freq & 700 , unit, valid_max, valid_min ) 701 702 IMPLICIT NONE 703 TYPE(xios_field) , INTENT(IN) :: field_hdl 704 REAL (KIND=8) , OPTIONAL, INTENT(IN) :: add_offset 705 CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: axis_ref 706 LOGICAL , OPTIONAL, INTENT(IN) :: build_workflow_graph 707 CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: cell_methods 708 CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: cell_methods_mode 709 LOGICAL , OPTIONAL, INTENT(IN) :: check_if_active 710 CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: comment 711 INTEGER , OPTIONAL, INTENT(IN) :: compression_level 712 REAL (KIND=8) , OPTIONAL, INTENT(IN) :: default_value 713 LOGICAL , OPTIONAL, INTENT(IN) :: detect_missing_value 714 CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: domain_ref 715 LOGICAL , OPTIONAL, INTENT(IN) :: enabled 716 CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: expr 717 CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: field_ref 718 TYPE(xios_duration) , OPTIONAL, INTENT(IN) :: freq_offset 719 TYPE(xios_duration) , OPTIONAL, INTENT(IN) :: freq_op 720 CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: grid_path 721 CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: grid_ref 722 LOGICAL , OPTIONAL, INTENT(IN) :: indexed_output 723 INTEGER , OPTIONAL, INTENT(IN) :: level 724 CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: long_name 725 CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name 726 CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: operation 727 INTEGER , OPTIONAL, INTENT(IN) :: prec 728 LOGICAL , OPTIONAL, INTENT(IN) :: read_access 729 CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: scalar_ref 730 REAL (KIND=8) , OPTIONAL, INTENT(IN) :: scale_factor 731 CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: standard_name 732 LOGICAL , OPTIONAL, INTENT(IN) :: ts_enabled 733 TYPE(xios_duration) , OPTIONAL, INTENT(IN) :: ts_split_freq 734 CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: unit 735 REAL (KIND=8) , OPTIONAL, INTENT(IN) :: valid_max 736 REAL (KIND=8) , OPTIONAL, INTENT(IN) :: valid_min 737 690 (field_hdl, add_offset, axis_ref, build_workflow_graph, cell_methods, cell_methods_mode, check_if_active & 691 , comment, compression_level, default_value, detect_missing_value, domain_ref, enabled, expr & 692 , field_ref, freq_offset, freq_op, grid_path, grid_ref, indexed_output, level, long_name, name & 693 , operation, prec, read_access, scalar_ref, scale_factor, standard_name, ts_enabled, ts_split_freq & 694 , unit, valid_max, valid_min) 695 696 IMPLICIT NONE 697 TYPE(xios_field), INTENT(IN) :: field_hdl 698 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: add_offset 699 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: axis_ref 700 LOGICAL, OPTIONAL, INTENT(IN) :: build_workflow_graph 701 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: cell_methods 702 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: cell_methods_mode 703 LOGICAL, OPTIONAL, INTENT(IN) :: check_if_active 704 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: comment 705 INTEGER, OPTIONAL, INTENT(IN) :: compression_level 706 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: default_value 707 LOGICAL, OPTIONAL, INTENT(IN) :: detect_missing_value 708 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: domain_ref 709 LOGICAL, OPTIONAL, INTENT(IN) :: enabled 710 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: expr 711 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: field_ref 712 TYPE(xios_duration), OPTIONAL, INTENT(IN) :: freq_offset 713 TYPE(xios_duration), OPTIONAL, INTENT(IN) :: freq_op 714 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: grid_path 715 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: grid_ref 716 LOGICAL, OPTIONAL, INTENT(IN) :: indexed_output 717 INTEGER, OPTIONAL, INTENT(IN) :: level 718 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: long_name 719 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: name 720 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: operation 721 INTEGER, OPTIONAL, INTENT(IN) :: prec 722 LOGICAL, OPTIONAL, INTENT(IN) :: read_access 723 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: scalar_ref 724 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: scale_factor 725 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: standard_name 726 LOGICAL, OPTIONAL, INTENT(IN) :: ts_enabled 727 TYPE(xios_duration), OPTIONAL, INTENT(IN) :: ts_split_freq 728 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: unit 729 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: valid_max 730 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: valid_min 738 731 739 732 END SUBROUTINE xios_set_field_attr_hdl … … 741 734 742 735 SUBROUTINE xios_set_fieldgroup_attr & 743 (fieldgroup_id, add_offset, axis_ref, build_workflow_graph, cell_methods, cell_methods_mode &744 , check_if_active, comment, compression_level, default_value, detect_missing_value, domain_ref &745 , enabled, expr, field_ref, freq_offset, freq_op, grid_path, grid_ref, group_ref, indexed_output &746 , level, long_name, name, operation, prec, read_access, scalar_ref, scale_factor, standard_name &747 , ts_enabled, ts_split_freq, unit, valid_max, valid_min)748 749 IMPLICIT NONE 750 TYPE(xios_fieldgroup):: fieldgroup_hdl751 CHARACTER(LEN=*), INTENT(IN) ::fieldgroup_id752 REAL (KIND=8), OPTIONAL, INTENT(IN) :: add_offset753 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: axis_ref754 LOGICAL, OPTIONAL, INTENT(IN) :: build_workflow_graph755 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: cell_methods756 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: cell_methods_mode757 LOGICAL, OPTIONAL, INTENT(IN) :: check_if_active758 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: comment759 INTEGER, OPTIONAL, INTENT(IN) :: compression_level760 REAL (KIND=8), OPTIONAL, INTENT(IN) :: default_value761 LOGICAL, OPTIONAL, INTENT(IN) :: detect_missing_value762 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: domain_ref763 LOGICAL, OPTIONAL, INTENT(IN) :: enabled764 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: expr765 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: field_ref766 TYPE(xios_duration), OPTIONAL, INTENT(IN) :: freq_offset767 TYPE(xios_duration), OPTIONAL, INTENT(IN) :: freq_op768 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: grid_path769 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: grid_ref770 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: group_ref771 LOGICAL, OPTIONAL, INTENT(IN) :: indexed_output772 INTEGER, OPTIONAL, INTENT(IN) :: level773 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: long_name774 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: name775 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: operation776 INTEGER, OPTIONAL, INTENT(IN) :: prec777 LOGICAL, OPTIONAL, INTENT(IN) :: read_access778 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: scalar_ref779 REAL (KIND=8), OPTIONAL, INTENT(IN) :: scale_factor780 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: standard_name781 LOGICAL, OPTIONAL, INTENT(IN) :: ts_enabled782 TYPE(xios_duration), OPTIONAL, INTENT(IN) :: ts_split_freq783 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: unit784 REAL (KIND=8), OPTIONAL, INTENT(IN) :: valid_max785 REAL (KIND=8), OPTIONAL, INTENT(IN) :: valid_min736 (fieldgroup_id, add_offset, axis_ref, build_workflow_graph, cell_methods, cell_methods_mode & 737 , check_if_active, comment, compression_level, default_value, detect_missing_value, domain_ref & 738 , enabled, expr, field_ref, freq_offset, freq_op, grid_path, grid_ref, group_ref, indexed_output & 739 , level, long_name, name, operation, prec, read_access, scalar_ref, scale_factor, standard_name & 740 , ts_enabled, ts_split_freq, unit, valid_max, valid_min) 741 742 IMPLICIT NONE 743 TYPE(xios_fieldgroup) :: fieldgroup_hdl 744 CHARACTER(LEN = *), INTENT(IN) :: fieldgroup_id 745 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: add_offset 746 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: axis_ref 747 LOGICAL, OPTIONAL, INTENT(IN) :: build_workflow_graph 748 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: cell_methods 749 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: cell_methods_mode 750 LOGICAL, OPTIONAL, INTENT(IN) :: check_if_active 751 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: comment 752 INTEGER, OPTIONAL, INTENT(IN) :: compression_level 753 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: default_value 754 LOGICAL, OPTIONAL, INTENT(IN) :: detect_missing_value 755 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: domain_ref 756 LOGICAL, OPTIONAL, INTENT(IN) :: enabled 757 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: expr 758 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: field_ref 759 TYPE(xios_duration), OPTIONAL, INTENT(IN) :: freq_offset 760 TYPE(xios_duration), OPTIONAL, INTENT(IN) :: freq_op 761 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: grid_path 762 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: grid_ref 763 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: group_ref 764 LOGICAL, OPTIONAL, INTENT(IN) :: indexed_output 765 INTEGER, OPTIONAL, INTENT(IN) :: level 766 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: long_name 767 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: name 768 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: operation 769 INTEGER, OPTIONAL, INTENT(IN) :: prec 770 LOGICAL, OPTIONAL, INTENT(IN) :: read_access 771 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: scalar_ref 772 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: scale_factor 773 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: standard_name 774 LOGICAL, OPTIONAL, INTENT(IN) :: ts_enabled 775 TYPE(xios_duration), OPTIONAL, INTENT(IN) :: ts_split_freq 776 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: unit 777 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: valid_max 778 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: valid_min 786 779 787 780 END SUBROUTINE xios_set_fieldgroup_attr 788 781 789 782 SUBROUTINE xios_set_fieldgroup_attr_hdl & 790 (fieldgroup_hdl, add_offset, axis_ref, build_workflow_graph, cell_methods, cell_methods_mode &791 , check_if_active, comment, compression_level, default_value, detect_missing_value, domain_ref &792 , enabled, expr, field_ref, freq_offset, freq_op, grid_path, grid_ref, group_ref, indexed_output &793 , level, long_name, name, operation, prec, read_access, scalar_ref, scale_factor, standard_name &794 , ts_enabled, ts_split_freq, unit, valid_max, valid_min)795 796 IMPLICIT NONE 797 TYPE(xios_fieldgroup), INTENT(IN) :: fieldgroup_hdl798 REAL (KIND=8), OPTIONAL, INTENT(IN) :: add_offset799 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: axis_ref800 LOGICAL, OPTIONAL, INTENT(IN) :: build_workflow_graph801 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: cell_methods802 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: cell_methods_mode803 LOGICAL, OPTIONAL, INTENT(IN) :: check_if_active804 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: comment805 INTEGER, OPTIONAL, INTENT(IN) :: compression_level806 REAL (KIND=8), OPTIONAL, INTENT(IN) :: default_value807 LOGICAL, OPTIONAL, INTENT(IN) :: detect_missing_value808 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: domain_ref809 LOGICAL, OPTIONAL, INTENT(IN) :: enabled810 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: expr811 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: field_ref812 TYPE(xios_duration), OPTIONAL, INTENT(IN) :: freq_offset813 TYPE(xios_duration), OPTIONAL, INTENT(IN) :: freq_op814 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: grid_path815 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: grid_ref816 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: group_ref817 LOGICAL, OPTIONAL, INTENT(IN) :: indexed_output818 INTEGER, OPTIONAL, INTENT(IN) :: level819 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: long_name820 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: name821 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: operation822 INTEGER, OPTIONAL, INTENT(IN) :: prec823 LOGICAL, OPTIONAL, INTENT(IN) :: read_access824 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: scalar_ref825 REAL (KIND=8), OPTIONAL, INTENT(IN) :: scale_factor826 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: standard_name827 LOGICAL, OPTIONAL, INTENT(IN) :: ts_enabled828 TYPE(xios_duration), OPTIONAL, INTENT(IN) :: ts_split_freq829 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: unit830 REAL (KIND=8), OPTIONAL, INTENT(IN) :: valid_max831 REAL (KIND=8), OPTIONAL, INTENT(IN) :: valid_min783 (fieldgroup_hdl, add_offset, axis_ref, build_workflow_graph, cell_methods, cell_methods_mode & 784 , check_if_active, comment, compression_level, default_value, detect_missing_value, domain_ref & 785 , enabled, expr, field_ref, freq_offset, freq_op, grid_path, grid_ref, group_ref, indexed_output & 786 , level, long_name, name, operation, prec, read_access, scalar_ref, scale_factor, standard_name & 787 , ts_enabled, ts_split_freq, unit, valid_max, valid_min) 788 789 IMPLICIT NONE 790 TYPE(xios_fieldgroup), INTENT(IN) :: fieldgroup_hdl 791 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: add_offset 792 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: axis_ref 793 LOGICAL, OPTIONAL, INTENT(IN) :: build_workflow_graph 794 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: cell_methods 795 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: cell_methods_mode 796 LOGICAL, OPTIONAL, INTENT(IN) :: check_if_active 797 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: comment 798 INTEGER, OPTIONAL, INTENT(IN) :: compression_level 799 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: default_value 800 LOGICAL, OPTIONAL, INTENT(IN) :: detect_missing_value 801 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: domain_ref 802 LOGICAL, OPTIONAL, INTENT(IN) :: enabled 803 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: expr 804 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: field_ref 805 TYPE(xios_duration), OPTIONAL, INTENT(IN) :: freq_offset 806 TYPE(xios_duration), OPTIONAL, INTENT(IN) :: freq_op 807 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: grid_path 808 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: grid_ref 809 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: group_ref 810 LOGICAL, OPTIONAL, INTENT(IN) :: indexed_output 811 INTEGER, OPTIONAL, INTENT(IN) :: level 812 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: long_name 813 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: name 814 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: operation 815 INTEGER, OPTIONAL, INTENT(IN) :: prec 816 LOGICAL, OPTIONAL, INTENT(IN) :: read_access 817 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: scalar_ref 818 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: scale_factor 819 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: standard_name 820 LOGICAL, OPTIONAL, INTENT(IN) :: ts_enabled 821 TYPE(xios_duration), OPTIONAL, INTENT(IN) :: ts_split_freq 822 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: unit 823 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: valid_max 824 REAL (KIND = 8), OPTIONAL, INTENT(IN) :: valid_min 832 825 833 826 END SUBROUTINE xios_set_fieldgroup_attr_hdl … … 835 828 836 829 SUBROUTINE xios_set_file_attr & 837 (file_id, append, comment, compression_level, convention, convention_str, cyclic, description &838 , enabled, format, min_digits, mode, name, name_suffix, output_freq, output_level, par_access &839 , read_metadata_par, record_offset, split_end_offset, split_freq, split_freq_format, split_last_date &840 , split_start_offset, sync_freq, time_counter, time_counter_name, time_stamp_format, time_stamp_name &841 , time_units, timeseries, ts_prefix, type, uuid_format, uuid_name)842 843 IMPLICIT NONE 844 TYPE(xios_file):: file_hdl845 CHARACTER(LEN=*), INTENT(IN) ::file_id846 LOGICAL, OPTIONAL, INTENT(IN) :: append847 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: comment848 INTEGER, OPTIONAL, INTENT(IN) :: compression_level849 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: convention850 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: convention_str851 LOGICAL, OPTIONAL, INTENT(IN) :: cyclic852 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: description853 LOGICAL, OPTIONAL, INTENT(IN) :: enabled854 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: format855 INTEGER, OPTIONAL, INTENT(IN) :: min_digits856 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: mode857 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: name858 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: name_suffix859 TYPE(xios_duration), OPTIONAL, INTENT(IN) :: output_freq860 INTEGER, OPTIONAL, INTENT(IN) :: output_level861 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: par_access862 LOGICAL, OPTIONAL, INTENT(IN) :: read_metadata_par863 INTEGER, OPTIONAL, INTENT(IN) :: record_offset864 TYPE(xios_duration), OPTIONAL, INTENT(IN) :: split_end_offset865 TYPE(xios_duration), OPTIONAL, INTENT(IN) :: split_freq866 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: split_freq_format867 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: split_last_date868 TYPE(xios_duration), OPTIONAL, INTENT(IN) :: split_start_offset869 TYPE(xios_duration), OPTIONAL, INTENT(IN) :: sync_freq870 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: time_counter871 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: time_counter_name872 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: time_stamp_format873 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: time_stamp_name874 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: time_units875 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: timeseries876 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: ts_prefix877 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: type878 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: uuid_format879 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: uuid_name830 (file_id, append, comment, compression_level, convention, convention_str, cyclic, description & 831 , enabled, format, min_digits, mode, name, name_suffix, output_freq, output_level, par_access & 832 , read_metadata_par, record_offset, split_end_offset, split_freq, split_freq_format, split_last_date & 833 , split_start_offset, sync_freq, time_counter, time_counter_name, time_stamp_format, time_stamp_name & 834 , time_units, timeseries, ts_prefix, type, uuid_format, uuid_name) 835 836 IMPLICIT NONE 837 TYPE(xios_file) :: file_hdl 838 CHARACTER(LEN = *), INTENT(IN) :: file_id 839 LOGICAL, OPTIONAL, INTENT(IN) :: append 840 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: comment 841 INTEGER, OPTIONAL, INTENT(IN) :: compression_level 842 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: convention 843 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: convention_str 844 LOGICAL, OPTIONAL, INTENT(IN) :: cyclic 845 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: description 846 LOGICAL, OPTIONAL, INTENT(IN) :: enabled 847 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: format 848 INTEGER, OPTIONAL, INTENT(IN) :: min_digits 849 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: mode 850 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: name 851 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: name_suffix 852 TYPE(xios_duration), OPTIONAL, INTENT(IN) :: output_freq 853 INTEGER, OPTIONAL, INTENT(IN) :: output_level 854 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: par_access 855 LOGICAL, OPTIONAL, INTENT(IN) :: read_metadata_par 856 INTEGER, OPTIONAL, INTENT(IN) :: record_offset 857 TYPE(xios_duration), OPTIONAL, INTENT(IN) :: split_end_offset 858 TYPE(xios_duration), OPTIONAL, INTENT(IN) :: split_freq 859 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: split_freq_format 860 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: split_last_date 861 TYPE(xios_duration), OPTIONAL, INTENT(IN) :: split_start_offset 862 TYPE(xios_duration), OPTIONAL, INTENT(IN) :: sync_freq 863 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: time_counter 864 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: time_counter_name 865 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: time_stamp_format 866 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: time_stamp_name 867 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: time_units 868 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: timeseries 869 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: ts_prefix 870 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: type 871 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: uuid_format 872 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: uuid_name 880 873 881 874 END SUBROUTINE xios_set_file_attr 882 875 883 876 SUBROUTINE xios_set_file_attr_hdl & 884 (file_hdl, append, comment, compression_level, convention, convention_str, cyclic, description &885 , enabled, format, min_digits, mode, name, name_suffix, output_freq, output_level, par_access &886 , read_metadata_par, record_offset, split_end_offset, split_freq, split_freq_format, split_last_date &887 , split_start_offset, sync_freq, time_counter, time_counter_name, time_stamp_format, time_stamp_name &888 , time_units, timeseries, ts_prefix, type, uuid_format, uuid_name)889 890 IMPLICIT NONE 891 TYPE(xios_file), INTENT(IN) :: file_hdl892 LOGICAL, OPTIONAL, INTENT(IN) :: append893 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: comment894 INTEGER, OPTIONAL, INTENT(IN) :: compression_level895 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: convention896 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: convention_str897 LOGICAL, OPTIONAL, INTENT(IN) :: cyclic898 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: description899 LOGICAL, OPTIONAL, INTENT(IN) :: enabled900 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: format901 INTEGER, OPTIONAL, INTENT(IN) :: min_digits902 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: mode903 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: name904 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: name_suffix905 TYPE(xios_duration), OPTIONAL, INTENT(IN) :: output_freq906 INTEGER, OPTIONAL, INTENT(IN) :: output_level907 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: par_access908 LOGICAL, OPTIONAL, INTENT(IN) :: read_metadata_par909 INTEGER, OPTIONAL, INTENT(IN) :: record_offset910 TYPE(xios_duration), OPTIONAL, INTENT(IN) :: split_end_offset911 TYPE(xios_duration), OPTIONAL, INTENT(IN) :: split_freq912 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: split_freq_format913 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: split_last_date914 TYPE(xios_duration), OPTIONAL, INTENT(IN) :: split_start_offset915 TYPE(xios_duration), OPTIONAL, INTENT(IN) :: sync_freq916 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: time_counter917 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: time_counter_name918 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: time_stamp_format919 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: time_stamp_name920 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: time_units921 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: timeseries922 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: ts_prefix923 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: type924 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: uuid_format925 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: uuid_name877 (file_hdl, append, comment, compression_level, convention, convention_str, cyclic, description & 878 , enabled, format, min_digits, mode, name, name_suffix, output_freq, output_level, par_access & 879 , read_metadata_par, record_offset, split_end_offset, split_freq, split_freq_format, split_last_date & 880 , split_start_offset, sync_freq, time_counter, time_counter_name, time_stamp_format, time_stamp_name & 881 , time_units, timeseries, ts_prefix, type, uuid_format, uuid_name) 882 883 IMPLICIT NONE 884 TYPE(xios_file), INTENT(IN) :: file_hdl 885 LOGICAL, OPTIONAL, INTENT(IN) :: append 886 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: comment 887 INTEGER, OPTIONAL, INTENT(IN) :: compression_level 888 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: convention 889 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: convention_str 890 LOGICAL, OPTIONAL, INTENT(IN) :: cyclic 891 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: description 892 LOGICAL, OPTIONAL, INTENT(IN) :: enabled 893 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: format 894 INTEGER, OPTIONAL, INTENT(IN) :: min_digits 895 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: mode 896 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: name 897 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: name_suffix 898 TYPE(xios_duration), OPTIONAL, INTENT(IN) :: output_freq 899 INTEGER, OPTIONAL, INTENT(IN) :: output_level 900 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: par_access 901 LOGICAL, OPTIONAL, INTENT(IN) :: read_metadata_par 902 INTEGER, OPTIONAL, INTENT(IN) :: record_offset 903 TYPE(xios_duration), OPTIONAL, INTENT(IN) :: split_end_offset 904 TYPE(xios_duration), OPTIONAL, INTENT(IN) :: split_freq 905 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: split_freq_format 906 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: split_last_date 907 TYPE(xios_duration), OPTIONAL, INTENT(IN) :: split_start_offset 908 TYPE(xios_duration), OPTIONAL, INTENT(IN) :: sync_freq 909 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: time_counter 910 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: time_counter_name 911 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: time_stamp_format 912 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: time_stamp_name 913 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: time_units 914 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: timeseries 915 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: ts_prefix 916 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: type 917 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: uuid_format 918 CHARACTER(len = *), OPTIONAL, INTENT(IN) :: uuid_name 926 919 927 920 END SUBROUTINE xios_set_file_attr_hdl … … 929 922 930 923 SUBROUTINE xios_is_defined_domain_attr & 931 (domain_id, area, bounds_lat_1d, bounds_lat_2d, bounds_lat_name, bounds_lon_1d, bounds_lon_2d &932 , bounds_lon_name, comment, data_dim, data_i_index, data_ibegin, data_j_index, data_jbegin, data_ni &933 , data_nj, dim_i_name, dim_j_name, domain_ref, i_index, ibegin, j_index, jbegin, lat_name, latvalue_1d &934 , latvalue_2d, lon_name, long_name, lonvalue_1d, lonvalue_2d, mask_1d, mask_2d, name, ni, ni_glo &935 , nj, nj_glo, nvertex, prec, radius, standard_name, type)936 937 IMPLICIT NONE 938 CHARACTER(LEN=*), INTENT(IN) ::domain_id939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 924 (domain_id, area, bounds_lat_1d, bounds_lat_2d, bounds_lat_name, bounds_lon_1d, bounds_lon_2d & 925 , bounds_lon_name, comment, data_dim, data_i_index, data_ibegin, data_j_index, data_jbegin, data_ni & 926 , data_nj, dim_i_name, dim_j_name, domain_ref, i_index, ibegin, j_index, jbegin, lat_name, latvalue_1d & 927 , latvalue_2d, lon_name, long_name, lonvalue_1d, lonvalue_2d, mask_1d, mask_2d, name, ni, ni_glo & 928 , nj, nj_glo, nvertex, prec, radius, standard_name, type) 929 930 IMPLICIT NONE 931 CHARACTER(LEN = *), INTENT(IN) :: domain_id 932 LOGICAL, OPTIONAL, INTENT(OUT) :: area 933 LOGICAL, OPTIONAL, INTENT(OUT) :: bounds_lat_1d 934 LOGICAL, OPTIONAL, INTENT(OUT) :: bounds_lat_2d 935 LOGICAL, OPTIONAL, INTENT(OUT) :: bounds_lat_name 936 LOGICAL, OPTIONAL, INTENT(OUT) :: bounds_lon_1d 937 LOGICAL, OPTIONAL, INTENT(OUT) :: bounds_lon_2d 938 LOGICAL, OPTIONAL, INTENT(OUT) :: bounds_lon_name 939 LOGICAL, OPTIONAL, INTENT(OUT) :: comment 940 LOGICAL, OPTIONAL, INTENT(OUT) :: data_dim 941 LOGICAL, OPTIONAL, INTENT(OUT) :: data_i_index 942 LOGICAL, OPTIONAL, INTENT(OUT) :: data_ibegin 943 LOGICAL, OPTIONAL, INTENT(OUT) :: data_j_index 944 LOGICAL, OPTIONAL, INTENT(OUT) :: data_jbegin 945 LOGICAL, OPTIONAL, INTENT(OUT) :: data_ni 946 LOGICAL, OPTIONAL, INTENT(OUT) :: data_nj 947 LOGICAL, OPTIONAL, INTENT(OUT) :: dim_i_name 948 LOGICAL, OPTIONAL, INTENT(OUT) :: dim_j_name 949 LOGICAL, OPTIONAL, INTENT(OUT) :: domain_ref 950 LOGICAL, OPTIONAL, INTENT(OUT) :: i_index 951 LOGICAL, OPTIONAL, INTENT(OUT) :: ibegin 952 LOGICAL, OPTIONAL, INTENT(OUT) :: j_index 953 LOGICAL, OPTIONAL, INTENT(OUT) :: jbegin 954 LOGICAL, OPTIONAL, INTENT(OUT) :: lat_name 955 LOGICAL, OPTIONAL, INTENT(OUT) :: latvalue_1d 956 LOGICAL, OPTIONAL, INTENT(OUT) :: latvalue_2d 957 LOGICAL, OPTIONAL, INTENT(OUT) :: lon_name 958 LOGICAL, OPTIONAL, INTENT(OUT) :: long_name 959 LOGICAL, OPTIONAL, INTENT(OUT) :: lonvalue_1d 960 LOGICAL, OPTIONAL, INTENT(OUT) :: lonvalue_2d 961 LOGICAL, OPTIONAL, INTENT(OUT) :: mask_1d 962 LOGICAL, OPTIONAL, INTENT(OUT) :: mask_2d 963 LOGICAL, OPTIONAL, INTENT(OUT) :: name 964 LOGICAL, OPTIONAL, INTENT(OUT) :: ni 965 LOGICAL, OPTIONAL, INTENT(OUT) :: ni_glo 966 LOGICAL, OPTIONAL, INTENT(OUT) :: nj 967 LOGICAL, OPTIONAL, INTENT(OUT) :: nj_glo 968 LOGICAL, OPTIONAL, INTENT(OUT) :: nvertex 969 LOGICAL, OPTIONAL, INTENT(OUT) :: prec 970 LOGICAL, OPTIONAL, INTENT(OUT) :: radius 971 LOGICAL, OPTIONAL, INTENT(OUT) :: standard_name 972 LOGICAL, OPTIONAL, INTENT(OUT) :: type 973 974 area = .FALSE. 975 bounds_lat_1d = .FALSE. 976 bounds_lat_2d = .FALSE. 977 bounds_lat_name = .FALSE. 978 bounds_lon_1d = .FALSE. 979 bounds_lon_2d = .FALSE. 980 bounds_lon_name = .FALSE. 981 comment = .FALSE. 982 data_dim = .FALSE. 983 data_i_index = .FALSE. 984 data_ibegin = .FALSE. 985 data_j_index = .FALSE. 986 data_jbegin = .FALSE. 987 data_ni = .FALSE. 988 data_nj = .FALSE. 989 dim_i_name = .FALSE. 990 dim_j_name = .FALSE. 991 domain_ref = .FALSE. 992 i_index = .FALSE. 993 ibegin = .FALSE. 994 j_index = .FALSE. 995 jbegin = .FALSE. 996 lat_name = .FALSE. 997 latvalue_1d = .FALSE. 998 latvalue_2d = .FALSE. 999 lon_name = .FALSE. 1000 long_name = .FALSE. 1001 lonvalue_1d = .FALSE. 1002 lonvalue_2d = .FALSE. 1003 mask_1d = .FALSE. 1004 mask_2d = .FALSE. 1005 name = .FALSE. 1006 ni = .FALSE. 1007 ni_glo = .FALSE. 1008 nj = .FALSE. 1009 nj_glo = .FALSE. 1010 nvertex = .FALSE. 1011 prec = .FALSE. 1012 radius = .FALSE. 1013 standard_name = .FALSE. 1014 type = .FALSE. 1022 1015 1023 1016 END SUBROUTINE xios_is_defined_domain_attr 1024 1017 1025 1018 SUBROUTINE xios_is_defined_domain_attr_hdl & 1026 (domain_hdl, area, bounds_lat_1d, bounds_lat_2d, bounds_lat_name, bounds_lon_1d, bounds_lon_2d &1027 , bounds_lon_name, comment, data_dim, data_i_index, data_ibegin, data_j_index, data_jbegin, data_ni &1028 , data_nj, dim_i_name, dim_j_name, domain_ref, i_index, ibegin, j_index, jbegin, lat_name, latvalue_1d &1029 , latvalue_2d, lon_name, long_name, lonvalue_1d, lonvalue_2d, mask_1d, mask_2d, name, ni, ni_glo &1030 , nj, nj_glo, nvertex, prec, radius, standard_name, type)1031 1032 IMPLICIT NONE 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1019 (domain_hdl, area, bounds_lat_1d, bounds_lat_2d, bounds_lat_name, bounds_lon_1d, bounds_lon_2d & 1020 , bounds_lon_name, comment, data_dim, data_i_index, data_ibegin, data_j_index, data_jbegin, data_ni & 1021 , data_nj, dim_i_name, dim_j_name, domain_ref, i_index, ibegin, j_index, jbegin, lat_name, latvalue_1d & 1022 , latvalue_2d, lon_name, long_name, lonvalue_1d, lonvalue_2d, mask_1d, mask_2d, name, ni, ni_glo & 1023 , nj, nj_glo, nvertex, prec, radius, standard_name, type) 1024 1025 IMPLICIT NONE 1026 TYPE(xios_domain), INTENT(IN) :: domain_hdl 1027 LOGICAL, OPTIONAL, INTENT(OUT) :: area 1028 LOGICAL, OPTIONAL, INTENT(OUT) :: bounds_lat_1d 1029 LOGICAL, OPTIONAL, INTENT(OUT) :: bounds_lat_2d 1030 LOGICAL, OPTIONAL, INTENT(OUT) :: bounds_lat_name 1031 LOGICAL, OPTIONAL, INTENT(OUT) :: bounds_lon_1d 1032 LOGICAL, OPTIONAL, INTENT(OUT) :: bounds_lon_2d 1033 LOGICAL, OPTIONAL, INTENT(OUT) :: bounds_lon_name 1034 LOGICAL, OPTIONAL, INTENT(OUT) :: comment 1035 LOGICAL, OPTIONAL, INTENT(OUT) :: data_dim 1036 LOGICAL, OPTIONAL, INTENT(OUT) :: data_i_index 1037 LOGICAL, OPTIONAL, INTENT(OUT) :: data_ibegin 1038 LOGICAL, OPTIONAL, INTENT(OUT) :: data_j_index 1039 LOGICAL, OPTIONAL, INTENT(OUT) :: data_jbegin 1040 LOGICAL, OPTIONAL, INTENT(OUT) :: data_ni 1041 LOGICAL, OPTIONAL, INTENT(OUT) :: data_nj 1042 LOGICAL, OPTIONAL, INTENT(OUT) :: dim_i_name 1043 LOGICAL, OPTIONAL, INTENT(OUT) :: dim_j_name 1044 LOGICAL, OPTIONAL, INTENT(OUT) :: domain_ref 1045 LOGICAL, OPTIONAL, INTENT(OUT) :: i_index 1046 LOGICAL, OPTIONAL, INTENT(OUT) :: ibegin 1047 LOGICAL, OPTIONAL, INTENT(OUT) :: j_index 1048 LOGICAL, OPTIONAL, INTENT(OUT) :: jbegin 1049 LOGICAL, OPTIONAL, INTENT(OUT) :: lat_name 1050 LOGICAL, OPTIONAL, INTENT(OUT) :: latvalue_1d 1051 LOGICAL, OPTIONAL, INTENT(OUT) :: latvalue_2d 1052 LOGICAL, OPTIONAL, INTENT(OUT) :: lon_name 1053 LOGICAL, OPTIONAL, INTENT(OUT) :: long_name 1054 LOGICAL, OPTIONAL, INTENT(OUT) :: lonvalue_1d 1055 LOGICAL, OPTIONAL, INTENT(OUT) :: lonvalue_2d 1056 LOGICAL, OPTIONAL, INTENT(OUT) :: mask_1d 1057 LOGICAL, OPTIONAL, INTENT(OUT) :: mask_2d 1058 LOGICAL, OPTIONAL, INTENT(OUT) :: name 1059 LOGICAL, OPTIONAL, INTENT(OUT) :: ni 1060 LOGICAL, OPTIONAL, INTENT(OUT) :: ni_glo 1061 LOGICAL, OPTIONAL, INTENT(OUT) :: nj 1062 LOGICAL, OPTIONAL, INTENT(OUT) :: nj_glo 1063 LOGICAL, OPTIONAL, INTENT(OUT) :: nvertex 1064 LOGICAL, OPTIONAL, INTENT(OUT) :: prec 1065 LOGICAL, OPTIONAL, INTENT(OUT) :: radius 1066 LOGICAL, OPTIONAL, INTENT(OUT) :: standard_name 1067 LOGICAL, OPTIONAL, INTENT(OUT) :: type 1068 1069 area = .FALSE. 1070 bounds_lat_1d = .FALSE. 1071 bounds_lat_2d = .FALSE. 1072 bounds_lat_name = .FALSE. 1073 bounds_lon_1d = .FALSE. 1074 bounds_lon_2d = .FALSE. 1075 bounds_lon_name = .FALSE. 1076 comment = .FALSE. 1077 data_dim = .FALSE. 1078 data_i_index = .FALSE. 1079 data_ibegin = .FALSE. 1080 data_j_index = .FALSE. 1081 data_jbegin = .FALSE. 1082 data_ni = .FALSE. 1083 data_nj = .FALSE. 1084 dim_i_name = .FALSE. 1085 dim_j_name = .FALSE. 1086 domain_ref = .FALSE. 1087 i_index = .FALSE. 1088 ibegin = .FALSE. 1089 j_index = .FALSE. 1090 jbegin = .FALSE. 1091 lat_name = .FALSE. 1092 latvalue_1d = .FALSE. 1093 latvalue_2d = .FALSE. 1094 lon_name = .FALSE. 1095 long_name = .FALSE. 1096 lonvalue_1d = .FALSE. 1097 lonvalue_2d = .FALSE. 1098 mask_1d = .FALSE. 1099 mask_2d = .FALSE. 1100 name = .FALSE. 1101 ni = .FALSE. 1102 ni_glo = .FALSE. 1103 nj = .FALSE. 1104 nj_glo = .FALSE. 1105 nvertex = .FALSE. 1106 prec = .FALSE. 1107 radius = .FALSE. 1108 standard_name = .FALSE. 1109 type = .FALSE. 1117 1110 1118 1111 END SUBROUTINE xios_is_defined_domain_attr_hdl 1119 1112 1120 1113 SUBROUTINE xios_get_field_attr & 1121 (field_id, add_offset, axis_ref, build_workflow_graph, cell_methods, cell_methods_mode, check_if_active &1122 , comment, compression_level, default_value, detect_missing_value, domain_ref, enabled, expr &1123 , field_ref, freq_offset, freq_op, grid_path, grid_ref, indexed_output, level, long_name, name &1124 , operation, prec, read_access, scalar_ref, scale_factor, standard_name, ts_enabled, ts_split_freq &1125 , unit, valid_max, valid_min)1126 1127 IMPLICIT NONE 1128 TYPE(xios_field):: field_hdl1129 CHARACTER(LEN=*), INTENT(IN) ::field_id1130 REAL (KIND=8), OPTIONAL, INTENT(OUT) :: add_offset1131 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: axis_ref1132 LOGICAL, OPTIONAL, INTENT(OUT) :: build_workflow_graph1133 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: cell_methods1134 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: cell_methods_mode1135 LOGICAL, OPTIONAL, INTENT(OUT) :: check_if_active1136 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: comment1137 INTEGER, OPTIONAL, INTENT(OUT) :: compression_level1138 REAL (KIND=8), OPTIONAL, INTENT(OUT) :: default_value1139 LOGICAL, OPTIONAL, INTENT(OUT) :: detect_missing_value1140 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: domain_ref1141 LOGICAL, OPTIONAL, INTENT(OUT) :: enabled1142 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: expr1143 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: field_ref1144 TYPE(xios_duration), OPTIONAL, INTENT(OUT) :: freq_offset1145 TYPE(xios_duration), OPTIONAL, INTENT(OUT) :: freq_op1146 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: grid_path1147 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: grid_ref1148 LOGICAL, OPTIONAL, INTENT(OUT) :: indexed_output1149 INTEGER, OPTIONAL, INTENT(OUT) :: level1150 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: long_name1151 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: name1152 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: operation1153 INTEGER, OPTIONAL, INTENT(OUT) :: prec1154 LOGICAL, OPTIONAL, INTENT(OUT) :: read_access1155 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: scalar_ref1156 REAL (KIND=8), OPTIONAL, INTENT(OUT) :: scale_factor1157 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: standard_name1158 LOGICAL, OPTIONAL, INTENT(OUT) :: ts_enabled1159 TYPE(xios_duration), OPTIONAL, INTENT(OUT) :: ts_split_freq1160 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: unit1161 REAL (KIND=8), OPTIONAL, INTENT(OUT) :: valid_max1162 REAL (KIND=8), OPTIONAL, INTENT(OUT) :: valid_min1114 (field_id, add_offset, axis_ref, build_workflow_graph, cell_methods, cell_methods_mode, check_if_active & 1115 , comment, compression_level, default_value, detect_missing_value, domain_ref, enabled, expr & 1116 , field_ref, freq_offset, freq_op, grid_path, grid_ref, indexed_output, level, long_name, name & 1117 , operation, prec, read_access, scalar_ref, scale_factor, standard_name, ts_enabled, ts_split_freq & 1118 , unit, valid_max, valid_min) 1119 1120 IMPLICIT NONE 1121 TYPE(xios_field) :: field_hdl 1122 CHARACTER(LEN = *), INTENT(IN) :: field_id 1123 REAL (KIND = 8), OPTIONAL, INTENT(OUT) :: add_offset 1124 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: axis_ref 1125 LOGICAL, OPTIONAL, INTENT(OUT) :: build_workflow_graph 1126 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: cell_methods 1127 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: cell_methods_mode 1128 LOGICAL, OPTIONAL, INTENT(OUT) :: check_if_active 1129 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: comment 1130 INTEGER, OPTIONAL, INTENT(OUT) :: compression_level 1131 REAL (KIND = 8), OPTIONAL, INTENT(OUT) :: default_value 1132 LOGICAL, OPTIONAL, INTENT(OUT) :: detect_missing_value 1133 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: domain_ref 1134 LOGICAL, OPTIONAL, INTENT(OUT) :: enabled 1135 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: expr 1136 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: field_ref 1137 TYPE(xios_duration), OPTIONAL, INTENT(OUT) :: freq_offset 1138 TYPE(xios_duration), OPTIONAL, INTENT(OUT) :: freq_op 1139 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: grid_path 1140 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: grid_ref 1141 LOGICAL, OPTIONAL, INTENT(OUT) :: indexed_output 1142 INTEGER, OPTIONAL, INTENT(OUT) :: level 1143 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: long_name 1144 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: name 1145 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: operation 1146 INTEGER, OPTIONAL, INTENT(OUT) :: prec 1147 LOGICAL, OPTIONAL, INTENT(OUT) :: read_access 1148 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: scalar_ref 1149 REAL (KIND = 8), OPTIONAL, INTENT(OUT) :: scale_factor 1150 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: standard_name 1151 LOGICAL, OPTIONAL, INTENT(OUT) :: ts_enabled 1152 TYPE(xios_duration), OPTIONAL, INTENT(OUT) :: ts_split_freq 1153 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: unit 1154 REAL (KIND = 8), OPTIONAL, INTENT(OUT) :: valid_max 1155 REAL (KIND = 8), OPTIONAL, INTENT(OUT) :: valid_min 1163 1156 1164 1157 END SUBROUTINE xios_get_field_attr 1165 1158 1166 1159 SUBROUTINE xios_get_field_attr_hdl & 1167 (field_hdl, add_offset, axis_ref, build_workflow_graph, cell_methods, cell_methods_mode, check_if_active &1168 , comment, compression_level, default_value, detect_missing_value, domain_ref, enabled, expr &1169 , field_ref, freq_offset, freq_op, grid_path, grid_ref, indexed_output, level, long_name, name &1170 , operation, prec, read_access, scalar_ref, scale_factor, standard_name, ts_enabled, ts_split_freq &1171 , unit, valid_max, valid_min)1172 1173 IMPLICIT NONE 1174 TYPE(xios_field), INTENT(IN) :: field_hdl1175 REAL (KIND=8), OPTIONAL, INTENT(OUT) :: add_offset1176 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: axis_ref1177 LOGICAL, OPTIONAL, INTENT(OUT) :: build_workflow_graph1178 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: cell_methods1179 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: cell_methods_mode1180 LOGICAL, OPTIONAL, INTENT(OUT) :: check_if_active1181 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: comment1182 INTEGER, OPTIONAL, INTENT(OUT) :: compression_level1183 REAL (KIND=8), OPTIONAL, INTENT(OUT) :: default_value1184 LOGICAL, OPTIONAL, INTENT(OUT) :: detect_missing_value1185 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: domain_ref1186 LOGICAL, OPTIONAL, INTENT(OUT) :: enabled1187 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: expr1188 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: field_ref1189 TYPE(xios_duration), OPTIONAL, INTENT(OUT) :: freq_offset1190 TYPE(xios_duration), OPTIONAL, INTENT(OUT) :: freq_op1191 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: grid_path1192 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: grid_ref1193 LOGICAL, OPTIONAL, INTENT(OUT) :: indexed_output1194 INTEGER, OPTIONAL, INTENT(OUT) :: level1195 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: long_name1196 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: name1197 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: operation1198 INTEGER, OPTIONAL, INTENT(OUT) :: prec1199 LOGICAL, OPTIONAL, INTENT(OUT) :: read_access1200 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: scalar_ref1201 REAL (KIND=8), OPTIONAL, INTENT(OUT) :: scale_factor1202 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: standard_name1203 LOGICAL, OPTIONAL, INTENT(OUT) :: ts_enabled1204 TYPE(xios_duration), OPTIONAL, INTENT(OUT) :: ts_split_freq1205 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: unit1206 REAL (KIND=8), OPTIONAL, INTENT(OUT) :: valid_max1207 REAL (KIND=8), OPTIONAL, INTENT(OUT) :: valid_min1160 (field_hdl, add_offset, axis_ref, build_workflow_graph, cell_methods, cell_methods_mode, check_if_active & 1161 , comment, compression_level, default_value, detect_missing_value, domain_ref, enabled, expr & 1162 , field_ref, freq_offset, freq_op, grid_path, grid_ref, indexed_output, level, long_name, name & 1163 , operation, prec, read_access, scalar_ref, scale_factor, standard_name, ts_enabled, ts_split_freq & 1164 , unit, valid_max, valid_min) 1165 1166 IMPLICIT NONE 1167 TYPE(xios_field), INTENT(IN) :: field_hdl 1168 REAL (KIND = 8), OPTIONAL, INTENT(OUT) :: add_offset 1169 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: axis_ref 1170 LOGICAL, OPTIONAL, INTENT(OUT) :: build_workflow_graph 1171 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: cell_methods 1172 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: cell_methods_mode 1173 LOGICAL, OPTIONAL, INTENT(OUT) :: check_if_active 1174 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: comment 1175 INTEGER, OPTIONAL, INTENT(OUT) :: compression_level 1176 REAL (KIND = 8), OPTIONAL, INTENT(OUT) :: default_value 1177 LOGICAL, OPTIONAL, INTENT(OUT) :: detect_missing_value 1178 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: domain_ref 1179 LOGICAL, OPTIONAL, INTENT(OUT) :: enabled 1180 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: expr 1181 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: field_ref 1182 TYPE(xios_duration), OPTIONAL, INTENT(OUT) :: freq_offset 1183 TYPE(xios_duration), OPTIONAL, INTENT(OUT) :: freq_op 1184 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: grid_path 1185 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: grid_ref 1186 LOGICAL, OPTIONAL, INTENT(OUT) :: indexed_output 1187 INTEGER, OPTIONAL, INTENT(OUT) :: level 1188 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: long_name 1189 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: name 1190 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: operation 1191 INTEGER, OPTIONAL, INTENT(OUT) :: prec 1192 LOGICAL, OPTIONAL, INTENT(OUT) :: read_access 1193 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: scalar_ref 1194 REAL (KIND = 8), OPTIONAL, INTENT(OUT) :: scale_factor 1195 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: standard_name 1196 LOGICAL, OPTIONAL, INTENT(OUT) :: ts_enabled 1197 TYPE(xios_duration), OPTIONAL, INTENT(OUT) :: ts_split_freq 1198 CHARACTER(len = *), OPTIONAL, INTENT(OUT) :: unit 1199 REAL (KIND = 8), OPTIONAL, INTENT(OUT) :: valid_max 1200 REAL (KIND = 8), OPTIONAL, INTENT(OUT) :: valid_min 1208 1201 1209 1202 END SUBROUTINE xios_get_field_attr_hdl 1210 1203 1211 1204 END MODULE lmdz_xios 1212 1205 -
LMDZ6/branches/Amaury_dev/libf/phydev/comcstphy.F90
r5116 r5119 6 6 REAL :: rcpp ! specific heat of the atmosphere 7 7 8 end modulecomcstphy8 END MODULE comcstphy -
LMDZ6/branches/Amaury_dev/libf/phydev/iophy.F90
r5117 r5119 22 22 END INTERFACE 23 23 24 contains 24 CONTAINS 25 25 26 26 SUBROUTINE init_iophy_new(rlat, rlon) … … 389 389 END SUBROUTINE histwrite3d_xios 390 390 391 end moduleiophy391 END MODULE iophy -
LMDZ6/branches/Amaury_dev/libf/phylmd/Dust/read_newemissions.f90
r5117 r5119 22 22 USE lmdz_grid_phy 23 23 USE lmdz_phys_para 24 USE lmdz_ssum_scopy, ONLY: scopy 24 25 25 26 IMPLICIT NONE -
LMDZ6/branches/Amaury_dev/libf/phylmd/Ocean_skin/bulk_flux_m.F90
r5117 r5119 3 3 IMPLICIT NONE 4 4 5 contains 5 CONTAINS 6 6 7 7 SUBROUTINE bulk_flux(tkt, tks, taur, dter, dser, t_int, s_int, ds_ns, dt_ns, & … … 153 153 END SUBROUTINE bulk_flux 154 154 155 end modulebulk_flux_m155 END MODULE bulk_flux_m -
LMDZ6/branches/Amaury_dev/libf/phylmd/Ocean_skin/config_ocean_skin_m.F90
r5117 r5119 25 25 #endif 26 26 27 contains 27 CONTAINS 28 28 29 29 SUBROUTINE config_ocean_skin … … 80 80 END SUBROUTINE config_ocean_skin 81 81 82 end moduleconfig_ocean_skin_m82 END MODULE config_ocean_skin_m -
LMDZ6/branches/Amaury_dev/libf/phylmd/Ocean_skin/const.F90
r5117 r5119 25 25 ! k0829, equation 3.1.13) 26 26 27 end moduleconst27 END MODULE const -
LMDZ6/branches/Amaury_dev/libf/phylmd/Ocean_skin/esat_m.F90
r5117 r5119 3 3 IMPLICIT NONE 4 4 5 contains 5 CONTAINS 6 6 7 7 elemental real function esat(T, P) … … 20 20 END FUNCTION esat 21 21 22 end moduleesat_m22 END MODULE esat_m -
LMDZ6/branches/Amaury_dev/libf/phylmd/Ocean_skin/fv_m.F90
r5117 r5119 3 3 IMPLICIT NONE 4 4 5 contains 5 CONTAINS 6 6 7 7 elemental real function fV(z, rain) … … 44 44 END FUNCTION fV 45 45 46 end modulefv_m46 END MODULE fv_m -
LMDZ6/branches/Amaury_dev/libf/phylmd/Ocean_skin/microlayer_m.F90
r5117 r5119 3 3 Implicit none 4 4 5 contains 5 CONTAINS 6 6 7 7 SUBROUTINE Microlayer(dter, dser, tkt, tks, hlb, tau, s_subskin, al, & … … 104 104 END SUBROUTINE Microlayer 105 105 106 end moduleMicrolayer_m106 END MODULE Microlayer_m -
LMDZ6/branches/Amaury_dev/libf/phylmd/Ocean_skin/mom_flux_rain_m.F90
r5117 r5119 3 3 IMPLICIT NONE 4 4 5 contains 5 CONTAINS 6 6 7 7 elemental real function mom_flux_rain(u, rain) … … 22 22 END FUNCTION mom_flux_rain 23 23 24 end modulemom_flux_rain_m24 END MODULE mom_flux_rain_m -
LMDZ6/branches/Amaury_dev/libf/phylmd/Ocean_skin/near_surface_m.F90
r5117 r5119 6 6 ! diurnal warm layer and fresh water lens depth, in m (Zeng and Beljaars 2005) 7 7 8 contains 8 CONTAINS 9 9 10 10 SUBROUTINE near_surface(al, t_subskin, s_subskin, ds_ns, dt_ns, tau, taur, & … … 154 154 END SUBROUTINE Near_Surface 155 155 156 end moduleNear_Surface_m156 END MODULE Near_Surface_m -
LMDZ6/branches/Amaury_dev/libf/phylmd/Ocean_skin/phiw_m.F90
r5117 r5119 3 3 IMPLICIT NONE 4 4 5 contains 5 CONTAINS 6 6 7 7 elemental real function Phiw(zL) … … 22 22 END FUNCTION Phiw 23 23 24 end modulePhiw_m24 END MODULE Phiw_m -
LMDZ6/branches/Amaury_dev/libf/phylmd/Ocean_skin/sens_heat_rain_m.F90
r5117 r5119 3 3 IMPLICIT NONE 4 4 5 contains 5 CONTAINS 6 6 7 7 #ifdef IN_LMDZ … … 68 68 END FUNCTION sens_heat_rain 69 69 70 end modulesens_heat_rain_m70 END MODULE sens_heat_rain_m -
LMDZ6/branches/Amaury_dev/libf/phylmd/Ocean_skin/therm_expans_m.F90
r5117 r5119 3 3 IMPLICIT NONE 4 4 5 contains 5 CONTAINS 6 6 7 7 elemental real function therm_expans(t) … … 17 17 END FUNCTION therm_expans 18 18 19 end moduletherm_expans_m19 END MODULE therm_expans_m -
LMDZ6/branches/Amaury_dev/libf/phylmd/acama_gwd_rando_m.F90
r5117 r5119 6 6 IMPLICIT NONE 7 7 8 contains 8 CONTAINS 9 9 10 10 SUBROUTINE ACAMA_GWD_rando(DTIME, pp, plat, tt, uu, vv, rot, & … … 535 535 END SUBROUTINE ACAMA_GWD_RANDO 536 536 537 end moduleACAMA_GWD_rando_m537 END MODULE ACAMA_GWD_rando_m -
LMDZ6/branches/Amaury_dev/libf/phylmd/albedo.F90
r5117 r5119 4 4 IMPLICIT NONE 5 5 6 contains 6 CONTAINS 7 7 8 8 SUBROUTINE alboc(rjour, rlat, albedo) … … 159 159 END SUBROUTINE alboc_cd 160 160 161 end modulealbedo161 END MODULE albedo -
LMDZ6/branches/Amaury_dev/libf/phylmd/call_ini_replay.F90
r5116 r5119 2 2 stop 'In call_ini_replay : You should run replay_equip.sh before runing replay[13]d' 3 3 RETURN 4 end4 END -
LMDZ6/branches/Amaury_dev/libf/phylmd/call_param_replay.F90
r5117 r5119 3 3 stop 'In call_param_replay : You should run replay_equip.sh before runing replay[13]d' 4 4 RETURN 5 end5 END -
LMDZ6/branches/Amaury_dev/libf/phylmd/calltherm.F90
r5117 r5119 549 549 return 550 550 551 end551 END -
LMDZ6/branches/Amaury_dev/libf/phylmd/coare30_flux_cnrm_mod.F90
r5117 r5119 10 10 public COARE30_FLUX_CNRM 11 11 12 contains 12 CONTAINS 13 13 14 14 … … 583 583 END SUBROUTINE COARE30_FLUX_CNRM 584 584 585 end modulecoare30_flux_cnrm_mod585 END MODULE coare30_flux_cnrm_mod -
LMDZ6/branches/Amaury_dev/libf/phylmd/coare_cp_mod.F90
r5117 r5119 4 4 public psit_30, psiuo, coare_cp 5 5 6 contains 6 CONTAINS 7 7 8 8 REAL function psit_30(zet) … … 247 247 END SUBROUTINE coare_cp 248 248 249 end modulecoare_cp_mod249 END MODULE coare_cp_mod -
LMDZ6/branches/Amaury_dev/libf/phylmd/dyn1d/lmdz_1dutils.f90
r5117 r5119 978 978 ENDDO 979 979 980 981 980 END SUBROUTINE dyn1dredem 982 981 983 982 984 983 SUBROUTINE gr_fi_dyn(nfield, ngrid, im, jm, pfi, pdyn) 984 USE lmdz_ssum_scopy, ONLY: scopy 985 985 986 IMPLICIT NONE 986 987 !======================================================================= … … 1016 1017 ENDDO 1017 1018 ENDDO 1018 1019 1019 1020 1020 END SUBROUTINE gr_fi_dyn … … 1469 1469 print *, 't_targ', t_targ 1470 1470 print *, 'rh_targ', rh_targ 1471 1472 1471 1473 1472 END SUBROUTINE nudge_rht_init -
LMDZ6/branches/Amaury_dev/libf/phylmd/dyn1d/lmdz_old_1dconv.f90
r5117 r5119 561 561 WRITE(*, *) ' ' 562 562 563 end563 END 564 564 SUBROUTINE mesolupbis(file_forctl) 565 565 !ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc … … 773 773 774 774 RETURN 775 end775 END 776 776 SUBROUTINE GETSCH(STR, DEL, TRM, NTH, SST, NCH) 777 777 !*************************************************************** -
LMDZ6/branches/Amaury_dev/libf/phylmd/dyn1d/old_1DUTILS_read_interp.h
r5117 r5119 138 138 139 139 RETURN 140 end140 END 141 141 !===================================================================== 142 142 subroutine read_twpice(fich_twpice,nlevel,ntime & … … 534 534 535 535 RETURN 536 end536 END 537 537 !===================================================================== 538 538 … … 647 647 648 648 RETURN 649 end649 END 650 650 !===================================================================== 651 651 SUBROUTINE interp_astex_vertical(play,nlev_astex,plev_prof & … … 1160 1160 1161 1161 RETURN 1162 end1162 END 1163 1163 1164 1164 !===================================================================== … … 1319 1319 1320 1320 RETURN 1321 end1321 END 1322 1322 !***************************************************************************** 1323 1323 !===================================================================== … … 2029 2029 2030 2030 RETURN 2031 end2031 END 2032 2032 !====================================================================== 2033 2033 subroutine readprofile_sandu(nlev_max,kmax,height,pprof,tprof, & -
LMDZ6/branches/Amaury_dev/libf/phylmd/dyn1d/replay1d.F90
r5117 r5119 1 1 PROGRAM rejouer 2 2 3 USE mod_const_mpi, ONLY: comm_lmdz 4 USE inigeomphy_mod, ONLY: inigeomphy 5 USE comvert_mod, ONLY: presnivs 6 USE comvert_mod, ONLY: preff, pa 7 USE ioipsl, ONLY: getin 3 USE mod_const_mpi, ONLY: comm_lmdz 4 USE inigeomphy_mod, ONLY: inigeomphy 5 USE comvert_mod, ONLY: presnivs 6 USE comvert_mod, ONLY: preff, pa 7 USE ioipsl, ONLY: getin 8 9 IMPLICIT NONE 10 INCLUDE "dimensions.h" 11 12 REAL :: airefi 13 REAL :: zcufi = 1. 14 REAL :: zcvfi = 1. 15 REAL :: rlat_rad(1), rlon_rad(1) 16 17 INTEGER ntime 18 INTEGER jour0, mois0, an0, day_step, anneeref, dayref 19 INTEGER klev, klon 20 CHARACTER (len = 10) :: calend 21 CHARACTER(len = 20) :: calendrier 8 22 9 23 24 !--------------------------------------------------------------------- 25 ! L'appel a inigeomphy n'est utile que pour avoir getin_p dans 26 ! les initialisations 27 !--------------------------------------------------------------------- 28 zcufi = 1. 29 zcvfi = 1. 30 rlat_rad(1) = 0. 31 rlon_rad(1) = 0. 10 32 33 preff = 101325. 34 !preff=100000. 35 pa = 50000. 36 CALL disvert() 37 CALL inigeomphy(1, 1, llm, & 38 1, comm_lmdz, & 39 (/rlat_rad(1), 0./), (/0./), & 40 (/0., 0./), (/rlon_rad(1), 0./), & 41 (/ (/airefi, 0./), (/0., 0./) /), & 42 (/zcufi, 0., 0., 0./), & 43 (/zcvfi, 0./)) 11 44 12 IMPLICIT NONE 13 INCLUDE "dimensions.h" 45 CALL suphel 46 !ntime=4320 47 ntime = 10000000 48 dayref = 1 49 anneeref = 2000 50 CALL getin('dayref', dayref) 51 CALL getin('anneeref', anneeref) 52 CALL getin('calend', calend) 53 CALL getin('day_step', day_step) 54 calendrier = calend 55 IF (calendrier == "earth_360d") calendrier = "360_day" 14 56 15 REAL :: airefi 16 REAL :: zcufi = 1. 17 REAL :: zcvfi = 1. 18 REAL :: rlat_rad(1),rlon_rad(1) 57 jour0 = dayref 58 mois0 = (jour0 - 1) / 30 + 1 59 jour0 = jour0 - 30 * ((jour0 - 1) / 30) 60 an0 = anneeref 19 61 20 INTEGER ntime 21 INTEGER jour0,mois0,an0,day_step,anneeref,dayref 22 INTEGER klev,klon 23 CHARACTER (len=10) :: calend 24 CHARACTER(len=20) :: calendrier 62 !PRINT*,"REPLAY1D jour0,mois0,an0",jour0,mois0,an0 25 63 64 klon = 1 65 klev = llm 66 CALL iotd_ini('phys.nc', 1, 1, klev, 0., 0., presnivs, jour0, mois0, an0, 0., 86400. / day_step, calendrier) 67 ! Consistent with ... CALL iophys_ini(600.) 26 68 27 !--------------------------------------------------------------------- 28 ! L'appel a inigeomphy n'est utile que pour avoir getin_p dans 29 ! les initialisations 30 !--------------------------------------------------------------------- 31 zcufi=1. 32 zcvfi=1. 33 rlat_rad(1)=0. 34 rlon_rad(1)=0. 69 !--------------------------------------------------------------------- 70 ! Initialisation de la parametrisation 71 !--------------------------------------------------------------------- 72 CALL call_ini_replay 35 73 36 preff=101325. 37 !preff=100000. 38 pa=50000. 39 CALL disvert() 40 CALL inigeomphy(1,1,llm, & 41 1, comm_lmdz, & 42 (/rlat_rad(1),0./),(/0./), & 43 (/0.,0./),(/rlon_rad(1),0./), & 44 (/ (/airefi,0./),(/0.,0./) /), & 45 (/zcufi,0.,0.,0./), & 46 (/zcvfi,0./)) 47 48 CALL suphel 49 !ntime=4320 50 ntime=10000000 51 dayref=1 52 anneeref=2000 53 CALL getin('dayref',dayref) 54 CALL getin('anneeref',anneeref) 55 CALL getin('calend',calend) 56 CALL getin('day_step',day_step) 57 calendrier=calend 58 IF ( calendrier == "earth_360d" ) calendrier="360_day" 59 60 61 jour0=dayref 62 mois0=(jour0-1)/30+1 63 jour0=jour0-30*((jour0-1)/30) 64 an0=anneeref 65 66 !PRINT*,"REPLAY1D jour0,mois0,an0",jour0,mois0,an0 67 68 69 klon=1 70 klev=llm 71 CALL iotd_ini('phys.nc',1,1,klev,0.,0.,presnivs,jour0,mois0,an0,0.,86400./day_step,calendrier) 72 ! Consistent with ... CALL iophys_ini(600.) 73 74 !--------------------------------------------------------------------- 75 ! Initialisation de la parametrisation 76 !--------------------------------------------------------------------- 77 CALL call_ini_replay 78 79 !--------------------------------------------------------------------- 80 ! Boucle en temps sur l'appel à la parametrisation 81 !--------------------------------------------------------------------- 82 CALL call_param_replay(klon,klev) 74 !--------------------------------------------------------------------- 75 ! Boucle en temps sur l'appel à la parametrisation 76 !--------------------------------------------------------------------- 77 CALL call_param_replay(klon, klev) 83 78 84 79 end … … 93 88 94 89 !======================================================================= 95 96 97 ! Stops the simulation cleanly, closing files and printing various98 ! comments99 !=======================================================================90 SUBROUTINE abort_gcm(modname, message, ierr) 91 USE IOIPSL 92 ! Stops the simulation cleanly, closing files and printing various 93 ! comments 94 !======================================================================= 100 95 101 ! Input: modname = name of calling program 102 ! message = stuff to print 103 ! ierr = severity of situation ( = 0 normal ) 104 105 CHARACTER(LEN=*) modname 106 INTEGER ierr 107 CHARACTER(LEN=*) message 108 109 WRITE(*,*) 'in abort_gcm' 110 CALL histclo 111 WRITE(*,*) 'out of histclo' 112 WRITE(*,*) 'Stopping in ', modname 113 WRITE(*,*) 'Reason = ',message 114 CALL getin_dump 96 ! Input: modname = name of calling program 97 ! message = stuff to print 98 ! ierr = severity of situation ( = 0 normal ) 115 99 116 IF (ierr == 0) THEN 117 WRITE(*,*) 'Everything is cool' 118 else 119 WRITE(*,*) 'Houston, we have a problem ', ierr 120 endif 121 STOP 122 END 100 CHARACTER(LEN = *) modname 101 INTEGER ierr 102 CHARACTER(LEN = *) message 103 104 WRITE(*, *) 'in abort_gcm' 105 CALL histclo 106 WRITE(*, *) 'out of histclo' 107 WRITE(*, *) 'Stopping in ', modname 108 WRITE(*, *) 'Reason = ', message 109 CALL getin_dump 110 111 IF (ierr == 0) THEN 112 WRITE(*, *) 'Everything is cool' 113 else 114 WRITE(*, *) 'Houston, we have a problem ', ierr 115 endif 116 STOP 117 END 123 118 124 119 !======================================================================= 125 SUBROUTINE gr_dyn_fi(nfield,im,jm,ngrid,pdyn,pfi) 126 IMPLICIT NONE 127 ! passage d'un champ de la grille scalaire a la grille physique 128 !======================================================================= 129 130 !----------------------------------------------------------------------- 131 ! declarations: 132 ! ------------- 133 134 INTEGER im,jm,ngrid,nfield 135 REAL pdyn(im,jm,nfield) 136 REAL pfi(ngrid,nfield) 137 138 INTEGER j,ifield,ig 139 140 !----------------------------------------------------------------------- 141 ! calcul: 142 ! ------- 143 144 IF(ngrid/=2+(jm-2)*(im-1).AND.ngrid/=1) & 145 STOP 'probleme de dim' 146 ! traitement des poles 147 CALL SCOPY(nfield,pdyn,im*jm,pfi,ngrid) 148 CALL SCOPY(nfield,pdyn(1,jm,1),im*jm,pfi(ngrid,1),ngrid) 149 150 ! traitement des point normaux 151 DO ifield=1,nfield 152 DO j=2,jm-1 153 ig=2+(j-2)*(im-1) 154 CALL SCOPY(im-1,pdyn(1,j,ifield),1,pfi(ig,ifield),1) 155 ENDDO 156 ENDDO 157 158 RETURN 159 END 120 SUBROUTINE gr_dyn_fi(nfield, im, jm, ngrid, pdyn, pfi) 121 USE lmdz_ssum_scopy, ONLY: scopy 122 123 IMPLICIT NONE 124 ! passage d'un champ de la grille scalaire a la grille physique 125 !======================================================================= 126 127 !----------------------------------------------------------------------- 128 ! declarations: 129 ! ------------- 130 131 INTEGER im, jm, ngrid, nfield 132 REAL pdyn(im, jm, nfield) 133 REAL pfi(ngrid, nfield) 134 135 INTEGER j, ifield, ig 136 137 !----------------------------------------------------------------------- 138 ! calcul: 139 ! ------- 140 141 IF(ngrid/=2 + (jm - 2) * (im - 1).AND.ngrid/=1) & 142 STOP 'probleme de dim' 143 ! traitement des poles 144 CALL SCOPY(nfield, pdyn, im * jm, pfi, ngrid) 145 CALL SCOPY(nfield, pdyn(1, jm, 1), im * jm, pfi(ngrid, 1), ngrid) 146 147 ! traitement des point normaux 148 DO ifield = 1, nfield 149 DO j = 2, jm - 1 150 ig = 2 + (j - 2) * (im - 1) 151 CALL SCOPY(im - 1, pdyn(1, j, ifield), 1, pfi(ig, ifield), 1) 152 ENDDO 153 ENDDO 154 155 RETURN 156 END -
LMDZ6/branches/Amaury_dev/libf/phylmd/flott_gwd_rando_m.F90
r5117 r5119 5 5 IMPLICIT NONE 6 6 7 contains 7 CONTAINS 8 8 9 9 SUBROUTINE FLOTT_GWD_rando(DTIME, pp, tt, uu, vv, prec, zustr, zvstr, d_u, & … … 455 455 END SUBROUTINE FLOTT_GWD_RANDO 456 456 457 end moduleFLOTT_GWD_rando_m457 END MODULE FLOTT_GWD_rando_m -
LMDZ6/branches/Amaury_dev/libf/phylmd/grid_index.F90
r5117 r5119 19 19 END DO 20 20 RETURN 21 end 21 END -
LMDZ6/branches/Amaury_dev/libf/phylmd/hbtm_mod.F90
r5117 r5119 3 3 IMPLICIT NONE 4 4 5 contains 5 CONTAINS 6 6 7 7 SUBROUTINE hbtm(knon, paprs, pplay, t2m, t10m, q2m, q10m, ustar, wstar, & … … 767 767 END SUBROUTINE hbtm 768 768 769 end modulehbtm_mod769 END MODULE hbtm_mod -
LMDZ6/branches/Amaury_dev/libf/phylmd/iophys.F90
r5117 r5119 261 261 262 262 RETURN 263 end264 263 END 264 -
LMDZ6/branches/Amaury_dev/libf/phylmd/iotd_ecrit.F90
r5117 r5119 182 182 183 183 184 end184 END -
LMDZ6/branches/Amaury_dev/libf/phylmd/lmdz_atke_exchange_coeff.F90
r5117 r5119 3 3 IMPLICIT NONE 4 4 5 contains 5 CONTAINS 6 6 7 7 SUBROUTINE atke_compute_km_kh(ngrid,nlay,dtime, & … … 511 511 512 512 513 end modulelmdz_atke_exchange_coeff513 END MODULE lmdz_atke_exchange_coeff -
LMDZ6/branches/Amaury_dev/libf/phylmd/lmdz_blowing_snow_ini.F90
r5117 r5119 29 29 30 30 31 contains 31 CONTAINS 32 32 33 33 SUBROUTINE blowing_snow_ini(RCPD_in, RLSTT_in, RLVTT_in, RLMLT_in,& … … 84 84 END SUBROUTINE blowing_snow_ini 85 85 86 end modulelmdz_blowing_snow_ini86 END MODULE lmdz_blowing_snow_ini -
LMDZ6/branches/Amaury_dev/libf/phylmd/lmdz_blowing_snow_sublim_sedim.F90
r5117 r5119 1 1 module lmdz_blowing_snow_sublim_sedim 2 2 3 contains 3 CONTAINS 4 4 SUBROUTINE blowing_snow_sublim_sedim(ngrid,nlay,dtime,temp,qv,qb,pplay,paprs,dtemp_bs,dqv_bs,dqb_bs,bsfl,precip_bs) 5 5 … … 293 293 294 294 END SUBROUTINE blowing_snow_sublim_sedim 295 end modulelmdz_blowing_snow_sublim_sedim295 END MODULE lmdz_blowing_snow_sublim_sedim -
LMDZ6/branches/Amaury_dev/libf/phylmd/lmdz_call_atke.F90
r5117 r5119 6 6 7 7 8 contains 8 CONTAINS 9 9 10 10 SUBROUTINE call_atke(dtime,ngrid,nlay,nsrf,ni,cdrag_uv,cdrag_t,u_surf,v_surf,temp_surf, & … … 172 172 173 173 174 end modulelmdz_call_atke174 END MODULE lmdz_call_atke -
LMDZ6/branches/Amaury_dev/libf/phylmd/lmdz_call_blowing_snow.F90
r5117 r5119 1 1 module lmdz_call_blowing_snow 2 2 3 contains 3 CONTAINS 4 4 5 5 SUBROUTINE call_blowing_snow_sublim_sedim(ngrid,nlay,dtime,temp,q,qbs,pplay,paprs, & … … 43 43 END SUBROUTINE call_blowing_snow_sublim_sedim 44 44 45 end modulelmdz_call_blowing_snow45 END MODULE lmdz_call_blowing_snow -
LMDZ6/branches/Amaury_dev/libf/phylmd/lmdz_cloudth_ini.F90
r5117 r5119 8 8 9 9 10 contains 10 CONTAINS 11 11 12 12 SUBROUTINE cloudth_ini(iflag_cloudth_vert_in,iflag_ratqs_in) … … 51 51 END SUBROUTINE cloudth_ini 52 52 53 end modulelmdz_cloudth_ini53 END MODULE lmdz_cloudth_ini -
LMDZ6/branches/Amaury_dev/libf/phylmd/lmdz_thermcell_alp.F90
r5117 r5119 425 425 426 426 RETURN 427 end427 END 428 428 END MODULE lmdz_thermcell_alp -
LMDZ6/branches/Amaury_dev/libf/phylmd/lmdz_thermcell_closure.F90
r5117 r5119 72 72 73 73 RETURN 74 end74 END 75 75 END MODULE lmdz_thermcell_closure -
LMDZ6/branches/Amaury_dev/libf/phylmd/lmdz_thermcell_dq.F90
r5117 r5119 326 326 327 327 RETURN 328 end328 END 329 329 END MODULE lmdz_thermcell_dq -
LMDZ6/branches/Amaury_dev/libf/phylmd/lmdz_thermcell_dtke.F90
r5117 r5119 121 121 122 122 RETURN 123 end123 END 124 124 END MODULE lmdz_thermcell_dtke -
LMDZ6/branches/Amaury_dev/libf/phylmd/lmdz_thermcell_dv2.F90
r5117 r5119 194 194 195 195 RETURN 196 end196 END 197 197 END MODULE lmdz_thermcell_dv2 -
LMDZ6/branches/Amaury_dev/libf/phylmd/lmdz_thermcell_flux2.F90
r5117 r5119 503 503 504 504 RETURN 505 end505 END 506 506 END MODULE lmdz_thermcell_flux2 -
LMDZ6/branches/Amaury_dev/libf/phylmd/lmdz_thermcell_height.F90
r5117 r5119 168 168 169 169 RETURN 170 end170 END 171 171 END MODULE lmdz_thermcell_height -
LMDZ6/branches/Amaury_dev/libf/phylmd/lmdz_thermcell_old.F90
r5117 r5119 2 2 CONTAINS 3 3 4 SUBROUTINE thermcell_2002(ngrid, nlay, ptimestep, iflag_thermals, pplay, & 5 pplev, pphi, pu, pv, pt, po, pduadj, pdvadj, pdtadj, pdoadj, fm0, entr0, & 6 fraca, wa_moy, r_aspect, l_mix, w2di, tho) 7 8 USE dimphy 9 USE lmdz_write_field_phy 10 USE lmdz_thermcell_dv2, ONLY: thermcell_dv2 11 USE lmdz_thermcell_dq, ONLY: thermcell_dq 12 USE lmdz_abort_physic, ONLY: abort_physic 13 IMPLICIT NONE 14 15 ! ======================================================================= 16 17 ! Calcul du transport verticale dans la couche limite en presence 18 ! de "thermiques" explicitement representes 19 20 ! Réécriture à partir d'un listing papier à Habas, le 14/02/00 21 22 ! le thermique est supposé homogène et dissipé par mélange avec 23 ! son environnement. la longueur l_mix contrôle l'efficacité du 24 ! mélange 25 26 ! Le calcul du transport des différentes espèces se fait en prenant 27 ! en compte: 28 ! 1. un flux de masse montant 29 ! 2. un flux de masse descendant 30 ! 3. un entrainement 31 ! 4. un detrainement 32 33 ! ======================================================================= 34 35 ! ----------------------------------------------------------------------- 36 ! declarations: 37 ! ------------- 38 39 include "YOMCST.h" 40 41 ! arguments: 42 ! ---------- 43 44 INTEGER ngrid, nlay, w2di, iflag_thermals 45 REAL tho 46 REAL ptimestep, l_mix, r_aspect 47 REAL pt(ngrid, nlay), pdtadj(ngrid, nlay) 48 REAL pu(ngrid, nlay), pduadj(ngrid, nlay) 49 REAL pv(ngrid, nlay), pdvadj(ngrid, nlay) 50 REAL po(ngrid, nlay), pdoadj(ngrid, nlay) 51 REAL pplay(ngrid, nlay), pplev(ngrid, nlay+1) 52 REAL pphi(ngrid, nlay) 53 REAL fraca(ngrid, nlay+1), zw2(ngrid, nlay+1) 54 55 INTEGER, SAVE :: idetr = 3, lev_out = 1 56 !$OMP THREADPRIVATE(idetr,lev_out) 57 58 ! local: 59 ! ------ 60 61 INTEGER, SAVE :: dvdq = 0, flagdq = 0, dqimpl = 1 62 LOGICAL, SAVE :: debut = .TRUE. 63 !$OMP THREADPRIVATE(dvdq,flagdq,debut,dqimpl) 64 65 INTEGER ig, k, l, lmax(klon, klev+1), lmaxa(klon), lmix(klon) 66 REAL zmax(klon), zw, zz, ztva(klon, klev), zzz 67 68 REAL zlev(klon, klev+1), zlay(klon, klev) 69 REAL zh(klon, klev), zdhadj(klon, klev) 70 REAL ztv(klon, klev) 71 REAL zu(klon, klev), zv(klon, klev), zo(klon, klev) 72 REAL wh(klon, klev+1) 73 REAL wu(klon, klev+1), wv(klon, klev+1), wo(klon, klev+1) 74 REAL zla(klon, klev+1) 75 REAL zwa(klon, klev+1) 76 REAL zld(klon, klev+1) 77 REAL zwd(klon, klev+1) 78 REAL zsortie(klon, klev) 79 REAL zva(klon, klev) 80 REAL zua(klon, klev) 81 REAL zoa(klon, klev) 82 83 REAL zha(klon, klev) 84 REAL wa_moy(klon, klev+1) 85 REAL fracc(klon, klev+1) 86 REAL zf, zf2 87 REAL thetath2(klon, klev), wth2(klon, klev) 88 ! common/comtherm/thetath2,wth2 89 90 REAL count_time 91 92 LOGICAL sorties 93 REAL rho(klon, klev), rhobarz(klon, klev+1), masse(klon, klev) 94 REAL zpspsk(klon, klev) 95 96 REAL wmax(klon, klev), wmaxa(klon) 97 98 REAL wa(klon, klev, klev+1) 99 REAL wd(klon, klev+1) 100 REAL larg_part(klon, klev, klev+1) 101 REAL fracd(klon, klev+1) 102 REAL xxx(klon, klev+1) 103 REAL larg_cons(klon, klev+1) 104 REAL larg_detr(klon, klev+1) 105 REAL fm0(klon, klev+1), entr0(klon, klev), detr(klon, klev) 106 REAL pu_therm(klon, klev), pv_therm(klon, klev) 107 REAL fm(klon, klev+1), entr(klon, klev) 108 REAL fmc(klon, klev+1) 109 110 CHARACTER (LEN=2) :: str2 111 CHARACTER (LEN=10) :: str10 112 113 CHARACTER (LEN=20) :: modname = 'thermcell2002' 114 CHARACTER (LEN=80) :: abort_message 115 116 LOGICAL vtest(klon), down 117 118 EXTERNAL scopy 119 120 INTEGER ncorrec, ll 121 SAVE ncorrec 122 DATA ncorrec/0/ 123 !$OMP THREADPRIVATE(ncorrec) 124 125 126 ! ----------------------------------------------------------------------- 127 ! initialisation: 128 ! --------------- 129 130 sorties = .TRUE. 131 IF (ngrid/=klon) THEN 132 PRINT * 133 PRINT *, 'STOP dans convadj' 134 PRINT *, 'ngrid =', ngrid 135 PRINT *, 'klon =', klon 136 END IF 137 138 ! ----------------------------------------------------------------------- 139 ! incrementation eventuelle de tendances precedentes: 140 ! --------------------------------------------------- 141 142 ! PRINT*,'0 OK convect8' 143 144 DO l = 1, nlay 145 DO ig = 1, ngrid 146 zpspsk(ig, l) = (pplay(ig,l)/pplev(ig,1))**rkappa 147 zh(ig, l) = pt(ig, l)/zpspsk(ig, l) 148 zu(ig, l) = pu(ig, l) 149 zv(ig, l) = pv(ig, l) 150 zo(ig, l) = po(ig, l) 151 ztv(ig, l) = zh(ig, l)*(1.+0.61*zo(ig,l)) 152 END DO 153 END DO 154 155 ! PRINT*,'1 OK convect8' 156 ! -------------------- 157 158 159 ! + + + + + + + + + + + 160 161 162 ! wa, fraca, wd, fracd -------------------- zlev(2), rhobarz 163 ! wh,wt,wo ... 164 165 ! + + + + + + + + + + + zh,zu,zv,zo,rho 166 167 168 ! -------------------- zlev(1) 169 ! \\\\\\\\\\\\\\\\\\\\ 170 171 172 173 ! ----------------------------------------------------------------------- 174 ! Calcul des altitudes des couches 175 ! ----------------------------------------------------------------------- 176 177 IF (debut) THEN 178 flagdq = (iflag_thermals-1000)/100 179 dvdq = (iflag_thermals-(1000+flagdq*100))/10 180 IF (flagdq==2) dqimpl = -1 181 IF (flagdq==3) dqimpl = 1 182 debut = .FALSE. 183 END IF 184 PRINT *, 'TH flag th ', iflag_thermals, flagdq, dvdq, dqimpl 185 186 DO l = 2, nlay 187 DO ig = 1, ngrid 188 zlev(ig, l) = 0.5*(pphi(ig,l)+pphi(ig,l-1))/rg 189 END DO 190 END DO 191 DO ig = 1, ngrid 192 zlev(ig, 1) = 0. 193 zlev(ig, nlay+1) = (2.*pphi(ig,klev)-pphi(ig,klev-1))/rg 194 END DO 195 DO l = 1, nlay 196 DO ig = 1, ngrid 197 zlay(ig, l) = pphi(ig, l)/rg 198 END DO 199 END DO 200 201 ! PRINT*,'2 OK convect8' 202 ! ----------------------------------------------------------------------- 203 ! Calcul des densites 204 ! ----------------------------------------------------------------------- 205 206 DO l = 1, nlay 207 DO ig = 1, ngrid 208 rho(ig, l) = pplay(ig, l)/(zpspsk(ig,l)*rd*zh(ig,l)) 209 END DO 210 END DO 211 212 DO l = 2, nlay 213 DO ig = 1, ngrid 214 rhobarz(ig, l) = 0.5*(rho(ig,l)+rho(ig,l-1)) 215 END DO 216 END DO 217 218 DO k = 1, nlay 4 SUBROUTINE thermcell_2002(ngrid, nlay, ptimestep, iflag_thermals, pplay, & 5 pplev, pphi, pu, pv, pt, po, pduadj, pdvadj, pdtadj, pdoadj, fm0, entr0, & 6 fraca, wa_moy, r_aspect, l_mix, w2di, tho) 7 8 USE dimphy 9 USE lmdz_write_field_phy 10 USE lmdz_thermcell_dv2, ONLY: thermcell_dv2 11 USE lmdz_thermcell_dq, ONLY: thermcell_dq 12 USE lmdz_abort_physic, ONLY: abort_physic 13 IMPLICIT NONE 14 15 ! ======================================================================= 16 17 ! Calcul du transport verticale dans la couche limite en presence 18 ! de "thermiques" explicitement representes 19 20 ! Réécriture à partir d'un listing papier à Habas, le 14/02/00 21 22 ! le thermique est supposé homogène et dissipé par mélange avec 23 ! son environnement. la longueur l_mix contrôle l'efficacité du 24 ! mélange 25 26 ! Le calcul du transport des différentes espèces se fait en prenant 27 ! en compte: 28 ! 1. un flux de masse montant 29 ! 2. un flux de masse descendant 30 ! 3. un entrainement 31 ! 4. un detrainement 32 33 ! ======================================================================= 34 35 ! ----------------------------------------------------------------------- 36 ! declarations: 37 ! ------------- 38 39 include "YOMCST.h" 40 41 ! arguments: 42 ! ---------- 43 44 INTEGER ngrid, nlay, w2di, iflag_thermals 45 REAL tho 46 REAL ptimestep, l_mix, r_aspect 47 REAL pt(ngrid, nlay), pdtadj(ngrid, nlay) 48 REAL pu(ngrid, nlay), pduadj(ngrid, nlay) 49 REAL pv(ngrid, nlay), pdvadj(ngrid, nlay) 50 REAL po(ngrid, nlay), pdoadj(ngrid, nlay) 51 REAL pplay(ngrid, nlay), pplev(ngrid, nlay + 1) 52 REAL pphi(ngrid, nlay) 53 REAL fraca(ngrid, nlay + 1), zw2(ngrid, nlay + 1) 54 55 INTEGER, SAVE :: idetr = 3, lev_out = 1 56 !$OMP THREADPRIVATE(idetr,lev_out) 57 58 ! local: 59 ! ------ 60 61 INTEGER, SAVE :: dvdq = 0, flagdq = 0, dqimpl = 1 62 LOGICAL, SAVE :: debut = .TRUE. 63 !$OMP THREADPRIVATE(dvdq,flagdq,debut,dqimpl) 64 65 INTEGER ig, k, l, lmax(klon, klev + 1), lmaxa(klon), lmix(klon) 66 REAL zmax(klon), zw, zz, ztva(klon, klev), zzz 67 68 REAL zlev(klon, klev + 1), zlay(klon, klev) 69 REAL zh(klon, klev), zdhadj(klon, klev) 70 REAL ztv(klon, klev) 71 REAL zu(klon, klev), zv(klon, klev), zo(klon, klev) 72 REAL wh(klon, klev + 1) 73 REAL wu(klon, klev + 1), wv(klon, klev + 1), wo(klon, klev + 1) 74 REAL zla(klon, klev + 1) 75 REAL zwa(klon, klev + 1) 76 REAL zld(klon, klev + 1) 77 REAL zwd(klon, klev + 1) 78 REAL zsortie(klon, klev) 79 REAL zva(klon, klev) 80 REAL zua(klon, klev) 81 REAL zoa(klon, klev) 82 83 REAL zha(klon, klev) 84 REAL wa_moy(klon, klev + 1) 85 REAL fracc(klon, klev + 1) 86 REAL zf, zf2 87 REAL thetath2(klon, klev), wth2(klon, klev) 88 ! common/comtherm/thetath2,wth2 89 90 REAL count_time 91 92 LOGICAL sorties 93 REAL rho(klon, klev), rhobarz(klon, klev + 1), masse(klon, klev) 94 REAL zpspsk(klon, klev) 95 96 REAL wmax(klon, klev), wmaxa(klon) 97 98 REAL wa(klon, klev, klev + 1) 99 REAL wd(klon, klev + 1) 100 REAL larg_part(klon, klev, klev + 1) 101 REAL fracd(klon, klev + 1) 102 REAL xxx(klon, klev + 1) 103 REAL larg_cons(klon, klev + 1) 104 REAL larg_detr(klon, klev + 1) 105 REAL fm0(klon, klev + 1), entr0(klon, klev), detr(klon, klev) 106 REAL pu_therm(klon, klev), pv_therm(klon, klev) 107 REAL fm(klon, klev + 1), entr(klon, klev) 108 REAL fmc(klon, klev + 1) 109 110 CHARACTER (LEN = 2) :: str2 111 CHARACTER (LEN = 10) :: str10 112 113 CHARACTER (LEN = 20) :: modname = 'thermcell2002' 114 CHARACTER (LEN = 80) :: abort_message 115 116 LOGICAL vtest(klon), down 117 118 INTEGER ncorrec, ll 119 SAVE ncorrec 120 DATA ncorrec/0/ 121 !$OMP THREADPRIVATE(ncorrec) 122 123 124 ! ----------------------------------------------------------------------- 125 ! initialisation: 126 ! --------------- 127 128 sorties = .TRUE. 129 IF (ngrid/=klon) THEN 130 PRINT * 131 PRINT *, 'STOP dans convadj' 132 PRINT *, 'ngrid =', ngrid 133 PRINT *, 'klon =', klon 134 END IF 135 136 ! ----------------------------------------------------------------------- 137 ! incrementation eventuelle de tendances precedentes: 138 ! --------------------------------------------------- 139 140 ! PRINT*,'0 OK convect8' 141 142 DO l = 1, nlay 143 DO ig = 1, ngrid 144 zpspsk(ig, l) = (pplay(ig, l) / pplev(ig, 1))**rkappa 145 zh(ig, l) = pt(ig, l) / zpspsk(ig, l) 146 zu(ig, l) = pu(ig, l) 147 zv(ig, l) = pv(ig, l) 148 zo(ig, l) = po(ig, l) 149 ztv(ig, l) = zh(ig, l) * (1. + 0.61 * zo(ig, l)) 150 END DO 151 END DO 152 153 ! PRINT*,'1 OK convect8' 154 ! -------------------- 155 156 157 ! + + + + + + + + + + + 158 159 160 ! wa, fraca, wd, fracd -------------------- zlev(2), rhobarz 161 ! wh,wt,wo ... 162 163 ! + + + + + + + + + + + zh,zu,zv,zo,rho 164 165 166 ! -------------------- zlev(1) 167 ! \\\\\\\\\\\\\\\\\\\\ 168 169 170 171 ! ----------------------------------------------------------------------- 172 ! Calcul des altitudes des couches 173 ! ----------------------------------------------------------------------- 174 175 IF (debut) THEN 176 flagdq = (iflag_thermals - 1000) / 100 177 dvdq = (iflag_thermals - (1000 + flagdq * 100)) / 10 178 IF (flagdq==2) dqimpl = -1 179 IF (flagdq==3) dqimpl = 1 180 debut = .FALSE. 181 END IF 182 PRINT *, 'TH flag th ', iflag_thermals, flagdq, dvdq, dqimpl 183 184 DO l = 2, nlay 185 DO ig = 1, ngrid 186 zlev(ig, l) = 0.5 * (pphi(ig, l) + pphi(ig, l - 1)) / rg 187 END DO 188 END DO 189 DO ig = 1, ngrid 190 zlev(ig, 1) = 0. 191 zlev(ig, nlay + 1) = (2. * pphi(ig, klev) - pphi(ig, klev - 1)) / rg 192 END DO 193 DO l = 1, nlay 194 DO ig = 1, ngrid 195 zlay(ig, l) = pphi(ig, l) / rg 196 END DO 197 END DO 198 199 ! PRINT*,'2 OK convect8' 200 ! ----------------------------------------------------------------------- 201 ! Calcul des densites 202 ! ----------------------------------------------------------------------- 203 204 DO l = 1, nlay 205 DO ig = 1, ngrid 206 rho(ig, l) = pplay(ig, l) / (zpspsk(ig, l) * rd * zh(ig, l)) 207 END DO 208 END DO 209 210 DO l = 2, nlay 211 DO ig = 1, ngrid 212 rhobarz(ig, l) = 0.5 * (rho(ig, l) + rho(ig, l - 1)) 213 END DO 214 END DO 215 216 DO k = 1, nlay 217 DO l = 1, nlay + 1 218 DO ig = 1, ngrid 219 wa(ig, k, l) = 0. 220 END DO 221 END DO 222 END DO 223 224 ! PRINT*,'3 OK convect8' 225 ! ------------------------------------------------------------------ 226 ! Calcul de w2, quarre de w a partir de la cape 227 ! a partir de w2, on calcule wa, vitesse de l'ascendance 228 229 ! ATTENTION: Dans cette version, pour cause d'economie de memoire, 230 ! w2 est stoke dans wa 231 232 ! ATTENTION: dans convect8, on n'utilise le calcule des wa 233 ! independants par couches que pour calculer l'entrainement 234 ! a la base et la hauteur max de l'ascendance. 235 236 ! Indicages: 237 ! l'ascendance provenant du niveau k traverse l'interface l avec 238 ! une vitesse wa(k,l). 239 240 ! -------------------- 241 242 ! + + + + + + + + + + 243 244 ! wa(k,l) ---- -------------------- l 245 ! /\ 246 ! /||\ + + + + + + + + + + 247 ! || 248 ! || -------------------- 249 ! || 250 ! || + + + + + + + + + + 251 ! || 252 ! || -------------------- 253 ! ||__ 254 ! |___ + + + + + + + + + + k 255 256 ! -------------------- 257 258 259 260 ! ------------------------------------------------------------------ 261 262 DO k = 1, nlay - 1 263 DO ig = 1, ngrid 264 wa(ig, k, k) = 0. 265 wa(ig, k, k + 1) = 2. * rg * (ztv(ig, k) - ztv(ig, k + 1)) / ztv(ig, k + 1) * & 266 (zlev(ig, k + 1) - zlev(ig, k)) 267 END DO 268 DO l = k + 1, nlay - 1 269 DO ig = 1, ngrid 270 wa(ig, k, l + 1) = wa(ig, k, l) + 2. * rg * (ztv(ig, k) - ztv(ig, l)) / ztv(ig, l & 271 ) * (zlev(ig, l + 1) - zlev(ig, l)) 272 END DO 273 END DO 274 DO ig = 1, ngrid 275 wa(ig, k, nlay + 1) = 0. 276 END DO 277 END DO 278 279 ! PRINT*,'4 OK convect8' 280 ! Calcul de la couche correspondant a la hauteur du thermique 281 DO k = 1, nlay - 1 282 DO ig = 1, ngrid 283 lmax(ig, k) = k 284 END DO 285 DO l = nlay, k + 1, -1 286 DO ig = 1, ngrid 287 IF (wa(ig, k, l)<=1.E-10) lmax(ig, k) = l - 1 288 END DO 289 END DO 290 END DO 291 292 ! PRINT*,'5 OK convect8' 293 ! Calcule du w max du thermique 294 DO k = 1, nlay 295 DO ig = 1, ngrid 296 wmax(ig, k) = 0. 297 END DO 298 END DO 299 300 DO k = 1, nlay - 1 301 DO l = k, nlay 302 DO ig = 1, ngrid 303 IF (l<=lmax(ig, k)) THEN 304 wa(ig, k, l) = sqrt(wa(ig, k, l)) 305 wmax(ig, k) = max(wmax(ig, k), wa(ig, k, l)) 306 ELSE 307 wa(ig, k, l) = 0. 308 END IF 309 END DO 310 END DO 311 END DO 312 313 DO k = 1, nlay - 1 314 DO ig = 1, ngrid 315 pu_therm(ig, k) = sqrt(wmax(ig, k)) 316 pv_therm(ig, k) = sqrt(wmax(ig, k)) 317 END DO 318 END DO 319 320 ! PRINT*,'6 OK convect8' 321 ! Longueur caracteristique correspondant a la hauteur des thermiques. 322 DO ig = 1, ngrid 323 zmax(ig) = 500. 324 END DO 325 ! PRINT*,'LMAX LMAX LMAX ' 326 DO k = 1, nlay - 1 327 DO ig = 1, ngrid 328 zmax(ig) = max(zmax(ig), zlev(ig, lmax(ig, k)) - zlev(ig, k)) 329 END DO 330 ! PRINT*,k,lmax(1,k) 331 END DO 332 ! PRINT*,'ZMAX ZMAX ZMAX ',zmax 333 ! CALL dump2d(iim,jjm-1,zmax(2:ngrid-1),'ZMAX ') 334 335 ! PRINT*,'OKl336' 336 ! Calcul de l'entrainement. 337 ! Le rapport d'aspect relie la largeur de l'ascendance a l'epaisseur 338 ! de la couche d'alimentation en partant du principe que la vitesse 339 ! maximum dans l'ascendance est la vitesse d'entrainement horizontale. 340 DO k = 1, nlay 341 DO ig = 1, ngrid 342 zzz = rho(ig, k) * wmax(ig, k) * (zlev(ig, k + 1) - zlev(ig, k)) / & 343 (zmax(ig) * r_aspect) 344 IF (w2di==2) THEN 345 entr(ig, k) = entr(ig, k) + ptimestep * (zzz - entr(ig, k)) / tho 346 ELSE 347 entr(ig, k) = zzz 348 END IF 349 ztva(ig, k) = ztv(ig, k) 350 END DO 351 END DO 352 353 354 ! PRINT*,'7 OK convect8' 355 DO k = 1, klev + 1 356 DO ig = 1, ngrid 357 zw2(ig, k) = 0. 358 fmc(ig, k) = 0. 359 larg_cons(ig, k) = 0. 360 larg_detr(ig, k) = 0. 361 wa_moy(ig, k) = 0. 362 END DO 363 END DO 364 365 ! PRINT*,'8 OK convect8' 366 DO ig = 1, ngrid 367 lmaxa(ig) = 1 368 lmix(ig) = 1 369 wmaxa(ig) = 0. 370 END DO 371 372 373 ! PRINT*,'OKl372' 374 DO l = 1, nlay - 2 375 DO ig = 1, ngrid 376 ! if (zw2(ig,l).lt.1.e-10.AND.ztv(ig,l).gt.ztv(ig,l+1)) THEN 377 ! PRINT*,'COUCOU ',l,zw2(ig,l),ztv(ig,l),ztv(ig,l+1) 378 IF (zw2(ig, l)<1.E-10 .AND. ztv(ig, l)>ztv(ig, l + 1) .AND. & 379 entr(ig, l)>1.E-10) THEN 380 ! PRINT*,'COUCOU cas 1' 381 ! Initialisation de l'ascendance 382 ! lmix(ig)=1 383 ztva(ig, l) = ztv(ig, l) 384 fmc(ig, l) = 0. 385 fmc(ig, l + 1) = entr(ig, l) 386 zw2(ig, l) = 0. 387 ! if (.NOT.ztv(ig,l+1).gt.150.) THEN 388 ! PRINT*,'ig,l+1,ztv(ig,l+1)' 389 ! PRINT*, ig,l+1,ztv(ig,l+1) 390 ! END IF 391 zw2(ig, l + 1) = 2. * rg * (ztv(ig, l) - ztv(ig, l + 1)) / ztv(ig, l + 1) * & 392 (zlev(ig, l + 1) - zlev(ig, l)) 393 larg_detr(ig, l) = 0. 394 ELSE IF (zw2(ig, l)>=1.E-10 .AND. fmc(ig, l) + entr(ig, l)>1.E-10) THEN 395 ! Incrementation... 396 fmc(ig, l + 1) = fmc(ig, l) + entr(ig, l) 397 ! if (.NOT.fmc(ig,l+1).gt.1.e-15) THEN 398 ! PRINT*,'ig,l+1,fmc(ig,l+1)' 399 ! PRINT*, ig,l+1,fmc(ig,l+1) 400 ! PRINT*,'Fmc ',(fmc(ig,ll),ll=1,klev+1) 401 ! PRINT*,'W2 ',(zw2(ig,ll),ll=1,klev+1) 402 ! PRINT*,'Tv ',(ztv(ig,ll),ll=1,klev) 403 ! PRINT*,'Entr ',(entr(ig,ll),ll=1,klev) 404 ! END IF 405 ztva(ig, l) = (fmc(ig, l) * ztva(ig, l - 1) + entr(ig, l) * ztv(ig, l)) / & 406 fmc(ig, l + 1) 407 ! mise a jour de la vitesse ascendante (l'air entraine de la couche 408 ! consideree commence avec une vitesse nulle). 409 zw2(ig, l + 1) = zw2(ig, l) * (fmc(ig, l) / fmc(ig, l + 1))**2 + & 410 2. * rg * (ztva(ig, l) - ztv(ig, l)) / ztv(ig, l) * (zlev(ig, l + 1) - zlev(ig, l)) 411 END IF 412 IF (zw2(ig, l + 1)<0.) THEN 413 zw2(ig, l + 1) = 0. 414 lmaxa(ig) = l 415 ELSE 416 wa_moy(ig, l + 1) = sqrt(zw2(ig, l + 1)) 417 END IF 418 IF (wa_moy(ig, l + 1)>wmaxa(ig)) THEN 419 ! lmix est le niveau de la couche ou w (wa_moy) est maximum 420 lmix(ig) = l + 1 421 wmaxa(ig) = wa_moy(ig, l + 1) 422 END IF 423 ! PRINT*,'COUCOU cas 2 LMIX=',lmix(ig),wa_moy(ig,l+1),wmaxa(ig) 424 END DO 425 END DO 426 427 ! PRINT*,'9 OK convect8' 428 ! PRINT*,'WA1 ',wa_moy 429 430 ! determination de l'indice du debut de la mixed layer ou w decroit 431 432 ! calcul de la largeur de chaque ascendance dans le cas conservatif. 433 ! dans ce cas simple, on suppose que la largeur de l'ascendance provenant 434 ! d'une couche est égale à la hauteur de la couche alimentante. 435 ! La vitesse maximale dans l'ascendance est aussi prise comme estimation 436 ! de la vitesse d'entrainement horizontal dans la couche alimentante. 437 438 ! PRINT*,'OKl439' 439 DO l = 2, nlay 440 DO ig = 1, ngrid 441 IF (l<=lmaxa(ig)) THEN 442 zw = max(wa_moy(ig, l), 1.E-10) 443 larg_cons(ig, l) = zmax(ig) * r_aspect * fmc(ig, l) / (rhobarz(ig, l) * zw) 444 END IF 445 END DO 446 END DO 447 448 DO l = 2, nlay 449 DO ig = 1, ngrid 450 IF (l<=lmaxa(ig)) THEN 451 ! if (idetr.EQ.0) THEN 452 ! cette option est finalement en dur. 453 larg_detr(ig, l) = sqrt(l_mix * zlev(ig, l)) 454 ! ELSE IF (idetr.EQ.1) THEN 455 ! larg_detr(ig,l)=larg_cons(ig,l) 456 ! s *sqrt(l_mix*zlev(ig,l))/larg_cons(ig,lmix(ig)) 457 ! ELSE IF (idetr.EQ.2) THEN 458 ! larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l)) 459 ! s *sqrt(wa_moy(ig,l)) 460 ! ELSE IF (idetr.EQ.4) THEN 461 ! larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l)) 462 ! s *wa_moy(ig,l) 463 ! END IF 464 END IF 465 END DO 466 END DO 467 468 ! PRINT*,'10 OK convect8' 469 ! PRINT*,'WA2 ',wa_moy 470 ! calcul de la fraction de la maille concernée par l'ascendance en tenant 471 ! compte de l'epluchage du thermique. 472 473 DO l = 2, nlay 474 DO ig = 1, ngrid 475 IF (larg_cons(ig, l)>1.) THEN 476 ! PRINT*,ig,l,lmix(ig),lmaxa(ig),larg_cons(ig,l),' KKK' 477 fraca(ig, l) = (larg_cons(ig, l) - larg_detr(ig, l)) / (r_aspect * zmax(ig)) 478 IF (l>lmix(ig)) THEN 479 xxx(ig, l) = (lmaxa(ig) + 1. - l) / (lmaxa(ig) + 1. - lmix(ig)) 480 IF (idetr==0) THEN 481 fraca(ig, l) = fraca(ig, lmix(ig)) 482 ELSE IF (idetr==1) THEN 483 fraca(ig, l) = fraca(ig, lmix(ig)) * xxx(ig, l) 484 ELSE IF (idetr==2) THEN 485 fraca(ig, l) = fraca(ig, lmix(ig)) * (1. - (1. - xxx(ig, l))**2) 486 ELSE 487 fraca(ig, l) = fraca(ig, lmix(ig)) * xxx(ig, l)**2 488 END IF 489 END IF 490 ! PRINT*,ig,l,lmix(ig),lmaxa(ig),xxx(ig,l),'LLLLLLL' 491 fraca(ig, l) = max(fraca(ig, l), 0.) 492 fraca(ig, l) = min(fraca(ig, l), 0.5) 493 fracd(ig, l) = 1. - fraca(ig, l) 494 fracc(ig, l) = larg_cons(ig, l) / (r_aspect * zmax(ig)) 495 ELSE 496 ! wa_moy(ig,l)=0. 497 fraca(ig, l) = 0. 498 fracc(ig, l) = 0. 499 fracd(ig, l) = 1. 500 END IF 501 END DO 502 END DO 503 504 ! PRINT*,'11 OK convect8' 505 ! PRINT*,'Ea3 ',wa_moy 506 ! ------------------------------------------------------------------ 507 ! Calcul de fracd, wd 508 ! somme wa - wd = 0 509 ! ------------------------------------------------------------------ 510 511 DO ig = 1, ngrid 512 fm(ig, 1) = 0. 513 fm(ig, nlay + 1) = 0. 514 END DO 515 516 DO l = 2, nlay 517 DO ig = 1, ngrid 518 fm(ig, l) = fraca(ig, l) * wa_moy(ig, l) * rhobarz(ig, l) 519 END DO 520 DO ig = 1, ngrid 521 IF (fracd(ig, l)<0.1) THEN 522 abort_message = 'fracd trop petit' 523 CALL abort_physic(modname, abort_message, 1) 524 ELSE 525 ! vitesse descendante "diagnostique" 526 wd(ig, l) = fm(ig, l) / (fracd(ig, l) * rhobarz(ig, l)) 527 END IF 528 END DO 529 END DO 530 531 DO l = 1, nlay 532 DO ig = 1, ngrid 533 ! masse(ig,l)=rho(ig,l)*(zlev(ig,l+1)-zlev(ig,l)) 534 masse(ig, l) = (pplev(ig, l) - pplev(ig, l + 1)) / rg 535 END DO 536 END DO 537 538 ! PRINT*,'12 OK convect8' 539 ! PRINT*,'WA4 ',wa_moy 540 ! c------------------------------------------------------------------ 541 ! calcul du transport vertical 542 ! ------------------------------------------------------------------ 543 544 GO TO 4444 545 ! PRINT*,'XXXXXXXXXXXXXXX ptimestep= ',ptimestep 546 DO l = 2, nlay - 1 547 DO ig = 1, ngrid 548 IF (fm(ig, l + 1) * ptimestep>masse(ig, l) .AND. fm(ig, l + 1) * ptimestep>masse(& 549 ig, l + 1)) THEN 550 ! PRINT*,'WARN!!! FM>M ig=',ig,' l=',l,' FM=' 551 ! s ,fm(ig,l+1)*ptimestep 552 ! s ,' M=',masse(ig,l),masse(ig,l+1) 553 END IF 554 END DO 555 END DO 556 557 DO l = 1, nlay 558 DO ig = 1, ngrid 559 IF (entr(ig, l) * ptimestep>masse(ig, l)) THEN 560 ! PRINT*,'WARN!!! E>M ig=',ig,' l=',l,' E==' 561 ! s ,entr(ig,l)*ptimestep 562 ! s ,' M=',masse(ig,l) 563 END IF 564 END DO 565 END DO 566 567 DO l = 1, nlay 568 DO ig = 1, ngrid 569 IF (.NOT. fm(ig, l)>=0. .OR. .NOT. fm(ig, l)<=10.) THEN 570 ! PRINT*,'WARN!!! fm exagere ig=',ig,' l=',l 571 ! s ,' FM=',fm(ig,l) 572 END IF 573 IF (.NOT. masse(ig, l)>=1.E-10 .OR. .NOT. masse(ig, l)<=1.E4) THEN 574 ! PRINT*,'WARN!!! masse exagere ig=',ig,' l=',l 575 ! s ,' M=',masse(ig,l) 576 ! PRINT*,'rho(ig,l),pplay(ig,l),zpspsk(ig,l),RD,zh(ig,l)', 577 ! s rho(ig,l),pplay(ig,l),zpspsk(ig,l),RD,zh(ig,l) 578 ! PRINT*,'zlev(ig,l+1),zlev(ig,l)' 579 ! s ,zlev(ig,l+1),zlev(ig,l) 580 ! PRINT*,'pphi(ig,l-1),pphi(ig,l),pphi(ig,l+1)' 581 ! s ,pphi(ig,l-1),pphi(ig,l),pphi(ig,l+1) 582 END IF 583 IF (.NOT. entr(ig, l)>=0. .OR. .NOT. entr(ig, l)<=10.) THEN 584 ! PRINT*,'WARN!!! entr exagere ig=',ig,' l=',l 585 ! s ,' E=',entr(ig,l) 586 END IF 587 END DO 588 END DO 589 590 4444 CONTINUE 591 ! PRINT*,'OK 444 ' 592 593 IF (w2di==1) THEN 594 fm0 = fm0 + ptimestep * (fm - fm0) / tho 595 entr0 = entr0 + ptimestep * (entr - entr0) / tho 596 ELSE 597 fm0 = fm 598 entr0 = entr 599 END IF 600 601 IF (flagdq==0) THEN 602 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zh, zdhadj, & 603 zha) 604 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zo, pdoadj, & 605 zoa) 606 PRINT *, 'THERMALS OPT 1' 607 ELSE IF (flagdq==1) THEN 608 CALL dqthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca, zh, & 609 zdhadj, zha) 610 CALL dqthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca, zo, & 611 pdoadj, zoa) 612 PRINT *, 'THERMALS OPT 2' 613 ELSE 614 CALL thermcell_dq(ngrid, nlay, dqimpl, ptimestep, fm0, entr0, masse, zh, & 615 zdhadj, zha, lev_out) 616 CALL thermcell_dq(ngrid, nlay, dqimpl, ptimestep, fm0, entr0, masse, zo, & 617 pdoadj, zoa, lev_out) 618 PRINT *, 'THERMALS OPT 3', dqimpl 619 END IF 620 621 PRINT *, 'TH VENT ', dvdq 622 IF (dvdq==0) THEN 623 ! PRINT*,'TH VENT OK ',dvdq 624 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zu, pduadj, & 625 zua) 626 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zv, pdvadj, & 627 zva) 628 ELSE IF (dvdq==1) THEN 629 CALL dvthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca, zmax, & 630 zu, zv, pduadj, pdvadj, zua, zva) 631 ELSE IF (dvdq==2) THEN 632 CALL thermcell_dv2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca, & 633 zmax, zu, zv, pduadj, pdvadj, zua, zva, lev_out) 634 ELSE IF (dvdq==3) THEN 635 CALL thermcell_dq(ngrid, nlay, dqimpl, ptimestep, fm0, entr0, masse, zu, & 636 pduadj, zua, lev_out) 637 CALL thermcell_dq(ngrid, nlay, dqimpl, ptimestep, fm0, entr0, masse, zv, & 638 pdvadj, zva, lev_out) 639 END IF 640 641 ! CALL writefield_phy('duadj',pduadj,klev) 642 643 DO l = 1, nlay 644 DO ig = 1, ngrid 645 zf = 0.5 * (fracc(ig, l) + fracc(ig, l + 1)) 646 zf2 = zf / (1. - zf) 647 thetath2(ig, l) = zf2 * (zha(ig, l) - zh(ig, l))**2 648 wth2(ig, l) = zf2 * (0.5 * (wa_moy(ig, l) + wa_moy(ig, l + 1)))**2 649 END DO 650 END DO 651 652 653 654 ! PRINT*,'13 OK convect8' 655 ! PRINT*,'WA5 ',wa_moy 656 DO l = 1, nlay 657 DO ig = 1, ngrid 658 pdtadj(ig, l) = zdhadj(ig, l) * zpspsk(ig, l) 659 END DO 660 END DO 661 662 663 ! do l=1,nlay 664 ! do ig=1,ngrid 665 ! IF(abs(pdtadj(ig,l))*86400..gt.500.) THEN 666 ! PRINT*,'WARN!!! ig=',ig,' l=',l 667 ! s ,' pdtadj=',pdtadj(ig,l) 668 ! END IF 669 ! IF(abs(pdoadj(ig,l))*86400..gt.1.) THEN 670 ! PRINT*,'WARN!!! ig=',ig,' l=',l 671 ! s ,' pdoadj=',pdoadj(ig,l) 672 ! END IF 673 ! enddo 674 ! enddo 675 676 ! PRINT*,'14 OK convect8' 677 ! ------------------------------------------------------------------ 678 ! Calculs pour les sorties 679 ! ------------------------------------------------------------------ 680 681 IF (sorties) THEN 682 DO l = 1, nlay 683 DO ig = 1, ngrid 684 zla(ig, l) = (1. - fracd(ig, l)) * zmax(ig) 685 zld(ig, l) = fracd(ig, l) * zmax(ig) 686 IF (1. - fracd(ig, l)>1.E-10) zwa(ig, l) = wd(ig, l) * fracd(ig, l) / & 687 (1. - fracd(ig, l)) 688 END DO 689 END DO 690 691 DO l = 1, nlay 692 DO ig = 1, ngrid 693 detr(ig, l) = fm(ig, l) + entr(ig, l) - fm(ig, l + 1) 694 IF (detr(ig, l)<0.) THEN 695 entr(ig, l) = entr(ig, l) - detr(ig, l) 696 detr(ig, l) = 0. 697 ! PRINT*,'WARNING !!! detrainement negatif ',ig,l 698 END IF 699 END DO 700 END DO 701 END IF 702 703 ! PRINT*,'15 OK convect8' 704 705 706 ! IF(wa_moy(1,4).gt.1.e-10) stop 707 708 ! PRINT*,'19 OK convect8' 709 710 END SUBROUTINE thermcell_2002 711 712 SUBROUTINE thermcell_cld(ngrid, nlay, ptimestep, pplay, pplev, pphi, zlev, & 713 debut, pu, pv, pt, po, pduadj, pdvadj, pdtadj, pdoadj, fm0, entr0, zqla, & 714 lmax, zmax_sec, wmax_sec, zw_sec, lmix_sec, ratqscth, ratqsdiff & ! s 715 ! ,pu_therm,pv_therm 716 , r_aspect, l_mix, w2di, tho) 717 718 USE dimphy 719 IMPLICIT NONE 720 721 ! ======================================================================= 722 723 ! Calcul du transport verticale dans la couche limite en presence 724 ! de "thermiques" explicitement representes 725 726 ! Réécriture à partir d'un listing papier à Habas, le 14/02/00 727 728 ! le thermique est supposé homogène et dissipé par mélange avec 729 ! son environnement. la longueur l_mix contrôle l'efficacité du 730 ! mélange 731 732 ! Le calcul du transport des différentes espèces se fait en prenant 733 ! en compte: 734 ! 1. un flux de masse montant 735 ! 2. un flux de masse descendant 736 ! 3. un entrainement 737 ! 4. un detrainement 738 739 ! ======================================================================= 740 741 ! ----------------------------------------------------------------------- 742 ! declarations: 743 ! ------------- 744 745 include "YOMCST.h" 746 include "YOETHF.h" 747 include "FCTTRE.h" 748 749 ! arguments: 750 ! ---------- 751 752 INTEGER ngrid, nlay, w2di 753 REAL tho 754 REAL ptimestep, l_mix, r_aspect 755 REAL pt(ngrid, nlay), pdtadj(ngrid, nlay) 756 REAL pu(ngrid, nlay), pduadj(ngrid, nlay) 757 REAL pv(ngrid, nlay), pdvadj(ngrid, nlay) 758 REAL po(ngrid, nlay), pdoadj(ngrid, nlay) 759 REAL pplay(ngrid, nlay), pplev(ngrid, nlay + 1) 760 REAL pphi(ngrid, nlay) 761 762 INTEGER idetr 763 SAVE idetr 764 DATA idetr/3/ 765 !$OMP THREADPRIVATE(idetr) 766 767 ! local: 768 ! ------ 769 770 INTEGER ig, k, l, lmaxa(klon), lmix(klon) 771 REAL zsortie1d(klon) 772 ! CR: on remplace lmax(klon,klev+1) 773 INTEGER lmax(klon), lmin(klon), lentr(klon) 774 REAL linter(klon) 775 REAL zmix(klon), fracazmix(klon) 776 REAL alpha 777 SAVE alpha 778 DATA alpha/1./ 779 !$OMP THREADPRIVATE(alpha) 780 781 ! RC 782 REAL zmax(klon), zw, zz, zw2(klon, klev + 1), ztva(klon, klev), zzz 783 REAL zmax_sec(klon) 784 REAL zmax_sec2(klon) 785 REAL zw_sec(klon, klev + 1) 786 INTEGER lmix_sec(klon) 787 REAL w_est(klon, klev + 1) 788 ! on garde le zmax du pas de temps precedent 789 ! real zmax0(klon) 790 ! save zmax0 791 ! real zmix0(klon) 792 ! save zmix0 793 REAL, SAVE, ALLOCATABLE :: zmax0(:), zmix0(:) 794 !$OMP THREADPRIVATE(zmax0, zmix0) 795 796 REAL zlev(klon, klev + 1), zlay(klon, klev) 797 REAL deltaz(klon, klev) 798 REAL zh(klon, klev), zdhadj(klon, klev) 799 REAL zthl(klon, klev), zdthladj(klon, klev) 800 REAL ztv(klon, klev) 801 REAL zu(klon, klev), zv(klon, klev), zo(klon, klev) 802 REAL zl(klon, klev) 803 REAL wh(klon, klev + 1) 804 REAL wu(klon, klev + 1), wv(klon, klev + 1), wo(klon, klev + 1) 805 REAL zla(klon, klev + 1) 806 REAL zwa(klon, klev + 1) 807 REAL zld(klon, klev + 1) 808 REAL zwd(klon, klev + 1) 809 REAL zsortie(klon, klev) 810 REAL zva(klon, klev) 811 REAL zua(klon, klev) 812 REAL zoa(klon, klev) 813 814 REAL zta(klon, klev) 815 REAL zha(klon, klev) 816 REAL wa_moy(klon, klev + 1) 817 REAL fraca(klon, klev + 1) 818 REAL fracc(klon, klev + 1) 819 REAL zf, zf2 820 REAL thetath2(klon, klev), wth2(klon, klev), wth3(klon, klev) 821 REAL q2(klon, klev) 822 REAL dtheta(klon, klev) 823 ! common/comtherm/thetath2,wth2 824 825 REAL ratqscth(klon, klev) 826 REAL sum 827 REAL sumdiff 828 REAL ratqsdiff(klon, klev) 829 REAL count_time 830 INTEGER ialt 831 832 LOGICAL sorties 833 REAL rho(klon, klev), rhobarz(klon, klev + 1), masse(klon, klev) 834 REAL zpspsk(klon, klev) 835 836 ! real wmax(klon,klev),wmaxa(klon) 837 REAL wmax(klon), wmaxa(klon) 838 REAL wmax_sec(klon) 839 REAL wmax_sec2(klon) 840 REAL wa(klon, klev, klev + 1) 841 REAL wd(klon, klev + 1) 842 REAL larg_part(klon, klev, klev + 1) 843 REAL fracd(klon, klev + 1) 844 REAL xxx(klon, klev + 1) 845 REAL larg_cons(klon, klev + 1) 846 REAL larg_detr(klon, klev + 1) 847 REAL fm0(klon, klev + 1), entr0(klon, klev), detr(klon, klev) 848 REAL massetot(klon, klev) 849 REAL detr0(klon, klev) 850 REAL alim0(klon, klev) 851 REAL pu_therm(klon, klev), pv_therm(klon, klev) 852 REAL fm(klon, klev + 1), entr(klon, klev) 853 REAL fmc(klon, klev + 1) 854 855 REAL zcor, zdelta, zcvm5, qlbef 856 REAL tbef(klon), qsatbef(klon) 857 REAL dqsat_dt, dt, num, denom 858 REAL reps, rlvcp, ddt0 859 REAL ztla(klon, klev), zqla(klon, klev), zqta(klon, klev) 860 ! CR niveau de condensation 861 REAL nivcon(klon) 862 REAL zcon(klon) 863 REAL zqsat(klon, klev) 864 REAL zqsatth(klon, klev) 865 PARAMETER (ddt0 = .01) 866 867 868 ! CR:nouvelles variables 869 REAL f_star(klon, klev + 1), entr_star(klon, klev) 870 REAL detr_star(klon, klev) 871 REAL alim_star_tot(klon), alim_star2(klon) 872 REAL entr_star_tot(klon) 873 REAL detr_star_tot(klon) 874 REAL alim_star(klon, klev) 875 REAL alim(klon, klev) 876 REAL nu(klon, klev) 877 REAL nu_e(klon, klev) 878 REAL nu_min 879 REAL nu_max 880 REAL nu_r 881 REAL f(klon) 882 ! real f(klon), f0(klon) 883 ! save f0 884 REAL, SAVE, ALLOCATABLE :: f0(:) 885 !$OMP THREADPRIVATE(f0) 886 887 REAL f_old 888 REAL zlevinter(klon) 889 LOGICAL, SAVE :: first = .TRUE. 890 !$OMP THREADPRIVATE(first) 891 ! data first /.FALSE./ 892 ! save first 893 LOGICAL nuage 894 ! save nuage 895 LOGICAL boucle 896 LOGICAL therm 897 LOGICAL debut 898 LOGICAL rale 899 INTEGER test(klon) 900 INTEGER signe_zw2 901 ! RC 902 903 CHARACTER *2 str2 904 CHARACTER *10 str10 905 906 CHARACTER (LEN = 20) :: modname = 'thermcell_cld' 907 CHARACTER (LEN = 80) :: abort_message 908 909 LOGICAL vtest(klon), down 910 LOGICAL zsat(klon) 911 912 INTEGER ncorrec, ll 913 SAVE ncorrec 914 DATA ncorrec/0/ 915 !$OMP THREADPRIVATE(ncorrec) 916 917 918 919 ! ----------------------------------------------------------------------- 920 ! initialisation: 921 ! --------------- 922 923 IF (first) THEN 924 ALLOCATE (zmix0(klon)) 925 ALLOCATE (zmax0(klon)) 926 ALLOCATE (f0(klon)) 927 first = .FALSE. 928 END IF 929 930 sorties = .FALSE. 931 ! PRINT*,'NOUVEAU DETR PLUIE ' 932 IF (ngrid/=klon) THEN 933 PRINT * 934 PRINT *, 'STOP dans convadj' 935 PRINT *, 'ngrid =', ngrid 936 PRINT *, 'klon =', klon 937 END IF 938 939 ! Initialisation 940 rlvcp = rlvtt / rcpd 941 reps = rd / rv 942 ! initialisations de zqsat 943 DO ll = 1, nlay 944 DO ig = 1, ngrid 945 zqsat(ig, ll) = 0. 946 zqsatth(ig, ll) = 0. 947 END DO 948 END DO 949 950 ! on met le first a true pour le premier passage de la journée 951 DO ig = 1, klon 952 test(ig) = 0 953 END DO 954 IF (debut) THEN 955 DO ig = 1, klon 956 test(ig) = 1 957 f0(ig) = 0. 958 zmax0(ig) = 0. 959 END DO 960 END IF 961 DO ig = 1, klon 962 IF ((.NOT. debut) .AND. (f0(ig)<1.E-10)) THEN 963 test(ig) = 1 964 END IF 965 END DO 966 ! do ig=1,klon 967 ! PRINT*,'test(ig)',test(ig),zmax0(ig) 968 ! enddo 969 nuage = .FALSE. 970 ! ----------------------------------------------------------------------- 971 ! AM Calcul de T,q,ql a partir de Tl et qT 972 ! --------------------------------------------------- 973 974 ! Pr Tprec=Tl calcul de qsat 975 ! Si qsat>qT T=Tl, q=qT 976 ! Sinon DDT=(-Tprec+Tl+RLVCP (qT-qsat(T')) / (1+RLVCP dqsat/dt) 977 ! On cherche DDT < DDT0 978 979 ! defaut 980 DO ll = 1, nlay 981 DO ig = 1, ngrid 982 zo(ig, ll) = po(ig, ll) 983 zl(ig, ll) = 0. 984 zh(ig, ll) = pt(ig, ll) 985 END DO 986 END DO 987 DO ig = 1, ngrid 988 zsat(ig) = .FALSE. 989 END DO 990 991 DO ll = 1, nlay 992 ! les points insatures sont definitifs 993 DO ig = 1, ngrid 994 tbef(ig) = pt(ig, ll) 995 zdelta = max(0., sign(1., rtt - tbef(ig))) 996 qsatbef(ig) = r2es * foeew(tbef(ig), zdelta) / pplev(ig, ll) 997 qsatbef(ig) = min(0.5, qsatbef(ig)) 998 zcor = 1. / (1. - retv * qsatbef(ig)) 999 qsatbef(ig) = qsatbef(ig) * zcor 1000 zsat(ig) = (max(0., po(ig, ll) - qsatbef(ig))>1.E-10) 1001 END DO 1002 1003 DO ig = 1, ngrid 1004 IF (zsat(ig) .AND. (1==1)) THEN 1005 qlbef = max(0., po(ig, ll) - qsatbef(ig)) 1006 ! si sature: ql est surestime, d'ou la sous-relax 1007 dt = 0.5 * rlvcp * qlbef 1008 ! WRITE(18,*) 'DT0=',DT 1009 ! on pourra enchainer 2 ou 3 calculs sans Do while 1010 DO WHILE (abs(dt)>ddt0) 1011 ! il faut verifier si c,a conserve quand on repasse en insature ... 1012 tbef(ig) = tbef(ig) + dt 1013 zdelta = max(0., sign(1., rtt - tbef(ig))) 1014 qsatbef(ig) = r2es * foeew(tbef(ig), zdelta) / pplev(ig, ll) 1015 qsatbef(ig) = min(0.5, qsatbef(ig)) 1016 zcor = 1. / (1. - retv * qsatbef(ig)) 1017 qsatbef(ig) = qsatbef(ig) * zcor 1018 ! on veut le signe de qlbef 1019 qlbef = po(ig, ll) - qsatbef(ig) 1020 zdelta = max(0., sign(1., rtt - tbef(ig))) 1021 zcvm5 = r5les * (1. - zdelta) + r5ies * zdelta 1022 zcor = 1. / (1. - retv * qsatbef(ig)) 1023 dqsat_dt = foede(tbef(ig), zdelta, zcvm5, qsatbef(ig), zcor) 1024 num = -tbef(ig) + pt(ig, ll) + rlvcp * qlbef 1025 denom = 1. + rlvcp * dqsat_dt 1026 IF (denom<1.E-10) THEN 1027 PRINT *, 'pb denom' 1028 END IF 1029 dt = num / denom 1030 END DO 1031 ! on ecrit de maniere conservative (sat ou non) 1032 zl(ig, ll) = max(0., qlbef) 1033 ! T = Tl +Lv/Cp ql 1034 zh(ig, ll) = pt(ig, ll) + rlvcp * zl(ig, ll) 1035 zo(ig, ll) = po(ig, ll) - zl(ig, ll) 1036 END IF 1037 ! on ecrit zqsat 1038 zqsat(ig, ll) = qsatbef(ig) 1039 END DO 1040 END DO 1041 ! AM fin 1042 1043 ! ----------------------------------------------------------------------- 1044 ! incrementation eventuelle de tendances precedentes: 1045 ! --------------------------------------------------- 1046 1047 ! PRINT*,'0 OK convect8' 1048 1049 DO l = 1, nlay 1050 DO ig = 1, ngrid 1051 zpspsk(ig, l) = (pplay(ig, l) / 100000.)**rkappa 1052 ! zpspsk(ig,l)=(pplay(ig,l)/pplev(ig,1))**RKAPPA 1053 ! zh(ig,l)=pt(ig,l)/zpspsk(ig,l) 1054 zu(ig, l) = pu(ig, l) 1055 zv(ig, l) = pv(ig, l) 1056 ! zo(ig,l)=po(ig,l) 1057 ! ztv(ig,l)=zh(ig,l)*(1.+0.61*zo(ig,l)) 1058 ! AM attention zh est maintenant le profil de T et plus le profil de 1059 ! theta ! 1060 1061 ! T-> Theta 1062 ztv(ig, l) = zh(ig, l) / zpspsk(ig, l) 1063 ! AM Theta_v 1064 ztv(ig, l) = ztv(ig, l) * (1. + retv * (zo(ig, l)) - zl(ig, l)) 1065 ! AM Thetal 1066 zthl(ig, l) = pt(ig, l) / zpspsk(ig, l) 1067 1068 END DO 1069 END DO 1070 1071 ! PRINT*,'1 OK convect8' 1072 ! -------------------- 1073 1074 1075 ! + + + + + + + + + + + 1076 1077 1078 ! wa, fraca, wd, fracd -------------------- zlev(2), rhobarz 1079 ! wh,wt,wo ... 1080 1081 ! + + + + + + + + + + + zh,zu,zv,zo,rho 1082 1083 1084 ! -------------------- zlev(1) 1085 ! \\\\\\\\\\\\\\\\\\\\ 1086 1087 1088 1089 ! ----------------------------------------------------------------------- 1090 ! Calcul des altitudes des couches 1091 ! ----------------------------------------------------------------------- 1092 1093 DO l = 2, nlay 1094 DO ig = 1, ngrid 1095 zlev(ig, l) = 0.5 * (pphi(ig, l) + pphi(ig, l - 1)) / rg 1096 END DO 1097 END DO 1098 DO ig = 1, ngrid 1099 zlev(ig, 1) = 0. 1100 zlev(ig, nlay + 1) = (2. * pphi(ig, klev) - pphi(ig, klev - 1)) / rg 1101 END DO 1102 DO l = 1, nlay 1103 DO ig = 1, ngrid 1104 zlay(ig, l) = pphi(ig, l) / rg 1105 END DO 1106 END DO 1107 ! calcul de deltaz 1108 DO l = 1, nlay 1109 DO ig = 1, ngrid 1110 deltaz(ig, l) = zlev(ig, l + 1) - zlev(ig, l) 1111 END DO 1112 END DO 1113 1114 ! PRINT*,'2 OK convect8' 1115 ! ----------------------------------------------------------------------- 1116 ! Calcul des densites 1117 ! ----------------------------------------------------------------------- 1118 1119 DO l = 1, nlay 1120 DO ig = 1, ngrid 1121 ! rho(ig,l)=pplay(ig,l)/(zpspsk(ig,l)*RD*zh(ig,l)) 1122 rho(ig, l) = pplay(ig, l) / (zpspsk(ig, l) * rd * ztv(ig, l)) 1123 END DO 1124 END DO 1125 1126 DO l = 2, nlay 1127 DO ig = 1, ngrid 1128 rhobarz(ig, l) = 0.5 * (rho(ig, l) + rho(ig, l - 1)) 1129 END DO 1130 END DO 1131 1132 DO k = 1, nlay 1133 DO l = 1, nlay + 1 1134 DO ig = 1, ngrid 1135 wa(ig, k, l) = 0. 1136 END DO 1137 END DO 1138 END DO 1139 ! Cr:ajout:calcul de la masse 1140 DO l = 1, nlay 1141 DO ig = 1, ngrid 1142 ! masse(ig,l)=rho(ig,l)*(zlev(ig,l+1)-zlev(ig,l)) 1143 masse(ig, l) = (pplev(ig, l) - pplev(ig, l + 1)) / rg 1144 END DO 1145 END DO 1146 ! PRINT*,'3 OK convect8' 1147 ! ------------------------------------------------------------------ 1148 ! Calcul de w2, quarre de w a partir de la cape 1149 ! a partir de w2, on calcule wa, vitesse de l'ascendance 1150 1151 ! ATTENTION: Dans cette version, pour cause d'economie de memoire, 1152 ! w2 est stoke dans wa 1153 1154 ! ATTENTION: dans convect8, on n'utilise le calcule des wa 1155 ! independants par couches que pour calculer l'entrainement 1156 ! a la base et la hauteur max de l'ascendance. 1157 1158 ! Indicages: 1159 ! l'ascendance provenant du niveau k traverse l'interface l avec 1160 ! une vitesse wa(k,l). 1161 1162 ! -------------------- 1163 1164 ! + + + + + + + + + + 1165 1166 ! wa(k,l) ---- -------------------- l 1167 ! /\ 1168 ! /||\ + + + + + + + + + + 1169 ! || 1170 ! || -------------------- 1171 ! || 1172 ! || + + + + + + + + + + 1173 ! || 1174 ! || -------------------- 1175 ! ||__ 1176 ! |___ + + + + + + + + + + k 1177 1178 ! -------------------- 1179 1180 1181 1182 ! ------------------------------------------------------------------ 1183 1184 ! CR: ponderation entrainement des couches instables 1185 ! def des alim_star tels que alim=f*alim_star 1186 DO l = 1, klev 1187 DO ig = 1, ngrid 1188 alim_star(ig, l) = 0. 1189 alim(ig, l) = 0. 1190 END DO 1191 END DO 1192 ! determination de la longueur de la couche d entrainement 1193 DO ig = 1, ngrid 1194 lentr(ig) = 1 1195 END DO 1196 1197 ! on ne considere que les premieres couches instables 1198 therm = .FALSE. 1199 DO k = nlay - 2, 1, -1 1200 DO ig = 1, ngrid 1201 IF (ztv(ig, k)>ztv(ig, k + 1) .AND. ztv(ig, k + 1)<=ztv(ig, k + 2)) THEN 1202 lentr(ig) = k + 1 1203 therm = .TRUE. 1204 END IF 1205 END DO 1206 END DO 1207 1208 ! determination du lmin: couche d ou provient le thermique 1209 DO ig = 1, ngrid 1210 lmin(ig) = 1 1211 END DO 1212 DO ig = 1, ngrid 1213 DO l = nlay, 2, -1 1214 IF (ztv(ig, l - 1)>ztv(ig, l)) THEN 1215 lmin(ig) = l - 1 1216 END IF 1217 END DO 1218 END DO 1219 1220 ! definition de l'entrainement des couches 1221 DO l = 1, klev - 1 1222 DO ig = 1, ngrid 1223 IF (ztv(ig, l)>ztv(ig, l + 1) .AND. l>=lmin(ig) .AND. l<lentr(ig)) THEN 1224 ! def possibles pour alim_star: zdthetadz, dthetadz, zdtheta 1225 alim_star(ig, l) = max((ztv(ig, l) - ztv(ig, l + 1)), 0.) & ! s 1226 ! *(zlev(ig,l+1)-zlev(ig,l)) 1227 * sqrt(zlev(ig, l + 1)) 1228 ! alim_star(ig,l)=zlev(ig,l+1)*(1.-(zlev(ig,l+1) 1229 ! s /zlev(ig,lentr(ig)+2)))**(3./2.) 1230 END IF 1231 END DO 1232 END DO 1233 1234 ! pas de thermique si couche 1 stable 1235 DO ig = 1, ngrid 1236 ! if (lmin(ig).gt.1) THEN 1237 ! CRnouveau test 1238 IF (alim_star(ig, 1)<1.E-10) THEN 1239 DO l = 1, klev 1240 alim_star(ig, l) = 0. 1241 END DO 1242 END IF 1243 END DO 1244 ! calcul de l entrainement total 1245 DO ig = 1, ngrid 1246 alim_star_tot(ig) = 0. 1247 entr_star_tot(ig) = 0. 1248 detr_star_tot(ig) = 0. 1249 END DO 1250 DO ig = 1, ngrid 1251 DO k = 1, klev 1252 alim_star_tot(ig) = alim_star_tot(ig) + alim_star(ig, k) 1253 END DO 1254 END DO 1255 1256 ! Calcul entrainement normalise 1257 DO ig = 1, ngrid 1258 IF (alim_star_tot(ig)>1.E-10) THEN 1259 ! do l=1,lentr(ig) 1260 DO l = 1, klev 1261 ! def possibles pour entr_star: zdthetadz, dthetadz, zdtheta 1262 alim_star(ig, l) = alim_star(ig, l) / alim_star_tot(ig) 1263 END DO 1264 END IF 1265 END DO 1266 1267 ! PRINT*,'fin calcul alim_star' 1268 1269 ! AM:initialisations 1270 DO k = 1, nlay 1271 DO ig = 1, ngrid 1272 ztva(ig, k) = ztv(ig, k) 1273 ztla(ig, k) = zthl(ig, k) 1274 zqla(ig, k) = 0. 1275 zqta(ig, k) = po(ig, k) 1276 zsat(ig) = .FALSE. 1277 END DO 1278 END DO 1279 DO k = 1, klev 1280 DO ig = 1, ngrid 1281 detr_star(ig, k) = 0. 1282 entr_star(ig, k) = 0. 1283 detr(ig, k) = 0. 1284 entr(ig, k) = 0. 1285 END DO 1286 END DO 1287 ! PRINT*,'7 OK convect8' 1288 DO k = 1, klev + 1 1289 DO ig = 1, ngrid 1290 zw2(ig, k) = 0. 1291 fmc(ig, k) = 0. 1292 ! CR 1293 f_star(ig, k) = 0. 1294 ! RC 1295 larg_cons(ig, k) = 0. 1296 larg_detr(ig, k) = 0. 1297 wa_moy(ig, k) = 0. 1298 END DO 1299 END DO 1300 1301 ! n PRINT*,'8 OK convect8' 1302 DO ig = 1, ngrid 1303 linter(ig) = 1. 1304 lmaxa(ig) = 1 1305 lmix(ig) = 1 1306 wmaxa(ig) = 0. 1307 END DO 1308 1309 nu_min = l_mix 1310 nu_max = 1000. 1311 ! do ig=1,ngrid 1312 ! nu_max=wmax_sec(ig) 1313 ! enddo 1314 DO ig = 1, ngrid 1315 DO k = 1, klev 1316 nu(ig, k) = 0. 1317 nu_e(ig, k) = 0. 1318 END DO 1319 END DO 1320 ! Calcul de l'excès de température du à la diffusion turbulente 1321 DO ig = 1, ngrid 1322 DO l = 1, klev 1323 dtheta(ig, l) = 0. 1324 END DO 1325 END DO 1326 DO ig = 1, ngrid 1327 DO l = 1, lentr(ig) - 1 1328 dtheta(ig, l) = sqrt(10. * 0.4 * zlev(ig, l + 1)**2 * 1. * ((ztv(ig, l + 1) - & 1329 ztv(ig, l)) / (zlev(ig, l + 1) - zlev(ig, l)))**2) 1330 END DO 1331 END DO 1332 ! do l=1,nlay-2 1333 DO l = 1, klev - 1 1334 DO ig = 1, ngrid 1335 IF (ztv(ig, l)>ztv(ig, l + 1) .AND. alim_star(ig, l)>1.E-10 .AND. & 1336 zw2(ig, l)<1E-10) THEN 1337 ! AM 1338 ! test:on rajoute un excès de T dans couche alim 1339 ! ztla(ig,l)=zthl(ig,l)+dtheta(ig,l) 1340 ztla(ig, l) = zthl(ig, l) 1341 ! test: on rajoute un excès de q dans la couche alim 1342 ! zqta(ig,l)=po(ig,l)+0.001 1343 zqta(ig, l) = po(ig, l) 1344 zqla(ig, l) = zl(ig, l) 1345 ! AM 1346 f_star(ig, l + 1) = alim_star(ig, l) 1347 ! test:calcul de dteta 1348 zw2(ig, l + 1) = 2. * rg * (ztv(ig, l) - ztv(ig, l + 1)) / ztv(ig, l + 1) * & 1349 (zlev(ig, l + 1) - zlev(ig, l)) * 0.4 * pphi(ig, l) / (pphi(ig, l + 1) - pphi(ig, l)) 1350 w_est(ig, l + 1) = zw2(ig, l + 1) 1351 larg_detr(ig, l) = 0. 1352 ! PRINT*,'coucou boucle 1' 1353 ELSE IF ((zw2(ig, l)>=1E-10) .AND. (f_star(ig, l) + alim_star(ig, & 1354 l))>1.E-10) THEN 1355 ! PRINT*,'coucou boucle 2' 1356 ! estimation du detrainement a partir de la geometrie du pas 1357 ! precedent 1358 IF ((test(ig)==1) .OR. ((.NOT. debut) .AND. (f0(ig)<1.E-10))) THEN 1359 detr_star(ig, l) = 0. 1360 entr_star(ig, l) = 0. 1361 ! PRINT*,'coucou test(ig)',test(ig),f0(ig),zmax0(ig) 1362 ELSE 1363 ! PRINT*,'coucou debut detr' 1364 ! tests sur la definition du detr 1365 IF (zqla(ig, l - 1)>1.E-10) THEN 1366 nuage = .TRUE. 1367 END IF 1368 1369 w_est(ig, l + 1) = zw2(ig, l) * ((f_star(ig, l))**2) / (f_star(ig, l) + & 1370 alim_star(ig, l))**2 + 2. * rg * (ztva(ig, l - 1) - ztv(ig, l)) / ztv(ig, l) * (& 1371 zlev(ig, l + 1) - zlev(ig, l)) 1372 IF (w_est(ig, l + 1)<0.) THEN 1373 w_est(ig, l + 1) = zw2(ig, l) 1374 END IF 1375 IF (l>2) THEN 1376 IF ((w_est(ig, l + 1)>w_est(ig, l)) .AND. (zlev(ig, & 1377 l + 1)<zmax_sec(ig)) .AND. (zqla(ig, l - 1)<1.E-10)) THEN 1378 detr_star(ig, l) = max(0., (rhobarz(ig, & 1379 l + 1) * sqrt(w_est(ig, l + 1)) * sqrt(nu(ig, l) * & 1380 zlev(ig, l + 1)) - rhobarz(ig, l) * sqrt(w_est(ig, l)) * sqrt(nu(ig, l) * & 1381 zlev(ig, l))) / (r_aspect * zmax_sec(ig))) 1382 ELSE IF ((zlev(ig, l + 1)<zmax_sec(ig)) .AND. (zqla(ig, & 1383 l - 1)<1.E-10)) THEN 1384 detr_star(ig, l) = -f0(ig) * f_star(ig, lmix(ig)) / (rhobarz(ig, & 1385 lmix(ig)) * wmaxa(ig)) * (rhobarz(ig, l + 1) * sqrt(w_est(ig, & 1386 l + 1)) * ((zmax_sec(ig) - zlev(ig, l + 1)) / ((zmax_sec(ig) - zlev(ig, & 1387 lmix(ig)))))**2. - rhobarz(ig, l) * sqrt(w_est(ig, & 1388 l)) * ((zmax_sec(ig) - zlev(ig, l)) / ((zmax_sec(ig) - zlev(ig, lmix(ig & 1389 )))))**2.) 1390 ELSE 1391 detr_star(ig, l) = 0.002 * f0(ig) * f_star(ig, l) * & 1392 (zlev(ig, l + 1) - zlev(ig, l)) 1393 1394 END IF 1395 ELSE 1396 detr_star(ig, l) = 0. 1397 END IF 1398 1399 detr_star(ig, l) = detr_star(ig, l) / f0(ig) 1400 IF (nuage) THEN 1401 entr_star(ig, l) = 0.4 * detr_star(ig, l) 1402 ELSE 1403 entr_star(ig, l) = 0.4 * detr_star(ig, l) 1404 END IF 1405 1406 IF ((detr_star(ig, l))>f_star(ig, l)) THEN 1407 detr_star(ig, l) = f_star(ig, l) 1408 ! entr_star(ig,l)=0. 1409 END IF 1410 1411 IF ((l<lentr(ig))) THEN 1412 entr_star(ig, l) = 0. 1413 ! detr_star(ig,l)=0. 1414 END IF 1415 1416 ! PRINT*,'ok detr_star' 1417 END IF 1418 ! prise en compte du detrainement dans le calcul du flux 1419 f_star(ig, l + 1) = f_star(ig, l) + alim_star(ig, l) + & 1420 entr_star(ig, l) - detr_star(ig, l) 1421 ! test 1422 ! if (f_star(ig,l+1).lt.0.) THEN 1423 ! f_star(ig,l+1)=0. 1424 ! entr_star(ig,l)=0. 1425 ! detr_star(ig,l)=f_star(ig,l)+alim_star(ig,l) 1426 ! END IF 1427 ! test sur le signe de f_star 1428 IF (f_star(ig, l + 1)>1.E-10) THEN 1429 ! THEN 1430 ! test 1431 ! if (((f_star(ig,l+1)+detr_star(ig,l)).gt.1.e-10)) THEN 1432 ! AM on melange Tl et qt du thermique 1433 ! on rajoute un excès de T dans la couche alim 1434 ! if (l.lt.lentr(ig)) THEN 1435 ! ztla(ig,l)=(f_star(ig,l)*ztla(ig,l-1)+ 1436 ! s 1437 ! (alim_star(ig,l)+entr_star(ig,l))*(zthl(ig,l)+dtheta(ig,l))) 1438 ! s /(f_star(ig,l+1)+detr_star(ig,l)) 1439 ! else 1440 ztla(ig, l) = (f_star(ig, l) * ztla(ig, l - 1) + (alim_star(ig, & 1441 l) + entr_star(ig, l)) * zthl(ig, l)) / (f_star(ig, l + 1) + detr_star(ig, l)) 1442 ! s /(f_star(ig,l+1)) 1443 ! END IF 1444 ! on rajoute un excès de q dans la couche alim 1445 ! if (l.lt.lentr(ig)) THEN 1446 ! zqta(ig,l)=(f_star(ig,l)*zqta(ig,l-1)+ 1447 ! s (alim_star(ig,l)+entr_star(ig,l))*(po(ig,l)+0.001)) 1448 ! s /(f_star(ig,l+1)+detr_star(ig,l)) 1449 ! else 1450 zqta(ig, l) = (f_star(ig, l) * zqta(ig, l - 1) + (alim_star(ig, & 1451 l) + entr_star(ig, l)) * po(ig, l)) / (f_star(ig, l + 1) + detr_star(ig, l)) 1452 ! s /(f_star(ig,l+1)) 1453 ! END IF 1454 ! AM on en deduit thetav et ql du thermique 1455 ! CR test 1456 ! Tbef(ig)=ztla(ig,l)*zpspsk(ig,l) 1457 tbef(ig) = ztla(ig, l) * zpspsk(ig, l) 1458 zdelta = max(0., sign(1., rtt - tbef(ig))) 1459 qsatbef(ig) = r2es * foeew(tbef(ig), zdelta) / pplev(ig, l) 1460 qsatbef(ig) = min(0.5, qsatbef(ig)) 1461 zcor = 1. / (1. - retv * qsatbef(ig)) 1462 qsatbef(ig) = qsatbef(ig) * zcor 1463 zsat(ig) = (max(0., zqta(ig, l) - qsatbef(ig))>1.E-10) 1464 1465 IF (zsat(ig) .AND. (1==1)) THEN 1466 qlbef = max(0., zqta(ig, l) - qsatbef(ig)) 1467 dt = 0.5 * rlvcp * qlbef 1468 ! WRITE(17,*)'DT0=',DT 1469 DO WHILE (abs(dt)>ddt0) 1470 ! PRINT*,'aie' 1471 tbef(ig) = tbef(ig) + dt 1472 zdelta = max(0., sign(1., rtt - tbef(ig))) 1473 qsatbef(ig) = r2es * foeew(tbef(ig), zdelta) / pplev(ig, l) 1474 qsatbef(ig) = min(0.5, qsatbef(ig)) 1475 zcor = 1. / (1. - retv * qsatbef(ig)) 1476 qsatbef(ig) = qsatbef(ig) * zcor 1477 qlbef = zqta(ig, l) - qsatbef(ig) 1478 1479 zdelta = max(0., sign(1., rtt - tbef(ig))) 1480 zcvm5 = r5les * (1. - zdelta) + r5ies * zdelta 1481 zcor = 1. / (1. - retv * qsatbef(ig)) 1482 dqsat_dt = foede(tbef(ig), zdelta, zcvm5, qsatbef(ig), zcor) 1483 num = -tbef(ig) + ztla(ig, l) * zpspsk(ig, l) + rlvcp * qlbef 1484 denom = 1. + rlvcp * dqsat_dt 1485 IF (denom<1.E-10) THEN 1486 PRINT *, 'pb denom' 1487 END IF 1488 dt = num / denom 1489 ! WRITE(17,*)'DT=',DT 1490 END DO 1491 zqla(ig, l) = max(0., zqta(ig, l) - qsatbef(ig)) 1492 zqla(ig, l) = max(0., qlbef) 1493 ! zqla(ig,l)=0. 1494 END IF 1495 ! zqla(ig,l) = max(0.,zqta(ig,l)-qsatbef(ig)) 1496 1497 ! on ecrit de maniere conservative (sat ou non) 1498 ! T = Tl +Lv/Cp ql 1499 ! CR rq utilisation de humidite specifique ou rapport de melange? 1500 ztva(ig, l) = ztla(ig, l) * zpspsk(ig, l) + rlvcp * zqla(ig, l) 1501 ztva(ig, l) = ztva(ig, l) / zpspsk(ig, l) 1502 ! on rajoute le calcul de zha pour diagnostiques (temp potentielle) 1503 zha(ig, l) = ztva(ig, l) 1504 ! if (l.lt.lentr(ig)) THEN 1505 ! ztva(ig,l) = ztva(ig,l)*(1.+RETV*(zqta(ig,l) 1506 ! s -zqla(ig,l))-zqla(ig,l)) + 0.1 1507 ! else 1508 ztva(ig, l) = ztva(ig, l) * (1. + retv * (zqta(ig, l) - zqla(ig, & 1509 l)) - zqla(ig, l)) 1510 ! END IF 1511 ! ztva(ig,l) = ztla(ig,l)*zpspsk(ig,l)+RLvCp*zqla(ig,l) 1512 ! s /(1.-retv*zqla(ig,l)) 1513 ! ztva(ig,l) = ztva(ig,l)/zpspsk(ig,l) 1514 ! ztva(ig,l) = ztva(ig,l)*(1.+RETV*(zqta(ig,l) 1515 ! s /(1.-retv*zqta(ig,l)) 1516 ! s -zqla(ig,l)/(1.-retv*zqla(ig,l))) 1517 ! s -zqla(ig,l)/(1.-retv*zqla(ig,l))) 1518 ! WRITE(13,*)zqla(ig,l),zqla(ig,l)/(1.-retv*zqla(ig,l)) 1519 ! on ecrit zqsat 1520 zqsatth(ig, l) = qsatbef(ig) 1521 ! enddo 1522 ! DO ig=1,ngrid 1523 ! if (zw2(ig,l).ge.1.e-10.AND. 1524 ! s f_star(ig,l)+entr_star(ig,l).gt.1.e-10) THEN 1525 ! mise a jour de la vitesse ascendante (l'air entraine de la couche 1526 ! consideree commence avec une vitesse nulle). 1527 1528 ! if (f_star(ig,l+1).gt.1.e-10) THEN 1529 zw2(ig, l + 1) = zw2(ig, l) * & ! s 1530 ! ((f_star(ig,l)-detr_star(ig,l))**2) 1531 ! s /f_star(ig,l+1)**2+ 1532 ((f_star(ig, l))**2) / (f_star(ig, l + 1) + detr_star(ig, l))**2 + & ! s 1533 ! /(f_star(ig,l+1))**2+ 1534 2. * rg * (ztva(ig, l) - ztv(ig, l)) / ztv(ig, l) * (zlev(ig, l + 1) - zlev(ig, l)) 1535 ! s *(f_star(ig,l)/f_star(ig,l+1))**2 1536 1537 END IF 1538 END IF 1539 1540 IF (zw2(ig, l + 1)<0.) THEN 1541 linter(ig) = (l * (zw2(ig, l + 1) - zw2(ig, l)) - zw2(ig, l)) / (zw2(ig, l + 1) - zw2(& 1542 ig, l)) 1543 zw2(ig, l + 1) = 0. 1544 ! PRINT*,'linter=',linter(ig) 1545 ! ELSE IF ((zw2(ig,l+1).lt.1.e-10).AND.(zw2(ig,l+1).ge.0.)) THEN 1546 ! linter(ig)=l+1 1547 ! PRINT*,'linter=l',zw2(ig,l),zw2(ig,l+1) 1548 ELSE 1549 wa_moy(ig, l + 1) = sqrt(zw2(ig, l + 1)) 1550 ! wa_moy(ig,l+1)=zw2(ig,l+1) 1551 END IF 1552 IF (wa_moy(ig, l + 1)>wmaxa(ig)) THEN 1553 ! lmix est le niveau de la couche ou w (wa_moy) est maximum 1554 lmix(ig) = l + 1 1555 wmaxa(ig) = wa_moy(ig, l + 1) 1556 END IF 1557 END DO 1558 END DO 1559 PRINT *, 'fin calcul zw2' 1560 1561 ! Calcul de la couche correspondant a la hauteur du thermique 1562 DO ig = 1, ngrid 1563 lmax(ig) = lentr(ig) 1564 END DO 1565 DO ig = 1, ngrid 1566 DO l = nlay, lentr(ig) + 1, -1 1567 IF (zw2(ig, l)<=1.E-10) THEN 1568 lmax(ig) = l - 1 1569 END IF 1570 END DO 1571 END DO 1572 ! pas de thermique si couche 1 stable 1573 DO ig = 1, ngrid 1574 IF (lmin(ig)>1) THEN 1575 lmax(ig) = 1 1576 lmin(ig) = 1 1577 lentr(ig) = 1 1578 END IF 1579 END DO 1580 1581 ! Determination de zw2 max 1582 DO ig = 1, ngrid 1583 wmax(ig) = 0. 1584 END DO 1585 1586 DO l = 1, nlay 1587 DO ig = 1, ngrid 1588 IF (l<=lmax(ig)) THEN 1589 IF (zw2(ig, l)<0.) THEN 1590 PRINT *, 'pb2 zw2<0' 1591 END IF 1592 zw2(ig, l) = sqrt(zw2(ig, l)) 1593 wmax(ig) = max(wmax(ig), zw2(ig, l)) 1594 ELSE 1595 zw2(ig, l) = 0. 1596 END IF 1597 END DO 1598 END DO 1599 1600 ! Longueur caracteristique correspondant a la hauteur des thermiques. 1601 DO ig = 1, ngrid 1602 zmax(ig) = 0. 1603 zlevinter(ig) = zlev(ig, 1) 1604 END DO 1605 DO ig = 1, ngrid 1606 ! calcul de zlevinter 1607 zlevinter(ig) = (zlev(ig, lmax(ig) + 1) - zlev(ig, lmax(ig))) * linter(ig) + & 1608 zlev(ig, lmax(ig)) - lmax(ig) * (zlev(ig, lmax(ig) + 1) - zlev(ig, lmax(ig))) 1609 ! pour le cas ou on prend tjs lmin=1 1610 ! zmax(ig)=max(zmax(ig),zlevinter(ig)-zlev(ig,lmin(ig))) 1611 zmax(ig) = max(zmax(ig), zlevinter(ig) - zlev(ig, 1)) 1612 zmax0(ig) = zmax(ig) 1613 WRITE (11, *) 'ig,lmax,linter', ig, lmax(ig), linter(ig) 1614 WRITE (12, *) 'ig,zlevinter,zmax', ig, zmax(ig), zlevinter(ig) 1615 END DO 1616 1617 ! Calcul de zmax_sec et wmax_sec 1618 CALL fermeture_seche(ngrid, nlay, pplay, pplev, pphi, zlev, rhobarz, f0, & 1619 zpspsk, alim, zh, zo, lentr, lmin, nu_min, nu_max, r_aspect, zmax_sec2, & 1620 wmax_sec2) 1621 1622 PRINT *, 'avant fermeture' 1623 ! Fermeture,determination de f 1624 ! en lmax f=d-e 1625 DO ig = 1, ngrid 1626 ! entr_star(ig,lmax(ig))=0. 1627 ! f_star(ig,lmax(ig)+1)=0. 1628 ! detr_star(ig,lmax(ig))=f_star(ig,lmax(ig))+entr_star(ig,lmax(ig)) 1629 ! s +alim_star(ig,lmax(ig)) 1630 END DO 1631 1632 DO ig = 1, ngrid 1633 alim_star2(ig) = 0. 1634 END DO 1635 ! calcul de entr_star_tot 1636 DO ig = 1, ngrid 1637 DO k = 1, lmix(ig) 1638 entr_star_tot(ig) = entr_star_tot(ig) & ! s 1639 ! +entr_star(ig,k) 1640 + alim_star(ig, k) 1641 ! s -detr_star(ig,k) 1642 detr_star_tot(ig) = detr_star_tot(ig) & ! s 1643 ! +alim_star(ig,k) 1644 - detr_star(ig, k) + entr_star(ig, k) 1645 END DO 1646 END DO 1647 1648 DO ig = 1, ngrid 1649 IF (alim_star_tot(ig)<1.E-10) THEN 1650 f(ig) = 0. 1651 ELSE 1652 ! do k=lmin(ig),lentr(ig) 1653 DO k = 1, lentr(ig) 1654 alim_star2(ig) = alim_star2(ig) + alim_star(ig, k)**2 / (rho(ig, k) * (& 1655 zlev(ig, k + 1) - zlev(ig, k))) 1656 END DO 1657 IF ((zmax_sec(ig)>1.E-10) .AND. (1==1)) THEN 1658 f(ig) = wmax_sec(ig) / (max(500., zmax_sec(ig)) * r_aspect * alim_star2(ig)) 1659 f(ig) = f(ig) + (f0(ig) - f(ig)) * exp((-ptimestep / zmax_sec(ig)) * wmax_sec & 1660 (ig)) 1661 ELSE 1662 f(ig) = wmax(ig) / (max(500., zmax(ig)) * r_aspect * alim_star2(ig)) 1663 f(ig) = f(ig) + (f0(ig) - f(ig)) * exp((-ptimestep / zmax(ig)) * wmax(ig)) 1664 END IF 1665 END IF 1666 f0(ig) = f(ig) 1667 END DO 1668 PRINT *, 'apres fermeture' 1669 ! Calcul de l'entrainement 1670 DO ig = 1, ngrid 1671 DO k = 1, klev 1672 alim(ig, k) = f(ig) * alim_star(ig, k) 1673 END DO 1674 END DO 1675 ! CR:test pour entrainer moins que la masse 1676 ! do ig=1,ngrid 1677 ! do l=1,lentr(ig) 1678 ! if ((alim(ig,l)*ptimestep).gt.(0.9*masse(ig,l))) THEN 1679 ! alim(ig,l+1)=alim(ig,l+1)+alim(ig,l) 1680 ! s -0.9*masse(ig,l)/ptimestep 1681 ! alim(ig,l)=0.9*masse(ig,l)/ptimestep 1682 ! END IF 1683 ! enddo 1684 ! enddo 1685 ! calcul du détrainement 1686 DO ig = 1, klon 1687 DO k = 1, klev 1688 detr(ig, k) = f(ig) * detr_star(ig, k) 1689 IF (detr(ig, k)<0.) THEN 1690 ! PRINT*,'detr1<0!!!' 1691 END IF 1692 END DO 1693 DO k = 1, klev 1694 entr(ig, k) = f(ig) * entr_star(ig, k) 1695 IF (entr(ig, k)<0.) THEN 1696 ! PRINT*,'entr1<0!!!' 1697 END IF 1698 END DO 1699 END DO 1700 1701 ! do ig=1,ngrid 1702 ! do l=1,klev 1703 ! if (((detr(ig,l)+entr(ig,l)+alim(ig,l))*ptimestep).gt. 1704 ! s (masse(ig,l))) THEN 1705 ! PRINT*,'d2+e2+a2>m2','ig=',ig,'l=',l,'lmax(ig)=',lmax(ig),'d+e+a=' 1706 ! s,(detr(ig,l)+entr(ig,l)+alim(ig,l))*ptimestep,'m=',masse(ig,l) 1707 ! END IF 1708 ! enddo 1709 ! enddo 1710 ! Calcul des flux 1711 1712 DO ig = 1, ngrid 1713 DO l = 1, lmax(ig) 1714 ! do l=1,klev 1715 ! fmc(ig,l+1)=f(ig)*f_star(ig,l+1) 1716 fmc(ig, l + 1) = fmc(ig, l) + alim(ig, l) + entr(ig, l) - detr(ig, l) 1717 ! PRINT*,'??!!','ig=',ig,'l=',l,'lmax=',lmax(ig),'lmix=',lmix(ig), 1718 ! s 'e=',entr(ig,l),'d=',detr(ig,l),'a=',alim(ig,l),'f=',fmc(ig,l), 1719 ! s 'f+1=',fmc(ig,l+1) 1720 IF (fmc(ig, l + 1)<0.) THEN 1721 PRINT *, 'fmc1<0', l + 1, lmax(ig), fmc(ig, l + 1) 1722 fmc(ig, l + 1) = fmc(ig, l) 1723 detr(ig, l) = alim(ig, l) + entr(ig, l) 1724 ! fmc(ig,l+1)=0. 1725 ! PRINT*,'fmc1<0',l+1,lmax(ig),fmc(ig,l+1) 1726 END IF 1727 ! if ((fmc(ig,l+1).gt.fmc(ig,l)).AND.(l.gt.lentr(ig))) THEN 1728 ! f_old=fmc(ig,l+1) 1729 ! fmc(ig,l+1)=fmc(ig,l) 1730 ! detr(ig,l)=detr(ig,l)+f_old-fmc(ig,l+1) 1731 ! END IF 1732 1733 ! if ((fmc(ig,l+1).gt.fmc(ig,l)).AND.(l.gt.lentr(ig))) THEN 1734 ! f_old=fmc(ig,l+1) 1735 ! fmc(ig,l+1)=fmc(ig,l) 1736 ! detr(ig,l)=detr(ig,l)+f_old-fmc(ig,l) 1737 ! END IF 1738 ! rajout du test sur alpha croissant 1739 ! if test 1740 ! if (1.EQ.0) THEN 1741 IF (l==klev) THEN 1742 PRINT *, 'THERMCELL PB ig=', ig, ' l=', l 1743 abort_message = 'THERMCELL PB' 1744 CALL abort_physic(modname, abort_message, 1) 1745 END IF 1746 ! if ((zw2(ig,l+1).gt.1.e-10).AND.(zw2(ig,l).gt.1.e-10).AND. 1747 ! s (l.ge.lentr(ig)).AND. 1748 IF ((zw2(ig, l + 1)>1.E-10) .AND. (zw2(ig, l)>1.E-10) .AND. (l>=lentr(ig))) & 1749 THEN 1750 IF (((fmc(ig, l + 1) / (rhobarz(ig, l + 1) * zw2(ig, l + 1)))>(fmc(ig, l) / & 1751 (rhobarz(ig, l) * zw2(ig, l))))) THEN 1752 f_old = fmc(ig, l + 1) 1753 fmc(ig, l + 1) = fmc(ig, l) * rhobarz(ig, l + 1) * zw2(ig, l + 1) / & 1754 (rhobarz(ig, l) * zw2(ig, l)) 1755 detr(ig, l) = detr(ig, l) + f_old - fmc(ig, l + 1) 1756 ! detr(ig,l)=(fmc(ig,l+1)-fmc(ig,l))/(0.4-1.) 1757 ! entr(ig,l)=0.4*detr(ig,l) 1758 ! entr(ig,l)=fmc(ig,l+1)-fmc(ig,l)+detr(ig,l) 1759 END IF 1760 END IF 1761 IF ((fmc(ig, l + 1)>fmc(ig, l)) .AND. (l>lentr(ig))) THEN 1762 f_old = fmc(ig, l + 1) 1763 fmc(ig, l + 1) = fmc(ig, l) 1764 detr(ig, l) = detr(ig, l) + f_old - fmc(ig, l + 1) 1765 END IF 1766 IF (detr(ig, l)>fmc(ig, l)) THEN 1767 detr(ig, l) = fmc(ig, l) 1768 entr(ig, l) = fmc(ig, l + 1) - alim(ig, l) 1769 END IF 1770 IF (fmc(ig, l + 1)<0.) THEN 1771 detr(ig, l) = detr(ig, l) + fmc(ig, l + 1) 1772 fmc(ig, l + 1) = 0. 1773 PRINT *, 'fmc2<0', l + 1, lmax(ig) 1774 END IF 1775 1776 ! test pour ne pas avoir f=0 et d=e/=0 1777 ! if (fmc(ig,l+1).lt.1.e-10) THEN 1778 ! detr(ig,l+1)=0. 1779 ! entr(ig,l+1)=0. 1780 ! zqla(ig,l+1)=0. 1781 ! zw2(ig,l+1)=0. 1782 ! lmax(ig)=l+1 1783 ! zmax(ig)=zlev(ig,lmax(ig)) 1784 ! END IF 1785 IF (zw2(ig, l + 1)>1.E-10) THEN 1786 IF ((((fmc(ig, l + 1)) / (rhobarz(ig, l + 1) * zw2(ig, l + 1)))>1.)) THEN 1787 f_old = fmc(ig, l + 1) 1788 fmc(ig, l + 1) = rhobarz(ig, l + 1) * zw2(ig, l + 1) 1789 zw2(ig, l + 1) = 0. 1790 zqla(ig, l + 1) = 0. 1791 detr(ig, l) = detr(ig, l) + f_old - fmc(ig, l + 1) 1792 lmax(ig) = l + 1 1793 zmax(ig) = zlev(ig, lmax(ig)) 1794 PRINT *, 'alpha>1', l + 1, lmax(ig) 1795 END IF 1796 END IF 1797 ! WRITE(1,*)'ig,l,fm(ig,l)',ig,l,fm(ig,l) 1798 ! END IF test 1799 ! END IF 1800 END DO 1801 END DO 1802 DO ig = 1, ngrid 1803 ! if (fmc(ig,lmax(ig)+1).NE.0.) THEN 1804 fmc(ig, lmax(ig) + 1) = 0. 1805 entr(ig, lmax(ig)) = 0. 1806 detr(ig, lmax(ig)) = fmc(ig, lmax(ig)) + entr(ig, lmax(ig)) + & 1807 alim(ig, lmax(ig)) 1808 ! END IF 1809 END DO 1810 ! test sur le signe de fmc 1811 DO ig = 1, ngrid 1812 DO l = 1, klev + 1 1813 IF (fmc(ig, l)<0.) THEN 1814 PRINT *, 'fm1<0!!!', 'ig=', ig, 'l=', l, 'a=', alim(ig, l - 1), 'e=', & 1815 entr(ig, l - 1), 'f=', fmc(ig, l - 1), 'd=', detr(ig, l - 1), 'f+1=', & 1816 fmc(ig, l) 1817 END IF 1818 END DO 1819 END DO 1820 ! test de verification 1821 DO ig = 1, ngrid 1822 DO l = 1, lmax(ig) 1823 IF ((abs(fmc(ig, l + 1) - fmc(ig, l) - alim(ig, l) - entr(ig, l) + & 1824 detr(ig, l)))>1.E-4) THEN 1825 ! PRINT*,'pbcm!!','ig=',ig,'l=',l,'lmax=',lmax(ig),'lmix=',lmix(ig), 1826 ! s 'e=',entr(ig,l),'d=',detr(ig,l),'a=',alim(ig,l),'f=',fmc(ig,l), 1827 ! s 'f+1=',fmc(ig,l+1) 1828 END IF 1829 IF (detr(ig, l)<0.) THEN 1830 PRINT *, 'detrdemi<0!!!' 1831 END IF 1832 END DO 1833 END DO 1834 1835 ! RC 1836 ! CR def de zmix continu (profil parabolique des vitesses) 1837 DO ig = 1, ngrid 1838 IF (lmix(ig)>1.) THEN 1839 ! test 1840 IF (((zw2(ig, lmix(ig) - 1) - zw2(ig, lmix(ig))) * ((zlev(ig, lmix(ig))) - & 1841 (zlev(ig, lmix(ig) + 1))) - (zw2(ig, lmix(ig)) - & 1842 zw2(ig, lmix(ig) + 1)) * ((zlev(ig, lmix(ig) - 1)) - & 1843 (zlev(ig, lmix(ig)))))>1E-10) THEN 1844 1845 zmix(ig) = ((zw2(ig, lmix(ig) - 1) - zw2(ig, lmix(ig))) * ((zlev(ig, lmix(ig)) & 1846 )**2 - (zlev(ig, lmix(ig) + 1))**2) - (zw2(ig, lmix(ig)) - zw2(ig, & 1847 lmix(ig) + 1)) * ((zlev(ig, lmix(ig) - 1))**2 - (zlev(ig, lmix(ig)))**2)) / & 1848 (2. * ((zw2(ig, lmix(ig) - 1) - zw2(ig, lmix(ig))) * ((zlev(ig, lmix(ig))) - & 1849 (zlev(ig, lmix(ig) + 1))) - (zw2(ig, lmix(ig)) - & 1850 zw2(ig, lmix(ig) + 1)) * ((zlev(ig, lmix(ig) - 1)) - (zlev(ig, lmix(ig)))))) 1851 ELSE 1852 zmix(ig) = zlev(ig, lmix(ig)) 1853 PRINT *, 'pb zmix' 1854 END IF 1855 ELSE 1856 zmix(ig) = 0. 1857 END IF 1858 ! test 1859 IF ((zmax(ig) - zmix(ig))<=0.) THEN 1860 zmix(ig) = 0.9 * zmax(ig) 1861 ! PRINT*,'pb zmix>zmax' 1862 END IF 1863 END DO 1864 DO ig = 1, klon 1865 zmix0(ig) = zmix(ig) 1866 END DO 1867 1868 ! calcul du nouveau lmix correspondant 1869 DO ig = 1, ngrid 1870 DO l = 1, klev 1871 IF (zmix(ig)>=zlev(ig, l) .AND. zmix(ig)<zlev(ig, l + 1)) THEN 1872 lmix(ig) = l 1873 END IF 1874 END DO 1875 END DO 1876 1877 ! ne devrait pas arriver!!!!! 1878 DO ig = 1, ngrid 1879 DO l = 1, klev 1880 IF (detr(ig, l)>(fmc(ig, l) + alim(ig, l)) + entr(ig, l)) THEN 1881 PRINT *, 'detr2>fmc2!!!', 'ig=', ig, 'l=', l, 'd=', detr(ig, l), & 1882 'f=', fmc(ig, l), 'lmax=', lmax(ig) 1883 ! detr(ig,l)=fmc(ig,l)+alim(ig,l)+entr(ig,l) 1884 ! entr(ig,l)=0. 1885 ! fmc(ig,l+1)=0. 1886 ! zw2(ig,l+1)=0. 1887 ! zqla(ig,l+1)=0. 1888 PRINT *, 'pb!fm=0 et f_star>0', l, lmax(ig) 1889 ! lmax(ig)=l 1890 END IF 1891 END DO 1892 END DO 1893 DO ig = 1, ngrid 1894 DO l = lmax(ig) + 1, klev + 1 1895 ! fmc(ig,l)=0. 1896 ! detr(ig,l)=0. 1897 ! entr(ig,l)=0. 1898 ! zw2(ig,l)=0. 1899 ! zqla(ig,l)=0. 1900 END DO 1901 END DO 1902 1903 ! Calcul du detrainement lors du premier passage 1904 ! PRINT*,'9 OK convect8' 1905 ! PRINT*,'WA1 ',wa_moy 1906 1907 ! determination de l'indice du debut de la mixed layer ou w decroit 1908 1909 ! calcul de la largeur de chaque ascendance dans le cas conservatif. 1910 ! dans ce cas simple, on suppose que la largeur de l'ascendance provenant 1911 ! d'une couche est égale à la hauteur de la couche alimentante. 1912 ! La vitesse maximale dans l'ascendance est aussi prise comme estimation 1913 ! de la vitesse d'entrainement horizontal dans la couche alimentante. 1914 1915 DO l = 2, nlay 1916 DO ig = 1, ngrid 1917 IF (l<=lmax(ig) .AND. (test(ig)==1)) THEN 1918 zw = max(wa_moy(ig, l), 1.E-10) 1919 larg_cons(ig, l) = zmax(ig) * r_aspect * fmc(ig, l) / (rhobarz(ig, l) * zw) 1920 END IF 1921 END DO 1922 END DO 1923 1924 DO l = 2, nlay 1925 DO ig = 1, ngrid 1926 IF (l<=lmax(ig) .AND. (test(ig)==1)) THEN 1927 ! if (idetr.EQ.0) THEN 1928 ! cette option est finalement en dur. 1929 IF ((l_mix * zlev(ig, l))<0.) THEN 1930 PRINT *, 'pb l_mix*zlev<0' 1931 END IF 1932 ! CR: test: nouvelle def de lambda 1933 ! larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l)) 1934 IF (zw2(ig, l)>1.E-10) THEN 1935 larg_detr(ig, l) = sqrt((l_mix / zw2(ig, l)) * zlev(ig, l)) 1936 ELSE 1937 larg_detr(ig, l) = sqrt(l_mix * zlev(ig, l)) 1938 END IF 1939 ! ELSE IF (idetr.EQ.1) THEN 1940 ! larg_detr(ig,l)=larg_cons(ig,l) 1941 ! s *sqrt(l_mix*zlev(ig,l))/larg_cons(ig,lmix(ig)) 1942 ! ELSE IF (idetr.EQ.2) THEN 1943 ! larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l)) 1944 ! s *sqrt(wa_moy(ig,l)) 1945 ! ELSE IF (idetr.EQ.4) THEN 1946 ! larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l)) 1947 ! s *wa_moy(ig,l) 1948 ! END IF 1949 END IF 1950 END DO 1951 END DO 1952 1953 ! PRINT*,'10 OK convect8' 1954 ! PRINT*,'WA2 ',wa_moy 1955 ! cal1cul de la fraction de la maille concernée par l'ascendance en tenant 1956 ! compte de l'epluchage du thermique. 1957 1958 DO l = 2, nlay 1959 DO ig = 1, ngrid 1960 IF (larg_cons(ig, l)>1. .AND. (test(ig)==1)) THEN 1961 ! PRINT*,ig,l,lmix(ig),lmaxa(ig),larg_cons(ig,l),' KKK' 1962 fraca(ig, l) = (larg_cons(ig, l) - larg_detr(ig, l)) / (r_aspect * zmax(ig)) 1963 ! test 1964 fraca(ig, l) = max(fraca(ig, l), 0.) 1965 fraca(ig, l) = min(fraca(ig, l), 0.5) 1966 fracd(ig, l) = 1. - fraca(ig, l) 1967 fracc(ig, l) = larg_cons(ig, l) / (r_aspect * zmax(ig)) 1968 ELSE 1969 ! wa_moy(ig,l)=0. 1970 fraca(ig, l) = 0. 1971 fracc(ig, l) = 0. 1972 fracd(ig, l) = 1. 1973 END IF 1974 END DO 1975 END DO 1976 ! CR: calcul de fracazmix 1977 DO ig = 1, ngrid 1978 IF (test(ig)==1) THEN 1979 fracazmix(ig) = (fraca(ig, lmix(ig) + 1) - fraca(ig, lmix(ig))) / & 1980 (zlev(ig, lmix(ig) + 1) - zlev(ig, lmix(ig))) * zmix(ig) + & 1981 fraca(ig, lmix(ig)) - zlev(ig, lmix(ig)) * (fraca(ig, lmix(ig) + 1) - fraca(& 1982 ig, lmix(ig))) / (zlev(ig, lmix(ig) + 1) - zlev(ig, lmix(ig))) 1983 END IF 1984 END DO 1985 1986 DO l = 2, nlay 1987 DO ig = 1, ngrid 1988 IF (larg_cons(ig, l)>1. .AND. (test(ig)==1)) THEN 1989 IF (l>lmix(ig)) THEN 1990 ! test 1991 IF (zmax(ig) - zmix(ig)<1.E-10) THEN 1992 ! PRINT*,'pb xxx' 1993 xxx(ig, l) = (lmax(ig) + 1. - l) / (lmax(ig) + 1. - lmix(ig)) 1994 ELSE 1995 xxx(ig, l) = (zmax(ig) - zlev(ig, l)) / (zmax(ig) - zmix(ig)) 1996 END IF 1997 IF (idetr==0) THEN 1998 fraca(ig, l) = fracazmix(ig) 1999 ELSE IF (idetr==1) THEN 2000 fraca(ig, l) = fracazmix(ig) * xxx(ig, l) 2001 ELSE IF (idetr==2) THEN 2002 fraca(ig, l) = fracazmix(ig) * (1. - (1. - xxx(ig, l))**2) 2003 ELSE 2004 fraca(ig, l) = fracazmix(ig) * xxx(ig, l)**2 2005 END IF 2006 ! PRINT*,ig,l,lmix(ig),lmaxa(ig),xxx(ig,l),'LLLLLLL' 2007 fraca(ig, l) = max(fraca(ig, l), 0.) 2008 fraca(ig, l) = min(fraca(ig, l), 0.5) 2009 fracd(ig, l) = 1. - fraca(ig, l) 2010 fracc(ig, l) = larg_cons(ig, l) / (r_aspect * zmax(ig)) 2011 END IF 2012 END IF 2013 END DO 2014 END DO 2015 2016 PRINT *, 'fin calcul fraca' 2017 ! PRINT*,'11 OK convect8' 2018 ! PRINT*,'Ea3 ',wa_moy 2019 ! ------------------------------------------------------------------ 2020 ! Calcul de fracd, wd 2021 ! somme wa - wd = 0 2022 ! ------------------------------------------------------------------ 2023 2024 DO ig = 1, ngrid 2025 fm(ig, 1) = 0. 2026 fm(ig, nlay + 1) = 0. 2027 END DO 2028 2029 DO l = 2, nlay 2030 DO ig = 1, ngrid 2031 IF (test(ig)==1) THEN 2032 fm(ig, l) = fraca(ig, l) * wa_moy(ig, l) * rhobarz(ig, l) 2033 ! CR:test 2034 IF (alim(ig, l - 1)<1E-10 .AND. fm(ig, l)>fm(ig, l - 1) .AND. l>lmix(ig)) & 2035 THEN 2036 fm(ig, l) = fm(ig, l - 1) 2037 ! WRITE(1,*)'ajustement fm, l',l 2038 END IF 2039 ! WRITE(1,*)'ig,l,fm(ig,l)',ig,l,fm(ig,l) 2040 ! RC 2041 END IF 2042 END DO 2043 DO ig = 1, ngrid 2044 IF (fracd(ig, l)<0.1 .AND. (test(ig)==1)) THEN 2045 abort_message = 'fracd trop petit' 2046 CALL abort_physic(modname, abort_message, 1) 2047 ELSE 2048 ! vitesse descendante "diagnostique" 2049 wd(ig, l) = fm(ig, l) / (fracd(ig, l) * rhobarz(ig, l)) 2050 END IF 2051 END DO 2052 END DO 2053 219 2054 DO l = 1, nlay + 1 220 2055 DO ig = 1, ngrid 221 wa(ig, k, l) = 0. 222 END DO 223 END DO 224 END DO 225 226 ! PRINT*,'3 OK convect8' 227 ! ------------------------------------------------------------------ 228 ! Calcul de w2, quarre de w a partir de la cape 229 ! a partir de w2, on calcule wa, vitesse de l'ascendance 230 231 ! ATTENTION: Dans cette version, pour cause d'economie de memoire, 232 ! w2 est stoke dans wa 233 234 ! ATTENTION: dans convect8, on n'utilise le calcule des wa 235 ! independants par couches que pour calculer l'entrainement 236 ! a la base et la hauteur max de l'ascendance. 237 238 ! Indicages: 239 ! l'ascendance provenant du niveau k traverse l'interface l avec 240 ! une vitesse wa(k,l). 241 242 ! -------------------- 243 244 ! + + + + + + + + + + 245 246 ! wa(k,l) ---- -------------------- l 247 ! /\ 248 ! /||\ + + + + + + + + + + 249 ! || 250 ! || -------------------- 251 ! || 252 ! || + + + + + + + + + + 253 ! || 254 ! || -------------------- 255 ! ||__ 256 ! |___ + + + + + + + + + + k 257 258 ! -------------------- 259 260 261 262 ! ------------------------------------------------------------------ 263 264 265 DO k = 1, nlay - 1 266 DO ig = 1, ngrid 267 wa(ig, k, k) = 0. 268 wa(ig, k, k+1) = 2.*rg*(ztv(ig,k)-ztv(ig,k+1))/ztv(ig, k+1)* & 269 (zlev(ig,k+1)-zlev(ig,k)) 270 END DO 271 DO l = k + 1, nlay - 1 272 DO ig = 1, ngrid 273 wa(ig, k, l+1) = wa(ig, k, l) + 2.*rg*(ztv(ig,k)-ztv(ig,l))/ztv(ig, l & 274 )*(zlev(ig,l+1)-zlev(ig,l)) 275 END DO 276 END DO 277 DO ig = 1, ngrid 278 wa(ig, k, nlay+1) = 0. 279 END DO 280 END DO 281 282 ! PRINT*,'4 OK convect8' 283 ! Calcul de la couche correspondant a la hauteur du thermique 284 DO k = 1, nlay - 1 285 DO ig = 1, ngrid 286 lmax(ig, k) = k 287 END DO 288 DO l = nlay, k + 1, -1 289 DO ig = 1, ngrid 290 IF (wa(ig,k,l)<=1.E-10) lmax(ig, k) = l - 1 291 END DO 292 END DO 293 END DO 294 295 ! PRINT*,'5 OK convect8' 296 ! Calcule du w max du thermique 297 DO k = 1, nlay 298 DO ig = 1, ngrid 299 wmax(ig, k) = 0. 300 END DO 301 END DO 302 303 DO k = 1, nlay - 1 304 DO l = k, nlay 305 DO ig = 1, ngrid 306 IF (l<=lmax(ig,k)) THEN 307 wa(ig, k, l) = sqrt(wa(ig,k,l)) 308 wmax(ig, k) = max(wmax(ig,k), wa(ig,k,l)) 2056 IF (test(ig)==0) THEN 2057 fm(ig, l) = fmc(ig, l) 2058 END IF 2059 END DO 2060 END DO 2061 2062 ! fin du first 2063 DO l = 1, nlay 2064 DO ig = 1, ngrid 2065 ! masse(ig,l)=rho(ig,l)*(zlev(ig,l+1)-zlev(ig,l)) 2066 masse(ig, l) = (pplev(ig, l) - pplev(ig, l + 1)) / rg 2067 END DO 2068 END DO 2069 2070 ! PRINT*,'12 OK convect8' 2071 ! PRINT*,'WA4 ',wa_moy 2072 ! c------------------------------------------------------------------ 2073 ! calcul du transport vertical 2074 ! ------------------------------------------------------------------ 2075 2076 GO TO 4444 2077 ! PRINT*,'XXXXXXXXXXXXXXX ptimestep= ',ptimestep 2078 DO l = 2, nlay - 1 2079 DO ig = 1, ngrid 2080 IF (fm(ig, l + 1) * ptimestep>masse(ig, l) .AND. fm(ig, l + 1) * ptimestep>masse(& 2081 ig, l + 1)) THEN 2082 PRINT *, 'WARN!!! FM>M ig=', ig, ' l=', l, ' FM=', & 2083 fm(ig, l + 1) * ptimestep, ' M=', masse(ig, l), masse(ig, l + 1) 2084 END IF 2085 END DO 2086 END DO 2087 2088 DO l = 1, nlay 2089 DO ig = 1, ngrid 2090 IF ((alim(ig, l) + entr(ig, l)) * ptimestep>masse(ig, l)) THEN 2091 PRINT *, 'WARN!!! E>M ig=', ig, ' l=', l, ' E==', & 2092 (entr(ig, l) + alim(ig, l)) * ptimestep, ' M=', masse(ig, l) 2093 END IF 2094 END DO 2095 END DO 2096 2097 DO l = 1, nlay 2098 DO ig = 1, ngrid 2099 IF (.NOT. fm(ig, l)>=0. .OR. .NOT. fm(ig, l)<=10.) THEN 2100 ! PRINT*,'WARN!!! fm exagere ig=',ig,' l=',l 2101 ! s ,' FM=',fm(ig,l) 2102 END IF 2103 IF (.NOT. masse(ig, l)>=1.E-10 .OR. .NOT. masse(ig, l)<=1.E4) THEN 2104 ! PRINT*,'WARN!!! masse exagere ig=',ig,' l=',l 2105 ! s ,' M=',masse(ig,l) 2106 ! PRINT*,'rho(ig,l),pplay(ig,l),zpspsk(ig,l),RD,zh(ig,l)', 2107 ! s rho(ig,l),pplay(ig,l),zpspsk(ig,l),RD,zh(ig,l) 2108 ! PRINT*,'zlev(ig,l+1),zlev(ig,l)' 2109 ! s ,zlev(ig,l+1),zlev(ig,l) 2110 ! PRINT*,'pphi(ig,l-1),pphi(ig,l),pphi(ig,l+1)' 2111 ! s ,pphi(ig,l-1),pphi(ig,l),pphi(ig,l+1) 2112 END IF 2113 IF (.NOT. alim(ig, l)>=0. .OR. .NOT. alim(ig, l)<=10.) THEN 2114 ! PRINT*,'WARN!!! entr exagere ig=',ig,' l=',l 2115 ! s ,' E=',entr(ig,l) 2116 END IF 2117 END DO 2118 END DO 2119 2120 4444 CONTINUE 2121 2122 ! CR:redefinition du entr 2123 ! CR:test:on ne change pas la def du entr mais la def du fm 2124 DO l = 1, nlay 2125 DO ig = 1, ngrid 2126 IF (test(ig)==1) THEN 2127 detr(ig, l) = fm(ig, l) + alim(ig, l) - fm(ig, l + 1) 2128 IF (detr(ig, l)<0.) THEN 2129 ! entr(ig,l)=entr(ig,l)-detr(ig,l) 2130 fm(ig, l + 1) = fm(ig, l) + alim(ig, l) 2131 detr(ig, l) = 0. 2132 ! WRITE(11,*)'l,ig,entr',l,ig,entr(ig,l) 2133 ! PRINT*,'WARNING !!! detrainement negatif ',ig,l 2134 END IF 2135 END IF 2136 END DO 2137 END DO 2138 ! RC 2139 2140 IF (w2di==1) THEN 2141 fm0 = fm0 + ptimestep * (fm - fm0) / tho 2142 entr0 = entr0 + ptimestep * (alim + entr - entr0) / tho 2143 ELSE 2144 fm0 = fm 2145 entr0 = alim + entr 2146 detr0 = detr 2147 alim0 = alim 2148 ! zoa=zqta 2149 ! entr0=alim 2150 END IF 2151 2152 IF (1==1) THEN 2153 ! CALL dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse 2154 ! . ,zh,zdhadj,zha) 2155 ! CALL dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse 2156 ! . ,zo,pdoadj,zoa) 2157 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zthl, & 2158 zdthladj, zta) 2159 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, po, pdoadj, & 2160 zoa) 2161 ELSE 2162 CALL dqthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca, zh, & 2163 zdhadj, zha) 2164 CALL dqthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca, zo, & 2165 pdoadj, zoa) 2166 END IF 2167 2168 IF (1==0) THEN 2169 CALL dvthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca, zmax, & 2170 zu, zv, pduadj, pdvadj, zua, zva) 2171 ELSE 2172 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zu, pduadj, & 2173 zua) 2174 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zv, pdvadj, & 2175 zva) 2176 END IF 2177 2178 ! Calcul des moments 2179 ! do l=1,nlay 2180 ! do ig=1,ngrid 2181 ! zf=0.5*(fracc(ig,l)+fracc(ig,l+1)) 2182 ! zf2=zf/(1.-zf) 2183 ! thetath2(ig,l)=zf2*(zha(ig,l)-zh(ig,l))**2 2184 ! wth2(ig,l)=zf2*(0.5*(wa_moy(ig,l)+wa_moy(ig,l+1)))**2 2185 ! enddo 2186 ! enddo 2187 2188 2189 2190 2191 2192 2193 ! PRINT*,'13 OK convect8' 2194 ! PRINT*,'WA5 ',wa_moy 2195 DO l = 1, nlay 2196 DO ig = 1, ngrid 2197 ! pdtadj(ig,l)=zdhadj(ig,l)*zpspsk(ig,l) 2198 pdtadj(ig, l) = zdthladj(ig, l) * zpspsk(ig, l) 2199 END DO 2200 END DO 2201 2202 2203 ! do l=1,nlay 2204 ! do ig=1,ngrid 2205 ! IF(abs(pdtadj(ig,l))*86400..gt.500.) THEN 2206 ! PRINT*,'WARN!!! ig=',ig,' l=',l 2207 ! s ,' pdtadj=',pdtadj(ig,l) 2208 ! END IF 2209 ! IF(abs(pdoadj(ig,l))*86400..gt.1.) THEN 2210 ! PRINT*,'WARN!!! ig=',ig,' l=',l 2211 ! s ,' pdoadj=',pdoadj(ig,l) 2212 ! END IF 2213 ! enddo 2214 ! enddo 2215 2216 ! PRINT*,'14 OK convect8' 2217 ! ------------------------------------------------------------------ 2218 ! Calculs pour les sorties 2219 ! ------------------------------------------------------------------ 2220 ! calcul de fraca pour les sorties 2221 DO l = 2, klev 2222 DO ig = 1, klon 2223 IF (zw2(ig, l)>1.E-10) THEN 2224 fraca(ig, l) = fm(ig, l) / (rhobarz(ig, l) * zw2(ig, l)) 309 2225 ELSE 2226 fraca(ig, l) = 0. 2227 END IF 2228 END DO 2229 END DO 2230 IF (sorties) THEN 2231 DO l = 1, nlay 2232 DO ig = 1, ngrid 2233 zla(ig, l) = (1. - fracd(ig, l)) * zmax(ig) 2234 zld(ig, l) = fracd(ig, l) * zmax(ig) 2235 IF (1. - fracd(ig, l)>1.E-10) zwa(ig, l) = wd(ig, l) * fracd(ig, l) / & 2236 (1. - fracd(ig, l)) 2237 END DO 2238 END DO 2239 ! CR calcul du niveau de condensation 2240 ! initialisation 2241 DO ig = 1, ngrid 2242 nivcon(ig) = 0. 2243 zcon(ig) = 0. 2244 END DO 2245 DO k = nlay, 1, -1 2246 DO ig = 1, ngrid 2247 IF (zqla(ig, k)>1E-10) THEN 2248 nivcon(ig) = k 2249 zcon(ig) = zlev(ig, k) 2250 END IF 2251 ! if (zcon(ig).gt.1.e-10) THEN 2252 ! nuage=.TRUE. 2253 ! else 2254 ! nuage=.FALSE. 2255 ! END IF 2256 END DO 2257 END DO 2258 2259 DO l = 1, nlay 2260 DO ig = 1, ngrid 2261 zf = fraca(ig, l) 2262 zf2 = zf / (1. - zf) 2263 thetath2(ig, l) = zf2 * (zha(ig, l) - zh(ig, l) / zpspsk(ig, l))**2 2264 wth2(ig, l) = zf2 * (zw2(ig, l))**2 2265 ! PRINT*,'wth2=',wth2(ig,l) 2266 wth3(ig, l) = zf2 * (1 - 2. * fraca(ig, l)) / (1 - fraca(ig, l)) * zw2(ig, l) * & 2267 zw2(ig, l) * zw2(ig, l) 2268 q2(ig, l) = zf2 * (zqta(ig, l) * 1000. - po(ig, l) * 1000.)**2 2269 ! test: on calcul q2/po=ratqsc 2270 ! if (nuage) THEN 2271 ratqscth(ig, l) = sqrt(q2(ig, l)) / (po(ig, l) * 1000.) 2272 ! else 2273 ! ratqscth(ig,l)=0. 2274 ! END IF 2275 END DO 2276 END DO 2277 ! calcul du ratqscdiff 2278 sum = 0. 2279 sumdiff = 0. 2280 ratqsdiff(:, :) = 0. 2281 DO ig = 1, ngrid 2282 DO l = 1, lentr(ig) 2283 sum = sum + alim_star(ig, l) * zqta(ig, l) * 1000. 2284 END DO 2285 END DO 2286 DO ig = 1, ngrid 2287 DO l = 1, lentr(ig) 2288 zf = fraca(ig, l) 2289 zf2 = zf / (1. - zf) 2290 sumdiff = sumdiff + alim_star(ig, l) * (zqta(ig, l) * 1000. - sum)**2 2291 ! ratqsdiff=ratqsdiff+alim_star(ig,l)* 2292 ! s (zqta(ig,l)*1000.-po(ig,l)*1000.)**2 2293 END DO 2294 END DO 2295 DO l = 1, klev 2296 DO ig = 1, ngrid 2297 ratqsdiff(ig, l) = sqrt(sumdiff) / (po(ig, l) * 1000.) 2298 ! WRITE(11,*)'ratqsdiff=',ratqsdiff(ig,l) 2299 END DO 2300 END DO 2301 2302 END IF 2303 2304 ! PRINT*,'19 OK convect8' 2305 2306 END SUBROUTINE thermcell_cld 2307 2308 SUBROUTINE thermcell_eau(ngrid, nlay, ptimestep, pplay, pplev, pphi, pu, pv, & 2309 pt, po, pduadj, pdvadj, pdtadj, pdoadj, fm0, entr0 & ! s 2310 ! ,pu_therm,pv_therm 2311 , r_aspect, l_mix, w2di, tho) 2312 2313 USE dimphy 2314 IMPLICIT NONE 2315 2316 ! ======================================================================= 2317 2318 ! Calcul du transport verticale dans la couche limite en presence 2319 ! de "thermiques" explicitement representes 2320 2321 ! Réécriture à partir d'un listing papier à Habas, le 14/02/00 2322 2323 ! le thermique est supposé homogène et dissipé par mélange avec 2324 ! son environnement. la longueur l_mix contrôle l'efficacité du 2325 ! mélange 2326 2327 ! Le calcul du transport des différentes espèces se fait en prenant 2328 ! en compte: 2329 ! 1. un flux de masse montant 2330 ! 2. un flux de masse descendant 2331 ! 3. un entrainement 2332 ! 4. un detrainement 2333 2334 ! ======================================================================= 2335 2336 ! ----------------------------------------------------------------------- 2337 ! declarations: 2338 ! ------------- 2339 2340 include "YOMCST.h" 2341 include "YOETHF.h" 2342 include "FCTTRE.h" 2343 2344 ! arguments: 2345 ! ---------- 2346 2347 INTEGER ngrid, nlay, w2di 2348 REAL tho 2349 REAL ptimestep, l_mix, r_aspect 2350 REAL pt(ngrid, nlay), pdtadj(ngrid, nlay) 2351 REAL pu(ngrid, nlay), pduadj(ngrid, nlay) 2352 REAL pv(ngrid, nlay), pdvadj(ngrid, nlay) 2353 REAL po(ngrid, nlay), pdoadj(ngrid, nlay) 2354 REAL pplay(ngrid, nlay), pplev(ngrid, nlay + 1) 2355 REAL pphi(ngrid, nlay) 2356 2357 INTEGER idetr 2358 SAVE idetr 2359 DATA idetr/3/ 2360 !$OMP THREADPRIVATE(idetr) 2361 2362 ! local: 2363 ! ------ 2364 2365 INTEGER ig, k, l, lmaxa(klon), lmix(klon) 2366 REAL zsortie1d(klon) 2367 ! CR: on remplace lmax(klon,klev+1) 2368 INTEGER lmax(klon), lmin(klon), lentr(klon) 2369 REAL linter(klon) 2370 REAL zmix(klon), fracazmix(klon) 2371 ! RC 2372 REAL zmax(klon), zw, zz, zw2(klon, klev + 1), ztva(klon, klev), zzz 2373 2374 REAL zlev(klon, klev + 1), zlay(klon, klev) 2375 REAL zh(klon, klev), zdhadj(klon, klev) 2376 REAL zthl(klon, klev), zdthladj(klon, klev) 2377 REAL ztv(klon, klev) 2378 REAL zu(klon, klev), zv(klon, klev), zo(klon, klev) 2379 REAL zl(klon, klev) 2380 REAL wh(klon, klev + 1) 2381 REAL wu(klon, klev + 1), wv(klon, klev + 1), wo(klon, klev + 1) 2382 REAL zla(klon, klev + 1) 2383 REAL zwa(klon, klev + 1) 2384 REAL zld(klon, klev + 1) 2385 REAL zwd(klon, klev + 1) 2386 REAL zsortie(klon, klev) 2387 REAL zva(klon, klev) 2388 REAL zua(klon, klev) 2389 REAL zoa(klon, klev) 2390 2391 REAL zta(klon, klev) 2392 REAL zha(klon, klev) 2393 REAL wa_moy(klon, klev + 1) 2394 REAL fraca(klon, klev + 1) 2395 REAL fracc(klon, klev + 1) 2396 REAL zf, zf2 2397 REAL thetath2(klon, klev), wth2(klon, klev) 2398 ! common/comtherm/thetath2,wth2 2399 2400 REAL count_time 2401 INTEGER ialt 2402 2403 LOGICAL sorties 2404 REAL rho(klon, klev), rhobarz(klon, klev + 1), masse(klon, klev) 2405 REAL zpspsk(klon, klev) 2406 2407 ! real wmax(klon,klev),wmaxa(klon) 2408 REAL wmax(klon), wmaxa(klon) 2409 REAL wa(klon, klev, klev + 1) 2410 REAL wd(klon, klev + 1) 2411 REAL larg_part(klon, klev, klev + 1) 2412 REAL fracd(klon, klev + 1) 2413 REAL xxx(klon, klev + 1) 2414 REAL larg_cons(klon, klev + 1) 2415 REAL larg_detr(klon, klev + 1) 2416 REAL fm0(klon, klev + 1), entr0(klon, klev), detr(klon, klev) 2417 REAL pu_therm(klon, klev), pv_therm(klon, klev) 2418 REAL fm(klon, klev + 1), entr(klon, klev) 2419 REAL fmc(klon, klev + 1) 2420 2421 REAL zcor, zdelta, zcvm5, qlbef 2422 REAL tbef(klon), qsatbef(klon) 2423 REAL dqsat_dt, dt, num, denom 2424 REAL reps, rlvcp, ddt0 2425 REAL ztla(klon, klev), zqla(klon, klev), zqta(klon, klev) 2426 2427 PARAMETER (ddt0 = .01) 2428 2429 ! CR:nouvelles variables 2430 REAL f_star(klon, klev + 1), entr_star(klon, klev) 2431 REAL entr_star_tot(klon), entr_star2(klon) 2432 REAL f(klon), f0(klon) 2433 REAL zlevinter(klon) 2434 LOGICAL first 2435 DATA first/.FALSE./ 2436 SAVE first 2437 !$OMP THREADPRIVATE(first) 2438 2439 ! RC 2440 2441 CHARACTER *2 str2 2442 CHARACTER *10 str10 2443 2444 CHARACTER (LEN = 20) :: modname = 'thermcell_eau' 2445 CHARACTER (LEN = 80) :: abort_message 2446 2447 LOGICAL vtest(klon), down 2448 LOGICAL zsat(klon) 2449 2450 INTEGER ncorrec, ll 2451 SAVE ncorrec 2452 DATA ncorrec/0/ 2453 !$OMP THREADPRIVATE(ncorrec) 2454 2455 2456 2457 ! ----------------------------------------------------------------------- 2458 ! initialisation: 2459 ! --------------- 2460 2461 sorties = .TRUE. 2462 IF (ngrid/=klon) THEN 2463 PRINT * 2464 PRINT *, 'STOP dans convadj' 2465 PRINT *, 'ngrid =', ngrid 2466 PRINT *, 'klon =', klon 2467 END IF 2468 2469 ! Initialisation 2470 rlvcp = rlvtt / rcpd 2471 reps = rd / rv 2472 2473 ! ----------------------------------------------------------------------- 2474 ! AM Calcul de T,q,ql a partir de Tl et qT 2475 ! --------------------------------------------------- 2476 2477 ! Pr Tprec=Tl calcul de qsat 2478 ! Si qsat>qT T=Tl, q=qT 2479 ! Sinon DDT=(-Tprec+Tl+RLVCP (qT-qsat(T')) / (1+RLVCP dqsat/dt) 2480 ! On cherche DDT < DDT0 2481 2482 ! defaut 2483 DO ll = 1, nlay 2484 DO ig = 1, ngrid 2485 zo(ig, ll) = po(ig, ll) 2486 zl(ig, ll) = 0. 2487 zh(ig, ll) = pt(ig, ll) 2488 END DO 2489 END DO 2490 DO ig = 1, ngrid 2491 zsat(ig) = .FALSE. 2492 END DO 2493 2494 DO ll = 1, nlay 2495 ! les points insatures sont definitifs 2496 DO ig = 1, ngrid 2497 tbef(ig) = pt(ig, ll) 2498 zdelta = max(0., sign(1., rtt - tbef(ig))) 2499 qsatbef(ig) = r2es * foeew(tbef(ig), zdelta) / pplev(ig, ll) 2500 qsatbef(ig) = min(0.5, qsatbef(ig)) 2501 zcor = 1. / (1. - retv * qsatbef(ig)) 2502 qsatbef(ig) = qsatbef(ig) * zcor 2503 zsat(ig) = (max(0., po(ig, ll) - qsatbef(ig))>0.00001) 2504 END DO 2505 2506 DO ig = 1, ngrid 2507 IF (zsat(ig)) THEN 2508 qlbef = max(0., po(ig, ll) - qsatbef(ig)) 2509 ! si sature: ql est surestime, d'ou la sous-relax 2510 dt = 0.5 * rlvcp * qlbef 2511 ! on pourra enchainer 2 ou 3 calculs sans Do while 2512 DO WHILE (dt>ddt0) 2513 ! il faut verifier si c,a conserve quand on repasse en insature ... 2514 tbef(ig) = tbef(ig) + dt 2515 zdelta = max(0., sign(1., rtt - tbef(ig))) 2516 qsatbef(ig) = r2es * foeew(tbef(ig), zdelta) / pplev(ig, ll) 2517 qsatbef(ig) = min(0.5, qsatbef(ig)) 2518 zcor = 1. / (1. - retv * qsatbef(ig)) 2519 qsatbef(ig) = qsatbef(ig) * zcor 2520 ! on veut le signe de qlbef 2521 qlbef = po(ig, ll) - qsatbef(ig) 2522 ! dqsat_dT 2523 zdelta = max(0., sign(1., rtt - tbef(ig))) 2524 zcvm5 = r5les * (1. - zdelta) + r5ies * zdelta 2525 zcor = 1. / (1. - retv * qsatbef(ig)) 2526 dqsat_dt = foede(tbef(ig), zdelta, zcvm5, qsatbef(ig), zcor) 2527 num = -tbef(ig) + pt(ig, ll) + rlvcp * qlbef 2528 denom = 1. + rlvcp * dqsat_dt 2529 dt = num / denom 2530 END DO 2531 ! on ecrit de maniere conservative (sat ou non) 2532 zl(ig, ll) = max(0., qlbef) 2533 ! T = Tl +Lv/Cp ql 2534 zh(ig, ll) = pt(ig, ll) + rlvcp * zl(ig, ll) 2535 zo(ig, ll) = po(ig, ll) - zl(ig, ll) 2536 END IF 2537 END DO 2538 END DO 2539 ! AM fin 2540 2541 ! ----------------------------------------------------------------------- 2542 ! incrementation eventuelle de tendances precedentes: 2543 ! --------------------------------------------------- 2544 2545 ! PRINT*,'0 OK convect8' 2546 2547 DO l = 1, nlay 2548 DO ig = 1, ngrid 2549 zpspsk(ig, l) = (pplay(ig, l) / pplev(ig, 1))**rkappa 2550 ! zh(ig,l)=pt(ig,l)/zpspsk(ig,l) 2551 zu(ig, l) = pu(ig, l) 2552 zv(ig, l) = pv(ig, l) 2553 ! zo(ig,l)=po(ig,l) 2554 ! ztv(ig,l)=zh(ig,l)*(1.+0.61*zo(ig,l)) 2555 ! AM attention zh est maintenant le profil de T et plus le profil de 2556 ! theta ! 2557 2558 ! T-> Theta 2559 ztv(ig, l) = zh(ig, l) / zpspsk(ig, l) 2560 ! AM Theta_v 2561 ztv(ig, l) = ztv(ig, l) * (1. + retv * (zo(ig, l)) - zl(ig, l)) 2562 ! AM Thetal 2563 zthl(ig, l) = pt(ig, l) / zpspsk(ig, l) 2564 2565 END DO 2566 END DO 2567 2568 ! PRINT*,'1 OK convect8' 2569 ! -------------------- 2570 2571 2572 ! + + + + + + + + + + + 2573 2574 2575 ! wa, fraca, wd, fracd -------------------- zlev(2), rhobarz 2576 ! wh,wt,wo ... 2577 2578 ! + + + + + + + + + + + zh,zu,zv,zo,rho 2579 2580 2581 ! -------------------- zlev(1) 2582 ! \\\\\\\\\\\\\\\\\\\\ 2583 2584 2585 2586 ! ----------------------------------------------------------------------- 2587 ! Calcul des altitudes des couches 2588 ! ----------------------------------------------------------------------- 2589 2590 DO l = 2, nlay 2591 DO ig = 1, ngrid 2592 zlev(ig, l) = 0.5 * (pphi(ig, l) + pphi(ig, l - 1)) / rg 2593 END DO 2594 END DO 2595 DO ig = 1, ngrid 2596 zlev(ig, 1) = 0. 2597 zlev(ig, nlay + 1) = (2. * pphi(ig, klev) - pphi(ig, klev - 1)) / rg 2598 END DO 2599 DO l = 1, nlay 2600 DO ig = 1, ngrid 2601 zlay(ig, l) = pphi(ig, l) / rg 2602 END DO 2603 END DO 2604 2605 ! PRINT*,'2 OK convect8' 2606 ! ----------------------------------------------------------------------- 2607 ! Calcul des densites 2608 ! ----------------------------------------------------------------------- 2609 2610 DO l = 1, nlay 2611 DO ig = 1, ngrid 2612 ! rho(ig,l)=pplay(ig,l)/(zpspsk(ig,l)*RD*zh(ig,l)) 2613 rho(ig, l) = pplay(ig, l) / (zpspsk(ig, l) * rd * ztv(ig, l)) 2614 END DO 2615 END DO 2616 2617 DO l = 2, nlay 2618 DO ig = 1, ngrid 2619 rhobarz(ig, l) = 0.5 * (rho(ig, l) + rho(ig, l - 1)) 2620 END DO 2621 END DO 2622 2623 DO k = 1, nlay 2624 DO l = 1, nlay + 1 2625 DO ig = 1, ngrid 310 2626 wa(ig, k, l) = 0. 311 END IF 312 END DO 313 END DO 314 END DO 315 316 DO k = 1, nlay - 1 317 DO ig = 1, ngrid 318 pu_therm(ig, k) = sqrt(wmax(ig,k)) 319 pv_therm(ig, k) = sqrt(wmax(ig,k)) 320 END DO 321 END DO 322 323 ! PRINT*,'6 OK convect8' 324 ! Longueur caracteristique correspondant a la hauteur des thermiques. 325 DO ig = 1, ngrid 326 zmax(ig) = 500. 327 END DO 328 ! PRINT*,'LMAX LMAX LMAX ' 329 DO k = 1, nlay - 1 330 DO ig = 1, ngrid 331 zmax(ig) = max(zmax(ig), zlev(ig,lmax(ig,k))-zlev(ig,k)) 332 END DO 333 ! PRINT*,k,lmax(1,k) 334 END DO 335 ! PRINT*,'ZMAX ZMAX ZMAX ',zmax 336 ! CALL dump2d(iim,jjm-1,zmax(2:ngrid-1),'ZMAX ') 337 338 ! PRINT*,'OKl336' 339 ! Calcul de l'entrainement. 340 ! Le rapport d'aspect relie la largeur de l'ascendance a l'epaisseur 341 ! de la couche d'alimentation en partant du principe que la vitesse 342 ! maximum dans l'ascendance est la vitesse d'entrainement horizontale. 343 DO k = 1, nlay 344 DO ig = 1, ngrid 345 zzz = rho(ig, k)*wmax(ig, k)*(zlev(ig,k+1)-zlev(ig,k))/ & 346 (zmax(ig)*r_aspect) 347 IF (w2di==2) THEN 348 entr(ig, k) = entr(ig, k) + ptimestep*(zzz-entr(ig,k))/tho 2627 END DO 2628 END DO 2629 END DO 2630 2631 ! PRINT*,'3 OK convect8' 2632 ! ------------------------------------------------------------------ 2633 ! Calcul de w2, quarre de w a partir de la cape 2634 ! a partir de w2, on calcule wa, vitesse de l'ascendance 2635 2636 ! ATTENTION: Dans cette version, pour cause d'economie de memoire, 2637 ! w2 est stoke dans wa 2638 2639 ! ATTENTION: dans convect8, on n'utilise le calcule des wa 2640 ! independants par couches que pour calculer l'entrainement 2641 ! a la base et la hauteur max de l'ascendance. 2642 2643 ! Indicages: 2644 ! l'ascendance provenant du niveau k traverse l'interface l avec 2645 ! une vitesse wa(k,l). 2646 2647 ! -------------------- 2648 2649 ! + + + + + + + + + + 2650 2651 ! wa(k,l) ---- -------------------- l 2652 ! /\ 2653 ! /||\ + + + + + + + + + + 2654 ! || 2655 ! || -------------------- 2656 ! || 2657 ! || + + + + + + + + + + 2658 ! || 2659 ! || -------------------- 2660 ! ||__ 2661 ! |___ + + + + + + + + + + k 2662 2663 ! -------------------- 2664 2665 2666 2667 ! ------------------------------------------------------------------ 2668 2669 ! CR: ponderation entrainement des couches instables 2670 ! def des entr_star tels que entr=f*entr_star 2671 DO l = 1, klev 2672 DO ig = 1, ngrid 2673 entr_star(ig, l) = 0. 2674 END DO 2675 END DO 2676 ! determination de la longueur de la couche d entrainement 2677 DO ig = 1, ngrid 2678 lentr(ig) = 1 2679 END DO 2680 2681 ! on ne considere que les premieres couches instables 2682 DO k = nlay - 1, 1, -1 2683 DO ig = 1, ngrid 2684 IF (ztv(ig, k)>ztv(ig, k + 1) .AND. ztv(ig, k + 1)<ztv(ig, k + 2)) THEN 2685 lentr(ig) = k 2686 END IF 2687 END DO 2688 END DO 2689 2690 ! determination du lmin: couche d ou provient le thermique 2691 DO ig = 1, ngrid 2692 lmin(ig) = 1 2693 END DO 2694 DO ig = 1, ngrid 2695 DO l = nlay, 2, -1 2696 IF (ztv(ig, l - 1)>ztv(ig, l)) THEN 2697 lmin(ig) = l - 1 2698 END IF 2699 END DO 2700 END DO 2701 2702 ! definition de l'entrainement des couches 2703 DO l = 1, klev - 1 2704 DO ig = 1, ngrid 2705 IF (ztv(ig, l)>ztv(ig, l + 1) .AND. l>=lmin(ig) .AND. l<=lentr(ig)) THEN 2706 entr_star(ig, l) = (ztv(ig, l) - ztv(ig, l + 1)) * (zlev(ig, l + 1) - zlev(ig, l)) 2707 END IF 2708 END DO 2709 END DO 2710 ! pas de thermique si couche 1 stable 2711 DO ig = 1, ngrid 2712 IF (lmin(ig)>1) THEN 2713 DO l = 1, klev 2714 entr_star(ig, l) = 0. 2715 END DO 2716 END IF 2717 END DO 2718 ! calcul de l entrainement total 2719 DO ig = 1, ngrid 2720 entr_star_tot(ig) = 0. 2721 END DO 2722 DO ig = 1, ngrid 2723 DO k = 1, klev 2724 entr_star_tot(ig) = entr_star_tot(ig) + entr_star(ig, k) 2725 END DO 2726 END DO 2727 2728 DO k = 1, klev 2729 DO ig = 1, ngrid 2730 ztva(ig, k) = ztv(ig, k) 2731 END DO 2732 END DO 2733 ! RC 2734 ! AM:initialisations 2735 DO k = 1, nlay 2736 DO ig = 1, ngrid 2737 ztva(ig, k) = ztv(ig, k) 2738 ztla(ig, k) = zthl(ig, k) 2739 zqla(ig, k) = 0. 2740 zqta(ig, k) = po(ig, k) 2741 zsat(ig) = .FALSE. 2742 END DO 2743 END DO 2744 2745 ! PRINT*,'7 OK convect8' 2746 DO k = 1, klev + 1 2747 DO ig = 1, ngrid 2748 zw2(ig, k) = 0. 2749 fmc(ig, k) = 0. 2750 ! CR 2751 f_star(ig, k) = 0. 2752 ! RC 2753 larg_cons(ig, k) = 0. 2754 larg_detr(ig, k) = 0. 2755 wa_moy(ig, k) = 0. 2756 END DO 2757 END DO 2758 2759 ! PRINT*,'8 OK convect8' 2760 DO ig = 1, ngrid 2761 linter(ig) = 1. 2762 lmaxa(ig) = 1 2763 lmix(ig) = 1 2764 wmaxa(ig) = 0. 2765 END DO 2766 2767 ! CR: 2768 DO l = 1, nlay - 2 2769 DO ig = 1, ngrid 2770 IF (ztv(ig, l)>ztv(ig, l + 1) .AND. entr_star(ig, l)>1.E-10 .AND. & 2771 zw2(ig, l)<1E-10) THEN 2772 ! AM 2773 ztla(ig, l) = zthl(ig, l) 2774 zqta(ig, l) = po(ig, l) 2775 zqla(ig, l) = zl(ig, l) 2776 ! AM 2777 f_star(ig, l + 1) = entr_star(ig, l) 2778 ! test:calcul de dteta 2779 zw2(ig, l + 1) = 2. * rg * (ztv(ig, l) - ztv(ig, l + 1)) / ztv(ig, l + 1) * & 2780 (zlev(ig, l + 1) - zlev(ig, l)) * 0.4 * pphi(ig, l) / (pphi(ig, l + 1) - pphi(ig, l)) 2781 larg_detr(ig, l) = 0. 2782 ELSE IF ((zw2(ig, l)>=1E-10) .AND. (f_star(ig, l) + entr_star(ig, & 2783 l)>1.E-10)) THEN 2784 f_star(ig, l + 1) = f_star(ig, l) + entr_star(ig, l) 2785 2786 ! AM on melange Tl et qt du thermique 2787 ztla(ig, l) = (f_star(ig, l) * ztla(ig, l - 1) + entr_star(ig, l) * zthl(ig, l)) / & 2788 f_star(ig, l + 1) 2789 zqta(ig, l) = (f_star(ig, l) * zqta(ig, l - 1) + entr_star(ig, l) * po(ig, l)) / & 2790 f_star(ig, l + 1) 2791 2792 ! ztva(ig,l)=(f_star(ig,l)*ztva(ig,l-1)+entr_star(ig,l) 2793 ! s *ztv(ig,l))/f_star(ig,l+1) 2794 2795 ! AM on en deduit thetav et ql du thermique 2796 tbef(ig) = ztla(ig, l) * zpspsk(ig, l) 2797 zdelta = max(0., sign(1., rtt - tbef(ig))) 2798 qsatbef(ig) = r2es * foeew(tbef(ig), zdelta) / pplev(ig, l) 2799 qsatbef(ig) = min(0.5, qsatbef(ig)) 2800 zcor = 1. / (1. - retv * qsatbef(ig)) 2801 qsatbef(ig) = qsatbef(ig) * zcor 2802 zsat(ig) = (max(0., zqta(ig, l) - qsatbef(ig))>0.00001) 2803 END IF 2804 END DO 2805 DO ig = 1, ngrid 2806 IF (zsat(ig)) THEN 2807 qlbef = max(0., zqta(ig, l) - qsatbef(ig)) 2808 dt = 0.5 * rlvcp * qlbef 2809 DO WHILE (dt>ddt0) 2810 tbef(ig) = tbef(ig) + dt 2811 zdelta = max(0., sign(1., rtt - tbef(ig))) 2812 qsatbef(ig) = r2es * foeew(tbef(ig), zdelta) / pplev(ig, l) 2813 qsatbef(ig) = min(0.5, qsatbef(ig)) 2814 zcor = 1. / (1. - retv * qsatbef(ig)) 2815 qsatbef(ig) = qsatbef(ig) * zcor 2816 qlbef = zqta(ig, l) - qsatbef(ig) 2817 2818 zdelta = max(0., sign(1., rtt - tbef(ig))) 2819 zcvm5 = r5les * (1. - zdelta) + r5ies * zdelta 2820 zcor = 1. / (1. - retv * qsatbef(ig)) 2821 dqsat_dt = foede(tbef(ig), zdelta, zcvm5, qsatbef(ig), zcor) 2822 num = -tbef(ig) + ztla(ig, l) * zpspsk(ig, l) + rlvcp * qlbef 2823 denom = 1. + rlvcp * dqsat_dt 2824 dt = num / denom 2825 END DO 2826 zqla(ig, l) = max(0., zqta(ig, l) - qsatbef(ig)) 2827 END IF 2828 ! on ecrit de maniere conservative (sat ou non) 2829 ! T = Tl +Lv/Cp ql 2830 ztva(ig, l) = ztla(ig, l) * zpspsk(ig, l) + rlvcp * zqla(ig, l) 2831 ztva(ig, l) = ztva(ig, l) / zpspsk(ig, l) 2832 ztva(ig, l) = ztva(ig, l) * (1. + retv * (zqta(ig, l) - zqla(ig, l)) - zqla(ig, l)) 2833 2834 END DO 2835 DO ig = 1, ngrid 2836 IF (zw2(ig, l)>=1.E-10 .AND. f_star(ig, l) + entr_star(ig, l)>1.E-10) THEN 2837 ! mise a jour de la vitesse ascendante (l'air entraine de la couche 2838 ! consideree commence avec une vitesse nulle). 2839 2840 zw2(ig, l + 1) = zw2(ig, l) * (f_star(ig, l) / f_star(ig, l + 1))**2 + & 2841 2. * rg * (ztva(ig, l) - ztv(ig, l)) / ztv(ig, l) * (zlev(ig, l + 1) - zlev(ig, l)) 2842 END IF 2843 ! determination de zmax continu par interpolation lineaire 2844 IF (zw2(ig, l + 1)<0.) THEN 2845 linter(ig) = (l * (zw2(ig, l + 1) - zw2(ig, l)) - zw2(ig, l)) / (zw2(ig, l + 1) - zw2(& 2846 ig, l)) 2847 zw2(ig, l + 1) = 0. 2848 lmaxa(ig) = l 2849 ELSE 2850 wa_moy(ig, l + 1) = sqrt(zw2(ig, l + 1)) 2851 END IF 2852 IF (wa_moy(ig, l + 1)>wmaxa(ig)) THEN 2853 ! lmix est le niveau de la couche ou w (wa_moy) est maximum 2854 lmix(ig) = l + 1 2855 wmaxa(ig) = wa_moy(ig, l + 1) 2856 END IF 2857 END DO 2858 END DO 2859 2860 ! Calcul de la couche correspondant a la hauteur du thermique 2861 DO ig = 1, ngrid 2862 lmax(ig) = lentr(ig) 2863 END DO 2864 DO ig = 1, ngrid 2865 DO l = nlay, lentr(ig) + 1, -1 2866 IF (zw2(ig, l)<=1.E-10) THEN 2867 lmax(ig) = l - 1 2868 END IF 2869 END DO 2870 END DO 2871 ! pas de thermique si couche 1 stable 2872 DO ig = 1, ngrid 2873 IF (lmin(ig)>1) THEN 2874 lmax(ig) = 1 2875 lmin(ig) = 1 2876 END IF 2877 END DO 2878 2879 ! Determination de zw2 max 2880 DO ig = 1, ngrid 2881 wmax(ig) = 0. 2882 END DO 2883 2884 DO l = 1, nlay 2885 DO ig = 1, ngrid 2886 IF (l<=lmax(ig)) THEN 2887 zw2(ig, l) = sqrt(zw2(ig, l)) 2888 wmax(ig) = max(wmax(ig), zw2(ig, l)) 2889 ELSE 2890 zw2(ig, l) = 0. 2891 END IF 2892 END DO 2893 END DO 2894 2895 ! Longueur caracteristique correspondant a la hauteur des thermiques. 2896 DO ig = 1, ngrid 2897 zmax(ig) = 500. 2898 zlevinter(ig) = zlev(ig, 1) 2899 END DO 2900 DO ig = 1, ngrid 2901 ! calcul de zlevinter 2902 zlevinter(ig) = (zlev(ig, lmax(ig) + 1) - zlev(ig, lmax(ig))) * linter(ig) + & 2903 zlev(ig, lmax(ig)) - lmax(ig) * (zlev(ig, lmax(ig) + 1) - zlev(ig, lmax(ig))) 2904 zmax(ig) = max(zmax(ig), zlevinter(ig) - zlev(ig, lmin(ig))) 2905 END DO 2906 2907 ! Fermeture,determination de f 2908 DO ig = 1, ngrid 2909 entr_star2(ig) = 0. 2910 END DO 2911 DO ig = 1, ngrid 2912 IF (entr_star_tot(ig)<1.E-10) THEN 2913 f(ig) = 0. 349 2914 ELSE 350 entr(ig, k) = zzz 2915 DO k = lmin(ig), lentr(ig) 2916 entr_star2(ig) = entr_star2(ig) + entr_star(ig, k)**2 / (rho(ig, k) * (& 2917 zlev(ig, k + 1) - zlev(ig, k))) 2918 END DO 2919 ! Nouvelle fermeture 2920 f(ig) = wmax(ig) / (zmax(ig) * r_aspect * entr_star2(ig)) * entr_star_tot(ig) 2921 ! test 2922 IF (first) THEN 2923 f(ig) = f(ig) + (f0(ig) - f(ig)) * exp(-ptimestep / zmax(ig) * wmax(ig)) 2924 END IF 351 2925 END IF 352 ztva(ig, k) = ztv(ig, k) 353 END DO 354 END DO 355 356 357 ! PRINT*,'7 OK convect8' 358 DO k = 1, klev + 1 359 DO ig = 1, ngrid 360 zw2(ig, k) = 0. 361 fmc(ig, k) = 0. 362 larg_cons(ig, k) = 0. 363 larg_detr(ig, k) = 0. 364 wa_moy(ig, k) = 0. 365 END DO 366 END DO 367 368 ! PRINT*,'8 OK convect8' 369 DO ig = 1, ngrid 370 lmaxa(ig) = 1 371 lmix(ig) = 1 372 wmaxa(ig) = 0. 373 END DO 374 375 376 ! PRINT*,'OKl372' 377 DO l = 1, nlay - 2 378 DO ig = 1, ngrid 379 ! if (zw2(ig,l).lt.1.e-10.AND.ztv(ig,l).gt.ztv(ig,l+1)) THEN 380 ! PRINT*,'COUCOU ',l,zw2(ig,l),ztv(ig,l),ztv(ig,l+1) 381 IF (zw2(ig,l)<1.E-10 .AND. ztv(ig,l)>ztv(ig,l+1) .AND. & 382 entr(ig,l)>1.E-10) THEN 383 ! PRINT*,'COUCOU cas 1' 384 ! Initialisation de l'ascendance 385 ! lmix(ig)=1 386 ztva(ig, l) = ztv(ig, l) 387 fmc(ig, l) = 0. 388 fmc(ig, l+1) = entr(ig, l) 389 zw2(ig, l) = 0. 390 ! if (.NOT.ztv(ig,l+1).gt.150.) THEN 391 ! PRINT*,'ig,l+1,ztv(ig,l+1)' 392 ! PRINT*, ig,l+1,ztv(ig,l+1) 393 ! END IF 394 zw2(ig, l+1) = 2.*rg*(ztv(ig,l)-ztv(ig,l+1))/ztv(ig, l+1)* & 395 (zlev(ig,l+1)-zlev(ig,l)) 396 larg_detr(ig, l) = 0. 397 ELSE IF (zw2(ig,l)>=1.E-10 .AND. fmc(ig,l)+entr(ig,l)>1.E-10) THEN 398 ! Incrementation... 399 fmc(ig, l+1) = fmc(ig, l) + entr(ig, l) 400 ! if (.NOT.fmc(ig,l+1).gt.1.e-15) THEN 401 ! PRINT*,'ig,l+1,fmc(ig,l+1)' 402 ! PRINT*, ig,l+1,fmc(ig,l+1) 403 ! PRINT*,'Fmc ',(fmc(ig,ll),ll=1,klev+1) 404 ! PRINT*,'W2 ',(zw2(ig,ll),ll=1,klev+1) 405 ! PRINT*,'Tv ',(ztv(ig,ll),ll=1,klev) 406 ! PRINT*,'Entr ',(entr(ig,ll),ll=1,klev) 407 ! END IF 408 ztva(ig, l) = (fmc(ig,l)*ztva(ig,l-1)+entr(ig,l)*ztv(ig,l))/ & 409 fmc(ig, l+1) 410 ! mise a jour de la vitesse ascendante (l'air entraine de la couche 411 ! consideree commence avec une vitesse nulle). 412 zw2(ig, l+1) = zw2(ig, l)*(fmc(ig,l)/fmc(ig,l+1))**2 + & 413 2.*rg*(ztva(ig,l)-ztv(ig,l))/ztv(ig, l)*(zlev(ig,l+1)-zlev(ig,l)) 2926 f0(ig) = f(ig) 2927 first = .TRUE. 2928 END DO 2929 2930 ! Calcul de l'entrainement 2931 DO k = 1, klev 2932 DO ig = 1, ngrid 2933 entr(ig, k) = f(ig) * entr_star(ig, k) 2934 END DO 2935 END DO 2936 ! Calcul des flux 2937 DO ig = 1, ngrid 2938 DO l = 1, lmax(ig) - 1 2939 fmc(ig, l + 1) = fmc(ig, l) + entr(ig, l) 2940 END DO 2941 END DO 2942 2943 ! RC 2944 2945 2946 ! PRINT*,'9 OK convect8' 2947 ! PRINT*,'WA1 ',wa_moy 2948 2949 ! determination de l'indice du debut de la mixed layer ou w decroit 2950 2951 ! calcul de la largeur de chaque ascendance dans le cas conservatif. 2952 ! dans ce cas simple, on suppose que la largeur de l'ascendance provenant 2953 ! d'une couche est égale à la hauteur de la couche alimentante. 2954 ! La vitesse maximale dans l'ascendance est aussi prise comme estimation 2955 ! de la vitesse d'entrainement horizontal dans la couche alimentante. 2956 2957 DO l = 2, nlay 2958 DO ig = 1, ngrid 2959 IF (l<=lmaxa(ig)) THEN 2960 zw = max(wa_moy(ig, l), 1.E-10) 2961 larg_cons(ig, l) = zmax(ig) * r_aspect * fmc(ig, l) / (rhobarz(ig, l) * zw) 2962 END IF 2963 END DO 2964 END DO 2965 2966 DO l = 2, nlay 2967 DO ig = 1, ngrid 2968 IF (l<=lmaxa(ig)) THEN 2969 ! if (idetr.EQ.0) THEN 2970 ! cette option est finalement en dur. 2971 larg_detr(ig, l) = sqrt(l_mix * zlev(ig, l)) 2972 ! ELSE IF (idetr.EQ.1) THEN 2973 ! larg_detr(ig,l)=larg_cons(ig,l) 2974 ! s *sqrt(l_mix*zlev(ig,l))/larg_cons(ig,lmix(ig)) 2975 ! ELSE IF (idetr.EQ.2) THEN 2976 ! larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l)) 2977 ! s *sqrt(wa_moy(ig,l)) 2978 ! ELSE IF (idetr.EQ.4) THEN 2979 ! larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l)) 2980 ! s *wa_moy(ig,l) 2981 ! END IF 2982 END IF 2983 END DO 2984 END DO 2985 2986 ! PRINT*,'10 OK convect8' 2987 ! PRINT*,'WA2 ',wa_moy 2988 ! calcul de la fraction de la maille concernée par l'ascendance en tenant 2989 ! compte de l'epluchage du thermique. 2990 2991 ! CR def de zmix continu (profil parabolique des vitesses) 2992 DO ig = 1, ngrid 2993 IF (lmix(ig)>1.) THEN 2994 zmix(ig) = ((zw2(ig, lmix(ig) - 1) - zw2(ig, lmix(ig))) * ((zlev(ig, lmix(ig))) & 2995 **2 - (zlev(ig, lmix(ig) + 1))**2) - (zw2(ig, lmix(ig)) - zw2(ig, & 2996 lmix(ig) + 1)) * ((zlev(ig, lmix(ig) - 1))**2 - (zlev(ig, lmix(ig)))**2)) / & 2997 (2. * ((zw2(ig, lmix(ig) - 1) - zw2(ig, lmix(ig))) * ((zlev(ig, lmix(ig))) - & 2998 (zlev(ig, lmix(ig) + 1))) - (zw2(ig, lmix(ig)) - zw2(ig, lmix(ig) + 1)) * ((zlev(& 2999 ig, lmix(ig) - 1)) - (zlev(ig, lmix(ig)))))) 3000 ELSE 3001 zmix(ig) = 0. 414 3002 END IF 415 IF (zw2(ig,l+1)<0.) THEN 416 zw2(ig, l+1) = 0. 417 lmaxa(ig) = l 3003 END DO 3004 3005 ! calcul du nouveau lmix correspondant 3006 DO ig = 1, ngrid 3007 DO l = 1, klev 3008 IF (zmix(ig)>=zlev(ig, l) .AND. zmix(ig)<zlev(ig, l + 1)) THEN 3009 lmix(ig) = l 3010 END IF 3011 END DO 3012 END DO 3013 3014 DO l = 2, nlay 3015 DO ig = 1, ngrid 3016 IF (larg_cons(ig, l)>1.) THEN 3017 ! PRINT*,ig,l,lmix(ig),lmaxa(ig),larg_cons(ig,l),' KKK' 3018 fraca(ig, l) = (larg_cons(ig, l) - larg_detr(ig, l)) / (r_aspect * zmax(ig)) 3019 ! test 3020 fraca(ig, l) = max(fraca(ig, l), 0.) 3021 fraca(ig, l) = min(fraca(ig, l), 0.5) 3022 fracd(ig, l) = 1. - fraca(ig, l) 3023 fracc(ig, l) = larg_cons(ig, l) / (r_aspect * zmax(ig)) 3024 ELSE 3025 ! wa_moy(ig,l)=0. 3026 fraca(ig, l) = 0. 3027 fracc(ig, l) = 0. 3028 fracd(ig, l) = 1. 3029 END IF 3030 END DO 3031 END DO 3032 ! CR: calcul de fracazmix 3033 DO ig = 1, ngrid 3034 fracazmix(ig) = (fraca(ig, lmix(ig) + 1) - fraca(ig, lmix(ig))) / & 3035 (zlev(ig, lmix(ig) + 1) - zlev(ig, lmix(ig))) * zmix(ig) + & 3036 fraca(ig, lmix(ig)) - zlev(ig, lmix(ig)) * (fraca(ig, lmix(ig) + 1) - fraca(ig & 3037 , lmix(ig))) / (zlev(ig, lmix(ig) + 1) - zlev(ig, lmix(ig))) 3038 END DO 3039 3040 DO l = 2, nlay 3041 DO ig = 1, ngrid 3042 IF (larg_cons(ig, l)>1.) THEN 3043 IF (l>lmix(ig)) THEN 3044 xxx(ig, l) = (zmax(ig) - zlev(ig, l)) / (zmax(ig) - zmix(ig)) 3045 IF (idetr==0) THEN 3046 fraca(ig, l) = fracazmix(ig) 3047 ELSE IF (idetr==1) THEN 3048 fraca(ig, l) = fracazmix(ig) * xxx(ig, l) 3049 ELSE IF (idetr==2) THEN 3050 fraca(ig, l) = fracazmix(ig) * (1. - (1. - xxx(ig, l))**2) 3051 ELSE 3052 fraca(ig, l) = fracazmix(ig) * xxx(ig, l)**2 3053 END IF 3054 ! PRINT*,ig,l,lmix(ig),lmaxa(ig),xxx(ig,l),'LLLLLLL' 3055 fraca(ig, l) = max(fraca(ig, l), 0.) 3056 fraca(ig, l) = min(fraca(ig, l), 0.5) 3057 fracd(ig, l) = 1. - fraca(ig, l) 3058 fracc(ig, l) = larg_cons(ig, l) / (r_aspect * zmax(ig)) 3059 END IF 3060 END IF 3061 END DO 3062 END DO 3063 3064 ! PRINT*,'11 OK convect8' 3065 ! PRINT*,'Ea3 ',wa_moy 3066 ! ------------------------------------------------------------------ 3067 ! Calcul de fracd, wd 3068 ! somme wa - wd = 0 3069 ! ------------------------------------------------------------------ 3070 3071 DO ig = 1, ngrid 3072 fm(ig, 1) = 0. 3073 fm(ig, nlay + 1) = 0. 3074 END DO 3075 3076 DO l = 2, nlay 3077 DO ig = 1, ngrid 3078 fm(ig, l) = fraca(ig, l) * wa_moy(ig, l) * rhobarz(ig, l) 3079 ! CR:test 3080 IF (entr(ig, l - 1)<1E-10 .AND. fm(ig, l)>fm(ig, l - 1) .AND. l>lmix(ig)) THEN 3081 fm(ig, l) = fm(ig, l - 1) 3082 ! WRITE(1,*)'ajustement fm, l',l 3083 END IF 3084 ! WRITE(1,*)'ig,l,fm(ig,l)',ig,l,fm(ig,l) 3085 ! RC 3086 END DO 3087 DO ig = 1, ngrid 3088 IF (fracd(ig, l)<0.1) THEN 3089 abort_message = 'fracd trop petit' 3090 CALL abort_physic(modname, abort_message, 1) 3091 ELSE 3092 ! vitesse descendante "diagnostique" 3093 wd(ig, l) = fm(ig, l) / (fracd(ig, l) * rhobarz(ig, l)) 3094 END IF 3095 END DO 3096 END DO 3097 3098 DO l = 1, nlay 3099 DO ig = 1, ngrid 3100 ! masse(ig,l)=rho(ig,l)*(zlev(ig,l+1)-zlev(ig,l)) 3101 masse(ig, l) = (pplev(ig, l) - pplev(ig, l + 1)) / rg 3102 END DO 3103 END DO 3104 3105 ! PRINT*,'12 OK convect8' 3106 ! PRINT*,'WA4 ',wa_moy 3107 ! c------------------------------------------------------------------ 3108 ! calcul du transport vertical 3109 ! ------------------------------------------------------------------ 3110 3111 GO TO 4444 3112 ! PRINT*,'XXXXXXXXXXXXXXX ptimestep= ',ptimestep 3113 DO l = 2, nlay - 1 3114 DO ig = 1, ngrid 3115 IF (fm(ig, l + 1) * ptimestep>masse(ig, l) .AND. fm(ig, l + 1) * ptimestep>masse(& 3116 ig, l + 1)) THEN 3117 ! PRINT*,'WARN!!! FM>M ig=',ig,' l=',l,' FM=' 3118 ! s ,fm(ig,l+1)*ptimestep 3119 ! s ,' M=',masse(ig,l),masse(ig,l+1) 3120 END IF 3121 END DO 3122 END DO 3123 3124 DO l = 1, nlay 3125 DO ig = 1, ngrid 3126 IF (entr(ig, l) * ptimestep>masse(ig, l)) THEN 3127 ! PRINT*,'WARN!!! E>M ig=',ig,' l=',l,' E==' 3128 ! s ,entr(ig,l)*ptimestep 3129 ! s ,' M=',masse(ig,l) 3130 END IF 3131 END DO 3132 END DO 3133 3134 DO l = 1, nlay 3135 DO ig = 1, ngrid 3136 IF (.NOT. fm(ig, l)>=0. .OR. .NOT. fm(ig, l)<=10.) THEN 3137 ! PRINT*,'WARN!!! fm exagere ig=',ig,' l=',l 3138 ! s ,' FM=',fm(ig,l) 3139 END IF 3140 IF (.NOT. masse(ig, l)>=1.E-10 .OR. .NOT. masse(ig, l)<=1.E4) THEN 3141 ! PRINT*,'WARN!!! masse exagere ig=',ig,' l=',l 3142 ! s ,' M=',masse(ig,l) 3143 ! PRINT*,'rho(ig,l),pplay(ig,l),zpspsk(ig,l),RD,zh(ig,l)', 3144 ! s rho(ig,l),pplay(ig,l),zpspsk(ig,l),RD,zh(ig,l) 3145 ! PRINT*,'zlev(ig,l+1),zlev(ig,l)' 3146 ! s ,zlev(ig,l+1),zlev(ig,l) 3147 ! PRINT*,'pphi(ig,l-1),pphi(ig,l),pphi(ig,l+1)' 3148 ! s ,pphi(ig,l-1),pphi(ig,l),pphi(ig,l+1) 3149 END IF 3150 IF (.NOT. entr(ig, l)>=0. .OR. .NOT. entr(ig, l)<=10.) THEN 3151 ! PRINT*,'WARN!!! entr exagere ig=',ig,' l=',l 3152 ! s ,' E=',entr(ig,l) 3153 END IF 3154 END DO 3155 END DO 3156 3157 4444 CONTINUE 3158 3159 IF (w2di==1) THEN 3160 fm0 = fm0 + ptimestep * (fm - fm0) / tho 3161 entr0 = entr0 + ptimestep * (entr - entr0) / tho 3162 ELSE 3163 fm0 = fm 3164 entr0 = entr 3165 END IF 3166 3167 IF (1==1) THEN 3168 ! CALL dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse 3169 ! . ,zh,zdhadj,zha) 3170 ! CALL dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse 3171 ! . ,zo,pdoadj,zoa) 3172 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zthl, & 3173 zdthladj, zta) 3174 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, po, pdoadj, & 3175 zoa) 3176 ELSE 3177 CALL dqthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca, zh, & 3178 zdhadj, zha) 3179 CALL dqthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca, zo, & 3180 pdoadj, zoa) 3181 END IF 3182 3183 IF (1==0) THEN 3184 CALL dvthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca, zmax, & 3185 zu, zv, pduadj, pdvadj, zua, zva) 3186 ELSE 3187 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zu, pduadj, & 3188 zua) 3189 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zv, pdvadj, & 3190 zva) 3191 END IF 3192 3193 DO l = 1, nlay 3194 DO ig = 1, ngrid 3195 zf = 0.5 * (fracc(ig, l) + fracc(ig, l + 1)) 3196 zf2 = zf / (1. - zf) 3197 thetath2(ig, l) = zf2 * (zha(ig, l) - zh(ig, l))**2 3198 wth2(ig, l) = zf2 * (0.5 * (wa_moy(ig, l) + wa_moy(ig, l + 1)))**2 3199 END DO 3200 END DO 3201 3202 3203 3204 ! PRINT*,'13 OK convect8' 3205 ! PRINT*,'WA5 ',wa_moy 3206 DO l = 1, nlay 3207 DO ig = 1, ngrid 3208 ! pdtadj(ig,l)=zdhadj(ig,l)*zpspsk(ig,l) 3209 pdtadj(ig, l) = zdthladj(ig, l) * zpspsk(ig, l) 3210 END DO 3211 END DO 3212 3213 3214 ! do l=1,nlay 3215 ! do ig=1,ngrid 3216 ! IF(abs(pdtadj(ig,l))*86400..gt.500.) THEN 3217 ! PRINT*,'WARN!!! ig=',ig,' l=',l 3218 ! s ,' pdtadj=',pdtadj(ig,l) 3219 ! END IF 3220 ! IF(abs(pdoadj(ig,l))*86400..gt.1.) THEN 3221 ! PRINT*,'WARN!!! ig=',ig,' l=',l 3222 ! s ,' pdoadj=',pdoadj(ig,l) 3223 ! END IF 3224 ! enddo 3225 ! enddo 3226 3227 ! PRINT*,'14 OK convect8' 3228 ! ------------------------------------------------------------------ 3229 ! Calculs pour les sorties 3230 ! ------------------------------------------------------------------ 3231 3232 END SUBROUTINE thermcell_eau 3233 3234 SUBROUTINE thermcell(ngrid, nlay, ptimestep, pplay, pplev, pphi, pu, pv, pt, & 3235 po, pduadj, pdvadj, pdtadj, pdoadj, fm0, entr0 & ! s 3236 ! ,pu_therm,pv_therm 3237 , r_aspect, l_mix, w2di, tho) 3238 3239 USE dimphy 3240 IMPLICIT NONE 3241 3242 ! ======================================================================= 3243 3244 ! Calcul du transport verticale dans la couche limite en presence 3245 ! de "thermiques" explicitement representes 3246 3247 ! Réécriture à partir d'un listing papier à Habas, le 14/02/00 3248 3249 ! le thermique est supposé homogène et dissipé par mélange avec 3250 ! son environnement. la longueur l_mix contrôle l'efficacité du 3251 ! mélange 3252 3253 ! Le calcul du transport des différentes espèces se fait en prenant 3254 ! en compte: 3255 ! 1. un flux de masse montant 3256 ! 2. un flux de masse descendant 3257 ! 3. un entrainement 3258 ! 4. un detrainement 3259 3260 ! ======================================================================= 3261 3262 ! ----------------------------------------------------------------------- 3263 ! declarations: 3264 ! ------------- 3265 3266 include "YOMCST.h" 3267 3268 ! arguments: 3269 ! ---------- 3270 3271 INTEGER ngrid, nlay, w2di 3272 REAL tho 3273 REAL ptimestep, l_mix, r_aspect 3274 REAL pt(ngrid, nlay), pdtadj(ngrid, nlay) 3275 REAL pu(ngrid, nlay), pduadj(ngrid, nlay) 3276 REAL pv(ngrid, nlay), pdvadj(ngrid, nlay) 3277 REAL po(ngrid, nlay), pdoadj(ngrid, nlay) 3278 REAL pplay(ngrid, nlay), pplev(ngrid, nlay + 1) 3279 REAL pphi(ngrid, nlay) 3280 3281 INTEGER idetr 3282 SAVE idetr 3283 DATA idetr/3/ 3284 !$OMP THREADPRIVATE(idetr) 3285 3286 ! local: 3287 ! ------ 3288 3289 INTEGER ig, k, l, lmaxa(klon), lmix(klon) 3290 REAL zsortie1d(klon) 3291 ! CR: on remplace lmax(klon,klev+1) 3292 INTEGER lmax(klon), lmin(klon), lentr(klon) 3293 REAL linter(klon) 3294 REAL zmix(klon), fracazmix(klon) 3295 ! RC 3296 REAL zmax(klon), zw, zz, zw2(klon, klev + 1), ztva(klon, klev), zzz 3297 3298 REAL zlev(klon, klev + 1), zlay(klon, klev) 3299 REAL zh(klon, klev), zdhadj(klon, klev) 3300 REAL ztv(klon, klev) 3301 REAL zu(klon, klev), zv(klon, klev), zo(klon, klev) 3302 REAL wh(klon, klev + 1) 3303 REAL wu(klon, klev + 1), wv(klon, klev + 1), wo(klon, klev + 1) 3304 REAL zla(klon, klev + 1) 3305 REAL zwa(klon, klev + 1) 3306 REAL zld(klon, klev + 1) 3307 REAL zwd(klon, klev + 1) 3308 REAL zsortie(klon, klev) 3309 REAL zva(klon, klev) 3310 REAL zua(klon, klev) 3311 REAL zoa(klon, klev) 3312 3313 REAL zha(klon, klev) 3314 REAL wa_moy(klon, klev + 1) 3315 REAL fraca(klon, klev + 1) 3316 REAL fracc(klon, klev + 1) 3317 REAL zf, zf2 3318 REAL thetath2(klon, klev), wth2(klon, klev) 3319 ! common/comtherm/thetath2,wth2 3320 3321 REAL count_time 3322 INTEGER ialt 3323 3324 LOGICAL sorties 3325 REAL rho(klon, klev), rhobarz(klon, klev + 1), masse(klon, klev) 3326 REAL zpspsk(klon, klev) 3327 3328 ! real wmax(klon,klev),wmaxa(klon) 3329 REAL wmax(klon), wmaxa(klon) 3330 REAL wa(klon, klev, klev + 1) 3331 REAL wd(klon, klev + 1) 3332 REAL larg_part(klon, klev, klev + 1) 3333 REAL fracd(klon, klev + 1) 3334 REAL xxx(klon, klev + 1) 3335 REAL larg_cons(klon, klev + 1) 3336 REAL larg_detr(klon, klev + 1) 3337 REAL fm0(klon, klev + 1), entr0(klon, klev), detr(klon, klev) 3338 REAL pu_therm(klon, klev), pv_therm(klon, klev) 3339 REAL fm(klon, klev + 1), entr(klon, klev) 3340 REAL fmc(klon, klev + 1) 3341 3342 ! CR:nouvelles variables 3343 REAL f_star(klon, klev + 1), entr_star(klon, klev) 3344 REAL entr_star_tot(klon), entr_star2(klon) 3345 REAL f(klon), f0(klon) 3346 REAL zlevinter(klon) 3347 LOGICAL first 3348 DATA first/.FALSE./ 3349 SAVE first 3350 !$OMP THREADPRIVATE(first) 3351 ! RC 3352 3353 CHARACTER *2 str2 3354 CHARACTER *10 str10 3355 3356 CHARACTER (LEN = 20) :: modname = 'thermcell' 3357 CHARACTER (LEN = 80) :: abort_message 3358 3359 LOGICAL vtest(klon), down 3360 3361 INTEGER ncorrec, ll 3362 SAVE ncorrec 3363 DATA ncorrec/0/ 3364 !$OMP THREADPRIVATE(ncorrec) 3365 3366 3367 ! ----------------------------------------------------------------------- 3368 ! initialisation: 3369 ! --------------- 3370 3371 sorties = .TRUE. 3372 IF (ngrid/=klon) THEN 3373 PRINT * 3374 PRINT *, 'STOP dans convadj' 3375 PRINT *, 'ngrid =', ngrid 3376 PRINT *, 'klon =', klon 3377 END IF 3378 3379 ! ----------------------------------------------------------------------- 3380 ! incrementation eventuelle de tendances precedentes: 3381 ! --------------------------------------------------- 3382 3383 ! PRINT*,'0 OK convect8' 3384 3385 DO l = 1, nlay 3386 DO ig = 1, ngrid 3387 zpspsk(ig, l) = (pplay(ig, l) / pplev(ig, 1))**rkappa 3388 zh(ig, l) = pt(ig, l) / zpspsk(ig, l) 3389 zu(ig, l) = pu(ig, l) 3390 zv(ig, l) = pv(ig, l) 3391 zo(ig, l) = po(ig, l) 3392 ztv(ig, l) = zh(ig, l) * (1. + 0.61 * zo(ig, l)) 3393 END DO 3394 END DO 3395 3396 ! PRINT*,'1 OK convect8' 3397 ! -------------------- 3398 3399 3400 ! + + + + + + + + + + + 3401 3402 3403 ! wa, fraca, wd, fracd -------------------- zlev(2), rhobarz 3404 ! wh,wt,wo ... 3405 3406 ! + + + + + + + + + + + zh,zu,zv,zo,rho 3407 3408 3409 ! -------------------- zlev(1) 3410 ! \\\\\\\\\\\\\\\\\\\\ 3411 3412 3413 3414 ! ----------------------------------------------------------------------- 3415 ! Calcul des altitudes des couches 3416 ! ----------------------------------------------------------------------- 3417 3418 DO l = 2, nlay 3419 DO ig = 1, ngrid 3420 zlev(ig, l) = 0.5 * (pphi(ig, l) + pphi(ig, l - 1)) / rg 3421 END DO 3422 END DO 3423 DO ig = 1, ngrid 3424 zlev(ig, 1) = 0. 3425 zlev(ig, nlay + 1) = (2. * pphi(ig, klev) - pphi(ig, klev - 1)) / rg 3426 END DO 3427 DO l = 1, nlay 3428 DO ig = 1, ngrid 3429 zlay(ig, l) = pphi(ig, l) / rg 3430 END DO 3431 END DO 3432 3433 ! PRINT*,'2 OK convect8' 3434 ! ----------------------------------------------------------------------- 3435 ! Calcul des densites 3436 ! ----------------------------------------------------------------------- 3437 3438 DO l = 1, nlay 3439 DO ig = 1, ngrid 3440 rho(ig, l) = pplay(ig, l) / (zpspsk(ig, l) * rd * zh(ig, l)) 3441 END DO 3442 END DO 3443 3444 DO l = 2, nlay 3445 DO ig = 1, ngrid 3446 rhobarz(ig, l) = 0.5 * (rho(ig, l) + rho(ig, l - 1)) 3447 END DO 3448 END DO 3449 3450 DO k = 1, nlay 3451 DO l = 1, nlay + 1 3452 DO ig = 1, ngrid 3453 wa(ig, k, l) = 0. 3454 END DO 3455 END DO 3456 END DO 3457 3458 ! PRINT*,'3 OK convect8' 3459 ! ------------------------------------------------------------------ 3460 ! Calcul de w2, quarre de w a partir de la cape 3461 ! a partir de w2, on calcule wa, vitesse de l'ascendance 3462 3463 ! ATTENTION: Dans cette version, pour cause d'economie de memoire, 3464 ! w2 est stoke dans wa 3465 3466 ! ATTENTION: dans convect8, on n'utilise le calcule des wa 3467 ! independants par couches que pour calculer l'entrainement 3468 ! a la base et la hauteur max de l'ascendance. 3469 3470 ! Indicages: 3471 ! l'ascendance provenant du niveau k traverse l'interface l avec 3472 ! une vitesse wa(k,l). 3473 3474 ! -------------------- 3475 3476 ! + + + + + + + + + + 3477 3478 ! wa(k,l) ---- -------------------- l 3479 ! /\ 3480 ! /||\ + + + + + + + + + + 3481 ! || 3482 ! || -------------------- 3483 ! || 3484 ! || + + + + + + + + + + 3485 ! || 3486 ! || -------------------- 3487 ! ||__ 3488 ! |___ + + + + + + + + + + k 3489 3490 ! -------------------- 3491 3492 3493 3494 ! ------------------------------------------------------------------ 3495 3496 ! CR: ponderation entrainement des couches instables 3497 ! def des entr_star tels que entr=f*entr_star 3498 DO l = 1, klev 3499 DO ig = 1, ngrid 3500 entr_star(ig, l) = 0. 3501 END DO 3502 END DO 3503 ! determination de la longueur de la couche d entrainement 3504 DO ig = 1, ngrid 3505 lentr(ig) = 1 3506 END DO 3507 3508 ! on ne considere que les premieres couches instables 3509 DO k = nlay - 2, 1, -1 3510 DO ig = 1, ngrid 3511 IF (ztv(ig, k)>ztv(ig, k + 1) .AND. ztv(ig, k + 1)<=ztv(ig, k + 2)) THEN 3512 lentr(ig) = k 3513 END IF 3514 END DO 3515 END DO 3516 3517 ! determination du lmin: couche d ou provient le thermique 3518 DO ig = 1, ngrid 3519 lmin(ig) = 1 3520 END DO 3521 DO ig = 1, ngrid 3522 DO l = nlay, 2, -1 3523 IF (ztv(ig, l - 1)>ztv(ig, l)) THEN 3524 lmin(ig) = l - 1 3525 END IF 3526 END DO 3527 END DO 3528 3529 ! definition de l'entrainement des couches 3530 DO l = 1, klev - 1 3531 DO ig = 1, ngrid 3532 IF (ztv(ig, l)>ztv(ig, l + 1) .AND. l>=lmin(ig) .AND. l<=lentr(ig)) THEN 3533 entr_star(ig, l) = (ztv(ig, l) - ztv(ig, l + 1)) * (zlev(ig, l + 1) - zlev(ig, l)) 3534 END IF 3535 END DO 3536 END DO 3537 ! pas de thermique si couches 1->5 stables 3538 DO ig = 1, ngrid 3539 IF (lmin(ig)>5) THEN 3540 DO l = 1, klev 3541 entr_star(ig, l) = 0. 3542 END DO 3543 END IF 3544 END DO 3545 ! calcul de l entrainement total 3546 DO ig = 1, ngrid 3547 entr_star_tot(ig) = 0. 3548 END DO 3549 DO ig = 1, ngrid 3550 DO k = 1, klev 3551 entr_star_tot(ig) = entr_star_tot(ig) + entr_star(ig, k) 3552 END DO 3553 END DO 3554 3555 PRINT *, 'fin calcul entr_star' 3556 DO k = 1, klev 3557 DO ig = 1, ngrid 3558 ztva(ig, k) = ztv(ig, k) 3559 END DO 3560 END DO 3561 ! RC 3562 ! PRINT*,'7 OK convect8' 3563 DO k = 1, klev + 1 3564 DO ig = 1, ngrid 3565 zw2(ig, k) = 0. 3566 fmc(ig, k) = 0. 3567 ! CR 3568 f_star(ig, k) = 0. 3569 ! RC 3570 larg_cons(ig, k) = 0. 3571 larg_detr(ig, k) = 0. 3572 wa_moy(ig, k) = 0. 3573 END DO 3574 END DO 3575 3576 ! PRINT*,'8 OK convect8' 3577 DO ig = 1, ngrid 3578 linter(ig) = 1. 3579 lmaxa(ig) = 1 3580 lmix(ig) = 1 3581 wmaxa(ig) = 0. 3582 END DO 3583 3584 ! CR: 3585 DO l = 1, nlay - 2 3586 DO ig = 1, ngrid 3587 IF (ztv(ig, l)>ztv(ig, l + 1) .AND. entr_star(ig, l)>1.E-10 .AND. & 3588 zw2(ig, l)<1E-10) THEN 3589 f_star(ig, l + 1) = entr_star(ig, l) 3590 ! test:calcul de dteta 3591 zw2(ig, l + 1) = 2. * rg * (ztv(ig, l) - ztv(ig, l + 1)) / ztv(ig, l + 1) * & 3592 (zlev(ig, l + 1) - zlev(ig, l)) * 0.4 * pphi(ig, l) / (pphi(ig, l + 1) - pphi(ig, l)) 3593 larg_detr(ig, l) = 0. 3594 ELSE IF ((zw2(ig, l)>=1E-10) .AND. (f_star(ig, l) + entr_star(ig, & 3595 l)>1.E-10)) THEN 3596 f_star(ig, l + 1) = f_star(ig, l) + entr_star(ig, l) 3597 ztva(ig, l) = (f_star(ig, l) * ztva(ig, l - 1) + entr_star(ig, l) * ztv(ig, l)) / & 3598 f_star(ig, l + 1) 3599 zw2(ig, l + 1) = zw2(ig, l) * (f_star(ig, l) / f_star(ig, l + 1))**2 + & 3600 2. * rg * (ztva(ig, l) - ztv(ig, l)) / ztv(ig, l) * (zlev(ig, l + 1) - zlev(ig, l)) 3601 END IF 3602 ! determination de zmax continu par interpolation lineaire 3603 IF (zw2(ig, l + 1)<0.) THEN 3604 ! test 3605 IF (abs(zw2(ig, l + 1) - zw2(ig, l))<1E-10) THEN 3606 PRINT *, 'pb linter' 3607 END IF 3608 linter(ig) = (l * (zw2(ig, l + 1) - zw2(ig, l)) - zw2(ig, l)) / (zw2(ig, l + 1) - zw2(& 3609 ig, l)) 3610 zw2(ig, l + 1) = 0. 3611 lmaxa(ig) = l 3612 ELSE 3613 IF (zw2(ig, l + 1)<0.) THEN 3614 PRINT *, 'pb1 zw2<0' 3615 END IF 3616 wa_moy(ig, l + 1) = sqrt(zw2(ig, l + 1)) 3617 END IF 3618 IF (wa_moy(ig, l + 1)>wmaxa(ig)) THEN 3619 ! lmix est le niveau de la couche ou w (wa_moy) est maximum 3620 lmix(ig) = l + 1 3621 wmaxa(ig) = wa_moy(ig, l + 1) 3622 END IF 3623 END DO 3624 END DO 3625 PRINT *, 'fin calcul zw2' 3626 3627 ! Calcul de la couche correspondant a la hauteur du thermique 3628 DO ig = 1, ngrid 3629 lmax(ig) = lentr(ig) 3630 END DO 3631 DO ig = 1, ngrid 3632 DO l = nlay, lentr(ig) + 1, -1 3633 IF (zw2(ig, l)<=1.E-10) THEN 3634 lmax(ig) = l - 1 3635 END IF 3636 END DO 3637 END DO 3638 ! pas de thermique si couches 1->5 stables 3639 DO ig = 1, ngrid 3640 IF (lmin(ig)>5) THEN 3641 lmax(ig) = 1 3642 lmin(ig) = 1 3643 END IF 3644 END DO 3645 3646 ! Determination de zw2 max 3647 DO ig = 1, ngrid 3648 wmax(ig) = 0. 3649 END DO 3650 3651 DO l = 1, nlay 3652 DO ig = 1, ngrid 3653 IF (l<=lmax(ig)) THEN 3654 IF (zw2(ig, l)<0.) THEN 3655 PRINT *, 'pb2 zw2<0' 3656 END IF 3657 zw2(ig, l) = sqrt(zw2(ig, l)) 3658 wmax(ig) = max(wmax(ig), zw2(ig, l)) 3659 ELSE 3660 zw2(ig, l) = 0. 3661 END IF 3662 END DO 3663 END DO 3664 3665 ! Longueur caracteristique correspondant a la hauteur des thermiques. 3666 DO ig = 1, ngrid 3667 zmax(ig) = 0. 3668 zlevinter(ig) = zlev(ig, 1) 3669 END DO 3670 DO ig = 1, ngrid 3671 ! calcul de zlevinter 3672 zlevinter(ig) = (zlev(ig, lmax(ig) + 1) - zlev(ig, lmax(ig))) * linter(ig) + & 3673 zlev(ig, lmax(ig)) - lmax(ig) * (zlev(ig, lmax(ig) + 1) - zlev(ig, lmax(ig))) 3674 zmax(ig) = max(zmax(ig), zlevinter(ig) - zlev(ig, lmin(ig))) 3675 END DO 3676 3677 PRINT *, 'avant fermeture' 3678 ! Fermeture,determination de f 3679 DO ig = 1, ngrid 3680 entr_star2(ig) = 0. 3681 END DO 3682 DO ig = 1, ngrid 3683 IF (entr_star_tot(ig)<1.E-10) THEN 3684 f(ig) = 0. 418 3685 ELSE 419 wa_moy(ig, l+1) = sqrt(zw2(ig,l+1)) 420 END IF 421 IF (wa_moy(ig,l+1)>wmaxa(ig)) THEN 422 ! lmix est le niveau de la couche ou w (wa_moy) est maximum 423 lmix(ig) = l + 1 424 wmaxa(ig) = wa_moy(ig, l+1) 425 END IF 426 ! PRINT*,'COUCOU cas 2 LMIX=',lmix(ig),wa_moy(ig,l+1),wmaxa(ig) 427 END DO 428 END DO 429 430 ! PRINT*,'9 OK convect8' 431 ! PRINT*,'WA1 ',wa_moy 432 433 ! determination de l'indice du debut de la mixed layer ou w decroit 434 435 ! calcul de la largeur de chaque ascendance dans le cas conservatif. 436 ! dans ce cas simple, on suppose que la largeur de l'ascendance provenant 437 ! d'une couche est égale à la hauteur de la couche alimentante. 438 ! La vitesse maximale dans l'ascendance est aussi prise comme estimation 439 ! de la vitesse d'entrainement horizontal dans la couche alimentante. 440 441 ! PRINT*,'OKl439' 442 DO l = 2, nlay 443 DO ig = 1, ngrid 444 IF (l<=lmaxa(ig)) THEN 445 zw = max(wa_moy(ig,l), 1.E-10) 446 larg_cons(ig, l) = zmax(ig)*r_aspect*fmc(ig, l)/(rhobarz(ig,l)*zw) 447 END IF 448 END DO 449 END DO 450 451 DO l = 2, nlay 452 DO ig = 1, ngrid 453 IF (l<=lmaxa(ig)) THEN 454 ! if (idetr.EQ.0) THEN 455 ! cette option est finalement en dur. 456 larg_detr(ig, l) = sqrt(l_mix*zlev(ig,l)) 457 ! ELSE IF (idetr.EQ.1) THEN 458 ! larg_detr(ig,l)=larg_cons(ig,l) 459 ! s *sqrt(l_mix*zlev(ig,l))/larg_cons(ig,lmix(ig)) 460 ! ELSE IF (idetr.EQ.2) THEN 461 ! larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l)) 462 ! s *sqrt(wa_moy(ig,l)) 463 ! ELSE IF (idetr.EQ.4) THEN 464 ! larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l)) 465 ! s *wa_moy(ig,l) 3686 DO k = lmin(ig), lentr(ig) 3687 entr_star2(ig) = entr_star2(ig) + entr_star(ig, k)**2 / (rho(ig, k) * (& 3688 zlev(ig, k + 1) - zlev(ig, k))) 3689 END DO 3690 ! Nouvelle fermeture 3691 f(ig) = wmax(ig) / (max(500., zmax(ig)) * r_aspect * entr_star2(ig)) * & 3692 entr_star_tot(ig) 3693 ! test 3694 ! if (first) THEN 3695 ! f(ig)=f(ig)+(f0(ig)-f(ig))*exp(-ptimestep/zmax(ig) 3696 ! s *wmax(ig)) 466 3697 ! END IF 467 3698 END IF 468 END DO 469 END DO 470 471 ! PRINT*,'10 OK convect8' 472 ! PRINT*,'WA2 ',wa_moy 473 ! calcul de la fraction de la maille concernée par l'ascendance en tenant 474 ! compte de l'epluchage du thermique. 475 476 DO l = 2, nlay 477 DO ig = 1, ngrid 478 IF (larg_cons(ig,l)>1.) THEN 479 ! PRINT*,ig,l,lmix(ig),lmaxa(ig),larg_cons(ig,l),' KKK' 480 fraca(ig, l) = (larg_cons(ig,l)-larg_detr(ig,l))/(r_aspect*zmax(ig)) 481 IF (l>lmix(ig)) THEN 482 xxx(ig, l) = (lmaxa(ig)+1.-l)/(lmaxa(ig)+1.-lmix(ig)) 483 IF (idetr==0) THEN 484 fraca(ig, l) = fraca(ig, lmix(ig)) 485 ELSE IF (idetr==1) THEN 486 fraca(ig, l) = fraca(ig, lmix(ig))*xxx(ig, l) 487 ELSE IF (idetr==2) THEN 488 fraca(ig, l) = fraca(ig, lmix(ig))*(1.-(1.-xxx(ig,l))**2) 489 ELSE 490 fraca(ig, l) = fraca(ig, lmix(ig))*xxx(ig, l)**2 3699 ! f0(ig)=f(ig) 3700 ! first=.TRUE. 3701 END DO 3702 PRINT *, 'apres fermeture' 3703 3704 ! Calcul de l'entrainement 3705 DO k = 1, klev 3706 DO ig = 1, ngrid 3707 entr(ig, k) = f(ig) * entr_star(ig, k) 3708 END DO 3709 END DO 3710 ! Calcul des flux 3711 DO ig = 1, ngrid 3712 DO l = 1, lmax(ig) - 1 3713 fmc(ig, l + 1) = fmc(ig, l) + entr(ig, l) 3714 END DO 3715 END DO 3716 3717 ! RC 3718 3719 3720 ! PRINT*,'9 OK convect8' 3721 ! PRINT*,'WA1 ',wa_moy 3722 3723 ! determination de l'indice du debut de la mixed layer ou w decroit 3724 3725 ! calcul de la largeur de chaque ascendance dans le cas conservatif. 3726 ! dans ce cas simple, on suppose que la largeur de l'ascendance provenant 3727 ! d'une couche est égale à la hauteur de la couche alimentante. 3728 ! La vitesse maximale dans l'ascendance est aussi prise comme estimation 3729 ! de la vitesse d'entrainement horizontal dans la couche alimentante. 3730 3731 DO l = 2, nlay 3732 DO ig = 1, ngrid 3733 IF (l<=lmaxa(ig)) THEN 3734 zw = max(wa_moy(ig, l), 1.E-10) 3735 larg_cons(ig, l) = zmax(ig) * r_aspect * fmc(ig, l) / (rhobarz(ig, l) * zw) 3736 END IF 3737 END DO 3738 END DO 3739 3740 DO l = 2, nlay 3741 DO ig = 1, ngrid 3742 IF (l<=lmaxa(ig)) THEN 3743 ! if (idetr.EQ.0) THEN 3744 ! cette option est finalement en dur. 3745 IF ((l_mix * zlev(ig, l))<0.) THEN 3746 PRINT *, 'pb l_mix*zlev<0' 491 3747 END IF 492 END IF 493 ! PRINT*,ig,l,lmix(ig),lmaxa(ig),xxx(ig,l),'LLLLLLL' 494 fraca(ig, l) = max(fraca(ig,l), 0.) 495 fraca(ig, l) = min(fraca(ig,l), 0.5) 496 fracd(ig, l) = 1. - fraca(ig, l) 497 fracc(ig, l) = larg_cons(ig, l)/(r_aspect*zmax(ig)) 3748 larg_detr(ig, l) = sqrt(l_mix * zlev(ig, l)) 3749 ! ELSE IF (idetr.EQ.1) THEN 3750 ! larg_detr(ig,l)=larg_cons(ig,l) 3751 ! s *sqrt(l_mix*zlev(ig,l))/larg_cons(ig,lmix(ig)) 3752 ! ELSE IF (idetr.EQ.2) THEN 3753 ! larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l)) 3754 ! s *sqrt(wa_moy(ig,l)) 3755 ! ELSE IF (idetr.EQ.4) THEN 3756 ! larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l)) 3757 ! s *wa_moy(ig,l) 3758 ! END IF 3759 END IF 3760 END DO 3761 END DO 3762 3763 ! PRINT*,'10 OK convect8' 3764 ! PRINT*,'WA2 ',wa_moy 3765 ! calcul de la fraction de la maille concernée par l'ascendance en tenant 3766 ! compte de l'epluchage du thermique. 3767 3768 ! CR def de zmix continu (profil parabolique des vitesses) 3769 DO ig = 1, ngrid 3770 IF (lmix(ig)>1.) THEN 3771 ! test 3772 IF (((zw2(ig, lmix(ig) - 1) - zw2(ig, lmix(ig))) * ((zlev(ig, lmix(ig))) - & 3773 (zlev(ig, lmix(ig) + 1))) - (zw2(ig, lmix(ig)) - & 3774 zw2(ig, lmix(ig) + 1)) * ((zlev(ig, lmix(ig) - 1)) - & 3775 (zlev(ig, lmix(ig)))))>1E-10) THEN 3776 3777 zmix(ig) = ((zw2(ig, lmix(ig) - 1) - zw2(ig, lmix(ig))) * ((zlev(ig, lmix(ig)) & 3778 )**2 - (zlev(ig, lmix(ig) + 1))**2) - (zw2(ig, lmix(ig)) - zw2(ig, & 3779 lmix(ig) + 1)) * ((zlev(ig, lmix(ig) - 1))**2 - (zlev(ig, lmix(ig)))**2)) / & 3780 (2. * ((zw2(ig, lmix(ig) - 1) - zw2(ig, lmix(ig))) * ((zlev(ig, lmix(ig))) - & 3781 (zlev(ig, lmix(ig) + 1))) - (zw2(ig, lmix(ig)) - & 3782 zw2(ig, lmix(ig) + 1)) * ((zlev(ig, lmix(ig) - 1)) - (zlev(ig, lmix(ig)))))) 3783 ELSE 3784 zmix(ig) = zlev(ig, lmix(ig)) 3785 PRINT *, 'pb zmix' 3786 END IF 498 3787 ELSE 499 ! wa_moy(ig,l)=0. 500 fraca(ig, l) = 0. 501 fracc(ig, l) = 0. 502 fracd(ig, l) = 1. 3788 zmix(ig) = 0. 503 3789 END IF 504 END DO 505 END DO 506 507 ! PRINT*,'11 OK convect8' 508 ! PRINT*,'Ea3 ',wa_moy 509 ! ------------------------------------------------------------------ 510 ! Calcul de fracd, wd 511 ! somme wa - wd = 0 512 ! ------------------------------------------------------------------ 513 514 515 DO ig = 1, ngrid 516 fm(ig, 1) = 0. 517 fm(ig, nlay+1) = 0. 518 END DO 519 520 DO l = 2, nlay 521 DO ig = 1, ngrid 522 fm(ig, l) = fraca(ig, l)*wa_moy(ig, l)*rhobarz(ig, l) 523 END DO 524 DO ig = 1, ngrid 525 IF (fracd(ig,l)<0.1) THEN 526 abort_message = 'fracd trop petit' 527 CALL abort_physic(modname, abort_message, 1) 528 ELSE 529 ! vitesse descendante "diagnostique" 530 wd(ig, l) = fm(ig, l)/(fracd(ig,l)*rhobarz(ig,l)) 3790 ! test 3791 IF ((zmax(ig) - zmix(ig))<0.) THEN 3792 zmix(ig) = 0.99 * zmax(ig) 3793 ! PRINT*,'pb zmix>zmax' 531 3794 END IF 532 3795 END DO 533 END DO 534 535 DO l = 1, nlay 536 DO ig = 1, ngrid 537 ! masse(ig,l)=rho(ig,l)*(zlev(ig,l+1)-zlev(ig,l)) 538 masse(ig, l) = (pplev(ig,l)-pplev(ig,l+1))/rg 539 END DO 540 END DO 541 542 ! PRINT*,'12 OK convect8' 543 ! PRINT*,'WA4 ',wa_moy 544 ! c------------------------------------------------------------------ 545 ! calcul du transport vertical 546 ! ------------------------------------------------------------------ 547 548 GO TO 4444 549 ! PRINT*,'XXXXXXXXXXXXXXX ptimestep= ',ptimestep 550 DO l = 2, nlay - 1 551 DO ig = 1, ngrid 552 IF (fm(ig,l+1)*ptimestep>masse(ig,l) .AND. fm(ig,l+1)*ptimestep>masse( & 553 ig,l+1)) THEN 554 ! PRINT*,'WARN!!! FM>M ig=',ig,' l=',l,' FM=' 555 ! s ,fm(ig,l+1)*ptimestep 556 ! s ,' M=',masse(ig,l),masse(ig,l+1) 557 END IF 558 END DO 559 END DO 560 561 DO l = 1, nlay 562 DO ig = 1, ngrid 563 IF (entr(ig,l)*ptimestep>masse(ig,l)) THEN 564 ! PRINT*,'WARN!!! E>M ig=',ig,' l=',l,' E==' 565 ! s ,entr(ig,l)*ptimestep 566 ! s ,' M=',masse(ig,l) 567 END IF 568 END DO 569 END DO 570 571 DO l = 1, nlay 572 DO ig = 1, ngrid 573 IF (.NOT. fm(ig,l)>=0. .OR. .NOT. fm(ig,l)<=10.) THEN 574 ! PRINT*,'WARN!!! fm exagere ig=',ig,' l=',l 575 ! s ,' FM=',fm(ig,l) 576 END IF 577 IF (.NOT. masse(ig,l)>=1.E-10 .OR. .NOT. masse(ig,l)<=1.E4) THEN 578 ! PRINT*,'WARN!!! masse exagere ig=',ig,' l=',l 579 ! s ,' M=',masse(ig,l) 580 ! PRINT*,'rho(ig,l),pplay(ig,l),zpspsk(ig,l),RD,zh(ig,l)', 581 ! s rho(ig,l),pplay(ig,l),zpspsk(ig,l),RD,zh(ig,l) 582 ! PRINT*,'zlev(ig,l+1),zlev(ig,l)' 583 ! s ,zlev(ig,l+1),zlev(ig,l) 584 ! PRINT*,'pphi(ig,l-1),pphi(ig,l),pphi(ig,l+1)' 585 ! s ,pphi(ig,l-1),pphi(ig,l),pphi(ig,l+1) 586 END IF 587 IF (.NOT. entr(ig,l)>=0. .OR. .NOT. entr(ig,l)<=10.) THEN 588 ! PRINT*,'WARN!!! entr exagere ig=',ig,' l=',l 589 ! s ,' E=',entr(ig,l) 590 END IF 591 END DO 592 END DO 593 594 4444 CONTINUE 595 ! PRINT*,'OK 444 ' 596 597 IF (w2di==1) THEN 598 fm0 = fm0 + ptimestep*(fm-fm0)/tho 599 entr0 = entr0 + ptimestep*(entr-entr0)/tho 600 ELSE 601 fm0 = fm 602 entr0 = entr 603 END IF 604 605 IF (flagdq==0) THEN 606 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zh, zdhadj, & 607 zha) 608 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zo, pdoadj, & 609 zoa) 610 PRINT *, 'THERMALS OPT 1' 611 ELSE IF (flagdq==1) THEN 612 CALL dqthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca, zh, & 613 zdhadj, zha) 614 CALL dqthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca, zo, & 615 pdoadj, zoa) 616 PRINT *, 'THERMALS OPT 2' 617 ELSE 618 CALL thermcell_dq(ngrid, nlay, dqimpl, ptimestep, fm0, entr0, masse, zh, & 619 zdhadj, zha, lev_out) 620 CALL thermcell_dq(ngrid, nlay, dqimpl, ptimestep, fm0, entr0, masse, zo, & 621 pdoadj, zoa, lev_out) 622 PRINT *, 'THERMALS OPT 3', dqimpl 623 END IF 624 625 PRINT *, 'TH VENT ', dvdq 626 IF (dvdq==0) THEN 627 ! PRINT*,'TH VENT OK ',dvdq 628 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zu, pduadj, & 629 zua) 630 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zv, pdvadj, & 631 zva) 632 ELSE IF (dvdq==1) THEN 633 CALL dvthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca, zmax, & 634 zu, zv, pduadj, pdvadj, zua, zva) 635 ELSE IF (dvdq==2) THEN 636 CALL thermcell_dv2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca, & 637 zmax, zu, zv, pduadj, pdvadj, zua, zva, lev_out) 638 ELSE IF (dvdq==3) THEN 639 CALL thermcell_dq(ngrid, nlay, dqimpl, ptimestep, fm0, entr0, masse, zu, & 640 pduadj, zua, lev_out) 641 CALL thermcell_dq(ngrid, nlay, dqimpl, ptimestep, fm0, entr0, masse, zv, & 642 pdvadj, zva, lev_out) 643 END IF 644 645 ! CALL writefield_phy('duadj',pduadj,klev) 646 647 DO l = 1, nlay 648 DO ig = 1, ngrid 649 zf = 0.5*(fracc(ig,l)+fracc(ig,l+1)) 650 zf2 = zf/(1.-zf) 651 thetath2(ig, l) = zf2*(zha(ig,l)-zh(ig,l))**2 652 wth2(ig, l) = zf2*(0.5*(wa_moy(ig,l)+wa_moy(ig,l+1)))**2 653 END DO 654 END DO 655 656 657 658 ! PRINT*,'13 OK convect8' 659 ! PRINT*,'WA5 ',wa_moy 660 DO l = 1, nlay 661 DO ig = 1, ngrid 662 pdtadj(ig, l) = zdhadj(ig, l)*zpspsk(ig, l) 663 END DO 664 END DO 665 666 667 ! do l=1,nlay 668 ! do ig=1,ngrid 669 ! IF(abs(pdtadj(ig,l))*86400..gt.500.) THEN 670 ! PRINT*,'WARN!!! ig=',ig,' l=',l 671 ! s ,' pdtadj=',pdtadj(ig,l) 672 ! END IF 673 ! IF(abs(pdoadj(ig,l))*86400..gt.1.) THEN 674 ! PRINT*,'WARN!!! ig=',ig,' l=',l 675 ! s ,' pdoadj=',pdoadj(ig,l) 676 ! END IF 677 ! enddo 678 ! enddo 679 680 ! PRINT*,'14 OK convect8' 681 ! ------------------------------------------------------------------ 682 ! Calculs pour les sorties 683 ! ------------------------------------------------------------------ 684 685 IF (sorties) THEN 3796 3797 ! calcul du nouveau lmix correspondant 3798 DO ig = 1, ngrid 3799 DO l = 1, klev 3800 IF (zmix(ig)>=zlev(ig, l) .AND. zmix(ig)<zlev(ig, l + 1)) THEN 3801 lmix(ig) = l 3802 END IF 3803 END DO 3804 END DO 3805 3806 DO l = 2, nlay 3807 DO ig = 1, ngrid 3808 IF (larg_cons(ig, l)>1.) THEN 3809 ! PRINT*,ig,l,lmix(ig),lmaxa(ig),larg_cons(ig,l),' KKK' 3810 fraca(ig, l) = (larg_cons(ig, l) - larg_detr(ig, l)) / (r_aspect * zmax(ig)) 3811 ! test 3812 fraca(ig, l) = max(fraca(ig, l), 0.) 3813 fraca(ig, l) = min(fraca(ig, l), 0.5) 3814 fracd(ig, l) = 1. - fraca(ig, l) 3815 fracc(ig, l) = larg_cons(ig, l) / (r_aspect * zmax(ig)) 3816 ELSE 3817 ! wa_moy(ig,l)=0. 3818 fraca(ig, l) = 0. 3819 fracc(ig, l) = 0. 3820 fracd(ig, l) = 1. 3821 END IF 3822 END DO 3823 END DO 3824 ! CR: calcul de fracazmix 3825 DO ig = 1, ngrid 3826 fracazmix(ig) = (fraca(ig, lmix(ig) + 1) - fraca(ig, lmix(ig))) / & 3827 (zlev(ig, lmix(ig) + 1) - zlev(ig, lmix(ig))) * zmix(ig) + & 3828 fraca(ig, lmix(ig)) - zlev(ig, lmix(ig)) * (fraca(ig, lmix(ig) + 1) - fraca(ig & 3829 , lmix(ig))) / (zlev(ig, lmix(ig) + 1) - zlev(ig, lmix(ig))) 3830 END DO 3831 3832 DO l = 2, nlay 3833 DO ig = 1, ngrid 3834 IF (larg_cons(ig, l)>1.) THEN 3835 IF (l>lmix(ig)) THEN 3836 ! test 3837 IF (zmax(ig) - zmix(ig)<1.E-10) THEN 3838 ! PRINT*,'pb xxx' 3839 xxx(ig, l) = (lmaxa(ig) + 1. - l) / (lmaxa(ig) + 1. - lmix(ig)) 3840 ELSE 3841 xxx(ig, l) = (zmax(ig) - zlev(ig, l)) / (zmax(ig) - zmix(ig)) 3842 END IF 3843 IF (idetr==0) THEN 3844 fraca(ig, l) = fracazmix(ig) 3845 ELSE IF (idetr==1) THEN 3846 fraca(ig, l) = fracazmix(ig) * xxx(ig, l) 3847 ELSE IF (idetr==2) THEN 3848 fraca(ig, l) = fracazmix(ig) * (1. - (1. - xxx(ig, l))**2) 3849 ELSE 3850 fraca(ig, l) = fracazmix(ig) * xxx(ig, l)**2 3851 END IF 3852 ! PRINT*,ig,l,lmix(ig),lmaxa(ig),xxx(ig,l),'LLLLLLL' 3853 fraca(ig, l) = max(fraca(ig, l), 0.) 3854 fraca(ig, l) = min(fraca(ig, l), 0.5) 3855 fracd(ig, l) = 1. - fraca(ig, l) 3856 fracc(ig, l) = larg_cons(ig, l) / (r_aspect * zmax(ig)) 3857 END IF 3858 END IF 3859 END DO 3860 END DO 3861 3862 PRINT *, 'fin calcul fraca' 3863 ! PRINT*,'11 OK convect8' 3864 ! PRINT*,'Ea3 ',wa_moy 3865 ! ------------------------------------------------------------------ 3866 ! Calcul de fracd, wd 3867 ! somme wa - wd = 0 3868 ! ------------------------------------------------------------------ 3869 3870 DO ig = 1, ngrid 3871 fm(ig, 1) = 0. 3872 fm(ig, nlay + 1) = 0. 3873 END DO 3874 3875 DO l = 2, nlay 3876 DO ig = 1, ngrid 3877 fm(ig, l) = fraca(ig, l) * wa_moy(ig, l) * rhobarz(ig, l) 3878 ! CR:test 3879 IF (entr(ig, l - 1)<1E-10 .AND. fm(ig, l)>fm(ig, l - 1) .AND. l>lmix(ig)) THEN 3880 fm(ig, l) = fm(ig, l - 1) 3881 ! WRITE(1,*)'ajustement fm, l',l 3882 END IF 3883 ! WRITE(1,*)'ig,l,fm(ig,l)',ig,l,fm(ig,l) 3884 ! RC 3885 END DO 3886 DO ig = 1, ngrid 3887 IF (fracd(ig, l)<0.1) THEN 3888 abort_message = 'fracd trop petit' 3889 CALL abort_physic(modname, abort_message, 1) 3890 ELSE 3891 ! vitesse descendante "diagnostique" 3892 wd(ig, l) = fm(ig, l) / (fracd(ig, l) * rhobarz(ig, l)) 3893 END IF 3894 END DO 3895 END DO 3896 686 3897 DO l = 1, nlay 687 3898 DO ig = 1, ngrid 688 zla(ig, l) = (1.-fracd(ig,l))*zmax(ig) 689 zld(ig, l) = fracd(ig, l)*zmax(ig) 690 IF (1.-fracd(ig,l)>1.E-10) zwa(ig, l) = wd(ig, l)*fracd(ig, l)/ & 691 (1.-fracd(ig,l)) 3899 ! masse(ig,l)=rho(ig,l)*(zlev(ig,l+1)-zlev(ig,l)) 3900 masse(ig, l) = (pplev(ig, l) - pplev(ig, l + 1)) / rg 3901 END DO 3902 END DO 3903 3904 ! PRINT*,'12 OK convect8' 3905 ! PRINT*,'WA4 ',wa_moy 3906 ! c------------------------------------------------------------------ 3907 ! calcul du transport vertical 3908 ! ------------------------------------------------------------------ 3909 3910 GO TO 4444 3911 ! PRINT*,'XXXXXXXXXXXXXXX ptimestep= ',ptimestep 3912 DO l = 2, nlay - 1 3913 DO ig = 1, ngrid 3914 IF (fm(ig, l + 1) * ptimestep>masse(ig, l) .AND. fm(ig, l + 1) * ptimestep>masse(& 3915 ig, l + 1)) THEN 3916 ! PRINT*,'WARN!!! FM>M ig=',ig,' l=',l,' FM=' 3917 ! s ,fm(ig,l+1)*ptimestep 3918 ! s ,' M=',masse(ig,l),masse(ig,l+1) 3919 END IF 692 3920 END DO 693 3921 END DO … … 695 3923 DO l = 1, nlay 696 3924 DO ig = 1, ngrid 697 detr(ig, l) = fm(ig, l) + entr(ig, l) - fm(ig, l+1) 698 IF (detr(ig,l)<0.) THEN 3925 IF (entr(ig, l) * ptimestep>masse(ig, l)) THEN 3926 ! PRINT*,'WARN!!! E>M ig=',ig,' l=',l,' E==' 3927 ! s ,entr(ig,l)*ptimestep 3928 ! s ,' M=',masse(ig,l) 3929 END IF 3930 END DO 3931 END DO 3932 3933 DO l = 1, nlay 3934 DO ig = 1, ngrid 3935 IF (.NOT. fm(ig, l)>=0. .OR. .NOT. fm(ig, l)<=10.) THEN 3936 ! PRINT*,'WARN!!! fm exagere ig=',ig,' l=',l 3937 ! s ,' FM=',fm(ig,l) 3938 END IF 3939 IF (.NOT. masse(ig, l)>=1.E-10 .OR. .NOT. masse(ig, l)<=1.E4) THEN 3940 ! PRINT*,'WARN!!! masse exagere ig=',ig,' l=',l 3941 ! s ,' M=',masse(ig,l) 3942 ! PRINT*,'rho(ig,l),pplay(ig,l),zpspsk(ig,l),RD,zh(ig,l)', 3943 ! s rho(ig,l),pplay(ig,l),zpspsk(ig,l),RD,zh(ig,l) 3944 ! PRINT*,'zlev(ig,l+1),zlev(ig,l)' 3945 ! s ,zlev(ig,l+1),zlev(ig,l) 3946 ! PRINT*,'pphi(ig,l-1),pphi(ig,l),pphi(ig,l+1)' 3947 ! s ,pphi(ig,l-1),pphi(ig,l),pphi(ig,l+1) 3948 END IF 3949 IF (.NOT. entr(ig, l)>=0. .OR. .NOT. entr(ig, l)<=10.) THEN 3950 ! PRINT*,'WARN!!! entr exagere ig=',ig,' l=',l 3951 ! s ,' E=',entr(ig,l) 3952 END IF 3953 END DO 3954 END DO 3955 3956 4444 CONTINUE 3957 3958 ! CR:redefinition du entr 3959 DO l = 1, nlay 3960 DO ig = 1, ngrid 3961 detr(ig, l) = fm(ig, l) + entr(ig, l) - fm(ig, l + 1) 3962 IF (detr(ig, l)<0.) THEN 699 3963 entr(ig, l) = entr(ig, l) - detr(ig, l) 700 3964 detr(ig, l) = 0. … … 703 3967 END DO 704 3968 END DO 705 END IF 706 707 ! PRINT*,'15 OK convect8' 708 709 710 ! IF(wa_moy(1,4).gt.1.e-10) stop 711 712 ! PRINT*,'19 OK convect8' 713 714 END SUBROUTINE thermcell_2002 715 716 SUBROUTINE thermcell_cld(ngrid, nlay, ptimestep, pplay, pplev, pphi, zlev, & 717 debut, pu, pv, pt, po, pduadj, pdvadj, pdtadj, pdoadj, fm0, entr0, zqla, & 718 lmax, zmax_sec, wmax_sec, zw_sec, lmix_sec, ratqscth, ratqsdiff & ! s 719 ! ,pu_therm,pv_therm 720 , r_aspect, l_mix, w2di, tho) 721 722 USE dimphy 723 IMPLICIT NONE 724 725 ! ======================================================================= 726 727 ! Calcul du transport verticale dans la couche limite en presence 728 ! de "thermiques" explicitement representes 729 730 ! Réécriture à partir d'un listing papier à Habas, le 14/02/00 731 732 ! le thermique est supposé homogène et dissipé par mélange avec 733 ! son environnement. la longueur l_mix contrôle l'efficacité du 734 ! mélange 735 736 ! Le calcul du transport des différentes espèces se fait en prenant 737 ! en compte: 738 ! 1. un flux de masse montant 739 ! 2. un flux de masse descendant 740 ! 3. un entrainement 741 ! 4. un detrainement 742 743 ! ======================================================================= 744 745 ! ----------------------------------------------------------------------- 746 ! declarations: 747 ! ------------- 748 749 include "YOMCST.h" 750 include "YOETHF.h" 751 include "FCTTRE.h" 752 753 ! arguments: 754 ! ---------- 755 756 INTEGER ngrid, nlay, w2di 757 REAL tho 758 REAL ptimestep, l_mix, r_aspect 759 REAL pt(ngrid, nlay), pdtadj(ngrid, nlay) 760 REAL pu(ngrid, nlay), pduadj(ngrid, nlay) 761 REAL pv(ngrid, nlay), pdvadj(ngrid, nlay) 762 REAL po(ngrid, nlay), pdoadj(ngrid, nlay) 763 REAL pplay(ngrid, nlay), pplev(ngrid, nlay+1) 764 REAL pphi(ngrid, nlay) 765 766 INTEGER idetr 767 SAVE idetr 768 DATA idetr/3/ 769 !$OMP THREADPRIVATE(idetr) 770 771 ! local: 772 ! ------ 773 774 INTEGER ig, k, l, lmaxa(klon), lmix(klon) 775 REAL zsortie1d(klon) 776 ! CR: on remplace lmax(klon,klev+1) 777 INTEGER lmax(klon), lmin(klon), lentr(klon) 778 REAL linter(klon) 779 REAL zmix(klon), fracazmix(klon) 780 REAL alpha 781 SAVE alpha 782 DATA alpha/1./ 783 !$OMP THREADPRIVATE(alpha) 784 785 ! RC 786 REAL zmax(klon), zw, zz, zw2(klon, klev+1), ztva(klon, klev), zzz 787 REAL zmax_sec(klon) 788 REAL zmax_sec2(klon) 789 REAL zw_sec(klon, klev+1) 790 INTEGER lmix_sec(klon) 791 REAL w_est(klon, klev+1) 792 ! on garde le zmax du pas de temps precedent 793 ! real zmax0(klon) 794 ! save zmax0 795 ! real zmix0(klon) 796 ! save zmix0 797 REAL, SAVE, ALLOCATABLE :: zmax0(:), zmix0(:) 798 !$OMP THREADPRIVATE(zmax0, zmix0) 799 800 REAL zlev(klon, klev+1), zlay(klon, klev) 801 REAL deltaz(klon, klev) 802 REAL zh(klon, klev), zdhadj(klon, klev) 803 REAL zthl(klon, klev), zdthladj(klon, klev) 804 REAL ztv(klon, klev) 805 REAL zu(klon, klev), zv(klon, klev), zo(klon, klev) 806 REAL zl(klon, klev) 807 REAL wh(klon, klev+1) 808 REAL wu(klon, klev+1), wv(klon, klev+1), wo(klon, klev+1) 809 REAL zla(klon, klev+1) 810 REAL zwa(klon, klev+1) 811 REAL zld(klon, klev+1) 812 REAL zwd(klon, klev+1) 813 REAL zsortie(klon, klev) 814 REAL zva(klon, klev) 815 REAL zua(klon, klev) 816 REAL zoa(klon, klev) 817 818 REAL zta(klon, klev) 819 REAL zha(klon, klev) 820 REAL wa_moy(klon, klev+1) 821 REAL fraca(klon, klev+1) 822 REAL fracc(klon, klev+1) 823 REAL zf, zf2 824 REAL thetath2(klon, klev), wth2(klon, klev), wth3(klon, klev) 825 REAL q2(klon, klev) 826 REAL dtheta(klon, klev) 827 ! common/comtherm/thetath2,wth2 828 829 REAL ratqscth(klon, klev) 830 REAL sum 831 REAL sumdiff 832 REAL ratqsdiff(klon, klev) 833 REAL count_time 834 INTEGER ialt 835 836 LOGICAL sorties 837 REAL rho(klon, klev), rhobarz(klon, klev+1), masse(klon, klev) 838 REAL zpspsk(klon, klev) 839 840 ! real wmax(klon,klev),wmaxa(klon) 841 REAL wmax(klon), wmaxa(klon) 842 REAL wmax_sec(klon) 843 REAL wmax_sec2(klon) 844 REAL wa(klon, klev, klev+1) 845 REAL wd(klon, klev+1) 846 REAL larg_part(klon, klev, klev+1) 847 REAL fracd(klon, klev+1) 848 REAL xxx(klon, klev+1) 849 REAL larg_cons(klon, klev+1) 850 REAL larg_detr(klon, klev+1) 851 REAL fm0(klon, klev+1), entr0(klon, klev), detr(klon, klev) 852 REAL massetot(klon, klev) 853 REAL detr0(klon, klev) 854 REAL alim0(klon, klev) 855 REAL pu_therm(klon, klev), pv_therm(klon, klev) 856 REAL fm(klon, klev+1), entr(klon, klev) 857 REAL fmc(klon, klev+1) 858 859 REAL zcor, zdelta, zcvm5, qlbef 860 REAL tbef(klon), qsatbef(klon) 861 REAL dqsat_dt, dt, num, denom 862 REAL reps, rlvcp, ddt0 863 REAL ztla(klon, klev), zqla(klon, klev), zqta(klon, klev) 864 ! CR niveau de condensation 865 REAL nivcon(klon) 866 REAL zcon(klon) 867 REAL zqsat(klon, klev) 868 REAL zqsatth(klon, klev) 869 PARAMETER (ddt0=.01) 870 871 872 ! CR:nouvelles variables 873 REAL f_star(klon, klev+1), entr_star(klon, klev) 874 REAL detr_star(klon, klev) 875 REAL alim_star_tot(klon), alim_star2(klon) 876 REAL entr_star_tot(klon) 877 REAL detr_star_tot(klon) 878 REAL alim_star(klon, klev) 879 REAL alim(klon, klev) 880 REAL nu(klon, klev) 881 REAL nu_e(klon, klev) 882 REAL nu_min 883 REAL nu_max 884 REAL nu_r 885 REAL f(klon) 886 ! real f(klon), f0(klon) 887 ! save f0 888 REAL, SAVE, ALLOCATABLE :: f0(:) 889 !$OMP THREADPRIVATE(f0) 890 891 REAL f_old 892 REAL zlevinter(klon) 893 LOGICAL, SAVE :: first = .TRUE. 894 !$OMP THREADPRIVATE(first) 895 ! data first /.FALSE./ 896 ! save first 897 LOGICAL nuage 898 ! save nuage 899 LOGICAL boucle 900 LOGICAL therm 901 LOGICAL debut 902 LOGICAL rale 903 INTEGER test(klon) 904 INTEGER signe_zw2 905 ! RC 906 907 CHARACTER *2 str2 908 CHARACTER *10 str10 909 910 CHARACTER (LEN=20) :: modname = 'thermcell_cld' 911 CHARACTER (LEN=80) :: abort_message 912 913 LOGICAL vtest(klon), down 914 LOGICAL zsat(klon) 915 916 EXTERNAL scopy 917 918 INTEGER ncorrec, ll 919 SAVE ncorrec 920 DATA ncorrec/0/ 921 !$OMP THREADPRIVATE(ncorrec) 922 923 924 925 ! ----------------------------------------------------------------------- 926 ! initialisation: 927 ! --------------- 928 929 IF (first) THEN 930 ALLOCATE (zmix0(klon)) 931 ALLOCATE (zmax0(klon)) 932 ALLOCATE (f0(klon)) 933 first = .FALSE. 934 END IF 935 936 sorties = .FALSE. 937 ! PRINT*,'NOUVEAU DETR PLUIE ' 938 IF (ngrid/=klon) THEN 939 PRINT * 940 PRINT *, 'STOP dans convadj' 941 PRINT *, 'ngrid =', ngrid 942 PRINT *, 'klon =', klon 943 END IF 944 945 ! Initialisation 946 rlvcp = rlvtt/rcpd 947 reps = rd/rv 948 ! initialisations de zqsat 949 DO ll = 1, nlay 950 DO ig = 1, ngrid 951 zqsat(ig, ll) = 0. 952 zqsatth(ig, ll) = 0. 953 END DO 954 END DO 955 956 ! on met le first a true pour le premier passage de la journée 957 DO ig = 1, klon 958 test(ig) = 0 959 END DO 960 IF (debut) THEN 961 DO ig = 1, klon 962 test(ig) = 1 963 f0(ig) = 0. 964 zmax0(ig) = 0. 965 END DO 966 END IF 967 DO ig = 1, klon 968 IF ((.NOT. debut) .AND. (f0(ig)<1.E-10)) THEN 969 test(ig) = 1 3969 ! RC 3970 IF (w2di==1) THEN 3971 fm0 = fm0 + ptimestep * (fm - fm0) / tho 3972 entr0 = entr0 + ptimestep * (entr - entr0) / tho 3973 ELSE 3974 fm0 = fm 3975 entr0 = entr 970 3976 END IF 971 END DO 972 ! do ig=1,klon 973 ! PRINT*,'test(ig)',test(ig),zmax0(ig) 974 ! enddo 975 nuage = .FALSE. 976 ! ----------------------------------------------------------------------- 977 ! AM Calcul de T,q,ql a partir de Tl et qT 978 ! --------------------------------------------------- 979 980 ! Pr Tprec=Tl calcul de qsat 981 ! Si qsat>qT T=Tl, q=qT 982 ! Sinon DDT=(-Tprec+Tl+RLVCP (qT-qsat(T')) / (1+RLVCP dqsat/dt) 983 ! On cherche DDT < DDT0 984 985 ! defaut 986 DO ll = 1, nlay 987 DO ig = 1, ngrid 988 zo(ig, ll) = po(ig, ll) 989 zl(ig, ll) = 0. 990 zh(ig, ll) = pt(ig, ll) 991 END DO 992 END DO 993 DO ig = 1, ngrid 994 zsat(ig) = .FALSE. 995 END DO 996 997 998 DO ll = 1, nlay 999 ! les points insatures sont definitifs 1000 DO ig = 1, ngrid 1001 tbef(ig) = pt(ig, ll) 1002 zdelta = max(0., sign(1.,rtt-tbef(ig))) 1003 qsatbef(ig) = r2es*foeew(tbef(ig), zdelta)/pplev(ig, ll) 1004 qsatbef(ig) = min(0.5, qsatbef(ig)) 1005 zcor = 1./(1.-retv*qsatbef(ig)) 1006 qsatbef(ig) = qsatbef(ig)*zcor 1007 zsat(ig) = (max(0.,po(ig,ll)-qsatbef(ig))>1.E-10) 1008 END DO 1009 1010 DO ig = 1, ngrid 1011 IF (zsat(ig) .AND. (1==1)) THEN 1012 qlbef = max(0., po(ig,ll)-qsatbef(ig)) 1013 ! si sature: ql est surestime, d'ou la sous-relax 1014 dt = 0.5*rlvcp*qlbef 1015 ! WRITE(18,*) 'DT0=',DT 1016 ! on pourra enchainer 2 ou 3 calculs sans Do while 1017 DO WHILE (abs(dt)>ddt0) 1018 ! il faut verifier si c,a conserve quand on repasse en insature ... 1019 tbef(ig) = tbef(ig) + dt 1020 zdelta = max(0., sign(1.,rtt-tbef(ig))) 1021 qsatbef(ig) = r2es*foeew(tbef(ig), zdelta)/pplev(ig, ll) 1022 qsatbef(ig) = min(0.5, qsatbef(ig)) 1023 zcor = 1./(1.-retv*qsatbef(ig)) 1024 qsatbef(ig) = qsatbef(ig)*zcor 1025 ! on veut le signe de qlbef 1026 qlbef = po(ig, ll) - qsatbef(ig) 1027 zdelta = max(0., sign(1.,rtt-tbef(ig))) 1028 zcvm5 = r5les*(1.-zdelta) + r5ies*zdelta 1029 zcor = 1./(1.-retv*qsatbef(ig)) 1030 dqsat_dt = foede(tbef(ig), zdelta, zcvm5, qsatbef(ig), zcor) 1031 num = -tbef(ig) + pt(ig, ll) + rlvcp*qlbef 1032 denom = 1. + rlvcp*dqsat_dt 1033 IF (denom<1.E-10) THEN 1034 PRINT *, 'pb denom' 1035 END IF 1036 dt = num/denom 1037 END DO 1038 ! on ecrit de maniere conservative (sat ou non) 1039 zl(ig, ll) = max(0., qlbef) 1040 ! T = Tl +Lv/Cp ql 1041 zh(ig, ll) = pt(ig, ll) + rlvcp*zl(ig, ll) 1042 zo(ig, ll) = po(ig, ll) - zl(ig, ll) 1043 END IF 1044 ! on ecrit zqsat 1045 zqsat(ig, ll) = qsatbef(ig) 1046 END DO 1047 END DO 1048 ! AM fin 1049 1050 ! ----------------------------------------------------------------------- 1051 ! incrementation eventuelle de tendances precedentes: 1052 ! --------------------------------------------------- 1053 1054 ! PRINT*,'0 OK convect8' 1055 1056 DO l = 1, nlay 1057 DO ig = 1, ngrid 1058 zpspsk(ig, l) = (pplay(ig,l)/100000.)**rkappa 1059 ! zpspsk(ig,l)=(pplay(ig,l)/pplev(ig,1))**RKAPPA 1060 ! zh(ig,l)=pt(ig,l)/zpspsk(ig,l) 1061 zu(ig, l) = pu(ig, l) 1062 zv(ig, l) = pv(ig, l) 1063 ! zo(ig,l)=po(ig,l) 1064 ! ztv(ig,l)=zh(ig,l)*(1.+0.61*zo(ig,l)) 1065 ! AM attention zh est maintenant le profil de T et plus le profil de 1066 ! theta ! 1067 1068 ! T-> Theta 1069 ztv(ig, l) = zh(ig, l)/zpspsk(ig, l) 1070 ! AM Theta_v 1071 ztv(ig, l) = ztv(ig, l)*(1.+retv*(zo(ig,l))-zl(ig,l)) 1072 ! AM Thetal 1073 zthl(ig, l) = pt(ig, l)/zpspsk(ig, l) 1074 1075 END DO 1076 END DO 1077 1078 ! PRINT*,'1 OK convect8' 1079 ! -------------------- 1080 1081 1082 ! + + + + + + + + + + + 1083 1084 1085 ! wa, fraca, wd, fracd -------------------- zlev(2), rhobarz 1086 ! wh,wt,wo ... 1087 1088 ! + + + + + + + + + + + zh,zu,zv,zo,rho 1089 1090 1091 ! -------------------- zlev(1) 1092 ! \\\\\\\\\\\\\\\\\\\\ 1093 1094 1095 1096 ! ----------------------------------------------------------------------- 1097 ! Calcul des altitudes des couches 1098 ! ----------------------------------------------------------------------- 1099 1100 DO l = 2, nlay 1101 DO ig = 1, ngrid 1102 zlev(ig, l) = 0.5*(pphi(ig,l)+pphi(ig,l-1))/rg 1103 END DO 1104 END DO 1105 DO ig = 1, ngrid 1106 zlev(ig, 1) = 0. 1107 zlev(ig, nlay+1) = (2.*pphi(ig,klev)-pphi(ig,klev-1))/rg 1108 END DO 1109 DO l = 1, nlay 1110 DO ig = 1, ngrid 1111 zlay(ig, l) = pphi(ig, l)/rg 1112 END DO 1113 END DO 1114 ! calcul de deltaz 1115 DO l = 1, nlay 1116 DO ig = 1, ngrid 1117 deltaz(ig, l) = zlev(ig, l+1) - zlev(ig, l) 1118 END DO 1119 END DO 1120 1121 ! PRINT*,'2 OK convect8' 1122 ! ----------------------------------------------------------------------- 1123 ! Calcul des densites 1124 ! ----------------------------------------------------------------------- 1125 1126 DO l = 1, nlay 1127 DO ig = 1, ngrid 1128 ! rho(ig,l)=pplay(ig,l)/(zpspsk(ig,l)*RD*zh(ig,l)) 1129 rho(ig, l) = pplay(ig, l)/(zpspsk(ig,l)*rd*ztv(ig,l)) 1130 END DO 1131 END DO 1132 1133 DO l = 2, nlay 1134 DO ig = 1, ngrid 1135 rhobarz(ig, l) = 0.5*(rho(ig,l)+rho(ig,l-1)) 1136 END DO 1137 END DO 1138 1139 DO k = 1, nlay 1140 DO l = 1, nlay + 1 1141 DO ig = 1, ngrid 1142 wa(ig, k, l) = 0. 1143 END DO 1144 END DO 1145 END DO 1146 ! Cr:ajout:calcul de la masse 1147 DO l = 1, nlay 1148 DO ig = 1, ngrid 1149 ! masse(ig,l)=rho(ig,l)*(zlev(ig,l+1)-zlev(ig,l)) 1150 masse(ig, l) = (pplev(ig,l)-pplev(ig,l+1))/rg 1151 END DO 1152 END DO 1153 ! PRINT*,'3 OK convect8' 1154 ! ------------------------------------------------------------------ 1155 ! Calcul de w2, quarre de w a partir de la cape 1156 ! a partir de w2, on calcule wa, vitesse de l'ascendance 1157 1158 ! ATTENTION: Dans cette version, pour cause d'economie de memoire, 1159 ! w2 est stoke dans wa 1160 1161 ! ATTENTION: dans convect8, on n'utilise le calcule des wa 1162 ! independants par couches que pour calculer l'entrainement 1163 ! a la base et la hauteur max de l'ascendance. 1164 1165 ! Indicages: 1166 ! l'ascendance provenant du niveau k traverse l'interface l avec 1167 ! une vitesse wa(k,l). 1168 1169 ! -------------------- 1170 1171 ! + + + + + + + + + + 1172 1173 ! wa(k,l) ---- -------------------- l 1174 ! /\ 1175 ! /||\ + + + + + + + + + + 1176 ! || 1177 ! || -------------------- 1178 ! || 1179 ! || + + + + + + + + + + 1180 ! || 1181 ! || -------------------- 1182 ! ||__ 1183 ! |___ + + + + + + + + + + k 1184 1185 ! -------------------- 1186 1187 1188 1189 ! ------------------------------------------------------------------ 1190 1191 ! CR: ponderation entrainement des couches instables 1192 ! def des alim_star tels que alim=f*alim_star 1193 DO l = 1, klev 1194 DO ig = 1, ngrid 1195 alim_star(ig, l) = 0. 1196 alim(ig, l) = 0. 1197 END DO 1198 END DO 1199 ! determination de la longueur de la couche d entrainement 1200 DO ig = 1, ngrid 1201 lentr(ig) = 1 1202 END DO 1203 1204 ! on ne considere que les premieres couches instables 1205 therm = .FALSE. 1206 DO k = nlay - 2, 1, -1 1207 DO ig = 1, ngrid 1208 IF (ztv(ig,k)>ztv(ig,k+1) .AND. ztv(ig,k+1)<=ztv(ig,k+2)) THEN 1209 lentr(ig) = k + 1 1210 therm = .TRUE. 1211 END IF 1212 END DO 1213 END DO 1214 1215 ! determination du lmin: couche d ou provient le thermique 1216 DO ig = 1, ngrid 1217 lmin(ig) = 1 1218 END DO 1219 DO ig = 1, ngrid 1220 DO l = nlay, 2, -1 1221 IF (ztv(ig,l-1)>ztv(ig,l)) THEN 1222 lmin(ig) = l - 1 1223 END IF 1224 END DO 1225 END DO 1226 1227 ! definition de l'entrainement des couches 1228 DO l = 1, klev - 1 1229 DO ig = 1, ngrid 1230 IF (ztv(ig,l)>ztv(ig,l+1) .AND. l>=lmin(ig) .AND. l<lentr(ig)) THEN 1231 ! def possibles pour alim_star: zdthetadz, dthetadz, zdtheta 1232 alim_star(ig, l) = max((ztv(ig,l)-ztv(ig,l+1)), 0.) & ! s 1233 ! *(zlev(ig,l+1)-zlev(ig,l)) 1234 *sqrt(zlev(ig,l+1)) 1235 ! alim_star(ig,l)=zlev(ig,l+1)*(1.-(zlev(ig,l+1) 1236 ! s /zlev(ig,lentr(ig)+2)))**(3./2.) 1237 END IF 1238 END DO 1239 END DO 1240 1241 ! pas de thermique si couche 1 stable 1242 DO ig = 1, ngrid 1243 ! if (lmin(ig).gt.1) THEN 1244 ! CRnouveau test 1245 IF (alim_star(ig,1)<1.E-10) THEN 1246 DO l = 1, klev 1247 alim_star(ig, l) = 0. 1248 END DO 3977 3978 IF (1==1) THEN 3979 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zh, zdhadj, & 3980 zha) 3981 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zo, pdoadj, & 3982 zoa) 3983 ELSE 3984 CALL dqthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca, zh, & 3985 zdhadj, zha) 3986 CALL dqthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca, zo, & 3987 pdoadj, zoa) 1249 3988 END IF 1250 END DO 1251 ! calcul de l entrainement total 1252 DO ig = 1, ngrid 1253 alim_star_tot(ig) = 0. 1254 entr_star_tot(ig) = 0. 1255 detr_star_tot(ig) = 0. 1256 END DO 1257 DO ig = 1, ngrid 1258 DO k = 1, klev 1259 alim_star_tot(ig) = alim_star_tot(ig) + alim_star(ig, k) 1260 END DO 1261 END DO 1262 1263 ! Calcul entrainement normalise 1264 DO ig = 1, ngrid 1265 IF (alim_star_tot(ig)>1.E-10) THEN 1266 ! do l=1,lentr(ig) 1267 DO l = 1, klev 1268 ! def possibles pour entr_star: zdthetadz, dthetadz, zdtheta 1269 alim_star(ig, l) = alim_star(ig, l)/alim_star_tot(ig) 1270 END DO 3989 3990 IF (1==0) THEN 3991 CALL dvthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca, zmax, & 3992 zu, zv, pduadj, pdvadj, zua, zva) 3993 ELSE 3994 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zu, pduadj, & 3995 zua) 3996 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zv, pdvadj, & 3997 zva) 1271 3998 END IF 1272 END DO 1273 1274 ! PRINT*,'fin calcul alim_star' 1275 1276 ! AM:initialisations 1277 DO k = 1, nlay 1278 DO ig = 1, ngrid 1279 ztva(ig, k) = ztv(ig, k) 1280 ztla(ig, k) = zthl(ig, k) 1281 zqla(ig, k) = 0. 1282 zqta(ig, k) = po(ig, k) 1283 zsat(ig) = .FALSE. 1284 END DO 1285 END DO 1286 DO k = 1, klev 1287 DO ig = 1, ngrid 1288 detr_star(ig, k) = 0. 1289 entr_star(ig, k) = 0. 1290 detr(ig, k) = 0. 1291 entr(ig, k) = 0. 1292 END DO 1293 END DO 1294 ! PRINT*,'7 OK convect8' 1295 DO k = 1, klev + 1 1296 DO ig = 1, ngrid 1297 zw2(ig, k) = 0. 1298 fmc(ig, k) = 0. 1299 ! CR 1300 f_star(ig, k) = 0. 1301 ! RC 1302 larg_cons(ig, k) = 0. 1303 larg_detr(ig, k) = 0. 1304 wa_moy(ig, k) = 0. 1305 END DO 1306 END DO 1307 1308 ! n PRINT*,'8 OK convect8' 1309 DO ig = 1, ngrid 1310 linter(ig) = 1. 1311 lmaxa(ig) = 1 1312 lmix(ig) = 1 1313 wmaxa(ig) = 0. 1314 END DO 1315 1316 nu_min = l_mix 1317 nu_max = 1000. 1318 ! do ig=1,ngrid 1319 ! nu_max=wmax_sec(ig) 1320 ! enddo 1321 DO ig = 1, ngrid 1322 DO k = 1, klev 1323 nu(ig, k) = 0. 1324 nu_e(ig, k) = 0. 1325 END DO 1326 END DO 1327 ! Calcul de l'excès de température du à la diffusion turbulente 1328 DO ig = 1, ngrid 1329 DO l = 1, klev 1330 dtheta(ig, l) = 0. 1331 END DO 1332 END DO 1333 DO ig = 1, ngrid 1334 DO l = 1, lentr(ig) - 1 1335 dtheta(ig, l) = sqrt(10.*0.4*zlev(ig,l+1)**2*1.*((ztv(ig,l+1)- & 1336 ztv(ig,l))/(zlev(ig,l+1)-zlev(ig,l)))**2) 1337 END DO 1338 END DO 1339 ! do l=1,nlay-2 1340 DO l = 1, klev - 1 1341 DO ig = 1, ngrid 1342 IF (ztv(ig,l)>ztv(ig,l+1) .AND. alim_star(ig,l)>1.E-10 .AND. & 1343 zw2(ig,l)<1E-10) THEN 1344 ! AM 1345 ! test:on rajoute un excès de T dans couche alim 1346 ! ztla(ig,l)=zthl(ig,l)+dtheta(ig,l) 1347 ztla(ig, l) = zthl(ig, l) 1348 ! test: on rajoute un excès de q dans la couche alim 1349 ! zqta(ig,l)=po(ig,l)+0.001 1350 zqta(ig, l) = po(ig, l) 1351 zqla(ig, l) = zl(ig, l) 1352 ! AM 1353 f_star(ig, l+1) = alim_star(ig, l) 1354 ! test:calcul de dteta 1355 zw2(ig, l+1) = 2.*rg*(ztv(ig,l)-ztv(ig,l+1))/ztv(ig, l+1)* & 1356 (zlev(ig,l+1)-zlev(ig,l))*0.4*pphi(ig, l)/(pphi(ig,l+1)-pphi(ig,l)) 1357 w_est(ig, l+1) = zw2(ig, l+1) 1358 larg_detr(ig, l) = 0. 1359 ! PRINT*,'coucou boucle 1' 1360 ELSE IF ((zw2(ig,l)>=1E-10) .AND. (f_star(ig,l)+alim_star(ig, & 1361 l))>1.E-10) THEN 1362 ! PRINT*,'coucou boucle 2' 1363 ! estimation du detrainement a partir de la geometrie du pas 1364 ! precedent 1365 IF ((test(ig)==1) .OR. ((.NOT. debut) .AND. (f0(ig)<1.E-10))) THEN 1366 detr_star(ig, l) = 0. 1367 entr_star(ig, l) = 0. 1368 ! PRINT*,'coucou test(ig)',test(ig),f0(ig),zmax0(ig) 1369 ELSE 1370 ! PRINT*,'coucou debut detr' 1371 ! tests sur la definition du detr 1372 IF (zqla(ig,l-1)>1.E-10) THEN 1373 nuage = .TRUE. 1374 END IF 1375 1376 w_est(ig, l+1) = zw2(ig, l)*((f_star(ig,l))**2)/(f_star(ig,l)+ & 1377 alim_star(ig,l))**2 + 2.*rg*(ztva(ig,l-1)-ztv(ig,l))/ztv(ig, l)*( & 1378 zlev(ig,l+1)-zlev(ig,l)) 1379 IF (w_est(ig,l+1)<0.) THEN 1380 w_est(ig, l+1) = zw2(ig, l) 1381 END IF 1382 IF (l>2) THEN 1383 IF ((w_est(ig,l+1)>w_est(ig,l)) .AND. (zlev(ig, & 1384 l+1)<zmax_sec(ig)) .AND. (zqla(ig,l-1)<1.E-10)) THEN 1385 detr_star(ig, l) = max(0., (rhobarz(ig, & 1386 l+1)*sqrt(w_est(ig,l+1))*sqrt(nu(ig,l)* & 1387 zlev(ig,l+1))-rhobarz(ig,l)*sqrt(w_est(ig,l))*sqrt(nu(ig,l)* & 1388 zlev(ig,l)))/(r_aspect*zmax_sec(ig))) 1389 ELSE IF ((zlev(ig,l+1)<zmax_sec(ig)) .AND. (zqla(ig, & 1390 l-1)<1.E-10)) THEN 1391 detr_star(ig, l) = -f0(ig)*f_star(ig, lmix(ig))/(rhobarz(ig, & 1392 lmix(ig))*wmaxa(ig))*(rhobarz(ig,l+1)*sqrt(w_est(ig, & 1393 l+1))*((zmax_sec(ig)-zlev(ig,l+1))/((zmax_sec(ig)-zlev(ig, & 1394 lmix(ig)))))**2.-rhobarz(ig,l)*sqrt(w_est(ig, & 1395 l))*((zmax_sec(ig)-zlev(ig,l))/((zmax_sec(ig)-zlev(ig,lmix(ig & 1396 )))))**2.) 1397 ELSE 1398 detr_star(ig, l) = 0.002*f0(ig)*f_star(ig, l)* & 1399 (zlev(ig,l+1)-zlev(ig,l)) 1400 1401 END IF 1402 ELSE 1403 detr_star(ig, l) = 0. 1404 END IF 1405 1406 detr_star(ig, l) = detr_star(ig, l)/f0(ig) 1407 IF (nuage) THEN 1408 entr_star(ig, l) = 0.4*detr_star(ig, l) 1409 ELSE 1410 entr_star(ig, l) = 0.4*detr_star(ig, l) 1411 END IF 1412 1413 IF ((detr_star(ig,l))>f_star(ig,l)) THEN 1414 detr_star(ig, l) = f_star(ig, l) 1415 ! entr_star(ig,l)=0. 1416 END IF 1417 1418 IF ((l<lentr(ig))) THEN 1419 entr_star(ig, l) = 0. 1420 ! detr_star(ig,l)=0. 1421 END IF 1422 1423 ! PRINT*,'ok detr_star' 1424 END IF 1425 ! prise en compte du detrainement dans le calcul du flux 1426 f_star(ig, l+1) = f_star(ig, l) + alim_star(ig, l) + & 1427 entr_star(ig, l) - detr_star(ig, l) 1428 ! test 1429 ! if (f_star(ig,l+1).lt.0.) THEN 1430 ! f_star(ig,l+1)=0. 1431 ! entr_star(ig,l)=0. 1432 ! detr_star(ig,l)=f_star(ig,l)+alim_star(ig,l) 1433 ! END IF 1434 ! test sur le signe de f_star 1435 IF (f_star(ig,l+1)>1.E-10) THEN 1436 ! THEN 1437 ! test 1438 ! if (((f_star(ig,l+1)+detr_star(ig,l)).gt.1.e-10)) THEN 1439 ! AM on melange Tl et qt du thermique 1440 ! on rajoute un excès de T dans la couche alim 1441 ! if (l.lt.lentr(ig)) THEN 1442 ! ztla(ig,l)=(f_star(ig,l)*ztla(ig,l-1)+ 1443 ! s 1444 ! (alim_star(ig,l)+entr_star(ig,l))*(zthl(ig,l)+dtheta(ig,l))) 1445 ! s /(f_star(ig,l+1)+detr_star(ig,l)) 1446 ! else 1447 ztla(ig, l) = (f_star(ig,l)*ztla(ig,l-1)+(alim_star(ig, & 1448 l)+entr_star(ig,l))*zthl(ig,l))/(f_star(ig,l+1)+detr_star(ig,l)) 1449 ! s /(f_star(ig,l+1)) 1450 ! END IF 1451 ! on rajoute un excès de q dans la couche alim 1452 ! if (l.lt.lentr(ig)) THEN 1453 ! zqta(ig,l)=(f_star(ig,l)*zqta(ig,l-1)+ 1454 ! s (alim_star(ig,l)+entr_star(ig,l))*(po(ig,l)+0.001)) 1455 ! s /(f_star(ig,l+1)+detr_star(ig,l)) 1456 ! else 1457 zqta(ig, l) = (f_star(ig,l)*zqta(ig,l-1)+(alim_star(ig, & 1458 l)+entr_star(ig,l))*po(ig,l))/(f_star(ig,l+1)+detr_star(ig,l)) 1459 ! s /(f_star(ig,l+1)) 1460 ! END IF 1461 ! AM on en deduit thetav et ql du thermique 1462 ! CR test 1463 ! Tbef(ig)=ztla(ig,l)*zpspsk(ig,l) 1464 tbef(ig) = ztla(ig, l)*zpspsk(ig, l) 1465 zdelta = max(0., sign(1.,rtt-tbef(ig))) 1466 qsatbef(ig) = r2es*foeew(tbef(ig), zdelta)/pplev(ig, l) 1467 qsatbef(ig) = min(0.5, qsatbef(ig)) 1468 zcor = 1./(1.-retv*qsatbef(ig)) 1469 qsatbef(ig) = qsatbef(ig)*zcor 1470 zsat(ig) = (max(0.,zqta(ig,l)-qsatbef(ig))>1.E-10) 1471 1472 IF (zsat(ig) .AND. (1==1)) THEN 1473 qlbef = max(0., zqta(ig,l)-qsatbef(ig)) 1474 dt = 0.5*rlvcp*qlbef 1475 ! WRITE(17,*)'DT0=',DT 1476 DO WHILE (abs(dt)>ddt0) 1477 ! PRINT*,'aie' 1478 tbef(ig) = tbef(ig) + dt 1479 zdelta = max(0., sign(1.,rtt-tbef(ig))) 1480 qsatbef(ig) = r2es*foeew(tbef(ig), zdelta)/pplev(ig, l) 1481 qsatbef(ig) = min(0.5, qsatbef(ig)) 1482 zcor = 1./(1.-retv*qsatbef(ig)) 1483 qsatbef(ig) = qsatbef(ig)*zcor 1484 qlbef = zqta(ig, l) - qsatbef(ig) 1485 1486 zdelta = max(0., sign(1.,rtt-tbef(ig))) 1487 zcvm5 = r5les*(1.-zdelta) + r5ies*zdelta 1488 zcor = 1./(1.-retv*qsatbef(ig)) 1489 dqsat_dt = foede(tbef(ig), zdelta, zcvm5, qsatbef(ig), zcor) 1490 num = -tbef(ig) + ztla(ig, l)*zpspsk(ig, l) + rlvcp*qlbef 1491 denom = 1. + rlvcp*dqsat_dt 1492 IF (denom<1.E-10) THEN 1493 PRINT *, 'pb denom' 1494 END IF 1495 dt = num/denom 1496 ! WRITE(17,*)'DT=',DT 1497 END DO 1498 zqla(ig, l) = max(0., zqta(ig,l)-qsatbef(ig)) 1499 zqla(ig, l) = max(0., qlbef) 1500 ! zqla(ig,l)=0. 1501 END IF 1502 ! zqla(ig,l) = max(0.,zqta(ig,l)-qsatbef(ig)) 1503 1504 ! on ecrit de maniere conservative (sat ou non) 1505 ! T = Tl +Lv/Cp ql 1506 ! CR rq utilisation de humidite specifique ou rapport de melange? 1507 ztva(ig, l) = ztla(ig, l)*zpspsk(ig, l) + rlvcp*zqla(ig, l) 1508 ztva(ig, l) = ztva(ig, l)/zpspsk(ig, l) 1509 ! on rajoute le calcul de zha pour diagnostiques (temp potentielle) 1510 zha(ig, l) = ztva(ig, l) 1511 ! if (l.lt.lentr(ig)) THEN 1512 ! ztva(ig,l) = ztva(ig,l)*(1.+RETV*(zqta(ig,l) 1513 ! s -zqla(ig,l))-zqla(ig,l)) + 0.1 1514 ! else 1515 ztva(ig, l) = ztva(ig, l)*(1.+retv*(zqta(ig,l)-zqla(ig, & 1516 l))-zqla(ig,l)) 1517 ! END IF 1518 ! ztva(ig,l) = ztla(ig,l)*zpspsk(ig,l)+RLvCp*zqla(ig,l) 1519 ! s /(1.-retv*zqla(ig,l)) 1520 ! ztva(ig,l) = ztva(ig,l)/zpspsk(ig,l) 1521 ! ztva(ig,l) = ztva(ig,l)*(1.+RETV*(zqta(ig,l) 1522 ! s /(1.-retv*zqta(ig,l)) 1523 ! s -zqla(ig,l)/(1.-retv*zqla(ig,l))) 1524 ! s -zqla(ig,l)/(1.-retv*zqla(ig,l))) 1525 ! WRITE(13,*)zqla(ig,l),zqla(ig,l)/(1.-retv*zqla(ig,l)) 1526 ! on ecrit zqsat 1527 zqsatth(ig, l) = qsatbef(ig) 1528 ! enddo 1529 ! DO ig=1,ngrid 1530 ! if (zw2(ig,l).ge.1.e-10.AND. 1531 ! s f_star(ig,l)+entr_star(ig,l).gt.1.e-10) THEN 1532 ! mise a jour de la vitesse ascendante (l'air entraine de la couche 1533 ! consideree commence avec une vitesse nulle). 1534 1535 ! if (f_star(ig,l+1).gt.1.e-10) THEN 1536 zw2(ig, l+1) = zw2(ig, l)* & ! s 1537 ! ((f_star(ig,l)-detr_star(ig,l))**2) 1538 ! s /f_star(ig,l+1)**2+ 1539 ((f_star(ig,l))**2)/(f_star(ig,l+1)+detr_star(ig,l))**2 + & ! s 1540 ! /(f_star(ig,l+1))**2+ 1541 2.*rg*(ztva(ig,l)-ztv(ig,l))/ztv(ig, l)*(zlev(ig,l+1)-zlev(ig,l)) 1542 ! s *(f_star(ig,l)/f_star(ig,l+1))**2 1543 1544 END IF 1545 END IF 1546 1547 IF (zw2(ig,l+1)<0.) THEN 1548 linter(ig) = (l*(zw2(ig,l+1)-zw2(ig,l))-zw2(ig,l))/(zw2(ig,l+1)-zw2( & 1549 ig,l)) 1550 zw2(ig, l+1) = 0. 1551 ! PRINT*,'linter=',linter(ig) 1552 ! ELSE IF ((zw2(ig,l+1).lt.1.e-10).AND.(zw2(ig,l+1).ge.0.)) THEN 1553 ! linter(ig)=l+1 1554 ! PRINT*,'linter=l',zw2(ig,l),zw2(ig,l+1) 1555 ELSE 1556 wa_moy(ig, l+1) = sqrt(zw2(ig,l+1)) 1557 ! wa_moy(ig,l+1)=zw2(ig,l+1) 1558 END IF 1559 IF (wa_moy(ig,l+1)>wmaxa(ig)) THEN 1560 ! lmix est le niveau de la couche ou w (wa_moy) est maximum 1561 lmix(ig) = l + 1 1562 wmaxa(ig) = wa_moy(ig, l+1) 1563 END IF 1564 END DO 1565 END DO 1566 PRINT *, 'fin calcul zw2' 1567 1568 ! Calcul de la couche correspondant a la hauteur du thermique 1569 DO ig = 1, ngrid 1570 lmax(ig) = lentr(ig) 1571 END DO 1572 DO ig = 1, ngrid 1573 DO l = nlay, lentr(ig) + 1, -1 1574 IF (zw2(ig,l)<=1.E-10) THEN 1575 lmax(ig) = l - 1 1576 END IF 1577 END DO 1578 END DO 1579 ! pas de thermique si couche 1 stable 1580 DO ig = 1, ngrid 1581 IF (lmin(ig)>1) THEN 1582 lmax(ig) = 1 1583 lmin(ig) = 1 1584 lentr(ig) = 1 1585 END IF 1586 END DO 1587 1588 ! Determination de zw2 max 1589 DO ig = 1, ngrid 1590 wmax(ig) = 0. 1591 END DO 1592 1593 DO l = 1, nlay 1594 DO ig = 1, ngrid 1595 IF (l<=lmax(ig)) THEN 1596 IF (zw2(ig,l)<0.) THEN 1597 PRINT *, 'pb2 zw2<0' 1598 END IF 1599 zw2(ig, l) = sqrt(zw2(ig,l)) 1600 wmax(ig) = max(wmax(ig), zw2(ig,l)) 1601 ELSE 1602 zw2(ig, l) = 0. 1603 END IF 1604 END DO 1605 END DO 1606 1607 ! Longueur caracteristique correspondant a la hauteur des thermiques. 1608 DO ig = 1, ngrid 1609 zmax(ig) = 0. 1610 zlevinter(ig) = zlev(ig, 1) 1611 END DO 1612 DO ig = 1, ngrid 1613 ! calcul de zlevinter 1614 zlevinter(ig) = (zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig)))*linter(ig) + & 1615 zlev(ig, lmax(ig)) - lmax(ig)*(zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig))) 1616 ! pour le cas ou on prend tjs lmin=1 1617 ! zmax(ig)=max(zmax(ig),zlevinter(ig)-zlev(ig,lmin(ig))) 1618 zmax(ig) = max(zmax(ig), zlevinter(ig)-zlev(ig,1)) 1619 zmax0(ig) = zmax(ig) 1620 WRITE (11, *) 'ig,lmax,linter', ig, lmax(ig), linter(ig) 1621 WRITE (12, *) 'ig,zlevinter,zmax', ig, zmax(ig), zlevinter(ig) 1622 END DO 1623 1624 ! Calcul de zmax_sec et wmax_sec 1625 CALL fermeture_seche(ngrid, nlay, pplay, pplev, pphi, zlev, rhobarz, f0, & 1626 zpspsk, alim, zh, zo, lentr, lmin, nu_min, nu_max, r_aspect, zmax_sec2, & 1627 wmax_sec2) 1628 1629 PRINT *, 'avant fermeture' 1630 ! Fermeture,determination de f 1631 ! en lmax f=d-e 1632 DO ig = 1, ngrid 1633 ! entr_star(ig,lmax(ig))=0. 1634 ! f_star(ig,lmax(ig)+1)=0. 1635 ! detr_star(ig,lmax(ig))=f_star(ig,lmax(ig))+entr_star(ig,lmax(ig)) 1636 ! s +alim_star(ig,lmax(ig)) 1637 END DO 1638 1639 DO ig = 1, ngrid 1640 alim_star2(ig) = 0. 1641 END DO 1642 ! calcul de entr_star_tot 1643 DO ig = 1, ngrid 1644 DO k = 1, lmix(ig) 1645 entr_star_tot(ig) = entr_star_tot(ig) & ! s 1646 ! +entr_star(ig,k) 1647 +alim_star(ig, k) 1648 ! s -detr_star(ig,k) 1649 detr_star_tot(ig) = detr_star_tot(ig) & ! s 1650 ! +alim_star(ig,k) 1651 -detr_star(ig, k) + entr_star(ig, k) 1652 END DO 1653 END DO 1654 1655 DO ig = 1, ngrid 1656 IF (alim_star_tot(ig)<1.E-10) THEN 1657 f(ig) = 0. 1658 ELSE 1659 ! do k=lmin(ig),lentr(ig) 1660 DO k = 1, lentr(ig) 1661 alim_star2(ig) = alim_star2(ig) + alim_star(ig, k)**2/(rho(ig,k)*( & 1662 zlev(ig,k+1)-zlev(ig,k))) 1663 END DO 1664 IF ((zmax_sec(ig)>1.E-10) .AND. (1==1)) THEN 1665 f(ig) = wmax_sec(ig)/(max(500.,zmax_sec(ig))*r_aspect*alim_star2(ig)) 1666 f(ig) = f(ig) + (f0(ig)-f(ig))*exp((-ptimestep/zmax_sec(ig))*wmax_sec & 1667 (ig)) 1668 ELSE 1669 f(ig) = wmax(ig)/(max(500.,zmax(ig))*r_aspect*alim_star2(ig)) 1670 f(ig) = f(ig) + (f0(ig)-f(ig))*exp((-ptimestep/zmax(ig))*wmax(ig)) 1671 END IF 1672 END IF 1673 f0(ig) = f(ig) 1674 END DO 1675 PRINT *, 'apres fermeture' 1676 ! Calcul de l'entrainement 1677 DO ig = 1, ngrid 1678 DO k = 1, klev 1679 alim(ig, k) = f(ig)*alim_star(ig, k) 1680 END DO 1681 END DO 1682 ! CR:test pour entrainer moins que la masse 1683 ! do ig=1,ngrid 1684 ! do l=1,lentr(ig) 1685 ! if ((alim(ig,l)*ptimestep).gt.(0.9*masse(ig,l))) THEN 1686 ! alim(ig,l+1)=alim(ig,l+1)+alim(ig,l) 1687 ! s -0.9*masse(ig,l)/ptimestep 1688 ! alim(ig,l)=0.9*masse(ig,l)/ptimestep 1689 ! END IF 1690 ! enddo 1691 ! enddo 1692 ! calcul du détrainement 1693 DO ig = 1, klon 1694 DO k = 1, klev 1695 detr(ig, k) = f(ig)*detr_star(ig, k) 1696 IF (detr(ig,k)<0.) THEN 1697 ! PRINT*,'detr1<0!!!' 1698 END IF 1699 END DO 1700 DO k = 1, klev 1701 entr(ig, k) = f(ig)*entr_star(ig, k) 1702 IF (entr(ig,k)<0.) THEN 1703 ! PRINT*,'entr1<0!!!' 1704 END IF 1705 END DO 1706 END DO 1707 1708 ! do ig=1,ngrid 1709 ! do l=1,klev 1710 ! if (((detr(ig,l)+entr(ig,l)+alim(ig,l))*ptimestep).gt. 1711 ! s (masse(ig,l))) THEN 1712 ! PRINT*,'d2+e2+a2>m2','ig=',ig,'l=',l,'lmax(ig)=',lmax(ig),'d+e+a=' 1713 ! s,(detr(ig,l)+entr(ig,l)+alim(ig,l))*ptimestep,'m=',masse(ig,l) 1714 ! END IF 1715 ! enddo 1716 ! enddo 1717 ! Calcul des flux 1718 1719 DO ig = 1, ngrid 1720 DO l = 1, lmax(ig) 1721 ! do l=1,klev 1722 ! fmc(ig,l+1)=f(ig)*f_star(ig,l+1) 1723 fmc(ig, l+1) = fmc(ig, l) + alim(ig, l) + entr(ig, l) - detr(ig, l) 1724 ! PRINT*,'??!!','ig=',ig,'l=',l,'lmax=',lmax(ig),'lmix=',lmix(ig), 1725 ! s 'e=',entr(ig,l),'d=',detr(ig,l),'a=',alim(ig,l),'f=',fmc(ig,l), 1726 ! s 'f+1=',fmc(ig,l+1) 1727 IF (fmc(ig,l+1)<0.) THEN 1728 PRINT *, 'fmc1<0', l + 1, lmax(ig), fmc(ig, l+1) 1729 fmc(ig, l+1) = fmc(ig, l) 1730 detr(ig, l) = alim(ig, l) + entr(ig, l) 1731 ! fmc(ig,l+1)=0. 1732 ! PRINT*,'fmc1<0',l+1,lmax(ig),fmc(ig,l+1) 1733 END IF 1734 ! if ((fmc(ig,l+1).gt.fmc(ig,l)).AND.(l.gt.lentr(ig))) THEN 1735 ! f_old=fmc(ig,l+1) 1736 ! fmc(ig,l+1)=fmc(ig,l) 1737 ! detr(ig,l)=detr(ig,l)+f_old-fmc(ig,l+1) 1738 ! END IF 1739 1740 ! if ((fmc(ig,l+1).gt.fmc(ig,l)).AND.(l.gt.lentr(ig))) THEN 1741 ! f_old=fmc(ig,l+1) 1742 ! fmc(ig,l+1)=fmc(ig,l) 1743 ! detr(ig,l)=detr(ig,l)+f_old-fmc(ig,l) 1744 ! END IF 1745 ! rajout du test sur alpha croissant 1746 ! if test 1747 ! if (1.EQ.0) THEN 1748 IF (l==klev) THEN 1749 PRINT *, 'THERMCELL PB ig=', ig, ' l=', l 1750 abort_message = 'THERMCELL PB' 1751 CALL abort_physic(modname, abort_message, 1) 1752 END IF 1753 ! if ((zw2(ig,l+1).gt.1.e-10).AND.(zw2(ig,l).gt.1.e-10).AND. 1754 ! s (l.ge.lentr(ig)).AND. 1755 IF ((zw2(ig,l+1)>1.E-10) .AND. (zw2(ig,l)>1.E-10) .AND. (l>=lentr(ig))) & 1756 THEN 1757 IF (((fmc(ig,l+1)/(rhobarz(ig,l+1)*zw2(ig,l+1)))>(fmc(ig,l)/ & 1758 (rhobarz(ig,l)*zw2(ig,l))))) THEN 1759 f_old = fmc(ig, l+1) 1760 fmc(ig, l+1) = fmc(ig, l)*rhobarz(ig, l+1)*zw2(ig, l+1)/ & 1761 (rhobarz(ig,l)*zw2(ig,l)) 1762 detr(ig, l) = detr(ig, l) + f_old - fmc(ig, l+1) 1763 ! detr(ig,l)=(fmc(ig,l+1)-fmc(ig,l))/(0.4-1.) 1764 ! entr(ig,l)=0.4*detr(ig,l) 1765 ! entr(ig,l)=fmc(ig,l+1)-fmc(ig,l)+detr(ig,l) 1766 END IF 1767 END IF 1768 IF ((fmc(ig,l+1)>fmc(ig,l)) .AND. (l>lentr(ig))) THEN 1769 f_old = fmc(ig, l+1) 1770 fmc(ig, l+1) = fmc(ig, l) 1771 detr(ig, l) = detr(ig, l) + f_old - fmc(ig, l+1) 1772 END IF 1773 IF (detr(ig,l)>fmc(ig,l)) THEN 1774 detr(ig, l) = fmc(ig, l) 1775 entr(ig, l) = fmc(ig, l+1) - alim(ig, l) 1776 END IF 1777 IF (fmc(ig,l+1)<0.) THEN 1778 detr(ig, l) = detr(ig, l) + fmc(ig, l+1) 1779 fmc(ig, l+1) = 0. 1780 PRINT *, 'fmc2<0', l + 1, lmax(ig) 1781 END IF 1782 1783 ! test pour ne pas avoir f=0 et d=e/=0 1784 ! if (fmc(ig,l+1).lt.1.e-10) THEN 1785 ! detr(ig,l+1)=0. 1786 ! entr(ig,l+1)=0. 1787 ! zqla(ig,l+1)=0. 1788 ! zw2(ig,l+1)=0. 1789 ! lmax(ig)=l+1 1790 ! zmax(ig)=zlev(ig,lmax(ig)) 1791 ! END IF 1792 IF (zw2(ig,l+1)>1.E-10) THEN 1793 IF ((((fmc(ig,l+1))/(rhobarz(ig,l+1)*zw2(ig,l+1)))>1.)) THEN 1794 f_old = fmc(ig, l+1) 1795 fmc(ig, l+1) = rhobarz(ig, l+1)*zw2(ig, l+1) 1796 zw2(ig, l+1) = 0. 1797 zqla(ig, l+1) = 0. 1798 detr(ig, l) = detr(ig, l) + f_old - fmc(ig, l+1) 1799 lmax(ig) = l + 1 1800 zmax(ig) = zlev(ig, lmax(ig)) 1801 PRINT *, 'alpha>1', l + 1, lmax(ig) 1802 END IF 1803 END IF 1804 ! WRITE(1,*)'ig,l,fm(ig,l)',ig,l,fm(ig,l) 1805 ! END IF test 1806 ! END IF 1807 END DO 1808 END DO 1809 DO ig = 1, ngrid 1810 ! if (fmc(ig,lmax(ig)+1).NE.0.) THEN 1811 fmc(ig, lmax(ig)+1) = 0. 1812 entr(ig, lmax(ig)) = 0. 1813 detr(ig, lmax(ig)) = fmc(ig, lmax(ig)) + entr(ig, lmax(ig)) + & 1814 alim(ig, lmax(ig)) 1815 ! END IF 1816 END DO 1817 ! test sur le signe de fmc 1818 DO ig = 1, ngrid 1819 DO l = 1, klev + 1 1820 IF (fmc(ig,l)<0.) THEN 1821 PRINT *, 'fm1<0!!!', 'ig=', ig, 'l=', l, 'a=', alim(ig, l-1), 'e=', & 1822 entr(ig, l-1), 'f=', fmc(ig, l-1), 'd=', detr(ig, l-1), 'f+1=', & 1823 fmc(ig, l) 1824 END IF 1825 END DO 1826 END DO 1827 ! test de verification 1828 DO ig = 1, ngrid 1829 DO l = 1, lmax(ig) 1830 IF ((abs(fmc(ig,l+1)-fmc(ig,l)-alim(ig,l)-entr(ig,l)+ & 1831 detr(ig,l)))>1.E-4) THEN 1832 ! PRINT*,'pbcm!!','ig=',ig,'l=',l,'lmax=',lmax(ig),'lmix=',lmix(ig), 1833 ! s 'e=',entr(ig,l),'d=',detr(ig,l),'a=',alim(ig,l),'f=',fmc(ig,l), 1834 ! s 'f+1=',fmc(ig,l+1) 1835 END IF 1836 IF (detr(ig,l)<0.) THEN 1837 PRINT *, 'detrdemi<0!!!' 1838 END IF 1839 END DO 1840 END DO 1841 1842 ! RC 1843 ! CR def de zmix continu (profil parabolique des vitesses) 1844 DO ig = 1, ngrid 1845 IF (lmix(ig)>1.) THEN 1846 ! test 1847 IF (((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig)))*((zlev(ig,lmix(ig)))- & 1848 (zlev(ig,lmix(ig)+1)))-(zw2(ig,lmix(ig))- & 1849 zw2(ig,lmix(ig)+1))*((zlev(ig,lmix(ig)-1))- & 1850 (zlev(ig,lmix(ig)))))>1E-10) THEN 1851 1852 zmix(ig) = ((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig)))*((zlev(ig,lmix(ig)) & 1853 )**2-(zlev(ig,lmix(ig)+1))**2)-(zw2(ig,lmix(ig))-zw2(ig, & 1854 lmix(ig)+1))*((zlev(ig,lmix(ig)-1))**2-(zlev(ig,lmix(ig)))**2))/ & 1855 (2.*((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig)))*((zlev(ig,lmix(ig)))- & 1856 (zlev(ig,lmix(ig)+1)))-(zw2(ig,lmix(ig))- & 1857 zw2(ig,lmix(ig)+1))*((zlev(ig,lmix(ig)-1))-(zlev(ig,lmix(ig)))))) 1858 ELSE 1859 zmix(ig) = zlev(ig, lmix(ig)) 1860 PRINT *, 'pb zmix' 1861 END IF 1862 ELSE 1863 zmix(ig) = 0. 1864 END IF 1865 ! test 1866 IF ((zmax(ig)-zmix(ig))<=0.) THEN 1867 zmix(ig) = 0.9*zmax(ig) 1868 ! PRINT*,'pb zmix>zmax' 1869 END IF 1870 END DO 1871 DO ig = 1, klon 1872 zmix0(ig) = zmix(ig) 1873 END DO 1874 1875 ! calcul du nouveau lmix correspondant 1876 DO ig = 1, ngrid 1877 DO l = 1, klev 1878 IF (zmix(ig)>=zlev(ig,l) .AND. zmix(ig)<zlev(ig,l+1)) THEN 1879 lmix(ig) = l 1880 END IF 1881 END DO 1882 END DO 1883 1884 ! ne devrait pas arriver!!!!! 1885 DO ig = 1, ngrid 1886 DO l = 1, klev 1887 IF (detr(ig,l)>(fmc(ig,l)+alim(ig,l))+entr(ig,l)) THEN 1888 PRINT *, 'detr2>fmc2!!!', 'ig=', ig, 'l=', l, 'd=', detr(ig, l), & 1889 'f=', fmc(ig, l), 'lmax=', lmax(ig) 1890 ! detr(ig,l)=fmc(ig,l)+alim(ig,l)+entr(ig,l) 1891 ! entr(ig,l)=0. 1892 ! fmc(ig,l+1)=0. 1893 ! zw2(ig,l+1)=0. 1894 ! zqla(ig,l+1)=0. 1895 PRINT *, 'pb!fm=0 et f_star>0', l, lmax(ig) 1896 ! lmax(ig)=l 1897 END IF 1898 END DO 1899 END DO 1900 DO ig = 1, ngrid 1901 DO l = lmax(ig) + 1, klev + 1 1902 ! fmc(ig,l)=0. 1903 ! detr(ig,l)=0. 1904 ! entr(ig,l)=0. 1905 ! zw2(ig,l)=0. 1906 ! zqla(ig,l)=0. 1907 END DO 1908 END DO 1909 1910 ! Calcul du detrainement lors du premier passage 1911 ! PRINT*,'9 OK convect8' 1912 ! PRINT*,'WA1 ',wa_moy 1913 1914 ! determination de l'indice du debut de la mixed layer ou w decroit 1915 1916 ! calcul de la largeur de chaque ascendance dans le cas conservatif. 1917 ! dans ce cas simple, on suppose que la largeur de l'ascendance provenant 1918 ! d'une couche est égale à la hauteur de la couche alimentante. 1919 ! La vitesse maximale dans l'ascendance est aussi prise comme estimation 1920 ! de la vitesse d'entrainement horizontal dans la couche alimentante. 1921 1922 DO l = 2, nlay 1923 DO ig = 1, ngrid 1924 IF (l<=lmax(ig) .AND. (test(ig)==1)) THEN 1925 zw = max(wa_moy(ig,l), 1.E-10) 1926 larg_cons(ig, l) = zmax(ig)*r_aspect*fmc(ig, l)/(rhobarz(ig,l)*zw) 1927 END IF 1928 END DO 1929 END DO 1930 1931 DO l = 2, nlay 1932 DO ig = 1, ngrid 1933 IF (l<=lmax(ig) .AND. (test(ig)==1)) THEN 1934 ! if (idetr.EQ.0) THEN 1935 ! cette option est finalement en dur. 1936 IF ((l_mix*zlev(ig,l))<0.) THEN 1937 PRINT *, 'pb l_mix*zlev<0' 1938 END IF 1939 ! CR: test: nouvelle def de lambda 1940 ! larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l)) 1941 IF (zw2(ig,l)>1.E-10) THEN 1942 larg_detr(ig, l) = sqrt((l_mix/zw2(ig,l))*zlev(ig,l)) 1943 ELSE 1944 larg_detr(ig, l) = sqrt(l_mix*zlev(ig,l)) 1945 END IF 1946 ! ELSE IF (idetr.EQ.1) THEN 1947 ! larg_detr(ig,l)=larg_cons(ig,l) 1948 ! s *sqrt(l_mix*zlev(ig,l))/larg_cons(ig,lmix(ig)) 1949 ! ELSE IF (idetr.EQ.2) THEN 1950 ! larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l)) 1951 ! s *sqrt(wa_moy(ig,l)) 1952 ! ELSE IF (idetr.EQ.4) THEN 1953 ! larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l)) 1954 ! s *wa_moy(ig,l) 1955 ! END IF 1956 END IF 1957 END DO 1958 END DO 1959 1960 ! PRINT*,'10 OK convect8' 1961 ! PRINT*,'WA2 ',wa_moy 1962 ! cal1cul de la fraction de la maille concernée par l'ascendance en tenant 1963 ! compte de l'epluchage du thermique. 1964 1965 1966 DO l = 2, nlay 1967 DO ig = 1, ngrid 1968 IF (larg_cons(ig,l)>1. .AND. (test(ig)==1)) THEN 1969 ! PRINT*,ig,l,lmix(ig),lmaxa(ig),larg_cons(ig,l),' KKK' 1970 fraca(ig, l) = (larg_cons(ig,l)-larg_detr(ig,l))/(r_aspect*zmax(ig)) 1971 ! test 1972 fraca(ig, l) = max(fraca(ig,l), 0.) 1973 fraca(ig, l) = min(fraca(ig,l), 0.5) 1974 fracd(ig, l) = 1. - fraca(ig, l) 1975 fracc(ig, l) = larg_cons(ig, l)/(r_aspect*zmax(ig)) 1976 ELSE 1977 ! wa_moy(ig,l)=0. 1978 fraca(ig, l) = 0. 1979 fracc(ig, l) = 0. 1980 fracd(ig, l) = 1. 1981 END IF 1982 END DO 1983 END DO 1984 ! CR: calcul de fracazmix 1985 DO ig = 1, ngrid 1986 IF (test(ig)==1) THEN 1987 fracazmix(ig) = (fraca(ig,lmix(ig)+1)-fraca(ig,lmix(ig)))/ & 1988 (zlev(ig,lmix(ig)+1)-zlev(ig,lmix(ig)))*zmix(ig) + & 1989 fraca(ig, lmix(ig)) - zlev(ig, lmix(ig))*(fraca(ig,lmix(ig)+1)-fraca( & 1990 ig,lmix(ig)))/(zlev(ig,lmix(ig)+1)-zlev(ig,lmix(ig))) 1991 END IF 1992 END DO 1993 1994 DO l = 2, nlay 1995 DO ig = 1, ngrid 1996 IF (larg_cons(ig,l)>1. .AND. (test(ig)==1)) THEN 1997 IF (l>lmix(ig)) THEN 1998 ! test 1999 IF (zmax(ig)-zmix(ig)<1.E-10) THEN 2000 ! PRINT*,'pb xxx' 2001 xxx(ig, l) = (lmax(ig)+1.-l)/(lmax(ig)+1.-lmix(ig)) 2002 ELSE 2003 xxx(ig, l) = (zmax(ig)-zlev(ig,l))/(zmax(ig)-zmix(ig)) 2004 END IF 2005 IF (idetr==0) THEN 2006 fraca(ig, l) = fracazmix(ig) 2007 ELSE IF (idetr==1) THEN 2008 fraca(ig, l) = fracazmix(ig)*xxx(ig, l) 2009 ELSE IF (idetr==2) THEN 2010 fraca(ig, l) = fracazmix(ig)*(1.-(1.-xxx(ig,l))**2) 2011 ELSE 2012 fraca(ig, l) = fracazmix(ig)*xxx(ig, l)**2 2013 END IF 2014 ! PRINT*,ig,l,lmix(ig),lmaxa(ig),xxx(ig,l),'LLLLLLL' 2015 fraca(ig, l) = max(fraca(ig,l), 0.) 2016 fraca(ig, l) = min(fraca(ig,l), 0.5) 2017 fracd(ig, l) = 1. - fraca(ig, l) 2018 fracc(ig, l) = larg_cons(ig, l)/(r_aspect*zmax(ig)) 2019 END IF 2020 END IF 2021 END DO 2022 END DO 2023 2024 PRINT *, 'fin calcul fraca' 2025 ! PRINT*,'11 OK convect8' 2026 ! PRINT*,'Ea3 ',wa_moy 2027 ! ------------------------------------------------------------------ 2028 ! Calcul de fracd, wd 2029 ! somme wa - wd = 0 2030 ! ------------------------------------------------------------------ 2031 2032 2033 DO ig = 1, ngrid 2034 fm(ig, 1) = 0. 2035 fm(ig, nlay+1) = 0. 2036 END DO 2037 2038 DO l = 2, nlay 2039 DO ig = 1, ngrid 2040 IF (test(ig)==1) THEN 2041 fm(ig, l) = fraca(ig, l)*wa_moy(ig, l)*rhobarz(ig, l) 2042 ! CR:test 2043 IF (alim(ig,l-1)<1E-10 .AND. fm(ig,l)>fm(ig,l-1) .AND. l>lmix(ig)) & 2044 THEN 2045 fm(ig, l) = fm(ig, l-1) 2046 ! WRITE(1,*)'ajustement fm, l',l 2047 END IF 2048 ! WRITE(1,*)'ig,l,fm(ig,l)',ig,l,fm(ig,l) 2049 ! RC 2050 END IF 2051 END DO 2052 DO ig = 1, ngrid 2053 IF (fracd(ig,l)<0.1 .AND. (test(ig)==1)) THEN 2054 abort_message = 'fracd trop petit' 2055 CALL abort_physic(modname, abort_message, 1) 2056 ELSE 2057 ! vitesse descendante "diagnostique" 2058 wd(ig, l) = fm(ig, l)/(fracd(ig,l)*rhobarz(ig,l)) 2059 END IF 2060 END DO 2061 END DO 2062 2063 DO l = 1, nlay + 1 2064 DO ig = 1, ngrid 2065 IF (test(ig)==0) THEN 2066 fm(ig, l) = fmc(ig, l) 2067 END IF 2068 END DO 2069 END DO 2070 2071 ! fin du first 2072 DO l = 1, nlay 2073 DO ig = 1, ngrid 2074 ! masse(ig,l)=rho(ig,l)*(zlev(ig,l+1)-zlev(ig,l)) 2075 masse(ig, l) = (pplev(ig,l)-pplev(ig,l+1))/rg 2076 END DO 2077 END DO 2078 2079 ! PRINT*,'12 OK convect8' 2080 ! PRINT*,'WA4 ',wa_moy 2081 ! c------------------------------------------------------------------ 2082 ! calcul du transport vertical 2083 ! ------------------------------------------------------------------ 2084 2085 GO TO 4444 2086 ! PRINT*,'XXXXXXXXXXXXXXX ptimestep= ',ptimestep 2087 DO l = 2, nlay - 1 2088 DO ig = 1, ngrid 2089 IF (fm(ig,l+1)*ptimestep>masse(ig,l) .AND. fm(ig,l+1)*ptimestep>masse( & 2090 ig,l+1)) THEN 2091 PRINT *, 'WARN!!! FM>M ig=', ig, ' l=', l, ' FM=', & 2092 fm(ig, l+1)*ptimestep, ' M=', masse(ig, l), masse(ig, l+1) 2093 END IF 2094 END DO 2095 END DO 2096 2097 DO l = 1, nlay 2098 DO ig = 1, ngrid 2099 IF ((alim(ig,l)+entr(ig,l))*ptimestep>masse(ig,l)) THEN 2100 PRINT *, 'WARN!!! E>M ig=', ig, ' l=', l, ' E==', & 2101 (entr(ig,l)+alim(ig,l))*ptimestep, ' M=', masse(ig, l) 2102 END IF 2103 END DO 2104 END DO 2105 2106 DO l = 1, nlay 2107 DO ig = 1, ngrid 2108 IF (.NOT. fm(ig,l)>=0. .OR. .NOT. fm(ig,l)<=10.) THEN 2109 ! PRINT*,'WARN!!! fm exagere ig=',ig,' l=',l 2110 ! s ,' FM=',fm(ig,l) 2111 END IF 2112 IF (.NOT. masse(ig,l)>=1.E-10 .OR. .NOT. masse(ig,l)<=1.E4) THEN 2113 ! PRINT*,'WARN!!! masse exagere ig=',ig,' l=',l 2114 ! s ,' M=',masse(ig,l) 2115 ! PRINT*,'rho(ig,l),pplay(ig,l),zpspsk(ig,l),RD,zh(ig,l)', 2116 ! s rho(ig,l),pplay(ig,l),zpspsk(ig,l),RD,zh(ig,l) 2117 ! PRINT*,'zlev(ig,l+1),zlev(ig,l)' 2118 ! s ,zlev(ig,l+1),zlev(ig,l) 2119 ! PRINT*,'pphi(ig,l-1),pphi(ig,l),pphi(ig,l+1)' 2120 ! s ,pphi(ig,l-1),pphi(ig,l),pphi(ig,l+1) 2121 END IF 2122 IF (.NOT. alim(ig,l)>=0. .OR. .NOT. alim(ig,l)<=10.) THEN 2123 ! PRINT*,'WARN!!! entr exagere ig=',ig,' l=',l 2124 ! s ,' E=',entr(ig,l) 2125 END IF 2126 END DO 2127 END DO 2128 2129 4444 CONTINUE 2130 2131 ! CR:redefinition du entr 2132 ! CR:test:on ne change pas la def du entr mais la def du fm 2133 DO l = 1, nlay 2134 DO ig = 1, ngrid 2135 IF (test(ig)==1) THEN 2136 detr(ig, l) = fm(ig, l) + alim(ig, l) - fm(ig, l+1) 2137 IF (detr(ig,l)<0.) THEN 2138 ! entr(ig,l)=entr(ig,l)-detr(ig,l) 2139 fm(ig, l+1) = fm(ig, l) + alim(ig, l) 2140 detr(ig, l) = 0. 2141 ! WRITE(11,*)'l,ig,entr',l,ig,entr(ig,l) 2142 ! PRINT*,'WARNING !!! detrainement negatif ',ig,l 2143 END IF 2144 END IF 2145 END DO 2146 END DO 2147 ! RC 2148 2149 IF (w2di==1) THEN 2150 fm0 = fm0 + ptimestep*(fm-fm0)/tho 2151 entr0 = entr0 + ptimestep*(alim+entr-entr0)/tho 2152 ELSE 2153 fm0 = fm 2154 entr0 = alim + entr 2155 detr0 = detr 2156 alim0 = alim 2157 ! zoa=zqta 2158 ! entr0=alim 2159 END IF 2160 2161 IF (1==1) THEN 2162 ! CALL dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse 2163 ! . ,zh,zdhadj,zha) 2164 ! CALL dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse 2165 ! . ,zo,pdoadj,zoa) 2166 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zthl, & 2167 zdthladj, zta) 2168 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, po, pdoadj, & 2169 zoa) 2170 ELSE 2171 CALL dqthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca, zh, & 2172 zdhadj, zha) 2173 CALL dqthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca, zo, & 2174 pdoadj, zoa) 2175 END IF 2176 2177 IF (1==0) THEN 2178 CALL dvthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca, zmax, & 2179 zu, zv, pduadj, pdvadj, zua, zva) 2180 ELSE 2181 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zu, pduadj, & 2182 zua) 2183 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zv, pdvadj, & 2184 zva) 2185 END IF 2186 2187 ! Calcul des moments 2188 ! do l=1,nlay 2189 ! do ig=1,ngrid 2190 ! zf=0.5*(fracc(ig,l)+fracc(ig,l+1)) 2191 ! zf2=zf/(1.-zf) 2192 ! thetath2(ig,l)=zf2*(zha(ig,l)-zh(ig,l))**2 2193 ! wth2(ig,l)=zf2*(0.5*(wa_moy(ig,l)+wa_moy(ig,l+1)))**2 2194 ! enddo 2195 ! enddo 2196 2197 2198 2199 2200 2201 2202 ! PRINT*,'13 OK convect8' 2203 ! PRINT*,'WA5 ',wa_moy 2204 DO l = 1, nlay 2205 DO ig = 1, ngrid 2206 ! pdtadj(ig,l)=zdhadj(ig,l)*zpspsk(ig,l) 2207 pdtadj(ig, l) = zdthladj(ig, l)*zpspsk(ig, l) 2208 END DO 2209 END DO 2210 2211 2212 ! do l=1,nlay 2213 ! do ig=1,ngrid 2214 ! IF(abs(pdtadj(ig,l))*86400..gt.500.) THEN 2215 ! PRINT*,'WARN!!! ig=',ig,' l=',l 2216 ! s ,' pdtadj=',pdtadj(ig,l) 2217 ! END IF 2218 ! IF(abs(pdoadj(ig,l))*86400..gt.1.) THEN 2219 ! PRINT*,'WARN!!! ig=',ig,' l=',l 2220 ! s ,' pdoadj=',pdoadj(ig,l) 2221 ! END IF 2222 ! enddo 2223 ! enddo 2224 2225 ! PRINT*,'14 OK convect8' 2226 ! ------------------------------------------------------------------ 2227 ! Calculs pour les sorties 2228 ! ------------------------------------------------------------------ 2229 ! calcul de fraca pour les sorties 2230 DO l = 2, klev 2231 DO ig = 1, klon 2232 IF (zw2(ig,l)>1.E-10) THEN 2233 fraca(ig, l) = fm(ig, l)/(rhobarz(ig,l)*zw2(ig,l)) 2234 ELSE 2235 fraca(ig, l) = 0. 2236 END IF 2237 END DO 2238 END DO 2239 IF (sorties) THEN 3999 2240 4000 DO l = 1, nlay 2241 4001 DO ig = 1, ngrid 2242 zla(ig, l) = (1.-fracd(ig,l))*zmax(ig) 2243 zld(ig, l) = fracd(ig, l)*zmax(ig) 2244 IF (1.-fracd(ig,l)>1.E-10) zwa(ig, l) = wd(ig, l)*fracd(ig, l)/ & 2245 (1.-fracd(ig,l)) 2246 END DO 2247 END DO 2248 ! CR calcul du niveau de condensation 2249 ! initialisation 2250 DO ig = 1, ngrid 2251 nivcon(ig) = 0. 2252 zcon(ig) = 0. 2253 END DO 2254 DO k = nlay, 1, -1 2255 DO ig = 1, ngrid 2256 IF (zqla(ig,k)>1E-10) THEN 2257 nivcon(ig) = k 2258 zcon(ig) = zlev(ig, k) 2259 END IF 2260 ! if (zcon(ig).gt.1.e-10) THEN 2261 ! nuage=.TRUE. 2262 ! else 2263 ! nuage=.FALSE. 2264 ! END IF 2265 END DO 2266 END DO 2267 4002 zf = 0.5 * (fracc(ig, l) + fracc(ig, l + 1)) 4003 zf2 = zf / (1. - zf) 4004 thetath2(ig, l) = zf2 * (zha(ig, l) - zh(ig, l))**2 4005 wth2(ig, l) = zf2 * (0.5 * (wa_moy(ig, l) + wa_moy(ig, l + 1)))**2 4006 END DO 4007 END DO 4008 4009 4010 4011 ! PRINT*,'13 OK convect8' 4012 ! PRINT*,'WA5 ',wa_moy 2268 4013 DO l = 1, nlay 2269 4014 DO ig = 1, ngrid 2270 zf = fraca(ig, l) 2271 zf2 = zf/(1.-zf) 2272 thetath2(ig, l) = zf2*(zha(ig,l)-zh(ig,l)/zpspsk(ig,l))**2 2273 wth2(ig, l) = zf2*(zw2(ig,l))**2 2274 ! PRINT*,'wth2=',wth2(ig,l) 2275 wth3(ig, l) = zf2*(1-2.*fraca(ig,l))/(1-fraca(ig,l))*zw2(ig, l)* & 2276 zw2(ig, l)*zw2(ig, l) 2277 q2(ig, l) = zf2*(zqta(ig,l)*1000.-po(ig,l)*1000.)**2 2278 ! test: on calcul q2/po=ratqsc 2279 ! if (nuage) THEN 2280 ratqscth(ig, l) = sqrt(q2(ig,l))/(po(ig,l)*1000.) 2281 ! else 2282 ! ratqscth(ig,l)=0. 2283 ! END IF 2284 END DO 2285 END DO 2286 ! calcul du ratqscdiff 2287 sum = 0. 2288 sumdiff = 0. 2289 ratqsdiff(:, :) = 0. 2290 DO ig = 1, ngrid 2291 DO l = 1, lentr(ig) 2292 sum = sum + alim_star(ig, l)*zqta(ig, l)*1000. 2293 END DO 2294 END DO 2295 DO ig = 1, ngrid 2296 DO l = 1, lentr(ig) 2297 zf = fraca(ig, l) 2298 zf2 = zf/(1.-zf) 2299 sumdiff = sumdiff + alim_star(ig, l)*(zqta(ig,l)*1000.-sum)**2 2300 ! ratqsdiff=ratqsdiff+alim_star(ig,l)* 2301 ! s (zqta(ig,l)*1000.-po(ig,l)*1000.)**2 2302 END DO 2303 END DO 2304 DO l = 1, klev 2305 DO ig = 1, ngrid 2306 ratqsdiff(ig, l) = sqrt(sumdiff)/(po(ig,l)*1000.) 2307 ! WRITE(11,*)'ratqsdiff=',ratqsdiff(ig,l) 2308 END DO 2309 END DO 2310 2311 END IF 2312 2313 ! PRINT*,'19 OK convect8' 2314 2315 END SUBROUTINE thermcell_cld 2316 2317 SUBROUTINE thermcell_eau(ngrid, nlay, ptimestep, pplay, pplev, pphi, pu, pv, & 2318 pt, po, pduadj, pdvadj, pdtadj, pdoadj, fm0, entr0 & ! s 2319 ! ,pu_therm,pv_therm 2320 , r_aspect, l_mix, w2di, tho) 2321 2322 USE dimphy 2323 IMPLICIT NONE 2324 2325 ! ======================================================================= 2326 2327 ! Calcul du transport verticale dans la couche limite en presence 2328 ! de "thermiques" explicitement representes 2329 2330 ! Réécriture à partir d'un listing papier à Habas, le 14/02/00 2331 2332 ! le thermique est supposé homogène et dissipé par mélange avec 2333 ! son environnement. la longueur l_mix contrôle l'efficacité du 2334 ! mélange 2335 2336 ! Le calcul du transport des différentes espèces se fait en prenant 2337 ! en compte: 2338 ! 1. un flux de masse montant 2339 ! 2. un flux de masse descendant 2340 ! 3. un entrainement 2341 ! 4. un detrainement 2342 2343 ! ======================================================================= 2344 2345 ! ----------------------------------------------------------------------- 2346 ! declarations: 2347 ! ------------- 2348 2349 include "YOMCST.h" 2350 include "YOETHF.h" 2351 include "FCTTRE.h" 2352 2353 ! arguments: 2354 ! ---------- 2355 2356 INTEGER ngrid, nlay, w2di 2357 REAL tho 2358 REAL ptimestep, l_mix, r_aspect 2359 REAL pt(ngrid, nlay), pdtadj(ngrid, nlay) 2360 REAL pu(ngrid, nlay), pduadj(ngrid, nlay) 2361 REAL pv(ngrid, nlay), pdvadj(ngrid, nlay) 2362 REAL po(ngrid, nlay), pdoadj(ngrid, nlay) 2363 REAL pplay(ngrid, nlay), pplev(ngrid, nlay+1) 2364 REAL pphi(ngrid, nlay) 2365 2366 INTEGER idetr 2367 SAVE idetr 2368 DATA idetr/3/ 2369 !$OMP THREADPRIVATE(idetr) 2370 2371 ! local: 2372 ! ------ 2373 2374 INTEGER ig, k, l, lmaxa(klon), lmix(klon) 2375 REAL zsortie1d(klon) 2376 ! CR: on remplace lmax(klon,klev+1) 2377 INTEGER lmax(klon), lmin(klon), lentr(klon) 2378 REAL linter(klon) 2379 REAL zmix(klon), fracazmix(klon) 2380 ! RC 2381 REAL zmax(klon), zw, zz, zw2(klon, klev+1), ztva(klon, klev), zzz 2382 2383 REAL zlev(klon, klev+1), zlay(klon, klev) 2384 REAL zh(klon, klev), zdhadj(klon, klev) 2385 REAL zthl(klon, klev), zdthladj(klon, klev) 2386 REAL ztv(klon, klev) 2387 REAL zu(klon, klev), zv(klon, klev), zo(klon, klev) 2388 REAL zl(klon, klev) 2389 REAL wh(klon, klev+1) 2390 REAL wu(klon, klev+1), wv(klon, klev+1), wo(klon, klev+1) 2391 REAL zla(klon, klev+1) 2392 REAL zwa(klon, klev+1) 2393 REAL zld(klon, klev+1) 2394 REAL zwd(klon, klev+1) 2395 REAL zsortie(klon, klev) 2396 REAL zva(klon, klev) 2397 REAL zua(klon, klev) 2398 REAL zoa(klon, klev) 2399 2400 REAL zta(klon, klev) 2401 REAL zha(klon, klev) 2402 REAL wa_moy(klon, klev+1) 2403 REAL fraca(klon, klev+1) 2404 REAL fracc(klon, klev+1) 2405 REAL zf, zf2 2406 REAL thetath2(klon, klev), wth2(klon, klev) 2407 ! common/comtherm/thetath2,wth2 2408 2409 REAL count_time 2410 INTEGER ialt 2411 2412 LOGICAL sorties 2413 REAL rho(klon, klev), rhobarz(klon, klev+1), masse(klon, klev) 2414 REAL zpspsk(klon, klev) 2415 2416 ! real wmax(klon,klev),wmaxa(klon) 2417 REAL wmax(klon), wmaxa(klon) 2418 REAL wa(klon, klev, klev+1) 2419 REAL wd(klon, klev+1) 2420 REAL larg_part(klon, klev, klev+1) 2421 REAL fracd(klon, klev+1) 2422 REAL xxx(klon, klev+1) 2423 REAL larg_cons(klon, klev+1) 2424 REAL larg_detr(klon, klev+1) 2425 REAL fm0(klon, klev+1), entr0(klon, klev), detr(klon, klev) 2426 REAL pu_therm(klon, klev), pv_therm(klon, klev) 2427 REAL fm(klon, klev+1), entr(klon, klev) 2428 REAL fmc(klon, klev+1) 2429 2430 REAL zcor, zdelta, zcvm5, qlbef 2431 REAL tbef(klon), qsatbef(klon) 2432 REAL dqsat_dt, dt, num, denom 2433 REAL reps, rlvcp, ddt0 2434 REAL ztla(klon, klev), zqla(klon, klev), zqta(klon, klev) 2435 2436 PARAMETER (ddt0=.01) 2437 2438 ! CR:nouvelles variables 2439 REAL f_star(klon, klev+1), entr_star(klon, klev) 2440 REAL entr_star_tot(klon), entr_star2(klon) 2441 REAL f(klon), f0(klon) 2442 REAL zlevinter(klon) 2443 LOGICAL first 2444 DATA first/.FALSE./ 2445 SAVE first 2446 !$OMP THREADPRIVATE(first) 2447 2448 ! RC 2449 2450 CHARACTER *2 str2 2451 CHARACTER *10 str10 2452 2453 CHARACTER (LEN=20) :: modname = 'thermcell_eau' 2454 CHARACTER (LEN=80) :: abort_message 2455 2456 LOGICAL vtest(klon), down 2457 LOGICAL zsat(klon) 2458 2459 EXTERNAL scopy 2460 2461 INTEGER ncorrec, ll 2462 SAVE ncorrec 2463 DATA ncorrec/0/ 2464 !$OMP THREADPRIVATE(ncorrec) 2465 2466 2467 2468 ! ----------------------------------------------------------------------- 2469 ! initialisation: 2470 ! --------------- 2471 2472 sorties = .TRUE. 2473 IF (ngrid/=klon) THEN 2474 PRINT * 2475 PRINT *, 'STOP dans convadj' 2476 PRINT *, 'ngrid =', ngrid 2477 PRINT *, 'klon =', klon 2478 END IF 2479 2480 ! Initialisation 2481 rlvcp = rlvtt/rcpd 2482 reps = rd/rv 2483 2484 ! ----------------------------------------------------------------------- 2485 ! AM Calcul de T,q,ql a partir de Tl et qT 2486 ! --------------------------------------------------- 2487 2488 ! Pr Tprec=Tl calcul de qsat 2489 ! Si qsat>qT T=Tl, q=qT 2490 ! Sinon DDT=(-Tprec+Tl+RLVCP (qT-qsat(T')) / (1+RLVCP dqsat/dt) 2491 ! On cherche DDT < DDT0 2492 2493 ! defaut 2494 DO ll = 1, nlay 2495 DO ig = 1, ngrid 2496 zo(ig, ll) = po(ig, ll) 2497 zl(ig, ll) = 0. 2498 zh(ig, ll) = pt(ig, ll) 2499 END DO 2500 END DO 2501 DO ig = 1, ngrid 2502 zsat(ig) = .FALSE. 2503 END DO 2504 2505 2506 DO ll = 1, nlay 2507 ! les points insatures sont definitifs 2508 DO ig = 1, ngrid 2509 tbef(ig) = pt(ig, ll) 2510 zdelta = max(0., sign(1.,rtt-tbef(ig))) 2511 qsatbef(ig) = r2es*foeew(tbef(ig), zdelta)/pplev(ig, ll) 2512 qsatbef(ig) = min(0.5, qsatbef(ig)) 2513 zcor = 1./(1.-retv*qsatbef(ig)) 2514 qsatbef(ig) = qsatbef(ig)*zcor 2515 zsat(ig) = (max(0.,po(ig,ll)-qsatbef(ig))>0.00001) 2516 END DO 2517 2518 DO ig = 1, ngrid 2519 IF (zsat(ig)) THEN 2520 qlbef = max(0., po(ig,ll)-qsatbef(ig)) 2521 ! si sature: ql est surestime, d'ou la sous-relax 2522 dt = 0.5*rlvcp*qlbef 2523 ! on pourra enchainer 2 ou 3 calculs sans Do while 2524 DO WHILE (dt>ddt0) 2525 ! il faut verifier si c,a conserve quand on repasse en insature ... 2526 tbef(ig) = tbef(ig) + dt 2527 zdelta = max(0., sign(1.,rtt-tbef(ig))) 2528 qsatbef(ig) = r2es*foeew(tbef(ig), zdelta)/pplev(ig, ll) 2529 qsatbef(ig) = min(0.5, qsatbef(ig)) 2530 zcor = 1./(1.-retv*qsatbef(ig)) 2531 qsatbef(ig) = qsatbef(ig)*zcor 2532 ! on veut le signe de qlbef 2533 qlbef = po(ig, ll) - qsatbef(ig) 2534 ! dqsat_dT 2535 zdelta = max(0., sign(1.,rtt-tbef(ig))) 2536 zcvm5 = r5les*(1.-zdelta) + r5ies*zdelta 2537 zcor = 1./(1.-retv*qsatbef(ig)) 2538 dqsat_dt = foede(tbef(ig), zdelta, zcvm5, qsatbef(ig), zcor) 2539 num = -tbef(ig) + pt(ig, ll) + rlvcp*qlbef 2540 denom = 1. + rlvcp*dqsat_dt 2541 dt = num/denom 2542 END DO 2543 ! on ecrit de maniere conservative (sat ou non) 2544 zl(ig, ll) = max(0., qlbef) 2545 ! T = Tl +Lv/Cp ql 2546 zh(ig, ll) = pt(ig, ll) + rlvcp*zl(ig, ll) 2547 zo(ig, ll) = po(ig, ll) - zl(ig, ll) 2548 END IF 2549 END DO 2550 END DO 2551 ! AM fin 2552 2553 ! ----------------------------------------------------------------------- 2554 ! incrementation eventuelle de tendances precedentes: 2555 ! --------------------------------------------------- 2556 2557 ! PRINT*,'0 OK convect8' 2558 2559 DO l = 1, nlay 2560 DO ig = 1, ngrid 2561 zpspsk(ig, l) = (pplay(ig,l)/pplev(ig,1))**rkappa 2562 ! zh(ig,l)=pt(ig,l)/zpspsk(ig,l) 2563 zu(ig, l) = pu(ig, l) 2564 zv(ig, l) = pv(ig, l) 2565 ! zo(ig,l)=po(ig,l) 2566 ! ztv(ig,l)=zh(ig,l)*(1.+0.61*zo(ig,l)) 2567 ! AM attention zh est maintenant le profil de T et plus le profil de 2568 ! theta ! 2569 2570 ! T-> Theta 2571 ztv(ig, l) = zh(ig, l)/zpspsk(ig, l) 2572 ! AM Theta_v 2573 ztv(ig, l) = ztv(ig, l)*(1.+retv*(zo(ig,l))-zl(ig,l)) 2574 ! AM Thetal 2575 zthl(ig, l) = pt(ig, l)/zpspsk(ig, l) 2576 2577 END DO 2578 END DO 2579 2580 ! PRINT*,'1 OK convect8' 2581 ! -------------------- 2582 2583 2584 ! + + + + + + + + + + + 2585 2586 2587 ! wa, fraca, wd, fracd -------------------- zlev(2), rhobarz 2588 ! wh,wt,wo ... 2589 2590 ! + + + + + + + + + + + zh,zu,zv,zo,rho 2591 2592 2593 ! -------------------- zlev(1) 2594 ! \\\\\\\\\\\\\\\\\\\\ 2595 2596 2597 2598 ! ----------------------------------------------------------------------- 2599 ! Calcul des altitudes des couches 2600 ! ----------------------------------------------------------------------- 2601 2602 DO l = 2, nlay 2603 DO ig = 1, ngrid 2604 zlev(ig, l) = 0.5*(pphi(ig,l)+pphi(ig,l-1))/rg 2605 END DO 2606 END DO 2607 DO ig = 1, ngrid 2608 zlev(ig, 1) = 0. 2609 zlev(ig, nlay+1) = (2.*pphi(ig,klev)-pphi(ig,klev-1))/rg 2610 END DO 2611 DO l = 1, nlay 2612 DO ig = 1, ngrid 2613 zlay(ig, l) = pphi(ig, l)/rg 2614 END DO 2615 END DO 2616 2617 ! PRINT*,'2 OK convect8' 2618 ! ----------------------------------------------------------------------- 2619 ! Calcul des densites 2620 ! ----------------------------------------------------------------------- 2621 2622 DO l = 1, nlay 2623 DO ig = 1, ngrid 2624 ! rho(ig,l)=pplay(ig,l)/(zpspsk(ig,l)*RD*zh(ig,l)) 2625 rho(ig, l) = pplay(ig, l)/(zpspsk(ig,l)*rd*ztv(ig,l)) 2626 END DO 2627 END DO 2628 2629 DO l = 2, nlay 2630 DO ig = 1, ngrid 2631 rhobarz(ig, l) = 0.5*(rho(ig,l)+rho(ig,l-1)) 2632 END DO 2633 END DO 2634 2635 DO k = 1, nlay 2636 DO l = 1, nlay + 1 2637 DO ig = 1, ngrid 2638 wa(ig, k, l) = 0. 2639 END DO 2640 END DO 2641 END DO 2642 2643 ! PRINT*,'3 OK convect8' 2644 ! ------------------------------------------------------------------ 2645 ! Calcul de w2, quarre de w a partir de la cape 2646 ! a partir de w2, on calcule wa, vitesse de l'ascendance 2647 2648 ! ATTENTION: Dans cette version, pour cause d'economie de memoire, 2649 ! w2 est stoke dans wa 2650 2651 ! ATTENTION: dans convect8, on n'utilise le calcule des wa 2652 ! independants par couches que pour calculer l'entrainement 2653 ! a la base et la hauteur max de l'ascendance. 2654 2655 ! Indicages: 2656 ! l'ascendance provenant du niveau k traverse l'interface l avec 2657 ! une vitesse wa(k,l). 2658 2659 ! -------------------- 2660 2661 ! + + + + + + + + + + 2662 2663 ! wa(k,l) ---- -------------------- l 2664 ! /\ 2665 ! /||\ + + + + + + + + + + 2666 ! || 2667 ! || -------------------- 2668 ! || 2669 ! || + + + + + + + + + + 2670 ! || 2671 ! || -------------------- 2672 ! ||__ 2673 ! |___ + + + + + + + + + + k 2674 2675 ! -------------------- 2676 2677 2678 2679 ! ------------------------------------------------------------------ 2680 2681 ! CR: ponderation entrainement des couches instables 2682 ! def des entr_star tels que entr=f*entr_star 2683 DO l = 1, klev 2684 DO ig = 1, ngrid 2685 entr_star(ig, l) = 0. 2686 END DO 2687 END DO 2688 ! determination de la longueur de la couche d entrainement 2689 DO ig = 1, ngrid 2690 lentr(ig) = 1 2691 END DO 2692 2693 ! on ne considere que les premieres couches instables 2694 DO k = nlay - 1, 1, -1 2695 DO ig = 1, ngrid 2696 IF (ztv(ig,k)>ztv(ig,k+1) .AND. ztv(ig,k+1)<ztv(ig,k+2)) THEN 2697 lentr(ig) = k 2698 END IF 2699 END DO 2700 END DO 2701 2702 ! determination du lmin: couche d ou provient le thermique 2703 DO ig = 1, ngrid 2704 lmin(ig) = 1 2705 END DO 2706 DO ig = 1, ngrid 2707 DO l = nlay, 2, -1 2708 IF (ztv(ig,l-1)>ztv(ig,l)) THEN 2709 lmin(ig) = l - 1 2710 END IF 2711 END DO 2712 END DO 2713 2714 ! definition de l'entrainement des couches 2715 DO l = 1, klev - 1 2716 DO ig = 1, ngrid 2717 IF (ztv(ig,l)>ztv(ig,l+1) .AND. l>=lmin(ig) .AND. l<=lentr(ig)) THEN 2718 entr_star(ig, l) = (ztv(ig,l)-ztv(ig,l+1))*(zlev(ig,l+1)-zlev(ig,l)) 2719 END IF 2720 END DO 2721 END DO 2722 ! pas de thermique si couche 1 stable 2723 DO ig = 1, ngrid 2724 IF (lmin(ig)>1) THEN 2725 DO l = 1, klev 2726 entr_star(ig, l) = 0. 2727 END DO 2728 END IF 2729 END DO 2730 ! calcul de l entrainement total 2731 DO ig = 1, ngrid 2732 entr_star_tot(ig) = 0. 2733 END DO 2734 DO ig = 1, ngrid 2735 DO k = 1, klev 2736 entr_star_tot(ig) = entr_star_tot(ig) + entr_star(ig, k) 2737 END DO 2738 END DO 2739 2740 DO k = 1, klev 2741 DO ig = 1, ngrid 2742 ztva(ig, k) = ztv(ig, k) 2743 END DO 2744 END DO 2745 ! RC 2746 ! AM:initialisations 2747 DO k = 1, nlay 2748 DO ig = 1, ngrid 2749 ztva(ig, k) = ztv(ig, k) 2750 ztla(ig, k) = zthl(ig, k) 2751 zqla(ig, k) = 0. 2752 zqta(ig, k) = po(ig, k) 2753 zsat(ig) = .FALSE. 2754 END DO 2755 END DO 2756 2757 ! PRINT*,'7 OK convect8' 2758 DO k = 1, klev + 1 2759 DO ig = 1, ngrid 2760 zw2(ig, k) = 0. 2761 fmc(ig, k) = 0. 2762 ! CR 2763 f_star(ig, k) = 0. 2764 ! RC 2765 larg_cons(ig, k) = 0. 2766 larg_detr(ig, k) = 0. 2767 wa_moy(ig, k) = 0. 2768 END DO 2769 END DO 2770 2771 ! PRINT*,'8 OK convect8' 2772 DO ig = 1, ngrid 2773 linter(ig) = 1. 2774 lmaxa(ig) = 1 2775 lmix(ig) = 1 2776 wmaxa(ig) = 0. 2777 END DO 2778 2779 ! CR: 2780 DO l = 1, nlay - 2 2781 DO ig = 1, ngrid 2782 IF (ztv(ig,l)>ztv(ig,l+1) .AND. entr_star(ig,l)>1.E-10 .AND. & 2783 zw2(ig,l)<1E-10) THEN 2784 ! AM 2785 ztla(ig, l) = zthl(ig, l) 2786 zqta(ig, l) = po(ig, l) 2787 zqla(ig, l) = zl(ig, l) 2788 ! AM 2789 f_star(ig, l+1) = entr_star(ig, l) 2790 ! test:calcul de dteta 2791 zw2(ig, l+1) = 2.*rg*(ztv(ig,l)-ztv(ig,l+1))/ztv(ig, l+1)* & 2792 (zlev(ig,l+1)-zlev(ig,l))*0.4*pphi(ig, l)/(pphi(ig,l+1)-pphi(ig,l)) 2793 larg_detr(ig, l) = 0. 2794 ELSE IF ((zw2(ig,l)>=1E-10) .AND. (f_star(ig,l)+entr_star(ig, & 2795 l)>1.E-10)) THEN 2796 f_star(ig, l+1) = f_star(ig, l) + entr_star(ig, l) 2797 2798 ! AM on melange Tl et qt du thermique 2799 ztla(ig, l) = (f_star(ig,l)*ztla(ig,l-1)+entr_star(ig,l)*zthl(ig,l))/ & 2800 f_star(ig, l+1) 2801 zqta(ig, l) = (f_star(ig,l)*zqta(ig,l-1)+entr_star(ig,l)*po(ig,l))/ & 2802 f_star(ig, l+1) 2803 2804 ! ztva(ig,l)=(f_star(ig,l)*ztva(ig,l-1)+entr_star(ig,l) 2805 ! s *ztv(ig,l))/f_star(ig,l+1) 2806 2807 ! AM on en deduit thetav et ql du thermique 2808 tbef(ig) = ztla(ig, l)*zpspsk(ig, l) 2809 zdelta = max(0., sign(1.,rtt-tbef(ig))) 2810 qsatbef(ig) = r2es*foeew(tbef(ig), zdelta)/pplev(ig, l) 2811 qsatbef(ig) = min(0.5, qsatbef(ig)) 2812 zcor = 1./(1.-retv*qsatbef(ig)) 2813 qsatbef(ig) = qsatbef(ig)*zcor 2814 zsat(ig) = (max(0.,zqta(ig,l)-qsatbef(ig))>0.00001) 2815 END IF 2816 END DO 2817 DO ig = 1, ngrid 2818 IF (zsat(ig)) THEN 2819 qlbef = max(0., zqta(ig,l)-qsatbef(ig)) 2820 dt = 0.5*rlvcp*qlbef 2821 DO WHILE (dt>ddt0) 2822 tbef(ig) = tbef(ig) + dt 2823 zdelta = max(0., sign(1.,rtt-tbef(ig))) 2824 qsatbef(ig) = r2es*foeew(tbef(ig), zdelta)/pplev(ig, l) 2825 qsatbef(ig) = min(0.5, qsatbef(ig)) 2826 zcor = 1./(1.-retv*qsatbef(ig)) 2827 qsatbef(ig) = qsatbef(ig)*zcor 2828 qlbef = zqta(ig, l) - qsatbef(ig) 2829 2830 zdelta = max(0., sign(1.,rtt-tbef(ig))) 2831 zcvm5 = r5les*(1.-zdelta) + r5ies*zdelta 2832 zcor = 1./(1.-retv*qsatbef(ig)) 2833 dqsat_dt = foede(tbef(ig), zdelta, zcvm5, qsatbef(ig), zcor) 2834 num = -tbef(ig) + ztla(ig, l)*zpspsk(ig, l) + rlvcp*qlbef 2835 denom = 1. + rlvcp*dqsat_dt 2836 dt = num/denom 2837 END DO 2838 zqla(ig, l) = max(0., zqta(ig,l)-qsatbef(ig)) 2839 END IF 2840 ! on ecrit de maniere conservative (sat ou non) 2841 ! T = Tl +Lv/Cp ql 2842 ztva(ig, l) = ztla(ig, l)*zpspsk(ig, l) + rlvcp*zqla(ig, l) 2843 ztva(ig, l) = ztva(ig, l)/zpspsk(ig, l) 2844 ztva(ig, l) = ztva(ig, l)*(1.+retv*(zqta(ig,l)-zqla(ig,l))-zqla(ig,l)) 2845 2846 END DO 2847 DO ig = 1, ngrid 2848 IF (zw2(ig,l)>=1.E-10 .AND. f_star(ig,l)+entr_star(ig,l)>1.E-10) THEN 2849 ! mise a jour de la vitesse ascendante (l'air entraine de la couche 2850 ! consideree commence avec une vitesse nulle). 2851 2852 zw2(ig, l+1) = zw2(ig, l)*(f_star(ig,l)/f_star(ig,l+1))**2 + & 2853 2.*rg*(ztva(ig,l)-ztv(ig,l))/ztv(ig, l)*(zlev(ig,l+1)-zlev(ig,l)) 2854 END IF 2855 ! determination de zmax continu par interpolation lineaire 2856 IF (zw2(ig,l+1)<0.) THEN 2857 linter(ig) = (l*(zw2(ig,l+1)-zw2(ig,l))-zw2(ig,l))/(zw2(ig,l+1)-zw2( & 2858 ig,l)) 2859 zw2(ig, l+1) = 0. 2860 lmaxa(ig) = l 2861 ELSE 2862 wa_moy(ig, l+1) = sqrt(zw2(ig,l+1)) 2863 END IF 2864 IF (wa_moy(ig,l+1)>wmaxa(ig)) THEN 2865 ! lmix est le niveau de la couche ou w (wa_moy) est maximum 2866 lmix(ig) = l + 1 2867 wmaxa(ig) = wa_moy(ig, l+1) 2868 END IF 2869 END DO 2870 END DO 2871 2872 ! Calcul de la couche correspondant a la hauteur du thermique 2873 DO ig = 1, ngrid 2874 lmax(ig) = lentr(ig) 2875 END DO 2876 DO ig = 1, ngrid 2877 DO l = nlay, lentr(ig) + 1, -1 2878 IF (zw2(ig,l)<=1.E-10) THEN 2879 lmax(ig) = l - 1 2880 END IF 2881 END DO 2882 END DO 2883 ! pas de thermique si couche 1 stable 2884 DO ig = 1, ngrid 2885 IF (lmin(ig)>1) THEN 2886 lmax(ig) = 1 2887 lmin(ig) = 1 2888 END IF 2889 END DO 2890 2891 ! Determination de zw2 max 2892 DO ig = 1, ngrid 2893 wmax(ig) = 0. 2894 END DO 2895 2896 DO l = 1, nlay 2897 DO ig = 1, ngrid 2898 IF (l<=lmax(ig)) THEN 2899 zw2(ig, l) = sqrt(zw2(ig,l)) 2900 wmax(ig) = max(wmax(ig), zw2(ig,l)) 2901 ELSE 2902 zw2(ig, l) = 0. 2903 END IF 2904 END DO 2905 END DO 2906 2907 ! Longueur caracteristique correspondant a la hauteur des thermiques. 2908 DO ig = 1, ngrid 2909 zmax(ig) = 500. 2910 zlevinter(ig) = zlev(ig, 1) 2911 END DO 2912 DO ig = 1, ngrid 2913 ! calcul de zlevinter 2914 zlevinter(ig) = (zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig)))*linter(ig) + & 2915 zlev(ig, lmax(ig)) - lmax(ig)*(zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig))) 2916 zmax(ig) = max(zmax(ig), zlevinter(ig)-zlev(ig,lmin(ig))) 2917 END DO 2918 2919 ! Fermeture,determination de f 2920 DO ig = 1, ngrid 2921 entr_star2(ig) = 0. 2922 END DO 2923 DO ig = 1, ngrid 2924 IF (entr_star_tot(ig)<1.E-10) THEN 2925 f(ig) = 0. 2926 ELSE 2927 DO k = lmin(ig), lentr(ig) 2928 entr_star2(ig) = entr_star2(ig) + entr_star(ig, k)**2/(rho(ig,k)*( & 2929 zlev(ig,k+1)-zlev(ig,k))) 2930 END DO 2931 ! Nouvelle fermeture 2932 f(ig) = wmax(ig)/(zmax(ig)*r_aspect*entr_star2(ig))*entr_star_tot(ig) 2933 ! test 2934 IF (first) THEN 2935 f(ig) = f(ig) + (f0(ig)-f(ig))*exp(-ptimestep/zmax(ig)*wmax(ig)) 2936 END IF 2937 END IF 2938 f0(ig) = f(ig) 2939 first = .TRUE. 2940 END DO 2941 2942 ! Calcul de l'entrainement 2943 DO k = 1, klev 2944 DO ig = 1, ngrid 2945 entr(ig, k) = f(ig)*entr_star(ig, k) 2946 END DO 2947 END DO 2948 ! Calcul des flux 2949 DO ig = 1, ngrid 2950 DO l = 1, lmax(ig) - 1 2951 fmc(ig, l+1) = fmc(ig, l) + entr(ig, l) 2952 END DO 2953 END DO 2954 2955 ! RC 2956 2957 2958 ! PRINT*,'9 OK convect8' 2959 ! PRINT*,'WA1 ',wa_moy 2960 2961 ! determination de l'indice du debut de la mixed layer ou w decroit 2962 2963 ! calcul de la largeur de chaque ascendance dans le cas conservatif. 2964 ! dans ce cas simple, on suppose que la largeur de l'ascendance provenant 2965 ! d'une couche est égale à la hauteur de la couche alimentante. 2966 ! La vitesse maximale dans l'ascendance est aussi prise comme estimation 2967 ! de la vitesse d'entrainement horizontal dans la couche alimentante. 2968 2969 DO l = 2, nlay 2970 DO ig = 1, ngrid 2971 IF (l<=lmaxa(ig)) THEN 2972 zw = max(wa_moy(ig,l), 1.E-10) 2973 larg_cons(ig, l) = zmax(ig)*r_aspect*fmc(ig, l)/(rhobarz(ig,l)*zw) 2974 END IF 2975 END DO 2976 END DO 2977 2978 DO l = 2, nlay 2979 DO ig = 1, ngrid 2980 IF (l<=lmaxa(ig)) THEN 2981 ! if (idetr.EQ.0) THEN 2982 ! cette option est finalement en dur. 2983 larg_detr(ig, l) = sqrt(l_mix*zlev(ig,l)) 2984 ! ELSE IF (idetr.EQ.1) THEN 2985 ! larg_detr(ig,l)=larg_cons(ig,l) 2986 ! s *sqrt(l_mix*zlev(ig,l))/larg_cons(ig,lmix(ig)) 2987 ! ELSE IF (idetr.EQ.2) THEN 2988 ! larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l)) 2989 ! s *sqrt(wa_moy(ig,l)) 2990 ! ELSE IF (idetr.EQ.4) THEN 2991 ! larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l)) 2992 ! s *wa_moy(ig,l) 2993 ! END IF 2994 END IF 2995 END DO 2996 END DO 2997 2998 ! PRINT*,'10 OK convect8' 2999 ! PRINT*,'WA2 ',wa_moy 3000 ! calcul de la fraction de la maille concernée par l'ascendance en tenant 3001 ! compte de l'epluchage du thermique. 3002 3003 ! CR def de zmix continu (profil parabolique des vitesses) 3004 DO ig = 1, ngrid 3005 IF (lmix(ig)>1.) THEN 3006 zmix(ig) = ((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig)))*((zlev(ig,lmix(ig))) & 3007 **2-(zlev(ig,lmix(ig)+1))**2)-(zw2(ig,lmix(ig))-zw2(ig, & 3008 lmix(ig)+1))*((zlev(ig,lmix(ig)-1))**2-(zlev(ig,lmix(ig)))**2))/ & 3009 (2.*((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig)))*((zlev(ig,lmix(ig)))- & 3010 (zlev(ig,lmix(ig)+1)))-(zw2(ig,lmix(ig))-zw2(ig,lmix(ig)+1))*((zlev( & 3011 ig,lmix(ig)-1))-(zlev(ig,lmix(ig)))))) 3012 ELSE 3013 zmix(ig) = 0. 3014 END IF 3015 END DO 3016 3017 ! calcul du nouveau lmix correspondant 3018 DO ig = 1, ngrid 3019 DO l = 1, klev 3020 IF (zmix(ig)>=zlev(ig,l) .AND. zmix(ig)<zlev(ig,l+1)) THEN 3021 lmix(ig) = l 3022 END IF 3023 END DO 3024 END DO 3025 3026 DO l = 2, nlay 3027 DO ig = 1, ngrid 3028 IF (larg_cons(ig,l)>1.) THEN 3029 ! PRINT*,ig,l,lmix(ig),lmaxa(ig),larg_cons(ig,l),' KKK' 3030 fraca(ig, l) = (larg_cons(ig,l)-larg_detr(ig,l))/(r_aspect*zmax(ig)) 3031 ! test 3032 fraca(ig, l) = max(fraca(ig,l), 0.) 3033 fraca(ig, l) = min(fraca(ig,l), 0.5) 3034 fracd(ig, l) = 1. - fraca(ig, l) 3035 fracc(ig, l) = larg_cons(ig, l)/(r_aspect*zmax(ig)) 3036 ELSE 3037 ! wa_moy(ig,l)=0. 3038 fraca(ig, l) = 0. 3039 fracc(ig, l) = 0. 3040 fracd(ig, l) = 1. 3041 END IF 3042 END DO 3043 END DO 3044 ! CR: calcul de fracazmix 3045 DO ig = 1, ngrid 3046 fracazmix(ig) = (fraca(ig,lmix(ig)+1)-fraca(ig,lmix(ig)))/ & 3047 (zlev(ig,lmix(ig)+1)-zlev(ig,lmix(ig)))*zmix(ig) + & 3048 fraca(ig, lmix(ig)) - zlev(ig, lmix(ig))*(fraca(ig,lmix(ig)+1)-fraca(ig & 3049 ,lmix(ig)))/(zlev(ig,lmix(ig)+1)-zlev(ig,lmix(ig))) 3050 END DO 3051 3052 DO l = 2, nlay 3053 DO ig = 1, ngrid 3054 IF (larg_cons(ig,l)>1.) THEN 3055 IF (l>lmix(ig)) THEN 3056 xxx(ig, l) = (zmax(ig)-zlev(ig,l))/(zmax(ig)-zmix(ig)) 3057 IF (idetr==0) THEN 3058 fraca(ig, l) = fracazmix(ig) 3059 ELSE IF (idetr==1) THEN 3060 fraca(ig, l) = fracazmix(ig)*xxx(ig, l) 3061 ELSE IF (idetr==2) THEN 3062 fraca(ig, l) = fracazmix(ig)*(1.-(1.-xxx(ig,l))**2) 3063 ELSE 3064 fraca(ig, l) = fracazmix(ig)*xxx(ig, l)**2 3065 END IF 3066 ! PRINT*,ig,l,lmix(ig),lmaxa(ig),xxx(ig,l),'LLLLLLL' 3067 fraca(ig, l) = max(fraca(ig,l), 0.) 3068 fraca(ig, l) = min(fraca(ig,l), 0.5) 3069 fracd(ig, l) = 1. - fraca(ig, l) 3070 fracc(ig, l) = larg_cons(ig, l)/(r_aspect*zmax(ig)) 3071 END IF 3072 END IF 3073 END DO 3074 END DO 3075 3076 ! PRINT*,'11 OK convect8' 3077 ! PRINT*,'Ea3 ',wa_moy 3078 ! ------------------------------------------------------------------ 3079 ! Calcul de fracd, wd 3080 ! somme wa - wd = 0 3081 ! ------------------------------------------------------------------ 3082 3083 3084 DO ig = 1, ngrid 3085 fm(ig, 1) = 0. 3086 fm(ig, nlay+1) = 0. 3087 END DO 3088 3089 DO l = 2, nlay 3090 DO ig = 1, ngrid 3091 fm(ig, l) = fraca(ig, l)*wa_moy(ig, l)*rhobarz(ig, l) 3092 ! CR:test 3093 IF (entr(ig,l-1)<1E-10 .AND. fm(ig,l)>fm(ig,l-1) .AND. l>lmix(ig)) THEN 3094 fm(ig, l) = fm(ig, l-1) 3095 ! WRITE(1,*)'ajustement fm, l',l 3096 END IF 3097 ! WRITE(1,*)'ig,l,fm(ig,l)',ig,l,fm(ig,l) 3098 ! RC 3099 END DO 3100 DO ig = 1, ngrid 3101 IF (fracd(ig,l)<0.1) THEN 3102 abort_message = 'fracd trop petit' 3103 CALL abort_physic(modname, abort_message, 1) 3104 ELSE 3105 ! vitesse descendante "diagnostique" 3106 wd(ig, l) = fm(ig, l)/(fracd(ig,l)*rhobarz(ig,l)) 3107 END IF 3108 END DO 3109 END DO 3110 3111 DO l = 1, nlay 3112 DO ig = 1, ngrid 3113 ! masse(ig,l)=rho(ig,l)*(zlev(ig,l+1)-zlev(ig,l)) 3114 masse(ig, l) = (pplev(ig,l)-pplev(ig,l+1))/rg 3115 END DO 3116 END DO 3117 3118 ! PRINT*,'12 OK convect8' 3119 ! PRINT*,'WA4 ',wa_moy 3120 ! c------------------------------------------------------------------ 3121 ! calcul du transport vertical 3122 ! ------------------------------------------------------------------ 3123 3124 GO TO 4444 3125 ! PRINT*,'XXXXXXXXXXXXXXX ptimestep= ',ptimestep 3126 DO l = 2, nlay - 1 3127 DO ig = 1, ngrid 3128 IF (fm(ig,l+1)*ptimestep>masse(ig,l) .AND. fm(ig,l+1)*ptimestep>masse( & 3129 ig,l+1)) THEN 3130 ! PRINT*,'WARN!!! FM>M ig=',ig,' l=',l,' FM=' 3131 ! s ,fm(ig,l+1)*ptimestep 3132 ! s ,' M=',masse(ig,l),masse(ig,l+1) 3133 END IF 3134 END DO 3135 END DO 3136 3137 DO l = 1, nlay 3138 DO ig = 1, ngrid 3139 IF (entr(ig,l)*ptimestep>masse(ig,l)) THEN 3140 ! PRINT*,'WARN!!! E>M ig=',ig,' l=',l,' E==' 3141 ! s ,entr(ig,l)*ptimestep 3142 ! s ,' M=',masse(ig,l) 3143 END IF 3144 END DO 3145 END DO 3146 3147 DO l = 1, nlay 3148 DO ig = 1, ngrid 3149 IF (.NOT. fm(ig,l)>=0. .OR. .NOT. fm(ig,l)<=10.) THEN 3150 ! PRINT*,'WARN!!! fm exagere ig=',ig,' l=',l 3151 ! s ,' FM=',fm(ig,l) 3152 END IF 3153 IF (.NOT. masse(ig,l)>=1.E-10 .OR. .NOT. masse(ig,l)<=1.E4) THEN 3154 ! PRINT*,'WARN!!! masse exagere ig=',ig,' l=',l 3155 ! s ,' M=',masse(ig,l) 3156 ! PRINT*,'rho(ig,l),pplay(ig,l),zpspsk(ig,l),RD,zh(ig,l)', 3157 ! s rho(ig,l),pplay(ig,l),zpspsk(ig,l),RD,zh(ig,l) 3158 ! PRINT*,'zlev(ig,l+1),zlev(ig,l)' 3159 ! s ,zlev(ig,l+1),zlev(ig,l) 3160 ! PRINT*,'pphi(ig,l-1),pphi(ig,l),pphi(ig,l+1)' 3161 ! s ,pphi(ig,l-1),pphi(ig,l),pphi(ig,l+1) 3162 END IF 3163 IF (.NOT. entr(ig,l)>=0. .OR. .NOT. entr(ig,l)<=10.) THEN 3164 ! PRINT*,'WARN!!! entr exagere ig=',ig,' l=',l 3165 ! s ,' E=',entr(ig,l) 3166 END IF 3167 END DO 3168 END DO 3169 3170 4444 CONTINUE 3171 3172 IF (w2di==1) THEN 3173 fm0 = fm0 + ptimestep*(fm-fm0)/tho 3174 entr0 = entr0 + ptimestep*(entr-entr0)/tho 3175 ELSE 3176 fm0 = fm 3177 entr0 = entr 3178 END IF 3179 3180 IF (1==1) THEN 3181 ! CALL dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse 3182 ! . ,zh,zdhadj,zha) 3183 ! CALL dqthermcell(ngrid,nlay,ptimestep,fm0,entr0,masse 3184 ! . ,zo,pdoadj,zoa) 3185 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zthl, & 3186 zdthladj, zta) 3187 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, po, pdoadj, & 3188 zoa) 3189 ELSE 3190 CALL dqthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca, zh, & 3191 zdhadj, zha) 3192 CALL dqthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca, zo, & 3193 pdoadj, zoa) 3194 END IF 3195 3196 IF (1==0) THEN 3197 CALL dvthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca, zmax, & 3198 zu, zv, pduadj, pdvadj, zua, zva) 3199 ELSE 3200 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zu, pduadj, & 3201 zua) 3202 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zv, pdvadj, & 3203 zva) 3204 END IF 3205 3206 DO l = 1, nlay 3207 DO ig = 1, ngrid 3208 zf = 0.5*(fracc(ig,l)+fracc(ig,l+1)) 3209 zf2 = zf/(1.-zf) 3210 thetath2(ig, l) = zf2*(zha(ig,l)-zh(ig,l))**2 3211 wth2(ig, l) = zf2*(0.5*(wa_moy(ig,l)+wa_moy(ig,l+1)))**2 3212 END DO 3213 END DO 3214 3215 3216 3217 ! PRINT*,'13 OK convect8' 3218 ! PRINT*,'WA5 ',wa_moy 3219 DO l = 1, nlay 3220 DO ig = 1, ngrid 3221 ! pdtadj(ig,l)=zdhadj(ig,l)*zpspsk(ig,l) 3222 pdtadj(ig, l) = zdthladj(ig, l)*zpspsk(ig, l) 3223 END DO 3224 END DO 3225 3226 3227 ! do l=1,nlay 3228 ! do ig=1,ngrid 3229 ! IF(abs(pdtadj(ig,l))*86400..gt.500.) THEN 3230 ! PRINT*,'WARN!!! ig=',ig,' l=',l 3231 ! s ,' pdtadj=',pdtadj(ig,l) 3232 ! END IF 3233 ! IF(abs(pdoadj(ig,l))*86400..gt.1.) THEN 3234 ! PRINT*,'WARN!!! ig=',ig,' l=',l 3235 ! s ,' pdoadj=',pdoadj(ig,l) 3236 ! END IF 3237 ! enddo 3238 ! enddo 3239 3240 ! PRINT*,'14 OK convect8' 3241 ! ------------------------------------------------------------------ 3242 ! Calculs pour les sorties 3243 ! ------------------------------------------------------------------ 3244 3245 3246 END SUBROUTINE thermcell_eau 3247 3248 SUBROUTINE thermcell(ngrid, nlay, ptimestep, pplay, pplev, pphi, pu, pv, pt, & 3249 po, pduadj, pdvadj, pdtadj, pdoadj, fm0, entr0 & ! s 3250 ! ,pu_therm,pv_therm 3251 , r_aspect, l_mix, w2di, tho) 3252 3253 USE dimphy 3254 IMPLICIT NONE 3255 3256 ! ======================================================================= 3257 3258 ! Calcul du transport verticale dans la couche limite en presence 3259 ! de "thermiques" explicitement representes 3260 3261 ! Réécriture à partir d'un listing papier à Habas, le 14/02/00 3262 3263 ! le thermique est supposé homogène et dissipé par mélange avec 3264 ! son environnement. la longueur l_mix contrôle l'efficacité du 3265 ! mélange 3266 3267 ! Le calcul du transport des différentes espèces se fait en prenant 3268 ! en compte: 3269 ! 1. un flux de masse montant 3270 ! 2. un flux de masse descendant 3271 ! 3. un entrainement 3272 ! 4. un detrainement 3273 3274 ! ======================================================================= 3275 3276 ! ----------------------------------------------------------------------- 3277 ! declarations: 3278 ! ------------- 3279 3280 include "YOMCST.h" 3281 3282 ! arguments: 3283 ! ---------- 3284 3285 INTEGER ngrid, nlay, w2di 3286 REAL tho 3287 REAL ptimestep, l_mix, r_aspect 3288 REAL pt(ngrid, nlay), pdtadj(ngrid, nlay) 3289 REAL pu(ngrid, nlay), pduadj(ngrid, nlay) 3290 REAL pv(ngrid, nlay), pdvadj(ngrid, nlay) 3291 REAL po(ngrid, nlay), pdoadj(ngrid, nlay) 3292 REAL pplay(ngrid, nlay), pplev(ngrid, nlay+1) 3293 REAL pphi(ngrid, nlay) 3294 3295 INTEGER idetr 3296 SAVE idetr 3297 DATA idetr/3/ 3298 !$OMP THREADPRIVATE(idetr) 3299 3300 ! local: 3301 ! ------ 3302 3303 INTEGER ig, k, l, lmaxa(klon), lmix(klon) 3304 REAL zsortie1d(klon) 3305 ! CR: on remplace lmax(klon,klev+1) 3306 INTEGER lmax(klon), lmin(klon), lentr(klon) 3307 REAL linter(klon) 3308 REAL zmix(klon), fracazmix(klon) 3309 ! RC 3310 REAL zmax(klon), zw, zz, zw2(klon, klev+1), ztva(klon, klev), zzz 3311 3312 REAL zlev(klon, klev+1), zlay(klon, klev) 3313 REAL zh(klon, klev), zdhadj(klon, klev) 3314 REAL ztv(klon, klev) 3315 REAL zu(klon, klev), zv(klon, klev), zo(klon, klev) 3316 REAL wh(klon, klev+1) 3317 REAL wu(klon, klev+1), wv(klon, klev+1), wo(klon, klev+1) 3318 REAL zla(klon, klev+1) 3319 REAL zwa(klon, klev+1) 3320 REAL zld(klon, klev+1) 3321 REAL zwd(klon, klev+1) 3322 REAL zsortie(klon, klev) 3323 REAL zva(klon, klev) 3324 REAL zua(klon, klev) 3325 REAL zoa(klon, klev) 3326 3327 REAL zha(klon, klev) 3328 REAL wa_moy(klon, klev+1) 3329 REAL fraca(klon, klev+1) 3330 REAL fracc(klon, klev+1) 3331 REAL zf, zf2 3332 REAL thetath2(klon, klev), wth2(klon, klev) 3333 ! common/comtherm/thetath2,wth2 3334 3335 REAL count_time 3336 INTEGER ialt 3337 3338 LOGICAL sorties 3339 REAL rho(klon, klev), rhobarz(klon, klev+1), masse(klon, klev) 3340 REAL zpspsk(klon, klev) 3341 3342 ! real wmax(klon,klev),wmaxa(klon) 3343 REAL wmax(klon), wmaxa(klon) 3344 REAL wa(klon, klev, klev+1) 3345 REAL wd(klon, klev+1) 3346 REAL larg_part(klon, klev, klev+1) 3347 REAL fracd(klon, klev+1) 3348 REAL xxx(klon, klev+1) 3349 REAL larg_cons(klon, klev+1) 3350 REAL larg_detr(klon, klev+1) 3351 REAL fm0(klon, klev+1), entr0(klon, klev), detr(klon, klev) 3352 REAL pu_therm(klon, klev), pv_therm(klon, klev) 3353 REAL fm(klon, klev+1), entr(klon, klev) 3354 REAL fmc(klon, klev+1) 3355 3356 ! CR:nouvelles variables 3357 REAL f_star(klon, klev+1), entr_star(klon, klev) 3358 REAL entr_star_tot(klon), entr_star2(klon) 3359 REAL f(klon), f0(klon) 3360 REAL zlevinter(klon) 3361 LOGICAL first 3362 DATA first/.FALSE./ 3363 SAVE first 3364 !$OMP THREADPRIVATE(first) 3365 ! RC 3366 3367 CHARACTER *2 str2 3368 CHARACTER *10 str10 3369 3370 CHARACTER (LEN=20) :: modname = 'thermcell' 3371 CHARACTER (LEN=80) :: abort_message 3372 3373 LOGICAL vtest(klon), down 3374 3375 EXTERNAL scopy 3376 3377 INTEGER ncorrec, ll 3378 SAVE ncorrec 3379 DATA ncorrec/0/ 3380 !$OMP THREADPRIVATE(ncorrec) 3381 3382 3383 ! ----------------------------------------------------------------------- 3384 ! initialisation: 3385 ! --------------- 3386 3387 sorties = .TRUE. 3388 IF (ngrid/=klon) THEN 3389 PRINT * 3390 PRINT *, 'STOP dans convadj' 3391 PRINT *, 'ngrid =', ngrid 3392 PRINT *, 'klon =', klon 3393 END IF 3394 3395 ! ----------------------------------------------------------------------- 3396 ! incrementation eventuelle de tendances precedentes: 3397 ! --------------------------------------------------- 3398 3399 ! PRINT*,'0 OK convect8' 3400 3401 DO l = 1, nlay 3402 DO ig = 1, ngrid 3403 zpspsk(ig, l) = (pplay(ig,l)/pplev(ig,1))**rkappa 3404 zh(ig, l) = pt(ig, l)/zpspsk(ig, l) 3405 zu(ig, l) = pu(ig, l) 3406 zv(ig, l) = pv(ig, l) 3407 zo(ig, l) = po(ig, l) 3408 ztv(ig, l) = zh(ig, l)*(1.+0.61*zo(ig,l)) 3409 END DO 3410 END DO 3411 3412 ! PRINT*,'1 OK convect8' 3413 ! -------------------- 3414 3415 3416 ! + + + + + + + + + + + 3417 3418 3419 ! wa, fraca, wd, fracd -------------------- zlev(2), rhobarz 3420 ! wh,wt,wo ... 3421 3422 ! + + + + + + + + + + + zh,zu,zv,zo,rho 3423 3424 3425 ! -------------------- zlev(1) 3426 ! \\\\\\\\\\\\\\\\\\\\ 3427 3428 3429 3430 ! ----------------------------------------------------------------------- 3431 ! Calcul des altitudes des couches 3432 ! ----------------------------------------------------------------------- 3433 3434 DO l = 2, nlay 3435 DO ig = 1, ngrid 3436 zlev(ig, l) = 0.5*(pphi(ig,l)+pphi(ig,l-1))/rg 3437 END DO 3438 END DO 3439 DO ig = 1, ngrid 3440 zlev(ig, 1) = 0. 3441 zlev(ig, nlay+1) = (2.*pphi(ig,klev)-pphi(ig,klev-1))/rg 3442 END DO 3443 DO l = 1, nlay 3444 DO ig = 1, ngrid 3445 zlay(ig, l) = pphi(ig, l)/rg 3446 END DO 3447 END DO 3448 3449 ! PRINT*,'2 OK convect8' 3450 ! ----------------------------------------------------------------------- 3451 ! Calcul des densites 3452 ! ----------------------------------------------------------------------- 3453 3454 DO l = 1, nlay 3455 DO ig = 1, ngrid 3456 rho(ig, l) = pplay(ig, l)/(zpspsk(ig,l)*rd*zh(ig,l)) 3457 END DO 3458 END DO 3459 3460 DO l = 2, nlay 3461 DO ig = 1, ngrid 3462 rhobarz(ig, l) = 0.5*(rho(ig,l)+rho(ig,l-1)) 3463 END DO 3464 END DO 3465 3466 DO k = 1, nlay 3467 DO l = 1, nlay + 1 3468 DO ig = 1, ngrid 3469 wa(ig, k, l) = 0. 3470 END DO 3471 END DO 3472 END DO 3473 3474 ! PRINT*,'3 OK convect8' 3475 ! ------------------------------------------------------------------ 3476 ! Calcul de w2, quarre de w a partir de la cape 3477 ! a partir de w2, on calcule wa, vitesse de l'ascendance 3478 3479 ! ATTENTION: Dans cette version, pour cause d'economie de memoire, 3480 ! w2 est stoke dans wa 3481 3482 ! ATTENTION: dans convect8, on n'utilise le calcule des wa 3483 ! independants par couches que pour calculer l'entrainement 3484 ! a la base et la hauteur max de l'ascendance. 3485 3486 ! Indicages: 3487 ! l'ascendance provenant du niveau k traverse l'interface l avec 3488 ! une vitesse wa(k,l). 3489 3490 ! -------------------- 3491 3492 ! + + + + + + + + + + 3493 3494 ! wa(k,l) ---- -------------------- l 3495 ! /\ 3496 ! /||\ + + + + + + + + + + 3497 ! || 3498 ! || -------------------- 3499 ! || 3500 ! || + + + + + + + + + + 3501 ! || 3502 ! || -------------------- 3503 ! ||__ 3504 ! |___ + + + + + + + + + + k 3505 3506 ! -------------------- 3507 3508 3509 3510 ! ------------------------------------------------------------------ 3511 3512 ! CR: ponderation entrainement des couches instables 3513 ! def des entr_star tels que entr=f*entr_star 3514 DO l = 1, klev 3515 DO ig = 1, ngrid 3516 entr_star(ig, l) = 0. 3517 END DO 3518 END DO 3519 ! determination de la longueur de la couche d entrainement 3520 DO ig = 1, ngrid 3521 lentr(ig) = 1 3522 END DO 3523 3524 ! on ne considere que les premieres couches instables 3525 DO k = nlay - 2, 1, -1 3526 DO ig = 1, ngrid 3527 IF (ztv(ig,k)>ztv(ig,k+1) .AND. ztv(ig,k+1)<=ztv(ig,k+2)) THEN 3528 lentr(ig) = k 3529 END IF 3530 END DO 3531 END DO 3532 3533 ! determination du lmin: couche d ou provient le thermique 3534 DO ig = 1, ngrid 3535 lmin(ig) = 1 3536 END DO 3537 DO ig = 1, ngrid 3538 DO l = nlay, 2, -1 3539 IF (ztv(ig,l-1)>ztv(ig,l)) THEN 3540 lmin(ig) = l - 1 3541 END IF 3542 END DO 3543 END DO 3544 3545 ! definition de l'entrainement des couches 3546 DO l = 1, klev - 1 3547 DO ig = 1, ngrid 3548 IF (ztv(ig,l)>ztv(ig,l+1) .AND. l>=lmin(ig) .AND. l<=lentr(ig)) THEN 3549 entr_star(ig, l) = (ztv(ig,l)-ztv(ig,l+1))*(zlev(ig,l+1)-zlev(ig,l)) 3550 END IF 3551 END DO 3552 END DO 3553 ! pas de thermique si couches 1->5 stables 3554 DO ig = 1, ngrid 3555 IF (lmin(ig)>5) THEN 3556 DO l = 1, klev 3557 entr_star(ig, l) = 0. 3558 END DO 3559 END IF 3560 END DO 3561 ! calcul de l entrainement total 3562 DO ig = 1, ngrid 3563 entr_star_tot(ig) = 0. 3564 END DO 3565 DO ig = 1, ngrid 3566 DO k = 1, klev 3567 entr_star_tot(ig) = entr_star_tot(ig) + entr_star(ig, k) 3568 END DO 3569 END DO 3570 3571 PRINT *, 'fin calcul entr_star' 3572 DO k = 1, klev 3573 DO ig = 1, ngrid 3574 ztva(ig, k) = ztv(ig, k) 3575 END DO 3576 END DO 3577 ! RC 3578 ! PRINT*,'7 OK convect8' 3579 DO k = 1, klev + 1 3580 DO ig = 1, ngrid 3581 zw2(ig, k) = 0. 3582 fmc(ig, k) = 0. 3583 ! CR 3584 f_star(ig, k) = 0. 3585 ! RC 3586 larg_cons(ig, k) = 0. 3587 larg_detr(ig, k) = 0. 3588 wa_moy(ig, k) = 0. 3589 END DO 3590 END DO 3591 3592 ! PRINT*,'8 OK convect8' 3593 DO ig = 1, ngrid 3594 linter(ig) = 1. 3595 lmaxa(ig) = 1 3596 lmix(ig) = 1 3597 wmaxa(ig) = 0. 3598 END DO 3599 3600 ! CR: 3601 DO l = 1, nlay - 2 3602 DO ig = 1, ngrid 3603 IF (ztv(ig,l)>ztv(ig,l+1) .AND. entr_star(ig,l)>1.E-10 .AND. & 3604 zw2(ig,l)<1E-10) THEN 3605 f_star(ig, l+1) = entr_star(ig, l) 3606 ! test:calcul de dteta 3607 zw2(ig, l+1) = 2.*rg*(ztv(ig,l)-ztv(ig,l+1))/ztv(ig, l+1)* & 3608 (zlev(ig,l+1)-zlev(ig,l))*0.4*pphi(ig, l)/(pphi(ig,l+1)-pphi(ig,l)) 3609 larg_detr(ig, l) = 0. 3610 ELSE IF ((zw2(ig,l)>=1E-10) .AND. (f_star(ig,l)+entr_star(ig, & 3611 l)>1.E-10)) THEN 3612 f_star(ig, l+1) = f_star(ig, l) + entr_star(ig, l) 3613 ztva(ig, l) = (f_star(ig,l)*ztva(ig,l-1)+entr_star(ig,l)*ztv(ig,l))/ & 3614 f_star(ig, l+1) 3615 zw2(ig, l+1) = zw2(ig, l)*(f_star(ig,l)/f_star(ig,l+1))**2 + & 3616 2.*rg*(ztva(ig,l)-ztv(ig,l))/ztv(ig, l)*(zlev(ig,l+1)-zlev(ig,l)) 3617 END IF 3618 ! determination de zmax continu par interpolation lineaire 3619 IF (zw2(ig,l+1)<0.) THEN 3620 ! test 3621 IF (abs(zw2(ig,l+1)-zw2(ig,l))<1E-10) THEN 3622 PRINT *, 'pb linter' 3623 END IF 3624 linter(ig) = (l*(zw2(ig,l+1)-zw2(ig,l))-zw2(ig,l))/(zw2(ig,l+1)-zw2( & 3625 ig,l)) 3626 zw2(ig, l+1) = 0. 3627 lmaxa(ig) = l 3628 ELSE 3629 IF (zw2(ig,l+1)<0.) THEN 3630 PRINT *, 'pb1 zw2<0' 3631 END IF 3632 wa_moy(ig, l+1) = sqrt(zw2(ig,l+1)) 3633 END IF 3634 IF (wa_moy(ig,l+1)>wmaxa(ig)) THEN 3635 ! lmix est le niveau de la couche ou w (wa_moy) est maximum 3636 lmix(ig) = l + 1 3637 wmaxa(ig) = wa_moy(ig, l+1) 3638 END IF 3639 END DO 3640 END DO 3641 PRINT *, 'fin calcul zw2' 3642 3643 ! Calcul de la couche correspondant a la hauteur du thermique 3644 DO ig = 1, ngrid 3645 lmax(ig) = lentr(ig) 3646 END DO 3647 DO ig = 1, ngrid 3648 DO l = nlay, lentr(ig) + 1, -1 3649 IF (zw2(ig,l)<=1.E-10) THEN 3650 lmax(ig) = l - 1 3651 END IF 3652 END DO 3653 END DO 3654 ! pas de thermique si couches 1->5 stables 3655 DO ig = 1, ngrid 3656 IF (lmin(ig)>5) THEN 3657 lmax(ig) = 1 3658 lmin(ig) = 1 3659 END IF 3660 END DO 3661 3662 ! Determination de zw2 max 3663 DO ig = 1, ngrid 3664 wmax(ig) = 0. 3665 END DO 3666 3667 DO l = 1, nlay 3668 DO ig = 1, ngrid 3669 IF (l<=lmax(ig)) THEN 3670 IF (zw2(ig,l)<0.) THEN 3671 PRINT *, 'pb2 zw2<0' 3672 END IF 3673 zw2(ig, l) = sqrt(zw2(ig,l)) 3674 wmax(ig) = max(wmax(ig), zw2(ig,l)) 3675 ELSE 3676 zw2(ig, l) = 0. 3677 END IF 3678 END DO 3679 END DO 3680 3681 ! Longueur caracteristique correspondant a la hauteur des thermiques. 3682 DO ig = 1, ngrid 3683 zmax(ig) = 0. 3684 zlevinter(ig) = zlev(ig, 1) 3685 END DO 3686 DO ig = 1, ngrid 3687 ! calcul de zlevinter 3688 zlevinter(ig) = (zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig)))*linter(ig) + & 3689 zlev(ig, lmax(ig)) - lmax(ig)*(zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig))) 3690 zmax(ig) = max(zmax(ig), zlevinter(ig)-zlev(ig,lmin(ig))) 3691 END DO 3692 3693 PRINT *, 'avant fermeture' 3694 ! Fermeture,determination de f 3695 DO ig = 1, ngrid 3696 entr_star2(ig) = 0. 3697 END DO 3698 DO ig = 1, ngrid 3699 IF (entr_star_tot(ig)<1.E-10) THEN 3700 f(ig) = 0. 3701 ELSE 3702 DO k = lmin(ig), lentr(ig) 3703 entr_star2(ig) = entr_star2(ig) + entr_star(ig, k)**2/(rho(ig,k)*( & 3704 zlev(ig,k+1)-zlev(ig,k))) 3705 END DO 3706 ! Nouvelle fermeture 3707 f(ig) = wmax(ig)/(max(500.,zmax(ig))*r_aspect*entr_star2(ig))* & 3708 entr_star_tot(ig) 3709 ! test 3710 ! if (first) THEN 3711 ! f(ig)=f(ig)+(f0(ig)-f(ig))*exp(-ptimestep/zmax(ig) 3712 ! s *wmax(ig)) 3713 ! END IF 3714 END IF 3715 ! f0(ig)=f(ig) 3716 ! first=.TRUE. 3717 END DO 3718 PRINT *, 'apres fermeture' 3719 3720 ! Calcul de l'entrainement 3721 DO k = 1, klev 3722 DO ig = 1, ngrid 3723 entr(ig, k) = f(ig)*entr_star(ig, k) 3724 END DO 3725 END DO 3726 ! Calcul des flux 3727 DO ig = 1, ngrid 3728 DO l = 1, lmax(ig) - 1 3729 fmc(ig, l+1) = fmc(ig, l) + entr(ig, l) 3730 END DO 3731 END DO 3732 3733 ! RC 3734 3735 3736 ! PRINT*,'9 OK convect8' 3737 ! PRINT*,'WA1 ',wa_moy 3738 3739 ! determination de l'indice du debut de la mixed layer ou w decroit 3740 3741 ! calcul de la largeur de chaque ascendance dans le cas conservatif. 3742 ! dans ce cas simple, on suppose que la largeur de l'ascendance provenant 3743 ! d'une couche est égale à la hauteur de la couche alimentante. 3744 ! La vitesse maximale dans l'ascendance est aussi prise comme estimation 3745 ! de la vitesse d'entrainement horizontal dans la couche alimentante. 3746 3747 DO l = 2, nlay 3748 DO ig = 1, ngrid 3749 IF (l<=lmaxa(ig)) THEN 3750 zw = max(wa_moy(ig,l), 1.E-10) 3751 larg_cons(ig, l) = zmax(ig)*r_aspect*fmc(ig, l)/(rhobarz(ig,l)*zw) 3752 END IF 3753 END DO 3754 END DO 3755 3756 DO l = 2, nlay 3757 DO ig = 1, ngrid 3758 IF (l<=lmaxa(ig)) THEN 3759 ! if (idetr.EQ.0) THEN 3760 ! cette option est finalement en dur. 3761 IF ((l_mix*zlev(ig,l))<0.) THEN 3762 PRINT *, 'pb l_mix*zlev<0' 3763 END IF 3764 larg_detr(ig, l) = sqrt(l_mix*zlev(ig,l)) 3765 ! ELSE IF (idetr.EQ.1) THEN 3766 ! larg_detr(ig,l)=larg_cons(ig,l) 3767 ! s *sqrt(l_mix*zlev(ig,l))/larg_cons(ig,lmix(ig)) 3768 ! ELSE IF (idetr.EQ.2) THEN 3769 ! larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l)) 3770 ! s *sqrt(wa_moy(ig,l)) 3771 ! ELSE IF (idetr.EQ.4) THEN 3772 ! larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l)) 3773 ! s *wa_moy(ig,l) 3774 ! END IF 3775 END IF 3776 END DO 3777 END DO 3778 3779 ! PRINT*,'10 OK convect8' 3780 ! PRINT*,'WA2 ',wa_moy 3781 ! calcul de la fraction de la maille concernée par l'ascendance en tenant 3782 ! compte de l'epluchage du thermique. 3783 3784 ! CR def de zmix continu (profil parabolique des vitesses) 3785 DO ig = 1, ngrid 3786 IF (lmix(ig)>1.) THEN 3787 ! test 3788 IF (((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig)))*((zlev(ig,lmix(ig)))- & 3789 (zlev(ig,lmix(ig)+1)))-(zw2(ig,lmix(ig))- & 3790 zw2(ig,lmix(ig)+1))*((zlev(ig,lmix(ig)-1))- & 3791 (zlev(ig,lmix(ig)))))>1E-10) THEN 3792 3793 zmix(ig) = ((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig)))*((zlev(ig,lmix(ig)) & 3794 )**2-(zlev(ig,lmix(ig)+1))**2)-(zw2(ig,lmix(ig))-zw2(ig, & 3795 lmix(ig)+1))*((zlev(ig,lmix(ig)-1))**2-(zlev(ig,lmix(ig)))**2))/ & 3796 (2.*((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig)))*((zlev(ig,lmix(ig)))- & 3797 (zlev(ig,lmix(ig)+1)))-(zw2(ig,lmix(ig))- & 3798 zw2(ig,lmix(ig)+1))*((zlev(ig,lmix(ig)-1))-(zlev(ig,lmix(ig)))))) 3799 ELSE 3800 zmix(ig) = zlev(ig, lmix(ig)) 3801 PRINT *, 'pb zmix' 3802 END IF 3803 ELSE 3804 zmix(ig) = 0. 3805 END IF 3806 ! test 3807 IF ((zmax(ig)-zmix(ig))<0.) THEN 3808 zmix(ig) = 0.99*zmax(ig) 3809 ! PRINT*,'pb zmix>zmax' 3810 END IF 3811 END DO 3812 3813 ! calcul du nouveau lmix correspondant 3814 DO ig = 1, ngrid 3815 DO l = 1, klev 3816 IF (zmix(ig)>=zlev(ig,l) .AND. zmix(ig)<zlev(ig,l+1)) THEN 3817 lmix(ig) = l 3818 END IF 3819 END DO 3820 END DO 3821 3822 DO l = 2, nlay 3823 DO ig = 1, ngrid 3824 IF (larg_cons(ig,l)>1.) THEN 3825 ! PRINT*,ig,l,lmix(ig),lmaxa(ig),larg_cons(ig,l),' KKK' 3826 fraca(ig, l) = (larg_cons(ig,l)-larg_detr(ig,l))/(r_aspect*zmax(ig)) 3827 ! test 3828 fraca(ig, l) = max(fraca(ig,l), 0.) 3829 fraca(ig, l) = min(fraca(ig,l), 0.5) 3830 fracd(ig, l) = 1. - fraca(ig, l) 3831 fracc(ig, l) = larg_cons(ig, l)/(r_aspect*zmax(ig)) 3832 ELSE 3833 ! wa_moy(ig,l)=0. 3834 fraca(ig, l) = 0. 3835 fracc(ig, l) = 0. 3836 fracd(ig, l) = 1. 3837 END IF 3838 END DO 3839 END DO 3840 ! CR: calcul de fracazmix 3841 DO ig = 1, ngrid 3842 fracazmix(ig) = (fraca(ig,lmix(ig)+1)-fraca(ig,lmix(ig)))/ & 3843 (zlev(ig,lmix(ig)+1)-zlev(ig,lmix(ig)))*zmix(ig) + & 3844 fraca(ig, lmix(ig)) - zlev(ig, lmix(ig))*(fraca(ig,lmix(ig)+1)-fraca(ig & 3845 ,lmix(ig)))/(zlev(ig,lmix(ig)+1)-zlev(ig,lmix(ig))) 3846 END DO 3847 3848 DO l = 2, nlay 3849 DO ig = 1, ngrid 3850 IF (larg_cons(ig,l)>1.) THEN 3851 IF (l>lmix(ig)) THEN 3852 ! test 3853 IF (zmax(ig)-zmix(ig)<1.E-10) THEN 3854 ! PRINT*,'pb xxx' 3855 xxx(ig, l) = (lmaxa(ig)+1.-l)/(lmaxa(ig)+1.-lmix(ig)) 3856 ELSE 3857 xxx(ig, l) = (zmax(ig)-zlev(ig,l))/(zmax(ig)-zmix(ig)) 3858 END IF 3859 IF (idetr==0) THEN 3860 fraca(ig, l) = fracazmix(ig) 3861 ELSE IF (idetr==1) THEN 3862 fraca(ig, l) = fracazmix(ig)*xxx(ig, l) 3863 ELSE IF (idetr==2) THEN 3864 fraca(ig, l) = fracazmix(ig)*(1.-(1.-xxx(ig,l))**2) 3865 ELSE 3866 fraca(ig, l) = fracazmix(ig)*xxx(ig, l)**2 3867 END IF 3868 ! PRINT*,ig,l,lmix(ig),lmaxa(ig),xxx(ig,l),'LLLLLLL' 3869 fraca(ig, l) = max(fraca(ig,l), 0.) 3870 fraca(ig, l) = min(fraca(ig,l), 0.5) 3871 fracd(ig, l) = 1. - fraca(ig, l) 3872 fracc(ig, l) = larg_cons(ig, l)/(r_aspect*zmax(ig)) 3873 END IF 3874 END IF 3875 END DO 3876 END DO 3877 3878 PRINT *, 'fin calcul fraca' 3879 ! PRINT*,'11 OK convect8' 3880 ! PRINT*,'Ea3 ',wa_moy 3881 ! ------------------------------------------------------------------ 3882 ! Calcul de fracd, wd 3883 ! somme wa - wd = 0 3884 ! ------------------------------------------------------------------ 3885 3886 3887 DO ig = 1, ngrid 3888 fm(ig, 1) = 0. 3889 fm(ig, nlay+1) = 0. 3890 END DO 3891 3892 DO l = 2, nlay 3893 DO ig = 1, ngrid 3894 fm(ig, l) = fraca(ig, l)*wa_moy(ig, l)*rhobarz(ig, l) 3895 ! CR:test 3896 IF (entr(ig,l-1)<1E-10 .AND. fm(ig,l)>fm(ig,l-1) .AND. l>lmix(ig)) THEN 3897 fm(ig, l) = fm(ig, l-1) 3898 ! WRITE(1,*)'ajustement fm, l',l 3899 END IF 3900 ! WRITE(1,*)'ig,l,fm(ig,l)',ig,l,fm(ig,l) 3901 ! RC 3902 END DO 3903 DO ig = 1, ngrid 3904 IF (fracd(ig,l)<0.1) THEN 3905 abort_message = 'fracd trop petit' 3906 CALL abort_physic(modname, abort_message, 1) 3907 ELSE 3908 ! vitesse descendante "diagnostique" 3909 wd(ig, l) = fm(ig, l)/(fracd(ig,l)*rhobarz(ig,l)) 3910 END IF 3911 END DO 3912 END DO 3913 3914 DO l = 1, nlay 3915 DO ig = 1, ngrid 3916 ! masse(ig,l)=rho(ig,l)*(zlev(ig,l+1)-zlev(ig,l)) 3917 masse(ig, l) = (pplev(ig,l)-pplev(ig,l+1))/rg 3918 END DO 3919 END DO 3920 3921 ! PRINT*,'12 OK convect8' 3922 ! PRINT*,'WA4 ',wa_moy 3923 ! c------------------------------------------------------------------ 3924 ! calcul du transport vertical 3925 ! ------------------------------------------------------------------ 3926 3927 GO TO 4444 3928 ! PRINT*,'XXXXXXXXXXXXXXX ptimestep= ',ptimestep 3929 DO l = 2, nlay - 1 3930 DO ig = 1, ngrid 3931 IF (fm(ig,l+1)*ptimestep>masse(ig,l) .AND. fm(ig,l+1)*ptimestep>masse( & 3932 ig,l+1)) THEN 3933 ! PRINT*,'WARN!!! FM>M ig=',ig,' l=',l,' FM=' 3934 ! s ,fm(ig,l+1)*ptimestep 3935 ! s ,' M=',masse(ig,l),masse(ig,l+1) 3936 END IF 3937 END DO 3938 END DO 3939 3940 DO l = 1, nlay 3941 DO ig = 1, ngrid 3942 IF (entr(ig,l)*ptimestep>masse(ig,l)) THEN 3943 ! PRINT*,'WARN!!! E>M ig=',ig,' l=',l,' E==' 3944 ! s ,entr(ig,l)*ptimestep 3945 ! s ,' M=',masse(ig,l) 3946 END IF 3947 END DO 3948 END DO 3949 3950 DO l = 1, nlay 3951 DO ig = 1, ngrid 3952 IF (.NOT. fm(ig,l)>=0. .OR. .NOT. fm(ig,l)<=10.) THEN 3953 ! PRINT*,'WARN!!! fm exagere ig=',ig,' l=',l 3954 ! s ,' FM=',fm(ig,l) 3955 END IF 3956 IF (.NOT. masse(ig,l)>=1.E-10 .OR. .NOT. masse(ig,l)<=1.E4) THEN 3957 ! PRINT*,'WARN!!! masse exagere ig=',ig,' l=',l 3958 ! s ,' M=',masse(ig,l) 3959 ! PRINT*,'rho(ig,l),pplay(ig,l),zpspsk(ig,l),RD,zh(ig,l)', 3960 ! s rho(ig,l),pplay(ig,l),zpspsk(ig,l),RD,zh(ig,l) 3961 ! PRINT*,'zlev(ig,l+1),zlev(ig,l)' 3962 ! s ,zlev(ig,l+1),zlev(ig,l) 3963 ! PRINT*,'pphi(ig,l-1),pphi(ig,l),pphi(ig,l+1)' 3964 ! s ,pphi(ig,l-1),pphi(ig,l),pphi(ig,l+1) 3965 END IF 3966 IF (.NOT. entr(ig,l)>=0. .OR. .NOT. entr(ig,l)<=10.) THEN 3967 ! PRINT*,'WARN!!! entr exagere ig=',ig,' l=',l 3968 ! s ,' E=',entr(ig,l) 3969 END IF 3970 END DO 3971 END DO 3972 3973 4444 CONTINUE 3974 3975 ! CR:redefinition du entr 3976 DO l = 1, nlay 3977 DO ig = 1, ngrid 3978 detr(ig, l) = fm(ig, l) + entr(ig, l) - fm(ig, l+1) 3979 IF (detr(ig,l)<0.) THEN 3980 entr(ig, l) = entr(ig, l) - detr(ig, l) 3981 detr(ig, l) = 0. 3982 ! PRINT*,'WARNING !!! detrainement negatif ',ig,l 3983 END IF 3984 END DO 3985 END DO 3986 ! RC 3987 IF (w2di==1) THEN 3988 fm0 = fm0 + ptimestep*(fm-fm0)/tho 3989 entr0 = entr0 + ptimestep*(entr-entr0)/tho 3990 ELSE 3991 fm0 = fm 3992 entr0 = entr 3993 END IF 3994 3995 IF (1==1) THEN 3996 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zh, zdhadj, & 3997 zha) 3998 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zo, pdoadj, & 3999 zoa) 4000 ELSE 4001 CALL dqthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca, zh, & 4002 zdhadj, zha) 4003 CALL dqthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca, zo, & 4004 pdoadj, zoa) 4005 END IF 4006 4007 IF (1==0) THEN 4008 CALL dvthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca, zmax, & 4009 zu, zv, pduadj, pdvadj, zua, zva) 4010 ELSE 4011 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zu, pduadj, & 4012 zua) 4013 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zv, pdvadj, & 4014 zva) 4015 END IF 4016 4017 DO l = 1, nlay 4018 DO ig = 1, ngrid 4019 zf = 0.5*(fracc(ig,l)+fracc(ig,l+1)) 4020 zf2 = zf/(1.-zf) 4021 thetath2(ig, l) = zf2*(zha(ig,l)-zh(ig,l))**2 4022 wth2(ig, l) = zf2*(0.5*(wa_moy(ig,l)+wa_moy(ig,l+1)))**2 4023 END DO 4024 END DO 4025 4026 4027 4028 ! PRINT*,'13 OK convect8' 4029 ! PRINT*,'WA5 ',wa_moy 4030 DO l = 1, nlay 4031 DO ig = 1, ngrid 4032 pdtadj(ig, l) = zdhadj(ig, l)*zpspsk(ig, l) 4033 END DO 4034 END DO 4035 4036 4037 ! do l=1,nlay 4038 ! do ig=1,ngrid 4039 ! IF(abs(pdtadj(ig,l))*86400..gt.500.) THEN 4040 ! PRINT*,'WARN!!! ig=',ig,' l=',l 4041 ! s ,' pdtadj=',pdtadj(ig,l) 4042 ! END IF 4043 ! IF(abs(pdoadj(ig,l))*86400..gt.1.) THEN 4044 ! PRINT*,'WARN!!! ig=',ig,' l=',l 4045 ! s ,' pdoadj=',pdoadj(ig,l) 4046 ! END IF 4047 ! enddo 4048 ! enddo 4049 4050 ! PRINT*,'14 OK convect8' 4051 ! ------------------------------------------------------------------ 4052 ! Calculs pour les sorties 4053 ! ------------------------------------------------------------------ 4054 4055 IF (sorties) THEN 4056 DO l = 1, nlay 4057 DO ig = 1, ngrid 4058 zla(ig, l) = (1.-fracd(ig,l))*zmax(ig) 4059 zld(ig, l) = fracd(ig, l)*zmax(ig) 4060 IF (1.-fracd(ig,l)>1.E-10) zwa(ig, l) = wd(ig, l)*fracd(ig, l)/ & 4061 (1.-fracd(ig,l)) 4062 END DO 4063 END DO 4064 4065 ! deja fait 4015 pdtadj(ig, l) = zdhadj(ig, l) * zpspsk(ig, l) 4016 END DO 4017 END DO 4018 4019 4066 4020 ! do l=1,nlay 4067 4021 ! do ig=1,ngrid 4068 ! detr(ig,l)=fm(ig,l)+entr(ig,l)-fm(ig,l+1) 4069 ! if (detr(ig,l).lt.0.) THEN 4070 ! entr(ig,l)=entr(ig,l)-detr(ig,l) 4071 ! detr(ig,l)=0. 4072 ! PRINT*,'WARNING !!! detrainement negatif ',ig,l 4022 ! IF(abs(pdtadj(ig,l))*86400..gt.500.) THEN 4023 ! PRINT*,'WARN!!! ig=',ig,' l=',l 4024 ! s ,' pdtadj=',pdtadj(ig,l) 4025 ! END IF 4026 ! IF(abs(pdoadj(ig,l))*86400..gt.1.) THEN 4027 ! PRINT*,'WARN!!! ig=',ig,' l=',l 4028 ! s ,' pdoadj=',pdoadj(ig,l) 4073 4029 ! END IF 4074 4030 ! enddo 4075 4031 ! enddo 4076 4032 4077 ! PRINT*,'15 OK convect8' 4078 4079 4080 ! #define und 4081 GO TO 123 4033 ! PRINT*,'14 OK convect8' 4034 ! ------------------------------------------------------------------ 4035 ! Calculs pour les sorties 4036 ! ------------------------------------------------------------------ 4037 4038 IF (sorties) THEN 4039 DO l = 1, nlay 4040 DO ig = 1, ngrid 4041 zla(ig, l) = (1. - fracd(ig, l)) * zmax(ig) 4042 zld(ig, l) = fracd(ig, l) * zmax(ig) 4043 IF (1. - fracd(ig, l)>1.E-10) zwa(ig, l) = wd(ig, l) * fracd(ig, l) / & 4044 (1. - fracd(ig, l)) 4045 END DO 4046 END DO 4047 4048 ! deja fait 4049 ! do l=1,nlay 4050 ! do ig=1,ngrid 4051 ! detr(ig,l)=fm(ig,l)+entr(ig,l)-fm(ig,l+1) 4052 ! if (detr(ig,l).lt.0.) THEN 4053 ! entr(ig,l)=entr(ig,l)-detr(ig,l) 4054 ! detr(ig,l)=0. 4055 ! PRINT*,'WARNING !!! detrainement negatif ',ig,l 4056 ! END IF 4057 ! enddo 4058 ! enddo 4059 4060 ! PRINT*,'15 OK convect8' 4061 4062 4063 ! #define und 4064 GO TO 123 4082 4065 #ifdef und 4083 4066 CALL writeg1d(1, nlay, wd, 'wd ', 'wd ') … … 4115 4098 CALL writeg1d(1, nlay, wh, 'wh2 ', 'wh2 ') 4116 4099 #endif 4117 123 CONTINUE 4118 4119 END IF 4120 4121 ! IF(wa_moy(1,4).gt.1.e-10) stop 4122 4123 ! PRINT*,'19 OK convect8' 4124 4125 END SUBROUTINE thermcell 4126 4127 SUBROUTINE dqthermcell(ngrid, nlay, ptimestep, fm, entr, masse, q, dq, qa) 4128 USE dimphy 4129 IMPLICIT NONE 4130 4131 ! ======================================================================= 4132 4133 ! Calcul du transport verticale dans la couche limite en presence 4134 ! de "thermiques" explicitement representes 4135 ! calcul du dq/dt une fois qu'on connait les ascendances 4136 4137 ! ======================================================================= 4138 4139 INTEGER ngrid, nlay 4140 4141 REAL ptimestep 4142 REAL masse(ngrid, nlay), fm(ngrid, nlay+1) 4143 REAL entr(ngrid, nlay) 4144 REAL q(ngrid, nlay) 4145 REAL dq(ngrid, nlay) 4146 4147 REAL qa(klon, klev), detr(klon, klev), wqd(klon, klev+1) 4148 4149 INTEGER ig, k 4150 4151 ! calcul du detrainement 4152 4153 DO k = 1, nlay 4154 DO ig = 1, ngrid 4155 detr(ig, k) = fm(ig, k) - fm(ig, k+1) + entr(ig, k) 4156 ! test 4157 IF (detr(ig,k)<0.) THEN 4158 entr(ig, k) = entr(ig, k) - detr(ig, k) 4159 detr(ig, k) = 0. 4160 ! PRINT*,'detr2<0!!!','ig=',ig,'k=',k,'f=',fm(ig,k), 4161 ! s 'f+1=',fm(ig,k+1),'e=',entr(ig,k),'d=',detr(ig,k) 4100 123 CONTINUE 4101 4102 END IF 4103 4104 ! IF(wa_moy(1,4).gt.1.e-10) stop 4105 4106 ! PRINT*,'19 OK convect8' 4107 4108 END SUBROUTINE thermcell 4109 4110 SUBROUTINE dqthermcell(ngrid, nlay, ptimestep, fm, entr, masse, q, dq, qa) 4111 USE dimphy 4112 IMPLICIT NONE 4113 4114 ! ======================================================================= 4115 4116 ! Calcul du transport verticale dans la couche limite en presence 4117 ! de "thermiques" explicitement representes 4118 ! calcul du dq/dt une fois qu'on connait les ascendances 4119 4120 ! ======================================================================= 4121 4122 INTEGER ngrid, nlay 4123 4124 REAL ptimestep 4125 REAL masse(ngrid, nlay), fm(ngrid, nlay + 1) 4126 REAL entr(ngrid, nlay) 4127 REAL q(ngrid, nlay) 4128 REAL dq(ngrid, nlay) 4129 4130 REAL qa(klon, klev), detr(klon, klev), wqd(klon, klev + 1) 4131 4132 INTEGER ig, k 4133 4134 ! calcul du detrainement 4135 4136 DO k = 1, nlay 4137 DO ig = 1, ngrid 4138 detr(ig, k) = fm(ig, k) - fm(ig, k + 1) + entr(ig, k) 4139 ! test 4140 IF (detr(ig, k)<0.) THEN 4141 entr(ig, k) = entr(ig, k) - detr(ig, k) 4142 detr(ig, k) = 0. 4143 ! PRINT*,'detr2<0!!!','ig=',ig,'k=',k,'f=',fm(ig,k), 4144 ! s 'f+1=',fm(ig,k+1),'e=',entr(ig,k),'d=',detr(ig,k) 4145 END IF 4146 IF (fm(ig, k + 1)<0.) THEN 4147 ! PRINT*,'fm2<0!!!' 4148 END IF 4149 IF (entr(ig, k)<0.) THEN 4150 ! PRINT*,'entr2<0!!!' 4151 END IF 4152 END DO 4153 END DO 4154 4155 ! calcul de la valeur dans les ascendances 4156 DO ig = 1, ngrid 4157 qa(ig, 1) = q(ig, 1) 4158 END DO 4159 4160 DO k = 2, nlay 4161 DO ig = 1, ngrid 4162 IF ((fm(ig, k + 1) + detr(ig, k)) * ptimestep>1.E-5 * masse(ig, k)) THEN 4163 qa(ig, k) = (fm(ig, k) * qa(ig, k - 1) + entr(ig, k) * q(ig, k)) / & 4164 (fm(ig, k + 1) + detr(ig, k)) 4165 ELSE 4166 qa(ig, k) = q(ig, k) 4167 END IF 4168 IF (qa(ig, k)<0.) THEN 4169 ! PRINT*,'qa<0!!!' 4170 END IF 4171 IF (q(ig, k)<0.) THEN 4172 ! PRINT*,'q<0!!!' 4173 END IF 4174 END DO 4175 END DO 4176 4177 DO k = 2, nlay 4178 DO ig = 1, ngrid 4179 ! wqd(ig,k)=fm(ig,k)*0.5*(q(ig,k-1)+q(ig,k)) 4180 wqd(ig, k) = fm(ig, k) * q(ig, k) 4181 IF (wqd(ig, k)<0.) THEN 4182 ! PRINT*,'wqd<0!!!' 4183 END IF 4184 END DO 4185 END DO 4186 DO ig = 1, ngrid 4187 wqd(ig, 1) = 0. 4188 wqd(ig, nlay + 1) = 0. 4189 END DO 4190 4191 DO k = 1, nlay 4192 DO ig = 1, ngrid 4193 dq(ig, k) = (detr(ig, k) * qa(ig, k) - entr(ig, k) * q(ig, k) - wqd(ig, k) + wqd(ig, k + & 4194 1)) / masse(ig, k) 4195 ! if (dq(ig,k).lt.0.) THEN 4196 ! PRINT*,'dq<0!!!' 4197 ! END IF 4198 END DO 4199 END DO 4200 4201 END SUBROUTINE dqthermcell 4202 SUBROUTINE dvthermcell(ngrid, nlay, ptimestep, fm, entr, masse, fraca, larga, & 4203 u, v, du, dv, ua, va) 4204 USE dimphy 4205 IMPLICIT NONE 4206 4207 ! ======================================================================= 4208 4209 ! Calcul du transport verticale dans la couche limite en presence 4210 ! de "thermiques" explicitement representes 4211 ! calcul du dq/dt une fois qu'on connait les ascendances 4212 4213 ! ======================================================================= 4214 4215 INTEGER ngrid, nlay 4216 4217 REAL ptimestep 4218 REAL masse(ngrid, nlay), fm(ngrid, nlay + 1) 4219 REAL fraca(ngrid, nlay + 1) 4220 REAL larga(ngrid) 4221 REAL entr(ngrid, nlay) 4222 REAL u(ngrid, nlay) 4223 REAL ua(ngrid, nlay) 4224 REAL du(ngrid, nlay) 4225 REAL v(ngrid, nlay) 4226 REAL va(ngrid, nlay) 4227 REAL dv(ngrid, nlay) 4228 4229 REAL qa(klon, klev), detr(klon, klev) 4230 REAL wvd(klon, klev + 1), wud(klon, klev + 1) 4231 REAL gamma0, gamma(klon, klev + 1) 4232 REAL dua, dva 4233 INTEGER iter 4234 4235 INTEGER ig, k 4236 4237 ! calcul du detrainement 4238 4239 DO k = 1, nlay 4240 DO ig = 1, ngrid 4241 detr(ig, k) = fm(ig, k) - fm(ig, k + 1) + entr(ig, k) 4242 END DO 4243 END DO 4244 4245 ! calcul de la valeur dans les ascendances 4246 DO ig = 1, ngrid 4247 ua(ig, 1) = u(ig, 1) 4248 va(ig, 1) = v(ig, 1) 4249 END DO 4250 4251 DO k = 2, nlay 4252 DO ig = 1, ngrid 4253 IF ((fm(ig, k + 1) + detr(ig, k)) * ptimestep>1.E-5 * masse(ig, k)) THEN 4254 ! On itère sur la valeur du coeff de freinage. 4255 ! gamma0=rho(ig,k)*(zlev(ig,k+1)-zlev(ig,k)) 4256 gamma0 = masse(ig, k) * sqrt(0.5 * (fraca(ig, k + 1) + fraca(ig, & 4257 k))) * 0.5 / larga(ig) 4258 ! gamma0=0. 4259 ! la première fois on multiplie le coefficient de freinage 4260 ! par le module du vent dans la couche en dessous. 4261 dua = ua(ig, k - 1) - u(ig, k - 1) 4262 dva = va(ig, k - 1) - v(ig, k - 1) 4263 DO iter = 1, 5 4264 gamma(ig, k) = gamma0 * sqrt(dua**2 + dva**2) 4265 ua(ig, k) = (fm(ig, k) * ua(ig, k - 1) + (entr(ig, k) + gamma(ig, & 4266 k)) * u(ig, k)) / (fm(ig, k + 1) + detr(ig, k) + gamma(ig, k)) 4267 va(ig, k) = (fm(ig, k) * va(ig, k - 1) + (entr(ig, k) + gamma(ig, & 4268 k)) * v(ig, k)) / (fm(ig, k + 1) + detr(ig, k) + gamma(ig, k)) 4269 ! PRINT*,k,ua(ig,k),va(ig,k),u(ig,k),v(ig,k),dua,dva 4270 dua = ua(ig, k) - u(ig, k) 4271 dva = va(ig, k) - v(ig, k) 4272 END DO 4273 ELSE 4274 ua(ig, k) = u(ig, k) 4275 va(ig, k) = v(ig, k) 4276 gamma(ig, k) = 0. 4277 END IF 4278 END DO 4279 END DO 4280 4281 DO k = 2, nlay 4282 DO ig = 1, ngrid 4283 wud(ig, k) = fm(ig, k) * u(ig, k) 4284 wvd(ig, k) = fm(ig, k) * v(ig, k) 4285 END DO 4286 END DO 4287 DO ig = 1, ngrid 4288 wud(ig, 1) = 0. 4289 wud(ig, nlay + 1) = 0. 4290 wvd(ig, 1) = 0. 4291 wvd(ig, nlay + 1) = 0. 4292 END DO 4293 4294 DO k = 1, nlay 4295 DO ig = 1, ngrid 4296 du(ig, k) = ((detr(ig, k) + gamma(ig, k)) * ua(ig, k) - (entr(ig, k) + gamma(ig, & 4297 k)) * u(ig, k) - wud(ig, k) + wud(ig, k + 1)) / masse(ig, k) 4298 dv(ig, k) = ((detr(ig, k) + gamma(ig, k)) * va(ig, k) - (entr(ig, k) + gamma(ig, & 4299 k)) * v(ig, k) - wvd(ig, k) + wvd(ig, k + 1)) / masse(ig, k) 4300 END DO 4301 END DO 4302 4303 END SUBROUTINE dvthermcell 4304 SUBROUTINE dqthermcell2(ngrid, nlay, ptimestep, fm, entr, masse, frac, q, dq, & 4305 qa) 4306 USE dimphy 4307 IMPLICIT NONE 4308 4309 ! ======================================================================= 4310 4311 ! Calcul du transport verticale dans la couche limite en presence 4312 ! de "thermiques" explicitement representes 4313 ! calcul du dq/dt une fois qu'on connait les ascendances 4314 4315 ! ======================================================================= 4316 4317 INTEGER ngrid, nlay 4318 4319 REAL ptimestep 4320 REAL masse(ngrid, nlay), fm(ngrid, nlay + 1) 4321 REAL entr(ngrid, nlay), frac(ngrid, nlay) 4322 REAL q(ngrid, nlay) 4323 REAL dq(ngrid, nlay) 4324 4325 REAL qa(klon, klev), detr(klon, klev), wqd(klon, klev + 1) 4326 REAL qe(klon, klev), zf, zf2 4327 4328 INTEGER ig, k 4329 4330 ! calcul du detrainement 4331 4332 DO k = 1, nlay 4333 DO ig = 1, ngrid 4334 detr(ig, k) = fm(ig, k) - fm(ig, k + 1) + entr(ig, k) 4335 END DO 4336 END DO 4337 4338 ! calcul de la valeur dans les ascendances 4339 DO ig = 1, ngrid 4340 qa(ig, 1) = q(ig, 1) 4341 qe(ig, 1) = q(ig, 1) 4342 END DO 4343 4344 DO k = 2, nlay 4345 DO ig = 1, ngrid 4346 IF ((fm(ig, k + 1) + detr(ig, k)) * ptimestep>1.E-5 * masse(ig, k)) THEN 4347 zf = 0.5 * (frac(ig, k) + frac(ig, k + 1)) 4348 zf2 = 1. / (1. - zf) 4349 qa(ig, k) = (fm(ig, k) * qa(ig, k - 1) + zf2 * entr(ig, k) * q(ig, k)) / & 4350 (fm(ig, k + 1) + detr(ig, k) + entr(ig, k) * zf * zf2) 4351 qe(ig, k) = (q(ig, k) - zf * qa(ig, k)) * zf2 4352 ELSE 4353 qa(ig, k) = q(ig, k) 4354 qe(ig, k) = q(ig, k) 4355 END IF 4356 END DO 4357 END DO 4358 4359 DO k = 2, nlay 4360 DO ig = 1, ngrid 4361 ! wqd(ig,k)=fm(ig,k)*0.5*(q(ig,k-1)+q(ig,k)) 4362 wqd(ig, k) = fm(ig, k) * qe(ig, k) 4363 END DO 4364 END DO 4365 DO ig = 1, ngrid 4366 wqd(ig, 1) = 0. 4367 wqd(ig, nlay + 1) = 0. 4368 END DO 4369 4370 DO k = 1, nlay 4371 DO ig = 1, ngrid 4372 dq(ig, k) = (detr(ig, k) * qa(ig, k) - entr(ig, k) * qe(ig, k) - wqd(ig, k) + wqd(ig, k & 4373 + 1)) / masse(ig, k) 4374 END DO 4375 END DO 4376 4377 END SUBROUTINE dqthermcell2 4378 SUBROUTINE dvthermcell2(ngrid, nlay, ptimestep, fm, entr, masse, fraca, & 4379 larga, u, v, du, dv, ua, va) 4380 USE dimphy 4381 IMPLICIT NONE 4382 4383 ! ======================================================================= 4384 4385 ! Calcul du transport verticale dans la couche limite en presence 4386 ! de "thermiques" explicitement representes 4387 ! calcul du dq/dt une fois qu'on connait les ascendances 4388 4389 ! ======================================================================= 4390 4391 INTEGER ngrid, nlay 4392 4393 REAL ptimestep 4394 REAL masse(ngrid, nlay), fm(ngrid, nlay + 1) 4395 REAL fraca(ngrid, nlay + 1) 4396 REAL larga(ngrid) 4397 REAL entr(ngrid, nlay) 4398 REAL u(ngrid, nlay) 4399 REAL ua(ngrid, nlay) 4400 REAL du(ngrid, nlay) 4401 REAL v(ngrid, nlay) 4402 REAL va(ngrid, nlay) 4403 REAL dv(ngrid, nlay) 4404 4405 REAL qa(klon, klev), detr(klon, klev), zf, zf2 4406 REAL wvd(klon, klev + 1), wud(klon, klev + 1) 4407 REAL gamma0, gamma(klon, klev + 1) 4408 REAL ue(klon, klev), ve(klon, klev) 4409 REAL dua, dva 4410 INTEGER iter 4411 4412 INTEGER ig, k 4413 4414 ! calcul du detrainement 4415 4416 DO k = 1, nlay 4417 DO ig = 1, ngrid 4418 detr(ig, k) = fm(ig, k) - fm(ig, k + 1) + entr(ig, k) 4419 END DO 4420 END DO 4421 4422 ! calcul de la valeur dans les ascendances 4423 DO ig = 1, ngrid 4424 ua(ig, 1) = u(ig, 1) 4425 va(ig, 1) = v(ig, 1) 4426 ue(ig, 1) = u(ig, 1) 4427 ve(ig, 1) = v(ig, 1) 4428 END DO 4429 4430 DO k = 2, nlay 4431 DO ig = 1, ngrid 4432 IF ((fm(ig, k + 1) + detr(ig, k)) * ptimestep>1.E-5 * masse(ig, k)) THEN 4433 ! On itère sur la valeur du coeff de freinage. 4434 ! gamma0=rho(ig,k)*(zlev(ig,k+1)-zlev(ig,k)) 4435 gamma0 = masse(ig, k) * sqrt(0.5 * (fraca(ig, k + 1) + fraca(ig, & 4436 k))) * 0.5 / larga(ig) * 1. 4437 ! s *0.5 4438 ! gamma0=0. 4439 zf = 0.5 * (fraca(ig, k) + fraca(ig, k + 1)) 4440 zf = 0. 4441 zf2 = 1. / (1. - zf) 4442 ! la première fois on multiplie le coefficient de freinage 4443 ! par le module du vent dans la couche en dessous. 4444 dua = ua(ig, k - 1) - u(ig, k - 1) 4445 dva = va(ig, k - 1) - v(ig, k - 1) 4446 DO iter = 1, 5 4447 ! On choisit une relaxation lineaire. 4448 gamma(ig, k) = gamma0 4449 ! On choisit une relaxation quadratique. 4450 gamma(ig, k) = gamma0 * sqrt(dua**2 + dva**2) 4451 ua(ig, k) = (fm(ig, k) * ua(ig, k - 1) + (zf2 * entr(ig, k) + gamma(ig, & 4452 k)) * u(ig, k)) / (fm(ig, k + 1) + detr(ig, k) + entr(ig, k) * zf * zf2 + gamma(ig, k) & 4453 ) 4454 va(ig, k) = (fm(ig, k) * va(ig, k - 1) + (zf2 * entr(ig, k) + gamma(ig, & 4455 k)) * v(ig, k)) / (fm(ig, k + 1) + detr(ig, k) + entr(ig, k) * zf * zf2 + gamma(ig, k) & 4456 ) 4457 ! PRINT*,k,ua(ig,k),va(ig,k),u(ig,k),v(ig,k),dua,dva 4458 dua = ua(ig, k) - u(ig, k) 4459 dva = va(ig, k) - v(ig, k) 4460 ue(ig, k) = (u(ig, k) - zf * ua(ig, k)) * zf2 4461 ve(ig, k) = (v(ig, k) - zf * va(ig, k)) * zf2 4462 END DO 4463 ELSE 4464 ua(ig, k) = u(ig, k) 4465 va(ig, k) = v(ig, k) 4466 ue(ig, k) = u(ig, k) 4467 ve(ig, k) = v(ig, k) 4468 gamma(ig, k) = 0. 4469 END IF 4470 END DO 4471 END DO 4472 4473 DO k = 2, nlay 4474 DO ig = 1, ngrid 4475 wud(ig, k) = fm(ig, k) * ue(ig, k) 4476 wvd(ig, k) = fm(ig, k) * ve(ig, k) 4477 END DO 4478 END DO 4479 DO ig = 1, ngrid 4480 wud(ig, 1) = 0. 4481 wud(ig, nlay + 1) = 0. 4482 wvd(ig, 1) = 0. 4483 wvd(ig, nlay + 1) = 0. 4484 END DO 4485 4486 DO k = 1, nlay 4487 DO ig = 1, ngrid 4488 du(ig, k) = ((detr(ig, k) + gamma(ig, k)) * ua(ig, k) - (entr(ig, k) + gamma(ig, & 4489 k)) * ue(ig, k) - wud(ig, k) + wud(ig, k + 1)) / masse(ig, k) 4490 dv(ig, k) = ((detr(ig, k) + gamma(ig, k)) * va(ig, k) - (entr(ig, k) + gamma(ig, & 4491 k)) * ve(ig, k) - wvd(ig, k) + wvd(ig, k + 1)) / masse(ig, k) 4492 END DO 4493 END DO 4494 4495 END SUBROUTINE dvthermcell2 4496 SUBROUTINE thermcell_sec(ngrid, nlay, ptimestep, pplay, pplev, pphi, zlev, & 4497 pu, pv, pt, po, pduadj, pdvadj, pdtadj, pdoadj, fm0, entr0 & ! s 4498 ! ,pu_therm,pv_therm 4499 , r_aspect, l_mix, w2di, tho) 4500 4501 USE dimphy 4502 IMPLICIT NONE 4503 4504 ! ======================================================================= 4505 4506 ! Calcul du transport verticale dans la couche limite en presence 4507 ! de "thermiques" explicitement representes 4508 4509 ! Réécriture à partir d'un listing papier à Habas, le 14/02/00 4510 4511 ! le thermique est supposé homogène et dissipé par mélange avec 4512 ! son environnement. la longueur l_mix contrôle l'efficacité du 4513 ! mélange 4514 4515 ! Le calcul du transport des différentes espèces se fait en prenant 4516 ! en compte: 4517 ! 1. un flux de masse montant 4518 ! 2. un flux de masse descendant 4519 ! 3. un entrainement 4520 ! 4. un detrainement 4521 4522 ! ======================================================================= 4523 4524 ! ----------------------------------------------------------------------- 4525 ! declarations: 4526 ! ------------- 4527 4528 include "YOMCST.h" 4529 4530 ! arguments: 4531 ! ---------- 4532 4533 INTEGER ngrid, nlay, w2di 4534 REAL tho 4535 REAL ptimestep, l_mix, r_aspect 4536 REAL pt(ngrid, nlay), pdtadj(ngrid, nlay) 4537 REAL pu(ngrid, nlay), pduadj(ngrid, nlay) 4538 REAL pv(ngrid, nlay), pdvadj(ngrid, nlay) 4539 REAL po(ngrid, nlay), pdoadj(ngrid, nlay) 4540 REAL pplay(ngrid, nlay), pplev(ngrid, nlay + 1) 4541 REAL pphi(ngrid, nlay) 4542 4543 INTEGER idetr 4544 SAVE idetr 4545 DATA idetr/3/ 4546 !$OMP THREADPRIVATE(idetr) 4547 4548 ! local: 4549 ! ------ 4550 4551 INTEGER ig, k, l, lmaxa(klon), lmix(klon) 4552 REAL zsortie1d(klon) 4553 ! CR: on remplace lmax(klon,klev+1) 4554 INTEGER lmax(klon), lmin(klon), lentr(klon) 4555 REAL linter(klon) 4556 REAL zmix(klon), fracazmix(klon) 4557 ! RC 4558 REAL zmax(klon), zw, zz, zw2(klon, klev + 1), ztva(klon, klev), zzz 4559 4560 REAL zlev(klon, klev + 1), zlay(klon, klev) 4561 REAL zh(klon, klev), zdhadj(klon, klev) 4562 REAL ztv(klon, klev) 4563 REAL zu(klon, klev), zv(klon, klev), zo(klon, klev) 4564 REAL wh(klon, klev + 1) 4565 REAL wu(klon, klev + 1), wv(klon, klev + 1), wo(klon, klev + 1) 4566 REAL zla(klon, klev + 1) 4567 REAL zwa(klon, klev + 1) 4568 REAL zld(klon, klev + 1) 4569 REAL zwd(klon, klev + 1) 4570 REAL zsortie(klon, klev) 4571 REAL zva(klon, klev) 4572 REAL zua(klon, klev) 4573 REAL zoa(klon, klev) 4574 4575 REAL zha(klon, klev) 4576 REAL wa_moy(klon, klev + 1) 4577 REAL fraca(klon, klev + 1) 4578 REAL fracc(klon, klev + 1) 4579 REAL zf, zf2 4580 REAL thetath2(klon, klev), wth2(klon, klev) 4581 ! common/comtherm/thetath2,wth2 4582 4583 REAL count_time 4584 INTEGER ialt 4585 4586 LOGICAL sorties 4587 REAL rho(klon, klev), rhobarz(klon, klev + 1), masse(klon, klev) 4588 REAL zpspsk(klon, klev) 4589 4590 ! real wmax(klon,klev),wmaxa(klon) 4591 REAL wmax(klon), wmaxa(klon) 4592 REAL wa(klon, klev, klev + 1) 4593 REAL wd(klon, klev + 1) 4594 REAL larg_part(klon, klev, klev + 1) 4595 REAL fracd(klon, klev + 1) 4596 REAL xxx(klon, klev + 1) 4597 REAL larg_cons(klon, klev + 1) 4598 REAL larg_detr(klon, klev + 1) 4599 REAL fm0(klon, klev + 1), entr0(klon, klev), detr(klon, klev) 4600 REAL pu_therm(klon, klev), pv_therm(klon, klev) 4601 REAL fm(klon, klev + 1), entr(klon, klev) 4602 REAL fmc(klon, klev + 1) 4603 4604 ! CR:nouvelles variables 4605 REAL f_star(klon, klev + 1), entr_star(klon, klev) 4606 REAL entr_star_tot(klon), entr_star2(klon) 4607 REAL f(klon), f0(klon) 4608 REAL zlevinter(klon) 4609 LOGICAL first 4610 DATA first/.FALSE./ 4611 SAVE first 4612 !$OMP THREADPRIVATE(first) 4613 ! RC 4614 4615 CHARACTER *2 str2 4616 CHARACTER *10 str10 4617 4618 CHARACTER (LEN = 20) :: modname = 'thermcell_sec' 4619 CHARACTER (LEN = 80) :: abort_message 4620 4621 LOGICAL vtest(klon), down 4622 4623 INTEGER ncorrec, ll 4624 SAVE ncorrec 4625 DATA ncorrec/0/ 4626 !$OMP THREADPRIVATE(ncorrec) 4627 4628 4629 ! ----------------------------------------------------------------------- 4630 ! initialisation: 4631 ! --------------- 4632 4633 sorties = .TRUE. 4634 IF (ngrid/=klon) THEN 4635 PRINT * 4636 PRINT *, 'STOP dans convadj' 4637 PRINT *, 'ngrid =', ngrid 4638 PRINT *, 'klon =', klon 4639 END IF 4640 4641 ! ----------------------------------------------------------------------- 4642 ! incrementation eventuelle de tendances precedentes: 4643 ! --------------------------------------------------- 4644 4645 ! PRINT*,'0 OK convect8' 4646 4647 DO l = 1, nlay 4648 DO ig = 1, ngrid 4649 zpspsk(ig, l) = (pplay(ig, l) / pplev(ig, 1))**rkappa 4650 zh(ig, l) = pt(ig, l) / zpspsk(ig, l) 4651 zu(ig, l) = pu(ig, l) 4652 zv(ig, l) = pv(ig, l) 4653 zo(ig, l) = po(ig, l) 4654 ztv(ig, l) = zh(ig, l) * (1. + 0.61 * zo(ig, l)) 4655 END DO 4656 END DO 4657 4658 ! PRINT*,'1 OK convect8' 4659 ! -------------------- 4660 4661 4662 ! + + + + + + + + + + + 4663 4664 4665 ! wa, fraca, wd, fracd -------------------- zlev(2), rhobarz 4666 ! wh,wt,wo ... 4667 4668 ! + + + + + + + + + + + zh,zu,zv,zo,rho 4669 4670 4671 ! -------------------- zlev(1) 4672 ! \\\\\\\\\\\\\\\\\\\\ 4673 4674 4675 4676 ! ----------------------------------------------------------------------- 4677 ! Calcul des altitudes des couches 4678 ! ----------------------------------------------------------------------- 4679 4680 DO l = 2, nlay 4681 DO ig = 1, ngrid 4682 zlev(ig, l) = 0.5 * (pphi(ig, l) + pphi(ig, l - 1)) / rg 4683 END DO 4684 END DO 4685 DO ig = 1, ngrid 4686 zlev(ig, 1) = 0. 4687 zlev(ig, nlay + 1) = (2. * pphi(ig, klev) - pphi(ig, klev - 1)) / rg 4688 END DO 4689 DO l = 1, nlay 4690 DO ig = 1, ngrid 4691 zlay(ig, l) = pphi(ig, l) / rg 4692 END DO 4693 END DO 4694 4695 ! PRINT*,'2 OK convect8' 4696 ! ----------------------------------------------------------------------- 4697 ! Calcul des densites 4698 ! ----------------------------------------------------------------------- 4699 4700 DO l = 1, nlay 4701 DO ig = 1, ngrid 4702 rho(ig, l) = pplay(ig, l) / (zpspsk(ig, l) * rd * zh(ig, l)) 4703 END DO 4704 END DO 4705 4706 DO l = 2, nlay 4707 DO ig = 1, ngrid 4708 rhobarz(ig, l) = 0.5 * (rho(ig, l) + rho(ig, l - 1)) 4709 END DO 4710 END DO 4711 4712 DO k = 1, nlay 4713 DO l = 1, nlay + 1 4714 DO ig = 1, ngrid 4715 wa(ig, k, l) = 0. 4716 END DO 4717 END DO 4718 END DO 4719 4720 ! PRINT*,'3 OK convect8' 4721 ! ------------------------------------------------------------------ 4722 ! Calcul de w2, quarre de w a partir de la cape 4723 ! a partir de w2, on calcule wa, vitesse de l'ascendance 4724 4725 ! ATTENTION: Dans cette version, pour cause d'economie de memoire, 4726 ! w2 est stoke dans wa 4727 4728 ! ATTENTION: dans convect8, on n'utilise le calcule des wa 4729 ! independants par couches que pour calculer l'entrainement 4730 ! a la base et la hauteur max de l'ascendance. 4731 4732 ! Indicages: 4733 ! l'ascendance provenant du niveau k traverse l'interface l avec 4734 ! une vitesse wa(k,l). 4735 4736 ! -------------------- 4737 4738 ! + + + + + + + + + + 4739 4740 ! wa(k,l) ---- -------------------- l 4741 ! /\ 4742 ! /||\ + + + + + + + + + + 4743 ! || 4744 ! || -------------------- 4745 ! || 4746 ! || + + + + + + + + + + 4747 ! || 4748 ! || -------------------- 4749 ! ||__ 4750 ! |___ + + + + + + + + + + k 4751 4752 ! -------------------- 4753 4754 4755 4756 ! ------------------------------------------------------------------ 4757 4758 ! CR: ponderation entrainement des couches instables 4759 ! def des entr_star tels que entr=f*entr_star 4760 DO l = 1, klev 4761 DO ig = 1, ngrid 4762 entr_star(ig, l) = 0. 4763 END DO 4764 END DO 4765 ! determination de la longueur de la couche d entrainement 4766 DO ig = 1, ngrid 4767 lentr(ig) = 1 4768 END DO 4769 4770 ! on ne considere que les premieres couches instables 4771 DO k = nlay - 2, 1, -1 4772 DO ig = 1, ngrid 4773 IF (ztv(ig, k)>ztv(ig, k + 1) .AND. ztv(ig, k + 1)<=ztv(ig, k + 2)) THEN 4774 lentr(ig) = k 4775 END IF 4776 END DO 4777 END DO 4778 4779 ! determination du lmin: couche d ou provient le thermique 4780 DO ig = 1, ngrid 4781 lmin(ig) = 1 4782 END DO 4783 DO ig = 1, ngrid 4784 DO l = nlay, 2, -1 4785 IF (ztv(ig, l - 1)>ztv(ig, l)) THEN 4786 lmin(ig) = l - 1 4787 END IF 4788 END DO 4789 END DO 4790 4791 ! definition de l'entrainement des couches 4792 DO l = 1, klev - 1 4793 DO ig = 1, ngrid 4794 IF (ztv(ig, l)>ztv(ig, l + 1) .AND. l>=lmin(ig) .AND. l<=lentr(ig)) THEN 4795 entr_star(ig, l) = (ztv(ig, l) - ztv(ig, l + 1))** & ! s 4796 ! (zlev(ig,l+1)-zlev(ig,l)) 4797 sqrt(zlev(ig, l + 1)) 4798 END IF 4799 END DO 4800 END DO 4801 ! pas de thermique si couche 1 stable 4802 DO ig = 1, ngrid 4803 IF (lmin(ig)>1) THEN 4804 DO l = 1, klev 4805 entr_star(ig, l) = 0. 4806 END DO 4162 4807 END IF 4163 IF (fm(ig,k+1)<0.) THEN 4164 ! PRINT*,'fm2<0!!!' 4808 END DO 4809 ! calcul de l entrainement total 4810 DO ig = 1, ngrid 4811 entr_star_tot(ig) = 0. 4812 END DO 4813 DO ig = 1, ngrid 4814 DO k = 1, klev 4815 entr_star_tot(ig) = entr_star_tot(ig) + entr_star(ig, k) 4816 END DO 4817 END DO 4818 4819 ! PRINT*,'fin calcul entr_star' 4820 DO k = 1, klev 4821 DO ig = 1, ngrid 4822 ztva(ig, k) = ztv(ig, k) 4823 END DO 4824 END DO 4825 ! RC 4826 ! PRINT*,'7 OK convect8' 4827 DO k = 1, klev + 1 4828 DO ig = 1, ngrid 4829 zw2(ig, k) = 0. 4830 fmc(ig, k) = 0. 4831 ! CR 4832 f_star(ig, k) = 0. 4833 ! RC 4834 larg_cons(ig, k) = 0. 4835 larg_detr(ig, k) = 0. 4836 wa_moy(ig, k) = 0. 4837 END DO 4838 END DO 4839 4840 ! PRINT*,'8 OK convect8' 4841 DO ig = 1, ngrid 4842 linter(ig) = 1. 4843 lmaxa(ig) = 1 4844 lmix(ig) = 1 4845 wmaxa(ig) = 0. 4846 END DO 4847 4848 ! CR: 4849 DO l = 1, nlay - 2 4850 DO ig = 1, ngrid 4851 IF (ztv(ig, l)>ztv(ig, l + 1) .AND. entr_star(ig, l)>1.E-10 .AND. & 4852 zw2(ig, l)<1E-10) THEN 4853 f_star(ig, l + 1) = entr_star(ig, l) 4854 ! test:calcul de dteta 4855 zw2(ig, l + 1) = 2. * rg * (ztv(ig, l) - ztv(ig, l + 1)) / ztv(ig, l + 1) * & 4856 (zlev(ig, l + 1) - zlev(ig, l)) * 0.4 * pphi(ig, l) / (pphi(ig, l + 1) - pphi(ig, l)) 4857 larg_detr(ig, l) = 0. 4858 ELSE IF ((zw2(ig, l)>=1E-10) .AND. (f_star(ig, l) + entr_star(ig, & 4859 l)>1.E-10)) THEN 4860 f_star(ig, l + 1) = f_star(ig, l) + entr_star(ig, l) 4861 ztva(ig, l) = (f_star(ig, l) * ztva(ig, l - 1) + entr_star(ig, l) * ztv(ig, l)) / & 4862 f_star(ig, l + 1) 4863 zw2(ig, l + 1) = zw2(ig, l) * (f_star(ig, l) / f_star(ig, l + 1))**2 + & 4864 2. * rg * (ztva(ig, l) - ztv(ig, l)) / ztv(ig, l) * (zlev(ig, l + 1) - zlev(ig, l)) 4865 END IF 4866 ! determination de zmax continu par interpolation lineaire 4867 IF (zw2(ig, l + 1)<0.) THEN 4868 ! test 4869 IF (abs(zw2(ig, l + 1) - zw2(ig, l))<1E-10) THEN 4870 ! PRINT*,'pb linter' 4871 END IF 4872 linter(ig) = (l * (zw2(ig, l + 1) - zw2(ig, l)) - zw2(ig, l)) / (zw2(ig, l + 1) - zw2(& 4873 ig, l)) 4874 zw2(ig, l + 1) = 0. 4875 lmaxa(ig) = l 4876 ELSE 4877 IF (zw2(ig, l + 1)<0.) THEN 4878 ! PRINT*,'pb1 zw2<0' 4879 END IF 4880 wa_moy(ig, l + 1) = sqrt(zw2(ig, l + 1)) 4881 END IF 4882 IF (wa_moy(ig, l + 1)>wmaxa(ig)) THEN 4883 ! lmix est le niveau de la couche ou w (wa_moy) est maximum 4884 lmix(ig) = l + 1 4885 wmaxa(ig) = wa_moy(ig, l + 1) 4886 END IF 4887 END DO 4888 END DO 4889 ! PRINT*,'fin calcul zw2' 4890 4891 ! Calcul de la couche correspondant a la hauteur du thermique 4892 DO ig = 1, ngrid 4893 lmax(ig) = lentr(ig) 4894 END DO 4895 DO ig = 1, ngrid 4896 DO l = nlay, lentr(ig) + 1, -1 4897 IF (zw2(ig, l)<=1.E-10) THEN 4898 lmax(ig) = l - 1 4899 END IF 4900 END DO 4901 END DO 4902 ! pas de thermique si couche 1 stable 4903 DO ig = 1, ngrid 4904 IF (lmin(ig)>1) THEN 4905 lmax(ig) = 1 4906 lmin(ig) = 1 4165 4907 END IF 4166 IF (entr(ig,k)<0.) THEN 4167 ! PRINT*,'entr2<0!!!' 4168 END IF 4169 END DO 4170 END DO 4171 4172 ! calcul de la valeur dans les ascendances 4173 DO ig = 1, ngrid 4174 qa(ig, 1) = q(ig, 1) 4175 END DO 4176 4177 DO k = 2, nlay 4178 DO ig = 1, ngrid 4179 IF ((fm(ig,k+1)+detr(ig,k))*ptimestep>1.E-5*masse(ig,k)) THEN 4180 qa(ig, k) = (fm(ig,k)*qa(ig,k-1)+entr(ig,k)*q(ig,k))/ & 4181 (fm(ig,k+1)+detr(ig,k)) 4908 END DO 4909 4910 ! Determination de zw2 max 4911 DO ig = 1, ngrid 4912 wmax(ig) = 0. 4913 END DO 4914 4915 DO l = 1, nlay 4916 DO ig = 1, ngrid 4917 IF (l<=lmax(ig)) THEN 4918 IF (zw2(ig, l)<0.) THEN 4919 ! PRINT*,'pb2 zw2<0' 4920 END IF 4921 zw2(ig, l) = sqrt(zw2(ig, l)) 4922 wmax(ig) = max(wmax(ig), zw2(ig, l)) 4923 ELSE 4924 zw2(ig, l) = 0. 4925 END IF 4926 END DO 4927 END DO 4928 4929 ! Longueur caracteristique correspondant a la hauteur des thermiques. 4930 DO ig = 1, ngrid 4931 zmax(ig) = 0. 4932 zlevinter(ig) = zlev(ig, 1) 4933 END DO 4934 DO ig = 1, ngrid 4935 ! calcul de zlevinter 4936 zlevinter(ig) = (zlev(ig, lmax(ig) + 1) - zlev(ig, lmax(ig))) * linter(ig) + & 4937 zlev(ig, lmax(ig)) - lmax(ig) * (zlev(ig, lmax(ig) + 1) - zlev(ig, lmax(ig))) 4938 zmax(ig) = max(zmax(ig), zlevinter(ig) - zlev(ig, lmin(ig))) 4939 END DO 4940 4941 ! PRINT*,'avant fermeture' 4942 ! Fermeture,determination de f 4943 DO ig = 1, ngrid 4944 entr_star2(ig) = 0. 4945 END DO 4946 DO ig = 1, ngrid 4947 IF (entr_star_tot(ig)<1.E-10) THEN 4948 f(ig) = 0. 4182 4949 ELSE 4183 qa(ig, k) = q(ig, k) 4184 END IF 4185 IF (qa(ig,k)<0.) THEN 4186 ! PRINT*,'qa<0!!!' 4187 END IF 4188 IF (q(ig,k)<0.) THEN 4189 ! PRINT*,'q<0!!!' 4190 END IF 4191 END DO 4192 END DO 4193 4194 DO k = 2, nlay 4195 DO ig = 1, ngrid 4196 ! wqd(ig,k)=fm(ig,k)*0.5*(q(ig,k-1)+q(ig,k)) 4197 wqd(ig, k) = fm(ig, k)*q(ig, k) 4198 IF (wqd(ig,k)<0.) THEN 4199 ! PRINT*,'wqd<0!!!' 4200 END IF 4201 END DO 4202 END DO 4203 DO ig = 1, ngrid 4204 wqd(ig, 1) = 0. 4205 wqd(ig, nlay+1) = 0. 4206 END DO 4207 4208 DO k = 1, nlay 4209 DO ig = 1, ngrid 4210 dq(ig, k) = (detr(ig,k)*qa(ig,k)-entr(ig,k)*q(ig,k)-wqd(ig,k)+wqd(ig,k+ & 4211 1))/masse(ig, k) 4212 ! if (dq(ig,k).lt.0.) THEN 4213 ! PRINT*,'dq<0!!!' 4214 ! END IF 4215 END DO 4216 END DO 4217 4218 4219 END SUBROUTINE dqthermcell 4220 SUBROUTINE dvthermcell(ngrid, nlay, ptimestep, fm, entr, masse, fraca, larga, & 4221 u, v, du, dv, ua, va) 4222 USE dimphy 4223 IMPLICIT NONE 4224 4225 ! ======================================================================= 4226 4227 ! Calcul du transport verticale dans la couche limite en presence 4228 ! de "thermiques" explicitement representes 4229 ! calcul du dq/dt une fois qu'on connait les ascendances 4230 4231 ! ======================================================================= 4232 4233 INTEGER ngrid, nlay 4234 4235 REAL ptimestep 4236 REAL masse(ngrid, nlay), fm(ngrid, nlay+1) 4237 REAL fraca(ngrid, nlay+1) 4238 REAL larga(ngrid) 4239 REAL entr(ngrid, nlay) 4240 REAL u(ngrid, nlay) 4241 REAL ua(ngrid, nlay) 4242 REAL du(ngrid, nlay) 4243 REAL v(ngrid, nlay) 4244 REAL va(ngrid, nlay) 4245 REAL dv(ngrid, nlay) 4246 4247 REAL qa(klon, klev), detr(klon, klev) 4248 REAL wvd(klon, klev+1), wud(klon, klev+1) 4249 REAL gamma0, gamma(klon, klev+1) 4250 REAL dua, dva 4251 INTEGER iter 4252 4253 INTEGER ig, k 4254 4255 ! calcul du detrainement 4256 4257 DO k = 1, nlay 4258 DO ig = 1, ngrid 4259 detr(ig, k) = fm(ig, k) - fm(ig, k+1) + entr(ig, k) 4260 END DO 4261 END DO 4262 4263 ! calcul de la valeur dans les ascendances 4264 DO ig = 1, ngrid 4265 ua(ig, 1) = u(ig, 1) 4266 va(ig, 1) = v(ig, 1) 4267 END DO 4268 4269 DO k = 2, nlay 4270 DO ig = 1, ngrid 4271 IF ((fm(ig,k+1)+detr(ig,k))*ptimestep>1.E-5*masse(ig,k)) THEN 4272 ! On itère sur la valeur du coeff de freinage. 4273 ! gamma0=rho(ig,k)*(zlev(ig,k+1)-zlev(ig,k)) 4274 gamma0 = masse(ig, k)*sqrt(0.5*(fraca(ig,k+1)+fraca(ig, & 4275 k)))*0.5/larga(ig) 4276 ! gamma0=0. 4277 ! la première fois on multiplie le coefficient de freinage 4278 ! par le module du vent dans la couche en dessous. 4279 dua = ua(ig, k-1) - u(ig, k-1) 4280 dva = va(ig, k-1) - v(ig, k-1) 4281 DO iter = 1, 5 4282 gamma(ig, k) = gamma0*sqrt(dua**2+dva**2) 4283 ua(ig, k) = (fm(ig,k)*ua(ig,k-1)+(entr(ig,k)+gamma(ig, & 4284 k))*u(ig,k))/(fm(ig,k+1)+detr(ig,k)+gamma(ig,k)) 4285 va(ig, k) = (fm(ig,k)*va(ig,k-1)+(entr(ig,k)+gamma(ig, & 4286 k))*v(ig,k))/(fm(ig,k+1)+detr(ig,k)+gamma(ig,k)) 4287 ! PRINT*,k,ua(ig,k),va(ig,k),u(ig,k),v(ig,k),dua,dva 4288 dua = ua(ig, k) - u(ig, k) 4289 dva = va(ig, k) - v(ig, k) 4950 DO k = lmin(ig), lentr(ig) 4951 entr_star2(ig) = entr_star2(ig) + entr_star(ig, k)**2 / (rho(ig, k) * (& 4952 zlev(ig, k + 1) - zlev(ig, k))) 4290 4953 END DO 4291 ELSE 4292 ua(ig, k) = u(ig, k) 4293 va(ig, k) = v(ig, k) 4294 gamma(ig, k) = 0. 4295 END IF 4296 END DO 4297 END DO 4298 4299 DO k = 2, nlay 4300 DO ig = 1, ngrid 4301 wud(ig, k) = fm(ig, k)*u(ig, k) 4302 wvd(ig, k) = fm(ig, k)*v(ig, k) 4303 END DO 4304 END DO 4305 DO ig = 1, ngrid 4306 wud(ig, 1) = 0. 4307 wud(ig, nlay+1) = 0. 4308 wvd(ig, 1) = 0. 4309 wvd(ig, nlay+1) = 0. 4310 END DO 4311 4312 DO k = 1, nlay 4313 DO ig = 1, ngrid 4314 du(ig, k) = ((detr(ig,k)+gamma(ig,k))*ua(ig,k)-(entr(ig,k)+gamma(ig, & 4315 k))*u(ig,k)-wud(ig,k)+wud(ig,k+1))/masse(ig, k) 4316 dv(ig, k) = ((detr(ig,k)+gamma(ig,k))*va(ig,k)-(entr(ig,k)+gamma(ig, & 4317 k))*v(ig,k)-wvd(ig,k)+wvd(ig,k+1))/masse(ig, k) 4318 END DO 4319 END DO 4320 4321 4322 END SUBROUTINE dvthermcell 4323 SUBROUTINE dqthermcell2(ngrid, nlay, ptimestep, fm, entr, masse, frac, q, dq, & 4324 qa) 4325 USE dimphy 4326 IMPLICIT NONE 4327 4328 ! ======================================================================= 4329 4330 ! Calcul du transport verticale dans la couche limite en presence 4331 ! de "thermiques" explicitement representes 4332 ! calcul du dq/dt une fois qu'on connait les ascendances 4333 4334 ! ======================================================================= 4335 4336 INTEGER ngrid, nlay 4337 4338 REAL ptimestep 4339 REAL masse(ngrid, nlay), fm(ngrid, nlay+1) 4340 REAL entr(ngrid, nlay), frac(ngrid, nlay) 4341 REAL q(ngrid, nlay) 4342 REAL dq(ngrid, nlay) 4343 4344 REAL qa(klon, klev), detr(klon, klev), wqd(klon, klev+1) 4345 REAL qe(klon, klev), zf, zf2 4346 4347 INTEGER ig, k 4348 4349 ! calcul du detrainement 4350 4351 DO k = 1, nlay 4352 DO ig = 1, ngrid 4353 detr(ig, k) = fm(ig, k) - fm(ig, k+1) + entr(ig, k) 4354 END DO 4355 END DO 4356 4357 ! calcul de la valeur dans les ascendances 4358 DO ig = 1, ngrid 4359 qa(ig, 1) = q(ig, 1) 4360 qe(ig, 1) = q(ig, 1) 4361 END DO 4362 4363 DO k = 2, nlay 4364 DO ig = 1, ngrid 4365 IF ((fm(ig,k+1)+detr(ig,k))*ptimestep>1.E-5*masse(ig,k)) THEN 4366 zf = 0.5*(frac(ig,k)+frac(ig,k+1)) 4367 zf2 = 1./(1.-zf) 4368 qa(ig, k) = (fm(ig,k)*qa(ig,k-1)+zf2*entr(ig,k)*q(ig,k))/ & 4369 (fm(ig,k+1)+detr(ig,k)+entr(ig,k)*zf*zf2) 4370 qe(ig, k) = (q(ig,k)-zf*qa(ig,k))*zf2 4371 ELSE 4372 qa(ig, k) = q(ig, k) 4373 qe(ig, k) = q(ig, k) 4374 END IF 4375 END DO 4376 END DO 4377 4378 DO k = 2, nlay 4379 DO ig = 1, ngrid 4380 ! wqd(ig,k)=fm(ig,k)*0.5*(q(ig,k-1)+q(ig,k)) 4381 wqd(ig, k) = fm(ig, k)*qe(ig, k) 4382 END DO 4383 END DO 4384 DO ig = 1, ngrid 4385 wqd(ig, 1) = 0. 4386 wqd(ig, nlay+1) = 0. 4387 END DO 4388 4389 DO k = 1, nlay 4390 DO ig = 1, ngrid 4391 dq(ig, k) = (detr(ig,k)*qa(ig,k)-entr(ig,k)*qe(ig,k)-wqd(ig,k)+wqd(ig,k & 4392 +1))/masse(ig, k) 4393 END DO 4394 END DO 4395 4396 4397 END SUBROUTINE dqthermcell2 4398 SUBROUTINE dvthermcell2(ngrid, nlay, ptimestep, fm, entr, masse, fraca, & 4399 larga, u, v, du, dv, ua, va) 4400 USE dimphy 4401 IMPLICIT NONE 4402 4403 ! ======================================================================= 4404 4405 ! Calcul du transport verticale dans la couche limite en presence 4406 ! de "thermiques" explicitement representes 4407 ! calcul du dq/dt une fois qu'on connait les ascendances 4408 4409 ! ======================================================================= 4410 4411 INTEGER ngrid, nlay 4412 4413 REAL ptimestep 4414 REAL masse(ngrid, nlay), fm(ngrid, nlay+1) 4415 REAL fraca(ngrid, nlay+1) 4416 REAL larga(ngrid) 4417 REAL entr(ngrid, nlay) 4418 REAL u(ngrid, nlay) 4419 REAL ua(ngrid, nlay) 4420 REAL du(ngrid, nlay) 4421 REAL v(ngrid, nlay) 4422 REAL va(ngrid, nlay) 4423 REAL dv(ngrid, nlay) 4424 4425 REAL qa(klon, klev), detr(klon, klev), zf, zf2 4426 REAL wvd(klon, klev+1), wud(klon, klev+1) 4427 REAL gamma0, gamma(klon, klev+1) 4428 REAL ue(klon, klev), ve(klon, klev) 4429 REAL dua, dva 4430 INTEGER iter 4431 4432 INTEGER ig, k 4433 4434 ! calcul du detrainement 4435 4436 DO k = 1, nlay 4437 DO ig = 1, ngrid 4438 detr(ig, k) = fm(ig, k) - fm(ig, k+1) + entr(ig, k) 4439 END DO 4440 END DO 4441 4442 ! calcul de la valeur dans les ascendances 4443 DO ig = 1, ngrid 4444 ua(ig, 1) = u(ig, 1) 4445 va(ig, 1) = v(ig, 1) 4446 ue(ig, 1) = u(ig, 1) 4447 ve(ig, 1) = v(ig, 1) 4448 END DO 4449 4450 DO k = 2, nlay 4451 DO ig = 1, ngrid 4452 IF ((fm(ig,k+1)+detr(ig,k))*ptimestep>1.E-5*masse(ig,k)) THEN 4453 ! On itère sur la valeur du coeff de freinage. 4454 ! gamma0=rho(ig,k)*(zlev(ig,k+1)-zlev(ig,k)) 4455 gamma0 = masse(ig, k)*sqrt(0.5*(fraca(ig,k+1)+fraca(ig, & 4456 k)))*0.5/larga(ig)*1. 4457 ! s *0.5 4458 ! gamma0=0. 4459 zf = 0.5*(fraca(ig,k)+fraca(ig,k+1)) 4460 zf = 0. 4461 zf2 = 1./(1.-zf) 4462 ! la première fois on multiplie le coefficient de freinage 4463 ! par le module du vent dans la couche en dessous. 4464 dua = ua(ig, k-1) - u(ig, k-1) 4465 dva = va(ig, k-1) - v(ig, k-1) 4466 DO iter = 1, 5 4467 ! On choisit une relaxation lineaire. 4468 gamma(ig, k) = gamma0 4469 ! On choisit une relaxation quadratique. 4470 gamma(ig, k) = gamma0*sqrt(dua**2+dva**2) 4471 ua(ig, k) = (fm(ig,k)*ua(ig,k-1)+(zf2*entr(ig,k)+gamma(ig, & 4472 k))*u(ig,k))/(fm(ig,k+1)+detr(ig,k)+entr(ig,k)*zf*zf2+gamma(ig,k) & 4473 ) 4474 va(ig, k) = (fm(ig,k)*va(ig,k-1)+(zf2*entr(ig,k)+gamma(ig, & 4475 k))*v(ig,k))/(fm(ig,k+1)+detr(ig,k)+entr(ig,k)*zf*zf2+gamma(ig,k) & 4476 ) 4477 ! PRINT*,k,ua(ig,k),va(ig,k),u(ig,k),v(ig,k),dua,dva 4478 dua = ua(ig, k) - u(ig, k) 4479 dva = va(ig, k) - v(ig, k) 4480 ue(ig, k) = (u(ig,k)-zf*ua(ig,k))*zf2 4481 ve(ig, k) = (v(ig,k)-zf*va(ig,k))*zf2 4482 END DO 4483 ELSE 4484 ua(ig, k) = u(ig, k) 4485 va(ig, k) = v(ig, k) 4486 ue(ig, k) = u(ig, k) 4487 ve(ig, k) = v(ig, k) 4488 gamma(ig, k) = 0. 4489 END IF 4490 END DO 4491 END DO 4492 4493 DO k = 2, nlay 4494 DO ig = 1, ngrid 4495 wud(ig, k) = fm(ig, k)*ue(ig, k) 4496 wvd(ig, k) = fm(ig, k)*ve(ig, k) 4497 END DO 4498 END DO 4499 DO ig = 1, ngrid 4500 wud(ig, 1) = 0. 4501 wud(ig, nlay+1) = 0. 4502 wvd(ig, 1) = 0. 4503 wvd(ig, nlay+1) = 0. 4504 END DO 4505 4506 DO k = 1, nlay 4507 DO ig = 1, ngrid 4508 du(ig, k) = ((detr(ig,k)+gamma(ig,k))*ua(ig,k)-(entr(ig,k)+gamma(ig, & 4509 k))*ue(ig,k)-wud(ig,k)+wud(ig,k+1))/masse(ig, k) 4510 dv(ig, k) = ((detr(ig,k)+gamma(ig,k))*va(ig,k)-(entr(ig,k)+gamma(ig, & 4511 k))*ve(ig,k)-wvd(ig,k)+wvd(ig,k+1))/masse(ig, k) 4512 END DO 4513 END DO 4514 4515 4516 END SUBROUTINE dvthermcell2 4517 SUBROUTINE thermcell_sec(ngrid, nlay, ptimestep, pplay, pplev, pphi, zlev, & 4518 pu, pv, pt, po, pduadj, pdvadj, pdtadj, pdoadj, fm0, entr0 & ! s 4519 ! ,pu_therm,pv_therm 4520 , r_aspect, l_mix, w2di, tho) 4521 4522 USE dimphy 4523 IMPLICIT NONE 4524 4525 ! ======================================================================= 4526 4527 ! Calcul du transport verticale dans la couche limite en presence 4528 ! de "thermiques" explicitement representes 4529 4530 ! Réécriture à partir d'un listing papier à Habas, le 14/02/00 4531 4532 ! le thermique est supposé homogène et dissipé par mélange avec 4533 ! son environnement. la longueur l_mix contrôle l'efficacité du 4534 ! mélange 4535 4536 ! Le calcul du transport des différentes espèces se fait en prenant 4537 ! en compte: 4538 ! 1. un flux de masse montant 4539 ! 2. un flux de masse descendant 4540 ! 3. un entrainement 4541 ! 4. un detrainement 4542 4543 ! ======================================================================= 4544 4545 ! ----------------------------------------------------------------------- 4546 ! declarations: 4547 ! ------------- 4548 4549 include "YOMCST.h" 4550 4551 ! arguments: 4552 ! ---------- 4553 4554 INTEGER ngrid, nlay, w2di 4555 REAL tho 4556 REAL ptimestep, l_mix, r_aspect 4557 REAL pt(ngrid, nlay), pdtadj(ngrid, nlay) 4558 REAL pu(ngrid, nlay), pduadj(ngrid, nlay) 4559 REAL pv(ngrid, nlay), pdvadj(ngrid, nlay) 4560 REAL po(ngrid, nlay), pdoadj(ngrid, nlay) 4561 REAL pplay(ngrid, nlay), pplev(ngrid, nlay+1) 4562 REAL pphi(ngrid, nlay) 4563 4564 INTEGER idetr 4565 SAVE idetr 4566 DATA idetr/3/ 4567 !$OMP THREADPRIVATE(idetr) 4568 4569 ! local: 4570 ! ------ 4571 4572 INTEGER ig, k, l, lmaxa(klon), lmix(klon) 4573 REAL zsortie1d(klon) 4574 ! CR: on remplace lmax(klon,klev+1) 4575 INTEGER lmax(klon), lmin(klon), lentr(klon) 4576 REAL linter(klon) 4577 REAL zmix(klon), fracazmix(klon) 4578 ! RC 4579 REAL zmax(klon), zw, zz, zw2(klon, klev+1), ztva(klon, klev), zzz 4580 4581 REAL zlev(klon, klev+1), zlay(klon, klev) 4582 REAL zh(klon, klev), zdhadj(klon, klev) 4583 REAL ztv(klon, klev) 4584 REAL zu(klon, klev), zv(klon, klev), zo(klon, klev) 4585 REAL wh(klon, klev+1) 4586 REAL wu(klon, klev+1), wv(klon, klev+1), wo(klon, klev+1) 4587 REAL zla(klon, klev+1) 4588 REAL zwa(klon, klev+1) 4589 REAL zld(klon, klev+1) 4590 REAL zwd(klon, klev+1) 4591 REAL zsortie(klon, klev) 4592 REAL zva(klon, klev) 4593 REAL zua(klon, klev) 4594 REAL zoa(klon, klev) 4595 4596 REAL zha(klon, klev) 4597 REAL wa_moy(klon, klev+1) 4598 REAL fraca(klon, klev+1) 4599 REAL fracc(klon, klev+1) 4600 REAL zf, zf2 4601 REAL thetath2(klon, klev), wth2(klon, klev) 4602 ! common/comtherm/thetath2,wth2 4603 4604 REAL count_time 4605 INTEGER ialt 4606 4607 LOGICAL sorties 4608 REAL rho(klon, klev), rhobarz(klon, klev+1), masse(klon, klev) 4609 REAL zpspsk(klon, klev) 4610 4611 ! real wmax(klon,klev),wmaxa(klon) 4612 REAL wmax(klon), wmaxa(klon) 4613 REAL wa(klon, klev, klev+1) 4614 REAL wd(klon, klev+1) 4615 REAL larg_part(klon, klev, klev+1) 4616 REAL fracd(klon, klev+1) 4617 REAL xxx(klon, klev+1) 4618 REAL larg_cons(klon, klev+1) 4619 REAL larg_detr(klon, klev+1) 4620 REAL fm0(klon, klev+1), entr0(klon, klev), detr(klon, klev) 4621 REAL pu_therm(klon, klev), pv_therm(klon, klev) 4622 REAL fm(klon, klev+1), entr(klon, klev) 4623 REAL fmc(klon, klev+1) 4624 4625 ! CR:nouvelles variables 4626 REAL f_star(klon, klev+1), entr_star(klon, klev) 4627 REAL entr_star_tot(klon), entr_star2(klon) 4628 REAL f(klon), f0(klon) 4629 REAL zlevinter(klon) 4630 LOGICAL first 4631 DATA first/.FALSE./ 4632 SAVE first 4633 !$OMP THREADPRIVATE(first) 4634 ! RC 4635 4636 CHARACTER *2 str2 4637 CHARACTER *10 str10 4638 4639 CHARACTER (LEN=20) :: modname = 'thermcell_sec' 4640 CHARACTER (LEN=80) :: abort_message 4641 4642 LOGICAL vtest(klon), down 4643 4644 EXTERNAL scopy 4645 4646 INTEGER ncorrec, ll 4647 SAVE ncorrec 4648 DATA ncorrec/0/ 4649 !$OMP THREADPRIVATE(ncorrec) 4650 4651 4652 ! ----------------------------------------------------------------------- 4653 ! initialisation: 4654 ! --------------- 4655 4656 sorties = .TRUE. 4657 IF (ngrid/=klon) THEN 4658 PRINT * 4659 PRINT *, 'STOP dans convadj' 4660 PRINT *, 'ngrid =', ngrid 4661 PRINT *, 'klon =', klon 4662 END IF 4663 4664 ! ----------------------------------------------------------------------- 4665 ! incrementation eventuelle de tendances precedentes: 4666 ! --------------------------------------------------- 4667 4668 ! PRINT*,'0 OK convect8' 4669 4670 DO l = 1, nlay 4671 DO ig = 1, ngrid 4672 zpspsk(ig, l) = (pplay(ig,l)/pplev(ig,1))**rkappa 4673 zh(ig, l) = pt(ig, l)/zpspsk(ig, l) 4674 zu(ig, l) = pu(ig, l) 4675 zv(ig, l) = pv(ig, l) 4676 zo(ig, l) = po(ig, l) 4677 ztv(ig, l) = zh(ig, l)*(1.+0.61*zo(ig,l)) 4678 END DO 4679 END DO 4680 4681 ! PRINT*,'1 OK convect8' 4682 ! -------------------- 4683 4684 4685 ! + + + + + + + + + + + 4686 4687 4688 ! wa, fraca, wd, fracd -------------------- zlev(2), rhobarz 4689 ! wh,wt,wo ... 4690 4691 ! + + + + + + + + + + + zh,zu,zv,zo,rho 4692 4693 4694 ! -------------------- zlev(1) 4695 ! \\\\\\\\\\\\\\\\\\\\ 4696 4697 4698 4699 ! ----------------------------------------------------------------------- 4700 ! Calcul des altitudes des couches 4701 ! ----------------------------------------------------------------------- 4702 4703 DO l = 2, nlay 4704 DO ig = 1, ngrid 4705 zlev(ig, l) = 0.5*(pphi(ig,l)+pphi(ig,l-1))/rg 4706 END DO 4707 END DO 4708 DO ig = 1, ngrid 4709 zlev(ig, 1) = 0. 4710 zlev(ig, nlay+1) = (2.*pphi(ig,klev)-pphi(ig,klev-1))/rg 4711 END DO 4712 DO l = 1, nlay 4713 DO ig = 1, ngrid 4714 zlay(ig, l) = pphi(ig, l)/rg 4715 END DO 4716 END DO 4717 4718 ! PRINT*,'2 OK convect8' 4719 ! ----------------------------------------------------------------------- 4720 ! Calcul des densites 4721 ! ----------------------------------------------------------------------- 4722 4723 DO l = 1, nlay 4724 DO ig = 1, ngrid 4725 rho(ig, l) = pplay(ig, l)/(zpspsk(ig,l)*rd*zh(ig,l)) 4726 END DO 4727 END DO 4728 4729 DO l = 2, nlay 4730 DO ig = 1, ngrid 4731 rhobarz(ig, l) = 0.5*(rho(ig,l)+rho(ig,l-1)) 4732 END DO 4733 END DO 4734 4735 DO k = 1, nlay 4736 DO l = 1, nlay + 1 4737 DO ig = 1, ngrid 4738 wa(ig, k, l) = 0. 4739 END DO 4740 END DO 4741 END DO 4742 4743 ! PRINT*,'3 OK convect8' 4744 ! ------------------------------------------------------------------ 4745 ! Calcul de w2, quarre de w a partir de la cape 4746 ! a partir de w2, on calcule wa, vitesse de l'ascendance 4747 4748 ! ATTENTION: Dans cette version, pour cause d'economie de memoire, 4749 ! w2 est stoke dans wa 4750 4751 ! ATTENTION: dans convect8, on n'utilise le calcule des wa 4752 ! independants par couches que pour calculer l'entrainement 4753 ! a la base et la hauteur max de l'ascendance. 4754 4755 ! Indicages: 4756 ! l'ascendance provenant du niveau k traverse l'interface l avec 4757 ! une vitesse wa(k,l). 4758 4759 ! -------------------- 4760 4761 ! + + + + + + + + + + 4762 4763 ! wa(k,l) ---- -------------------- l 4764 ! /\ 4765 ! /||\ + + + + + + + + + + 4766 ! || 4767 ! || -------------------- 4768 ! || 4769 ! || + + + + + + + + + + 4770 ! || 4771 ! || -------------------- 4772 ! ||__ 4773 ! |___ + + + + + + + + + + k 4774 4775 ! -------------------- 4776 4777 4778 4779 ! ------------------------------------------------------------------ 4780 4781 ! CR: ponderation entrainement des couches instables 4782 ! def des entr_star tels que entr=f*entr_star 4783 DO l = 1, klev 4784 DO ig = 1, ngrid 4785 entr_star(ig, l) = 0. 4786 END DO 4787 END DO 4788 ! determination de la longueur de la couche d entrainement 4789 DO ig = 1, ngrid 4790 lentr(ig) = 1 4791 END DO 4792 4793 ! on ne considere que les premieres couches instables 4794 DO k = nlay - 2, 1, -1 4795 DO ig = 1, ngrid 4796 IF (ztv(ig,k)>ztv(ig,k+1) .AND. ztv(ig,k+1)<=ztv(ig,k+2)) THEN 4797 lentr(ig) = k 4798 END IF 4799 END DO 4800 END DO 4801 4802 ! determination du lmin: couche d ou provient le thermique 4803 DO ig = 1, ngrid 4804 lmin(ig) = 1 4805 END DO 4806 DO ig = 1, ngrid 4807 DO l = nlay, 2, -1 4808 IF (ztv(ig,l-1)>ztv(ig,l)) THEN 4809 lmin(ig) = l - 1 4810 END IF 4811 END DO 4812 END DO 4813 4814 ! definition de l'entrainement des couches 4815 DO l = 1, klev - 1 4816 DO ig = 1, ngrid 4817 IF (ztv(ig,l)>ztv(ig,l+1) .AND. l>=lmin(ig) .AND. l<=lentr(ig)) THEN 4818 entr_star(ig, l) = (ztv(ig,l)-ztv(ig,l+1))** & ! s 4819 ! (zlev(ig,l+1)-zlev(ig,l)) 4820 sqrt(zlev(ig,l+1)) 4821 END IF 4822 END DO 4823 END DO 4824 ! pas de thermique si couche 1 stable 4825 DO ig = 1, ngrid 4826 IF (lmin(ig)>1) THEN 4827 DO l = 1, klev 4828 entr_star(ig, l) = 0. 4829 END DO 4830 END IF 4831 END DO 4832 ! calcul de l entrainement total 4833 DO ig = 1, ngrid 4834 entr_star_tot(ig) = 0. 4835 END DO 4836 DO ig = 1, ngrid 4837 DO k = 1, klev 4838 entr_star_tot(ig) = entr_star_tot(ig) + entr_star(ig, k) 4839 END DO 4840 END DO 4841 4842 ! PRINT*,'fin calcul entr_star' 4843 DO k = 1, klev 4844 DO ig = 1, ngrid 4845 ztva(ig, k) = ztv(ig, k) 4846 END DO 4847 END DO 4848 ! RC 4849 ! PRINT*,'7 OK convect8' 4850 DO k = 1, klev + 1 4851 DO ig = 1, ngrid 4852 zw2(ig, k) = 0. 4853 fmc(ig, k) = 0. 4854 ! CR 4855 f_star(ig, k) = 0. 4856 ! RC 4857 larg_cons(ig, k) = 0. 4858 larg_detr(ig, k) = 0. 4859 wa_moy(ig, k) = 0. 4860 END DO 4861 END DO 4862 4863 ! PRINT*,'8 OK convect8' 4864 DO ig = 1, ngrid 4865 linter(ig) = 1. 4866 lmaxa(ig) = 1 4867 lmix(ig) = 1 4868 wmaxa(ig) = 0. 4869 END DO 4870 4871 ! CR: 4872 DO l = 1, nlay - 2 4873 DO ig = 1, ngrid 4874 IF (ztv(ig,l)>ztv(ig,l+1) .AND. entr_star(ig,l)>1.E-10 .AND. & 4875 zw2(ig,l)<1E-10) THEN 4876 f_star(ig, l+1) = entr_star(ig, l) 4877 ! test:calcul de dteta 4878 zw2(ig, l+1) = 2.*rg*(ztv(ig,l)-ztv(ig,l+1))/ztv(ig, l+1)* & 4879 (zlev(ig,l+1)-zlev(ig,l))*0.4*pphi(ig, l)/(pphi(ig,l+1)-pphi(ig,l)) 4880 larg_detr(ig, l) = 0. 4881 ELSE IF ((zw2(ig,l)>=1E-10) .AND. (f_star(ig,l)+entr_star(ig, & 4882 l)>1.E-10)) THEN 4883 f_star(ig, l+1) = f_star(ig, l) + entr_star(ig, l) 4884 ztva(ig, l) = (f_star(ig,l)*ztva(ig,l-1)+entr_star(ig,l)*ztv(ig,l))/ & 4885 f_star(ig, l+1) 4886 zw2(ig, l+1) = zw2(ig, l)*(f_star(ig,l)/f_star(ig,l+1))**2 + & 4887 2.*rg*(ztva(ig,l)-ztv(ig,l))/ztv(ig, l)*(zlev(ig,l+1)-zlev(ig,l)) 4888 END IF 4889 ! determination de zmax continu par interpolation lineaire 4890 IF (zw2(ig,l+1)<0.) THEN 4954 ! Nouvelle fermeture 4955 f(ig) = wmax(ig) / (max(500., zmax(ig)) * r_aspect * entr_star2(ig)) * & 4956 entr_star_tot(ig) 4891 4957 ! test 4892 IF (abs(zw2(ig,l+1)-zw2(ig,l))<1E-10) THEN 4893 ! PRINT*,'pb linter' 4894 END IF 4895 linter(ig) = (l*(zw2(ig,l+1)-zw2(ig,l))-zw2(ig,l))/(zw2(ig,l+1)-zw2( & 4896 ig,l)) 4897 zw2(ig, l+1) = 0. 4898 lmaxa(ig) = l 4899 ELSE 4900 IF (zw2(ig,l+1)<0.) THEN 4901 ! PRINT*,'pb1 zw2<0' 4902 END IF 4903 wa_moy(ig, l+1) = sqrt(zw2(ig,l+1)) 4904 END IF 4905 IF (wa_moy(ig,l+1)>wmaxa(ig)) THEN 4906 ! lmix est le niveau de la couche ou w (wa_moy) est maximum 4907 lmix(ig) = l + 1 4908 wmaxa(ig) = wa_moy(ig, l+1) 4909 END IF 4910 END DO 4911 END DO 4912 ! PRINT*,'fin calcul zw2' 4913 4914 ! Calcul de la couche correspondant a la hauteur du thermique 4915 DO ig = 1, ngrid 4916 lmax(ig) = lentr(ig) 4917 END DO 4918 DO ig = 1, ngrid 4919 DO l = nlay, lentr(ig) + 1, -1 4920 IF (zw2(ig,l)<=1.E-10) THEN 4921 lmax(ig) = l - 1 4922 END IF 4923 END DO 4924 END DO 4925 ! pas de thermique si couche 1 stable 4926 DO ig = 1, ngrid 4927 IF (lmin(ig)>1) THEN 4928 lmax(ig) = 1 4929 lmin(ig) = 1 4930 END IF 4931 END DO 4932 4933 ! Determination de zw2 max 4934 DO ig = 1, ngrid 4935 wmax(ig) = 0. 4936 END DO 4937 4938 DO l = 1, nlay 4939 DO ig = 1, ngrid 4940 IF (l<=lmax(ig)) THEN 4941 IF (zw2(ig,l)<0.) THEN 4942 ! PRINT*,'pb2 zw2<0' 4943 END IF 4944 zw2(ig, l) = sqrt(zw2(ig,l)) 4945 wmax(ig) = max(wmax(ig), zw2(ig,l)) 4946 ELSE 4947 zw2(ig, l) = 0. 4948 END IF 4949 END DO 4950 END DO 4951 4952 ! Longueur caracteristique correspondant a la hauteur des thermiques. 4953 DO ig = 1, ngrid 4954 zmax(ig) = 0. 4955 zlevinter(ig) = zlev(ig, 1) 4956 END DO 4957 DO ig = 1, ngrid 4958 ! calcul de zlevinter 4959 zlevinter(ig) = (zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig)))*linter(ig) + & 4960 zlev(ig, lmax(ig)) - lmax(ig)*(zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig))) 4961 zmax(ig) = max(zmax(ig), zlevinter(ig)-zlev(ig,lmin(ig))) 4962 END DO 4963 4964 ! PRINT*,'avant fermeture' 4965 ! Fermeture,determination de f 4966 DO ig = 1, ngrid 4967 entr_star2(ig) = 0. 4968 END DO 4969 DO ig = 1, ngrid 4970 IF (entr_star_tot(ig)<1.E-10) THEN 4971 f(ig) = 0. 4972 ELSE 4973 DO k = lmin(ig), lentr(ig) 4974 entr_star2(ig) = entr_star2(ig) + entr_star(ig, k)**2/(rho(ig,k)*( & 4975 zlev(ig,k+1)-zlev(ig,k))) 4976 END DO 4977 ! Nouvelle fermeture 4978 f(ig) = wmax(ig)/(max(500.,zmax(ig))*r_aspect*entr_star2(ig))* & 4979 entr_star_tot(ig) 4980 ! test 4981 ! if (first) THEN 4982 ! f(ig)=f(ig)+(f0(ig)-f(ig))*exp(-ptimestep/zmax(ig) 4983 ! s *wmax(ig)) 4984 ! END IF 4985 END IF 4986 ! f0(ig)=f(ig) 4987 ! first=.TRUE. 4988 END DO 4989 ! PRINT*,'apres fermeture' 4990 4991 ! Calcul de l'entrainement 4992 DO k = 1, klev 4993 DO ig = 1, ngrid 4994 entr(ig, k) = f(ig)*entr_star(ig, k) 4995 END DO 4996 END DO 4997 ! CR:test pour entrainer moins que la masse 4998 DO ig = 1, ngrid 4999 DO l = 1, lentr(ig) 5000 IF ((entr(ig,l)*ptimestep)>(0.9*masse(ig,l))) THEN 5001 entr(ig, l+1) = entr(ig, l+1) + entr(ig, l) - & 5002 0.9*masse(ig, l)/ptimestep 5003 entr(ig, l) = 0.9*masse(ig, l)/ptimestep 5004 END IF 5005 END DO 5006 END DO 5007 ! CR: fin test 5008 ! Calcul des flux 5009 DO ig = 1, ngrid 5010 DO l = 1, lmax(ig) - 1 5011 fmc(ig, l+1) = fmc(ig, l) + entr(ig, l) 5012 END DO 5013 END DO 5014 5015 ! RC 5016 5017 5018 ! PRINT*,'9 OK convect8' 5019 ! PRINT*,'WA1 ',wa_moy 5020 5021 ! determination de l'indice du debut de la mixed layer ou w decroit 5022 5023 ! calcul de la largeur de chaque ascendance dans le cas conservatif. 5024 ! dans ce cas simple, on suppose que la largeur de l'ascendance provenant 5025 ! d'une couche est égale à la hauteur de la couche alimentante. 5026 ! La vitesse maximale dans l'ascendance est aussi prise comme estimation 5027 ! de la vitesse d'entrainement horizontal dans la couche alimentante. 5028 5029 DO l = 2, nlay 5030 DO ig = 1, ngrid 5031 IF (l<=lmaxa(ig)) THEN 5032 zw = max(wa_moy(ig,l), 1.E-10) 5033 larg_cons(ig, l) = zmax(ig)*r_aspect*fmc(ig, l)/(rhobarz(ig,l)*zw) 5034 END IF 5035 END DO 5036 END DO 5037 5038 DO l = 2, nlay 5039 DO ig = 1, ngrid 5040 IF (l<=lmaxa(ig)) THEN 5041 ! if (idetr.EQ.0) THEN 5042 ! cette option est finalement en dur. 5043 IF ((l_mix*zlev(ig,l))<0.) THEN 5044 ! PRINT*,'pb l_mix*zlev<0' 5045 END IF 5046 ! CR: test: nouvelle def de lambda 5047 ! larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l)) 5048 IF (zw2(ig,l)>1.E-10) THEN 5049 larg_detr(ig, l) = sqrt((l_mix/zw2(ig,l))*zlev(ig,l)) 5050 ELSE 5051 larg_detr(ig, l) = sqrt(l_mix*zlev(ig,l)) 5052 END IF 5053 ! RC 5054 ! ELSE IF (idetr.EQ.1) THEN 5055 ! larg_detr(ig,l)=larg_cons(ig,l) 5056 ! s *sqrt(l_mix*zlev(ig,l))/larg_cons(ig,lmix(ig)) 5057 ! ELSE IF (idetr.EQ.2) THEN 5058 ! larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l)) 5059 ! s *sqrt(wa_moy(ig,l)) 5060 ! ELSE IF (idetr.EQ.4) THEN 5061 ! larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l)) 5062 ! s *wa_moy(ig,l) 4958 ! if (first) THEN 4959 ! f(ig)=f(ig)+(f0(ig)-f(ig))*exp(-ptimestep/zmax(ig) 4960 ! s *wmax(ig)) 5063 4961 ! END IF 5064 4962 END IF 5065 END DO 5066 END DO 5067 5068 ! PRINT*,'10 OK convect8' 5069 ! PRINT*,'WA2 ',wa_moy 5070 ! calcul de la fraction de la maille concernée par l'ascendance en tenant 5071 ! compte de l'epluchage du thermique. 5072 5073 ! CR def de zmix continu (profil parabolique des vitesses) 5074 DO ig = 1, ngrid 5075 IF (lmix(ig)>1.) THEN 4963 ! f0(ig)=f(ig) 4964 ! first=.TRUE. 4965 END DO 4966 ! PRINT*,'apres fermeture' 4967 4968 ! Calcul de l'entrainement 4969 DO k = 1, klev 4970 DO ig = 1, ngrid 4971 entr(ig, k) = f(ig) * entr_star(ig, k) 4972 END DO 4973 END DO 4974 ! CR:test pour entrainer moins que la masse 4975 DO ig = 1, ngrid 4976 DO l = 1, lentr(ig) 4977 IF ((entr(ig, l) * ptimestep)>(0.9 * masse(ig, l))) THEN 4978 entr(ig, l + 1) = entr(ig, l + 1) + entr(ig, l) - & 4979 0.9 * masse(ig, l) / ptimestep 4980 entr(ig, l) = 0.9 * masse(ig, l) / ptimestep 4981 END IF 4982 END DO 4983 END DO 4984 ! CR: fin test 4985 ! Calcul des flux 4986 DO ig = 1, ngrid 4987 DO l = 1, lmax(ig) - 1 4988 fmc(ig, l + 1) = fmc(ig, l) + entr(ig, l) 4989 END DO 4990 END DO 4991 4992 ! RC 4993 4994 4995 ! PRINT*,'9 OK convect8' 4996 ! PRINT*,'WA1 ',wa_moy 4997 4998 ! determination de l'indice du debut de la mixed layer ou w decroit 4999 5000 ! calcul de la largeur de chaque ascendance dans le cas conservatif. 5001 ! dans ce cas simple, on suppose que la largeur de l'ascendance provenant 5002 ! d'une couche est égale à la hauteur de la couche alimentante. 5003 ! La vitesse maximale dans l'ascendance est aussi prise comme estimation 5004 ! de la vitesse d'entrainement horizontal dans la couche alimentante. 5005 5006 DO l = 2, nlay 5007 DO ig = 1, ngrid 5008 IF (l<=lmaxa(ig)) THEN 5009 zw = max(wa_moy(ig, l), 1.E-10) 5010 larg_cons(ig, l) = zmax(ig) * r_aspect * fmc(ig, l) / (rhobarz(ig, l) * zw) 5011 END IF 5012 END DO 5013 END DO 5014 5015 DO l = 2, nlay 5016 DO ig = 1, ngrid 5017 IF (l<=lmaxa(ig)) THEN 5018 ! if (idetr.EQ.0) THEN 5019 ! cette option est finalement en dur. 5020 IF ((l_mix * zlev(ig, l))<0.) THEN 5021 ! PRINT*,'pb l_mix*zlev<0' 5022 END IF 5023 ! CR: test: nouvelle def de lambda 5024 ! larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l)) 5025 IF (zw2(ig, l)>1.E-10) THEN 5026 larg_detr(ig, l) = sqrt((l_mix / zw2(ig, l)) * zlev(ig, l)) 5027 ELSE 5028 larg_detr(ig, l) = sqrt(l_mix * zlev(ig, l)) 5029 END IF 5030 ! RC 5031 ! ELSE IF (idetr.EQ.1) THEN 5032 ! larg_detr(ig,l)=larg_cons(ig,l) 5033 ! s *sqrt(l_mix*zlev(ig,l))/larg_cons(ig,lmix(ig)) 5034 ! ELSE IF (idetr.EQ.2) THEN 5035 ! larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l)) 5036 ! s *sqrt(wa_moy(ig,l)) 5037 ! ELSE IF (idetr.EQ.4) THEN 5038 ! larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l)) 5039 ! s *wa_moy(ig,l) 5040 ! END IF 5041 END IF 5042 END DO 5043 END DO 5044 5045 ! PRINT*,'10 OK convect8' 5046 ! PRINT*,'WA2 ',wa_moy 5047 ! calcul de la fraction de la maille concernée par l'ascendance en tenant 5048 ! compte de l'epluchage du thermique. 5049 5050 ! CR def de zmix continu (profil parabolique des vitesses) 5051 DO ig = 1, ngrid 5052 IF (lmix(ig)>1.) THEN 5053 ! test 5054 IF (((zw2(ig, lmix(ig) - 1) - zw2(ig, lmix(ig))) * ((zlev(ig, lmix(ig))) - & 5055 (zlev(ig, lmix(ig) + 1))) - (zw2(ig, lmix(ig)) - & 5056 zw2(ig, lmix(ig) + 1)) * ((zlev(ig, lmix(ig) - 1)) - & 5057 (zlev(ig, lmix(ig)))))>1E-10) THEN 5058 5059 zmix(ig) = ((zw2(ig, lmix(ig) - 1) - zw2(ig, lmix(ig))) * ((zlev(ig, lmix(ig)) & 5060 )**2 - (zlev(ig, lmix(ig) + 1))**2) - (zw2(ig, lmix(ig)) - zw2(ig, & 5061 lmix(ig) + 1)) * ((zlev(ig, lmix(ig) - 1))**2 - (zlev(ig, lmix(ig)))**2)) / & 5062 (2. * ((zw2(ig, lmix(ig) - 1) - zw2(ig, lmix(ig))) * ((zlev(ig, lmix(ig))) - & 5063 (zlev(ig, lmix(ig) + 1))) - (zw2(ig, lmix(ig)) - & 5064 zw2(ig, lmix(ig) + 1)) * ((zlev(ig, lmix(ig) - 1)) - (zlev(ig, lmix(ig)))))) 5065 ELSE 5066 zmix(ig) = zlev(ig, lmix(ig)) 5067 ! PRINT*,'pb zmix' 5068 END IF 5069 ELSE 5070 zmix(ig) = 0. 5071 END IF 5076 5072 ! test 5077 IF (((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig)))*((zlev(ig,lmix(ig)))- & 5078 (zlev(ig,lmix(ig)+1)))-(zw2(ig,lmix(ig))- & 5079 zw2(ig,lmix(ig)+1))*((zlev(ig,lmix(ig)-1))- & 5080 (zlev(ig,lmix(ig)))))>1E-10) THEN 5081 5082 zmix(ig) = ((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig)))*((zlev(ig,lmix(ig)) & 5083 )**2-(zlev(ig,lmix(ig)+1))**2)-(zw2(ig,lmix(ig))-zw2(ig, & 5084 lmix(ig)+1))*((zlev(ig,lmix(ig)-1))**2-(zlev(ig,lmix(ig)))**2))/ & 5085 (2.*((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig)))*((zlev(ig,lmix(ig)))- & 5086 (zlev(ig,lmix(ig)+1)))-(zw2(ig,lmix(ig))- & 5087 zw2(ig,lmix(ig)+1))*((zlev(ig,lmix(ig)-1))-(zlev(ig,lmix(ig)))))) 5088 ELSE 5089 zmix(ig) = zlev(ig, lmix(ig)) 5090 ! PRINT*,'pb zmix' 5073 IF ((zmax(ig) - zmix(ig))<0.) THEN 5074 zmix(ig) = 0.99 * zmax(ig) 5075 ! PRINT*,'pb zmix>zmax' 5091 5076 END IF 5077 END DO 5078 5079 ! calcul du nouveau lmix correspondant 5080 DO ig = 1, ngrid 5081 DO l = 1, klev 5082 IF (zmix(ig)>=zlev(ig, l) .AND. zmix(ig)<zlev(ig, l + 1)) THEN 5083 lmix(ig) = l 5084 END IF 5085 END DO 5086 END DO 5087 5088 DO l = 2, nlay 5089 DO ig = 1, ngrid 5090 IF (larg_cons(ig, l)>1.) THEN 5091 ! PRINT*,ig,l,lmix(ig),lmaxa(ig),larg_cons(ig,l),' KKK' 5092 fraca(ig, l) = (larg_cons(ig, l) - larg_detr(ig, l)) / (r_aspect * zmax(ig)) 5093 ! test 5094 fraca(ig, l) = max(fraca(ig, l), 0.) 5095 fraca(ig, l) = min(fraca(ig, l), 0.5) 5096 fracd(ig, l) = 1. - fraca(ig, l) 5097 fracc(ig, l) = larg_cons(ig, l) / (r_aspect * zmax(ig)) 5098 ELSE 5099 ! wa_moy(ig,l)=0. 5100 fraca(ig, l) = 0. 5101 fracc(ig, l) = 0. 5102 fracd(ig, l) = 1. 5103 END IF 5104 END DO 5105 END DO 5106 ! CR: calcul de fracazmix 5107 DO ig = 1, ngrid 5108 fracazmix(ig) = (fraca(ig, lmix(ig) + 1) - fraca(ig, lmix(ig))) / & 5109 (zlev(ig, lmix(ig) + 1) - zlev(ig, lmix(ig))) * zmix(ig) + & 5110 fraca(ig, lmix(ig)) - zlev(ig, lmix(ig)) * (fraca(ig, lmix(ig) + 1) - fraca(ig & 5111 , lmix(ig))) / (zlev(ig, lmix(ig) + 1) - zlev(ig, lmix(ig))) 5112 END DO 5113 5114 DO l = 2, nlay 5115 DO ig = 1, ngrid 5116 IF (larg_cons(ig, l)>1.) THEN 5117 IF (l>lmix(ig)) THEN 5118 ! test 5119 IF (zmax(ig) - zmix(ig)<1.E-10) THEN 5120 ! PRINT*,'pb xxx' 5121 xxx(ig, l) = (lmaxa(ig) + 1. - l) / (lmaxa(ig) + 1. - lmix(ig)) 5122 ELSE 5123 xxx(ig, l) = (zmax(ig) - zlev(ig, l)) / (zmax(ig) - zmix(ig)) 5124 END IF 5125 IF (idetr==0) THEN 5126 fraca(ig, l) = fracazmix(ig) 5127 ELSE IF (idetr==1) THEN 5128 fraca(ig, l) = fracazmix(ig) * xxx(ig, l) 5129 ELSE IF (idetr==2) THEN 5130 fraca(ig, l) = fracazmix(ig) * (1. - (1. - xxx(ig, l))**2) 5131 ELSE 5132 fraca(ig, l) = fracazmix(ig) * xxx(ig, l)**2 5133 END IF 5134 ! PRINT*,ig,l,lmix(ig),lmaxa(ig),xxx(ig,l),'LLLLLLL' 5135 fraca(ig, l) = max(fraca(ig, l), 0.) 5136 fraca(ig, l) = min(fraca(ig, l), 0.5) 5137 fracd(ig, l) = 1. - fraca(ig, l) 5138 fracc(ig, l) = larg_cons(ig, l) / (r_aspect * zmax(ig)) 5139 END IF 5140 END IF 5141 END DO 5142 END DO 5143 5144 ! PRINT*,'fin calcul fraca' 5145 ! PRINT*,'11 OK convect8' 5146 ! PRINT*,'Ea3 ',wa_moy 5147 ! ------------------------------------------------------------------ 5148 ! Calcul de fracd, wd 5149 ! somme wa - wd = 0 5150 ! ------------------------------------------------------------------ 5151 5152 DO ig = 1, ngrid 5153 fm(ig, 1) = 0. 5154 fm(ig, nlay + 1) = 0. 5155 END DO 5156 5157 DO l = 2, nlay 5158 DO ig = 1, ngrid 5159 fm(ig, l) = fraca(ig, l) * wa_moy(ig, l) * rhobarz(ig, l) 5160 ! CR:test 5161 IF (entr(ig, l - 1)<1E-10 .AND. fm(ig, l)>fm(ig, l - 1) .AND. l>lmix(ig)) THEN 5162 fm(ig, l) = fm(ig, l - 1) 5163 ! WRITE(1,*)'ajustement fm, l',l 5164 END IF 5165 ! WRITE(1,*)'ig,l,fm(ig,l)',ig,l,fm(ig,l) 5166 ! RC 5167 END DO 5168 DO ig = 1, ngrid 5169 IF (fracd(ig, l)<0.1) THEN 5170 abort_message = 'fracd trop petit' 5171 CALL abort_physic(modname, abort_message, 1) 5172 ELSE 5173 ! vitesse descendante "diagnostique" 5174 wd(ig, l) = fm(ig, l) / (fracd(ig, l) * rhobarz(ig, l)) 5175 END IF 5176 END DO 5177 END DO 5178 5179 DO l = 1, nlay 5180 DO ig = 1, ngrid 5181 ! masse(ig,l)=rho(ig,l)*(zlev(ig,l+1)-zlev(ig,l)) 5182 masse(ig, l) = (pplev(ig, l) - pplev(ig, l + 1)) / rg 5183 END DO 5184 END DO 5185 5186 ! PRINT*,'12 OK convect8' 5187 ! PRINT*,'WA4 ',wa_moy 5188 ! c------------------------------------------------------------------ 5189 ! calcul du transport vertical 5190 ! ------------------------------------------------------------------ 5191 5192 GO TO 4444 5193 ! PRINT*,'XXXXXXXXXXXXXXX ptimestep= ',ptimestep 5194 DO l = 2, nlay - 1 5195 DO ig = 1, ngrid 5196 IF (fm(ig, l + 1) * ptimestep>masse(ig, l) .AND. fm(ig, l + 1) * ptimestep>masse(& 5197 ig, l + 1)) THEN 5198 ! PRINT*,'WARN!!! FM>M ig=',ig,' l=',l,' FM=' 5199 ! s ,fm(ig,l+1)*ptimestep 5200 ! s ,' M=',masse(ig,l),masse(ig,l+1) 5201 END IF 5202 END DO 5203 END DO 5204 5205 DO l = 1, nlay 5206 DO ig = 1, ngrid 5207 IF (entr(ig, l) * ptimestep>masse(ig, l)) THEN 5208 ! PRINT*,'WARN!!! E>M ig=',ig,' l=',l,' E==' 5209 ! s ,entr(ig,l)*ptimestep 5210 ! s ,' M=',masse(ig,l) 5211 END IF 5212 END DO 5213 END DO 5214 5215 DO l = 1, nlay 5216 DO ig = 1, ngrid 5217 IF (.NOT. fm(ig, l)>=0. .OR. .NOT. fm(ig, l)<=10.) THEN 5218 ! PRINT*,'WARN!!! fm exagere ig=',ig,' l=',l 5219 ! s ,' FM=',fm(ig,l) 5220 END IF 5221 IF (.NOT. masse(ig, l)>=1.E-10 .OR. .NOT. masse(ig, l)<=1.E4) THEN 5222 ! PRINT*,'WARN!!! masse exagere ig=',ig,' l=',l 5223 ! s ,' M=',masse(ig,l) 5224 ! PRINT*,'rho(ig,l),pplay(ig,l),zpspsk(ig,l),RD,zh(ig,l)', 5225 ! s rho(ig,l),pplay(ig,l),zpspsk(ig,l),RD,zh(ig,l) 5226 ! PRINT*,'zlev(ig,l+1),zlev(ig,l)' 5227 ! s ,zlev(ig,l+1),zlev(ig,l) 5228 ! PRINT*,'pphi(ig,l-1),pphi(ig,l),pphi(ig,l+1)' 5229 ! s ,pphi(ig,l-1),pphi(ig,l),pphi(ig,l+1) 5230 END IF 5231 IF (.NOT. entr(ig, l)>=0. .OR. .NOT. entr(ig, l)<=10.) THEN 5232 ! PRINT*,'WARN!!! entr exagere ig=',ig,' l=',l 5233 ! s ,' E=',entr(ig,l) 5234 END IF 5235 END DO 5236 END DO 5237 5238 4444 CONTINUE 5239 5240 ! CR:redefinition du entr 5241 DO l = 1, nlay 5242 DO ig = 1, ngrid 5243 detr(ig, l) = fm(ig, l) + entr(ig, l) - fm(ig, l + 1) 5244 IF (detr(ig, l)<0.) THEN 5245 entr(ig, l) = entr(ig, l) - detr(ig, l) 5246 detr(ig, l) = 0. 5247 ! PRINT*,'WARNING !!! detrainement negatif ',ig,l 5248 END IF 5249 END DO 5250 END DO 5251 ! RC 5252 IF (w2di==1) THEN 5253 fm0 = fm0 + ptimestep * (fm - fm0) / tho 5254 entr0 = entr0 + ptimestep * (entr - entr0) / tho 5092 5255 ELSE 5093 zmix(ig) = 0. 5256 fm0 = fm 5257 entr0 = entr 5094 5258 END IF 5095 ! test 5096 IF ((zmax(ig)-zmix(ig))<0.) THEN 5097 zmix(ig) = 0.99*zmax(ig) 5098 ! PRINT*,'pb zmix>zmax' 5259 5260 IF (1==1) THEN 5261 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zh, zdhadj, & 5262 zha) 5263 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zo, pdoadj, & 5264 zoa) 5265 ELSE 5266 CALL dqthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca, zh, & 5267 zdhadj, zha) 5268 CALL dqthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca, zo, & 5269 pdoadj, zoa) 5099 5270 END IF 5100 END DO 5101 5102 ! calcul du nouveau lmix correspondant 5103 DO ig = 1, ngrid 5104 DO l = 1, klev 5105 IF (zmix(ig)>=zlev(ig,l) .AND. zmix(ig)<zlev(ig,l+1)) THEN 5106 lmix(ig) = l 5107 END IF 5108 END DO 5109 END DO 5110 5111 DO l = 2, nlay 5112 DO ig = 1, ngrid 5113 IF (larg_cons(ig,l)>1.) THEN 5114 ! PRINT*,ig,l,lmix(ig),lmaxa(ig),larg_cons(ig,l),' KKK' 5115 fraca(ig, l) = (larg_cons(ig,l)-larg_detr(ig,l))/(r_aspect*zmax(ig)) 5116 ! test 5117 fraca(ig, l) = max(fraca(ig,l), 0.) 5118 fraca(ig, l) = min(fraca(ig,l), 0.5) 5119 fracd(ig, l) = 1. - fraca(ig, l) 5120 fracc(ig, l) = larg_cons(ig, l)/(r_aspect*zmax(ig)) 5121 ELSE 5122 ! wa_moy(ig,l)=0. 5123 fraca(ig, l) = 0. 5124 fracc(ig, l) = 0. 5125 fracd(ig, l) = 1. 5126 END IF 5127 END DO 5128 END DO 5129 ! CR: calcul de fracazmix 5130 DO ig = 1, ngrid 5131 fracazmix(ig) = (fraca(ig,lmix(ig)+1)-fraca(ig,lmix(ig)))/ & 5132 (zlev(ig,lmix(ig)+1)-zlev(ig,lmix(ig)))*zmix(ig) + & 5133 fraca(ig, lmix(ig)) - zlev(ig, lmix(ig))*(fraca(ig,lmix(ig)+1)-fraca(ig & 5134 ,lmix(ig)))/(zlev(ig,lmix(ig)+1)-zlev(ig,lmix(ig))) 5135 END DO 5136 5137 DO l = 2, nlay 5138 DO ig = 1, ngrid 5139 IF (larg_cons(ig,l)>1.) THEN 5140 IF (l>lmix(ig)) THEN 5141 ! test 5142 IF (zmax(ig)-zmix(ig)<1.E-10) THEN 5143 ! PRINT*,'pb xxx' 5144 xxx(ig, l) = (lmaxa(ig)+1.-l)/(lmaxa(ig)+1.-lmix(ig)) 5145 ELSE 5146 xxx(ig, l) = (zmax(ig)-zlev(ig,l))/(zmax(ig)-zmix(ig)) 5147 END IF 5148 IF (idetr==0) THEN 5149 fraca(ig, l) = fracazmix(ig) 5150 ELSE IF (idetr==1) THEN 5151 fraca(ig, l) = fracazmix(ig)*xxx(ig, l) 5152 ELSE IF (idetr==2) THEN 5153 fraca(ig, l) = fracazmix(ig)*(1.-(1.-xxx(ig,l))**2) 5154 ELSE 5155 fraca(ig, l) = fracazmix(ig)*xxx(ig, l)**2 5156 END IF 5157 ! PRINT*,ig,l,lmix(ig),lmaxa(ig),xxx(ig,l),'LLLLLLL' 5158 fraca(ig, l) = max(fraca(ig,l), 0.) 5159 fraca(ig, l) = min(fraca(ig,l), 0.5) 5160 fracd(ig, l) = 1. - fraca(ig, l) 5161 fracc(ig, l) = larg_cons(ig, l)/(r_aspect*zmax(ig)) 5162 END IF 5163 END IF 5164 END DO 5165 END DO 5166 5167 ! PRINT*,'fin calcul fraca' 5168 ! PRINT*,'11 OK convect8' 5169 ! PRINT*,'Ea3 ',wa_moy 5170 ! ------------------------------------------------------------------ 5171 ! Calcul de fracd, wd 5172 ! somme wa - wd = 0 5173 ! ------------------------------------------------------------------ 5174 5175 5176 DO ig = 1, ngrid 5177 fm(ig, 1) = 0. 5178 fm(ig, nlay+1) = 0. 5179 END DO 5180 5181 DO l = 2, nlay 5182 DO ig = 1, ngrid 5183 fm(ig, l) = fraca(ig, l)*wa_moy(ig, l)*rhobarz(ig, l) 5184 ! CR:test 5185 IF (entr(ig,l-1)<1E-10 .AND. fm(ig,l)>fm(ig,l-1) .AND. l>lmix(ig)) THEN 5186 fm(ig, l) = fm(ig, l-1) 5187 ! WRITE(1,*)'ajustement fm, l',l 5188 END IF 5189 ! WRITE(1,*)'ig,l,fm(ig,l)',ig,l,fm(ig,l) 5190 ! RC 5191 END DO 5192 DO ig = 1, ngrid 5193 IF (fracd(ig,l)<0.1) THEN 5194 abort_message = 'fracd trop petit' 5195 CALL abort_physic(modname, abort_message, 1) 5196 ELSE 5197 ! vitesse descendante "diagnostique" 5198 wd(ig, l) = fm(ig, l)/(fracd(ig,l)*rhobarz(ig,l)) 5199 END IF 5200 END DO 5201 END DO 5202 5203 DO l = 1, nlay 5204 DO ig = 1, ngrid 5205 ! masse(ig,l)=rho(ig,l)*(zlev(ig,l+1)-zlev(ig,l)) 5206 masse(ig, l) = (pplev(ig,l)-pplev(ig,l+1))/rg 5207 END DO 5208 END DO 5209 5210 ! PRINT*,'12 OK convect8' 5211 ! PRINT*,'WA4 ',wa_moy 5212 ! c------------------------------------------------------------------ 5213 ! calcul du transport vertical 5214 ! ------------------------------------------------------------------ 5215 5216 GO TO 4444 5217 ! PRINT*,'XXXXXXXXXXXXXXX ptimestep= ',ptimestep 5218 DO l = 2, nlay - 1 5219 DO ig = 1, ngrid 5220 IF (fm(ig,l+1)*ptimestep>masse(ig,l) .AND. fm(ig,l+1)*ptimestep>masse( & 5221 ig,l+1)) THEN 5222 ! PRINT*,'WARN!!! FM>M ig=',ig,' l=',l,' FM=' 5223 ! s ,fm(ig,l+1)*ptimestep 5224 ! s ,' M=',masse(ig,l),masse(ig,l+1) 5225 END IF 5226 END DO 5227 END DO 5228 5229 DO l = 1, nlay 5230 DO ig = 1, ngrid 5231 IF (entr(ig,l)*ptimestep>masse(ig,l)) THEN 5232 ! PRINT*,'WARN!!! E>M ig=',ig,' l=',l,' E==' 5233 ! s ,entr(ig,l)*ptimestep 5234 ! s ,' M=',masse(ig,l) 5235 END IF 5236 END DO 5237 END DO 5238 5239 DO l = 1, nlay 5240 DO ig = 1, ngrid 5241 IF (.NOT. fm(ig,l)>=0. .OR. .NOT. fm(ig,l)<=10.) THEN 5242 ! PRINT*,'WARN!!! fm exagere ig=',ig,' l=',l 5243 ! s ,' FM=',fm(ig,l) 5244 END IF 5245 IF (.NOT. masse(ig,l)>=1.E-10 .OR. .NOT. masse(ig,l)<=1.E4) THEN 5246 ! PRINT*,'WARN!!! masse exagere ig=',ig,' l=',l 5247 ! s ,' M=',masse(ig,l) 5248 ! PRINT*,'rho(ig,l),pplay(ig,l),zpspsk(ig,l),RD,zh(ig,l)', 5249 ! s rho(ig,l),pplay(ig,l),zpspsk(ig,l),RD,zh(ig,l) 5250 ! PRINT*,'zlev(ig,l+1),zlev(ig,l)' 5251 ! s ,zlev(ig,l+1),zlev(ig,l) 5252 ! PRINT*,'pphi(ig,l-1),pphi(ig,l),pphi(ig,l+1)' 5253 ! s ,pphi(ig,l-1),pphi(ig,l),pphi(ig,l+1) 5254 END IF 5255 IF (.NOT. entr(ig,l)>=0. .OR. .NOT. entr(ig,l)<=10.) THEN 5256 ! PRINT*,'WARN!!! entr exagere ig=',ig,' l=',l 5257 ! s ,' E=',entr(ig,l) 5258 END IF 5259 END DO 5260 END DO 5261 5262 4444 CONTINUE 5263 5264 ! CR:redefinition du entr 5265 DO l = 1, nlay 5266 DO ig = 1, ngrid 5267 detr(ig, l) = fm(ig, l) + entr(ig, l) - fm(ig, l+1) 5268 IF (detr(ig,l)<0.) THEN 5269 entr(ig, l) = entr(ig, l) - detr(ig, l) 5270 detr(ig, l) = 0. 5271 ! PRINT*,'WARNING !!! detrainement negatif ',ig,l 5272 END IF 5273 END DO 5274 END DO 5275 ! RC 5276 IF (w2di==1) THEN 5277 fm0 = fm0 + ptimestep*(fm-fm0)/tho 5278 entr0 = entr0 + ptimestep*(entr-entr0)/tho 5279 ELSE 5280 fm0 = fm 5281 entr0 = entr 5282 END IF 5283 5284 IF (1==1) THEN 5285 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zh, zdhadj, & 5286 zha) 5287 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zo, pdoadj, & 5288 zoa) 5289 ELSE 5290 CALL dqthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca, zh, & 5291 zdhadj, zha) 5292 CALL dqthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca, zo, & 5293 pdoadj, zoa) 5294 END IF 5295 5296 IF (1==0) THEN 5297 CALL dvthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca, zmax, & 5298 zu, zv, pduadj, pdvadj, zua, zva) 5299 ELSE 5300 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zu, pduadj, & 5301 zua) 5302 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zv, pdvadj, & 5303 zva) 5304 END IF 5305 5306 DO l = 1, nlay 5307 DO ig = 1, ngrid 5308 zf = 0.5*(fracc(ig,l)+fracc(ig,l+1)) 5309 zf2 = zf/(1.-zf) 5310 thetath2(ig, l) = zf2*(zha(ig,l)-zh(ig,l))**2 5311 wth2(ig, l) = zf2*(0.5*(wa_moy(ig,l)+wa_moy(ig,l+1)))**2 5312 END DO 5313 END DO 5314 5315 5316 5317 ! PRINT*,'13 OK convect8' 5318 ! PRINT*,'WA5 ',wa_moy 5319 DO l = 1, nlay 5320 DO ig = 1, ngrid 5321 pdtadj(ig, l) = zdhadj(ig, l)*zpspsk(ig, l) 5322 END DO 5323 END DO 5324 5325 5326 ! do l=1,nlay 5327 ! do ig=1,ngrid 5328 ! IF(abs(pdtadj(ig,l))*86400..gt.500.) THEN 5329 ! PRINT*,'WARN!!! ig=',ig,' l=',l 5330 ! s ,' pdtadj=',pdtadj(ig,l) 5331 ! END IF 5332 ! IF(abs(pdoadj(ig,l))*86400..gt.1.) THEN 5333 ! PRINT*,'WARN!!! ig=',ig,' l=',l 5334 ! s ,' pdoadj=',pdoadj(ig,l) 5335 ! END IF 5336 ! enddo 5337 ! enddo 5338 5339 ! PRINT*,'14 OK convect8' 5340 ! ------------------------------------------------------------------ 5341 ! Calculs pour les sorties 5342 ! ------------------------------------------------------------------ 5343 5344 5345 END SUBROUTINE thermcell_sec 5346 5347 SUBROUTINE calcul_sec(ngrid, nlay, ptimestep, pplay, pplev, pphi, zlev, pu, & 5348 pv, pt, po, zmax, wmax, zw2, lmix & ! s 5349 ! ,pu_therm,pv_therm 5350 , r_aspect, l_mix, w2di, tho) 5351 5352 USE dimphy 5353 IMPLICIT NONE 5354 5355 ! ======================================================================= 5356 5357 ! Calcul du transport verticale dans la couche limite en presence 5358 ! de "thermiques" explicitement representes 5359 5360 ! Réécriture à partir d'un listing papier à Habas, le 14/02/00 5361 5362 ! le thermique est supposé homogène et dissipé par mélange avec 5363 ! son environnement. la longueur l_mix contrôle l'efficacité du 5364 ! mélange 5365 5366 ! Le calcul du transport des différentes espèces se fait en prenant 5367 ! en compte: 5368 ! 1. un flux de masse montant 5369 ! 2. un flux de masse descendant 5370 ! 3. un entrainement 5371 ! 4. un detrainement 5372 5373 ! ======================================================================= 5374 5375 ! ----------------------------------------------------------------------- 5376 ! declarations: 5377 ! ------------- 5378 5379 include "YOMCST.h" 5380 5381 ! arguments: 5382 ! ---------- 5383 5384 INTEGER ngrid, nlay, w2di 5385 REAL tho 5386 REAL ptimestep, l_mix, r_aspect 5387 REAL pt(ngrid, nlay), pdtadj(ngrid, nlay) 5388 REAL pu(ngrid, nlay), pduadj(ngrid, nlay) 5389 REAL pv(ngrid, nlay), pdvadj(ngrid, nlay) 5390 REAL po(ngrid, nlay), pdoadj(ngrid, nlay) 5391 REAL pplay(ngrid, nlay), pplev(ngrid, nlay+1) 5392 REAL pphi(ngrid, nlay) 5393 5394 INTEGER idetr 5395 SAVE idetr 5396 DATA idetr/3/ 5397 !$OMP THREADPRIVATE(idetr) 5398 ! local: 5399 ! ------ 5400 5401 INTEGER ig, k, l, lmaxa(klon), lmix(klon) 5402 REAL zsortie1d(klon) 5403 ! CR: on remplace lmax(klon,klev+1) 5404 INTEGER lmax(klon), lmin(klon), lentr(klon) 5405 REAL linter(klon) 5406 REAL zmix(klon), fracazmix(klon) 5407 ! RC 5408 REAL zmax(klon), zw, zw2(klon, klev+1), ztva(klon, klev) 5409 5410 REAL zlev(klon, klev+1), zlay(klon, klev) 5411 REAL zh(klon, klev), zdhadj(klon, klev) 5412 REAL ztv(klon, klev) 5413 REAL zu(klon, klev), zv(klon, klev), zo(klon, klev) 5414 REAL wh(klon, klev+1) 5415 REAL wu(klon, klev+1), wv(klon, klev+1), wo(klon, klev+1) 5416 REAL zla(klon, klev+1) 5417 REAL zwa(klon, klev+1) 5418 REAL zld(klon, klev+1) 5419 ! real zwd(klon,klev+1) 5420 REAL zsortie(klon, klev) 5421 REAL zva(klon, klev) 5422 REAL zua(klon, klev) 5423 REAL zoa(klon, klev) 5424 5425 REAL zha(klon, klev) 5426 REAL wa_moy(klon, klev+1) 5427 REAL fraca(klon, klev+1) 5428 REAL fracc(klon, klev+1) 5429 REAL zf, zf2 5430 REAL thetath2(klon, klev), wth2(klon, klev) 5431 ! common/comtherm/thetath2,wth2 5432 5433 REAL count_time 5434 ! integer isplit,nsplit 5435 INTEGER isplit, nsplit, ialt 5436 PARAMETER (nsplit=10) 5437 DATA isplit/0/ 5438 SAVE isplit 5439 !$OMP THREADPRIVATE(isplit) 5440 5441 LOGICAL sorties 5442 REAL rho(klon, klev), rhobarz(klon, klev+1), masse(klon, klev) 5443 REAL zpspsk(klon, klev) 5444 5445 ! real wmax(klon,klev),wmaxa(klon) 5446 REAL wmax(klon), wmaxa(klon) 5447 REAL wa(klon, klev, klev+1) 5448 REAL wd(klon, klev+1) 5449 REAL larg_part(klon, klev, klev+1) 5450 REAL fracd(klon, klev+1) 5451 REAL xxx(klon, klev+1) 5452 REAL larg_cons(klon, klev+1) 5453 REAL larg_detr(klon, klev+1) 5454 REAL fm0(klon, klev+1), entr0(klon, klev), detr(klon, klev) 5455 REAL pu_therm(klon, klev), pv_therm(klon, klev) 5456 REAL fm(klon, klev+1), entr(klon, klev) 5457 REAL fmc(klon, klev+1) 5458 5459 ! CR:nouvelles variables 5460 REAL f_star(klon, klev+1), entr_star(klon, klev) 5461 REAL entr_star_tot(klon), entr_star2(klon) 5462 REAL zalim(klon) 5463 INTEGER lalim(klon) 5464 REAL norme(klon) 5465 REAL f(klon), f0(klon) 5466 REAL zlevinter(klon) 5467 LOGICAL therm 5468 LOGICAL first 5469 DATA first/.FALSE./ 5470 SAVE first 5471 !$OMP THREADPRIVATE(first) 5472 ! RC 5473 5474 CHARACTER *2 str2 5475 CHARACTER *10 str10 5476 5477 CHARACTER (LEN=20) :: modname = 'calcul_sec' 5478 CHARACTER (LEN=80) :: abort_message 5479 5480 5481 ! LOGICAL vtest(klon),down 5482 5483 EXTERNAL scopy 5484 5485 INTEGER ncorrec 5486 SAVE ncorrec 5487 DATA ncorrec/0/ 5488 !$OMP THREADPRIVATE(ncorrec) 5489 5490 5491 ! ----------------------------------------------------------------------- 5492 ! initialisation: 5493 ! --------------- 5494 5495 sorties = .TRUE. 5496 IF (ngrid/=klon) THEN 5497 PRINT * 5498 PRINT *, 'STOP dans convadj' 5499 PRINT *, 'ngrid =', ngrid 5500 PRINT *, 'klon =', klon 5501 END IF 5502 5503 ! ----------------------------------------------------------------------- 5504 ! incrementation eventuelle de tendances precedentes: 5505 ! --------------------------------------------------- 5506 5507 ! PRINT*,'0 OK convect8' 5508 5509 DO l = 1, nlay 5510 DO ig = 1, ngrid 5511 zpspsk(ig, l) = (pplay(ig,l)/pplev(ig,1))**rkappa 5512 zh(ig, l) = pt(ig, l)/zpspsk(ig, l) 5513 zu(ig, l) = pu(ig, l) 5514 zv(ig, l) = pv(ig, l) 5515 zo(ig, l) = po(ig, l) 5516 ztv(ig, l) = zh(ig, l)*(1.+0.61*zo(ig,l)) 5517 END DO 5518 END DO 5519 5520 ! PRINT*,'1 OK convect8' 5521 ! -------------------- 5522 5523 5524 ! + + + + + + + + + + + 5525 5526 5527 ! wa, fraca, wd, fracd -------------------- zlev(2), rhobarz 5528 ! wh,wt,wo ... 5529 5530 ! + + + + + + + + + + + zh,zu,zv,zo,rho 5531 5532 5533 ! -------------------- zlev(1) 5534 ! \\\\\\\\\\\\\\\\\\\\ 5535 5536 5537 5538 ! ----------------------------------------------------------------------- 5539 ! Calcul des altitudes des couches 5540 ! ----------------------------------------------------------------------- 5541 5542 DO l = 2, nlay 5543 DO ig = 1, ngrid 5544 zlev(ig, l) = 0.5*(pphi(ig,l)+pphi(ig,l-1))/rg 5545 END DO 5546 END DO 5547 DO ig = 1, ngrid 5548 zlev(ig, 1) = 0. 5549 zlev(ig, nlay+1) = (2.*pphi(ig,klev)-pphi(ig,klev-1))/rg 5550 END DO 5551 DO l = 1, nlay 5552 DO ig = 1, ngrid 5553 zlay(ig, l) = pphi(ig, l)/rg 5554 END DO 5555 END DO 5556 5557 ! PRINT*,'2 OK convect8' 5558 ! ----------------------------------------------------------------------- 5559 ! Calcul des densites 5560 ! ----------------------------------------------------------------------- 5561 5562 DO l = 1, nlay 5563 DO ig = 1, ngrid 5564 rho(ig, l) = pplay(ig, l)/(zpspsk(ig,l)*rd*zh(ig,l)) 5565 END DO 5566 END DO 5567 5568 DO l = 2, nlay 5569 DO ig = 1, ngrid 5570 rhobarz(ig, l) = 0.5*(rho(ig,l)+rho(ig,l-1)) 5571 END DO 5572 END DO 5573 5574 DO k = 1, nlay 5575 DO l = 1, nlay + 1 5576 DO ig = 1, ngrid 5577 wa(ig, k, l) = 0. 5578 END DO 5579 END DO 5580 END DO 5581 5582 ! PRINT*,'3 OK convect8' 5583 ! ------------------------------------------------------------------ 5584 ! Calcul de w2, quarre de w a partir de la cape 5585 ! a partir de w2, on calcule wa, vitesse de l'ascendance 5586 5587 ! ATTENTION: Dans cette version, pour cause d'economie de memoire, 5588 ! w2 est stoke dans wa 5589 5590 ! ATTENTION: dans convect8, on n'utilise le calcule des wa 5591 ! independants par couches que pour calculer l'entrainement 5592 ! a la base et la hauteur max de l'ascendance. 5593 5594 ! Indicages: 5595 ! l'ascendance provenant du niveau k traverse l'interface l avec 5596 ! une vitesse wa(k,l). 5597 5598 ! -------------------- 5599 5600 ! + + + + + + + + + + 5601 5602 ! wa(k,l) ---- -------------------- l 5603 ! /\ 5604 ! /||\ + + + + + + + + + + 5605 ! || 5606 ! || -------------------- 5607 ! || 5608 ! || + + + + + + + + + + 5609 ! || 5610 ! || -------------------- 5611 ! ||__ 5612 ! |___ + + + + + + + + + + k 5613 5614 ! -------------------- 5615 5616 5617 5618 ! ------------------------------------------------------------------ 5619 5620 ! CR: ponderation entrainement des couches instables 5621 ! def des entr_star tels que entr=f*entr_star 5622 DO l = 1, klev 5623 DO ig = 1, ngrid 5624 entr_star(ig, l) = 0. 5625 END DO 5626 END DO 5627 ! determination de la longueur de la couche d entrainement 5628 DO ig = 1, ngrid 5629 lentr(ig) = 1 5630 END DO 5631 5632 ! on ne considere que les premieres couches instables 5633 therm = .FALSE. 5634 DO k = nlay - 2, 1, -1 5635 DO ig = 1, ngrid 5636 IF (ztv(ig,k)>ztv(ig,k+1) .AND. ztv(ig,k+1)<=ztv(ig,k+2)) THEN 5637 lentr(ig) = k + 1 5638 therm = .TRUE. 5639 END IF 5640 END DO 5641 END DO 5642 ! limitation de la valeur du lentr 5643 ! do ig=1,ngrid 5644 ! lentr(ig)=min(5,lentr(ig)) 5645 ! enddo 5646 ! determination du lmin: couche d ou provient le thermique 5647 DO ig = 1, ngrid 5648 lmin(ig) = 1 5649 END DO 5650 DO ig = 1, ngrid 5651 DO l = nlay, 2, -1 5652 IF (ztv(ig,l-1)>ztv(ig,l)) THEN 5653 lmin(ig) = l - 1 5654 END IF 5655 END DO 5656 END DO 5657 ! initialisations 5658 DO ig = 1, ngrid 5659 zalim(ig) = 0. 5660 norme(ig) = 0. 5661 lalim(ig) = 1 5662 END DO 5663 DO k = 1, klev - 1 5664 DO ig = 1, ngrid 5665 zalim(ig) = zalim(ig) + zlev(ig, k)*max(0., (ztv(ig,k)-ztv(ig, & 5666 k+1))/(zlev(ig,k+1)-zlev(ig,k))) 5667 ! s *(zlev(ig,k+1)-zlev(ig,k)) 5668 norme(ig) = norme(ig) + max(0., (ztv(ig,k)-ztv(ig,k+1))/(zlev(ig, & 5669 k+1)-zlev(ig,k))) 5670 ! s *(zlev(ig,k+1)-zlev(ig,k)) 5671 END DO 5672 END DO 5673 DO ig = 1, ngrid 5674 IF (norme(ig)>1.E-10) THEN 5675 zalim(ig) = max(10.*zalim(ig)/norme(ig), zlev(ig,2)) 5676 ! zalim(ig)=min(zalim(ig),zlev(ig,lentr(ig))) 5271 5272 IF (1==0) THEN 5273 CALL dvthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca, zmax, & 5274 zu, zv, pduadj, pdvadj, zua, zva) 5275 ELSE 5276 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zu, pduadj, & 5277 zua) 5278 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zv, pdvadj, & 5279 zva) 5677 5280 END IF 5678 END DO 5679 ! détermination du lalim correspondant 5680 DO k = 1, klev - 1 5681 DO ig = 1, ngrid 5682 IF ((zalim(ig)>zlev(ig,k)) .AND. (zalim(ig)<=zlev(ig,k+1))) THEN 5683 lalim(ig) = k 5684 END IF 5685 END DO 5686 END DO 5687 5688 ! definition de l'entrainement des couches 5689 DO l = 1, klev - 1 5690 DO ig = 1, ngrid 5691 IF (ztv(ig,l)>ztv(ig,l+1) .AND. l>=lmin(ig) .AND. l<lentr(ig)) THEN 5692 entr_star(ig, l) = max((ztv(ig,l)-ztv(ig,l+1)), 0.) & ! s 5693 ! *(zlev(ig,l+1)-zlev(ig,l)) 5694 *sqrt(zlev(ig,l+1)) 5695 ! autre def 5696 ! entr_star(ig,l)=zlev(ig,l+1)*(1.-(zlev(ig,l+1) 5697 ! s /zlev(ig,lentr(ig)+2)))**(3./2.) 5698 END IF 5699 END DO 5700 END DO 5701 ! nouveau test 5702 ! if (therm) THEN 5703 DO l = 1, klev - 1 5704 DO ig = 1, ngrid 5705 IF (ztv(ig,l)>ztv(ig,l+1) .AND. l>=lmin(ig) .AND. l<=lalim(ig) .AND. & 5706 zalim(ig)>1.E-10) THEN 5707 ! if (l.le.lentr(ig)) THEN 5708 ! entr_star(ig,l)=zlev(ig,l+1)*(1.-(zlev(ig,l+1) 5709 ! s /zalim(ig)))**(3./2.) 5710 ! WRITE(10,*)zlev(ig,l),entr_star(ig,l) 5711 END IF 5712 END DO 5713 END DO 5714 ! END IF 5715 ! pas de thermique si couche 1 stable 5716 DO ig = 1, ngrid 5717 IF (lmin(ig)>5) THEN 5718 DO l = 1, klev 5719 entr_star(ig, l) = 0. 5720 END DO 5721 END IF 5722 END DO 5723 ! calcul de l entrainement total 5724 DO ig = 1, ngrid 5725 entr_star_tot(ig) = 0. 5726 END DO 5727 DO ig = 1, ngrid 5728 DO k = 1, klev 5729 entr_star_tot(ig) = entr_star_tot(ig) + entr_star(ig, k) 5730 END DO 5731 END DO 5732 ! Calcul entrainement normalise 5733 DO ig = 1, ngrid 5734 IF (entr_star_tot(ig)>1.E-10) THEN 5735 ! do l=1,lentr(ig) 5736 DO l = 1, klev 5737 ! def possibles pour entr_star: zdthetadz, dthetadz, zdtheta 5738 entr_star(ig, l) = entr_star(ig, l)/entr_star_tot(ig) 5739 END DO 5740 END IF 5741 END DO 5742 5743 ! PRINT*,'fin calcul entr_star' 5744 DO k = 1, klev 5745 DO ig = 1, ngrid 5746 ztva(ig, k) = ztv(ig, k) 5747 END DO 5748 END DO 5749 ! RC 5750 ! PRINT*,'7 OK convect8' 5751 DO k = 1, klev + 1 5752 DO ig = 1, ngrid 5753 zw2(ig, k) = 0. 5754 fmc(ig, k) = 0. 5755 ! CR 5756 f_star(ig, k) = 0. 5757 ! RC 5758 larg_cons(ig, k) = 0. 5759 larg_detr(ig, k) = 0. 5760 wa_moy(ig, k) = 0. 5761 END DO 5762 END DO 5763 5764 ! PRINT*,'8 OK convect8' 5765 DO ig = 1, ngrid 5766 linter(ig) = 1. 5767 lmaxa(ig) = 1 5768 lmix(ig) = 1 5769 wmaxa(ig) = 0. 5770 END DO 5771 5772 ! CR: 5773 DO l = 1, nlay - 2 5774 DO ig = 1, ngrid 5775 IF (ztv(ig,l)>ztv(ig,l+1) .AND. entr_star(ig,l)>1.E-10 .AND. & 5776 zw2(ig,l)<1E-10) THEN 5777 f_star(ig, l+1) = entr_star(ig, l) 5778 ! test:calcul de dteta 5779 zw2(ig, l+1) = 2.*rg*(ztv(ig,l)-ztv(ig,l+1))/ztv(ig, l+1)* & 5780 (zlev(ig,l+1)-zlev(ig,l))*0.4*pphi(ig, l)/(pphi(ig,l+1)-pphi(ig,l)) 5781 larg_detr(ig, l) = 0. 5782 ELSE IF ((zw2(ig,l)>=1E-10) .AND. (f_star(ig,l)+entr_star(ig, & 5783 l)>1.E-10)) THEN 5784 f_star(ig, l+1) = f_star(ig, l) + entr_star(ig, l) 5785 ztva(ig, l) = (f_star(ig,l)*ztva(ig,l-1)+entr_star(ig,l)*ztv(ig,l))/ & 5786 f_star(ig, l+1) 5787 zw2(ig, l+1) = zw2(ig, l)*(f_star(ig,l)/f_star(ig,l+1))**2 + & 5788 2.*rg*(ztva(ig,l)-ztv(ig,l))/ztv(ig, l)*(zlev(ig,l+1)-zlev(ig,l)) 5789 END IF 5790 ! determination de zmax continu par interpolation lineaire 5791 IF (zw2(ig,l+1)<0.) THEN 5792 ! test 5793 IF (abs(zw2(ig,l+1)-zw2(ig,l))<1E-10) THEN 5794 ! PRINT*,'pb linter' 5795 END IF 5796 linter(ig) = (l*(zw2(ig,l+1)-zw2(ig,l))-zw2(ig,l))/(zw2(ig,l+1)-zw2( & 5797 ig,l)) 5798 zw2(ig, l+1) = 0. 5799 lmaxa(ig) = l 5800 ELSE 5801 IF (zw2(ig,l+1)<0.) THEN 5802 ! PRINT*,'pb1 zw2<0' 5803 END IF 5804 wa_moy(ig, l+1) = sqrt(zw2(ig,l+1)) 5805 END IF 5806 IF (wa_moy(ig,l+1)>wmaxa(ig)) THEN 5807 ! lmix est le niveau de la couche ou w (wa_moy) est maximum 5808 lmix(ig) = l + 1 5809 wmaxa(ig) = wa_moy(ig, l+1) 5810 END IF 5811 END DO 5812 END DO 5813 ! PRINT*,'fin calcul zw2' 5814 5815 ! Calcul de la couche correspondant a la hauteur du thermique 5816 DO ig = 1, ngrid 5817 lmax(ig) = lentr(ig) 5818 ! lmax(ig)=lalim(ig) 5819 END DO 5820 DO ig = 1, ngrid 5821 DO l = nlay, lentr(ig) + 1, -1 5822 ! do l=nlay,lalim(ig)+1,-1 5823 IF (zw2(ig,l)<=1.E-10) THEN 5824 lmax(ig) = l - 1 5825 END IF 5826 END DO 5827 END DO 5828 ! pas de thermique si couche 1 stable 5829 DO ig = 1, ngrid 5830 IF (lmin(ig)>5) THEN 5831 lmax(ig) = 1 5832 lmin(ig) = 1 5833 lentr(ig) = 1 5834 lalim(ig) = 1 5835 END IF 5836 END DO 5837 5838 ! Determination de zw2 max 5839 DO ig = 1, ngrid 5840 wmax(ig) = 0. 5841 END DO 5842 5843 DO l = 1, nlay 5844 DO ig = 1, ngrid 5845 IF (l<=lmax(ig)) THEN 5846 IF (zw2(ig,l)<0.) THEN 5847 ! PRINT*,'pb2 zw2<0' 5848 END IF 5849 zw2(ig, l) = sqrt(zw2(ig,l)) 5850 wmax(ig) = max(wmax(ig), zw2(ig,l)) 5851 ELSE 5852 zw2(ig, l) = 0. 5853 END IF 5854 END DO 5855 END DO 5856 5857 ! Longueur caracteristique correspondant a la hauteur des thermiques. 5858 DO ig = 1, ngrid 5859 zmax(ig) = 0. 5860 zlevinter(ig) = zlev(ig, 1) 5861 END DO 5862 DO ig = 1, ngrid 5863 ! calcul de zlevinter 5864 zlevinter(ig) = (zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig)))*linter(ig) + & 5865 zlev(ig, lmax(ig)) - lmax(ig)*(zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig))) 5866 zmax(ig) = max(zmax(ig), zlevinter(ig)-zlev(ig,lmin(ig))) 5867 END DO 5868 DO ig = 1, ngrid 5869 ! WRITE(8,*)zmax(ig),lmax(ig),lentr(ig),lmin(ig) 5870 END DO 5871 ! on stope après les calculs de zmax et wmax 5872 RETURN 5873 5874 ! PRINT*,'avant fermeture' 5875 ! Fermeture,determination de f 5876 ! Attention! entrainement normalisé ou pas? 5877 DO ig = 1, ngrid 5878 entr_star2(ig) = 0. 5879 END DO 5880 DO ig = 1, ngrid 5881 IF (entr_star_tot(ig)<1.E-10) THEN 5882 f(ig) = 0. 5883 ELSE 5884 DO k = lmin(ig), lentr(ig) 5885 ! do k=lmin(ig),lalim(ig) 5886 entr_star2(ig) = entr_star2(ig) + entr_star(ig, k)**2/(rho(ig,k)*( & 5887 zlev(ig,k+1)-zlev(ig,k))) 5888 END DO 5889 ! Nouvelle fermeture 5890 f(ig) = wmax(ig)/(max(500.,zmax(ig))*r_aspect*entr_star2(ig)) 5891 ! s *entr_star_tot(ig) 5892 ! test 5893 ! if (first) THEN 5894 f(ig) = f(ig) + (f0(ig)-f(ig))*exp(-ptimestep/zmax(ig)*wmax(ig)) 5895 ! END IF 5896 END IF 5897 f0(ig) = f(ig) 5898 ! first=.TRUE. 5899 END DO 5900 ! PRINT*,'apres fermeture' 5901 ! on stoppe après la fermeture 5902 RETURN 5903 ! Calcul de l'entrainement 5904 DO k = 1, klev 5905 DO ig = 1, ngrid 5906 entr(ig, k) = f(ig)*entr_star(ig, k) 5907 END DO 5908 END DO 5909 ! on stoppe après le calcul de entr 5910 ! RETURN 5911 ! CR:test pour entrainer moins que la masse 5912 ! do ig=1,ngrid 5913 ! do l=1,lentr(ig) 5914 ! if ((entr(ig,l)*ptimestep).gt.(0.9*masse(ig,l))) THEN 5915 ! entr(ig,l+1)=entr(ig,l+1)+entr(ig,l) 5916 ! s -0.9*masse(ig,l)/ptimestep 5917 ! entr(ig,l)=0.9*masse(ig,l)/ptimestep 5918 ! END IF 5919 ! enddo 5920 ! enddo 5921 ! CR: fin test 5922 ! Calcul des flux 5923 DO ig = 1, ngrid 5924 DO l = 1, lmax(ig) - 1 5925 fmc(ig, l+1) = fmc(ig, l) + entr(ig, l) 5926 END DO 5927 END DO 5928 5929 ! RC 5930 5931 5932 ! PRINT*,'9 OK convect8' 5933 ! PRINT*,'WA1 ',wa_moy 5934 5935 ! determination de l'indice du debut de la mixed layer ou w decroit 5936 5937 ! calcul de la largeur de chaque ascendance dans le cas conservatif. 5938 ! dans ce cas simple, on suppose que la largeur de l'ascendance provenant 5939 ! d'une couche est égale à la hauteur de la couche alimentante. 5940 ! La vitesse maximale dans l'ascendance est aussi prise comme estimation 5941 ! de la vitesse d'entrainement horizontal dans la couche alimentante. 5942 5943 DO l = 2, nlay 5944 DO ig = 1, ngrid 5945 IF (l<=lmaxa(ig)) THEN 5946 zw = max(wa_moy(ig,l), 1.E-10) 5947 larg_cons(ig, l) = zmax(ig)*r_aspect*fmc(ig, l)/(rhobarz(ig,l)*zw) 5948 END IF 5949 END DO 5950 END DO 5951 5952 DO l = 2, nlay 5953 DO ig = 1, ngrid 5954 IF (l<=lmaxa(ig)) THEN 5955 ! if (idetr.EQ.0) THEN 5956 ! cette option est finalement en dur. 5957 IF ((l_mix*zlev(ig,l))<0.) THEN 5958 ! PRINT*,'pb l_mix*zlev<0' 5959 END IF 5960 ! CR: test: nouvelle def de lambda 5961 ! larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l)) 5962 IF (zw2(ig,l)>1.E-10) THEN 5963 larg_detr(ig, l) = sqrt((l_mix/zw2(ig,l))*zlev(ig,l)) 5964 ELSE 5965 larg_detr(ig, l) = sqrt(l_mix*zlev(ig,l)) 5966 END IF 5967 ! RC 5968 ! ELSE IF (idetr.EQ.1) THEN 5969 ! larg_detr(ig,l)=larg_cons(ig,l) 5970 ! s *sqrt(l_mix*zlev(ig,l))/larg_cons(ig,lmix(ig)) 5971 ! ELSE IF (idetr.EQ.2) THEN 5972 ! larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l)) 5973 ! s *sqrt(wa_moy(ig,l)) 5974 ! ELSE IF (idetr.EQ.4) THEN 5975 ! larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l)) 5976 ! s *wa_moy(ig,l) 5977 ! END IF 5978 END IF 5979 END DO 5980 END DO 5981 5982 ! PRINT*,'10 OK convect8' 5983 ! PRINT*,'WA2 ',wa_moy 5984 ! calcul de la fraction de la maille concernée par l'ascendance en tenant 5985 ! compte de l'epluchage du thermique. 5986 5987 ! CR def de zmix continu (profil parabolique des vitesses) 5988 DO ig = 1, ngrid 5989 IF (lmix(ig)>1.) THEN 5990 ! test 5991 IF (((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig)))*((zlev(ig,lmix(ig)))- & 5992 (zlev(ig,lmix(ig)+1)))-(zw2(ig,lmix(ig))- & 5993 zw2(ig,lmix(ig)+1))*((zlev(ig,lmix(ig)-1))- & 5994 (zlev(ig,lmix(ig)))))>1E-10) THEN 5995 5996 zmix(ig) = ((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig)))*((zlev(ig,lmix(ig)) & 5997 )**2-(zlev(ig,lmix(ig)+1))**2)-(zw2(ig,lmix(ig))-zw2(ig, & 5998 lmix(ig)+1))*((zlev(ig,lmix(ig)-1))**2-(zlev(ig,lmix(ig)))**2))/ & 5999 (2.*((zw2(ig,lmix(ig)-1)-zw2(ig,lmix(ig)))*((zlev(ig,lmix(ig)))- & 6000 (zlev(ig,lmix(ig)+1)))-(zw2(ig,lmix(ig))- & 6001 zw2(ig,lmix(ig)+1))*((zlev(ig,lmix(ig)-1))-(zlev(ig,lmix(ig)))))) 6002 ELSE 6003 zmix(ig) = zlev(ig, lmix(ig)) 6004 ! PRINT*,'pb zmix' 6005 END IF 6006 ELSE 6007 zmix(ig) = 0. 6008 END IF 6009 ! test 6010 IF ((zmax(ig)-zmix(ig))<0.) THEN 6011 zmix(ig) = 0.99*zmax(ig) 6012 ! PRINT*,'pb zmix>zmax' 6013 END IF 6014 END DO 6015 6016 ! calcul du nouveau lmix correspondant 6017 DO ig = 1, ngrid 6018 DO l = 1, klev 6019 IF (zmix(ig)>=zlev(ig,l) .AND. zmix(ig)<zlev(ig,l+1)) THEN 6020 lmix(ig) = l 6021 END IF 6022 END DO 6023 END DO 6024 6025 DO l = 2, nlay 6026 DO ig = 1, ngrid 6027 IF (larg_cons(ig,l)>1.) THEN 6028 ! PRINT*,ig,l,lmix(ig),lmaxa(ig),larg_cons(ig,l),' KKK' 6029 fraca(ig, l) = (larg_cons(ig,l)-larg_detr(ig,l))/(r_aspect*zmax(ig)) 6030 ! test 6031 fraca(ig, l) = max(fraca(ig,l), 0.) 6032 fraca(ig, l) = min(fraca(ig,l), 0.5) 6033 fracd(ig, l) = 1. - fraca(ig, l) 6034 fracc(ig, l) = larg_cons(ig, l)/(r_aspect*zmax(ig)) 6035 ELSE 6036 ! wa_moy(ig,l)=0. 6037 fraca(ig, l) = 0. 6038 fracc(ig, l) = 0. 6039 fracd(ig, l) = 1. 6040 END IF 6041 END DO 6042 END DO 6043 ! CR: calcul de fracazmix 6044 DO ig = 1, ngrid 6045 fracazmix(ig) = (fraca(ig,lmix(ig)+1)-fraca(ig,lmix(ig)))/ & 6046 (zlev(ig,lmix(ig)+1)-zlev(ig,lmix(ig)))*zmix(ig) + & 6047 fraca(ig, lmix(ig)) - zlev(ig, lmix(ig))*(fraca(ig,lmix(ig)+1)-fraca(ig & 6048 ,lmix(ig)))/(zlev(ig,lmix(ig)+1)-zlev(ig,lmix(ig))) 6049 END DO 6050 6051 DO l = 2, nlay 6052 DO ig = 1, ngrid 6053 IF (larg_cons(ig,l)>1.) THEN 6054 IF (l>lmix(ig)) THEN 6055 ! test 6056 IF (zmax(ig)-zmix(ig)<1.E-10) THEN 6057 ! PRINT*,'pb xxx' 6058 xxx(ig, l) = (lmaxa(ig)+1.-l)/(lmaxa(ig)+1.-lmix(ig)) 6059 ELSE 6060 xxx(ig, l) = (zmax(ig)-zlev(ig,l))/(zmax(ig)-zmix(ig)) 6061 END IF 6062 IF (idetr==0) THEN 6063 fraca(ig, l) = fracazmix(ig) 6064 ELSE IF (idetr==1) THEN 6065 fraca(ig, l) = fracazmix(ig)*xxx(ig, l) 6066 ELSE IF (idetr==2) THEN 6067 fraca(ig, l) = fracazmix(ig)*(1.-(1.-xxx(ig,l))**2) 6068 ELSE 6069 fraca(ig, l) = fracazmix(ig)*xxx(ig, l)**2 6070 END IF 6071 ! PRINT*,ig,l,lmix(ig),lmaxa(ig),xxx(ig,l),'LLLLLLL' 6072 fraca(ig, l) = max(fraca(ig,l), 0.) 6073 fraca(ig, l) = min(fraca(ig,l), 0.5) 6074 fracd(ig, l) = 1. - fraca(ig, l) 6075 fracc(ig, l) = larg_cons(ig, l)/(r_aspect*zmax(ig)) 6076 END IF 6077 END IF 6078 END DO 6079 END DO 6080 6081 ! PRINT*,'fin calcul fraca' 6082 ! PRINT*,'11 OK convect8' 6083 ! PRINT*,'Ea3 ',wa_moy 6084 ! ------------------------------------------------------------------ 6085 ! Calcul de fracd, wd 6086 ! somme wa - wd = 0 6087 ! ------------------------------------------------------------------ 6088 6089 6090 DO ig = 1, ngrid 6091 fm(ig, 1) = 0. 6092 fm(ig, nlay+1) = 0. 6093 END DO 6094 6095 DO l = 2, nlay 6096 DO ig = 1, ngrid 6097 fm(ig, l) = fraca(ig, l)*wa_moy(ig, l)*rhobarz(ig, l) 6098 ! CR:test 6099 IF (entr(ig,l-1)<1E-10 .AND. fm(ig,l)>fm(ig,l-1) .AND. l>lmix(ig)) THEN 6100 fm(ig, l) = fm(ig, l-1) 6101 ! WRITE(1,*)'ajustement fm, l',l 6102 END IF 6103 ! WRITE(1,*)'ig,l,fm(ig,l)',ig,l,fm(ig,l) 6104 ! RC 6105 END DO 6106 DO ig = 1, ngrid 6107 IF (fracd(ig,l)<0.1) THEN 6108 abort_message = 'fracd trop petit' 6109 CALL abort_physic(modname, abort_message, 1) 6110 6111 ELSE 6112 ! vitesse descendante "diagnostique" 6113 wd(ig, l) = fm(ig, l)/(fracd(ig,l)*rhobarz(ig,l)) 6114 END IF 6115 END DO 6116 END DO 6117 6118 DO l = 1, nlay 6119 DO ig = 1, ngrid 6120 ! masse(ig,l)=rho(ig,l)*(zlev(ig,l+1)-zlev(ig,l)) 6121 masse(ig, l) = (pplev(ig,l)-pplev(ig,l+1))/rg 6122 END DO 6123 END DO 6124 6125 ! PRINT*,'12 OK convect8' 6126 ! PRINT*,'WA4 ',wa_moy 6127 ! c------------------------------------------------------------------ 6128 ! calcul du transport vertical 6129 ! ------------------------------------------------------------------ 6130 6131 GO TO 4444 6132 ! PRINT*,'XXXXXXXXXXXXXXX ptimestep= ',ptimestep 6133 DO l = 2, nlay - 1 6134 DO ig = 1, ngrid 6135 IF (fm(ig,l+1)*ptimestep>masse(ig,l) .AND. fm(ig,l+1)*ptimestep>masse( & 6136 ig,l+1)) THEN 6137 ! PRINT*,'WARN!!! FM>M ig=',ig,' l=',l,' FM=' 6138 ! s ,fm(ig,l+1)*ptimestep 6139 ! s ,' M=',masse(ig,l),masse(ig,l+1) 6140 END IF 6141 END DO 6142 END DO 6143 6144 DO l = 1, nlay 6145 DO ig = 1, ngrid 6146 IF (entr(ig,l)*ptimestep>masse(ig,l)) THEN 6147 ! PRINT*,'WARN!!! E>M ig=',ig,' l=',l,' E==' 6148 ! s ,entr(ig,l)*ptimestep 6149 ! s ,' M=',masse(ig,l) 6150 END IF 6151 END DO 6152 END DO 6153 6154 DO l = 1, nlay 6155 DO ig = 1, ngrid 6156 IF (.NOT. fm(ig,l)>=0. .OR. .NOT. fm(ig,l)<=10.) THEN 6157 ! PRINT*,'WARN!!! fm exagere ig=',ig,' l=',l 6158 ! s ,' FM=',fm(ig,l) 6159 END IF 6160 IF (.NOT. masse(ig,l)>=1.E-10 .OR. .NOT. masse(ig,l)<=1.E4) THEN 6161 ! PRINT*,'WARN!!! masse exagere ig=',ig,' l=',l 6162 ! s ,' M=',masse(ig,l) 6163 ! PRINT*,'rho(ig,l),pplay(ig,l),zpspsk(ig,l),RD,zh(ig,l)', 6164 ! s rho(ig,l),pplay(ig,l),zpspsk(ig,l),RD,zh(ig,l) 6165 ! PRINT*,'zlev(ig,l+1),zlev(ig,l)' 6166 ! s ,zlev(ig,l+1),zlev(ig,l) 6167 ! PRINT*,'pphi(ig,l-1),pphi(ig,l),pphi(ig,l+1)' 6168 ! s ,pphi(ig,l-1),pphi(ig,l),pphi(ig,l+1) 6169 END IF 6170 IF (.NOT. entr(ig,l)>=0. .OR. .NOT. entr(ig,l)<=10.) THEN 6171 ! PRINT*,'WARN!!! entr exagere ig=',ig,' l=',l 6172 ! s ,' E=',entr(ig,l) 6173 END IF 6174 END DO 6175 END DO 6176 6177 4444 CONTINUE 6178 6179 ! CR:redefinition du entr 6180 DO l = 1, nlay 6181 DO ig = 1, ngrid 6182 detr(ig, l) = fm(ig, l) + entr(ig, l) - fm(ig, l+1) 6183 IF (detr(ig,l)<0.) THEN 6184 ! entr(ig,l)=entr(ig,l)-detr(ig,l) 6185 fm(ig, l+1) = fm(ig, l) + entr(ig, l) 6186 detr(ig, l) = 0. 6187 ! PRINT*,'WARNING !!! detrainement negatif ',ig,l 6188 END IF 6189 END DO 6190 END DO 6191 ! RC 6192 IF (w2di==1) THEN 6193 fm0 = fm0 + ptimestep*(fm-fm0)/tho 6194 entr0 = entr0 + ptimestep*(entr-entr0)/tho 6195 ELSE 6196 fm0 = fm 6197 entr0 = entr 6198 END IF 6199 6200 IF (1==1) THEN 6201 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zh, zdhadj, & 6202 zha) 6203 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zo, pdoadj, & 6204 zoa) 6205 ELSE 6206 CALL dqthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca, zh, & 6207 zdhadj, zha) 6208 CALL dqthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca, zo, & 6209 pdoadj, zoa) 6210 END IF 6211 6212 IF (1==0) THEN 6213 CALL dvthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca, zmax, & 6214 zu, zv, pduadj, pdvadj, zua, zva) 6215 ELSE 6216 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zu, pduadj, & 6217 zua) 6218 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zv, pdvadj, & 6219 zva) 6220 END IF 6221 6222 DO l = 1, nlay 6223 DO ig = 1, ngrid 6224 zf = 0.5*(fracc(ig,l)+fracc(ig,l+1)) 6225 zf2 = zf/(1.-zf) 6226 thetath2(ig, l) = zf2*(zha(ig,l)-zh(ig,l))**2 6227 wth2(ig, l) = zf2*(0.5*(wa_moy(ig,l)+wa_moy(ig,l+1)))**2 6228 END DO 6229 END DO 6230 6231 6232 6233 ! PRINT*,'13 OK convect8' 6234 ! PRINT*,'WA5 ',wa_moy 6235 DO l = 1, nlay 6236 DO ig = 1, ngrid 6237 pdtadj(ig, l) = zdhadj(ig, l)*zpspsk(ig, l) 6238 END DO 6239 END DO 6240 6241 6242 ! do l=1,nlay 6243 ! do ig=1,ngrid 6244 ! IF(abs(pdtadj(ig,l))*86400..gt.500.) THEN 6245 ! PRINT*,'WARN!!! ig=',ig,' l=',l 6246 ! s ,' pdtadj=',pdtadj(ig,l) 6247 ! END IF 6248 ! IF(abs(pdoadj(ig,l))*86400..gt.1.) THEN 6249 ! PRINT*,'WARN!!! ig=',ig,' l=',l 6250 ! s ,' pdoadj=',pdoadj(ig,l) 6251 ! END IF 6252 ! enddo 6253 ! enddo 6254 6255 ! PRINT*,'14 OK convect8' 6256 ! ------------------------------------------------------------------ 6257 ! Calculs pour les sorties 6258 ! ------------------------------------------------------------------ 6259 6260 IF (sorties) THEN 5281 6261 5282 DO l = 1, nlay 6262 5283 DO ig = 1, ngrid 6263 zla(ig, l) = (1.-fracd(ig,l))*zmax(ig) 6264 zld(ig, l) = fracd(ig, l)*zmax(ig) 6265 IF (1.-fracd(ig,l)>1.E-10) zwa(ig, l) = wd(ig, l)*fracd(ig, l)/ & 6266 (1.-fracd(ig,l)) 6267 END DO 6268 END DO 6269 6270 ! deja fait 5284 zf = 0.5 * (fracc(ig, l) + fracc(ig, l + 1)) 5285 zf2 = zf / (1. - zf) 5286 thetath2(ig, l) = zf2 * (zha(ig, l) - zh(ig, l))**2 5287 wth2(ig, l) = zf2 * (0.5 * (wa_moy(ig, l) + wa_moy(ig, l + 1)))**2 5288 END DO 5289 END DO 5290 5291 5292 5293 ! PRINT*,'13 OK convect8' 5294 ! PRINT*,'WA5 ',wa_moy 5295 DO l = 1, nlay 5296 DO ig = 1, ngrid 5297 pdtadj(ig, l) = zdhadj(ig, l) * zpspsk(ig, l) 5298 END DO 5299 END DO 5300 5301 6271 5302 ! do l=1,nlay 6272 5303 ! do ig=1,ngrid 6273 ! detr(ig,l)=fm(ig,l)+entr(ig,l)-fm(ig,l+1) 6274 ! if (detr(ig,l).lt.0.) THEN 6275 ! entr(ig,l)=entr(ig,l)-detr(ig,l) 6276 ! detr(ig,l)=0. 6277 ! PRINT*,'WARNING !!! detrainement negatif ',ig,l 5304 ! IF(abs(pdtadj(ig,l))*86400..gt.500.) THEN 5305 ! PRINT*,'WARN!!! ig=',ig,' l=',l 5306 ! s ,' pdtadj=',pdtadj(ig,l) 5307 ! END IF 5308 ! IF(abs(pdoadj(ig,l))*86400..gt.1.) THEN 5309 ! PRINT*,'WARN!!! ig=',ig,' l=',l 5310 ! s ,' pdoadj=',pdoadj(ig,l) 6278 5311 ! END IF 6279 5312 ! enddo 6280 5313 ! enddo 6281 5314 6282 ! PRINT*,'15 OK convect8' 6283 6284 isplit = isplit + 1 6285 6286 6287 ! #define und 6288 GO TO 123 5315 ! PRINT*,'14 OK convect8' 5316 ! ------------------------------------------------------------------ 5317 ! Calculs pour les sorties 5318 ! ------------------------------------------------------------------ 5319 5320 END SUBROUTINE thermcell_sec 5321 5322 SUBROUTINE calcul_sec(ngrid, nlay, ptimestep, pplay, pplev, pphi, zlev, pu, & 5323 pv, pt, po, zmax, wmax, zw2, lmix & ! s 5324 ! ,pu_therm,pv_therm 5325 , r_aspect, l_mix, w2di, tho) 5326 5327 USE dimphy 5328 IMPLICIT NONE 5329 5330 ! ======================================================================= 5331 5332 ! Calcul du transport verticale dans la couche limite en presence 5333 ! de "thermiques" explicitement representes 5334 5335 ! Réécriture à partir d'un listing papier à Habas, le 14/02/00 5336 5337 ! le thermique est supposé homogène et dissipé par mélange avec 5338 ! son environnement. la longueur l_mix contrôle l'efficacité du 5339 ! mélange 5340 5341 ! Le calcul du transport des différentes espèces se fait en prenant 5342 ! en compte: 5343 ! 1. un flux de masse montant 5344 ! 2. un flux de masse descendant 5345 ! 3. un entrainement 5346 ! 4. un detrainement 5347 5348 ! ======================================================================= 5349 5350 ! ----------------------------------------------------------------------- 5351 ! declarations: 5352 ! ------------- 5353 5354 include "YOMCST.h" 5355 5356 ! arguments: 5357 ! ---------- 5358 5359 INTEGER ngrid, nlay, w2di 5360 REAL tho 5361 REAL ptimestep, l_mix, r_aspect 5362 REAL pt(ngrid, nlay), pdtadj(ngrid, nlay) 5363 REAL pu(ngrid, nlay), pduadj(ngrid, nlay) 5364 REAL pv(ngrid, nlay), pdvadj(ngrid, nlay) 5365 REAL po(ngrid, nlay), pdoadj(ngrid, nlay) 5366 REAL pplay(ngrid, nlay), pplev(ngrid, nlay + 1) 5367 REAL pphi(ngrid, nlay) 5368 5369 INTEGER idetr 5370 SAVE idetr 5371 DATA idetr/3/ 5372 !$OMP THREADPRIVATE(idetr) 5373 ! local: 5374 ! ------ 5375 5376 INTEGER ig, k, l, lmaxa(klon), lmix(klon) 5377 REAL zsortie1d(klon) 5378 ! CR: on remplace lmax(klon,klev+1) 5379 INTEGER lmax(klon), lmin(klon), lentr(klon) 5380 REAL linter(klon) 5381 REAL zmix(klon), fracazmix(klon) 5382 ! RC 5383 REAL zmax(klon), zw, zw2(klon, klev + 1), ztva(klon, klev) 5384 5385 REAL zlev(klon, klev + 1), zlay(klon, klev) 5386 REAL zh(klon, klev), zdhadj(klon, klev) 5387 REAL ztv(klon, klev) 5388 REAL zu(klon, klev), zv(klon, klev), zo(klon, klev) 5389 REAL wh(klon, klev + 1) 5390 REAL wu(klon, klev + 1), wv(klon, klev + 1), wo(klon, klev + 1) 5391 REAL zla(klon, klev + 1) 5392 REAL zwa(klon, klev + 1) 5393 REAL zld(klon, klev + 1) 5394 ! real zwd(klon,klev+1) 5395 REAL zsortie(klon, klev) 5396 REAL zva(klon, klev) 5397 REAL zua(klon, klev) 5398 REAL zoa(klon, klev) 5399 5400 REAL zha(klon, klev) 5401 REAL wa_moy(klon, klev + 1) 5402 REAL fraca(klon, klev + 1) 5403 REAL fracc(klon, klev + 1) 5404 REAL zf, zf2 5405 REAL thetath2(klon, klev), wth2(klon, klev) 5406 ! common/comtherm/thetath2,wth2 5407 5408 REAL count_time 5409 ! integer isplit,nsplit 5410 INTEGER isplit, nsplit, ialt 5411 PARAMETER (nsplit = 10) 5412 DATA isplit/0/ 5413 SAVE isplit 5414 !$OMP THREADPRIVATE(isplit) 5415 5416 LOGICAL sorties 5417 REAL rho(klon, klev), rhobarz(klon, klev + 1), masse(klon, klev) 5418 REAL zpspsk(klon, klev) 5419 5420 ! real wmax(klon,klev),wmaxa(klon) 5421 REAL wmax(klon), wmaxa(klon) 5422 REAL wa(klon, klev, klev + 1) 5423 REAL wd(klon, klev + 1) 5424 REAL larg_part(klon, klev, klev + 1) 5425 REAL fracd(klon, klev + 1) 5426 REAL xxx(klon, klev + 1) 5427 REAL larg_cons(klon, klev + 1) 5428 REAL larg_detr(klon, klev + 1) 5429 REAL fm0(klon, klev + 1), entr0(klon, klev), detr(klon, klev) 5430 REAL pu_therm(klon, klev), pv_therm(klon, klev) 5431 REAL fm(klon, klev + 1), entr(klon, klev) 5432 REAL fmc(klon, klev + 1) 5433 5434 ! CR:nouvelles variables 5435 REAL f_star(klon, klev + 1), entr_star(klon, klev) 5436 REAL entr_star_tot(klon), entr_star2(klon) 5437 REAL zalim(klon) 5438 INTEGER lalim(klon) 5439 REAL norme(klon) 5440 REAL f(klon), f0(klon) 5441 REAL zlevinter(klon) 5442 LOGICAL therm 5443 LOGICAL first 5444 DATA first/.FALSE./ 5445 SAVE first 5446 !$OMP THREADPRIVATE(first) 5447 ! RC 5448 5449 CHARACTER *2 str2 5450 CHARACTER *10 str10 5451 5452 CHARACTER (LEN = 20) :: modname = 'calcul_sec' 5453 CHARACTER (LEN = 80) :: abort_message 5454 5455 5456 ! LOGICAL vtest(klon),down 5457 5458 INTEGER ncorrec 5459 SAVE ncorrec 5460 DATA ncorrec/0/ 5461 !$OMP THREADPRIVATE(ncorrec) 5462 5463 5464 ! ----------------------------------------------------------------------- 5465 ! initialisation: 5466 ! --------------- 5467 5468 sorties = .TRUE. 5469 IF (ngrid/=klon) THEN 5470 PRINT * 5471 PRINT *, 'STOP dans convadj' 5472 PRINT *, 'ngrid =', ngrid 5473 PRINT *, 'klon =', klon 5474 END IF 5475 5476 ! ----------------------------------------------------------------------- 5477 ! incrementation eventuelle de tendances precedentes: 5478 ! --------------------------------------------------- 5479 5480 ! PRINT*,'0 OK convect8' 5481 5482 DO l = 1, nlay 5483 DO ig = 1, ngrid 5484 zpspsk(ig, l) = (pplay(ig, l) / pplev(ig, 1))**rkappa 5485 zh(ig, l) = pt(ig, l) / zpspsk(ig, l) 5486 zu(ig, l) = pu(ig, l) 5487 zv(ig, l) = pv(ig, l) 5488 zo(ig, l) = po(ig, l) 5489 ztv(ig, l) = zh(ig, l) * (1. + 0.61 * zo(ig, l)) 5490 END DO 5491 END DO 5492 5493 ! PRINT*,'1 OK convect8' 5494 ! -------------------- 5495 5496 5497 ! + + + + + + + + + + + 5498 5499 5500 ! wa, fraca, wd, fracd -------------------- zlev(2), rhobarz 5501 ! wh,wt,wo ... 5502 5503 ! + + + + + + + + + + + zh,zu,zv,zo,rho 5504 5505 5506 ! -------------------- zlev(1) 5507 ! \\\\\\\\\\\\\\\\\\\\ 5508 5509 5510 5511 ! ----------------------------------------------------------------------- 5512 ! Calcul des altitudes des couches 5513 ! ----------------------------------------------------------------------- 5514 5515 DO l = 2, nlay 5516 DO ig = 1, ngrid 5517 zlev(ig, l) = 0.5 * (pphi(ig, l) + pphi(ig, l - 1)) / rg 5518 END DO 5519 END DO 5520 DO ig = 1, ngrid 5521 zlev(ig, 1) = 0. 5522 zlev(ig, nlay + 1) = (2. * pphi(ig, klev) - pphi(ig, klev - 1)) / rg 5523 END DO 5524 DO l = 1, nlay 5525 DO ig = 1, ngrid 5526 zlay(ig, l) = pphi(ig, l) / rg 5527 END DO 5528 END DO 5529 5530 ! PRINT*,'2 OK convect8' 5531 ! ----------------------------------------------------------------------- 5532 ! Calcul des densites 5533 ! ----------------------------------------------------------------------- 5534 5535 DO l = 1, nlay 5536 DO ig = 1, ngrid 5537 rho(ig, l) = pplay(ig, l) / (zpspsk(ig, l) * rd * zh(ig, l)) 5538 END DO 5539 END DO 5540 5541 DO l = 2, nlay 5542 DO ig = 1, ngrid 5543 rhobarz(ig, l) = 0.5 * (rho(ig, l) + rho(ig, l - 1)) 5544 END DO 5545 END DO 5546 5547 DO k = 1, nlay 5548 DO l = 1, nlay + 1 5549 DO ig = 1, ngrid 5550 wa(ig, k, l) = 0. 5551 END DO 5552 END DO 5553 END DO 5554 5555 ! PRINT*,'3 OK convect8' 5556 ! ------------------------------------------------------------------ 5557 ! Calcul de w2, quarre de w a partir de la cape 5558 ! a partir de w2, on calcule wa, vitesse de l'ascendance 5559 5560 ! ATTENTION: Dans cette version, pour cause d'economie de memoire, 5561 ! w2 est stoke dans wa 5562 5563 ! ATTENTION: dans convect8, on n'utilise le calcule des wa 5564 ! independants par couches que pour calculer l'entrainement 5565 ! a la base et la hauteur max de l'ascendance. 5566 5567 ! Indicages: 5568 ! l'ascendance provenant du niveau k traverse l'interface l avec 5569 ! une vitesse wa(k,l). 5570 5571 ! -------------------- 5572 5573 ! + + + + + + + + + + 5574 5575 ! wa(k,l) ---- -------------------- l 5576 ! /\ 5577 ! /||\ + + + + + + + + + + 5578 ! || 5579 ! || -------------------- 5580 ! || 5581 ! || + + + + + + + + + + 5582 ! || 5583 ! || -------------------- 5584 ! ||__ 5585 ! |___ + + + + + + + + + + k 5586 5587 ! -------------------- 5588 5589 5590 5591 ! ------------------------------------------------------------------ 5592 5593 ! CR: ponderation entrainement des couches instables 5594 ! def des entr_star tels que entr=f*entr_star 5595 DO l = 1, klev 5596 DO ig = 1, ngrid 5597 entr_star(ig, l) = 0. 5598 END DO 5599 END DO 5600 ! determination de la longueur de la couche d entrainement 5601 DO ig = 1, ngrid 5602 lentr(ig) = 1 5603 END DO 5604 5605 ! on ne considere que les premieres couches instables 5606 therm = .FALSE. 5607 DO k = nlay - 2, 1, -1 5608 DO ig = 1, ngrid 5609 IF (ztv(ig, k)>ztv(ig, k + 1) .AND. ztv(ig, k + 1)<=ztv(ig, k + 2)) THEN 5610 lentr(ig) = k + 1 5611 therm = .TRUE. 5612 END IF 5613 END DO 5614 END DO 5615 ! limitation de la valeur du lentr 5616 ! do ig=1,ngrid 5617 ! lentr(ig)=min(5,lentr(ig)) 5618 ! enddo 5619 ! determination du lmin: couche d ou provient le thermique 5620 DO ig = 1, ngrid 5621 lmin(ig) = 1 5622 END DO 5623 DO ig = 1, ngrid 5624 DO l = nlay, 2, -1 5625 IF (ztv(ig, l - 1)>ztv(ig, l)) THEN 5626 lmin(ig) = l - 1 5627 END IF 5628 END DO 5629 END DO 5630 ! initialisations 5631 DO ig = 1, ngrid 5632 zalim(ig) = 0. 5633 norme(ig) = 0. 5634 lalim(ig) = 1 5635 END DO 5636 DO k = 1, klev - 1 5637 DO ig = 1, ngrid 5638 zalim(ig) = zalim(ig) + zlev(ig, k) * max(0., (ztv(ig, k) - ztv(ig, & 5639 k + 1)) / (zlev(ig, k + 1) - zlev(ig, k))) 5640 ! s *(zlev(ig,k+1)-zlev(ig,k)) 5641 norme(ig) = norme(ig) + max(0., (ztv(ig, k) - ztv(ig, k + 1)) / (zlev(ig, & 5642 k + 1) - zlev(ig, k))) 5643 ! s *(zlev(ig,k+1)-zlev(ig,k)) 5644 END DO 5645 END DO 5646 DO ig = 1, ngrid 5647 IF (norme(ig)>1.E-10) THEN 5648 zalim(ig) = max(10. * zalim(ig) / norme(ig), zlev(ig, 2)) 5649 ! zalim(ig)=min(zalim(ig),zlev(ig,lentr(ig))) 5650 END IF 5651 END DO 5652 ! détermination du lalim correspondant 5653 DO k = 1, klev - 1 5654 DO ig = 1, ngrid 5655 IF ((zalim(ig)>zlev(ig, k)) .AND. (zalim(ig)<=zlev(ig, k + 1))) THEN 5656 lalim(ig) = k 5657 END IF 5658 END DO 5659 END DO 5660 5661 ! definition de l'entrainement des couches 5662 DO l = 1, klev - 1 5663 DO ig = 1, ngrid 5664 IF (ztv(ig, l)>ztv(ig, l + 1) .AND. l>=lmin(ig) .AND. l<lentr(ig)) THEN 5665 entr_star(ig, l) = max((ztv(ig, l) - ztv(ig, l + 1)), 0.) & ! s 5666 ! *(zlev(ig,l+1)-zlev(ig,l)) 5667 * sqrt(zlev(ig, l + 1)) 5668 ! autre def 5669 ! entr_star(ig,l)=zlev(ig,l+1)*(1.-(zlev(ig,l+1) 5670 ! s /zlev(ig,lentr(ig)+2)))**(3./2.) 5671 END IF 5672 END DO 5673 END DO 5674 ! nouveau test 5675 ! if (therm) THEN 5676 DO l = 1, klev - 1 5677 DO ig = 1, ngrid 5678 IF (ztv(ig, l)>ztv(ig, l + 1) .AND. l>=lmin(ig) .AND. l<=lalim(ig) .AND. & 5679 zalim(ig)>1.E-10) THEN 5680 ! if (l.le.lentr(ig)) THEN 5681 ! entr_star(ig,l)=zlev(ig,l+1)*(1.-(zlev(ig,l+1) 5682 ! s /zalim(ig)))**(3./2.) 5683 ! WRITE(10,*)zlev(ig,l),entr_star(ig,l) 5684 END IF 5685 END DO 5686 END DO 5687 ! END IF 5688 ! pas de thermique si couche 1 stable 5689 DO ig = 1, ngrid 5690 IF (lmin(ig)>5) THEN 5691 DO l = 1, klev 5692 entr_star(ig, l) = 0. 5693 END DO 5694 END IF 5695 END DO 5696 ! calcul de l entrainement total 5697 DO ig = 1, ngrid 5698 entr_star_tot(ig) = 0. 5699 END DO 5700 DO ig = 1, ngrid 5701 DO k = 1, klev 5702 entr_star_tot(ig) = entr_star_tot(ig) + entr_star(ig, k) 5703 END DO 5704 END DO 5705 ! Calcul entrainement normalise 5706 DO ig = 1, ngrid 5707 IF (entr_star_tot(ig)>1.E-10) THEN 5708 ! do l=1,lentr(ig) 5709 DO l = 1, klev 5710 ! def possibles pour entr_star: zdthetadz, dthetadz, zdtheta 5711 entr_star(ig, l) = entr_star(ig, l) / entr_star_tot(ig) 5712 END DO 5713 END IF 5714 END DO 5715 5716 ! PRINT*,'fin calcul entr_star' 5717 DO k = 1, klev 5718 DO ig = 1, ngrid 5719 ztva(ig, k) = ztv(ig, k) 5720 END DO 5721 END DO 5722 ! RC 5723 ! PRINT*,'7 OK convect8' 5724 DO k = 1, klev + 1 5725 DO ig = 1, ngrid 5726 zw2(ig, k) = 0. 5727 fmc(ig, k) = 0. 5728 ! CR 5729 f_star(ig, k) = 0. 5730 ! RC 5731 larg_cons(ig, k) = 0. 5732 larg_detr(ig, k) = 0. 5733 wa_moy(ig, k) = 0. 5734 END DO 5735 END DO 5736 5737 ! PRINT*,'8 OK convect8' 5738 DO ig = 1, ngrid 5739 linter(ig) = 1. 5740 lmaxa(ig) = 1 5741 lmix(ig) = 1 5742 wmaxa(ig) = 0. 5743 END DO 5744 5745 ! CR: 5746 DO l = 1, nlay - 2 5747 DO ig = 1, ngrid 5748 IF (ztv(ig, l)>ztv(ig, l + 1) .AND. entr_star(ig, l)>1.E-10 .AND. & 5749 zw2(ig, l)<1E-10) THEN 5750 f_star(ig, l + 1) = entr_star(ig, l) 5751 ! test:calcul de dteta 5752 zw2(ig, l + 1) = 2. * rg * (ztv(ig, l) - ztv(ig, l + 1)) / ztv(ig, l + 1) * & 5753 (zlev(ig, l + 1) - zlev(ig, l)) * 0.4 * pphi(ig, l) / (pphi(ig, l + 1) - pphi(ig, l)) 5754 larg_detr(ig, l) = 0. 5755 ELSE IF ((zw2(ig, l)>=1E-10) .AND. (f_star(ig, l) + entr_star(ig, & 5756 l)>1.E-10)) THEN 5757 f_star(ig, l + 1) = f_star(ig, l) + entr_star(ig, l) 5758 ztva(ig, l) = (f_star(ig, l) * ztva(ig, l - 1) + entr_star(ig, l) * ztv(ig, l)) / & 5759 f_star(ig, l + 1) 5760 zw2(ig, l + 1) = zw2(ig, l) * (f_star(ig, l) / f_star(ig, l + 1))**2 + & 5761 2. * rg * (ztva(ig, l) - ztv(ig, l)) / ztv(ig, l) * (zlev(ig, l + 1) - zlev(ig, l)) 5762 END IF 5763 ! determination de zmax continu par interpolation lineaire 5764 IF (zw2(ig, l + 1)<0.) THEN 5765 ! test 5766 IF (abs(zw2(ig, l + 1) - zw2(ig, l))<1E-10) THEN 5767 ! PRINT*,'pb linter' 5768 END IF 5769 linter(ig) = (l * (zw2(ig, l + 1) - zw2(ig, l)) - zw2(ig, l)) / (zw2(ig, l + 1) - zw2(& 5770 ig, l)) 5771 zw2(ig, l + 1) = 0. 5772 lmaxa(ig) = l 5773 ELSE 5774 IF (zw2(ig, l + 1)<0.) THEN 5775 ! PRINT*,'pb1 zw2<0' 5776 END IF 5777 wa_moy(ig, l + 1) = sqrt(zw2(ig, l + 1)) 5778 END IF 5779 IF (wa_moy(ig, l + 1)>wmaxa(ig)) THEN 5780 ! lmix est le niveau de la couche ou w (wa_moy) est maximum 5781 lmix(ig) = l + 1 5782 wmaxa(ig) = wa_moy(ig, l + 1) 5783 END IF 5784 END DO 5785 END DO 5786 ! PRINT*,'fin calcul zw2' 5787 5788 ! Calcul de la couche correspondant a la hauteur du thermique 5789 DO ig = 1, ngrid 5790 lmax(ig) = lentr(ig) 5791 ! lmax(ig)=lalim(ig) 5792 END DO 5793 DO ig = 1, ngrid 5794 DO l = nlay, lentr(ig) + 1, -1 5795 ! do l=nlay,lalim(ig)+1,-1 5796 IF (zw2(ig, l)<=1.E-10) THEN 5797 lmax(ig) = l - 1 5798 END IF 5799 END DO 5800 END DO 5801 ! pas de thermique si couche 1 stable 5802 DO ig = 1, ngrid 5803 IF (lmin(ig)>5) THEN 5804 lmax(ig) = 1 5805 lmin(ig) = 1 5806 lentr(ig) = 1 5807 lalim(ig) = 1 5808 END IF 5809 END DO 5810 5811 ! Determination de zw2 max 5812 DO ig = 1, ngrid 5813 wmax(ig) = 0. 5814 END DO 5815 5816 DO l = 1, nlay 5817 DO ig = 1, ngrid 5818 IF (l<=lmax(ig)) THEN 5819 IF (zw2(ig, l)<0.) THEN 5820 ! PRINT*,'pb2 zw2<0' 5821 END IF 5822 zw2(ig, l) = sqrt(zw2(ig, l)) 5823 wmax(ig) = max(wmax(ig), zw2(ig, l)) 5824 ELSE 5825 zw2(ig, l) = 0. 5826 END IF 5827 END DO 5828 END DO 5829 5830 ! Longueur caracteristique correspondant a la hauteur des thermiques. 5831 DO ig = 1, ngrid 5832 zmax(ig) = 0. 5833 zlevinter(ig) = zlev(ig, 1) 5834 END DO 5835 DO ig = 1, ngrid 5836 ! calcul de zlevinter 5837 zlevinter(ig) = (zlev(ig, lmax(ig) + 1) - zlev(ig, lmax(ig))) * linter(ig) + & 5838 zlev(ig, lmax(ig)) - lmax(ig) * (zlev(ig, lmax(ig) + 1) - zlev(ig, lmax(ig))) 5839 zmax(ig) = max(zmax(ig), zlevinter(ig) - zlev(ig, lmin(ig))) 5840 END DO 5841 DO ig = 1, ngrid 5842 ! WRITE(8,*)zmax(ig),lmax(ig),lentr(ig),lmin(ig) 5843 END DO 5844 ! on stope après les calculs de zmax et wmax 5845 RETURN 5846 5847 ! PRINT*,'avant fermeture' 5848 ! Fermeture,determination de f 5849 ! Attention! entrainement normalisé ou pas? 5850 DO ig = 1, ngrid 5851 entr_star2(ig) = 0. 5852 END DO 5853 DO ig = 1, ngrid 5854 IF (entr_star_tot(ig)<1.E-10) THEN 5855 f(ig) = 0. 5856 ELSE 5857 DO k = lmin(ig), lentr(ig) 5858 ! do k=lmin(ig),lalim(ig) 5859 entr_star2(ig) = entr_star2(ig) + entr_star(ig, k)**2 / (rho(ig, k) * (& 5860 zlev(ig, k + 1) - zlev(ig, k))) 5861 END DO 5862 ! Nouvelle fermeture 5863 f(ig) = wmax(ig) / (max(500., zmax(ig)) * r_aspect * entr_star2(ig)) 5864 ! s *entr_star_tot(ig) 5865 ! test 5866 ! if (first) THEN 5867 f(ig) = f(ig) + (f0(ig) - f(ig)) * exp(-ptimestep / zmax(ig) * wmax(ig)) 5868 ! END IF 5869 END IF 5870 f0(ig) = f(ig) 5871 ! first=.TRUE. 5872 END DO 5873 ! PRINT*,'apres fermeture' 5874 ! on stoppe après la fermeture 5875 RETURN 5876 ! Calcul de l'entrainement 5877 DO k = 1, klev 5878 DO ig = 1, ngrid 5879 entr(ig, k) = f(ig) * entr_star(ig, k) 5880 END DO 5881 END DO 5882 ! on stoppe après le calcul de entr 5883 ! RETURN 5884 ! CR:test pour entrainer moins que la masse 5885 ! do ig=1,ngrid 5886 ! do l=1,lentr(ig) 5887 ! if ((entr(ig,l)*ptimestep).gt.(0.9*masse(ig,l))) THEN 5888 ! entr(ig,l+1)=entr(ig,l+1)+entr(ig,l) 5889 ! s -0.9*masse(ig,l)/ptimestep 5890 ! entr(ig,l)=0.9*masse(ig,l)/ptimestep 5891 ! END IF 5892 ! enddo 5893 ! enddo 5894 ! CR: fin test 5895 ! Calcul des flux 5896 DO ig = 1, ngrid 5897 DO l = 1, lmax(ig) - 1 5898 fmc(ig, l + 1) = fmc(ig, l) + entr(ig, l) 5899 END DO 5900 END DO 5901 5902 ! RC 5903 5904 5905 ! PRINT*,'9 OK convect8' 5906 ! PRINT*,'WA1 ',wa_moy 5907 5908 ! determination de l'indice du debut de la mixed layer ou w decroit 5909 5910 ! calcul de la largeur de chaque ascendance dans le cas conservatif. 5911 ! dans ce cas simple, on suppose que la largeur de l'ascendance provenant 5912 ! d'une couche est égale à la hauteur de la couche alimentante. 5913 ! La vitesse maximale dans l'ascendance est aussi prise comme estimation 5914 ! de la vitesse d'entrainement horizontal dans la couche alimentante. 5915 5916 DO l = 2, nlay 5917 DO ig = 1, ngrid 5918 IF (l<=lmaxa(ig)) THEN 5919 zw = max(wa_moy(ig, l), 1.E-10) 5920 larg_cons(ig, l) = zmax(ig) * r_aspect * fmc(ig, l) / (rhobarz(ig, l) * zw) 5921 END IF 5922 END DO 5923 END DO 5924 5925 DO l = 2, nlay 5926 DO ig = 1, ngrid 5927 IF (l<=lmaxa(ig)) THEN 5928 ! if (idetr.EQ.0) THEN 5929 ! cette option est finalement en dur. 5930 IF ((l_mix * zlev(ig, l))<0.) THEN 5931 ! PRINT*,'pb l_mix*zlev<0' 5932 END IF 5933 ! CR: test: nouvelle def de lambda 5934 ! larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l)) 5935 IF (zw2(ig, l)>1.E-10) THEN 5936 larg_detr(ig, l) = sqrt((l_mix / zw2(ig, l)) * zlev(ig, l)) 5937 ELSE 5938 larg_detr(ig, l) = sqrt(l_mix * zlev(ig, l)) 5939 END IF 5940 ! RC 5941 ! ELSE IF (idetr.EQ.1) THEN 5942 ! larg_detr(ig,l)=larg_cons(ig,l) 5943 ! s *sqrt(l_mix*zlev(ig,l))/larg_cons(ig,lmix(ig)) 5944 ! ELSE IF (idetr.EQ.2) THEN 5945 ! larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l)) 5946 ! s *sqrt(wa_moy(ig,l)) 5947 ! ELSE IF (idetr.EQ.4) THEN 5948 ! larg_detr(ig,l)=sqrt(l_mix*zlev(ig,l)) 5949 ! s *wa_moy(ig,l) 5950 ! END IF 5951 END IF 5952 END DO 5953 END DO 5954 5955 ! PRINT*,'10 OK convect8' 5956 ! PRINT*,'WA2 ',wa_moy 5957 ! calcul de la fraction de la maille concernée par l'ascendance en tenant 5958 ! compte de l'epluchage du thermique. 5959 5960 ! CR def de zmix continu (profil parabolique des vitesses) 5961 DO ig = 1, ngrid 5962 IF (lmix(ig)>1.) THEN 5963 ! test 5964 IF (((zw2(ig, lmix(ig) - 1) - zw2(ig, lmix(ig))) * ((zlev(ig, lmix(ig))) - & 5965 (zlev(ig, lmix(ig) + 1))) - (zw2(ig, lmix(ig)) - & 5966 zw2(ig, lmix(ig) + 1)) * ((zlev(ig, lmix(ig) - 1)) - & 5967 (zlev(ig, lmix(ig)))))>1E-10) THEN 5968 5969 zmix(ig) = ((zw2(ig, lmix(ig) - 1) - zw2(ig, lmix(ig))) * ((zlev(ig, lmix(ig)) & 5970 )**2 - (zlev(ig, lmix(ig) + 1))**2) - (zw2(ig, lmix(ig)) - zw2(ig, & 5971 lmix(ig) + 1)) * ((zlev(ig, lmix(ig) - 1))**2 - (zlev(ig, lmix(ig)))**2)) / & 5972 (2. * ((zw2(ig, lmix(ig) - 1) - zw2(ig, lmix(ig))) * ((zlev(ig, lmix(ig))) - & 5973 (zlev(ig, lmix(ig) + 1))) - (zw2(ig, lmix(ig)) - & 5974 zw2(ig, lmix(ig) + 1)) * ((zlev(ig, lmix(ig) - 1)) - (zlev(ig, lmix(ig)))))) 5975 ELSE 5976 zmix(ig) = zlev(ig, lmix(ig)) 5977 ! PRINT*,'pb zmix' 5978 END IF 5979 ELSE 5980 zmix(ig) = 0. 5981 END IF 5982 ! test 5983 IF ((zmax(ig) - zmix(ig))<0.) THEN 5984 zmix(ig) = 0.99 * zmax(ig) 5985 ! PRINT*,'pb zmix>zmax' 5986 END IF 5987 END DO 5988 5989 ! calcul du nouveau lmix correspondant 5990 DO ig = 1, ngrid 5991 DO l = 1, klev 5992 IF (zmix(ig)>=zlev(ig, l) .AND. zmix(ig)<zlev(ig, l + 1)) THEN 5993 lmix(ig) = l 5994 END IF 5995 END DO 5996 END DO 5997 5998 DO l = 2, nlay 5999 DO ig = 1, ngrid 6000 IF (larg_cons(ig, l)>1.) THEN 6001 ! PRINT*,ig,l,lmix(ig),lmaxa(ig),larg_cons(ig,l),' KKK' 6002 fraca(ig, l) = (larg_cons(ig, l) - larg_detr(ig, l)) / (r_aspect * zmax(ig)) 6003 ! test 6004 fraca(ig, l) = max(fraca(ig, l), 0.) 6005 fraca(ig, l) = min(fraca(ig, l), 0.5) 6006 fracd(ig, l) = 1. - fraca(ig, l) 6007 fracc(ig, l) = larg_cons(ig, l) / (r_aspect * zmax(ig)) 6008 ELSE 6009 ! wa_moy(ig,l)=0. 6010 fraca(ig, l) = 0. 6011 fracc(ig, l) = 0. 6012 fracd(ig, l) = 1. 6013 END IF 6014 END DO 6015 END DO 6016 ! CR: calcul de fracazmix 6017 DO ig = 1, ngrid 6018 fracazmix(ig) = (fraca(ig, lmix(ig) + 1) - fraca(ig, lmix(ig))) / & 6019 (zlev(ig, lmix(ig) + 1) - zlev(ig, lmix(ig))) * zmix(ig) + & 6020 fraca(ig, lmix(ig)) - zlev(ig, lmix(ig)) * (fraca(ig, lmix(ig) + 1) - fraca(ig & 6021 , lmix(ig))) / (zlev(ig, lmix(ig) + 1) - zlev(ig, lmix(ig))) 6022 END DO 6023 6024 DO l = 2, nlay 6025 DO ig = 1, ngrid 6026 IF (larg_cons(ig, l)>1.) THEN 6027 IF (l>lmix(ig)) THEN 6028 ! test 6029 IF (zmax(ig) - zmix(ig)<1.E-10) THEN 6030 ! PRINT*,'pb xxx' 6031 xxx(ig, l) = (lmaxa(ig) + 1. - l) / (lmaxa(ig) + 1. - lmix(ig)) 6032 ELSE 6033 xxx(ig, l) = (zmax(ig) - zlev(ig, l)) / (zmax(ig) - zmix(ig)) 6034 END IF 6035 IF (idetr==0) THEN 6036 fraca(ig, l) = fracazmix(ig) 6037 ELSE IF (idetr==1) THEN 6038 fraca(ig, l) = fracazmix(ig) * xxx(ig, l) 6039 ELSE IF (idetr==2) THEN 6040 fraca(ig, l) = fracazmix(ig) * (1. - (1. - xxx(ig, l))**2) 6041 ELSE 6042 fraca(ig, l) = fracazmix(ig) * xxx(ig, l)**2 6043 END IF 6044 ! PRINT*,ig,l,lmix(ig),lmaxa(ig),xxx(ig,l),'LLLLLLL' 6045 fraca(ig, l) = max(fraca(ig, l), 0.) 6046 fraca(ig, l) = min(fraca(ig, l), 0.5) 6047 fracd(ig, l) = 1. - fraca(ig, l) 6048 fracc(ig, l) = larg_cons(ig, l) / (r_aspect * zmax(ig)) 6049 END IF 6050 END IF 6051 END DO 6052 END DO 6053 6054 ! PRINT*,'fin calcul fraca' 6055 ! PRINT*,'11 OK convect8' 6056 ! PRINT*,'Ea3 ',wa_moy 6057 ! ------------------------------------------------------------------ 6058 ! Calcul de fracd, wd 6059 ! somme wa - wd = 0 6060 ! ------------------------------------------------------------------ 6061 6062 DO ig = 1, ngrid 6063 fm(ig, 1) = 0. 6064 fm(ig, nlay + 1) = 0. 6065 END DO 6066 6067 DO l = 2, nlay 6068 DO ig = 1, ngrid 6069 fm(ig, l) = fraca(ig, l) * wa_moy(ig, l) * rhobarz(ig, l) 6070 ! CR:test 6071 IF (entr(ig, l - 1)<1E-10 .AND. fm(ig, l)>fm(ig, l - 1) .AND. l>lmix(ig)) THEN 6072 fm(ig, l) = fm(ig, l - 1) 6073 ! WRITE(1,*)'ajustement fm, l',l 6074 END IF 6075 ! WRITE(1,*)'ig,l,fm(ig,l)',ig,l,fm(ig,l) 6076 ! RC 6077 END DO 6078 DO ig = 1, ngrid 6079 IF (fracd(ig, l)<0.1) THEN 6080 abort_message = 'fracd trop petit' 6081 CALL abort_physic(modname, abort_message, 1) 6082 6083 ELSE 6084 ! vitesse descendante "diagnostique" 6085 wd(ig, l) = fm(ig, l) / (fracd(ig, l) * rhobarz(ig, l)) 6086 END IF 6087 END DO 6088 END DO 6089 6090 DO l = 1, nlay 6091 DO ig = 1, ngrid 6092 ! masse(ig,l)=rho(ig,l)*(zlev(ig,l+1)-zlev(ig,l)) 6093 masse(ig, l) = (pplev(ig, l) - pplev(ig, l + 1)) / rg 6094 END DO 6095 END DO 6096 6097 ! PRINT*,'12 OK convect8' 6098 ! PRINT*,'WA4 ',wa_moy 6099 ! c------------------------------------------------------------------ 6100 ! calcul du transport vertical 6101 ! ------------------------------------------------------------------ 6102 6103 GO TO 4444 6104 ! PRINT*,'XXXXXXXXXXXXXXX ptimestep= ',ptimestep 6105 DO l = 2, nlay - 1 6106 DO ig = 1, ngrid 6107 IF (fm(ig, l + 1) * ptimestep>masse(ig, l) .AND. fm(ig, l + 1) * ptimestep>masse(& 6108 ig, l + 1)) THEN 6109 ! PRINT*,'WARN!!! FM>M ig=',ig,' l=',l,' FM=' 6110 ! s ,fm(ig,l+1)*ptimestep 6111 ! s ,' M=',masse(ig,l),masse(ig,l+1) 6112 END IF 6113 END DO 6114 END DO 6115 6116 DO l = 1, nlay 6117 DO ig = 1, ngrid 6118 IF (entr(ig, l) * ptimestep>masse(ig, l)) THEN 6119 ! PRINT*,'WARN!!! E>M ig=',ig,' l=',l,' E==' 6120 ! s ,entr(ig,l)*ptimestep 6121 ! s ,' M=',masse(ig,l) 6122 END IF 6123 END DO 6124 END DO 6125 6126 DO l = 1, nlay 6127 DO ig = 1, ngrid 6128 IF (.NOT. fm(ig, l)>=0. .OR. .NOT. fm(ig, l)<=10.) THEN 6129 ! PRINT*,'WARN!!! fm exagere ig=',ig,' l=',l 6130 ! s ,' FM=',fm(ig,l) 6131 END IF 6132 IF (.NOT. masse(ig, l)>=1.E-10 .OR. .NOT. masse(ig, l)<=1.E4) THEN 6133 ! PRINT*,'WARN!!! masse exagere ig=',ig,' l=',l 6134 ! s ,' M=',masse(ig,l) 6135 ! PRINT*,'rho(ig,l),pplay(ig,l),zpspsk(ig,l),RD,zh(ig,l)', 6136 ! s rho(ig,l),pplay(ig,l),zpspsk(ig,l),RD,zh(ig,l) 6137 ! PRINT*,'zlev(ig,l+1),zlev(ig,l)' 6138 ! s ,zlev(ig,l+1),zlev(ig,l) 6139 ! PRINT*,'pphi(ig,l-1),pphi(ig,l),pphi(ig,l+1)' 6140 ! s ,pphi(ig,l-1),pphi(ig,l),pphi(ig,l+1) 6141 END IF 6142 IF (.NOT. entr(ig, l)>=0. .OR. .NOT. entr(ig, l)<=10.) THEN 6143 ! PRINT*,'WARN!!! entr exagere ig=',ig,' l=',l 6144 ! s ,' E=',entr(ig,l) 6145 END IF 6146 END DO 6147 END DO 6148 6149 4444 CONTINUE 6150 6151 ! CR:redefinition du entr 6152 DO l = 1, nlay 6153 DO ig = 1, ngrid 6154 detr(ig, l) = fm(ig, l) + entr(ig, l) - fm(ig, l + 1) 6155 IF (detr(ig, l)<0.) THEN 6156 ! entr(ig,l)=entr(ig,l)-detr(ig,l) 6157 fm(ig, l + 1) = fm(ig, l) + entr(ig, l) 6158 detr(ig, l) = 0. 6159 ! PRINT*,'WARNING !!! detrainement negatif ',ig,l 6160 END IF 6161 END DO 6162 END DO 6163 ! RC 6164 IF (w2di==1) THEN 6165 fm0 = fm0 + ptimestep * (fm - fm0) / tho 6166 entr0 = entr0 + ptimestep * (entr - entr0) / tho 6167 ELSE 6168 fm0 = fm 6169 entr0 = entr 6170 END IF 6171 6172 IF (1==1) THEN 6173 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zh, zdhadj, & 6174 zha) 6175 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zo, pdoadj, & 6176 zoa) 6177 ELSE 6178 CALL dqthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca, zh, & 6179 zdhadj, zha) 6180 CALL dqthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca, zo, & 6181 pdoadj, zoa) 6182 END IF 6183 6184 IF (1==0) THEN 6185 CALL dvthermcell2(ngrid, nlay, ptimestep, fm0, entr0, masse, fraca, zmax, & 6186 zu, zv, pduadj, pdvadj, zua, zva) 6187 ELSE 6188 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zu, pduadj, & 6189 zua) 6190 CALL dqthermcell(ngrid, nlay, ptimestep, fm0, entr0, masse, zv, pdvadj, & 6191 zva) 6192 END IF 6193 6194 DO l = 1, nlay 6195 DO ig = 1, ngrid 6196 zf = 0.5 * (fracc(ig, l) + fracc(ig, l + 1)) 6197 zf2 = zf / (1. - zf) 6198 thetath2(ig, l) = zf2 * (zha(ig, l) - zh(ig, l))**2 6199 wth2(ig, l) = zf2 * (0.5 * (wa_moy(ig, l) + wa_moy(ig, l + 1)))**2 6200 END DO 6201 END DO 6202 6203 6204 6205 ! PRINT*,'13 OK convect8' 6206 ! PRINT*,'WA5 ',wa_moy 6207 DO l = 1, nlay 6208 DO ig = 1, ngrid 6209 pdtadj(ig, l) = zdhadj(ig, l) * zpspsk(ig, l) 6210 END DO 6211 END DO 6212 6213 6214 ! do l=1,nlay 6215 ! do ig=1,ngrid 6216 ! IF(abs(pdtadj(ig,l))*86400..gt.500.) THEN 6217 ! PRINT*,'WARN!!! ig=',ig,' l=',l 6218 ! s ,' pdtadj=',pdtadj(ig,l) 6219 ! END IF 6220 ! IF(abs(pdoadj(ig,l))*86400..gt.1.) THEN 6221 ! PRINT*,'WARN!!! ig=',ig,' l=',l 6222 ! s ,' pdoadj=',pdoadj(ig,l) 6223 ! END IF 6224 ! enddo 6225 ! enddo 6226 6227 ! PRINT*,'14 OK convect8' 6228 ! ------------------------------------------------------------------ 6229 ! Calculs pour les sorties 6230 ! ------------------------------------------------------------------ 6231 6232 IF (sorties) THEN 6233 DO l = 1, nlay 6234 DO ig = 1, ngrid 6235 zla(ig, l) = (1. - fracd(ig, l)) * zmax(ig) 6236 zld(ig, l) = fracd(ig, l) * zmax(ig) 6237 IF (1. - fracd(ig, l)>1.E-10) zwa(ig, l) = wd(ig, l) * fracd(ig, l) / & 6238 (1. - fracd(ig, l)) 6239 END DO 6240 END DO 6241 6242 ! deja fait 6243 ! do l=1,nlay 6244 ! do ig=1,ngrid 6245 ! detr(ig,l)=fm(ig,l)+entr(ig,l)-fm(ig,l+1) 6246 ! if (detr(ig,l).lt.0.) THEN 6247 ! entr(ig,l)=entr(ig,l)-detr(ig,l) 6248 ! detr(ig,l)=0. 6249 ! PRINT*,'WARNING !!! detrainement negatif ',ig,l 6250 ! END IF 6251 ! enddo 6252 ! enddo 6253 6254 ! PRINT*,'15 OK convect8' 6255 6256 isplit = isplit + 1 6257 6258 6259 ! #define und 6260 GO TO 123 6289 6261 #ifdef und 6290 6262 CALL writeg1d(1, nlay, wd, 'wd ', 'wd ') … … 6322 6294 CALL writeg1d(1, nlay, wh, 'wh2 ', 'wh2 ') 6323 6295 #endif 6324 123 CONTINUE 6325 6326 END IF 6327 6328 ! IF(wa_moy(1,4).gt.1.e-10) stop 6329 6330 ! PRINT*,'19 OK convect8' 6331 6332 END SUBROUTINE calcul_sec 6333 6334 SUBROUTINE fermeture_seche(ngrid, nlay, pplay, pplev, pphi, zlev, rhobarz, & 6335 f0, zpspsk, alim_star, zh, zo, lentr, lmin, nu_min, nu_max, r_aspect, & 6336 zmax, wmax) 6337 6338 USE dimphy 6339 IMPLICIT NONE 6340 6341 include "YOMCST.h" 6342 6343 INTEGER ngrid, nlay 6344 REAL pplay(ngrid, nlay), pplev(ngrid, nlay+1) 6345 REAL pphi(ngrid, nlay) 6346 REAL zlev(klon, klev+1) 6347 REAL alim_star(klon, klev) 6348 REAL f0(klon) 6349 INTEGER lentr(klon) 6350 INTEGER lmin(klon) 6351 REAL zmax(klon) 6352 REAL wmax(klon) 6353 REAL nu_min 6354 REAL nu_max 6355 REAL r_aspect 6356 REAL rhobarz(klon, klev+1) 6357 REAL zh(klon, klev) 6358 REAL zo(klon, klev) 6359 REAL zpspsk(klon, klev) 6360 6361 INTEGER ig, l 6362 6363 REAL f_star(klon, klev+1) 6364 REAL detr_star(klon, klev) 6365 REAL entr_star(klon, klev) 6366 REAL zw2(klon, klev+1) 6367 REAL linter(klon) 6368 INTEGER lmix(klon) 6369 INTEGER lmax(klon) 6370 REAL zlevinter(klon) 6371 REAL wa_moy(klon, klev+1) 6372 REAL wmaxa(klon) 6373 REAL ztv(klon, klev) 6374 REAL ztva(klon, klev) 6375 REAL nu(klon, klev) 6376 ! real zmax0_sec(klon) 6377 ! save zmax0_sec 6378 REAL, SAVE, ALLOCATABLE :: zmax0_sec(:) 6379 !$OMP THREADPRIVATE(zmax0_sec) 6380 LOGICAL, SAVE :: first = .TRUE. 6381 !$OMP THREADPRIVATE(first) 6382 6383 IF (first) THEN 6384 ALLOCATE (zmax0_sec(klon)) 6385 first = .FALSE. 6386 END IF 6387 6388 DO l = 1, nlay 6389 DO ig = 1, ngrid 6390 ztv(ig, l) = zh(ig, l)/zpspsk(ig, l) 6391 ztv(ig, l) = ztv(ig, l)*(1.+retv*zo(ig,l)) 6392 END DO 6393 END DO 6394 DO l = 1, nlay - 2 6395 DO ig = 1, ngrid 6396 IF (ztv(ig,l)>ztv(ig,l+1) .AND. alim_star(ig,l)>1.E-10 .AND. & 6397 zw2(ig,l)<1E-10) THEN 6398 f_star(ig, l+1) = alim_star(ig, l) 6399 ! test:calcul de dteta 6400 zw2(ig, l+1) = 2.*rg*(ztv(ig,l)-ztv(ig,l+1))/ztv(ig, l+1)* & 6401 (zlev(ig,l+1)-zlev(ig,l))*0.4*pphi(ig, l)/(pphi(ig,l+1)-pphi(ig,l)) 6402 ELSE IF ((zw2(ig,l)>=1E-10) .AND. (f_star(ig,l)+alim_star(ig, & 6403 l))>1.E-10) THEN 6404 ! estimation du detrainement a partir de la geometrie du pas 6405 ! precedent 6406 ! tests sur la definition du detr 6407 nu(ig, l) = (nu_min+nu_max)/2.*(1.-(nu_max-nu_min)/(nu_max+nu_min)* & 6408 tanh((((ztva(ig,l-1)-ztv(ig,l))/ztv(ig,l))/0.0005))) 6409 6410 detr_star(ig, l) = rhobarz(ig, l)*sqrt(zw2(ig,l))/ & 6411 (r_aspect*zmax0_sec(ig))* & ! s 6412 ! /(r_aspect*zmax0(ig))* 6413 (sqrt(nu(ig,l)*zlev(ig,l+1)/sqrt(zw2(ig,l)))-sqrt(nu(ig,l)*zlev(ig, & 6414 l)/sqrt(zw2(ig,l)))) 6415 detr_star(ig, l) = detr_star(ig, l)/f0(ig) 6416 IF ((detr_star(ig,l))>f_star(ig,l)) THEN 6417 detr_star(ig, l) = f_star(ig, l) 6418 END IF 6419 entr_star(ig, l) = 0.9*detr_star(ig, l) 6420 IF ((l<lentr(ig))) THEN 6421 entr_star(ig, l) = 0. 6422 ! detr_star(ig,l)=0. 6423 END IF 6424 ! PRINT*,'ok detr_star' 6425 ! prise en compte du detrainement dans le calcul du flux 6426 f_star(ig, l+1) = f_star(ig, l) + alim_star(ig, l) + & 6427 entr_star(ig, l) - detr_star(ig, l) 6428 ! test sur le signe de f_star 6429 IF ((f_star(ig,l+1)+detr_star(ig,l))>1.E-10) THEN 6430 ! AM on melange Tl et qt du thermique 6431 ztva(ig, l) = (f_star(ig,l)*ztva(ig,l-1)+(entr_star(ig, & 6432 l)+alim_star(ig,l))*ztv(ig,l))/(f_star(ig,l+1)+detr_star(ig,l)) 6433 zw2(ig, l+1) = zw2(ig, l)*(f_star(ig,l)/(f_star(ig, & 6434 l+1)+detr_star(ig,l)))**2 + 2.*rg*(ztva(ig,l)-ztv(ig,l))/ztv(ig, & 6435 l)*(zlev(ig,l+1)-zlev(ig,l)) 6436 END IF 6296 123 CONTINUE 6297 6298 END IF 6299 6300 ! IF(wa_moy(1,4).gt.1.e-10) stop 6301 6302 ! PRINT*,'19 OK convect8' 6303 6304 END SUBROUTINE calcul_sec 6305 6306 SUBROUTINE fermeture_seche(ngrid, nlay, pplay, pplev, pphi, zlev, rhobarz, & 6307 f0, zpspsk, alim_star, zh, zo, lentr, lmin, nu_min, nu_max, r_aspect, & 6308 zmax, wmax) 6309 6310 USE dimphy 6311 IMPLICIT NONE 6312 6313 include "YOMCST.h" 6314 6315 INTEGER ngrid, nlay 6316 REAL pplay(ngrid, nlay), pplev(ngrid, nlay + 1) 6317 REAL pphi(ngrid, nlay) 6318 REAL zlev(klon, klev + 1) 6319 REAL alim_star(klon, klev) 6320 REAL f0(klon) 6321 INTEGER lentr(klon) 6322 INTEGER lmin(klon) 6323 REAL zmax(klon) 6324 REAL wmax(klon) 6325 REAL nu_min 6326 REAL nu_max 6327 REAL r_aspect 6328 REAL rhobarz(klon, klev + 1) 6329 REAL zh(klon, klev) 6330 REAL zo(klon, klev) 6331 REAL zpspsk(klon, klev) 6332 6333 INTEGER ig, l 6334 6335 REAL f_star(klon, klev + 1) 6336 REAL detr_star(klon, klev) 6337 REAL entr_star(klon, klev) 6338 REAL zw2(klon, klev + 1) 6339 REAL linter(klon) 6340 INTEGER lmix(klon) 6341 INTEGER lmax(klon) 6342 REAL zlevinter(klon) 6343 REAL wa_moy(klon, klev + 1) 6344 REAL wmaxa(klon) 6345 REAL ztv(klon, klev) 6346 REAL ztva(klon, klev) 6347 REAL nu(klon, klev) 6348 ! real zmax0_sec(klon) 6349 ! save zmax0_sec 6350 REAL, SAVE, ALLOCATABLE :: zmax0_sec(:) 6351 !$OMP THREADPRIVATE(zmax0_sec) 6352 LOGICAL, SAVE :: first = .TRUE. 6353 !$OMP THREADPRIVATE(first) 6354 6355 IF (first) THEN 6356 ALLOCATE (zmax0_sec(klon)) 6357 first = .FALSE. 6358 END IF 6359 6360 DO l = 1, nlay 6361 DO ig = 1, ngrid 6362 ztv(ig, l) = zh(ig, l) / zpspsk(ig, l) 6363 ztv(ig, l) = ztv(ig, l) * (1. + retv * zo(ig, l)) 6364 END DO 6365 END DO 6366 DO l = 1, nlay - 2 6367 DO ig = 1, ngrid 6368 IF (ztv(ig, l)>ztv(ig, l + 1) .AND. alim_star(ig, l)>1.E-10 .AND. & 6369 zw2(ig, l)<1E-10) THEN 6370 f_star(ig, l + 1) = alim_star(ig, l) 6371 ! test:calcul de dteta 6372 zw2(ig, l + 1) = 2. * rg * (ztv(ig, l) - ztv(ig, l + 1)) / ztv(ig, l + 1) * & 6373 (zlev(ig, l + 1) - zlev(ig, l)) * 0.4 * pphi(ig, l) / (pphi(ig, l + 1) - pphi(ig, l)) 6374 ELSE IF ((zw2(ig, l)>=1E-10) .AND. (f_star(ig, l) + alim_star(ig, & 6375 l))>1.E-10) THEN 6376 ! estimation du detrainement a partir de la geometrie du pas 6377 ! precedent 6378 ! tests sur la definition du detr 6379 nu(ig, l) = (nu_min + nu_max) / 2. * (1. - (nu_max - nu_min) / (nu_max + nu_min) * & 6380 tanh((((ztva(ig, l - 1) - ztv(ig, l)) / ztv(ig, l)) / 0.0005))) 6381 6382 detr_star(ig, l) = rhobarz(ig, l) * sqrt(zw2(ig, l)) / & 6383 (r_aspect * zmax0_sec(ig)) * & ! s 6384 ! /(r_aspect*zmax0(ig))* 6385 (sqrt(nu(ig, l) * zlev(ig, l + 1) / sqrt(zw2(ig, l))) - sqrt(nu(ig, l) * zlev(ig, & 6386 l) / sqrt(zw2(ig, l)))) 6387 detr_star(ig, l) = detr_star(ig, l) / f0(ig) 6388 IF ((detr_star(ig, l))>f_star(ig, l)) THEN 6389 detr_star(ig, l) = f_star(ig, l) 6390 END IF 6391 entr_star(ig, l) = 0.9 * detr_star(ig, l) 6392 IF ((l<lentr(ig))) THEN 6393 entr_star(ig, l) = 0. 6394 ! detr_star(ig,l)=0. 6395 END IF 6396 ! PRINT*,'ok detr_star' 6397 ! prise en compte du detrainement dans le calcul du flux 6398 f_star(ig, l + 1) = f_star(ig, l) + alim_star(ig, l) + & 6399 entr_star(ig, l) - detr_star(ig, l) 6400 ! test sur le signe de f_star 6401 IF ((f_star(ig, l + 1) + detr_star(ig, l))>1.E-10) THEN 6402 ! AM on melange Tl et qt du thermique 6403 ztva(ig, l) = (f_star(ig, l) * ztva(ig, l - 1) + (entr_star(ig, & 6404 l) + alim_star(ig, l)) * ztv(ig, l)) / (f_star(ig, l + 1) + detr_star(ig, l)) 6405 zw2(ig, l + 1) = zw2(ig, l) * (f_star(ig, l) / (f_star(ig, & 6406 l + 1) + detr_star(ig, l)))**2 + 2. * rg * (ztva(ig, l) - ztv(ig, l)) / ztv(ig, & 6407 l) * (zlev(ig, l + 1) - zlev(ig, l)) 6408 END IF 6409 END IF 6410 6411 IF (zw2(ig, l + 1)<0.) THEN 6412 linter(ig) = (l * (zw2(ig, l + 1) - zw2(ig, l)) - zw2(ig, l)) / (zw2(ig, l + 1) - zw2(& 6413 ig, l)) 6414 zw2(ig, l + 1) = 0. 6415 ! PRINT*,'linter=',linter(ig) 6416 ELSE 6417 wa_moy(ig, l + 1) = sqrt(zw2(ig, l + 1)) 6418 END IF 6419 IF (wa_moy(ig, l + 1)>wmaxa(ig)) THEN 6420 ! lmix est le niveau de la couche ou w (wa_moy) est maximum 6421 lmix(ig) = l + 1 6422 wmaxa(ig) = wa_moy(ig, l + 1) 6423 END IF 6424 END DO 6425 END DO 6426 ! PRINT*,'fin calcul zw2' 6427 6428 ! Calcul de la couche correspondant a la hauteur du thermique 6429 DO ig = 1, ngrid 6430 lmax(ig) = lentr(ig) 6431 END DO 6432 DO ig = 1, ngrid 6433 DO l = nlay, lentr(ig) + 1, -1 6434 IF (zw2(ig, l)<=1.E-10) THEN 6435 lmax(ig) = l - 1 6436 END IF 6437 END DO 6438 END DO 6439 ! pas de thermique si couche 1 stable 6440 DO ig = 1, ngrid 6441 IF (lmin(ig)>1) THEN 6442 lmax(ig) = 1 6443 lmin(ig) = 1 6444 lentr(ig) = 1 6437 6445 END IF 6438 6439 IF (zw2(ig,l+1)<0.) THEN 6440 linter(ig) = (l*(zw2(ig,l+1)-zw2(ig,l))-zw2(ig,l))/(zw2(ig,l+1)-zw2( & 6441 ig,l)) 6442 zw2(ig, l+1) = 0. 6443 ! PRINT*,'linter=',linter(ig) 6444 ELSE 6445 wa_moy(ig, l+1) = sqrt(zw2(ig,l+1)) 6446 END IF 6447 IF (wa_moy(ig,l+1)>wmaxa(ig)) THEN 6448 ! lmix est le niveau de la couche ou w (wa_moy) est maximum 6449 lmix(ig) = l + 1 6450 wmaxa(ig) = wa_moy(ig, l+1) 6451 END IF 6452 END DO 6453 END DO 6454 ! PRINT*,'fin calcul zw2' 6455 6456 ! Calcul de la couche correspondant a la hauteur du thermique 6457 DO ig = 1, ngrid 6458 lmax(ig) = lentr(ig) 6459 END DO 6460 DO ig = 1, ngrid 6461 DO l = nlay, lentr(ig) + 1, -1 6462 IF (zw2(ig,l)<=1.E-10) THEN 6463 lmax(ig) = l - 1 6464 END IF 6465 END DO 6466 END DO 6467 ! pas de thermique si couche 1 stable 6468 DO ig = 1, ngrid 6469 IF (lmin(ig)>1) THEN 6470 lmax(ig) = 1 6471 lmin(ig) = 1 6472 lentr(ig) = 1 6473 END IF 6474 END DO 6475 6476 ! Determination de zw2 max 6477 DO ig = 1, ngrid 6478 wmax(ig) = 0. 6479 END DO 6480 6481 DO l = 1, nlay 6482 DO ig = 1, ngrid 6483 IF (l<=lmax(ig)) THEN 6484 IF (zw2(ig,l)<0.) THEN 6485 ! PRINT*,'pb2 zw2<0' 6486 END IF 6487 zw2(ig, l) = sqrt(zw2(ig,l)) 6488 wmax(ig) = max(wmax(ig), zw2(ig,l)) 6489 ELSE 6490 zw2(ig, l) = 0. 6491 END IF 6492 END DO 6493 END DO 6494 6495 ! Longueur caracteristique correspondant a la hauteur des thermiques. 6496 DO ig = 1, ngrid 6497 zmax(ig) = 0. 6498 zlevinter(ig) = zlev(ig, 1) 6499 END DO 6500 DO ig = 1, ngrid 6501 ! calcul de zlevinter 6502 zlevinter(ig) = (zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig)))*linter(ig) + & 6503 zlev(ig, lmax(ig)) - lmax(ig)*(zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig))) 6504 ! pour le cas ou on prend tjs lmin=1 6505 ! zmax(ig)=max(zmax(ig),zlevinter(ig)-zlev(ig,lmin(ig))) 6506 zmax(ig) = max(zmax(ig), zlevinter(ig)-zlev(ig,1)) 6507 zmax0_sec(ig) = zmax(ig) 6508 END DO 6509 6510 6511 END SUBROUTINE fermeture_seche 6446 END DO 6447 6448 ! Determination de zw2 max 6449 DO ig = 1, ngrid 6450 wmax(ig) = 0. 6451 END DO 6452 6453 DO l = 1, nlay 6454 DO ig = 1, ngrid 6455 IF (l<=lmax(ig)) THEN 6456 IF (zw2(ig, l)<0.) THEN 6457 ! PRINT*,'pb2 zw2<0' 6458 END IF 6459 zw2(ig, l) = sqrt(zw2(ig, l)) 6460 wmax(ig) = max(wmax(ig), zw2(ig, l)) 6461 ELSE 6462 zw2(ig, l) = 0. 6463 END IF 6464 END DO 6465 END DO 6466 6467 ! Longueur caracteristique correspondant a la hauteur des thermiques. 6468 DO ig = 1, ngrid 6469 zmax(ig) = 0. 6470 zlevinter(ig) = zlev(ig, 1) 6471 END DO 6472 DO ig = 1, ngrid 6473 ! calcul de zlevinter 6474 zlevinter(ig) = (zlev(ig, lmax(ig) + 1) - zlev(ig, lmax(ig))) * linter(ig) + & 6475 zlev(ig, lmax(ig)) - lmax(ig) * (zlev(ig, lmax(ig) + 1) - zlev(ig, lmax(ig))) 6476 ! pour le cas ou on prend tjs lmin=1 6477 ! zmax(ig)=max(zmax(ig),zlevinter(ig)-zlev(ig,lmin(ig))) 6478 zmax(ig) = max(zmax(ig), zlevinter(ig) - zlev(ig, 1)) 6479 zmax0_sec(ig) = zmax(ig) 6480 END DO 6481 6482 END SUBROUTINE fermeture_seche 6512 6483 6513 6484 END MODULE lmdz_thermcell_old -
LMDZ6/branches/Amaury_dev/libf/phylmd/lmdz_thermcell_plume.f90
r5117 r5119 431 431 IF (prt_level>=20) PRINT*, 'coucou calcul detr 470: ig, l', ig, l 432 432 RETURN 433 end433 END 434 434 END MODULE lmdz_thermcell_plume -
LMDZ6/branches/Amaury_dev/libf/phylmd/lmdz_thermcell_plume_6A.f90
r5117 r5119 1056 1056 1057 1057 IF (prt_level>=20) PRINT*, 'coucou calcul detr 470: ig, l', ig, l 1058 end1058 END 1059 1059 END MODULE lmdz_thermcell_plume_6A -
LMDZ6/branches/Amaury_dev/libf/phylmd/lmdz_thermcell_qsat.F90
r5117 r5119 96 96 97 97 RETURN 98 end 98 END 99 99 END MODULE lmdz_thermcell_qsat -
LMDZ6/branches/Amaury_dev/libf/phylmd/lmdz_yomcst.f90
r5098 r5119 39 39 !$OMP THREADPRIVATE(/YOMCST/) 40 40 41 end modulelmdz_yomcst41 END MODULE lmdz_yomcst -
LMDZ6/branches/Amaury_dev/libf/phylmd/o3_chem_m.F90
r5117 r5119 6 6 PRIVATE o3_prod 7 7 8 contains 8 CONTAINS 9 9 10 10 SUBROUTINE o3_chem(julien, gmtime, t_seri, zmasse, pdtphys, rlat, rlon, q) … … 169 169 END FUNCTION o3_prod 170 170 171 end moduleo3_chem_m171 END MODULE o3_chem_m -
LMDZ6/branches/Amaury_dev/libf/phylmd/ozonecm_m.F90
r5117 r5119 4 4 IMPLICIT NONE 5 5 6 contains 6 CONTAINS 7 7 8 8 function ozonecm(rlat, paprs,read_climoz, rjour) … … 95 95 END function ozonecm 96 96 97 end moduleozonecm_m97 END MODULE ozonecm_m -
LMDZ6/branches/Amaury_dev/libf/phylmd/press_coefoz_m.F90
r5117 r5119 12 12 ! ascending order) 13 13 14 contains 14 CONTAINS 15 15 16 16 SUBROUTINE press_coefoz … … 72 72 END SUBROUTINE press_coefoz 73 73 74 end modulepress_coefoz_m74 END MODULE press_coefoz_m -
LMDZ6/branches/Amaury_dev/libf/phylmd/radiation_ar4_param.F90
r5117 r5119 241 241 REAL(KIND=8), DIMENSION(4), parameter :: OCT = (/ -.326E-03, -.102E-05, .137E-02, -.535E-05 /) 242 242 243 end moduleradiation_AR4_param243 END MODULE radiation_AR4_param -
LMDZ6/branches/Amaury_dev/libf/phylmd/radlwsw_m.F90
r5117 r5119 5 5 IMPLICIT NONE 6 6 7 contains 7 CONTAINS 8 8 9 9 SUBROUTINE radlwsw(& … … 1710 1710 END SUBROUTINE radlwsw 1711 1711 1712 end moduleradlwsw_m1712 END MODULE radlwsw_m -
LMDZ6/branches/Amaury_dev/libf/phylmd/regr_lat_time_coefoz_m.F90
r5117 r5119 9 9 public regr_lat_time_coefoz 10 10 11 contains 11 CONTAINS 12 12 13 13 SUBROUTINE regr_lat_time_coefoz … … 324 324 ! (convert from rad to degrees and sort in ascending order) 325 325 326 contains 326 CONTAINS 327 327 328 328 SUBROUTINE handle_err_copy_att(att_name) … … 344 344 END SUBROUTINE prepare_out 345 345 346 end moduleregr_lat_time_coefoz_m346 END MODULE regr_lat_time_coefoz_m -
LMDZ6/branches/Amaury_dev/libf/phylmd/regr_pr_comb_coefoz_m.F90
r5117 r5119 32 32 !$omp threadprivate(c_Mob, a2, a4_mass, a6_mass, r_het_interm) 33 33 34 contains 34 CONTAINS 35 35 36 36 SUBROUTINE alloc_coefoz … … 161 161 END SUBROUTINE regr_pr_comb_coefoz 162 162 163 end moduleregr_pr_comb_coefoz_m163 END MODULE regr_pr_comb_coefoz_m -
LMDZ6/branches/Amaury_dev/libf/phylmd/regr_pr_int_m.F90
r5117 r5119 6 6 IMPLICIT NONE 7 7 8 contains 8 CONTAINS 9 9 10 10 SUBROUTINE regr_pr_int(ncid, name, julien, plev, pplay, top_value, v3) … … 102 102 END SUBROUTINE regr_pr_int 103 103 104 end moduleregr_pr_int_m104 END MODULE regr_pr_int_m -
LMDZ6/branches/Amaury_dev/libf/phylmd/regr_pr_o3_m.F90
r5117 r5119 4 4 IMPLICIT NONE 5 5 6 contains 6 CONTAINS 7 7 8 8 SUBROUTINE regr_pr_o3(p3d, o3_mob_regr) … … 98 98 END SUBROUTINE regr_pr_o3 99 99 100 end moduleregr_pr_o3_m100 END MODULE regr_pr_o3_m -
LMDZ6/branches/Amaury_dev/libf/phylmd/simu_airs.F90
r5117 r5119 12 12 REAL, PARAMETER :: undef = 999. 13 13 14 contains 14 CONTAINS 15 15 16 16 REAL function search_tropopause(P, T, alt, N) result(P_tropo) … … 1097 1097 END SUBROUTINE test_bornes 1098 1098 1099 end modulem_simu_airs1099 END MODULE m_simu_airs 1100 1100 1101 1101 -
LMDZ6/branches/Amaury_dev/libf/phylmd/slab_heat_transp_mod.F90
r5117 r5119 890 890 SUBROUTINE gr_fi_dyn(nfield, im, jm, pfi, pdyn) 891 891 ! Transfer a variable from 1D "physics" grid to 2D "dynamics" grid 892 USE lmdz_ssum_scopy, ONLY: scopy 893 892 894 IMPLICIT NONE 893 895 … … 916 918 SUBROUTINE gr_dyn_fi(nfield, im, jm, pdyn, pfi) 917 919 ! Transfer a variable from 2D "dynamics" grid to 1D "physics" grid 920 USE lmdz_ssum_scopy, ONLY: scopy 918 921 IMPLICIT NONE 919 922 … … 1100 1103 ! convert values from scalar points to U points on C-grid 1101 1104 ! used to compute wind stress at U points 1105 USE lmdz_ssum_scopy, ONLY: scopy 1106 1102 1107 IMPLICIT NONE 1103 1108
Note: See TracChangeset
for help on using the changeset viewer.