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 2528 for trunk/NEMOGCM/NEMO/TOP_SRC/TRP/trcnxt.F90 – NEMO

Ignore:
Timestamp:
2010-12-27T18:33:53+01:00 (13 years ago)
Author:
rblod
Message:

Update NEMOGCM from branch nemo_v3_3_beta

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/NEMOGCM/NEMO/TOP_SRC/TRP/trcnxt.F90

    • Property svn:executable deleted
    r1271 r2528  
    55   !!====================================================================== 
    66   !!====================================================================== 
    7    !! History :  7.0  !  91-11  (G. Madec)  Original code 
    8    !!                 !  93-03  (M. Guyon)  symetrical conditions 
    9    !!                 !  95-02  (M. Levy)   passive tracers 
    10    !!                 !  96-02  (G. Madec & M. Imbard)  opa release 8.0 
    11    !!            8.0  !  96-04  (A. Weaver)  Euler forward step 
    12    !!            8.2  !  99-02  (G. Madec, N. Grima)  semi-implicit pressure grad. 
    13    !!            8.5  !  02-08  (G. Madec)  F90: Free form and module 
    14    !!                 !  02-11  (C. Talandier, A-M Treguier) Open boundaries 
    15    !!            9.0  !  04-03  (C. Ethe) passive tracers 
    16    !!                 !  07-02  (C. Deltel) Diagnose ML trends for passive tracers 
     7   !! History :  7.0  !  1991-11  (G. Madec)  Original code 
     8   !!                 !  1993-03  (M. Guyon)  symetrical conditions 
     9   !!                 !  1995-02  (M. Levy)   passive tracers 
     10   !!                 !  1996-02  (G. Madec & M. Imbard)  opa release 8.0 
     11   !!            8.0  !  1996-04  (A. Weaver)  Euler forward step 
     12   !!            8.2  !  1999-02  (G. Madec, N. Grima)  semi-implicit pressure grad. 
     13   !!  NEMO      1.0  !  2002-08  (G. Madec)  F90: Free form and module 
     14   !!                 !  2002-08  (G. Madec)  F90: Free form and module 
     15   !!                 !  2002-11  (C. Talandier, A-M Treguier) Open boundaries 
     16   !!                 !  2004-03  (C. Ethe) passive tracers 
     17   !!                 !  2007-02  (C. Deltel) Diagnose ML trends for passive tracers 
     18   !!            2.0  !  2006-02  (L. Debreu, C. Mazauric) Agrif implementation 
     19   !!            3.0  !  2008-06  (G. Madec)  time stepping always done in trazdf 
     20   !!            3.1  !  2009-02  (G. Madec, R. Benshila)  re-introduce the vvl option 
     21   !!            3.3  !  2010-06  (C. Ethe, G. Madec) Merge TRA-TRC 
    1722   !!---------------------------------------------------------------------- 
    1823#if defined key_top 
     
    2429   !! * Modules used 
    2530   USE oce_trc         ! ocean dynamics and tracers variables 
    26    USE trp_trc             ! ocean passive tracers variables 
     31   USE trc             ! ocean passive tracers variables 
    2732   USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
    28    USE trctrp_lec      ! pasive tracers transport 
    2933   USE prtctl_trc      ! Print control for debbuging 
    30    USE trdmld_trc 
    31    USE trdmld_trc_oce 
     34   USE trdmod_oce 
     35   USE trdtra 
     36   USE tranxt 
     37# if defined key_agrif 
    3238   USE agrif_top_update 
    3339   USE agrif_top_interp 
     40# endif 
    3441 
    3542   IMPLICIT NONE 
     
    3845   !! * Routine accessibility 
    3946   PUBLIC trc_nxt          ! routine called by step.F90 
     47 
     48  REAL(wp), DIMENSION(jpk) ::   r2dt 
    4049   !!---------------------------------------------------------------------- 
    41    !!   TOP 1.0 , LOCEAN-IPSL (2005)  
     50   !! NEMO/TOP 3.3 , NEMO Consortium (2010) 
    4251   !! $Id$  
    43    !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt  
     52   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 
    4453   !!---------------------------------------------------------------------- 
    4554 
     
    7079      !! ** Action  : - update trb, trn 
    7180      !!---------------------------------------------------------------------- 
    72       USE oce, ONLY :   ztrtrd => ua    ! use ua as 3D workspace  
    7381      !! * Arguments 
    7482      INTEGER, INTENT( in ) ::   kt     ! ocean time-step index 
    7583      !! * Local declarations 
    76       INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices 
     84      INTEGER  ::   jk, jn   ! dummy loop indices 
    7785      REAL(wp) ::   zfact            ! temporary scalar 
    7886      CHARACTER (len=22) :: charout 
     87      REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE ::  ztrdt  
    7988      !!---------------------------------------------------------------------- 
    8089 
    81       IF( kt == nittrc000 .AND. lwp ) THEN 
     90      IF( kt == nit000 .AND. lwp ) THEN 
    8291         WRITE(numout,*) 
    8392         WRITE(numout,*) 'trc_nxt : time stepping on passive tracers' 
    8493      ENDIF 
    8594 
     95      ! Update after tracer on domain lateral boundaries 
    8696      DO jn = 1, jptra 
     97         CALL lbc_lnk( tra(:,:,:,jn), 'T', 1. )    
     98      END DO 
    8799 
    88          ! 0. Lateral boundary conditions on tra (T-point, unchanged sign) 
    89          ! ---------------------------------============ 
    90          CALL lbc_lnk( tra(:,:,:,jn), 'T', 1. )    
    91           
    92          !                                                ! =============== 
    93          DO jk = 1, jpk                                   ! Horizontal slab 
    94             !                                             ! =============== 
    95             ! 1. Leap-frog scheme (only in explicit case, otherwise the  
    96             ! -------------------  time stepping is already done in trczdf) 
    97             IF( l_trczdf_exp .AND. ( ln_trcadv_cen2 .OR. ln_trcadv_tvd) ) THEN 
    98                zfact = 2. * rdttra(jk) * FLOAT(ndttrc)  
    99                IF( neuler == 0 .AND. kt == nittrc000 ) zfact = rdttra(jk) * FLOAT(ndttrc)  
    100                tra(:,:,jk,jn) = ( trb(:,:,jk,jn) + zfact * tra(:,:,jk,jn) ) * tmask(:,:,jk) 
    101             ENDIF 
    102  
    103          END DO 
    104100 
    105101#if defined key_obc 
    106         CALL ctl_stop( '          Passive tracers and Open Boundary condition can not be used together ' & 
    107            &           '          Check in trc_nxt routine' ) 
     102!!      CALL obc_trc( kt )               ! OBC open boundaries 
     103#endif 
     104#if defined key_bdy 
     105!!      CALL bdy_trc( kt )               ! BDY open boundaries 
     106#endif 
     107#if defined key_agrif 
     108      CALL Agrif_trc                   ! AGRIF zoom boundaries 
    108109#endif 
    109110 
     111 
     112      ! set time step size (Euler/Leapfrog) 
     113      IF( neuler == 0 .AND. kt ==  nit000) THEN  ;  r2dt(:) =     rdttrc(:)   ! at nit000             (Euler) 
     114      ELSEIF( kt <= nit000 + 1 )           THEN  ;  r2dt(:) = 2.* rdttrc(:)   ! at nit000 or nit000+1 (Leapfrog) 
     115      ENDIF 
     116 
     117      ! trends computation initialisation 
     118      IF( l_trdtrc )  THEN 
     119         ALLOCATE( ztrdt(jpi,jpj,jpk,jptra) )  !* store now fields before applying the Asselin filter 
     120         ztrdt(:,:,:,:)  = trn(:,:,:,:) 
     121      ENDIF 
     122      ! Leap-Frog + Asselin filter time stepping 
     123      IF( neuler == 0 .AND. kt == nit000 ) THEN        ! Euler time-stepping at first time-step 
     124         !                                             ! (only swap) 
     125         DO jn = 1, jptra 
     126            DO jk = 1, jpkm1 
     127               trn(:,:,jk,jn) = tra(:,:,jk,jn) 
     128            END DO 
     129         END DO 
     130         !                                               
     131      ELSE 
     132         ! Leap-Frog + Asselin filter time stepping 
     133         IF( lk_vvl ) THEN   ;   CALL tra_nxt_vvl( kt, 'TRC', trb, trn, tra, jptra )      ! variable volume level (vvl)  
     134         ELSE                ;   CALL tra_nxt_fix( kt, 'TRC', trb, trn, tra, jptra )      ! fixed    volume level  
     135         ENDIF 
     136      ENDIF 
     137 
    110138#if defined key_agrif 
    111          !                                             ! =============== 
    112       END DO                                           !   End of slab 
    113       !                                                ! =============== 
    114       ! Interp tracers on boundaries (coarse => fine) 
    115       CALL Agrif_trc 
    116       !                                                ! =============== 
    117       DO jn = 1, jptra                                 ! Horizontal slab 
    118          !                                             ! =============== 
    119 #endif 
     139      ! Update tracer at AGRIF zoom boundaries 
     140      IF( .NOT.Agrif_Root() )    CALL Agrif_Update_Trc( kt )      ! children only 
     141#endif       
    120142 
    121          DO jk = 1, jpk   
    122  
    123             ! 2. Time filter and swap of arrays 
    124             ! --------------------------------- 
    125             IF ( ln_trcadv_cen2 .OR. ln_trcadv_tvd  ) THEN 
    126  
    127                IF( neuler == 0 .AND. kt == nittrc000 ) THEN 
    128                   DO jj = 1, jpj 
    129                      DO ji = 1, jpi 
    130                         trb(ji,jj,jk,jn) = trn(ji,jj,jk,jn) 
    131                         trn(ji,jj,jk,jn) = tra(ji,jj,jk,jn) 
    132                         tra(ji,jj,jk,jn) = 0. 
    133                      END DO 
    134                   END DO 
    135                   IF( l_trdtrc )   ztrtrd(:,:,:) = 0.e0           !    no trend 
    136                ELSE 
    137                   IF( l_trdtrc ) THEN                             !    Asselin trend 
    138                      DO jj = 1, jpj 
    139                         DO ji = 1, jpi 
    140                            ztrtrd(ji,jj,jk) = atfp * ( trb(ji,jj,jk,jn) - 2*trn(ji,jj,jk,jn) + tra(ji,jj,jk,jn) ) 
    141                         END DO 
    142                      END DO 
    143                   ENDIF 
    144  
    145                   DO jj = 1, jpj 
    146                      DO ji = 1, jpi 
    147                         trb(ji,jj,jk,jn) = atfp  * ( trb(ji,jj,jk,jn) + tra(ji,jj,jk,jn) ) + atfp1 * trn(ji,jj,jk,jn) 
    148                         trn(ji,jj,jk,jn) = tra(ji,jj,jk,jn) 
    149                         tra(ji,jj,jk,jn) = 0. 
    150                      END DO 
    151                   END DO 
    152                ENDIF 
    153             ELSE                                                  ! >> EULER-FORWARD schemes (SMOLAR, MUSCL) 
    154                IF( l_trdtrc ) ztrtrd(:,:,:) = 0.e0                !    no trend 
    155  
    156                DO jj = 1, jpj 
    157                   DO ji = 1, jpi 
    158                      trb(ji,jj,jk,jn) = tra(ji,jj,jk,jn) 
    159                      trn(ji,jj,jk,jn) = tra(ji,jj,jk,jn) 
    160                      tra(ji,jj,jk,jn) = 0. 
    161                   END DO 
    162                END DO 
    163  
    164             ENDIF 
    165             !                                             ! =============== 
    166          END DO                                           !   End of slab 
    167          !                                                ! =============== 
    168  
    169          IF( l_trdtrc ) THEN                                      ! trends 
    170             DO jk = 1, jpk 
    171                zfact = 2. * rdttra(jk) * FLOAT(ndttrc) 
    172                ztrtrd(:,:,jk) = ztrtrd(:,:,jk) / zfact            ! n.b. ztrtrd=0 in Euler-forward case 
     143      ! trends computation 
     144      IF( l_trdtrc ) THEN                                      ! trends 
     145         DO jn = 1, jptra 
     146            DO jk = 1, jpkm1 
     147               zfact = 1.e0 / r2dt(jk)   
     148               ztrdt(:,:,jk,jn) = ( trb(:,:,jk,jn) - ztrdt(:,:,jk,jn) ) * zfact  
     149               CALL trd_tra( kt, 'TRC', jn, jptra_trd_atf, ztrdt ) 
    173150            END DO 
    174             IF (luttrd(jn)) CALL trd_mod_trc( ztrtrd, jn, jptrc_trd_atf, kt ) 
    175          ENDIF 
    176          !                                                        ! =========== 
    177       END DO                                                      ! tracer loop 
    178       !                                                           ! =========== 
    179  
     151         END DO 
     152         DEALLOCATE( ztrdt ) 
     153      END IF 
     154      ! 
    180155      IF(ln_ctl)   THEN  ! print mean trends (used for debugging) 
    181156         WRITE(charout, FMT="('nxt')") 
     
    183158         CALL prt_ctl_trc(tab4d=trn, mask=tmask, clinfo=ctrcnm) 
    184159      ENDIF 
    185  
    186 #if defined key_agrif 
    187       IF (.NOT.Agrif_Root())    CALL Agrif_Update_Trc( kt ) 
    188 #endif       
    189  
    190  
     160      ! 
    191161   END SUBROUTINE trc_nxt 
    192162 
Note: See TracChangeset for help on using the changeset viewer.