<p><b>duda</b> 2012-05-15 13:55:24 -0600 (Tue, 15 May 2012)</p><p>BRANCH COMMIT<br>
<br>
- Add changes in IO layers to support appending to existing files<br>
<br>
- Modify mpas_io_output to open a history file for appending when the<br>
file already exists and the run is a restart run; otherwise, open<br>
the file (and clobber it if it already exists)<br>
<br>
<br>
M src/core_hyd_atmos/mpas_atmh_mpas_core.F<br>
M src/core_init_nhyd_atmos/mpas_init_atm_test_cases.F<br>
M src/core_sw/mpas_sw_mpas_core.F<br>
M src/driver/mpas_subdriver.F<br>
M src/core_atmos_physics/mpas_atmphys_driver_radiation_sw.F<br>
M src/core_nhyd_atmos/mpas_atm_mpas_core.F<br>
M src/core_ocean/mpas_ocn_mpas_core.F<br>
M src/framework/mpas_io_output.F<br>
M src/framework/mpas_io_streams.F<br>
M src/framework/mpas_io.F<br>
</p><hr noshade><pre><font color="gray">Modified: branches/ocean_projects/first_output_optional/src/core_atmos_physics/mpas_atmphys_driver_radiation_sw.F
===================================================================
--- branches/ocean_projects/first_output_optional/src/core_atmos_physics/mpas_atmphys_driver_radiation_sw.F        2012-05-15 17:54:07 UTC (rev 1914)
+++ branches/ocean_projects/first_output_optional/src/core_atmos_physics/mpas_atmphys_driver_radiation_sw.F        2012-05-15 19:55:24 UTC (rev 1915)
@@ -3,7 +3,6 @@
use mpas_grid_types
use mpas_timer
- use mpas_atmphys_manager
use mpas_atmphys_constants
use mpas_atmphys_manager, only: gmt,curr_julday,julday,year
use mpas_atmphys_camrad_init
Modified: branches/ocean_projects/first_output_optional/src/core_hyd_atmos/mpas_atmh_mpas_core.F
===================================================================
--- branches/ocean_projects/first_output_optional/src/core_hyd_atmos/mpas_atmh_mpas_core.F        2012-05-15 17:54:07 UTC (rev 1914)
+++ branches/ocean_projects/first_output_optional/src/core_hyd_atmos/mpas_atmh_mpas_core.F        2012-05-15 19:55:24 UTC (rev 1915)
@@ -71,8 +71,11 @@
type (MPAS_Time_Type) :: currTime
character(len=StrKIND) :: timeStamp
+ integer :: restart_frame
integer :: ierr
logical :: first_output
+
+ restart_frame = 1
! Eventually, dt should be domain specific
dt = config_dt
@@ -110,7 +113,7 @@
if (config_write_initial_output.or.(.not.first_output)) then
call mpas_output_state_finalize(output_obj, domain % dminfo)
end if
- call mpas_output_state_init(output_obj, domain, "OUTPUT", trim(timeStamp))
+ call mpas_output_state_init(output_obj, domain, "OUTPUT", output_frame, trim(timeStamp))
end if
call atmh_write_output_frame(output_obj, output_frame, domain)
end if
@@ -119,7 +122,7 @@
call mpas_reset_clock_alarm(clock, restartAlarmID, ierr=ierr)
! Write one restart time per file
- call mpas_output_state_init(restart_obj, domain, "RESTART", trim(timeStamp))
+ call mpas_output_state_init(restart_obj, domain, "RESTART", restart_frame, trim(timeStamp))
call mpas_output_state_for_domain(restart_obj, domain, 1)
call mpas_output_state_finalize(restart_obj, domain % dminfo)
end if
Modified: branches/ocean_projects/first_output_optional/src/core_init_nhyd_atmos/mpas_init_atm_test_cases.F
===================================================================
--- branches/ocean_projects/first_output_optional/src/core_init_nhyd_atmos/mpas_init_atm_test_cases.F        2012-05-15 17:54:07 UTC (rev 1914)
+++ branches/ocean_projects/first_output_optional/src/core_init_nhyd_atmos/mpas_init_atm_test_cases.F        2012-05-15 19:55:24 UTC (rev 1915)
@@ -4337,7 +4337,9 @@
type (MPAS_Time_type) :: start_time, stop_time, curr_time
type (MPAS_TimeInterval_type) :: fg_interval
character (len=StrKIND) :: timeString
+ integer :: sfc_frame
+ sfc_frame = 1
! Set interpolation sequence to be used for SST/SKINTEMP field
interp_list(1) = FOUR_POINT
@@ -4357,7 +4359,7 @@
sfc_update_obj % time = 1
sfc_update_obj % filename = trim(config_sfc_update_name)
- call mpas_output_state_init(sfc_update_obj, domain, "SFC")
+ call mpas_output_state_init(sfc_update_obj, domain, "SFC", sfc_frame)
! Loop over all times, interpolating the SST/SKINTEMP field from each intermediate file
curr_time = mpas_get_clock_time(fg_clock, MPAS_NOW)
Modified: branches/ocean_projects/first_output_optional/src/core_nhyd_atmos/mpas_atm_mpas_core.F
===================================================================
--- branches/ocean_projects/first_output_optional/src/core_nhyd_atmos/mpas_atm_mpas_core.F        2012-05-15 17:54:07 UTC (rev 1914)
+++ branches/ocean_projects/first_output_optional/src/core_nhyd_atmos/mpas_atm_mpas_core.F        2012-05-15 19:55:24 UTC (rev 1915)
@@ -244,9 +244,12 @@
type (MPAS_Time_Type) :: currTime
character(len=StrKIND) :: timeStamp
integer :: itimestep
+ integer :: restart_frame
integer :: ierr
logical :: first_output
+ restart_frame = 1
+
! Eventually, dt should be domain specific
dt = config_dt
@@ -294,7 +297,7 @@
if (config_write_initial_output.or.(.not.first_output)) then
call mpas_output_state_finalize(output_obj, domain % dminfo)
end if
- call mpas_output_state_init(output_obj, domain, "OUTPUT", trim(timeStamp))
+ call mpas_output_state_init(output_obj, domain, "OUTPUT", output_frame, trim(timeStamp))
end if
call atm_write_output_frame(output_obj, output_frame, domain)
end if
@@ -309,7 +312,7 @@
end do
! Write one restart time per file
- call mpas_output_state_init(restart_obj, domain, "RESTART", trim(timeStamp))
+ call mpas_output_state_init(restart_obj, domain, "RESTART", restart_frame, trim(timeStamp))
call mpas_output_state_for_domain(restart_obj, domain, 1)
call mpas_output_state_finalize(restart_obj, domain % dminfo)
end if
Modified: branches/ocean_projects/first_output_optional/src/core_ocean/mpas_ocn_mpas_core.F
===================================================================
--- branches/ocean_projects/first_output_optional/src/core_ocean/mpas_ocn_mpas_core.F        2012-05-15 17:54:07 UTC (rev 1914)
+++ branches/ocean_projects/first_output_optional/src/core_ocean/mpas_ocn_mpas_core.F        2012-05-15 19:55:24 UTC (rev 1915)
@@ -166,7 +166,7 @@
call mpas_timer_start("global diagnostics", .false., globalDiagTimer)
call ocn_compute_global_diagnostics(domain, 1 , 0, dt)
call mpas_timer_stop("global diagnostics", globalDiagTimer)
-! call mpas_output_state_init(output_obj, domain, "OUTPUT")
+! call mpas_output_state_init(output_obj, domain, "OUTPUT", output_frame)
! call ocn_write_output_frame(output_obj, output_frame, domain)
endif
@@ -342,8 +342,11 @@
type (MPAS_Time_Type) :: currTime
character(len=StrKIND) :: timeStamp
+ integer :: restart_frame
integer :: ierr
logical :: first_output
+
+ restart_frame = 1
! Eventually, dt should be domain specific
dt = config_dt
@@ -398,7 +401,7 @@
if (config_write_initial_output.or.(.not.first_output)) then
call mpas_output_state_finalize(output_obj, domain % dminfo)
end if
- call mpas_output_state_init(output_obj, domain, "OUTPUT", trim(timeStamp))
+ call mpas_output_state_init(output_obj, domain, "OUTPUT", output_frame, trim(timeStamp))
first_output = .false.
end if
@@ -421,7 +424,7 @@
call mpas_reset_clock_alarm(clock, restartAlarmID, ierr=ierr)
! Write one restart time per file
- call mpas_output_state_init(restart_obj, domain, "RESTART", trim(timeStamp))
+ call mpas_output_state_init(restart_obj, domain, "RESTART", restart_frame, trim(timeStamp))
call mpas_output_state_for_domain(restart_obj, domain, 1)
call mpas_output_state_finalize(restart_obj, domain % dminfo)
end if
Modified: branches/ocean_projects/first_output_optional/src/core_sw/mpas_sw_mpas_core.F
===================================================================
--- branches/ocean_projects/first_output_optional/src/core_sw/mpas_sw_mpas_core.F        2012-05-15 17:54:07 UTC (rev 1914)
+++ branches/ocean_projects/first_output_optional/src/core_sw/mpas_sw_mpas_core.F        2012-05-15 19:55:24 UTC (rev 1915)
@@ -159,8 +159,11 @@
type (MPAS_Time_Type) :: currTime
character(len=StrKIND) :: timeStamp
+ integer :: restart_frame
integer :: ierr
logical :: first_output
+
+ restart_frame = 1
! Eventually, dt should be domain specific
dt = config_dt
@@ -202,7 +205,7 @@
if (config_write_initial_output.or.(.not.first_output)) then
call mpas_output_state_finalize(output_obj, domain % dminfo)
end if
- call mpas_output_state_init(output_obj, domain, "OUTPUT", trim(timeStamp))
+ call mpas_output_state_init(output_obj, domain, "OUTPUT", output_frame, trim(timeStamp))
end if
call write_output_frame(output_obj, output_frame, domain)
end if
@@ -211,7 +214,7 @@
call mpas_reset_clock_alarm(clock, restartAlarmID, ierr=ierr)
! Write one restart time per file
- call mpas_output_state_init(restart_obj, domain, "RESTART", trim(timeStamp))
+ call mpas_output_state_init(restart_obj, domain, "RESTART", restart_frame, trim(timeStamp))
call mpas_output_state_for_domain(restart_obj, domain, 1)
call mpas_output_state_finalize(restart_obj, domain % dminfo)
end if
@@ -248,6 +251,8 @@
block_ptr => block_ptr % next
end do
+write(0,*) 'MGD xtime 2 test before initial output = '//trim(domain % blocklist % state % time_levs(1) % state % xtime % scalar)
+write(0,*) 'MGD xtime 2 output_frame = ', output_frame
call mpas_output_state_for_domain(output_obj, domain, output_frame)
output_frame = output_frame + 1
Modified: branches/ocean_projects/first_output_optional/src/driver/mpas_subdriver.F
===================================================================
--- branches/ocean_projects/first_output_optional/src/driver/mpas_subdriver.F        2012-05-15 17:54:07 UTC (rev 1914)
+++ branches/ocean_projects/first_output_optional/src/driver/mpas_subdriver.F        2012-05-15 19:55:24 UTC (rev 1915)
@@ -46,9 +46,9 @@
if (config_write_initial_output) then
if(config_frames_per_outfile > 0) then
- call mpas_output_state_init(output_obj, domain, "OUTPUT", trim(timeStamp))
+ call mpas_output_state_init(output_obj, domain, "OUTPUT", output_frame, trim(timeStamp))
else
- call mpas_output_state_init(output_obj, domain, "OUTPUT")
+ call mpas_output_state_init(output_obj, domain, "OUTPUT", output_frame)
end if
end if
Modified: branches/ocean_projects/first_output_optional/src/framework/mpas_io.F
===================================================================
--- branches/ocean_projects/first_output_optional/src/framework/mpas_io.F        2012-05-15 17:54:07 UTC (rev 1914)
+++ branches/ocean_projects/first_output_optional/src/framework/mpas_io.F        2012-05-15 19:55:24 UTC (rev 1915)
@@ -9,19 +9,20 @@
use pio_types
! File access modes
- integer, parameter :: MPAS_IO_READ = 1, &
- MPAS_IO_WRITE = 2
+ integer, parameter :: MPAS_IO_READ = 1, &
+ MPAS_IO_WRITE = 2, &
+ MPAS_IO_APPEND = 3
! I/O formats
- integer, parameter :: MPAS_IO_NETCDF = 3, &
- MPAS_IO_PNETCDF = 4
+ integer, parameter :: MPAS_IO_NETCDF = 4, &
+ MPAS_IO_PNETCDF = 5
! Field and attribute types
- integer, parameter :: MPAS_IO_REAL = 5, &
- MPAS_IO_DOUBLE = 6, &
- MPAS_IO_INT = 7, &
- MPAS_IO_LOGICAL = 8, &
- MPAS_IO_CHAR = 9
+ integer, parameter :: MPAS_IO_REAL = 6, &
+ MPAS_IO_DOUBLE = 7, &
+ MPAS_IO_INT = 8, &
+ MPAS_IO_LOGICAL = 9, &
+ MPAS_IO_CHAR = 10
! Unlimited / record dimension
integer, parameter :: MPAS_IO_UNLIMITED_DIM = -123456
@@ -229,8 +230,9 @@
! Sanity checks
- if (mode /= MPAS_IO_READ .and. &
- mode /= MPAS_IO_WRITE) then
+ if (mode /= MPAS_IO_READ .and. &
+ mode /= MPAS_IO_WRITE .and. &
+ mode /= MPAS_IO_APPEND) then
if (present(ierr)) ierr = MPAS_IO_ERR_INVALID_MODE
return
end if
@@ -257,6 +259,10 @@
if (mode == MPAS_IO_WRITE) then
!write(0,*) 'MGD PIO_createfile'
pio_ierr = PIO_createfile(pio_iosystem, MPAS_io_open % pio_file, pio_iotype, trim(filename), PIO_64BIT_OFFSET)
+!write(0,*) 'APPEND: Creating new file'
+ else if (mode == MPAS_IO_APPEND) then
+ pio_ierr = PIO_openfile(pio_iosystem, MPAS_io_open % pio_file, pio_iotype, trim(filename), PIO_write)
+!write(0,*) 'APPEND: Appending to existing file'
else
!write(0,*) 'MGD PIO_openfile'
pio_ierr = PIO_openfile(pio_iosystem, MPAS_io_open % pio_file, pio_iotype, trim(filename), PIO_nowrite)
@@ -266,7 +272,8 @@
return
end if
- if (mode == MPAS_IO_READ) then
+ if (mode == MPAS_IO_READ .or. &
+ mode == MPAS_IO_APPEND) then
!MPAS_io_open % pio_unlimited_dimid = 44
pio_ierr = PIO_inquire(MPAS_io_open % pio_file, unlimitedDimID=MPAS_io_open % pio_unlimited_dimid)
!write(0,*) 'Found unlimited dim ', MPAS_io_open % pio_unlimited_dimid
@@ -301,7 +308,8 @@
if (present(ierr)) ierr = MPAS_IO_ERR_UNINIT_HANDLE
return
end if
- if (handle % iomode /= MPAS_IO_READ) then ! We could eventually handle this for write mode, too...
+ if (handle % iomode /= MPAS_IO_READ .and. &
+ handle % iomode /= MPAS_IO_APPEND) then ! We could eventually handle this for write mode, too...
if (present(ierr)) ierr = MPAS_IO_ERR_WRONG_MODE
return
end if
@@ -954,6 +962,7 @@
return
end if
+!if (field_cursor % fieldhandle % has_unlimited_dim) write(0,*) 'Field has an unlimited dimension...'
!
! Check whether a suitable decomposition already exists
@@ -1541,10 +1550,12 @@
if (.not. handle % data_mode) then
handle % data_mode = .true.
- pio_ierr = PIO_enddef(handle % pio_file)
- if (pio_ierr /= PIO_noerr) then
- if (present(ierr)) ierr = MPAS_IO_ERR_PIO
- return
+ if (handle % iomode /= MPAS_IO_APPEND) then
+ pio_ierr = PIO_enddef(handle % pio_file)
+ if (pio_ierr /= PIO_noerr) then
+ if (present(ierr)) ierr = MPAS_IO_ERR_PIO
+ return
+ end if
end if
end if
Modified: branches/ocean_projects/first_output_optional/src/framework/mpas_io_output.F
===================================================================
--- branches/ocean_projects/first_output_optional/src/framework/mpas_io_output.F        2012-05-15 17:54:07 UTC (rev 1914)
+++ branches/ocean_projects/first_output_optional/src/framework/mpas_io_output.F        2012-05-15 19:55:24 UTC (rev 1915)
@@ -23,13 +23,14 @@
contains
- subroutine mpas_output_state_init(output_obj, domain, stream, outputSuffix)
+ subroutine mpas_output_state_init(output_obj, domain, stream, frame, outputSuffix)
implicit none
type (io_output_object), intent(inout) :: output_obj
type (domain_type), intent(in) :: domain
character (len=*) :: stream
+ integer, intent(inout) :: frame
character (len=*), optional :: outputSuffix
character (len=StrKIND) :: tempfilename
@@ -62,7 +63,7 @@
! For now, we assume that a domain consists only of one block,
! although in future, work needs to be done to write model state
! from many distributed blocks
- call mpas_io_output_init(domain, output_obj, domain % dminfo, &
+ call mpas_io_output_init(domain, output_obj, frame, domain % dminfo, &
block_ptr % mesh &
)
@@ -234,7 +235,7 @@
end subroutine mpas_output_state_finalize
- subroutine mpas_io_output_init( domain, output_obj, &
+ subroutine mpas_io_output_init( domain, output_obj, frame, &
dminfo, &
mesh &
)
@@ -243,13 +244,25 @@
type (domain_type), intent(in) :: domain
type (io_output_object), intent(inout) :: output_obj
+ integer, intent(inout) :: frame
type (dm_info), intent(in) :: dminfo
type (mesh_type), intent(in) :: mesh
integer :: nferr, ierr
integer, dimension(10) :: dimlist
+ logical :: already_exists
+ character (len=StrKIND) :: actualTime
- call MPAS_createStream(output_obj % io_stream, trim(output_obj % filename), MPAS_IO_PNETCDF, MPAS_IO_WRITE, 1, nferr)
+ inquire(file=trim(output_obj % filename), exist=already_exists)
+
+ if (already_exists .and. config_do_restart) then
+ call MPAS_createStream(output_obj % io_stream, trim(output_obj % filename), MPAS_IO_PNETCDF, MPAS_IO_APPEND, 1, nferr)
+ frame = MPAS_seekStream(output_obj % io_stream, &
+ trim(domain % blocklist % state % time_levs(1) % state % xtime % scalar), &
+ MPAS_STREAM_EARLIEST_AFTER, actualTime, ierr)
+ else
+ call MPAS_createStream(output_obj % io_stream, trim(output_obj % filename), MPAS_IO_PNETCDF, MPAS_IO_WRITE, 1, nferr)
+ end if
#include "add_output_fields.inc"
Modified: branches/ocean_projects/first_output_optional/src/framework/mpas_io_streams.F
===================================================================
--- branches/ocean_projects/first_output_optional/src/framework/mpas_io_streams.F        2012-05-15 17:54:07 UTC (rev 1914)
+++ branches/ocean_projects/first_output_optional/src/framework/mpas_io_streams.F        2012-05-15 19:55:24 UTC (rev 1915)
@@ -1198,8 +1198,9 @@
deallocate(new_field_list_node)
return
end if
-
- else if (stream % ioDirection == MPAS_IO_READ) then
+
+ else if (stream % ioDirection == MPAS_IO_READ .or. &
+ stream % ioDirection == MPAS_IO_APPEND) then
!write(0,*) '... inquiring about'
call MPAS_io_inq_var(stream % fileHandle, trim(fieldName), dimnames=dimNamesInq, dimsizes=dimSizesInq, ierr=io_err)
@@ -2738,6 +2739,8 @@
end select
att_cursor => att_cursor % next
end do
+ else if (ioDirection == MPAS_IO_APPEND) then
+! Do nothing for now
else
do while (associated(att_cursor))
select case (att_cursor % attType)
</font>
</pre>