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 13295 for NEMO/trunk/src/OCE/DYN/dynspg_ts.F90 – NEMO

Ignore:
Timestamp:
2020-07-10T20:24:21+02:00 (4 years ago)
Author:
acc
Message:

Replace do-loop macros in the trunk with alternative forms with greater flexibility for extra halo applications. This alters a lot of routines but does not change any behaviour or results. do_loop_substitute.h90 is greatly simplified by this change. SETTE results are identical to those with the previous revision

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/trunk/src/OCE/DYN/dynspg_ts.F90

    r13289 r13295  
    264264         IF( ln_wd_il ) THEN                       ! W/D : limiter applied to spgspg 
    265265            CALL wad_spg( pssh(:,:,Kmm), zcpx, zcpy )          ! Calculating W/D gravity filters, zcpx and zcpy 
    266             DO_2D_00_00 
     266            DO_2D( 0, 0, 0, 0 ) 
    267267               zu_trd(ji,jj) = zu_trd(ji,jj) - grav * ( pssh(ji+1,jj  ,Kmm) - pssh(ji  ,jj ,Kmm) )   & 
    268268                  &                          * r1_e1u(ji,jj) * zcpx(ji,jj)  * wdrampu(ji,jj)  !jth 
     
    271271            END_2D 
    272272         ELSE                                      ! now suface pressure gradient 
    273             DO_2D_00_00 
     273            DO_2D( 0, 0, 0, 0 ) 
    274274               zu_trd(ji,jj) = zu_trd(ji,jj) - grav * (  pssh(ji+1,jj  ,Kmm) - pssh(ji  ,jj  ,Kmm)  ) * r1_e1u(ji,jj) 
    275275               zv_trd(ji,jj) = zv_trd(ji,jj) - grav * (  pssh(ji  ,jj+1,Kmm) - pssh(ji  ,jj  ,Kmm)  ) * r1_e2v(ji,jj)  
     
    279279      ENDIF 
    280280      ! 
    281       DO_2D_00_00 
     281      DO_2D( 0, 0, 0, 0 ) 
    282282          zu_frc(ji,jj) = zu_frc(ji,jj) - zu_trd(ji,jj) * ssumask(ji,jj) 
    283283          zv_frc(ji,jj) = zv_frc(ji,jj) - zv_trd(ji,jj) * ssvmask(ji,jj) 
     
    291291      IF( ln_apr_dyn ) THEN 
    292292         IF( ln_bt_fw ) THEN                          ! FORWARD integration: use kt+1/2 pressure (NOW+1/2) 
    293             DO_2D_00_00 
     293            DO_2D( 0, 0, 0, 0 ) 
    294294               zu_frc(ji,jj) = zu_frc(ji,jj) + grav * (  ssh_ib (ji+1,jj  ) - ssh_ib (ji,jj) ) * r1_e1u(ji,jj) 
    295295               zv_frc(ji,jj) = zv_frc(ji,jj) + grav * (  ssh_ib (ji  ,jj+1) - ssh_ib (ji,jj) ) * r1_e2v(ji,jj) 
     
    297297         ELSE                                         ! CENTRED integration: use kt-1/2 + kt+1/2 pressure (NOW) 
    298298            zztmp = grav * r1_2 
    299             DO_2D_00_00 
     299            DO_2D( 0, 0, 0, 0 ) 
    300300               zu_frc(ji,jj) = zu_frc(ji,jj) + zztmp * (  ssh_ib (ji+1,jj  ) - ssh_ib (ji,jj)  & 
    301301                    &                                   + ssh_ibb(ji+1,jj  ) - ssh_ibb(ji,jj)  ) * r1_e1u(ji,jj) 
     
    309309      !                                   !  ----------------------------------  ! 
    310310      IF( ln_bt_fw ) THEN                        ! Add wind forcing 
    311          DO_2D_00_00 
     311         DO_2D( 0, 0, 0, 0 ) 
    312312            zu_frc(ji,jj) =  zu_frc(ji,jj) + r1_rho0 * utau(ji,jj) * r1_hu(ji,jj,Kmm) 
    313313            zv_frc(ji,jj) =  zv_frc(ji,jj) + r1_rho0 * vtau(ji,jj) * r1_hv(ji,jj,Kmm) 
     
    315315      ELSE 
    316316         zztmp = r1_rho0 * r1_2 
    317          DO_2D_00_00 
     317         DO_2D( 0, 0, 0, 0 ) 
    318318            zu_frc(ji,jj) =  zu_frc(ji,jj) + zztmp * ( utau_b(ji,jj) + utau(ji,jj) ) * r1_hu(ji,jj,Kmm) 
    319319            zv_frc(ji,jj) =  zv_frc(ji,jj) + zztmp * ( vtau_b(ji,jj) + vtau(ji,jj) ) * r1_hv(ji,jj,Kmm) 
     
    475475            ! 
    476476            !                          ! ocean u- and v-depth at mid-step   (separate DO-loops remove the need of a lbc_lnk) 
    477             DO_2D_11_10 
     477            DO_2D( 1, 1, 1, 0 ) 
    478478               zhup2_e(ji,jj) = hu_0(ji,jj) + r1_2 * r1_e1e2u(ji,jj)                        & 
    479479                    &                              * (  e1e2t(ji  ,jj) * zsshp2_e(ji  ,jj)  & 
    480480                    &                                 + e1e2t(ji+1,jj) * zsshp2_e(ji+1,jj)  ) * ssumask(ji,jj) 
    481481            END_2D 
    482             DO_2D_10_11 
     482            DO_2D( 1, 0, 1, 1 ) 
    483483               zhvp2_e(ji,jj) = hv_0(ji,jj) + r1_2 * r1_e1e2v(ji,jj)                        & 
    484484                    &                              * (  e1e2t(ji,jj  ) * zsshp2_e(ji,jj  )  & 
     
    515515         !--        ssh    =  ssh   - delta_t' * [ frc + div( flux      ) ]      --! 
    516516         !-------------------------------------------------------------------------! 
    517          DO_2D_00_00 
     517         DO_2D( 0, 0, 0, 0 ) 
    518518            zhdiv = (   zhU(ji,jj) - zhU(ji-1,jj) + zhV(ji,jj) - zhV(ji,jj-1)   ) * r1_e1e2t(ji,jj) 
    519519            ssha_e(ji,jj) = (  sshn_e(ji,jj) - rDt_e * ( zssh_frc(ji,jj) + zhdiv )  ) * ssmask(ji,jj) 
     
    541541         ! Sea Surface Height at u-,v-points (vvl case only) 
    542542         IF( .NOT.ln_linssh ) THEN                                 
    543             DO_2D_00_00 
     543            DO_2D( 0, 0, 0, 0 ) 
    544544               zsshu_a(ji,jj) = r1_2 * ssumask(ji,jj) * r1_e1e2u(ji,jj)    & 
    545545                  &              * ( e1e2t(ji  ,jj  )  * ssha_e(ji  ,jj  ) & 
     
    561561         !                             ! Surface pressure gradient 
    562562         zldg = ( 1._wp - rn_scal_load ) * grav    ! local factor 
    563          DO_2D_00_00 
     563         DO_2D( 0, 0, 0, 0 ) 
    564564            zu_spg(ji,jj) = - zldg * ( zsshp2_e(ji+1,jj) - zsshp2_e(ji,jj) ) * r1_e1u(ji,jj) 
    565565            zv_spg(ji,jj) = - zldg * ( zsshp2_e(ji,jj+1) - zsshp2_e(ji,jj) ) * r1_e2v(ji,jj) 
     
    579579         ! Add tidal astronomical forcing if defined 
    580580         IF ( ln_tide .AND. ln_tide_pot ) THEN 
    581             DO_2D_00_00 
     581            DO_2D( 0, 0, 0, 0 ) 
    582582               zu_trd(ji,jj) = zu_trd(ji,jj) + grav * ( pot_astro(ji+1,jj) - pot_astro(ji,jj) ) * r1_e1u(ji,jj) 
    583583               zv_trd(ji,jj) = zv_trd(ji,jj) + grav * ( pot_astro(ji,jj+1) - pot_astro(ji,jj) ) * r1_e2v(ji,jj) 
     
    588588!jth do implicitly instead 
    589589         IF ( .NOT. ll_wd ) THEN ! Revert to explicit for bit comparison tests in non wad runs 
    590             DO_2D_00_00 
     590            DO_2D( 0, 0, 0, 0 ) 
    591591               zu_trd(ji,jj) = zu_trd(ji,jj) + zCdU_u(ji,jj) * un_e(ji,jj) * hur_e(ji,jj) 
    592592               zv_trd(ji,jj) = zv_trd(ji,jj) + zCdU_v(ji,jj) * vn_e(ji,jj) * hvr_e(ji,jj) 
     
    606606         !------------------------------------------------------------------------------------------------------------------------! 
    607607         IF( ln_dynadv_vec .OR. ln_linssh ) THEN      !* Vector form 
    608             DO_2D_00_00 
     608            DO_2D( 0, 0, 0, 0 ) 
    609609               ua_e(ji,jj) = (                                 un_e(ji,jj)   &  
    610610                         &     + rDt_e * (                   zu_spg(ji,jj)   & 
     
    621621            ! 
    622622         ELSE                           !* Flux form 
    623             DO_2D_00_00 
     623            DO_2D( 0, 0, 0, 0 ) 
    624624               !                    ! hu_e, hv_e hold depth at jn,  zhup2_e, zhvp2_e hold extrapolated depth at jn+1/2 
    625625               !                    ! backward interpolated depth used in spg terms at jn+1/2 
     
    645645!jth implicit bottom friction: 
    646646         IF ( ll_wd ) THEN ! revert to explicit for bit comparison tests in non wad runs 
    647             DO_2D_00_00 
     647            DO_2D( 0, 0, 0, 0 ) 
    648648                  ua_e(ji,jj) =  ua_e(ji,jj) /(1.0 -   rDt_e * zCdU_u(ji,jj) * hur_e(ji,jj)) 
    649649                  va_e(ji,jj) =  va_e(ji,jj) /(1.0 -   rDt_e * zCdU_v(ji,jj) * hvr_e(ji,jj)) 
     
    712712      IF (ln_bt_fw) THEN 
    713713         IF( .NOT.( kt == nit000 .AND. l_1st_euler ) ) THEN 
    714             DO_2D_11_11 
     714            DO_2D( 1, 1, 1, 1 ) 
    715715               zun_save = un_adv(ji,jj) 
    716716               zvn_save = vn_adv(ji,jj) 
     
    743743      ELSE 
    744744         ! At this stage, pssh(:,:,:,Krhs) has been corrected: compute new depths at velocity points 
    745          DO_2D_10_10 
     745         DO_2D( 1, 0, 1, 0 ) 
    746746            zsshu_a(ji,jj) = r1_2 * ssumask(ji,jj)  * r1_e1e2u(ji,jj) & 
    747747               &              * ( e1e2t(ji  ,jj) * pssh(ji  ,jj,Kaa)      & 
     
    975975      ! Max courant number for ext. grav. waves 
    976976      ! 
    977       DO_2D_00_00 
     977      DO_2D( 0, 0, 0, 0 ) 
    978978         zxr2 = r1_e1t(ji,jj) * r1_e1t(ji,jj) 
    979979         zyr2 = r1_e2t(ji,jj) * r1_e2t(ji,jj) 
     
    11001100         SELECT CASE( nn_een_e3f )              !* ff_f/e3 at F-point 
    11011101         CASE ( 0 )                                   ! original formulation  (masked averaging of e3t divided by 4) 
    1102             DO_2D_10_10 
     1102            DO_2D( 1, 0, 1, 0 ) 
    11031103               zwz(ji,jj) =   ( ht(ji  ,jj+1) + ht(ji+1,jj+1) +                    & 
    11041104                    &           ht(ji  ,jj  ) + ht(ji+1,jj  )   ) * 0.25_wp   
     
    11061106            END_2D 
    11071107         CASE ( 1 )                                   ! new formulation  (masked averaging of e3t divided by the sum of mask) 
    1108             DO_2D_10_10 
     1108            DO_2D( 1, 0, 1, 0 ) 
    11091109               zwz(ji,jj) =             (  ht  (ji  ,jj+1) + ht  (ji+1,jj+1)      & 
    11101110                    &                    + ht  (ji  ,jj  ) + ht  (ji+1,jj  )  )   & 
     
    11171117         ! 
    11181118         ftne(1,:) = 0._wp ; ftnw(1,:) = 0._wp ; ftse(1,:) = 0._wp ; ftsw(1,:) = 0._wp 
    1119          DO_2D_01_01 
     1119         DO_2D( 0, 1, 0, 1 ) 
    11201120            ftne(ji,jj) = zwz(ji-1,jj  ) + zwz(ji  ,jj  ) + zwz(ji  ,jj-1) 
    11211121            ftnw(ji,jj) = zwz(ji-1,jj-1) + zwz(ji-1,jj  ) + zwz(ji  ,jj  ) 
     
    11261126      CASE( np_EET )                  != EEN scheme using e3t energy conserving scheme 
    11271127         ftne(1,:) = 0._wp ; ftnw(1,:) = 0._wp ; ftse(1,:) = 0._wp ; ftsw(1,:) = 0._wp 
    1128          DO_2D_01_01 
     1128         DO_2D( 0, 1, 0, 1 ) 
    11291129            z1_ht = ssmask(ji,jj) / ( ht(ji,jj) + 1._wp - ssmask(ji,jj) ) 
    11301130            ftne(ji,jj) = ( ff_f(ji-1,jj  ) + ff_f(ji  ,jj  ) + ff_f(ji  ,jj-1) ) * z1_ht 
     
    11591159            ! 
    11601160            !zhf(:,:) = hbatf(:,:) 
    1161             DO_2D_10_10 
     1161            DO_2D( 1, 0, 1, 0 ) 
    11621162               zhf(ji,jj) =    (   ht_0  (ji,jj  ) + ht_0  (ji+1,jj  )          & 
    11631163                    &            + ht_0  (ji,jj+1) + ht_0  (ji+1,jj+1)   )      & 
     
    11781178         CALL lbc_lnk( 'dynspg_ts', zhf, 'F', 1._wp ) 
    11791179         ! JC: TBC. hf should be greater than 0  
    1180          DO_2D_11_11 
     1180         DO_2D( 1, 1, 1, 1 ) 
    11811181            IF( zhf(ji,jj) /= 0._wp )   zwz(ji,jj) = 1._wp / zhf(ji,jj) 
    11821182         END_2D 
     
    12011201      SELECT CASE( nvor_scheme ) 
    12021202      CASE( np_ENT )                ! enstrophy conserving scheme (f-point) 
    1203          DO_2D_00_00 
     1203         DO_2D( 0, 0, 0, 0 ) 
    12041204            z1_hu = ssumask(ji,jj) / ( phu(ji,jj) + 1._wp - ssumask(ji,jj) ) 
    12051205            z1_hv = ssvmask(ji,jj) / ( phv(ji,jj) + 1._wp - ssvmask(ji,jj) ) 
     
    12141214         !          
    12151215      CASE( np_ENE , np_MIX )        ! energy conserving scheme (t-point) ENE or MIX 
    1216          DO_2D_00_00 
     1216         DO_2D( 0, 0, 0, 0 ) 
    12171217            zy1 = ( zhV(ji,jj-1) + zhV(ji+1,jj-1) ) * r1_e1u(ji,jj) 
    12181218            zy2 = ( zhV(ji,jj  ) + zhV(ji+1,jj  ) ) * r1_e1u(ji,jj) 
     
    12251225         ! 
    12261226      CASE( np_ENS )                ! enstrophy conserving scheme (f-point) 
    1227          DO_2D_00_00 
     1227         DO_2D( 0, 0, 0, 0 ) 
    12281228            zy1 =   r1_8 * ( zhV(ji  ,jj-1) + zhV(ji+1,jj-1) & 
    12291229              &            + zhV(ji  ,jj  ) + zhV(ji+1,jj  ) ) * r1_e1u(ji,jj) 
     
    12351235         ! 
    12361236      CASE( np_EET , np_EEN )      ! energy & enstrophy scheme (using e3t or e3f)          
    1237          DO_2D_00_00 
     1237         DO_2D( 0, 0, 0, 0 ) 
    12381238            zu_trd(ji,jj) = + r1_12 * r1_e1u(ji,jj) * (  ftne(ji,jj  ) * zhV(ji  ,jj  ) & 
    12391239             &                                         + ftnw(ji+1,jj) * zhV(ji+1,jj  ) & 
     
    12691269      ! 
    12701270      IF( ln_wd_dl_rmp ) THEN      
    1271          DO_2D_11_11 
     1271         DO_2D( 1, 1, 1, 1 ) 
    12721272            IF    ( pssh(ji,jj) + ht_0(ji,jj) >  2._wp * rn_wdmin1 ) THEN  
    12731273               !           IF    ( pssh(ji,jj) + ht_0(ji,jj) >          rn_wdmin2 ) THEN  
     
    12801280         END_2D 
    12811281      ELSE   
    1282          DO_2D_11_11 
     1282         DO_2D( 1, 1, 1, 1 ) 
    12831283            IF ( pssh(ji,jj) + ht_0(ji,jj) >  rn_wdmin1 ) THEN   ;   ptmsk(ji,jj) = 1._wp 
    12841284            ELSE                                                 ;   ptmsk(ji,jj) = 0._wp 
     
    13081308      !!---------------------------------------------------------------------- 
    13091309      ! 
    1310       DO_2D_11_10 
     1310      DO_2D( 1, 1, 1, 0 ) 
    13111311         IF ( phU(ji,jj) > 0._wp ) THEN   ;   pUmsk(ji,jj) = pTmsk(ji  ,jj)  
    13121312         ELSE                             ;   pUmsk(ji,jj) = pTmsk(ji+1,jj)   
     
    13161316      END_2D 
    13171317      ! 
    1318       DO_2D_10_11 
     1318      DO_2D( 1, 0, 1, 1 ) 
    13191319         IF ( phV(ji,jj) > 0._wp ) THEN   ;   pVmsk(ji,jj) = pTmsk(ji,jj  ) 
    13201320         ELSE                             ;   pVmsk(ji,jj) = pTmsk(ji,jj+1)   
     
    13381338      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) :: zcpx, zcpy 
    13391339      !!---------------------------------------------------------------------- 
    1340       DO_2D_00_00 
     1340      DO_2D( 0, 0, 0, 0 ) 
    13411341         ll_tmp1 = MIN(  pshn(ji,jj)               ,  pshn(ji+1,jj) ) >                & 
    13421342              &      MAX( -ht_0(ji,jj)               , -ht_0(ji+1,jj) ) .AND.            & 
     
    14071407      IF( ln_isfcav ) THEN          ! top+bottom friction (ocean cavities) 
    14081408          
    1409          DO_2D_00_00 
     1409         DO_2D( 0, 0, 0, 0 ) 
    14101410            pCdU_u(ji,jj) = r1_2*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) + rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) 
    14111411            pCdU_v(ji,jj) = r1_2*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) + rCdU_top(ji,jj+1)+rCdU_top(ji,jj) ) 
    14121412         END_2D 
    14131413      ELSE                          ! bottom friction only 
    1414          DO_2D_00_00 
     1414         DO_2D( 0, 0, 0, 0 ) 
    14151415            pCdU_u(ji,jj) = r1_2*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) 
    14161416            pCdU_v(ji,jj) = r1_2*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) 
     
    14221422      IF( ln_bt_fw ) THEN                 ! FORWARD integration: use NOW bottom baroclinic velocities 
    14231423          
    1424          DO_2D_00_00 
     1424         DO_2D( 0, 0, 0, 0 ) 
    14251425            ikbu = mbku(ji,jj)        
    14261426            ikbv = mbkv(ji,jj)     
     
    14301430      ELSE                                ! CENTRED integration: use BEFORE bottom baroclinic velocities 
    14311431          
    1432          DO_2D_00_00 
     1432         DO_2D( 0, 0, 0, 0 ) 
    14331433            ikbu = mbku(ji,jj)        
    14341434            ikbv = mbkv(ji,jj)     
     
    14401440      IF( ln_wd_il ) THEN      ! W/D : use the "clipped" bottom friction   !!gm   explain WHY, please ! 
    14411441         zztmp = -1._wp / rDt_e 
    1442          DO_2D_00_00 
     1442         DO_2D( 0, 0, 0, 0 ) 
    14431443            pu_RHSi(ji,jj) = pu_RHSi(ji,jj) + zu_i(ji,jj) *  wdrampu(ji,jj) * MAX(                                 &  
    14441444                 &                              r1_hu(ji,jj,Kmm) * r1_2*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) , zztmp  ) 
     
    14481448      ELSE                    ! use "unclipped" drag (even if explicit friction is used in 3D calculation) 
    14491449          
    1450          DO_2D_00_00 
     1450         DO_2D( 0, 0, 0, 0 ) 
    14511451            pu_RHSi(ji,jj) = pu_RHSi(ji,jj) + r1_hu(ji,jj,Kmm) * r1_2*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) * zu_i(ji,jj) 
    14521452            pv_RHSi(ji,jj) = pv_RHSi(ji,jj) + r1_hv(ji,jj,Kmm) * r1_2*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) * zv_i(ji,jj) 
     
    14601460         IF( ln_bt_fw ) THEN                ! FORWARD integration: use NOW top baroclinic velocity 
    14611461             
    1462             DO_2D_00_00 
     1462            DO_2D( 0, 0, 0, 0 ) 
    14631463               iktu = miku(ji,jj) 
    14641464               iktv = mikv(ji,jj) 
     
    14681468         ELSE                                ! CENTRED integration: use BEFORE top baroclinic velocity 
    14691469             
    1470             DO_2D_00_00 
     1470            DO_2D( 0, 0, 0, 0 ) 
    14711471               iktu = miku(ji,jj) 
    14721472               iktv = mikv(ji,jj) 
     
    14781478         !                    ! use "unclipped" top drag (even if explicit friction is used in 3D calculation) 
    14791479          
    1480          DO_2D_00_00 
     1480         DO_2D( 0, 0, 0, 0 ) 
    14811481            pu_RHSi(ji,jj) = pu_RHSi(ji,jj) + r1_hu(ji,jj,Kmm) * r1_2*( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) * zu_i(ji,jj) 
    14821482            pv_RHSi(ji,jj) = pv_RHSi(ji,jj) + r1_hv(ji,jj,Kmm) * r1_2*( rCdU_top(ji,jj+1)+rCdU_top(ji,jj) ) * zv_i(ji,jj) 
Note: See TracChangeset for help on using the changeset viewer.