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 2715 for trunk/NEMOGCM/NEMO/OPA_SRC/LBC – NEMO

Ignore:
Timestamp:
2011-03-30T17:58:35+02:00 (13 years ago)
Author:
rblod
Message:

First attempt to put dynamic allocation on the trunk

Location:
trunk/NEMOGCM/NEMO/OPA_SRC/LBC
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/NEMOGCM/NEMO/OPA_SRC/LBC/cla.F90

    r2442 r2715  
    3131   USE lib_mpp        ! distributed memory computing library 
    3232   USE lbclnk         ! ocean lateral boundary conditions (or mpp link) 
     33   USE lib_mpp        ! MPP library 
    3334 
    3435   IMPLICIT NONE 
     
    4344   !                                ! for Bab-el-Mandeb, Gibraltar, and Hormuz straits 
    4445    
    45    !                                                              !!! profile of hdiv for some straits 
    46    REAL(wp), DIMENSION (jpk) ::   hdiv_139_101, hdiv_139_101_kt    ! Gibraltar     strait, fixed & time evolving part (i,j)=(172,101) 
    47    REAL(wp), DIMENSION (jpk) ::   hdiv_139_102                     ! Gibraltar     strait, fixed part only            (i,j)=(139,102) 
    48    REAL(wp), DIMENSION (jpk) ::   hdiv_141_102, hdiv_141_102_kt    ! Gibraltar     strait, fixed & time evolving part (i,j)=(141,102) 
    49    REAL(wp), DIMENSION (jpk) ::   hdiv_161_88 , hdiv_161_88_kt     ! Bab-el-Mandeb strait, fixed & time evolving part (i,j)=(161,88) 
    50    REAL(wp), DIMENSION (jpk) ::   hdiv_161_87                      ! Bab-el-Mandeb strait, fixed part only            (i,j)=(161,87) 
    51    REAL(wp), DIMENSION (jpk) ::   hdiv_160_89 , hdiv_160_89_kt     ! Bab-el-Mandeb strait, fixed & time evolving part (i,j)=(160,89) 
    52    REAL(wp), DIMENSION (jpk) ::   hdiv_172_94                      ! Hormuz        strait, fixed part only            (i,j)=(172, 94) 
    53  
    54    REAL(wp), DIMENSION (jpk) ::   t_171_94_hor, s_171_94_hor       ! Temperature, salinity in the Hormuz strait 
     46   !                                           !   fixed part  !  time evolving    !!! profile of hdiv for some straits 
     47   REAL(wp), ALLOCATABLE, SAVE, DIMENSION (:) ::   hdiv_139_101, hdiv_139_101_kt    ! Gibraltar    (i,j)=(172,101) 
     48   REAL(wp), ALLOCATABLE, SAVE, DIMENSION (:) ::   hdiv_139_102                     ! Gibraltar     (i,j)=(139,102) 
     49   REAL(wp), ALLOCATABLE, SAVE, DIMENSION (:) ::   hdiv_141_102, hdiv_141_102_kt    ! Gibraltar    (i,j)=(141,102) 
     50   REAL(wp), ALLOCATABLE, SAVE, DIMENSION (:) ::   hdiv_161_88 , hdiv_161_88_kt     ! Bab-el-Mandeb (i,j)=(161,88) 
     51   REAL(wp), ALLOCATABLE, SAVE, DIMENSION (:) ::   hdiv_161_87                      ! Bab-el-Mandeb (i,j)=(161,87) 
     52   REAL(wp), ALLOCATABLE, SAVE, DIMENSION (:) ::   hdiv_160_89 , hdiv_160_89_kt     ! Bab-el-Mandeb (i,j)=(160,89) 
     53   REAL(wp), ALLOCATABLE, SAVE, DIMENSION (:) ::   hdiv_172_94                      ! Hormuz        (i,j)=(172, 94) 
     54 
     55   REAL(wp), ALLOCATABLE, SAVE, DIMENSION (:) ::   t_171_94_hor, s_171_94_hor       ! Temperature, salinity in Hormuz strait 
    5556    
    5657   !! * Substitutions 
     
    177178      !! ** Action  :   nbab, ngib, nhor   strait inside the local domain or not 
    178179      !!--------------------------------------------------------------------- 
    179       REAL(wp) ::   ztemp 
     180      REAL(wp) ::   ztemp   ! local scalar 
     181      INTEGER  ::   ierr    ! local integer 
    180182      !!--------------------------------------------------------------------- 
    181183      ! 
     
    184186      IF(lwp) WRITE(numout,*) '~~~~~~~~~' 
    185187      ! 
     188      !                           ! Allocate arrays for this module 
     189      ALLOCATE( hdiv_139_101(jpk) , hdiv_139_101_kt(jpk) ,     &    ! Gibraltar 
     190         &      hdiv_139_102(jpk) ,                            & 
     191         &      hdiv_141_102(jpk) , hdiv_141_102_kt(jpk) ,     & 
     192         &      hdiv_161_88 (jpk) , hdiv_161_88_kt (jpk) ,     &    ! Bab-el-Mandeb 
     193         &      hdiv_161_87 (jpk) ,                            &                      
     194         &      hdiv_160_89 (jpk) , hdiv_160_89_kt (jpk) ,     &     ! Hormuz 
     195         &      hdiv_172_94 (jpk) ,                            & 
     196         &      t_171_94_hor(jpk) , s_171_94_hor   (jpk) , STAT=ierr ) 
     197      IF( lk_mpp    )   CALL mpp_sum( ierr ) 
     198      IF( ierr /= 0 )   CALL ctl_stop( 'STOP', 'cla_init: unable to allocate arrays' ) 
     199      ! 
    186200      IF( .NOT.lk_dynspg_flt )   CALL ctl_stop( 'cla_init: Cross Land Advection works only with lk_dynspg_flt=T ' ) 
    187201      ! 
    188       IF( lk_vvl    )   CALL ctl_stop( 'cla_init: Cross Land Advection does not work with lk_vvl=T option' ) 
    189       ! 
    190       IF( jpk /= 31 )   CALL ctl_stop( 'cla_init: Cross Land Advection hard coded for ORCA_R2_L31' ) 
     202      IF( lk_vvl             )   CALL ctl_stop( 'cla_init: Cross Land Advection does not work with lk_vvl=T option' ) 
     203      ! 
     204      IF( jpk /= 31          )   CALL ctl_stop( 'cla_init: Cross Land Advection hard coded for ORCA_R2_L31' ) 
    191205      ! 
    192206      !                                        _|_______|_______|_ 
     
    723737   !!   Default key                                            Dummy module 
    724738   !!---------------------------------------------------------------------- 
    725    USE in_out_manager ! I/O manager 
     739   USE lib_mpp, ONLY:   ctl_stop 
    726740CONTAINS 
    727741   SUBROUTINE cla_init 
  • trunk/NEMOGCM/NEMO/OPA_SRC/LBC/lbcnfd.F90

    r2442 r2715  
    1212   !!   lbc_nfd_2d    : lateral boundary condition: North fold treatment for a 2D arrays   (lbc_nfd) 
    1313   !!---------------------------------------------------------------------- 
    14    USE oce            ! ocean dynamics and tracers    
    1514   USE dom_oce        ! ocean space and time domain  
    1615   USE in_out_manager ! I/O manager 
  • trunk/NEMOGCM/NEMO/OPA_SRC/LBC/lib_mpp.F90

    r2481 r2715  
    1818   !!            3.2  !  2009  (R. Benshila) SHMEM suppression, north fold in lbc_nfd 
    1919   !!            3.2  !  2009  (O. Marti)    add mpp_ini_znl  
     20   !!            4.0  !  2011  (G. Madec)  move ctl_ routines from in_out_manager 
     21   !!---------------------------------------------------------------------- 
     22 
     23   !!---------------------------------------------------------------------- 
     24   !!   ctl_stop   : update momentum and tracer Kz from a tke scheme 
     25   !!   ctl_warn   : initialization, namelist read, and parameters control 
     26   !!   ctl_opn    : Open file and check if required file is available. 
     27   !!   get_unit    : give the index of an unused logical unit 
    2028   !!---------------------------------------------------------------------- 
    2129#if   defined key_mpp_mpi   
     
    2331   !!   'key_mpp_mpi'             MPI massively parallel processing library 
    2432   !!---------------------------------------------------------------------- 
    25    !!   mynode      : indentify the processor unit 
    26    !!   mpp_lnk     : interface (defined in lbclnk) for message passing of 2d or 3d arrays (mpp_lnk_2d, mpp_lnk_3d) 
     33   !!   lib_mpp_alloc : allocate mpp arrays 
     34   !!   mynode        : indentify the processor unit 
     35   !!   mpp_lnk       : interface (defined in lbclnk) for message passing of 2d or 3d arrays (mpp_lnk_2d, mpp_lnk_3d) 
    2736   !!   mpp_lnk_3d_gather :  Message passing manadgement for two 3D arrays 
    28    !!   mpp_lnk_e   : interface (defined in lbclnk) for message passing of 2d array with extra halo (mpp_lnk_2d_e) 
    29    !!   mpprecv     : 
    30    !!   mppsend     :   SUBROUTINE mpp_ini_znl 
    31    !!   mppscatter  : 
    32    !!   mppgather   : 
    33    !!   mpp_min     : generic interface for mppmin_int , mppmin_a_int , mppmin_real, mppmin_a_real 
    34    !!   mpp_max     : generic interface for mppmax_int , mppmax_a_int , mppmax_real, mppmax_a_real 
    35    !!   mpp_sum     : generic interface for mppsum_int , mppsum_a_int , mppsum_real, mppsum_a_real 
    36    !!   mpp_minloc  : 
    37    !!   mpp_maxloc  : 
    38    !!   mppsync     : 
    39    !!   mppstop     : 
    40    !!   mppobc      : variant of mpp_lnk for open boundary condition 
     37   !!   mpp_lnk_e     : interface (defined in lbclnk) for message passing of 2d array with extra halo (mpp_lnk_2d_e) 
     38   !!   mpprecv         : 
     39   !!   mppsend       :   SUBROUTINE mpp_ini_znl 
     40   !!   mppscatter    : 
     41   !!   mppgather     : 
     42   !!   mpp_min       : generic interface for mppmin_int , mppmin_a_int , mppmin_real, mppmin_a_real 
     43   !!   mpp_max       : generic interface for mppmax_int , mppmax_a_int , mppmax_real, mppmax_a_real 
     44   !!   mpp_sum       : generic interface for mppsum_int , mppsum_a_int , mppsum_real, mppsum_a_real 
     45   !!   mpp_minloc    : 
     46   !!   mpp_maxloc    : 
     47   !!   mppsync       : 
     48   !!   mppstop       : 
     49   !!   mppobc        : variant of mpp_lnk for open boundary condition 
    4150   !!   mpp_ini_north : initialisation of north fold 
    4251   !!   mpp_lbc_north : north fold processors gathering 
    4352   !!   mpp_lbc_north_e : variant of mpp_lbc_north for extra outer halo 
    4453   !!---------------------------------------------------------------------- 
    45    !! History : 
    46    !!        !  94 (M. Guyon, J. Escobar, M. Imbard)  Original code 
    47    !!        !  97  (A.M. Treguier)  SHMEM additions 
    48    !!        !  98  (M. Imbard, J. Escobar, L. Colombet ) SHMEM and MPI 
    49    !!   9.0  !  03  (J.-M. Molines, G. Madec)  F90, free form 
    50    !!        !  04  (R. Bourdalle Badie)  isend option in mpi 
    51    !!        !  05  (G. Madec, S. Masson)  npolj=5,6 F-point & ice cases 
    52    !!        !  05  (R. Redler) Replacement of MPI_COMM_WORLD except for MPI_Abort 
    53    !!        !  09  (R. Benshila) SHMEM suppression, north fold in lbc_nfd 
    54    !!---------------------------------------------------------------------- 
    55    USE dom_oce                    ! ocean space and time domain  
    56    USE in_out_manager             ! I/O manager 
    57    USE lbcnfd                     ! north fold treatment 
     54   USE dom_oce        ! ocean space and time domain  
     55   USE lbcnfd         ! north fold treatment 
     56   USE in_out_manager ! I/O manager 
    5857 
    5958   IMPLICIT NONE 
    6059   PRIVATE 
    6160    
     61   PUBLIC   ctl_stop, ctl_warn, get_unit, ctl_opn 
    6262   PUBLIC   mynode, mppstop, mppsync, mpp_comm_free 
    6363   PUBLIC   mpp_ini_north, mpp_lbc_north, mpp_lbc_north_e 
     
    6565   PUBLIC   mpp_lnk_3d, mpp_lnk_3d_gather, mpp_lnk_2d, mpp_lnk_2d_e 
    6666   PUBLIC   mppobc, mpp_ini_ice, mpp_ini_znl 
     67   PUBLIC   mppsize 
     68   PUBLIC   lib_mpp_alloc   ! Called in nemogcm.F90 
    6769 
    6870   !! * Interfaces 
     
    120122   INTEGER ::   ndim_rank_ice   !  number of 'ice' processors 
    121123   INTEGER ::   n_ice_root      !  number (in the comm_ice) of proc 0 in the ice comm 
    122    INTEGER, DIMENSION(:), ALLOCATABLE ::   nrank_ice     ! dimension ndim_rank_ice 
     124   INTEGER, DIMENSION(:), ALLOCATABLE, SAVE ::   nrank_ice     ! dimension ndim_rank_ice 
    123125 
    124126   ! variables used for zonal integration 
     
    127129   INTEGER ::   ngrp_znl        ! group ID for the znl processors 
    128130   INTEGER ::   ndim_rank_znl   ! number of processors on the same zonal average 
    129    INTEGER, DIMENSION(:), ALLOCATABLE ::   nrank_znl  ! dimension ndim_rank_znl, number of the procs into the same znl domain 
     131   INTEGER, DIMENSION(:), ALLOCATABLE, SAVE ::   nrank_znl  ! dimension ndim_rank_znl, number of the procs into the same znl domain 
    130132    
    131133   ! North fold condition in mpp_mpi with jpni > 1 
     
    137139   INTEGER ::   njmppmax          ! value of njmpp for the processors of the northern line 
    138140   INTEGER ::   north_root        ! number (in the comm_opa) of proc 0 in the northern comm 
    139    INTEGER, DIMENSION(:), ALLOCATABLE ::   nrank_north   ! dimension ndim_rank_north 
     141   INTEGER, DIMENSION(:), ALLOCATABLE, SAVE ::   nrank_north   ! dimension ndim_rank_north 
    140142 
    141143   ! Type of send : standard, buffered, immediate 
     
    144146   INTEGER          ::   nn_buffer = 0       ! size of the buffer in case of mpi_bsend  
    145147       
    146    REAL(wp), ALLOCATABLE, DIMENSION(:) :: tampon  ! buffer in case of bsend 
     148   REAL(wp), DIMENSION(:), ALLOCATABLE, SAVE :: tampon  ! buffer in case of bsend 
    147149 
    148150   ! message passing arrays 
    149    REAL(wp), DIMENSION(jpi,jprecj,jpk,2,2) ::   t4ns, t4sn   ! 2 x 3d for north-south & south-north 
    150    REAL(wp), DIMENSION(jpj,jpreci,jpk,2,2) ::   t4ew, t4we   ! 2 x 3d for east-west & west-east 
    151    REAL(wp), DIMENSION(jpi,jprecj,jpk,2,2) ::   t4p1, t4p2   ! 2 x 3d for north fold 
    152    REAL(wp), DIMENSION(jpi,jprecj,jpk,2)   ::   t3ns, t3sn   ! 3d for north-south & south-north 
    153    REAL(wp), DIMENSION(jpj,jpreci,jpk,2)   ::   t3ew, t3we   ! 3d for east-west & west-east 
    154    REAL(wp), DIMENSION(jpi,jprecj,jpk,2)   ::   t3p1, t3p2   ! 3d for north fold 
    155    REAL(wp), DIMENSION(jpi,jprecj,2)       ::   t2ns, t2sn   ! 2d for north-south & south-north 
    156    REAL(wp), DIMENSION(jpj,jpreci,2)       ::   t2ew, t2we   ! 2d for east-west & west-east 
    157    REAL(wp), DIMENSION(jpi,jprecj,2)       ::   t2p1, t2p2   ! 2d for north fold 
    158    REAL(wp), DIMENSION(1-jpr2di:jpi+jpr2di,jprecj+jpr2dj,2) ::   tr2ns, tr2sn  ! 2d for north-south & south-north + extra outer halo 
    159    REAL(wp), DIMENSION(1-jpr2dj:jpj+jpr2dj,jpreci+jpr2di,2) ::   tr2ew, tr2we  ! 2d for east-west   & west-east   + extra outer halo 
     151   REAL(wp), DIMENSION(:,:,:,:,:), ALLOCATABLE, SAVE ::   t4ns, t4sn   ! 2 x 3d for north-south & south-north 
     152   REAL(wp), DIMENSION(:,:,:,:,:), ALLOCATABLE, SAVE ::   t4ew, t4we   ! 2 x 3d for east-west & west-east 
     153   REAL(wp), DIMENSION(:,:,:,:,:), ALLOCATABLE, SAVE ::   t4p1, t4p2   ! 2 x 3d for north fold 
     154   REAL(wp), DIMENSION(:,:,:,:)  , ALLOCATABLE, SAVE ::   t3ns, t3sn   ! 3d for north-south & south-north 
     155   REAL(wp), DIMENSION(:,:,:,:)  , ALLOCATABLE, SAVE ::   t3ew, t3we   ! 3d for east-west & west-east 
     156   REAL(wp), DIMENSION(:,:,:,:)  , ALLOCATABLE, SAVE ::   t3p1, t3p2   ! 3d for north fold 
     157   REAL(wp), DIMENSION(:,:,:)    , ALLOCATABLE, SAVE ::   t2ns, t2sn   ! 2d for north-south & south-north 
     158   REAL(wp), DIMENSION(:,:,:)    , ALLOCATABLE, SAVE ::   t2ew, t2we   ! 2d for east-west & west-east 
     159   REAL(wp), DIMENSION(:,:,:)    , ALLOCATABLE, SAVE ::   t2p1, t2p2   ! 2d for north fold 
     160   REAL(wp), DIMENSION(:,:,:)    , ALLOCATABLE, SAVE ::   tr2ns, tr2sn ! 2d for north-south & south-north + extra outer halo 
     161   REAL(wp), DIMENSION(:,:,:)    , ALLOCATABLE, SAVE ::   tr2ew, tr2we ! 2d for east-west   & west-east   + extra outer halo 
     162 
     163   ! Arrays used in mpp_lbc_north_3d() 
     164   REAL(wp), DIMENSION(:,:,:)  , ALLOCATABLE, SAVE   ::   ztab, znorthloc 
     165   REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE, SAVE   ::   znorthgloio 
     166 
     167   ! Arrays used in mpp_lbc_north_2d() 
     168   REAL(wp), DIMENSION(:,:)  , ALLOCATABLE, SAVE    ::   ztab_2d, znorthloc_2d 
     169   REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, SAVE    ::   znorthgloio_2d 
     170 
     171   ! Arrays used in mpp_lbc_north_e() 
     172   REAL(wp), DIMENSION(:,:)  , ALLOCATABLE, SAVE    ::   ztab_e, znorthloc_e 
     173   REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, SAVE    ::   znorthgloio_e 
     174 
    160175   !!---------------------------------------------------------------------- 
    161176   !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
    162177   !! $Id$ 
    163    !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 
     178   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
    164179   !!---------------------------------------------------------------------- 
    165  
    166180CONTAINS 
    167181 
    168    FUNCTION mynode(ldtxt, localComm) 
     182   INTEGER FUNCTION lib_mpp_alloc( kumout ) 
     183      !!---------------------------------------------------------------------- 
     184      !!              ***  routine lib_mpp_alloc  *** 
     185      !!---------------------------------------------------------------------- 
     186      INTEGER, INTENT(in) ::   kumout   ! ocean.output logical unit 
     187      !!---------------------------------------------------------------------- 
     188      ! 
     189      ALLOCATE( t4ns(jpi,jprecj,jpk,2,2) , t4sn(jpi,jprecj,jpk,2,2) ,                                            & 
     190         &      t4ew(jpj,jpreci,jpk,2,2) , t4we(jpj,jpreci,jpk,2,2) ,                                            & 
     191         &      t4p1(jpi,jprecj,jpk,2,2) , t4p2(jpi,jprecj,jpk,2,2) ,                                            & 
     192         &      t3ns(jpi,jprecj,jpk,2)   , t3sn(jpi,jprecj,jpk,2)   ,                                            & 
     193         &      t3ew(jpj,jpreci,jpk,2)   , t3we(jpj,jpreci,jpk,2)   ,                                            & 
     194         &      t3p1(jpi,jprecj,jpk,2)   , t3p2(jpi,jprecj,jpk,2)   ,                                            & 
     195         &      t2ns(jpi,jprecj    ,2)   , t2sn(jpi,jprecj    ,2)   ,                                            & 
     196         &      t2ew(jpj,jpreci    ,2)   , t2we(jpj,jpreci    ,2)   ,                                            & 
     197         &      t2p1(jpi,jprecj    ,2)   , t2p2(jpi,jprecj    ,2)   ,                                            & 
     198         ! 
     199         &      tr2ns(1-jpr2di:jpi+jpr2di,jprecj+jpr2dj,2) ,                                                     & 
     200         &      tr2sn(1-jpr2di:jpi+jpr2di,jprecj+jpr2dj,2) ,                                                     & 
     201         &      tr2ew(1-jpr2dj:jpj+jpr2dj,jpreci+jpr2di,2) ,                                                     & 
     202         &      tr2we(1-jpr2dj:jpj+jpr2dj,jpreci+jpr2di,2) ,                                                     & 
     203         ! 
     204         &      ztab(jpiglo,4,jpk) , znorthloc(jpi,4,jpk) , znorthgloio(jpi,4,jpk,jpni) ,                        & 
     205         ! 
     206         &      ztab_2d(jpiglo,4)  , znorthloc_2d(jpi,4)  , znorthgloio_2d(jpi,4,jpni)  ,                        & 
     207         ! 
     208         &      ztab_e(jpiglo,4+2*jpr2dj) , znorthloc_e(jpi,4+2*jpr2dj) , znorthgloio_e(jpi,4+2*jpr2dj,jpni) ,   & 
     209         ! 
     210         &      STAT=lib_mpp_alloc ) 
     211         ! 
     212      IF( lib_mpp_alloc /= 0 ) THEN 
     213         WRITE(kumout,cform_war) 
     214         WRITE(kumout,*) 'lib_mpp_alloc : failed to allocate arrays' 
     215      ENDIF 
     216      ! 
     217   END FUNCTION lib_mpp_alloc 
     218 
     219 
     220   FUNCTION mynode( ldtxt, kumnam, kstop, localComm ) 
    169221      !!---------------------------------------------------------------------- 
    170222      !!                  ***  routine mynode  *** 
    171223      !!                     
    172224      !! ** Purpose :   Find processor unit 
    173       !! 
    174225      !!---------------------------------------------------------------------- 
    175226      CHARACTER(len=*),DIMENSION(:), INTENT(  out) ::   ldtxt  
     227      INTEGER                      , INTENT(in   ) ::   kumnam       ! namelist logical unit  
     228      INTEGER                      , INTENT(inout) ::   kstop        ! stop indicator  
    176229      INTEGER, OPTIONAL            , INTENT(in   ) ::   localComm 
     230      ! 
    177231      INTEGER ::   mynode, ierr, code, ji, ii 
    178232      LOGICAL ::   mpi_was_called 
    179        
    180       NAMELIST/nammpp/ cn_mpi_send, nn_buffer 
     233      ! 
     234      NAMELIST/nammpp/ cn_mpi_send, nn_buffer, jpni, jpnj, jpnij 
    181235      !!---------------------------------------------------------------------- 
    182236      ! 
     
    186240      WRITE(ldtxt(ii),*) '~~~~~~ '                                                                ;   ii = ii + 1 
    187241      ! 
    188       REWIND( numnam )               ! Namelist namrun : parameters of the run 
    189       READ  ( numnam, nammpp ) 
     242      jpni = -1; jpnj = -1; jpnij = -1 
     243      REWIND( kumnam )               ! Namelist namrun : parameters of the run 
     244      READ  ( kumnam, nammpp ) 
    190245      !                              ! control print 
    191246      WRITE(ldtxt(ii),*) '   Namelist nammpp'                                                     ;   ii = ii + 1 
    192247      WRITE(ldtxt(ii),*) '      mpi send type                      cn_mpi_send = ', cn_mpi_send   ;   ii = ii + 1 
    193248      WRITE(ldtxt(ii),*) '      size in bytes of exported buffer   nn_buffer   = ', nn_buffer     ;   ii = ii + 1 
     249 
     250      IF(jpnij < 1)THEN 
     251         ! If jpnij is not specified in namelist then we calculate it - this 
     252         ! means there will be no land cutting out. 
     253         jpnij = jpni * jpnj 
     254      END IF 
     255 
     256      IF( (jpni < 1) .OR. (jpnj < 1) )THEN 
     257         WRITE(ldtxt(ii),*) '      jpni, jpnj and jpnij will be calculated automatically'; ii = ii + 1 
     258      ELSE 
     259         WRITE(ldtxt(ii),*) '      processor grid extent in i         jpni = ',jpni; ii = ii + 1 
     260         WRITE(ldtxt(ii),*) '      processor grid extent in j         jpnj = ',jpnj; ii = ii + 1 
     261         WRITE(ldtxt(ii),*) '      number of local domains           jpnij = ',jpnij; ii = ii +1 
     262      END IF 
    194263 
    195264      CALL mpi_initialized ( mpi_was_called, code ) 
     
    217286            WRITE(ldtxt(ii),cform_err)                                                            ;   ii = ii + 1 
    218287            WRITE(ldtxt(ii),*) '           bad value for cn_mpi_send = ', cn_mpi_send             ;   ii = ii + 1 
    219             nstop = nstop + 1 
     288            kstop = kstop + 1 
    220289         END SELECT 
    221290      ELSE IF ( PRESENT(localComm) .and. .not. mpi_was_called ) THEN 
    222291         WRITE(ldtxt(ii),*) ' lib_mpp: You cannot provide a local communicator '                  ;   ii = ii + 1 
    223292         WRITE(ldtxt(ii),*) '          without calling MPI_Init before ! '                        ;   ii = ii + 1 
    224          nstop = nstop + 1 
     293         kstop = kstop + 1 
    225294      ELSE 
    226295         SELECT CASE ( cn_mpi_send ) 
     
    238307            WRITE(ldtxt(ii),cform_err)                                                            ;   ii = ii + 1 
    239308            WRITE(ldtxt(ii),*) '           bad value for cn_mpi_send = ', cn_mpi_send             ;   ii = ii + 1 
    240             nstop = nstop + 1 
     309            kstop = kstop + 1 
    241310         END SELECT 
    242311         ! 
     
    16501719 
    16511720 
    1652    SUBROUTINE mppobc( ptab, kd1, kd2, kl, kk, ktype, kij ) 
     1721   SUBROUTINE mppobc( ptab, kd1, kd2, kl, kk, ktype, kij , kumout) 
    16531722      !!---------------------------------------------------------------------- 
    16541723      !!                  ***  routine mppobc  *** 
     
    16701739      !! 
    16711740      !!---------------------------------------------------------------------- 
     1741      USE wrk_nemo, ONLY:   wrk_in_use, wrk_not_released 
     1742      USE wrk_nemo, ONLY:   ztab => wrk_2d_1 
     1743      ! 
    16721744      INTEGER , INTENT(in   )                     ::   kd1, kd2   ! starting and ending indices 
    16731745      INTEGER , INTENT(in   )                     ::   kl         ! index of open boundary 
     
    16761748      !                                                           !  = 1  north/south  ;  = 2  east/west 
    16771749      INTEGER , INTENT(in   )                     ::   kij        ! horizontal dimension 
     1750      INTEGER , INTENT(in   )                     ::   kumout     ! ocean.output logical unit 
    16781751      REAL(wp), INTENT(inout), DIMENSION(kij,kk)  ::   ptab       ! variable array 
    1679       !!  
    1680       INTEGER  ::   ji, jj, jk, jl   ! dummy loop indices 
    1681       INTEGER  ::   iipt0, iipt1, ilpt1   ! temporary integers 
    1682       INTEGER  ::   ijpt0, ijpt1          !    -          - 
    1683       INTEGER  ::   imigr, iihom, ijhom   !    -          - 
     1752      ! 
     1753      INTEGER ::   ji, jj, jk, jl        ! dummy loop indices 
     1754      INTEGER ::   iipt0, iipt1, ilpt1   ! local integers 
     1755      INTEGER ::   ijpt0, ijpt1          !   -       - 
     1756      INTEGER ::   imigr, iihom, ijhom   !   -       - 
    16841757      INTEGER ::   ml_req1, ml_req2, ml_err    ! for key_mpi_isend 
    16851758      INTEGER ::   ml_stat(MPI_STATUS_SIZE)    ! for key_mpi_isend 
    1686       REAL(wp), DIMENSION(jpi,jpj) ::   ztab   ! temporary workspace 
    1687       !!---------------------------------------------------------------------- 
     1759      !!---------------------------------------------------------------------- 
     1760 
     1761      IF( wrk_in_use(2, 1) ) THEN 
     1762         WRITE(kumout, cform_err) 
     1763         WRITE(kumout,*) 'mppobc : requested workspace array unavailable' 
     1764         CALL mppstop 
     1765      ENDIF 
    16881766 
    16891767      ! boundary condition initialization 
     
    17041782         ilpt1 = MAX( 1, MIN(kd2 - njmpp+1, nlcj     ) ) 
    17051783      ELSE 
    1706          CALL ctl_stop( 'mppobc: bad ktype' ) 
     1784         WRITE(kumout, cform_err) 
     1785         WRITE(kumout,*) 'mppobc : bad ktype' 
     1786         CALL mppstop 
    17071787      ENDIF 
    17081788       
     
    18341914      END DO 
    18351915      ! 
     1916      IF( wrk_not_released(2, 1) ) THEN 
     1917         WRITE(kumout, cform_err) 
     1918         WRITE(kumout,*) 'mppobc : failed to release workspace array' 
     1919         CALL mppstop 
     1920      ENDIF 
     1921      ! 
    18361922   END SUBROUTINE mppobc 
    18371923    
     
    18501936 
    18511937 
    1852    SUBROUTINE mpp_ini_ice( pindic ) 
     1938   SUBROUTINE mpp_ini_ice( pindic, kumout ) 
    18531939      !!---------------------------------------------------------------------- 
    18541940      !!               ***  routine mpp_ini_ice  *** 
     
    18721958      !! 
    18731959      !!---------------------------------------------------------------------- 
    1874       INTEGER, INTENT(in) :: pindic 
    1875       !! 
    1876       INTEGER :: ierr 
     1960      INTEGER, INTENT(in) ::   pindic 
     1961      INTEGER, INTENT(in) ::   kumout   ! ocean.output logical unit 
     1962      !! 
    18771963      INTEGER :: jjproc 
    1878       INTEGER :: ii 
    1879       INTEGER, DIMENSION(jpnij) :: kice 
    1880       INTEGER, DIMENSION(jpnij) :: zwork 
    1881       !!---------------------------------------------------------------------- 
    1882       ! 
     1964      INTEGER :: ii, ierr 
     1965      INTEGER, ALLOCATABLE, DIMENSION(:) ::   kice 
     1966      INTEGER, ALLOCATABLE, DIMENSION(:) ::   zwork 
     1967      !!---------------------------------------------------------------------- 
     1968      ! 
     1969      ! Since this is just an init routine and these arrays are of length jpnij 
     1970      ! then don't use wrk_nemo module - just allocate and deallocate. 
     1971      ALLOCATE( kice(jpnij), zwork(jpnij), STAT=ierr ) 
     1972      IF( ierr /= 0 ) THEN 
     1973         WRITE(kumout, cform_err) 
     1974         WRITE(kumout,*) 'mpp_ini_ice : failed to allocate 2, 1D arrays (jpnij in length)' 
     1975         CALL mppstop 
     1976      ENDIF 
     1977 
    18831978      ! Look for how many procs with sea-ice 
    18841979      ! 
     
    18931988 
    18941989      ! Allocate the right size to nrank_north 
    1895 #if ! defined key_agrif 
    18961990      IF( ALLOCATED ( nrank_ice ) )   DEALLOCATE( nrank_ice ) 
    1897 #else 
    1898       IF( ASSOCIATED( nrank_ice ) )   DEALLOCATE( nrank_ice ) 
    1899 #endif 
    19001991      ALLOCATE( nrank_ice(ndim_rank_ice) ) 
    19011992      ! 
     
    19222013      ! CALL MPI_GROUP_TRANSLATE_RANKS(ngrp_ice,1,0,ngrp_world,n_ice_root,ierr) 
    19232014      ! 
     2015      DEALLOCATE(kice, zwork) 
     2016      ! 
    19242017   END SUBROUTINE mpp_ini_ice 
    19252018 
    19262019 
    1927    SUBROUTINE mpp_ini_znl 
     2020   SUBROUTINE mpp_ini_znl( kumout ) 
    19282021      !!---------------------------------------------------------------------- 
    19292022      !!               ***  routine mpp_ini_znl  *** 
     
    19442037      !! 
    19452038      !!---------------------------------------------------------------------- 
    1946       INTEGER :: ierr 
    1947       INTEGER :: jproc 
    1948       INTEGER :: ii 
    1949       INTEGER, DIMENSION(jpnij) :: kwork 
    1950       ! 
     2039      INTEGER, INTENT(in) ::   kumout   ! ocean.output logical units 
     2040      ! 
     2041      INTEGER :: jproc      ! dummy loop integer 
     2042      INTEGER :: ierr, ii   ! local integer 
     2043      INTEGER, ALLOCATABLE, DIMENSION(:) ::   kwork 
     2044      !!---------------------------------------------------------------------- 
    19512045      !-$$     WRITE (numout,*) 'mpp_ini_znl ', nproc, ' - ngrp_world     : ', ngrp_world 
    19522046      !-$$     WRITE (numout,*) 'mpp_ini_znl ', nproc, ' - mpi_comm_world : ', mpi_comm_world 
    19532047      !-$$     WRITE (numout,*) 'mpp_ini_znl ', nproc, ' - mpi_comm_opa   : ', mpi_comm_opa 
    19542048      ! 
    1955       IF ( jpnj == 1 ) THEN 
     2049      ALLOCATE( kwork(jpnij), STAT=ierr ) 
     2050      IF( ierr /= 0 ) THEN 
     2051         WRITE(kumout, cform_err) 
     2052         WRITE(kumout,*) 'mpp_ini_znl : failed to allocate 1D array of length jpnij' 
     2053         CALL mppstop 
     2054      ENDIF 
     2055 
     2056      IF( jpnj == 1 ) THEN 
    19562057         ngrp_znl  = ngrp_world 
    19572058         ncomm_znl = mpi_comm_opa 
     
    19722073         !-$$        CALL flush(numout) 
    19732074         ! Allocate the right size to nrank_znl 
    1974 #if ! defined key_agrif 
    19752075         IF (ALLOCATED (nrank_znl)) DEALLOCATE(nrank_znl) 
    1976 #else 
    1977          IF (ASSOCIATED(nrank_znl)) DEALLOCATE(nrank_znl) 
    1978 #endif 
    19792076         ALLOCATE(nrank_znl(ndim_rank_znl)) 
    19802077         ii = 0      
     
    20162113      END IF 
    20172114 
     2115      DEALLOCATE(kwork) 
     2116 
    20182117   END SUBROUTINE mpp_ini_znl 
    20192118 
     
    20552154      ! 
    20562155      ! Allocate the right size to nrank_north 
    2057 #if ! defined key_agrif 
    20582156      IF (ALLOCATED (nrank_north)) DEALLOCATE(nrank_north) 
    2059 #else 
    2060       IF (ASSOCIATED(nrank_north)) DEALLOCATE(nrank_north) 
    2061 #endif 
    20622157      ALLOCATE( nrank_north(ndim_rank_north) ) 
    20632158 
     
    21062201      INTEGER ::   ierr, itaille, ildi, ilei, iilb 
    21072202      INTEGER ::   ijpj, ijpjm1, ij, iproc 
    2108       REAL(wp), DIMENSION(jpiglo,4,jpk)      ::   ztab 
    2109       REAL(wp), DIMENSION(jpi   ,4,jpk)      ::   znorthloc 
    2110       REAL(wp), DIMENSION(jpi   ,4,jpk,jpni) ::   znorthgloio 
    21112203      !!---------------------------------------------------------------------- 
    21122204      !    
     
    21722264      INTEGER ::   ierr, itaille, ildi, ilei, iilb 
    21732265      INTEGER ::   ijpj, ijpjm1, ij, iproc 
    2174       REAL(wp), DIMENSION(jpiglo,4)      ::   ztab 
    2175       REAL(wp), DIMENSION(jpi   ,4)      ::   znorthloc 
    2176       REAL(wp), DIMENSION(jpi   ,4,jpni) ::   znorthgloio 
    21772266      !!---------------------------------------------------------------------- 
    21782267      ! 
    21792268      ijpj   = 4 
    21802269      ijpjm1 = 3 
    2181       ztab(:,:) = 0.e0 
    2182       ! 
    2183       DO jj = nlcj-ijpj+1, nlcj             ! put in znorthloc the last 4 jlines of pt2d 
     2270      ztab_2d(:,:) = 0.e0 
     2271      ! 
     2272      DO jj = nlcj-ijpj+1, nlcj             ! put in znorthloc_2d the last 4 jlines of pt2d 
    21842273         ij = jj - nlcj + ijpj 
    2185          znorthloc(:,ij) = pt2d(:,jj) 
     2274         znorthloc_2d(:,ij) = pt2d(:,jj) 
    21862275      END DO 
    21872276 
    2188       !                                     ! Build in procs of ncomm_north the znorthgloio 
     2277      !                                     ! Build in procs of ncomm_north the znorthgloio_2d 
    21892278      itaille = jpi * ijpj 
    2190       CALL MPI_ALLGATHER( znorthloc  , itaille, MPI_DOUBLE_PRECISION,        & 
    2191          &                znorthgloio, itaille, MPI_DOUBLE_PRECISION, ncomm_north, ierr ) 
     2279      CALL MPI_ALLGATHER( znorthloc_2d  , itaille, MPI_DOUBLE_PRECISION,        & 
     2280         &                znorthgloio_2d, itaille, MPI_DOUBLE_PRECISION, ncomm_north, ierr ) 
    21922281      ! 
    21932282      DO jr = 1, ndim_rank_north            ! recover the global north array 
     
    21982287         DO jj = 1, 4 
    21992288            DO ji = ildi, ilei 
    2200                ztab(ji+iilb-1,jj) = znorthgloio(ji,jj,jr) 
     2289               ztab_2d(ji+iilb-1,jj) = znorthgloio_2d(ji,jj,jr) 
    22012290            END DO 
    22022291         END DO 
    22032292      END DO 
    22042293      ! 
    2205       CALL lbc_nfd( ztab, cd_type, psgn )   ! North fold boundary condition 
     2294      CALL lbc_nfd( ztab_2d, cd_type, psgn )   ! North fold boundary condition 
    22062295      ! 
    22072296      ! 
     
    22092298         ij = jj - nlcj + ijpj 
    22102299         DO ji = 1, nlci 
    2211             pt2d(ji,jj) = ztab(ji+nimpp-1,ij) 
     2300            pt2d(ji,jj) = ztab_2d(ji+nimpp-1,ij) 
    22122301         END DO 
    22132302      END DO 
     
    22392328      INTEGER ::   ierr, itaille, ildi, ilei, iilb 
    22402329      INTEGER ::   ijpj, ij, iproc 
    2241       REAL(wp), DIMENSION(jpiglo,4+2*jpr2dj)      ::   ztab 
    2242       REAL(wp), DIMENSION(jpi   ,4+2*jpr2dj)      ::   znorthloc 
    2243       REAL(wp), DIMENSION(jpi   ,4+2*jpr2dj,jpni) ::   znorthgloio 
    22442330      !!---------------------------------------------------------------------- 
    22452331      ! 
    22462332      ijpj=4 
    2247       ztab(:,:) = 0.e0 
     2333      ztab_e(:,:) = 0.e0 
    22482334 
    22492335      ij=0 
    2250       ! put in znorthloc the last 4 jlines of pt2d 
     2336      ! put in znorthloc_e the last 4 jlines of pt2d 
    22512337      DO jj = nlcj - ijpj + 1 - jpr2dj, nlcj +jpr2dj 
    22522338         ij = ij + 1 
    22532339         DO ji = 1, jpi 
    2254             znorthloc(ji,ij)=pt2d(ji,jj) 
     2340            znorthloc_e(ji,ij)=pt2d(ji,jj) 
    22552341         END DO 
    22562342      END DO 
    22572343      ! 
    22582344      itaille = jpi * ( ijpj + 2 * jpr2dj ) 
    2259       CALL MPI_ALLGATHER( znorthloc(1,1)    , itaille, MPI_DOUBLE_PRECISION,    & 
    2260          &                znorthgloio(1,1,1), itaille, MPI_DOUBLE_PRECISION, ncomm_north, ierr ) 
     2345      CALL MPI_ALLGATHER( znorthloc_e(1,1)  , itaille, MPI_DOUBLE_PRECISION,    & 
     2346         &                znorthgloio_e(1,1,1), itaille, MPI_DOUBLE_PRECISION, ncomm_north, ierr ) 
    22612347      ! 
    22622348      DO jr = 1, ndim_rank_north            ! recover the global north array 
     
    22672353         DO jj = 1, ijpj+2*jpr2dj 
    22682354            DO ji = ildi, ilei 
    2269                ztab(ji+iilb-1,jj) = znorthgloio(ji,jj,jr) 
     2355               ztab_e(ji+iilb-1,jj) = znorthgloio_e(ji,jj,jr) 
    22702356            END DO 
    22712357         END DO 
     
    22752361      ! 2. North-Fold boundary conditions 
    22762362      ! ---------------------------------- 
    2277       CALL lbc_nfd( ztab(:,:), cd_type, psgn, pr2dj = jpr2dj ) 
     2363      CALL lbc_nfd( ztab_e(:,:), cd_type, psgn, pr2dj = jpr2dj ) 
    22782364 
    22792365      ij = jpr2dj 
     
    22822368      ij  = ij +1  
    22832369         DO ji= 1, nlci 
    2284             pt2d(ji,jj) = ztab(ji+nimpp-1,ij) 
     2370            pt2d(ji,jj) = ztab_e(ji+nimpp-1,ij) 
    22852371         END DO 
    22862372      END DO 
     
    23352421         ! Buffer allocation and attachment 
    23362422         ALLOCATE( tampon(nn_buffer), stat = ierr ) 
    2337          IF (ierr /= 0) THEN  
     2423         IF( ierr /= 0 ) THEN  
    23382424            DO ji = 1, SIZE(ldtxt)  
    23392425               IF( TRIM(ldtxt(ji)) /= '' )   WRITE(*,*) ldtxt(ji)      ! control print of mynode 
     
    23832469   !!   Default case:            Dummy module        share memory computing 
    23842470   !!---------------------------------------------------------------------- 
     2471   USE in_out_manager 
    23852472 
    23862473   INTERFACE mpp_sum 
     
    24032490   END INTERFACE 
    24042491 
    2405  
    24062492   LOGICAL, PUBLIC, PARAMETER ::   lk_mpp = .FALSE.      !: mpp flag 
    24072493   INTEGER :: ncomm_ice 
    2408  
     2494   !!---------------------------------------------------------------------- 
    24092495CONTAINS 
    24102496 
    2411    FUNCTION mynode( ldtxt, localComm ) RESULT (function_value) 
    2412       CHARACTER(len=*),DIMENSION(:), INTENT(  out) ::   ldtxt  
     2497   INTEGER FUNCTION lib_mpp_alloc(kumout)          ! Dummy function 
     2498      INTEGER, INTENT(in) ::   kumout 
     2499      lib_mpp_alloc = 0 
     2500   END FUNCTION lib_mpp_alloc 
     2501 
     2502   FUNCTION mynode( ldtxt, kumnam, kstop, localComm ) RESULT (function_value) 
    24132503      INTEGER, OPTIONAL            , INTENT(in   ) ::   localComm 
     2504      CHARACTER(len=*),DIMENSION(:) ::   ldtxt  
     2505      INTEGER ::   kumnam, kstop 
    24142506      IF( PRESENT( localComm ) .OR. .NOT.PRESENT( localComm ) )   function_value = 0 
    24152507      IF( .FALSE. )   ldtxt(:) = 'never done' 
     
    25042596   END SUBROUTINE mppmin_int 
    25052597 
    2506    SUBROUTINE mppobc_1d( parr, kd1, kd2, kl, kk, ktype, kij ) 
    2507       INTEGER  ::   kd1, kd2, kl , kk, ktype, kij 
     2598   SUBROUTINE mppobc_1d( parr, kd1, kd2, kl, kk, ktype, kij, knum ) 
     2599      INTEGER  ::   kd1, kd2, kl , kk, ktype, kij, knum 
    25082600      REAL, DIMENSION(:) ::   parr           ! variable array 
    2509       WRITE(*,*) 'mppobc: You should not have seen this print! error?', parr(1), kd1, kd2, kl, kk, ktype, kij 
     2601      WRITE(*,*) 'mppobc: You should not have seen this print! error?', parr(1), kd1, kd2, kl, kk, ktype, kij, knum 
    25102602   END SUBROUTINE mppobc_1d 
    25112603 
    2512    SUBROUTINE mppobc_2d( parr, kd1, kd2, kl, kk, ktype, kij ) 
    2513       INTEGER  ::   kd1, kd2, kl , kk, ktype, kij 
     2604   SUBROUTINE mppobc_2d( parr, kd1, kd2, kl, kk, ktype, kij, knum ) 
     2605      INTEGER  ::   kd1, kd2, kl , kk, ktype, kij, knum 
    25142606      REAL, DIMENSION(:,:) ::   parr           ! variable array 
    2515       WRITE(*,*) 'mppobc: You should not have seen this print! error?', parr(1,1), kd1, kd2, kl, kk, ktype, kij 
     2607      WRITE(*,*) 'mppobc: You should not have seen this print! error?', parr(1,1), kd1, kd2, kl, kk, ktype, kij, knum 
    25162608   END SUBROUTINE mppobc_2d 
    25172609 
    2518    SUBROUTINE mppobc_3d( parr, kd1, kd2, kl, kk, ktype, kij ) 
    2519       INTEGER  ::   kd1, kd2, kl , kk, ktype, kij 
     2610   SUBROUTINE mppobc_3d( parr, kd1, kd2, kl, kk, ktype, kij, knum ) 
     2611      INTEGER  ::   kd1, kd2, kl , kk, ktype, kij, knum 
    25202612      REAL, DIMENSION(:,:,:) ::   parr           ! variable array 
    2521       WRITE(*,*) 'mppobc: You should not have seen this print! error?', parr(1,1,1), kd1, kd2, kl, kk, ktype, kij 
     2613      WRITE(*,*) 'mppobc: You should not have seen this print! error?', parr(1,1,1), kd1, kd2, kl, kk, ktype, kij, knum 
    25222614   END SUBROUTINE mppobc_3d 
    25232615 
    2524    SUBROUTINE mppobc_4d( parr, kd1, kd2, kl, kk, ktype, kij ) 
    2525       INTEGER  ::   kd1, kd2, kl , kk, ktype, kij 
     2616   SUBROUTINE mppobc_4d( parr, kd1, kd2, kl, kk, ktype, kij, knum ) 
     2617      INTEGER  ::   kd1, kd2, kl , kk, ktype, kij, knum 
    25262618      REAL, DIMENSION(:,:,:,:) ::   parr           ! variable array 
    2527       WRITE(*,*) 'mppobc: You should not have seen this print! error?', parr(1,1,1,1), kd1, kd2, kl, kk, ktype, kij 
     2619      WRITE(*,*) 'mppobc: You should not have seen this print! error?', parr(1,1,1,1), kd1, kd2, kl, kk, ktype, kij, knum 
    25282620   END SUBROUTINE mppobc_4d 
    25292621 
     
    25602652   END SUBROUTINE mppstop 
    25612653 
    2562    SUBROUTINE mpp_ini_ice( kcom ) 
    2563       INTEGER :: kcom 
    2564       WRITE(*,*) 'mpp_ini_ice: You should not have seen this print! error?', kcom 
     2654   SUBROUTINE mpp_ini_ice( kcom, knum ) 
     2655      INTEGER :: kcom, knum 
     2656      WRITE(*,*) 'mpp_ini_ice: You should not have seen this print! error?', kcom, knum 
    25652657   END SUBROUTINE mpp_ini_ice 
    25662658 
    2567    SUBROUTINE mpp_ini_znl 
    2568       WRITE(*,*) 'mpp_ini_znl: You should not have seen this print! error?' 
     2659   SUBROUTINE mpp_ini_znl( knum ) 
     2660      INTEGER :: knum 
     2661      WRITE(*,*) 'mpp_ini_znl: You should not have seen this print! error?', knum 
    25692662   END SUBROUTINE mpp_ini_znl 
    25702663 
     
    25742667   END SUBROUTINE mpp_comm_free 
    25752668#endif 
     2669 
     2670   !!---------------------------------------------------------------------- 
     2671   !!   All cases:         ctl_stop, ctl_warn, get_unit, ctl_opn   routines 
     2672   !!---------------------------------------------------------------------- 
     2673 
     2674   SUBROUTINE ctl_stop( cd1, cd2, cd3, cd4, cd5 ,   & 
     2675      &                 cd6, cd7, cd8, cd9, cd10 ) 
     2676      !!---------------------------------------------------------------------- 
     2677      !!                  ***  ROUTINE  stop_opa  *** 
     2678      !! 
     2679      !! ** Purpose :   print in ocean.outpput file a error message and  
     2680      !!                increment the error number (nstop) by one. 
     2681      !!---------------------------------------------------------------------- 
     2682      CHARACTER(len=*), INTENT(in), OPTIONAL ::  cd1, cd2, cd3, cd4, cd5 
     2683      CHARACTER(len=*), INTENT(in), OPTIONAL ::  cd6, cd7, cd8, cd9, cd10 
     2684      !!---------------------------------------------------------------------- 
     2685      ! 
     2686      nstop = nstop + 1  
     2687      IF(lwp) THEN 
     2688         WRITE(numout,cform_err) 
     2689         IF( PRESENT(cd1 ) )   WRITE(numout,*) cd1 
     2690         IF( PRESENT(cd2 ) )   WRITE(numout,*) cd2 
     2691         IF( PRESENT(cd3 ) )   WRITE(numout,*) cd3 
     2692         IF( PRESENT(cd4 ) )   WRITE(numout,*) cd4 
     2693         IF( PRESENT(cd5 ) )   WRITE(numout,*) cd5 
     2694         IF( PRESENT(cd6 ) )   WRITE(numout,*) cd6 
     2695         IF( PRESENT(cd7 ) )   WRITE(numout,*) cd7 
     2696         IF( PRESENT(cd8 ) )   WRITE(numout,*) cd8 
     2697         IF( PRESENT(cd9 ) )   WRITE(numout,*) cd9 
     2698         IF( PRESENT(cd10) )   WRITE(numout,*) cd10 
     2699      ENDIF 
     2700                               CALL FLUSH(numout    ) 
     2701      IF( numstp     /= -1 )   CALL FLUSH(numstp    ) 
     2702      IF( numsol     /= -1 )   CALL FLUSH(numsol    ) 
     2703      IF( numevo_ice /= -1 )   CALL FLUSH(numevo_ice) 
     2704      ! 
     2705      IF( cd1 == 'STOP' ) THEN 
     2706         IF(lwp) WRITE(numout,*)  'huge E-R-R-O-R : immediate stop' 
     2707         CALL mppstop() 
     2708      ENDIF 
     2709      ! 
     2710   END SUBROUTINE ctl_stop 
     2711 
     2712 
     2713   SUBROUTINE ctl_warn( cd1, cd2, cd3, cd4, cd5,   & 
     2714      &                 cd6, cd7, cd8, cd9, cd10 ) 
     2715      !!---------------------------------------------------------------------- 
     2716      !!                  ***  ROUTINE  stop_warn  *** 
     2717      !! 
     2718      !! ** Purpose :   print in ocean.outpput file a error message and  
     2719      !!                increment the warning number (nwarn) by one. 
     2720      !!---------------------------------------------------------------------- 
     2721      CHARACTER(len=*), INTENT(in), OPTIONAL ::  cd1, cd2, cd3, cd4, cd5 
     2722      CHARACTER(len=*), INTENT(in), OPTIONAL ::  cd6, cd7, cd8, cd9, cd10 
     2723      !!---------------------------------------------------------------------- 
     2724      !  
     2725      nwarn = nwarn + 1  
     2726      IF(lwp) THEN 
     2727         WRITE(numout,cform_war) 
     2728         IF( PRESENT(cd1 ) ) WRITE(numout,*) cd1 
     2729         IF( PRESENT(cd2 ) ) WRITE(numout,*) cd2 
     2730         IF( PRESENT(cd3 ) ) WRITE(numout,*) cd3 
     2731         IF( PRESENT(cd4 ) ) WRITE(numout,*) cd4 
     2732         IF( PRESENT(cd5 ) ) WRITE(numout,*) cd5 
     2733         IF( PRESENT(cd6 ) ) WRITE(numout,*) cd6 
     2734         IF( PRESENT(cd7 ) ) WRITE(numout,*) cd7 
     2735         IF( PRESENT(cd8 ) ) WRITE(numout,*) cd8 
     2736         IF( PRESENT(cd9 ) ) WRITE(numout,*) cd9 
     2737         IF( PRESENT(cd10) ) WRITE(numout,*) cd10 
     2738      ENDIF 
     2739      CALL FLUSH(numout) 
     2740      ! 
     2741   END SUBROUTINE ctl_warn 
     2742 
     2743 
     2744   SUBROUTINE ctl_opn( knum, cdfile, cdstat, cdform, cdacce, klengh, kout, ldwp, karea ) 
     2745      !!---------------------------------------------------------------------- 
     2746      !!                  ***  ROUTINE ctl_opn  *** 
     2747      !! 
     2748      !! ** Purpose :   Open file and check if required file is available. 
     2749      !! 
     2750      !! ** Method  :   Fortan open 
     2751      !!---------------------------------------------------------------------- 
     2752      INTEGER          , INTENT(  out) ::   knum      ! logical unit to open 
     2753      CHARACTER(len=*) , INTENT(in   ) ::   cdfile    ! file name to open 
     2754      CHARACTER(len=*) , INTENT(in   ) ::   cdstat    ! disposition specifier 
     2755      CHARACTER(len=*) , INTENT(in   ) ::   cdform    ! formatting specifier 
     2756      CHARACTER(len=*) , INTENT(in   ) ::   cdacce    ! access specifier 
     2757      INTEGER          , INTENT(in   ) ::   klengh    ! record length 
     2758      INTEGER          , INTENT(in   ) ::   kout      ! number of logical units for write 
     2759      LOGICAL          , INTENT(in   ) ::   ldwp      ! boolean term for print 
     2760      INTEGER, OPTIONAL, INTENT(in   ) ::   karea     ! proc number 
     2761      !! 
     2762      CHARACTER(len=80) ::   clfile 
     2763      INTEGER           ::   iost 
     2764      !!---------------------------------------------------------------------- 
     2765 
     2766      ! adapt filename 
     2767      ! ---------------- 
     2768      clfile = TRIM(cdfile) 
     2769      IF( PRESENT( karea ) ) THEN 
     2770         IF( karea > 1 )   WRITE(clfile, "(a,'_',i4.4)") TRIM(clfile), karea-1 
     2771      ENDIF 
     2772#if defined key_agrif 
     2773      IF( .NOT. Agrif_Root() )   clfile = TRIM(Agrif_CFixed())//'_'//TRIM(clfile) 
     2774      knum=Agrif_Get_Unit() 
     2775#else 
     2776      knum=get_unit() 
     2777#endif 
     2778 
     2779      iost=0 
     2780      IF( cdacce(1:6) == 'DIRECT' )  THEN 
     2781         OPEN( UNIT=knum, FILE=clfile, FORM=cdform, ACCESS=cdacce, STATUS=cdstat, RECL=klengh, ERR=100, IOSTAT=iost ) 
     2782      ELSE 
     2783         OPEN( UNIT=knum, FILE=clfile, FORM=cdform, ACCESS=cdacce, STATUS=cdstat             , ERR=100, IOSTAT=iost ) 
     2784      ENDIF 
     2785      IF( iost == 0 ) THEN 
     2786         IF(ldwp) THEN 
     2787            WRITE(kout,*) '     file   : ', clfile,' open ok' 
     2788            WRITE(kout,*) '     unit   = ', knum 
     2789            WRITE(kout,*) '     status = ', cdstat 
     2790            WRITE(kout,*) '     form   = ', cdform 
     2791            WRITE(kout,*) '     access = ', cdacce 
     2792            WRITE(kout,*) 
     2793         ENDIF 
     2794      ENDIF 
     2795100   CONTINUE 
     2796      IF( iost /= 0 ) THEN 
     2797         IF(ldwp) THEN 
     2798            WRITE(kout,*) 
     2799            WRITE(kout,*) ' ===>>>> : bad opening file: ', clfile 
     2800            WRITE(kout,*) ' =======   ===  ' 
     2801            WRITE(kout,*) '           unit   = ', knum 
     2802            WRITE(kout,*) '           status = ', cdstat 
     2803            WRITE(kout,*) '           form   = ', cdform 
     2804            WRITE(kout,*) '           access = ', cdacce 
     2805            WRITE(kout,*) '           iostat = ', iost 
     2806            WRITE(kout,*) '           we stop. verify the file ' 
     2807            WRITE(kout,*) 
     2808         ENDIF 
     2809         STOP 'ctl_opn bad opening' 
     2810      ENDIF 
     2811       
     2812   END SUBROUTINE ctl_opn 
     2813 
     2814 
     2815   INTEGER FUNCTION get_unit() 
     2816      !!---------------------------------------------------------------------- 
     2817      !!                  ***  FUNCTION  get_unit  *** 
     2818      !! 
     2819      !! ** Purpose :   return the index of an unused logical unit 
     2820      !!---------------------------------------------------------------------- 
     2821      LOGICAL :: llopn  
     2822      !!---------------------------------------------------------------------- 
     2823      ! 
     2824      get_unit = 15   ! choose a unit that is big enough then it is not already used in NEMO 
     2825      llopn = .TRUE. 
     2826      DO WHILE( (get_unit < 998) .AND. llopn ) 
     2827         get_unit = get_unit + 1 
     2828         INQUIRE( unit = get_unit, opened = llopn ) 
     2829      END DO 
     2830      IF( (get_unit == 999) .AND. llopn ) THEN 
     2831         CALL ctl_stop( 'get_unit: All logical units until 999 are used...' ) 
     2832         get_unit = -1 
     2833      ENDIF 
     2834      ! 
     2835   END FUNCTION get_unit 
     2836 
    25762837   !!---------------------------------------------------------------------- 
    25772838END MODULE lib_mpp 
  • trunk/NEMOGCM/NEMO/OPA_SRC/LBC/mppini.F90

    r2442 r2715  
    2020   PRIVATE 
    2121 
    22    !! * Routine accessibility 
    2322   PUBLIC mpp_init       ! called by opa.F90 
    2423   PUBLIC mpp_init2      ! called by opa.F90 
     
    2928   !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
    3029   !! $Id$  
    31    !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 
    32    !!---------------------------------------------------------------------- 
    33  
     30   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     31   !!---------------------------------------------------------------------- 
    3432CONTAINS 
    3533 
     
    128126      !!   8.5  !  02-08  (G. Madec)  F90 : free form 
    129127      !!---------------------------------------------------------------------- 
    130       !! * Local variables 
    131       INTEGER ::   ji, jj, jn               ! dummy loop indices 
    132       INTEGER ::   & 
    133          ii, ij, ifreq, il1, il2,        &  ! temporary integers 
    134          iresti, irestj, ijm1, imil,     &  !    "          " 
    135          inum                               ! temporary logical unit 
    136  
    137       INTEGER, DIMENSION(jpni,jpnj) ::   & 
    138          iimppt, ijmppt, ilcit, ilcjt       ! temporary workspace 
    139       REAL(wp) ::   zidom, zjdom            ! temporary scalars 
     128      INTEGER  ::   ji, jj, jn   ! dummy loop indices 
     129      INTEGER  ::   ii, ij, ifreq, il1, il2            ! local integers 
     130      INTEGER  ::   iresti, irestj, ijm1, imil, inum   !   -      - 
     131      REAL(wp) ::   zidom, zjdom                       ! local scalars 
     132      INTEGER, DIMENSION(jpni,jpnj) ::   iimppt, ijmppt, ilcit, ilcjt   ! local workspace 
    140133      !!---------------------------------------------------------------------- 
    141134 
     
    451444      !!   " "  !  08-12  (A. Coward)  addition in case of jpni*jpnj < jpnij 
    452445      !!---------------------------------------------------------------------- 
    453       !! Local declarations 
    454  
    455       INTEGER, DIMENSION(2) ::   & 
    456          iglo, iloc, iabsf, iabsl, ihals, ihale, idid 
     446      INTEGER, DIMENSION(2) ::   iglo, iloc, iabsf, iabsl, ihals, ihale, idid 
    457447      !!---------------------------------------------------------------------- 
    458448 
     
    482472          WRITE(numout,*) '                    ihale = ', ihale(1), ihale(2) 
    483473      ENDIF 
    484  
     474      ! 
    485475      CALL flio_dom_set ( jpnij, nproc, idid, iglo, iloc, iabsf, iabsl, ihals, ihale, 'BOX', nidom) 
    486  
     476      ! 
    487477   END SUBROUTINE mpp_init_ioipsl   
    488478 
Note: See TracChangeset for help on using the changeset viewer.