[Dart-dev] DART/trunk Revision: 10826

dart at ucar.edu dart at ucar.edu
Wed Dec 21 12:54:12 MST 2016


thoar at ucar.edu
2016-12-21 12:54:11 -0700 (Wed, 21 Dec 2016)
261
The Rutgers ROMS people have restart files that have a 'dstart' variable
with units but no calendar attribute. This version flexibly handles dstart
variables with and without a calendar attribute.  If it is not present,
the calendar from 'ocean_time' is used.




Modified: DART/trunk/models/ROMS/model_mod.f90
===================================================================
--- DART/trunk/models/ROMS/model_mod.f90	2016-12-21 17:50:32 UTC (rev 10825)
+++ DART/trunk/models/ROMS/model_mod.f90	2016-12-21 19:54:11 UTC (rev 10826)
@@ -31,14 +31,14 @@
                              MISSING_I, MISSING_R4, MISSING_R8, i4, i8
 
 use time_manager_mod, only : time_type, set_time, set_date, get_date, get_time, &
-                             print_time, print_date,set_calendar_type,          &
+                             print_time, print_date, set_calendar_type,         &
                              operator(*),  operator(+), operator(-),            &
                              operator(>),  operator(<), operator(/),            &
                              operator(/=), operator(<=)
 
 use     location_mod, only : location_type, get_dist, get_close_maxdist_init,   &
                              get_close_obs_init, set_location,                  &
-                             get_location, vert_is_height,write_location,      &
+                             get_location, vert_is_height, write_location,      &
                              set_location_missing,query_location,               &
                              vert_is_level, vert_is_surface,                    &
                              loc_get_close_obs => get_close_obs, get_close_type,&
@@ -3044,7 +3044,7 @@
 
 integer :: ios, VarID, dimlen
 character(len=256) :: unitstring
-character(len=256) :: calendarstring
+character(len=256) :: ocean_time_calendar, dstart_calendar
 
 integer :: year, month, day, hour, minute, second
 real(digits12), allocatable :: ocean_time(:)
@@ -3079,18 +3079,18 @@
 
    call nc_check(nf90_get_att(ncid, VarID, 'units', unitstring), &
           'find_time_dimension', 'get_att ocean_time units '//trim(filename))
-   call nc_check(nf90_get_att(ncid, VarID, 'calendar', calendarstring), &
+   call nc_check(nf90_get_att(ncid, VarID, 'calendar', ocean_time_calendar), &
           'find_time_dimension', 'get_att ocean_time units '//trim(filename))
 
-   if ((trim(calendarstring) /= 'julian') .and. &
-       (trim(calendarstring) /= 'gregorian')) then
+   if ((trim(ocean_time_calendar) /= 'julian') .and. &
+       (trim(ocean_time_calendar) /= 'gregorian')) then
       write(string1,*)'expecting ocean_time calendar of "julian" or "gregorian"'
-      write(string2,*)'got '//trim(calendarstring)
+      write(string2,*)'got '//trim(ocean_time_calendar)
       call error_handler(E_ERR,'find_time_dimension:', string1, &
-                source, revision, revdate, text2=string2, text3=string3)
+                source, revision, revdate, text2=string2)
    endif
 
-   call set_calendar_type( trim(calendarstring) )
+   call set_calendar_type( trim(ocean_time_calendar) )
 
    if (unitstring(1:13) /= 'seconds since') then
       write(string1,*)'expecting ocean_time units of "seconds since ..."'
@@ -3131,10 +3131,24 @@
    call nc_check(nf90_get_var( ncid, VarID, dstart), &
           'find_time_dimension', 'get_var dstart from '//trim(filename))
 
+   ios = nf90_get_att(ncid, VarID, 'calendar', dstart_calendar)
+   if (ios == NF90_NOERR) then
+      if ((trim(dstart_calendar) /= 'julian') .and. &
+          (trim(dstart_calendar) /= 'gregorian')) then
+         write(string1,*)'expecting dstart calendar of "julian" or "gregorian"'
+         write(string2,*)'got '//trim(dstart_calendar)
+         call error_handler(E_ERR,'find_time_dimension:', string1, &
+                   source, revision, revdate, text2=string2)
+      endif
+      call set_calendar_type( trim(dstart_calendar) )
+   else
+      write(string1,*)'dstart has no calendar, using the ocean_time:calendar'
+      call error_handler(E_MSG,'find_time_dimension:', string1, &
+                source, revision, revdate)
+   endif
+
    call nc_check(nf90_get_att(ncid, VarID, 'units', unitstring), &
           'find_time_dimension', 'get_att dstart units '//trim(filename))
-   call nc_check(nf90_get_att(ncid, VarID, 'calendar', calendarstring), &
-          'find_time_dimension', 'get_att dstart units '//trim(filename))
 
    if (unitstring(1:10) /= 'days since') then
       write(string1,*)'expecting dstart units of "days since ..."'
@@ -3144,14 +3158,6 @@
                 source, revision, revdate, text2=string2, text3=string3)
    endif
 
-   if ((trim(calendarstring) /= 'julian') .and. &
-       (trim(calendarstring) /= 'gregorian')) then
-      write(string1,*)'expecting ocean_time calendar of "julian" or "gregorian"'
-      write(string2,*)'got '//trim(calendarstring)
-      call error_handler(E_ERR,'find_time_dimension:', string1, &
-                source, revision, revdate, text2=string2, text3=string3)
-   endif
-
    read(unitstring,'(11x,i4,5(1x,i2))',iostat=ios)year,month,day,hour,minute,second
    if (ios /= 0) then
       write(string1,*)'Unable to read dtime units. Error status was ',ios


More information about the Dart-dev mailing list