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 12080 for utils/tools/SIREN/src/mpp.f90 – NEMO

Ignore:
Timestamp:
2019-12-06T10:30:14+01:00 (4 years ago)
Author:
jpaul
Message:

update nemo trunk

File:
1 edited

Legend:

Unmodified
Added
Removed
  • utils/tools/SIREN/src/mpp.f90

    r9598 r12080  
    33!---------------------------------------------------------------------- 
    44! 
    5 ! MODULE: mpp 
    6 ! 
    75! DESCRIPTION: 
    86!> @brief 
    97!> This module manage massively parallel processing. 
    10 ! 
     8!> 
    119!> @details 
    1210!> define type TMPP:<br/> 
     
    194192!> @author 
    195193!>  J.Paul 
    196 ! REVISION HISTORY: 
     194!> 
    197195!> @date November, 2013 - Initial Version 
    198196!> @date November, 2014  
     
    203201!> - allow to print layout file (use lm_layout, hard coded) 
    204202!> - add mpp__compute_halo and mpp__read_halo 
    205 ! 
    206 !> @note Software governed by the CeCILL licence     (./LICENSE) 
     203!> 
     204!> @note Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     205!> 
     206!> @todo 
     207!> - ECRIRE ET TESTER add_proc_array pour optimiser codes (voir old/MO_mpp.f90) 
    207208!---------------------------------------------------------------------- 
    208209MODULE mpp 
     210 
    209211   USE global                          ! global parameter 
    210212   USE kind                            ! F90 kind parameter 
     
    215217   USE var                             ! variable manager 
    216218   USE file                            ! file manager 
    217    USE iom                             ! I/O manager 
     219   USE iom                             ! I/O manager  
     220 
    218221   IMPLICIT NONE 
    219222   ! NOTE_avoid_public_variables_if_possible 
     
    248251   PRIVATE :: mpp__add_proc            ! add proc strucutre in mpp structure 
    249252   PRIVATE :: mpp__add_proc_unit       ! add one proc strucutre in mpp structure 
     253   PRIVATE :: mpp__add_proc_arr        ! add array of proc strucutre in mpp structure 
    250254   PRIVATE :: mpp__del_proc            ! delete one proc strucutre in mpp structure 
    251255   PRIVATE :: mpp__del_proc_id         ! delete one proc strucutre in mpp structure, given procesor id 
     
    300304      TYPE(TDIM),  DIMENSION(ip_maxdim)  :: t_dim         !< global domain dimension 
    301305 
    302       TYPE(TFILE), DIMENSION(:), POINTER :: t_proc => NULL()     !< files/processors composing mpp 
     306      TYPE(TFILE), DIMENSION(:), POINTER :: t_proc => NULL()  !< files/processors composing mpp 
     307 
     308      LOGICAL                            :: l_usempp = .TRUE. !< use mpp decomposition for writing netcdf 
    303309   END TYPE 
    304310 
     
    319325 
    320326   ! module variable 
     327   INTEGER(i4) :: im_psize  = 2000        !< processor dimension length for huge file  
     328 
    321329   INTEGER(i4) :: im_iumout = 44 
    322330   LOGICAL     :: lm_layout =.FALSE. 
     
    328336   INTERFACE mpp__add_proc 
    329337      MODULE PROCEDURE mpp__add_proc_unit  
     338      MODULE PROCEDURE mpp__add_proc_arr 
    330339   END INTERFACE mpp__add_proc 
    331340 
    332341   INTERFACE mpp_clean 
    333342      MODULE PROCEDURE mpp__clean_unit  
    334       MODULE PROCEDURE mpp__clean_arr    
     343      MODULE PROCEDURE mpp__clean_arr 
    335344   END INTERFACE mpp_clean 
    336345 
     
    368377 
    369378CONTAINS 
     379   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     380   FUNCTION mpp__copy_unit(td_mpp) & 
     381         &  RESULT(tf_mpp)       
    370382   !------------------------------------------------------------------- 
    371383   !> @brief 
     
    385397   !> @date November, 2013 - Initial Version 
    386398   !> @date November, 2014 
    387    !>    - use function instead of overload assignment operator  
     399   !> - use function instead of overload assignment operator  
    388400   !> (to avoid memory leak) 
    389    ! 
     401   !> @date January, 2019 
     402   !> - clean file structure 
     403   !> 
    390404   !> @param[in] td_mpp   mpp structure 
    391405   !> @return copy of input mpp structure 
    392406   !------------------------------------------------------------------- 
    393    FUNCTION mpp__copy_unit( td_mpp ) 
     407 
    394408      IMPLICIT NONE 
     409 
    395410      ! Argument 
    396411      TYPE(TMPP), INTENT(IN)  :: td_mpp 
     412 
    397413      ! function 
    398       TYPE(TMPP) :: mpp__copy_unit 
     414      TYPE(TMPP)              :: tf_mpp 
    399415 
    400416      ! local variable 
     
    406422 
    407423      CALL logger_trace("MPP COPY: "//TRIM(td_mpp%c_name)//" in "//& 
    408       &  TRIM(mpp__copy_unit%c_name)) 
     424      &  TRIM(tf_mpp%c_name)) 
    409425 
    410426      ! copy mpp variable 
    411       mpp__copy_unit%c_name     = TRIM(td_mpp%c_name) 
    412       mpp__copy_unit%i_id       = td_mpp%i_id 
    413       mpp__copy_unit%i_niproc   = td_mpp%i_niproc 
    414       mpp__copy_unit%i_njproc   = td_mpp%i_njproc 
    415       mpp__copy_unit%i_nproc    = td_mpp%i_nproc 
    416       mpp__copy_unit%i_preci    = td_mpp%i_preci 
    417       mpp__copy_unit%i_precj    = td_mpp%i_precj 
    418       mpp__copy_unit%c_type     = TRIM(td_mpp%c_type) 
    419       mpp__copy_unit%c_dom      = TRIM(td_mpp%c_dom) 
    420       mpp__copy_unit%i_ndim     = td_mpp%i_ndim 
    421       mpp__copy_unit%i_ew       = td_mpp%i_ew 
    422       mpp__copy_unit%i_perio    = td_mpp%i_perio 
    423       mpp__copy_unit%i_pivot    = td_mpp%i_pivot 
     427      tf_mpp%c_name     = TRIM(td_mpp%c_name) 
     428      tf_mpp%i_id       = td_mpp%i_id 
     429      tf_mpp%i_niproc   = td_mpp%i_niproc 
     430      tf_mpp%i_njproc   = td_mpp%i_njproc 
     431      tf_mpp%i_nproc    = td_mpp%i_nproc 
     432      tf_mpp%i_preci    = td_mpp%i_preci 
     433      tf_mpp%i_precj    = td_mpp%i_precj 
     434      tf_mpp%c_type     = TRIM(td_mpp%c_type) 
     435      tf_mpp%c_dom      = TRIM(td_mpp%c_dom) 
     436      tf_mpp%i_ndim     = td_mpp%i_ndim 
     437      tf_mpp%i_ew       = td_mpp%i_ew 
     438      tf_mpp%i_perio    = td_mpp%i_perio 
     439      tf_mpp%i_pivot    = td_mpp%i_pivot 
     440      tf_mpp%l_usempp   = td_mpp%l_usempp 
    424441 
    425442      ! copy dimension 
    426       mpp__copy_unit%t_dim(:) = dim_copy(td_mpp%t_dim(:)) 
     443      tf_mpp%t_dim(:) = dim_copy(td_mpp%t_dim(:)) 
    427444       
    428445      ! copy file structure 
    429       IF( ASSOCIATED(mpp__copy_unit%t_proc) )THEN 
    430          CALL file_clean(mpp__copy_unit%t_proc(:)) 
    431          DEALLOCATE(mpp__copy_unit%t_proc) 
    432       ENDIF 
    433       IF( ASSOCIATED(td_mpp%t_proc) .AND. mpp__copy_unit%i_nproc > 0 )THEN 
    434          ALLOCATE( mpp__copy_unit%t_proc(mpp__copy_unit%i_nproc) ) 
    435          DO ji=1,mpp__copy_unit%i_nproc 
     446      IF( ASSOCIATED(tf_mpp%t_proc) )THEN 
     447         CALL file_clean(tf_mpp%t_proc(:)) 
     448         DEALLOCATE(tf_mpp%t_proc) 
     449      ENDIF 
     450      IF( ASSOCIATED(td_mpp%t_proc) .AND. tf_mpp%i_nproc > 0 )THEN 
     451         ALLOCATE( tf_mpp%t_proc(tf_mpp%i_nproc) ) 
     452         DO ji=1,tf_mpp%i_nproc 
    436453            tl_file = file_copy(td_mpp%t_proc(ji)) 
    437             mpp__copy_unit%t_proc(ji) = file_copy(tl_file) 
     454            tf_mpp%t_proc(ji) = file_copy(tl_file) 
    438455         ENDDO 
    439456         ! clean 
     
    442459 
    443460   END FUNCTION mpp__copy_unit 
     461   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     462   FUNCTION mpp__copy_arr(td_mpp) & 
     463         &  RESULT(tf_mpp) 
    444464   !------------------------------------------------------------------- 
    445465   !> @brief 
     
    465485   !> @return copy of input array of mpp structure 
    466486   !------------------------------------------------------------------- 
    467    FUNCTION mpp__copy_arr( td_mpp ) 
     487 
    468488      IMPLICIT NONE 
     489 
    469490      ! Argument 
    470       TYPE(TMPP), DIMENSION(:), INTENT(IN)  :: td_mpp 
     491      TYPE(TMPP), DIMENSION(:),  INTENT(IN)  :: td_mpp 
     492 
    471493      ! function 
    472       TYPE(TMPP), DIMENSION(SIZE(td_mpp(:))) :: mpp__copy_arr 
     494      TYPE(TMPP), DIMENSION(SIZE(td_mpp(:))) :: tf_mpp 
    473495 
    474496      ! local variable 
     
    478500 
    479501      DO ji=1,SIZE(td_mpp(:)) 
    480          mpp__copy_arr(ji)=mpp_copy(td_mpp(ji)) 
     502         tf_mpp(ji)=mpp_copy(td_mpp(ji)) 
    481503      ENDDO 
    482504 
    483505   END FUNCTION mpp__copy_arr 
     506   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     507   SUBROUTINE mpp_print(td_mpp) 
    484508   !------------------------------------------------------------------- 
    485509   !> @brief This subroutine print some information about mpp strucutre. 
    486    ! 
     510   !> 
    487511   !> @author J.Paul 
    488512   !> @date November, 2013 - Initial Version 
    489    ! 
     513   !> 
    490514   !> @param[in] td_mpp mpp structure 
    491515   !------------------------------------------------------------------- 
    492    SUBROUTINE mpp_print(td_mpp) 
     516 
    493517      IMPLICIT NONE 
    494518 
     
    497521 
    498522      ! local variable 
    499       INTEGER(i4), PARAMETER :: il_freq = 4 
    500  
     523      INTEGER(i4), PARAMETER :: ip_freq = 4 
     524      INTEGER(i4), PARAMETER :: ip_min  = 5 
     525 
     526      INTEGER(i4)                              :: il_min 
    501527      INTEGER(i4), DIMENSION(:,:), ALLOCATABLE :: il_proc 
    502528      INTEGER(i4), DIMENSION(:,:), ALLOCATABLE :: il_lci 
     
    540566         &   ALL( td_mpp%t_proc(:)%i_jind==0 ) )THEN 
    541567 
    542             DO ji=1,td_mpp%i_nproc 
     568            il_min=MIN(td_mpp%i_nproc,ip_min) 
     569            DO ji=1,il_min 
    543570               CALL file_print(td_mpp%t_proc(ji)) 
    544571               WRITE(*,'((a),(/3x,a,i0),2(/3x,a,a),4(/3x,a,i0,a,i0)/)')& 
     
    557584 
    558585            ENDDO 
     586            IF( td_mpp%i_nproc > ip_min )THEN 
     587               WRITE(*,'(a)') "...etc"  
     588            ENDIF 
    559589 
    560590            IF( td_mpp%t_proc(1)%i_nvar > 0 )THEN 
     
    567597         ELSE 
    568598 
    569             DO ji=1,td_mpp%i_nproc 
     599            il_min=MIN(td_mpp%i_nproc,ip_min) 
     600            DO ji=1,il_min 
     601               CALL file_print(td_mpp%t_proc(ji)) 
    570602               WRITE(*,'((a, a),(/3x,a,i0),(/3x,a,a),4(/3x,a,i0,a,i0)/)')& 
    571603               &  " Domain decomposition : ",TRIM(td_mpp%t_proc(ji)%c_name),& 
     
    582614 
    583615            ENDDO 
     616            IF( td_mpp%i_nproc > ip_min )THEN 
     617               WRITE(*,'(a)') "...etc"  
     618            ENDIF 
    584619             
    585620            IF( td_mpp%t_proc(1)%i_nvar > 0 )THEN 
    586621               WRITE(*,'(/a)') " Variable(s) used : " 
    587622               DO ji=1,td_mpp%t_proc(1)%i_nvar 
    588                   WRITE(*,'(3x,a)') TRIM(td_mpp%t_proc(1)%t_var(ji)%c_name)  
     623                  WRITE(*,'(3x,a)') TRIM(td_mpp%t_proc(1)%t_var(ji)%c_name) 
    589624               ENDDO 
    590625            ENDIF 
    591626 
    592             ALLOCATE( il_proc(td_mpp%i_niproc,td_mpp%i_njproc) ) 
    593             ALLOCATE( il_lci(td_mpp%i_niproc,td_mpp%i_njproc) ) 
    594             ALLOCATE( il_lcj(td_mpp%i_niproc,td_mpp%i_njproc) ) 
    595             il_proc(:,:)=-1 
    596             il_lci(:,:) =-1 
    597             il_lcj(:,:) =-1 
    598  
    599             DO jk=1,td_mpp%i_nproc 
    600                ji=td_mpp%t_proc(jk)%i_iind 
    601                jj=td_mpp%t_proc(jk)%i_jind 
    602                il_proc(ji,jj)=jk-1 
    603                il_lci(ji,jj)=td_mpp%t_proc(jk)%i_lci 
    604                il_lcj(ji,jj)=td_mpp%t_proc(jk)%i_lcj 
    605             ENDDO 
    606  
    607             jl = 1 
    608             DO jk = 1,(td_mpp%i_niproc-1)/il_freq+1 
    609                jm = MIN(td_mpp%i_niproc, jl+il_freq-1) 
    610                WRITE(*,*) 
    611                WRITE(*,9401) (ji, ji = jl,jm) 
    612                WRITE(*,9400) ('***', ji = jl,jm-1) 
    613                DO jj = 1, td_mpp%i_njproc 
    614                   WRITE(*,9403) ('   ', ji = jl,jm-1) 
    615                   WRITE(*,9402) jj, ( il_lci(ji,jj), il_lcj(ji,jj), ji = jl,jm) 
    616                   WRITE(*,9404) (il_proc(ji,jj), ji= jl,jm) 
    617                   WRITE(*,9403) ('   ', ji = jl,jm-1) 
     627            IF( td_mpp%l_usempp )THEN 
     628               ALLOCATE( il_proc(td_mpp%i_niproc,td_mpp%i_njproc) ) 
     629               ALLOCATE( il_lci(td_mpp%i_niproc,td_mpp%i_njproc) ) 
     630               ALLOCATE( il_lcj(td_mpp%i_niproc,td_mpp%i_njproc) ) 
     631               il_proc(:,:)=-1 
     632               il_lci(:,:) =-1 
     633               il_lcj(:,:) =-1 
     634 
     635               DO jk=1,td_mpp%i_nproc 
     636                  ji=td_mpp%t_proc(jk)%i_iind 
     637                  jj=td_mpp%t_proc(jk)%i_jind 
     638                  il_proc(ji,jj)=jk-1 
     639                  il_lci(ji,jj)=td_mpp%t_proc(jk)%i_lci 
     640                  il_lcj(ji,jj)=td_mpp%t_proc(jk)%i_lcj 
     641               ENDDO 
     642 
     643               jl = 1 
     644               DO jk = 1,(td_mpp%i_niproc-1)/ip_freq+1 
     645                  jm = MIN(td_mpp%i_niproc, jl+ip_freq-1) 
     646                  WRITE(*,*) 
     647                  WRITE(*,9401) (ji, ji = jl,jm) 
    618648                  WRITE(*,9400) ('***', ji = jl,jm-1) 
     649                  DO jj = 1, td_mpp%i_njproc 
     650                     WRITE(*,9403) ('   ', ji = jl,jm-1) 
     651                     WRITE(*,9402) jj, ( il_lci(ji,jj), il_lcj(ji,jj), ji = jl,jm) 
     652                     WRITE(*,9404) (il_proc(ji,jj), ji= jl,jm) 
     653                     WRITE(*,9403) ('   ', ji = jl,jm-1) 
     654                     WRITE(*,9400) ('***', ji = jl,jm-1) 
     655                  ENDDO 
     656                  jl = jl+ip_freq 
    619657               ENDDO 
    620                jl = jl+il_freq 
    621             ENDDO 
    622658          
    623             DEALLOCATE( il_proc ) 
    624             DEALLOCATE( il_lci ) 
    625             DEALLOCATE( il_lcj ) 
     659               DEALLOCATE( il_proc ) 
     660               DEALLOCATE( il_lci ) 
     661               DEALLOCATE( il_lcj ) 
     662            ENDIF 
    626663 
    627664         ENDIF 
     
    6336709403   FORMAT('     *     ',20('         *   ',a3)) 
    6346719401   FORMAT('        ',20('   ',i3,'          ')) 
    635 9402   FORMAT(' ',i3,' *  ',20(i0,'  x',i0,'   *   ')) 
     6729402   FORMAT(' ',i3,' *  ',20(i3,'  x',i3,'   *   ')) 
    6366739404   FORMAT('     *  ',20('      ',i3,'   *   ')) 
    637674 
    638675   END SUBROUTINE mpp_print 
     676   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     677   FUNCTION mpp__init_mask(cd_file, id_mask,                   & 
     678         &                 id_niproc, id_njproc, id_nproc,     & 
     679         &                 id_preci, id_precj,                 & 
     680         &                 cd_type, id_ew, id_perio, id_pivot, & 
     681         &                 td_dim, ld_usempp)                  & 
     682         & RESULT(tf_mpp) 
    639683   !------------------------------------------------------------------- 
    640684   !> @brief 
     
    647691   !> - length of the overlap region (id_preci, id_precj) could be specify 
    648692   !> in I and J direction (default value is 1) 
    649    ! 
     693   !> 
    650694   !> @author J.Paul 
    651695   !> @date November, 2013 - Initial version 
     
    655699   !> - use RESULT to rename output 
    656700   !> - mismatch with "halo" indices 
    657    ! 
     701   !> 
    658702   !> @param[in] cd_file   file name of one file composing mpp domain 
    659703   !> @param[in] id_mask   domain mask 
     
    670714   !> @return mpp structure 
    671715   !------------------------------------------------------------------- 
    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) 
     716       
    678717      IMPLICIT NONE 
     718 
    679719      ! Argument 
    680720      CHARACTER(LEN=*),                  INTENT(IN) :: cd_file 
     
    690730      INTEGER(i4),                       INTENT(IN), OPTIONAL :: id_pivot 
    691731      TYPE(TDIM) , DIMENSION(ip_maxdim), INTENT(IN), OPTIONAL :: td_dim 
     732      LOGICAL                          , INTENT(IN), OPTIONAL :: ld_usempp 
    692733 
    693734      ! function 
    694       TYPE(TMPP) :: td_mpp 
     735      TYPE(TMPP)                                   :: tf_mpp 
    695736 
    696737      ! local variable 
     
    698739 
    699740      INTEGER(i4)      , DIMENSION(2)              :: il_shape 
     741      INTEGER(i4)                                  :: il_niproc 
     742      INTEGER(i4)                                  :: il_njproc 
    700743 
    701744      TYPE(TDIM)                                   :: tl_dim 
     
    710753 
    711754      ! clean mpp 
    712       CALL mpp_clean(td_mpp) 
     755      CALL mpp_clean(tf_mpp) 
    713756 
    714757      ! check type 
     
    719762         SELECT CASE(TRIM(cd_type)) 
    720763            CASE('cdf') 
    721                td_mpp%c_type='cdf' 
     764               tf_mpp%c_type='cdf' 
    722765            CASE('dimg') 
    723                td_mpp%c_type='dimg' 
     766               tf_mpp%c_type='dimg' 
    724767            CASE DEFAULT 
    725                CALL logger_warn( "MPP INIT: type "//TRIM(cd_type)//& 
    726                & " unknown. type dimg will be used for mpp "//& 
    727                &  TRIM(td_mpp%c_name) ) 
    728                td_mpp%c_type='dimg' 
     768               CALL logger_warn("MPP INIT: type "//TRIM(cd_type)//& 
     769                  &            " unknown. type dimg will be used for mpp "//& 
     770                  &             TRIM(tf_mpp%c_name) ) 
     771               tf_mpp%c_type='dimg' 
    729772         END SELECT 
    730773      ELSE 
    731          td_mpp%c_type=TRIM(file_get_type(cd_file)) 
     774         tf_mpp%c_type=TRIM(file_get_type(cd_file)) 
    732775      ENDIF 
    733776 
    734777      ! get mpp name 
    735       td_mpp%c_name=TRIM(file_rename(cd_file)) 
     778      tf_mpp%c_name=TRIM(file_rename(cd_file)) 
    736779 
    737780      ! get global domain dimension 
     
    741784         DO ji=1,ip_maxdim 
    742785            IF( td_dim(ji)%l_use )THEN 
    743                CALL mpp_add_dim(td_mpp, td_dim(ji)) 
     786               CALL mpp_add_dim(tf_mpp, td_dim(ji)) 
    744787            ENDIF 
    745788         ENDDO 
    746789      ELSE 
    747790         tl_dim=dim_init('X',il_shape(1)) 
    748          CALL mpp_add_dim(td_mpp, tl_dim) 
     791         CALL mpp_add_dim(tf_mpp, tl_dim) 
    749792 
    750793         tl_dim=dim_init('Y',il_shape(2)) 
    751          CALL mpp_add_dim(td_mpp, tl_dim) 
     794         CALL mpp_add_dim(tf_mpp, tl_dim) 
    752795 
    753796         ! clean 
     
    761804      ELSE 
    762805         ! get number of processors following I and J 
    763          IF( PRESENT(id_niproc) ) td_mpp%i_niproc=id_niproc 
    764          IF( PRESENT(id_njproc) ) td_mpp%i_njproc=id_njproc 
     806         IF( PRESENT(id_niproc) ) tf_mpp%i_niproc=id_niproc 
     807         IF( PRESENT(id_njproc) ) tf_mpp%i_njproc=id_njproc 
    765808      ENDIF 
    766809 
    767810      ! get maximum number of processors to be used 
    768       IF( PRESENT(id_nproc) ) td_mpp%i_nproc = id_nproc 
     811      IF( PRESENT(id_nproc) ) tf_mpp%i_nproc = id_nproc 
    769812 
    770813      ! get overlap region length 
    771       IF( PRESENT(id_preci) ) td_mpp%i_preci= id_preci 
    772       IF( PRESENT(id_precj) ) td_mpp%i_precj= id_precj 
     814      IF( PRESENT(id_preci) ) tf_mpp%i_preci= id_preci 
     815      IF( PRESENT(id_precj) ) tf_mpp%i_precj= id_precj 
    773816 
    774817      ! east-west overlap 
    775       IF( PRESENT(id_ew) ) td_mpp%i_ew= id_ew 
     818      IF( PRESENT(id_ew) ) tf_mpp%i_ew= id_ew 
    776819      ! NEMO periodicity 
    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 
     820      IF( PRESENT(id_perio) ) tf_mpp%i_perio= id_perio 
     821      IF( PRESENT(id_pivot) ) tf_mpp%i_pivot= id_pivot 
     822      ! 
     823      IF( PRESENT(ld_usempp) ) tf_mpp%l_usempp = ld_usempp 
     824 
     825      IF( tf_mpp%i_nproc  /= 0 .AND. & 
     826      &   tf_mpp%i_niproc /= 0 .AND. & 
     827      &   tf_mpp%i_njproc /= 0 .AND. & 
     828      &   tf_mpp%i_nproc  >  tf_mpp%i_niproc * tf_mpp%i_njproc )THEN 
    785829 
    786830         CALL logger_error("MPP INIT: invalid domain decomposition ") 
    787831         CALL logger_debug("MPP INIT: "// & 
    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)) ) 
     832            &              TRIM(fct_str(tf_mpp%i_nproc))//" > "//& 
     833            &              TRIM(fct_str(tf_mpp%i_niproc))//" x "//& 
     834            &              TRIM(fct_str(tf_mpp%i_njproc)) ) 
    791835 
    792836      ELSE 
     
    799843         ENDIF 
    800844 
    801          IF( td_mpp%i_niproc /= 0 .AND. & 
    802          &   td_mpp%i_njproc /= 0 )THEN 
     845         IF( tf_mpp%i_niproc /= 0 .AND. tf_mpp%i_njproc /= 0 .AND. & 
     846           &(tf_mpp%i_niproc  > 1 .OR.  tf_mpp%i_njproc  > 1) )THEN 
     847 
    803848            ! compute domain layout 
    804             tl_lay=layout__init( td_mpp, id_mask, td_mpp%i_niproc, td_mpp%i_njproc ) 
     849            tl_lay=layout__init(tf_mpp, id_mask, & 
     850               &                tf_mpp%i_niproc, tf_mpp%i_njproc) 
    805851            ! create mpp domain layout 
    806             CALL mpp__create_layout( td_mpp, tl_lay ) 
     852            CALL mpp__create_layout( tf_mpp, tl_lay ) 
     853 
    807854            ! clean 
    808855            CALL layout__clean( tl_lay ) 
    809          ELSEIF( td_mpp%i_nproc  /= 0 )THEN 
     856 
     857         ELSEIF( tf_mpp%i_nproc  > 1 )THEN 
     858 
    810859            ! optimiz 
    811             CALL mpp__optimiz( td_mpp, id_mask, td_mpp%i_nproc ) 
     860            CALL mpp__optimiz( tf_mpp, id_mask, tf_mpp%i_nproc ) 
    812861 
    813862         ELSE 
     863 
    814864            CALL logger_warn("MPP INIT: number of processor to be used "//& 
    815             &                "not specify. force to one.") 
    816             ! optimiz 
    817             CALL mpp__optimiz( td_mpp, id_mask, 1 ) 
     865            &                "not specify. force output on one file.") 
     866            ! number of proc to get proc size close to im_psize 
     867            il_niproc=INT(il_shape(jp_I)/im_psize)+1 
     868            il_njproc=INT(il_shape(jp_J)/im_psize)+1 
     869          
     870            tf_mpp%l_usempp=.FALSE. 
     871            tl_lay=layout__init( tf_mpp, id_mask,  & 
     872                               & il_niproc, il_njproc ) 
     873 
     874            ! create mpp domain layout 
     875            CALL mpp__create_layout( tf_mpp, tl_lay ) 
     876 
     877            ! clean 
     878            CALL layout__clean( tl_lay ) 
     879 
    818880         ENDIF 
    819881 
    820  
    821882         CALL logger_info("MPP INIT: domain decoposition : "//& 
    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))//')' ) 
     883         &  'niproc('//TRIM(fct_str(tf_mpp%i_niproc))//') * '//& 
     884         &  'njproc('//TRIM(fct_str(tf_mpp%i_njproc))//') = '//& 
     885         &  'nproc('//TRIM(fct_str(tf_mpp%i_nproc))//')' ) 
    825886 
    826887         ! get domain type 
    827          CALL mpp_get_dom( td_mpp ) 
    828  
    829          DO ji=1,td_mpp%i_nproc 
     888         CALL mpp_get_dom( tf_mpp ) 
     889 
     890         DO ji=1,tf_mpp%i_nproc 
    830891 
    831892            ! get processor size 
    832             il_shape(:)=mpp_get_proc_size( td_mpp, ji ) 
     893            il_shape(:)=mpp_get_proc_size( tf_mpp, ji ) 
    833894 
    834895            tl_dim=dim_init('X',il_shape(1)) 
    835             CALL file_move_dim(td_mpp%t_proc(ji), tl_dim) 
     896            CALL file_move_dim(tf_mpp%t_proc(ji), tl_dim) 
    836897 
    837898            tl_dim=dim_init('Y',il_shape(2)) 
    838             CALL file_move_dim(td_mpp%t_proc(ji), tl_dim)             
     899            CALL file_move_dim(tf_mpp%t_proc(ji), tl_dim)             
    839900 
    840901            IF( PRESENT(td_dim) )THEN 
    841902               IF( td_dim(jp_K)%l_use )THEN 
    842                   CALL file_move_dim(td_mpp%t_proc(ji), td_dim(jp_K)) 
     903                  CALL file_move_dim(tf_mpp%t_proc(ji), td_dim(jp_K)) 
    843904               ENDIF 
    844905               IF( td_dim(jp_L)%l_use )THEN 
    845                   CALL file_move_dim(td_mpp%t_proc(ji), td_dim(jp_L)) 
     906                  CALL file_move_dim(tf_mpp%t_proc(ji), td_dim(jp_L)) 
    846907               ENDIF 
    847908            ENDIF 
    848909            ! add type 
    849             td_mpp%t_proc(ji)%c_type=TRIM(td_mpp%c_type) 
     910            tf_mpp%t_proc(ji)%c_type=TRIM(tf_mpp%c_type) 
    850911 
    851912            ! clean 
     
    855916 
    856917         ! add global attribute 
    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)  
     918         tl_att=att_init("DOMAIN_number_total",tf_mpp%i_nproc) 
     919         CALL mpp_add_att(tf_mpp, tl_att) 
     920 
     921         tl_att=att_init("DOMAIN_LOCAL",TRIM(tf_mpp%c_dom)) 
     922         CALL mpp_add_att(tf_mpp, tl_att) 
     923 
     924         tl_att=att_init("DOMAIN_I_number_total",tf_mpp%i_niproc) 
     925         CALL mpp_add_att(tf_mpp, tl_att) 
     926 
     927         tl_att=att_init("DOMAIN_J_number_total",tf_mpp%i_njproc) 
     928         CALL mpp_add_att(tf_mpp, tl_att) 
     929 
     930         tl_att=att_init("DOMAIN_size_global",tf_mpp%t_dim(1:2)%i_len) 
     931         CALL mpp_add_att(tf_mpp, tl_att) 
     932 
     933         CALL mpp__compute_halo(tf_mpp)  
    873934      ENDIF 
    874935 
    875936   END FUNCTION mpp__init_mask 
     937   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     938   FUNCTION mpp__init_var(cd_file, td_var,               & 
     939         &                id_niproc, id_njproc, id_nproc,& 
     940         &                id_preci, id_precj, cd_type,   & 
     941         &                id_perio, id_pivot, ld_usempp) & 
     942         &  RESULT(tf_mpp) 
    876943   !------------------------------------------------------------------- 
    877944   !> @brief 
     
    884951   !> - length of the overlap region (id_preci, id_precj) could be specify 
    885952   !> in I and J direction (default value is 1) 
    886    ! 
     953   !> 
    887954   !> @author J.Paul 
    888955   !> @date November, 2013 - Initial version 
    889    ! 
     956   !> 
    890957   !> @param[in] cd_file   file name of one file composing mpp domain 
    891958   !> @param[in] td_var    variable structure 
     
    900967   !> @return mpp structure 
    901968   !------------------------------------------------------------------- 
    902    TYPE(TMPP) FUNCTION mpp__init_var( cd_file, td_var,               & 
    903    &                                  id_niproc, id_njproc, id_nproc,& 
    904    &                                  id_preci, id_precj, cd_type,   & 
    905    &                                  id_perio, id_pivot ) 
     969 
    906970      IMPLICIT NONE 
     971 
    907972      ! Argument 
    908973      CHARACTER(LEN=*), INTENT(IN) :: cd_file 
     
    916981      INTEGER(i4),      INTENT(IN), OPTIONAL :: id_perio 
    917982      INTEGER(i4),      INTENT(IN), OPTIONAL :: id_pivot 
     983      LOGICAL,          INTENT(IN), OPTIONAL :: ld_usempp 
     984      
     985      ! function 
     986      TYPE(TMPP)                   :: tf_mpp 
    918987 
    919988      ! local variable 
     
    929998         CALL logger_info("MPP INIT: mask compute from variable "//& 
    930999            &             TRIM(td_var%c_name)) 
    931          mpp__init_var=mpp_init( cd_file, il_mask(:,:,1),       & 
    932          &                       id_niproc, id_njproc, id_nproc,& 
    933          &                       id_preci, id_precj, cd_type,   & 
    934          &                       id_ew=td_var%i_ew, & 
    935          &                       id_perio=id_perio, id_pivot=id_pivot) 
     1000         tf_mpp = mpp_init( cd_file, il_mask(:,:,1),       & 
     1001            &               id_niproc, id_njproc, id_nproc,& 
     1002            &               id_preci, id_precj, cd_type,   & 
     1003            &               id_ew=td_var%i_ew,             & 
     1004            &               id_perio=id_perio, id_pivot=id_pivot,& 
     1005            &               ld_usempp=ld_usempp) 
    9361006 
    9371007         DEALLOCATE(il_mask) 
     
    9411011 
    9421012   END FUNCTION mpp__init_var 
     1013   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     1014   FUNCTION mpp__init_file(td_file, id_ew, id_perio, id_pivot) & 
     1015         & RESULT(tf_mpp) 
    9431016   !------------------------------------------------------------------- 
    9441017   !> @brief This function initalise a mpp structure given file structure.  
     
    9611034   !> @date January, 2016 
    9621035   !> - mismatch with "halo" indices, use mpp__compute_halo 
    963    ! 
     1036   !> @date Marsh, 2017 
     1037   !> - netcdf proc indices from zero to N-1 
     1038   !> - copy file periodicity to mpp structure  
     1039   !> @date August, 2017 
     1040   !> - force to use domain decomposition to enhance read of monoproc file 
     1041   !> 
    9641042   !> @param[in] td_file   file strcuture 
    9651043   !> @param[in] id_ew     east-west overlap 
     
    9681046   !> @return mpp structure 
    9691047   !------------------------------------------------------------------- 
    970    TYPE(TMPP) FUNCTION mpp__init_file( td_file, id_ew, id_perio, id_pivot ) 
     1048 
    9711049      IMPLICIT NONE 
    9721050 
    9731051      ! Argument 
    974       TYPE(TFILE), INTENT(IN) :: td_file 
     1052      TYPE(TFILE), INTENT(IN)           :: td_file 
    9751053      INTEGER(i4), INTENT(IN), OPTIONAL :: id_ew 
    9761054      INTEGER(i4), INTENT(IN), OPTIONAL :: id_perio 
    9771055      INTEGER(i4), INTENT(IN), OPTIONAL :: id_pivot 
    9781056 
     1057      ! function 
     1058      TYPE(TMPP)                        :: tf_mpp 
     1059 
    9791060      ! local variable 
    980       INTEGER(i4)               :: il_nproc 
    981       INTEGER(i4)               :: il_attid 
    982       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 
     1061      INTEGER(i4)                               :: il_nproc 
     1062      INTEGER(i4)                               :: il_attid 
     1063      INTEGER(i4), DIMENSION(2)                 :: il_shape 
     1064 
     1065      INTEGER(i4), DIMENSION(:,:), ALLOCATABLE  :: il_mask 
     1066      INTEGER(i4), DIMENSION(ip_maxdim)         :: il_dim 
     1067      INTEGER(i4)                               :: il_niproc 
     1068      INTEGER(i4)                               :: il_njproc 
     1069 
     1070      TYPE(TDIM)                                :: tl_dim 
     1071 
     1072      TYPE(TATT)                                :: tl_att 
     1073 
     1074      TYPE(TFILE)                               :: tl_file 
     1075 
     1076      TYPE(TMPP)                                :: tl_mpp 
    9911077 
    9921078      ! loop indices 
     
    9951081 
    9961082      ! clean mpp 
    997       CALL mpp_clean(mpp__init_file) 
     1083      CALL mpp_clean(tf_mpp) 
    9981084 
    9991085      ! check file type 
     
    10051091            ! open file 
    10061092            CALL iom_open(tl_file) 
     1093 
    10071094            ! read first file domain decomposition 
    10081095            tl_mpp=mpp__init_file_cdf(tl_file) 
     
    10281115                  CALL mpp_clean(tl_mpp) 
    10291116  
    1030                   ! get filename  
    1031                   tl_file=file_rename(td_file,ji) 
     1117                  ! get filename (from 0 to n-1)  
     1118                  tl_file=file_rename(td_file,ji-1) 
    10321119  
    10331120                  ! open file 
     
    10371124                  tl_mpp = mpp__init_file_cdf(tl_file) 
    10381125                  IF( ji == 1 )THEN 
    1039                      mpp__init_file=mpp_copy(tl_mpp) 
     1126                     tf_mpp=mpp_copy(tl_mpp) 
    10401127                  ELSE 
    1041                      IF( ANY( mpp__init_file%t_dim(1:2)%i_len /= & 
    1042                                       tl_mpp%t_dim(1:2)%i_len) )THEN 
     1128                     IF( ANY( tf_mpp%t_dim(1:2)%i_len /= & 
     1129                              tl_mpp%t_dim(1:2)%i_len) )THEN 
    10431130 
    10441131                        CALL logger_error("MPP INIT READ: dimension from file "//& 
    10451132                        &     TRIM(tl_file%c_name)//" and mpp strcuture "//& 
    1046                         &     TRIM(mpp__init_file%c_name)//"differ ") 
     1133                        &     TRIM(tf_mpp%c_name)//"differ ") 
    10471134 
    10481135                     ELSE 
    10491136 
    10501137                        ! add processor to mpp strcuture 
    1051                         CALL mpp__add_proc(mpp__init_file, tl_mpp%t_proc(1)) 
     1138                        CALL mpp__add_proc(tf_mpp, tl_mpp%t_proc(1)) 
    10521139 
    10531140                     ENDIF 
     
    10581145 
    10591146               ENDDO 
    1060                IF( mpp__init_file%i_nproc /= il_nproc )THEN 
     1147               IF( tf_mpp%i_nproc /= il_nproc )THEN 
    10611148                  CALL logger_error("MPP INIT READ: some processors can't be added & 
    10621149                  &               to mpp structure") 
     
    10641151 
    10651152            ELSE 
    1066                mpp__init_file=mpp_copy(tl_mpp) 
     1153 
     1154               ! force to use domain decomposition to enhance read of input 
     1155 
     1156               ! create pseudo mask  
     1157               il_dim(:)=tl_mpp%t_dim(:)%i_len 
     1158               ALLOCATE(il_mask(il_dim(jp_I),il_dim(jp_J))) 
     1159               il_mask(:,:)=1 
     1160 
     1161               ! number of proc to get proc size close to im_psize 
     1162               il_niproc=INT(il_dim(jp_I)/im_psize)+1 
     1163               il_njproc=INT(il_dim(jp_J)/im_psize)+1 
     1164 
     1165               ! compute domain layout 
     1166               ! output will be written on one file 
     1167               tf_mpp=mpp_init(tl_mpp%c_name, il_mask, il_niproc, il_njproc,& 
     1168                  &            id_perio=tl_file%i_perio, &    
     1169                  &            ld_usempp=.FALSE. ) 
     1170 
     1171               ! add var 
     1172               DO ji=1,tl_mpp%t_proc(1)%i_nvar 
     1173                  CALL mpp_add_var(tf_mpp, tl_mpp%t_proc(1)%t_var(ji)) 
     1174               ENDDO 
     1175 
    10671176            ENDIF 
    10681177 
    10691178            ! mpp type 
    1070             mpp__init_file%c_type=TRIM(td_file%c_type) 
     1179            tf_mpp%c_type=TRIM(td_file%c_type) 
    10711180 
    10721181            ! mpp domain type 
    1073             CALL mpp_get_dom(mpp__init_file) 
     1182            CALL mpp_get_dom(tf_mpp) 
    10741183 
    10751184            ! create some attributes for domain decomposition (use with dimg file) 
    1076             tl_att=att_init( "DOMAIN_number_total", mpp__init_file%i_nproc ) 
    1077             CALL mpp_move_att(mpp__init_file, tl_att) 
    1078  
    1079             CALL mpp__compute_halo(mpp__init_file) 
     1185            tl_att=att_init( "DOMAIN_number_total", tf_mpp%i_nproc ) 
     1186            CALL mpp_move_att(tf_mpp, tl_att) 
     1187 
     1188            CALL mpp__compute_halo(tf_mpp) 
    10801189  
    10811190            ! clean 
     
    10931202            CALL logger_debug("MPP INIT READ: read mpp structure ") 
    10941203            ! read mpp structure 
    1095             mpp__init_file=mpp__init_file_rstdimg(tl_file) 
     1204            tf_mpp=mpp__init_file_rstdimg(tl_file) 
    10961205 
    10971206            ! mpp type 
    1098             mpp__init_file%c_type=TRIM(td_file%c_type) 
     1207            tf_mpp%c_type=TRIM(td_file%c_type) 
    10991208 
    11001209            ! mpp domain type 
    11011210            CALL logger_debug("MPP INIT READ: mpp_get_dom ") 
    1102             CALL mpp_get_dom(mpp__init_file) 
     1211            CALL mpp_get_dom(tf_mpp) 
    11031212 
    11041213            ! get processor size 
    11051214            CALL logger_debug("MPP INIT READ: get processor size ") 
    1106             DO ji=1,mpp__init_file%i_nproc 
    1107  
    1108                il_shape(:)=mpp_get_proc_size( mpp__init_file, ji ) 
     1215            DO ji=1,tf_mpp%i_nproc 
     1216 
     1217               il_shape(:)=mpp_get_proc_size( tf_mpp, ji ) 
    11091218 
    11101219               tl_dim=dim_init('X',il_shape(1)) 
    1111                CALL file_add_dim(mpp__init_file%t_proc(ji), tl_dim) 
     1220               CALL file_add_dim(tf_mpp%t_proc(ji), tl_dim) 
    11121221 
    11131222               tl_dim=dim_init('Y',il_shape(2)) 
    1114                CALL file_add_dim(mpp__init_file%t_proc(ji), tl_dim)             
     1223               CALL file_add_dim(tf_mpp%t_proc(ji), tl_dim)             
    11151224 
    11161225               ! clean 
     
    11281237 
    11291238      ! east west overlap 
    1130       IF( PRESENT(id_ew) ) mpp__init_file%i_ew=id_ew 
     1239      IF( PRESENT(id_ew) ) tf_mpp%i_ew=id_ew 
    11311240      ! NEMO periodicity 
    11321241      IF( PRESENT(id_perio) )THEN 
    1133          mpp__init_file%i_perio= id_perio 
     1242         tf_mpp%i_perio= id_perio 
    11341243         SELECT CASE(id_perio) 
    11351244         CASE(3,4) 
    1136             mpp__init_file%i_pivot=1 
     1245            tf_mpp%i_pivot=1 
    11371246         CASE(5,6) 
    1138             mpp__init_file%i_pivot=0 
     1247            tf_mpp%i_pivot=0 
    11391248         CASE DEFAULT 
    1140             mpp__init_file%i_pivot=1 
     1249            tf_mpp%i_pivot=1 
    11411250         END SELECT 
    11421251      ENDIF 
    11431252 
    1144       IF( PRESENT(id_pivot) ) mpp__init_file%i_pivot= id_pivot 
     1253      IF( PRESENT(id_pivot) ) tf_mpp%i_pivot= id_pivot 
    11451254 
    11461255      ! clean  
     
    11481257 
    11491258   END FUNCTION mpp__init_file 
     1259   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     1260   FUNCTION mpp__init_file_cdf(td_file) & 
     1261         &  RESULT(tf_mpp) 
    11501262   !------------------------------------------------------------------- 
    11511263   !> @brief This function initalise a mpp structure,  
    11521264   !> reading some netcdf files. 
    1153    ! 
     1265   !> 
    11541266   !> @details  
    1155    ! 
     1267   !> 
    11561268   !> @author J.Paul 
    11571269   !> @date November, 2013 - Initial Version 
     
    11641276   !> @return mpp structure 
    11651277   !------------------------------------------------------------------- 
    1166    TYPE(TMPP) FUNCTION mpp__init_file_cdf( td_file ) 
     1278 
    11671279      IMPLICIT NONE 
    11681280 
    11691281      ! Argument 
    11701282      TYPE(TFILE), INTENT(IN) :: td_file 
     1283 
     1284      ! function 
     1285      TYPE(TMPP)              :: tf_mpp 
    11711286 
    11721287      ! local variable 
     
    11961311 
    11971312            ! get mpp name 
    1198             mpp__init_file_cdf%c_name=TRIM( file_rename(td_file%c_name) ) 
     1313            tf_mpp%c_name=TRIM( file_rename(td_file%c_name) ) 
    11991314 
    12001315            ! add type 
    1201             mpp__init_file_cdf%c_type="cdf" 
     1316            tf_mpp%c_type="cdf" 
    12021317 
    12031318            ! global domain size 
     
    12081323            IF( il_attid /= 0 )THEN 
    12091324               tl_dim=dim_init('X',INT(td_file%t_att(il_attid)%d_value(1))) 
    1210                CALL mpp_add_dim(mpp__init_file_cdf,tl_dim) 
     1325               CALL mpp_add_dim(tf_mpp,tl_dim) 
    12111326 
    12121327               tl_dim=dim_init('Y',INT(td_file%t_att(il_attid)%d_value(2))) 
    1213                CALL mpp_add_dim(mpp__init_file_cdf,tl_dim) 
     1328               CALL mpp_add_dim(tf_mpp,tl_dim) 
    12141329            ELSE ! assume only one file (not mpp) 
    12151330               tl_dim=dim_init( td_file%t_dim(1)%c_name, td_file%t_dim(1)%i_len) 
    1216                CALL mpp_add_dim(mpp__init_file_cdf,tl_dim) 
     1331               CALL mpp_add_dim(tf_mpp,tl_dim) 
    12171332 
    12181333               tl_dim=dim_init( td_file%t_dim(2)%c_name, td_file%t_dim(2)%i_len) 
    1219                CALL mpp_add_dim(mpp__init_file_cdf,tl_dim) 
     1334               CALL mpp_add_dim(tf_mpp,tl_dim) 
    12201335            ENDIF 
    12211336 
    12221337            IF( td_file%t_dim(3)%l_use )THEN 
    12231338               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) 
     1339               CALL mpp_add_dim(tf_mpp,tl_dim) 
    12251340            ENDIF 
    12261341 
    12271342            IF( td_file%t_dim(4)%l_use )THEN 
    12281343               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) 
     1344               CALL mpp_add_dim(tf_mpp,tl_dim) 
    12301345            ENDIF 
    12311346 
     
    12471362            tl_proc%t_dim(:)=dim_copy(td_file%t_dim(:)) 
    12481363 
    1249             CALL mpp__read_halo(tl_proc, mpp__init_file_cdf%t_dim(:) ) 
     1364            CALL mpp__read_halo(tl_proc, tf_mpp%t_dim(:) ) 
    12501365 
    12511366            ! add attributes 
    1252             tl_att=att_init( "DOMAIN_size_global", & 
    1253             &                mpp__init_file_cdf%t_dim(:)%i_len) 
     1367            tl_att=att_init( "DOMAIN_size_global", tf_mpp%t_dim(:)%i_len) 
    12541368            CALL file_move_att(tl_proc, tl_att) 
    12551369 
     
    12581372 
    12591373            ! add processor to mpp structure 
    1260             CALL mpp__add_proc(mpp__init_file_cdf, tl_proc) 
     1374            CALL mpp__add_proc(tf_mpp, tl_proc) 
    12611375 
    12621376            ! clean  
     
    12741388 
    12751389   END FUNCTION mpp__init_file_cdf 
     1390   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     1391   FUNCTION mpp__init_file_rstdimg(td_file) & 
     1392         &  RESULT(tf_mpp) 
    12761393   !------------------------------------------------------------------- 
    12771394   !> @brief This function initalise a mpp structure,  
    12781395   !> reading one dimg restart file. 
    1279    ! 
     1396   !> 
    12801397   !> @details  
    1281    ! 
     1398   !> 
    12821399   !> @author J.Paul 
    12831400   !> @date November, 2013 - Initial Version 
    12841401   !> @date January, 2016 
    12851402   !> - mismatch with "halo" indices, use mpp__compute_halo 
     1403   !> @date January,2019 
     1404   !> - clean file structure 
    12861405   !> 
    12871406   !> @param[in] td_file   file strcuture 
    12881407   !> @return mpp structure 
    12891408   !------------------------------------------------------------------- 
    1290    TYPE(TMPP) FUNCTION mpp__init_file_rstdimg( td_file ) 
     1409 
    12911410      IMPLICIT NONE 
    12921411 
    12931412      ! Argument 
    12941413      TYPE(TFILE), INTENT(IN) :: td_file 
     1414 
     1415      ! function 
     1416      TYPE(TMPP)              :: tf_mpp 
    12951417 
    12961418      ! local variable 
     
    13361458            ! read first record  
    13371459            READ( td_file%i_id, IOSTAT=il_status, REC=1 )&  
    1338             &     il_recl,                         & 
    1339             &     il_nx, il_ny, il_nz,             & 
    1340             &     il_n0d, il_n1d, il_n2d, il_n3d,  & 
    1341             &     il_rhd,                          & 
    1342             &     il_pni, il_pnj, il_pnij,         & 
    1343             &     il_area 
     1460               &  il_recl,                         & 
     1461               &  il_nx, il_ny, il_nz,             & 
     1462               &  il_n0d, il_n1d, il_n2d, il_n3d,  & 
     1463               &  il_rhd,                          & 
     1464               &  il_pni, il_pnj, il_pnij,         & 
     1465               &  il_area 
    13441466            CALL fct_err(il_status) 
    13451467            IF( il_status /= 0 )THEN 
     
    13491471 
    13501472            ! get mpp name 
    1351             mpp__init_file_rstdimg%c_name=TRIM( file_rename(td_file%c_name) ) 
     1473            tf_mpp%c_name=TRIM( file_rename(td_file%c_name) ) 
    13521474 
    13531475            ! add type 
    1354             mpp__init_file_rstdimg%c_type="dimg" 
     1476            tf_mpp%c_type="dimg" 
    13551477 
    13561478            ! number of processors to be read 
    1357             mpp__init_file_rstdimg%i_nproc  = il_pnij 
    1358             mpp__init_file_rstdimg%i_niproc = il_pni 
    1359             mpp__init_file_rstdimg%i_njproc = il_pnj 
    1360  
    1361             IF( ASSOCIATED(mpp__init_file_rstdimg%t_proc) )THEN 
    1362                CALL file_clean(mpp__init_file_rstdimg%t_proc(:)) 
    1363                DEALLOCATE(mpp__init_file_rstdimg%t_proc) 
    1364             ENDIF 
    1365             ALLOCATE( mpp__init_file_rstdimg%t_proc(il_pnij) , stat=il_status ) 
     1479            tf_mpp%i_nproc  = il_pnij 
     1480            tf_mpp%i_niproc = il_pni 
     1481            tf_mpp%i_njproc = il_pnj 
     1482 
     1483            IF( ASSOCIATED(tf_mpp%t_proc) )THEN 
     1484               CALL file_clean(tf_mpp%t_proc(:)) 
     1485               DEALLOCATE(tf_mpp%t_proc) 
     1486            ENDIF 
     1487            ALLOCATE( tf_mpp%t_proc(il_pnij) , stat=il_status ) 
    13661488 
    13671489            ALLOCATE(il_lci (il_pnij)) 
     
    13781500            CALL dim_clean(tl_proc%t_dim(:)) 
    13791501            ! initialise file/processors 
    1380             DO ji=1,mpp__init_file_rstdimg%i_nproc 
    1381                mpp__init_file_rstdimg%t_proc(ji)=file_copy(tl_proc) 
     1502            DO ji=1,tf_mpp%i_nproc 
     1503               tf_mpp%t_proc(ji)=file_copy(tl_proc) 
    13821504            ENDDO 
    13831505 
     
    13891511            ! read first record  
    13901512            READ( td_file%i_id, IOSTAT=il_status, REC=1 )&  
    1391             &     il_recl,                         & 
    1392             &     il_nx, il_ny, il_nz,             & 
    1393             &     il_n0d, il_n1d, il_n2d, il_n3d,  & 
    1394             &     il_rhd,                          & 
    1395             &     il_pni, il_pnj, il_pnij,         & 
    1396             &     il_area,                         & 
    1397             &     il_iglo, il_jglo,                & 
    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) 
     1513               &  il_recl,                         & 
     1514               &  il_nx, il_ny, il_nz,             & 
     1515               &  il_n0d, il_n1d, il_n2d, il_n3d,  & 
     1516               &  il_rhd,                          & 
     1517               &  il_pni, il_pnj, il_pnij,         & 
     1518               &  il_area,                         & 
     1519               &  il_iglo, il_jglo,                & 
     1520               &  il_lci(1:il_pnij),               & 
     1521               &  il_lcj(1:il_pnij),               & 
     1522               &  il_ldi(1:il_pnij),               & 
     1523               &  il_ldj(1:il_pnij),               & 
     1524               &  il_lei(1:il_pnij),               & 
     1525               &  il_lej(1:il_pnij),               & 
     1526               &  il_impp(1:il_pnij),              & 
     1527               &  il_jmpp(1:il_pnij) 
    14061528            CALL fct_err(il_status) 
    14071529            IF( il_status /= 0 )THEN 
     
    14101532            ENDIF 
    14111533 
    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) 
     1534            tf_mpp%t_proc(1:il_pnij)%i_lci = il_lci (1:il_pnij) 
     1535            tf_mpp%t_proc(1:il_pnij)%i_lcj = il_lcj (1:il_pnij)  
     1536            tf_mpp%t_proc(1:il_pnij)%i_ldi = il_ldi (1:il_pnij)  
     1537            tf_mpp%t_proc(1:il_pnij)%i_ldj = il_ldj (1:il_pnij)  
     1538            tf_mpp%t_proc(1:il_pnij)%i_lei = il_lei (1:il_pnij)  
     1539            tf_mpp%t_proc(1:il_pnij)%i_lej = il_lej (1:il_pnij)  
     1540            tf_mpp%t_proc(1:il_pnij)%i_impp= il_impp(1:il_pnij) 
     1541            tf_mpp%t_proc(1:il_pnij)%i_jmpp= il_jmpp(1:il_pnij) 
    14201542 
    14211543            DEALLOCATE(il_lci)  
     
    14301552            ! global domain size 
    14311553            tl_dim=dim_init('X',il_iglo) 
    1432             CALL mpp_add_dim(mpp__init_file_rstdimg,tl_dim) 
     1554            CALL mpp_add_dim(tf_mpp,tl_dim) 
    14331555            tl_dim=dim_init('Y',il_jglo) 
    1434             CALL mpp_add_dim(mpp__init_file_rstdimg,tl_dim) 
     1556            CALL mpp_add_dim(tf_mpp,tl_dim) 
    14351557 
    14361558            tl_dim=dim_init('Z',il_nz) 
    1437             CALL mpp_add_dim(mpp__init_file_rstdimg,tl_dim) 
    1438  
    1439             DO ji=1,mpp__init_file_rstdimg%i_nproc 
     1559            CALL mpp_add_dim(tf_mpp,tl_dim) 
     1560 
     1561            DO ji=1,tf_mpp%i_nproc 
    14401562 
    14411563               ! get file name 
    14421564               cl_file =  file_rename(td_file%c_name,ji) 
    1443                mpp__init_file_rstdimg%t_proc(ji)%c_name = TRIM(cl_file) 
     1565               tf_mpp%t_proc(ji)%c_name = TRIM(cl_file) 
    14441566               ! update processor id 
    1445                mpp__init_file_rstdimg%t_proc(ji)%i_pid=ji 
     1567               tf_mpp%t_proc(ji)%i_pid=ji 
    14461568 
    14471569               ! add attributes 
    14481570               tl_att=att_init( "DOMAIN_number", ji ) 
    1449                CALL file_move_att(mpp__init_file_rstdimg%t_proc(ji), tl_att)  
     1571               CALL file_move_att(tf_mpp%t_proc(ji), tl_att)  
    14501572 
    14511573            ENDDO 
    14521574  
    14531575            ! add type 
    1454             mpp__init_file_rstdimg%t_proc(:)%c_type="dimg" 
     1576            tf_mpp%t_proc(:)%c_type="dimg" 
    14551577 
    14561578            ! add attributes 
    1457             tl_att=att_init( "DOMAIN_size_global", & 
    1458             &                mpp__init_file_rstdimg%t_dim(:)%i_len) 
    1459             CALL mpp_move_att(mpp__init_file_rstdimg, tl_att) 
    1460  
    1461             tl_att=att_init( "DOMAIN_number_total", & 
    1462             &                 mpp__init_file_rstdimg%i_nproc ) 
    1463             CALL mpp_move_att(mpp__init_file_rstdimg, tl_att) 
    1464  
    1465             tl_att=att_init( "DOMAIN_I_number_total", & 
    1466             &                 mpp__init_file_rstdimg%i_niproc ) 
    1467             CALL mpp_move_att(mpp__init_file_rstdimg, tl_att) 
    1468  
    1469             tl_att=att_init( "DOMAIN_J_number_total", & 
    1470             &                 mpp__init_file_rstdimg%i_njproc ) 
    1471             CALL mpp_move_att(mpp__init_file_rstdimg, tl_att) 
    1472  
    1473             CALL mpp_get_dom( mpp__init_file_rstdimg ) 
    1474  
    1475             CALL mpp__compute_halo( mpp__init_file_rstdimg ) 
     1579            tl_att=att_init("DOMAIN_size_global", tf_mpp%t_dim(:)%i_len) 
     1580            CALL mpp_move_att(tf_mpp, tl_att) 
     1581 
     1582            tl_att=att_init("DOMAIN_number_total", tf_mpp%i_nproc) 
     1583            CALL mpp_move_att(tf_mpp, tl_att) 
     1584 
     1585            tl_att=att_init("DOMAIN_I_number_total", tf_mpp%i_niproc) 
     1586            CALL mpp_move_att(tf_mpp, tl_att) 
     1587 
     1588            tl_att=att_init("DOMAIN_J_number_total", tf_mpp%i_njproc) 
     1589            CALL mpp_move_att(tf_mpp, tl_att) 
     1590 
     1591            CALL mpp_get_dom( tf_mpp ) 
     1592 
     1593            CALL mpp__compute_halo( tf_mpp ) 
    14761594 
    14771595            ! clean 
    14781596            CALL dim_clean(tl_dim) 
    14791597            CALL att_clean(tl_att) 
     1598            CALL file_clean(tl_proc) 
    14801599         ENDIF 
    14811600 
     
    14881607 
    14891608   END FUNCTION mpp__init_file_rstdimg 
     1609   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     1610   FUNCTION mpp__check_proc_dim(td_mpp, td_proc) & 
     1611         & RESULT(lf_check) 
    14901612   !------------------------------------------------------------------- 
    14911613   !> @brief This function check if variable and mpp structure use same 
    14921614   !> dimension. 
    1493    ! 
     1615   !> 
    14941616   !> @author J.Paul 
    14951617   !> @date November, 2013 - Initial Version 
    1496    ! 
     1618   !> 
    14971619   !> @param[in] td_mpp    mpp structure 
    14981620   !> @param[in] td_proc   processor structure 
    14991621   !> @return dimension of processor and mpp structure agree (or not) 
    15001622   !------------------------------------------------------------------- 
    1501    LOGICAL FUNCTION mpp__check_proc_dim(td_mpp, td_proc) 
     1623 
    15021624      IMPLICIT NONE 
     1625 
    15031626      ! Argument       
    15041627      TYPE(TMPP),  INTENT(IN) :: td_mpp 
    15051628      TYPE(TFILE), INTENT(IN) :: td_proc 
    15061629 
     1630      !function 
     1631      LOGICAL                 :: lf_check 
     1632 
    15071633      ! local variable 
    15081634      INTEGER(i4) :: il_isize !< i-direction maximum sub domain size  
    15091635      INTEGER(i4) :: il_jsize !< j-direction maximum sub domain size 
    1510  
    15111636      !---------------------------------------------------------------- 
    1512       mpp__check_proc_dim=.TRUE. 
     1637 
     1638      lf_check=.TRUE. 
    15131639      ! check used dimension  
    15141640      IF( td_mpp%i_niproc /= 0 .AND. td_mpp%i_njproc /= 0 )THEN 
    15151641         ! check with maximum size of sub domain 
    15161642         il_isize = ( td_mpp%t_dim(1)%i_len - 2*td_mpp%i_preci + & 
    1517          &           (td_mpp%i_niproc-1) ) / td_mpp%i_niproc + 2*td_mpp%i_preci 
     1643            &        (td_mpp%i_niproc-1) ) / td_mpp%i_niproc + 2*td_mpp%i_preci 
    15181644         il_jsize = ( td_mpp%t_dim(2)%i_len - 2*td_mpp%i_precj + & 
    1519          &           (td_mpp%i_njproc-1) ) / td_mpp%i_njproc + 2*td_mpp%i_precj 
     1645            &        (td_mpp%i_njproc-1) ) / td_mpp%i_njproc + 2*td_mpp%i_precj 
    15201646 
    15211647         IF( il_isize < td_proc%i_lci .OR.                     & 
    1522          &   il_jsize < td_proc%i_lcj )THEN 
    1523  
    1524             mpp__check_proc_dim=.FALSE. 
     1648            &il_jsize < td_proc%i_lcj )THEN 
     1649 
     1650            lf_check=.FALSE. 
    15251651 
    15261652            CALL logger_error( "MPP CHECK DIM: processor and mpp dimension differ" ) 
     
    15311657         ! check with global domain size 
    15321658         IF( td_mpp%t_dim(1)%i_len < td_proc%i_lci .OR.                     & 
    1533          &   td_mpp%t_dim(2)%i_len < td_proc%i_lcj )THEN 
    1534  
    1535             mpp__check_proc_dim=.FALSE. 
     1659            &td_mpp%t_dim(2)%i_len < td_proc%i_lcj )THEN 
     1660 
     1661            lf_check=.FALSE. 
    15361662 
    15371663            CALL logger_error( "MPP CHECK DIM: processor and mpp dimension differ" ) 
     
    15411667 
    15421668   END FUNCTION mpp__check_proc_dim 
     1669   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     1670   SUBROUTINE mpp_add_var(td_mpp, td_var) 
    15431671   !------------------------------------------------------------------- 
    15441672   !> @brief 
     
    15471675   !> @author J.Paul 
    15481676   !> @date November, 2013 - Initial version 
    1549    ! 
     1677   !> @date January, 2019 
     1678   !> - do not split variable on domain decomposition, if only one procesor  
     1679   !> 
    15501680   !> @param[inout] td_mpp mpp strcuture 
    15511681   !> @param[in]    td_var variable strcuture 
    15521682   !------------------------------------------------------------------- 
    1553    SUBROUTINE mpp_add_var( td_mpp, td_var ) 
     1683 
    15541684      IMPLICIT NONE 
     1685 
    15551686      ! Argument 
    15561687      TYPE(TMPP), INTENT(INOUT) :: td_mpp 
     
    15641695      INTEGER(i4) :: ji 
    15651696      !---------------------------------------------------------------- 
     1697 
    15661698      ! check if mpp exist 
    15671699      IF( .NOT. ASSOCIATED(td_mpp%t_proc) )THEN 
     
    15961728 
    15971729            ELSE 
    1598              
     1730  
    15991731               CALL logger_info( & 
    16001732               &  " MPP ADD VAR: add variable "//TRIM(td_var%c_name)//& 
     
    16031735               ! check used dimension  
    16041736               IF( mpp__check_dim(td_mpp, td_var) )THEN 
    1605           
     1737  
    16061738                  ! check variable dimension expected 
    16071739                  CALL var_check_dim(td_var) 
     
    16161748 
    16171749                  ! add variable in each processor 
    1618                   DO ji=1,td_mpp%i_nproc 
    1619  
    1620                      ! split variable on domain decomposition 
    1621                      tl_var=mpp__split_var(td_mpp, td_var, ji) 
    1622  
    1623                      CALL file_add_var(td_mpp%t_proc(ji), tl_var) 
    1624  
    1625                      ! clean 
    1626                      CALL var_clean(tl_var) 
    1627                   ENDDO 
     1750                  IF( td_mpp%i_nproc == 1 )THEN 
     1751                     CALL file_add_var(td_mpp%t_proc(1), td_var) 
     1752                  ELSE 
     1753                     DO ji=1,td_mpp%i_nproc 
     1754                        ! split variable on domain decomposition 
     1755                        tl_var=mpp__split_var(td_mpp, td_var, ji) 
     1756 
     1757                        CALL file_add_var(td_mpp%t_proc(ji), tl_var) 
     1758 
     1759                        ! clean 
     1760                        CALL var_clean(tl_var) 
     1761                     ENDDO 
     1762                  ENDIF 
    16281763 
    16291764               ENDIF 
     
    16331768 
    16341769   END SUBROUTINE mpp_add_var 
     1770   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     1771   FUNCTION mpp__split_var(td_mpp, td_var, id_procid) & 
     1772         & RESULT(tf_var) 
    16351773   !------------------------------------------------------------------- 
    16361774   !> @brief This function extract, from variable structure, part that will  
    16371775   !> be written in processor id_procid.<br/> 
    1638    ! 
     1776   !> 
    16391777   !> @author J.Paul 
    16401778   !> @date November, 2013 - Initial Version 
    1641    ! 
     1779   !> 
    16421780   !> @param[in] td_mpp    mpp structure 
    16431781   !> @param[in] td_var    variable structure 
     
    16451783   !> @return variable structure 
    16461784   !------------------------------------------------------------------- 
    1647    TYPE(TVAR) FUNCTION mpp__split_var(td_mpp, td_var, id_procid) 
     1785 
    16481786      IMPLICIT NONE 
     1787 
    16491788      ! Argument 
    16501789      TYPE(TMPP),  INTENT(IN) :: td_mpp 
     
    16521791      INTEGER(i4), INTENT(IN) :: id_procid 
    16531792 
     1793      ! function 
     1794      TYPE(TVAR)              :: tf_var 
     1795    
    16541796      ! local variable 
    16551797      TYPE(TDIM)  :: tl_dim 
     
    16641806 
    16651807      ! copy mpp 
    1666       mpp__split_var=var_copy(td_var) 
     1808      tf_var=var_copy(td_var, ld_value=.FALSE.) 
     1809 
     1810      ! get processor indices 
     1811      il_ind(:)=mpp_get_proc_index( td_mpp, id_procid ) 
     1812      il_i1 = il_ind(1) 
     1813      il_i2 = il_ind(2) 
     1814      il_j1 = il_ind(3) 
     1815      il_j2 = il_ind(4) 
     1816 
     1817      IF( .NOT. td_var%t_dim(1)%l_use )THEN 
     1818         il_i1=1  
     1819         il_i2=1  
     1820      ENDIF 
     1821 
     1822      IF( .NOT. td_var%t_dim(2)%l_use )THEN 
     1823         il_j1=1  
     1824         il_j2=1  
     1825      ENDIF       
    16671826 
    16681827      IF( ASSOCIATED(td_var%d_value) )THEN 
    16691828         ! remove value over global domain from pointer 
    1670          CALL var_del_value( mpp__split_var ) 
     1829         !CALL var_del_value( tf_var ) 
    16711830 
    16721831         ! get processor dimension 
     
    16761835         IF( td_var%t_dim(1)%l_use )THEN 
    16771836            tl_dim=dim_init( TRIM(td_var%t_dim(1)%c_name), il_size(1) ) 
    1678             CALL var_move_dim( mpp__split_var, tl_dim ) 
     1837            CALL var_move_dim( tf_var, tl_dim ) 
    16791838         ENDIF 
    16801839         IF( td_var%t_dim(2)%l_use )THEN 
    16811840            tl_dim=dim_init( TRIM(td_var%t_dim(2)%c_name), il_size(2) ) 
    1682             CALL var_move_dim( mpp__split_var, tl_dim )       
     1841            CALL var_move_dim( tf_var, tl_dim )       
    16831842         ENDIF 
    16841843 
    1685          ! get processor indices 
    1686          il_ind(:)=mpp_get_proc_index( td_mpp, id_procid ) 
    1687          il_i1 = il_ind(1) 
    1688          il_i2 = il_ind(2) 
    1689          il_j1 = il_ind(3) 
    1690          il_j2 = il_ind(4) 
    1691  
    1692          IF( .NOT. td_var%t_dim(1)%l_use )THEN 
    1693             il_i1=1  
    1694             il_i2=1  
    1695          ENDIF 
    1696  
    1697          IF( .NOT. td_var%t_dim(2)%l_use )THEN 
    1698             il_j1=1  
    1699             il_j2=1  
    1700          ENDIF       
    1701  
    17021844         ! add variable value on processor 
    1703          CALL var_add_value( mpp__split_var, & 
    1704          &                   td_var%d_value(il_i1:il_i2, il_j1:il_j2, :, :) ) 
     1845         CALL var_add_value( tf_var, & 
     1846            &                td_var%d_value(il_i1:il_i2, il_j1:il_j2, :, :) ) 
     1847    
     1848      ELSE 
     1849 
     1850         tf_var%t_dim(jp_I)%i_len=il_i2-il_i1+1 
     1851         tf_var%t_dim(jp_J)%i_len=il_j2-il_j1+1 
     1852 
    17051853      ENDIF 
    17061854 
    17071855   END FUNCTION mpp__split_var 
     1856   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     1857   SUBROUTINE mpp__del_var_mpp(td_mpp) 
    17081858   !------------------------------------------------------------------- 
    17091859   !> @brief  
     
    17151865   !> @param[inout] td_mpp mpp strcuture 
    17161866   !------------------------------------------------------------------- 
    1717    SUBROUTINE mpp__del_var_mpp( td_mpp ) 
     1867       
    17181868      IMPLICIT NONE 
     1869 
    17191870      ! Argument 
    17201871      TYPE(TMPP), INTENT(INOUT) :: td_mpp 
     
    17361887 
    17371888   END SUBROUTINE mpp__del_var_mpp 
     1889   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     1890   SUBROUTINE mpp__del_var_str(td_mpp, td_var) 
    17381891   !------------------------------------------------------------------- 
    17391892   !> @brief 
     
    17431896   !> @author J.Paul 
    17441897   !> @date November, 2013 - Initial version 
    1745    ! 
     1898   !> 
    17461899   !> @param[inout] td_mpp mpp strcuture 
    17471900   !> @param[in]    td_var variable strcuture 
    17481901   !------------------------------------------------------------------- 
    1749    SUBROUTINE mpp__del_var_str( td_mpp, td_var ) 
     1902       
    17501903      IMPLICIT NONE 
     1904 
    17511905      ! Argument 
    17521906      TYPE(TMPP), INTENT(INOUT) :: td_mpp 
     
    17601914      INTEGER(i4) :: ji 
    17611915      !---------------------------------------------------------------- 
     1916 
    17621917      ! check if mpp exist 
    17631918      IF( .NOT. ASSOCIATED(td_mpp%t_proc) )THEN 
     
    17941949 
    17951950         ENDIF 
    1796  
    1797       ENDIF 
     1951      ENDIF 
     1952 
    17981953   END SUBROUTINE mpp__del_var_str 
     1954   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     1955   SUBROUTINE mpp__del_var_name(td_mpp, cd_name) 
    17991956   !------------------------------------------------------------------- 
    18001957   !> @brief 
     
    18051962   !> @date February, 2015  
    18061963   !> - define local variable structure to avoid mistake with pointer 
    1807    ! 
     1964   !> @date January, 2019 
     1965   !> - clean variable strcuture 
     1966   !> 
    18081967   !> @param[inout] td_mpp    mpp strcuture 
    18091968   !> @param[in]    cd_name   variable name 
    18101969   !------------------------------------------------------------------- 
    1811    SUBROUTINE mpp__del_var_name( td_mpp, cd_name ) 
     1970       
    18121971      IMPLICIT NONE 
     1972 
    18131973      ! Argument 
    18141974      TYPE(TMPP)      , INTENT(INOUT) :: td_mpp 
     
    18191979      TYPE(TVAR)        :: tl_var 
    18201980      !---------------------------------------------------------------- 
     1981 
    18211982      ! check if mpp exist 
    18221983      IF( .NOT. ASSOCIATED(td_mpp%t_proc) )THEN 
     
    18502011               tl_var=var_copy(td_mpp%t_proc(1)%t_var(il_varid)) 
    18512012               CALL mpp_del_var(td_mpp, tl_var) 
    1852  
     2013               ! clean 
     2014               CALL var_clean(tl_var) 
    18532015            ENDIF 
    18542016         ENDIF 
    1855  
    1856       ENDIF 
     2017      ENDIF 
     2018 
    18572019   END SUBROUTINE mpp__del_var_name 
     2020   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     2021   SUBROUTINE mpp_move_var(td_mpp, td_var) 
    18582022   !------------------------------------------------------------------- 
    18592023   !> @brief 
     
    18622026   !> @author J.Paul 
    18632027   !> @date November, 2013 - Initial version 
    1864    ! 
     2028   !> 
    18652029   !> @param[inout] td_mpp mpp strcuture 
    18662030   !> @param[in]    td_var variable structure 
    18672031   !------------------------------------------------------------------- 
    1868    SUBROUTINE mpp_move_var( td_mpp, td_var ) 
     2032 
    18692033      IMPLICIT NONE 
     2034 
    18702035      ! Argument 
    18712036      TYPE(TMPP), INTENT(INOUT) :: td_mpp 
     
    18752040      TYPE(TVAR) :: tl_var 
    18762041      !---------------------------------------------------------------- 
     2042 
    18772043      ! copy variablie 
    18782044      tl_var=var_copy(td_var) 
     
    18882054 
    18892055   END SUBROUTINE mpp_move_var 
    1890    !> @endcode 
     2056   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     2057   SUBROUTINE mpp__add_proc_unit(td_mpp, td_proc) 
    18912058   !------------------------------------------------------------------- 
    18922059   !> @brief 
     
    18952062   !> @author J.Paul 
    18962063   !> @date November, 2013 - Initial version 
     2064   !> @date January, 2019 
     2065   !> - deallocate file structure whatever happens  
    18972066   ! 
    18982067   !> @param[inout] td_mpp    mpp strcuture 
    18992068   !> @param[in]    td_proc   processor strcuture 
    1900    ! 
    1901    !> @todo  
    1902    !> - check proc type 
    1903    !------------------------------------------------------------------- 
    1904    SUBROUTINE mpp__add_proc_unit( td_mpp, td_proc ) 
     2069   !------------------------------------------------------------------- 
     2070 
    19052071      IMPLICIT NONE 
     2072 
    19062073      ! Argument 
    19072074      TYPE(TMPP) , INTENT(INOUT) :: td_mpp 
     
    19172084      CHARACTER(LEN=lc)                            :: cl_name 
    19182085      !---------------------------------------------------------------- 
    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) 
    19272086 
    19282087      ! check file name 
     
    19882147               ! clean 
    19892148               CALL file_clean(tl_proc(:)) 
    1990                DEALLOCATE(tl_proc) 
    1991             ENDIF 
     2149            ENDIF 
     2150            DEALLOCATE(tl_proc) 
    19922151 
    19932152         ELSE 
     2153             
    19942154            ! no processor in mpp structure 
    19952155            IF( ASSOCIATED(td_mpp%t_proc) )THEN 
     
    20262186 
    20272187   END SUBROUTINE mpp__add_proc_unit 
     2188   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     2189   SUBROUTINE mpp__add_proc_arr(td_mpp, td_proc) 
     2190   !------------------------------------------------------------------- 
     2191   !> @brief 
     2192   !>    This subroutine add array of processor to mpp structure. 
     2193   !>    @note mpp structure should be empty 
     2194   !> 
     2195   !> @author J.Paul 
     2196   !> @date August, 2017 - Initial version 
     2197   !> 
     2198   !> @param[inout] td_mpp    mpp strcuture 
     2199   !> @param[in]    td_proc   array of processor strcuture 
     2200   !------------------------------------------------------------------- 
     2201 
     2202      IMPLICIT NONE 
     2203 
     2204      ! Argument 
     2205      TYPE(TMPP)               , INTENT(INOUT) :: td_mpp 
     2206      TYPE(TFILE), DIMENSION(:), INTENT(IN   ) :: td_proc 
     2207 
     2208      ! local variable 
     2209      INTEGER(i4)                                  :: il_status 
     2210      INTEGER(i4)                                  :: il_nproc 
     2211 
     2212      CHARACTER(LEN=lc)                            :: cl_name 
     2213      !---------------------------------------------------------------- 
     2214 
     2215      ! check file name 
     2216      cl_name=TRIM( file_rename(td_proc(1)%c_name) ) 
     2217      IF( TRIM(cl_name) /=  TRIM(td_mpp%c_name) )THEN 
     2218         CALL logger_warn("MPP ADD PROC: processor name do not match mpp name") 
     2219      ENDIF 
     2220 
     2221      IF( ASSOCIATED(td_mpp%t_proc) )THEN 
     2222            CALL logger_error( & 
     2223            &  "MPP ADD PROC: some processor(s) already in mpp structure " ) 
     2224 
     2225      ELSE 
     2226  
     2227         CALL logger_trace("MPP ADD PROC: add array of processor "//& 
     2228         &                 " in mpp structure") 
     2229 
     2230         il_nproc=SIZE(td_proc) 
     2231         ALLOCATE( td_mpp%t_proc(il_nproc), stat=il_status ) 
     2232         IF(il_status /= 0 )THEN 
     2233            CALL logger_error( "MPP ADD PROC: not enough space to put "//& 
     2234            &  "processor in mpp structure " ) 
     2235         ENDIF 
     2236 
     2237         ! check dimension 
     2238         IF( ANY(td_mpp%t_dim(1:2)%i_len < td_proc(1)%t_dim(1:2)%i_len) )THEN 
     2239            CALL logger_error( "MPP ADD PROC: mpp structure and new processor "//& 
     2240            &  " dimension differ. ") 
     2241            CALL logger_debug("MPP ADD PROC: mpp dimension ("//& 
     2242            &  TRIM(fct_str(td_mpp%t_dim(1)%i_len))//","//& 
     2243            &  TRIM(fct_str(td_mpp%t_dim(2)%i_len))//")" ) 
     2244            CALL logger_debug("MPP ADD PROC: processor dimension ("//& 
     2245            &  TRIM(fct_str(td_proc(1)%t_dim(1)%i_len))//","//& 
     2246            &  TRIM(fct_str(td_proc(1)%t_dim(2)%i_len))//")" ) 
     2247         ELSE 
     2248            td_mpp%i_nproc=il_nproc 
     2249 
     2250            ! add new processor 
     2251            td_mpp%t_proc(:)=file_copy(td_proc(:)) 
     2252         ENDIF 
     2253 
     2254      ENDIF 
     2255 
     2256   END SUBROUTINE mpp__add_proc_arr    
     2257   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     2258   SUBROUTINE mpp__del_proc_id(td_mpp, id_procid) 
    20282259   !------------------------------------------------------------------- 
    20292260   !> @brief 
     
    20322263   !> @author J.Paul 
    20332264   !> @date November, 2013 - Initial version 
     2265   !> @date January, 2019 
     2266   !> - clean file structure 
    20342267   !> 
    20352268   !> @param[inout] td_mpp    mpp strcuture 
    20362269   !> @param[in]    id_procid processor id 
    20372270   !------------------------------------------------------------------- 
    2038    SUBROUTINE mpp__del_proc_id( td_mpp, id_procid ) 
     2271 
    20392272      IMPLICIT NONE 
     2273 
    20402274      ! Argument 
    20412275      TYPE(TMPP),   INTENT(INOUT) :: td_mpp 
     
    21112345         ENDIF 
    21122346      ENDIF 
     2347 
    21132348   END SUBROUTINE mpp__del_proc_id 
     2349   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     2350   SUBROUTINE mpp__del_proc_str(td_mpp, td_proc) 
    21142351   !------------------------------------------------------------------- 
    21152352   !> @brief 
     
    21192356   !> @author J.Paul 
    21202357   !> @date November, 2013 - Initial version 
    2121    ! 
     2358   !> 
    21222359   !> @param[inout] td_mpp : mpp strcuture 
    21232360   !> @param[in]    td_proc : file/processor structure 
    21242361   !------------------------------------------------------------------- 
    2125    SUBROUTINE mpp__del_proc_str( td_mpp, td_proc ) 
     2362 
    21262363      IMPLICIT NONE 
     2364 
    21272365      ! Argument 
    21282366      TYPE(TMPP),   INTENT(INOUT) :: td_mpp 
     
    21372375 
    21382376   END SUBROUTINE mpp__del_proc_str 
     2377   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     2378   SUBROUTINE mpp__move_proc(td_mpp, td_proc) 
    21392379   !------------------------------------------------------------------- 
    21402380   !> @brief 
     
    21422382   !> 
    21432383   !> @detail 
    2144    ! 
     2384   !> 
    21452385   !> @author J.Paul 
    21462386   !> @date Nov, 2013 - Initial version 
    2147    ! 
     2387   !> 
    21482388   !> @param[inout] td_mpp    mpp strcuture 
    21492389   !> @param[in]    id_procid processor id 
    21502390   !------------------------------------------------------------------- 
    2151    SUBROUTINE mpp__move_proc( td_mpp, td_proc ) 
     2391 
    21522392      IMPLICIT NONE 
     2393 
    21532394      ! Argument 
    21542395      TYPE(TMPP),  INTENT(INOUT) :: td_mpp 
     
    21632404 
    21642405   END SUBROUTINE mpp__move_proc 
     2406   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     2407   SUBROUTINE mpp_add_dim(td_mpp, td_dim) 
    21652408   !------------------------------------------------------------------- 
    21662409   !> @brief This subroutine add a dimension structure in a mpp  
     
    21762419   !> @param[in] td_dim    dimension structure 
    21772420   !------------------------------------------------------------------- 
    2178    SUBROUTINE mpp_add_dim(td_mpp, td_dim) 
     2421 
    21792422      IMPLICIT NONE 
     2423 
    21802424      ! Argument       
    21812425      TYPE(TMPP), INTENT(INOUT) :: td_mpp 
     
    21872431      ! loop indices 
    21882432      !---------------------------------------------------------------- 
     2433 
    21892434      IF( td_mpp%i_ndim <= ip_maxdim )THEN 
    21902435 
     
    22232468 
    22242469   END SUBROUTINE mpp_add_dim 
     2470   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     2471   SUBROUTINE mpp_del_dim(td_mpp, td_dim) 
    22252472   !------------------------------------------------------------------- 
    22262473   !> @brief This subroutine delete a dimension structure in a mpp  
     
    22352482   !> @param[in] td_dim    dimension structure 
    22362483   !------------------------------------------------------------------- 
    2237    SUBROUTINE mpp_del_dim(td_mpp, td_dim) 
     2484 
    22382485      IMPLICIT NONE 
     2486 
    22392487      ! Argument       
    22402488      TYPE(TMPP), INTENT(INOUT) :: td_mpp 
     
    22472495      ! loop indices 
    22482496      !---------------------------------------------------------------- 
    2249  
    22502497 
    22512498      IF( td_mpp%i_ndim <= ip_maxdim )THEN 
     
    22752522 
    22762523   END SUBROUTINE mpp_del_dim 
     2524   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     2525   SUBROUTINE mpp_move_dim(td_mpp, td_dim) 
    22772526   !------------------------------------------------------------------- 
    22782527   !> @brief This subroutine move a dimension structure  
     
    22862535   !> @param[in] td_dim    dimension structure 
    22872536   !------------------------------------------------------------------- 
    2288    SUBROUTINE mpp_move_dim(td_mpp, td_dim) 
     2537 
    22892538      IMPLICIT NONE 
     2539 
    22902540      ! Argument       
    22912541      TYPE(TMPP), INTENT(INOUT) :: td_mpp 
     
    22962546      INTEGER(i4) :: il_dimid 
    22972547      !---------------------------------------------------------------- 
     2548 
    22982549      IF( td_mpp%i_ndim <= ip_maxdim )THEN 
    22992550 
     
    23172568         &  TRIM(td_mpp%c_name)//" ("//TRIM(fct_str(td_mpp%i_ndim))//")") 
    23182569      ENDIF 
     2570 
    23192571   END SUBROUTINE mpp_move_dim 
     2572   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     2573   SUBROUTINE mpp_add_att(td_mpp, td_att) 
    23202574   !------------------------------------------------------------------- 
    23212575   !> @brief 
     
    23282582   !> @param[in]    td_att attribute strcuture 
    23292583   !------------------------------------------------------------------- 
    2330    SUBROUTINE mpp_add_att( td_mpp, td_att ) 
     2584 
    23312585      IMPLICIT NONE 
     2586 
    23322587      ! Argument 
    23332588      TYPE(TMPP), INTENT(INOUT) :: td_mpp 
     
    23402595      INTEGER(i4) :: ji 
    23412596      !---------------------------------------------------------------- 
     2597 
    23422598      ! check if mpp exist 
    23432599      IF( .NOT. ASSOCIATED(td_mpp%t_proc) )THEN 
     
    23862642 
    23872643   END SUBROUTINE mpp_add_att 
     2644   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     2645   SUBROUTINE mpp__del_att_str(td_mpp, td_att) 
    23882646   !------------------------------------------------------------------- 
    23892647   !> @brief 
     
    23972655   !> @param[in]    td_att attribute strcuture 
    23982656   !------------------------------------------------------------------- 
    2399    SUBROUTINE mpp__del_att_str( td_mpp, td_att ) 
     2657 
    24002658      IMPLICIT NONE 
     2659 
    24012660      ! Argument 
    24022661      TYPE(TMPP), INTENT(INOUT) :: td_mpp 
     
    24102669      INTEGER(i4) :: ji 
    24112670      !---------------------------------------------------------------- 
     2671 
    24122672      ! check if mpp exist 
    24132673      IF( .NOT. ASSOCIATED(td_mpp%t_proc) )THEN 
     
    24462706 
    24472707         ENDIF 
    2448  
    2449       ENDIF 
     2708      ENDIF 
     2709 
    24502710   END SUBROUTINE mpp__del_att_str 
     2711   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     2712   SUBROUTINE mpp__del_att_name(td_mpp, cd_name) 
    24512713   !------------------------------------------------------------------- 
    24522714   !> @brief 
     
    24542716   !> 
    24552717   !> @detail 
    2456    ! 
     2718   !> 
    24572719   !> @author J.Paul 
    24582720   !> @date November, 2013 - Initial version 
    24592721   !> @date February, 2015  
    24602722   !> - define local attribute structure to avoid mistake with pointer 
    2461    ! 
     2723   !> @date January, 2019 
     2724   !> - clean attributes structure 
     2725   !> 
    24622726   !> @param[inout] td_mpp    mpp strcuture 
    24632727   !> @param[in]    cd_name   attribute name 
    24642728   !------------------------------------------------------------------- 
    2465    SUBROUTINE mpp__del_att_name( td_mpp, cd_name ) 
     2729 
    24662730      IMPLICIT NONE 
     2731 
    24672732      ! Argument 
    24682733      TYPE(TMPP)       , INTENT(INOUT) :: td_mpp 
     
    24732738      TYPE(TATT)  :: tl_att 
    24742739      !---------------------------------------------------------------- 
     2740 
    24752741      ! check if mpp exist 
    24762742      IF( .NOT. ASSOCIATED(td_mpp%t_proc) )THEN 
     
    25042770               tl_att=att_copy(td_mpp%t_proc(1)%t_att(il_attid)) 
    25052771               CALL mpp_del_att(td_mpp, tl_att)  
    2506  
     2772               ! clean 
     2773               CALL att_clean(tl_att) 
    25072774            ENDIF 
    25082775         ENDIF 
    2509  
    2510       ENDIF 
     2776      ENDIF 
     2777 
    25112778   END SUBROUTINE mpp__del_att_name 
     2779   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     2780   SUBROUTINE mpp_move_att(td_mpp, td_att) 
    25122781   !------------------------------------------------------------------- 
    25132782   !> @brief 
     
    25162785   !> @author J.Paul 
    25172786   !> @date November, 2013 - Initial version 
    2518    ! 
     2787   !> 
    25192788   !> @param[inout] td_mpp mpp strcuture 
    25202789   !> @param[in]    td_att attribute structure 
    25212790   !------------------------------------------------------------------- 
    2522    SUBROUTINE mpp_move_att( td_mpp, td_att ) 
     2791 
    25232792      IMPLICIT NONE 
     2793 
    25242794      ! Argument 
    25252795      TYPE(TMPP), INTENT(INOUT) :: td_mpp 
     
    25292799      TYPE(TATT)  :: tl_att 
    25302800      !---------------------------------------------------------------- 
     2801 
    25312802      ! copy variable 
    25322803      tl_att=att_copy(td_att) 
     
    25422813 
    25432814   END SUBROUTINE mpp_move_att 
     2815   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     2816   FUNCTION layout__init(td_mpp, id_mask, id_niproc, id_njproc) & 
     2817         & RESULT(tf_lay) 
    25442818   !------------------------------------------------------------------- 
    25452819   !> @brief 
     
    25472821   !>  
    25482822   !> @detail 
    2549    !> Domain layout is first compute, with domain dimension, overlap between subdomain, 
     2823   !> Domain layout is first computed, with domain dimension, overlap between subdomain, 
    25502824   !> and the number of processors following I and J. 
    25512825   !> Then the number of sea/land processors is compute with mask 
     
    25542828   !> @date October, 2015 - Initial version 
    25552829   !> @date October, 2016 
    2556    !> - compare index to td_lay number of proc instead of td_mpp (bug fix) 
     2830   !> - compare index to tf_lay number of proc instead of td_mpp (bug fix) 
    25572831   !> 
    25582832   !> @param[in] td_mpp mpp strcuture 
     
    25622836   !> @return domain layout structure 
    25632837   !------------------------------------------------------------------- 
    2564    FUNCTION layout__init( td_mpp, id_mask, id_niproc, id_njproc ) RESULT(td_lay) 
     2838 
    25652839      IMPLICIT NONE 
     2840 
    25662841      ! Argument 
    25672842      TYPE(TMPP)                 , INTENT(IN) :: td_mpp 
     
    25712846 
    25722847      ! function 
    2573       TYPE(TLAY) :: td_lay 
     2848      TYPE(TLAY)                              :: tf_lay 
    25742849 
    25752850      ! local variable 
     
    25932868 
    25942869      ! intialise 
    2595       td_lay%i_niproc=id_niproc 
    2596       td_lay%i_njproc=id_njproc 
     2870      tf_lay%i_niproc=id_niproc 
     2871      tf_lay%i_njproc=id_njproc 
    25972872 
    25982873      CALL logger_info( "MPP COMPUTE LAYOUT: compute domain layout with "//& 
    2599       &               TRIM(fct_str(td_lay%i_niproc))//" x "//& 
    2600       &               TRIM(fct_str(td_lay%i_njproc))//" processors") 
     2874         &              TRIM(fct_str(tf_lay%i_niproc))//" x "//& 
     2875         &              TRIM(fct_str(tf_lay%i_njproc))//" processors") 
    26012876 
    26022877      ! maximum size of sub domain 
    2603       il_isize = ((td_mpp%t_dim(1)%i_len - 2*td_mpp%i_preci + (td_lay%i_niproc-1))/ & 
    2604       &           td_lay%i_niproc) + 2*td_mpp%i_preci 
    2605       il_jsize = ((td_mpp%t_dim(2)%i_len - 2*td_mpp%i_precj + (td_lay%i_njproc-1))/ & 
    2606       &           td_lay%i_njproc) + 2*td_mpp%i_precj 
    2607  
    2608       il_resti = MOD(td_mpp%t_dim(1)%i_len - 2*td_mpp%i_preci, td_lay%i_niproc) 
    2609       il_restj = MOD(td_mpp%t_dim(2)%i_len - 2*td_mpp%i_precj, td_lay%i_njproc) 
    2610       IF( il_resti == 0 ) il_resti = td_lay%i_niproc 
    2611       IF( il_restj == 0 ) il_restj = td_lay%i_njproc 
     2878      il_isize = ((td_mpp%t_dim(1)%i_len - 2*td_mpp%i_preci + (tf_lay%i_niproc-1))/ & 
     2879         &         tf_lay%i_niproc) + 2*td_mpp%i_preci 
     2880      il_jsize = ((td_mpp%t_dim(2)%i_len - 2*td_mpp%i_precj + (tf_lay%i_njproc-1))/ & 
     2881         &         tf_lay%i_njproc) + 2*td_mpp%i_precj 
     2882 
     2883      il_resti = MOD(td_mpp%t_dim(1)%i_len - 2*td_mpp%i_preci, tf_lay%i_niproc) 
     2884      il_restj = MOD(td_mpp%t_dim(2)%i_len - 2*td_mpp%i_precj, tf_lay%i_njproc) 
     2885      IF( il_resti == 0 ) il_resti = tf_lay%i_niproc 
     2886      IF( il_restj == 0 ) il_restj = tf_lay%i_njproc 
    26122887 
    26132888      ! compute dimension of each sub domain 
    2614       ALLOCATE( td_lay%i_lci(td_lay%i_niproc,td_lay%i_njproc) ) 
    2615       ALLOCATE( td_lay%i_lcj(td_lay%i_niproc,td_lay%i_njproc) ) 
    2616  
    2617       td_lay%i_lci( 1          : il_resti       , : ) = il_isize 
    2618       td_lay%i_lci( il_resti+1 : td_lay%i_niproc, : ) = il_isize-1 
    2619  
    2620       td_lay%i_lcj( : , 1          : il_restj       ) = il_jsize 
    2621       td_lay%i_lcj( : , il_restj+1 : td_lay%i_njproc) = il_jsize-1 
     2889      ALLOCATE( tf_lay%i_lci(tf_lay%i_niproc,tf_lay%i_njproc) ) 
     2890      ALLOCATE( tf_lay%i_lcj(tf_lay%i_niproc,tf_lay%i_njproc) ) 
     2891 
     2892      tf_lay%i_lci( 1          : il_resti       , : ) = il_isize 
     2893      tf_lay%i_lci( il_resti+1 : tf_lay%i_niproc, : ) = il_isize-1 
     2894 
     2895      tf_lay%i_lcj( : , 1          : il_restj       ) = il_jsize 
     2896      tf_lay%i_lcj( : , il_restj+1 : tf_lay%i_njproc) = il_jsize-1 
    26222897 
    26232898      ! compute first index of each sub domain 
    2624       ALLOCATE( td_lay%i_impp(td_lay%i_niproc,td_lay%i_njproc) ) 
    2625       ALLOCATE( td_lay%i_jmpp(td_lay%i_niproc,td_lay%i_njproc) ) 
    2626  
    2627       td_lay%i_impp(:,:)=1 
    2628       td_lay%i_jmpp(:,:)=1 
    2629  
    2630       IF( td_lay%i_niproc > 1 )THEN 
    2631          DO jj=1,td_lay%i_njproc 
    2632             DO ji=2,td_lay%i_niproc 
    2633                td_lay%i_impp(ji,jj) = td_lay%i_impp(ji-1,jj) + & 
    2634                &                       td_lay%i_lci (ji-1,jj) - 2*td_mpp%i_preci 
     2899      ALLOCATE( tf_lay%i_impp(tf_lay%i_niproc,tf_lay%i_njproc) ) 
     2900      ALLOCATE( tf_lay%i_jmpp(tf_lay%i_niproc,tf_lay%i_njproc) ) 
     2901 
     2902      tf_lay%i_impp(:,:)=1 
     2903      tf_lay%i_jmpp(:,:)=1 
     2904 
     2905      IF( tf_lay%i_niproc > 1 )THEN 
     2906         DO jj=1,tf_lay%i_njproc 
     2907            DO ji=2,tf_lay%i_niproc 
     2908               tf_lay%i_impp(ji,jj) = tf_lay%i_impp(ji-1,jj) + & 
     2909                  &                   tf_lay%i_lci (ji-1,jj) - 2*td_mpp%i_preci 
    26352910            ENDDO 
    26362911         ENDDO 
    26372912      ENDIF 
    26382913 
    2639       IF( td_lay%i_njproc > 1 )THEN 
    2640          DO jj=2,td_lay%i_njproc 
    2641             DO ji=1,td_lay%i_niproc 
    2642                td_lay%i_jmpp(ji,jj) = td_lay%i_jmpp(ji,jj-1) + & 
    2643                &                       td_lay%i_lcj (ji,jj-1) - 2*td_mpp%i_precj 
     2914      IF( tf_lay%i_njproc > 1 )THEN 
     2915         DO jj=2,tf_lay%i_njproc 
     2916            DO ji=1,tf_lay%i_niproc 
     2917               tf_lay%i_jmpp(ji,jj) = tf_lay%i_jmpp(ji,jj-1) + & 
     2918                  &                   tf_lay%i_lcj (ji,jj-1) - 2*td_mpp%i_precj 
    26442919            ENDDO 
    26452920         ENDDO  
    26462921      ENDIF 
    26472922 
    2648       ALLOCATE(td_lay%i_msk(td_lay%i_niproc,td_lay%i_njproc)) 
    2649       td_lay%i_msk(:,:)=0 
     2923      ALLOCATE( tf_lay%i_msk(tf_lay%i_niproc,tf_lay%i_njproc) ) 
     2924      tf_lay%i_msk(:,:)=0 
    26502925      ! init number of sea/land proc 
    2651       td_lay%i_nsea=0 
    2652       td_lay%i_nland=td_lay%i_njproc*td_lay%i_niproc 
     2926      tf_lay%i_nsea=0 
     2927      tf_lay%i_nland=tf_lay%i_njproc*tf_lay%i_niproc 
    26532928 
    26542929      ! check if processor is land or sea 
    2655       DO jj = 1,td_lay%i_njproc 
    2656          DO ji = 1,td_lay%i_niproc 
     2930      DO jj = 1,tf_lay%i_njproc 
     2931         DO ji = 1,tf_lay%i_niproc 
    26572932 
    26582933            ! compute first and last indoor indices 
     
    26722947 
    26732948            ! east boundary 
    2674             IF( ji == td_lay%i_niproc )THEN 
    2675                il_lei = td_lay%i_lci(ji,jj) 
     2949            IF( ji == tf_lay%i_niproc )THEN 
     2950               il_lei = tf_lay%i_lci(ji,jj) 
    26762951            ELSE 
    2677                il_lei = td_lay%i_lci(ji,jj) - td_mpp%i_preci 
     2952               il_lei = tf_lay%i_lci(ji,jj) - td_mpp%i_preci 
    26782953            ENDIF 
    26792954 
    26802955            ! north boundary 
    2681             IF( jj == td_lay%i_njproc )THEN 
    2682                il_lej = td_lay%i_lcj(ji,jj) 
     2956            IF( jj == tf_lay%i_njproc )THEN 
     2957               il_lej = tf_lay%i_lcj(ji,jj) 
    26832958            ELSE 
    2684                il_lej = td_lay%i_lcj(ji,jj) - td_mpp%i_precj 
    2685             ENDIF 
    2686  
    2687             ii1=td_lay%i_impp(ji,jj) + il_ldi - 1 
    2688             ii2=td_lay%i_impp(ji,jj) + il_lei - 1 
    2689  
    2690             ij1=td_lay%i_jmpp(ji,jj) + il_ldj - 1 
    2691             ij2=td_lay%i_jmpp(ji,jj) + il_lej - 1 
    2692  
    2693             td_lay%i_msk(ji,jj)=SUM( id_mask(ii1:ii2,ij1:ij2) ) 
    2694             IF( td_lay%i_msk(ji,jj) > 0 )THEN ! sea 
    2695                td_lay%i_nsea =td_lay%i_nsea +1 
    2696                td_lay%i_nland=td_lay%i_nland-1 
     2959               il_lej = tf_lay%i_lcj(ji,jj) - td_mpp%i_precj 
     2960            ENDIF 
     2961 
     2962            ii1=tf_lay%i_impp(ji,jj) + il_ldi - 1 
     2963            ii2=tf_lay%i_impp(ji,jj) + il_lei - 1 
     2964 
     2965            ij1=tf_lay%i_jmpp(ji,jj) + il_ldj - 1 
     2966            ij2=tf_lay%i_jmpp(ji,jj) + il_lej - 1 
     2967 
     2968            tf_lay%i_msk(ji,jj)=SUM( id_mask(ii1:ii2,ij1:ij2) ) 
     2969            IF( tf_lay%i_msk(ji,jj) > 0 )THEN ! sea 
     2970               tf_lay%i_nsea =tf_lay%i_nsea +1 
     2971               tf_lay%i_nland=tf_lay%i_nland-1 
    26972972            ENDIF 
    26982973 
     
    27002975      ENDDO 
    27012976 
    2702       CALL logger_info( "MPP COMPUTE LAYOUT: sea proc "//TRIM(fct_str(td_lay%i_nsea))) 
    2703       CALL logger_info( "MPP COMPUTE LAYOUT: land proc "//TRIM(fct_str(td_lay%i_nland))) 
    2704       CALL logger_info( "MPP COMPUTE LAYOUT: sum "//TRIM(fct_str( SUM(td_lay%i_msk(:,:))))) 
    2705  
    2706       td_lay%i_mean= SUM(td_lay%i_msk(:,:)) / td_lay%i_nsea 
    2707       td_lay%i_min = MINVAL(td_lay%i_msk(:,:),td_lay%i_msk(:,:)/=0) 
    2708       td_lay%i_max = MAXVAL(td_lay%i_msk(:,:)) 
     2977      CALL logger_info( "MPP COMPUTE LAYOUT: sea proc "//TRIM(fct_str(tf_lay%i_nsea))) 
     2978      CALL logger_info( "MPP COMPUTE LAYOUT: land proc "//TRIM(fct_str(tf_lay%i_nland))) 
     2979      CALL logger_info( "MPP COMPUTE LAYOUT: sum "//TRIM(fct_str( SUM(tf_lay%i_msk(:,:))))) 
     2980 
     2981      tf_lay%i_mean= SUM(tf_lay%i_msk(:,:)) / tf_lay%i_nsea 
     2982      tf_lay%i_min = MINVAL(tf_lay%i_msk(:,:),tf_lay%i_msk(:,:)/=0) 
     2983      tf_lay%i_max = MAXVAL(tf_lay%i_msk(:,:)) 
    27092984 
    27102985      IF( lm_layout )THEN 
    27112986         ! print info  
    27122987         WRITE(im_iumout,*) ' ' 
    2713          WRITE(im_iumout,*) " jpni=",td_lay%i_niproc ," jpnj=",td_lay%i_njproc 
     2988         WRITE(im_iumout,*) " jpni=",tf_lay%i_niproc ," jpnj=",tf_lay%i_njproc 
    27142989         WRITE(im_iumout,*) " jpi= ",il_isize," jpj= ",il_jsize 
    27152990         WRITE(im_iumout,*) " iresti=",td_mpp%i_preci," irestj=",td_mpp%i_precj 
    27162991 
    27172992 
    2718          WRITE(im_iumout,*) ' nombre de processeurs       ',td_lay%i_niproc*td_lay%i_njproc 
    2719          WRITE(im_iumout,*) ' nombre de processeurs mer   ',td_lay%i_nsea 
    2720          WRITE(im_iumout,*) ' nombre de processeurs terre ',td_lay%i_nland 
    2721          WRITE(im_iumout,*) ' moyenne de recouvrement     ',td_lay%i_mean 
    2722          WRITE(im_iumout,*) ' minimum de recouvrement     ',td_lay%i_min 
    2723          WRITE(im_iumout,*) ' maximum de recouvrement     ',td_lay%i_max 
     2993         WRITE(im_iumout,*) ' nombre de processeurs       ',tf_lay%i_niproc*tf_lay%i_njproc 
     2994         WRITE(im_iumout,*) ' nombre de processeurs mer   ',tf_lay%i_nsea 
     2995         WRITE(im_iumout,*) ' nombre de processeurs terre ',tf_lay%i_nland 
     2996         WRITE(im_iumout,*) ' moyenne de recouvrement     ',tf_lay%i_mean 
     2997         WRITE(im_iumout,*) ' minimum de recouvrement     ',tf_lay%i_min 
     2998         WRITE(im_iumout,*) ' maximum de recouvrement     ',tf_lay%i_max 
    27242999      ENDIF 
    27253000 
    27263001   END FUNCTION layout__init 
     3002   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     3003   SUBROUTINE layout__clean(td_lay) 
    27273004   !------------------------------------------------------------------- 
    27283005   !> @brief  
     
    27313008   !> @author J.Paul 
    27323009   !> @date October, 2015 - Initial version 
     3010   !> @date January, 2019 
     3011   !> - nullify array in layout structure 
    27333012   !> 
    27343013   !> @param[inout] td_lay domain layout strcuture 
    27353014   !------------------------------------------------------------------- 
    2736    SUBROUTINE layout__clean( td_lay ) 
     3015 
    27373016      IMPLICIT NONE 
     3017 
    27383018      ! Argument 
    27393019      TYPE(TLAY),  INTENT(INOUT) :: td_lay 
     
    27423022      IF( ASSOCIATED(td_lay%i_msk) )THEN 
    27433023         DEALLOCATE(td_lay%i_msk) 
     3024         NULLIFY(td_lay%i_msk) 
    27443025      ENDIF 
    27453026      IF( ASSOCIATED(td_lay%i_impp) )THEN 
    27463027         DEALLOCATE(td_lay%i_impp) 
     3028         NULLIFY(td_lay%i_impp) 
    27473029      ENDIF 
    27483030      IF( ASSOCIATED(td_lay%i_jmpp) )THEN 
    27493031         DEALLOCATE(td_lay%i_jmpp) 
     3032         NULLIFY(td_lay%i_jmpp) 
    27503033      ENDIF 
    27513034      IF( ASSOCIATED(td_lay%i_lci) )THEN 
    27523035         DEALLOCATE(td_lay%i_lci) 
     3036         NULLIFY(td_lay%i_lci) 
    27533037      ENDIF 
    27543038      IF( ASSOCIATED(td_lay%i_lcj) )THEN 
    27553039         DEALLOCATE(td_lay%i_lcj) 
     3040         NULLIFY(td_lay%i_lcj) 
    27563041      ENDIF 
    27573042 
     
    27663051 
    27673052   END SUBROUTINE layout__clean 
     3053   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     3054   FUNCTION layout__copy(td_lay) & 
     3055         & RESULT(tf_lay) 
    27683056   !------------------------------------------------------------------- 
    27693057   !> @brief 
     
    27783066   !> @author J.Paul 
    27793067   !> @date October, 2015 - Initial Version 
    2780    ! 
     3068   !> 
    27813069   !> @param[in] td_lay   domain layout structure 
    27823070   !> @return copy of input domain layout structure 
    27833071   !------------------------------------------------------------------- 
    2784    FUNCTION layout__copy( td_lay ) 
     3072 
    27853073      IMPLICIT NONE 
     3074 
    27863075      ! Argument 
    27873076      TYPE(TLAY), INTENT(IN)  :: td_lay 
    27883077      ! function 
    2789       TYPE(TLAY) :: layout__copy 
     3078      TYPE(TLAY) :: tf_lay 
    27903079 
    27913080      ! local variable 
     
    27963085 
    27973086      ! copy scalar  
    2798       layout__copy%i_niproc   = td_lay%i_niproc 
    2799       layout__copy%i_njproc   = td_lay%i_njproc 
    2800       layout__copy%i_nland    = td_lay%i_nland  
    2801       layout__copy%i_nsea     = td_lay%i_nsea   
    2802       layout__copy%i_mean     = td_lay%i_mean   
    2803       layout__copy%i_min      = td_lay%i_min    
    2804       layout__copy%i_max      = td_lay%i_max    
     3087      tf_lay%i_niproc   = td_lay%i_niproc 
     3088      tf_lay%i_njproc   = td_lay%i_njproc 
     3089      tf_lay%i_nland    = td_lay%i_nland  
     3090      tf_lay%i_nsea     = td_lay%i_nsea   
     3091      tf_lay%i_mean     = td_lay%i_mean   
     3092      tf_lay%i_min      = td_lay%i_min    
     3093      tf_lay%i_max      = td_lay%i_max    
    28053094 
    28063095      ! copy pointers 
    2807       IF( ASSOCIATED(layout__copy%i_msk) )THEN 
    2808          DEALLOCATE(layout__copy%i_msk) 
     3096      IF( ASSOCIATED(tf_lay%i_msk) )THEN 
     3097         DEALLOCATE(tf_lay%i_msk) 
    28093098      ENDIF 
    28103099      IF( ASSOCIATED(td_lay%i_msk) )THEN 
    28113100         il_shape(:)=SHAPE(td_lay%i_msk(:,:)) 
    2812          ALLOCATE( layout__copy%i_msk(il_shape(jp_I),il_shape(jp_J)) ) 
    2813          layout__copy%i_msk(:,:)=td_lay%i_msk(:,:) 
    2814       ENDIF 
    2815  
    2816       IF( ASSOCIATED(layout__copy%i_msk) ) DEALLOCATE(layout__copy%i_msk) 
     3101         ALLOCATE( tf_lay%i_msk(il_shape(jp_I),il_shape(jp_J)) ) 
     3102         tf_lay%i_msk(:,:)=td_lay%i_msk(:,:) 
     3103      ENDIF 
     3104 
     3105      IF( ASSOCIATED(tf_lay%i_msk) ) DEALLOCATE(tf_lay%i_msk) 
    28173106      IF( ASSOCIATED(td_lay%i_msk) )THEN 
    28183107         il_shape(:)=SHAPE(td_lay%i_msk(:,:)) 
     
    28203109         il_tmp(:,:)=td_lay%i_msk(:,:) 
    28213110 
    2822          ALLOCATE( layout__copy%i_msk(il_shape(jp_I),il_shape(jp_J)) ) 
    2823          layout__copy%i_msk(:,:)=il_tmp(:,:) 
     3111         ALLOCATE( tf_lay%i_msk(il_shape(jp_I),il_shape(jp_J)) ) 
     3112         tf_lay%i_msk(:,:)=il_tmp(:,:) 
    28243113 
    28253114         DEALLOCATE(il_tmp) 
    28263115      ENDIF 
    28273116 
    2828       IF( ASSOCIATED(layout__copy%i_impp) ) DEALLOCATE(layout__copy%i_impp) 
     3117      IF( ASSOCIATED(tf_lay%i_impp) ) DEALLOCATE(tf_lay%i_impp) 
    28293118      IF( ASSOCIATED(td_lay%i_impp) )THEN 
    28303119         il_shape(:)=SHAPE(td_lay%i_impp(:,:)) 
     
    28323121         il_tmp(:,:)=td_lay%i_impp(:,:) 
    28333122 
    2834          ALLOCATE( layout__copy%i_impp(il_shape(jp_I),il_shape(jp_J)) ) 
    2835          layout__copy%i_impp(:,:)=il_tmp(:,:) 
     3123         ALLOCATE( tf_lay%i_impp(il_shape(jp_I),il_shape(jp_J)) ) 
     3124         tf_lay%i_impp(:,:)=il_tmp(:,:) 
    28363125 
    28373126         DEALLOCATE(il_tmp) 
    28383127      ENDIF 
    28393128 
    2840       IF( ASSOCIATED(layout__copy%i_jmpp) ) DEALLOCATE(layout__copy%i_jmpp) 
     3129      IF( ASSOCIATED(tf_lay%i_jmpp) ) DEALLOCATE(tf_lay%i_jmpp) 
    28413130      IF( ASSOCIATED(td_lay%i_jmpp) )THEN 
    28423131         il_shape(:)=SHAPE(td_lay%i_jmpp(:,:)) 
     
    28443133         il_tmp(:,:)=td_lay%i_jmpp(:,:) 
    28453134 
    2846          ALLOCATE( layout__copy%i_jmpp(il_shape(jp_I),il_shape(jp_J)) ) 
    2847          layout__copy%i_jmpp(:,:)=il_tmp(:,:) 
     3135         ALLOCATE( tf_lay%i_jmpp(il_shape(jp_I),il_shape(jp_J)) ) 
     3136         tf_lay%i_jmpp(:,:)=il_tmp(:,:) 
    28483137 
    28493138         DEALLOCATE(il_tmp) 
    28503139      ENDIF 
    28513140 
    2852       IF( ASSOCIATED(layout__copy%i_lci) ) DEALLOCATE(layout__copy%i_lci) 
     3141      IF( ASSOCIATED(tf_lay%i_lci) ) DEALLOCATE(tf_lay%i_lci) 
    28533142      IF( ASSOCIATED(td_lay%i_lci) )THEN 
    28543143         il_shape(:)=SHAPE(td_lay%i_lci(:,:)) 
     
    28563145         il_tmp(:,:)=td_lay%i_lci(:,:) 
    28573146 
    2858          ALLOCATE( layout__copy%i_lci(il_shape(jp_I),il_shape(jp_J)) ) 
    2859          layout__copy%i_lci(:,:)=il_tmp(:,:) 
     3147         ALLOCATE( tf_lay%i_lci(il_shape(jp_I),il_shape(jp_J)) ) 
     3148         tf_lay%i_lci(:,:)=il_tmp(:,:) 
    28603149 
    28613150         DEALLOCATE(il_tmp) 
    28623151      ENDIF 
    28633152 
    2864       IF( ASSOCIATED(layout__copy%i_lcj) ) DEALLOCATE(layout__copy%i_lcj) 
     3153      IF( ASSOCIATED(tf_lay%i_lcj) ) DEALLOCATE(tf_lay%i_lcj) 
    28653154      IF( ASSOCIATED(td_lay%i_lcj) )THEN 
    28663155         il_shape(:)=SHAPE(td_lay%i_lcj(:,:)) 
     
    28683157         il_tmp(:,:)=td_lay%i_lcj(:,:) 
    28693158 
    2870          ALLOCATE( layout__copy%i_lcj(il_shape(jp_I),il_shape(jp_J)) ) 
    2871          layout__copy%i_lcj(:,:)=il_tmp(:,:) 
     3159         ALLOCATE( tf_lay%i_lcj(il_shape(jp_I),il_shape(jp_J)) ) 
     3160         tf_lay%i_lcj(:,:)=il_tmp(:,:) 
    28723161 
    28733162         DEALLOCATE(il_tmp) 
     
    28753164 
    28763165   END FUNCTION layout__copy 
     3166   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     3167   SUBROUTINE mpp__create_layout(td_mpp, td_lay) 
    28773168   !------------------------------------------------------------------- 
    28783169   !> @brief 
     
    28803171   !> 
    28813172   !> @detail 
    2882    ! 
     3173   !> 
    28833174   !> @author J.Paul 
    28843175   !> @date October, 2015 - Initial version 
    2885    ! 
     3176   !> @date August, 2017  
     3177   !> - handle use of domain decomposition for monoproc file 
     3178   !> 
    28863179   !> @param[inout] td_mpp mpp strcuture 
    28873180   !> @param[in] td_lay domain layout structure 
    28883181   !------------------------------------------------------------------- 
    2889    SUBROUTINE mpp__create_layout( td_mpp, td_lay ) 
     3182 
    28903183      IMPLICIT NONE 
     3184 
    28913185      ! Argument 
    28923186      TYPE(TMPP), INTENT(INOUT) :: td_mpp 
     
    28953189      ! local variable 
    28963190      CHARACTER(LEN=lc)                        :: cl_file 
    2897       TYPE(TFILE)                              :: tl_proc 
    28983191      TYPE(TATT)                               :: tl_att 
     3192 
     3193      TYPE(TFILE), DIMENSION(:), ALLOCATABLE   :: tl_proc 
    28993194 
    29003195      ! loop indices 
     
    29443239      ENDIF 
    29453240       
    2946       jk=0 
     3241      ALLOCATE(tl_proc(td_lay%i_nsea)) 
     3242      jk=1 
    29473243      DO jj=1,td_lay%i_njproc 
    29483244         DO ji=1,td_lay%i_niproc 
     
    29513247 
    29523248               ! get processor file name 
    2953                cl_file=file_rename(td_mpp%c_name,jk) 
     3249               IF( td_mpp%l_usempp )THEN 
     3250                  cl_file=file_rename(td_mpp%c_name,jk) 
     3251               ELSE 
     3252                  cl_file=TRIM(td_mpp%c_name) 
     3253               ENDIF 
    29543254               ! initialise file structure 
    2955                tl_proc=file_init(cl_file,td_mpp%c_type) 
     3255               tl_proc(jk)=file_init(cl_file,td_mpp%c_type) 
    29563256 
    29573257               ! procesor id 
    2958                tl_proc%i_pid=jk 
    2959  
    2960                tl_att=att_init("DOMAIN_number",tl_proc%i_pid) 
    2961                CALL file_add_att(tl_proc, tl_att) 
     3258               tl_proc(jk)%i_pid=jk-1 
     3259 
     3260               tl_att=att_init("DOMAIN_number",tl_proc(jk)%i_pid) 
     3261               CALL file_add_att(tl_proc(jk), tl_att) 
    29623262 
    29633263               ! processor indices 
    2964                tl_proc%i_iind=ji 
    2965                tl_proc%i_jind=jj 
     3264               tl_proc(jk)%i_iind=ji 
     3265               tl_proc(jk)%i_jind=jj 
    29663266 
    29673267               ! fill processor dimension and first indices 
    2968                tl_proc%i_impp = td_lay%i_impp(ji,jj) 
    2969                tl_proc%i_jmpp = td_lay%i_jmpp(ji,jj) 
    2970  
    2971                tl_proc%i_lci  = td_lay%i_lci(ji,jj) 
    2972                tl_proc%i_lcj  = td_lay%i_lcj(ji,jj) 
     3268               tl_proc(jk)%i_impp = td_lay%i_impp(ji,jj) 
     3269               tl_proc(jk)%i_jmpp = td_lay%i_jmpp(ji,jj) 
     3270 
     3271               tl_proc(jk)%i_lci  = td_lay%i_lci(ji,jj) 
     3272               tl_proc(jk)%i_lcj  = td_lay%i_lcj(ji,jj) 
    29733273 
    29743274               ! compute first and last indoor indices 
    2975                 
     3275  
    29763276               ! west boundary 
    29773277               IF( ji == 1 )THEN 
    2978                   tl_proc%i_ldi = 1  
    2979                   tl_proc%l_ctr = .TRUE. 
     3278                  tl_proc(jk)%i_ldi = 1  
     3279                  tl_proc(jk)%l_ctr = .TRUE. 
    29803280               ELSE 
    2981                   tl_proc%i_ldi = 1 + td_mpp%i_preci 
     3281                  tl_proc(jk)%i_ldi = 1 + td_mpp%i_preci 
    29823282               ENDIF 
    29833283 
    29843284               ! south boundary 
    29853285               IF( jj == 1 )THEN 
    2986                   tl_proc%i_ldj = 1  
    2987                   tl_proc%l_ctr = .TRUE. 
     3286                  tl_proc(jk)%i_ldj = 1  
     3287                  tl_proc(jk)%l_ctr = .TRUE. 
    29883288               ELSE 
    2989                   tl_proc%i_ldj = 1 + td_mpp%i_precj 
     3289                  tl_proc(jk)%i_ldj = 1 + td_mpp%i_precj 
    29903290               ENDIF 
    29913291 
    29923292               ! east boundary 
    29933293               IF( ji == td_mpp%i_niproc )THEN 
    2994                   tl_proc%i_lei = td_lay%i_lci(ji,jj) 
    2995                   tl_proc%l_ctr = .TRUE. 
     3294                  tl_proc(jk)%i_lei = td_lay%i_lci(ji,jj) 
     3295                  tl_proc(jk)%l_ctr = .TRUE. 
    29963296               ELSE 
    2997                   tl_proc%i_lei = td_lay%i_lci(ji,jj) - td_mpp%i_preci 
     3297                  tl_proc(jk)%i_lei = td_lay%i_lci(ji,jj) - td_mpp%i_preci 
    29983298               ENDIF 
    29993299 
    30003300               ! north boundary 
    30013301               IF( jj == td_mpp%i_njproc )THEN 
    3002                   tl_proc%i_lej = td_lay%i_lcj(ji,jj) 
    3003                   tl_proc%l_ctr = .TRUE. 
     3302                  tl_proc(jk)%i_lej = td_lay%i_lcj(ji,jj) 
     3303                  tl_proc(jk)%l_ctr = .TRUE. 
    30043304               ELSE 
    3005                   tl_proc%i_lej = td_lay%i_lcj(ji,jj) - td_mpp%i_precj 
     3305                  tl_proc(jk)%i_lej = td_lay%i_lcj(ji,jj) - td_mpp%i_precj 
    30063306               ENDIF 
    3007  
    3008                ! add processor to mpp structure 
    3009                CALL mpp__add_proc(td_mpp, tl_proc) 
    30103307 
    30113308               ! clean 
    30123309               CALL att_clean(tl_att) 
    3013                CALL file_clean(tl_proc) 
    30143310 
    30153311               ! update proc number 
    3016                jk=jk+1 !ji+(jj-1)*td_lay%i_niproc 
     3312               jk=jk+1  
    30173313 
    30183314            ENDIF 
    30193315         ENDDO 
    30203316      ENDDO 
     3317! 
     3318      CALL mpp__add_proc(td_mpp, tl_proc(:)) 
     3319      DEALLOCATE(tl_proc) 
    30213320 
    30223321   END SUBROUTINE mpp__create_layout 
     3322   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     3323   SUBROUTINE mpp__optimiz(td_mpp, id_mask, id_nproc) 
    30233324   !------------------------------------------------------------------- 
    30243325   !> @brief  
     
    30293330   !>  If no land processor could be removed, it get the decomposition with the 
    30303331   !>  most sea processors. 
    3031    ! 
     3332   !> 
    30323333   !> @author J.Paul 
    30333334   !> @date November, 2013 - Initial version 
     
    30363337   !> @date February, 2016 
    30373338   !> - new criteria for domain layout in case no land proc 
    3038    ! 
     3339   !> 
    30393340   !> @param[inout] td_mpp mpp strcuture 
    30403341   !> @param[in] id_mask   sub domain mask (sea=1, land=0)  
    30413342   !> @pram[in] id_nproc maximum number of processor to be used 
    30423343   !------------------------------------------------------------------- 
    3043    SUBROUTINE mpp__optimiz( td_mpp, id_mask, id_nproc ) 
     3344       
    30443345      IMPLICIT NONE 
     3346 
    30453347      ! Argument 
    30463348      TYPE(TMPP),                  INTENT(INOUT) :: td_mpp 
     
    31273429 
    31283430   END SUBROUTINE mpp__optimiz 
     3431   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     3432   SUBROUTINE mpp__clean_unit(td_mpp) 
    31293433   !------------------------------------------------------------------- 
    31303434   !> @brief  
     
    31333437   !> @author J.Paul 
    31343438   !> @date November, 2013 - Initial version 
     3439   !> @date January, 2019 
     3440   !> - nullify file structure inside mpp structure 
    31353441   !> 
    31363442   !> @param[inout] td_mpp mpp strcuture 
    31373443   !------------------------------------------------------------------- 
    3138    SUBROUTINE mpp__clean_unit( td_mpp ) 
     3444 
    31393445      IMPLICIT NONE 
     3446 
    31403447      ! Argument 
    31413448      TYPE(TMPP),  INTENT(INOUT) :: td_mpp 
     
    31593466         CALL file_clean( td_mpp%t_proc(:) ) 
    31603467         DEALLOCATE(td_mpp%t_proc) 
     3468         NULLIFY(td_mpp%t_proc) 
    31613469      ENDIF 
    31623470 
     
    31653473 
    31663474   END SUBROUTINE mpp__clean_unit 
     3475   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    31673476   !------------------------------------------------------------------- 
    31683477   !> @brief  
     
    31743483   !> @param[inout] td_mpp mpp strcuture 
    31753484   !------------------------------------------------------------------- 
    3176    SUBROUTINE mpp__clean_arr( td_mpp ) 
     3485   SUBROUTINE mpp__clean_arr(td_mpp) 
     3486 
    31773487      IMPLICIT NONE 
    31783488      ! Argument 
     
    31893499 
    31903500   END SUBROUTINE mpp__clean_arr 
     3501   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     3502   SUBROUTINE mpp__get_use_unit(td_mpp, id_imin, id_imax, id_jmin, id_jmax) 
    31913503   !------------------------------------------------------------------- 
    31923504   !> @brief  
    31933505   !>  This subroutine get sub domains which cover "zoom domain". 
     3506   !>                      proc use in "zoom domain"  
    31943507   !> 
    31953508   !> @author J.Paul 
     
    32023515   !> @param[in] id_jmax   j-direction upper indice 
    32033516   !------------------------------------------------------------------- 
    3204    SUBROUTINE mpp__get_use_unit( td_mpp, id_imin, id_imax, & 
    3205    &                                     id_jmin, id_jmax ) 
     3517 
    32063518      IMPLICIT NONE 
     3519 
    32073520      ! Argument 
    32083521      TYPE(TMPP) ,  INTENT(INOUT) :: td_mpp 
     
    32243537      INTEGER(i4) :: jk 
    32253538      !---------------------------------------------------------------- 
     3539 
    32263540      IF( ASSOCIATED(td_mpp%t_proc) )THEN 
    32273541    
     
    33103624 
    33113625   END SUBROUTINE mpp__get_use_unit 
     3626   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     3627   SUBROUTINE mpp_get_contour(td_mpp) 
    33123628   !------------------------------------------------------------------- 
    33133629   !> @brief  
     
    33193635   !> @param[inout] td_mpp mpp strcuture 
    33203636   !------------------------------------------------------------------- 
    3321    SUBROUTINE mpp_get_contour( td_mpp ) 
     3637       
    33223638      IMPLICIT NONE 
     3639 
    33233640      ! Argument 
    33243641      TYPE(TMPP),  INTENT(INOUT) :: td_mpp 
     
    33473664 
    33483665   END SUBROUTINE mpp_get_contour 
     3666   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     3667   FUNCTION mpp_get_proc_index(td_mpp, id_procid) & 
     3668         & RESULT(if_idx) 
    33493669   !------------------------------------------------------------------- 
    33503670   !> @brief 
     
    33593679   !> @return array of index (/ i1, i2, j1, j2 /) 
    33603680   !------------------------------------------------------------------- 
    3361    FUNCTION mpp_get_proc_index( td_mpp, id_procid ) 
     3681 
    33623682      IMPLICIT NONE 
    33633683 
     
    33673687 
    33683688      ! function 
    3369       INTEGER(i4), DIMENSION(4) :: mpp_get_proc_index 
     3689      INTEGER(i4), DIMENSION(4) :: if_idx 
    33703690 
    33713691      ! local variable 
     
    34093729         END SELECT 
    34103730 
    3411          mpp_get_proc_index(:)=(/il_i1, il_i2, il_j1, il_j2/) 
     3731         if_idx(:)=(/il_i1, il_i2, il_j1, il_j2/) 
    34123732 
    34133733      ELSE 
     
    34163736 
    34173737   END FUNCTION mpp_get_proc_index 
     3738   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     3739   FUNCTION mpp_get_proc_size(td_mpp, id_procid) & 
     3740         & RESULT(if_size) 
    34183741   !------------------------------------------------------------------- 
    34193742   !> @brief 
    34203743   !> This function return processor domain size, depending of domain  
    34213744   !> decompisition type, given sub domain id.  
    3422    ! 
     3745   !> 
    34233746   !> @author J.Paul 
    34243747   !> @date November, 2013 - Initial version 
    3425    ! 
     3748   !> 
    34263749   !> @param[in] td_mpp    mpp strcuture 
    34273750   !> @param[in] id_procid sub domain id 
    34283751   !> @return array of index (/ isize, jsize /) 
    34293752   !------------------------------------------------------------------- 
    3430    FUNCTION mpp_get_proc_size( td_mpp, id_procid ) 
     3753 
    34313754      IMPLICIT NONE 
    34323755 
     
    34363759 
    34373760      ! function 
    3438       INTEGER(i4), DIMENSION(2) :: mpp_get_proc_size 
     3761      INTEGER(i4), DIMENSION(2) :: if_size 
    34393762 
    34403763      ! local variable 
     
    34713794         END SELECT 
    34723795 
    3473          mpp_get_proc_size(:)=(/il_isize, il_jsize/) 
     3796         if_size(:)=(/il_isize, il_jsize/) 
    34743797 
    34753798      ELSE 
     
    34783801 
    34793802   END FUNCTION mpp_get_proc_size 
     3803   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     3804   SUBROUTINE mpp_get_dom(td_mpp) 
    34803805   !------------------------------------------------------------------- 
    34813806   !> @brief  
     
    34883813   !> @param[inout] td_mpp mpp strcuture 
    34893814   !------------------------------------------------------------------- 
    3490    SUBROUTINE mpp_get_dom( td_mpp ) 
     3815       
    34913816      IMPLICIT NONE 
     3817 
    34923818      ! Argument 
    34933819      TYPE(TMPP),  INTENT(INOUT) :: td_mpp 
     
    35703896 
    35713897   END SUBROUTINE mpp_get_dom 
     3898   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     3899   FUNCTION mpp__check_var_dim(td_mpp, td_var) & 
     3900         & RESULT(lf_check) 
    35723901   !------------------------------------------------------------------- 
    35733902   !> @brief This function check if variable  and mpp structure use same 
     
    35853914   !> @return dimension of variable and mpp structure agree (or not) 
    35863915   !------------------------------------------------------------------- 
    3587    LOGICAL FUNCTION mpp__check_var_dim(td_mpp, td_var) 
     3916 
    35883917      IMPLICIT NONE 
     3918 
    35893919      ! Argument       
    35903920      TYPE(TMPP), INTENT(IN) :: td_mpp 
    35913921      TYPE(TVAR), INTENT(IN) :: td_var 
     3922 
     3923      ! function 
     3924      LOGICAL                :: lf_check 
    35923925 
    35933926      ! local variable 
     
    36013934      INTEGER(i4) :: ji 
    36023935      !---------------------------------------------------------------- 
    3603       mpp__check_var_dim=.TRUE. 
     3936 
     3937      lf_check=.TRUE. 
    36043938 
    36053939      ! check used dimension  
     
    36083942      DO ji=1,ip_maxdim 
    36093943         il_ind=dim_get_index( td_mpp%t_dim(:), & 
    3610          &                     TRIM(td_var%t_dim(ji)%c_name), & 
    3611          &                     TRIM(td_var%t_dim(ji)%c_sname)) 
     3944            &                  TRIM(td_var%t_dim(ji)%c_name), & 
     3945            &                  TRIM(td_var%t_dim(ji)%c_sname)) 
    36123946         IF( il_ind /= 0 )THEN 
    36133947            IF( td_var%t_dim(ji)%l_use  .AND. & 
    3614             &   td_mpp%t_dim(il_ind)%l_use .AND. & 
    3615             &   td_var%t_dim(ji)%i_len /= td_mpp%t_dim(il_ind)%i_len )THEN 
     3948               &td_mpp%t_dim(il_ind)%l_use .AND. & 
     3949               &td_var%t_dim(ji)%i_len /= td_mpp%t_dim(il_ind)%i_len )THEN 
    36163950               IF( INDEX( TRIM(td_var%c_axis), & 
    3617                &          TRIM(fct_upper(td_var%t_dim(ji)%c_name))) == 0 )THEN 
     3951                  &       TRIM(fct_upper(td_var%t_dim(ji)%c_name))) == 0 )THEN 
    36183952                  ll_warn=.TRUE. 
    36193953               ELSE 
     
    36303964            IF( td_mpp%t_dim(ji)%l_use )THEN 
    36313965               cl_dim=TRIM(cl_dim)//& 
    3632                &  TRIM(fct_upper(td_mpp%t_dim(ji)%c_sname))//':'//& 
    3633                &  TRIM(fct_str(td_mpp%t_dim(ji)%i_len))//',' 
     3966                  &   TRIM(fct_upper(td_mpp%t_dim(ji)%c_sname))//':'//& 
     3967                  &   TRIM(fct_str(td_mpp%t_dim(ji)%i_len))//',' 
    36343968            ENDIF 
    36353969         ENDDO 
     
    36413975            IF( td_var%t_dim(ji)%l_use )THEN 
    36423976               cl_dim=TRIM(cl_dim)//& 
    3643                &  TRIM(fct_upper(td_var%t_dim(ji)%c_sname))//':'//& 
    3644                &  TRIM(fct_str(td_var%t_dim(ji)%i_len))//',' 
     3977                  &   TRIM(fct_upper(td_var%t_dim(ji)%c_sname))//':'//& 
     3978                  &   TRIM(fct_str(td_var%t_dim(ji)%i_len))//',' 
    36453979            ENDIF 
    36463980         ENDDO 
     
    36483982         CALL logger_debug( " variable dimension: "//TRIM(cl_dim) ) 
    36493983 
    3650          mpp__check_var_dim=.FALSE. 
     3984         lf_check=.FALSE. 
    36513985 
    36523986         CALL logger_error( & 
    3653          &  " MPP CHECK VAR DIM: variable and file dimension differ"//& 
    3654          &  " for variable "//TRIM(td_var%c_name)//& 
    3655          &  " and file "//TRIM(td_mpp%c_name)) 
     3987            &     " MPP CHECK VAR DIM: variable and file dimension differ"//& 
     3988            &     " for variable "//TRIM(td_var%c_name)//& 
     3989            &     " and file "//TRIM(td_mpp%c_name)) 
    36563990 
    36573991      ELSEIF( ll_warn )THEN 
    36583992         CALL logger_warn( & 
    3659          &  " MPP CHECK VAR DIM: variable and file dimension differ"//& 
    3660          &  " for variable "//TRIM(td_var%c_name)//& 
    3661          &  " and file "//TRIM(td_mpp%c_name)//". you should use"//& 
    3662          &  " var_check_dim to remove useless dimension.") 
     3993            &     " MPP CHECK VAR DIM: variable and file dimension differ"//& 
     3994            &     " for variable "//TRIM(td_var%c_name)//& 
     3995            &     " and file "//TRIM(td_mpp%c_name)//". you should use"//& 
     3996            &     " var_check_dim to remove useless dimension.") 
    36633997      ELSE 
    36643998 
    36653999         IF( td_var%i_ndim >  td_mpp%i_ndim )THEN 
    36664000            CALL logger_info("MPP CHECK VAR DIM: variable "//& 
    3667             &  TRIM(td_var%c_name)//" use more dimension than file "//& 
    3668             &  TRIM(td_mpp%c_name)//" do until now.") 
     4001               &     TRIM(td_var%c_name)//" use more dimension than file "//& 
     4002               &     TRIM(td_mpp%c_name)//" do until now.") 
    36694003         ENDIF 
    36704004 
     
    36724006 
    36734007   END FUNCTION mpp__check_var_dim 
     4008   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     4009   FUNCTION mpp_get_index(td_mpp, cd_name) & 
     4010         & RESULT(if_idx) 
    36744011   !------------------------------------------------------------------- 
    36754012   !> @brief This function return the mpp id, in a array of mpp 
    36764013   !> structure,  given mpp base name.  
    3677    ! 
     4014   !> 
    36784015   !> @author J.Paul 
    36794016   !> @date November, 2013 - Initial Version 
    3680    ! 
     4017   !> 
    36814018   !> @param[in] td_file   array of file structure 
    36824019   !> @param[in] cd_name   file name 
    36834020   !> @return file id in array of file structure (0 if not found) 
    36844021   !------------------------------------------------------------------- 
    3685    INTEGER(i4) FUNCTION mpp_get_index(td_mpp, cd_name) 
     4022 
    36864023      IMPLICIT NONE 
     4024 
    36874025      ! Argument       
    36884026      TYPE(TMPP)      , DIMENSION(:), INTENT(IN) :: td_mpp 
    36894027      CHARACTER(LEN=*),               INTENT(IN) :: cd_name 
    36904028 
     4029      ! function 
     4030      INTEGER(i4)                                :: if_idx 
     4031 
    36914032      ! local variable 
    36924033      CHARACTER(LEN=lc) :: cl_name 
     
    36964037      INTEGER(i4) :: ji 
    36974038      !---------------------------------------------------------------- 
    3698       mpp_get_index=0 
     4039      if_idx=0 
    36994040      il_size=SIZE(td_mpp(:)) 
    37004041 
     
    37064047         IF( TRIM(fct_lower(td_mpp(ji)%c_name)) == TRIM(fct_lower(cd_name)) )THEN 
    37074048  
    3708             mpp_get_index=ji 
     4049            if_idx=ji 
    37094050            EXIT 
    37104051 
     
    37134054 
    37144055   END FUNCTION mpp_get_index 
    3715    !------------------------------------------------------------------- 
    3716    !> @brief This function recombine variable splitted mpp structure.  
    3717    ! 
     4056   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     4057   FUNCTION mpp_recombine_var(td_mpp, cd_name) & 
     4058         & RESULT(tf_var) 
     4059   !------------------------------------------------------------------- 
     4060   !> @brief This function recombine variable splitted in mpp structure.  
     4061   !> 
    37184062   !> @author J.Paul 
    3719    !> @date Ocotber, 2014 - Initial Version 
    3720    ! 
     4063   !> @date October, 2014 - Initial Version 
     4064   !> 
    37214065   !> @param[in] td_mpp   mpp file structure 
    37224066   !> @param[in] cd_name  variable name 
    37234067   !> @return variable strucutre 
    37244068   !------------------------------------------------------------------- 
    3725    TYPE(TVAR) FUNCTION mpp_recombine_var(td_mpp, cd_name)  
    3726    IMPLICIT NONE 
     4069 
     4070      IMPLICIT NONE 
     4071 
    37274072      ! Argument       
    37284073      TYPE(TMPP)      , INTENT(IN) :: td_mpp 
    37294074      CHARACTER(LEN=*), INTENT(IN) :: cd_name 
     4075      ! function 
     4076      TYPE(TVAR)                   :: tf_var 
    37304077 
    37314078      ! local variable 
     
    37424089 
    37434090      TYPE(TVAR)                        :: tl_tmp 
    3744       TYPE(TVAR)                        :: tl_var 
    37454091 
    37464092      ! loop indices 
     
    37524098      IF( il_varid /= 0 )THEN 
    37534099       
    3754          tl_var=var_copy(td_mpp%t_proc(1)%t_var(il_varid)) 
     4100         tf_var=var_copy(td_mpp%t_proc(1)%t_var(il_varid)) 
    37554101         ! Allocate space to hold variable value in structure  
    3756          IF( ASSOCIATED(tl_var%d_value) )THEN 
    3757             DEALLOCATE(tl_var%d_value)    
     4102         IF( ASSOCIATED(tf_var%d_value) )THEN 
     4103            DEALLOCATE(tf_var%d_value)    
    37584104         ENDIF 
    37594105         !  
    37604106         DO ji=1,ip_maxdim 
    3761             IF( tl_var%t_dim(ji)%l_use )THEN 
    3762                tl_var%t_dim(ji)%i_len=td_mpp%t_dim(ji)%i_len 
     4107            IF( tf_var%t_dim(ji)%l_use )THEN 
     4108               tf_var%t_dim(ji)%i_len=td_mpp%t_dim(ji)%i_len 
    37634109            ENDIF 
    37644110         ENDDO 
    37654111 
    3766          ALLOCATE(tl_var%d_value( tl_var%t_dim(1)%i_len, & 
    3767          &                        tl_var%t_dim(2)%i_len, & 
    3768          &                        tl_var%t_dim(3)%i_len, & 
    3769          &                        tl_var%t_dim(4)%i_len),& 
    3770          &        stat=il_status) 
     4112         ALLOCATE(tf_var%d_value( tf_var%t_dim(1)%i_len, & 
     4113            &                     tf_var%t_dim(2)%i_len, & 
     4114            &                     tf_var%t_dim(3)%i_len, & 
     4115            &                     tf_var%t_dim(4)%i_len),& 
     4116            &     stat=il_status) 
    37714117         IF(il_status /= 0 )THEN 
    37724118 
    37734119           CALL logger_error( & 
    3774             &  " MPP RECOMBINE VAR: not enough space to put variable "//& 
    3775             &  TRIM(tl_var%c_name)//" in variable structure") 
     4120              &  " MPP RECOMBINE VAR: not enough space to put variable "//& 
     4121              &  TRIM(tf_var%c_name)//" in variable structure") 
    37764122 
    37774123         ENDIF 
    37784124 
    37794125         ! FillValue by default 
    3780          tl_var%d_value(:,:,:,:)=tl_var%d_fill 
     4126         tf_var%d_value(:,:,:,:)=tf_var%d_fill 
    37814127 
    37824128         ! read processor  
     
    37934139 
    37944140               il_cnt(:)=(/ il_i2p-il_i1p+1,         & 
    3795                &            il_j2p-il_j1p+1,         & 
    3796                &            tl_var%t_dim(3)%i_len, & 
    3797                &            tl_var%t_dim(4)%i_len /) 
    3798  
    3799                tl_tmp=iom_read_var( td_mpp%t_proc(jk), tl_var%c_name,& 
    3800                &                    il_strt(:), il_cnt(:) ) 
     4141                  &         il_j2p-il_j1p+1,         & 
     4142                  &         tf_var%t_dim(3)%i_len, & 
     4143                  &         tf_var%t_dim(4)%i_len /) 
     4144 
     4145               tl_tmp=iom_read_var( td_mpp%t_proc(jk), tf_var%c_name,& 
     4146                  &                 il_strt(:), il_cnt(:) ) 
    38014147                
    38024148               ! replace value in output variable structure 
    3803                tl_var%d_value( il_i1p : il_i2p,  & 
    3804                &               il_j1p : il_j2p,  & 
    3805                &               :,:) = tl_tmp%d_value(:,:,:,:) 
     4149               tf_var%d_value( il_i1p : il_i2p,  & 
     4150                  &            il_j1p : il_j2p,  & 
     4151                  &            :,:) = tl_tmp%d_value(:,:,:,:) 
    38064152 
    38074153               ! clean 
     
    38114157         ENDDO 
    38124158 
    3813          mpp_recombine_var=var_copy(tl_var) 
    3814  
    3815          ! clean 
    3816          CALL var_clean(tl_var) 
    3817  
    38184159      ELSE 
    38194160 
    38204161         CALL logger_error( & 
    3821          &  " MPP RECOMBINE VAR: there is no variable with "//& 
    3822          &  "name or standard name"//TRIM(cd_name)//& 
    3823          &  " in mpp file "//TRIM(td_mpp%c_name)) 
    3824       ENDIF 
     4162            &  " MPP RECOMBINE VAR: there is no variable with "//& 
     4163            &  "name or standard name"//TRIM(cd_name)//& 
     4164            &  " in mpp file "//TRIM(td_mpp%c_name)) 
     4165      ENDIF 
     4166 
    38254167   END FUNCTION mpp_recombine_var 
     4168   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     4169   SUBROUTINE mpp__read_halo(td_file, td_dimglo)  
    38264170   !------------------------------------------------------------------- 
    38274171   !> @brief This subroutine read subdomain indices defined with halo 
     
    38334177   !> @param[inout] td_file   mpp structure 
    38344178   !------------------------------------------------------------------- 
    3835    SUBROUTINE mpp__read_halo(td_file, td_dimglo)  
    3836    IMPLICIT NONE 
     4179    
     4180      IMPLICIT NONE 
     4181 
    38374182      ! Argument       
    38384183      TYPE(TFILE)              , INTENT(INOUT) :: td_file 
     
    39464291 
    39474292   END SUBROUTINE mpp__read_halo 
     4293   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     4294   SUBROUTINE mpp__compute_halo(td_mpp)  
    39484295   !------------------------------------------------------------------- 
    39494296   !> @brief This subroutine compute subdomain indices defined with halo 
     
    39554302   !> @param[inout] td_mpp   mpp structure 
    39564303   !------------------------------------------------------------------- 
    3957    SUBROUTINE mpp__compute_halo(td_mpp)  
    3958    IMPLICIT NONE 
     4304    
     4305      IMPLICIT NONE 
     4306 
    39594307      ! Argument       
    39604308      TYPE(TMPP)      , INTENT(INOUT) :: td_mpp 
     
    40984446 
    40994447   END SUBROUTINE mpp__compute_halo 
     4448   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    41004449END MODULE mpp 
    41014450 
Note: See TracChangeset for help on using the changeset viewer.