Changeset 599 for codes/icosagcm/trunk/src/transport/advect.F90
- Timestamp:
- 10/19/17 17:04:26 (7 years ago)
- File:
-
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
codes/icosagcm/trunk/src/transport/advect.F90
r581 r599 425 425 ! Horizontal transport (S. Dubey, T. Dubos) 426 426 ! Slope-limited van Leer approach with hexagons 427 SUBROUTINE compute_advect_horiz(update_mass, hfluxt,cc,gradq3d, mass,qi)427 SUBROUTINE compute_advect_horiz(update_mass,diagflux_on, hfluxt,cc,gradq3d, mass,qi,qfluxt) 428 428 USE trace 429 429 USE omp_para 430 430 IMPLICIT NONE 431 LOGICAL, INTENT(IN) :: update_mass 431 LOGICAL, INTENT(IN) :: update_mass, diagflux_on 432 432 REAL(rstd), INTENT(IN) :: gradq3d(iim*jjm,llm,3) 433 433 REAL(rstd), INTENT(IN) :: hfluxt(3*iim*jjm,llm) ! mass flux … … 435 435 REAL(rstd), INTENT(INOUT) :: mass(iim*jjm,llm) 436 436 REAL(rstd), INTENT(INOUT) :: qi(iim*jjm,llm) 437 REAL(rstd), INTENT(INOUT) :: qfluxt(3*iim*jjm,llm) ! time-integrated tracer flux 437 438 438 439 REAL(rstd) :: dq,dmass,qe,ed(3), newmass … … 441 442 442 443 CALL trace_start("compute_advect_horiz") 443 444 ! evaluate tracer field at point cc using piecewise linear reconstruction 445 ! q(cc)= q0 + gradq.(cc-xyz_i) with xi centroid of hexagon 446 ! ne*hfluxt>0 iff outgoing 447 DO l = ll_begin,ll_end 448 449 !DIR$ SIMD 450 DO ij=ij_begin_ext,ij_end_ext 451 452 IF (ne(ij,right)*hfluxt(ij+u_right,l)>0) THEN 453 ed = cc(ij+u_right,l,:) - xyz_i(ij,:) 454 ! qe = qi(ij,l)+sum2(gradq3d(ij,l,:),ed) 455 qe = qi(ij,l)+gradq3d(ij,l,1)*ed(1)+gradq3d(ij,l,2)*ed(2)+gradq3d(ij,l,3)*ed(3) 456 ELSE 457 ed = cc(ij+u_right,l,:) - xyz_i(ij+t_right,:) 458 ! qe = qi(ij+t_right,l)+sum2(gradq3d(ij+t_right,l,:),ed) 459 qe = qi(ij+t_right,l) + gradq3d(ij+t_right,l,1)*ed(1)+gradq3d(ij+t_right,l,2)*ed(2)+gradq3d(ij+t_right,l,3)*ed(3) 460 ENDIF 461 qflux(ij+u_right,l) = hfluxt(ij+u_right,l)*qe 462 463 IF (ne(ij,lup)*hfluxt(ij+u_lup,l)>0) THEN 464 ed = cc(ij+u_lup,l,:) - xyz_i(ij,:) 465 ! qe = qi(ij,l)+sum2(gradq3d(ij,l,:),ed) 466 qe = qi(ij,l) + gradq3d(ij,l,1)*ed(1)+gradq3d(ij,l,2)*ed(2)+gradq3d(ij,l,3)*ed(3) 467 ELSE 468 ed = cc(ij+u_lup,l,:) - xyz_i(ij+t_lup,:) 469 ! qe = qi(ij+t_lup,l)+sum2(gradq3d(ij+t_lup,l,:),ed) 470 qe = qi(ij+t_lup,l) + gradq3d(ij+t_lup,l,1)*ed(1)+gradq3d(ij+t_lup,l,2)*ed(2)+gradq3d(ij+t_lup,l,3)*ed(3) 471 ENDIF 472 qflux(ij+u_lup,l) = hfluxt(ij+u_lup,l)*qe 473 474 IF (ne(ij,ldown)*hfluxt(ij+u_ldown,l)>0) THEN 475 ed = cc(ij+u_ldown,l,:) - xyz_i(ij,:) 476 ! qe = qi(ij,l)+sum2(gradq3d(ij,l,:),ed) 477 qe = qi(ij,l) + gradq3d(ij,l,1)*ed(1)+gradq3d(ij,l,2)*ed(2)+gradq3d(ij,l,3)*ed(3) 478 ELSE 479 ed = cc(ij+u_ldown,l,:) - xyz_i(ij+t_ldown,:) 480 ! qe = qi(ij+t_ldown,l)+sum2(gradq3d(ij+t_ldown,l,:),ed) 481 qe = qi(ij+t_ldown,l)+gradq3d(ij+t_ldown,l,1)*ed(1)+gradq3d(ij+t_ldown,l,2)*ed(2)+gradq3d(ij+t_ldown,l,3)*ed(3) 482 ENDIF 483 qflux(ij+u_ldown,l) = hfluxt(ij+u_ldown,l)*qe 484 END DO 485 END DO 486 487 ! update q and, if update_mass, update mass 488 DO l = ll_begin,ll_end 489 !DIR$ SIMD 490 DO ij=ij_begin,ij_end 491 ! sign convention as Ringler et al. (2010) eq. 21 492 dmass = hfluxt(ij+u_right,l)*ne(ij,right) & 493 + hfluxt(ij+u_lup,l) *ne(ij,lup) & 494 + hfluxt(ij+u_ldown,l)*ne(ij,ldown) & 495 + hfluxt(ij+u_rup,l) *ne(ij,rup) & 496 + hfluxt(ij+u_left,l) *ne(ij,left) & 497 + hfluxt(ij+u_rdown,l)*ne(ij,rdown) 498 499 dq = qflux(ij+u_right,l) *ne(ij,right) & 500 + qflux(ij+u_lup,l) *ne(ij,lup) & 501 + qflux(ij+u_ldown,l) *ne(ij,ldown) & 502 + qflux(ij+u_rup,l) *ne(ij,rup) & 503 + qflux(ij+u_left,l) *ne(ij,left) & 504 + qflux(ij+u_rdown,l) *ne(ij,rdown) 505 506 507 newmass = mass(ij,l) - dmass/Ai(ij) 508 qi(ij,l) = (qi(ij,l)*mass(ij,l) - dq/Ai(ij) ) / newmass 509 IF(update_mass) mass(ij,l) = newmass 510 511 END DO 512 END DO 513 444 #include "../kernels/advect_horiz.k90" 514 445 CALL trace_end("compute_advect_horiz") 515 CONTAINS516 517 !====================================================================================518 PURE REAL(rstd) FUNCTION sum2(a1,a2)519 IMPLICIT NONE520 REAL(rstd),INTENT(IN):: a1(3), a2(3)521 sum2 = a1(1)*a2(1)+a1(2)*a2(2)+a1(3)*a2(3)522 ! sum2 = 0. ! Godunov scheme523 END FUNCTION sum2524 525 446 END SUBROUTINE compute_advect_horiz 526 447
Note: See TracChangeset
for help on using the changeset viewer.