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 9863 for NEMO/branches/2018/dev_r9838_ENHANCE04_MLF/src/OCE/DYN/dynspg_ts.F90 – NEMO

Ignore:
Timestamp:
2018-06-30T12:51:02+02:00 (6 years ago)
Author:
gm
Message:

#1911 (ENHANCE-04): simplified implementation of the Euler stepping at nit000

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2018/dev_r9838_ENHANCE04_MLF/src/OCE/DYN/dynspg_ts.F90

    r9598 r9863  
    11MODULE dynspg_ts 
    2  
    3    !! Includes ROMS wd scheme with diagnostic outputs ; un and ua updates are commented out !  
    4  
    52   !!====================================================================== 
    63   !!                   ***  MODULE  dynspg_ts  *** 
     
    3532   USE sbcisf          ! ice shelf variable (fwfisf) 
    3633   USE sbcapr          ! surface boundary condition: atmospheric pressure 
    37    USE dynadv    , ONLY: ln_dynadv_vec 
     34   USE dynadv   , ONLY : ln_dynadv_vec 
    3835   USE dynvor          ! vortivity scheme indicators 
    3936   USE phycst          ! physical constants 
     
    8582   REAL(wp) ::   r1_2  = 0.5_wp           ! 
    8683 
     84   REAL(wp) ::   r1_2dt_b, r2dt_bf               ! local scalars 
     85    
    8786   !! * Substitutions 
    8887#  include "vectopt_loop_substitute.h90" 
     
    151150      INTEGER  ::   ikbu, iktu, noffset   ! local integers 
    152151      INTEGER  ::   ikbv, iktv            !   -      - 
    153       REAL(wp) ::   r1_2dt_b, z2dt_bf               ! local scalars 
    154152      REAL(wp) ::   zx1, zx2, zu_spg, zhura, z1_hu  !   -      - 
    155153      REAL(wp) ::   zy1, zy2, zv_spg, zhvra, z1_hv  !   -      - 
     
    182180!     zwdramp = 1._wp / (rn_wdmin2 - rn_wdmin1) ! more general ramp 
    183181      !                                         ! reciprocal of baroclinic time step  
    184       IF( kt == nit000 .AND. neuler == 0 ) THEN   ;   z2dt_bf =          rdt 
    185       ELSE                                        ;   z2dt_bf = 2.0_wp * rdt 
    186       ENDIF 
    187       r1_2dt_b = 1.0_wp / z2dt_bf  
     182      IF( l_1st_euler ) THEN   ;   r2dt_bf =          rdt 
     183      ELSE                     ;   r2dt_bf = 2.0_wp * rdt 
     184      ENDIF 
     185      r1_2dt_b = 1.0_wp / r2dt_bf  
    188186      ! 
    189187      ll_init     = ln_bt_av                    ! if no time averaging, then no specific restart  
     
    194192      ENDIF 
    195193      ! 
    196       IF( kt == nit000 ) THEN                   !* initialisation 
     194      IF( kt == nit000 ) THEN                   !* initialisation 1st time-step 
    197195         ! 
    198196         IF(lwp) WRITE(numout,*) 
     
    201199         IF(lwp) WRITE(numout,*) 
    202200         ! 
    203          IF( neuler == 0 )   ll_init=.TRUE. 
    204          ! 
    205          IF( ln_bt_fw .OR. neuler == 0 ) THEN 
     201         IF( l_1st_euler )   ll_init = .TRUE. 
     202         ! 
     203         IF( ln_bt_fw .OR. l_1st_euler ) THEN 
    206204            ll_fw_start =.TRUE. 
    207205            noffset     = 0 
     
    212210         ! Set averaging weights and cycle length: 
    213211         CALL ts_wgt( ln_bt_av, ll_fw_start, icycle, wgtbtp1, wgtbtp2 ) 
     212         ! 
     213      ELSEIF( kt == nit000 + 1 ) THEN           !* initialisation 2nd time-step 
     214         ! 
     215         IF( .NOT.ln_bt_fw .AND. l_1st_euler ) THEN 
     216            ll_fw_start = .FALSE. 
     217            CALL ts_wgt( ln_bt_av, ll_fw_start, icycle, wgtbtp1, wgtbtp2 ) 
     218         ENDIF 
    214219         ! 
    215220      ENDIF 
     
    340345         END SELECT 
    341346      ENDIF 
    342       ! 
    343       ! If forward start at previous time step, and centered integration,  
    344       ! then update averaging weights: 
    345       IF (.NOT.ln_bt_fw .AND.( neuler==0 .AND. kt==nit000+1 ) ) THEN 
    346          ll_fw_start=.FALSE. 
    347          CALL ts_wgt( ln_bt_av, ll_fw_start, icycle, wgtbtp1, wgtbtp2 ) 
    348       ENDIF 
    349                            
     347      !                           
    350348      ! ----------------------------------------------------------------------------- 
    351349      !  Phase 1 : Coupling between general trend and barotropic estimates (1st step) 
     
    12031201         zwx(:,:) = un_adv(:,:) 
    12041202         zwy(:,:) = vn_adv(:,:) 
    1205          IF( .NOT.( kt == nit000 .AND. neuler==0 ) ) THEN 
     1203         IF( .NOT.l_1st_euler ) THEN 
    12061204            un_adv(:,:) = r1_2 * ( ub2_b(:,:) + zwx(:,:) - atfp * un_bf(:,:) ) 
    12071205            vn_adv(:,:) = r1_2 * ( vb2_b(:,:) + zwy(:,:) - atfp * vn_bf(:,:) ) 
     
    13051303      !! ** Purpose : Set time-splitting weights for temporal averaging (or not) 
    13061304      !!---------------------------------------------------------------------- 
    1307       LOGICAL, INTENT(in) ::   ll_av      ! temporal averaging=.true. 
    1308       LOGICAL, INTENT(in) ::   ll_fw      ! forward time splitting =.true. 
    1309       INTEGER, INTENT(inout) :: jpit      ! cycle length     
    1310       REAL(wp), DIMENSION(3*nn_baro), INTENT(inout) ::   zwgt1, & ! Primary weights 
    1311                                                          zwgt2    ! Secondary weights 
    1312        
     1305      LOGICAL                       , INTENT(in   ) ::   ll_av          ! temporal averaging=.true. 
     1306      LOGICAL                       , INTENT(in   ) ::   ll_fw          ! forward time splitting =.true. 
     1307      INTEGER                       , INTENT(inout) ::   jpit           ! cycle length     
     1308      REAL(wp), DIMENSION(3*nn_baro), INTENT(inout) ::   zwgt1, zwgt2   ! Primary & Secondary weights 
     1309      ! 
    13131310      INTEGER ::  jic, jn, ji                      ! temporary integers 
    13141311      REAL(wp) :: za1, za2 
    13151312      !!---------------------------------------------------------------------- 
    1316  
     1313      ! 
    13171314      zwgt1(:) = 0._wp 
    13181315      zwgt2(:) = 0._wp 
    1319  
     1316      ! 
    13201317      ! Set time index when averaged value is requested 
    1321       IF (ll_fw) THEN  
    1322          jic = nn_baro 
    1323       ELSE 
    1324          jic = 2 * nn_baro 
    1325       ENDIF 
    1326  
    1327       ! Set primary weights: 
    1328       IF (ll_av) THEN 
    1329            ! Define simple boxcar window for primary weights  
    1330            ! (width = nn_baro, centered around jic)      
     1318      IF ( ll_fw ) THEN   ;   jic =     nn_baro 
     1319      ELSE                ;   jic = 2 * nn_baro 
     1320      ENDIF 
     1321 
     1322      !                 !==  Set primary weights  ==! 
     1323      ! 
     1324      IF (ll_av) THEN         !* Define simple boxcar window for primary weights  
     1325         !                    !  (width = nn_baro, centered around jic)      
    13311326         SELECT CASE ( nn_bt_flt ) 
    1332               CASE( 0 )  ! No averaging 
    1333                  zwgt1(jic) = 1._wp 
    1334                  jpit = jic 
    1335  
    1336               CASE( 1 )  ! Boxcar, width = nn_baro 
    1337                  DO jn = 1, 3*nn_baro 
    1338                     za1 = ABS(float(jn-jic))/float(nn_baro)  
    1339                     IF (za1 < 0.5_wp) THEN 
    1340                       zwgt1(jn) = 1._wp 
    1341                       jpit = jn 
    1342                     ENDIF 
    1343                  ENDDO 
    1344  
    1345               CASE( 2 )  ! Boxcar, width = 2 * nn_baro 
    1346                  DO jn = 1, 3*nn_baro 
    1347                     za1 = ABS(float(jn-jic))/float(nn_baro)  
    1348                     IF (za1 < 1._wp) THEN 
    1349                       zwgt1(jn) = 1._wp 
    1350                       jpit = jn 
    1351                     ENDIF 
    1352                  ENDDO 
    1353               CASE DEFAULT   ;   CALL ctl_stop( 'unrecognised value for nn_bt_flt' ) 
     1327         CASE( 0 )  ! No averaging 
     1328            zwgt1(jic) = 1._wp 
     1329            jpit = jic 
     1330            ! 
     1331         CASE( 1 )  ! Boxcar, width = nn_baro 
     1332            DO jn = 1, 3*nn_baro 
     1333               za1 = ABS(float(jn-jic))/float(nn_baro)  
     1334               IF ( za1 < 0.5_wp ) THEN 
     1335                  zwgt1(jn) = 1._wp 
     1336                  jpit = jn 
     1337               ENDIF 
     1338            END DO 
     1339            ! 
     1340         CASE( 2 )  ! Boxcar, width = 2 * nn_baro 
     1341            DO jn = 1, 3*nn_baro 
     1342               za1 = ABS(float(jn-jic))/float(nn_baro)  
     1343                  IF ( za1 < 1._wp ) THEN 
     1344                     zwgt1(jn) = 1._wp 
     1345                     jpit = jn 
     1346                  ENDIF 
     1347               END DO 
     1348         CASE DEFAULT   ;   CALL ctl_stop( 'unrecognised value for nn_bt_flt' ) 
    13541349         END SELECT 
    1355  
    1356       ELSE ! No time averaging 
     1350         ! 
     1351      ELSE                    !* No time averaging 
    13571352         zwgt1(jic) = 1._wp 
    13581353         jpit = jic 
    13591354      ENDIF 
    13601355     
    1361       ! Set secondary weights 
     1356      !                 !==  Set secondary weights  ==! 
     1357      ! 
    13621358      DO jn = 1, jpit 
    1363         DO ji = jn, jpit 
    1364              zwgt2(jn) = zwgt2(jn) + zwgt1(ji) 
    1365         END DO 
     1359         DO ji = jn, jpit 
     1360            zwgt2(jn) = zwgt2(jn) + zwgt1(ji) 
     1361         END DO 
    13661362      END DO 
    13671363 
    1368       ! Normalize weigths: 
    1369       za1 = 1._wp / SUM(zwgt1(1:jpit)) 
    1370       za2 = 1._wp / SUM(zwgt2(1:jpit)) 
     1364      !                 !==  Normalize weights  ==! 
     1365      ! 
     1366      za1 = 1._wp / SUM( zwgt1(1:jpit) ) 
     1367      za2 = 1._wp / SUM( zwgt2(1:jpit) ) 
    13711368      DO jn = 1, jpit 
    1372         zwgt1(jn) = zwgt1(jn) * za1 
    1373         zwgt2(jn) = zwgt2(jn) * za2 
     1369         zwgt1(jn) = zwgt1(jn) * za1 
     1370         zwgt2(jn) = zwgt2(jn) * za2 
    13741371      END DO 
    13751372      ! 
     
    15391536      ! 
    15401537      !                             ! read restart when needed 
     1538!!gm what's happen when starting with an euler time-step BUT not from rest ? 
     1539!!   this case correspond to a restart with only now time-step available... 
    15411540      CALL ts_rst( nit000, 'READ' ) 
    15421541      ! 
     
    15481547         CALL iom_set_rstw_var_active('vn_bf') 
    15491548         ! 
    1550          IF (.NOT.ln_bt_av) THEN 
     1549         IF ( .NOT.ln_bt_av ) THEN 
    15511550            CALL iom_set_rstw_var_active('sshbb_e') 
    15521551            CALL iom_set_rstw_var_active('ubb_e') 
Note: See TracChangeset for help on using the changeset viewer.