[cdftools] 144/228: JMM : modification in cdfio to add Global attribute to output file. - start_date, output_frequency, CONFIG, CASE as well as a correct time_counter attribute. ( in coherency with DCM)

Alastair McKinstry mckinstry at moszumanska.debian.org
Fri Jun 12 08:21:41 UTC 2015


This is an automated email from the git hooks/post-receive script.

mckinstry pushed a commit to branch master
in repository cdftools.

commit 8eb4f97d206420396563101ab7e6d180b7a3cdce
Author: molines <molines at 1055176f-818a-41d9-83e1-73fbe5b947c5>
Date:   Sun Apr 15 14:52:28 2012 +0000

    JMM : modification in cdfio to add Global attribute to output file.
         - start_date, output_frequency, CONFIG, CASE as well as a correct
           time_counter attribute. ( in coherency with DCM)
    
    
    git-svn-id: http://servforge.legi.grenoble-inp.fr/svn/CDFTOOLS/trunk@592 1055176f-818a-41d9-83e1-73fbe5b947c5
---
 cdfio.f90 | 120 ++++++++++++++++++++++++++++++++++++++++++++++----------------
 1 file changed, 89 insertions(+), 31 deletions(-)

diff --git a/cdfio.f90 b/cdfio.f90
index fe0cf02..c03df21 100644
--- a/cdfio.f90
+++ b/cdfio.f90
@@ -66,6 +66,15 @@
   REAL(KIND=4),    DIMENSION(:,:), ALLOCATABLE :: e3t_ps, e3w_ps !: for reading e3._ps in nemo3.x
   REAL(KIND=4),    DIMENSION(:),   ALLOCATABLE :: e3t_0, e3w_0   !: for readinf e3._ps in nemo3.x
 
+  
+  INTEGER(KIND=4)    :: nstart_date  = -1                      !# from global file attribute
+  CHARACTER(LEN=256) :: ctime_units  = 'seconds since 0000-01-01 00:00:00'
+  CHARACTER(LEN=256) :: ctime_origin = 'N/A'                   !# 
+  CHARACTER(LEN=256) :: calendar     = 'N/A'                   !# gregorian noleap xxxd
+  CHARACTER(LEN=256) :: config                                 !# config name associated with file
+  CHARACTER(LEN=256) :: ccase                                  !# case name associated with  file
+  CHARACTER(LEN=10 ) :: cfreq                                  !# raw model output frequency (5d, 30d 1h ..)
+
   TYPE, PUBLIC ::   variable 
      CHARACTER(LEN=256) :: cname             !# variable name
      CHARACTER(LEN=256) :: cunits            !# variable unit
@@ -148,37 +157,37 @@ CONTAINS
        END DO
     ELSE                        ! no reference file
        SELECT CASE (TRIM(cdvar) )
-       CASE ('nav_lon' )
-          istatus=NF90_PUT_ATT(kcout, kidvar, 'units', 'degrees_east')
-          istatus=NF90_PUT_ATT(kcout, kidvar, 'valid_min', -180.)
-          istatus=NF90_PUT_ATT(kcout, kidvar, 'valid_max', 180.)
-          istatus=NF90_PUT_ATT(kcout, kidvar, 'long_name', 'Longitude')
+       CASE ('nav_lon', 'lon', 'x', 'longitude' )
+          istatus=NF90_PUT_ATT(kcout, kidvar, 'units',     'degrees_east')
+          istatus=NF90_PUT_ATT(kcout, kidvar, 'valid_min', -180.         )
+          istatus=NF90_PUT_ATT(kcout, kidvar, 'valid_max',  180.         )
+          istatus=NF90_PUT_ATT(kcout, kidvar, 'long_name', 'Longitude'   )
           istatus=NF90_PUT_ATT(kcout, kidvar, 'nav_model', 'Default grid')
-       CASE ('nav_lat' )
-          istatus=NF90_PUT_ATT(kcout, kidvar, 'units', 'degrees_north')
-          istatus=NF90_PUT_ATT(kcout, kidvar, 'valid_min', -90.)
-          istatus=NF90_PUT_ATT(kcout, kidvar, 'valid_max', 90.)
-          istatus=NF90_PUT_ATT(kcout, kidvar, 'long_name', 'Latitude')
+       CASE ('nav_lat' ,'lat', 'y', 'latitude' )
+          istatus=NF90_PUT_ATT(kcout, kidvar, 'units',    'degrees_north')
+          istatus=NF90_PUT_ATT(kcout, kidvar, 'valid_min', -90.          )
+          istatus=NF90_PUT_ATT(kcout, kidvar, 'valid_max',  90.          )
+          istatus=NF90_PUT_ATT(kcout, kidvar, 'long_name','Latitude'     )
           istatus=NF90_PUT_ATT(kcout, kidvar, 'nav_model', 'Default grid')
