Ignore:
Timestamp:
2017-05-31T11:08:52+02:00 (3 years ago)
Author:
davestorkey
Message:

NEMO 3.6_stable: tracer trends diagnostics. See ticket #1877 for more details.

  1. Correct bugs in calculation of total trends and trends due to vertical diffusion.
  2. Output component trends every second timestep so that sum of component trends plus Asselin filter trend equals total trend.
  3. Layer-integrated versions of trends (as per CMIP6 definition) available in field_def.xml.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2015/nemo_v3_6_STABLE/NEMOGCM/NEMO/OPA_SRC/TRA/tranxt.F90

    r7555 r8102  
    129129      IF( l_trdtra )   THEN                     
    130130         CALL wrk_alloc( jpi, jpj, jpk, ztrdt, ztrds ) 
    131          ztrdt(:,:,jk) = 0._wp 
    132          ztrds(:,:,jk) = 0._wp 
     131         ztrdt(:,:,jpk) = 0._wp 
     132         ztrds(:,:,jpk) = 0._wp 
    133133         IF( ln_traldf_iso ) THEN              ! diagnose the "pure" Kz diffusive trend  
    134134            CALL trd_tra( kt, 'TRA', jp_tem, jptra_zdfp, ztrdt ) 
    135135            CALL trd_tra( kt, 'TRA', jp_sal, jptra_zdfp, ztrds ) 
    136136         ENDIF 
    137          ! total trend for the non-time-filtered variables.  
    138          DO jk = 1, jpkm1 
    139             zfact = 1.0 / rdttra(jk) 
    140             ztrdt(:,:,jk) = ( tsa(:,:,jk,jp_tem) - tsn(:,:,jk,jp_tem) ) * zfact  
    141             ztrds(:,:,jk) = ( tsa(:,:,jk,jp_sal) - tsn(:,:,jk,jp_sal) ) * zfact  
    142          END DO 
     137         ! total trend for the non-time-filtered variables. 
     138         ! G Nurser 23 Mar 2017. Recalculate trend as Delta(e3t*T)/e3tn; e3tn cancel from tsn terms 
     139         IF( lk_vvl ) THEN 
     140            DO jk = 1, jpkm1 
     141               zfact = 1.0 / rdttra(jk) 
     142               ztrdt(:,:,jk) = ( tsa(:,:,jk,jp_tem)*fse3t_a(:,:,jk) / fse3t_n(:,:,jk) - tsn(:,:,jk,jp_tem)) * zfact 
     143               ztrds(:,:,jk) = ( tsa(:,:,jk,jp_sal)*fse3t_a(:,:,jk) / fse3t_n(:,:,jk) - tsn(:,:,jk,jp_sal)) * zfact 
     144            END DO 
     145         ELSE 
     146            DO jk = 1, jpkm1 
     147               zfact = 1.0 / rdttra(jk) 
     148               ztrdt(:,:,jk) = ( tsa(:,:,jk,jp_tem) - tsn(:,:,jk,jp_tem) ) * zfact  
     149               ztrds(:,:,jk) = ( tsa(:,:,jk,jp_sal) - tsn(:,:,jk,jp_sal) ) * zfact  
     150            END DO 
     151         END IF 
    143152         CALL trd_tra( kt, 'TRA', jp_tem, jptra_tot, ztrdt ) 
    144153         CALL trd_tra( kt, 'TRA', jp_sal, jptra_tot, ztrds ) 
    145          ! Store now fields before applying the Asselin filter  
    146          ! in order to calculate Asselin filter trend later. 
    147          ztrdt(:,:,:) = tsn(:,:,:,jp_tem)  
    148          ztrds(:,:,:) = tsn(:,:,:,jp_sal) 
     154         IF( .NOT.lk_vvl )  THEN 
     155            ! Store now fields before applying the Asselin filter  
     156            ! in order to calculate Asselin filter trend later. 
     157            ztrdt(:,:,:) = tsn(:,:,:,jp_tem)  
     158            ztrds(:,:,:) = tsn(:,:,:,jp_sal) 
     159         END IF 
    149160      ENDIF 
    150161 
     
    155166            END DO 
    156167         END DO 
     168         IF (l_trdtra.AND.lk_vvl) THEN      ! Zero Asselin filter contribution must be explicitly written out since for vvl 
     169                                            ! Asselin filter is output by tra_nxt_vvl that is not called on this time step 
     170            ztrdt(:,:,:) = 0._wp 
     171            ztrds(:,:,:) = 0._wp 
     172            CALL trd_tra( kt, 'TRA', jp_tem, jptra_atf, ztrdt ) 
     173            CALL trd_tra( kt, 'TRA', jp_sal, jptra_atf, ztrds ) 
     174         END IF 
    157175      ELSE                                            ! Leap-Frog + Asselin filter time stepping 
    158176         ! 
     
    164182      ! 
    165183     ! trends computation 
    166       IF( l_trdtra ) THEN      ! trend of the Asselin filter (tb filtered - tb)/dt      
     184      IF( l_trdtra.AND..NOT.lk_vvl) THEN      ! trend of the Asselin filter (tb filtered - tb)/dt      
    167185         DO jk = 1, jpkm1 
    168186            zfact = 1._wp / r2dtra(jk)              
     
    172190         CALL trd_tra( kt, 'TRA', jp_tem, jptra_atf, ztrdt ) 
    173191         CALL trd_tra( kt, 'TRA', jp_sal, jptra_atf, ztrds ) 
    174          CALL wrk_dealloc( jpi, jpj, jpk, ztrdt, ztrds ) 
    175192      END IF 
     193      IF( l_trdtra) CALL wrk_dealloc( jpi, jpj, jpk, ztrdt, ztrds ) 
    176194      ! 
    177195      !                        ! control print 
     
    289307      LOGICAL  ::   ll_tra_hpg, ll_traqsr, ll_rnf, ll_isf   ! local logical 
    290308      INTEGER  ::   ji, jj, jk, jn              ! dummy loop indices 
    291       REAL(wp) ::   zfact1, ztc_a , ztc_n , ztc_b , ztc_f , ztc_d    ! local scalar 
     309      REAL(wp) ::   zfact, zfact1, ztc_a , ztc_n , ztc_b , ztc_f , ztc_d    ! local scalar 
    292310      REAL(wp) ::   zfact2, ze3t_b, ze3t_n, ze3t_a, ze3t_f, ze3t_d   !   -      - 
     311      REAL(wp), POINTER, DIMENSION(:,:,:,:) :: ztrd_atf 
    293312      !!---------------------------------------------------------------------- 
    294313      ! 
     
    315334      ENDIF 
    316335      ! 
     336      IF( l_trdtra )   THEN 
     337         CALL wrk_alloc( jpi, jpj, jpk, kjpt, ztrd_atf ) 
     338         ztrd_atf(:,:,:,:) = 0.0_wp 
     339      ENDIF 
    317340      DO jn = 1, kjpt       
    318341         DO jk = 1, jpkm1 
     342            zfact = 1._wp / r2dtra(jk) 
    319343            zfact1 = atfp * p2dt(jk) 
    320344            zfact2 = zfact1 / rau0 
     
    371395                     pta(ji,jj,jk,jn) = ze3t_d * ( ztc_n  + rbcp * ztc_d  )   ! ta <-- Brown & Campana average 
    372396                  ENDIF 
     397                  IF( l_trdtra ) THEN 
     398                     ztrd_atf(ji,jj,jk,jn) = (ztc_f - ztc_n) * zfact/ze3t_n 
     399                  ENDIF 
    373400               END DO 
    374401            END DO 
     
    377404      END DO 
    378405      ! 
     406      IF( l_trdtra ) THEN 
     407         CALL trd_tra( kt, 'TRA', jp_tem, jptra_atf, ztrd_atf(:,:,:,jp_tem) ) 
     408         CALL trd_tra( kt, 'TRA', jp_sal, jptra_atf, ztrd_atf(:,:,:,jp_sal) ) 
     409         CALL wrk_dealloc( jpi, jpj, jpk, kjpt, ztrd_atf ) 
     410      ENDIF 
     411 
    379412   END SUBROUTINE tra_nxt_vvl 
    380413 
Note: See TracChangeset for help on using the changeset viewer.