Skip to content

Commit

Permalink
Merge branch 'hotfix_3.3'
Browse files Browse the repository at this point in the history
This merge incorporates twelve fixes to the shared MPAS infrastructure:

    * framework/interval_comparison_fix:
      Add missing comma in generated format string in ESMF time manager.
      Define ESMF_KIND_R4 and ESMF_KIND_R8 to be consistent with CESM
      Wrap long source line in ESMF_TimeMod.F90 to match CESM code.
      Always compute the difference between two time instants in terms of days and seconds.

    * framework/leak_fixes:
      Fixing a memory leak related to setting times

    * framework/io_file_noexist:
      Adding an error for reads of non-existent files

    * framework/stream_filename_write:
      Fixing a problem when using open() on an xml file that doesn't exist

    * framework/registry_var_merge_fix:
      Fix merging of var_struct and var_array elements in Registry.xml files.

    * framework/time_interval_divide_by_zero_fix:
      Resetting s_d regardless of input options

    * framework/r0a_fix:
      Removing an extra if clause to handle r0a field destruction

    * framework/package_allocation_fix:
      Fixing package variables so they don't allocate space

    * framework/building_directory_permission_fix:
      Fixing directory creation when nested in non-writable directories

    * framework/unique_stream_filenames:
      Allow input streams to have the same filename template

    * framework/bootstrapping_fix:
      Updating the bootstrapping process to handle stream attributes properly

    * framework/alarm_reset_fix:
      Fixing an issue with interval division when resetting alarms
  • Loading branch information
mgduda committed Jan 21, 2015
2 parents 6f438f6 + 7447aae commit 23e4678
Show file tree
Hide file tree
Showing 17 changed files with 264 additions and 153 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
MPAS-v3.2
MPAS-v3.3
====

The Model for Prediction Across Scales (MPAS) is a collaborative project for
Expand Down
2 changes: 1 addition & 1 deletion src/core_atmosphere/Registry.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0"?>
<registry model="mpas" core="atmosphere" version="3.2">
<registry model="mpas" core="atmosphere" version="3.3">

<!-- **************************************************************************************** -->
<!-- ************************************** Dimensions ************************************** -->
Expand Down
2 changes: 1 addition & 1 deletion src/core_init_atmosphere/Registry.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0"?>
<registry model="mpas" core="init_atmosphere" version="3.2">
<registry model="mpas" core="init_atmosphere" version="3.3">

<!-- **************************************************************************************** -->
<!-- ************************************** Dimensions ************************************** -->
Expand Down
2 changes: 1 addition & 1 deletion src/core_landice/Registry.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0"?>
<registry model="mpas" core="landice" version="3.2">
<registry model="mpas" core="landice" version="3.3">


<!-- ======================================================================= -->
Expand Down
2 changes: 1 addition & 1 deletion src/core_ocean/Registry.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0"?>
<registry model="mpas" core="ocean" version="3.2">
<registry model="mpas" core="ocean" version="3.3">

<dims>
<dim name="nCells" units="unitless"
Expand Down
2 changes: 1 addition & 1 deletion src/core_sw/Registry.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0"?>
<registry model="mpas" core="sw" version="3.2">
<registry model="mpas" core="sw" version="3.3">
<dims>
<dim name="nCells"/>
<dim name="nEdges"/>
Expand Down
36 changes: 29 additions & 7 deletions src/driver/mpas_subdriver.F
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ module mpas_subdriver

subroutine mpas_init()

