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 3970 for branches/2013/dev_r3867_MERCATOR1_DYN/NEMOGCM/NEMO/OPA_SRC/BDY/bdydyn2d.F90 – NEMO

Ignore:
Timestamp:
2013-07-11T15:59:14+02:00 (11 years ago)
Author:
cbricaud
Message:

Time splitting update, see ticket #1079

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2013/dev_r3867_MERCATOR1_DYN/NEMOGCM/NEMO/OPA_SRC/BDY/bdydyn2d.F90

    r3680 r3970  
    66   !! History :  3.4  !  2011     (D. Storkey) new module as part of BDY rewrite 
    77   !!            3.5  !  2012     (S. Mocavero, I. Epicoco) Optimization of BDY communications 
     8   !!            3.5  !  2013-07  (J. Chanut) Compliant with time splitting changes 
    89   !!---------------------------------------------------------------------- 
    910#if defined key_bdy  
     
    2728 
    2829   PUBLIC   bdy_dyn2d     ! routine called in dynspg_ts and bdy_dyn 
     30   PUBLIC   bdy_ssh       ! routine called in dynspg_ts or sshwzv 
    2931 
    3032   !!---------------------------------------------------------------------- 
     
    135137      REAL(wp) ::   zcorr                            ! Flather correction 
    136138      REAL(wp) ::   zforc                            ! temporary scalar 
     139      REAL(wp) ::   zflag, z1_2                      !    "        " 
    137140      !!---------------------------------------------------------------------- 
    138141 
    139142      IF( nn_timing == 1 ) CALL timing_start('bdy_dyn2d_fla') 
     143 
     144      z1_2 = 0.5_wp 
    140145 
    141146      ! ---------------------------------! 
     
    164169         ! 
    165170         zcorr = - idx%flagu(jb) * SQRT( grav * phur(ii, ij) ) * ( pssh(iim1, ij) - spgu(iip1,ij) ) 
    166          zforc = dta%u2d(jb) 
    167          pu2d(ii,ij) = zforc + zcorr * umask(ii,ij,1)  
     171         ! bg jchanut tschanges: Set zflag to 0 below to revert to Flather scheme 
     172!!         zforc = dta%u2d(jb) 
     173         zflag = ABS(idx%flagu(jb)) 
     174         iim1 = ii + idx%flagu(jb) 
     175         zforc = dta%u2d(jb) * (1._wp - z1_2*zflag) + z1_2 * zflag * pu2d(iim1,ij) 
     176         pu2d(ii,ij) = zforc + (1._wp - z1_2*zflag) * zcorr * umask(ii,ij,1)  
     177         ! end jchanut tschanges 
    168178      END DO 
    169179      ! 
     
    177187         ! 
    178188         zcorr = - idx%flagv(jb) * SQRT( grav * phvr(ii, ij) ) * ( pssh(ii, ijm1) - spgu(ii,ijp1) ) 
    179          zforc = dta%v2d(jb) 
    180          pv2d(ii,ij) = zforc + zcorr * vmask(ii,ij,1) 
     189         ! bg jchanut tschanges: Set zflag to 0 below to revert to std Flather scheme 
     190!!         zforc = dta%v2d(jb) 
     191         zflag = ABS(idx%flagv(jb)) 
     192         ijm1 = ij + idx%flagv(jb) 
     193         zforc = dta%v2d(jb) * (1._wp - z1_2*zflag) + z1_2 * zflag * pv2d(ii,ijm1) 
     194         pv2d(ii,ij) = zforc + (1._wp - z1_2*zflag) * zcorr * vmask(ii,ij,1) 
     195         ! end jchanut tschanges 
    181196      END DO 
    182197      CALL lbc_bdy_lnk( pu2d, 'U', -1., ib_bdy )   ! Boundary points should be updated 
     
    186201      ! 
    187202   END SUBROUTINE bdy_dyn2d_fla 
     203 
     204   SUBROUTINE bdy_ssh( zssh ) 
     205      !!---------------------------------------------------------------------- 
     206      !!                  ***  SUBROUTINE bdy_ssh  *** 
     207      !! 
     208      !! ** Purpose : Duplicate sea level across open boundaries 
     209      !! 
     210      !!---------------------------------------------------------------------- 
     211      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) ::   zssh ! Sea level 
     212      !! 
     213      INTEGER  ::   ib_bdy, ib, igrd                        ! local integers 
     214      INTEGER  ::   ii, ij, zcoef, zcoef1, zcoef2, ip, jp   !   "       " 
     215 
     216      igrd = 1                       ! Everything is at T-points here 
     217 
     218      DO ib_bdy = 1, nb_bdy 
     219         DO ib = 1, idx_bdy(ib_bdy)%nblenrim(igrd) 
     220            ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
     221            ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
     222            ! Set gradient direction: 
     223            zcoef1 = bdytmask(ii-1,ij  ) +  bdytmask(ii+1,ij  ) 
     224            zcoef2 = bdytmask(ii  ,ij-1) +  bdytmask(ii  ,ij+1) 
     225            IF ( zcoef1+zcoef2 == 0 ) THEN 
     226               ! corner 
     227!               zcoef = tmask(ii-1,ij,1) + tmask(ii+1,ij,1) +  tmask(ii,ij-1,1) +  tmask(ii,ij+1,1) 
     228!               zssh(ii,ij) = zssh(ii-1,ij  ) * tmask(ii-1,ij  ,1) + & 
     229!                 &           zssh(ii+1,ij  ) * tmask(ii+1,ij  ,1) + & 
     230!                 &           zssh(ii  ,ij-1) * tmask(ii  ,ij-1,1) + & 
     231!                 &           zssh(ii  ,ij+1) * tmask(ii  ,ij+1,1) 
     232               zcoef = bdytmask(ii-1,ij) + bdytmask(ii+1,ij) +  bdytmask(ii,ij-1) +  bdytmask(ii,ij+1) 
     233               zssh(ii,ij) = zssh(ii-1,ij  ) * bdytmask(ii-1,ij  ) + & 
     234                 &           zssh(ii+1,ij  ) * bdytmask(ii+1,ij  ) + & 
     235                 &           zssh(ii  ,ij-1) * bdytmask(ii  ,ij-1) + & 
     236                 &           zssh(ii  ,ij+1) * bdytmask(ii  ,ij+1) 
     237               zssh(ii,ij) = ( zssh(ii,ij) / MAX( 1, zcoef) ) * tmask(ii,ij,1) 
     238            ELSE 
     239               ip = bdytmask(ii+1,ij  ) - bdytmask(ii-1,ij  ) 
     240               jp = bdytmask(ii  ,ij+1) - bdytmask(ii  ,ij-1) 
     241               zssh(ii,ij) = zssh(ii+ip,ij+jp) * tmask(ii+ip,ij+jp,1) 
     242            ENDIF 
     243         END DO 
     244 
     245         ! Boundary points should be updated 
     246         CALL lbc_bdy_lnk( zssh(:,:), 'T', 1., ib_bdy ) 
     247      END DO 
     248 
     249   END SUBROUTINE bdy_ssh 
    188250#else 
    189251   !!---------------------------------------------------------------------- 
     
    192254CONTAINS 
    193255   SUBROUTINE bdy_dyn2d( kt )      ! Empty routine 
    194       WRITE(*,*) 'bdy_dyn_frs: You should not have seen this print! error?', kt 
     256      INTEGER, intent(in) :: kt 
     257      WRITE(*,*) 'bdy_dyn2: You should not have seen this print! error?', kt 
    195258   END SUBROUTINE bdy_dyn2d 
     259 
    196260#endif 
    197261 
    198262   !!====================================================================== 
    199263END MODULE bdydyn2d 
     264 
Note: See TracChangeset for help on using the changeset viewer.