Ignore:
Timestamp:
10/19/17 17:04:26 (7 years ago)
Author:
dubos
Message:

trunk : backported commits r582-r598 (transport diagnostics)

File:
1 moved

Legend:

Unmodified
Added
Removed
  • codes/icosagcm/trunk/src/transport/advect.F90

    r581 r599  
    425425  ! Horizontal transport (S. Dubey, T. Dubos) 
    426426  ! 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) 
    428428    USE trace 
    429429    USE omp_para 
    430430    IMPLICIT NONE 
    431     LOGICAL, INTENT(IN)       :: update_mass 
     431    LOGICAL, INTENT(IN)       :: update_mass, diagflux_on 
    432432    REAL(rstd), INTENT(IN)    :: gradq3d(iim*jjm,llm,3)  
    433433    REAL(rstd), INTENT(IN)    :: hfluxt(3*iim*jjm,llm) ! mass flux 
     
    435435    REAL(rstd), INTENT(INOUT) :: mass(iim*jjm,llm) 
    436436    REAL(rstd), INTENT(INOUT) :: qi(iim*jjm,llm) 
     437    REAL(rstd), INTENT(INOUT) :: qfluxt(3*iim*jjm,llm) ! time-integrated tracer flux 
    437438 
    438439    REAL(rstd) :: dq,dmass,qe,ed(3), newmass 
     
    441442 
    442443    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" 
    514445    CALL trace_end("compute_advect_horiz") 
    515   CONTAINS 
    516  
    517     !==================================================================================== 
    518     PURE REAL(rstd) FUNCTION sum2(a1,a2) 
    519       IMPLICIT NONE 
    520       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 scheme 
    523     END FUNCTION sum2 
    524  
    525446  END SUBROUTINE compute_advect_horiz 
    526447 
Note: See TracChangeset for help on using the changeset viewer.