New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
Changeset 6731 for branches/UKMO/dev_r5518_GO6_package_MEDUSA_extra_CMIP6_diags/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_tvd.F90 – NEMO

Ignore:
Timestamp:
2016-06-22T13:43:26+02:00 (8 years ago)
Author:
malcolmroberts
Message:

Merged in the code from v3_6_extra_CMIP6_diagnostics, incorporating some further
changes to field_def.xml, some bug fixes in traadv_eiv from Daley Calvert

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/UKMO/dev_r5518_GO6_package_MEDUSA_extra_CMIP6_diags/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_tvd.F90

    r6487 r6731  
    3434   USE timing         ! Timing 
    3535   USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
     36   USE iom 
    3637 
    3738   IMPLICIT NONE 
     
    4243 
    4344   LOGICAL ::   l_trd   ! flag to compute trends 
     45   LOGICAL ::   l_trans   ! flag to output vertically integrated transports 
    4446 
    4547   !! * Substitutions 
     
    8587      REAL(wp) ::   zfm_ui, zfm_vj, zfm_wk   !   -      - 
    8688      REAL(wp), POINTER, DIMENSION(:,:,:) :: zwi, zwz 
    87       REAL(wp), POINTER, DIMENSION(:,:,:) :: ztrdx, ztrdy, ztrdz 
     89      REAL(wp), POINTER, DIMENSION(:,:,:) :: ztrdx, ztrdy, ztrdz, zptry 
     90      REAL(wp), POINTER, DIMENSION(:,:)   :: z2d 
    8891      !!---------------------------------------------------------------------- 
    8992      ! 
     
    98101         ! 
    99102         l_trd = .FALSE. 
     103         l_trans = .FALSE. 
    100104         IF( ( cdtype == 'TRA' .AND. l_trdtra ) .OR. ( cdtype == 'TRC' .AND. l_trdtrc ) ) l_trd = .TRUE. 
     105         IF( cdtype == 'TRA' .AND. (iom_use("uadv_heattr") .OR. iom_use("vadv_heattr") ) ) l_trans = .TRUE. 
    101106      ENDIF 
    102107      ! 
    103       IF( l_trd )  THEN 
     108      IF( l_trd .OR. l_trans )  THEN 
    104109         CALL wrk_alloc( jpi, jpj, jpk, ztrdx, ztrdy, ztrdz ) 
    105110         ztrdx(:,:,:) = 0.e0   ;    ztrdy(:,:,:) = 0.e0   ;   ztrdz(:,:,:) = 0.e0 
     111         CALL wrk_alloc( jpi, jpj, z2d ) 
     112      ENDIF 
     113      ! 
     114      IF( cdtype == 'TRA' .AND. ln_diaptr ) THEN   
     115         CALL wrk_alloc( jpi, jpj, jpk, zptry ) 
     116         zptry(:,:,:) = 0._wp 
    106117      ENDIF 
    107118      ! 
     
    188199 
    189200         !                                 ! trend diagnostics (contribution of upstream fluxes) 
    190          IF( l_trd )  THEN  
     201         IF( l_trd .OR. l_trans )  THEN  
    191202            ! store intermediate advective trends 
    192203            ztrdx(:,:,:) = zwx(:,:,:)   ;    ztrdy(:,:,:) = zwy(:,:,:)  ;   ztrdz(:,:,:) = zwz(:,:,:) 
    193204         END IF 
    194205         !                                 ! "Poleward" heat and salt transports (contribution of upstream fluxes) 
    195          IF( cdtype == 'TRA' .AND. ln_diaptr ) THEN   
    196            IF( jn == jp_tem )  htr_adv(:) = ptr_sj( zwy(:,:,:) ) 
    197            IF( jn == jp_sal )  str_adv(:) = ptr_sj( zwy(:,:,:) ) 
    198          ENDIF 
     206         IF( cdtype == 'TRA' .AND. ln_diaptr )    zptry(:,:,:) = zwy(:,:,:)  
    199207 
    200208         ! 3. antidiffusive flux : high order minus low order 
     
    254262 
    255263         !                                 ! trend diagnostics (contribution of upstream fluxes) 
    256          IF( l_trd )  THEN  
     264         IF( l_trd .OR. l_trans )  THEN  
    257265            ztrdx(:,:,:) = ztrdx(:,:,:) + zwx(:,:,:)  ! <<< Add to previously computed 
    258266            ztrdy(:,:,:) = ztrdy(:,:,:) + zwy(:,:,:)  ! <<< Add to previously computed 
    259267            ztrdz(:,:,:) = ztrdz(:,:,:) + zwz(:,:,:)  ! <<< Add to previously computed 
    260              
    261             CALL trd_tra( kt, cdtype, jn, jptra_xad, ztrdx, pun, ptn(:,:,:,jn) )    
    262             CALL trd_tra( kt, cdtype, jn, jptra_yad, ztrdy, pvn, ptn(:,:,:,jn) )   
    263             CALL trd_tra( kt, cdtype, jn, jptra_zad, ztrdz, pwn, ptn(:,:,:,jn) )  
     268         ENDIF 
     269          
     270         IF( l_trd ) THEN  
     271            CALL trd_tra( kt, cdtype, jn, jptra_xad, ztrdx, pun, ptn(:,:,:,jn) ) 
     272            CALL trd_tra( kt, cdtype, jn, jptra_yad, ztrdy, pvn, ptn(:,:,:,jn) ) 
     273            CALL trd_tra( kt, cdtype, jn, jptra_zad, ztrdz, pwn, ptn(:,:,:,jn) ) 
    264274         END IF 
    265          !                                 ! "Poleward" heat and salt transports (contribution of upstream fluxes) 
     275 
     276         IF( l_trans .AND. jn==jp_tem ) THEN 
     277            z2d(:,:) = 0._wp  
     278            DO jk = 1, jpkm1 
     279               DO jj = 2, jpjm1 
     280                  DO ji = fs_2, fs_jpim1   ! vector opt. 
     281                     z2d(ji,jj) = z2d(ji,jj) + ztrdx(ji,jj,jk)  
     282                  END DO 
     283               END DO 
     284            END DO 
     285            CALL lbc_lnk( z2d, 'U', -1. ) 
     286            CALL iom_put( "uadv_heattr", rau0_rcp * z2d )       ! heat transport in i-direction 
     287              ! 
     288            z2d(:,:) = 0._wp  
     289            DO jk = 1, jpkm1 
     290               DO jj = 2, jpjm1 
     291                  DO ji = fs_2, fs_jpim1   ! vector opt. 
     292                     z2d(ji,jj) = z2d(ji,jj) + ztrdy(ji,jj,jk)  
     293                  END DO 
     294               END DO 
     295            END DO 
     296            CALL lbc_lnk( z2d, 'V', -1. ) 
     297            CALL iom_put( "vadv_heattr", rau0_rcp * z2d )       ! heat transport in j-direction 
     298         ENDIF 
     299         ! "Poleward" heat and salt transports (contribution of upstream fluxes) 
    266300         IF( cdtype == 'TRA' .AND. ln_diaptr ) THEN   
    267            IF( jn == jp_tem )  htr_adv(:) = ptr_sj( zwy(:,:,:) ) + htr_adv(:) 
    268            IF( jn == jp_sal )  str_adv(:) = ptr_sj( zwy(:,:,:) ) + str_adv(:) 
     301            zptry(:,:,:) = zptry(:,:,:) + zwy(:,:,:)  ! <<< Add to previously computed 
     302            CALL dia_ptr_ohst_components( jn, 'adv', zptry(:,:,:) ) 
    269303         ENDIF 
    270304         ! 
    271305      END DO 
    272306      ! 
    273                    CALL wrk_dealloc( jpi, jpj, jpk, zwi, zwz ) 
    274       IF( l_trd )  CALL wrk_dealloc( jpi, jpj, jpk, ztrdx, ztrdy, ztrdz ) 
     307      CALL wrk_dealloc( jpi, jpj, jpk, zwi, zwz ) 
     308      IF( l_trd .OR. l_trans )  THEN  
     309         CALL wrk_dealloc( jpi, jpj, jpk, ztrdx, ztrdy, ztrdz ) 
     310         CALL wrk_dealloc( jpi, jpj, z2d ) 
     311      ENDIF 
     312      IF( cdtype == 'TRA' .AND. ln_diaptr ) CALL wrk_dealloc( jpi, jpj, jpk, zptry ) 
    275313      ! 
    276314      IF( nn_timing == 1 )  CALL timing_stop('tra_adv_tvd') 
     
    319357      REAL(wp), POINTER, DIMENSION(:,:,:) :: zwi, zwz, zhdiv, zwz_sav, zwzts 
    320358      REAL(wp), POINTER, DIMENSION(:,:,:) :: ztrdx, ztrdy, ztrdz 
     359      REAL(wp), POINTER, DIMENSION(:,:,:) :: zptry 
    321360      REAL(wp), POINTER, DIMENSION(:,:,:,:) :: ztrs 
    322361      !!---------------------------------------------------------------------- 
     
    340379         CALL wrk_alloc( jpi, jpj, jpk, ztrdx, ztrdy, ztrdz ) 
    341380         ztrdx(:,:,:) = 0._wp  ;    ztrdy(:,:,:) = 0._wp  ;   ztrdz(:,:,:) = 0._wp 
     381      ENDIF 
     382      ! 
     383      IF( cdtype == 'TRA' .AND. ln_diaptr ) THEN   
     384         CALL wrk_alloc( jpi, jpj,jpk, zptry ) 
     385         zptry(:,:,:) = 0._wp 
    342386      ENDIF 
    343387      ! 
     
    430474         END IF 
    431475         !                                 ! "Poleward" heat and salt transports (contribution of upstream fluxes) 
    432          IF( cdtype == 'TRA' .AND. ln_diaptr ) THEN   
    433            IF( jn == jp_tem )  htr_adv(:) = ptr_sj( zwy(:,:,:) ) 
    434            IF( jn == jp_sal )  str_adv(:) = ptr_sj( zwy(:,:,:) ) 
    435          ENDIF 
     476         IF( cdtype == 'TRA' .AND. ln_diaptr )  zptry(:,:,:) = zwy(:,:,:) 
    436477 
    437478         ! 3. antidiffusive flux : high order minus low order 
     
    557598         !                                 ! "Poleward" heat and salt transports (contribution of upstream fluxes) 
    558599         IF( cdtype == 'TRA' .AND. ln_diaptr ) THEN   
    559            IF( jn == jp_tem )  htr_adv(:) = ptr_sj( zwy(:,:,:) ) + htr_adv(:) 
    560            IF( jn == jp_sal )  str_adv(:) = ptr_sj( zwy(:,:,:) ) + str_adv(:) 
     600            zptry(:,:,:) = zptry(:,:,:) + zwy(:,:,:)  
     601            CALL dia_ptr_ohst_components( jn, 'adv', zptry(:,:,:) ) 
    561602         ENDIF 
    562603         ! 
     
    567608                   CALL wrk_dealloc( jpi, jpj, zwx_sav, zwy_sav ) 
    568609      IF( l_trd )  CALL wrk_dealloc( jpi, jpj, jpk, ztrdx, ztrdy, ztrdz ) 
     610      IF( cdtype == 'TRA' .AND. ln_diaptr ) CALL wrk_dealloc( jpi, jpj, jpk, zptry ) 
    569611      ! 
    570612      IF( nn_timing == 1 )  CALL timing_stop('tra_adv_tvd_zts') 
Note: See TracChangeset for help on using the changeset viewer.