use mpas_stream_manager, only : MPAS_stream_mgr_init
use mpas_stream_manager, only : MPAS_stream_mgr_init, MPAS_build_stream_filename
use iso_c_binding, only : c_char, c_loc, c_ptr, c_int
use mpas_c_interfacing, only : mpas_f_to_c_string, mpas_c_to_f_string
use mpas_timekeeping, only : MPAS_Time_type, mpas_get_clock_time, mpas_get_time
Expand All @@ -49,9 +49,15 @@ subroutine mpas_init()
character(len=StrKIND) :: mesh_stream
character(len=StrKIND) :: mesh_filename
character(len=StrKIND) :: mesh_filename_temp
character(len=StrKIND) :: ref_time_temp
character(len=StrKIND) :: filename_interval_temp
character(kind=c_char), dimension(StrKIND+1) :: c_mesh_stream
character(kind=c_char), dimension(StrKIND+1) :: c_mesh_filename_temp
character(kind=c_char), dimension(StrKIND+1) :: c_ref_time_temp
character(kind=c_char), dimension(StrKIND+1) :: c_filename_interval_temp
type (MPAS_Time_type) :: start_time
type (MPAS_Time_type) :: ref_time
type (MPAS_TimeInterval_type) :: filename_interval
character(len=StrKIND) :: start_timestamp


Expand All @@ -64,14 +70,16 @@ subroutine xml_stream_parser(xmlname, mgr_p, comm, ierr) bind(c)
integer(kind=c_int), intent(out) :: ierr
end subroutine xml_stream_parser

subroutine xml_stream_get_filename(xmlname, streamname, comm, filename, ierr) bind(c)
subroutine xml_stream_get_attributes(xmlname, streamname, comm, filename, ref_time, filename_interval, ierr) bind(c)
use iso_c_binding, only : c_char, c_int
character(kind=c_char), dimension(*), intent(in) :: xmlname
character(kind=c_char), dimension(*), intent(in) :: streamname
integer(kind=c_int), intent(inout) :: comm
character(kind=c_char), dimension(*), intent(in) :: filename
character(kind=c_char), dimension(*), intent(in) :: ref_time
character(kind=c_char), dimension(*), intent(in) :: filename_interval
integer(kind=c_int), intent(out) :: ierr
end subroutine xml_stream_get_filename
end subroutine xml_stream_get_attributes
end interface


Expand All @@ -98,16 +106,30 @@ end subroutine xml_stream_get_filename
call mpas_f_to_c_string(domain % streams_filename, c_filename)
call mpas_f_to_c_string(mesh_stream, c_mesh_stream)
c_comm = dminfo % comm
call xml_stream_get_filename(c_filename, c_mesh_stream, c_comm, c_mesh_filename_temp, c_ierr)
call xml_stream_get_attributes(c_filename, c_mesh_stream, c_comm, &
c_mesh_filename_temp, c_ref_time_temp, &
c_filename_interval_temp, c_ierr)
if (c_ierr /= 0) then
call mpas_dmpar_abort(dminfo)
end if
call mpas_c_to_f_string(c_mesh_filename_temp, mesh_filename_temp)
call mpas_c_to_f_string(c_ref_time_temp, ref_time_temp)
call mpas_c_to_f_string(c_filename_interval_temp, filename_interval_temp)

start_time = mpas_get_clock_time(domain_ptr % clock, MPAS_START_TIME, ierr)
call mpas_get_time(start_time, dateTimeString=start_timestamp, ierr=ierr)
call mpas_expand_string(start_timestamp, mesh_filename_temp, mesh_filename)
call mpas_bootstrap_framework(domain_ptr, mesh_filename)
if ( trim(ref_time_temp) == 'initial_time' ) then
call mpas_get_time(start_time, dateTimeString=ref_time_temp, ierr=ierr)
end if

if ( trim(filename_interval_temp) == 'none' ) then
call mpas_expand_string(ref_time_temp, mesh_filename_temp, mesh_filename)
else
call mpas_set_time(ref_time, dateTimeString=ref_time_temp, ierr=ierr)
call mpas_set_timeInterval(filename_interval, timeString=filename_interval_temp, ierr=ierr)
call mpas_build_stream_filename(ref_time, start_time, filename_interval, mesh_filename_temp, mesh_filename, ierr)
end if
write(stderrUnit, *) ' ** Attempting to bootstrap MPAS framework using stream: ', trim(mesh_stream)
call mpas_bootstrap_framework(domain_ptr, mesh_filename)

