Changeset 123
- Timestamp:
- 02/01/13 00:52:47 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
codes/icosagcm/trunk/src/caldyn_gcm.f90
r122 r123 179 179 REAL(rstd) :: etav,hv, du2 180 180 181 ! REAL(rstd) :: theta(iim*jjm,llm) ! potential temperature182 ! REAL(rstd) :: p(iim*jjm,llm+1) ! pression183 ! REAL(rstd) :: pk(iim*jjm,llm) ! Exner function184 ! REAL(rstd) :: pks(iim*jjm)185 !! Intermediate variable to compute exner function186 ! REAL(rstd) :: alpha(iim*jjm,llm)187 ! REAL(rstd) :: beta(iim*jjm,llm)188 !!189 ! REAL(rstd) :: phi(iim*jjm,llm) ! geopotential190 ! REAL(rstd) :: mass(iim*jjm,llm) ! mass191 ! REAL(rstd) :: rhodz(iim*jjm,llm) ! mass density192 ! REAL(rstd) :: Fe(3*iim*jjm,llm) ! mass flux193 ! REAL(rstd) :: Ftheta(3*iim*jjm,llm) ! theta flux194 ! REAL(rstd) :: convm(iim*jjm,llm) ! mass flux convergence195 ! REAL(rstd) :: w(iim*jjm,llm) ! vertical velocity196 ! REAL(rstd) :: qv(2*iim*jjm,llm) ! potential velocity197 ! REAL(rstd) :: berni(iim*jjm,llm) ! bernouilli term198 199 181 REAL(rstd),ALLOCATABLE,SAVE :: theta(:,:) ! potential temperature 200 182 REAL(rstd),ALLOCATABLE,SAVE :: p(:,:) ! pression … … 206 188 ! 207 189 REAL(rstd),ALLOCATABLE,SAVE :: phi(:,:) ! geopotential 208 REAL(rstd),ALLOCATABLE,SAVE :: mass(:,:) ! mass209 190 REAL(rstd),ALLOCATABLE,SAVE :: rhodz(:,:) ! mass density 210 191 REAL(rstd),ALLOCATABLE,SAVE :: Fe(:,:) ! mass flux … … 228 209 ALLOCATE(beta(iim*jjm,llm)) 229 210 ALLOCATE(phi(iim*jjm,llm)) ! geopotential 230 ALLOCATE(mass(iim*jjm,llm)) ! mass231 211 ALLOCATE(rhodz(iim*jjm,llm)) ! mass density 232 212 ALLOCATE(Fe(3*iim*jjm,llm)) ! mass flux … … 269 249 ENDDO 270 250 ENDDO 271 272 !!! Compute Exner function273 ! PRINT *, 'Computing Exner'274 CALL compute_exner(ps,p,pks,pk,1)275 251 276 252 !!! Compute mass 277 ! PRINT *, 'Computing mass '253 ! PRINT *, 'Computing mass, theta' 278 254 DO l = 1, llm 279 255 !$OMP DO 280 DO j=jj_begin-1,jj_end+1281 DO i=ii_begin-1,ii_end+1282 ij=(j-1)*iim+i283 mass(ij,l) = ( p(ij,l) - p(ij,l+1) ) * Ai(ij)/g284 rhodz(ij,l) = mass(ij,l) / Ai(ij)285 ENDDO286 ENDDO256 DO j=jj_begin-1,jj_end+1 257 DO i=ii_begin-1,ii_end+1 258 ij=(j-1)*iim+i 259 rhodz(ij,l) = ( p(ij,l) - p(ij,l+1) )/g 260 theta(ij,l) = theta_rhodz(ij,l)/rhodz(ij,l) 261 ENDDO 262 ENDDO 287 263 ENDDO 288 289 !! compute theta290 ! PRINT *, 'Computing theta'291 DO l = 1, llm292 !$OMP DO293 DO j=jj_begin-1,jj_end+1294 DO i=ii_begin-1,ii_end+1295 ij=(j-1)*iim+i296 theta(ij,l) = theta_rhodz(ij,l)/rhodz(ij,l)297 ENDDO298 ENDDO299 ENDDO300 301 302 !!! Compute geopotential303 304 ! for first layer305 !$OMP DO306 DO j=jj_begin-1,jj_end+1307 DO i=ii_begin-1,ii_end+1308 ij=(j-1)*iim+i309 phi( ij,1 ) = phis( ij ) + theta(ij,1) * ( pks(ij) - pk(ij,1) )310 ENDDO311 ENDDO312 313 ! for other layers314 DO l = 2, llm315 !$OMP DO316 DO j=jj_begin-1,jj_end+1317 DO i=ii_begin-1,ii_end+1318 ij=(j-1)*iim+i319 phi(ij,l) = phi(ij,l-1) + 0.5 * ( theta(ij,l) + theta(ij,l-1) ) &320 * ( pk(ij,l-1) - pk(ij,l) )321 ENDDO322 ENDDO323 ENDDO324 325 326 !!! Compute mass flux327 328 DO l = 1, llm329 !$OMP DO330 DO j=jj_begin-1,jj_end+1331 DO i=ii_begin-1,ii_end+1332 ij=(j-1)*iim+i333 Fe(ij+u_right,l)=0.5*(rhodz(ij,l)+rhodz(ij+t_right,l))*u(ij+u_right,l)*le(ij+u_right)334 Fe(ij+u_lup,l)=0.5*(rhodz(ij,l)+rhodz(ij+t_lup,l))*u(ij+u_lup,l)*le(ij+u_lup)335 Fe(ij+u_ldown,l)=0.5*(rhodz(ij,l)+rhodz(ij+t_ldown,l))*u(ij+u_ldown,l)*le(ij+u_ldown)336 ENDDO337 ENDDO338 ENDDO339 340 !!! fisrt composante dtheta341 342 ! Flux on the edge343 DO l = 1, llm344 !$OMP DO345 DO j=jj_begin-1,jj_end+1346 DO i=ii_begin-1,ii_end+1347 ij=(j-1)*iim+i348 Ftheta(ij+u_right,l)=0.5*(theta(ij,l)+theta(ij+t_right,l))*Fe(ij+u_right,l)349 Ftheta(ij+u_lup,l)=0.5*(theta(ij,l)+theta(ij+t_lup,l))*Fe(ij+u_lup,l)350 Ftheta(ij+u_ldown,l)=0.5*(theta(ij,l)+theta(ij+t_ldown,l))*Fe(ij+u_ldown,l)351 ENDDO352 ENDDO353 ENDDO354 355 356 ! compute divergence357 DO l = 1, llm358 !$OMP DO359 DO j=jj_begin,jj_end360 DO i=ii_begin,ii_end361 ij=(j-1)*iim+i362 ! signe ? attention d (rho theta dz)363 ! dtheta_rhodz = -div(flux.theta)364 dtheta_rhodz(ij,l)=-1./Ai(ij)*(ne(ij,right)*Ftheta(ij+u_right,l) + &365 ne(ij,rup)*Ftheta(ij+u_rup,l) + &366 ne(ij,lup)*Ftheta(ij+u_lup,l) + &367 ne(ij,left)*Ftheta(ij+u_left,l) + &368 ne(ij,ldown)*Ftheta(ij+u_ldown,l) + &369 ne(ij,rdown)*Ftheta(ij+u_rdown,l))370 ENDDO371 ENDDO372 ENDDO373 374 375 376 !!! mass flux convergence computation377 378 ! horizontal convergence379 DO l = 1, llm380 !$OMP DO381 DO j=jj_begin,jj_end382 DO i=ii_begin,ii_end383 ij=(j-1)*iim+i384 ! convm = +div(mass flux), sign convention as in Ringler et al. 2012, eq. 21385 convm(ij,l)= 1./Ai(ij)*(ne(ij,right)*Fe(ij+u_right,l) + &386 ne(ij,rup)*Fe(ij+u_rup,l) + &387 ne(ij,lup)*Fe(ij+u_lup,l) + &388 ne(ij,left)*Fe(ij+u_left,l) + &389 ne(ij,ldown)*Fe(ij+u_ldown,l) + &390 ne(ij,rdown)*Fe(ij+u_rdown,l))391 ENDDO392 ENDDO393 ENDDO394 395 396 ! vertical integration from up to down397 DO l = llm-1, 1, -1398 !$OMP DO399 DO j=jj_begin,jj_end400 DO i=ii_begin,ii_end401 ij=(j-1)*iim+i402 convm(ij,l) = convm(ij,l) + convm(ij,l+1)403 ENDDO404 ENDDO405 ENDDO406 407 408 !!! Compute dps409 !$OMP DO410 DO j=jj_begin,jj_end411 DO i=ii_begin,ii_end412 ij=(j-1)*iim+i413 ! dps/dt = -int(div flux)dz414 dps(ij)=-convm(ij,1) * g415 ENDDO416 ENDDO417 418 419 !!! Compute vertical velocity420 DO l = 1,llm-1421 !$OMP DO422 DO j=jj_begin,jj_end423 DO i=ii_begin,ii_end424 ij=(j-1)*iim+i425 ! w = int(z,ztop,div(flux)dz) + B(eta)dps/dt426 ! => w>0 for upward transport427 w( ij, l+1 ) = convm( ij, l+1 ) - bp(l+1) * convm( ij, 1 )428 ENDDO429 ENDDO430 ENDDO431 432 !$OMP DO433 ! vertical mass flux at the surface = 0434 DO j=jj_begin,jj_end435 DO i=ii_begin,ii_end436 ij=(j-1)*iim+i437 w(ij,1) = 0.438 ENDDO439 ENDDO440 441 264 442 265 !!! Compute shallow-water potential vorticity … … 471 294 ENDDO 472 295 296 297 DO l = 1, llm 298 !!! Compute mass and theta fluxes 299 !$OMP DO 300 DO j=jj_begin-1,jj_end+1 301 DO i=ii_begin-1,ii_end+1 302 ij=(j-1)*iim+i 303 Fe(ij+u_right,l)=0.5*(rhodz(ij,l)+rhodz(ij+t_right,l))*u(ij+u_right,l)*le(ij+u_right) 304 Fe(ij+u_lup,l)=0.5*(rhodz(ij,l)+rhodz(ij+t_lup,l))*u(ij+u_lup,l)*le(ij+u_lup) 305 Fe(ij+u_ldown,l)=0.5*(rhodz(ij,l)+rhodz(ij+t_ldown,l))*u(ij+u_ldown,l)*le(ij+u_ldown) 306 307 Ftheta(ij+u_right,l)=0.5*(theta(ij,l)+theta(ij+t_right,l))*Fe(ij+u_right,l) 308 Ftheta(ij+u_lup,l)=0.5*(theta(ij,l)+theta(ij+t_lup,l))*Fe(ij+u_lup,l) 309 Ftheta(ij+u_ldown,l)=0.5*(theta(ij,l)+theta(ij+t_ldown,l))*Fe(ij+u_ldown,l) 310 ENDDO 311 ENDDO 312 313 !!! compute horizontal divergence of fluxes 314 !$OMP DO 315 DO j=jj_begin,jj_end 316 DO i=ii_begin,ii_end 317 ij=(j-1)*iim+i 318 ! convm = +div(mass flux), sign convention as in Ringler et al. 2012, eq. 21 319 convm(ij,l)= 1./Ai(ij)*(ne(ij,right)*Fe(ij+u_right,l) + & 320 ne(ij,rup)*Fe(ij+u_rup,l) + & 321 ne(ij,lup)*Fe(ij+u_lup,l) + & 322 ne(ij,left)*Fe(ij+u_left,l) + & 323 ne(ij,ldown)*Fe(ij+u_ldown,l) + & 324 ne(ij,rdown)*Fe(ij+u_rdown,l)) 325 326 ! signe ? attention d (rho theta dz) 327 ! dtheta_rhodz = -div(flux.theta) 328 dtheta_rhodz(ij,l)=-1./Ai(ij)*(ne(ij,right)*Ftheta(ij+u_right,l) + & 329 ne(ij,rup)*Ftheta(ij+u_rup,l) + & 330 ne(ij,lup)*Ftheta(ij+u_lup,l) + & 331 ne(ij,left)*Ftheta(ij+u_left,l) + & 332 ne(ij,ldown)*Ftheta(ij+u_ldown,l) + & 333 ne(ij,rdown)*Ftheta(ij+u_rdown,l)) 334 ENDDO 335 ENDDO 336 ENDDO 337 338 !!! cumulate mass flux convergence from top to bottom 339 DO l = llm-1, 1, -1 340 !$OMP DO 341 DO j=jj_begin,jj_end 342 DO i=ii_begin,ii_end 343 ij=(j-1)*iim+i 344 convm(ij,l) = convm(ij,l) + convm(ij,l+1) 345 ENDDO 346 ENDDO 347 ENDDO 348 349 !!! Compute vertical mass flux 350 DO l = 1,llm-1 351 !$OMP DO 352 DO j=jj_begin,jj_end 353 DO i=ii_begin,ii_end 354 ij=(j-1)*iim+i 355 ! w = int(z,ztop,div(flux)dz) + B(eta)dps/dt 356 ! => w>0 for upward transport 357 w( ij, l+1 ) = convm( ij, l+1 ) - bp(l+1) * convm( ij, 1 ) 358 ENDDO 359 ENDDO 360 ENDDO 361 362 ! compute dps, vertical mass flux at the surface = 0 363 !$OMP DO 364 DO j=jj_begin,jj_end 365 DO i=ii_begin,ii_end 366 ij=(j-1)*iim+i 367 w(ij,1) = 0. 368 ! dps/dt = -int(div flux)dz 369 dps(ij)=-convm(ij,1) * g 370 ENDDO 371 ENDDO 372 473 373 !!! Compute potential vorticity (Coriolis) contribution to du 474 374 DO l=1,llm … … 521 421 ENDDO 522 422 523 423 !!! Compute Exner function 424 ! PRINT *, 'Computing Exner' 425 CALL compute_exner(ps,p,pks,pk,1) 426 427 !!! Compute geopotential 428 429 ! for first layer 430 !$OMP DO 431 DO j=jj_begin-1,jj_end+1 432 DO i=ii_begin-1,ii_end+1 433 ij=(j-1)*iim+i 434 phi( ij,1 ) = phis( ij ) + theta(ij,1) * ( pks(ij) - pk(ij,1) ) 435 ENDDO 436 ENDDO 437 438 ! for other layers 439 DO l = 2, llm 440 !$OMP DO 441 DO j=jj_begin-1,jj_end+1 442 DO i=ii_begin-1,ii_end+1 443 ij=(j-1)*iim+i 444 phi(ij,l) = phi(ij,l-1) + 0.5 * ( theta(ij,l) + theta(ij,l-1) ) & 445 * ( pk(ij,l-1) - pk(ij,l) ) 446 ENDDO 447 ENDDO 448 ENDDO 449 450 524 451 !!! Compute bernouilli term = Kinetic Energy + geopotential 525 452 DO l=1,llm … … 542 469 543 470 544 !!! second contribution to du (gradients of Bernoulli and Exner functions) 545 DO l=1,llm 546 !$OMP DO 547 DO j=jj_begin,jj_end 548 DO i=ii_begin,ii_end 549 ij=(j-1)*iim+i 550 551 du(ij+u_right,l)= du(ij+u_right,l)+ 1/de(ij+u_right) * ( & 552 0.5*(theta(ij,l)+theta(ij+t_right,l)) & 553 *( ne(ij,right)*pk(ij,l)+ne(ij+t_right,left)*pk(ij+t_right,l)) & 554 + ne(ij,right)*berni(ij,l)+ne(ij+t_right,left)*berni(ij+t_right,l) ) 555 556 du(ij+u_lup,l)= du(ij+u_lup,l)+ 1/de(ij+u_lup) * ( & 557 0.5*(theta(ij,l)+theta(ij+t_lup,l)) & 558 *( ne(ij,lup)*pk(ij,l)+ne(ij+t_lup,rdown)*pk(ij+t_lup,l)) & 559 + ne(ij,lup)*berni(ij,l)+ne(ij+t_lup,rdown)*berni(ij+t_lup,l) ) 560 561 du(ij+u_ldown,l)= du(ij+u_ldown,l)+ 1/de(ij+u_ldown) * ( & 562 0.5*(theta(ij,l)+theta(ij+t_ldown,l)) & 563 *( ne(ij,ldown)*pk(ij,l)+ne(ij+t_ldown,rup)*pk(ij+t_ldown,l)) & 564 + ne(ij,ldown)*berni(ij,l)+ne(ij+t_ldown,rup)*berni(ij+t_ldown,l) ) 565 ENDDO 566 ENDDO 567 ENDDO 568 569 !!! save second contribution to du for debugging output 471 !!! gradients of Bernoulli and Exner functions 570 472 DO l=1,llm 571 473 !$OMP DO … … 579 481 + ne(ij,right)*berni(ij,l)+ne(ij+t_right,left)*berni(ij+t_right,l) ) 580 482 483 du(ij+u_right,l) = du(ij+u_right,l) + out_u(ij+u_right,l) 484 581 485 out_u(ij+u_lup,l)= 1/de(ij+u_lup) * ( & 582 486 0.5*(theta(ij,l)+theta(ij+t_lup,l)) & 583 487 *( ne(ij,lup)*pk(ij,l)+ne(ij+t_lup,rdown)*pk(ij+t_lup,l)) & 584 488 + ne(ij,lup)*berni(ij,l)+ne(ij+t_lup,rdown)*berni(ij+t_lup,l) ) 585 489 490 du(ij+u_lup,l) = du(ij+u_lup,l) + out_u(ij+u_lup,l) 491 586 492 out_u(ij+u_ldown,l)= 1/de(ij+u_ldown) * ( & 587 493 0.5*(theta(ij,l)+theta(ij+t_ldown,l)) & 588 494 *( ne(ij,ldown)*pk(ij,l)+ne(ij+t_ldown,rup)*pk(ij+t_ldown,l)) & 589 495 + ne(ij,ldown)*berni(ij,l)+ne(ij+t_ldown,rup)*berni(ij+t_ldown,l) ) 496 497 du(ij+u_ldown,l) = du(ij+u_ldown,l) + out_u(ij+u_ldown,l) 498 590 499 ENDDO 591 500 ENDDO 592 501 ENDDO 593 594 !!! contributions due to vertical advection595 502 596 ! Contribution to dtheta 503 !!! contributions of vertical advection to du, dtheta 504 597 505 DO l=1,llm-1 598 506 !$OMP DO 599 507 DO j=jj_begin,jj_end 600 508 DO i=ii_begin,ii_end 509 ij=(j-1)*iim+i 601 510 ! ww>0 <=> upward transport 602 ij=(j-1)*iim+i 511 603 512 ww = 0.5 * w(ij,l+1) * (theta(ij,l) + theta(ij,l+1) ) 604 513 dtheta_rhodz(ij, l ) = dtheta_rhodz(ij, l ) - ww 605 514 dtheta_rhodz(ij,l+1) = dtheta_rhodz(ij,l+1) + ww 606 ENDDO 607 ENDDO 608 ENDDO 609 610 611 ! Contribution to du 612 DO l=1,llm-1 613 !$OMP DO 614 DO j=jj_begin,jj_end 615 DO i=ii_begin,ii_end 616 ij=(j-1)*iim+i 515 617 516 ww = 0.5 * ( w(ij,l+1) + w(ij+t_right,l+1)) 618 517 uu = u(ij+u_right,l+1) - u(ij+u_right,l) … … 643 542 DEALLOCATE(beta) 644 543 DEALLOCATE(phi) ! geopotential 645 DEALLOCATE(mass) ! mass544 ! DEALLOCATE(mass) ! mass 646 545 DEALLOCATE(rhodz) ! mass density 647 546 DEALLOCATE(Fe) ! mass flux
Note: See TracChangeset
for help on using the changeset viewer.