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 7904 for branches/2017/dev_r7881_HPC09_ZDF/NEMOGCM/NEMO/OPA_SRC/LBC/lbcnfd.F90 – NEMO

Ignore:
Timestamp:
2017-04-13T09:10:07+02:00 (7 years ago)
Author:
gm
Message:

#1880 (HPC-09): phase with branch dev_r7832_HPC08_lbclnk_3rd_dim

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2017/dev_r7881_HPC09_ZDF/NEMOGCM/NEMO/OPA_SRC/LBC/lbcnfd.F90

    r7646 r7904  
    55   !!====================================================================== 
    66   !! History :  3.2  ! 2009-03  (R. Benshila)  Original code  
    7    !!            3.5  ! 2013-07 (I. Epicoco, S. Mocavero - CMCC) MPP optimization  
     7   !!            3.5  ! 2013-07  (I. Epicoco, S. Mocavero - CMCC) MPP optimization 
     8   !!            4.0  ! 2017-04  (G. Madec) automatique allocation of array argument (use any 3rd dimension) 
    89   !!---------------------------------------------------------------------- 
    910 
     
    1213   !!   lbc_nfd_3d    : lateral boundary condition: North fold treatment for a 3D arrays   (lbc_nfd) 
    1314   !!   lbc_nfd_2d    : lateral boundary condition: North fold treatment for a 2D arrays   (lbc_nfd) 
    14    !!   mpp_lbc_nfd_3d    : North fold treatment for a 3D arrays optimized for MPP 
    15    !!   mpp_lbc_nfd_2d    : North fold treatment for a 2D arrays optimized for MPP 
     15   !!   mpp_lbc_nfd_3d: North fold treatment for a 3D arrays optimized for MPP 
     16   !!   mpp_lbc_nfd_2d: North fold treatment for a 2D arrays optimized for MPP 
    1617   !!---------------------------------------------------------------------- 
    1718   USE dom_oce        ! ocean space and time domain  
     
    5455      !! ** Action  :   pt3d with updated values along the north fold 
    5556      !!---------------------------------------------------------------------- 
    56       CHARACTER(len=1)          , INTENT(in   ) ::   cd_type   ! define the nature of ptab array grid-points 
    57       !                                                        !   = T , U , V , F , W points 
    58       REAL(wp)                  , INTENT(in   ) ::   psgn      ! control of the sign change 
    59       !                                                        !   = -1. , the sign is changed if north fold boundary 
    60       !                                                        !   =  1. , the sign is kept  if north fold boundary 
    6157      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   pt3d      ! 3D array on which the boundary condition is applied 
     58      CHARACTER(len=1)          , INTENT(in   ) ::   cd_type   ! nature of pt3d grid-point 
     59      REAL(wp)                  , INTENT(in   ) ::   psgn      ! sign used across north fold 
    6260      ! 
    6361      INTEGER  ::   ji, jk 
    6462      INTEGER  ::   ijt, iju, ijpj, ijpjm1 
    6563      !!---------------------------------------------------------------------- 
    66  
     64      ! 
    6765      SELECT CASE ( jpni ) 
    6866      CASE ( 1 )     ;   ijpj = nlcj      ! 1 proc only  along the i-direction 
     
    7169      ijpjm1 = ijpj-1 
    7270 
    73       DO jk = 1, jpk 
     71      DO jk = 1, SIZE( pt3d, 3 ) 
    7472         ! 
    7573         SELECT CASE ( npolj ) 
     
    155153            SELECT CASE ( cd_type) 
    156154            CASE ( 'T' , 'U' , 'V' , 'W' )             ! T-, U-, V-, W-points 
    157                pt3d(:, 1  ,jk) = 0.e0 
    158                pt3d(:,ijpj,jk) = 0.e0 
     155               pt3d(:, 1  ,jk) = 0._wp 
     156               pt3d(:,ijpj,jk) = 0._wp 
    159157            CASE ( 'F' )                               ! F-point 
    160                pt3d(:,ijpj,jk) = 0.e0 
     158               pt3d(:,ijpj,jk) = 0._wp 
    161159            END SELECT 
    162160            ! 
     
    179177      !! ** Action  :   pt2d with updated values along the north fold 
    180178      !!---------------------------------------------------------------------- 
    181       CHARACTER(len=1)        , INTENT(in   ) ::   cd_type   ! define the nature of ptab array grid-points 
    182       !                                                      ! = T , U , V , F , W points 
    183       REAL(wp)                , INTENT(in   ) ::   psgn      ! control of the sign change 
    184       !                                                      !   = -1. , the sign is changed if north fold boundary 
    185       !                                                      !   =  1. , the sign is kept  if north fold boundary 
    186179      REAL(wp), DIMENSION(:,:), INTENT(inout) ::   pt2d      ! 2D array on which the boundary condition is applied 
     180      CHARACTER(len=1)        , INTENT(in   ) ::   cd_type   ! nature of pt2d grid-point 
     181      REAL(wp)                , INTENT(in   ) ::   psgn      ! sign used across north fold 
    187182      INTEGER , OPTIONAL      , INTENT(in   ) ::   pr2dj     ! number of additional halos 
    188183      ! 
     
    265260               END DO 
    266261            END DO 
    267          CASE ( 'J' )                                     ! first ice U-V point 
    268             DO jl =0, ipr2dj 
    269                pt2d(2,ijpj+jl) = psgn * pt2d(3,ijpj-1+jl) 
    270                DO ji = 3, jpiglo 
    271                   iju = jpiglo - ji + 3 
    272                   pt2d(ji,ijpj+jl) = psgn * pt2d(iju,ijpj-1-jl) 
    273                END DO 
    274             END DO 
    275          CASE ( 'K' )                                     ! second ice U-V point 
    276             DO jl =0, ipr2dj 
    277                pt2d(2,ijpj+jl) = psgn * pt2d(3,ijpj-1+jl) 
    278                DO ji = 3, jpiglo 
    279                   iju = jpiglo - ji + 3 
    280                   pt2d(ji,ijpj+jl) = psgn * pt2d(iju,ijpj-1-jl) 
    281                END DO 
    282             END DO 
    283262         END SELECT 
    284263         ! 
     
    325304            END DO 
    326305         CASE ( 'I' )                                  ! ice U-V point (I-point) 
    327             pt2d( 2 ,ijpj:ijpj+ipr2dj) = 0.e0 
     306            pt2d( 2 ,ijpj:ijpj+ipr2dj) = 0._wp 
    328307            DO jl = 0, ipr2dj 
    329308               DO ji = 2 , jpiglo-1 
     
    332311               END DO 
    333312            END DO 
    334          CASE ( 'J' )                                  ! first ice U-V point 
    335             pt2d( 2 ,ijpj:ijpj+ipr2dj) = 0.e0 
    336             DO jl = 0, ipr2dj 
    337                DO ji = 2 , jpiglo-1 
    338                   ijt = jpiglo - ji + 2 
    339                   pt2d(ji,ijpj+jl)= pt2d(ji,ijpj-1-jl) 
    340                END DO 
    341             END DO 
    342          CASE ( 'K' )                                  ! second ice U-V point 
    343             pt2d( 2 ,ijpj:ijpj+ipr2dj) = 0.e0 
    344             DO jl = 0, ipr2dj 
    345                DO ji = 2 , jpiglo-1 
    346                   ijt = jpiglo - ji + 2 
    347                   pt2d(ji,ijpj+jl)= pt2d(ijt,ijpj-1-jl) 
    348                END DO 
    349             END DO 
    350313         END SELECT 
    351314         ! 
     
    354317         SELECT CASE ( cd_type) 
    355318         CASE ( 'T' , 'U' , 'V' , 'W' )                 ! T-, U-, V-, W-points 
    356             pt2d(:, 1:1-ipr2dj     ) = 0.e0 
    357             pt2d(:,ijpj:ijpj+ipr2dj) = 0.e0 
     319            pt2d(:, 1:1-ipr2dj     ) = 0._wp 
     320            pt2d(:,ijpj:ijpj+ipr2dj) = 0._wp 
    358321         CASE ( 'F' )                                   ! F-point 
    359             pt2d(:,ijpj:ijpj+ipr2dj) = 0.e0 
     322            pt2d(:,ijpj:ijpj+ipr2dj) = 0._wp 
    360323         CASE ( 'I' )                                   ! ice U-V point 
    361             pt2d(:, 1:1-ipr2dj     ) = 0.e0 
    362             pt2d(:,ijpj:ijpj+ipr2dj) = 0.e0 
    363          CASE ( 'J' )                                   ! first ice U-V point 
    364             pt2d(:, 1:1-ipr2dj     ) = 0.e0 
    365             pt2d(:,ijpj:ijpj+ipr2dj) = 0.e0 
    366          CASE ( 'K' )                                   ! second ice U-V point 
    367             pt2d(:, 1:1-ipr2dj     ) = 0.e0 
    368             pt2d(:,ijpj:ijpj+ipr2dj) = 0.e0 
     324            pt2d(:, 1:1-ipr2dj     ) = 0._wp 
     325            pt2d(:,ijpj:ijpj+ipr2dj) = 0._wp 
    369326         END SELECT 
    370327         ! 
     
    385342      !! ** Action  :   pt3d with updated values along the north fold 
    386343      !!---------------------------------------------------------------------- 
    387       CHARACTER(len=1)          , INTENT(in   ) ::   cd_type   ! define the nature of ptab array grid-points 
    388       !                                                        !   = T , U , V , F , W points 
    389       REAL(wp)                  , INTENT(in   ) ::   psgn      ! control of the sign change 
    390       !                                                        !   = -1. , the sign is changed if north fold boundary 
    391       !                                                        !   =  1. , the sign is kept    if north fold boundary 
    392344      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   pt3dl     ! 3D array on which the boundary condition is applied 
    393345      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   pt3dr     ! 3D array on which the boundary condition is applied 
    394       ! 
    395       INTEGER  ::   ji, jk 
     346      CHARACTER(len=1)          , INTENT(in   ) ::   cd_type   ! nature of pt3d(l/r) grid-point 
     347      REAL(wp)                  , INTENT(in   ) ::   psgn      ! sign used across north fold 
     348      ! 
     349      INTEGER  ::   ji, jk      ! dummy loop indices 
     350      INTEGER  ::   ipk         ! 3rd dimension of the input array 
    396351      INTEGER  ::   ijt, iju, ijpj, ijpjm1, ijta, ijua, jia, startloop, endloop 
    397352      !!---------------------------------------------------------------------- 
     353      ! 
     354      ipk = SIZE( pt3dl, 3 ) 
    398355      ! 
    399356      SELECT CASE ( jpni ) 
     
    402359      END SELECT 
    403360      ijpjm1 = ijpj-1 
    404  
    405          ! 
    406          SELECT CASE ( npolj ) 
    407          ! 
    408          CASE ( 3 , 4 )                        ! *  North fold  T-point pivot 
    409             ! 
    410             SELECT CASE ( cd_type ) 
     361      ! 
     362      ! 
     363      SELECT CASE ( npolj ) 
     364      ! 
     365      CASE ( 3 , 4 )                        ! *  North fold  T-point pivot 
     366         ! 
     367         SELECT CASE ( cd_type ) 
    411368            CASE ( 'T' , 'W' )                         ! T-, W-point 
    412                IF (nimpp .ne. 1) THEN 
    413                  startloop = 1 
    414                ELSE 
    415                  startloop = 2 
    416                ENDIF 
    417  
    418                DO jk = 1, jpk 
     369               IF ( nimpp /= 1 ) THEN   ;   startloop = 1 
     370               ELSE                     ;   startloop = 2 
     371               ENDIF 
     372               ! 
     373               DO jk = 1, ipk 
    419374                  DO ji = startloop, nlci 
    420375                     ijt = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 4 
     
    426381               END DO 
    427382 
    428                IF(nimpp .ge. (jpiglo/2+1)) THEN 
     383               IF( nimpp >= jpiglo/2+1 ) THEN 
    429384                 startloop = 1 
    430                ELSEIF(((nimpp+nlci-1) .ge. (jpiglo/2+1)) .AND. (nimpp .lt. (jpiglo/2+1))) THEN 
     385               ELSEIF( nimpp+nlci-1 >= jpiglo/2+1 .AND. nimpp < jpiglo/2+1 ) THEN 
    431386                 startloop = jpiglo/2+1 - nimpp + 1 
    432387               ELSE 
    433388                 startloop = nlci + 1 
    434389               ENDIF 
    435                IF(startloop .le. nlci) THEN 
    436                  DO jk = 1, jpk 
     390               IF(startloop <= nlci) THEN 
     391                 DO jk = 1, ipk 
    437392                    DO ji = startloop, nlci 
    438393                       ijt = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 4 
    439394                       jia = ji + nimpp - 1 
    440395                       ijta = jpiglo - jia + 2 
    441                        IF((ijta .ge. (startloop + nimpp - 1)) .and. (ijta .lt. jia)) THEN 
     396                       IF( ijta >= startloop+nimpp-1 .AND. ijta < jia ) THEN 
    442397                          pt3dl(ji,ijpjm1,jk) = psgn * pt3dl(ijta-nimpp+1,ijpjm1,jk) 
    443398                       ELSE 
     
    447402                 END DO 
    448403               ENDIF 
    449  
    450  
     404               ! 
    451405            CASE ( 'U' )                               ! U-point 
    452                IF ((nimpp + nlci - 1) .ne. jpiglo) THEN 
     406               IF( nimpp + nlci - 1 /= jpiglo ) THEN 
    453407                  endloop = nlci 
    454408               ELSE 
    455409                  endloop = nlci - 1 
    456410               ENDIF 
    457                DO jk = 1, jpk 
     411               DO jk = 1, ipk 
    458412                  DO ji = 1, endloop 
    459413                     iju = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 3 
     
    467421                  ENDIF 
    468422               END DO 
    469  
    470                IF ((nimpp + nlci - 1) .ne. jpiglo) THEN 
     423               ! 
     424               IF( nimpp + nlci - 1 /= jpiglo ) THEN 
    471425                  endloop = nlci 
    472426               ELSE 
    473427                  endloop = nlci - 1 
    474428               ENDIF 
    475                IF(nimpp .ge. (jpiglo/2)) THEN 
     429               IF( nimpp >= jpiglo/2 ) THEN 
    476430                  startloop = 1 
    477                ELSEIF(((nimpp+nlci-1) .ge. (jpiglo/2)) .AND. (nimpp .lt. (jpiglo/2))) THEN 
     431               ELSEIF( ( nimpp+nlci-1 >= jpiglo/2 ) .AND. ( nimpp < jpiglo/2 ) ) THEN 
    478432                  startloop = jpiglo/2 - nimpp + 1 
    479433               ELSE 
    480434                  startloop = endloop + 1 
    481435               ENDIF 
    482                IF (startloop .le. endloop) THEN 
    483                  DO jk = 1, jpk 
     436               IF( startloop <= endloop ) THEN 
     437                 DO jk = 1, ipk 
    484438                    DO ji = startloop, endloop 
    485439                      iju = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 3 
    486440                      jia = ji + nimpp - 1 
    487441                      ijua = jpiglo - jia + 1 
    488                       IF((ijua .ge. (startloop + nimpp - 1)) .and. (ijua .lt. jia)) THEN 
     442                      IF( ijua >= startloop+nimpp-1 .AND. ijua < jia ) THEN 
    489443                        pt3dl(ji,ijpjm1,jk) = psgn * pt3dl(ijua-nimpp+1,ijpjm1,jk) 
    490444                      ELSE 
     
    494448                 END DO 
    495449               ENDIF 
    496  
     450               ! 
    497451            CASE ( 'V' )                               ! V-point 
    498                IF (nimpp .ne. 1) THEN 
     452               IF( nimpp /= 1 ) THEN 
    499453                  startloop = 1 
    500454               ELSE 
    501455                  startloop = 2 
    502456               ENDIF 
    503                DO jk = 1, jpk 
     457               DO jk = 1, ipk 
    504458                  DO ji = startloop, nlci 
    505459                     ijt = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 4 
     
    512466               END DO 
    513467            CASE ( 'F' )                               ! F-point 
    514                IF ((nimpp + nlci - 1) .ne. jpiglo) THEN 
     468               IF( nimpp + nlci - 1 /= jpiglo ) THEN 
    515469                  endloop = nlci 
    516470               ELSE 
    517471                  endloop = nlci - 1 
    518472               ENDIF 
    519                DO jk = 1, jpk 
     473               DO jk = 1, ipk 
    520474                  DO ji = 1, endloop 
    521475                     iju = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 3 
     
    530484                  ENDIF 
    531485               END DO 
    532             END SELECT 
    533             ! 
    534  
    535          CASE ( 5 , 6 )                        ! *  North fold  F-point pivot 
    536             ! 
    537             SELECT CASE ( cd_type ) 
     486         END SELECT 
     487         ! 
     488      CASE ( 5 , 6 )                        ! *  North fold  F-point pivot 
     489         ! 
     490         SELECT CASE ( cd_type ) 
    538491            CASE ( 'T' , 'W' )                         ! T-, W-point 
    539                DO jk = 1, jpk 
     492               DO jk = 1, ipk 
    540493                  DO ji = 1, nlci 
    541494                     ijt = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 3 
     
    543496                  END DO 
    544497               END DO 
    545  
     498               ! 
    546499            CASE ( 'U' )                               ! U-point 
    547                IF ((nimpp + nlci - 1) .ne. jpiglo) THEN 
     500               IF( nimpp + nlci - 1 /= jpiglo ) THEN 
    548501                  endloop = nlci 
    549502               ELSE 
    550503                  endloop = nlci - 1 
    551504               ENDIF 
    552                DO jk = 1, jpk 
     505               DO jk = 1, ipk 
    553506                  DO ji = 1, endloop 
    554507                     iju = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 2 
     
    559512                  ENDIF 
    560513               END DO 
    561  
     514               ! 
    562515            CASE ( 'V' )                               ! V-point 
    563                DO jk = 1, jpk 
     516               DO jk = 1, ipk 
    564517                  DO ji = 1, nlci 
    565518                     ijt = jpiglo - ji- nimpp - nfiimpp(isendto(1),jpnj) + 3 
     
    567520                  END DO 
    568521               END DO 
    569  
    570                IF(nimpp .ge. (jpiglo/2+1)) THEN 
     522               ! 
     523               IF( nimpp >= jpiglo/2+1 ) THEN 
    571524                  startloop = 1 
    572                ELSEIF(((nimpp+nlci-1) .ge. (jpiglo/2+1)) .AND. (nimpp .lt. (jpiglo/2+1))) THEN 
     525               ELSEIF( nimpp+nlci-1 >= jpiglo/2+1 .AND. nimpp < jpiglo/2+1 ) THEN 
    573526                  startloop = jpiglo/2+1 - nimpp + 1 
    574527               ELSE 
    575528                  startloop = nlci + 1 
    576529               ENDIF 
    577                IF(startloop .le. nlci) THEN 
    578                  DO jk = 1, jpk 
     530               IF( startloop <= nlci ) THEN 
     531                 DO jk = 1, ipk 
    579532                    DO ji = startloop, nlci 
    580533                       ijt = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 3 
     
    583536                 END DO 
    584537               ENDIF 
    585  
     538               ! 
    586539            CASE ( 'F' )                               ! F-point 
    587                IF ((nimpp + nlci - 1) .ne. jpiglo) THEN 
     540               IF( nimpp + nlci - 1 /= jpiglo ) THEN 
    588541                  endloop = nlci 
    589542               ELSE 
    590543                  endloop = nlci - 1 
    591544               ENDIF 
    592                DO jk = 1, jpk 
     545               DO jk = 1, ipk 
    593546                  DO ji = 1, endloop 
    594547                     iju = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 2 
     
    599552                  ENDIF 
    600553               END DO 
    601  
    602                IF ((nimpp + nlci - 1) .ne. jpiglo) THEN 
     554               ! 
     555               IF( nimpp + nlci - 1 /= jpiglo ) THEN 
    603556                  endloop = nlci 
    604557               ELSE 
    605558                  endloop = nlci - 1 
    606559               ENDIF 
    607                IF(nimpp .ge. (jpiglo/2+1)) THEN 
     560               IF( nimpp >= jpiglo/2+1 ) THEN 
    608561                  startloop = 1 
    609                ELSEIF(((nimpp+nlci-1) .ge. (jpiglo/2+1)) .AND. (nimpp .lt. (jpiglo/2+1))) THEN 
     562               ELSEIF( nimpp+nlci-1 >= jpiglo/2+1 .AND. nimpp < jpiglo/2+1 ) THEN 
    610563                  startloop = jpiglo/2+1 - nimpp + 1 
    611564               ELSE 
    612565                  startloop = endloop + 1 
    613566               ENDIF 
    614                IF (startloop .le. endloop) THEN 
    615                   DO jk = 1, jpk 
     567               IF( startloop <= endloop ) THEN 
     568                  DO jk = 1, ipk 
    616569                     DO ji = startloop, endloop 
    617570                        iju = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 2 
     
    620573                  END DO 
    621574               ENDIF 
    622  
    623             END SELECT 
    624  
    625          CASE DEFAULT                           ! *  closed : the code probably never go through 
    626             ! 
    627             SELECT CASE ( cd_type) 
     575               ! 
     576         END SELECT 
     577         ! 
     578      CASE DEFAULT                           ! *  closed : the code probably never go through 
     579         ! 
     580         SELECT CASE ( cd_type) 
    628581            CASE ( 'T' , 'U' , 'V' , 'W' )             ! T-, U-, V-, W-points 
    629                pt3dl(:, 1  ,jk) = 0.e0 
    630                pt3dl(:,ijpj,jk) = 0.e0 
     582               pt3dl(:, 1  ,jk) = 0._wp 
     583               pt3dl(:,ijpj,jk) = 0._wp 
    631584            CASE ( 'F' )                               ! F-point 
    632                pt3dl(:,ijpj,jk) = 0.e0 
    633             END SELECT 
    634             ! 
    635          END SELECT     !  npolj 
    636          ! 
     585               pt3dl(:,ijpj,jk) = 0._wp 
     586         END SELECT 
     587         ! 
     588      END SELECT     !  npolj 
    637589      ! 
    638590   END SUBROUTINE mpp_lbc_nfd_3d 
     
    644596      !! 
    645597      !! ** Purpose :   2D lateral boundary condition : North fold treatment 
    646       !!       without processor exchanges.  
     598      !!              without processor exchanges.  
    647599      !! 
    648600      !! ** Method  :    
    649601      !! 
    650       !! ** Action  :   pt2d with updated values along the north fold 
    651       !!---------------------------------------------------------------------- 
    652       CHARACTER(len=1)        , INTENT(in   ) ::   cd_type   ! define the nature of ptab array grid-points 
    653       !                                                      ! = T , U , V , F , W points 
    654       REAL(wp)                , INTENT(in   ) ::   psgn      ! control of the sign change 
    655       !                                                      !   = -1. , the sign is changed if north fold boundary 
    656       !                                                      !   =  1. , the sign is kept  if north fold boundary 
     602      !! ** Action  :   pt2dl with updated values along the north fold 
     603      !!---------------------------------------------------------------------- 
    657604      REAL(wp), DIMENSION(:,:), INTENT(inout) ::   pt2dl     ! 2D array on which the boundary condition is applied 
    658605      REAL(wp), DIMENSION(:,:), INTENT(in   ) ::   pt2dr     ! 2D array on which the boundary condition is applied 
     606      CHARACTER(len=1)        , INTENT(in   ) ::   cd_type   ! nature of pt3d(l/r) grid-point 
     607      REAL(wp)                , INTENT(in   ) ::   psgn      ! sign used across north fold 
    659608      ! 
    660609      INTEGER  ::   ji 
     
    668617      ! 
    669618      ijpjm1 = ijpj-1 
    670  
    671  
     619      ! 
     620      ! 
    672621      SELECT CASE ( npolj ) 
    673622      ! 
     
    677626         ! 
    678627         CASE ( 'T' , 'W' )                               ! T- , W-points 
    679             IF (nimpp .ne. 1) THEN 
     628            IF( nimpp /= 1 ) THEN 
    680629              startloop = 1 
    681630            ELSE 
     
    686635              pt2dl(ji,ijpj) = psgn * pt2dr(ijt,ijpjm1-1) 
    687636            END DO 
    688             IF (nimpp .eq. 1) THEN 
    689               pt2dl(1,ijpj)   = psgn * pt2dl(3,ijpj-2) 
    690             ENDIF 
    691  
    692             IF(nimpp .ge. (jpiglo/2+1)) THEN 
     637            IF( nimpp == 1 ) THEN 
     638              pt2dl(1,ijpj) = psgn * pt2dl(3,ijpj-2) 
     639            ENDIF 
     640            ! 
     641            IF( nimpp >= jpiglo/2+1 ) THEN 
    693642               startloop = 1 
    694             ELSEIF(((nimpp+nlci-1) .ge. (jpiglo/2+1)) .AND. (nimpp .lt. (jpiglo/2+1))) THEN 
     643            ELSEIF( nimpp+nlci-1 >= jpiglo/2+1 .AND. nimpp < jpiglo/2+1 ) THEN 
    695644               startloop = jpiglo/2+1 - nimpp + 1 
    696645            ELSE 
     
    698647            ENDIF 
    699648            DO ji = startloop, nlci 
    700                ijt=jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 4 
     649               ijt = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 4 
    701650               jia = ji + nimpp - 1 
    702651               ijta = jpiglo - jia + 2 
    703                IF((ijta .ge. (startloop + nimpp - 1)) .and. (ijta .lt. jia)) THEN 
     652               IF( ijta >= startloop+nimpp-1 .AND. ijta < jia ) THEN 
    704653                  pt2dl(ji,ijpjm1) = psgn * pt2dl(ijta-nimpp+1,ijpjm1) 
    705654               ELSE 
     
    707656               ENDIF 
    708657            END DO 
    709  
     658            ! 
    710659         CASE ( 'U' )                                     ! U-point 
    711             IF ((nimpp + nlci - 1) .ne. jpiglo) THEN 
     660            IF( nimpp + nlci - 1 /= jpiglo ) THEN 
    712661               endloop = nlci 
    713662            ELSE 
     
    718667               pt2dl(ji,ijpj) = psgn * pt2dr(iju,ijpjm1-1) 
    719668            END DO 
    720  
     669            ! 
    721670            IF (nimpp .eq. 1) THEN 
    722671              pt2dl(   1  ,ijpj  ) = psgn * pt2dl(    2   ,ijpj-2) 
     
    726675              pt2dl(nlci,ijpj  ) = psgn * pt2dl(nlci-1,ijpj-2) 
    727676            ENDIF 
    728  
    729             IF ((nimpp + nlci - 1) .ne. jpiglo) THEN 
     677            ! 
     678            IF( nimpp + nlci - 1 /= jpiglo ) THEN 
    730679               endloop = nlci 
    731680            ELSE 
    732681               endloop = nlci - 1 
    733682            ENDIF 
    734             IF(nimpp .ge. (jpiglo/2)) THEN 
     683            IF( nimpp >= jpiglo/2 ) THEN 
    735684               startloop = 1 
    736             ELSEIF(((nimpp+nlci-1) .ge. (jpiglo/2)) .AND. (nimpp .lt. (jpiglo/2))) THEN 
     685            ELSEIF( nimpp+nlci-1 >= jpiglo/2 .AND. nimpp < jpiglo/2 ) THEN 
    737686               startloop = jpiglo/2 - nimpp + 1 
    738687            ELSE 
     
    743692               jia = ji + nimpp - 1 
    744693               ijua = jpiglo - jia + 1 
    745                IF((ijua .ge. (startloop + nimpp - 1)) .and. (ijua .lt. jia)) THEN 
     694               IF( ijua >= startloop+nimpp-1 .AND. ijua < jia ) THEN 
    746695                  pt2dl(ji,ijpjm1) = psgn * pt2dl(ijua-nimpp+1,ijpjm1) 
    747696               ELSE 
     
    749698               ENDIF 
    750699            END DO 
    751  
     700            ! 
    752701         CASE ( 'V' )                                     ! V-point 
    753             IF (nimpp .ne. 1) THEN 
     702            IF( nimpp /= 1 ) THEN 
    754703              startloop = 1 
    755704            ELSE 
     
    764713              pt2dl( 1 ,ijpj)   = psgn * pt2dl( 3 ,ijpj-3)  
    765714            ENDIF 
    766  
     715            ! 
    767716         CASE ( 'F' )                                     ! F-point 
    768             IF ((nimpp + nlci - 1) .ne. jpiglo) THEN 
     717            IF( nimpp + nlci - 1 /= jpiglo ) THEN 
    769718               endloop = nlci 
    770719            ELSE 
     
    784733              pt2dl(nlci,ijpj-1) = psgn * pt2dl(nlci-1,ijpj-2)  
    785734            ENDIF 
    786  
     735            ! 
    787736         CASE ( 'I' )                                     ! ice U-V point (I-point) 
    788             IF (nimpp .ne. 1) THEN 
     737            IF( nimpp /= 1 ) THEN 
    789738               startloop = 1 
    790739            ELSE 
     
    796745               pt2dl(ji,ijpj) = psgn * pt2dr(iju,ijpjm1) 
    797746            END DO 
    798  
    799          CASE ( 'J' )                                     ! first ice U-V point 
    800             IF (nimpp .ne. 1) THEN 
    801                startloop = 1 
    802             ELSE 
    803                startloop = 3 
    804                pt2dl(2,ijpj) = psgn * pt2dl(3,ijpjm1) 
    805             ENDIF 
    806             DO ji = startloop, nlci 
    807                iju = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 5 
    808                pt2dl(ji,ijpj) = psgn * pt2dr(iju,ijpjm1) 
    809             END DO 
    810  
    811          CASE ( 'K' )                                     ! second ice U-V point 
    812             IF (nimpp .ne. 1) THEN 
    813                startloop = 1 
    814             ELSE 
    815                startloop = 3 
    816                pt2dl(2,ijpj) = psgn * pt2dl(3,ijpjm1) 
    817             ENDIF 
    818             DO ji = startloop, nlci 
    819                iju = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 5 
    820                pt2dl(ji,ijpj) = psgn * pt2dr(iju,ijpjm1) 
    821             END DO 
    822  
     747            ! 
    823748         END SELECT 
    824749         ! 
     
    831756               pt2dl(ji,ijpj) = psgn * pt2dr(ijt,ijpjm1) 
    832757            END DO 
    833  
     758            ! 
    834759         CASE ( 'U' )                                     ! U-point 
    835             IF ((nimpp + nlci - 1) .ne. jpiglo) THEN 
     760            IF( nimpp + nlci - 1 /= jpiglo ) THEN 
    836761               endloop = nlci 
    837762            ELSE 
     
    845770               pt2dl(nlci,ijpj) = psgn * pt2dr(1,ijpj-1) 
    846771            ENDIF 
    847  
     772            ! 
    848773         CASE ( 'V' )                                     ! V-point 
    849774            DO ji = 1, nlci 
     
    851776               pt2dl(ji,ijpj) = psgn * pt2dr(ijt,ijpjm1-1) 
    852777            END DO 
    853             IF(nimpp .ge. (jpiglo/2+1)) THEN 
     778            IF( nimpp >= jpiglo/2+1 ) THEN 
    854779               startloop = 1 
    855             ELSEIF(((nimpp+nlci-1) .ge. (jpiglo/2+1)) .AND. (nimpp .lt. (jpiglo/2+1))) THEN 
     780            ELSEIF( nimpp+nlci-1 >= jpiglo/2+1 .AND. nimpp < jpiglo/2+1 ) THEN 
    856781               startloop = jpiglo/2+1 - nimpp + 1 
    857782            ELSE 
     
    862787               pt2dl(ji,ijpjm1) = psgn * pt2dr(ijt,ijpjm1) 
    863788            END DO 
    864  
     789            ! 
    865790         CASE ( 'F' )                               ! F-point 
    866             IF ((nimpp + nlci - 1) .ne. jpiglo) THEN 
     791            IF( nimpp + nlci - 1 /= jpiglo ) THEN 
    867792               endloop = nlci 
    868793            ELSE 
     
    876801                pt2dl(nlci,ijpj) = psgn * pt2dr(1,ijpj-2) 
    877802            ENDIF 
    878  
    879             IF ((nimpp + nlci - 1) .ne. jpiglo) THEN 
     803            ! 
     804            IF( nimpp + nlci - 1 /= jpiglo ) THEN 
    880805               endloop = nlci 
    881806            ELSE 
    882807               endloop = nlci - 1 
    883808            ENDIF 
    884             IF(nimpp .ge. (jpiglo/2+1)) THEN 
     809            IF( nimpp >= jpiglo/2+1 ) THEN 
    885810               startloop = 1 
    886             ELSEIF(((nimpp+nlci-1) .ge. (jpiglo/2+1)) .AND. (nimpp .lt. (jpiglo/2+1))) THEN 
     811            ELSEIF( nimpp+nlci-1 >= jpiglo/2+1 .AND. nimpp < jpiglo/2+1 ) THEN 
    887812               startloop = jpiglo/2+1 - nimpp + 1 
    888813            ELSE 
    889814               startloop = endloop + 1 
    890815            ENDIF 
    891  
     816            ! 
    892817            DO ji = startloop, endloop 
    893818               iju = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 2 
    894819               pt2dl(ji,ijpjm1) = psgn * pt2dr(iju,ijpjm1) 
    895820            END DO 
    896  
     821            ! 
    897822         CASE ( 'I' )                                  ! ice U-V point (I-point) 
    898                IF (nimpp .ne. 1) THEN 
     823               IF( nimpp /= 1 ) THEN 
    899824                  startloop = 1 
    900825               ELSE 
    901826                  startloop = 2 
    902827               ENDIF 
    903                IF ((nimpp + nlci - 1) .ne. jpiglo) THEN 
     828               IF( nimpp + nlci - 1 /= jpiglo ) THEN 
    904829                  endloop = nlci 
    905830               ELSE 
     
    908833               DO ji = startloop , endloop 
    909834                  ijt = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 4 
    910                   pt2dl(ji,ijpj)= 0.5 * (pt2dl(ji,ijpjm1) + psgn * pt2dr(ijt,ijpjm1)) 
    911                END DO 
    912  
    913          CASE ( 'J' )                                  ! first ice U-V point 
    914                IF (nimpp .ne. 1) THEN 
    915                   startloop = 1 
    916                ELSE 
    917                   startloop = 2 
    918                ENDIF 
    919                IF ((nimpp + nlci - 1) .ne. jpiglo) THEN 
    920                   endloop = nlci 
    921                ELSE 
    922                   endloop = nlci - 1 
    923                ENDIF 
    924                DO ji = startloop , endloop 
    925                   ijt = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 4 
    926                   pt2dl(ji,ijpj) = pt2dl(ji,ijpjm1) 
    927                END DO 
    928  
    929          CASE ( 'K' )                                  ! second ice U-V point 
    930                IF (nimpp .ne. 1) THEN 
    931                   startloop = 1 
    932                ELSE 
    933                   startloop = 2 
    934                ENDIF 
    935                IF ((nimpp + nlci - 1) .ne. jpiglo) THEN 
    936                   endloop = nlci 
    937                ELSE 
    938                   endloop = nlci - 1 
    939                ENDIF 
    940                DO ji = startloop, endloop 
    941                   ijt = jpiglo - ji - nimpp - nfiimpp(isendto(1),jpnj) + 4 
    942                   pt2dl(ji,ijpj) = pt2dr(ijt,ijpjm1) 
    943                END DO 
    944  
     835                  pt2dl(ji,ijpj) = 0.5 * (pt2dl(ji,ijpjm1) + psgn * pt2dr(ijt,ijpjm1)) 
     836               END DO 
     837               ! 
    945838         END SELECT 
    946839         ! 
     
    949842         SELECT CASE ( cd_type) 
    950843         CASE ( 'T' , 'U' , 'V' , 'W' )                 ! T-, U-, V-, W-points 
    951             pt2dl(:, 1     ) = 0.e0 
    952             pt2dl(:,ijpj) = 0.e0 
     844            pt2dl(:, 1  ) = 0._wp 
     845            pt2dl(:,ijpj) = 0._wp 
    953846         CASE ( 'F' )                                   ! F-point 
    954             pt2dl(:,ijpj) = 0.e0 
     847            pt2dl(:,ijpj) = 0._wp 
    955848         CASE ( 'I' )                                   ! ice U-V point 
    956             pt2dl(:, 1     ) = 0.e0 
    957             pt2dl(:,ijpj) = 0.e0 
    958          CASE ( 'J' )                                   ! first ice U-V point 
    959             pt2dl(:, 1     ) = 0.e0 
    960             pt2dl(:,ijpj) = 0.e0 
    961          CASE ( 'K' )                                   ! second ice U-V point 
    962             pt2dl(:, 1     ) = 0.e0 
    963             pt2dl(:,ijpj) = 0.e0 
     849            pt2dl(:, 1  ) = 0._wp 
     850            pt2dl(:,ijpj) = 0._wp 
    964851         END SELECT 
    965852         ! 
Note: See TracChangeset for help on using the changeset viewer.