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 2148 for branches/DEV_r2106_LOCEAN2010/NEMO/OPA_SRC/TRA/tranxt.F90 – NEMO

Ignore:
Timestamp:
2010-10-04T15:53:42+02:00 (14 years ago)
Author:
cetlod
Message:

merge LOCEAN 2010 developments branches

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/DEV_r2106_LOCEAN2010/NEMO/OPA_SRC/TRA/tranxt.F90

    r2120 r2148  
    1515   !!            3.0  !  2008-06  (G. Madec)  time stepping always done in trazdf 
    1616   !!            3.1  !  2009-02  (G. Madec, R. Benshila)  re-introduce the vvl option 
    17    !!            3.3  !  2010-05  (C. Ethe, G. Madec)  merge TRC-TRA 
     17   !!            3.3  !  2010-04  (M. Leclair, G. Madec)  semi-implicit hpg with asselin filter + modified LF-RA 
     18   !!             -   !  2010-05  (C. Ethe, G. Madec)  merge TRC-TRA 
    1819   !!---------------------------------------------------------------------- 
    1920 
    2021   !!---------------------------------------------------------------------- 
    21    !!   tra_nxt       : time stepping on temperature and salinity 
    22    !!   tra_nxt_fix   : time stepping on temperature and salinity : fixed    volume case 
    23    !!   tra_nxt_vvl   : time stepping on temperature and salinity : variable volume case 
     22   !!   tra_nxt       : time stepping on tracers 
     23   !!   tra_nxt_fix   : time stepping on tracers : fixed    volume case 
     24   !!   tra_nxt_vvl   : time stepping on tracers : variable volume case 
    2425   !!---------------------------------------------------------------------- 
    2526   USE oce             ! ocean dynamics and tracers variables 
    2627   USE dom_oce         ! ocean space and time domain variables  
     28   USE sbc_oce         ! surface boundary condition: ocean 
    2729   USE zdf_oce         ! ??? 
    2830   USE domvvl          ! variable volume 
     
    3840   USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
    3941   USE prtctl          ! Print control 
     42   USE traqsr          ! penetrative solar radiation (needed for nksr) 
    4043   USE traswp          ! swap array 
    4144   USE agrif_opa_update 
     
    4952   PUBLIC   tra_nxt_vvl   ! to be used in trcnxt 
    5053 
     54   REAL(wp)                 ::   rbcp            ! Brown & Campana parameters for semi-implicit hpg 
    5155   REAL(wp), DIMENSION(jpk) ::   r2dt   ! vertical profile time step, =2*rdttra (leapfrog) or =rdttra (Euler) 
    5256 
     
    96100         IF(lwp) WRITE(numout,*) 'tra_nxt : achieve the time stepping by Asselin filter and array swap' 
    97101         IF(lwp) WRITE(numout,*) '~~~~~~~' 
     102         ! 
     103         rbcp    = 0.25 * (1. + atfp) * (1. + atfp) * ( 1. - atfp)       ! Brown & Campana parameter for semi-implicit hpg 
    98104      ENDIF 
    99105 
     
    107113#endif 
    108114 
    109 #if defined key_obc 
     115#if defined key_obc  
    110116      IF( lk_obc )   CALL obc_tra( kt )  ! OBC open boundaries 
    111117#endif 
     
    114120#endif 
    115121#if defined key_agrif 
    116       CALL Agrif_tra                     ! AGRIF zoom boundaries 
     122      CALL Agrif_tra                   ! AGRIF zoom boundaries 
    117123#endif 
    118124 
     
    133139 
    134140      ! Leap-Frog + Asselin filter time stepping 
    135       IF( lk_vvl )   THEN   ;   CALL tra_nxt_vvl( kt, tsb, tsn, tsa, jpts )  ! variable volume level (vvl)      
    136       ELSE                  ;   CALL tra_nxt_fix( kt, tsb, tsn, tsa, jpts )  ! fixed    volume level  
     141      IF( lk_vvl )   THEN   ;   CALL tra_nxt_vvl( kt, 'TRA', tsb, tsn, tsa, jpts )  ! variable volume level (vvl)      
     142      ELSE                  ;   CALL tra_nxt_fix( kt,        tsb, tsn, tsa, jpts )  ! fixed    volume level  
    137143      ENDIF 
    138144 
     
    176182      !!              - swap tracer fields to prepare the next time_step. 
    177183      !!                This can be summurized for tempearture as: 
    178       !!             ztm = (ta+2tn+tb)/4       ln_dynhpg_imp = T 
    179       !!             ztm = 0                   otherwise 
     184      !!             ztm = tn + rbcp * [ta -2 tn + tb ]       ln_dynhpg_imp = T 
     185      !!             ztm = 0                                   otherwise 
     186      !!                   with rbcp=1/4 * (1-atfp^4) / (1-atfp) 
    180187      !!             tb  = tn + atfp*[ tb - 2 tn + ta ] 
    181       !!             tn  = ta  
     188      !!             tn  = ta   
    182189      !!             ta  = ztm       (NB: reset to 0 after eos_bn2 call) 
    183190      !! 
     
    185192      !!              - (ta,sa) time averaged (t,s)   (ln_dynhpg_imp = T) 
    186193      !!---------------------------------------------------------------------- 
    187       INTEGER , INTENT(in   )                               ::  kt            ! ocean time-step index 
    188       INTEGER , INTENT(in   )                               ::  kjpt            ! number of tracers 
    189       REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt)  ::  ptb  ! before tracer fields 
    190       REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt)  ::  ptn  ! now tracer fields 
    191       REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt)  ::  pta         ! tracer trend 
     194      INTEGER , INTENT(in   )                               ::  kt       ! ocean time-step index 
     195      INTEGER , INTENT(in   )                               ::  kjpt     ! number of tracers 
     196      REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt)  ::  ptb      ! before tracer fields 
     197      REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt)  ::  ptn      ! now tracer fields 
     198      REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt)  ::  pta      ! tracer trend 
    192199      !! 
    193200      INTEGER  :: ji, jj, jk, jn   ! dummy loop indices 
    194       REAL(wp) :: ztm, ztf     ! temporary scalars 
     201      REAL(wp) :: ztd, ztm         ! temporary scalars 
    195202      !!---------------------------------------------------------------------- 
    196203 
     
    205212         !                                             ! (only swap) 
    206213         DO jn = 1, kjpt 
    207             DO jk = 1, jpkm1                               
     214            DO jk = 1, jpkm1 
    208215               ptn(:,:,jk,jn) = pta(:,:,jk,jn)     ! ptb <-- ptn 
    209216            END DO 
     
    219226                  DO jj = 1, jpj 
    220227                     DO ji = 1, jpi 
    221                         ztm = 0.25 * ( pta(ji,jj,jk,jn) + 2.* ptn(ji,jj,jk,jn) + ptb(ji,jj,jk,jn) )  ! mean pt 
    222                         ztf = atfp * ( pta(ji,jj,jk,jn) - 2.* ptn(ji,jj,jk,jn) + ptb(ji,jj,jk,jn) )  ! Asselin filter on pt  
    223                         ptb(ji,jj,jk,jn) = ptn(ji,jj,jk,jn) + ztf                                      ! ptb <-- filtered ptn  
    224                         ptn(ji,jj,jk,jn) = pta(ji,jj,jk,jn)                                            ! ptn <-- pta 
    225                         pta(ji,jj,jk,jn) = ztm                                                           ! pta <-- mean pt 
     228                        ztd = pta(ji,jj,jk,jn) - 2.* ptn(ji,jj,jk,jn) + ptb(ji,jj,jk,jn)    !  time laplacian on tracers 
     229                        ztm = ptn(ji,jj,jk,jn) + rbcp * ztd                                 !  used for both Asselin and Brown & Campana filters 
     230                        ! 
     231                        ptb(ji,jj,jk,jn) = ptn(ji,jj,jk,jn) + atfp * ztd                    ! ptb <-- filtered ptn  
     232                        ptn(ji,jj,jk,jn) = pta(ji,jj,jk,jn)                                 ! ptn <-- pta 
     233                        pta(ji,jj,jk,jn) = ztm                                              ! pta <-- Brown & Campana average 
    226234                     END DO 
    227235                  END DO 
     
    235243                  DO jj = 1, jpj 
    236244                     DO ji = 1, jpi 
    237                         ztf = atfp * ( pta(ji,jj,jk,jn) - 2.* ptn(ji,jj,jk,jn) + ptb(ji,jj,jk,jn) )       ! Asselin filter on t  
    238                         ptb(ji,jj,jk,jn) = ptn(ji,jj,jk,jn) + ztf                                     ! ptb <-- filtered ptn  
    239                         ptn(ji,jj,jk,jn) = pta(ji,jj,jk,jn)                                           ! ptn <-- pta 
     245                        ztd = pta(ji,jj,jk,jn) - 2.* ptn(ji,jj,jk,jn) + ptb(ji,jj,jk,jn)    ! time laplacian on tracers 
     246                        !  
     247                        ptb(ji,jj,jk,jn) = ptn(ji,jj,jk,jn) + atfp * ztd                    ! ptb <-- filtered ptn  
     248                        ptn(ji,jj,jk,jn) = pta(ji,jj,jk,jn)                                 ! ptn <-- pta 
    240249                     END DO 
    241250                  END DO 
    242251               END DO 
    243252            END DO 
    244             ! 
    245253         ENDIF 
    246254         ! 
     
    250258 
    251259 
    252    SUBROUTINE tra_nxt_vvl( kt, ptb, ptn, pta, kjpt ) 
     260   SUBROUTINE tra_nxt_vvl( kt, cdtype, ptb, ptn, pta, kjpt ) 
    253261      !!---------------------------------------------------------------------- 
    254262      !!                   ***  ROUTINE tra_nxt_vvl  *** 
     
    263271      !!              - swap tracer fields to prepare the next time_step. 
    264272      !!                This can be summurized for tempearture as: 
    265       !!             ztm = (e3t_a*ta+2*e3t_n*tn+e3t_b*tb)   ln_dynhpg_imp = T 
    266       !!                  /(e3t_a   +2*e3t_n   +e3t_b   )     
    267       !!             ztm = 0                                otherwise 
     273      !!             ztm = ( e3t_n*tn + rbcp*[ e3t_b*tb - 2 e3t_n*tn + e3t_a*ta ] )   ln_dynhpg_imp = T 
     274      !!                  /( e3t_n    + rbcp*[ e3t_b    - 2 e3t_n    + e3t_a    ] )    
     275      !!             ztm = 0                                                       otherwise 
    268276      !!             tb  = ( e3t_n*tn + atfp*[ e3t_b*tb - 2 e3t_n*tn + e3t_a*ta ] ) 
    269277      !!                  /( e3t_n    + atfp*[ e3t_b    - 2 e3t_n    + e3t_a    ] ) 
     
    274282      !!              - (ta,sa) time averaged (t,s)   (ln_dynhpg_imp = T) 
    275283      !!---------------------------------------------------------------------- 
    276       INTEGER , INTENT(in   )                               ::  kt            ! ocean time-step index 
    277       INTEGER , INTENT(in   )                               ::  kjpt            ! number of tracers 
    278       REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt)  ::  ptb  ! before tracer fields 
    279       REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt)  ::  ptn  ! now tracer fields 
    280       REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt)  ::  pta         ! tracer trend 
     284      INTEGER         , INTENT(in   )                               ::  kt       ! ocean time-step index 
     285      CHARACTER(len=3), INTENT(in   )                               ::  cdtype   ! =TRA or TRC (tracer indicator) 
     286      INTEGER         , INTENT(in   )                               ::  kjpt     ! number of tracers 
     287      REAL(wp)        , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt)  ::  ptb      ! before tracer fields 
     288      REAL(wp)        , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt)  ::  ptn      ! now tracer fields 
     289      REAL(wp)        , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt)  ::  pta      ! tracer trend 
    281290      !!      
    282       INTEGER  ::   ji, jj, jk, jn             ! dummy loop indices 
    283       REAL(wp) ::   ztm , ztc_f , ztf , ztca, ztcn, ztcb   ! temporary scalar 
    284       REAL(wp) ::   ze3mr, ze3fr                           !    -         - 
    285       REAL(wp) ::   ze3t_b, ze3t_n, ze3t_a, ze3t_f         !    -         - 
     291      INTEGER  ::   ji, jj, jk, jn                 ! dummy loop indices 
     292      REAL(wp) ::   ztc_a , ztc_n , ztc_b          ! temporary scalar 
     293      REAL(wp) ::   ztc_f , ztc_d , ztc_m          !    -         - 
     294      REAL(wp) ::   ze3t_b, ze3t_n, ze3t_a         !    -         - 
     295      REAL(wp) ::   ze3t_f, ze3t_d, ze3t_m         !    -         - 
     296      REAL     ::   zfact1, zfact2                 !    -         - 
    286297      !!---------------------------------------------------------------------- 
    287298 
     
    293304      ! 
    294305      ! 
    295       IF( neuler == 0 .AND. kt == nit000 ) THEN        ! Euler time-stepping at first time-step 
    296          !                                             ! (only swap) 
     306      IF( neuler == 0 .AND. kt == nit000 ) THEN      ! Euler time-stepping at first time-step 
     307         !                                           ! (only swap) 
    297308         DO jn = 1, kjpt 
    298             DO jk = 1, jpkm1                               
    299                ptn(:,:,jk,jn) = pta(:,:,jk,jn)         ! ptb <-- ptn 
     309            DO jk = 1, jpkm1 
     310               ptn(:,:,jk,jn) = pta(:,:,jk,jn)       ! ptb <-- ptn 
    300311            END DO 
    301312         END DO 
    302313         !                                               
    303       ELSE                                              ! general case (Leapfrog + Asselin filter 
     314      ELSE                                           ! general case (Leapfrog + Asselin filter) 
    304315         ! 
    305          !                                              ! ----------------------- ! 
    306          IF( ln_dynhpg_imp ) THEN                       ! semi-implicite hpg case ! 
    307             !                                           ! ----------------------- ! 
    308             DO jn = 1, kjpt                                
     316         !                                           ! ----------------------- ! 
     317         IF( ln_dynhpg_imp ) THEN                    ! semi-implicite hpg case ! 
     318            !                                        ! ----------------------- ! 
     319            DO jn = 1, kjpt                           
    309320               DO jk = 1, jpkm1 
    310321                  DO jj = 1, jpj 
     
    314325                        ze3t_a = fse3t_a(ji,jj,jk) 
    315326                        !                                         ! tracer content at Before, now and after 
    316                         ztcb = ptb(ji,jj,jk,jn) *  ze3t_b   
    317                         ztcn = ptn(ji,jj,jk,jn) *  ze3t_n   
    318                         ztca = pta(ji,jj,jk,jn) *  ze3t_a   
    319                         ! 
    320                         !                                         ! Asselin filter on thickness and tracer content 
    321                         ze3t_f = atfp * ( ze3t_a - 2.* ze3t_n + ze3t_b ) 
    322                         ztc_f  = atfp * ( ztca   - 2.* ztcn   + ztcb   )  
    323                         ! 
    324                         !                                         ! filtered tracer including the correction  
    325                         ze3fr = 1.e0  / ( ze3t_n + ze3t_f ) 
    326                         ztf   = ze3fr * ( ztcn   + ztc_f  ) 
    327                         !                                         ! mean thickness and tracer 
    328                         ze3mr = 1.e0  / ( ze3t_a + 2.* ze3t_n + ze3t_b ) 
    329                         ztm   = ze3mr * ( ztca   + 2.* ztcn   + ztcb   ) 
    330                         !!gm mean e3t have to be saved and used in dynhpg  or it can be recomputed in dynhpg !! 
    331                         !!gm                 e3t_m(ji,jj,jk) = 0.25 / ze3mr 
     327                        ztc_b  = ptb(ji,jj,jk,jn) * ze3t_b   
     328                        ztc_n  = ptn(ji,jj,jk,jn) * ze3t_n   
     329                        ztc_a  = pta(ji,jj,jk,jn) * ze3t_a   
     330                        !                                         ! Time laplacian on tracer contents 
     331                        !                                         ! used for both Asselin and Brown & Campana filters 
     332                        ze3t_d =  ze3t_b - 2.* ze3t_n + ze3t_a  
     333                        ztc_d  =  ztc_b  - 2.* ztc_n  + ztc_a   
     334                        !                                         ! Asselin Filter on thicknesses and tracer contents 
     335                        ztc_f  = ztc_n  + atfp * ztc_d 
     336                        ztc_m  = ztc_n  + rbcp * ztc_d 
     337                        !                                          
     338                        ze3t_f = 1.0 / ( ze3t_n + atfp * ze3t_d ) 
     339                        ze3t_m = 1.0 / ( ze3t_n + rbcp * ze3t_d ) 
    332340                        !                                         ! swap of arrays 
    333                         ptb(ji,jj,jk,jn) = ztf                             ! ptb <-- ptn + filter 
    334                         ptn(ji,jj,jk,jn) = pta(ji,jj,jk,jn)              ! ptn <-- pta 
    335                         pta(ji,jj,jk,jn) = ztm                             ! pta <-- mean t 
     341                        ptb(ji,jj,jk,jn) = ztc_f * ze3t_f              ! ptb <-- ptn filtered 
     342                        pta(ji,jj,jk,jn) = ztc_m * ze3t_m              ! pta <-- Brown & Campana average 
     343                        ptn(ji,jj,jk,jn) = pta(ji,jj,jk,jn)            ! ptn <-- pta 
    336344                     END DO 
    337345                  END DO 
    338346               END DO 
    339347            END DO 
    340             !                                        ! ----------------------- ! 
    341          ELSE                                        !    explicit hpg case    ! 
    342             !                                        ! ----------------------- ! 
    343             DO jn = 1, kjpt       
    344                DO jk = 1, jpkm1 
    345                   DO jj = 1, jpj 
    346                      DO ji = 1, jpi 
    347                         ze3t_b = fse3t_b(ji,jj,jk) 
    348                         ze3t_n = fse3t_n(ji,jj,jk) 
    349                         ze3t_a = fse3t_a(ji,jj,jk) 
    350                         !                                         ! tracer content at Before, now and after 
    351                         ztcb = ptb(ji,jj,jk,jn) *  ze3t_b   
    352                         ztcn = ptn(ji,jj,jk,jn) *  ze3t_n    
    353                         ztca = pta(ji,jj,jk,jn) *  ze3t_a   
    354                         ! 
    355                         !                                         ! Asselin filter on thickness and tracer content 
    356                         ze3t_f = atfp * ( ze3t_a - 2.* ze3t_n + ze3t_b ) 
    357                         ztc_f  = atfp * ( ztca   - 2.* ztcn   + ztcb   )  
    358                         ! 
    359                         !                                         ! filtered tracer including the correction  
    360                         ze3fr = 1.e0 / ( ze3t_n + ze3t_f ) 
    361                         ztf   =  ( ztcn  + ztc_f ) * ze3fr 
    362                         !                                         ! swap of arrays 
    363                         ptb(ji,jj,jk,jn) = ztf                    ! tb <-- tn filtered 
    364                         ptn(ji,jj,jk,jn) = pta(ji,jj,jk,jn)       ! tn <-- ta 
     348            !                                           ! ----------------------- ! 
     349         ELSE                                           !    explicit hpg case    ! 
     350            !                                           ! ----------------------- ! 
     351            IF( cdtype == 'TRA' ) THEN 
     352               !               
     353               DO jn = 1, kjpt       
     354                  DO jk = 1, jpkm1 
     355                     zfact1 = atfp * rdttra(jk) 
     356                     zfact2 = zfact1 / rau0 
     357                     DO jj = 1, jpj 
     358                        DO ji = 1, jpi 
     359                           ze3t_b = fse3t_b(ji,jj,jk) 
     360                           ze3t_n = fse3t_n(ji,jj,jk) 
     361                           ze3t_a = fse3t_a(ji,jj,jk) 
     362                           !                                         ! tracer content at Before, now and after 
     363                           ztc_b  = ptb(ji,jj,jk,jn) * ze3t_b 
     364                           ztc_n  = ptn(ji,jj,jk,jn) * ze3t_n 
     365                           ztc_a  = pta(ji,jj,jk,jn) * ze3t_a 
     366                           ! 
     367                           ze3t_f = ze3t_n + atfp * ( ze3t_b - 2. * ze3t_n + ze3t_a ) 
     368                           ztc_f  = ztc_n  + atfp * ( ztc_a  - 2. * ztc_n  + ztc_b ) 
     369 
     370                           IF( jk == 1 ) THEN 
     371                               ze3t_f = ze3t_f - zfact2 * ( emp_b(ji,jj) - emp(ji,jj) ) 
     372                               IF( jn == jp_tem )   ztc_f  = ztc_f  - zfact1 * ( sbc_hc_n(ji,jj) - sbc_hc_b(ji,jj) ) 
     373                               IF( jn == jp_sal )   ztc_f  = ztc_f  - zfact1 * ( sbc_sc_n(ji,jj) - sbc_sc_b(ji,jj) ) 
     374                           ENDIF 
     375                           IF( jn == jp_tem .AND. ln_traqsr .AND. jk <= nksr )  & 
     376                           &                        ztc_f  = ztc_f  - zfact1 * ( qsr_hc_n(ji,jj,jk) - qsr_hc_b(ji,jj,jk) )  
     377 
     378                           ze3t_f = 1.e0 / ze3t_f 
     379                           ptb(ji,jj,jk,jn) = ztc_f * ze3t_f                           ! tb <-- tn filtered 
     380                           ptn(ji,jj,jk,jn) = pta(ji,jj,jk,jn)                             ! tn <-- ta 
     381                        END DO 
    365382                     END DO 
    366383                  END DO 
    367384               END DO 
    368             END DO 
     385               ! 
     386            ELSE IF( cdtype == 'TRC' ) THEN 
     387               !               
     388               DO jn = 1, kjpt       
     389                  DO jk = 1, jpkm1 
     390                     DO jj = 1, jpj 
     391                        DO ji = 1, jpi 
     392                           ze3t_b = fse3t_b(ji,jj,jk) 
     393                           ze3t_n = fse3t_n(ji,jj,jk) 
     394                           ze3t_a = fse3t_a(ji,jj,jk) 
     395                           !                                         ! tracer content at Before, now and after 
     396                           ztc_b  = ptb(ji,jj,jk,jn) * ze3t_b 
     397                           ztc_n  = ptn(ji,jj,jk,jn) * ze3t_n 
     398                           ztc_a  = pta(ji,jj,jk,jn) * ze3t_a 
     399                           ! 
     400                           ze3t_f = ze3t_n + atfp * ( ze3t_b - 2. * ze3t_n + ze3t_a ) 
     401                           ztc_f  = ztc_n  + atfp * ( ztc_a  - 2. * ztc_n  + ztc_b  ) 
     402 
     403                           ze3t_f = 1.e0 / ze3t_f 
     404                           ptb(ji,jj,jk,jn) = ztc_f * ze3t_f                           ! tb <-- tn filtered 
     405                           ptn(ji,jj,jk,jn) = pta(ji,jj,jk,jn)                             ! tn <-- ta 
     406                        END DO 
     407                     END DO 
     408                  END DO 
     409               END DO 
     410               ! 
     411            END IF 
    369412            ! 
    370413         ENDIF 
Note: See TracChangeset for help on using the changeset viewer.