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 6060 for branches/2015/dev_merge_2015/NEMOGCM/NEMO/OPA_SRC/TRA/tranxt.F90 – NEMO

Ignore:
Timestamp:
2015-12-16T10:25:22+01:00 (8 years ago)
Author:
timgraham
Message:

Merged dev_r5836_noc2_VVL_BY_DEFAULT into branch

File:
1 edited

Legend:

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

    r5930 r6060  
    5656   PUBLIC   tra_nxt_vvl   ! to be used in trcnxt 
    5757 
    58  
    5958   !! * Substitutions 
    60 #  include "domzgr_substitute.h90" 
     59#  include "vectopt_loop_substitute.h90" 
    6160   !!---------------------------------------------------------------------- 
    6261   !! NEMO/OPA 3.3 , NEMO-Consortium (2010)  
     
    8685      !!             domains (lk_agrif=T) 
    8786      !! 
    88       !! ** Action  : - (tb,sb) and (tn,sn) ready for the next time step 
    89       !! 
     87      !! ** Action  : - tsb & tsn ready for the next time step 
    9088      !!---------------------------------------------------------------------- 
    9189      INTEGER, INTENT(in) ::   kt    ! ocean time-step index 
    9290      !! 
    93       INTEGER  ::   jk, jn    ! dummy loop indices 
    94       REAL(wp) ::   zfact     ! local scalars 
     91      INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices 
     92      REAL(wp) ::   zfact            ! local scalars 
    9593      REAL(wp), POINTER, DIMENSION(:,:,:) ::  ztrdt, ztrds 
    9694      !!---------------------------------------------------------------------- 
     
    106104      ! Update after tracer on domain lateral boundaries 
    107105      !  
    108       ! 
    109106#if defined key_agrif 
    110107      CALL Agrif_tra                     ! AGRIF zoom boundaries 
     
    140137            END DO 
    141138         END DO 
     139         ! 
    142140      ELSE                                            ! Leap-Frog + Asselin filter time stepping 
    143141         ! 
    144          IF( lk_vvl )  THEN   ;   CALL tra_nxt_vvl( kt, nit000, rdttra, 'TRA', tsb, tsn, tsa,   & 
    145            &                                                              sbc_tsc, sbc_tsc_b, jpts )  ! variable volume level (vvl)  
    146          ELSE                 ;   CALL tra_nxt_fix( kt, nit000,         'TRA', tsb, tsn, tsa, jpts )  ! fixed    volume level  
     142         IF( ln_linssh ) THEN   ;   CALL tra_nxt_fix( kt, nit000,         'TRA', tsb, tsn, tsa, jpts )  ! linear free surface  
     143         ELSE                   ;   CALL tra_nxt_vvl( kt, nit000, rdttra, 'TRA', tsb, tsn, tsa,   & 
     144           &                                                                sbc_tsc, sbc_tsc_b, jpts )  ! non-linear free surface 
    147145         ENDIF 
     146         ! 
     147         DO jn = 1, jpts 
     148            CALL lbc_lnk( tsb(:,:,:,jn), 'T', 1._wp )  
     149            CALL lbc_lnk( tsn(:,:,:,jn), 'T', 1._wp ) 
     150            CALL lbc_lnk( tsa(:,:,:,jn), 'T', 1._wp ) 
     151         END DO 
    148152      ENDIF      
    149153      ! 
    150       ! trends computation 
    151154      IF( l_trdtra ) THEN      ! trend of the Asselin filter (tb filtered - tb)/dt      
    152155         DO jk = 1, jpkm1 
     
    179182      !!              - swap tracer fields to prepare the next time_step. 
    180183      !! 
    181       !! ** Action  : - (tb,sb) and (tn,sn) ready for the next time step 
    182       !!               
    183       !!---------------------------------------------------------------------- 
    184       INTEGER         , INTENT(in   )                               ::   kt       ! ocean time-step index 
    185       INTEGER         , INTENT(in   )                               ::   kit000   ! first time step index 
    186       CHARACTER(len=3), INTENT(in   )                               ::   cdtype   ! =TRA or TRC (tracer indicator) 
    187       INTEGER         , INTENT(in   )                               ::   kjpt     ! number of tracers 
    188       REAL(wp)        , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt)  ::   ptb      ! before tracer fields 
    189       REAL(wp)        , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt)  ::   ptn      ! now tracer fields 
    190       REAL(wp)        , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt)  ::   pta      ! tracer trend 
     184      !! ** Action  : - tsb & tsn ready for the next time step 
     185      !!---------------------------------------------------------------------- 
     186      INTEGER                              , INTENT(in   ) ::  kt        ! ocean time-step index 
     187      INTEGER                              , INTENT(in   ) ::  kit000    ! first time step index 
     188      CHARACTER(len=3)                     , INTENT(in   ) ::  cdtype    ! =TRA or TRC (tracer indicator) 
     189      INTEGER                              , INTENT(in   ) ::  kjpt      ! number of tracers 
     190      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) ::  ptb       ! before tracer fields 
     191      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) ::  ptn       ! now tracer fields 
     192      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) ::  pta       ! tracer trend 
    191193      ! 
    192194      INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices 
    193195      REAL(wp) ::   ztn, ztd         ! local scalars 
    194196      !!---------------------------------------------------------------------- 
    195  
     197      ! 
    196198      IF( kt == kit000 )  THEN 
    197199         IF(lwp) WRITE(numout,*) 
     
    200202      ENDIF 
    201203      ! 
    202       ! 
    203204      DO jn = 1, kjpt 
    204205         ! 
    205206         DO jk = 1, jpkm1 
    206             DO jj = 1, jpj 
    207                DO ji = 1, jpi 
     207            DO jj = 2, jpjm1 
     208               DO ji = fs_2, fs_jpim1 
    208209                  ztn = ptn(ji,jj,jk,jn)                                     
    209                   ztd = pta(ji,jj,jk,jn) - 2. * ztn + ptb(ji,jj,jk,jn)      !  time laplacian on tracers 
    210                   ! 
    211                   ptb(ji,jj,jk,jn) = ztn + atfp * ztd                       ! ptb <-- filtered ptn  
    212                   ptn(ji,jj,jk,jn) = pta(ji,jj,jk,jn)                       ! ptn <-- pta 
    213                   ! 
     210                  ztd = pta(ji,jj,jk,jn) - 2._wp * ztn + ptb(ji,jj,jk,jn)  ! time laplacian on tracers 
     211                  ! 
     212                  ptb(ji,jj,jk,jn) = ztn + atfp * ztd                      ! ptb <-- filtered ptn  
     213                  ptn(ji,jj,jk,jn) = pta(ji,jj,jk,jn)                      ! ptn <-- pta 
    214214               END DO 
    215215           END DO 
     
    230230      !! ** Method  : - Apply a thickness weighted Asselin time filter on now fields. 
    231231      !!              - swap tracer fields to prepare the next time_step. 
    232       !!                This can be summurized for tempearture as: 
    233       !! 
    234       !! ** Action  : - (tb,sb) and (tn,sn) ready for the next time step 
    235       !! 
    236       !!---------------------------------------------------------------------- 
    237       INTEGER         , INTENT(in   )                               ::  kt       ! ocean time-step index 
    238       INTEGER         , INTENT(in   )                               ::  kit000   ! first time step index 
    239       REAL(wp)        , INTENT(in   ), DIMENSION(jpk)               ::  p2dt     ! time-step 
    240       CHARACTER(len=3), INTENT(in   )                               ::  cdtype   ! =TRA or TRC (tracer indicator) 
    241       INTEGER         , INTENT(in   )                               ::  kjpt     ! number of tracers 
    242       REAL(wp)        , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt)  ::  ptb      ! before tracer fields 
    243       REAL(wp)        , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt)  ::  ptn      ! now tracer fields 
    244       REAL(wp)        , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt)  ::  pta      ! tracer trend 
    245       REAL(wp)        , INTENT(in   ), DIMENSION(jpi,jpj,kjpt)      ::  psbc_tc   ! surface tracer content 
    246       REAL(wp)        , INTENT(in   ), DIMENSION(jpi,jpj,kjpt)      ::  psbc_tc_b ! before surface tracer content 
    247  
    248       !!      
     232      !!             tb  = ( e3t_n*tn + atfp*[ e3t_b*tb - 2 e3t_n*tn + e3t_a*ta ] ) 
     233      !!                  /( e3t_n    + atfp*[ e3t_b    - 2 e3t_n    + e3t_a    ] ) 
     234      !!             tn  = ta  
     235      !! 
     236      !! ** Action  : - tsb & tsn ready for the next time step 
     237      !!---------------------------------------------------------------------- 
     238      INTEGER                              , INTENT(in   ) ::  kt        ! ocean time-step index 
     239      INTEGER                              , INTENT(in   ) ::  kit000    ! first time step index 
     240      REAL(wp), DIMENSION(jpk)             , INTENT(in   ) ::  p2dt      ! time-step 
     241      CHARACTER(len=3)                     , INTENT(in   ) ::  cdtype    ! =TRA or TRC (tracer indicator) 
     242      INTEGER                              , INTENT(in   ) ::  kjpt      ! number of tracers 
     243      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) ::  ptb       ! before tracer fields 
     244      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) ::  ptn       ! now tracer fields 
     245      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) ::  pta       ! tracer trend 
     246      REAL(wp), DIMENSION(jpi,jpj    ,kjpt), INTENT(in   ) ::  psbc_tc   ! surface tracer content 
     247      REAL(wp), DIMENSION(jpi,jpj    ,kjpt), INTENT(in   ) ::  psbc_tc_b ! before surface tracer content 
     248      ! 
    249249      LOGICAL  ::   ll_traqsr, ll_rnf, ll_isf   ! local logical 
    250250      INTEGER  ::   ji, jj, jk, jn              ! dummy loop indices 
     
    259259      ENDIF 
    260260      ! 
    261       IF( cdtype == 'TRA' )  THEN    
    262          ll_traqsr  = ln_traqsr        ! active  tracers case  and  solar penetration 
    263          ll_rnf     = ln_rnf           ! active  tracers case  and  river runoffs 
    264          IF (nn_isf .GE. 1) THEN  
    265             ll_isf = .TRUE.            ! active  tracers case  and  ice shelf melting/freezing 
     261      IF( cdtype == 'TRA' )  THEN   ! active  tracers case  
     262         ll_traqsr  = ln_traqsr        ! solar penetration 
     263         ll_rnf     = ln_rnf           ! river runoffs 
     264         IF( nn_isf >= 1 ) THEN  
     265            ll_isf = .TRUE.            ! ice shelf melting/freezing 
    266266         ELSE 
    267267            ll_isf = .FALSE. 
    268268         END IF 
    269       ELSE                           
    270          ll_traqsr  = .FALSE.          ! active  tracers case and NO solar penetration 
    271          ll_rnf     = .FALSE.          ! passive tracers or NO river runoffs 
    272          ll_isf     = .FALSE.          ! passive tracers or NO ice shelf melting/freezing 
     269      ELSE                          ! passive tracers case 
     270         ll_traqsr  = .FALSE.          ! NO solar penetration 
     271         ll_rnf     = .FALSE.          ! NO river runoffs ????          !!gm BUG ?   
     272         ll_isf     = .FALSE.          ! NO ice shelf melting/freezing  !!gm BUG ??  
    273273      ENDIF 
    274274      ! 
     
    276276         DO jk = 1, jpkm1 
    277277            zfact1 = atfp * p2dt(jk) 
    278             zfact2 = zfact1 / rau0 
    279             DO jj = 1, jpj 
    280                DO ji = 1, jpi 
    281                   ze3t_b = fse3t_b(ji,jj,jk) 
    282                   ze3t_n = fse3t_n(ji,jj,jk) 
    283                   ze3t_a = fse3t_a(ji,jj,jk) 
     278            zfact2 = zfact1 * r1_rau0 
     279            DO jj = 2, jpjm1 
     280               DO ji = fs_2, fs_jpim1 
     281                  ze3t_b = e3t_b(ji,jj,jk) 
     282                  ze3t_n = e3t_n(ji,jj,jk) 
     283                  ze3t_a = e3t_a(ji,jj,jk) 
    284284                  !                                         ! tracer content at Before, now and after 
    285285                  ztc_b  = ptb(ji,jj,jk,jn) * ze3t_b 
     
    299299                     ztc_f  = ztc_f  - zfact1 * ( psbc_tc(ji,jj,jn) - psbc_tc_b(ji,jj,jn) ) 
    300300                  ENDIF 
    301  
     301                  ! 
    302302                  ! solar penetration (temperature only) 
    303303                  IF( ll_traqsr .AND. jn == jp_tem .AND. jk <= nksr )                            &  
    304304                     &     ztc_f  = ztc_f  - zfact1 * ( qsr_hc(ji,jj,jk) - qsr_hc_b(ji,jj,jk) )  
    305  
     305                     ! 
    306306                  ! river runoff 
    307307                  IF( ll_rnf .AND. jk <= nk_rnf(ji,jj) )                                          & 
    308308                     &     ztc_f  = ztc_f  - zfact1 * ( rnf_tsc(ji,jj,jn) - rnf_tsc_b(ji,jj,jn) ) &  
    309                      &                              * fse3t_n(ji,jj,jk) / h_rnf(ji,jj) 
    310  
     309                     &                              * e3t_n(ji,jj,jk) / h_rnf(ji,jj) 
     310                     ! 
    311311                  ! ice shelf 
    312312                  IF( ll_isf ) THEN 
     
    314314                     IF ( jk >= misfkt(ji,jj) .AND. jk < misfkb(ji,jj) )                          & 
    315315                        ztc_f  = ztc_f  - zfact1 * ( risf_tsc(ji,jj,jn) - risf_tsc_b(ji,jj,jn) )  & 
    316                                &                 * fse3t_n(ji,jj,jk) * r1_hisf_tbl (ji,jj) 
     316                               &                 * e3t_n(ji,jj,jk) * r1_hisf_tbl (ji,jj) 
    317317                     ! level partially include in Losch_2008 ice shelf boundary layer  
    318318                     IF ( jk == misfkb(ji,jj) )                                                   & 
    319319                        ztc_f  = ztc_f  - zfact1 * ( risf_tsc(ji,jj,jn) - risf_tsc_b(ji,jj,jn) )  & 
    320                                &                 * fse3t_n(ji,jj,jk) * r1_hisf_tbl (ji,jj) * ralpha(ji,jj) 
     320                               &                 * e3t_n(ji,jj,jk) * r1_hisf_tbl (ji,jj) * ralpha(ji,jj) 
    321321                  END IF 
    322  
     322                  ! 
    323323                  ze3t_f = 1.e0 / ze3t_f 
    324324                  ptb(ji,jj,jk,jn) = ztc_f * ze3t_f       ! ptb <-- ptn filtered 
Note: See TracChangeset for help on using the changeset viewer.