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

Ignore:
Timestamp:
2019-05-23T18:36:06+02:00 (5 years ago)
Author:
girrmann
Message:

dev_r10984_HPC-13 : Step 1, boundary is now detected all over the local domain, this does not change the result. Improve bdy treatment for bdy_rnf in bdytra.F90, this changes the result when keyword runoff is specified in namelist

File:
1 edited

Legend:

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

    r11044 r11048  
    3737   INTEGER, PARAMETER ::   jp_nseg = 100   !  
    3838   INTEGER, PARAMETER ::   nrimmax =  20   ! maximum rimwidth in structured 
     39   INTEGER  :: nde = 1 ! domain extended in the halo to deal with bondaries  
    3940                                               ! open boundary data files 
    4041   ! Straight open boundary segment parameters: 
     
    144145      INTEGER :: iw_b(4), ie_b(4), is_b(4), in_b(4)                ! Arrays for neighbours coordinates 
    145146      REAL(wp), TARGET, DIMENSION(jpi,jpj) ::   zfmask  ! temporary fmask array excluding coastal boundary condition (shlat) 
     147      REAL(wp)        , DIMENSION(jpi,jpj) ::   ztmp 
    146148      LOGICAL  ::   llnobdy, llsobdy, lleabdy, llwebdy     ! local logicals 
    147149      !! 
     
    798800!      is = mjg(1) + 1            ! if monotasking and no zoom, is=2 
    799801!      in = mjg(1) + nlcj-1 - 1   ! if monotasking and no zoom, in=jpjm1       
    800       iwe = mig(1) - 1 + 2         ! if monotasking and no zoom, iw=2 
    801       ies = mig(1) + nlci-1 - 1 ! if monotasking and no zoom, ie=jpim1 
    802       iso = mjg(1) - 1 + 2         ! if monotasking and no zoom, is=2 
    803       ino = mjg(1) + nlcj-1 - 1 ! if monotasking and no zoom, in=jpjm1 
     802      iwe = mig(1) - 1 + 2 - nde       ! if monotasking and no zoom, iw=2 
     803      ies = mig(1) + nlci-1 - 1 + nde ! if monotasking and no zoom, ie=jpim1 
     804      iso = mjg(1) - 1 + 2 -nde        ! if monotasking and no zoom, is=2 
     805      ino = mjg(1) + nlcj-1 - 1 + nde ! if monotasking and no zoom, in=jpjm1 
    804806 
    805807      ALLOCATE( nbondi_bdy(nb_bdy)) 
     
    11731175      CALL lbc_lnk_multi( 'bdyini', bdyumask, 'U', 1. , bdyvmask, 'V', 1., bdytmask, 'T', 1. ) 
    11741176      DO ib_bdy = 1, nb_bdy       ! Indices and directions of rim velocity components 
    1175  
    1176          idx_bdy(ib_bdy)%flagu(:,:) = 0._wp 
    1177          idx_bdy(ib_bdy)%flagv(:,:) = 0._wp 
    11781177         icount = 0  
    11791178 
     
    11901189            END SELECT  
    11911190            icount = 0 
     1191            ztmp(:,:) = 0._wp 
    11921192            DO ib = 1, idx_bdy(ib_bdy)%nblenrim(igrd)   
    1193                nbi => idx_bdy(ib_bdy)%nbi(ib,igrd) 
    1194                nbj => idx_bdy(ib_bdy)%nbj(ib,igrd) 
    1195                zefl = pmask(nbi+i_offset-1,nbj) 
    1196                zwfl = pmask(nbi+i_offset,nbj) 
     1193               ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
     1194               ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
     1195               IF( ii == 1 .OR. ii == jpi .OR. ij == 1 .OR. ij == jpj )  CYCLE 
     1196               zefl = pmask(ii+i_offset-1,ij) 
     1197               zwfl = pmask(ii+i_offset  ,ij) 
    11971198               ! This error check only works if you are using the bdyXmask arrays 
    1198                IF( i_offset == 1 .and. zefl + zwfl == 2 ) THEN 
     1199               IF( i_offset == 1 .and. zefl + zwfl == 2. ) THEN 
    11991200                  icount = icount + 1 
    1200                   IF(lwp) WRITE(numout,*) 'Problem with igrd = ',igrd,' at (global) nbi, nbj : ',mig(nbi),mjg(nbj) 
     1201                  IF(lwp) WRITE(numout,*) 'Problem with igrd = ',igrd,' at (global) nbi, nbj : ',mig(ii),mjg(ij) 
    12011202               ELSE 
    1202                   idx_bdy(ib_bdy)%flagu(ib,igrd) = -zefl + zwfl 
     1203                  ztmp(ii,ij) = -zefl + zwfl 
    12031204               ENDIF 
    12041205            END DO 
     
    12091210               CALL ctl_stop( ' ', ctmp1, ctmp2, ' ' ) 
    12101211            ENDIF  
     1212            CALL lbc_lnk( 'bdyini', ztmp, 'T', 1. )  
     1213            DO ib = 1, idx_bdy(ib_bdy)%nblenrim(igrd)   
     1214               ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
     1215               ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
     1216               idx_bdy(ib_bdy)%flagu(ib,igrd) = ztmp(ii,ij) 
     1217            END DO 
    12111218         END DO 
    12121219 
     
    12231230            END SELECT  
    12241231            icount = 0 
     1232            ztmp(:,:) = 0._wp 
    12251233            DO ib = 1, idx_bdy(ib_bdy)%nblenrim(igrd)   
    1226                nbi => idx_bdy(ib_bdy)%nbi(ib,igrd) 
    1227                nbj => idx_bdy(ib_bdy)%nbj(ib,igrd) 
    1228                znfl = pmask(nbi,nbj+j_offset-1) 
    1229                zsfl = pmask(nbi,nbj+j_offset  ) 
     1234               ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
     1235               ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
     1236               IF( ii == 1 .OR. ii == jpi .OR. ij == 1 .OR. ij == jpj )  CYCLE 
     1237               znfl = pmask(ii,ij+j_offset-1) 
     1238               zsfl = pmask(ii,ij+j_offset  ) 
    12301239               ! This error check only works if you are using the bdyXmask arrays 
    1231                IF( j_offset == 1 .and. znfl + zsfl == 2 ) THEN 
    1232                   IF(lwp) WRITE(numout,*) 'Problem with igrd = ',igrd,' at (global) nbi, nbj : ',mig(nbi),mjg(nbj) 
     1240               IF( j_offset == 1 .and. znfl + zsfl == 2. ) THEN 
     1241                  IF(lwp) WRITE(numout,*) 'Problem with igrd = ',igrd,' at (global) nbi, nbj : ',mig(ii),mjg(ij) 
    12331242                  icount = icount + 1 
    12341243               ELSE 
    1235                   idx_bdy(ib_bdy)%flagv(ib,igrd) = -znfl + zsfl 
     1244                  ztmp(ii,ij) = -znfl + zsfl 
    12361245               END IF 
    12371246            END DO 
     
    12411250               WRITE(ctmp2,*) ' ========== ' 
    12421251               CALL ctl_stop( ' ', ctmp1, ctmp2, ' ' ) 
    1243             ENDIF  
     1252            ENDIF 
     1253            CALL lbc_lnk( 'bdyini', ztmp, 'T', 1. )  
     1254            DO ib = 1, idx_bdy(ib_bdy)%nblenrim(igrd)   
     1255               ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
     1256               ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
     1257               idx_bdy(ib_bdy)%flagv(ib,igrd) = ztmp(ii,ij) 
     1258            END DO 
    12441259         END DO 
    12451260         ! 
     
    12571272               CASE( 3 )   ;   pmask => bdyvmask  
    12581273            END SELECT 
     1274            ztmp(:,:) = 0._wp 
    12591275            DO ib = 1, idx_bdy(ib_bdy)%nblenrim(igrd) 
    1260                ii        =  idx_bdy(ib_bdy)%nbi(ib,igrd) 
    1261                ij        =  idx_bdy(ib_bdy)%nbj(ib,igrd) 
     1276               ii =  idx_bdy(ib_bdy)%nbi(ib,igrd) 
     1277               ij =  idx_bdy(ib_bdy)%nbj(ib,igrd) 
     1278               IF( ii == 1 .OR. ii == jpi .OR. ij == 1 .OR. ij == jpj )   CYCLE 
    12621279               llnobdy = pmask(ii  ,ij+1) == 1.   
    12631280               llsobdy = pmask(ii  ,ij-1) == 1.  
     
    12681285                  !               !              !     _____     !     _____      
    12691286                  !  1 |   o      !  2  o   |    !  3 | x        !  4     x |     
    1270                   !    |_x_ _     !    _ _x_|    !    |   o      !      o   |     
    1271                   IF( pmask(ii+1,ij+1) == 1. )   idx_bdy(ib_bdy)%ntreat(ib,igrd) = 1 
    1272                   IF( pmask(ii-1,ij+1) == 1. )   idx_bdy(ib_bdy)%ntreat(ib,igrd) = 2 
    1273                   IF( pmask(ii+1,ij-1) == 1. )   idx_bdy(ib_bdy)%ntreat(ib,igrd) = 3 
    1274                   IF( pmask(ii-1,ij-1) == 1. )   idx_bdy(ib_bdy)%ntreat(ib,igrd) = 4 
     1287                  !    |_x_ _     !    _ _x_|    !    |   o      !      o   | 
     1288                  IF( pmask(ii+1,ij+1) == 1. )   ztmp(ii,ij) = 1 
     1289                  IF( pmask(ii-1,ij+1) == 1. )   ztmp(ii,ij) = 2 
     1290                  IF( pmask(ii+1,ij-1) == 1. )   ztmp(ii,ij) = 3 
     1291                  IF( pmask(ii-1,ij-1) == 1. )   ztmp(ii,ij) = 4 
    12751292               END IF 
    12761293               IF( inbdy == 1 )   THEN   ! middle of linear bdy 
    1277                   idx_bdy(ib_bdy)%ntreat(ib,igrd) = 0   ! regular treatment with flags 
     1294                  ztmp(ii,ij) = 0   ! regular treatment with flags 
    12781295               END IF 
    12791296               IF( inbdy == 2 )   THEN   ! exterior of a corner 
     
    12811298                  !  5 ____x o    !  6   o x___   ! 7      x o      !  8   o x       
    12821299                  !         |     !       |       !        o        !        o  
    1283                   IF( llnobdy .AND. lleabdy )   idx_bdy(ib_bdy)%ntreat(ib,igrd) = 5 
    1284                   IF( llnobdy .AND. llwebdy )   idx_bdy(ib_bdy)%ntreat(ib,igrd) = 6 
    1285                   IF( llsobdy .AND. lleabdy )   idx_bdy(ib_bdy)%ntreat(ib,igrd) = 7 
    1286                   IF( llsobdy .AND. llwebdy )   idx_bdy(ib_bdy)%ntreat(ib,igrd) = 8 
     1300                  IF( llnobdy .AND. lleabdy )   ztmp(ii,ij) = 5 
     1301                  IF( llnobdy .AND. llwebdy )   ztmp(ii,ij) = 6 
     1302                  IF( llsobdy .AND. lleabdy )   ztmp(ii,ij) = 7 
     1303                  IF( llsobdy .AND. llwebdy )   ztmp(ii,ij) = 8 
    12871304               END IF 
    12881305               IF( inbdy == 3 )   THEN   ! 3 neighbours __   __ 
     
    12901307                  !  9  _| x o    ! 10   o x |_   ! 11   o x o    ! 12  o x o        
    12911308                  !    |   o      !        o   |  !        o      !    __|¨|__     
    1292                   IF( llnobdy .AND. lleabdy .AND. llsobdy )   idx_bdy(ib_bdy)%ntreat(ib,igrd) = 9 
    1293                   IF( llnobdy .AND. llwebdy .AND. llsobdy )   idx_bdy(ib_bdy)%ntreat(ib,igrd) = 10 
    1294                   IF( llwebdy .AND. llsobdy .AND. lleabdy )   idx_bdy(ib_bdy)%ntreat(ib,igrd) = 11 
    1295                   IF( llwebdy .AND. llnobdy .AND. lleabdy )   idx_bdy(ib_bdy)%ntreat(ib,igrd) = 12 
     1309                  IF( llnobdy .AND. lleabdy .AND. llsobdy )   ztmp(ii,ij) = 9 
     1310                  IF( llnobdy .AND. llwebdy .AND. llsobdy )   ztmp(ii,ij) = 10 
     1311                  IF( llwebdy .AND. llsobdy .AND. lleabdy )   ztmp(ii,ij) = 11 
     1312                  IF( llwebdy .AND. llnobdy .AND. lleabdy )   ztmp(ii,ij) = 12 
    12961313               END IF 
    12971314               IF( inbdy == 4 )   THEN 
     
    13011318                  CALL ctl_stop( ' ', ctmp1, ctmp2, ' ' ) 
    13021319               END IF 
     1320            END DO 
     1321            CALL lbc_lnk( 'bdyini', ztmp, 'T', 1. ) 
     1322            DO ib = 1, idx_bdy(ib_bdy)%nblenrim(igrd)   
     1323               ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
     1324               ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
     1325               idx_bdy(ib_bdy)%ntreat(ib,igrd) = ztmp(ii,ij) 
    13031326            END DO 
    13041327         END DO 
Note: See TracChangeset for help on using the changeset viewer.