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 3359 for branches/2012/dev_r3337_NOCS10_ICB/NEMOGCM/NEMO/OPA_SRC/ICB/icblbc.F90 – NEMO

Ignore:
Timestamp:
2012-04-18T12:42:56+02:00 (12 years ago)
Author:
sga
Message:

NEMO branch dev_r3337_NOCS10_ICB: make code conform to NEMO coding conventions

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2012/dev_r3337_NOCS10_ICB/NEMOGCM/NEMO/OPA_SRC/ICB/icblbc.F90

    r3339 r3359  
    1919   !!                       routines because they do not lie on regular jpi,jpj grids 
    2020   !!                       Processor exchanges are handled as in lib_mpp whenever icebergs step  
    21    !!                       across boundary of interior domain (icbdi-icbei, icbdj-icbej) 
     21   !!                       across boundary of interior domain (nicbdi-nicbei, nicbdj-nicbej) 
    2222   !!                       so that iceberg does not exist in more than one processor 
    2323   !!                       North fold exchanges controlled by three arrays: 
    24    !!                          icbflddest - unique processor numbers that current one exchanges with 
    25    !!                          icbfldproc - processor number that current grid point exchanges with 
    26    !!                          icbfldpts  - packed i,j point in exchanging processor 
     24   !!                          nicbflddest - unique processor numbers that current one exchanges with 
     25   !!                          nicbfldproc - processor number that current grid point exchanges with 
     26   !!                          nicbfldpts  - packed i,j point in exchanging processor 
    2727   !!---------------------------------------------------------------------- 
    2828 
     
    5656   TYPE(buffer), POINTER           ::   obuffer_f=>NULL() , ibuffer_f=>NULL() 
    5757 
    58    INTEGER, PARAMETER, PUBLIC      ::   delta_buf = 25             ! Size by which to increment buffers 
    59    INTEGER, PARAMETER, PUBLIC      ::   buffer_width = 15+nkounts  ! items to store for each berg 
     58   INTEGER, PARAMETER, PUBLIC      ::   pp_delta_buf = 25             ! Size by which to increment buffers 
     59   INTEGER, PARAMETER, PUBLIC      ::   pp_buffer_width = 15+nkounts  ! items to store for each berg 
    6060 
    6161#endif 
     
    8888      TYPE(iceberg), POINTER :: this 
    8989      TYPE(point)  , POINTER :: pt 
    90       INTEGER                :: ine 
     90      INTEGER                :: iine 
    9191 
    9292      !! periodic east/west boundaries 
     
    9898         DO WHILE( ASSOCIATED(this) ) 
    9999            pt => this%current_point 
    100             ine = INT( pt%xi + 0.5 ) 
    101             IF( ine .GT. nimpp+icbei-1 ) THEN 
    102                pt%xi = icb_right + MOD(pt%xi, 1._wp ) - 1._wp 
    103             ELSE IF( ine .LT. nimpp+icbdi-1 ) THEN 
    104                pt%xi = icb_left + MOD(pt%xi, 1._wp ) 
     100            iine = INT( pt%xi + 0.5 ) 
     101            IF( iine .GT. nimpp+nicbei-1 ) THEN 
     102               pt%xi = ricb_right + MOD(pt%xi, 1._wp ) - 1._wp 
     103            ELSE IF( iine .LT. nimpp+nicbdi-1 ) THEN 
     104               pt%xi = ricb_left + MOD(pt%xi, 1._wp ) 
    105105            ENDIF 
    106106            this => this%next 
     
    136136      TYPE(iceberg), POINTER :: this 
    137137      TYPE(point)  , POINTER :: pt 
    138       INTEGER                :: ine, jne, kpts 
    139       INTEGER                :: jiglo, jjglo 
     138      INTEGER                :: iine, ijne, ipts 
     139      INTEGER                :: iiglo, ijglo 
    140140 
    141141      this => first_berg 
    142142      DO WHILE( ASSOCIATED(this) ) 
    143143         pt => this%current_point 
    144          jne = INT( pt%yj + 0.5 ) 
    145          IF( jne .GT. njmpp+icbej-1 ) THEN 
     144         ijne = INT( pt%yj + 0.5 ) 
     145         IF( ijne .GT. njmpp+nicbej-1 ) THEN 
    146146            ! 
    147             ine = INT( pt%xi + 0.5 ) 
    148             kpts  = icbfldpts (ine-nimpp+1) 
     147            iine = INT( pt%xi + 0.5 ) 
     148            ipts  = nicbfldpts (iine-nimpp+1) 
    149149            ! 
    150150            ! moving across the cut line means both position and 
    151151            ! velocity must change 
    152             jjglo = INT( kpts/icbpack ) 
    153             jiglo = kpts - icbpack*jjglo 
    154             pt%xi = jiglo - ( pt%xi - REAL(ine,wp) ) 
    155             pt%yj = jjglo - ( pt%yj - REAL(jne,wp) ) 
     152            ijglo = INT( ipts/nicbpack ) 
     153            iiglo = ipts - nicbpack*ijglo 
     154            pt%xi = iiglo - ( pt%xi - REAL(iine,wp) ) 
     155            pt%yj = ijglo - ( pt%yj - REAL(ijne,wp) ) 
    156156            pt%uvel = -1._wp * pt%uvel 
    157157            pt%vvel = -1._wp * pt%vvel 
     
    181181      TYPE(iceberg)         , POINTER     :: tmpberg, this 
    182182      TYPE(point)           , POINTER     :: pt 
    183       INTEGER                             :: nbergs_to_send_e, nbergs_to_send_w 
    184       INTEGER                             :: nbergs_to_send_n, nbergs_to_send_s 
    185       INTEGER                             :: nbergs_rcvd_from_e, nbergs_rcvd_from_w 
    186       INTEGER                             :: nbergs_rcvd_from_n, nbergs_rcvd_from_s 
    187       INTEGER                             :: i, nbergs_start, nbergs_end 
    188       INTEGER                             :: ine, jne 
    189       INTEGER                             :: pe_N, pe_S, pe_W, pe_E 
    190       REAL(wp), DIMENSION(2)              :: ewbergs, webergs, nsbergs, snbergs 
    191       INTEGER                             :: ml_req1, ml_req2, ml_req3, ml_req4 
    192       INTEGER                             :: ml_req5, ml_req6, ml_req7, ml_req8, ml_err 
    193       INTEGER, DIMENSION(MPI_STATUS_SIZE) :: ml_stat 
     183      INTEGER                             :: ibergs_to_send_e, ibergs_to_send_w 
     184      INTEGER                             :: ibergs_to_send_n, ibergs_to_send_s 
     185      INTEGER                             :: ibergs_rcvd_from_e, ibergs_rcvd_from_w 
     186      INTEGER                             :: ibergs_rcvd_from_n, ibergs_rcvd_from_s 
     187      INTEGER                             :: i, ibergs_start, ibergs_end 
     188      INTEGER                             :: iine, ijne 
     189      INTEGER                             :: ipe_N, ipe_S, ipe_W, ipe_E 
     190      REAL(wp), DIMENSION(2)              :: zewbergs, zwebergs, znsbergs, zsnbergs 
     191      INTEGER                             :: iml_req1, iml_req2, iml_req3, iml_req4 
     192      INTEGER                             :: iml_req5, iml_req6, iml_req7, iml_req8, iml_err 
     193      INTEGER, DIMENSION(MPI_STATUS_SIZE) :: iml_stat 
    194194 
    195195      ! set up indices of neighbouring processors 
    196       pe_N = -1 
    197       pe_S = -1 
    198       pe_W = -1 
    199       pe_E = -1 
    200       IF( nbondi .EQ.  0 .OR. nbondi .EQ. 1) pe_W = nowe 
    201       IF( nbondi .EQ. -1 .OR. nbondi .EQ. 0) pe_E = noea 
    202       IF( nbondj .EQ.  0 .OR. nbondj .EQ. 1) pe_S = noso 
    203       IF( nbondj .EQ. -1 .OR. nbondj .EQ. 0) pe_N = nono 
     196      ipe_N = -1 
     197      ipe_S = -1 
     198      ipe_W = -1 
     199      ipe_E = -1 
     200      IF( nbondi .EQ.  0 .OR. nbondi .EQ. 1) ipe_W = nowe 
     201      IF( nbondi .EQ. -1 .OR. nbondi .EQ. 0) ipe_E = noea 
     202      IF( nbondj .EQ.  0 .OR. nbondj .EQ. 1) ipe_S = noso 
     203      IF( nbondj .EQ. -1 .OR. nbondj .EQ. 0) ipe_N = nono 
    204204      ! 
    205205      ! at northern line of processors with north fold handle bergs differently 
    206       IF( npolj > 0 ) pe_N = -1 
     206      IF( npolj > 0 ) ipe_N = -1 
    207207 
    208208      ! if there's only one processor in x direction then don't let mpp try to handle periodicity 
    209209      IF( jpni == 1 ) THEN 
    210          pe_E = -1 
    211          pe_W = -1 
     210         ipe_E = -1 
     211         ipe_W = -1 
    212212      ENDIF 
    213213 
    214214      IF( nn_verbose_level >= 2 ) THEN 
    215          WRITE(numicb,*) 'processor west  : ', pe_W 
    216          WRITE(numicb,*) 'processor east  : ', pe_E 
    217          WRITE(numicb,*) 'processor north : ', pe_N 
    218          WRITE(numicb,*) 'processor south : ', pe_S 
     215         WRITE(numicb,*) 'processor west  : ', ipe_W 
     216         WRITE(numicb,*) 'processor east  : ', ipe_E 
     217         WRITE(numicb,*) 'processor north : ', ipe_N 
     218         WRITE(numicb,*) 'processor south : ', ipe_S 
    219219         WRITE(numicb,*) 'processor nimpp : ', nimpp 
    220220         WRITE(numicb,*) 'processor njmpp : ', njmpp 
     
    234234      IF( nn_verbose_level > 0 ) THEN 
    235235         ! store the number of icebergs on this processor at start 
    236          nbergs_start = count_bergs() 
    237       ENDIF 
    238  
    239       nbergs_to_send_e = 0 
    240       nbergs_to_send_w = 0 
    241       nbergs_to_send_n = 0 
    242       nbergs_to_send_s = 0 
    243       nbergs_rcvd_from_e = 0 
    244       nbergs_rcvd_from_w = 0 
    245       nbergs_rcvd_from_n = 0 
    246       nbergs_rcvd_from_s = 0 
     236         ibergs_start = count_bergs() 
     237      ENDIF 
     238 
     239      ibergs_to_send_e = 0 
     240      ibergs_to_send_w = 0 
     241      ibergs_to_send_n = 0 
     242      ibergs_to_send_s = 0 
     243      ibergs_rcvd_from_e = 0 
     244      ibergs_rcvd_from_w = 0 
     245      ibergs_rcvd_from_n = 0 
     246      ibergs_rcvd_from_s = 0 
    247247 
    248248      ! Find number of bergs that headed east/west 
     
    251251         DO WHILE (ASSOCIATED(this)) 
    252252            pt => this%current_point 
    253             ine = INT( pt%xi + 0.5 ) 
    254             IF( pe_E >= 0 .AND. ine .GT. nimpp+icbei-1 ) THEN 
     253            iine = INT( pt%xi + 0.5 ) 
     254            IF( ipe_E >= 0 .AND. iine .GT. nimpp+nicbei-1 ) THEN 
    255255               tmpberg => this 
    256256               this => this%next 
    257                nbergs_to_send_e = nbergs_to_send_e + 1 
     257               ibergs_to_send_e = ibergs_to_send_e + 1 
    258258               IF( nn_verbose_level >= 4 ) THEN 
    259                   WRITE(numicb,*) 'bergstep ',ktberg,' packing berg ',tmpberg%number(:),' for transfer to east' 
     259                  WRITE(numicb,*) 'bergstep ',nktberg,' packing berg ',tmpberg%number(:),' for transfer to east' 
    260260                  CALL flush( numicb ) 
    261261               ENDIF 
    262262               ! deal with periodic case 
    263                tmpberg%current_point%xi = icb_right + MOD(tmpberg%current_point%xi, 1._wp ) - 1._wp 
     263               tmpberg%current_point%xi = ricb_right + MOD(tmpberg%current_point%xi, 1._wp ) - 1._wp 
    264264               ! now pack it into buffer and delete from list 
    265                CALL pack_berg_into_buffer( tmpberg, obuffer_e, nbergs_to_send_e) 
     265               CALL pack_berg_into_buffer( tmpberg, obuffer_e, ibergs_to_send_e) 
    266266               CALL delete_iceberg_from_list(first_berg, tmpberg) 
    267             ELSE IF( pe_W >= 0 .AND. ine .LT. nimpp+icbdi-1 ) THEN 
     267            ELSE IF( ipe_W >= 0 .AND. iine .LT. nimpp+nicbdi-1 ) THEN 
    268268               tmpberg => this 
    269269               this => this%next 
    270                nbergs_to_send_w = nbergs_to_send_w + 1 
     270               ibergs_to_send_w = ibergs_to_send_w + 1 
    271271               IF( nn_verbose_level >= 4 ) THEN 
    272                   WRITE(numicb,*) 'bergstep ',ktberg,' packing berg ',tmpberg%number(:),' for transfer to west' 
     272                  WRITE(numicb,*) 'bergstep ',nktberg,' packing berg ',tmpberg%number(:),' for transfer to west' 
    273273                  CALL flush( numicb ) 
    274274               ENDIF 
    275275               ! deal with periodic case 
    276                tmpberg%current_point%xi = icb_left + MOD(tmpberg%current_point%xi, 1._wp ) 
     276               tmpberg%current_point%xi = ricb_left + MOD(tmpberg%current_point%xi, 1._wp ) 
    277277               ! now pack it into buffer and delete from list 
    278                CALL pack_berg_into_buffer( tmpberg, obuffer_w, nbergs_to_send_w) 
     278               CALL pack_berg_into_buffer( tmpberg, obuffer_w, ibergs_to_send_w) 
    279279               CALL delete_iceberg_from_list(first_berg, tmpberg) 
    280280            ELSE 
     
    284284      ENDIF 
    285285      if( nn_verbose_level >= 3) then 
    286          write(numicb,*) 'bergstep ',ktberg,' send ew: ', nbergs_to_send_e, nbergs_to_send_w 
     286         write(numicb,*) 'bergstep ',nktberg,' send ew: ', ibergs_to_send_e, ibergs_to_send_w 
    287287         call flush(numicb) 
    288288      endif 
     
    295295      SELECT CASE ( nbondi ) 
    296296      CASE( -1 ) 
    297          webergs(1) = nbergs_to_send_e 
    298          CALL mppsend( 12, webergs(1), 1, pe_E, ml_req1) 
    299          CALL mpprecv( 11, ewbergs(2), 1 ) 
    300          IF( l_isend ) CALL mpi_wait( ml_req1, ml_stat, ml_err ) 
    301          nbergs_rcvd_from_e = INT( ewbergs(2) ) 
     297         zwebergs(1) = ibergs_to_send_e 
     298         CALL mppsend( 12, zwebergs(1), 1, ipe_E, iml_req1) 
     299         CALL mpprecv( 11, zewbergs(2), 1 ) 
     300         IF( l_isend ) CALL mpi_wait( iml_req1, iml_stat, iml_err ) 
     301         ibergs_rcvd_from_e = INT( zewbergs(2) ) 
    302302      CASE(  0 ) 
    303          ewbergs(1) = nbergs_to_send_w 
    304          webergs(1) = nbergs_to_send_e 
    305          CALL mppsend( 11, ewbergs(1), 1, pe_W, ml_req2) 
    306          CALL mppsend( 12, webergs(1), 1, pe_E, ml_req3) 
    307          CALL mpprecv( 11, ewbergs(2), 1 ) 
    308          CALL mpprecv( 12, webergs(2), 1 ) 
    309          IF( l_isend ) CALL mpi_wait( ml_req2, ml_stat, ml_err ) 
    310          IF( l_isend ) CALL mpi_wait( ml_req3, ml_stat, ml_err ) 
    311          nbergs_rcvd_from_e = INT( ewbergs(2) ) 
    312          nbergs_rcvd_from_w = INT( webergs(2) ) 
     303         zewbergs(1) = ibergs_to_send_w 
     304         zwebergs(1) = ibergs_to_send_e 
     305         CALL mppsend( 11, zewbergs(1), 1, ipe_W, iml_req2) 
     306         CALL mppsend( 12, zwebergs(1), 1, ipe_E, iml_req3) 
     307         CALL mpprecv( 11, zewbergs(2), 1 ) 
     308         CALL mpprecv( 12, zwebergs(2), 1 ) 
     309         IF( l_isend ) CALL mpi_wait( iml_req2, iml_stat, iml_err ) 
     310         IF( l_isend ) CALL mpi_wait( iml_req3, iml_stat, iml_err ) 
     311         ibergs_rcvd_from_e = INT( zewbergs(2) ) 
     312         ibergs_rcvd_from_w = INT( zwebergs(2) ) 
    313313      CASE(  1 ) 
    314          ewbergs(1) = nbergs_to_send_w 
    315          CALL mppsend( 11, ewbergs(1), 1, pe_W, ml_req4) 
    316          CALL mpprecv( 12, webergs(2), 1 ) 
    317          IF( l_isend ) CALL mpi_wait( ml_req4, ml_stat, ml_err ) 
    318          nbergs_rcvd_from_w = INT( webergs(2) ) 
     314         zewbergs(1) = ibergs_to_send_w 
     315         CALL mppsend( 11, zewbergs(1), 1, ipe_W, iml_req4) 
     316         CALL mpprecv( 12, zwebergs(2), 1 ) 
     317         IF( l_isend ) CALL mpi_wait( iml_req4, iml_stat, iml_err ) 
     318         ibergs_rcvd_from_w = INT( zwebergs(2) ) 
    319319      END SELECT 
    320320      if( nn_verbose_level >= 3) then 
    321          write(numicb,*) 'bergstep ',ktberg,' recv ew: ', nbergs_rcvd_from_w, nbergs_rcvd_from_e 
     321         write(numicb,*) 'bergstep ',nktberg,' recv ew: ', ibergs_rcvd_from_w, ibergs_rcvd_from_e 
    322322         call flush(numicb) 
    323323      endif 
     
    325325      SELECT CASE ( nbondi ) 
    326326      CASE( -1 ) 
    327          IF( nbergs_to_send_e > 0 ) CALL mppsend( 14, obuffer_e%data, nbergs_to_send_e*buffer_width, pe_E, ml_req1 ) 
    328          IF( nbergs_rcvd_from_e > 0 ) THEN 
    329             CALL increase_ibuffer(ibuffer_e, nbergs_rcvd_from_e) 
    330             CALL mpprecv( 13, ibuffer_e%data, nbergs_rcvd_from_e*buffer_width ) 
    331          ENDIF 
    332          IF( nbergs_to_send_e > 0 .AND. l_isend ) CALL mpi_wait( ml_req1, ml_stat, ml_err ) 
    333          DO i = 1, nbergs_rcvd_from_e 
     327         IF( ibergs_to_send_e > 0 ) CALL mppsend( 14, obuffer_e%data, ibergs_to_send_e*pp_buffer_width, ipe_E, iml_req1 ) 
     328         IF( ibergs_rcvd_from_e > 0 ) THEN 
     329            CALL increase_ibuffer(ibuffer_e, ibergs_rcvd_from_e) 
     330            CALL mpprecv( 13, ibuffer_e%data, ibergs_rcvd_from_e*pp_buffer_width ) 
     331         ENDIF 
     332         IF( ibergs_to_send_e > 0 .AND. l_isend ) CALL mpi_wait( iml_req1, iml_stat, iml_err ) 
     333         DO i = 1, ibergs_rcvd_from_e 
    334334            IF( nn_verbose_level >= 4 ) THEN 
    335                WRITE(numicb,*) 'bergstep ',ktberg,' unpacking berg ',INT(ibuffer_e%data(16,i)),' from east' 
     335               WRITE(numicb,*) 'bergstep ',nktberg,' unpacking berg ',INT(ibuffer_e%data(16,i)),' from east' 
    336336               CALL flush( numicb ) 
    337337            ENDIF 
     
    339339         ENDDO 
    340340      CASE(  0 ) 
    341          IF( nbergs_to_send_w > 0 ) CALL mppsend( 13, obuffer_w%data, nbergs_to_send_w*buffer_width, pe_W, ml_req2 ) 
    342          IF( nbergs_to_send_e > 0 ) CALL mppsend( 14, obuffer_e%data, nbergs_to_send_e*buffer_width, pe_E, ml_req3 ) 
    343          IF( nbergs_rcvd_from_e > 0 ) THEN 
    344             CALL increase_ibuffer(ibuffer_e, nbergs_rcvd_from_e) 
    345             CALL mpprecv( 13, ibuffer_e%data, nbergs_rcvd_from_e*buffer_width ) 
    346          ENDIF 
    347          IF( nbergs_rcvd_from_w > 0 ) THEN 
    348             CALL increase_ibuffer(ibuffer_w, nbergs_rcvd_from_w) 
    349             CALL mpprecv( 14, ibuffer_w%data, nbergs_rcvd_from_w*buffer_width ) 
    350          ENDIF 
    351          IF( nbergs_to_send_w > 0 .AND. l_isend ) CALL mpi_wait( ml_req2, ml_stat, ml_err ) 
    352          IF( nbergs_to_send_e > 0 .AND. l_isend ) CALL mpi_wait( ml_req3, ml_stat, ml_err ) 
    353          DO i = 1, nbergs_rcvd_from_e 
     341         IF( ibergs_to_send_w > 0 ) CALL mppsend( 13, obuffer_w%data, ibergs_to_send_w*pp_buffer_width, ipe_W, iml_req2 ) 
     342         IF( ibergs_to_send_e > 0 ) CALL mppsend( 14, obuffer_e%data, ibergs_to_send_e*pp_buffer_width, ipe_E, iml_req3 ) 
     343         IF( ibergs_rcvd_from_e > 0 ) THEN 
     344            CALL increase_ibuffer(ibuffer_e, ibergs_rcvd_from_e) 
     345            CALL mpprecv( 13, ibuffer_e%data, ibergs_rcvd_from_e*pp_buffer_width ) 
     346         ENDIF 
     347         IF( ibergs_rcvd_from_w > 0 ) THEN 
     348            CALL increase_ibuffer(ibuffer_w, ibergs_rcvd_from_w) 
     349            CALL mpprecv( 14, ibuffer_w%data, ibergs_rcvd_from_w*pp_buffer_width ) 
     350         ENDIF 
     351         IF( ibergs_to_send_w > 0 .AND. l_isend ) CALL mpi_wait( iml_req2, iml_stat, iml_err ) 
     352         IF( ibergs_to_send_e > 0 .AND. l_isend ) CALL mpi_wait( iml_req3, iml_stat, iml_err ) 
     353         DO i = 1, ibergs_rcvd_from_e 
    354354            IF( nn_verbose_level >= 4 ) THEN 
    355                WRITE(numicb,*) 'bergstep ',ktberg,' unpacking berg ',INT(ibuffer_e%data(16,i)),' from east' 
     355               WRITE(numicb,*) 'bergstep ',nktberg,' unpacking berg ',INT(ibuffer_e%data(16,i)),' from east' 
    356356               CALL flush( numicb ) 
    357357            ENDIF 
    358358            CALL unpack_berg_from_buffer(first_berg, ibuffer_e, i) 
    359359         ENDDO 
    360          DO i = 1, nbergs_rcvd_from_w 
     360         DO i = 1, ibergs_rcvd_from_w 
    361361            IF( nn_verbose_level >= 4 ) THEN 
    362                WRITE(numicb,*) 'bergstep ',ktberg,' unpacking berg ',INT(ibuffer_w%data(16,i)),' from west' 
     362               WRITE(numicb,*) 'bergstep ',nktberg,' unpacking berg ',INT(ibuffer_w%data(16,i)),' from west' 
    363363               CALL flush( numicb ) 
    364364            ENDIF 
     
    366366         ENDDO 
    367367      CASE(  1 ) 
    368          IF( nbergs_to_send_w > 0 ) CALL mppsend( 13, obuffer_w%data, nbergs_to_send_w*buffer_width, pe_W, ml_req4 ) 
    369          IF( nbergs_rcvd_from_w > 0 ) THEN 
    370             CALL increase_ibuffer(ibuffer_w, nbergs_rcvd_from_w) 
    371             CALL mpprecv( 14, ibuffer_w%data, nbergs_rcvd_from_w*buffer_width ) 
    372          ENDIF 
    373          IF( nbergs_to_send_w > 0 .AND. l_isend ) CALL mpi_wait( ml_req4, ml_stat, ml_err ) 
    374          DO i = 1, nbergs_rcvd_from_w 
     368         IF( ibergs_to_send_w > 0 ) CALL mppsend( 13, obuffer_w%data, ibergs_to_send_w*pp_buffer_width, ipe_W, iml_req4 ) 
     369         IF( ibergs_rcvd_from_w > 0 ) THEN 
     370            CALL increase_ibuffer(ibuffer_w, ibergs_rcvd_from_w) 
     371            CALL mpprecv( 14, ibuffer_w%data, ibergs_rcvd_from_w*pp_buffer_width ) 
     372         ENDIF 
     373         IF( ibergs_to_send_w > 0 .AND. l_isend ) CALL mpi_wait( iml_req4, iml_stat, iml_err ) 
     374         DO i = 1, ibergs_rcvd_from_w 
    375375            IF( nn_verbose_level >= 4 ) THEN 
    376                WRITE(numicb,*) 'bergstep ',ktberg,' unpacking berg ',INT(ibuffer_w%data(16,i)),' from west' 
     376               WRITE(numicb,*) 'bergstep ',nktberg,' unpacking berg ',INT(ibuffer_w%data(16,i)),' from west' 
    377377               CALL flush( numicb ) 
    378378            ENDIF 
     
    390390         DO WHILE (ASSOCIATED(this)) 
    391391            pt => this%current_point 
    392             jne = INT( pt%yj + 0.5 ) 
    393             IF( pe_N >= 0 .AND. jne .GT. njmpp+icbej-1 ) THEN 
     392            ijne = INT( pt%yj + 0.5 ) 
     393            IF( ipe_N >= 0 .AND. ijne .GT. njmpp+nicbej-1 ) THEN 
    394394               tmpberg => this 
    395395               this => this%next 
    396                nbergs_to_send_n = nbergs_to_send_n + 1 
     396               ibergs_to_send_n = ibergs_to_send_n + 1 
    397397               IF( nn_verbose_level >= 4 ) THEN 
    398                   WRITE(numicb,*) 'bergstep ',ktberg,' packing berg ',tmpberg%number(:),' for transfer to north' 
     398                  WRITE(numicb,*) 'bergstep ',nktberg,' packing berg ',tmpberg%number(:),' for transfer to north' 
    399399                  CALL flush( numicb ) 
    400400               ENDIF 
    401                CALL pack_berg_into_buffer( tmpberg, obuffer_n, nbergs_to_send_n) 
     401               CALL pack_berg_into_buffer( tmpberg, obuffer_n, ibergs_to_send_n) 
    402402               CALL delete_iceberg_from_list(first_berg, tmpberg) 
    403             ELSE IF( pe_S >= 0 .AND. jne .LT. njmpp+icbdj-1 ) THEN 
     403            ELSE IF( ipe_S >= 0 .AND. ijne .LT. njmpp+nicbdj-1 ) THEN 
    404404               tmpberg => this 
    405405               this => this%next 
    406                nbergs_to_send_s = nbergs_to_send_s + 1 
     406               ibergs_to_send_s = ibergs_to_send_s + 1 
    407407               IF( nn_verbose_level >= 4 ) THEN 
    408                   WRITE(numicb,*) 'bergstep ',ktberg,' packing berg ',tmpberg%number(:),' for transfer to south' 
     408                  WRITE(numicb,*) 'bergstep ',nktberg,' packing berg ',tmpberg%number(:),' for transfer to south' 
    409409                  CALL flush( numicb ) 
    410410               ENDIF 
    411                CALL pack_berg_into_buffer( tmpberg, obuffer_s, nbergs_to_send_s) 
     411               CALL pack_berg_into_buffer( tmpberg, obuffer_s, ibergs_to_send_s) 
    412412               CALL delete_iceberg_from_list(first_berg, tmpberg) 
    413413            ELSE 
     
    417417      ENDIF 
    418418      if( nn_verbose_level >= 3) then 
    419          write(numicb,*) 'bergstep ',ktberg,' send ns: ', nbergs_to_send_n, nbergs_to_send_s 
     419         write(numicb,*) 'bergstep ',nktberg,' send ns: ', ibergs_to_send_n, ibergs_to_send_s 
    420420         call flush(numicb) 
    421421      endif 
     
    426426      SELECT CASE ( nbondj ) 
    427427      CASE( -1 ) 
    428          snbergs(1) = nbergs_to_send_n 
    429          CALL mppsend( 16, snbergs(1), 1, pe_N, ml_req1) 
    430          CALL mpprecv( 15, nsbergs(2), 1 ) 
    431          IF( l_isend ) CALL mpi_wait( ml_req1, ml_stat, ml_err ) 
    432          nbergs_rcvd_from_n = INT( nsbergs(2) ) 
     428         zsnbergs(1) = ibergs_to_send_n 
     429         CALL mppsend( 16, zsnbergs(1), 1, ipe_N, iml_req1) 
     430         CALL mpprecv( 15, znsbergs(2), 1 ) 
     431         IF( l_isend ) CALL mpi_wait( iml_req1, iml_stat, iml_err ) 
     432         ibergs_rcvd_from_n = INT( znsbergs(2) ) 
    433433      CASE(  0 ) 
    434          nsbergs(1) = nbergs_to_send_s 
    435          snbergs(1) = nbergs_to_send_n 
    436          CALL mppsend( 15, nsbergs(1), 1, pe_S, ml_req2) 
    437          CALL mppsend( 16, snbergs(1), 1, pe_N, ml_req3) 
    438          CALL mpprecv( 15, nsbergs(2), 1 ) 
    439          CALL mpprecv( 16, snbergs(2), 1 ) 
    440          IF( l_isend ) CALL mpi_wait( ml_req2, ml_stat, ml_err ) 
    441          IF( l_isend ) CALL mpi_wait( ml_req3, ml_stat, ml_err ) 
    442          nbergs_rcvd_from_n = INT( nsbergs(2) ) 
    443          nbergs_rcvd_from_s = INT( snbergs(2) ) 
     434         znsbergs(1) = ibergs_to_send_s 
     435         zsnbergs(1) = ibergs_to_send_n 
     436         CALL mppsend( 15, znsbergs(1), 1, ipe_S, iml_req2) 
     437         CALL mppsend( 16, zsnbergs(1), 1, ipe_N, iml_req3) 
     438         CALL mpprecv( 15, znsbergs(2), 1 ) 
     439         CALL mpprecv( 16, zsnbergs(2), 1 ) 
     440         IF( l_isend ) CALL mpi_wait( iml_req2, iml_stat, iml_err ) 
     441         IF( l_isend ) CALL mpi_wait( iml_req3, iml_stat, iml_err ) 
     442         ibergs_rcvd_from_n = INT( znsbergs(2) ) 
     443         ibergs_rcvd_from_s = INT( zsnbergs(2) ) 
    444444      CASE(  1 ) 
    445          nsbergs(1) = nbergs_to_send_s 
    446          CALL mppsend( 15, nsbergs(1), 1, pe_S, ml_req4) 
    447          CALL mpprecv( 16, snbergs(2), 1 ) 
    448          IF( l_isend ) CALL mpi_wait( ml_req4, ml_stat, ml_err ) 
    449          nbergs_rcvd_from_s = INT( snbergs(2) ) 
     445         znsbergs(1) = ibergs_to_send_s 
     446         CALL mppsend( 15, znsbergs(1), 1, ipe_S, iml_req4) 
     447         CALL mpprecv( 16, zsnbergs(2), 1 ) 
     448         IF( l_isend ) CALL mpi_wait( iml_req4, iml_stat, iml_err ) 
     449         ibergs_rcvd_from_s = INT( zsnbergs(2) ) 
    450450      END SELECT 
    451451      if( nn_verbose_level >= 3) then 
    452          write(numicb,*) 'bergstep ',ktberg,' recv ns: ', nbergs_rcvd_from_s, nbergs_rcvd_from_n 
     452         write(numicb,*) 'bergstep ',nktberg,' recv ns: ', ibergs_rcvd_from_s, ibergs_rcvd_from_n 
    453453         call flush(numicb) 
    454454      endif 
     
    456456      SELECT CASE ( nbondj ) 
    457457      CASE( -1 ) 
    458          IF( nbergs_to_send_n > 0 ) CALL mppsend( 18, obuffer_n%data, nbergs_to_send_n*buffer_width, pe_N, ml_req1 ) 
    459          IF( nbergs_rcvd_from_n > 0 ) THEN 
    460             CALL increase_ibuffer(ibuffer_n, nbergs_rcvd_from_n) 
    461             CALL mpprecv( 17, ibuffer_n%data, nbergs_rcvd_from_n*buffer_width ) 
    462          ENDIF 
    463          IF( nbergs_to_send_n > 0 .AND. l_isend ) CALL mpi_wait( ml_req1, ml_stat, ml_err ) 
    464          DO i = 1, nbergs_rcvd_from_n 
     458         IF( ibergs_to_send_n > 0 ) CALL mppsend( 18, obuffer_n%data, ibergs_to_send_n*pp_buffer_width, ipe_N, iml_req1 ) 
     459         IF( ibergs_rcvd_from_n > 0 ) THEN 
     460            CALL increase_ibuffer(ibuffer_n, ibergs_rcvd_from_n) 
     461            CALL mpprecv( 17, ibuffer_n%data, ibergs_rcvd_from_n*pp_buffer_width ) 
     462         ENDIF 
     463         IF( ibergs_to_send_n > 0 .AND. l_isend ) CALL mpi_wait( iml_req1, iml_stat, iml_err ) 
     464         DO i = 1, ibergs_rcvd_from_n 
    465465            IF( nn_verbose_level >= 4 ) THEN 
    466                WRITE(numicb,*) 'bergstep ',ktberg,' unpacking berg ',INT(ibuffer_n%data(16,i)),' from north' 
     466               WRITE(numicb,*) 'bergstep ',nktberg,' unpacking berg ',INT(ibuffer_n%data(16,i)),' from north' 
    467467               CALL flush( numicb ) 
    468468            ENDIF 
     
    470470         ENDDO 
    471471      CASE(  0 ) 
    472          IF( nbergs_to_send_s > 0 ) CALL mppsend( 17, obuffer_s%data, nbergs_to_send_s*buffer_width, pe_S, ml_req2 ) 
    473          IF( nbergs_to_send_n > 0 ) CALL mppsend( 18, obuffer_n%data, nbergs_to_send_n*buffer_width, pe_N, ml_req3 ) 
    474          IF( nbergs_rcvd_from_n > 0 ) THEN 
    475             CALL increase_ibuffer(ibuffer_n, nbergs_rcvd_from_n) 
    476             CALL mpprecv( 17, ibuffer_n%data, nbergs_rcvd_from_n*buffer_width ) 
    477          ENDIF 
    478          IF( nbergs_rcvd_from_s > 0 ) THEN 
    479             CALL increase_ibuffer(ibuffer_s, nbergs_rcvd_from_s) 
    480             CALL mpprecv( 18, ibuffer_s%data, nbergs_rcvd_from_s*buffer_width ) 
    481          ENDIF 
    482          IF( nbergs_to_send_s > 0 .AND. l_isend ) CALL mpi_wait( ml_req2, ml_stat, ml_err ) 
    483          IF( nbergs_to_send_n > 0 .AND. l_isend ) CALL mpi_wait( ml_req3, ml_stat, ml_err ) 
    484          DO i = 1, nbergs_rcvd_from_n 
     472         IF( ibergs_to_send_s > 0 ) CALL mppsend( 17, obuffer_s%data, ibergs_to_send_s*pp_buffer_width, ipe_S, iml_req2 ) 
     473         IF( ibergs_to_send_n > 0 ) CALL mppsend( 18, obuffer_n%data, ibergs_to_send_n*pp_buffer_width, ipe_N, iml_req3 ) 
     474         IF( ibergs_rcvd_from_n > 0 ) THEN 
     475            CALL increase_ibuffer(ibuffer_n, ibergs_rcvd_from_n) 
     476            CALL mpprecv( 17, ibuffer_n%data, ibergs_rcvd_from_n*pp_buffer_width ) 
     477         ENDIF 
     478         IF( ibergs_rcvd_from_s > 0 ) THEN 
     479            CALL increase_ibuffer(ibuffer_s, ibergs_rcvd_from_s) 
     480            CALL mpprecv( 18, ibuffer_s%data, ibergs_rcvd_from_s*pp_buffer_width ) 
     481         ENDIF 
     482         IF( ibergs_to_send_s > 0 .AND. l_isend ) CALL mpi_wait( iml_req2, iml_stat, iml_err ) 
     483         IF( ibergs_to_send_n > 0 .AND. l_isend ) CALL mpi_wait( iml_req3, iml_stat, iml_err ) 
     484         DO i = 1, ibergs_rcvd_from_n 
    485485            IF( nn_verbose_level >= 4 ) THEN 
    486                WRITE(numicb,*) 'bergstep ',ktberg,' unpacking berg ',INT(ibuffer_n%data(16,i)),' from north' 
     486               WRITE(numicb,*) 'bergstep ',nktberg,' unpacking berg ',INT(ibuffer_n%data(16,i)),' from north' 
    487487               CALL flush( numicb ) 
    488488            ENDIF 
    489489            CALL unpack_berg_from_buffer(first_berg, ibuffer_n, i) 
    490490         ENDDO 
    491          DO i = 1, nbergs_rcvd_from_s 
     491         DO i = 1, ibergs_rcvd_from_s 
    492492            IF( nn_verbose_level >= 4 ) THEN 
    493                WRITE(numicb,*) 'bergstep ',ktberg,' unpacking berg ',INT(ibuffer_s%data(16,i)),' from south' 
     493               WRITE(numicb,*) 'bergstep ',nktberg,' unpacking berg ',INT(ibuffer_s%data(16,i)),' from south' 
    494494               CALL flush( numicb ) 
    495495            ENDIF 
     
    497497         ENDDO 
    498498      CASE(  1 ) 
    499          IF( nbergs_to_send_s > 0 ) CALL mppsend( 17, obuffer_s%data, nbergs_to_send_s*buffer_width, pe_S, ml_req4 ) 
    500          IF( nbergs_rcvd_from_s > 0 ) THEN 
    501             CALL increase_ibuffer(ibuffer_s, nbergs_rcvd_from_s) 
    502             CALL mpprecv( 18, ibuffer_s%data, nbergs_rcvd_from_s*buffer_width ) 
    503          ENDIF 
    504          IF( nbergs_to_send_s > 0 .AND. l_isend ) CALL mpi_wait( ml_req4, ml_stat, ml_err ) 
    505          DO i = 1, nbergs_rcvd_from_s 
     499         IF( ibergs_to_send_s > 0 ) CALL mppsend( 17, obuffer_s%data, ibergs_to_send_s*pp_buffer_width, ipe_S, iml_req4 ) 
     500         IF( ibergs_rcvd_from_s > 0 ) THEN 
     501            CALL increase_ibuffer(ibuffer_s, ibergs_rcvd_from_s) 
     502            CALL mpprecv( 18, ibuffer_s%data, ibergs_rcvd_from_s*pp_buffer_width ) 
     503         ENDIF 
     504         IF( ibergs_to_send_s > 0 .AND. l_isend ) CALL mpi_wait( iml_req4, iml_stat, iml_err ) 
     505         DO i = 1, ibergs_rcvd_from_s 
    506506            IF( nn_verbose_level >= 4 ) THEN 
    507                WRITE(numicb,*) 'bergstep ',ktberg,' unpacking berg ',INT(ibuffer_s%data(16,i)),' from south' 
     507               WRITE(numicb,*) 'bergstep ',nktberg,' unpacking berg ',INT(ibuffer_s%data(16,i)),' from south' 
    508508               CALL flush( numicb ) 
    509509            ENDIF 
     
    514514      IF( nn_verbose_level > 0 ) THEN 
    515515         ! compare the number of icebergs on this processor from the start to the end 
    516          nbergs_end = count_bergs() 
    517          i = ( nbergs_rcvd_from_n + nbergs_rcvd_from_s + nbergs_rcvd_from_e + nbergs_rcvd_from_w ) - & 
    518              ( nbergs_to_send_n + nbergs_to_send_s + nbergs_to_send_e + nbergs_to_send_w ) 
    519          IF( nbergs_end-(nbergs_start+i) .NE. 0 ) THEN 
     516         ibergs_end = count_bergs() 
     517         i = ( ibergs_rcvd_from_n + ibergs_rcvd_from_s + ibergs_rcvd_from_e + ibergs_rcvd_from_w ) - & 
     518             ( ibergs_to_send_n + ibergs_to_send_s + ibergs_to_send_e + ibergs_to_send_w ) 
     519         IF( ibergs_end-(ibergs_start+i) .NE. 0 ) THEN 
    520520            WRITE( numicb,*   ) 'send_bergs_to_other_pes: net change in number of icebergs' 
    521             WRITE( numicb,1000) 'send_bergs_to_other_pes: nbergs_end=', & 
    522                                 nbergs_end,' on PE',narea 
    523             WRITE( numicb,1000) 'send_bergs_to_other_pes: nbergs_start=', & 
    524                                 nbergs_start,' on PE',narea 
     521            WRITE( numicb,1000) 'send_bergs_to_other_pes: ibergs_end=', & 
     522                                ibergs_end,' on PE',narea 
     523            WRITE( numicb,1000) 'send_bergs_to_other_pes: ibergs_start=', & 
     524                                ibergs_start,' on PE',narea 
    525525            WRITE( numicb,1000) 'send_bergs_to_other_pes: delta=', & 
    526526                                i,' on PE',narea 
    527527            WRITE( numicb,1000) 'send_bergs_to_other_pes: error=', & 
    528                                 nbergs_end-(nbergs_start+i),' on PE',narea 
    529             WRITE( numicb,1000) 'send_bergs_to_other_pes: nbergs_to_send_n=', & 
    530                                 nbergs_to_send_n,' on PE',narea 
    531             WRITE( numicb,1000) 'send_bergs_to_other_pes: nbergs_to_send_s=', & 
    532                                 nbergs_to_send_s,' on PE',narea 
    533             WRITE( numicb,1000) 'send_bergs_to_other_pes: nbergs_to_send_e=', & 
    534                                 nbergs_to_send_e,' on PE',narea 
    535             WRITE( numicb,1000) 'send_bergs_to_other_pes: nbergs_to_send_w=', & 
    536                                 nbergs_to_send_w,' on PE',narea 
    537             WRITE( numicb,1000) 'send_bergs_to_other_pes: nbergs_rcvd_from_n=', & 
    538                                 nbergs_rcvd_from_n,' on PE',narea 
    539             WRITE( numicb,1000) 'send_bergs_to_other_pes: nbergs_rcvd_from_s=', & 
    540                                 nbergs_rcvd_from_s,' on PE',narea 
    541             WRITE( numicb,1000) 'send_bergs_to_other_pes: nbergs_rcvd_from_e=', & 
    542                                 nbergs_rcvd_from_e,' on PE',narea 
    543             WRITE( numicb,1000) 'send_bergs_to_other_pes: nbergs_rcvd_from_w=', & 
    544                                 nbergs_rcvd_from_w,' on PE',narea 
     528                                ibergs_end-(ibergs_start+i),' on PE',narea 
     529            WRITE( numicb,1000) 'send_bergs_to_other_pes: ibergs_to_send_n=', & 
     530                                ibergs_to_send_n,' on PE',narea 
     531            WRITE( numicb,1000) 'send_bergs_to_other_pes: ibergs_to_send_s=', & 
     532                                ibergs_to_send_s,' on PE',narea 
     533            WRITE( numicb,1000) 'send_bergs_to_other_pes: ibergs_to_send_e=', & 
     534                                ibergs_to_send_e,' on PE',narea 
     535            WRITE( numicb,1000) 'send_bergs_to_other_pes: ibergs_to_send_w=', & 
     536                                ibergs_to_send_w,' on PE',narea 
     537            WRITE( numicb,1000) 'send_bergs_to_other_pes: ibergs_rcvd_from_n=', & 
     538                                ibergs_rcvd_from_n,' on PE',narea 
     539            WRITE( numicb,1000) 'send_bergs_to_other_pes: ibergs_rcvd_from_s=', & 
     540                                ibergs_rcvd_from_s,' on PE',narea 
     541            WRITE( numicb,1000) 'send_bergs_to_other_pes: ibergs_rcvd_from_e=', & 
     542                                ibergs_rcvd_from_e,' on PE',narea 
     543            WRITE( numicb,1000) 'send_bergs_to_other_pes: ibergs_rcvd_from_w=', & 
     544                                ibergs_rcvd_from_w,' on PE',narea 
    545545  1000      FORMAT(a,i5,a,i4) 
    546546            CALL ctl_stop('send_bergs_to_other_pes: lost or gained an iceberg or two') 
     
    557557         DO WHILE (ASSOCIATED(this)) 
    558558            pt => this%current_point 
    559             ine = INT( pt%xi + 0.5 ) 
    560             jne = INT( pt%yj + 0.5 ) 
     559            iine = INT( pt%xi + 0.5 ) 
     560            ijne = INT( pt%yj + 0.5 ) 
    561561!           CALL check_position(grd, this, 'exchange (bot)') 
    562             IF( ine .LT. nimpp+icbdi-1 .OR. & 
    563                 ine .GT. nimpp+icbei-1 .OR. & 
    564                 jne .LT. njmpp+icbdj-1 .OR. & 
    565                 jne .GT. njmpp+icbej-1) THEN 
     562            IF( iine .LT. nimpp+nicbdi-1 .OR. & 
     563                iine .GT. nimpp+nicbei-1 .OR. & 
     564                ijne .LT. njmpp+nicbdj-1 .OR. & 
     565                ijne .GT. njmpp+nicbej-1) THEN 
    566566               i = i + 1 
    567                WRITE(numicb,*) 'berg lost in halo: ', this%number(:),ine,jne 
     567               WRITE(numicb,*) 'berg lost in halo: ', this%number(:),iine,ijne 
    568568               WRITE(numicb,*) '                   ', nimpp, njmpp 
    569                WRITE(numicb,*) '                   ', icbdi, icbei, icbdj, icbej 
     569               WRITE(numicb,*) '                   ', nicbdi, nicbei, nicbdj, nicbej 
    570570               CALL flush( numicb ) 
    571571            ENDIF 
     
    590590      TYPE(iceberg)         , POINTER     :: tmpberg, this 
    591591      TYPE(point)           , POINTER     :: pt 
    592       INTEGER                             :: nbergs_to_send 
    593       INTEGER                             :: nbergs_to_rcv 
    594       INTEGER                             :: jiglo, jjglo, jk, jn 
    595       INTEGER                             :: jfldproc, kproc, kpts 
    596       INTEGER                             :: ine, jne 
    597       REAL(wp), DIMENSION(2)              :: sbergs, nbergs 
    598       INTEGER                             :: ml_req1, ml_req2, ml_err 
    599       INTEGER, DIMENSION(MPI_STATUS_SIZE) :: ml_stat 
     592      INTEGER                             :: ibergs_to_send 
     593      INTEGER                             :: ibergs_to_rcv 
     594      INTEGER                             :: iiglo, ijglo, jk, jn 
     595      INTEGER                             :: ifldproc, iproc, ipts 
     596      INTEGER                             :: iine, ijne 
     597      REAL(wp), DIMENSION(2)              :: zsbergs, znbergs 
     598      INTEGER                             :: iml_req1, iml_req2, iml_err 
     599      INTEGER, DIMENSION(MPI_STATUS_SIZE) :: iml_stat 
    600600 
    601601      ! set up indices of neighbouring processors 
    602602 
    603       ! icbfldproc is a list of unique processor numbers that this processor 
     603      ! nicbfldproc is a list of unique processor numbers that this processor 
    604604      ! exchanges with (including itself), so we loop over this array; since 
    605605      ! its of fixed size, the first -1 marks end of list of processors 
    606606      ! 
    607607      DO jn = 1, jpni 
    608          IF( icbfldproc(jn) == -1 ) EXIT 
    609          jfldproc = icbfldproc(jn) 
    610          nbergs_to_send = 0 
     608         IF( nicbfldproc(jn) == -1 ) EXIT 
     609         ifldproc = nicbfldproc(jn) 
     610         ibergs_to_send = 0 
    611611 
    612612         ! Find number of bergs that need to be exchanged 
    613          ! Pick out exchanges with processor jfldproc 
    614          ! if jfldproc is this processor then don't send 
     613         ! Pick out exchanges with processor ifldproc 
     614         ! if ifldproc is this processor then don't send 
    615615         ! 
    616616         IF( ASSOCIATED(first_berg) ) THEN 
     
    618618            DO WHILE (ASSOCIATED(this)) 
    619619               pt => this%current_point 
    620                ine = INT( pt%xi + 0.5 ) 
    621                jne = INT( pt%yj + 0.5 ) 
    622                kpts  = icbfldpts (ine-nimpp+1) 
    623                kproc = icbflddest(ine-nimpp+1) 
    624                IF( jne .GT. njmpp+icbej-1 ) THEN 
    625                   IF( kproc == jfldproc ) THEN 
     620               iine = INT( pt%xi + 0.5 ) 
     621               ijne = INT( pt%yj + 0.5 ) 
     622               ipts  = nicbfldpts (iine-nimpp+1) 
     623               iproc = nicbflddest(iine-nimpp+1) 
     624               IF( ijne .GT. njmpp+nicbej-1 ) THEN 
     625                  IF( iproc == ifldproc ) THEN 
    626626                     ! 
    627627                     ! moving across the cut line means both position and 
    628628                     ! velocity must change 
    629                      jjglo = INT( kpts/icbpack ) 
    630                      jiglo = kpts - icbpack*jjglo 
    631                      pt%xi = jiglo - ( pt%xi - REAL(ine,wp) ) 
    632                      pt%yj = jjglo - ( pt%yj - REAL(jne,wp) ) 
     629                     ijglo = INT( ipts/nicbpack ) 
     630                     iiglo = ipts - nicbpack*ijglo 
     631                     pt%xi = iiglo - ( pt%xi - REAL(iine,wp) ) 
     632                     pt%yj = ijglo - ( pt%yj - REAL(ijne,wp) ) 
    633633                     pt%uvel = -1._wp * pt%uvel 
    634634                     pt%vvel = -1._wp * pt%vvel 
    635635                     ! 
    636636                     ! now remove berg from list and pack it into a buffer 
    637                      IF( kproc /= narea ) THEN 
     637                     IF( iproc /= narea ) THEN 
    638638                        tmpberg => this 
    639                         nbergs_to_send = nbergs_to_send + 1 
     639                        ibergs_to_send = ibergs_to_send + 1 
    640640                        IF( nn_verbose_level >= 4 ) THEN 
    641                            WRITE(numicb,*) 'bergstep ',ktberg,' packing berg ',tmpberg%number(:),' for north fold' 
     641                           WRITE(numicb,*) 'bergstep ',nktberg,' packing berg ',tmpberg%number(:),' for north fold' 
    642642                           CALL flush( numicb ) 
    643643                        ENDIF 
    644                         CALL pack_berg_into_buffer( tmpberg, obuffer_f, nbergs_to_send) 
     644                        CALL pack_berg_into_buffer( tmpberg, obuffer_f, ibergs_to_send) 
    645645                        CALL delete_iceberg_from_list(first_berg, tmpberg) 
    646646                     ENDIF 
     
    652652         ENDIF 
    653653         if( nn_verbose_level >= 3) then 
    654             write(numicb,*) 'bergstep ',ktberg,' send nfld: ', nbergs_to_send 
     654            write(numicb,*) 'bergstep ',nktberg,' send nfld: ', ibergs_to_send 
    655655            call flush(numicb) 
    656656         endif 
     
    658658         ! if we're in this processor, then we've done everything we need to 
    659659         ! so go on to next element of loop 
    660          IF( jfldproc == narea ) CYCLE 
    661  
    662          sbergs(1) = nbergs_to_send 
    663          CALL mppsend( 21, sbergs(1), 1, jfldproc-1, ml_req1) 
    664          CALL mpprecv( 21, nbergs(2), 1 ) 
    665          IF( l_isend ) CALL mpi_wait( ml_req1, ml_stat, ml_err ) 
    666          nbergs_to_rcv = INT( nbergs(2) ) 
     660         IF( ifldproc == narea ) CYCLE 
     661 
     662         zsbergs(1) = ibergs_to_send 
     663         CALL mppsend( 21, zsbergs(1), 1, ifldproc-1, iml_req1) 
     664         CALL mpprecv( 21, znbergs(2), 1 ) 
     665         IF( l_isend ) CALL mpi_wait( iml_req1, iml_stat, iml_err ) 
     666         ibergs_to_rcv = INT( znbergs(2) ) 
    667667 
    668668         ! send bergs 
    669669 
    670          IF( nbergs_to_send > 0 )  & 
    671              CALL mppsend( 12, obuffer_f%data, nbergs_to_send*buffer_width, jfldproc-1, ml_req2 ) 
    672          IF( nbergs_to_rcv  > 0 ) THEN 
    673             CALL increase_ibuffer(ibuffer_f, nbergs_to_rcv) 
    674             CALL mpprecv( 12, ibuffer_f%data, nbergs_to_rcv*buffer_width ) 
    675          ENDIF 
    676          IF( nbergs_to_send > 0 .AND. l_isend ) CALL mpi_wait( ml_req2, ml_stat, ml_err ) 
    677          DO jk = 1, nbergs_to_rcv 
     670         IF( ibergs_to_send > 0 )  & 
     671             CALL mppsend( 12, obuffer_f%data, ibergs_to_send*pp_buffer_width, ifldproc-1, iml_req2 ) 
     672         IF( ibergs_to_rcv  > 0 ) THEN 
     673            CALL increase_ibuffer(ibuffer_f, ibergs_to_rcv) 
     674            CALL mpprecv( 12, ibuffer_f%data, ibergs_to_rcv*pp_buffer_width ) 
     675         ENDIF 
     676         IF( ibergs_to_send > 0 .AND. l_isend ) CALL mpi_wait( iml_req2, iml_stat, iml_err ) 
     677         DO jk = 1, ibergs_to_rcv 
    678678            IF( nn_verbose_level >= 4 ) THEN 
    679                WRITE(numicb,*) 'bergstep ',ktberg,' unpacking berg ',INT(ibuffer_f%data(16,jk)),' from north fold' 
     679               WRITE(numicb,*) 'bergstep ',nktberg,' unpacking berg ',INT(ibuffer_f%data(16,jk)),' from north fold' 
    680680               CALL flush( numicb ) 
    681681            ENDIF 
     
    704704   !!------------------------------------------------------------------------- 
    705705 
    706    SUBROUTINE dealloc_buffer(buff) 
     706   SUBROUTINE dealloc_buffer(pbuff) 
    707707      ! Arguments 
    708       TYPE(buffer), POINTER :: buff 
    709  
    710       IF( ASSOCIATED(buff) ) THEN 
    711          IF( ASSOCIATED(buff%data)) DEALLOCATE(buff%data) 
    712          DEALLOCATE(buff) 
     708      TYPE(buffer), POINTER :: pbuff 
     709 
     710      IF( ASSOCIATED(pbuff) ) THEN 
     711         IF( ASSOCIATED(pbuff%data)) DEALLOCATE(pbuff%data) 
     712         DEALLOCATE(pbuff) 
    713713      ENDIF 
    714714   END SUBROUTINE dealloc_buffer 
     
    716716   !!------------------------------------------------------------------------- 
    717717 
    718    SUBROUTINE pack_berg_into_buffer(berg, buff, n) 
     718   SUBROUTINE pack_berg_into_buffer(berg, pbuff, kb) 
    719719      ! Arguments 
    720720      TYPE(iceberg),            POINTER :: berg 
    721       TYPE(buffer) ,            POINTER :: buff 
    722       INTEGER      , INTENT(in)         :: n 
     721      TYPE(buffer) ,            POINTER :: pbuff 
     722      INTEGER      , INTENT(in)         :: kb 
    723723      ! Local 
    724724      INTEGER                           :: k 
    725725 
    726       IF( .NOT. ASSOCIATED(buff) ) CALL increase_buffer( buff, delta_buf ) 
    727       IF( n .GT. buff%size ) CALL increase_buffer( buff, delta_buf ) 
     726      IF( .NOT. ASSOCIATED(pbuff) ) CALL increase_buffer( pbuff, pp_delta_buf ) 
     727      IF( kb .GT. pbuff%size ) CALL increase_buffer( pbuff, pp_delta_buf ) 
    728728 
    729729      !! pack points into buffer 
    730730 
    731       buff%data( 1,n) = berg%current_point%lon 
    732       buff%data( 2,n) = berg%current_point%lat 
    733       buff%data( 3,n) = berg%current_point%uvel 
    734       buff%data( 4,n) = berg%current_point%vvel 
    735       buff%data( 5,n) = berg%current_point%xi 
    736       buff%data( 6,n) = berg%current_point%yj 
    737       buff%data( 7,n) = float(berg%current_point%year) 
    738       buff%data( 8,n) = berg%current_point%day 
    739       buff%data( 9,n) = berg%current_point%mass 
    740       buff%data(10,n) = berg%current_point%thickness 
    741       buff%data(11,n) = berg%current_point%width 
    742       buff%data(12,n) = berg%current_point%length 
    743       buff%data(13,n) = berg%current_point%mass_of_bits 
    744       buff%data(14,n) = berg%current_point%heat_density 
    745  
    746       buff%data(15,n) = berg%mass_scaling 
     731      pbuff%data( 1,kb) = berg%current_point%lon 
     732      pbuff%data( 2,kb) = berg%current_point%lat 
     733      pbuff%data( 3,kb) = berg%current_point%uvel 
     734      pbuff%data( 4,kb) = berg%current_point%vvel 
     735      pbuff%data( 5,kb) = berg%current_point%xi 
     736      pbuff%data( 6,kb) = berg%current_point%yj 
     737      pbuff%data( 7,kb) = float(berg%current_point%year) 
     738      pbuff%data( 8,kb) = berg%current_point%day 
     739      pbuff%data( 9,kb) = berg%current_point%mass 
     740      pbuff%data(10,kb) = berg%current_point%thickness 
     741      pbuff%data(11,kb) = berg%current_point%width 
     742      pbuff%data(12,kb) = berg%current_point%length 
     743      pbuff%data(13,kb) = berg%current_point%mass_of_bits 
     744      pbuff%data(14,kb) = berg%current_point%heat_density 
     745 
     746      pbuff%data(15,kb) = berg%mass_scaling 
    747747      DO k=1,nkounts 
    748          buff%data(15+k,n) = REAL( berg%number(k), wp ) 
     748         pbuff%data(15+k,kb) = REAL( berg%number(k), wp ) 
    749749      END DO 
    750750 
     
    753753   !!------------------------------------------------------------------------- 
    754754 
    755    SUBROUTINE unpack_berg_from_buffer(first, buff, n) 
     755   SUBROUTINE unpack_berg_from_buffer(first, pbuff, kb) 
    756756      ! Arguments 
    757757      TYPE(iceberg),             POINTER :: first 
    758       TYPE(buffer) ,             POINTER :: buff 
    759       INTEGER      , INTENT(in)          :: n 
     758      TYPE(buffer) ,             POINTER :: pbuff 
     759      INTEGER      , INTENT(in)          :: kb 
    760760      ! Local variables 
    761       LOGICAL                            :: lres 
    762761      TYPE(iceberg)                      :: currentberg 
    763762      TYPE(point)                        :: pt 
    764       INTEGER                           :: k 
    765  
    766       pt%lon            =      buff%data( 1,n) 
    767       pt%lat            =      buff%data( 2,n) 
    768       pt%uvel           =      buff%data( 3,n) 
    769       pt%vvel           =      buff%data( 4,n) 
    770       pt%xi             =      buff%data( 5,n) 
    771       pt%yj             =      buff%data( 6,n) 
    772       pt%year           = INT( buff%data( 7,n) ) 
    773       pt%day            =      buff%data( 8,n) 
    774       pt%mass           =      buff%data( 9,n) 
    775       pt%thickness      =      buff%data(10,n) 
    776       pt%width          =      buff%data(11,n) 
    777       pt%length         =      buff%data(12,n) 
    778       pt%mass_of_bits   =      buff%data(13,n) 
    779       pt%heat_density   =      buff%data(14,n) 
    780  
    781       currentberg%mass_scaling =      buff%data(15,n) 
    782       DO k=1,nkounts 
    783          currentberg%number(k) = INT( buff%data(15+k,n) ) 
     763      INTEGER                            :: ik 
     764 
     765      pt%lon            =      pbuff%data( 1,kb) 
     766      pt%lat            =      pbuff%data( 2,kb) 
     767      pt%uvel           =      pbuff%data( 3,kb) 
     768      pt%vvel           =      pbuff%data( 4,kb) 
     769      pt%xi             =      pbuff%data( 5,kb) 
     770      pt%yj             =      pbuff%data( 6,kb) 
     771      pt%year           = INT( pbuff%data( 7,kb) ) 
     772      pt%day            =      pbuff%data( 8,kb) 
     773      pt%mass           =      pbuff%data( 9,kb) 
     774      pt%thickness      =      pbuff%data(10,kb) 
     775      pt%width          =      pbuff%data(11,kb) 
     776      pt%length         =      pbuff%data(12,kb) 
     777      pt%mass_of_bits   =      pbuff%data(13,kb) 
     778      pt%heat_density   =      pbuff%data(14,kb) 
     779 
     780      currentberg%mass_scaling =      pbuff%data(15,kb) 
     781      DO ik=1,nkounts 
     782         currentberg%number(ik) = INT( pbuff%data(15+ik,kb) ) 
    784783      END DO 
    785784 
     
    790789   !!------------------------------------------------------------------------- 
    791790 
    792    SUBROUTINE increase_buffer(old,delta) 
     791   SUBROUTINE increase_buffer(old,kdelta) 
    793792      ! Arguments 
    794793      TYPE(buffer),             POINTER :: old 
    795       INTEGER     , INTENT(in)          :: delta 
     794      INTEGER     , INTENT(in)          :: kdelta 
    796795      ! Local variables 
    797796      TYPE(buffer),             POINTER :: new 
    798       INTEGER                           :: new_size 
     797      INTEGER                           :: inew_size 
    799798 
    800799      IF( .NOT. ASSOCIATED(old) ) THEN 
    801          new_size = delta 
     800         inew_size = kdelta 
    802801      ELSE 
    803          new_size = old%size + delta 
     802         inew_size = old%size + kdelta 
    804803      ENDIF 
    805804      ALLOCATE( new ) 
    806       ALLOCATE( new%data( buffer_width, new_size) ) 
    807       new%size = new_size 
     805      ALLOCATE( new%data( pp_buffer_width, inew_size) ) 
     806      new%size = inew_size 
    808807      IF( ASSOCIATED(old) ) THEN 
    809808         new%data(:,1:old%size) = old%data(:,1:old%size) 
     
    817816   !!------------------------------------------------------------------------- 
    818817 
    819    SUBROUTINE increase_ibuffer(old,delta) 
     818   SUBROUTINE increase_ibuffer(old,kdelta) 
    820819      ! Arguments 
    821820      TYPE(buffer),            POINTER :: old 
    822       INTEGER     , INTENT(in)         :: delta 
     821      INTEGER     , INTENT(in)         :: kdelta 
    823822      ! Local variables 
    824823      TYPE(buffer),            POINTER :: new 
    825       INTEGER                          :: new_size, old_size 
     824      INTEGER                          :: inew_size, iold_size 
    826825 
    827826      IF( .NOT. ASSOCIATED(old) ) THEN 
    828          new_size = delta + delta_buf 
    829          old_size = 0 
     827         inew_size = kdelta + pp_delta_buf 
     828         iold_size = 0 
    830829      ELSE 
    831          old_size = old%size 
    832          IF( delta .LT. old%size ) THEN 
    833             new_size = old%size + delta 
     830         iold_size = old%size 
     831         IF( kdelta .LT. old%size ) THEN 
     832            inew_size = old%size + kdelta 
    834833         ELSE 
    835             new_size = delta + delta_buf 
    836          ENDIF 
    837       ENDIF 
    838  
    839       IF( old_size .NE. new_size ) THEN 
     834            inew_size = kdelta + pp_delta_buf 
     835         ENDIF 
     836      ENDIF 
     837 
     838      IF( iold_size .NE. inew_size ) THEN 
    840839         ALLOCATE( new ) 
    841          ALLOCATE( new%data( buffer_width, new_size) ) 
    842          new%size = new_size 
     840         ALLOCATE( new%data( pp_buffer_width, inew_size) ) 
     841         new%size = inew_size 
    843842         IF( ASSOCIATED(old) ) THEN 
    844843            new%data(:,1:old%size) = old%data(:,1:old%size) 
     
    847846         ENDIF 
    848847         old => new 
    849         !WRITE( numicb,*) 'increase_ibuffer',narea,' increased to',new_size 
     848        !WRITE( numicb,*) 'increase_ibuffer',narea,' increased to',inew_size 
    850849      ENDIF 
    851850 
Note: See TracChangeset for help on using the changeset viewer.