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 11024 for NEMO/branches/2019/dev_r10984_HPC-13_IRRMANN_BDY_optimization/src/OCE/BDY/bdylib.F90 – NEMO

Ignore:
Timestamp:
2019-05-21T16:07:24+02:00 (5 years ago)
Author:
girrmann
Message:

dev_r10984_HPC-13 : imrpove bdy treatment ssh and neumann, see #2285

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2019/dev_r10984_HPC-13_IRRMANN_BDY_optimization/src/OCE/BDY/bdylib.F90

    r10529 r11024  
    436436      !!---------------------------------------------------------------------- 
    437437      INTEGER,                    INTENT(in)     ::   igrd     ! grid index 
    438       REAL(wp), DIMENSION(:,:,:), INTENT(inout)  ::   phia     ! model after 3D field (to be updated) 
     438      REAL(wp), DIMENSION(:,:,:), INTENT(inout)  ::   phia     ! model after 3D field (to be updated), must be masked 
    439439      TYPE(OBC_INDEX), INTENT(in) ::   idx  ! OBC indices 
    440440      !!  
    441       REAL(wp) ::   zcoef, zcoef1, zcoef2 
    442       REAL(wp), POINTER, DIMENSION(:,:,:)        :: pmask      ! land/sea mask for field 
     441      REAL(wp) ::   zweight 
     442      REAL(wp), POINTER, DIMENSION(:,:,:)      :: pmask         ! land/sea mask for field 
    443443      REAL(wp), POINTER, DIMENSION(:,:)        :: bdypmask      ! land/sea mask for field 
    444444      INTEGER  ::   ib, ik   ! dummy loop indices 
    445       INTEGER  ::   ii, ij, ip, jp   ! 2D addresses 
     445      INTEGER  ::   ii, ij   ! 2D addresses 
     446      INTEGER  ::   flagu, flagv                        ! short cuts 
     447      INTEGER  ::   ii1, ii2, ii3, ij1, ij2, ij3 
    446448      !!---------------------------------------------------------------------- 
    447449      ! 
    448450      SELECT CASE(igrd) 
    449          CASE(1) 
    450             pmask => tmask(:,:,:) 
    451             bdypmask => bdytmask(:,:) 
    452          CASE(2) 
    453             pmask => umask(:,:,:) 
    454             bdypmask => bdyumask(:,:) 
    455          CASE(3) 
    456             pmask => vmask(:,:,:) 
    457             bdypmask => bdyvmask(:,:) 
     451         CASE(1)   ;   pmask => tmask(:,:,:) 
     452         CASE(2)   ;   pmask => umask(:,:,:) 
     453         CASE(3)   ;   pmask => vmask(:,:,:) 
    458454         CASE DEFAULT ;   CALL ctl_stop( 'unrecognised value for igrd in bdy_nmn' ) 
    459455      END SELECT 
     456      ! 
    460457      DO ib = 1, idx%nblenrim(igrd) 
    461458         ii = idx%nbi(ib,igrd) 
    462459         ij = idx%nbj(ib,igrd) 
    463          DO ik = 1, jpkm1 
    464             ! search the sense of the gradient 
    465             zcoef1 = bdypmask(ii-1,ij  )*pmask(ii-1,ij,ik) +  bdypmask(ii+1,ij  )*pmask(ii+1,ij,ik) 
    466             zcoef2 = bdypmask(ii  ,ij-1)*pmask(ii,ij-1,ik) +  bdypmask(ii  ,ij+1)*pmask(ii,ij+1,ik) 
    467             IF ( nint(zcoef1+zcoef2) == 0) THEN 
    468                ! corner **** we probably only want to set the tangentail component for the dynamics here 
    469                zcoef = pmask(ii-1,ij,ik) + pmask(ii+1,ij,ik) +  pmask(ii,ij-1,ik) +  pmask(ii,ij+1,ik) 
    470                IF (zcoef > .5_wp) THEN ! Only set none isolated points. 
    471                  phia(ii,ij,ik) = phia(ii-1,ij  ,ik) * pmask(ii-1,ij  ,ik) + & 
    472                    &              phia(ii+1,ij  ,ik) * pmask(ii+1,ij  ,ik) + & 
    473                    &              phia(ii  ,ij-1,ik) * pmask(ii  ,ij-1,ik) + & 
    474                    &              phia(ii  ,ij+1,ik) * pmask(ii  ,ij+1,ik) 
    475                  phia(ii,ij,ik) = ( phia(ii,ij,ik) / zcoef ) * pmask(ii,ij,ik) 
    476                ELSE 
    477                  phia(ii,ij,ik) = phia(ii,ij  ,ik) * pmask(ii,ij  ,ik) 
    478                ENDIF 
    479             ELSEIF ( nint(zcoef1+zcoef2) == 2) THEN 
    480                ! oblique corner **** we probably only want to set the normal component for the dynamics here 
    481                zcoef = pmask(ii-1,ij,ik)*bdypmask(ii-1,ij  ) + pmask(ii+1,ij,ik)*bdypmask(ii+1,ij  ) + & 
    482                    &   pmask(ii,ij-1,ik)*bdypmask(ii,ij -1 ) +  pmask(ii,ij+1,ik)*bdypmask(ii,ij+1  ) 
    483                phia(ii,ij,ik) = phia(ii-1,ij  ,ik) * pmask(ii-1,ij  ,ik)*bdypmask(ii-1,ij  ) + & 
    484                    &            phia(ii+1,ij  ,ik) * pmask(ii+1,ij  ,ik)*bdypmask(ii+1,ij  )  + & 
    485                    &            phia(ii  ,ij-1,ik) * pmask(ii  ,ij-1,ik)*bdypmask(ii,ij -1 ) + & 
    486                    &            phia(ii  ,ij+1,ik) * pmask(ii  ,ij+1,ik)*bdypmask(ii,ij+1  ) 
    487   
    488                phia(ii,ij,ik) = ( phia(ii,ij,ik) / MAX(1._wp, zcoef) ) * pmask(ii,ij,ik) 
    489             ELSE 
    490                ip = nint(bdypmask(ii+1,ij  )*pmask(ii+1,ij,ik) - bdypmask(ii-1,ij  )*pmask(ii-1,ij,ik)) 
    491                jp = nint(bdypmask(ii  ,ij+1)*pmask(ii,ij+1,ik) - bdypmask(ii  ,ij-1)*pmask(ii,ij-1,ik)) 
    492                phia(ii,ij,ik) = phia(ii+ip,ij+jp,ik) * pmask(ii+ip,ij+jp,ik) 
    493             ENDIF 
    494          END DO 
     460         SELECT CASE( idx%ntreat(ib,igrd) )   ! select free ocean neighbours 
     461            !               !              !     _____     !     _____      
     462            !  1 |   o      !  2  o   |    !  3 | x        !  4     x |     
     463            !    |_x_ _     !    _ _x_|    !    |   o      !      o   | 
     464            CASE( 1 )   ;   ii1 = ii+1   ;   ij1 = ij+1 
     465            CASE( 2 )   ;   ii1 = ii-1   ;   ij1 = ij+1 
     466            CASE( 3 )   ;   ii1 = ii+1   ;   ij1 = ij-1 
     467            CASE( 4 )   ;   ii1 = ii-1   ;   ij1 = ij-1 
     468            !    |_  o      !        o  _|  !     ¨¨|_|¨¨   !       o          
     469            !  5  _| x o    !  6   o x |_   !  7   o x o    ! 8   o x o        
     470            !    |   o      !        o   |  !        o      !    __|¨|__  
     471            CASE( 5 )   ;   ii1 = ii     ;   ij1 = ij+1   ;   ii2 = ii+1   ;   ij2 = ij     ;   ii3 = ii     ;   ij3 = ij-1    
     472            CASE( 6 )   ;   ii1 = ii     ;   ij1 = ij+1   ;   ii2 = ii-1   ;   ij2 = ij     ;   ii3 = ii     ;   ij3 = ij-1  
     473            CASE( 7 )   ;   ii1 = ii-1   ;   ij1 = ij     ;   ii2 = ii     ;   ij2 = ij-1   ;   ii3 = ii+1   ;   ij3 = ij    
     474            CASE( 8 )   ;   ii1 = ii-1   ;   ij1 = ij     ;   ii2 = ii     ;   ij2 = ij+1   ;   ii3 = ii+1   ;   ij3 = ij   
     475            CASE DEFAULT 
     476         END SELECT 
     477         ! 
     478         SELECT CASE( idx%ntreat(ib,igrd) )          
     479            CASE( 0 ) 
     480               flagu = NINT( idx%flagu(ib,igrd) ) 
     481               flagv = NINT( idx%flagv(ib,igrd) ) 
     482               IF( flagu == 0 .OR. flagv == 0 )   THEN     ! linear bdy   o 
     483                   DO ik = 1, jpkm1                        !           ___x___  
     484                      IF( pmask(ii+flagu,ij+flagv,ik) /= 0. )   phia(ii,ij,ik) = phia(ii+flagu,ij+flagv,ik)   
     485                   END DO 
     486               ELSE                           
     487                  DO ik = 1, jpkm1                                              !   ___  o 
     488                     zweight = pmask(ii+flagu,ij,ik) + pmask(ii,ij+flagv,ik)    !      | x o 
     489                     IF( zweight /= 0. )   phia(ii,ij,ik) = ( phia(ii+flagu,ij,ik) + phia(ii,ij+flagv,ik) ) / zweight 
     490                  END DO 
     491               END IF 
     492            CASE( 1:4 ) 
     493                   DO ik = 1, jpkm1 
     494                      IF( pmask(ii1,ij1,ik) /= 0. )   phia(ii,ij,ik) = phia(ii1,ij1,ik)   
     495                   END DO     
     496            CASE( 5:8 ) 
     497               DO ik = 1, jpkm1 
     498                  zweight        =  pmask(ii1,ij1,ik) + pmask(ii2,ij2,ik) + pmask(ii3,ij3,ik) 
     499                  IF( zweight /= 0. )   phia(ii,ij,ik) = ( phia(ii1,ij1,ik) + phia (ii2,ij2,ik) + phia (ii3,ij3,ik) ) / zweight 
     500               END DO 
     501         END SELECT 
    495502      END DO 
    496503      ! 
Note: See TracChangeset for help on using the changeset viewer.