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 6440 for branches/UKMO/dev_r5518_GC3p0_package/NEMOGCM/TOOLS/SIREN/src/mpp.f90 – NEMO

Ignore:
Timestamp:
2016-04-07T16:32:24+02:00 (8 years ago)
Author:
dancopsey
Message:

Merged in nemo_v3_6_STABLE_copy up to revision 6436.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/UKMO/dev_r5518_GC3p0_package/NEMOGCM/TOOLS/SIREN/src/mpp.f90

    r5037 r6440  
    165165!>    to get processors to be used:<br/> 
    166166!> @code 
    167 !>    CALL mpp_get_use( td_mpp, id_imin, id_imax, id_idim, &  
    168 !>    &                         id_jmin, id_jmax, id_jdim ) 
     167!>    CALL mpp_get_use( td_mpp, id_imin, id_imax, &  
     168!>    &                         id_jmin, id_jmax ) 
    169169!> @endcode 
    170170!>       - id_imin  
    171171!>       - id_imax  
    172 !>       - id_idim  
    173172!>       - id_jmin  
    174173!>       - id_jmax  
    175 !>       - id_jdim  
    176174!> 
    177175!>    to get sub domains which form global domain contour:<br/> 
     
    198196! REVISION HISTORY: 
    199197!> @date November, 2013 - Initial Version 
    200 !> @date November, 2014 - Fix memory leaks bug 
     198!> @date November, 2014  
     199!> - Fix memory leaks bug 
     200!> @date October, 2015 
     201!> - improve way to compute domain layout 
     202!> @date January, 2016 
     203!> - allow to print layout file (use lm_layout, hard coded) 
     204!> - add mpp__compute_halo and mpp__read_halo 
    201205! 
    202206!> @note Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     
    216220 
    217221   ! type and variable 
    218    PUBLIC :: TMPP       !< mpp structure 
     222   PUBLIC  :: TMPP       !< mpp structure 
     223   PRIVATE :: TLAY       !< domain layout structure 
    219224 
    220225   ! function and subroutine 
     
    241246   PUBLIC :: mpp_get_proc_size  !< get processor domain size 
    242247 
    243    PRIVATE :: mpp__add_proc            ! add one proc strucutre in mpp structure 
     248   PRIVATE :: mpp__add_proc            ! add proc strucutre in mpp structure 
     249   PRIVATE :: mpp__add_proc_unit       ! add one proc strucutre in mpp structure 
    244250   PRIVATE :: mpp__del_proc            ! delete one proc strucutre in mpp structure 
    245251   PRIVATE :: mpp__del_proc_id         ! delete one proc strucutre in mpp structure, given procesor id 
    246252   PRIVATE :: mpp__del_proc_str        ! delete one proc strucutre in mpp structure, given procesor file structure  
    247253   PRIVATE :: mpp__move_proc           ! overwrite proc strucutre in mpp structure 
    248    PRIVATE :: mpp__compute             ! compute domain decomposition 
    249    PRIVATE :: mpp__del_land            ! remove land sub domain from domain decomposition 
     254   PRIVATE :: mpp__create_layout       ! create mpp structure using domain layout 
    250255   PRIVATE :: mpp__optimiz             ! compute optimum domain decomposition 
    251    PRIVATE :: mpp__land_proc           ! check if processor is a land processor 
    252256   PRIVATE :: mpp__check_dim           ! check mpp structure dimension with proc or variable dimension 
    253257   PRIVATE :: mpp__check_proc_dim      ! check if processor and mpp structure use same dimension 
     
    269273   PRIVATE :: mpp__clean_unit          ! clean mpp strcuture 
    270274   PRIVATE :: mpp__clean_arr           ! clean array of mpp strcuture 
     275   PRIVATE :: mpp__compute_halo        ! compute subdomain indices defined with halo  
     276   PRIVATE :: mpp__read_halo           ! read subdomain indices defined with halo 
     277 
     278   PRIVATE :: layout__init             ! initialise domain layout structure 
     279   PRIVATE :: layout__copy             ! clean domain layout structure 
     280   PRIVATE :: layout__clean            ! copy  domain layout structure 
    271281 
    272282   TYPE TMPP !< mpp structure 
    273  
    274283      ! general  
    275284      CHARACTER(LEN=lc)                  :: c_name = ''   !< base name  
     
    286295 
    287296      CHARACTER(LEN=lc)                  :: c_type = ''   !< type of the files (cdf, cdf4, dimg) 
    288       CHARACTER(LEN=lc)                  :: c_dom  = ''   !< type of domain (full, overlap, nooverlap) 
     297      CHARACTER(LEN=lc)                  :: c_dom  = ''   !< type of domain (full, noextra, nooverlap) 
    289298 
    290299      INTEGER(i4)                        :: i_ndim = 0    !< number of dimensions used in mpp 
     
    292301 
    293302      TYPE(TFILE), DIMENSION(:), POINTER :: t_proc => NULL()     !< files/processors composing mpp 
    294  
    295303   END TYPE 
     304 
     305   TYPE TLAY !< domain layout structure 
     306      INTEGER(i4)                          :: i_niproc = 0  !< number of processors following i 
     307      INTEGER(i4)                          :: i_njproc = 0  !< number of processors following j 
     308      INTEGER(i4)                          :: i_nland  = 0       !< number of land processors 
     309      INTEGER(i4)                          :: i_nsea   = 0       !< number of sea  processors 
     310      INTEGER(i4)                          :: i_mean   = 0       !< mean sea point per proc 
     311      INTEGER(i4)                          :: i_min    = 0       !< min  sea point per proc 
     312      INTEGER(i4)                          :: i_max    = 0       !< max  sea point per proc 
     313      INTEGER(i4), DIMENSION(:,:), POINTER :: i_msk   => NULL()  !< sea/land processor mask  
     314      INTEGER(i4), DIMENSION(:,:), POINTER :: i_impp  => NULL()  !< i-indexes for mpp-subdomain left bottom  
     315      INTEGER(i4), DIMENSION(:,:), POINTER :: i_jmpp  => NULL()  !< j-indexes for mpp-subdomain left bottom  
     316      INTEGER(i4), DIMENSION(:,:), POINTER :: i_lci   => NULL()  !< i-dimensions of subdomain  
     317      INTEGER(i4), DIMENSION(:,:), POINTER :: i_lcj   => NULL()  !< j-dimensions of subdomain  
     318   END TYPE 
     319 
     320   ! module variable 
     321   INTEGER(i4) :: im_iumout = 44 
     322   LOGICAL     :: lm_layout =.FALSE. 
    296323 
    297324   INTERFACE mpp_get_use 
    298325      MODULE PROCEDURE mpp__get_use_unit  
    299326   END INTERFACE mpp_get_use 
     327 
     328   INTERFACE mpp__add_proc 
     329      MODULE PROCEDURE mpp__add_proc_unit  
     330   END INTERFACE mpp__add_proc 
    300331 
    301332   INTERFACE mpp_clean 
     
    352383   !> 
    353384   !> @author J.Paul 
    354    !> - November, 2013- Initial Version 
     385   !> @date November, 2013 - Initial Version 
    355386   !> @date November, 2014 
    356387   !>    - use function instead of overload assignment operator  
     
    379410      ! copy mpp variable 
    380411      mpp__copy_unit%c_name     = TRIM(td_mpp%c_name) 
     412      mpp__copy_unit%i_id       = td_mpp%i_id 
    381413      mpp__copy_unit%i_niproc   = td_mpp%i_niproc 
    382414      mpp__copy_unit%i_njproc   = td_mpp%i_njproc 
     
    425457   !> 
    426458   !> @author J.Paul 
    427    !> - November, 2013- Initial Version 
     459   !> @date November, 2013 - Initial Version 
    428460   !> @date November, 2014 
    429461   !>    - use function instead of overload assignment operator  
     
    454486   ! 
    455487   !> @author J.Paul 
    456    !> - Nov, 2013- Initial Version 
     488   !> @date November, 2013 - Initial Version 
    457489   ! 
    458490   !> @param[in] td_mpp mpp structure 
     
    495527      ! print dimension 
    496528      IF(  td_mpp%i_ndim /= 0 )THEN 
    497          WRITE(*,'(/a)') " File dimension" 
     529         WRITE(*,'(/a)') " MPP dimension" 
    498530         DO ji=1,ip_maxdim 
    499531            IF( td_mpp%t_dim(ji)%l_use )THEN 
     
    561593            ALLOCATE( il_lci(td_mpp%i_niproc,td_mpp%i_njproc) ) 
    562594            ALLOCATE( il_lcj(td_mpp%i_niproc,td_mpp%i_njproc) ) 
     595            il_proc(:,:)=-1 
     596            il_lci(:,:) =-1 
     597            il_lcj(:,:) =-1 
    563598 
    564599            DO jk=1,td_mpp%i_nproc 
    565600               ji=td_mpp%t_proc(jk)%i_iind 
    566601               jj=td_mpp%t_proc(jk)%i_jind 
    567                il_proc(ji,jj)=jk 
     602               il_proc(ji,jj)=jk-1 
    568603               il_lci(ji,jj)=td_mpp%t_proc(jk)%i_lci 
    569604               il_lcj(ji,jj)=td_mpp%t_proc(jk)%i_lcj 
     
    595630      ENDIF 
    596631 
    597  
    5986329400   FORMAT('     ***',20('*************',a3)) 
    5996339403   FORMAT('     *     ',20('         *   ',a3)) 
     
    616650   !> @author J.Paul 
    617651   !> @date November, 2013 - Initial version 
     652   !> @date September, 2015 
     653   !> - allow to define dimension with array of dimension structure 
     654   !> @date January, 2016 
     655   !> - use RESULT to rename output 
     656   !> - mismatch with "halo" indices 
    618657   ! 
    619658   !> @param[in] cd_file   file name of one file composing mpp domain 
     
    628667   !> @param[in] id_perio  NEMO periodicity index 
    629668   !> @param[in] id_pivot  NEMO pivot point index F(0),T(1) 
     669   !> @param[in] td_dim    array of dimension structure 
    630670   !> @return mpp structure 
    631671   !------------------------------------------------------------------- 
    632    TYPE(TMPP) FUNCTION mpp__init_mask(cd_file, id_mask,              & 
    633    &                                  id_niproc, id_njproc, id_nproc,& 
    634    &                                  id_preci, id_precj,            & 
    635                                       cd_type, id_ew, id_perio, id_pivot) 
     672   FUNCTION mpp__init_mask(cd_file, id_mask,                   & 
     673   &                       id_niproc, id_njproc, id_nproc,     & 
     674   &                       id_preci, id_precj,                 & 
     675   &                       cd_type, id_ew, id_perio, id_pivot, & 
     676   &                       td_dim )                            & 
     677   & RESULT(td_mpp) 
    636678      IMPLICIT NONE 
    637679      ! Argument 
    638       CHARACTER(LEN=*),            INTENT(IN) :: cd_file 
    639       INTEGER(i4), DIMENSION(:,:), INTENT(IN) :: id_mask 
    640       INTEGER(i4),                 INTENT(IN), OPTIONAL :: id_niproc 
    641       INTEGER(i4),                 INTENT(IN), OPTIONAL :: id_njproc 
    642       INTEGER(i4),                 INTENT(IN), OPTIONAL :: id_nproc 
    643       INTEGER(i4),                 INTENT(IN), OPTIONAL :: id_preci 
    644       INTEGER(i4),                 INTENT(IN), OPTIONAL :: id_precj 
    645       CHARACTER(LEN=*),            INTENT(IN), OPTIONAL :: cd_type 
    646       INTEGER(i4),                 INTENT(IN), OPTIONAL :: id_ew 
    647       INTEGER(i4),                 INTENT(IN), OPTIONAL :: id_perio 
    648       INTEGER(i4),                 INTENT(IN), OPTIONAL :: id_pivot 
     680      CHARACTER(LEN=*),                  INTENT(IN) :: cd_file 
     681      INTEGER(i4), DIMENSION(:,:),       INTENT(IN) :: id_mask 
     682      INTEGER(i4),                       INTENT(IN), OPTIONAL :: id_niproc 
     683      INTEGER(i4),                       INTENT(IN), OPTIONAL :: id_njproc 
     684      INTEGER(i4),                       INTENT(IN), OPTIONAL :: id_nproc 
     685      INTEGER(i4),                       INTENT(IN), OPTIONAL :: id_preci 
     686      INTEGER(i4),                       INTENT(IN), OPTIONAL :: id_precj 
     687      CHARACTER(LEN=*),                  INTENT(IN), OPTIONAL :: cd_type 
     688      INTEGER(i4),                       INTENT(IN), OPTIONAL :: id_ew 
     689      INTEGER(i4),                       INTENT(IN), OPTIONAL :: id_perio 
     690      INTEGER(i4),                       INTENT(IN), OPTIONAL :: id_pivot 
     691      TYPE(TDIM) , DIMENSION(ip_maxdim), INTENT(IN), OPTIONAL :: td_dim 
     692 
     693      ! function 
     694      TYPE(TMPP) :: td_mpp 
    649695 
    650696      ! local variable 
    651       CHARACTER(LEN=lc)                :: cl_type 
    652  
    653       INTEGER(i4)      , DIMENSION(2) :: il_shape 
    654  
    655       TYPE(TDIM)                      :: tl_dim 
    656  
    657       TYPE(TATT)                      :: tl_att 
     697      CHARACTER(LEN=lc)                            :: cl_type 
     698 
     699      INTEGER(i4)      , DIMENSION(2)              :: il_shape 
     700 
     701      TYPE(TDIM)                                   :: tl_dim 
     702 
     703      TYPE(TATT)                                   :: tl_att 
     704 
     705      TYPE(TLAY)                                   :: tl_lay 
     706 
    658707      ! loop indices 
    659708      INTEGER(i4) :: ji 
     
    661710 
    662711      ! clean mpp 
    663       CALL mpp_clean(mpp__init_mask) 
     712      CALL mpp_clean(td_mpp) 
    664713 
    665714      ! check type 
     
    670719         SELECT CASE(TRIM(cd_type)) 
    671720            CASE('cdf') 
    672                mpp__init_mask%c_type='cdf' 
     721               td_mpp%c_type='cdf' 
    673722            CASE('dimg') 
    674                mpp__init_mask%c_type='dimg' 
     723               td_mpp%c_type='dimg' 
    675724            CASE DEFAULT 
    676725               CALL logger_warn( "MPP INIT: type "//TRIM(cd_type)//& 
    677726               & " unknown. type dimg will be used for mpp "//& 
    678                &  TRIM(mpp__init_mask%c_name) ) 
    679                mpp__init_mask%c_type='dimg' 
     727               &  TRIM(td_mpp%c_name) ) 
     728               td_mpp%c_type='dimg' 
    680729         END SELECT 
    681730      ELSE 
    682          mpp__init_mask%c_type=TRIM(file_get_type(cd_file)) 
     731         td_mpp%c_type=TRIM(file_get_type(cd_file)) 
    683732      ENDIF 
    684733 
    685734      ! get mpp name 
    686       mpp__init_mask%c_name=TRIM(file_rename(cd_file)) 
     735      td_mpp%c_name=TRIM(file_rename(cd_file)) 
    687736 
    688737      ! get global domain dimension 
    689738      il_shape(:)=SHAPE(id_mask) 
    690739 
    691       tl_dim=dim_init('X',il_shape(1)) 
    692       CALL mpp_add_dim(mpp__init_mask, tl_dim) 
    693  
    694       tl_dim=dim_init('Y',il_shape(2)) 
    695       CALL mpp_add_dim(mpp__init_mask, tl_dim) 
    696  
    697       ! clean 
    698       CALL dim_clean(tl_dim) 
    699  
    700       IF( (       PRESENT(id_niproc)  .AND. (.NOT. PRESENT(id_niproc))) .OR. & 
     740      IF( PRESENT(td_dim) )THEN 
     741         DO ji=1,ip_maxdim 
     742            IF( td_dim(ji)%l_use )THEN 
     743               CALL mpp_add_dim(td_mpp, td_dim(ji)) 
     744            ENDIF 
     745         ENDDO 
     746      ELSE 
     747         tl_dim=dim_init('X',il_shape(1)) 
     748         CALL mpp_add_dim(td_mpp, tl_dim) 
     749 
     750         tl_dim=dim_init('Y',il_shape(2)) 
     751         CALL mpp_add_dim(td_mpp, tl_dim) 
     752 
     753         ! clean 
     754         CALL dim_clean(tl_dim) 
     755      ENDIF 
     756 
     757      IF( (       PRESENT(id_niproc)  .AND. (.NOT. PRESENT(id_njproc))) .OR. & 
    701758          ((.NOT. PRESENT(id_niproc)) .AND.        PRESENT(id_njproc) ) )THEN 
    702759          CALL logger_warn( "MPP INIT: number of processors following I and J "//& 
     
    704761      ELSE 
    705762         ! get number of processors following I and J 
    706          IF( PRESENT(id_niproc) ) mpp__init_mask%i_niproc=id_niproc 
    707          IF( PRESENT(id_njproc) ) mpp__init_mask%i_njproc=id_njproc 
     763         IF( PRESENT(id_niproc) ) td_mpp%i_niproc=id_niproc 
     764         IF( PRESENT(id_njproc) ) td_mpp%i_njproc=id_njproc 
    708765      ENDIF 
    709766 
    710767      ! get maximum number of processors to be used 
    711       IF( PRESENT(id_nproc) ) mpp__init_mask%i_nproc = id_nproc 
     768      IF( PRESENT(id_nproc) ) td_mpp%i_nproc = id_nproc 
    712769 
    713770      ! get overlap region length 
    714       IF( PRESENT(id_preci) ) mpp__init_mask%i_preci= id_preci 
    715       IF( PRESENT(id_precj) ) mpp__init_mask%i_precj= id_precj 
     771      IF( PRESENT(id_preci) ) td_mpp%i_preci= id_preci 
     772      IF( PRESENT(id_precj) ) td_mpp%i_precj= id_precj 
    716773 
    717774      ! east-west overlap 
    718       IF( PRESENT(id_ew) ) mpp__init_mask%i_ew= id_ew 
     775      IF( PRESENT(id_ew) ) td_mpp%i_ew= id_ew 
    719776      ! NEMO periodicity 
    720       IF( PRESENT(id_perio) ) mpp__init_mask%i_perio= id_perio 
    721       IF( PRESENT(id_pivot) ) mpp__init_mask%i_pivot= id_pivot 
    722  
    723       IF( mpp__init_mask%i_nproc  /= 0 .AND. & 
    724       &   mpp__init_mask%i_niproc /= 0 .AND. & 
    725       &   mpp__init_mask%i_njproc /= 0 .AND. & 
    726       &   mpp__init_mask%i_nproc > & 
    727       &   mpp__init_mask%i_niproc * mpp__init_mask%i_njproc )THEN 
     777      IF( PRESENT(id_perio) ) td_mpp%i_perio= id_perio 
     778      IF( PRESENT(id_pivot) ) td_mpp%i_pivot= id_pivot 
     779 
     780      IF( td_mpp%i_nproc  /= 0 .AND. & 
     781      &   td_mpp%i_niproc /= 0 .AND. & 
     782      &   td_mpp%i_njproc /= 0 .AND. & 
     783      &   td_mpp%i_nproc > & 
     784      &   td_mpp%i_niproc * td_mpp%i_njproc )THEN 
    728785 
    729786         CALL logger_error("MPP INIT: invalid domain decomposition ") 
    730787         CALL logger_debug("MPP INIT: "// & 
    731          & TRIM(fct_str(mpp__init_mask%i_nproc))//" > "//& 
    732          & TRIM(fct_str(mpp__init_mask%i_niproc))//" x "//& 
    733          & TRIM(fct_str(mpp__init_mask%i_njproc)) ) 
     788         & TRIM(fct_str(td_mpp%i_nproc))//" > "//& 
     789         & TRIM(fct_str(td_mpp%i_niproc))//" x "//& 
     790         & TRIM(fct_str(td_mpp%i_njproc)) ) 
    734791 
    735792      ELSE 
    736  
    737          IF( mpp__init_mask%i_niproc /= 0 .AND. & 
    738          &   mpp__init_mask%i_njproc /= 0 )THEN 
    739             ! compute domain decomposition 
    740             CALL mpp__compute( mpp__init_mask ) 
    741             ! remove land sub domain 
    742             CALL mpp__del_land( mpp__init_mask, id_mask ) 
    743          ELSEIF( mpp__init_mask%i_nproc  /= 0 )THEN 
     793         IF( lm_layout )THEN 
     794            OPEN(im_iumout,FILE='processor.layout') 
     795            WRITE(im_iumout,*) 
     796            WRITE(im_iumout,*) ' optimisation de la partition' 
     797            WRITE(im_iumout,*) ' ----------------------------' 
     798            WRITE(im_iumout,*) 
     799         ENDIF 
     800 
     801         IF( td_mpp%i_niproc /= 0 .AND. & 
     802         &   td_mpp%i_njproc /= 0 )THEN 
     803            ! compute domain layout 
     804            tl_lay=layout__init( td_mpp, id_mask, td_mpp%i_niproc, td_mpp%i_njproc ) 
     805            ! create mpp domain layout 
     806            CALL mpp__create_layout( td_mpp, tl_lay ) 
     807            ! clean 
     808            CALL layout__clean( tl_lay ) 
     809         ELSEIF( td_mpp%i_nproc  /= 0 )THEN 
    744810            ! optimiz 
    745             CALL mpp__optimiz( mpp__init_mask, id_mask ) 
     811            CALL mpp__optimiz( td_mpp, id_mask, td_mpp%i_nproc ) 
    746812 
    747813         ELSE 
    748814            CALL logger_warn("MPP INIT: number of processor to be used "//& 
    749815            &                "not specify. force to one.") 
    750             mpp__init_mask%i_nproc  = 1 
    751816            ! optimiz 
    752             CALL mpp__optimiz( mpp__init_mask, id_mask ) 
     817            CALL mpp__optimiz( td_mpp, id_mask, 1 ) 
    753818         ENDIF 
     819 
     820 
    754821         CALL logger_info("MPP INIT: domain decoposition : "//& 
    755          &  'niproc('//TRIM(fct_str(mpp__init_mask%i_niproc))//') * '//& 
    756          &  'njproc('//TRIM(fct_str(mpp__init_mask%i_njproc))//') = '//& 
    757          &  'nproc('//TRIM(fct_str(mpp__init_mask%i_nproc))//')' ) 
     822         &  'niproc('//TRIM(fct_str(td_mpp%i_niproc))//') * '//& 
     823         &  'njproc('//TRIM(fct_str(td_mpp%i_njproc))//') = '//& 
     824         &  'nproc('//TRIM(fct_str(td_mpp%i_nproc))//')' ) 
    758825 
    759826         ! get domain type 
    760          CALL mpp_get_dom( mpp__init_mask ) 
    761  
    762          DO ji=1,mpp__init_mask%i_nproc 
     827         CALL mpp_get_dom( td_mpp ) 
     828 
     829         DO ji=1,td_mpp%i_nproc 
    763830 
    764831            ! get processor size 
    765             il_shape(:)=mpp_get_proc_size( mpp__init_mask, ji ) 
     832            il_shape(:)=mpp_get_proc_size( td_mpp, ji ) 
    766833 
    767834            tl_dim=dim_init('X',il_shape(1)) 
    768             CALL file_move_dim(mpp__init_mask%t_proc(ji), tl_dim) 
     835            CALL file_move_dim(td_mpp%t_proc(ji), tl_dim) 
    769836 
    770837            tl_dim=dim_init('Y',il_shape(2)) 
    771             CALL file_move_dim(mpp__init_mask%t_proc(ji), tl_dim)             
    772  
     838            CALL file_move_dim(td_mpp%t_proc(ji), tl_dim)             
     839 
     840            IF( PRESENT(td_dim) )THEN 
     841               IF( td_dim(jp_K)%l_use )THEN 
     842                  CALL file_move_dim(td_mpp%t_proc(ji), td_dim(jp_K)) 
     843               ENDIF 
     844               IF( td_dim(jp_L)%l_use )THEN 
     845                  CALL file_move_dim(td_mpp%t_proc(ji), td_dim(jp_L)) 
     846               ENDIF 
     847            ENDIF 
    773848            ! add type 
    774             mpp__init_mask%t_proc(ji)%c_type=TRIM(mpp__init_mask%c_type) 
     849            td_mpp%t_proc(ji)%c_type=TRIM(td_mpp%c_type) 
    775850 
    776851            ! clean 
    777852            CALL dim_clean(tl_dim) 
     853 
    778854         ENDDO 
    779855 
    780856         ! add global attribute 
    781          tl_att=att_init("DOMAIN_number_total",mpp__init_mask%i_nproc) 
    782          CALL mpp_add_att(mpp__init_mask, tl_att) 
    783  
    784          tl_att=att_init("DOMAIN_I_number_total",mpp__init_mask%i_niproc) 
    785          CALL mpp_add_att(mpp__init_mask, tl_att) 
    786  
    787          tl_att=att_init("DOMAIN_J_number_total",mpp__init_mask%i_njproc) 
    788          CALL mpp_add_att(mpp__init_mask, tl_att) 
    789  
    790          tl_att=att_init("DOMAIN_size_global",mpp__init_mask%t_dim(1:2)%i_len) 
    791          CALL mpp_add_att(mpp__init_mask, tl_att) 
    792  
    793          tl_att=att_init( "DOMAIN_I_position_first", & 
    794          &                mpp__init_mask%t_proc(:)%i_impp ) 
    795          CALL mpp_add_att(mpp__init_mask, tl_att) 
    796  
    797          tl_att=att_init( "DOMAIN_J_position_first", & 
    798          &                mpp__init_mask%t_proc(:)%i_jmpp ) 
    799          CALL mpp_add_att(mpp__init_mask, tl_att) 
    800  
    801          tl_att=att_init( "DOMAIN_I_position_last", & 
    802          &                mpp__init_mask%t_proc(:)%i_lci ) 
    803          CALL mpp_add_att(mpp__init_mask, tl_att) 
    804  
    805          tl_att=att_init( "DOMAIN_J_position_last", & 
    806          &                mpp__init_mask%t_proc(:)%i_lcj ) 
    807          CALL mpp_add_att(mpp__init_mask, tl_att) 
    808  
    809          tl_att=att_init( "DOMAIN_I_halo_size_start", & 
    810          &                mpp__init_mask%t_proc(:)%i_ldi ) 
    811          CALL mpp_add_att(mpp__init_mask, tl_att) 
    812  
    813          tl_att=att_init( "DOMAIN_J_halo_size_start", & 
    814          &                mpp__init_mask%t_proc(:)%i_ldj ) 
    815          CALL mpp_add_att(mpp__init_mask, tl_att) 
    816  
    817          tl_att=att_init( "DOMAIN_I_halo_size_end", & 
    818          &                mpp__init_mask%t_proc(:)%i_lei ) 
    819          CALL mpp_add_att(mpp__init_mask, tl_att) 
    820  
    821          tl_att=att_init( "DOMAIN_J_halo_size_end", & 
    822          &                mpp__init_mask%t_proc(:)%i_lej ) 
    823          CALL mpp_add_att(mpp__init_mask, tl_att)          
    824  
    825          ! clean 
    826          CALL att_clean(tl_att) 
     857         tl_att=att_init("DOMAIN_number_total",td_mpp%i_nproc) 
     858         CALL mpp_add_att(td_mpp, tl_att) 
     859 
     860         tl_att=att_init("DOMAIN_LOCAL",TRIM(td_mpp%c_dom)) 
     861         CALL mpp_add_att(td_mpp, tl_att) 
     862 
     863         tl_att=att_init("DOMAIN_I_number_total",td_mpp%i_niproc) 
     864         CALL mpp_add_att(td_mpp, tl_att) 
     865 
     866         tl_att=att_init("DOMAIN_J_number_total",td_mpp%i_njproc) 
     867         CALL mpp_add_att(td_mpp, tl_att) 
     868 
     869         tl_att=att_init("DOMAIN_size_global",td_mpp%t_dim(1:2)%i_len) 
     870         CALL mpp_add_att(td_mpp, tl_att) 
     871 
     872         CALL mpp__compute_halo(td_mpp)  
    827873      ENDIF 
    828874 
     
    881927         il_mask(:,:,:)=var_get_mask(td_var) 
    882928          
     929         CALL logger_info("MPP INIT: mask compute from variable "//& 
     930            &             TRIM(td_var%c_name)) 
    883931         mpp__init_var=mpp_init( cd_file, il_mask(:,:,1),       & 
    884932         &                       id_niproc, id_njproc, id_nproc,& 
     
    908956   !>    - DOMAIN_halo_size_end 
    909957   !>  or the file is assume to be no mpp file. 
    910    !>   
    911    !>  
    912    !> 
    913    !> @author J.Paul 
    914    !> - November, 2013- Initial Version 
     958   !> 
     959   !> @author J.Paul 
     960   !> @date November, 2013 - Initial Version 
     961   !> @date January, 2016 
     962   !> - mismatch with "halo" indices, use mpp__compute_halo 
    915963   ! 
    916964   !> @param[in] td_file   file strcuture 
     
    930978 
    931979      ! local variable 
    932       TYPE(TMPP)  :: tl_mpp 
    933        
    934       TYPE(TFILE) :: tl_file 
    935        
    936       TYPE(TDIM)  :: tl_dim 
    937  
    938       TYPE(TATT)  :: tl_att 
    939  
    940       INTEGER(i4) :: il_nproc 
    941       INTEGER(i4) :: il_attid 
    942  
     980      INTEGER(i4)               :: il_nproc 
     981      INTEGER(i4)               :: il_attid 
    943982      INTEGER(i4), DIMENSION(2) :: il_shape 
     983 
     984      TYPE(TDIM)                :: tl_dim 
     985 
     986      TYPE(TATT)                :: tl_att 
     987 
     988      TYPE(TFILE)               :: tl_file 
     989 
     990      TYPE(TMPP)                :: tl_mpp 
     991 
    944992      ! loop indices 
    945993      INTEGER(i4) :: ji 
     
    9571005            ! open file 
    9581006            CALL iom_open(tl_file) 
    959  
    9601007            ! read first file domain decomposition 
    9611008            tl_mpp=mpp__init_file_cdf(tl_file) 
     
    10281075            ! create some attributes for domain decomposition (use with dimg file) 
    10291076            tl_att=att_init( "DOMAIN_number_total", mpp__init_file%i_nproc ) 
    1030             CALL mpp_add_att(mpp__init_file, tl_att) 
    1031  
    1032             tl_att=att_init( "DOMAIN_I_position_first", mpp__init_file%t_proc(:)%i_impp ) 
    1033             CALL mpp_add_att(mpp__init_file, tl_att) 
    1034  
    1035             tl_att=att_init( "DOMAIN_J_position_first", mpp__init_file%t_proc(:)%i_jmpp ) 
    1036             CALL mpp_add_att(mpp__init_file, tl_att) 
    1037  
    1038             tl_att=att_init( "DOMAIN_I_position_last", mpp__init_file%t_proc(:)%i_lci ) 
    1039             CALL mpp_add_att(mpp__init_file, tl_att) 
    1040  
    1041             tl_att=att_init( "DOMAIN_J_position_last", mpp__init_file%t_proc(:)%i_lcj ) 
    1042             CALL mpp_add_att(mpp__init_file, tl_att) 
    1043  
    1044             tl_att=att_init( "DOMAIN_I_halo_size_start", mpp__init_file%t_proc(:)%i_ldi ) 
    1045             CALL mpp_add_att(mpp__init_file, tl_att) 
    1046  
    1047             tl_att=att_init( "DOMAIN_J_halo_size_start", mpp__init_file%t_proc(:)%i_ldj ) 
    1048             CALL mpp_add_att(mpp__init_file, tl_att) 
    1049  
    1050             tl_att=att_init( "DOMAIN_I_halo_size_end", mpp__init_file%t_proc(:)%i_lei ) 
    1051             CALL mpp_add_att(mpp__init_file, tl_att) 
    1052  
    1053             tl_att=att_init( "DOMAIN_J_halo_size_end", mpp__init_file%t_proc(:)%i_lej ) 
    1054             CALL mpp_add_att(mpp__init_file, tl_att) 
    1055              
     1077            CALL mpp_move_att(mpp__init_file, tl_att) 
     1078 
     1079            CALL mpp__compute_halo(mpp__init_file) 
     1080  
    10561081            ! clean 
    10571082            CALL mpp_clean(tl_mpp) 
     
    11221147      CALL file_clean(tl_file) 
    11231148 
    1124       CALL logger_debug("MPP INIT READ: fin init_read ") 
    11251149   END FUNCTION mpp__init_file 
    11261150   !------------------------------------------------------------------- 
     
    11311155   ! 
    11321156   !> @author J.Paul 
    1133    !> - November, 2013- Initial Version 
     1157   !> @date November, 2013 - Initial Version 
     1158   !> @date July, 2015  
     1159   !> - add only use dimension in MPP structure 
     1160   !> @date January, 2016 
     1161   !> - mismatch with "halo" indices, use mpp__read_halo 
    11341162   !> 
    11351163   !> @param[in] td_file   file strcuture 
     
    11631191         IF( td_file%i_id == 0 )THEN 
    11641192            CALL logger_info(" id "//TRIM(fct_str(td_file%i_id)))  
    1165             CALL logger_error("MPP INIT READ: netcdf file "//TRIM(td_file%c_name)//& 
    1166             " not opened") 
     1193            CALL logger_error("MPP INIT READ: netcdf file "//& 
     1194               &  TRIM(td_file%c_name)//" not opened") 
    11671195         ELSE 
    11681196 
     
    11911219               CALL mpp_add_dim(mpp__init_file_cdf,tl_dim) 
    11921220            ENDIF 
    1193             tl_dim=dim_init( td_file%t_dim(3)%c_name, td_file%t_dim(3)%i_len) 
    1194             CALL mpp_add_dim(mpp__init_file_cdf,tl_dim) 
    1195  
    1196             tl_dim=dim_init( td_file%t_dim(4)%c_name, td_file%t_dim(4)%i_len) 
    1197             CALL mpp_add_dim(mpp__init_file_cdf,tl_dim) 
     1221 
     1222            IF( td_file%t_dim(3)%l_use )THEN 
     1223               tl_dim=dim_init( td_file%t_dim(3)%c_name, td_file%t_dim(3)%i_len) 
     1224               CALL mpp_add_dim(mpp__init_file_cdf,tl_dim) 
     1225            ENDIF 
     1226 
     1227            IF( td_file%t_dim(4)%l_use )THEN 
     1228               tl_dim=dim_init( td_file%t_dim(4)%c_name, td_file%t_dim(4)%i_len) 
     1229               CALL mpp_add_dim(mpp__init_file_cdf,tl_dim) 
     1230            ENDIF 
    11981231 
    11991232            ! initialise file/processor 
     
    12141247            tl_proc%t_dim(:)=dim_copy(td_file%t_dim(:)) 
    12151248 
    1216             ! DOMAIN_position_first 
    1217             il_attid = 0 
    1218             IF( ASSOCIATED(td_file%t_att) )THEN 
    1219                il_attid=att_get_id( td_file%t_att, "DOMAIN_position_first" ) 
    1220             ENDIF 
    1221             IF( il_attid /= 0 )THEN 
    1222                tl_proc%i_impp = INT(td_file%t_att(il_attid)%d_value(1)) 
    1223                tl_proc%i_jmpp = INT(td_file%t_att(il_attid)%d_value(2)) 
    1224             ELSE 
    1225                tl_proc%i_impp = 1 
    1226                tl_proc%i_jmpp = 1 
    1227             ENDIF 
    1228  
    1229             ! DOMAIN_position_last 
    1230             il_attid = 0 
    1231             IF( ASSOCIATED(td_file%t_att) )THEN 
    1232                il_attid=att_get_id( td_file%t_att, "DOMAIN_position_last" ) 
    1233             ENDIF 
    1234             IF( il_attid /= 0 )THEN 
    1235                tl_proc%i_lci = INT(td_file%t_att(il_attid)%d_value(1)) + tl_proc%i_impp 
    1236                tl_proc%i_lcj = INT(td_file%t_att(il_attid)%d_value(2)) + tl_proc%i_jmpp 
    1237             ELSE 
    1238                tl_proc%i_lci = mpp__init_file_cdf%t_dim(1)%i_len 
    1239                tl_proc%i_lcj = mpp__init_file_cdf%t_dim(2)%i_len 
    1240             ENDIF 
    1241  
    1242             ! DOMAIN_halo_size_start 
    1243             il_attid = 0 
    1244             IF( ASSOCIATED(td_file%t_att) )THEN 
    1245                il_attid=att_get_id( td_file%t_att, "DOMAIN_halo_size_start" ) 
    1246             ENDIF 
    1247             IF( il_attid /= 0 )THEN 
    1248                tl_proc%i_ldi = INT(td_file%t_att(il_attid)%d_value(1)) 
    1249                tl_proc%i_ldj = INT(td_file%t_att(il_attid)%d_value(2)) 
    1250             ELSE 
    1251                tl_proc%i_ldi = 1 
    1252                tl_proc%i_ldj = 1 
    1253             ENDIF 
    1254  
    1255             ! DOMAIN_halo_size_end 
    1256             il_attid = 0 
    1257             IF( ASSOCIATED(td_file%t_att) )THEN 
    1258                il_attid=att_get_id( td_file%t_att, "DOMAIN_halo_size_end" ) 
    1259             ENDIF 
    1260             IF( il_attid /= 0 )THEN 
    1261                tl_proc%i_lei = INT(td_file%t_att(il_attid)%d_value(1)) 
    1262                tl_proc%i_lej = INT(td_file%t_att(il_attid)%d_value(2)) 
    1263             ELSE 
    1264                tl_proc%i_lei = mpp__init_file_cdf%t_dim(1)%i_len 
    1265                tl_proc%i_lej = mpp__init_file_cdf%t_dim(2)%i_len 
    1266             ENDIF 
     1249            CALL mpp__read_halo(tl_proc, mpp__init_file_cdf%t_dim(:) ) 
    12671250 
    12681251            ! add attributes 
     
    12741257            CALL file_move_att(tl_proc, tl_att) 
    12751258 
    1276             tl_att=att_init( "DOMAIN_position_first", & 
    1277             &                (/tl_proc%i_impp, tl_proc%i_jmpp /) ) 
    1278             CALL file_move_att(tl_proc, tl_att) 
    1279  
    1280             tl_att=att_init( "DOMAIN_position_last", & 
    1281             &                (/tl_proc%i_lci, tl_proc%i_lcj /) ) 
    1282             CALL file_move_att(tl_proc, tl_att) 
    1283  
    1284             tl_att=att_init( "DOMAIN_halo_size_start", & 
    1285             &                (/tl_proc%i_ldi, tl_proc%i_ldj /) ) 
    1286             CALL file_move_att(tl_proc, tl_att) 
    1287  
    1288             tl_att=att_init( "DOMAIN_halo_size_end", & 
    1289             &                (/tl_proc%i_lei, tl_proc%i_lej /) ) 
    1290             CALL file_move_att(tl_proc, tl_att) 
    1291  
    12921259            ! add processor to mpp structure 
    12931260            CALL mpp__add_proc(mpp__init_file_cdf, tl_proc) 
     
    12951262            ! clean  
    12961263            CALL file_clean(tl_proc) 
     1264            CALL dim_clean(tl_dim) 
    12971265            CALL att_clean(tl_att) 
    12981266         ENDIF 
     
    13031271         &  " do not exist") 
    13041272 
    1305       ENDIF       
     1273      ENDIF 
     1274 
    13061275   END FUNCTION mpp__init_file_cdf 
    13071276   !------------------------------------------------------------------- 
     
    13121281   ! 
    13131282   !> @author J.Paul 
    1314    !> - November, 2013- Initial Version 
    1315    ! 
     1283   !> @date November, 2013 - Initial Version 
     1284   !> @date January, 2016 
     1285   !> - mismatch with "halo" indices, use mpp__compute_halo 
     1286   !> 
    13161287   !> @param[in] td_file   file strcuture 
    13171288   !> @return mpp structure 
     
    13321303      INTEGER(i4)       :: il_pni, il_pnj, il_pnij          ! domain decomposition 
    13331304      INTEGER(i4)       :: il_area                          ! domain index 
     1305 
     1306      INTEGER(i4), DIMENSION(:), ALLOCATABLE :: il_lci 
     1307      INTEGER(i4), DIMENSION(:), ALLOCATABLE :: il_ldi 
     1308      INTEGER(i4), DIMENSION(:), ALLOCATABLE :: il_lei 
     1309      INTEGER(i4), DIMENSION(:), ALLOCATABLE :: il_impp 
     1310      INTEGER(i4), DIMENSION(:), ALLOCATABLE :: il_lcj 
     1311      INTEGER(i4), DIMENSION(:), ALLOCATABLE :: il_ldj 
     1312      INTEGER(i4), DIMENSION(:), ALLOCATABLE :: il_lej 
     1313      INTEGER(i4), DIMENSION(:), ALLOCATABLE :: il_jmpp 
    13341314 
    13351315      LOGICAL           ::  ll_exist 
     
    13851365            ALLOCATE( mpp__init_file_rstdimg%t_proc(il_pnij) , stat=il_status ) 
    13861366 
     1367            ALLOCATE(il_lci (il_pnij)) 
     1368            ALLOCATE(il_lcj (il_pnij)) 
     1369            ALLOCATE(il_ldi (il_pnij)) 
     1370            ALLOCATE(il_ldj (il_pnij)) 
     1371            ALLOCATE(il_lei (il_pnij)) 
     1372            ALLOCATE(il_lej (il_pnij)) 
     1373            ALLOCATE(il_impp(il_pnij)) 
     1374            ALLOCATE(il_jmpp(il_pnij)) 
     1375 
    13871376            tl_proc=file_copy(td_file) 
    13881377            ! remove dimension from file 
     
    14071396            &     il_area,                         & 
    14081397            &     il_iglo, il_jglo,                & 
    1409             &     mpp__init_file_rstdimg%t_proc(:)%i_lci,    & 
    1410             &     mpp__init_file_rstdimg%t_proc(:)%i_lcj,    & 
    1411             &     mpp__init_file_rstdimg%t_proc(:)%i_ldi,    & 
    1412             &     mpp__init_file_rstdimg%t_proc(:)%i_ldj,    & 
    1413             &     mpp__init_file_rstdimg%t_proc(:)%i_lei,    & 
    1414             &     mpp__init_file_rstdimg%t_proc(:)%i_lej,    & 
    1415             &     mpp__init_file_rstdimg%t_proc(:)%i_impp,   & 
    1416             &     mpp__init_file_rstdimg%t_proc(:)%i_jmpp 
     1398            &     il_lci(1:il_pnij),    & 
     1399            &     il_lcj(1:il_pnij),    & 
     1400            &     il_ldi(1:il_pnij),    & 
     1401            &     il_ldj(1:il_pnij),    & 
     1402            &     il_lei(1:il_pnij),    & 
     1403            &     il_lej(1:il_pnij),    & 
     1404            &     il_impp(1:il_pnij),   & 
     1405            &     il_jmpp(1:il_pnij) 
    14171406            CALL fct_err(il_status) 
    14181407            IF( il_status /= 0 )THEN 
     
    14201409               &              TRIM(td_file%c_name)) 
    14211410            ENDIF 
     1411 
     1412            mpp__init_file_rstdimg%t_proc(1:il_pnij)%i_lci = il_lci (1:il_pnij) 
     1413            mpp__init_file_rstdimg%t_proc(1:il_pnij)%i_lcj = il_lcj (1:il_pnij)  
     1414            mpp__init_file_rstdimg%t_proc(1:il_pnij)%i_ldi = il_ldi (1:il_pnij)  
     1415            mpp__init_file_rstdimg%t_proc(1:il_pnij)%i_ldj = il_ldj (1:il_pnij)  
     1416            mpp__init_file_rstdimg%t_proc(1:il_pnij)%i_lei = il_lei (1:il_pnij)  
     1417            mpp__init_file_rstdimg%t_proc(1:il_pnij)%i_lej = il_lej (1:il_pnij)  
     1418            mpp__init_file_rstdimg%t_proc(1:il_pnij)%i_impp= il_impp(1:il_pnij) 
     1419            mpp__init_file_rstdimg%t_proc(1:il_pnij)%i_jmpp= il_jmpp(1:il_pnij) 
     1420 
     1421            DEALLOCATE(il_lci)  
     1422            DEALLOCATE(il_lcj)  
     1423            DEALLOCATE(il_ldi)  
     1424            DEALLOCATE(il_ldj)  
     1425            DEALLOCATE(il_lei)  
     1426            DEALLOCATE(il_lej)  
     1427            DEALLOCATE(il_impp) 
     1428            DEALLOCATE(il_jmpp) 
    14221429 
    14231430            ! global domain size 
     
    14311438 
    14321439            DO ji=1,mpp__init_file_rstdimg%i_nproc 
     1440 
    14331441               ! get file name 
    14341442               cl_file =  file_rename(td_file%c_name,ji) 
     
    14411449               CALL file_move_att(mpp__init_file_rstdimg%t_proc(ji), tl_att)  
    14421450 
    1443                tl_att=att_init( "DOMAIN_position_first", & 
    1444                &                (/mpp__init_file_rstdimg%t_proc(ji)%i_impp, & 
    1445                &                  mpp__init_file_rstdimg%t_proc(ji)%i_jmpp /) ) 
    1446                CALL file_move_att(mpp__init_file_rstdimg%t_proc(ji), tl_att) 
    1447  
    1448                tl_att=att_init( "DOMAIN_position_last", & 
    1449                &                (/mpp__init_file_rstdimg%t_proc(ji)%i_lci, & 
    1450                &                  mpp__init_file_rstdimg%t_proc(ji)%i_lcj /) ) 
    1451                CALL file_move_att(mpp__init_file_rstdimg%t_proc(ji), tl_att) 
    1452  
    1453                tl_att=att_init( "DOMAIN_halo_size_start", & 
    1454                &                (/mpp__init_file_rstdimg%t_proc(ji)%i_ldi, & 
    1455                &                  mpp__init_file_rstdimg%t_proc(ji)%i_ldj /) ) 
    1456                CALL file_move_att(mpp__init_file_rstdimg%t_proc(ji), tl_att)                
    1457  
    1458                tl_att=att_init( "DOMAIN_halo_size_end", & 
    1459                &                (/mpp__init_file_rstdimg%t_proc(ji)%i_lei, & 
    1460                &                  mpp__init_file_rstdimg%t_proc(ji)%i_lej /) ) 
    1461                CALL file_move_att(mpp__init_file_rstdimg%t_proc(ji), tl_att) 
    14621451            ENDDO 
    14631452  
     
    14821471            CALL mpp_move_att(mpp__init_file_rstdimg, tl_att) 
    14831472 
    1484             tl_att=att_init( "DOMAIN_I_position_first", & 
    1485             &                 mpp__init_file_rstdimg%t_proc(:)%i_impp ) 
    1486             CALL mpp_move_att(mpp__init_file_rstdimg, tl_att) 
    1487  
    1488             tl_att=att_init( "DOMAIN_J_position_first", & 
    1489             &                 mpp__init_file_rstdimg%t_proc(:)%i_jmpp ) 
    1490             CALL mpp_move_att(mpp__init_file_rstdimg, tl_att) 
    1491  
    1492             tl_att=att_init( "DOMAIN_I_position_last", & 
    1493             &                 mpp__init_file_rstdimg%t_proc(:)%i_lci ) 
    1494             CALL mpp_move_att(mpp__init_file_rstdimg, tl_att) 
    1495  
    1496             tl_att=att_init( "DOMAIN_J_position_last", & 
    1497             &                 mpp__init_file_rstdimg%t_proc(:)%i_lcj ) 
    1498             CALL mpp_move_att(mpp__init_file_rstdimg, tl_att) 
    1499  
    1500             tl_att=att_init( "DOMAIN_I_halo_size_start", & 
    1501             &                 mpp__init_file_rstdimg%t_proc(:)%i_ldi ) 
    1502             CALL mpp_move_att(mpp__init_file_rstdimg, tl_att) 
    1503  
    1504             tl_att=att_init( "DOMAIN_J_halo_size_start", & 
    1505             &                 mpp__init_file_rstdimg%t_proc(:)%i_ldj ) 
    1506             CALL mpp_move_att(mpp__init_file_rstdimg, tl_att) 
    1507  
    1508             tl_att=att_init( "DOMAIN_I_halo_size_end", & 
    1509             &                 mpp__init_file_rstdimg%t_proc(:)%i_lei ) 
    1510             CALL mpp_move_att(mpp__init_file_rstdimg, tl_att) 
    1511  
    1512             tl_att=att_init( "DOMAIN_J_halo_size_end", & 
    1513             &                 mpp__init_file_rstdimg%t_proc(:)%i_lej ) 
    1514             CALL mpp_move_att(mpp__init_file_rstdimg, tl_att) 
     1473            CALL mpp_get_dom( mpp__init_file_rstdimg ) 
     1474 
     1475            CALL mpp__compute_halo( mpp__init_file_rstdimg ) 
    15151476 
    15161477            ! clean 
     
    15321493   ! 
    15331494   !> @author J.Paul 
    1534    !> - Nov, 2013- Initial Version 
     1495   !> @date November, 2013 - Initial Version 
    15351496   ! 
    15361497   !> @param[in] td_mpp    mpp structure 
     
    15941555      ! Argument 
    15951556      TYPE(TMPP), INTENT(INOUT) :: td_mpp 
    1596       TYPE(TVAR), INTENT(IN)    :: td_var 
     1557      TYPE(TVAR), INTENT(INOUT) :: td_var 
    15971558 
    15981559      ! local variable 
     
    16241585            IF( il_varid /= 0 )THEN 
    16251586 
    1626                CALL logger_error( " MPP ADD VAR: variable "//TRIM(td_var%c_name)//& 
    1627                &  ", standard name "//TRIM(td_var%c_stdname)//& 
    1628                &  ", already in mpp "//TRIM(td_mpp%c_name) ) 
    1629  
    16301587               DO ji=1,td_mpp%t_proc(1)%i_nvar 
    16311588                  CALL logger_debug( " MPP ADD VAR: in mpp structure : & 
     
    16341591                  &  TRIM(td_mpp%t_proc(1)%t_var(ji)%c_stdname) ) 
    16351592               ENDDO 
     1593               CALL logger_error( " MPP ADD VAR: variable "//TRIM(td_var%c_name)//& 
     1594               &  ", standard name "//TRIM(td_var%c_stdname)//& 
     1595               &  ", already in mpp "//TRIM(td_mpp%c_name) ) 
    16361596 
    16371597            ELSE 
     
    16431603               ! check used dimension  
    16441604               IF( mpp__check_dim(td_mpp, td_var) )THEN 
     1605          
     1606                  ! check variable dimension expected 
     1607                  CALL var_check_dim(td_var) 
    16451608 
    16461609                  ! update dimension if need be 
     
    16751638   ! 
    16761639   !> @author J.Paul 
    1677    !> - November, 2013- Initial Version 
     1640   !> @date November, 2013 - Initial Version 
    16781641   ! 
    16791642   !> @param[in] td_mpp    mpp structure 
     
    18401803   !> @author J.Paul 
    18411804   !> @date November, 2013 - Initial version 
     1805   !> @date February, 2015  
     1806   !> - define local variable structure to avoid mistake with pointer 
    18421807   ! 
    18431808   !> @param[inout] td_mpp    mpp strcuture 
     
    18521817      ! local variable 
    18531818      INTEGER(i4)       :: il_varid 
     1819      TYPE(TVAR)        :: tl_var 
    18541820      !---------------------------------------------------------------- 
    18551821      ! check if mpp exist 
     
    18821848            ELSE 
    18831849 
    1884                CALL mpp_del_var(td_mpp, td_mpp%t_proc(1)%t_var(il_varid))  
     1850               tl_var=var_copy(td_mpp%t_proc(1)%t_var(il_varid)) 
     1851               CALL mpp_del_var(td_mpp, tl_var) 
    18851852 
    18861853            ENDIF 
     
    19081875      TYPE(TVAR) :: tl_var 
    19091876      !---------------------------------------------------------------- 
    1910       ! copy variable 
     1877      ! copy variablie 
    19111878      tl_var=var_copy(td_var) 
    19121879 
     
    19351902   !> - check proc type 
    19361903   !------------------------------------------------------------------- 
    1937    SUBROUTINE mpp__add_proc( td_mpp, td_proc ) 
     1904   SUBROUTINE mpp__add_proc_unit( td_mpp, td_proc ) 
    19381905      IMPLICIT NONE 
    19391906      ! Argument 
     
    19501917      CHARACTER(LEN=lc)                            :: cl_name 
    19511918      !---------------------------------------------------------------- 
     1919 
     1920!      ALLOCATE(tl_proc(1)) 
     1921!      tl_proc(1)=file_copy(td_proc) 
     1922! 
     1923!      CALL mpp__add_proc(td_mpp, tl_proc(:)) 
     1924! 
     1925!      CALL file_clean(tl_proc(:)) 
     1926!      DEALLOCATE(tl_proc) 
    19521927 
    19531928      ! check file name 
     
    20492024 
    20502025      ENDIF 
    2051    END SUBROUTINE mpp__add_proc 
     2026 
     2027   END SUBROUTINE mpp__add_proc_unit 
    20522028   !------------------------------------------------------------------- 
    20532029   !> @brief 
     
    21932169   !> 
    21942170   !> @author J.Paul 
    2195    !> - November, 2013- Initial Version 
     2171   !> @date November, 2013 - Initial Version 
     2172   !> @date July, 2015  
     2173   !> - rewrite the same as way var_add_dim 
    21962174   !> 
    21972175   !> @param[inout] td_mpp mpp structure 
     
    22082186 
    22092187      ! loop indices 
    2210       INTEGER(i4) :: ji 
    22112188      !---------------------------------------------------------------- 
    22122189      IF( td_mpp%i_ndim <= ip_maxdim )THEN 
    22132190 
    2214          ! check if dimension already in mpp structure 
    2215          il_ind=dim_get_index(td_mpp%t_dim(:), td_dim%c_name, td_dim%c_sname) 
    2216          IF( il_ind /= 0 )THEN 
    2217  
    2218             IF( td_mpp%t_dim(il_ind)%l_use )THEN 
    2219                CALL logger_error( & 
    2220                &  "MPP ADD DIM: dimension "//TRIM(td_dim%c_name)//& 
    2221                &  ", short name "//TRIM(td_dim%c_sname)//& 
    2222                &  ", already used in mpp "//TRIM(td_mpp%c_name) ) 
    2223             ELSE 
    2224                ! replace dimension 
    2225                td_mpp%t_dim(il_ind)=dim_copy(td_dim) 
    2226                td_mpp%t_dim(il_ind)%i_id=il_ind 
    2227                td_mpp%t_dim(il_ind)%l_use=.TRUE. 
    2228             ENDIF 
    2229  
     2191         ! check if dimension already used in mpp structure 
     2192         il_ind=SCAN(TRIM(cp_dimorder),TRIM(td_dim%c_sname)) 
     2193         IF( il_ind == 0 )THEN 
     2194            CALL logger_warn( & 
     2195            &  " MPP ADD DIM: dimension "//TRIM(td_dim%c_name)//& 
     2196            &  ", short name "//TRIM(td_dim%c_sname)//& 
     2197            &  ", will not be added in mpp "//TRIM(td_mpp%c_name) ) 
     2198         ELSEIF( td_mpp%t_dim(il_ind)%l_use )THEN 
     2199            CALL logger_error( & 
     2200            &  " MPP ADD DIM: dimension "//TRIM(td_dim%c_name)//& 
     2201            &  ", short name "//TRIM(td_dim%c_sname)//& 
     2202            &  ", already used in mpp "//TRIM(td_mpp%c_name) ) 
    22302203         ELSE 
    22312204 
    2232             IF( td_mpp%i_ndim == ip_maxdim )THEN 
    2233                CALL logger_error( & 
    2234                &  "MPP ADD DIM: can not add dimension "//TRIM(td_dim%c_name)//& 
    2235                &  ", short name "//TRIM(td_dim%c_sname)//& 
    2236                &  ", in mpp "//TRIM(td_mpp%c_name)//". Already "//& 
    2237                &  TRIM(fct_str(ip_maxdim))//" dimensions." ) 
    2238             ELSE 
    2239                ! search empty dimension 
    2240                DO ji=1,ip_maxdim 
    2241                   IF( td_mpp%t_dim(ji)%i_id == 0 )THEN 
    2242                      il_ind=ji  
    2243                      EXIT 
    2244                   ENDIF 
    2245                ENDDO 
    2246   
    2247                ! add new dimension     
    2248                td_mpp%t_dim(il_ind)=dim_copy(td_dim) 
    2249                ! update number of attribute 
    2250                td_mpp%i_ndim=COUNT(td_mpp%t_dim(:)%l_use) 
    2251  
    2252                td_mpp%t_dim(il_ind)%l_use=.TRUE. 
    2253                td_mpp%t_dim(il_ind)%i_id=td_mpp%i_ndim 
    2254             ENDIF 
     2205            ! back to disorder dimension array  
     2206            CALL dim_disorder(td_mpp%t_dim(:)) 
     2207 
     2208            ! add new dimension 
     2209            td_mpp%t_dim(td_mpp%i_ndim+1)=dim_copy(td_dim) 
     2210 
     2211            ! update number of attribute 
     2212            td_mpp%i_ndim=COUNT(td_mpp%t_dim(:)%l_use) 
    22552213 
    22562214         ENDIF 
     2215         ! reorder dimension to ('x','y','z','t') 
     2216         CALL dim_reorder(td_mpp%t_dim(:)) 
    22572217 
    22582218      ELSE 
     
    22682228   !> 
    22692229   !> @author J.Paul 
    2270    !> - November, 2013- Initial Version 
     2230   !> @date November, 2013 - Initial Version 
     2231   !> @date July, 2015  
     2232   !> - rewrite the same as way var_del_dim 
    22712233   !> 
    22722234   !> @param[inout] td_mpp mpp structure 
     
    22802242 
    22812243      ! local variable 
    2282       INTEGER(i4) :: il_status 
    22832244      INTEGER(i4) :: il_ind 
    2284       TYPE(TDIM), DIMENSION(:), ALLOCATABLE  :: tl_dim 
     2245      TYPE(TDIM)  :: tl_dim 
    22852246 
    22862247      ! loop indices 
    2287       INTEGER(i4) :: ji 
    2288       !---------------------------------------------------------------- 
    2289       ! check if dimension already in mpp structure 
    2290       il_ind=dim_get_index(td_mpp%t_dim(:), td_dim%c_name, td_dim%c_sname) 
    2291       IF( il_ind == 0 )THEN 
    2292  
    2293          CALL logger_error( & 
    2294          &  "MPP DEL DIM: no dimension "//TRIM(td_dim%c_name)//& 
     2248      !---------------------------------------------------------------- 
     2249 
     2250 
     2251      IF( td_mpp%i_ndim <= ip_maxdim )THEN 
     2252 
     2253         CALL logger_trace( & 
     2254         &  " MPP DEL DIM: delete dimension "//TRIM(td_dim%c_name)//& 
    22952255         &  ", short name "//TRIM(td_dim%c_sname)//& 
    22962256         &  ", in mpp "//TRIM(td_mpp%c_name) ) 
     2257          
     2258         ! check if dimension already in variable structure 
     2259         il_ind=SCAN(TRIM(cp_dimorder),TRIM(td_dim%c_sname)) 
     2260 
     2261         ! replace dimension by empty one 
     2262         td_mpp%t_dim(il_ind)=dim_copy(tl_dim) 
     2263 
     2264         ! update number of dimension 
     2265         td_mpp%i_ndim=COUNT(td_mpp%t_dim(:)%l_use) 
     2266 
     2267         ! reorder dimension to ('x','y','z','t') 
     2268         CALL dim_reorder(td_mpp%t_dim) 
    22972269 
    22982270      ELSE 
    2299  
    2300          ALLOCATE( tl_dim(td_mpp%i_ndim-1), stat=il_status ) 
    2301          IF(il_status /= 0 )THEN 
    2302  
    2303             CALL logger_error( & 
    2304             &  "MPP DEL DIM: not enough space to put dimensions from "//& 
    2305             &  TRIM(td_mpp%c_name)//" in temporary dimension structure") 
    2306  
    2307          ELSE 
    2308  
    2309             ! save temporary dimension's mpp structure 
    2310             tl_dim( 1 : il_ind-1 ) = dim_copy(td_mpp%t_dim( 1 : il_ind-1 )) 
    2311             tl_dim( il_ind : td_mpp%i_ndim-1 ) = & 
    2312             &           dim_copy(td_mpp%t_dim( il_ind+1 : td_mpp%i_ndim )) 
    2313  
    2314             ! remove dimension from file 
    2315             CALL dim_clean(td_mpp%t_dim(:)) 
    2316             ! copy dimension in file, except one 
    2317             td_mpp%t_dim(1:td_mpp%i_ndim)=dim_copy(tl_dim(:)) 
    2318  
    2319             ! update number of dimension 
    2320             td_mpp%i_ndim=td_mpp%i_ndim-1 
    2321  
    2322             ! update dimension id 
    2323             DO ji=1,td_mpp%i_ndim 
    2324                td_mpp%t_dim(ji)%i_id=ji 
    2325             ENDDO 
    2326  
    2327             ! clean 
    2328             CALL dim_clean(tl_dim(:)) 
    2329             DEALLOCATE(tl_dim) 
    2330  
    2331          ENDIF 
    2332  
     2271         CALL logger_error( & 
     2272         &  " MPP DEL DIM: too much dimension in mpp "//& 
     2273         &  TRIM(td_mpp%c_name)//" ("//TRIM(fct_str(td_mpp%i_ndim))//")") 
    23332274      ENDIF 
    23342275 
     
    23402281   !> 
    23412282   !> @author J.Paul 
    2342    !> - November, 2013- Initial Version 
     2283   !> @date November, 2013 - Initial Version 
    23432284   !> 
    23442285   !> @param[inout] td_mpp mpp structure 
     
    24882429            &  ", in mpp structure "//TRIM(td_mpp%c_name) ) 
    24892430 
    2490             IF( ASSOCIATED(td_mpp%t_proc(1)%t_var) )THEN 
     2431            IF( ASSOCIATED(td_mpp%t_proc(1)%t_att) )THEN 
    24912432               DO ji=1,td_mpp%t_proc(1)%i_natt 
    24922433                  CALL logger_debug( "MPP DEL ATT: in mpp structure : & 
    2493                   &  attribute : "//TRIM(td_mpp%t_proc(1)%t_var(ji)%c_name) ) 
     2434                  &  attribute : "//TRIM(td_mpp%t_proc(1)%t_att(ji)%c_name) ) 
    24942435               ENDDO 
    24952436            ENDIF 
     
    25162457   !> @author J.Paul 
    25172458   !> @date November, 2013 - Initial version 
     2459   !> @date February, 2015  
     2460   !> - define local attribute structure to avoid mistake with pointer 
    25182461   ! 
    25192462   !> @param[inout] td_mpp    mpp strcuture 
     
    25272470 
    25282471      ! local variable 
    2529       INTEGER(i4)       :: il_attid 
     2472      INTEGER(i4) :: il_attid 
     2473      TYPE(TATT)  :: tl_att 
    25302474      !---------------------------------------------------------------- 
    25312475      ! check if mpp exist 
     
    25512495            IF( il_attid == 0 )THEN 
    25522496 
    2553                CALL logger_warn( & 
     2497               CALL logger_debug( & 
    25542498               &  "MPP DEL ATT : there is no attribute with "//& 
    25552499               &  "name "//TRIM(cd_name)//" in mpp structure "//& 
     
    25582502            ELSE 
    25592503 
    2560                CALL mpp_del_att(td_mpp, td_mpp%t_proc(1)%t_att(il_attid))  
     2504               tl_att=att_copy(td_mpp%t_proc(1)%t_att(il_attid)) 
     2505               CALL mpp_del_att(td_mpp, tl_att)  
    25612506 
    25622507            ENDIF 
     
    25992544   !------------------------------------------------------------------- 
    26002545   !> @brief 
    2601    !>    This subroutine compute domain decomposition for niproc and njproc  
    2602    !> processors following I and J. 
    2603    !> 
     2546   !>    This function initialise domain layout 
     2547   !>  
    26042548   !> @detail 
    2605    !> To do so, it need to know : 
    2606    !> - global domain dimension 
    2607    !> - overlap region length 
    2608    !> - number of processors following I and J 
     2549   !> Domain layout is first compute, with domain dimension, overlap between subdomain, 
     2550   !> and the number of processors following I and J. 
     2551   !> Then the number of sea/land processors is compute with mask 
    26092552   ! 
    26102553   !> @author J.Paul 
    2611    !> @date November, 2013 - Initial version 
     2554   !> @date October, 2015 - Initial version 
     2555   ! 
     2556   !> @param[in] td_mpp mpp strcuture 
     2557   !> @param[in] id_mask   sub domain mask (sea=1, land=0) 
     2558   !> @pâram[in] id_niproc number of processors following I 
     2559   !> @pâram[in] id_njproc number of processors following J 
     2560   !> @return domain layout structure 
     2561   !------------------------------------------------------------------- 
     2562   FUNCTION layout__init( td_mpp, id_mask, id_niproc, id_njproc ) RESULT(td_lay) 
     2563      IMPLICIT NONE 
     2564      ! Argument 
     2565      TYPE(TMPP)                 , INTENT(IN) :: td_mpp 
     2566      INTEGER(i4), DIMENSION(:,:), INTENT(IN) :: id_mask 
     2567      INTEGER(i4)                , INTENT(IN) :: id_niproc 
     2568      INTEGER(i4)                , INTENT(IN) :: id_njproc 
     2569 
     2570      ! function 
     2571      TYPE(TLAY) :: td_lay 
     2572 
     2573      ! local variable 
     2574      INTEGER(i4) :: ii1, ii2 
     2575      INTEGER(i4) :: ij1, ij2 
     2576 
     2577      INTEGER(i4) :: il_ldi 
     2578      INTEGER(i4) :: il_ldj 
     2579      INTEGER(i4) :: il_lei 
     2580      INTEGER(i4) :: il_lej 
     2581 
     2582      INTEGER(i4) :: il_isize !< i-direction maximum sub domain size  
     2583      INTEGER(i4) :: il_jsize !< j-direction maximum sub domain size 
     2584      INTEGER(i4) :: il_resti !<   
     2585      INTEGER(i4) :: il_restj !<   
     2586 
     2587      ! loop indices 
     2588      INTEGER(i4) :: ji 
     2589      INTEGER(i4) :: jj 
     2590      !---------------------------------------------------------------- 
     2591 
     2592      ! intialise 
     2593      td_lay%i_niproc=id_niproc 
     2594      td_lay%i_njproc=id_njproc 
     2595 
     2596      CALL logger_info( "MPP COMPUTE LAYOUT: compute domain layout with "//& 
     2597      &               TRIM(fct_str(td_lay%i_niproc))//" x "//& 
     2598      &               TRIM(fct_str(td_lay%i_njproc))//" processors") 
     2599 
     2600      ! maximum size of sub domain 
     2601      il_isize = ((td_mpp%t_dim(1)%i_len - 2*td_mpp%i_preci + (td_lay%i_niproc-1))/ & 
     2602      &           td_lay%i_niproc) + 2*td_mpp%i_preci 
     2603      il_jsize = ((td_mpp%t_dim(2)%i_len - 2*td_mpp%i_precj + (td_lay%i_njproc-1))/ & 
     2604      &           td_lay%i_njproc) + 2*td_mpp%i_precj 
     2605 
     2606      il_resti = MOD(td_mpp%t_dim(1)%i_len - 2*td_mpp%i_preci, td_lay%i_niproc) 
     2607      il_restj = MOD(td_mpp%t_dim(2)%i_len - 2*td_mpp%i_precj, td_lay%i_njproc) 
     2608      IF( il_resti == 0 ) il_resti = td_lay%i_niproc 
     2609      IF( il_restj == 0 ) il_restj = td_lay%i_njproc 
     2610 
     2611      ! compute dimension of each sub domain 
     2612      ALLOCATE( td_lay%i_lci(td_lay%i_niproc,td_lay%i_njproc) ) 
     2613      ALLOCATE( td_lay%i_lcj(td_lay%i_niproc,td_lay%i_njproc) ) 
     2614 
     2615      td_lay%i_lci( 1          : il_resti       , : ) = il_isize 
     2616      td_lay%i_lci( il_resti+1 : td_lay%i_niproc, : ) = il_isize-1 
     2617 
     2618      td_lay%i_lcj( : , 1          : il_restj       ) = il_jsize 
     2619      td_lay%i_lcj( : , il_restj+1 : td_lay%i_njproc) = il_jsize-1 
     2620 
     2621      ! compute first index of each sub domain 
     2622      ALLOCATE( td_lay%i_impp(td_lay%i_niproc,td_lay%i_njproc) ) 
     2623      ALLOCATE( td_lay%i_jmpp(td_lay%i_niproc,td_lay%i_njproc) ) 
     2624 
     2625      td_lay%i_impp(:,:)=1 
     2626      td_lay%i_jmpp(:,:)=1 
     2627 
     2628      IF( td_lay%i_niproc > 1 )THEN 
     2629         DO jj=1,td_lay%i_njproc 
     2630            DO ji=2,td_lay%i_niproc 
     2631               td_lay%i_impp(ji,jj) = td_lay%i_impp(ji-1,jj) + & 
     2632               &                       td_lay%i_lci (ji-1,jj) - 2*td_mpp%i_preci 
     2633            ENDDO 
     2634         ENDDO 
     2635      ENDIF 
     2636 
     2637      IF( td_lay%i_njproc > 1 )THEN 
     2638         DO jj=2,td_lay%i_njproc 
     2639            DO ji=1,td_lay%i_niproc 
     2640               td_lay%i_jmpp(ji,jj) = td_lay%i_jmpp(ji,jj-1) + & 
     2641               &                       td_lay%i_lcj (ji,jj-1) - 2*td_mpp%i_precj 
     2642            ENDDO 
     2643         ENDDO  
     2644      ENDIF 
     2645 
     2646      ALLOCATE(td_lay%i_msk(td_lay%i_niproc,td_lay%i_njproc)) 
     2647      td_lay%i_msk(:,:)=0 
     2648      ! init number of sea/land proc 
     2649      td_lay%i_nsea=0 
     2650      td_lay%i_nland=td_lay%i_njproc*td_lay%i_niproc 
     2651 
     2652      ! check if processor is land or sea 
     2653      DO jj = 1,td_lay%i_njproc 
     2654         DO ji = 1,td_lay%i_niproc 
     2655 
     2656            ! compute first and last indoor indices 
     2657            ! west boundary 
     2658            IF( ji == 1 )THEN 
     2659               il_ldi = 1  
     2660            ELSE 
     2661               il_ldi = 1 + td_mpp%i_preci 
     2662            ENDIF 
     2663 
     2664            ! south boundary 
     2665            IF( jj == 1 )THEN 
     2666               il_ldj = 1  
     2667            ELSE 
     2668               il_ldj = 1 + td_mpp%i_precj 
     2669            ENDIF 
     2670 
     2671            ! east boundary 
     2672            IF( ji == td_mpp%i_niproc )THEN 
     2673               il_lei = td_lay%i_lci(ji,jj) 
     2674            ELSE 
     2675               il_lei = td_lay%i_lci(ji,jj) - td_mpp%i_preci 
     2676            ENDIF 
     2677 
     2678            ! north boundary 
     2679            IF( jj == td_mpp%i_njproc )THEN 
     2680               il_lej = td_lay%i_lcj(ji,jj) 
     2681            ELSE 
     2682               il_lej = td_lay%i_lcj(ji,jj) - td_mpp%i_precj 
     2683            ENDIF 
     2684 
     2685            ii1=td_lay%i_impp(ji,jj) + il_ldi - 1 
     2686            ii2=td_lay%i_impp(ji,jj) + il_lei - 1 
     2687 
     2688            ij1=td_lay%i_jmpp(ji,jj) + il_ldj - 1 
     2689            ij2=td_lay%i_jmpp(ji,jj) + il_lej - 1 
     2690 
     2691            td_lay%i_msk(ji,jj)=SUM( id_mask(ii1:ii2,ij1:ij2) ) 
     2692            IF( td_lay%i_msk(ji,jj) > 0 )THEN ! sea 
     2693               td_lay%i_nsea =td_lay%i_nsea +1 
     2694               td_lay%i_nland=td_lay%i_nland-1 
     2695            ENDIF 
     2696 
     2697         ENDDO 
     2698      ENDDO 
     2699 
     2700      CALL logger_info( "MPP COMPUTE LAYOUT: sea proc "//TRIM(fct_str(td_lay%i_nsea))) 
     2701      CALL logger_info( "MPP COMPUTE LAYOUT: land proc "//TRIM(fct_str(td_lay%i_nland))) 
     2702      CALL logger_info( "MPP COMPUTE LAYOUT: sum "//TRIM(fct_str( SUM(td_lay%i_msk(:,:))))) 
     2703 
     2704      td_lay%i_mean= SUM(td_lay%i_msk(:,:)) / td_lay%i_nsea 
     2705      td_lay%i_min = MINVAL(td_lay%i_msk(:,:),td_lay%i_msk(:,:)/=0) 
     2706      td_lay%i_max = MAXVAL(td_lay%i_msk(:,:)) 
     2707 
     2708      IF( lm_layout )THEN 
     2709         ! print info  
     2710         WRITE(im_iumout,*) ' ' 
     2711         WRITE(im_iumout,*) " jpni=",td_lay%i_niproc ," jpnj=",td_lay%i_njproc 
     2712         WRITE(im_iumout,*) " jpi= ",il_isize," jpj= ",il_jsize 
     2713         WRITE(im_iumout,*) " iresti=",td_mpp%i_preci," irestj=",td_mpp%i_precj 
     2714 
     2715 
     2716         WRITE(im_iumout,*) ' nombre de processeurs       ',td_lay%i_niproc*td_lay%i_njproc 
     2717         WRITE(im_iumout,*) ' nombre de processeurs mer   ',td_lay%i_nsea 
     2718         WRITE(im_iumout,*) ' nombre de processeurs terre ',td_lay%i_nland 
     2719         WRITE(im_iumout,*) ' moyenne de recouvrement     ',td_lay%i_mean 
     2720         WRITE(im_iumout,*) ' minimum de recouvrement     ',td_lay%i_min 
     2721         WRITE(im_iumout,*) ' maximum de recouvrement     ',td_lay%i_max 
     2722      ENDIF 
     2723 
     2724   END FUNCTION layout__init 
     2725   !------------------------------------------------------------------- 
     2726   !> @brief  
     2727   !>  This subroutine clean domain layout strcuture. 
     2728   !> 
     2729   !> @author J.Paul 
     2730   !> @date October, 2015 - Initial version 
     2731   !> 
     2732   !> @param[inout] td_lay domain layout strcuture 
     2733   !------------------------------------------------------------------- 
     2734   SUBROUTINE layout__clean( td_lay ) 
     2735      IMPLICIT NONE 
     2736      ! Argument 
     2737      TYPE(TLAY),  INTENT(INOUT) :: td_lay 
     2738      !---------------------------------------------------------------- 
     2739 
     2740      IF( ASSOCIATED(td_lay%i_msk) )THEN 
     2741         DEALLOCATE(td_lay%i_msk) 
     2742      ENDIF 
     2743      IF( ASSOCIATED(td_lay%i_impp) )THEN 
     2744         DEALLOCATE(td_lay%i_impp) 
     2745      ENDIF 
     2746      IF( ASSOCIATED(td_lay%i_jmpp) )THEN 
     2747         DEALLOCATE(td_lay%i_jmpp) 
     2748      ENDIF 
     2749      IF( ASSOCIATED(td_lay%i_lci) )THEN 
     2750         DEALLOCATE(td_lay%i_lci) 
     2751      ENDIF 
     2752      IF( ASSOCIATED(td_lay%i_lcj) )THEN 
     2753         DEALLOCATE(td_lay%i_lcj) 
     2754      ENDIF 
     2755 
     2756      td_lay%i_niproc=0 
     2757      td_lay%i_njproc=0 
     2758      td_lay%i_nland =0 
     2759      td_lay%i_nsea  =0 
     2760 
     2761      td_lay%i_mean  =0 
     2762      td_lay%i_min   =0 
     2763      td_lay%i_max   =0 
     2764 
     2765   END SUBROUTINE layout__clean 
     2766   !------------------------------------------------------------------- 
     2767   !> @brief 
     2768   !> This subroutine copy domain layout structure in another one. 
     2769   !> 
     2770   !> @warning do not use on the output of a function who create or read a 
     2771   !> structure (ex: tl_seg=seg__copy(seg__init()) is forbidden). 
     2772   !> This will create memory leaks. 
     2773   !> @warning to avoid infinite loop, do not use any function inside  
     2774   !> this subroutine 
     2775   !> 
     2776   !> @author J.Paul 
     2777   !> @date October, 2015 - Initial Version 
     2778   ! 
     2779   !> @param[in] td_lay   domain layout structure 
     2780   !> @return copy of input domain layout structure 
     2781   !------------------------------------------------------------------- 
     2782   FUNCTION layout__copy( td_lay ) 
     2783      IMPLICIT NONE 
     2784      ! Argument 
     2785      TYPE(TLAY), INTENT(IN)  :: td_lay 
     2786      ! function 
     2787      TYPE(TLAY) :: layout__copy 
     2788 
     2789      ! local variable 
     2790      INTEGER(i4), DIMENSION(2)                :: il_shape 
     2791      INTEGER(i4), DIMENSION(:,:), ALLOCATABLE :: il_tmp 
     2792      ! loop indices 
     2793      !---------------------------------------------------------------- 
     2794 
     2795      ! copy scalar  
     2796      layout__copy%i_niproc   = td_lay%i_niproc 
     2797      layout__copy%i_njproc   = td_lay%i_njproc 
     2798      layout__copy%i_nland    = td_lay%i_nland  
     2799      layout__copy%i_nsea     = td_lay%i_nsea   
     2800      layout__copy%i_mean     = td_lay%i_mean   
     2801      layout__copy%i_min      = td_lay%i_min    
     2802      layout__copy%i_max      = td_lay%i_max    
     2803 
     2804      ! copy pointers 
     2805      IF( ASSOCIATED(layout__copy%i_msk) )THEN 
     2806         DEALLOCATE(layout__copy%i_msk) 
     2807      ENDIF 
     2808      IF( ASSOCIATED(td_lay%i_msk) )THEN 
     2809         il_shape(:)=SHAPE(td_lay%i_msk(:,:)) 
     2810         ALLOCATE( layout__copy%i_msk(il_shape(jp_I),il_shape(jp_J)) ) 
     2811         layout__copy%i_msk(:,:)=td_lay%i_msk(:,:) 
     2812      ENDIF 
     2813 
     2814      IF( ASSOCIATED(layout__copy%i_msk) ) DEALLOCATE(layout__copy%i_msk) 
     2815      IF( ASSOCIATED(td_lay%i_msk) )THEN 
     2816         il_shape(:)=SHAPE(td_lay%i_msk(:,:)) 
     2817         ALLOCATE(il_tmp(il_shape(jp_I),il_shape(jp_J))) 
     2818         il_tmp(:,:)=td_lay%i_msk(:,:) 
     2819 
     2820         ALLOCATE( layout__copy%i_msk(il_shape(jp_I),il_shape(jp_J)) ) 
     2821         layout__copy%i_msk(:,:)=il_tmp(:,:) 
     2822 
     2823         DEALLOCATE(il_tmp) 
     2824      ENDIF 
     2825 
     2826      IF( ASSOCIATED(layout__copy%i_impp) ) DEALLOCATE(layout__copy%i_impp) 
     2827      IF( ASSOCIATED(td_lay%i_impp) )THEN 
     2828         il_shape(:)=SHAPE(td_lay%i_impp(:,:)) 
     2829         ALLOCATE(il_tmp(il_shape(jp_I),il_shape(jp_J))) 
     2830         il_tmp(:,:)=td_lay%i_impp(:,:) 
     2831 
     2832         ALLOCATE( layout__copy%i_impp(il_shape(jp_I),il_shape(jp_J)) ) 
     2833         layout__copy%i_impp(:,:)=il_tmp(:,:) 
     2834 
     2835         DEALLOCATE(il_tmp) 
     2836      ENDIF 
     2837 
     2838      IF( ASSOCIATED(layout__copy%i_jmpp) ) DEALLOCATE(layout__copy%i_jmpp) 
     2839      IF( ASSOCIATED(td_lay%i_jmpp) )THEN 
     2840         il_shape(:)=SHAPE(td_lay%i_jmpp(:,:)) 
     2841         ALLOCATE(il_tmp(il_shape(jp_I),il_shape(jp_J))) 
     2842         il_tmp(:,:)=td_lay%i_jmpp(:,:) 
     2843 
     2844         ALLOCATE( layout__copy%i_jmpp(il_shape(jp_I),il_shape(jp_J)) ) 
     2845         layout__copy%i_jmpp(:,:)=il_tmp(:,:) 
     2846 
     2847         DEALLOCATE(il_tmp) 
     2848      ENDIF 
     2849 
     2850      IF( ASSOCIATED(layout__copy%i_lci) ) DEALLOCATE(layout__copy%i_lci) 
     2851      IF( ASSOCIATED(td_lay%i_lci) )THEN 
     2852         il_shape(:)=SHAPE(td_lay%i_lci(:,:)) 
     2853         ALLOCATE(il_tmp(il_shape(jp_I),il_shape(jp_J))) 
     2854         il_tmp(:,:)=td_lay%i_lci(:,:) 
     2855 
     2856         ALLOCATE( layout__copy%i_lci(il_shape(jp_I),il_shape(jp_J)) ) 
     2857         layout__copy%i_lci(:,:)=il_tmp(:,:) 
     2858 
     2859         DEALLOCATE(il_tmp) 
     2860      ENDIF 
     2861 
     2862      IF( ASSOCIATED(layout__copy%i_lcj) ) DEALLOCATE(layout__copy%i_lcj) 
     2863      IF( ASSOCIATED(td_lay%i_lcj) )THEN 
     2864         il_shape(:)=SHAPE(td_lay%i_lcj(:,:)) 
     2865         ALLOCATE(il_tmp(il_shape(jp_I),il_shape(jp_J))) 
     2866         il_tmp(:,:)=td_lay%i_lcj(:,:) 
     2867 
     2868         ALLOCATE( layout__copy%i_lcj(il_shape(jp_I),il_shape(jp_J)) ) 
     2869         layout__copy%i_lcj(:,:)=il_tmp(:,:) 
     2870 
     2871         DEALLOCATE(il_tmp) 
     2872      ENDIF 
     2873 
     2874   END FUNCTION layout__copy 
     2875   !------------------------------------------------------------------- 
     2876   !> @brief 
     2877   !>    This subroutine create mpp structure using domain layout 
     2878   !> 
     2879   !> @detail 
     2880   ! 
     2881   !> @author J.Paul 
     2882   !> @date October, 2015 - Initial version 
    26122883   ! 
    26132884   !> @param[inout] td_mpp mpp strcuture 
    2614    !------------------------------------------------------------------- 
    2615    SUBROUTINE mpp__compute( td_mpp ) 
     2885   !> @param[in] td_lay domain layout structure 
     2886   !------------------------------------------------------------------- 
     2887   SUBROUTINE mpp__create_layout( td_mpp, td_lay ) 
    26162888      IMPLICIT NONE 
    26172889      ! Argument 
    26182890      TYPE(TMPP), INTENT(INOUT) :: td_mpp 
     2891      TYPE(TLAY), INTENT(IN   ) :: td_lay 
    26192892 
    26202893      ! local variable 
    2621       INTEGER(i4)                              :: il_isize !< i-direction maximum sub domain size  
    2622       INTEGER(i4)                              :: il_jsize !< j-direction maximum sub domain size 
    2623       INTEGER(i4)                              :: il_resti !<   
    2624       INTEGER(i4)                              :: il_restj !<   
    2625       INTEGER(i4), DIMENSION(:,:), ALLOCATABLE :: il_nlci 
    2626       INTEGER(i4), DIMENSION(:,:), ALLOCATABLE :: il_nlcj 
    2627       INTEGER(i4), DIMENSION(:,:), ALLOCATABLE :: il_impp 
    2628       INTEGER(i4), DIMENSION(:,:), ALLOCATABLE :: il_jmpp 
    2629  
    26302894      CHARACTER(LEN=lc)                        :: cl_file 
    26312895      TYPE(TFILE)                              :: tl_proc 
     
    26412905      td_mpp%i_nproc=0 
    26422906 
    2643       CALL logger_trace( "MPP COMPUTE: compute domain decomposition with "//& 
    2644       &               TRIM(fct_str(td_mpp%i_niproc))//" x "//& 
    2645       &               TRIM(fct_str(td_mpp%i_njproc))//" processors") 
    2646       ! maximum size of sub domain 
    2647       il_isize = ((td_mpp%t_dim(1)%i_len - 2*td_mpp%i_preci + (td_mpp%i_niproc-1))/ & 
    2648       &           td_mpp%i_niproc) + 2*td_mpp%i_preci 
    2649       il_jsize = ((td_mpp%t_dim(2)%i_len - 2*td_mpp%i_precj + (td_mpp%i_njproc-1))/ & 
    2650       &           td_mpp%i_njproc) + 2*td_mpp%i_precj 
    2651  
    2652       il_resti = MOD(td_mpp%t_dim(1)%i_len - 2*td_mpp%i_preci, td_mpp%i_niproc) 
    2653       il_restj = MOD(td_mpp%t_dim(2)%i_len - 2*td_mpp%i_precj, td_mpp%i_njproc) 
    2654       IF( il_resti == 0 ) il_resti = td_mpp%i_niproc 
    2655       IF( il_restj == 0 ) il_restj = td_mpp%i_njproc 
    2656  
    2657       ! compute dimension of each sub domain 
    2658       ALLOCATE( il_nlci(td_mpp%i_niproc,td_mpp%i_njproc) ) 
    2659       ALLOCATE( il_nlcj(td_mpp%i_niproc,td_mpp%i_njproc) ) 
    2660  
    2661       il_nlci( 1 : il_resti                , : ) = il_isize 
    2662       il_nlci( il_resti+1 : td_mpp%i_niproc, : ) = il_isize-1 
    2663  
    2664       il_nlcj( : , 1 : il_restj                ) = il_jsize 
    2665       il_nlcj( : , il_restj+1 : td_mpp%i_njproc) = il_jsize-1 
    2666  
    2667       ! compute first index of each sub domain 
    2668       ALLOCATE( il_impp(td_mpp%i_niproc,td_mpp%i_njproc) ) 
    2669       ALLOCATE( il_jmpp(td_mpp%i_niproc,td_mpp%i_njproc) ) 
    2670  
    2671       il_impp(:,:)=1 
    2672       il_jmpp(:,:)=1 
    2673  
    2674       DO jj=1,td_mpp%i_njproc 
    2675          DO ji=2,td_mpp%i_niproc 
    2676             il_impp(ji,jj)=il_impp(ji-1,jj)+il_nlci(ji-1,jj)-2*td_mpp%i_preci 
     2907      CALL logger_debug( "MPP CREATE LAYOUT: create domain decomposition with "//& 
     2908      &               TRIM(fct_str(td_lay%i_niproc))//" x "//& 
     2909      &               TRIM(fct_str(td_lay%i_njproc))//" = "//& 
     2910      &               TRIM(fct_str(td_lay%i_nsea))//" processors") 
     2911 
     2912      IF( lm_layout )THEN 
     2913         WRITE(im_iumout,*) ' choix optimum' 
     2914         WRITE(im_iumout,*) ' =============' 
     2915         WRITE(im_iumout,*) 
     2916         ! print info  
     2917         WRITE(im_iumout,*) ' ' 
     2918         WRITE(im_iumout,*) " jpni=",td_lay%i_niproc ," jpnj=",td_lay%i_njproc 
     2919         WRITE(im_iumout,*) " iresti=",td_mpp%i_preci," irestj=",td_mpp%i_precj 
     2920 
     2921 
     2922         WRITE(im_iumout,*) ' nombre de processeurs       ',td_lay%i_niproc*td_lay%i_njproc 
     2923         WRITE(im_iumout,*) ' nombre de processeurs mer   ',td_lay%i_nsea 
     2924         WRITE(im_iumout,*) ' nombre de processeurs terre ',td_lay%i_nland 
     2925         WRITE(im_iumout,*) ' moyenne de recouvrement     ',td_lay%i_mean 
     2926         WRITE(im_iumout,*) ' minimum de recouvrement     ',td_lay%i_min 
     2927         WRITE(im_iumout,*) ' maximum de recouvrement     ',td_lay%i_max 
     2928      ENDIF 
     2929 
     2930      td_mpp%i_niproc=td_lay%i_niproc 
     2931      td_mpp%i_njproc=td_lay%i_njproc 
     2932      !td_mpp%i_nproc =td_lay%i_nsea 
     2933 
     2934      IF( td_mpp%i_niproc*td_mpp%i_njproc == td_lay%i_nsea )THEN 
     2935         IF( td_lay%i_nsea == 1 )THEN 
     2936            td_mpp%c_dom='full' 
     2937         ELSE 
     2938            td_mpp%c_dom='nooverlap' 
     2939         ENDIF 
     2940      ELSE 
     2941            td_mpp%c_dom='noextra' 
     2942      ENDIF 
     2943       
     2944      jk=0 
     2945      DO jj=1,td_lay%i_njproc 
     2946         DO ji=1,td_lay%i_niproc 
     2947 
     2948            IF( td_lay%i_msk(ji,jj) >= 1 )THEN 
     2949 
     2950               ! get processor file name 
     2951               cl_file=file_rename(td_mpp%c_name,jk) 
     2952               ! initialise file structure 
     2953               tl_proc=file_init(cl_file,td_mpp%c_type) 
     2954 
     2955               ! procesor id 
     2956               tl_proc%i_pid=jk 
     2957 
     2958               tl_att=att_init("DOMAIN_number",tl_proc%i_pid) 
     2959               CALL file_add_att(tl_proc, tl_att) 
     2960 
     2961               ! processor indices 
     2962               tl_proc%i_iind=ji 
     2963               tl_proc%i_jind=jj 
     2964 
     2965               ! fill processor dimension and first indices 
     2966               tl_proc%i_impp = td_lay%i_impp(ji,jj) 
     2967               tl_proc%i_jmpp = td_lay%i_jmpp(ji,jj) 
     2968 
     2969               tl_proc%i_lci  = td_lay%i_lci(ji,jj) 
     2970               tl_proc%i_lcj  = td_lay%i_lcj(ji,jj) 
     2971 
     2972               ! compute first and last indoor indices 
     2973                
     2974               ! west boundary 
     2975               IF( ji == 1 )THEN 
     2976                  tl_proc%i_ldi = 1  
     2977                  tl_proc%l_ctr = .TRUE. 
     2978               ELSE 
     2979                  tl_proc%i_ldi = 1 + td_mpp%i_preci 
     2980               ENDIF 
     2981 
     2982               ! south boundary 
     2983               IF( jj == 1 )THEN 
     2984                  tl_proc%i_ldj = 1  
     2985                  tl_proc%l_ctr = .TRUE. 
     2986               ELSE 
     2987                  tl_proc%i_ldj = 1 + td_mpp%i_precj 
     2988               ENDIF 
     2989 
     2990               ! east boundary 
     2991               IF( ji == td_mpp%i_niproc )THEN 
     2992                  tl_proc%i_lei = td_lay%i_lci(ji,jj) 
     2993                  tl_proc%l_ctr = .TRUE. 
     2994               ELSE 
     2995                  tl_proc%i_lei = td_lay%i_lci(ji,jj) - td_mpp%i_preci 
     2996               ENDIF 
     2997 
     2998               ! north boundary 
     2999               IF( jj == td_mpp%i_njproc )THEN 
     3000                  tl_proc%i_lej = td_lay%i_lcj(ji,jj) 
     3001                  tl_proc%l_ctr = .TRUE. 
     3002               ELSE 
     3003                  tl_proc%i_lej = td_lay%i_lcj(ji,jj) - td_mpp%i_precj 
     3004               ENDIF 
     3005 
     3006               ! add processor to mpp structure 
     3007               CALL mpp__add_proc(td_mpp, tl_proc) 
     3008 
     3009               ! clean 
     3010               CALL att_clean(tl_att) 
     3011               CALL file_clean(tl_proc) 
     3012 
     3013               ! update proc number 
     3014               jk=jk+1 !ji+(jj-1)*td_lay%i_niproc 
     3015 
     3016            ENDIF 
    26773017         ENDDO 
    26783018      ENDDO 
    26793019 
    2680       DO jj=2,td_mpp%i_njproc 
    2681          DO ji=1,td_mpp%i_niproc 
    2682             il_jmpp(ji,jj)=il_jmpp(ji,jj-1)+il_nlcj(ji,jj-1)-2*td_mpp%i_precj 
    2683          ENDDO 
    2684       ENDDO  
    2685  
    2686       DO jj=1,td_mpp%i_njproc 
    2687          DO ji=1,td_mpp%i_niproc 
    2688  
    2689             jk=ji+(jj-1)*td_mpp%i_niproc 
    2690  
    2691             ! get processor file name 
    2692             cl_file=file_rename(td_mpp%c_name,jk) 
    2693             ! initialise file structure 
    2694             tl_proc=file_init(cl_file,td_mpp%c_type) 
    2695  
    2696             ! procesor id 
    2697             tl_proc%i_pid=jk 
    2698  
    2699             tl_att=att_init("DOMAIN_number",tl_proc%i_pid) 
    2700             CALL file_add_att(tl_proc, tl_att) 
    2701  
    2702             ! processor indices 
    2703             tl_proc%i_iind=ji 
    2704             tl_proc%i_jind=jj 
    2705  
    2706             ! fill processor dimension and first indices 
    2707             tl_proc%i_impp = il_impp(ji,jj) 
    2708             tl_proc%i_jmpp = il_jmpp(ji,jj) 
    2709  
    2710             tl_att=att_init( "DOMAIN_poistion_first", & 
    2711             &                (/tl_proc%i_impp, tl_proc%i_jmpp/) ) 
    2712             CALL file_add_att(tl_proc, tl_att) 
    2713  
    2714             tl_proc%i_lci  = il_nlci(ji,jj) 
    2715             tl_proc%i_lcj  = il_nlcj(ji,jj) 
    2716  
    2717             tl_att=att_init( "DOMAIN_poistion_last", & 
    2718             &                (/tl_proc%i_lci, tl_proc%i_lcj/) ) 
    2719             CALL file_add_att(tl_proc, tl_att) 
    2720  
    2721             ! compute first and last indoor indices 
    2722              
    2723             ! west boundary 
    2724             IF( ji == 1 )THEN 
    2725                tl_proc%i_ldi = 1  
    2726                tl_proc%l_ctr = .TRUE. 
    2727             ELSE 
    2728                tl_proc%i_ldi = 1 + td_mpp%i_preci 
    2729             ENDIF 
    2730  
    2731             ! south boundary 
    2732             IF( jj == 1 )THEN 
    2733                tl_proc%i_ldj = 1  
    2734                tl_proc%l_ctr = .TRUE. 
    2735             ELSE 
    2736                tl_proc%i_ldj = 1 + td_mpp%i_precj 
    2737             ENDIF 
    2738  
    2739             ! east boundary 
    2740             IF( ji == td_mpp%i_niproc )THEN 
    2741                tl_proc%i_lei = il_nlci(ji,jj) 
    2742                tl_proc%l_ctr = .TRUE. 
    2743             ELSE 
    2744                tl_proc%i_lei = il_nlci(ji,jj) - td_mpp%i_preci 
    2745             ENDIF 
    2746  
    2747             ! north boundary 
    2748             IF( jj == td_mpp%i_njproc )THEN 
    2749                tl_proc%i_lej = il_nlcj(ji,jj) 
    2750                tl_proc%l_ctr = .TRUE. 
    2751             ELSE 
    2752                tl_proc%i_lej = il_nlcj(ji,jj) - td_mpp%i_precj 
    2753             ENDIF 
    2754  
    2755             tl_att=att_init( "DOMAIN_halo_size_start", & 
    2756             &                (/tl_proc%i_ldi, tl_proc%i_ldj/) ) 
    2757             CALL file_add_att(tl_proc, tl_att) 
    2758             tl_att=att_init( "DOMAIN_halo_size_end", & 
    2759             &                (/tl_proc%i_ldi, tl_proc%i_ldj/) ) 
    2760             CALL file_add_att(tl_proc, tl_att) 
    2761  
    2762             ! add processor to mpp structure 
    2763             CALL mpp__add_proc(td_mpp, tl_proc) 
    2764  
    2765             ! clean 
    2766             CALL att_clean(tl_att) 
    2767             CALL file_clean(tl_proc) 
    2768  
    2769          ENDDO 
    2770       ENDDO 
    2771  
    2772       DEALLOCATE( il_impp, il_jmpp ) 
    2773       DEALLOCATE( il_nlci, il_nlcj ) 
    2774  
    2775    END SUBROUTINE mpp__compute 
     3020   END SUBROUTINE mpp__create_layout 
    27763021   !------------------------------------------------------------------- 
    27773022   !> @brief  
    2778    !>  This subroutine remove land processor from domain decomposition. 
    2779    !> 
     3023   !>  This subroutine optimize the number of sub domain to be used, given mask. 
     3024   !> @details 
     3025   !>  Actually it get the domain decomposition with the most land  
     3026   !>  processors removed. 
     3027   !>  If no land processor could be removed, it get the decomposition with the 
     3028   !>  most sea processors. 
     3029   ! 
    27803030   !> @author J.Paul 
    27813031   !> @date November, 2013 - Initial version 
    2782    !> 
     3032   !> @date October, 2015 
     3033   !> - improve way to compute domain layout  
     3034   !> @date February, 2016 
     3035   !> - new criteria for domain layout in case no land proc 
     3036   ! 
    27833037   !> @param[inout] td_mpp mpp strcuture 
    2784    !> @param[in] id_mask   sub domain mask (sea=1, land=0) 
    2785    !------------------------------------------------------------------- 
    2786    SUBROUTINE mpp__del_land( td_mpp, id_mask ) 
     3038   !> @param[in] id_mask   sub domain mask (sea=1, land=0)  
     3039   !> @pram[in] id_nproc maximum number of processor to be used 
     3040   !------------------------------------------------------------------- 
     3041   SUBROUTINE mpp__optimiz( td_mpp, id_mask, id_nproc ) 
    27873042      IMPLICIT NONE 
    27883043      ! Argument 
    27893044      TYPE(TMPP),                  INTENT(INOUT) :: td_mpp 
    27903045      INTEGER(i4), DIMENSION(:,:), INTENT(IN)    :: id_mask 
    2791  
    2792       ! loop indices 
    2793       INTEGER(i4) :: jk 
    2794       !---------------------------------------------------------------- 
    2795  
    2796       IF( ASSOCIATED(td_mpp%t_proc) )THEN 
    2797          jk=1 
    2798          DO WHILE( jk <= td_mpp%i_nproc ) 
    2799             IF( mpp__land_proc(td_mpp, jk, id_mask(:,:)) )THEN 
    2800                CALL mpp__del_proc(td_mpp, jk) 
    2801             ELSE 
    2802                jk=jk+1 
    2803             ENDIF 
    2804          ENDDO 
    2805       ELSE 
    2806          CALL logger_error("MPP DEL LAND: domain decomposition not define.") 
    2807       ENDIF 
    2808  
    2809    END SUBROUTINE mpp__del_land 
    2810    !------------------------------------------------------------------- 
    2811    !> @brief  
    2812    !>  This subroutine optimize the number of sub domain to be used, given mask. 
    2813    !> @details 
    2814    !>  Actually it get the domain decomposition with the most land  
    2815    !>  processor removed. 
    2816    ! 
    2817    !> @author J.Paul 
    2818    !> @date November, 2013 - Initial version 
    2819    ! 
    2820    !> @param[inout] td_mpp mpp strcuture 
    2821    !> @param[in] id_mask   sub domain mask (sea=1, land=0)  
    2822    !------------------------------------------------------------------- 
    2823    SUBROUTINE mpp__optimiz( td_mpp, id_mask ) 
    2824       IMPLICIT NONE 
    2825       ! Argument 
    2826       TYPE(TMPP),                  INTENT(INOUT) :: td_mpp 
    2827       INTEGER(i4), DIMENSION(:,:), INTENT(IN)    :: id_mask 
     3046      INTEGER(i4)                , INTENT(IN)    :: id_nproc 
    28283047 
    28293048      ! local variable 
    2830       TYPE(TMPP)  :: tl_mpp 
    2831       INTEGER(i4) :: il_maxproc 
    2832  
    2833       TYPE(TFILE), DIMENSION(:), ALLOCATABLE :: tl_proc 
     3049      TYPE(TLAY) :: tl_lay 
     3050      TYPE(TLAY) :: tl_sav 
     3051 
     3052      REAL(dp)   :: dl_min 
     3053      REAL(dp)   :: dl_max 
     3054      REAL(dp)   :: dl_ratio 
     3055      REAL(dp)   :: dl_sav 
     3056 
    28343057      ! loop indices 
    28353058      INTEGER(i4) :: ji 
     
    28383061 
    28393062      CALL logger_trace("MPP OPTIMIZ: look for best domain decomposition") 
    2840       tl_mpp=mpp_copy(td_mpp) 
    2841  
    2842       ! save maximum number of processor to be used 
    2843       il_maxproc=td_mpp%i_nproc 
     3063      dl_sav=0 
    28443064      !  
    2845       td_mpp%i_nproc=0 
    2846       DO ji=1,il_maxproc 
    2847          DO jj=1,il_maxproc 
    2848  
    2849             ! clean mpp processor 
    2850             IF( ASSOCIATED(tl_mpp%t_proc) )THEN 
    2851                CALL file_clean(tl_mpp%t_proc(:)) 
    2852                DEALLOCATE(tl_mpp%t_proc) 
    2853             ENDIF 
    2854  
    2855             ! compute domain decomposition 
    2856             tl_mpp%i_niproc=ji 
    2857             tl_mpp%i_njproc=jj 
    2858              
    2859             CALL mpp__compute( tl_mpp ) 
    2860              
    2861             ! remove land sub domain 
    2862             CALL mpp__del_land( tl_mpp, id_mask ) 
    2863  
    2864             CALL logger_info("MPP OPTIMIZ: number of processor "//& 
    2865             &  TRIM(fct_str(tl_mpp%i_nproc)) ) 
    2866             IF( tl_mpp%i_nproc > td_mpp%i_nproc .AND. & 
    2867             &   tl_mpp%i_nproc <= il_maxproc )THEN 
    2868                ! save optimiz decomposition  
    2869  
    2870                ! clean mpp 
    2871                CALL mpp_clean(td_mpp) 
    2872  
    2873                ! save processor array 
    2874                ALLOCATE( tl_proc(tl_mpp%i_nproc) ) 
    2875                tl_proc(:)=file_copy(tl_mpp%t_proc(:)) 
    2876  
    2877                ! remove pointer on processor array 
    2878                CALL file_clean(tl_mpp%t_proc(:)) 
    2879                DEALLOCATE(tl_mpp%t_proc) 
    2880   
    2881                ! save data except processor array 
    2882                td_mpp=mpp_copy(tl_mpp) 
    2883  
    2884                ! save processor array 
    2885                ALLOCATE( td_mpp%t_proc(td_mpp%i_nproc) ) 
    2886                td_mpp%t_proc(:)=file_copy(tl_proc(:)) 
    2887  
    2888                ! clean 
    2889                CALL file_clean( tl_proc(:) ) 
    2890                DEALLOCATE(tl_proc) 
    2891  
    2892             ENDIF 
    2893              
     3065      DO ji=1,id_nproc 
     3066         DO jj=1,id_nproc 
     3067 
     3068            ! compute domain layout 
     3069            tl_lay=layout__init( td_mpp, id_mask, ji,jj ) 
     3070            IF( tl_lay%i_nsea <= id_nproc )THEN 
     3071 
     3072               IF( ASSOCIATED(tl_sav%i_lci) )THEN 
     3073                  IF( tl_sav%i_nland /= 0 )THEN 
     3074                     ! look for layout with most land proc 
     3075                     IF( tl_lay%i_nland > tl_sav%i_nland    .OR. & 
     3076                     &   ( tl_lay%i_nland == tl_sav%i_nland .AND. & 
     3077                     &     tl_lay%i_min   >  tl_sav%i_min   ) )THEN 
     3078                        ! save optimiz layout 
     3079                        CALL logger_info("MPP OPTIMIZ:save this decomposition "//& 
     3080                        &   TRIM(fct_str(ji))//"x"//TRIM(fct_str(jj))//"="//& 
     3081                        &   TRIM(fct_str(tl_lay%i_nsea)) ) 
     3082 
     3083                        tl_sav=layout__copy(tl_lay) 
     3084                     ENDIF 
     3085                  ELSE ! tl_sav%i_nland == 0 
     3086                     ! look for layout with most sea proc  
     3087                     ! and "square" cell  
     3088                     dl_min=MIN(tl_lay%i_lci(1,1),tl_lay%i_lcj(1,1)) 
     3089                     dl_max=MAX(tl_lay%i_lci(1,1),tl_lay%i_lcj(1,1)) 
     3090                     dl_ratio=dl_min/dl_max 
     3091                     IF( tl_lay%i_nsea > tl_sav%i_nsea    .OR. & 
     3092                     &   ( tl_lay%i_nsea == tl_sav%i_nsea .AND. & 
     3093                     &     dl_ratio   >  dl_sav ) )THEN 
     3094                        ! save optimiz layout 
     3095                        CALL logger_info("MPP OPTIMIZ:save this decomposition "//& 
     3096                        &   TRIM(fct_str(ji))//"x"//TRIM(fct_str(jj))//"="//& 
     3097                        &   TRIM(fct_str(tl_lay%i_nsea)) ) 
     3098 
     3099                        tl_sav=layout__copy(tl_lay) 
     3100                        dl_sav=dl_ratio 
     3101                     ENDIF 
     3102                  ENDIF 
     3103               ELSE 
     3104                  ! init tl_sav 
     3105                  tl_sav=layout__copy(tl_lay) 
     3106 
     3107                  dl_min=MIN(tl_sav%i_lci(1,1),tl_sav%i_lcj(1,1)) 
     3108                  dl_max=MAX(tl_sav%i_lci(1,1),tl_sav%i_lcj(1,1)) 
     3109                  dl_sav=dl_min/dl_max 
     3110               ENDIF 
     3111 
     3112            ENDIF 
     3113 
     3114            ! clean 
     3115            CALL layout__clean( tl_lay ) 
     3116 
    28943117         ENDDO 
    28953118      ENDDO 
    28963119 
     3120      ! create mpp domain layout 
     3121      CALL mpp__create_layout(td_mpp, tl_sav) 
     3122 
    28973123      ! clean 
    2898       CALL mpp_clean(tl_mpp) 
     3124      CALL layout__clean( tl_sav ) 
    28993125 
    29003126   END SUBROUTINE mpp__optimiz 
    2901    !------------------------------------------------------------------- 
    2902    !> @brief 
    2903    !>    This function check if processor is a land processor. 
    2904    !> 
    2905    !> @author J.Paul 
    2906    !> @date November, 2013 - Initial version 
    2907    !> 
    2908    !> @param[in] td_mpp    mpp strcuture 
    2909    !> @param[in] id_proc   processor id 
    2910    !> @param[in] id_mask   sub domain mask (sea=1, land=0) 
    2911    !------------------------------------------------------------------- 
    2912    LOGICAL FUNCTION mpp__land_proc( td_mpp , id_proc, id_mask ) 
    2913       IMPLICIT NONE 
    2914       ! Argument 
    2915       TYPE(TMPP),                  INTENT(IN) :: td_mpp 
    2916       INTEGER(i4),                 INTENT(IN) :: id_proc 
    2917       INTEGER(i4), DIMENSION(:,:), INTENT(IN) :: id_mask 
    2918  
    2919       ! local variable 
    2920       INTEGER(i4), DIMENSION(2) :: il_shape 
    2921       !---------------------------------------------------------------- 
    2922  
    2923       CALL logger_trace("MPP LAND PROC: check processor "//TRIM(fct_str(id_proc))//& 
    2924       &  " of mpp "//TRIM(td_mpp%c_name) ) 
    2925       mpp__land_proc=.FALSE. 
    2926       IF( ASSOCIATED(td_mpp%t_proc) )THEN 
    2927  
    2928          il_shape(:)=SHAPE(id_mask) 
    2929          IF( il_shape(1) /= td_mpp%t_dim(1)%i_len .OR. & 
    2930          &   il_shape(2) /= td_mpp%t_dim(2)%i_len )THEN 
    2931              CALL logger_debug("MPP LAND PROC: mask size ("//& 
    2932              &                  TRIM(fct_str(il_shape(1)))//","//& 
    2933              &                  TRIM(fct_str(il_shape(2)))//")") 
    2934              CALL logger_debug("MPP LAND PROC: domain size ("//& 
    2935              &                  TRIM(fct_str(td_mpp%t_dim(1)%i_len))//","//& 
    2936              &                  TRIM(fct_str(td_mpp%t_dim(2)%i_len))//")") 
    2937              CALL logger_error("MPP LAND PROC: mask and domain size differ") 
    2938          ELSE 
    2939             IF( ALL(id_mask( td_mpp%t_proc(id_proc)%i_impp +            & 
    2940             &                       td_mpp%t_proc(id_proc)%i_ldi - 1 : & 
    2941             &                td_mpp%t_proc(id_proc)%i_impp +            & 
    2942             &                       td_mpp%t_proc(id_proc)%i_lei - 1,  & 
    2943             &                td_mpp%t_proc(id_proc)%i_jmpp +            & 
    2944             &                       td_mpp%t_proc(id_proc)%i_ldj - 1 : & 
    2945             &                td_mpp%t_proc(id_proc)%i_jmpp +            & 
    2946             &                       td_mpp%t_proc(id_proc)%i_lej - 1)  & 
    2947             &      /= 1 ) )THEN 
    2948                ! land domain 
    2949                CALL logger_info("MPP LAND PROC: processor "//TRIM(fct_str(id_proc))//& 
    2950                &             " is land processor") 
    2951                mpp__land_proc=.TRUE. 
    2952             ENDIF 
    2953          ENDIF 
    2954  
    2955       ELSE 
    2956          CALL logger_error("MPP LAND PROC: domain decomposition not define.") 
    2957       ENDIF 
    2958  
    2959    END FUNCTION mpp__land_proc 
    29603127   !------------------------------------------------------------------- 
    29613128   !> @brief  
     
    31463313   !> 
    31473314   !> @author J.Paul 
    3148    !> @date November, 2013 
     3315   !> @date November, 2013 - Initial version 
    31493316   !> 
    31503317   !> @param[inout] td_mpp mpp strcuture 
     
    31843351   !> 
    31853352   !> @author J.Paul 
    3186    !> @date November, 2013 
     3353   !> @date November, 2013 - Initial version 
    31873354   !> 
    31883355   !> @param[in] td_mpp    mpp strcuture 
     
    32143381         SELECT CASE(TRIM(td_mpp%c_dom)) 
    32153382            CASE('full') 
    3216                il_i1 = 1 ; il_i2 = td_mpp%t_dim(1)%i_len 
    3217                il_j1 = 1 ; il_j2 = td_mpp%t_dim(2)%i_len 
    3218             CASE('overlap') 
    3219                 il_i1 = td_mpp%t_proc(id_procid)%i_impp 
    3220                 il_j1 = td_mpp%t_proc(id_procid)%i_jmpp 
    3221  
    3222                 il_i2 = il_i1 + td_mpp%t_proc(id_procid)%i_lci - 1  
    3223                 il_j2 = il_j1 + td_mpp%t_proc(id_procid)%i_lcj - 1  
     3383               il_i1 = 1  
     3384               il_j1 = 1  
     3385 
     3386               il_i2 = td_mpp%t_dim(1)%i_len 
     3387               il_j2 = td_mpp%t_dim(2)%i_len 
     3388            CASE('noextra') 
     3389               il_i1 = td_mpp%t_proc(id_procid)%i_impp 
     3390               il_j1 = td_mpp%t_proc(id_procid)%i_jmpp 
     3391 
     3392               il_i2 = il_i1 + td_mpp%t_proc(id_procid)%i_lci - 1  
     3393               il_j2 = il_j1 + td_mpp%t_proc(id_procid)%i_lcj - 1  
    32243394            CASE('nooverlap') 
    32253395               il_i1 = td_mpp%t_proc(id_procid)%i_impp + & 
     
    32333403               &        td_mpp%t_proc(id_procid)%i_lej - 1 
    32343404            CASE DEFAULT 
    3235                CALL logger_error("MPP GET PROC INDEX: invalid decomposition type.") 
     3405               CALL logger_error("MPP GET PROC INDEX: invalid "//& 
     3406                  &              "decomposition type.") 
    32363407         END SELECT 
    32373408 
     
    32493420   ! 
    32503421   !> @author J.Paul 
    3251    !> @date November, 2013 
     3422   !> @date November, 2013 - Initial version 
    32523423   ! 
    32533424   !> @param[in] td_mpp    mpp strcuture 
     
    32833454               il_jsize = td_mpp%t_dim(2)%i_len 
    32843455 
    3285             CASE('overlap') 
     3456            CASE('noextra') 
    32863457 
    32873458                il_isize = td_mpp%t_proc(id_procid)%i_lci 
     
    33113482   !> 
    33123483   !> @author J.Paul 
    3313    !> @date November, 2013 
     3484   !> @date November, 2013 - Initial version 
    33143485   !> 
    33153486   !> @param[inout] td_mpp mpp strcuture 
     
    33273498      IF( ASSOCIATED(td_mpp%t_proc) )THEN 
    33283499 
    3329          IF( td_mpp%i_niproc == 0 .AND. td_mpp%i_niproc == 0 )THEN 
     3500         IF( td_mpp%i_niproc == 0 .AND. td_mpp%i_njproc == 0 )THEN 
    33303501            CALL logger_info("MPP GET DOM: use indoor indices to get domain "//& 
    33313502            &             "decomposition type.") 
     
    33423513            &       td_mpp%t_proc(1)%i_lcj                     )     )THEN 
    33433514 
    3344                td_mpp%c_dom='overlap' 
     3515               td_mpp%c_dom='noextra' 
    33453516 
    33463517            ELSEIF((td_mpp%t_proc(1)%t_dim(1)%i_len ==                     & 
     
    33873558               td_mpp%c_dom='nooverlap' 
    33883559            ELSE 
    3389                td_mpp%c_dom='overlap' 
     3560               td_mpp%c_dom='noextra' 
    33903561            ENDIF 
    33913562 
     
    34043575   !> 
    34053576   !> @author J.Paul 
    3406    !> - November, 2013- Initial Version 
     3577   !> @date November, 2013 - Initial Version 
     3578   !> @date September 2015 
     3579   !> - do not check used dimension here 
    34073580   !> 
    34083581   !> @param[in] td_mpp mpp structure 
     
    34173590 
    34183591      ! local variable 
    3419       INTEGER(i4) :: il_ndim 
     3592      CHARACTER(LEN=lc) :: cl_dim 
     3593      LOGICAL :: ll_error 
     3594      LOGICAL :: ll_warn 
     3595 
     3596      INTEGER(i4)       :: il_ind 
    34203597 
    34213598      ! loop indices 
     
    34233600      !---------------------------------------------------------------- 
    34243601      mpp__check_var_dim=.TRUE. 
     3602 
    34253603      ! check used dimension  
    3426       IF( ANY( td_var%t_dim(:)%l_use .AND. & 
    3427       &        td_var%t_dim(:)%i_len /= td_mpp%t_dim(:)%i_len) )THEN 
     3604      ll_error=.FALSE. 
     3605      ll_warn=.FALSE. 
     3606      DO ji=1,ip_maxdim 
     3607         il_ind=dim_get_index( td_mpp%t_dim(:), & 
     3608         &                     TRIM(td_var%t_dim(ji)%c_name), & 
     3609         &                     TRIM(td_var%t_dim(ji)%c_sname)) 
     3610         IF( il_ind /= 0 )THEN 
     3611            IF( td_var%t_dim(ji)%l_use  .AND. & 
     3612            &   td_mpp%t_dim(il_ind)%l_use .AND. & 
     3613            &   td_var%t_dim(ji)%i_len /= td_mpp%t_dim(il_ind)%i_len )THEN 
     3614               IF( INDEX( TRIM(td_var%c_axis), & 
     3615               &          TRIM(fct_upper(td_var%t_dim(ji)%c_name))) == 0 )THEN 
     3616                  ll_warn=.TRUE. 
     3617               ELSE 
     3618                  ll_error=.TRUE. 
     3619               ENDIF 
     3620            ENDIF 
     3621         ENDIF 
     3622      ENDDO 
     3623 
     3624      IF( ll_error )THEN 
     3625 
     3626         cl_dim='(/' 
     3627         DO ji = 1, td_mpp%i_ndim 
     3628            IF( td_mpp%t_dim(ji)%l_use )THEN 
     3629               cl_dim=TRIM(cl_dim)//& 
     3630               &  TRIM(fct_upper(td_mpp%t_dim(ji)%c_sname))//':'//& 
     3631               &  TRIM(fct_str(td_mpp%t_dim(ji)%i_len))//',' 
     3632            ENDIF 
     3633         ENDDO 
     3634         cl_dim=TRIM(cl_dim)//'/)' 
     3635         CALL logger_debug( " mpp dimension: "//TRIM(cl_dim) ) 
     3636 
     3637         cl_dim='(/' 
     3638         DO ji = 1, td_var%i_ndim 
     3639            IF( td_var%t_dim(ji)%l_use )THEN 
     3640               cl_dim=TRIM(cl_dim)//& 
     3641               &  TRIM(fct_upper(td_var%t_dim(ji)%c_sname))//':'//& 
     3642               &  TRIM(fct_str(td_var%t_dim(ji)%i_len))//',' 
     3643            ENDIF 
     3644         ENDDO 
     3645         cl_dim=TRIM(cl_dim)//'/)' 
     3646         CALL logger_debug( " variable dimension: "//TRIM(cl_dim) ) 
    34283647 
    34293648         mpp__check_var_dim=.FALSE. 
    34303649 
    34313650         CALL logger_error( & 
    3432          &  "MPP CHECK DIM: variable and mpp dimension differ"//& 
     3651         &  " MPP CHECK VAR DIM: variable and file dimension differ"//& 
    34333652         &  " for variable "//TRIM(td_var%c_name)//& 
    3434          &  " and mpp "//TRIM(td_mpp%c_name)) 
    3435  
    3436          CALL logger_debug( & 
    3437          &  " mpp dimension: "//TRIM(fct_str(td_mpp%i_ndim))//& 
    3438          &  " variable dimension: "//TRIM(fct_str(td_var%i_ndim)) ) 
    3439          il_ndim=MIN(td_var%i_ndim, td_mpp%i_ndim ) 
    3440          DO ji = 1, il_ndim 
    3441             CALL logger_debug( & 
    3442             &  "MPP CHECK DIM: for dimension "//& 
    3443             &  TRIM(td_mpp%t_dim(ji)%c_name)//& 
    3444             &  ", mpp length: "//& 
    3445             &  TRIM(fct_str(td_mpp%t_dim(ji)%i_len))//& 
    3446             &  ", variable length: "//& 
    3447             &  TRIM(fct_str(td_var%t_dim(ji)%i_len))//& 
    3448             &  ", variable used "//TRIM(fct_str(td_var%t_dim(ji)%l_use))) 
    3449          ENDDO 
     3653         &  " and file "//TRIM(td_mpp%c_name)) 
     3654 
     3655      ELSEIF( ll_warn )THEN 
     3656         CALL logger_warn( & 
     3657         &  " MPP CHECK VAR DIM: variable and file dimension differ"//& 
     3658         &  " for variable "//TRIM(td_var%c_name)//& 
     3659         &  " and file "//TRIM(td_mpp%c_name)//". you should use"//& 
     3660         &  " var_check_dim to remove useless dimension.") 
     3661      ELSE 
     3662 
     3663         IF( td_var%i_ndim >  td_mpp%i_ndim )THEN 
     3664            CALL logger_info("MPP CHECK VAR DIM: variable "//& 
     3665            &  TRIM(td_var%c_name)//" use more dimension than file "//& 
     3666            &  TRIM(td_mpp%c_name)//" do until now.") 
     3667         ENDIF 
     3668 
    34503669      ENDIF 
    34513670 
     
    34563675   ! 
    34573676   !> @author J.Paul 
    3458    !> - November, 2013- Initial Version 
     3677   !> @date November, 2013 - Initial Version 
    34593678   ! 
    34603679   !> @param[in] td_file   array of file structure 
     
    34963715   ! 
    34973716   !> @author J.Paul 
    3498    !> - Ocotber, 2014- Initial Version 
     3717   !> @date Ocotber, 2014 - Initial Version 
    34993718   ! 
    35003719   !> @param[in] td_mpp   mpp file structure 
     
    36033822      ENDIF 
    36043823   END FUNCTION mpp_recombine_var 
     3824   !------------------------------------------------------------------- 
     3825   !> @brief This subroutine read subdomain indices defined with halo 
     3826   !> (NEMO netcdf way) 
     3827   !> 
     3828   !> @author J.Paul 
     3829   !> @date January, 2016 - Initial Version 
     3830   !> 
     3831   !> @param[inout] td_file   mpp structure 
     3832   !------------------------------------------------------------------- 
     3833   SUBROUTINE mpp__read_halo(td_file, td_dimglo)  
     3834   IMPLICIT NONE 
     3835      ! Argument       
     3836      TYPE(TFILE)              , INTENT(INOUT) :: td_file 
     3837      TYPE(TDIM) , DIMENSION(:), INTENT(IN   ) :: td_dimglo 
     3838 
     3839      ! local variable 
     3840      INTEGER(i4)       :: il_attid 
     3841      INTEGER(i4)       :: il_ifirst 
     3842      INTEGER(i4)       :: il_jfirst 
     3843      INTEGER(i4)       :: il_ilast 
     3844      INTEGER(i4)       :: il_jlast 
     3845      INTEGER(i4)       :: il_ihalostart 
     3846      INTEGER(i4)       :: il_jhalostart 
     3847      INTEGER(i4)       :: il_ihaloend 
     3848      INTEGER(i4)       :: il_jhaloend 
     3849 
     3850      CHARACTER(LEN=lc) :: cl_dom 
     3851      !---------------------------------------------------------------- 
     3852 
     3853      ! DOMAIN_position_first 
     3854      il_attid = 0 
     3855      IF( ASSOCIATED(td_file%t_att) )THEN 
     3856         il_attid=att_get_id( td_file%t_att, "DOMAIN_position_first" ) 
     3857      ENDIF 
     3858      IF( il_attid /= 0 )THEN 
     3859         il_ifirst = INT(td_file%t_att(il_attid)%d_value(1)) 
     3860         il_jfirst = INT(td_file%t_att(il_attid)%d_value(2)) 
     3861      ELSE 
     3862         il_ifirst = 1 
     3863         il_jfirst = 1 
     3864      ENDIF 
     3865 
     3866      ! DOMAIN_position_last 
     3867      il_attid = 0 
     3868      IF( ASSOCIATED(td_file%t_att) )THEN 
     3869         il_attid=att_get_id( td_file%t_att, "DOMAIN_position_last" ) 
     3870      ENDIF 
     3871      IF( il_attid /= 0 )THEN 
     3872         il_ilast = INT(td_file%t_att(il_attid)%d_value(1)) 
     3873         il_jlast = INT(td_file%t_att(il_attid)%d_value(2)) 
     3874      ELSE 
     3875         il_ilast = td_file%t_dim(1)%i_len 
     3876         il_jlast = td_file%t_dim(2)%i_len 
     3877      ENDIF 
     3878 
     3879      ! DOMAIN_halo_size_start 
     3880      il_attid = 0 
     3881      IF( ASSOCIATED(td_file%t_att) )THEN 
     3882         il_attid=att_get_id( td_file%t_att, "DOMAIN_halo_size_start" ) 
     3883      ENDIF 
     3884      IF( il_attid /= 0 )THEN 
     3885         il_ihalostart = INT(td_file%t_att(il_attid)%d_value(1)) 
     3886         il_jhalostart = INT(td_file%t_att(il_attid)%d_value(2)) 
     3887      ELSE 
     3888         il_ihalostart = 0 
     3889         il_jhalostart = 0 
     3890      ENDIF 
     3891 
     3892      ! DOMAIN_halo_size_end 
     3893      il_attid = 0 
     3894      IF( ASSOCIATED(td_file%t_att) )THEN 
     3895         il_attid=att_get_id( td_file%t_att, "DOMAIN_halo_size_end" ) 
     3896      ENDIF 
     3897      IF( il_attid /= 0 )THEN 
     3898         il_ihaloend = INT(td_file%t_att(il_attid)%d_value(1)) 
     3899         il_jhaloend = INT(td_file%t_att(il_attid)%d_value(2)) 
     3900      ELSE 
     3901         il_ihaloend = 0 
     3902         il_jhaloend = 0 
     3903      ENDIF 
     3904 
     3905      IF( (td_dimglo(jp_I)%i_len == td_file%t_dim(jp_I)%i_len) .AND. & 
     3906        & (td_dimglo(jp_J)%i_len == td_file%t_dim(jp_J)%i_len) )THEN 
     3907         cl_dom='full' 
     3908      ELSEIF( il_ihalostart == 0 .AND. il_jhalostart == 0 .AND. & 
     3909           &  il_ihaloend == 0 .AND. il_jhaloend == 0 )THEN 
     3910         cl_dom='nooverlap' 
     3911      ELSE 
     3912         cl_dom='noextra' 
     3913      ENDIF 
     3914 
     3915      SELECT CASE(TRIM(cl_dom)) 
     3916         CASE('full') 
     3917            td_file%i_impp = il_ifirst  
     3918            td_file%i_jmpp = il_jfirst 
     3919            td_file%i_lci  = td_file%t_dim(jp_I)%i_len  
     3920            td_file%i_lcj  = td_file%t_dim(jp_J)%i_len 
     3921            td_file%i_ldi  = il_ihalostart + 1 
     3922            td_file%i_ldj  = il_jhalostart + 1 
     3923            td_file%i_lei  = td_file%t_dim(jp_I)%i_len - il_ihaloend 
     3924            td_file%i_lej  = td_file%t_dim(jp_J)%i_len - il_jhaloend 
     3925         CASE('noextra') 
     3926            td_file%i_impp = il_ifirst 
     3927            td_file%i_jmpp = il_jfirst 
     3928            td_file%i_lci  = td_file%t_dim(jp_I)%i_len 
     3929            td_file%i_lcj  = td_file%t_dim(jp_J)%i_len 
     3930            td_file%i_ldi  = il_ihalostart + 1 
     3931            td_file%i_ldj  = il_jhalostart + 1 
     3932            td_file%i_lei  = td_file%i_lci - il_ihaloend 
     3933            td_file%i_lej  = td_file%i_lcj - il_jhaloend 
     3934         CASE('nooverlap') !!!????? 
     3935            td_file%i_impp = il_ifirst 
     3936            td_file%i_jmpp = il_jfirst 
     3937            td_file%i_lci  = td_file%t_dim(jp_I)%i_len 
     3938            td_file%i_lcj  = td_file%t_dim(jp_J)%i_len 
     3939            td_file%i_ldi  = 1 
     3940            td_file%i_ldj  = 1  
     3941            td_file%i_lei  = td_file%t_dim(jp_I)%i_len 
     3942            td_file%i_lej  = td_file%t_dim(jp_J)%i_len 
     3943      END SELECT 
     3944 
     3945   END SUBROUTINE mpp__read_halo 
     3946   !------------------------------------------------------------------- 
     3947   !> @brief This subroutine compute subdomain indices defined with halo 
     3948   !> (NEMO netcdf way) 
     3949   !> 
     3950   !> @author J.Paul 
     3951   !> @date January, 2016 - Initial Version 
     3952   !> 
     3953   !> @param[inout] td_mpp   mpp structure 
     3954   !------------------------------------------------------------------- 
     3955   SUBROUTINE mpp__compute_halo(td_mpp)  
     3956   IMPLICIT NONE 
     3957      ! Argument       
     3958      TYPE(TMPP)      , INTENT(INOUT) :: td_mpp 
     3959 
     3960      ! local variable 
     3961      INTEGER(i4), DIMENSION(:), ALLOCATABLE :: il_ifirst 
     3962      INTEGER(i4), DIMENSION(:), ALLOCATABLE :: il_jfirst 
     3963      INTEGER(i4), DIMENSION(:), ALLOCATABLE :: il_ilast 
     3964      INTEGER(i4), DIMENSION(:), ALLOCATABLE :: il_jlast 
     3965      INTEGER(i4), DIMENSION(:), ALLOCATABLE :: il_ihalostart 
     3966      INTEGER(i4), DIMENSION(:), ALLOCATABLE :: il_jhalostart 
     3967      INTEGER(i4), DIMENSION(:), ALLOCATABLE :: il_ihaloend 
     3968      INTEGER(i4), DIMENSION(:), ALLOCATABLE :: il_jhaloend 
     3969 
     3970      TYPE(TATT)                             :: tl_att 
     3971 
     3972      ! loop indices 
     3973      INTEGER(i4) :: ji 
     3974      !---------------------------------------------------------------- 
     3975 
     3976      ALLOCATE( il_ifirst    (td_mpp%i_nproc) ) 
     3977      ALLOCATE( il_jfirst    (td_mpp%i_nproc) ) 
     3978 
     3979      ALLOCATE( il_ilast     (td_mpp%i_nproc) ) 
     3980      ALLOCATE( il_jlast     (td_mpp%i_nproc) ) 
     3981 
     3982      ALLOCATE( il_ihalostart(td_mpp%i_nproc) ) 
     3983      ALLOCATE( il_jhalostart(td_mpp%i_nproc) ) 
     3984 
     3985      ALLOCATE( il_ihaloend  (td_mpp%i_nproc) ) 
     3986      ALLOCATE( il_jhaloend  (td_mpp%i_nproc) ) 
     3987 
     3988      SELECT CASE(TRIM(td_mpp%c_dom)) 
     3989         CASE('full') 
     3990             
     3991            il_ifirst(:)=td_mpp%t_proc(:)%i_impp 
     3992            il_jfirst(:)=td_mpp%t_proc(:)%i_jmpp 
     3993             
     3994            il_ilast(:)=td_mpp%t_proc(:)%i_impp + td_mpp%t_proc(:)%t_dim(jp_I)%i_len - 1 
     3995            il_jlast(:)=td_mpp%t_proc(:)%i_jmpp + td_mpp%t_proc(:)%t_dim(jp_J)%i_len - 1 
     3996 
     3997            il_ihalostart(:)=td_mpp%t_proc(:)%i_ldi-1 
     3998            il_jhalostart(:)=td_mpp%t_proc(:)%i_ldj-1 
     3999             
     4000            il_ihaloend(:)=td_mpp%t_proc(:)%t_dim(jp_I)%i_len - td_mpp%t_proc(:)%i_lei 
     4001            il_jhaloend(:)=td_mpp%t_proc(:)%t_dim(jp_J)%i_len - td_mpp%t_proc(:)%i_lej 
     4002 
     4003         CASE('noextra') 
     4004             
     4005            il_ifirst(:)=td_mpp%t_proc(:)%i_impp 
     4006            il_jfirst(:)=td_mpp%t_proc(:)%i_jmpp 
     4007 
     4008            il_ilast(:) =td_mpp%t_proc(:)%i_impp + td_mpp%t_proc(:)%i_lci - 1 
     4009            il_jlast(:) =td_mpp%t_proc(:)%i_jmpp + td_mpp%t_proc(:)%i_lcj - 1 
     4010             
     4011            il_ihalostart(:)=td_mpp%t_proc(:)%i_ldi-1 
     4012            il_jhalostart(:)=td_mpp%t_proc(:)%i_ldj-1 
     4013             
     4014            il_ihaloend(:)=td_mpp%t_proc(:)%i_lci - td_mpp%t_proc(:)%i_lei 
     4015            il_jhaloend(:)=td_mpp%t_proc(:)%i_lcj - td_mpp%t_proc(:)%i_lej 
     4016 
     4017         CASE('nooverlap') 
     4018 
     4019            il_ifirst(:)=td_mpp%t_proc(:)%i_impp + td_mpp%t_proc(:)%i_ldi - 1 
     4020            il_jfirst(:)=td_mpp%t_proc(:)%i_jmpp + td_mpp%t_proc(:)%i_ldj - 1 
     4021 
     4022            il_ilast(:)=td_mpp%t_proc(:)%i_impp + td_mpp%t_proc(:)%i_lei - 1 
     4023            il_jlast(:)=td_mpp%t_proc(:)%i_jmpp + td_mpp%t_proc(:)%i_lej - 1 
     4024 
     4025            il_ihalostart(:)=0 
     4026            il_jhalostart(:)=0 
     4027 
     4028            il_ihaloend(:)=0 
     4029            il_jhaloend(:)=0 
     4030 
     4031         CASE DEFAULT 
     4032            CALL logger_fatal("MPP INIT: invalid "//& 
     4033            &              "decomposition type.")                      
     4034      END SELECT 
     4035 
     4036      DO ji=1,td_mpp%i_nproc 
     4037         tl_att=att_init( "DOMAIN_position_first", & 
     4038         &                (/ il_ifirst(ji), il_jfirst(ji) /) ) 
     4039         CALL file_move_att(td_mpp%t_proc(ji), tl_att)       
     4040 
     4041         tl_att=att_init( "DOMAIN_position_last", & 
     4042         &                (/ il_ilast(ji), il_jlast(ji) /) ) 
     4043         CALL file_move_att(td_mpp%t_proc(ji), tl_att) 
     4044 
     4045         tl_att=att_init( "DOMAIN_halo_size_start", & 
     4046         &                (/ il_ihalostart(ji), il_jhalostart(ji) /) ) 
     4047         CALL file_move_att( td_mpp%t_proc(ji), tl_att)                
     4048 
     4049         tl_att=att_init( "DOMAIN_halo_size_end", & 
     4050         &                (/ il_ihaloend(ji), il_jhaloend(ji) /) ) 
     4051         CALL file_move_att( td_mpp%t_proc(ji), tl_att) 
     4052      ENDDO 
     4053 
     4054      DEALLOCATE( il_ifirst    ) 
     4055      DEALLOCATE( il_jfirst    ) 
     4056  
     4057      DEALLOCATE( il_ilast     ) 
     4058      DEALLOCATE( il_jlast     ) 
     4059  
     4060      DEALLOCATE( il_ihalostart) 
     4061      DEALLOCATE( il_jhalostart) 
     4062 
     4063      DEALLOCATE( il_ihaloend  ) 
     4064      DEALLOCATE( il_jhaloend  ) 
     4065 
     4066      !impp 
     4067      tl_att=att_init( "SUBDOMAIN_I_left_bottom_indices", td_mpp%t_proc(:)%i_impp) 
     4068      CALL mpp_move_att(td_mpp, tl_att) 
     4069 
     4070      tl_att=att_init( "SUBDOMAIN_J_left_bottom_indices", td_mpp%t_proc(:)%i_jmpp) 
     4071      CALL mpp_move_att(td_mpp, tl_att) 
     4072 
     4073      ! lci 
     4074      tl_att=att_init( "SUBDOMAIN_I_dimensions", td_mpp%t_proc(:)%i_lci) 
     4075      CALL mpp_move_att(td_mpp, tl_att) 
     4076 
     4077      tl_att=att_init( "SUBDOMAIN_J_dimensions", td_mpp%t_proc(:)%i_lcj) 
     4078      CALL mpp_move_att(td_mpp, tl_att) 
     4079 
     4080      ! ldi 
     4081      tl_att=att_init( "SUBDOMAIN_I_first_indoor_indices", td_mpp%t_proc(:)%i_ldi) 
     4082      CALL mpp_move_att(td_mpp, tl_att) 
     4083 
     4084      tl_att=att_init( "SUBDOMAIN_J_first_indoor_indices", td_mpp%t_proc(:)%i_ldj) 
     4085      CALL mpp_move_att(td_mpp, tl_att) 
     4086 
     4087      ! lei 
     4088      tl_att=att_init( "SUBDOMAIN_I_last_indoor_indices", td_mpp%t_proc(:)%i_lei) 
     4089      CALL mpp_move_att(td_mpp, tl_att) 
     4090 
     4091      tl_att=att_init( "SUBDOMAIN_J_last_indoor_indices", td_mpp%t_proc(:)%i_lej) 
     4092      CALL mpp_move_att(td_mpp, tl_att)          
     4093 
     4094      ! clean 
     4095      CALL att_clean(tl_att) 
     4096 
     4097   END SUBROUTINE mpp__compute_halo 
    36054098END MODULE mpp 
    36064099 
Note: See TracChangeset for help on using the changeset viewer.