<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, &quot;OUTPUT&quot;, trim(timeStamp)) 
+               call mpas_output_state_init(output_obj, domain, &quot;OUTPUT&quot;, 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, &quot;RESTART&quot;, trim(timeStamp))
+            call mpas_output_state_init(restart_obj, domain, &quot;RESTART&quot;, 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, &quot;SFC&quot;)
+      call mpas_output_state_init(sfc_update_obj, domain, &quot;SFC&quot;, 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, &quot;OUTPUT&quot;, trim(timeStamp))
+               call mpas_output_state_init(output_obj, domain, &quot;OUTPUT&quot;, 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, &quot;RESTART&quot;, trim(timeStamp))
+            call mpas_output_state_init(restart_obj, domain, &quot;RESTART&quot;, 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(&quot;global diagnostics&quot;, .false., globalDiagTimer)
           call ocn_compute_global_diagnostics(domain, 1 , 0, dt)
           call mpas_timer_stop(&quot;global diagnostics&quot;, globalDiagTimer)
-!         call mpas_output_state_init(output_obj, domain, &quot;OUTPUT&quot;)
+!         call mpas_output_state_init(output_obj, domain, &quot;OUTPUT&quot;, 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, &quot;OUTPUT&quot;, trim(timeStamp))
+               call mpas_output_state_init(output_obj, domain, &quot;OUTPUT&quot;, 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, &quot;RESTART&quot;, trim(timeStamp))
+            call mpas_output_state_init(restart_obj, domain, &quot;RESTART&quot;, 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, &quot;OUTPUT&quot;, trim(timeStamp))
+               call mpas_output_state_init(output_obj, domain, &quot;OUTPUT&quot;, 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, &quot;RESTART&quot;, trim(timeStamp))
+            call mpas_output_state_init(restart_obj, domain, &quot;RESTART&quot;, 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 =&gt; 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 &gt; 0) then
-            call mpas_output_state_init(output_obj, domain, &quot;OUTPUT&quot;, trim(timeStamp))
+            call mpas_output_state_init(output_obj, domain, &quot;OUTPUT&quot;, output_frame, trim(timeStamp))
          else
-            call mpas_output_state_init(output_obj, domain, &quot;OUTPUT&quot;)         
+            call mpas_output_state_init(output_obj, domain, &quot;OUTPUT&quot;, 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, &amp;
-                         MPAS_IO_WRITE = 2
+   integer, parameter :: MPAS_IO_READ   = 1, &amp;
+                         MPAS_IO_WRITE  = 2, &amp;
+                         MPAS_IO_APPEND = 3
 
    ! I/O formats
-   integer, parameter :: MPAS_IO_NETCDF  = 3, &amp;
-                         MPAS_IO_PNETCDF = 4
+   integer, parameter :: MPAS_IO_NETCDF  = 4, &amp;
+                         MPAS_IO_PNETCDF = 5
 
    ! Field and attribute types
-   integer, parameter :: MPAS_IO_REAL     = 5,  &amp;
-                         MPAS_IO_DOUBLE   = 6,  &amp;
-                         MPAS_IO_INT      = 7,  &amp;
-                         MPAS_IO_LOGICAL  = 8,  &amp;
-                         MPAS_IO_CHAR     = 9
+   integer, parameter :: MPAS_IO_REAL     = 6,  &amp;
+                         MPAS_IO_DOUBLE   = 7,  &amp;
+                         MPAS_IO_INT      = 8,  &amp;
+                         MPAS_IO_LOGICAL  = 9,  &amp;
+                         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. &amp;
-          mode /= MPAS_IO_WRITE) then
+      if (mode /= MPAS_IO_READ  .and. &amp;
+          mode /= MPAS_IO_WRITE .and. &amp;
+          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. &amp;
+          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. &amp;
+          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, &amp;
+      call mpas_io_output_init(domain, output_obj, frame, domain % dminfo, &amp;
                           block_ptr % mesh &amp;
                          )
 
@@ -234,7 +235,7 @@
    end subroutine mpas_output_state_finalize
 
 
-   subroutine mpas_io_output_init( domain, output_obj, &amp;
+   subroutine mpas_io_output_init( domain, output_obj, frame, &amp;
                               dminfo, &amp;
                               mesh &amp;
                             )
@@ -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, &amp;
+                                 trim(domain % blocklist % state % time_levs(1) % state % xtime % scalar), &amp;
+                                 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 &quot;add_output_fields.inc&quot;
 

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. &amp;
+               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 =&gt; 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>