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 9299 for branches/UKMO/r6232_tracer_advection/NEMOGCM/NEMO/OPA_SRC/TRA/tranxt.F90 – NEMO

Ignore:
Timestamp:
2018-02-01T13:12:00+01:00 (6 years ago)
Author:
jcastill
Message:

First implementation of tracers - it has not been properly tested yet

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/UKMO/r6232_tracer_advection/NEMOGCM/NEMO/OPA_SRC/TRA/tranxt.F90

    r9295 r9299  
    129129      IF( l_trdtra )   THEN                    ! store now fields before applying the Asselin filter 
    130130         CALL wrk_alloc( jpi, jpj, jpk, ztrdt, ztrds ) 
    131          ztrdt(:,:,:) = tsn(:,:,:,jp_tem)  
    132          ztrds(:,:,:) = tsn(:,:,:,jp_sal) 
     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       ENDIF 
    138  
     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  
     152         CALL trd_tra( kt, 'TRA', jp_tem, jptra_atf, ztrdt ) 
     153         CALL trd_tra( kt, 'TRA', jp_sal, jptra_atf, ztrds ) 
     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 
     160      END IF 
     161      ! 
    139162      IF( neuler == 0 .AND. kt == nit000 ) THEN       ! Euler time-stepping at first time-step (only swap) 
    140163         DO jn = 1, jpts 
     
    143166            END DO 
    144167         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 
    145175      ELSE                                            ! Leap-Frog + Asselin filter time stepping 
    146176         ! 
     
    152182      ! 
    153183     ! trends computation 
    154       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      
    155185         DO jk = 1, jpkm1 
    156186            zfact = 1._wp / r2dtra(jk)              
     
    160190         CALL trd_tra( kt, 'TRA', jp_tem, jptra_atf, ztrdt ) 
    161191         CALL trd_tra( kt, 'TRA', jp_sal, jptra_atf, ztrds ) 
    162          CALL wrk_dealloc( jpi, jpj, jpk, ztrdt, ztrds ) 
    163192      END IF 
    164       ! 
     193      IF( l_trdtra) CALL wrk_dealloc( jpi, jpj, jpk, ztrdt, ztrds ) 
    165194      !                        ! control print 
    166195      IF(ln_ctl)   CALL prt_ctl( tab3d_1=tsn(:,:,:,jp_tem), clinfo1=' nxt  - Tn: ', mask1=tmask,   & 
     
    277306      LOGICAL  ::   ll_tra_hpg, ll_traqsr, ll_rnf, ll_isf   ! local logical 
    278307      INTEGER  ::   ji, jj, jk, jn              ! dummy loop indices 
    279       REAL(wp) ::   zfact1, ztc_a , ztc_n , ztc_b , ztc_f , ztc_d    ! local scalar 
     308      REAL(wp) ::   zfact, zfact1, ztc_a , ztc_n , ztc_b , ztc_f , ztc_d    ! local scalar 
    280309      REAL(wp) ::   zfact2, ze3t_b, ze3t_n, ze3t_a, ze3t_f, ze3t_d   !   -      - 
     310      REAL(wp), POINTER, DIMENSION(:,:,:,:) :: ztrd_atf 
    281311      !!---------------------------------------------------------------------- 
    282312      ! 
     
    303333      ENDIF 
    304334      ! 
     335      IF( ( l_trdtra .AND. cdtype == 'TRA' ) .OR. ( l_trdtrc .AND. cdtype == 'TRC' ) )   THEN 
     336         CALL wrk_alloc( jpi, jpj, jpk, kjpt, ztrd_atf )  
     337         ztrd_atf(:,:,:,:) = 0.0_wp  
     338      ENDIF  
    305339      DO jn = 1, kjpt       
    306340         DO jk = 1, jpkm1 
     341            zfact = 1._wp / p2dt(jk) 
    307342            zfact1 = atfp * p2dt(jk) 
    308343            zfact2 = zfact1 / rau0 
     
    359394                     pta(ji,jj,jk,jn) = ze3t_d * ( ztc_n  + rbcp * ztc_d  )   ! ta <-- Brown & Campana average 
    360395                  ENDIF 
     396                  IF( ( l_trdtra .AND. cdtype == 'TRA' ) .OR. ( l_trdtrc .AND. cdtype == 'TRC' ) ) THEN 
     397                     ztrd_atf(ji,jj,jk,jn) = (ztc_f - ztc_n) * zfact/ze3t_n  
     398                  ENDIF  
    361399               END DO 
    362400            END DO 
     
    365403      END DO 
    366404      ! 
     405      IF( l_trdtra .AND. cdtype == 'TRA' ) THEN   
     406         CALL trd_tra( kt, cdtype, jp_tem, jptra_atf, ztrd_atf(:,:,:,jp_tem) )  
     407         CALL trd_tra( kt, cdtype, jp_sal, jptra_atf, ztrd_atf(:,:,:,jp_sal) )  
     408         CALL wrk_dealloc( jpi, jpj, jpk, kjpt, ztrd_atf )  
     409      ENDIF  
     410      IF( l_trdtrc .AND. cdtype == 'TRC' ) THEN  
     411         DO jn = 1, kjpt  
     412            CALL trd_tra( kt, cdtype, jn, jptra_atf, ztrd_atf(:,:,:,jn) )  
     413         END DO  
     414         CALL wrk_dealloc( jpi, jpj, jpk, kjpt, ztrd_atf )  
     415      ENDIF  
     416 
    367417   END SUBROUTINE tra_nxt_vvl 
    368418 
Note: See TracChangeset for help on using the changeset viewer.