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

Ignore:
Timestamp:
2018-07-11T10:24:17+02:00 (6 years ago)
Author:
gm
Message:

#1911 (ENHANCE-04): step I.2: dev_r9838_ENHANCE04_MLF

File:
1 edited

Legend:

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

    r9863 r9923  
    6969   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   un_adv , vn_adv   !: Advection vel. at "now" barocl. step 
    7070   ! 
    71    INTEGER, SAVE :: icycle      ! Number of barotropic sub-steps for each internal step nn_baro <= 2.5 nn_baro 
    72    REAL(wp),SAVE :: rdtbt       ! Barotropic time step 
     71   INTEGER, SAVE :: icycle      ! Number of barotropic sub-steps for each internal step nn_e <= 2.5*nn_e 
     72   REAL(wp),SAVE :: rDt_e       ! external mode time-step 
    7373   ! 
    7474   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:)   ::   wgtbtp1, wgtbtp2   ! 1st & 2nd weights used in time filtering of barotropic fields 
     
    8181   REAL(wp) ::   r1_4  = 0.25_wp          ! 
    8282   REAL(wp) ::   r1_2  = 0.5_wp           ! 
    83  
    84    REAL(wp) ::   r1_2dt_b, r2dt_bf               ! local scalars 
    8583    
    8684   !! * Substitutions 
     
    10199      ierr(:) = 0 
    102100      ! 
    103       ALLOCATE( wgtbtp1(3*nn_baro), wgtbtp2(3*nn_baro), zwz(jpi,jpj), STAT=ierr(1) ) 
     101      ALLOCATE( wgtbtp1(3*nn_e), wgtbtp2(3*nn_e), zwz(jpi,jpj), STAT=ierr(1) ) 
    104102      ! 
    105103      IF( ln_dynvor_een .OR. ln_dynvor_eeT )   & 
     
    150148      INTEGER  ::   ikbu, iktu, noffset   ! local integers 
    151149      INTEGER  ::   ikbv, iktv            !   -      - 
     150      INTEGER  ::   iwdg, jwdg, kwdg      ! short-hand values for the indices of the output point 
    152151      REAL(wp) ::   zx1, zx2, zu_spg, zhura, z1_hu  !   -      - 
    153152      REAL(wp) ::   zy1, zy2, zv_spg, zhvra, z1_hv  !   -      - 
    154153      REAL(wp) ::   za0, za1, za2, za3              !   -      - 
    155154      REAL(wp) ::   zmdi, zztmp            , z1_ht  !   -      - 
     155      REAL(wp) ::   zwdramp                         ! local scalar - only used if ln_wd_dl = .True.  
     156      REAL(wp) ::   zload       
    156157      REAL(wp), DIMENSION(jpi,jpj) :: zsshp2_e, zhf 
    157158      REAL(wp), DIMENSION(jpi,jpj) :: zwx, zu_trd, zu_frc, zssh_frc 
     
    161162      REAL(wp), DIMENSION(jpi,jpj) :: zCdU_u, zCdU_v   ! top/bottom stress at u- & v-points 
    162163      ! 
    163       REAL(wp) ::   zwdramp                     ! local scalar - only used if ln_wd_dl = .True.  
    164  
    165       INTEGER  :: iwdg, jwdg, kwdg   ! short-hand values for the indices of the output point 
     164 
    166165 
    167166      REAL(wp) ::   zepsilon, zgamma            !   -      - 
     
    179178      zwdramp = r_rn_wdmin1               ! simplest ramp  
    180179!     zwdramp = 1._wp / (rn_wdmin2 - rn_wdmin1) ! more general ramp 
    181       !                                         ! reciprocal of baroclinic time step  
    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  
    186180      ! 
    187181      ll_init     = ln_bt_av                    ! if no time averaging, then no specific restart  
    188182      ll_fw_start = .FALSE. 
    189183      !                                         ! time offset in steps for bdy data update 
    190       IF( .NOT.ln_bt_fw ) THEN   ;   noffset = - nn_baro 
     184      IF( .NOT.ln_bt_fw ) THEN   ;   noffset = - nn_e 
    191185      ELSE                       ;   noffset =   0  
    192186      ENDIF 
     
    459453                     zcpx(ji,jj) = ABS( (sshn(ji+1,jj) + ht_0(ji+1,jj) - sshn(ji,jj) - ht_0(ji,jj)) & 
    460454                                 &    / (sshn(ji+1,jj) - sshn(ji  ,jj)) ) 
    461                      zcpx(ji,jj) = max(min( zcpx(ji,jj) , 1.0_wp),0.0_wp) 
     455                     zcpx(ji,jj) = MAX(  0._wp , MIN( zcpx(ji,jj) , 1._wp )  ) 
    462456                  ELSE 
    463457                     zcpx(ji,jj) = 0._wp 
     
    536530      ! Note that the "unclipped" bottom friction parameter is used even with explicit drag 
    537531      IF( ln_wd_il ) THEN 
    538          zztmp = -1._wp / rdtbt 
     532         zztmp = -1._wp / rDt_e 
    539533         DO jj = 2, jpjm1 
    540534            DO ji = fs_2, fs_jpim1   ! vector opt. 
     
    587581         DO jj = 2, jpjm1 
    588582            DO ji = fs_2, fs_jpim1   ! vector opt. 
    589                zu_frc(ji,jj) =  zu_frc(ji,jj) + r1_rau0 * utau(ji,jj) * r1_hu_n(ji,jj) 
    590                zv_frc(ji,jj) =  zv_frc(ji,jj) + r1_rau0 * vtau(ji,jj) * r1_hv_n(ji,jj) 
     583               zu_frc(ji,jj) =  zu_frc(ji,jj) + r1_rho0 * utau(ji,jj) * r1_hu_n(ji,jj) 
     584               zv_frc(ji,jj) =  zv_frc(ji,jj) + r1_rho0 * vtau(ji,jj) * r1_hv_n(ji,jj) 
    591585            END DO 
    592586         END DO 
    593587      ELSE 
    594          zztmp = r1_rau0 * r1_2 
     588         zztmp = r1_rho0 * r1_2 
    595589         DO jj = 2, jpjm1 
    596590            DO ji = fs_2, fs_jpim1   ! vector opt. 
     
    629623      !                                         ! Surface net water flux and rivers 
    630624      IF (ln_bt_fw) THEN 
    631          zssh_frc(:,:) = r1_rau0 * ( emp(:,:) - rnf(:,:) + fwfisf(:,:) ) 
     625         zssh_frc(:,:) = r1_rho0 * ( emp(:,:) - rnf(:,:) + fwfisf(:,:) ) 
    632626      ELSE 
    633          zztmp = r1_rau0 * r1_2 
     627         zztmp = r1_rho0 * r1_2 
    634628         zssh_frc(:,:) = zztmp * (  emp(:,:) + emp_b(:,:) - rnf(:,:) - rnf_b(:,:)   & 
    635629                &                 + fwfisf(:,:) + fwfisf_b(:,:)                     ) 
     
    818812         ENDIF 
    819813#endif 
    820          IF( ln_wd_il )   CALL wad_lmt_bt(zwx, zwy, sshn_e, zssh_frc, rdtbt) 
     814         IF( ln_wd_il )   CALL wad_lmt_bt(zwx, zwy, sshn_e, zssh_frc, rDt_e) 
    821815 
    822816         IF ( ln_wd_dl ) THEN  
     
    864858            END DO 
    865859         END DO 
    866          ssha_e(:,:) = (  sshn_e(:,:) - rdtbt * ( zssh_frc(:,:) + zhdiv(:,:) )  ) * ssmask(:,:) 
     860         ssha_e(:,:) = (  sshn_e(:,:) - rDt_e * ( zssh_frc(:,:) + zhdiv(:,:) )  ) * ssmask(:,:) 
    867861          
    868862         CALL lbc_lnk( ssha_e, 'T',  1._wp ) 
     
    10681062         ENDIF  
    10691063         ! 
    1070          ! Surface pressure trend: 
     1064         ! Surface pressure trend 
     1065         IF( ln_scal_load ) THEN   ;   zload = 1._wp 
     1066         ELSE                      ;   zload = 1._wp - rn_load 
     1067         ENDIF 
    10711068         IF( ln_wd_il ) THEN 
    10721069           DO jj = 2, jpjm1 
     
    10751072                 zu_spg = - grav * ( zsshp2_e(ji+1,jj) - zsshp2_e(ji,jj) ) * r1_e1u(ji,jj) 
    10761073                 zv_spg = - grav * ( zsshp2_e(ji,jj+1) - zsshp2_e(ji,jj) ) * r1_e2v(ji,jj) 
    1077                  zwx(ji,jj) = (1._wp - rn_scal_load) * zu_spg * zcpx(ji,jj)  
    1078                  zwy(ji,jj) = (1._wp - rn_scal_load) * zv_spg * zcpy(ji,jj) 
     1074                 zwx(ji,jj) = zload * zu_spg * zcpx(ji,jj)  
     1075                 zwy(ji,jj) = zload * zv_spg * zcpy(ji,jj) 
    10791076              END DO 
    10801077           END DO 
     
    10851082                 zu_spg = - grav * ( zsshp2_e(ji+1,jj) - zsshp2_e(ji,jj) ) * r1_e1u(ji,jj) 
    10861083                 zv_spg = - grav * ( zsshp2_e(ji,jj+1) - zsshp2_e(ji,jj) ) * r1_e2v(ji,jj) 
    1087                  zwx(ji,jj) = (1._wp - rn_scal_load) * zu_spg 
    1088                  zwy(ji,jj) = (1._wp - rn_scal_load) * zv_spg 
     1084                 zwx(ji,jj) = zload * zu_spg 
     1085                 zwy(ji,jj) = zload * zv_spg 
    10891086              END DO 
    10901087           END DO 
     
    10971094               DO ji = fs_2, fs_jpim1   ! vector opt. 
    10981095                  ua_e(ji,jj) = (                                 un_e(ji,jj)   &  
    1099                             &     + rdtbt * (                      zwx(ji,jj)   & 
     1096                            &     + rDt_e * (                      zwx(ji,jj)   & 
    11001097                            &                                 + zu_trd(ji,jj)   & 
    11011098                            &                                 + zu_frc(ji,jj) ) &  
     
    11031100 
    11041101                  va_e(ji,jj) = (                                 vn_e(ji,jj)   & 
    1105                             &     + rdtbt * (                      zwy(ji,jj)   & 
     1102                            &     + rDt_e * (                      zwy(ji,jj)   & 
    11061103                            &                                 + zv_trd(ji,jj)   & 
    11071104                            &                                 + zv_frc(ji,jj) ) & 
     
    11101107!jth implicit bottom friction: 
    11111108                  IF ( ll_wd ) THEN ! revert to explicit for bit comparison tests in non wad runs 
    1112                      ua_e(ji,jj) =  ua_e(ji,jj) /(1.0 -   rdtbt * zCdU_u(ji,jj) * hur_e(ji,jj)) 
    1113                      va_e(ji,jj) =  va_e(ji,jj) /(1.0 -   rdtbt * zCdU_v(ji,jj) * hvr_e(ji,jj)) 
     1109                     ua_e(ji,jj) =  ua_e(ji,jj) /(1.0 -   rDt_e * zCdU_u(ji,jj) * hur_e(ji,jj)) 
     1110                     va_e(ji,jj) =  va_e(ji,jj) /(1.0 -   rDt_e * zCdU_v(ji,jj) * hvr_e(ji,jj)) 
    11141111                  ENDIF 
    11151112 
     
    11281125 
    11291126                  ua_e(ji,jj) = (                hu_e(ji,jj)  *   un_e(ji,jj)   &  
    1130                             &     + rdtbt * ( zhust_e(ji,jj)  *    zwx(ji,jj)   &  
     1127                            &     + rDt_e * ( zhust_e(ji,jj)  *    zwx(ji,jj)   &  
    11311128                            &               + zhup2_e(ji,jj)  * zu_trd(ji,jj)   & 
    11321129                            &               +    hu_n(ji,jj)  * zu_frc(ji,jj) ) & 
     
    11341131 
    11351132                  va_e(ji,jj) = (                hv_e(ji,jj)  *   vn_e(ji,jj)   & 
    1136                             &     + rdtbt * ( zhvst_e(ji,jj)  *    zwy(ji,jj)   & 
     1133                            &     + rDt_e * ( zhvst_e(ji,jj)  *    zwy(ji,jj)   & 
    11371134                            &               + zhvp2_e(ji,jj)  * zv_trd(ji,jj)   & 
    11381135                            &               +    hv_n(ji,jj)  * zv_frc(ji,jj) ) & 
     
    12021199         zwy(:,:) = vn_adv(:,:) 
    12031200         IF( .NOT.l_1st_euler ) THEN 
    1204             un_adv(:,:) = r1_2 * ( ub2_b(:,:) + zwx(:,:) - atfp * un_bf(:,:) ) 
    1205             vn_adv(:,:) = r1_2 * ( vb2_b(:,:) + zwy(:,:) - atfp * vn_bf(:,:) ) 
     1201            un_adv(:,:) = r1_2 * ( ub2_b(:,:) + zwx(:,:) - rn_atfp * un_bf(:,:) ) 
     1202            vn_adv(:,:) = r1_2 * ( vb2_b(:,:) + zwy(:,:) - rn_atfp * vn_bf(:,:) ) 
    12061203            ! 
    12071204            ! Update corrective fluxes for next time step: 
    1208             un_bf(:,:)  = atfp * un_bf(:,:) + (zwx(:,:) - ub2_b(:,:)) 
    1209             vn_bf(:,:)  = atfp * vn_bf(:,:) + (zwy(:,:) - vb2_b(:,:)) 
     1205            un_bf(:,:)  = rn_atfp * un_bf(:,:) + (zwx(:,:) - ub2_b(:,:)) 
     1206            vn_bf(:,:)  = rn_atfp * vn_bf(:,:) + (zwy(:,:) - vb2_b(:,:)) 
    12101207         ELSE 
    12111208            un_bf(:,:) = 0._wp 
     
    12221219      IF( ln_dynadv_vec .OR. ln_linssh ) THEN 
    12231220         DO jk=1,jpkm1 
    1224             ua(:,:,jk) = ua(:,:,jk) + ( ua_b(:,:) - ub_b(:,:) ) * r1_2dt_b 
    1225             va(:,:,jk) = va(:,:,jk) + ( va_b(:,:) - vb_b(:,:) ) * r1_2dt_b 
     1221            ua(:,:,jk) = ua(:,:,jk) + ( ua_b(:,:) - ub_b(:,:) ) * r1_Dt 
     1222            va(:,:,jk) = va(:,:,jk) + ( va_b(:,:) - vb_b(:,:) ) * r1_Dt 
    12261223         END DO 
    12271224      ELSE 
     
    12291226         DO jj = 1, jpjm1 
    12301227            DO ji = 1, jpim1      ! NO Vector Opt. 
    1231                zsshu_a(ji,jj) = r1_2 * ssumask(ji,jj)  * r1_e1e2u(ji,jj) & 
    1232                   &              * ( e1e2t(ji  ,jj) * ssha(ji  ,jj)      & 
    1233                   &              +   e1e2t(ji+1,jj) * ssha(ji+1,jj) ) 
    1234                zsshv_a(ji,jj) = r1_2 * ssvmask(ji,jj)  * r1_e1e2v(ji,jj) & 
    1235                   &              * ( e1e2t(ji,jj  ) * ssha(ji,jj  )      & 
    1236                   &              +   e1e2t(ji,jj+1) * ssha(ji,jj+1) ) 
     1228               zsshu_a(ji,jj) = r1_2 * ssumask(ji,jj)  * r1_e1e2u(ji,jj) * (   e1e2t(ji  ,jj) * ssha(ji  ,jj)   & 
     1229                  &                                                          + e1e2t(ji+1,jj) * ssha(ji+1,jj)   ) 
     1230               zsshv_a(ji,jj) = r1_2 * ssvmask(ji,jj)  * r1_e1e2v(ji,jj) * (   e1e2t(ji,jj  ) * ssha(ji,jj  )   & 
     1231                  &                                                          + e1e2t(ji,jj+1) * ssha(ji,jj+1) ) 
    12371232            END DO 
    12381233         END DO 
     
    12401235         ! 
    12411236         DO jk=1,jpkm1 
    1242             ua(:,:,jk) = ua(:,:,jk) + r1_hu_n(:,:) * ( ua_b(:,:) - ub_b(:,:) * hu_b(:,:) ) * r1_2dt_b 
    1243             va(:,:,jk) = va(:,:,jk) + r1_hv_n(:,:) * ( va_b(:,:) - vb_b(:,:) * hv_b(:,:) ) * r1_2dt_b 
     1237            ua(:,:,jk) = ua(:,:,jk) + r1_hu_n(:,:) * ( ua_b(:,:) - ub_b(:,:) * hu_b(:,:) ) * r1_Dt 
     1238            va(:,:,jk) = va(:,:,jk) + r1_hv_n(:,:) * ( va_b(:,:) - vb_b(:,:) * hv_b(:,:) ) * r1_Dt 
    12441239         END DO 
    12451240         ! Save barotropic velocities not transport: 
     
    13061301      LOGICAL                       , INTENT(in   ) ::   ll_fw          ! forward time splitting =.true. 
    13071302      INTEGER                       , INTENT(inout) ::   jpit           ! cycle length     
    1308       REAL(wp), DIMENSION(3*nn_baro), INTENT(inout) ::   zwgt1, zwgt2   ! Primary & Secondary weights 
     1303      REAL(wp), DIMENSION(3*nn_e), INTENT(inout) ::   zwgt1, zwgt2   ! Primary & Secondary weights 
    13091304      ! 
    13101305      INTEGER ::  jic, jn, ji                      ! temporary integers 
     
    13161311      ! 
    13171312      ! Set time index when averaged value is requested 
    1318       IF ( ll_fw ) THEN   ;   jic =     nn_baro 
    1319       ELSE                ;   jic = 2 * nn_baro 
     1313      IF ( ll_fw ) THEN   ;   jic =     nn_e 
     1314      ELSE                ;   jic = 2 * nn_e 
    13201315      ENDIF 
    13211316 
     
    13231318      ! 
    13241319      IF (ll_av) THEN         !* Define simple boxcar window for primary weights  
    1325          !                    !  (width = nn_baro, centered around jic)      
     1320         !                    !  (width = nn_e, centered around jic)      
    13261321         SELECT CASE ( nn_bt_flt ) 
    13271322         CASE( 0 )  ! No averaging 
     
    13291324            jpit = jic 
    13301325            ! 
    1331          CASE( 1 )  ! Boxcar, width = nn_baro 
    1332             DO jn = 1, 3*nn_baro 
    1333                za1 = ABS(float(jn-jic))/float(nn_baro)  
     1326         CASE( 1 )  ! Boxcar, width = nn_e 
     1327            DO jn = 1, 3*nn_e 
     1328               za1 = ABS(float(jn-jic))/float(nn_e)  
    13341329               IF ( za1 < 0.5_wp ) THEN 
    13351330                  zwgt1(jn) = 1._wp 
     
    13381333            END DO 
    13391334            ! 
    1340          CASE( 2 )  ! Boxcar, width = 2 * nn_baro 
    1341             DO jn = 1, 3*nn_baro 
    1342                za1 = ABS(float(jn-jic))/float(nn_baro)  
     1335         CASE( 2 )  ! Boxcar, width = 2 * nn_e 
     1336            DO jn = 1, 3*nn_e 
     1337               za1 = ABS(float(jn-jic))/float(nn_e)  
    13431338                  IF ( za1 < 1._wp ) THEN 
    13441339                     zwgt1(jn) = 1._wp 
     
    14741469 
    14751470      ! Estimate number of iterations to satisfy a max courant number= rn_bt_cmax 
    1476       IF( ln_bt_auto )   nn_baro = CEILING( rdt / rn_bt_cmax * zcmax) 
     1471      IF( ln_bt_auto )   nn_e = CEILING( rn_Dt / rn_bt_cmax * zcmax) 
    14771472       
    1478       rdtbt = rdt / REAL( nn_baro , wp ) 
    1479       zcmax = zcmax * rdtbt 
     1473      rDt_e = rn_Dt / REAL( nn_e , wp ) 
     1474      zcmax = zcmax * rDt_e 
    14801475      ! Print results 
    14811476      IF(lwp) WRITE(numout,*) 
     
    14831478      IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~~' 
    14841479      IF( ln_bt_auto ) THEN 
    1485          IF(lwp) WRITE(numout,*) '     ln_ts_auto =.true. Automatically set nn_baro ' 
     1480         IF(lwp) WRITE(numout,*) '     ln_ts_auto =.true. Automatically set nn_e ' 
    14861481         IF(lwp) WRITE(numout,*) '     Max. courant number allowed: ', rn_bt_cmax 
    14871482      ELSE 
    1488          IF(lwp) WRITE(numout,*) '     ln_ts_auto=.false.: Use nn_baro in namelist   nn_baro = ', nn_baro 
     1483         IF(lwp) WRITE(numout,*) '     ln_ts_auto=.false.: Use nn_e in namelist   nn_e = ', nn_e 
    14891484      ENDIF 
    14901485 
    14911486      IF(ln_bt_av) THEN 
    1492          IF(lwp) WRITE(numout,*) '     ln_bt_av =.true.  ==> Time averaging over nn_baro time steps is on ' 
     1487         IF(lwp) WRITE(numout,*) '     ln_bt_av =.true.  ==> Time averaging over nn_e time steps is on ' 
    14931488      ELSE 
    14941489         IF(lwp) WRITE(numout,*) '     ln_bt_av =.false. => No time averaging of barotropic variables ' 
     
    15101505      SELECT CASE ( nn_bt_flt ) 
    15111506         CASE( 0 )      ;   IF(lwp) WRITE(numout,*) '           Dirac' 
    1512          CASE( 1 )      ;   IF(lwp) WRITE(numout,*) '           Boxcar: width = nn_baro' 
    1513          CASE( 2 )      ;   IF(lwp) WRITE(numout,*) '           Boxcar: width = 2*nn_baro'  
     1507         CASE( 1 )      ;   IF(lwp) WRITE(numout,*) '           Boxcar: width = nn_e' 
     1508         CASE( 2 )      ;   IF(lwp) WRITE(numout,*) '           Boxcar: width = 2*nn_e'  
    15141509         CASE DEFAULT   ;   CALL ctl_stop( 'unrecognised value for nn_bt_flt: should 0,1, or 2' ) 
    15151510      END SELECT 
    15161511      ! 
    15171512      IF(lwp) WRITE(numout,*) ' ' 
    1518       IF(lwp) WRITE(numout,*) '     nn_baro = ', nn_baro 
    1519       IF(lwp) WRITE(numout,*) '     Barotropic time step [s] is :', rdtbt 
    1520       IF(lwp) WRITE(numout,*) '     Maximum Courant number is   :', zcmax 
     1513      IF(lwp) WRITE(numout,*) '     nn_e = ', nn_e 
     1514      IF(lwp) WRITE(numout,*) '     external mode time step is : rDt_e', rDt_e, ' [s]' 
     1515      IF(lwp) WRITE(numout,*) '     Maximum Courant number  is :      ', zcmax 
    15211516      ! 
    15221517      IF(lwp) WRITE(numout,*)    '     Time diffusion parameter rn_bt_alpha: ', rn_bt_alpha 
     
    15291524      ENDIF 
    15301525      IF( zcmax>0.9_wp ) THEN 
    1531          CALL ctl_stop( 'dynspg_ts ERROR: Maximum Courant number is greater than 0.9: Inc. nn_baro !' )           
     1526         CALL ctl_stop( 'dynspg_ts ERROR: Maximum Courant number is greater than 0.9: Inc. nn_e !' )           
    15321527      ENDIF 
    15331528      ! 
Note: See TracChangeset for help on using the changeset viewer.