Changeset 5119 for LMDZ6/branches/Amaury_dev/libf/dyn3d
- Timestamp:
- Jul 24, 2024, 6:46:45 PM (6 months ago)
- Location:
- LMDZ6/branches/Amaury_dev/libf/dyn3d
- Files:
-
- 8 edited
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
Note: See TracChangeset
for help on using the changeset viewer.