New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
Changeset 6440 for branches/UKMO/dev_r5518_GC3p0_package/NEMOGCM/TOOLS/SIREN/src/iom_cdf.f90 – NEMO

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

Merged in nemo_v3_6_STABLE_copy up to revision 6436.

File:
1 edited

Legend:

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

    r5037 r6440  
    144144   !> 
    145145   !> @author J.Paul 
    146    !> - November, 2013- Initial Version 
    147    ! 
     146   !> @date November, 2013 - Initial Version 
     147   !> @date May, 2015 - add optional message to netcdf error message 
     148   !> 
    148149   !> @param[in] id_status error status 
    149    !------------------------------------------------------------------- 
    150    SUBROUTINE iom_cdf__check(id_status) 
    151       IMPLICIT NONE 
    152       ! Argument       
    153       INTEGER(i4), INTENT(IN) :: id_status 
    154       !---------------------------------------------------------------- 
     150   !> @param[in] cd_msg    message 
     151   !------------------------------------------------------------------- 
     152   SUBROUTINE iom_cdf__check(id_status, cd_msg) 
     153      IMPLICIT NONE 
     154      ! Argument       
     155      INTEGER(i4)     , INTENT(IN)           :: id_status 
     156      CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: cd_msg 
     157      ! local variable 
     158      CHARACTER(LEN=lc) :: cl_msg 
     159      !---------------------------------------------------------------- 
     160 
     161      cl_msg="" 
     162      IF( PRESENT(cd_msg) ) cl_msg=cd_msg 
    155163 
    156164      IF( id_status /= NF90_NOERR )THEN 
    157          CALL logger_error(TRIM(NF90_STRERROR(id_status))) 
     165         CALL logger_error(TRIM(cl_msg)//TRIM(NF90_STRERROR(id_status))) 
    158166      ENDIF 
    159167 
     
    173181   !> 
    174182   !> @author J.Paul 
    175    !> - November, 2013- Initial Version 
     183   !> @date November, 2013 - Initial Version 
    176184   ! 
    177185   !> @param[inout] td_file   file structure 
     
    203211            CALL logger_info( " IOM CDF CREATE: file "//TRIM(td_file%c_name) ) 
    204212 
    205             il_status = NF90_CREATE( TRIM(td_file%c_name),& 
    206             &                        NF90_WRITE,               & 
    207             &                        td_file%i_id) 
    208             CALL iom_cdf__check(il_status) 
     213            il_status = NF90_CREATE(TRIM(td_file%c_name),& 
     214            &                       cmode=NF90_64BIT_OFFSET,& 
     215            &                       ncid=td_file%i_id) 
     216            CALL iom_cdf__check(il_status," IOM CDF CREATE: ") 
    209217 
    210218            td_file%l_def=.TRUE. 
     
    213221 
    214222      ELSE 
     223 
    215224         IF( td_file%i_id /= 0 )THEN 
    216225 
     
    228237               &                      NF90_NOWRITE,         & 
    229238               &                      td_file%i_id) 
    230                CALL iom_cdf__check(il_status) 
    231  
    232                CALL logger_trace("IOM CDF OPEN "//TRIM(td_file%c_name)//" "//TRIM(fct_str(td_file%i_id))) 
     239               CALL iom_cdf__check(il_status," IOM CDF OPEN: ") 
     240 
    233241            ELSE 
    234242 
     
    239247               &                      NF90_WRITE,           & 
    240248               &                      td_file%i_id) 
    241                CALL iom_cdf__check(il_status) 
     249               CALL iom_cdf__check(il_status,"IOM CDF OPEN: ") 
    242250 
    243251            ENDIF 
     
    267275   !> 
    268276   !> @author J.Paul 
    269    !> - November, 2013- Initial Version 
     277   !> @date November, 2013 - Initial Version 
    270278   ! 
    271279   !> @param[inout] td_file   file structure 
     
    291299 
    292300         il_status = NF90_CLOSE(td_file%i_id) 
    293          CALL iom_cdf__check(il_status) 
     301         CALL iom_cdf__check(il_status,"IOM CDF CLOSE: ") 
    294302 
    295303         td_file%i_id = 0 
     
    307315   !> 
    308316   !> @author J.Paul 
    309    !> - November, 2013- Initial Version 
     317   !> @date November, 2013 - Initial Version 
    310318   ! 
    311319   !> @param[inout] td_file   file structure 
     
    326334      il_status=NF90_INQUIRE(td_file%i_id, td_file%i_ndim, & 
    327335      &     td_file%i_nvar, td_file%i_natt, td_file%i_uldid, il_fmt) 
    328       CALL iom_cdf__check(il_status) 
     336      CALL iom_cdf__check(il_status,"IOM CDF GET INFO: ") 
    329337 
    330338      SELECT CASE(il_fmt) 
     
    345353   ! 
    346354   !> @author J.Paul 
    347    !> - November, 2013- Initial Version 
     355   !> @date November, 2013 - Initial Version 
    348356   ! 
    349357   !> @param[inout] td_file   file structure 
     
    353361      ! Argument       
    354362      TYPE(TFILE), INTENT(INOUT) :: td_file 
     363      ! local variable 
     364      TYPE(TDIM) :: tl_dim 
    355365 
    356366      ! loop indices 
    357367      INTEGER(i4) :: ji 
     368      INTEGER(i4) :: ii 
    358369      !---------------------------------------------------------------- 
    359370 
     
    364375 
    365376      IF( td_file%i_ndim > 0 )THEN 
     377         ii=1 
    366378         DO ji = 1, td_file%i_ndim 
    367379            ! read dimension information 
    368             td_file%t_dim(ji)=iom_cdf_read_dim( td_file, ji) 
     380            tl_dim=iom_cdf_read_dim( td_file, ji) 
     381            IF( .NOT. dim_is_dummy(tl_dim) )THEN 
     382               IF( ii > ip_maxdim )THEN 
     383                  CALL logger_fatal("IOM CDF OPEN: too much dimension "//& 
     384                  & "to be read. you should remove dummy dimension using "//& 
     385                  & " configuration file") 
     386               ENDIF 
     387               td_file%t_dim(ii)=dim_copy(tl_dim) 
     388               ii=ii+1 
     389            ENDIF 
    369390         ENDDO 
    370391 
     
    396417   ! 
    397418   !> @author J.Paul 
    398    !> - November, 2013- Initial Version 
     419   !> @date November, 2013 - Initial Version 
    399420   !> @date September, 2014 
    400421   !> - use attribute periodicity read from the file if present. 
     
    408429 
    409430      ! local variable 
     431      TYPE(TATT) :: tl_att 
     432 
    410433      ! loop indices 
    411434      INTEGER(i4) :: ji 
     435      INTEGER(i4) :: ii 
    412436      !---------------------------------------------------------------- 
    413437 
     
    419443         ALLOCATE(td_file%t_att(td_file%i_natt)) 
    420444 
     445         ii=1 
    421446         DO ji = 1, td_file%i_natt 
    422447            ! read global attribute 
    423             td_file%t_att(ji)=iom_cdf_read_att( td_file, NF90_GLOBAL, ji) 
     448            tl_att=iom_cdf_read_att( td_file, NF90_GLOBAL, ji) 
     449            IF( .NOT. att_is_dummy(tl_att) )THEN 
     450               td_file%t_att(ii)=att_copy(tl_att) 
     451               ii=ii+1 
     452            ENDIF 
    424453             
    425454         ENDDO 
     
    439468   ! 
    440469   !> @author J.Paul 
    441    !> - November, 2013- Initial Version 
     470   !> @date November, 2013 - Initial Version 
     471   !> @date September, 2015 
     472   !> - manage useless (dummy) variable 
     473   !> @date January, 2016 
     474   !> - increment n3d for 4D variable 
    442475   ! 
    443476   !> @param[inout] td_file   file structure 
     
    450483      ! local variable 
    451484      INTEGER(i4) :: il_attid 
     485      INTEGER(i4) :: il_nvar 
     486 
     487      TYPE(TVAR), DIMENSION(:), ALLOCATABLE  :: tl_var 
    452488 
    453489      ! loop indices 
    454490      INTEGER(i4) :: ji 
     491      INTEGER(i4) :: ii 
    455492      !---------------------------------------------------------------- 
    456493 
    457494      IF( td_file%i_nvar > 0 )THEN 
     495 
    458496         IF(ASSOCIATED(td_file%t_var))THEN 
    459497            CALL var_clean(td_file%t_var(:)) 
    460498            DEALLOCATE(td_file%t_var) 
    461499         ENDIF 
     500 
     501         il_nvar=td_file%i_nvar 
     502         ALLOCATE(tl_var(il_nvar)) 
     503         ii=0 
     504         DO ji = 1, il_nvar 
     505           ! read variable information 
     506           tl_var(ji)=iom_cdf__read_var_meta( td_file, ji)  
     507           IF( .NOT. var_is_dummy(tl_var(ji)) )THEN 
     508              ii=ii+1 
     509           ENDIF 
     510         ENDDO 
     511 
     512         ! update number of variable used 
     513         td_file%i_nvar=ii 
     514 
    462515         ALLOCATE(td_file%t_var(td_file%i_nvar)) 
    463516 
    464          DO ji = 1, td_file%i_nvar 
    465             ! read dimension information 
    466             td_file%t_var(ji)=iom_cdf__read_var_meta( td_file, ji) 
    467             SELECT CASE(td_file%t_var(ji)%i_ndim) 
    468                CASE(0) 
    469                   td_file%i_n0d=td_file%i_n0d+1 
    470                CASE(1) 
    471                   td_file%i_n1d=td_file%i_n1d+1 
    472                   td_file%i_rhd=td_file%i_rhd+1 
    473                CASE(2) 
    474                   td_file%i_n2d=td_file%i_n2d+1 
    475                   td_file%i_rhd=td_file%i_rhd+1 
    476                CASE(3) 
    477                   td_file%i_n3d=td_file%i_n3d+1 
    478                   td_file%i_rhd=td_file%i_rhd+td_file%t_dim(3)%i_len 
    479             END SELECT 
    480  
    481             ! look for depth id 
    482             IF( INDEX(TRIM(td_file%t_var(ji)%c_name),'depth') /= 0 )THEN 
    483                IF( td_file%i_depthid == 0 )THEN 
    484                   td_file%i_depthid=ji 
    485                ELSE 
    486                   IF( td_file%i_depthid /= ji )THEN 
    487                      CALL logger_error("IOM CDF GET FILE VAR: find more than one "//& 
    488                      &                 "depth variable in file "//& 
    489                      &                 TRIM(td_file%c_name) ) 
     517         ii=0 
     518         DO ji = 1, il_nvar 
     519            IF( .NOT. var_is_dummy(tl_var(ji)) )THEN 
     520               ii=ii+1 
     521               td_file%t_var(ii)=var_copy(tl_var(ji)) 
     522               SELECT CASE(td_file%t_var(ii)%i_ndim) 
     523                  CASE(0) 
     524                     td_file%i_n0d=td_file%i_n0d+1 
     525                  CASE(1) 
     526                     td_file%i_n1d=td_file%i_n1d+1 
     527                     td_file%i_rhd=td_file%i_rhd+1 
     528                  CASE(2) 
     529                     td_file%i_n2d=td_file%i_n2d+1 
     530                     td_file%i_rhd=td_file%i_rhd+1 
     531                  CASE(3,4) 
     532                     td_file%i_n3d=td_file%i_n3d+1 
     533                     td_file%i_rhd=td_file%i_rhd+td_file%t_dim(3)%i_len 
     534               END SELECT 
     535 
     536               ! look for depth id 
     537               IF( INDEX(TRIM(fct_lower(td_file%t_var(ii)%c_name)),'depth')/=0 )THEN 
     538                  IF( td_file%i_depthid == 0 )THEN 
     539                     td_file%i_depthid=ji 
     540                  ELSE 
     541                     IF( td_file%i_depthid /= ji )THEN 
     542                        CALL logger_error("IOM CDF GET FILE VAR: find more"//& 
     543                           &  " than one depth variable in file "//& 
     544                           &  TRIM(td_file%c_name) ) 
     545                     ENDIF 
    490546                  ENDIF 
    491547               ENDIF 
    492             ENDIF 
    493  
    494             ! look for time id 
    495             IF( INDEX(TRIM(td_file%t_var(ji)%c_name),'time') /= 0 )THEN 
    496                IF( td_file%i_timeid == 0 )THEN 
    497                   td_file%i_timeid=ji 
    498                ELSE 
    499                   il_attid=0 
    500                   IF( ASSOCIATED(td_file%t_var(ji)%t_att) )THEN 
    501                      il_attid=att_get_id(td_file%t_var(ji)%t_att(:),'calendar') 
    502                   ENDIF 
    503                   IF( il_attid /= 0 )THEN 
     548 
     549               ! look for time id 
     550               IF( INDEX(TRIM(fct_lower(td_file%t_var(ii)%c_name)),'time')/=0 )THEN 
     551                  IF( td_file%i_timeid == 0 )THEN 
    504552                     td_file%i_timeid=ji 
    505                   !ELSE 
    506                   !   print *,'error' 
    507                   !   CALL logger_error("IOM OPEN: find more than one "//& 
    508                   !   &                 "time variable in file "//& 
    509                   !   &                 TRIM(td_file%c_name) ) 
     553                  ELSE 
     554                     il_attid=0 
     555                     IF( ASSOCIATED(td_file%t_var(ii)%t_att) )THEN 
     556                        il_attid=att_get_id(td_file%t_var(ii)%t_att(:),'calendar') 
     557                     ENDIF 
     558                     IF( il_attid /= 0 )THEN 
     559                        td_file%i_timeid=ji 
     560                     !ELSE 
     561                     !   CALL logger_error("IOM CDF GET FILE VAR: find more "//& 
     562                     !   &                 "than one time variable in file "//& 
     563                     !   &                 TRIM(td_file%c_name) ) 
     564                     ENDIF 
    510565                  ENDIF 
    511566               ENDIF 
     567 
    512568            ENDIF 
    513  
    514569         ENDDO 
     570 
     571         CALL var_clean(tl_var(:)) 
     572         DEALLOCATE(tl_var) 
    515573 
    516574      ELSE 
     
    526584   ! 
    527585   !> @author J.Paul 
    528    !> - November, 2013- Initial Version 
     586   !> @date November, 2013 - Initial Version 
    529587   ! 
    530588   !> @param[inout] td_file   file structure 
     
    567625   ! 
    568626   !> @author J.Paul 
    569    !> - November, 2013- Initial Version 
     627   !> @date November, 2013 - Initial Version 
     628   !> @date February, 2015 - create unused dimension, when reading dimension 
     629   !> of length less or equal to zero 
    570630   ! 
    571631   !> @param[in] td_file   file structure 
     
    583643      INTEGER(i4)       :: il_len 
    584644      CHARACTER(LEN=lc) :: cl_name 
     645      LOGICAL           :: ll_use 
    585646      !---------------------------------------------------------------- 
    586647 
     
    592653 
    593654      ELSE       
    594  
    595          iom_cdf__read_dim_id%i_id=id_dimid 
    596655 
    597656         CALL logger_trace( & 
     
    601660         il_status=NF90_INQUIRE_DIMENSION(td_file%i_id, id_dimid, & 
    602661         &                                cl_name, il_len ) 
    603          CALL iom_cdf__check(il_status) 
    604  
    605          iom_cdf__read_dim_id=dim_init(cl_name, il_len) 
    606  
    607       ENDIF 
     662         CALL iom_cdf__check(il_status,"IOM CDF READ DIM: ") 
     663 
     664         ll_use=.TRUE. 
     665         IF( il_len <= 0 )THEN 
     666            CALL logger_warn( & 
     667         &  " IOM CDF READ DIM: dimension "//TRIM(fct_str(id_dimid))//& 
     668         &  " in file "//TRIM(td_file%c_name)//" is less or equel to zero") 
     669            il_len=1 
     670            ll_use=.FALSE. 
     671         ENDIF 
     672         iom_cdf__read_dim_id=dim_init(cl_name, il_len, ld_use=ll_use) 
     673 
     674      ENDIF 
     675 
     676      iom_cdf__read_dim_id%i_id=id_dimid 
    608677 
    609678   END FUNCTION iom_cdf__read_dim_id 
     
    613682   ! 
    614683   !> @author J.Paul 
    615    !> - November, 2013- Initial Version 
     684   !> @date November, 2013 - Initial Version 
    616685   ! 
    617686   !> @param[in] td_file   file structure 
     
    634703 
    635704         CALL logger_error( & 
    636          &  " IOM CDF READ DIM: no id associated to file "//TRIM(td_file%c_name)) 
     705         &  " IOM CDF READ DIM: no id associated to file "//& 
     706         &  TRIM(td_file%c_name)) 
    637707 
    638708      ELSE       
     
    640710         il_status=NF90_INQ_DIMID( td_file%i_id, TRIM(ADJUSTL(cd_name)), & 
    641711         &                         il_dimid) 
    642          CALL iom_cdf__check(il_status) 
     712         CALL iom_cdf__check(il_status,"IOM CDF READ DIM: ") 
    643713 
    644714         iom_cdf__read_dim_name=iom_cdf_read_dim(td_file, il_dimid) 
     
    652722   ! 
    653723   !> @author J.Paul 
    654    !> - November, 2013- Initial Version 
     724   !> @date November, 2013 - Initial Version 
    655725   ! 
    656726   !> @param[in] td_file   file structure 
     
    714784         &                                il_len, & 
    715785         &                                il_attid ) 
    716          CALL iom_cdf__check(il_status) 
     786         CALL iom_cdf__check(il_status,"IOM CDF READ ATT: ") 
    717787 
    718788         !! get attribute value 
    719          CALL logger_debug( " IOM CDF READ ATT: get attribute "//TRIM(cl_name)//& 
    720          &               " in file "//TRIM(td_file%c_name)) 
     789         CALL logger_debug( " IOM CDF READ ATT: get attribute "//& 
     790            &            TRIM(cl_name)//" in file "//TRIM(td_file%c_name)) 
    721791 
    722792         SELECT CASE( il_type ) 
     
    727797               IF( LEN(cl_value) < il_len )THEN 
    728798 
    729                   CALL logger_error( & 
    730                   &  " IOM CDF READ ATT: not enough space to put attribute "//& 
    731                   &  TRIM(cl_name) ) 
     799                  CALL logger_warn( & 
     800                  &  " IOM CDF READ ATT: not enough space to put "//& 
     801                  &  "attribute "//TRIM(cl_name) ) 
    732802 
    733803               ELSE 
     
    737807                  &                      cl_name, & 
    738808                  &                      cl_value ) 
    739                   CALL iom_cdf__check(il_status) 
     809                  CALL iom_cdf__check(il_status,"IOM CDF READ ATT: ") 
    740810 
    741811                  iom_cdf__read_att_name=att_init(cl_name, cl_value) 
     
    758828                  &                      cl_name, & 
    759829                  &                      bl_value(:)) 
    760                   CALL iom_cdf__check(il_status)    
     830                  CALL iom_cdf__check(il_status,"IOM CDF READ ATT: ")    
    761831 
    762832                  iom_cdf__read_att_name=att_init(cl_name, bl_value(:)) 
     
    773843 
    774844                  CALL logger_error( & 
    775                   &  " IOM CDF READ ATT: not enough space to put attribute "//& 
    776                   &  TRIM(cl_name) ) 
     845                  &  " IOM CDF READ ATT: not enough space to put "//& 
     846                  &  "attribute "//TRIM(cl_name) ) 
    777847 
    778848               ELSE 
     
    782852                  &                      cl_name, & 
    783853                  &                      sl_value(:)) 
    784                   CALL iom_cdf__check(il_status)    
     854                  CALL iom_cdf__check(il_status,"IOM CDF READ ATT: ")    
    785855 
    786856                  iom_cdf__read_att_name=att_init(cl_name, sl_value(:)) 
     
    797867 
    798868                  CALL logger_error( & 
    799                   &  " IOM CDF READ ATT: not enough space to put attribute "//& 
    800                   &  TRIM(cl_name) ) 
     869                  &  " IOM CDF READ ATT: not enough space to put "//& 
     870                  &  "attribute "//TRIM(cl_name) ) 
    801871 
    802872               ELSE 
     
    806876                  &                      cl_name, & 
    807877                  &                      il_value(:)) 
    808                   CALL iom_cdf__check(il_status)    
     878                  CALL iom_cdf__check(il_status,"IOM CDF READ ATT: ")    
    809879 
    810880                  iom_cdf__read_att_name=att_init(cl_name, il_value(:)) 
     
    820890 
    821891                  CALL logger_error( & 
    822                   &  " IOM CDF READ ATT: not enough space to put attribute "//& 
    823                   &  TRIM(cl_name) ) 
     892                  &  " IOM CDF READ ATT: not enough space to put "//& 
     893                  &  "attribute "//TRIM(cl_name) ) 
    824894 
    825895               ELSE 
     
    829899                  &                      cl_name, & 
    830900                  &                      fl_value(:)) 
    831                   CALL iom_cdf__check(il_status)    
     901                  CALL iom_cdf__check(il_status,"IOM CDF READ ATT: ")    
    832902 
    833903                  iom_cdf__read_att_name=att_init(cl_name, fl_value(:)) 
     
    844914 
    845915                  CALL logger_error( & 
    846                   &  " IOM CDF READ ATT: not enough space to put attribute "//& 
    847                   &  TRIM(cl_name) ) 
     916                  &  " IOM CDF READ ATT: not enough space to put "//& 
     917                  &  "attribute "//TRIM(cl_name) ) 
    848918 
    849919               ELSE 
     
    853923                  &                      cl_name, & 
    854924                  &                      dl_value(:)) 
    855                   CALL iom_cdf__check(il_status)    
     925                  CALL iom_cdf__check(il_status,"IOM CDF READ ATT: ")    
    856926 
    857927                  iom_cdf__read_att_name=att_init(cl_name, dl_value(:)) 
     
    873943   ! 
    874944   !> @author J.Paul 
    875    !> - November, 2013- Initial Version 
     945   !> @date November, 2013 - Initial Version 
    876946   ! 
    877947   !> @param[in] td_file   file structure 
     
    902972         ! get attribute name 
    903973         il_status=NF90_INQ_ATTNAME(td_file%i_id, id_varid, id_attid, cl_name) 
    904          CALL iom_cdf__check(il_status) 
     974         CALL iom_cdf__check(il_status,"IOM CDF READ ATT: ") 
    905975 
    906976         ! read attribute 
     
    918988   ! 
    919989   !> @author J.Paul 
    920    !> - November, 2013- Initial Version 
     990   !> @date November, 2013 - Initial Version 
    921991   ! 
    922992   !> @param[in] td_file   file structure 
     
    9761046   ! 
    9771047   !> @author J.Paul 
    978    !> - November, 2013- Initial Version 
     1048   !> @date November, 2013 - Initial Version 
    9791049   ! 
    9801050   !> @param[in] td_file   file structure 
     
    10431113   ! 
    10441114   !> @author J.Paul 
    1045    !> - November, 2013- Initial Version 
     1115   !> @date November, 2013 - Initial Version 
    10461116   ! 
    10471117   !> @param[inout] td_file   file structure 
     
    10851155   ! 
    10861156   !> @author J.Paul 
    1087    !> - November, 2013- Initial Version 
     1157   !> @date November, 2013 - Initial Version 
    10881158   ! 
    10891159   !> @param[inout] td_file   file structure 
     
    11481218   ! 
    11491219   !> @author J.Paul 
    1150    !> - November, 2013- Initial Version 
     1220   !> @date November, 2013 - Initial Version 
    11511221   ! 
    11521222   !> @param[inout] td_file   file structure 
     
    11991269   ! 
    12001270   !> @author J.Paul 
    1201    !> - November, 2013- Initial Version 
     1271   !> @date November, 2013 - Initial Version 
    12021272   !> @date September, 2014 
    12031273   !> - force to use FillValue=1.e20 if no FillValue for coordinate variable. 
     1274   !> @date September, 2015 
     1275   !> - manage useless (dummy) attribute 
    12041276   ! 
    12051277   !> @param[in] td_file   file structure 
     
    12291301 
    12301302      ! loop indices 
     1303      INTEGER(i4) :: ji 
    12311304      !---------------------------------------------------------------- 
    12321305      ! check if file opened 
     
    12401313 
    12411314         ! inquire variable 
    1242          CALL logger_trace( & 
     1315         CALL logger_debug( & 
    12431316         &  " IOM CDF READ VAR META: inquire variable "//& 
    12441317         &  TRIM(fct_str(id_varid))//& 
     
    12531326         &                                il_dimid(:),& 
    12541327         &                                il_natt ) 
    1255          CALL iom_cdf__check(il_status) 
     1328         CALL iom_cdf__check(il_status,"IOM CDF READ VAR META: ") 
     1329 
    12561330         !!! fill variable dimension structure 
    1257          tl_dim(:)=iom_cdf__read_var_dim( td_file, il_ndim, il_dimid(:) ) 
     1331         tl_dim(:)=iom_cdf__read_var_dim( td_file, il_ndim, cl_name, il_dimid(:) ) 
     1332 
    12581333         IF( il_natt /= 0 )THEN 
    12591334            ALLOCATE( tl_att(il_natt) ) 
     
    12761351               ELSE 
    12771352                  ! create attribute _FillValue 
    1278                   SELECT CASE(TRIM(cl_name)) 
     1353                  SELECT CASE(TRIM(fct_lower(cl_name))) 
    12791354                     CASE DEFAULT 
    12801355                        CALL logger_info("IOM CDF READ VAR META: assume _FillValue is equal to "//& 
    12811356                        &                "zero for variable "//TRIM(cl_name) ) 
    12821357                        tl_fill=att_init('_FillValue',0.) 
    1283                      CASE('nav_lon','nav_lat', & 
     1358                     CASE('nav_lon','nav_lat', 'nav_lev', & 
    12841359                        &  'glamt','glamu','glamv','glamf', & 
    12851360                        &  'gphit','gphiu','gphiv','gphif') 
     
    13111386            ALLOCATE(tl_att(il_natt+1) ) 
    13121387            ! create attribute _FillValue 
    1313             SELECT CASE(TRIM(cl_name)) 
     1388            SELECT CASE(TRIM(fct_lower(cl_name))) 
    13141389               CASE DEFAULT 
    13151390                  CALL logger_info("IOM CDF READ VAR META: assume _FillValue is equal to "//& 
     
    13311406         &                                tl_att(:), id_id=id_varid ) 
    13321407 
     1408         !! look for dummy attribute 
     1409         DO ji=il_natt,1,-1 
     1410            IF( att_is_dummy(tl_att(ji)) )THEN 
     1411               CALL var_del_att(iom_cdf__read_var_meta, tl_att(ji)) 
     1412            ENDIF 
     1413         ENDDO 
     1414 
    13331415         ! clean 
    13341416         CALL dim_clean(tl_dim(:)) 
     
    13511433   !> So the array of dimension structure of a variable is always compose of 4 
    13521434   !> dimension (use or not).  
    1353    ! 
    1354    !> @author J.Paul 
    1355    !> - November, 2013- Initial Version 
    1356    ! 
     1435   !> 
     1436   !> @warn dummy dimension are not used.  
     1437   !> 
     1438   !> @author J.Paul 
     1439   !> @date November, 2013 - Initial Version 
     1440   !> @date July, 2015  
     1441   !> - Bug fix: use order to disorder table (see dim_init) 
     1442   !> @date September, 2015 
     1443   !> - check dummy dimension 
     1444   !> 
    13571445   !> @param[in] td_file   file structure 
    13581446   !> @param[in] id_ndim   number of dimension 
     1447   !> @param[in] cd_name   variable name 
    13591448   !> @param[in] id_dimid  array of dimension id 
    13601449   !> @return array dimension structure  
    13611450   !------------------------------------------------------------------- 
    1362    FUNCTION iom_cdf__read_var_dim(td_file, id_ndim, id_dimid) 
     1451   FUNCTION iom_cdf__read_var_dim(td_file, id_ndim, cd_name, id_dimid) 
    13631452      IMPLICIT NONE 
    13641453      ! Argument       
    13651454      TYPE(TFILE),               INTENT(IN) :: td_file 
    13661455      INTEGER(i4),               INTENT(IN) :: id_ndim 
     1456      CHARACTER(LEN=*)         , INTENT(IN) :: cd_name 
    13671457      INTEGER(i4), DIMENSION(:), INTENT(IN) :: id_dimid 
    13681458 
     
    13711461 
    13721462      ! local variable 
    1373       INTEGER(i4), DIMENSION(ip_maxdim) :: il_2xyzt 
     1463      INTEGER(i4), DIMENSION(ip_maxdim) :: il_xyzt2 
    13741464 
    13751465      TYPE(TDIM) , DIMENSION(ip_maxdim) :: tl_dim 
     
    13771467      ! loop indices 
    13781468      INTEGER(i4) :: ji 
     1469      INTEGER(i4) :: ii 
    13791470      !---------------------------------------------------------------- 
    13801471 
     
    13911482         CALL dim_clean(tl_dim(:)) 
    13921483 
    1393       ELSE IF( id_ndim > 0 .AND. id_ndim <= 4 )THEN 
    1394  
    1395  
     1484      ELSE IF( id_ndim > 0 )THEN 
     1485 
     1486 
     1487         ii=1 
    13961488         DO ji = 1, id_ndim 
    1397             CALL logger_trace( " IOM CDF READ VAR DIM: get variable dimension "//& 
    1398             &               TRIM(fct_str(ji)) ) 
    1399  
    1400             il_2xyzt(ji)=td_file%t_dim(id_dimid(ji))%i_2xyzt 
    1401  
    1402             ! read dimension information 
    1403             tl_dim(ji) = dim_init( td_file%t_dim(il_2xyzt(ji))%c_name, & 
    1404             &                      td_file%t_dim(il_2xyzt(ji))%i_len ) 
     1489 
     1490            !!! check no dummy dimension to be used 
     1491            IF( ANY(td_file%t_dim(:)%i_id == id_dimid(ji)) )THEN 
     1492               IF( ii > ip_maxdim )THEN 
     1493                  CALL logger_error(" IOM CDF READ VAR DIM: "//& 
     1494                  &  "too much dimensions for variable "//& 
     1495                  &  TRIM(cd_name)//". check dummy configuration file.") 
     1496               ENDIF 
     1497 
     1498               CALL logger_debug( " IOM CDF READ VAR DIM: get variable "//& 
     1499                  &  "dimension "//TRIM(fct_str(ji)) ) 
     1500 
     1501               il_xyzt2(ii)=td_file%t_dim(id_dimid(ji))%i_xyzt2 
     1502 
     1503               ! read dimension information 
     1504               tl_dim(ii) = dim_init( td_file%t_dim(il_xyzt2(ii))%c_name, & 
     1505               &                      td_file%t_dim(il_xyzt2(ii))%i_len ) 
     1506             
     1507               ii=ii+1 
     1508            ELSE 
     1509               CALL logger_debug( " IOM CDF READ VAR DIM: dummy variable "//& 
     1510               &  "dimension "//TRIM(fct_str(ji))//" not used." ) 
     1511            ENDIF 
    14051512         ENDDO 
    14061513 
    14071514         ! reorder dimension to ('x','y','z','t') 
    14081515         CALL dim_reorder(tl_dim(:)) 
    1409        
     1516  
    14101517         iom_cdf__read_var_dim(:)=dim_copy(tl_dim(:)) 
    14111518 
     
    14131520         CALL dim_clean(tl_dim(:)) 
    14141521 
    1415       ELSE 
    1416  
    1417          CALL logger_error(" IOM CDF READ VAR DIM: can't manage "//& 
    1418          &              TRIM(fct_str(id_ndim))//" dimension(s)" ) 
    1419  
    14201522      ENDIF 
    14211523 
     
    14261528   ! 
    14271529   !> @author J.Paul 
    1428    !> - November, 2013- Initial Version 
     1530   !> @date November, 2013 - Initial Version 
    14291531   ! 
    14301532   !> @param[in] td_file   file structure 
     
    14751577   ! 
    14761578   !> @author J.Paul 
    1477    !> - November, 2013- Initial Version 
     1579   !> @date November, 2013 - Initial Version 
     1580   !> @date June, 2015  
     1581   !> - use scale factor and offset, as soon as read variable value 
    14781582   ! 
    14791583   !> @param[in] td_file   file structure 
     
    14821586   !> @param[in] id_count  number of indices selected along each dimension 
    14831587   !> @return variable structure completed  
    1484    ! 
    1485    !> @todo 
    1486    !> - warning do not change fill value when use scale factor.. 
    14871588   !------------------------------------------------------------------- 
    14881589   SUBROUTINE iom_cdf__read_var_value(td_file, td_var, & 
     
    14961597 
    14971598      ! local variable 
    1498       INTEGER(i4)                       :: il_status 
    1499       INTEGER(i4)                       :: il_tmp1 
    1500       INTEGER(i4)                       :: il_tmp2 
    1501       INTEGER(i4)                       :: il_varid 
    1502       INTEGER(i4), DIMENSION(ip_maxdim) :: il_start 
    1503       INTEGER(i4), DIMENSION(ip_maxdim) :: il_count 
    1504       INTEGER(i4), DIMENSION(ip_maxdim) :: il_start_ord 
    1505       INTEGER(i4), DIMENSION(ip_maxdim) :: il_count_ord 
     1599      INTEGER(i4)                                    :: il_status 
     1600      INTEGER(i4)                                    :: il_tmp1 
     1601      INTEGER(i4)                                    :: il_tmp2 
     1602      INTEGER(i4)                                    :: il_varid 
     1603      INTEGER(i4), DIMENSION(ip_maxdim)              :: il_start 
     1604      INTEGER(i4), DIMENSION(ip_maxdim)              :: il_count 
     1605      INTEGER(i4), DIMENSION(ip_maxdim)              :: il_start_ord 
     1606      INTEGER(i4), DIMENSION(ip_maxdim)              :: il_count_ord 
     1607 
    15061608      REAL(dp)   , DIMENSION(:,:,:,:)  , ALLOCATABLE :: dl_value 
    15071609      REAL(dp)   , DIMENSION(:,:,:,:)  , ALLOCATABLE :: dl_tmp 
     
    15181620         IF( (       PRESENT(id_start)  .AND. (.NOT. PRESENT(id_count))) .OR. & 
    15191621             ((.NOT. PRESENT(id_start)) .AND.        PRESENT(id_count) ) )THEN 
    1520             CALL logger_warn( & 
    1521             &  "IOM CDF READ VAR VALUE: id_start and id_count should be both specify") 
     1622            CALL logger_warn( "IOM CDF READ VAR VALUE: id_start and id_count"//& 
     1623               & " should be both specify") 
    15221624         ENDIF 
    15231625         IF( PRESENT(id_start).AND.PRESENT(id_count) )THEN 
     
    15251627            IF( SIZE(id_start(:)) /= ip_maxdim .OR. & 
    15261628            &   SIZE(id_count(:)) /= ip_maxdim )THEN 
    1527                CALL logger_error("IOM CDF READ VAR: dimension of array start or count "//& 
    1528                &      " are invalid to read variable "//TRIM(td_var%c_name)//& 
    1529                &      " in file "//TRIM(td_file%c_name) ) 
     1629               CALL logger_error("IOM CDF READ VAR: dimension of array start"//& 
     1630                  &  " or count are invalid to read variable "//& 
     1631                  &  TRIM(td_var%c_name)//" in file "//TRIM(td_file%c_name) ) 
    15301632            ENDIF 
    15311633 
     
    15641666            &    td_var%t_dim( 4 )%i_len & 
    15651667            &                                            /)) )THEN 
    1566  
    1567             CALL logger_error( "IOM CDF READ VAR VALUE: start + count exceed "//& 
    1568             &  "variable dimension for "//TRIM(td_var%c_name) ) 
    15691668 
    15701669            DO ji = 1, ip_maxdim 
     
    15751674               &  TRIM(fct_str(il_tmp2))) 
    15761675            ENDDO 
     1676            CALL logger_error( "IOM CDF READ VAR VALUE: start + count exceed "//& 
     1677            &  "variable dimension for "//TRIM(td_var%c_name) ) 
    15771678 
    15781679         ELSE 
    15791680 
    1580             ! Allocate space to hold variable value (unorder) 
     1681            ! Allocate space to hold variable value (disorder) 
    15811682            ALLOCATE(dl_value( il_count(1), & 
    15821683               &               il_count(2), & 
     
    16011702            &                                       start = il_start(:),& 
    16021703            &                                       count = il_count(:) ) 
    1603             CALL iom_cdf__check(il_status) 
     1704            CALL iom_cdf__check(il_status,"IOM CDF READ VAR VALUE: ") 
    16041705 
    16051706            ! Allocate space to hold variable value in structure 
     
    16631764               CALL var_chg_FillValue(td_var) 
    16641765            ENDIF 
     1766 
     1767            ! use scale factor and offset 
     1768            WHERE( td_var%d_value(:,:,:,:) /= td_var%d_fill ) 
     1769               td_var%d_value(:,:,:,:) = & 
     1770               &  td_var%d_value(:,:,:,:)*td_var%d_scf + td_var%d_ofs 
     1771            END WHERE 
     1772 
    16651773         ENDIF 
    16661774      ELSE 
     
    16731781   !------------------------------------------------------------------- 
    16741782   !> @brief This subroutine write file structure in an opened netcdf file. 
    1675    ! 
    1676    !> @author J.Paul 
    1677    !> - November, 2013- Initial Version 
     1783   !> 
     1784   !> @details 
     1785   !> optionally, you could specify dimension order (default 'xyzt') 
     1786   !> 
     1787   !> @author J.Paul 
     1788   !> @date November, 2013 - Initial Version 
     1789   !> @date July, 2015  
     1790   !> - add dimension order option  
    16781791   ! 
    16791792   !> @param[inout] td_file   file structure 
    16801793   !------------------------------------------------------------------- 
    1681    SUBROUTINE iom_cdf_write_file(td_file) 
    1682       IMPLICIT NONE 
    1683       ! Argument       
    1684       TYPE(TFILE), INTENT(INOUT) :: td_file 
     1794   SUBROUTINE iom_cdf_write_file(td_file, cd_dimorder) 
     1795      IMPLICIT NONE 
     1796      ! Argument       
     1797      TYPE(TFILE)     , INTENT(INOUT) :: td_file 
     1798      CHARACTER(LEN=*), INTENT(IN   ), OPTIONAL :: cd_dimorder 
    16851799 
    16861800      ! local variable 
    16871801      INTEGER(i4), DIMENSION(:), ALLOCATABLE :: il_value 
     1802 
     1803      CHARACTER(LEN=lc)                      :: cl_dimorder 
    16881804 
    16891805      TYPE(TVAR)                             :: tl_var 
     
    16941810      INTEGER(i4) :: ji 
    16951811      INTEGER(i4) :: jj 
    1696       !---------------------------------------------------------------- 
     1812      INTEGER(i4) :: jvar 
     1813      !---------------------------------------------------------------- 
     1814 
     1815      cl_dimorder='xyzt' 
     1816      IF( PRESENT(cd_dimorder) ) cl_dimorder=TRIM(cd_dimorder) 
    16971817 
    16981818      ! check if file opened 
     
    17261846            ENDIF 
    17271847 
     1848            ! change dimension order 
     1849            IF( TRIM(cl_dimorder) /= 'xyzt' )THEN 
     1850               CALL dim_reorder(td_file%t_dim(:),TRIM(cl_dimorder)) 
     1851               DO jvar=1,td_file%i_nvar 
     1852                  CALL logger_debug("VAR REORDER: "//TRIM(td_file%t_var(jvar)%c_name)) 
     1853                  CALL var_reorder(td_file%t_var(jvar),TRIM(cl_dimorder)) 
     1854               ENDDO 
     1855            ENDIF 
     1856 
    17281857            ! write dimension in file 
    17291858            DO ji = 1, ip_maxdim 
     
    17761905   ! 
    17771906   !> @author J.Paul 
    1778    !> - November, 2013- Initial Version 
     1907   !> @date November, 2013 - Initial Version 
    17791908   ! 
    17801909   !> @param[inout] td_file   file structure 
     
    17981927         ! Enter define mode 
    17991928         il_status=NF90_REDEF(td_file%i_id) 
    1800          CALL iom_cdf__check(il_status) 
     1929         CALL iom_cdf__check(il_status,"IOM CDF WRITE FILE DIM: ") 
    18011930 
    18021931         td_file%l_def=.TRUE. 
     
    18131942            il_status=NF90_DEF_DIM(td_file%i_id, fct_upper(td_dim%c_sname), & 
    18141943            &                      NF90_UNLIMITED, td_dim%i_id) 
    1815             CALL iom_cdf__check(il_status) 
     1944            CALL iom_cdf__check(il_status,"IOM CDF WRITE FILE DIM: ") 
    18161945 
    18171946         ELSE 
    18181947            ! write not unlimited dimension 
    1819             CALL logger_trace( & 
     1948            CALL logger_debug( & 
    18201949            &  "IOM CDF WRITE FILE DIM: write dimension "//TRIM(td_dim%c_name)//& 
    18211950            &  " in file "//TRIM(td_file%c_name)) 
     
    18231952            il_status=NF90_DEF_DIM(td_file%i_id, fct_upper(td_dim%c_sname), & 
    18241953            &                      td_dim%i_len, td_dim%i_id) 
    1825             CALL iom_cdf__check(il_status) 
     1954            CALL iom_cdf__check(il_status,"IOM CDF WRITE FILE DIM: ") 
    18261955 
    18271956         ENDIF 
     
    18341963   ! 
    18351964   !> @author J.Paul 
    1836    !> - November, 2013- Initial Version 
     1965   !> @date November, 2013 - Initial Version 
    18371966   ! 
    18381967   !> @param[inout] td_file   file structure 
     
    18591988         ! Enter define mode 
    18601989         il_status=NF90_REDEF(td_file%i_id) 
    1861          CALL iom_cdf__check(il_status) 
     1990         CALL iom_cdf__check(il_status,"IOM CDF WRITE FILE ATT: ") 
    18621991 
    18631992         td_file%l_def=.TRUE. 
     
    18762005            il_status = NF90_PUT_ATT(td_file%i_id, id_varid, & 
    18772006            &  td_att%c_name, td_att%c_value ) 
    1878             CALL iom_cdf__check(il_status) 
     2007            CALL iom_cdf__check(il_status,"IOM CDF WRITE FILE ATT: ") 
    18792008 
    18802009         CASE(NF90_BYTE, NF90_SHORT, NF90_INT, NF90_FLOAT, NF90_DOUBLE) 
     
    18822011            il_status = NF90_PUT_ATT(td_file%i_id, id_varid, & 
    18832012            &  td_att%c_name, td_att%d_value ) 
    1884             CALL iom_cdf__check(il_status) 
     2013            CALL iom_cdf__check(il_status,"IOM CDF WRITE FILE ATT: ") 
    18852014 
    18862015      END SELECT 
     
    18912020   ! 
    18922021   !> @author J.Paul 
    1893    !> - November, 2013- Initial Version 
     2022   !> @date November, 2013 - Initial Version 
     2023   !> @date September, 2015 
     2024   !> - do not force to use zero as FillValue for any meshmask variable 
    18942025   ! 
    18952026   !> @param[inout] td_file   file structure 
     
    19172048         ! Enter define mode 
    19182049         il_status=NF90_REDEF(td_file%i_id) 
    1919          CALL iom_cdf__check(il_status) 
     2050         CALL iom_cdf__check(il_status,"IOM CDF WRITE VAR: ") 
    19202051 
    19212052         td_file%l_def=.TRUE. 
    19222053 
    19232054      ENDIF 
    1924        
     2055  
    19252056      ! check if file and variable dimension conform 
    19262057      IF( file_check_var_dim(td_file, td_var) )THEN 
    1927  
    1928          ! check variable dimension expected 
    1929          CALL var_check_dim(td_var) 
    19302058 
    19312059         ll_chg=.TRUE. 
     
    19382066            ENDIF 
    19392067         ENDDO 
     2068         ! ugly patch until NEMO do not force to use 0. as FillValue  
    19402069         IF( ll_chg )THEN 
    19412070            ! not a dimension variable 
    19422071            ! change FillValue 
    1943  
    1944             ! ugly patch until NEMO do not force to use 0. as FillValue  
    1945             CALL var_chg_FillValue(td_var,0._dp) 
     2072            SELECT CASE( TRIM(fct_lower(td_var%c_name)) ) 
     2073               CASE DEFAULT 
     2074                  CALL var_chg_FillValue(td_var,0._dp) 
     2075               CASE('nav_lon','nav_lat', & 
     2076                  & 'glamt','glamu','glamv','glamf', & 
     2077                  & 'gphit','gphiu','gphiv','gphif', & 
     2078                  & 'e1t','e1u','e1v','e1f',         & 
     2079                  & 'e2t','e2u','e2v','e2f','ff',    & 
     2080                  & 'gcost','gcosu','gcosv','gcosf', & 
     2081                  & 'gsint','gsinu','gsinv','gsinf', & 
     2082                  & 'mbathy','misf','isf_draft',     & 
     2083                  & 'hbatt','hbatu','hbatv','hbatf', & 
     2084                  & 'gsigt','gsigu','gsigv','gsigf', & 
     2085                  & 'e3t_0','e3u_0','e3v_0','e3w_0', & 
     2086                  & 'e3f_0','gdepw_1d','gdept_1d',   & 
     2087                  & 'e3tp','e3wp','gdepw_0','rx1',   & 
     2088                  & 'gdept_0','gdepu','gdepv',       & 
     2089                  & 'hdept','hdepw','e3w_1d','e3t_1d',& 
     2090                  & 'tmask','umask','vmask','fmask'  ) 
     2091                  ! do not change for coordinates and meshmask variables 
     2092            END SELECT 
    19462093         ENDIF 
    19472094 
     
    19572104            ! Leave define mode 
    19582105            il_status=NF90_ENDDEF(td_file%i_id) 
    1959             CALL iom_cdf__check(il_status) 
     2106            CALL iom_cdf__check(il_status,"IOM CDF WRITE VAR: ") 
    19602107 
    19612108            td_file%l_def=.FALSE. 
     
    19752122   ! 
    19762123   !> @author J.Paul 
    1977    !> - November, 2013- Initial Version 
     2124   !> @date November, 2013 - Initial Version 
    19782125   ! 
    19792126   !> @param[in] td_file   file structure 
     
    20022149      tl_var=var_copy(td_var) 
    20032150 
     2151      ! forced to use float type 
     2152      IF( tl_var%d_unf /= 1. .AND. tl_var%i_type==NF90_SHORT )THEN 
     2153         tl_var%i_type=NF90_FLOAT 
     2154      ENDIF 
     2155 
    20042156      IF( ALL( .NOT. tl_var%t_dim(:)%l_use ) )THEN 
     2157         CALL logger_debug( & 
     2158         &  "IOM CDF WRITE VAR DEF scalar: define variable "//& 
     2159         &  TRIM(tl_var%c_name)//" in file "//TRIM(td_file%c_name)) 
    20052160         ! scalar value 
    20062161         il_status = NF90_DEF_VAR(td_file%i_id, TRIM(tl_var%c_name), & 
    20072162         &                        tl_var%i_type, varid=iom_cdf__write_var_def)  
    2008          CALL iom_cdf__check(il_status) 
     2163         CALL iom_cdf__check(il_status,"IOM CDF WRITE VAR DEF: ") 
    20092164      ELSE 
    20102165 
     
    20202175         ENDDO 
    20212176 
    2022          CALL logger_trace( & 
     2177         CALL logger_debug( & 
    20232178         &  "IOM CDF WRITE VAR DEF: define dimension to be used for variable "//& 
    20242179         &  TRIM(tl_var%c_name)//" in file "//TRIM(td_file%c_name)) 
    20252180 
    20262181         DO ji=1,jj 
    2027             CALL logger_trace("IOM CDF WRITE VAR DEF: dimid "//TRIM(fct_str(il_dimid(ji))) ) 
     2182            CALL logger_debug("IOM CDF WRITE VAR DEF: dimid "//TRIM(fct_str(il_dimid(ji))) ) 
    20282183         ENDDO 
     2184 
    20292185         il_status = NF90_DEF_VAR(td_file%i_id, TRIM(tl_var%c_name),     & 
    20302186         &                        tl_var%i_type,                         & 
    20312187         &                        il_dimid(1:jj),                        & 
    20322188         &                        varid=iom_cdf__write_var_def           ) 
    2033          CALL iom_cdf__check(il_status) 
     2189         CALL iom_cdf__check(il_status,"IOM CDF WRITE VAR DEF: ") 
    20342190      ENDIF 
    20352191 
     
    20432199 
    20442200      DO ji = 1, tl_var%i_natt 
    2045          CALL logger_trace( & 
     2201         CALL logger_debug( & 
    20462202         &  " IOM CDF WRITE VAR DEF: put attribute "//TRIM(tl_var%t_att(ji)%c_name)//& 
    20472203         &  " for variable "//TRIM(tl_var%c_name)//& 
    20482204         &  " in file "//TRIM(td_file%c_name) ) 
    20492205 
    2050          IF( tl_var%t_att(ji)%i_type == NF90_CHAR )THEN 
    2051             IF( TRIM(tl_var%t_att(ji)%c_value) /= '' )THEN 
    2052                il_status = NF90_PUT_ATT(td_file%i_id, iom_cdf__write_var_def, & 
    2053                &                        TRIM(tl_var%t_att(ji)%c_name),        & 
    2054                &                        TRIM(tl_var%t_att(ji)%c_value)        ) 
    2055                CALL iom_cdf__check(il_status) 
    2056             ENDIF 
    2057          ELSE 
    2058             SELECT CASE(tl_var%t_att(ji)%i_type) 
    2059                CASE(NF90_BYTE) 
    2060                   il_status = NF90_PUT_ATT(td_file%i_id,                   & 
    2061                   &                        iom_cdf__write_var_def,         & 
    2062                   &                        TRIM(tl_var%t_att(ji)%c_name),  & 
    2063                   &                        INT(tl_var%t_att(ji)%d_value(:),i1)) 
    2064                CASE(NF90_SHORT) 
    2065                   il_status = NF90_PUT_ATT(td_file%i_id,                   & 
    2066                   &                        iom_cdf__write_var_def,         & 
    2067                   &                        TRIM(tl_var%t_att(ji)%c_name),  & 
    2068                   &                        INT(tl_var%t_att(ji)%d_value(:),i2)) 
    2069                CASE(NF90_INT) 
    2070                   il_status = NF90_PUT_ATT(td_file%i_id,                   & 
    2071                   &                        iom_cdf__write_var_def,         & 
    2072                   &                        TRIM(tl_var%t_att(ji)%c_name),  & 
    2073                   &                        INT(tl_var%t_att(ji)%d_value(:),i4)) 
    2074                CASE(NF90_FLOAT) 
    2075                   il_status = NF90_PUT_ATT(td_file%i_id,                   & 
    2076                   &                        iom_cdf__write_var_def,         & 
    2077                   &                        TRIM(tl_var%t_att(ji)%c_name),  & 
    2078                   &                        REAL(tl_var%t_att(ji)%d_value(:),sp)) 
    2079                CASE(NF90_DOUBLE) 
    2080                   il_status = NF90_PUT_ATT(td_file%i_id,                   & 
    2081                   &                        iom_cdf__write_var_def,         & 
    2082                   &                        TRIM(tl_var%t_att(ji)%c_name),  & 
    2083                   &                        REAL(tl_var%t_att(ji)%d_value(:),dp)) 
    2084                END SELECT 
    2085             CALL iom_cdf__check(il_status) 
     2206         ! forced FillValue to have same type than variable 
     2207         IF( TRIM(tl_var%t_att(ji)%c_name) == '_FillValue' )THEN 
     2208            tl_var%t_att(ji)%i_type=tl_var%i_type 
    20862209         ENDIF 
     2210 
     2211         SELECT CASE(tl_var%t_att(ji)%i_type) 
     2212            CASE(NF90_CHAR) 
     2213               IF( TRIM(tl_var%t_att(ji)%c_value) /= '' )THEN 
     2214                  il_status = NF90_PUT_ATT(td_file%i_id, iom_cdf__write_var_def, & 
     2215                  &                        TRIM(tl_var%t_att(ji)%c_name),        & 
     2216                  &                        TRIM(tl_var%t_att(ji)%c_value)        ) 
     2217               ENDIF 
     2218            CASE(NF90_BYTE) 
     2219               il_status = NF90_PUT_ATT(td_file%i_id,                   & 
     2220               &                        iom_cdf__write_var_def,         & 
     2221               &                        TRIM(tl_var%t_att(ji)%c_name),  & 
     2222               &                        INT(tl_var%t_att(ji)%d_value(:),i1)) 
     2223            CASE(NF90_SHORT) 
     2224               il_status = NF90_PUT_ATT(td_file%i_id,                   & 
     2225               &                        iom_cdf__write_var_def,         & 
     2226               &                        TRIM(tl_var%t_att(ji)%c_name),  & 
     2227               &                        INT(tl_var%t_att(ji)%d_value(:),i2)) 
     2228            CASE(NF90_INT) 
     2229               il_status = NF90_PUT_ATT(td_file%i_id,                   & 
     2230               &                        iom_cdf__write_var_def,         & 
     2231               &                        TRIM(tl_var%t_att(ji)%c_name),  & 
     2232               &                        INT(tl_var%t_att(ji)%d_value(:),i4)) 
     2233            CASE(NF90_FLOAT) 
     2234               il_status = NF90_PUT_ATT(td_file%i_id,                   & 
     2235               &                        iom_cdf__write_var_def,         & 
     2236               &                        TRIM(tl_var%t_att(ji)%c_name),  & 
     2237               &                        REAL(tl_var%t_att(ji)%d_value(:),sp)) 
     2238            CASE(NF90_DOUBLE) 
     2239               il_status = NF90_PUT_ATT(td_file%i_id,                   & 
     2240               &                        iom_cdf__write_var_def,         & 
     2241               &                        TRIM(tl_var%t_att(ji)%c_name),  & 
     2242               &                        REAL(tl_var%t_att(ji)%d_value(:),dp)) 
     2243         END SELECT 
     2244         CALL iom_cdf__check(il_status,"IOM CDF WRITE VAR DEF: ") 
     2245 
    20872246      ENDDO 
    20882247 
     
    20972256   ! 
    20982257   !> @author J.Paul 
    2099    !> - November, 2013- Initial Version 
     2258   !> @date November, 2013 - Initial Version 
     2259   !> @date June, 2015 
     2260   !> - reuse scale factor and offset, before writing variable 
    21002261   ! 
    21012262   !> @param[in] td_file   file structure 
     
    21222283      &  "IOM CDF WRITE VAR VALUE: get dimension to be used for variable "//& 
    21232284      &  TRIM(td_var%c_name)//" in file "//TRIM(td_file%c_name)) 
     2285    
     2286      ! use scale factor and offset 
     2287      WHERE( td_var%d_value(:,:,:,:) /= td_var%d_fill ) 
     2288         td_var%d_value(:,:,:,:) = & 
     2289         &  (td_var%d_value(:,:,:,:)-td_var%d_ofs)/td_var%d_scf 
     2290      END WHERE 
    21242291 
    21252292      jj=0 
     
    21482315 
    21492316      ! put value 
    2150       CALL logger_trace( & 
     2317      CALL logger_debug( & 
    21512318      &  "IOM CDF WRITE VAR VALUE: put "//TRIM(td_var%c_name)//" value "//& 
    21522319      &  "in file "//TRIM(td_file%c_name)) 
    21532320 
    21542321      il_status = NF90_PUT_VAR( td_file%i_id, td_var%i_id, dl_value(:,:,:,:)) 
    2155       CALL iom_cdf__check(il_status) 
     2322      CALL iom_cdf__check(il_status,"IOM CDF WRITE VAR VALUE ("//& 
     2323         &  TRIM(td_var%c_name)//") :" ) 
    21562324 
    21572325      DEALLOCATE( dl_value ) 
Note: See TracChangeset for help on using the changeset viewer.