!
! Set up run-time streams
Expand Down
4 changes: 2 additions & 2 deletions src/external/esmf_time_f90/ESMF_BaseMod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -102,8 +102,8 @@ module ESMF_BaseMod
ESMF_KIND_I2 = selected_int_kind(4), &
ESMF_KIND_I4 = selected_int_kind(9), &
ESMF_KIND_I8 = selected_int_kind(18), &
ESMF_KIND_R4 = selected_real_kind(3,25), &
ESMF_KIND_R8 = selected_real_kind(6,45), &
ESMF_KIND_R4 = selected_real_kind(6), & ! 4-byte real
ESMF_KIND_R8 = selected_real_kind(12), & ! 8-byte real
ESMF_KIND_C8 = selected_real_kind(3,25), &
ESMF_KIND_C16 = selected_real_kind(6,45)

Expand Down
29 changes: 17 additions & 12 deletions src/external/esmf_time_f90/ESMF_TimeMod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -835,7 +835,8 @@ subroutine ESMFold_TimeGetString( year, month, dayofmonth, &

!$$$here... add negative sign for YR<0
!$$$here... add Sn, Sd ??
write(TimeFormatString,FMT="(A,I4.4,A,I4.4,A)") "(I", yearWidth, ".", yearWidth, "'-',I2.2,'-',I2.2,'_',I2.2,':',I2.2,':',I2.2)"
write(TimeFormatString,FMT="(A,I4.4,A,I4.4,A)") &
"(I", yearWidth, ".", yearWidth, ",'-',I2.2,'-',I2.2,'_',I2.2,':',I2.2,':',I2.2)"
write(TimeString,FMT=TimeFormatString) year,month,dayofmonth,hour,minute,second

end subroutine ESMFold_TimeGetString
Expand Down Expand Up @@ -1079,16 +1080,20 @@ function ESMF_TimeDiff(time1, time2)

! Can either be yr/month based diff if diff is only in year and month
! or absolute seconds if diff in day/seconds as well

if (d1 == d2 .and. s1 == s2) then
! write(6,*) 'tcx timedifft ym'
ESMF_TimeDiff%YR = y1 - y2
ESMF_TimeDiff%MM = m1 - m2
cmptime%S = 0
cmptime%Sn = 0
cmptime%Sd = 0
ESMF_TimeDiff%basetime = cmptime
else
!
! Update: Actually, the timeintcmp() routine in ESMF_TimeIntervalMod.F90 is not capable
! of comparing time intervals when one interval has a different year and month than
! the other. So, it is best here to always compute the interval as day/seconds.

! if (d1 == d2 .and. s1 == s2) then
!! write(6,*) 'tcx timedifft ym'
! ESMF_TimeDiff%YR = y1 - y2
! ESMF_TimeDiff%MM = m1 - m2
! cmptime%S = 0
! cmptime%Sn = 0
! cmptime%Sd = 0
! ESMF_TimeDiff%basetime = cmptime
! else
! write(6,*) 'tcx timedifft sec'
ESMF_TimeDiff%YR = 0
ESMF_TimeDiff%MM = 0
Expand All @@ -1104,7 +1109,7 @@ function ESMF_TimeDiff(time1, time2)
ESMF_TimeDiff%basetime%S = ESMF_TimeDiff%basetime%S - nsecondsinyear(yr,time2%calendar%type)
ENDDO
ENDIF
endif
! endif

! write(6,*) 'tcx timediff5 ',ESMF_TimeDiff%YR, ESMF_TimeDiff%MM, ESMF_TimeDiff%basetime%s

Expand Down
2 changes: 2 additions & 0 deletions src/framework/mpas_bootstrapping.F
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,8 @@ subroutine mpas_bootstrap_framework(domain, mesh_filename) !{{{
write(stderrUnit,*) 'Error: Could not open input file '''//trim(mesh_filename)//''' to read mesh fields'
write(stderrUnit,*) '************************************************************************************'
call mpas_dmpar_abort(domain % dminfo)
else
write(stderrUnit,*) 'Bootstrapping framework with mesh fields from input file '''//trim(mesh_filename)//''''
end if


Expand Down
11 changes: 10 additions & 1 deletion src/framework/mpas_io.F
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,8 @@ module mpas_io
MPAS_IO_ERR_WRONG_MODE = -16, &
MPAS_IO_ERR_NO_UNLIMITED_DIM = -17, &
MPAS_IO_ERR_UNIMPLEMENTED = -18, &
MPAS_IO_ERR_WOULD_CLOBBER = -19
MPAS_IO_ERR_WOULD_CLOBBER = -19, &
MPAS_IO_ERR_NOEXIST_READ = -20


type MPAS_IO_Handle_type
Expand Down Expand Up @@ -384,6 +385,12 @@ type (MPAS_IO_Handle_type) function MPAS_io_open(filename, mode, ioformat, clobb
end if
end if
else
inquire(file=trim(filename), exist=exists)
if (.not. exists) then
if (present(ierr)) ierr = MPAS_IO_ERR_NOEXIST_READ
return
end if
!write(stderrUnit,*) 'MGD PIO_openfile'
pio_ierr = PIO_openfile(pio_iosystem, MPAS_io_open % pio_file, pio_iotype, trim(filename), PIO_nowrite)
endif
Expand Down Expand Up @@ -4394,6 +4401,8 @@ subroutine MPAS_io_err_mesg(ierr, fatal)
write(stderrUnit,*) 'MPAS IO Error: Unimplemented functionality'
case (MPAS_IO_ERR_WOULD_CLOBBER)
write(stderrUnit,*) 'MPAS IO Error: Would clobber existing file'
case (MPAS_IO_ERR_NOEXIST_READ)
write(stderrUnit,*) 'MPAS IO Error: Attempting to read a file which does not exist.'
case default
write(stderrUnit,*) 'MPAS IO Error: Unrecognized error code...'
end select
Expand Down
4 changes: 4 additions & 0 deletions src/framework/mpas_io_streams.F
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,10 @@ subroutine MPAS_createStream(stream, fileName, ioFormat, ioDirection, precision,
!
! Catch a few special errors
!
if (io_err == MPAS_IO_ERR_NOEXIST_READ) then
if (present(ierr)) ierr = MPAS_IO_ERR_NOEXIST_READ
return
end if
if (io_err == MPAS_IO_ERR_WOULD_CLOBBER) then
if (present(ierr)) ierr = MPAS_STREAM_CLOBBER_FILE
return
Expand Down
35 changes: 25 additions & 10 deletions src/framework/mpas_stream_manager.F
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,8 @@ module mpas_stream_manager
MPAS_stream_mgr_ringing_alarms, &
MPAS_stream_mgr_add_att, &
MPAS_stream_mgr_write, &
MPAS_stream_mgr_read
MPAS_stream_mgr_read, &
MPAS_build_stream_filename

private

Expand Down Expand Up @@ -2431,7 +2432,7 @@ subroutine write_stream(manager, stream, timeLevel, mgLevel, forceWritenow, ierr
if ( stream % filename_interval /= 'none' ) then
now_time = mpas_get_clock_time(manager % streamClock, MPAS_NOW, ierr=local_ierr)
call mpas_set_timeInterval(filename_interval, timeString=stream % filename_interval)
call build_filename(stream % referenceTime, now_time, filename_interval, stream % filename_template, stream % filename, ierr=local_ierr)
call mpas_build_stream_filename(stream % referenceTime, now_time, filename_interval, stream % filename_template, stream % filename, ierr=local_ierr)
else
call mpas_get_time(stream % referenceTime, dateTimeString=time_string)
call mpas_expand_string(time_string, stream % filename_template, stream % filename)
Expand Down Expand Up @@ -2505,7 +2506,7 @@ subroutine write_stream(manager, stream, timeLevel, mgLevel, forceWritenow, ierr
now_time = mpas_get_clock_time(manager % streamClock, MPAS_NOW, ierr=local_ierr)
call mpas_set_timeInterval(filename_interval, timeString=stream % filename_interval)

call build_filename(stream % referenceTime, now_time, filename_interval, stream % filename_template, temp_filename, ierr=local_ierr)
call mpas_build_stream_filename(stream % referenceTime, now_time, filename_interval, stream % filename_template, temp_filename, ierr=local_ierr)
else
call mpas_get_time(stream % referenceTime, dateTimeString=time_string)
call mpas_expand_string(time_string, stream % filename_template, temp_filename)
Expand Down Expand Up @@ -2840,6 +2841,8 @@ subroutine read_stream(manager, stream, timeLevel, mgLevel, forceReadNow, when,
character (len=*), intent(out), optional :: actualWhen
integer, intent(out) :: ierr
character (len=StrKIND) :: err_string
type (MPAS_stream_list_type), pointer :: alarm_cursor
type (MPAS_Time_type) :: now_time, ref_time, temp_time
type (MPAS_TimeInterval_type) :: temp_interval
Expand Down Expand Up @@ -2907,7 +2910,7 @@ subroutine read_stream(manager, stream, timeLevel, mgLevel, forceReadNow, when,
call mpas_set_time(now_time, dateTimeString=when, ierr=local_ierr)
call mpas_set_timeInterval(filename_interval, timeString=stream % filename_interval)
call build_filename(stream % referenceTime, now_time, filename_interval, stream % filename_template, temp_filename, ierr=local_ierr)
call mpas_build_stream_filename(stream % referenceTime, now_time, filename_interval, stream % filename_template, temp_filename, ierr=local_ierr)
else
call mpas_expand_string(when, stream % filename_template, temp_filename)
end if
Expand All @@ -2928,7 +2931,13 @@ subroutine read_stream(manager, stream, timeLevel, mgLevel, forceReadNow, when,
call MPAS_createStream(stream % stream, stream % filename, MPAS_IO_PNETCDF, MPAS_IO_READ, &
precision=stream % precision, ierr=local_ierr)
if (local_ierr /= MPAS_STREAM_NOERR) then
ierr = MPAS_STREAM_MGR_ERROR
if (local_ierr == MPAS_IO_ERR_NOEXIST_READ) then
write(err_string,'(a)') 'Stream '''//trim(stream % name)//''' attempted to read non-existent file '''//trim(stream % filename)//''''
STREAM_ERROR_WRITE(trim(err_string))
ierr = MPAS_STREAM_MGR_ERROR
else
ierr = MPAS_STREAM_MGR_ERROR
end if
return
end if
Expand Down Expand Up @@ -2959,7 +2968,13 @@ subroutine read_stream(manager, stream, timeLevel, mgLevel, forceReadNow, when,
!
call MPAS_createStream(stream % stream, stream % filename, MPAS_IO_PNETCDF, MPAS_IO_READ, precision=stream % precision, ierr=local_ierr)
if (local_ierr /= MPAS_STREAM_NOERR) then
ierr = MPAS_STREAM_MGR_ERROR
if (local_ierr == MPAS_IO_ERR_NOEXIST_READ) then
write(err_string,'(a)') 'Stream '''//trim(stream % name)//''' attempted to read non-existent file '''//trim(stream % filename)//''''
STREAM_ERROR_WRITE(trim(err_string))
ierr = MPAS_STREAM_MGR_ERROR
else
ierr = MPAS_STREAM_MGR_ERROR
end if
return
end if
Expand Down Expand Up @@ -3064,7 +3079,7 @@ subroutine read_stream(manager, stream, timeLevel, mgLevel, forceReadNow, when,
call mpas_set_timeInterval(filename_interval, timeString=stream % filename_interval)
call build_filename(stream % referenceTime, filenameTime, filename_interval, stream % filename_template, test_filename, ierr=local_ierr)
call mpas_build_stream_filename(stream % referenceTime, filenameTime, filename_interval, stream % filename_template, test_filename, ierr=local_ierr)
STREAM_DEBUG_WRITE(' --- Retesting filename is ' COMMA trim(test_filename))
Expand Down Expand Up @@ -3234,7 +3249,7 @@ end subroutine MPAS_stream_mesg!}}}
!-----------------------------------------------------------------------
! routine build_filename
! routine mpas_build_stream_filename
!
!> \brief Construct the filename that contains a specific time in a stream
!> \author Michael Duda, Doug Jacobsen
Expand All @@ -3251,7 +3266,7 @@ end subroutine MPAS_stream_mesg!}}}
!> Return error codes:
!> 0 no error
!-----------------------------------------------------------------------
subroutine build_filename(ref_time, when, filename_interval, filename_template, filename, ierr) !{{{
subroutine mpas_build_stream_filename(ref_time, when, filename_interval, filename_template, filename, ierr) !{{{
implicit none
Expand Down Expand Up @@ -3314,7 +3329,7 @@ subroutine build_filename(ref_time, when, filename_interval, filename_template,
call mpas_expand_string(when_string, filename_template, filename)
end subroutine build_filename !}}}
end subroutine mpas_build_stream_filename !}}}
!-----------------------------------------------------------------------
Expand Down
13 changes: 8 additions & 5 deletions src/framework/mpas_timekeeping.F
Original file line number Diff line number Diff line change
Expand Up @@ -822,15 +822,15 @@ subroutine mpas_reset_clock_alarm(clock, alarmID, interval, ierr)
end if

nowInterval = alarmNow - alarmPtr % prevRingTime
call mpas_interval_division(alarmNow, nowInterval, alarmPtr % ringTimeInterval, nDivs, nowRemainder)
call mpas_interval_division(alarmPtr % prevRingTime, nowInterval, alarmPtr % ringTimeInterval, nDivs, nowRemainder)
alarmPtr % prevRingTime = alarmNow - nowRemainder
else
if (present(interval)) then
alarmNow = alarmNow - interval
end if

nowInterval = alarmPtr % prevRingTime - alarmNow
call mpas_interval_division(alarmNow, nowInterval, alarmPtr % ringTimeInterval, nDivs, nowRemainder)
call mpas_interval_division(alarmPtr % prevRingTime, nowInterval, alarmPtr % ringTimeInterval, nDivs, nowRemainder)
alarmPtr % prevRingTime = alarmNow + nowRemainder
end if
end if
Expand Down Expand Up @@ -964,6 +964,8 @@ subroutine mpas_set_time(curr_time, YYYY, MM, DD, DoY, H, M, S, S_n, S_d, dateTi
if (present(ierr)) ierr = 1
write(stderrUnit,*) 'ERROR: Invalid DateTime string', dateTimeString
return
else
deallocate(subStrings)
end if

call mpas_split_string(dateTimeString_, "_", subStrings)
Expand Down Expand Up @@ -1354,6 +1356,10 @@ subroutine mpas_get_timeInterval(interval, StartTimeIn, DD, H, M, S, S_n, S_d, S
call ESMF_TimeIntervalGet(interval % ti, D=days, S_i8=seconds, Sn=sn, Sd=sd, rc=ierr)
endif

if (sd == 0) then ! may only occur if (sn == 0)?
sd = 1
end if

if (present(dt)) then
dt = (days * 24 * 60 * 60) + seconds + (sn / sd)
end if
Expand Down Expand Up @@ -1390,9 +1396,6 @@ subroutine mpas_get_timeInterval(interval, StartTimeIn, DD, H, M, S, S_n, S_d, S
end if

if (present(S_d)) then
if (sd == 0) then ! may only occur if (sn == 0)?
sd = 1
end if
S_d = sd
end if

Expand Down
Loading

0 comments on commit 23e4678

Please sign in to comment.