Changeset 5118 for LMDZ6/branches/Amaury_dev/libf/dyn3d_common/advn.f90
- Timestamp:
- Jul 24, 2024, 4:39:59 PM (3 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/branches/Amaury_dev/libf/dyn3d_common/advn.f90
r5117 r5118 1 2 1 ! $Header$ 3 2 4 SUBROUTINE advn(q, masse,w,pbaru,pbarv,pdt,mode)3 SUBROUTINE advn(q, masse, w, pbaru, pbarv, pdt, mode) 5 4 ! 6 5 ! Auteur : F. Hourdin … … 15 14 ! 16 15 ! -------------------------------------------------------------------- 16 USE lmdz_iniprint, ONLY: lunout, prt_level 17 17 IMPLICIT NONE 18 18 ! … … 20 20 include "paramet.h" 21 21 include "comgeom.h" 22 include "iniprint.h"23 22 24 23 ! … … 26 25 ! ---------- 27 26 INTEGER :: mode 28 REAL :: masse(ip1jmp1, llm)29 REAL :: pbaru( ip1jmp1,llm ),pbarv( ip1jm,llm)30 REAL :: q(ip1jmp1, llm)31 REAL :: w(ip1jmp1, llm),pdt27 REAL :: masse(ip1jmp1, llm) 28 REAL :: pbaru(ip1jmp1, llm), pbarv(ip1jm, llm) 29 REAL :: q(ip1jmp1, llm) 30 REAL :: w(ip1jmp1, llm), pdt 32 31 ! 33 32 ! Local 34 33 ! --------- 35 34 ! 36 INTEGER :: i, ij,l,j,ii37 INTEGER :: ijlqmin, iqmin,jqmin,lqmin35 INTEGER :: i, ij, l, j, ii 36 INTEGER :: ijlqmin, iqmin, jqmin, lqmin 38 37 INTEGER :: ismin 39 38 ! 40 REAL :: zm(ip1jmp1, llm),newmasse41 REAL :: mu(ip1jmp1, llm)42 REAL :: mv(ip1jm, llm)43 REAL :: mw(ip1jmp1, llm+1)44 REAL :: zq(ip1jmp1, llm),zz,qpn,qps45 REAL :: zqg(ip1jmp1, llm),zqd(ip1jmp1,llm)46 REAL :: zqs(ip1jmp1, llm),zqn(ip1jmp1,llm)47 REAL :: zqh(ip1jmp1, llm),zqb(ip1jmp1,llm)48 REAL :: temps0, temps1,temps2,temps349 REAL :: ztemps1, ztemps2,ssum50 save temps1, temps2,temps351 REAL :: zzpbar, zzw52 53 REAL :: qmin, qmax54 data qmin, qmax/0.,1./55 data temps1, temps2,temps3/0.,0.,0./39 REAL :: zm(ip1jmp1, llm), newmasse 40 REAL :: mu(ip1jmp1, llm) 41 REAL :: mv(ip1jm, llm) 42 REAL :: mw(ip1jmp1, llm + 1) 43 REAL :: zq(ip1jmp1, llm), zz, qpn, qps 44 REAL :: zqg(ip1jmp1, llm), zqd(ip1jmp1, llm) 45 REAL :: zqs(ip1jmp1, llm), zqn(ip1jmp1, llm) 46 REAL :: zqh(ip1jmp1, llm), zqb(ip1jmp1, llm) 47 REAL :: temps0, temps1, temps2, temps3 48 REAL :: ztemps1, ztemps2, ssum 49 save temps1, temps2, temps3 50 REAL :: zzpbar, zzw 51 52 REAL :: qmin, qmax 53 data qmin, qmax/0., 1./ 54 data temps1, temps2, temps3/0., 0., 0./ 56 55 57 56 zzpbar = 0.5 * pdt 58 zzw 59 60 DO l =1,llm61 DO ij = iip2, ip1jm62 mu(ij,l)=pbaru(ij,l) * zzpbar63 64 DO ij=1,ip1jm65 mv(ij,l)=pbarv(ij,l) * zzpbar66 67 DO ij=1,ip1jmp168 mw(ij,l)=w(ij,l) * zzw69 57 zzw = pdt 58 59 DO l = 1, llm 60 DO ij = iip2, ip1jm 61 mu(ij, l) = pbaru(ij, l) * zzpbar 62 ENDDO 63 DO ij = 1, ip1jm 64 mv(ij, l) = pbarv(ij, l) * zzpbar 65 ENDDO 66 DO ij = 1, ip1jmp1 67 mw(ij, l) = w(ij, l) * zzw 68 ENDDO 70 69 ENDDO 71 70 72 DO ij =1,ip1jmp173 mw(ij,llm+1)=0.71 DO ij = 1, ip1jmp1 72 mw(ij, llm + 1) = 0. 74 73 ENDDO 75 74 76 do l =1,llm77 qpn=0.78 qps=0.79 do ij=1,iim80 qpn=qpn+q(ij,l)*masse(ij,l)81 qps=qps+q(ip1jm+ij,l)*masse(ip1jm+ij,l)82 83 qpn=qpn/ssum(iim,masse(1,l),1)84 qps=qps/ssum(iim,masse(ip1jm+1,l),1)85 do ij=1,iip186 q(ij,l)=qpn87 q(ip1jm+ij,l)=qps88 89 enddo 90 91 do ij =1,ip1jmp192 mw(ij,llm+1)=0.93 enddo 94 do l =1,llm95 do ij=1,ip1jmp196 zq(ij,l)=q(ij,l)97 zm(ij,l)=masse(ij,l)98 75 do l = 1, llm 76 qpn = 0. 77 qps = 0. 78 do ij = 1, iim 79 qpn = qpn + q(ij, l) * masse(ij, l) 80 qps = qps + q(ip1jm + ij, l) * masse(ip1jm + ij, l) 81 enddo 82 qpn = qpn / ssum(iim, masse(1, l), 1) 83 qps = qps / ssum(iim, masse(ip1jm + 1, l), 1) 84 do ij = 1, iip1 85 q(ij, l) = qpn 86 q(ip1jm + ij, l) = qps 87 enddo 88 enddo 89 90 do ij = 1, ip1jmp1 91 mw(ij, llm + 1) = 0. 92 enddo 93 do l = 1, llm 94 do ij = 1, ip1jmp1 95 zq(ij, l) = q(ij, l) 96 zm(ij, l) = masse(ij, l) 97 enddo 99 98 enddo 100 99 101 100 ! CALL minmaxq(zq,qmin,qmax,'avant vlx ') 102 CALL advnqx(zq, zqg,zqd)103 CALL advnx(zq, zqg,zqd,zm,mu,mode)104 CALL advnqy(zq, zqs,zqn)105 CALL advny(zq, zqs,zqn,zm,mv)106 CALL advnqz(zq, zqh,zqb)107 CALL advnz(zq, zqh,zqb,zm,mw)101 CALL advnqx(zq, zqg, zqd) 102 CALL advnx(zq, zqg, zqd, zm, mu, mode) 103 CALL advnqy(zq, zqs, zqn) 104 CALL advny(zq, zqs, zqn, zm, mv) 105 CALL advnqz(zq, zqh, zqb) 106 CALL advnz(zq, zqh, zqb, zm, mw) 108 107 ! CALL vlz(zq,0.,zm,mw) 109 CALL advnqy(zq, zqs,zqn)110 CALL advny(zq, zqs,zqn,zm,mv)111 CALL advnqx(zq, zqg,zqd)112 CALL advnx(zq, zqg,zqd,zm,mu,mode)108 CALL advnqy(zq, zqs, zqn) 109 CALL advny(zq, zqs, zqn, zm, mv) 110 CALL advnqx(zq, zqg, zqd) 111 CALL advnx(zq, zqg, zqd, zm, mu, mode) 113 112 ! CALL minmaxq(zq,qmin,qmax,'apres vlx ') 114 113 115 do l =1,llm116 do ij=1,ip1jmp1117 q(ij,l)=zq(ij,l)118 119 do ij=1,ip1jm+1,iip1120 q(ij+iim,l)=q(ij,l)121 114 do l = 1, llm 115 do ij = 1, ip1jmp1 116 q(ij, l) = zq(ij, l) 117 enddo 118 do ij = 1, ip1jm + 1, iip1 119 q(ij + iim, l) = q(ij, l) 120 enddo 122 121 enddo 123 122 … … 125 124 END SUBROUTINE advn 126 125 127 SUBROUTINE advnqx(q, qg,qd)126 SUBROUTINE advnqx(q, qg, qd) 128 127 ! 129 128 ! Auteurs: Calcul des valeurs de q aux point u. 130 129 ! 131 130 ! -------------------------------------------------------------------- 131 USE lmdz_iniprint, ONLY: lunout, prt_level 132 132 IMPLICIT NONE 133 133 ! 134 134 INCLUDE "dimensions.h" 135 135 INCLUDE "paramet.h" 136 INCLUDE "iniprint.h"137 136 ! 138 137 ! 139 138 ! Arguments: 140 139 ! ---------- 141 REAL :: q(ip1jmp1, llm),qg(ip1jmp1,llm),qd(ip1jmp1,llm)140 REAL :: q(ip1jmp1, llm), qg(ip1jmp1, llm), qd(ip1jmp1, llm) 142 141 ! 143 142 ! Local 144 143 ! --------- 145 144 ! 146 INTEGER :: ij, l147 ! 148 REAL :: dxqu(ip1jmp1), zqu(ip1jmp1)149 REAL :: zqmax(ip1jmp1), zqmin(ip1jmp1)145 INTEGER :: ij, l 146 ! 147 REAL :: dxqu(ip1jmp1), zqu(ip1jmp1) 148 REAL :: zqmax(ip1jmp1), zqmin(ip1jmp1) 150 149 LOGICAL :: extremum(ip1jmp1) 151 150 … … 157 156 ! ----------------------- 158 157 IF (mode==0) THEN 159 do l=1,llm160 do ij=1,ip1jm161 qd(ij,l)=q(ij,l)162 qg(ij,l)=q(ij,l)163 164 158 do l = 1, llm 159 do ij = 1, ip1jm 160 qd(ij, l) = q(ij, l) 161 qg(ij, l) = q(ij, l) 162 enddo 163 enddo 165 164 else 166 do l = 1, llm167 do ij=iip2,ip1jm-1168 dxqu(ij) =q(ij+1,l)-q(ij,l)169 zqu(ij) =0.5*(q(ij+1,l)+q(ij,l))170 enddo171 do ij=iip1+iip1,ip1jm,iip1172 dxqu(ij) =dxqu(ij-iim)173 zqu(ij) =zqu(ij-iim)174 enddo175 do ij=iip2,ip1jm-1176 zqu(ij) =zqu(ij)-dxqu(ij+1)/12.177 enddo178 do ij=iip1+iip1,ip1jm,iip1179 zqu(ij) =zqu(ij-iim)180 enddo181 do ij=iip2+1,ip1jm182 zqu(ij) =zqu(ij)+dxqu(ij-1)/12.183 enddo184 do ij=iip1+iip1,ip1jm,iip1185 zqu(ij -iim)=zqu(ij)186 enddo187 188 ! calcul des valeurs max et min acceptees aux interfaces189 190 do ij=iip2,ip1jm-1191 zqmax(ij) =max(q(ij+1,l),q(ij,l))192 zqmin(ij) =min(q(ij+1,l),q(ij,l))193 enddo194 do ij=iip1+iip1,ip1jm,iip1195 zqmax(ij) =zqmax(ij-iim)196 zqmin(ij) =zqmin(ij-iim)197 enddo198 do ij=iip2+1,ip1jm199 extremum(ij) =dxqu(ij)*dxqu(ij-1)<=0.200 enddo201 do ij=iip1+iip1,ip1jm,iip1202 extremum(ij -iim)=extremum(ij)203 enddo204 do ij=iip2,ip1jm205 zqu(ij) =min(max(zqmin(ij),zqu(ij)),zqmax(ij))206 enddo207 do ij=iip2+1,ip1jm165 do l = 1, llm 166 do ij = iip2, ip1jm - 1 167 dxqu(ij) = q(ij + 1, l) - q(ij, l) 168 zqu(ij) = 0.5 * (q(ij + 1, l) + q(ij, l)) 169 enddo 170 do ij = iip1 + iip1, ip1jm, iip1 171 dxqu(ij) = dxqu(ij - iim) 172 zqu(ij) = zqu(ij - iim) 173 enddo 174 do ij = iip2, ip1jm - 1 175 zqu(ij) = zqu(ij) - dxqu(ij + 1) / 12. 176 enddo 177 do ij = iip1 + iip1, ip1jm, iip1 178 zqu(ij) = zqu(ij - iim) 179 enddo 180 do ij = iip2 + 1, ip1jm 181 zqu(ij) = zqu(ij) + dxqu(ij - 1) / 12. 182 enddo 183 do ij = iip1 + iip1, ip1jm, iip1 184 zqu(ij - iim) = zqu(ij) 185 enddo 186 187 ! calcul des valeurs max et min acceptees aux interfaces 188 189 do ij = iip2, ip1jm - 1 190 zqmax(ij) = max(q(ij + 1, l), q(ij, l)) 191 zqmin(ij) = min(q(ij + 1, l), q(ij, l)) 192 enddo 193 do ij = iip1 + iip1, ip1jm, iip1 194 zqmax(ij) = zqmax(ij - iim) 195 zqmin(ij) = zqmin(ij - iim) 196 enddo 197 do ij = iip2 + 1, ip1jm 198 extremum(ij) = dxqu(ij) * dxqu(ij - 1)<=0. 199 enddo 200 do ij = iip1 + iip1, ip1jm, iip1 201 extremum(ij - iim) = extremum(ij) 202 enddo 203 do ij = iip2, ip1jm 204 zqu(ij) = min(max(zqmin(ij), zqu(ij)), zqmax(ij)) 205 enddo 206 do ij = iip2 + 1, ip1jm 208 207 IF(extremum(ij)) THEN 209 qg(ij,l)=q(ij,l)210 qd(ij,l)=q(ij,l)208 qg(ij, l) = q(ij, l) 209 qd(ij, l) = q(ij, l) 211 210 else 212 qd(ij,l)=zqu(ij)213 qg(ij,l)=zqu(ij-1)211 qd(ij, l) = zqu(ij) 212 qg(ij, l) = zqu(ij - 1) 214 213 endif 215 enddo216 do ij=iip1+iip1,ip1jm,iip1217 qd(ij -iim,l)=qd(ij,l)218 qg(ij -iim,l)=qg(ij,l)219 enddo220 221 goto 8888222 223 do ij=iip2+1,ip1jm224 IF(extremum(ij).and..not.extremum(ij -1)) &225 qd(ij-1,l)=q(ij,l)226 enddo227 228 do ij=iip1+iip1,ip1jm,iip1229 qd(ij -iim,l)=qd(ij,l)230 enddo231 do ij=iip2,ip1jm-1232 IF (extremum(ij).and..not.extremum(ij +1)) &233 qg(ij+1,l)=q(ij,l)234 enddo235 236 do ij=iip1+iip1,ip1jm,iip1237 qg(ij, l)=qg(ij-iim,l)238 enddo239 8888 continue240 enddo214 enddo 215 do ij = iip1 + iip1, ip1jm, iip1 216 qd(ij - iim, l) = qd(ij, l) 217 qg(ij - iim, l) = qg(ij, l) 218 enddo 219 220 goto 8888 221 222 do ij = iip2 + 1, ip1jm 223 IF(extremum(ij).and..not.extremum(ij - 1)) & 224 qd(ij - 1, l) = q(ij, l) 225 enddo 226 227 do ij = iip1 + iip1, ip1jm, iip1 228 qd(ij - iim, l) = qd(ij, l) 229 enddo 230 do ij = iip2, ip1jm - 1 231 IF (extremum(ij).and..not.extremum(ij + 1)) & 232 qg(ij + 1, l) = q(ij, l) 233 enddo 234 235 do ij = iip1 + iip1, ip1jm, iip1 236 qg(ij, l) = qg(ij - iim, l) 237 enddo 238 8888 continue 239 enddo 241 240 ENDIF 242 241 RETURN 243 242 END SUBROUTINE advnqx 244 SUBROUTINE advnqy(q, qs,qn)243 SUBROUTINE advnqy(q, qs, qn) 245 244 ! 246 245 ! Auteurs: Calcul des valeurs de q aux point v. 247 246 ! 248 247 ! -------------------------------------------------------------------- 248 USE lmdz_iniprint, ONLY: lunout, prt_level 249 249 IMPLICIT NONE 250 250 ! 251 251 INCLUDE "dimensions.h" 252 252 INCLUDE "paramet.h" 253 INCLUDE "iniprint.h"254 253 ! 255 254 ! 256 255 ! Arguments: 257 256 ! ---------- 258 REAL :: q(ip1jmp1, llm),qs(ip1jmp1,llm),qn(ip1jmp1,llm)257 REAL :: q(ip1jmp1, llm), qs(ip1jmp1, llm), qn(ip1jmp1, llm) 259 258 ! 260 259 ! Local 261 260 ! --------- 262 261 ! 263 INTEGER :: ij, l264 ! 265 REAL :: dyqv(ip1jm), zqv(ip1jm,llm)266 REAL :: zqmax(ip1jm), zqmin(ip1jm)262 INTEGER :: ij, l 263 ! 264 REAL :: dyqv(ip1jm), zqv(ip1jm, llm) 265 REAL :: zqmax(ip1jm), zqmin(ip1jm) 267 266 LOGICAL :: extremum(ip1jmp1) 268 267 … … 272 271 273 272 IF (mode==0) THEN 274 do l=1,llm275 do ij=1,ip1jmp1276 qn(ij,l)=q(ij,l)277 qs(ij,l)=q(ij,l)278 279 273 do l = 1, llm 274 do ij = 1, ip1jmp1 275 qn(ij, l) = q(ij, l) 276 qs(ij, l) = q(ij, l) 277 enddo 278 enddo 280 279 else 281 280 282 ! calcul des pentes en u:283 ! -----------------------284 do l = 1, llm285 do ij=1,ip1jm286 dyqv(ij) =q(ij,l)-q(ij+iip1,l)287 enddo288 289 do ij=iip2,ip1jm-iip1290 zqv(ij, l)=0.5*(q(ij+iip1,l)+q(ij,l))291 zqv(ij, l)=zqv(ij,l)+(dyqv(ij+iip1)-dyqv(ij-iip1))/12.292 enddo293 294 do ij=iip2,ip1jm295 extremum(ij) =dyqv(ij)*dyqv(ij-iip1)<=0.296 enddo297 298 ! Pas de pentes aux poles299 do ij=1,iip1300 zqv(ij, l)=q(ij,l)301 zqv(ip1jm -iip1+ij,l)=q(ip1jm+ij,l)302 extremum(ij) =.TRUE.303 extremum(ip1jmp1 -iip1+ij)=.TRUE.304 enddo305 306 ! calcul des valeurs max et min acceptees aux interfaces307 do ij=1,ip1jm308 zqmax(ij) =max(q(ij+iip1,l),q(ij,l))309 zqmin(ij) =min(q(ij+iip1,l),q(ij,l))310 enddo311 312 do ij=1,ip1jm313 zqv(ij, l)=min(max(zqmin(ij),zqv(ij,l)),zqmax(ij))314 enddo315 316 do ij=iip2,ip1jm281 ! calcul des pentes en u: 282 ! ----------------------- 283 do l = 1, llm 284 do ij = 1, ip1jm 285 dyqv(ij) = q(ij, l) - q(ij + iip1, l) 286 enddo 287 288 do ij = iip2, ip1jm - iip1 289 zqv(ij, l) = 0.5 * (q(ij + iip1, l) + q(ij, l)) 290 zqv(ij, l) = zqv(ij, l) + (dyqv(ij + iip1) - dyqv(ij - iip1)) / 12. 291 enddo 292 293 do ij = iip2, ip1jm 294 extremum(ij) = dyqv(ij) * dyqv(ij - iip1)<=0. 295 enddo 296 297 ! Pas de pentes aux poles 298 do ij = 1, iip1 299 zqv(ij, l) = q(ij, l) 300 zqv(ip1jm - iip1 + ij, l) = q(ip1jm + ij, l) 301 extremum(ij) = .TRUE. 302 extremum(ip1jmp1 - iip1 + ij) = .TRUE. 303 enddo 304 305 ! calcul des valeurs max et min acceptees aux interfaces 306 do ij = 1, ip1jm 307 zqmax(ij) = max(q(ij + iip1, l), q(ij, l)) 308 zqmin(ij) = min(q(ij + iip1, l), q(ij, l)) 309 enddo 310 311 do ij = 1, ip1jm 312 zqv(ij, l) = min(max(zqmin(ij), zqv(ij, l)), zqmax(ij)) 313 enddo 314 315 do ij = iip2, ip1jm 317 316 IF(extremum(ij)) THEN 318 qs(ij,l)=q(ij,l)319 qn(ij,l)=q(ij,l)320 321 317 qs(ij, l) = q(ij, l) 318 qn(ij, l) = q(ij, l) 319 ! if (.NOT.extremum(ij-iip1)) qs(ij-iip1,l)=q(ij,l) 320 ! if (.NOT.extremum(ij+iip1)) qn(ij+iip1,l)=q(ij,l) 322 321 else 323 qs(ij,l)=zqv(ij,l)324 qn(ij,l)=zqv(ij-iip1,l)322 qs(ij, l) = zqv(ij, l) 323 qn(ij, l) = zqv(ij - iip1, l) 325 324 endif 326 enddo327 328 do ij=1,iip1329 qs(ij, l)=q(ij,l)330 qn(ij, l)=q(ij,l)331 qs(ip1jm +ij,l)=q(ip1jm+ij,l)332 qn(ip1jm +ij,l)=q(ip1jm+ij,l)333 enddo334 335 enddo325 enddo 326 327 do ij = 1, iip1 328 qs(ij, l) = q(ij, l) 329 qn(ij, l) = q(ij, l) 330 qs(ip1jm + ij, l) = q(ip1jm + ij, l) 331 qn(ip1jm + ij, l) = q(ip1jm + ij, l) 332 enddo 333 334 enddo 336 335 ENDIF 337 336 RETURN 338 337 END SUBROUTINE advnqy 339 338 340 SUBROUTINE advnqz(q, qh,qb)339 SUBROUTINE advnqz(q, qh, qb) 341 340 ! 342 341 ! Auteurs: Calcul des valeurs de q aux point v. 343 342 ! 344 343 ! -------------------------------------------------------------------- 344 USE lmdz_iniprint, ONLY: lunout, prt_level 345 345 IMPLICIT NONE 346 346 ! 347 347 INCLUDE "dimensions.h" 348 348 INCLUDE "paramet.h" 349 INCLUDE "iniprint.h"350 349 ! 351 350 ! 352 351 ! Arguments: 353 352 ! ---------- 354 REAL :: q(ip1jmp1, llm),qh(ip1jmp1,llm),qb(ip1jmp1,llm)353 REAL :: q(ip1jmp1, llm), qh(ip1jmp1, llm), qb(ip1jmp1, llm) 355 354 ! 356 355 ! Local 357 356 ! --------- 358 357 ! 359 INTEGER :: ij, l360 ! 361 REAL :: dzqw(ip1jmp1, llm+1),zqw(ip1jmp1,llm+1)362 REAL :: zqmax(ip1jmp1, llm),zqmin(ip1jmp1,llm)363 LOGICAL :: extremum(ip1jmp1, llm)358 INTEGER :: ij, l 359 ! 360 REAL :: dzqw(ip1jmp1, llm + 1), zqw(ip1jmp1, llm + 1) 361 REAL :: zqmax(ip1jmp1, llm), zqmin(ip1jmp1, llm) 362 LOGICAL :: extremum(ip1jmp1, llm) 364 363 365 364 INTEGER :: mode … … 372 371 373 372 IF (mode==0) THEN 374 do l=1,llm375 do ij=1,ip1jmp1376 qb(ij,l)=q(ij,l)377 qh(ij,l)=q(ij,l)378 379 373 do l = 1, llm 374 do ij = 1, ip1jmp1 375 qb(ij, l) = q(ij, l) 376 qh(ij, l) = q(ij, l) 377 enddo 378 enddo 380 379 else 381 do l = 2, llm382 do ij=1,ip1jmp1383 dzqw(ij, l)=q(ij,l-1)-q(ij,l)384 zqw(ij, l)=0.5*(q(ij,l-1)+q(ij,l))385 enddo386 enddo387 do ij=1,ip1jmp1388 dzqw(ij,1)=0.389 dzqw(ij,llm+1)=0.390 enddo391 do l=2,llm392 do ij=1,ip1jmp1393 zqw(ij, l)=zqw(ij,l)+(dzqw(ij,l+1)-dzqw(ij,l-1))/12.394 enddo395 enddo396 do l=2,llm-1397 do ij=1,ip1jmp1398 extremum(ij, l)=dzqw(ij,l)*dzqw(ij,l+1)<=0.399 enddo400 enddo401 402 ! Pas de pentes en bas et en haut403 do ij=1,ip1jmp1404 zqw(ij,2)=q(ij,1)405 zqw(ij,llm)=q(ij,llm)406 extremum(ij,1)=.TRUE.407 extremum(ij,llm)=.TRUE.408 409 410 ! calcul des valeurs max et min acceptees aux interfaces411 do l=2,llm412 do ij=1,ip1jmp1413 zqmax(ij, l)=max(q(ij,l-1),q(ij,l))414 zqmin(ij, l)=min(q(ij,l-1),q(ij,l))415 enddo416 enddo417 418 do l=2,llm419 do ij=1,ip1jmp1420 zqw(ij, l)=min(max(zqmin(ij,l),zqw(ij,l)),zqmax(ij,l))421 enddo422 enddo423 424 do l=2,llm-1425 do ij=1,ip1jmp1426 IF(extremum(ij, l)) THEN427 qh(ij,l)=q(ij,l)428 qb(ij,l)=q(ij,l)380 do l = 2, llm 381 do ij = 1, ip1jmp1 382 dzqw(ij, l) = q(ij, l - 1) - q(ij, l) 383 zqw(ij, l) = 0.5 * (q(ij, l - 1) + q(ij, l)) 384 enddo 385 enddo 386 do ij = 1, ip1jmp1 387 dzqw(ij, 1) = 0. 388 dzqw(ij, llm + 1) = 0. 389 enddo 390 do l = 2, llm 391 do ij = 1, ip1jmp1 392 zqw(ij, l) = zqw(ij, l) + (dzqw(ij, l + 1) - dzqw(ij, l - 1)) / 12. 393 enddo 394 enddo 395 do l = 2, llm - 1 396 do ij = 1, ip1jmp1 397 extremum(ij, l) = dzqw(ij, l) * dzqw(ij, l + 1)<=0. 398 enddo 399 enddo 400 401 ! Pas de pentes en bas et en haut 402 do ij = 1, ip1jmp1 403 zqw(ij, 2) = q(ij, 1) 404 zqw(ij, llm) = q(ij, llm) 405 extremum(ij, 1) = .TRUE. 406 extremum(ij, llm) = .TRUE. 407 enddo 408 409 ! calcul des valeurs max et min acceptees aux interfaces 410 do l = 2, llm 411 do ij = 1, ip1jmp1 412 zqmax(ij, l) = max(q(ij, l - 1), q(ij, l)) 413 zqmin(ij, l) = min(q(ij, l - 1), q(ij, l)) 414 enddo 415 enddo 416 417 do l = 2, llm 418 do ij = 1, ip1jmp1 419 zqw(ij, l) = min(max(zqmin(ij, l), zqw(ij, l)), zqmax(ij, l)) 420 enddo 421 enddo 422 423 do l = 2, llm - 1 424 do ij = 1, ip1jmp1 425 IF(extremum(ij, l)) THEN 426 qh(ij, l) = q(ij, l) 427 qb(ij, l) = q(ij, l) 429 428 else 430 qh(ij,l)=zqw(ij,l+1)431 qb(ij,l)=zqw(ij,l)429 qh(ij, l) = zqw(ij, l + 1) 430 qb(ij, l) = zqw(ij, l) 432 431 endif 433 enddo434 enddo435 ! do l=2,llm-1436 ! do ij=1,ip1jmp1437 ! IF(extremum(ij,l)) THEN438 ! if (.NOT.extremum(ij,l-1)) qh(ij,l-1)=q(ij,l)439 ! if (.NOT.extremum(ij,l+1)) qb(ij,l+1)=q(ij,l)440 ! endif441 ! enddo442 ! enddo443 444 do ij=1,ip1jmp1445 qb(ij,1)=q(ij,1)446 qh(ij,1)=q(ij,1)447 qb(ij,llm)=q(ij,llm)448 qh(ij,llm)=q(ij,llm)449 enddo432 enddo 433 enddo 434 ! do l=2,llm-1 435 ! do ij=1,ip1jmp1 436 ! IF(extremum(ij,l)) THEN 437 ! if (.NOT.extremum(ij,l-1)) qh(ij,l-1)=q(ij,l) 438 ! if (.NOT.extremum(ij,l+1)) qb(ij,l+1)=q(ij,l) 439 ! endif 440 ! enddo 441 ! enddo 442 443 do ij = 1, ip1jmp1 444 qb(ij, 1) = q(ij, 1) 445 qh(ij, 1) = q(ij, 1) 446 qb(ij, llm) = q(ij, llm) 447 qh(ij, llm) = q(ij, llm) 448 enddo 450 449 451 450 ENDIF … … 454 453 END SUBROUTINE advnqz 455 454 456 SUBROUTINE advnx(q, qg,qd,masse,u_m,mode)455 SUBROUTINE advnx(q, qg, qd, masse, u_m, mode) 457 456 ! 458 457 ! Auteur : F. Hourdin … … 465 464 ! 466 465 ! -------------------------------------------------------------------- 466 USE lmdz_iniprint, ONLY: lunout, prt_level 467 467 IMPLICIT NONE 468 468 ! 469 469 include "dimensions.h" 470 470 include "paramet.h" 471 include "iniprint.h"472 471 ! 473 472 ! … … 475 474 ! ---------- 476 475 INTEGER :: mode 477 REAL :: masse(ip1jmp1, llm)478 REAL :: u_m( ip1jmp1,llm)479 REAL :: q(ip1jmp1, llm),qd(ip1jmp1,llm),qg(ip1jmp1,llm)476 REAL :: masse(ip1jmp1, llm) 477 REAL :: u_m(ip1jmp1, llm) 478 REAL :: q(ip1jmp1, llm), qd(ip1jmp1, llm), qg(ip1jmp1, llm) 480 479 ! 481 480 ! Local 482 481 ! --------- 483 482 ! 484 INTEGER :: i, j,ij,l,indu(ip1jmp1),niju,iju,ijq485 INTEGER :: n0, nl(llm)486 ! 487 REAL :: new_m, zu_m,zdq,zz488 REAL :: zsigg(ip1jmp1, llm),zsigd(ip1jmp1,llm),zsig489 REAL :: u_mq(ip1jmp1, llm)490 491 REAL :: zm, zq,zsigm,zsigp,zqm,zqp,zu492 493 LOGICAL :: ladvplus(ip1jmp1, llm)483 INTEGER :: i, j, ij, l, indu(ip1jmp1), niju, iju, ijq 484 INTEGER :: n0, nl(llm) 485 ! 486 REAL :: new_m, zu_m, zdq, zz 487 REAL :: zsigg(ip1jmp1, llm), zsigd(ip1jmp1, llm), zsig 488 REAL :: u_mq(ip1jmp1, llm) 489 490 REAL :: zm, zq, zsigm, zsigp, zqm, zqp, zu 491 492 LOGICAL :: ladvplus(ip1jmp1, llm) 494 493 495 494 REAL :: prec … … 498 497 data prec/1.e-15/ 499 498 500 do l =1,llm501 do ij=iip2,ip1jm502 zdq=qd(ij,l)-qg(ij,l)503 504 505 506 507 508 509 510 zsigd(ij,l)=(q(ij,l)-qg(ij,l))/zdq511 zsigg(ij,l)=1.-zsigd(ij,l)512 513 ! s zsigg(ij,l).ge.0..or.zsigg(ij,l).le.1.) ) THEN514 515 516 517 518 519 520 zsigd(ij,l)=0.5521 zsigg(ij,l)=0.5522 qd(ij,l)=q(ij,l)523 qg(ij,l)=q(ij,l)524 525 526 499 do l = 1, llm 500 do ij = iip2, ip1jm 501 zdq = qd(ij, l) - qg(ij, l) 502 ! if((qd(ij,l)-q(ij,l))*(q(ij,l)-qg(ij,l)).lt.0.) THEN 503 ! PRINT*,'probleme au point ij=',ij,' l=',l 504 ! PRINT*,qd(ij,l),q(ij,l),qg(ij,l) 505 ! qd(ij,l)=q(ij,l) 506 ! qg(ij,l)=q(ij,l) 507 ! END IF 508 IF(abs(zdq)>prec) THEN 509 zsigd(ij, l) = (q(ij, l) - qg(ij, l)) / zdq 510 zsigg(ij, l) = 1. - zsigd(ij, l) 511 ! IF(.NOT.(zsigd(ij,l).ge.0..and.zsigd(ij,l).le.1. .AND. 512 ! s zsigg(ij,l).ge.0..or.zsigg(ij,l).le.1.) ) THEN 513 ! PRINT*,'probleme au point ij=',ij,' l=',l 514 ! PRINT*,'sigg=',zsigg(ij,l),' sigd=',zsigd(ij,l) 515 ! PRINT*,'q d,c,g ',qd(ij,l),q(ij,l),qg(ij,l),zdq 516 ! stop 517 ! END IF 518 else 519 zsigd(ij, l) = 0.5 520 zsigg(ij, l) = 0.5 521 qd(ij, l) = q(ij, l) 522 qg(ij, l) = q(ij, l) 523 endif 524 enddo 525 enddo 527 526 528 527 ! calcul de la pente maximum dans la maille en valeur absolue 529 528 530 do l=1,llm531 do ij=iip2,ip1jm-1532 IF (u_m(ij, l)>=0.) THEN533 zsigp=zsigd(ij,l)534 zsigm=zsigg(ij,l)535 zqp=qd(ij,l)536 zqm=qg(ij,l)537 zm=masse(ij,l)538 zq=q(ij,l)529 do l = 1, llm 530 do ij = iip2, ip1jm - 1 531 IF (u_m(ij, l)>=0.) THEN 532 zsigp = zsigd(ij, l) 533 zsigm = zsigg(ij, l) 534 zqp = qd(ij, l) 535 zqm = qg(ij, l) 536 zm = masse(ij, l) 537 zq = q(ij, l) 539 538 else 540 zsigm=zsigd(ij+1,l)541 zsigp=zsigg(ij+1,l)542 zqm=qd(ij+1,l)543 zqp=qg(ij+1,l)544 zm=masse(ij+1,l)545 zq=q(ij+1,l)546 endif 547 zu =abs(u_m(ij,l))548 ladvplus(ij, l)=zu>zm549 zsig =zu/zm550 IF(zsig==0.) zsigp =0.1539 zsigm = zsigd(ij + 1, l) 540 zsigp = zsigg(ij + 1, l) 541 zqm = qd(ij + 1, l) 542 zqp = qg(ij + 1, l) 543 zm = masse(ij + 1, l) 544 zq = q(ij + 1, l) 545 endif 546 zu = abs(u_m(ij, l)) 547 ladvplus(ij, l) = zu>zm 548 zsig = zu / zm 549 IF(zsig==0.) zsigp = 0.1 551 550 IF (mode==1) THEN 552 553 u_mq(ij,l)=u_m(ij,l)*zqp554 555 u_mq(ij,l)= &556 sign(zm,u_m(ij,l))*(zsigp*zqp+(zsig-zsigp)*zqm)557 551 IF (zsig<=zsigp) THEN 552 u_mq(ij, l) = u_m(ij, l) * zqp 553 ELSE IF (mode==1) THEN 554 u_mq(ij, l) = & 555 sign(zm, u_m(ij, l)) * (zsigp * zqp + (zsig - zsigp) * zqm) 556 endif 558 557 else 559 560 u_mq(ij,l)=u_m(ij,l)*(zqp-0.5*zsig/zsigp*(zqp-zq))561 562 zz=0.5*(zsig-zsigp)/zsigm563 u_mq(ij,l)=sign(zm,u_m(ij,l))*( 0.5*(zq+zqp)*zsigp &564 + (zsig-zsigp)*(zq+zz*(zqm-zq)))565 558 IF (zsig<=zsigp) THEN 559 u_mq(ij, l) = u_m(ij, l) * (zqp - 0.5 * zsig / zsigp * (zqp - zq)) 560 else 561 zz = 0.5 * (zsig - zsigp) / zsigm 562 u_mq(ij, l) = sign(zm, u_m(ij, l)) * (0.5 * (zq + zqp) * zsigp & 563 + (zsig - zsigp) * (zq + zz * (zqm - zq))) 564 endif 566 565 endif 567 566 ! IF(zsig.lt.0.) THEN … … 569 568 ! stop 570 569 ! END IF 571 enddo572 enddo 573 574 do l =1,llm575 do ij=iip1+iip1,ip1jm,iip1576 u_mq(ij, l)=u_mq(ij-iim,l)577 ladvplus(ij, l)=ladvplus(ij-iim,l)578 enddo570 enddo 571 enddo 572 573 do l = 1, llm 574 do ij = iip1 + iip1, ip1jm, iip1 575 u_mq(ij, l) = u_mq(ij - iim, l) 576 ladvplus(ij, l) = ladvplus(ij - iim, l) 577 enddo 579 578 enddo 580 579 … … 583 582 !================================================================= 584 583 ! tris des regions a traiter 585 n0 =0586 do l =1,llm587 nl(l)=0588 do ij=iip2,ip1jm589 IF(ladvplus(ij,l)) THEN590 nl(l)=nl(l)+1591 u_mq(ij,l)=0.592 593 594 n0=n0+nl(l)584 n0 = 0 585 do l = 1, llm 586 nl(l) = 0 587 do ij = iip2, ip1jm 588 IF(ladvplus(ij, l)) THEN 589 nl(l) = nl(l) + 1 590 u_mq(ij, l) = 0. 591 endif 592 enddo 593 n0 = n0 + nl(l) 595 594 enddo 596 595 597 596 IF(n0>1) THEN 598 IF (prt_level > 9) WRITE(lunout,*) & 599 'Nombre de points pour lesquels on advect plus que le' & 600 ,'contenu de la maille : ',n0 601 602 do l=1,llm 603 IF(nl(l)>0) THEN 604 iju=0 605 ! indicage des mailles concernees par le traitement special 606 do ij=iip2,ip1jm 607 IF(ladvplus(ij,l).AND.mod(ij,iip1)/=0) THEN 608 iju=iju+1 609 indu(iju)=ij 597 IF (prt_level > 9) WRITE(lunout, *) & 598 'Nombre de points pour lesquels on advect plus que le' & 599 , 'contenu de la maille : ', n0 600 601 do l = 1, llm 602 IF(nl(l)>0) THEN 603 iju = 0 604 ! indicage des mailles concernees par le traitement special 605 do ij = iip2, ip1jm 606 IF(ladvplus(ij, l).AND.mod(ij, iip1)/=0) THEN 607 iju = iju + 1 608 indu(iju) = ij 609 endif 610 enddo 611 niju = iju 612 ! PRINT*,'niju,nl',niju,nl(l) 613 614 ! traitement des mailles 615 do iju = 1, niju 616 ij = indu(iju) 617 j = (ij - 1) / iip1 + 1 618 zu_m = u_m(ij, l) 619 u_mq(ij, l) = 0. 620 IF(zu_m>0.) THEN 621 ijq = ij 622 i = ijq - (j - 1) * iip1 623 ! accumulation pour les mailles completements advectees 624 do while(zu_m>masse(ijq, l)) 625 u_mq(ij, l) = u_mq(ij, l) + q(ijq, l) * masse(ijq, l) 626 zu_m = zu_m - masse(ijq, l) 627 i = mod(i - 2 + iim, iim) + 1 628 ijq = (j - 1) * iip1 + i 629 enddo 630 ! MODIFS SPECIFIQUES DU SCHEMA 631 ! ajout de la maille non completement advectee 632 zsig = zu_m / masse(ijq, l) 633 IF(zsig<=zsigd(ijq, l)) THEN 634 u_mq(ij, l) = u_mq(ij, l) + zu_m * (qd(ijq, l) & 635 - 0.5 * zsig / zsigd(ijq, l) * (qd(ijq, l) - q(ijq, l))) 636 else 637 ! u_mq(ij,l)=u_mq(ij,l)+zu_m*q(ijq,l) 638 ! goto 8888 639 zz = 0.5 * (zsig - zsigd(ijq, l)) / zsigg(ijq, l) 640 IF(.NOT.(zz>0..and.zz<=0.5)) THEN 641 WRITE(lunout, *)'probleme2 au point ij=', ij, & 642 ' l=', l 643 WRITE(lunout, *)'zz=', zz 644 stop 610 645 endif 611 enddo 612 niju=iju 613 ! PRINT*,'niju,nl',niju,nl(l) 614 615 ! traitement des mailles 616 do iju=1,niju 617 ij=indu(iju) 618 j=(ij-1)/iip1+1 619 zu_m=u_m(ij,l) 620 u_mq(ij,l)=0. 621 IF(zu_m>0.) THEN 622 ijq=ij 623 i=ijq-(j-1)*iip1 624 ! accumulation pour les mailles completements advectees 625 do while(zu_m>masse(ijq,l)) 626 u_mq(ij,l)=u_mq(ij,l)+q(ijq,l)*masse(ijq,l) 627 zu_m=zu_m-masse(ijq,l) 628 i=mod(i-2+iim,iim)+1 629 ijq=(j-1)*iip1+i 630 enddo 631 ! MODIFS SPECIFIQUES DU SCHEMA 632 ! ajout de la maille non completement advectee 633 zsig=zu_m/masse(ijq,l) 634 IF(zsig<=zsigd(ijq,l)) THEN 635 u_mq(ij,l)=u_mq(ij,l)+zu_m*(qd(ijq,l) & 636 -0.5*zsig/zsigd(ijq,l)*(qd(ijq,l)-q(ijq,l))) 637 else 638 ! u_mq(ij,l)=u_mq(ij,l)+zu_m*q(ijq,l) 639 ! goto 8888 640 zz=0.5*(zsig-zsigd(ijq,l))/zsigg(ijq,l) 641 IF(.NOT.(zz>0..and.zz<=0.5)) THEN 642 WRITE(lunout,*)'probleme2 au point ij=',ij, & 643 ' l=',l 644 WRITE(lunout,*)'zz=',zz 645 stop 646 u_mq(ij, l) = u_mq(ij, l) + masse(ijq, l) * (& 647 0.5 * (q(ijq, l) + qd(ijq, l)) * zsigd(ijq, l) & 648 + (zsig - zsigd(ijq, l)) * (q(ijq, l) + zz * (qg(ijq, l) - q(ijq, l)))) 646 649 endif 647 u_mq(ij,l)=u_mq(ij,l)+masse(ijq,l)*( & 648 0.5*(q(ijq,l)+qd(ijq,l))*zsigd(ijq,l) & 649 +(zsig-zsigd(ijq,l))*(q(ijq,l)+zz*(qg(ijq,l)-q(ijq,l))) ) 650 endif 651 else 652 ijq=ij+1 653 i=ijq-(j-1)*iip1 654 ! accumulation pour les mailles completements advectees 655 do while(-zu_m>masse(ijq,l)) 656 u_mq(ij,l)=u_mq(ij,l)-q(ijq,l)*masse(ijq,l) 657 zu_m=zu_m+masse(ijq,l) 658 i=mod(i,iim)+1 659 ijq=(j-1)*iip1+i 660 enddo 661 ! ajout de la maille non completement advectee 662 ! 2eme MODIF SPECIFIQUE 663 zsig=-zu_m/masse(ij+1,l) 664 IF(zsig<=zsigg(ijq,l)) THEN 665 u_mq(ij,l)=u_mq(ij,l)+zu_m*(qg(ijq,l) & 666 -0.5*zsig/zsigg(ijq,l)*(qg(ijq,l)-q(ijq,l))) 667 else 668 ! u_mq(ij,l)=u_mq(ij,l)+zu_m*q(ijq,l) 669 ! goto 9999 670 zz=0.5*(zsig-zsigg(ijq,l))/zsigd(ijq,l) 671 IF(.NOT.(zz>0..and.zz<=0.5)) THEN 672 WRITE(lunout,*)'probleme22 au point ij=',ij & 673 ,' l=',l 674 WRITE(lunout,*)'zz=',zz 675 stop 650 else 651 ijq = ij + 1 652 i = ijq - (j - 1) * iip1 653 ! accumulation pour les mailles completements advectees 654 do while(-zu_m>masse(ijq, l)) 655 u_mq(ij, l) = u_mq(ij, l) - q(ijq, l) * masse(ijq, l) 656 zu_m = zu_m + masse(ijq, l) 657 i = mod(i, iim) + 1 658 ijq = (j - 1) * iip1 + i 659 enddo 660 ! ajout de la maille non completement advectee 661 ! 2eme MODIF SPECIFIQUE 662 zsig = -zu_m / masse(ij + 1, l) 663 IF(zsig<=zsigg(ijq, l)) THEN 664 u_mq(ij, l) = u_mq(ij, l) + zu_m * (qg(ijq, l) & 665 - 0.5 * zsig / zsigg(ijq, l) * (qg(ijq, l) - q(ijq, l))) 666 else 667 ! u_mq(ij,l)=u_mq(ij,l)+zu_m*q(ijq,l) 668 ! goto 9999 669 zz = 0.5 * (zsig - zsigg(ijq, l)) / zsigd(ijq, l) 670 IF(.NOT.(zz>0..and.zz<=0.5)) THEN 671 WRITE(lunout, *)'probleme22 au point ij=', ij & 672 , ' l=', l 673 WRITE(lunout, *)'zz=', zz 674 stop 675 endif 676 u_mq(ij, l) = u_mq(ij, l) - masse(ijq, l) * (& 677 0.5 * (q(ijq, l) + qg(ijq, l)) * zsigg(ijq, l) & 678 + (zsig - zsigg(ijq, l)) * & 679 (q(ijq, l) + zz * (qd(ijq, l) - q(ijq, l)))) 676 680 endif 677 u_mq(ij,l)=u_mq(ij,l)-masse(ijq,l)*( & 678 0.5*(q(ijq,l)+qg(ijq,l))*zsigg(ijq,l) & 679 +(zsig-zsigg(ijq,l))* & 680 (q(ijq,l)+zz*(qd(ijq,l)-q(ijq,l))) ) 681 endif 682 ! fin de la modif 683 endif 684 enddo 685 endif 686 enddo 681 ! fin de la modif 682 endif 683 enddo 684 endif 685 enddo 687 686 ENDIF ! n0.gt.0 688 687 689 688 ! bouclage en latitude 690 do l =1,llm691 do ij =iip1+iip1,ip1jm,iip1692 u_mq(ij,l)=u_mq(ij-iim,l)689 do l = 1, llm 690 do ij = iip1 + iip1, ip1jm, iip1 691 u_mq(ij, l) = u_mq(ij - iim, l) 693 692 enddo 694 693 enddo … … 698 697 !================================================================= 699 698 700 do l =1,llm701 do ij=iip2+1,ip1jm702 new_m=masse(ij,l)+u_m(ij-1,l)-u_m(ij,l)703 q(ij,l)=(q(ij,l)*masse(ij,l)+ &704 u_mq(ij -1,l)-u_mq(ij,l)) &705 / new_m706 masse(ij,l)=new_m707 708 ! Modif Fred 22 03 96 correction d'un bug (les scopy ci-dessous)709 do ij=iip1+iip1,ip1jm,iip1710 q(ij-iim,l)=q(ij,l)711 masse(ij-iim,l)=masse(ij,l)712 699 do l = 1, llm 700 do ij = iip2 + 1, ip1jm 701 new_m = masse(ij, l) + u_m(ij - 1, l) - u_m(ij, l) 702 q(ij, l) = (q(ij, l) * masse(ij, l) + & 703 u_mq(ij - 1, l) - u_mq(ij, l)) & 704 / new_m 705 masse(ij, l) = new_m 706 enddo 707 ! Modif Fred 22 03 96 correction d'un bug (les scopy ci-dessous) 708 do ij = iip1 + iip1, ip1jm, iip1 709 q(ij - iim, l) = q(ij, l) 710 masse(ij - iim, l) = masse(ij, l) 711 enddo 713 712 enddo 714 713 715 714 RETURN 716 715 END SUBROUTINE advnx 717 SUBROUTINE advny(q, qs,qn,masse,v_m)716 SUBROUTINE advny(q, qs, qn, masse, v_m) 718 717 ! 719 718 ! Auteur : F. Hourdin … … 726 725 ! 727 726 ! -------------------------------------------------------------------- 727 USE lmdz_iniprint, ONLY: lunout, prt_level 728 728 IMPLICIT NONE 729 729 ! … … 731 731 INCLUDE "paramet.h" 732 732 INCLUDE "comgeom.h" 733 INCLUDE "iniprint.h"734 733 ! 735 734 ! 736 735 ! Arguments: 737 736 ! ---------- 738 REAL :: masse(ip1jmp1, llm)739 REAL :: v_m( ip1jm,llm)740 REAL :: q(ip1jmp1, llm),qn(ip1jmp1,llm),qs(ip1jmp1,llm)737 REAL :: masse(ip1jmp1, llm) 738 REAL :: v_m(ip1jm, llm) 739 REAL :: q(ip1jmp1, llm), qn(ip1jmp1, llm), qs(ip1jmp1, llm) 741 740 ! 742 741 ! Local 743 742 ! --------- 744 743 ! 745 INTEGER :: ij, l746 ! 747 REAL :: new_m, zdq,zz748 REAL :: zsigs(ip1jmp1), zsign(ip1jmp1),zsig749 REAL :: v_mq(ip1jm, llm)750 REAL :: convpn, convps,convmpn,convmps,massen,masses751 REAL :: zm, zq,zsigm,zsigp,zqm,zqp744 INTEGER :: ij, l 745 ! 746 REAL :: new_m, zdq, zz 747 REAL :: zsigs(ip1jmp1), zsign(ip1jmp1), zsig 748 REAL :: v_mq(ip1jm, llm) 749 REAL :: convpn, convps, convmpn, convmps, massen, masses 750 REAL :: zm, zq, zsigm, zsigp, zqm, zqp 752 751 REAL :: ssum 753 752 REAL :: prec … … 755 754 756 755 data prec/1.e-15/ 757 do l=1,llm 758 do ij=1,ip1jmp1 759 zdq=qn(ij,l)-qs(ij,l) 760 ! if((qn(ij,l)-q(ij,l))*(q(ij,l)-qs(ij,l)).lt.0.) THEN 761 ! PRINT*,'probleme au point ij=',ij,' l=',l,' advnqx' 762 ! PRINT*,qn(ij,l),q(ij,l),qs(ij,l) 763 ! qn(ij,l)=q(ij,l) 764 ! qs(ij,l)=q(ij,l) 765 ! END IF 766 IF(abs(zdq)>prec) THEN 767 zsign(ij)=(q(ij,l)-qs(ij,l))/zdq 768 zsigs(ij)=1.-zsign(ij) 769 ! IF(.NOT.(zsign(ij).ge.0..and.zsign(ij).le.1. .AND. 770 ! s zsigs(ij).ge.0..or.zsigs(ij).le.1.) ) THEN 771 ! PRINT*,'probleme au point ij=',ij,' l=',l 772 ! PRINT*,'sigs=',zsigs(ij),' sign=',zsign(ij) 773 ! stop 774 ! END IF 775 else 776 zsign(ij)=0.5 777 zsigs(ij)=0.5 778 endif 779 enddo 780 781 ! calcul de la pente maximum dans la maille en valeur absolue 782 783 do ij=1,ip1jm 784 IF (v_m(ij,l)>=0.) THEN 785 zsigp=zsign(ij+iip1) 786 zsigm=zsigs(ij+iip1) 787 zqp=qn(ij+iip1,l) 788 zqm=qs(ij+iip1,l) 789 zm=masse(ij+iip1,l) 790 zq=q(ij+iip1,l) 756 do l = 1, llm 757 do ij = 1, ip1jmp1 758 zdq = qn(ij, l) - qs(ij, l) 759 ! if((qn(ij,l)-q(ij,l))*(q(ij,l)-qs(ij,l)).lt.0.) THEN 760 ! PRINT*,'probleme au point ij=',ij,' l=',l,' advnqx' 761 ! PRINT*,qn(ij,l),q(ij,l),qs(ij,l) 762 ! qn(ij,l)=q(ij,l) 763 ! qs(ij,l)=q(ij,l) 764 ! END IF 765 IF(abs(zdq)>prec) THEN 766 zsign(ij) = (q(ij, l) - qs(ij, l)) / zdq 767 zsigs(ij) = 1. - zsign(ij) 768 ! IF(.NOT.(zsign(ij).ge.0..and.zsign(ij).le.1. .AND. 769 ! s zsigs(ij).ge.0..or.zsigs(ij).le.1.) ) THEN 770 ! PRINT*,'probleme au point ij=',ij,' l=',l 771 ! PRINT*,'sigs=',zsigs(ij),' sign=',zsign(ij) 772 ! stop 773 ! END IF 791 774 else 792 zsigm=zsign(ij) 793 zsigp=zsigs(ij) 794 zqm=qn(ij,l) 795 zqp=qs(ij,l) 796 zm=masse(ij,l) 797 zq=q(ij,l) 798 endif 799 zsig=abs(v_m(ij,l))/zm 800 IF(zsig==0.) zsigp=0.1 775 zsign(ij) = 0.5 776 zsigs(ij) = 0.5 777 endif 778 enddo 779 780 ! calcul de la pente maximum dans la maille en valeur absolue 781 782 do ij = 1, ip1jm 783 IF (v_m(ij, l)>=0.) THEN 784 zsigp = zsign(ij + iip1) 785 zsigm = zsigs(ij + iip1) 786 zqp = qn(ij + iip1, l) 787 zqm = qs(ij + iip1, l) 788 zm = masse(ij + iip1, l) 789 zq = q(ij + iip1, l) 790 else 791 zsigm = zsign(ij) 792 zsigp = zsigs(ij) 793 zqm = qn(ij, l) 794 zqp = qs(ij, l) 795 zm = masse(ij, l) 796 zq = q(ij, l) 797 endif 798 zsig = abs(v_m(ij, l)) / zm 799 IF(zsig==0.) zsigp = 0.1 801 800 IF (zsig<=zsigp) THEN 802 v_mq(ij,l)=v_m(ij,l)*(zqp-0.5*zsig/zsigp*(zqp-zq))801 v_mq(ij, l) = v_m(ij, l) * (zqp - 0.5 * zsig / zsigp * (zqp - zq)) 803 802 else 804 zz=0.5*(zsig-zsigp)/zsigm805 v_mq(ij,l)=sign(zm,v_m(ij,l))*( 0.5*(zq+zqp)*zsigp &806 + (zsig-zsigp)*(zq+zz*(zqm-zq)))807 endif 808 enddo809 enddo 810 811 do l =1,llm812 do ij=iip2,ip1jm813 new_m=masse(ij,l) &814 + v_m(ij,l)-v_m(ij-iip1,l)815 q(ij,l)=(q(ij,l)*masse(ij,l)+v_mq(ij,l)-v_mq(ij-iip1,l)) &816 / new_m817 masse(ij,l)=new_m818 819 !.-. ancienne version820 convpn=SSUM(iim,v_mq(1,l),1)821 convmpn=ssum(iim,v_m(1,l),1)822 massen=ssum(iim,masse(1,l),1)823 new_m=massen+convmpn824 q(1,l)=(q(1,l)*massen+convpn)/new_m825 do ij = 1,iip1826 q(ij,l)=q(1,l)827 masse(ij,l)=new_m*aire(ij)/apoln828 829 830 convps=-SSUM(iim,v_mq(ip1jm-iim,l),1)831 convmps=-ssum(iim,v_m(ip1jm-iim,l),1)832 masses=ssum(iim,masse(ip1jm+1,l),1)833 new_m=masses+convmps834 q(ip1jm+1,l)=(q(ip1jm+1,l)*masses+convps)/new_m835 do ij = ip1jm+1,ip1jmp1836 q(ij,l)=q(ip1jm+1,l)837 masse(ij,l)=new_m*aire(ij)/apols838 803 zz = 0.5 * (zsig - zsigp) / zsigm 804 v_mq(ij, l) = sign(zm, v_m(ij, l)) * (0.5 * (zq + zqp) * zsigp & 805 + (zsig - zsigp) * (zq + zz * (zqm - zq))) 806 endif 807 enddo 808 enddo 809 810 do l = 1, llm 811 do ij = iip2, ip1jm 812 new_m = masse(ij, l) & 813 + v_m(ij, l) - v_m(ij - iip1, l) 814 q(ij, l) = (q(ij, l) * masse(ij, l) + v_mq(ij, l) - v_mq(ij - iip1, l)) & 815 / new_m 816 masse(ij, l) = new_m 817 enddo 818 !.-. ancienne version 819 convpn = SSUM(iim, v_mq(1, l), 1) 820 convmpn = ssum(iim, v_m(1, l), 1) 821 massen = ssum(iim, masse(1, l), 1) 822 new_m = massen + convmpn 823 q(1, l) = (q(1, l) * massen + convpn) / new_m 824 do ij = 1, iip1 825 q(ij, l) = q(1, l) 826 masse(ij, l) = new_m * aire(ij) / apoln 827 enddo 828 829 convps = -SSUM(iim, v_mq(ip1jm - iim, l), 1) 830 convmps = -ssum(iim, v_m(ip1jm - iim, l), 1) 831 masses = ssum(iim, masse(ip1jm + 1, l), 1) 832 new_m = masses + convmps 833 q(ip1jm + 1, l) = (q(ip1jm + 1, l) * masses + convps) / new_m 834 do ij = ip1jm + 1, ip1jmp1 835 q(ij, l) = q(ip1jm + 1, l) 836 masse(ij, l) = new_m * aire(ij) / apols 837 enddo 839 838 enddo 840 839 841 840 RETURN 842 841 END SUBROUTINE advny 843 SUBROUTINE advnz(q, qh,qb,masse,w_m)842 SUBROUTINE advnz(q, qh, qb, masse, w_m) 844 843 ! 845 844 ! Auteurs: F.Hourdin … … 853 852 ! 854 853 ! -------------------------------------------------------------------- 854 USE lmdz_iniprint, ONLY: lunout, prt_level 855 855 IMPLICIT NONE 856 856 ! … … 858 858 INCLUDE "paramet.h" 859 859 INCLUDE "comgeom.h" 860 INCLUDE "iniprint.h"861 860 ! 862 861 ! 863 862 ! Arguments: 864 863 ! ---------- 865 REAL :: masse(ip1jmp1, llm)866 REAL :: w_m( ip1jmp1,llm+1)867 REAL :: q(ip1jmp1, llm),qb(ip1jmp1,llm),qh(ip1jmp1,llm)864 REAL :: masse(ip1jmp1, llm) 865 REAL :: w_m(ip1jmp1, llm + 1) 866 REAL :: q(ip1jmp1, llm), qb(ip1jmp1, llm), qh(ip1jmp1, llm) 868 867 869 868 ! … … 871 870 ! --------- 872 871 ! 873 INTEGER :: ij, l874 ! 875 REAL :: new_m, zdq,zz876 REAL :: zsigh(ip1jmp1, llm),zsigb(ip1jmp1,llm),zsig877 REAL :: w_mq(ip1jmp1, llm+1)878 REAL :: zm, zq,zsigm,zsigp,zqm,zqp872 INTEGER :: ij, l 873 ! 874 REAL :: new_m, zdq, zz 875 REAL :: zsigh(ip1jmp1, llm), zsigb(ip1jmp1, llm), zsig 876 REAL :: w_mq(ip1jmp1, llm + 1) 877 REAL :: zm, zq, zsigm, zsigp, zqm, zqp 879 878 REAL :: prec 880 879 save prec … … 882 881 data prec/1.e-13/ 883 882 884 do l =1,llm885 do ij=1,ip1jmp1886 zdq=qb(ij,l)-qh(ij,l)887 888 889 890 891 892 893 894 895 zsigb(ij,l)=(q(ij,l)-qh(ij,l))/zdq896 zsigh(ij,l)=1.-zsigb(ij,l)897 zsigb(ij,l)=min(max(zsigb(ij,l),0.),1.)898 899 zsigb(ij,l)=0.5900 zsigh(ij,l)=0.5901 902 903 904 905 883 do l = 1, llm 884 do ij = 1, ip1jmp1 885 zdq = qb(ij, l) - qh(ij, l) 886 ! if((qh(ij,l)-q(ij,l))*(q(ij,l)-qb(ij,l)).lt.0.) THEN 887 ! PRINT*,'probleme au point ij=',ij,' l=',l 888 ! PRINT*,qh(ij,l),q(ij,l),qb(ij,l) 889 ! qh(ij,l)=q(ij,l) 890 ! qb(ij,l)=q(ij,l) 891 ! END IF 892 893 IF(abs(zdq)>prec) THEN 894 zsigb(ij, l) = (q(ij, l) - qh(ij, l)) / zdq 895 zsigh(ij, l) = 1. - zsigb(ij, l) 896 zsigb(ij, l) = min(max(zsigb(ij, l), 0.), 1.) 897 else 898 zsigb(ij, l) = 0.5 899 zsigh(ij, l) = 0.5 900 endif 901 enddo 902 enddo 903 904 ! PRINT*,'ok1' 906 905 ! calcul de la pente maximum dans la maille en valeur absolue 907 do l=2,llm908 do ij=1,ip1jmp1909 IF (w_m(ij, l)>=0.) THEN910 zsigp=zsigb(ij,l)911 zsigm=zsigh(ij,l)912 zqp=qb(ij,l)913 zqm=qh(ij,l)914 zm=masse(ij,l)915 zq=q(ij,l)906 do l = 2, llm 907 do ij = 1, ip1jmp1 908 IF (w_m(ij, l)>=0.) THEN 909 zsigp = zsigb(ij, l) 910 zsigm = zsigh(ij, l) 911 zqp = qb(ij, l) 912 zqm = qh(ij, l) 913 zm = masse(ij, l) 914 zq = q(ij, l) 916 915 else 917 zsigm=zsigb(ij,l-1)918 zsigp=zsigh(ij,l-1)919 zqm=qb(ij,l-1)920 zqp=qh(ij,l-1)921 zm=masse(ij,l-1)922 zq=q(ij,l-1)923 endif 924 zsig =abs(w_m(ij,l))/zm925 IF(zsig==0.) zsigp =0.1916 zsigm = zsigb(ij, l - 1) 917 zsigp = zsigh(ij, l - 1) 918 zqm = qb(ij, l - 1) 919 zqp = qh(ij, l - 1) 920 zm = masse(ij, l - 1) 921 zq = q(ij, l - 1) 922 endif 923 zsig = abs(w_m(ij, l)) / zm 924 IF(zsig==0.) zsigp = 0.1 926 925 IF (zsig<=zsigp) THEN 927 w_mq(ij,l)=w_m(ij,l)*(zqp-0.5*zsig/zsigp*(zqp-zq))926 w_mq(ij, l) = w_m(ij, l) * (zqp - 0.5 * zsig / zsigp * (zqp - zq)) 928 927 else 929 zz=0.5*(zsig-zsigp)/zsigm930 w_mq(ij,l)=sign(zm,w_m(ij,l))*( 0.5*(zq+zqp)*zsigp &931 + (zsig-zsigp)*(zq+zz*(zqm-zq)))932 endif 933 enddo934 enddo 935 936 do ij=1,ip1jmp1937 w_mq(ij,llm+1)=0.938 w_mq(ij,1)=0.939 940 941 do l =1,llm942 do ij=1,ip1jmp1943 new_m=masse(ij,l)+w_m(ij,l+1)-w_m(ij,l)944 q(ij,l)=(q(ij,l)*masse(ij,l)+w_mq(ij,l+1)-w_mq(ij,l)) &945 / new_m946 masse(ij,l)=new_m947 928 zz = 0.5 * (zsig - zsigp) / zsigm 929 w_mq(ij, l) = sign(zm, w_m(ij, l)) * (0.5 * (zq + zqp) * zsigp & 930 + (zsig - zsigp) * (zq + zz * (zqm - zq))) 931 endif 932 enddo 933 enddo 934 935 do ij = 1, ip1jmp1 936 w_mq(ij, llm + 1) = 0. 937 w_mq(ij, 1) = 0. 938 enddo 939 940 do l = 1, llm 941 do ij = 1, ip1jmp1 942 new_m = masse(ij, l) + w_m(ij, l + 1) - w_m(ij, l) 943 q(ij, l) = (q(ij, l) * masse(ij, l) + w_mq(ij, l + 1) - w_mq(ij, l)) & 944 / new_m 945 masse(ij, l) = new_m 946 enddo 948 947 enddo 949 948 ! PRINT*,'ok3'
Note: See TracChangeset
for help on using the changeset viewer.