-       CASE ('time_counter' )
-          istatus=NF90_PUT_ATT(kcout, kidvar, 'calendar', 'gregorian')
-          istatus=NF90_PUT_ATT(kcout, kidvar, 'units', 'seconds since 0006-01-01 00:00:00')
-          istatus=NF90_PUT_ATT(kcout, kidvar, 'time_origin', '0001-JAN-01 00:00:00')
-          istatus=NF90_PUT_ATT(kcout, kidvar, 'title', 'Time')
-          istatus=NF90_PUT_ATT(kcout, kidvar, 'long_name', 'Time axis')
-       CASE ('deptht', 'depthu' ,'depthv' , 'depthw', 'dep')
-          istatus=NF90_PUT_ATT(kcout, kidvar, 'units', 'm')
-          istatus=NF90_PUT_ATT(kcout, kidvar, 'positive', 'unknown')
-          istatus=NF90_PUT_ATT(kcout, kidvar, 'valid_min', 0.)
-          istatus=NF90_PUT_ATT(kcout, kidvar, 'valid_max', 5875.)
-          istatus=NF90_PUT_ATT(kcout, kidvar, 'title', TRIM(cdvar))
+       CASE ('time_counter', 'time', 't' )
+          istatus=NF90_PUT_ATT(kcout, kidvar, 'calendar',   calendar     )
+          istatus=NF90_PUT_ATT(kcout, kidvar, 'units',      ctime_units  )
+          istatus=NF90_PUT_ATT(kcout, kidvar, 'time_origin',ctime_origin )
+          istatus=NF90_PUT_ATT(kcout, kidvar, 'title',      'Time'       )
+          istatus=NF90_PUT_ATT(kcout, kidvar, 'long_name',  'Time axis'  )
+       CASE ('deptht', 'depthu' ,'depthv' , 'depthw', 'dep', 'gdept'     )
+          istatus=NF90_PUT_ATT(kcout, kidvar, 'units',      'm'          )
+          istatus=NF90_PUT_ATT(kcout, kidvar, 'positive',  'unknown'     )
+          istatus=NF90_PUT_ATT(kcout, kidvar, 'valid_min',  0.           )
+          istatus=NF90_PUT_ATT(kcout, kidvar, 'valid_max',  5875.        )
+          istatus=NF90_PUT_ATT(kcout, kidvar, 'title',     TRIM(cdvar)   )
           istatus=NF90_PUT_ATT(kcout, kidvar, 'long_name', 'Vertical Levels')
-       CASE ('sigma')
-          istatus=NF90_PUT_ATT(kcout, kidvar, 'units', 'kg/m3')
-          istatus=NF90_PUT_ATT(kcout, kidvar, 'positive', 'unknown')
-          istatus=NF90_PUT_ATT(kcout, kidvar, 'valid_min', 0.)
-          istatus=NF90_PUT_ATT(kcout, kidvar, 'valid_max', 40.)
-          istatus=NF90_PUT_ATT(kcout, kidvar, 'title', TRIM(cdvar))
+       CASE ('sigma', 'levels')
+          istatus=NF90_PUT_ATT(kcout, kidvar, 'units', 'kg/m3'           )
+          istatus=NF90_PUT_ATT(kcout, kidvar, 'positive', 'unknown'      )
+          istatus=NF90_PUT_ATT(kcout, kidvar, 'valid_min', 0.            )
+          istatus=NF90_PUT_ATT(kcout, kidvar, 'valid_max', 40.           )
+          istatus=NF90_PUT_ATT(kcout, kidvar, 'title', TRIM(cdvar)       )
           istatus=NF90_PUT_ATT(kcout, kidvar, 'long_name', 'Sigma bin limits')
        END SELECT
     ENDIF
@@ -254,6 +263,12 @@ CONTAINS
     istatus = NF90_DEF_VAR(icout,cn_vtimec,NF90_FLOAT,(/nid_t/), nid_tim)
     istatus = copyatt(cn_vtimec, nid_tim,incid,icout)
 
+    ! Add Global General attribute at first call
+    istatus=NF90_PUT_ATT(icout,NF90_GLOBAL,'start_date', nstart_date )
+    istatus=NF90_PUT_ATT(icout,NF90_GLOBAL,'output_frequency', cfreq )
+    istatus=NF90_PUT_ATT(icout,NF90_GLOBAL,'CONFIG',          config )
+    istatus=NF90_PUT_ATT(icout,NF90_GLOBAL,'CASE',             ccase )
+
     istatus = NF90_CLOSE(incid)
 
     create=icout
