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 7731 for branches/UKMO/dev_r5518_v3.6_asm_nemovar_community/NEMOGCM/TOOLS/SIREN/src/iom_cdf.f90 – NEMO

Ignore:
Timestamp:
2017-02-23T14:23:32+01:00 (7 years ago)
Author:
dford
Message:

Merge in revisions 6625:7726 of dev_r5518_v3.4_asm_nemovar_community, so this branch will be identical to revison 7726 of dev_r5518_v3.6_asm_nemovar_community.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/UKMO/dev_r5518_v3.6_asm_nemovar_community/NEMOGCM/TOOLS/SIREN/src/iom_cdf.f90

    r5037 r7731  
    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         !NF90_WRITE,               & 
     217            CALL iom_cdf__check(il_status," IOM CDF CREATE: ") 
    209218 
    210219            td_file%l_def=.TRUE. 
     
    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 
     241               CALL logger_trace("IOM CDF OPEN "//TRIM(td_file%c_name)//" "//& 
     242                  &  TRIM(fct_str(td_file%i_id))) 
    233243            ELSE 
    234244 
     
    239249               &                      NF90_WRITE,           & 
    240250               &                      td_file%i_id) 
    241                CALL iom_cdf__check(il_status) 
     251               CALL iom_cdf__check(il_status,"IOM CDF OPEN: ") 
    242252 
    243253            ENDIF 
     
    267277   !> 
    268278   !> @author J.Paul 
    269    !> - November, 2013- Initial Version 
     279   !> @date November, 2013 - Initial Version 
    270280   ! 
    271281   !> @param[inout] td_file   file structure 
     
    291301 
    292302         il_status = NF90_CLOSE(td_file%i_id) 
    293          CALL iom_cdf__check(il_status) 
     303         CALL iom_cdf__check(il_status,"IOM CDF CLOSE: ") 
    294304 
    295305         td_file%i_id = 0 
     
    307317   !> 
    308318   !> @author J.Paul 
    309    !> - November, 2013- Initial Version 
     319   !> @date November, 2013 - Initial Version 
    310320   ! 
    311321   !> @param[inout] td_file   file structure 
     
    326336      il_status=NF90_INQUIRE(td_file%i_id, td_file%i_ndim, & 
    327337      &     td_file%i_nvar, td_file%i_natt, td_file%i_uldid, il_fmt) 
    328       CALL iom_cdf__check(il_status) 
     338      CALL iom_cdf__check(il_status,"IOM CDF GET INFO: ") 
    329339 
    330340      SELECT CASE(il_fmt) 
     
    345355   ! 
    346356   !> @author J.Paul 
    347    !> - November, 2013- Initial Version 
     357   !> @date November, 2013 - Initial Version 
    348358   ! 
    349359   !> @param[inout] td_file   file structure 
     
    396406   ! 
    397407   !> @author J.Paul 
    398    !> - November, 2013- Initial Version 
     408   !> @date November, 2013 - Initial Version 
    399409   !> @date September, 2014 
    400410   !> - use attribute periodicity read from the file if present. 
     
    439449   ! 
    440450   !> @author J.Paul 
    441    !> - November, 2013- Initial Version 
     451   !> @date November, 2013 - Initial Version 
    442452   ! 
    443453   !> @param[inout] td_file   file structure 
     
    480490 
    481491            ! look for depth id 
    482             IF( INDEX(TRIM(td_file%t_var(ji)%c_name),'depth') /= 0 )THEN 
     492            IF( INDEX(TRIM(fct_lower(td_file%t_var(ji)%c_name)),'depth')/=0 )THEN 
    483493               IF( td_file%i_depthid == 0 )THEN 
    484494                  td_file%i_depthid=ji 
    485495               ELSE 
    486496                  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) ) 
     497                     CALL logger_error("IOM CDF GET FILE VAR: find more"//& 
     498                        &  " than one depth variable in file "//& 
     499                        &  TRIM(td_file%c_name) ) 
    490500                  ENDIF 
    491501               ENDIF 
     
    493503 
    494504            ! look for time id 
    495             IF( INDEX(TRIM(td_file%t_var(ji)%c_name),'time') /= 0 )THEN 
     505            IF( INDEX(TRIM(fct_lower(td_file%t_var(ji)%c_name)),'time')/=0 )THEN 
    496506               IF( td_file%i_timeid == 0 )THEN 
    497507                  td_file%i_timeid=ji 
     
    504514                     td_file%i_timeid=ji 
    505515                  !ELSE 
    506                   !   print *,'error' 
    507                   !   CALL logger_error("IOM OPEN: find more than one "//& 
    508                   !   &                 "time variable in file "//& 
     516                  !   CALL logger_error("IOM CDF GET FILE VAR: find more "//& 
     517                  !   &                 "than one time variable in file "//& 
    509518                  !   &                 TRIM(td_file%c_name) ) 
    510519                  ENDIF 
     
    526535   ! 
    527536   !> @author J.Paul 
    528    !> - November, 2013- Initial Version 
     537   !> @date November, 2013 - Initial Version 
    529538   ! 
    530539   !> @param[inout] td_file   file structure 
     
    567576   ! 
    568577   !> @author J.Paul 
    569    !> - November, 2013- Initial Version 
     578   !> @date November, 2013 - Initial Version 
     579   !> @date February, 2015 - create unused dimension, when reading dimension 
     580   !> of length less or equal to zero 
    570581   ! 
    571582   !> @param[in] td_file   file structure 
     
    583594      INTEGER(i4)       :: il_len 
    584595      CHARACTER(LEN=lc) :: cl_name 
     596      LOGICAL           :: ll_use 
    585597      !---------------------------------------------------------------- 
    586598 
     
    601613         il_status=NF90_INQUIRE_DIMENSION(td_file%i_id, id_dimid, & 
    602614         &                                cl_name, il_len ) 
    603          CALL iom_cdf__check(il_status) 
    604  
    605          iom_cdf__read_dim_id=dim_init(cl_name, il_len) 
     615         CALL iom_cdf__check(il_status,"IOM CDF READ DIM: ") 
     616 
     617         ll_use=.TRUE. 
     618         IF( il_len <= 0 )THEN 
     619            CALL logger_warn( & 
     620         &  " IOM CDF READ DIM: dimension "//TRIM(fct_str(id_dimid))//& 
     621         &  " in file "//TRIM(td_file%c_name)//" is less or equel to zero") 
     622            il_len=1 
     623            ll_use=.FALSE. 
     624         ENDIF 
     625         iom_cdf__read_dim_id=dim_init(cl_name, il_len, ld_use=ll_use) 
    606626 
    607627      ENDIF 
     
    613633   ! 
    614634   !> @author J.Paul 
    615    !> - November, 2013- Initial Version 
     635   !> @date November, 2013 - Initial Version 
    616636   ! 
    617637   !> @param[in] td_file   file structure 
     
    634654 
    635655         CALL logger_error( & 
    636          &  " IOM CDF READ DIM: no id associated to file "//TRIM(td_file%c_name)) 
     656         &  " IOM CDF READ DIM: no id associated to file "//& 
     657         &  TRIM(td_file%c_name)) 
    637658 
    638659      ELSE       
     
    640661         il_status=NF90_INQ_DIMID( td_file%i_id, TRIM(ADJUSTL(cd_name)), & 
    641662         &                         il_dimid) 
    642          CALL iom_cdf__check(il_status) 
     663         CALL iom_cdf__check(il_status,"IOM CDF READ DIM: ") 
    643664 
    644665         iom_cdf__read_dim_name=iom_cdf_read_dim(td_file, il_dimid) 
     
    652673   ! 
    653674   !> @author J.Paul 
    654    !> - November, 2013- Initial Version 
     675   !> @date November, 2013 - Initial Version 
    655676   ! 
    656677   !> @param[in] td_file   file structure 
     
    714735         &                                il_len, & 
    715736         &                                il_attid ) 
    716          CALL iom_cdf__check(il_status) 
     737         CALL iom_cdf__check(il_status,"IOM CDF READ ATT: ") 
    717738 
    718739         !! get attribute value 
    719          CALL logger_debug( " IOM CDF READ ATT: get attribute "//TRIM(cl_name)//& 
    720          &               " in file "//TRIM(td_file%c_name)) 
     740         CALL logger_debug( " IOM CDF READ ATT: get attribute "//& 
     741            &            TRIM(cl_name)//" in file "//TRIM(td_file%c_name)) 
    721742 
    722743         SELECT CASE( il_type ) 
     
    728749 
    729750                  CALL logger_error( & 
    730                   &  " IOM CDF READ ATT: not enough space to put attribute "//& 
    731                   &  TRIM(cl_name) ) 
     751                  &  " IOM CDF READ ATT: not enough space to put "//& 
     752                  &  "attribute "//TRIM(cl_name) ) 
    732753 
    733754               ELSE 
     
    737758                  &                      cl_name, & 
    738759                  &                      cl_value ) 
    739                   CALL iom_cdf__check(il_status) 
     760                  CALL iom_cdf__check(il_status,"IOM CDF READ ATT: ") 
    740761 
    741762                  iom_cdf__read_att_name=att_init(cl_name, cl_value) 
     
    758779                  &                      cl_name, & 
    759780                  &                      bl_value(:)) 
    760                   CALL iom_cdf__check(il_status)    
     781                  CALL iom_cdf__check(il_status,"IOM CDF READ ATT: ")    
    761782 
    762783                  iom_cdf__read_att_name=att_init(cl_name, bl_value(:)) 
     
    773794 
    774795                  CALL logger_error( & 
    775                   &  " IOM CDF READ ATT: not enough space to put attribute "//& 
    776                   &  TRIM(cl_name) ) 
     796                  &  " IOM CDF READ ATT: not enough space to put "//& 
     797                  &  "attribute "//TRIM(cl_name) ) 
    777798 
    778799               ELSE 
     
    782803                  &                      cl_name, & 
    783804                  &                      sl_value(:)) 
    784                   CALL iom_cdf__check(il_status)    
     805                  CALL iom_cdf__check(il_status,"IOM CDF READ ATT: ")    
    785806 
    786807                  iom_cdf__read_att_name=att_init(cl_name, sl_value(:)) 
     
    797818 
    798819                  CALL logger_error( & 
    799                   &  " IOM CDF READ ATT: not enough space to put attribute "//& 
    800                   &  TRIM(cl_name) ) 
     820                  &  " IOM CDF READ ATT: not enough space to put "//& 
     821                  &  "attribute "//TRIM(cl_name) ) 
    801822 
    802823               ELSE 
     
    806827                  &                      cl_name, & 
    807828                  &                      il_value(:)) 
    808                   CALL iom_cdf__check(il_status)    
     829                  CALL iom_cdf__check(il_status,"IOM CDF READ ATT: ")    
    809830 
    810831                  iom_cdf__read_att_name=att_init(cl_name, il_value(:)) 
     
    820841 
    821842                  CALL logger_error( & 
    822                   &  " IOM CDF READ ATT: not enough space to put attribute "//& 
    823                   &  TRIM(cl_name) ) 
     843                  &  " IOM CDF READ ATT: not enough space to put "//& 
     844                  &  "attribute "//TRIM(cl_name) ) 
    824845 
    825846               ELSE 
     
    829850                  &                      cl_name, & 
    830851                  &                      fl_value(:)) 
    831                   CALL iom_cdf__check(il_status)    
     852                  CALL iom_cdf__check(il_status,"IOM CDF READ ATT: ")    
    832853 
    833854                  iom_cdf__read_att_name=att_init(cl_name, fl_value(:)) 
     
    844865 
    845866                  CALL logger_error( & 
    846                   &  " IOM CDF READ ATT: not enough space to put attribute "//& 
    847                   &  TRIM(cl_name) ) 
     867                  &  " IOM CDF READ ATT: not enough space to put "//& 
     868                  &  "attribute "//TRIM(cl_name) ) 
    848869 
    849870               ELSE 
     
    853874                  &                      cl_name, & 
    854875                  &                      dl_value(:)) 
    855                   CALL iom_cdf__check(il_status)    
     876                  CALL iom_cdf__check(il_status,"IOM CDF READ ATT: ")    
    856877 
    857878                  iom_cdf__read_att_name=att_init(cl_name, dl_value(:)) 
     
    873894   ! 
    874895   !> @author J.Paul 
    875    !> - November, 2013- Initial Version 
     896   !> @date November, 2013 - Initial Version 
    876897   ! 
    877898   !> @param[in] td_file   file structure 
     
    902923         ! get attribute name 
    903924         il_status=NF90_INQ_ATTNAME(td_file%i_id, id_varid, id_attid, cl_name) 
    904          CALL iom_cdf__check(il_status) 
     925         CALL iom_cdf__check(il_status,"IOM CDF READ ATT: ") 
    905926 
    906927         ! read attribute 
     
    918939   ! 
    919940   !> @author J.Paul 
    920    !> - November, 2013- Initial Version 
     941   !> @date November, 2013 - Initial Version 
    921942   ! 
    922943   !> @param[in] td_file   file structure 
     
    976997   ! 
    977998   !> @author J.Paul 
    978    !> - November, 2013- Initial Version 
     999   !> @date November, 2013 - Initial Version 
    9791000   ! 
    9801001   !> @param[in] td_file   file structure 
     
    10431064   ! 
    10441065   !> @author J.Paul 
    1045    !> - November, 2013- Initial Version 
     1066   !> @date November, 2013 - Initial Version 
    10461067   ! 
    10471068   !> @param[inout] td_file   file structure 
     
    10851106   ! 
    10861107   !> @author J.Paul 
    1087    !> - November, 2013- Initial Version 
     1108   !> @date November, 2013 - Initial Version 
    10881109   ! 
    10891110   !> @param[inout] td_file   file structure 
     
    11481169   ! 
    11491170   !> @author J.Paul 
    1150    !> - November, 2013- Initial Version 
     1171   !> @date November, 2013 - Initial Version 
    11511172   ! 
    11521173   !> @param[inout] td_file   file structure 
     
    11991220   ! 
    12001221   !> @author J.Paul 
    1201    !> - November, 2013- Initial Version 
     1222   !> @date November, 2013 - Initial Version 
    12021223   !> @date September, 2014 
    12031224   !> - force to use FillValue=1.e20 if no FillValue for coordinate variable. 
     
    12401261 
    12411262         ! inquire variable 
    1242          CALL logger_trace( & 
     1263         CALL logger_debug( & 
    12431264         &  " IOM CDF READ VAR META: inquire variable "//& 
    12441265         &  TRIM(fct_str(id_varid))//& 
     
    12531274         &                                il_dimid(:),& 
    12541275         &                                il_natt ) 
    1255          CALL iom_cdf__check(il_status) 
     1276         CALL iom_cdf__check(il_status,"IOM CDF READ VAR META: ") 
    12561277         !!! fill variable dimension structure 
    12571278         tl_dim(:)=iom_cdf__read_var_dim( td_file, il_ndim, il_dimid(:) ) 
     1279 
    12581280         IF( il_natt /= 0 )THEN 
    12591281            ALLOCATE( tl_att(il_natt) ) 
     
    12761298               ELSE 
    12771299                  ! create attribute _FillValue 
    1278                   SELECT CASE(TRIM(cl_name)) 
     1300                  SELECT CASE(TRIM(fct_lower(cl_name))) 
    12791301                     CASE DEFAULT 
    12801302                        CALL logger_info("IOM CDF READ VAR META: assume _FillValue is equal to "//& 
    12811303                        &                "zero for variable "//TRIM(cl_name) ) 
    12821304                        tl_fill=att_init('_FillValue',0.) 
    1283                      CASE('nav_lon','nav_lat', & 
     1305                     CASE('nav_lon','nav_lat', 'nav_lev', & 
    12841306                        &  'glamt','glamu','glamv','glamf', & 
    12851307                        &  'gphit','gphiu','gphiv','gphif') 
     
    13111333            ALLOCATE(tl_att(il_natt+1) ) 
    13121334            ! create attribute _FillValue 
    1313             SELECT CASE(TRIM(cl_name)) 
     1335            SELECT CASE(TRIM(fct_lower(cl_name))) 
    13141336               CASE DEFAULT 
    13151337                  CALL logger_info("IOM CDF READ VAR META: assume _FillValue is equal to "//& 
     
    13531375   ! 
    13541376   !> @author J.Paul 
    1355    !> - November, 2013- Initial Version 
    1356    ! 
     1377   !> @date November, 2013 - Initial Version 
     1378   !> @date July, 2015  
     1379   !> - Bug fix: use order to disorder table (see dim_init) 
     1380   !> 
    13571381   !> @param[in] td_file   file structure 
    13581382   !> @param[in] id_ndim   number of dimension 
     
    13711395 
    13721396      ! local variable 
    1373       INTEGER(i4), DIMENSION(ip_maxdim) :: il_2xyzt 
     1397      INTEGER(i4), DIMENSION(ip_maxdim) :: il_xyzt2 
    13741398 
    13751399      TYPE(TDIM) , DIMENSION(ip_maxdim) :: tl_dim 
     
    13951419 
    13961420         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 
     1421            CALL logger_debug( " IOM CDF READ VAR DIM: get variable "//& 
     1422               &  "dimension "//TRIM(fct_str(ji)) ) 
     1423 
     1424            il_xyzt2(ji)=td_file%t_dim(id_dimid(ji))%i_xyzt2 
    14011425 
    14021426            ! 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 ) 
     1427            tl_dim(ji) = dim_init( td_file%t_dim(il_xyzt2(ji))%c_name, & 
     1428            &                      td_file%t_dim(il_xyzt2(ji))%i_len ) 
    14051429         ENDDO 
    14061430 
    14071431         ! reorder dimension to ('x','y','z','t') 
    14081432         CALL dim_reorder(tl_dim(:)) 
    1409        
     1433  
    14101434         iom_cdf__read_var_dim(:)=dim_copy(tl_dim(:)) 
    14111435 
     
    14261450   ! 
    14271451   !> @author J.Paul 
    1428    !> - November, 2013- Initial Version 
     1452   !> @date November, 2013 - Initial Version 
    14291453   ! 
    14301454   !> @param[in] td_file   file structure 
     
    14751499   ! 
    14761500   !> @author J.Paul 
    1477    !> - November, 2013- Initial Version 
     1501   !> @date November, 2013 - Initial Version 
     1502   !> @date June, 2015  
     1503   !> - use scale factor and offset, as soon as read variable value 
    14781504   ! 
    14791505   !> @param[in] td_file   file structure 
     
    14821508   !> @param[in] id_count  number of indices selected along each dimension 
    14831509   !> @return variable structure completed  
    1484    ! 
    1485    !> @todo 
    1486    !> - warning do not change fill value when use scale factor.. 
    14871510   !------------------------------------------------------------------- 
    14881511   SUBROUTINE iom_cdf__read_var_value(td_file, td_var, & 
     
    14961519 
    14971520      ! 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 
     1521      INTEGER(i4)                                    :: il_status 
     1522      INTEGER(i4)                                    :: il_tmp1 
     1523      INTEGER(i4)                                    :: il_tmp2 
     1524      INTEGER(i4)                                    :: il_varid 
     1525      INTEGER(i4), DIMENSION(ip_maxdim)              :: il_start 
     1526      INTEGER(i4), DIMENSION(ip_maxdim)              :: il_count 
     1527      INTEGER(i4), DIMENSION(ip_maxdim)              :: il_start_ord 
     1528      INTEGER(i4), DIMENSION(ip_maxdim)              :: il_count_ord 
     1529 
    15061530      REAL(dp)   , DIMENSION(:,:,:,:)  , ALLOCATABLE :: dl_value 
    15071531      REAL(dp)   , DIMENSION(:,:,:,:)  , ALLOCATABLE :: dl_tmp 
     
    15181542         IF( (       PRESENT(id_start)  .AND. (.NOT. PRESENT(id_count))) .OR. & 
    15191543             ((.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") 
     1544            CALL logger_warn( "IOM CDF READ VAR VALUE: id_start and id_count"//& 
     1545               & " should be both specify") 
    15221546         ENDIF 
    15231547         IF( PRESENT(id_start).AND.PRESENT(id_count) )THEN 
     
    15251549            IF( SIZE(id_start(:)) /= ip_maxdim .OR. & 
    15261550            &   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) ) 
     1551               CALL logger_error("IOM CDF READ VAR: dimension of array start"//& 
     1552                  &  " or count are invalid to read variable "//& 
     1553                  &  TRIM(td_var%c_name)//" in file "//TRIM(td_file%c_name) ) 
    15301554            ENDIF 
    15311555 
     
    15641588            &    td_var%t_dim( 4 )%i_len & 
    15651589            &                                            /)) )THEN 
    1566  
    1567             CALL logger_error( "IOM CDF READ VAR VALUE: start + count exceed "//& 
    1568             &  "variable dimension for "//TRIM(td_var%c_name) ) 
    15691590 
    15701591            DO ji = 1, ip_maxdim 
     
    15751596               &  TRIM(fct_str(il_tmp2))) 
    15761597            ENDDO 
     1598            CALL logger_error( "IOM CDF READ VAR VALUE: start + count exceed "//& 
     1599            &  "variable dimension for "//TRIM(td_var%c_name) ) 
    15771600 
    15781601         ELSE 
    15791602 
    1580             ! Allocate space to hold variable value (unorder) 
     1603            ! Allocate space to hold variable value (disorder) 
    15811604            ALLOCATE(dl_value( il_count(1), & 
    15821605               &               il_count(2), & 
     
    16011624            &                                       start = il_start(:),& 
    16021625            &                                       count = il_count(:) ) 
    1603             CALL iom_cdf__check(il_status) 
     1626            CALL iom_cdf__check(il_status,"IOM CDF READ VAR VALUE: ") 
    16041627 
    16051628            ! Allocate space to hold variable value in structure 
     
    16631686               CALL var_chg_FillValue(td_var) 
    16641687            ENDIF 
     1688 
     1689            ! use scale factor and offset 
     1690            WHERE( td_var%d_value(:,:,:,:) /= td_var%d_fill ) 
     1691               td_var%d_value(:,:,:,:) = & 
     1692               &  td_var%d_value(:,:,:,:)*td_var%d_scf + td_var%d_ofs 
     1693            END WHERE 
     1694 
    16651695         ENDIF 
    16661696      ELSE 
     
    16731703   !------------------------------------------------------------------- 
    16741704   !> @brief This subroutine write file structure in an opened netcdf file. 
    1675    ! 
    1676    !> @author J.Paul 
    1677    !> - November, 2013- Initial Version 
     1705   !> 
     1706   !> @details 
     1707   !> optionally, you could specify dimension order (default 'xyzt') 
     1708   !> 
     1709   !> @author J.Paul 
     1710   !> @date November, 2013 - Initial Version 
     1711   !> @date July, 2015  
     1712   !> - add dimension order option  
    16781713   ! 
    16791714   !> @param[inout] td_file   file structure 
    16801715   !------------------------------------------------------------------- 
    1681    SUBROUTINE iom_cdf_write_file(td_file) 
    1682       IMPLICIT NONE 
    1683       ! Argument       
    1684       TYPE(TFILE), INTENT(INOUT) :: td_file 
     1716   SUBROUTINE iom_cdf_write_file(td_file, cd_dimorder) 
     1717      IMPLICIT NONE 
     1718      ! Argument       
     1719      TYPE(TFILE)     , INTENT(INOUT) :: td_file 
     1720      CHARACTER(LEN=*), INTENT(IN   ), OPTIONAL :: cd_dimorder 
    16851721 
    16861722      ! local variable 
    16871723      INTEGER(i4), DIMENSION(:), ALLOCATABLE :: il_value 
     1724 
     1725      CHARACTER(LEN=lc)                      :: cl_dimorder 
    16881726 
    16891727      TYPE(TVAR)                             :: tl_var 
     
    16941732      INTEGER(i4) :: ji 
    16951733      INTEGER(i4) :: jj 
    1696       !---------------------------------------------------------------- 
     1734      INTEGER(i4) :: jvar 
     1735      !---------------------------------------------------------------- 
     1736 
     1737      cl_dimorder='xyzt' 
     1738      IF( PRESENT(cd_dimorder) ) cl_dimorder=TRIM(cd_dimorder) 
    16971739 
    16981740      ! check if file opened 
     
    17261768            ENDIF 
    17271769 
     1770            ! change dimension order 
     1771            IF( TRIM(cl_dimorder) /= 'xyzt' )THEN 
     1772               CALL dim_reorder(td_file%t_dim(:),TRIM(cl_dimorder)) 
     1773               DO jvar=1,td_file%i_nvar 
     1774                  CALL logger_debug("VAR REORDER: "//TRIM(td_file%t_var(jvar)%c_name)) 
     1775                  CALL var_reorder(td_file%t_var(jvar),TRIM(cl_dimorder)) 
     1776               ENDDO 
     1777            ENDIF 
     1778 
    17281779            ! write dimension in file 
    17291780            DO ji = 1, ip_maxdim 
     
    17761827   ! 
    17771828   !> @author J.Paul 
    1778    !> - November, 2013- Initial Version 
     1829   !> @date November, 2013 - Initial Version 
    17791830   ! 
    17801831   !> @param[inout] td_file   file structure 
     
    17981849         ! Enter define mode 
    17991850         il_status=NF90_REDEF(td_file%i_id) 
    1800          CALL iom_cdf__check(il_status) 
     1851         CALL iom_cdf__check(il_status,"IOM CDF WRITE FILE DIM: ") 
    18011852 
    18021853         td_file%l_def=.TRUE. 
     
    18131864            il_status=NF90_DEF_DIM(td_file%i_id, fct_upper(td_dim%c_sname), & 
    18141865            &                      NF90_UNLIMITED, td_dim%i_id) 
    1815             CALL iom_cdf__check(il_status) 
     1866            CALL iom_cdf__check(il_status,"IOM CDF WRITE FILE DIM: ") 
    18161867 
    18171868         ELSE 
    18181869            ! write not unlimited dimension 
    1819             CALL logger_trace( & 
     1870            CALL logger_debug( & 
    18201871            &  "IOM CDF WRITE FILE DIM: write dimension "//TRIM(td_dim%c_name)//& 
    18211872            &  " in file "//TRIM(td_file%c_name)) 
     
    18231874            il_status=NF90_DEF_DIM(td_file%i_id, fct_upper(td_dim%c_sname), & 
    18241875            &                      td_dim%i_len, td_dim%i_id) 
    1825             CALL iom_cdf__check(il_status) 
     1876            CALL iom_cdf__check(il_status,"IOM CDF WRITE FILE DIM: ") 
    18261877 
    18271878         ENDIF 
     
    18341885   ! 
    18351886   !> @author J.Paul 
    1836    !> - November, 2013- Initial Version 
     1887   !> @date November, 2013 - Initial Version 
    18371888   ! 
    18381889   !> @param[inout] td_file   file structure 
     
    18591910         ! Enter define mode 
    18601911         il_status=NF90_REDEF(td_file%i_id) 
    1861          CALL iom_cdf__check(il_status) 
     1912         CALL iom_cdf__check(il_status,"IOM CDF WRITE FILE ATT: ") 
    18621913 
    18631914         td_file%l_def=.TRUE. 
     
    18761927            il_status = NF90_PUT_ATT(td_file%i_id, id_varid, & 
    18771928            &  td_att%c_name, td_att%c_value ) 
    1878             CALL iom_cdf__check(il_status) 
     1929            CALL iom_cdf__check(il_status,"IOM CDF WRITE FILE ATT: ") 
    18791930 
    18801931         CASE(NF90_BYTE, NF90_SHORT, NF90_INT, NF90_FLOAT, NF90_DOUBLE) 
     
    18821933            il_status = NF90_PUT_ATT(td_file%i_id, id_varid, & 
    18831934            &  td_att%c_name, td_att%d_value ) 
    1884             CALL iom_cdf__check(il_status) 
     1935            CALL iom_cdf__check(il_status,"IOM CDF WRITE FILE ATT: ") 
    18851936 
    18861937      END SELECT 
     
    18911942   ! 
    18921943   !> @author J.Paul 
    1893    !> - November, 2013- Initial Version 
     1944   !> @date November, 2013 - Initial Version 
    18941945   ! 
    18951946   !> @param[inout] td_file   file structure 
     
    19171968         ! Enter define mode 
    19181969         il_status=NF90_REDEF(td_file%i_id) 
    1919          CALL iom_cdf__check(il_status) 
     1970         CALL iom_cdf__check(il_status,"IOM CDF WRITE VAR: ") 
    19201971 
    19211972         td_file%l_def=.TRUE. 
    19221973 
    19231974      ENDIF 
    1924        
     1975  
    19251976      ! check if file and variable dimension conform 
    19261977      IF( file_check_var_dim(td_file, td_var) )THEN 
     
    19381989            ENDIF 
    19391990         ENDDO 
     1991         ! ugly patch until NEMO do not force to use 0. as FillValue  
    19401992         IF( ll_chg )THEN 
    19411993            ! not a dimension variable 
    19421994            ! 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) 
     1995            SELECT CASE( TRIM(fct_lower(td_var%c_name)) ) 
     1996               CASE DEFAULT 
     1997                  CALL var_chg_FillValue(td_var,0._dp) 
     1998               CASE('nav_lon','nav_lat', & 
     1999                  & 'glamt','glamu','glamv','glamf', & 
     2000                  & 'gphit','gphiu','gphiv','gphif') 
     2001            END SELECT 
    19462002         ENDIF 
    19472003 
     
    19572013            ! Leave define mode 
    19582014            il_status=NF90_ENDDEF(td_file%i_id) 
    1959             CALL iom_cdf__check(il_status) 
     2015            CALL iom_cdf__check(il_status,"IOM CDF WRITE VAR: ") 
    19602016 
    19612017            td_file%l_def=.FALSE. 
     
    19752031   ! 
    19762032   !> @author J.Paul 
    1977    !> - November, 2013- Initial Version 
     2033   !> @date November, 2013 - Initial Version 
    19782034   ! 
    19792035   !> @param[in] td_file   file structure 
     
    20022058      tl_var=var_copy(td_var) 
    20032059 
     2060      ! forced to use float type 
     2061      IF( tl_var%d_unf /= 1. .AND. tl_var%i_type==NF90_SHORT )THEN 
     2062         tl_var%i_type=NF90_FLOAT 
     2063      ENDIF 
     2064 
    20042065      IF( ALL( .NOT. tl_var%t_dim(:)%l_use ) )THEN 
     2066         CALL logger_debug( & 
     2067         &  "IOM CDF WRITE VAR DEF scalar: define variable "//& 
     2068         &  TRIM(tl_var%c_name)//" in file "//TRIM(td_file%c_name)) 
    20052069         ! scalar value 
    20062070         il_status = NF90_DEF_VAR(td_file%i_id, TRIM(tl_var%c_name), & 
    20072071         &                        tl_var%i_type, varid=iom_cdf__write_var_def)  
    2008          CALL iom_cdf__check(il_status) 
     2072         CALL iom_cdf__check(il_status,"IOM CDF WRITE VAR DEF: ") 
    20092073      ELSE 
    20102074 
     
    20202084         ENDDO 
    20212085 
    2022          CALL logger_trace( & 
     2086         CALL logger_debug( & 
    20232087         &  "IOM CDF WRITE VAR DEF: define dimension to be used for variable "//& 
    20242088         &  TRIM(tl_var%c_name)//" in file "//TRIM(td_file%c_name)) 
    20252089 
    20262090         DO ji=1,jj 
    2027             CALL logger_trace("IOM CDF WRITE VAR DEF: dimid "//TRIM(fct_str(il_dimid(ji))) ) 
     2091            CALL logger_debug("IOM CDF WRITE VAR DEF: dimid "//TRIM(fct_str(il_dimid(ji))) ) 
    20282092         ENDDO 
     2093 
    20292094         il_status = NF90_DEF_VAR(td_file%i_id, TRIM(tl_var%c_name),     & 
    20302095         &                        tl_var%i_type,                         & 
    20312096         &                        il_dimid(1:jj),                        & 
    20322097         &                        varid=iom_cdf__write_var_def           ) 
    2033          CALL iom_cdf__check(il_status) 
     2098         CALL iom_cdf__check(il_status,"IOM CDF WRITE VAR DEF: ") 
    20342099      ENDIF 
    20352100 
     
    20432108 
    20442109      DO ji = 1, tl_var%i_natt 
    2045          CALL logger_trace( & 
     2110         CALL logger_debug( & 
    20462111         &  " IOM CDF WRITE VAR DEF: put attribute "//TRIM(tl_var%t_att(ji)%c_name)//& 
    20472112         &  " for variable "//TRIM(tl_var%c_name)//& 
    20482113         &  " in file "//TRIM(td_file%c_name) ) 
     2114 
     2115         ! forced FillValue to have same type than variable 
     2116         IF( TRIM(tl_var%t_att(ji)%c_name) == '_FillValue' )THEN 
     2117            tl_var%t_att(ji)%i_type=tl_var%i_type 
     2118         ENDIF 
    20492119 
    20502120         IF( tl_var%t_att(ji)%i_type == NF90_CHAR )THEN 
     
    20532123               &                        TRIM(tl_var%t_att(ji)%c_name),        & 
    20542124               &                        TRIM(tl_var%t_att(ji)%c_value)        ) 
    2055                CALL iom_cdf__check(il_status) 
     2125               CALL iom_cdf__check(il_status,"IOM CDF WRITE VAR DEF: ") 
    20562126            ENDIF 
    20572127         ELSE 
     
    20822152                  &                        TRIM(tl_var%t_att(ji)%c_name),  & 
    20832153                  &                        REAL(tl_var%t_att(ji)%d_value(:),dp)) 
    2084                END SELECT 
    2085             CALL iom_cdf__check(il_status) 
     2154            END SELECT 
     2155            CALL iom_cdf__check(il_status,"IOM CDF WRITE VAR DEF: ") 
    20862156         ENDIF 
    20872157      ENDDO 
     
    20972167   ! 
    20982168   !> @author J.Paul 
    2099    !> - November, 2013- Initial Version 
     2169   !> @date November, 2013 - Initial Version 
     2170   !> @date June, 2015 
     2171   !> - reuse scale factor and offset, before writing variable 
    21002172   ! 
    21012173   !> @param[in] td_file   file structure 
     
    21222194      &  "IOM CDF WRITE VAR VALUE: get dimension to be used for variable "//& 
    21232195      &  TRIM(td_var%c_name)//" in file "//TRIM(td_file%c_name)) 
    2124  
     2196    
     2197      ! use scale factor and offset 
     2198      WHERE( td_var%d_value(:,:,:,:) /= td_var%d_fill ) 
     2199         td_var%d_value(:,:,:,:) = & 
     2200         &  (td_var%d_value(:,:,:,:)-td_var%d_ofs)/td_var%d_scf 
     2201      END WHERE 
     2202       
    21252203      jj=0 
    21262204      DO ji = 1, ip_maxdim 
     
    21532231 
    21542232      il_status = NF90_PUT_VAR( td_file%i_id, td_var%i_id, dl_value(:,:,:,:)) 
    2155       CALL iom_cdf__check(il_status) 
     2233      CALL iom_cdf__check(il_status,"IOM CDF WRITE VAR VALUE: ") 
    21562234 
    21572235      DEALLOCATE( dl_value ) 
Note: See TracChangeset for help on using the changeset viewer.