@@ -601,11 +616,12 @@ CONTAINS
     LOGICAL,            OPTIONAL, INTENT(in ) :: ldexact    ! when true look for exact cdim_name
 
     INTEGER(KIND=4)    :: jdim
-    INTEGER(KIND=4)    :: incid, id_dim
+    INTEGER(KIND=4)    :: incid, id_dim, idv
     INTEGER(KIND=4)    :: istatus
     INTEGER(KIND=4)    :: idims
     CHARACTER(LEN=256) :: clnam
-    LOGICAL            :: lexact = .false.
+    LOGICAL            :: lexact   = .false.
+    LOGICAL, SAVE      :: ll_first = .true.
     !!-----------------------------------------------------------
     clnam = '-------------'
 
@@ -639,6 +655,47 @@ CONTAINS
           getdim=0
           IF ( PRESENT(cdtrue) ) cdtrue='unknown'
        ENDIF
+       ! first call 
+       IF ( ll_first ) THEN
+          ll_first = .false. 
+          ! take the opportunity to initialize time_counter attributes :
+          istatus = NF90_INQ_VARID(incid, cn_vtimec, idv )
+          IF ( istatus == NF90_NOERR ) THEN 
+             istatus = NF90_GET_ATT(incid, idv, 'units',  ctime_units  )
+             istatus = NF90_GET_ATT(incid, idv, 'time_origin', ctime_origin )
+             istatus = NF90_GET_ATT(incid, idv, 'calendar',    calendar     )
+          ENDIF
+ 
+          ! read global attributes 
+          ! start_date
+          istatus = NF90_INQUIRE_ATTRIBUTE(incid, NF90_GLOBAL, 'start_date')
+          IF ( istatus == NF90_NOERR ) THEN
+             istatus = NF90_GET_ATT(incid, NF90_GLOBAL, 'start_date', nstart_date )
+          ELSE
+             nstart_date = -1
+          ENDIF
+          ! output_frequency 
+          istatus = NF90_INQUIRE_ATTRIBUTE(incid, NF90_GLOBAL, 'output_frequency')
+          IF ( istatus == NF90_NOERR ) THEN
+             istatus = NF90_GET_ATT(incid, NF90_GLOBAL, 'output_frequency', cfreq )
+          ELSE
+             cfreq = 'N/A'
+          ENDIF
+          ! CONFIG
+          istatus = NF90_INQUIRE_ATTRIBUTE(incid, NF90_GLOBAL, 'CONFIG')
+          IF ( istatus == NF90_NOERR ) THEN
+             istatus = NF90_GET_ATT(incid, NF90_GLOBAL, 'CONFIG', config )
+          ELSE
+             config = 'N/A'
+          ENDIF
+          ! CASE
+          istatus = NF90_INQUIRE_ATTRIBUTE(incid, NF90_GLOBAL, 'CASE')
+          IF ( istatus == NF90_NOERR ) THEN
+             istatus = NF90_GET_ATT(incid, NF90_GLOBAL, 'CASE', ccase )
+          ELSE
+             ccase = 'N/A'
+          ENDIF
+       ENDIF
        istatus=NF90_CLOSE(incid)
     ELSE              ! problem with the file
        IF ( PRESENT(cdtrue) ) cdtrue='unknown'
@@ -807,7 +864,7 @@ CONTAINS
     !!
     !!----------------------------------------------------------------------
     CHARACTER(LEN=*),          INTENT(in) :: cdfile
-    INTEGER(KIND=4),           INTENT(in) :: knvars                  ! Number of variables in cdfile
+    INTEGER(KIND=4),           INTENT(in) :: knvars    ! Number of variables in cdfile
     TYPE (variable),   DIMENSION (knvars) :: sdtypvar  ! Retrieve variables attribute
     CHARACTER(LEN=256), DIMENSION(knvars) :: getvarname
 
@@ -822,6 +879,7 @@ CONTAINS
     DO jv = 1, knvars
        istatus=NF90_INQUIRE_VARIABLE(incid, jv, name=getvarname(jv) )
        sdtypvar(jv)%cname=getvarname(jv)
+
        ! look for standard attibutes
        IF ( NF90_INQUIRE_ATTRIBUTE(incid, jv, 'units', len=ilen) == NF90_NOERR ) THEN
           istatus=NF90_GET_ATT(incid, jv, 'units', cldum(1:ilen))

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/cdftools.git



More information about the debian-science-commits mailing list