<p><b>duda</b> 2012-03-22 14:55:04 -0600 (Thu, 22 Mar 2012)</p><p>Add functionality for writing streams (currently just for 1d integer fields).<br>
<br>
<br>
M    src/framework/mpas_io_streams.F<br>
</p><hr noshade><pre><font color="gray">Modified: branches/omp_blocks/io/src/framework/mpas_io_streams.F
===================================================================
--- branches/omp_blocks/io/src/framework/mpas_io_streams.F        2012-03-22 16:52:53 UTC (rev 1695)
+++ branches/omp_blocks/io/src/framework/mpas_io_streams.F        2012-03-22 20:55:04 UTC (rev 1696)
@@ -121,6 +121,7 @@
       integer :: ndims
       type (field1dInteger), pointer :: field_ptr
       character (len=64), dimension(5) :: dimNames
+      character (len=64), dimension(:), pointer :: dimNamesInq
       integer, dimension(:), pointer :: indices
       type (field_list_type), pointer :: field_list_cursor
       type (field_list_type), pointer :: new_field_list_node
@@ -234,6 +235,56 @@
       else if (stream % ioDirection == MPAS_IO_READ) then
 write(0,*) '... inquiring about'
 
+         call MPAS_io_inq_var(stream % fileHandle, trim(field % fieldName), dimnames=dimNamesInq, ierr=io_err)
+         call MPAS_io_err_mesg(io_err, .false.)
+         if (io_err /= MPAS_IO_NOERR) then
+            if (present(ierr)) ierr = MPAS_IO_ERR
+            return
+         end if
+
+         do i=1,ndims
+write(0,*) 'Comparing '//trim(field % dimNames(i))//' '//trim(dimNamesInq(i))
+         end do 
+
+         ! Define outer-most dimension; handle known decomposed dimensions
+         idim = ndims
+         localDimSize = 0
+         field_ptr =&gt; field
+         if (trim(field % dimNames(idim)) == 'nCells') then
+write(0,*) '... outer dimension is nCells'
+            do while (associated(field_ptr))
+               localDimSize = localDimSize + field_ptr % block % mesh % nCellsSolve
+               field_ptr =&gt; field_ptr % next
+            end do 
+            call mpas_dmpar_sum_int(field % block % domain % dminfo, localDimSize, globalDimSize)
+            new_field_list_node % isDecomposed = .true.
+            new_field_list_node % totalDimSize = localDimSize
+         else if (trim(field % dimNames(idim)) == 'nEdges') then
+write(0,*) '... outer dimension is nEdges'
+            do while (associated(field_ptr))
+               localDimSize = localDimSize + field_ptr % block % mesh % nEdgesSolve
+               field_ptr =&gt; field_ptr % next
+            end do 
+            call mpas_dmpar_sum_int(field % block % domain % dminfo, localDimSize, globalDimSize)
+            new_field_list_node % isDecomposed = .true.
+            new_field_list_node % totalDimSize = localDimSize
+         else if (trim(field % dimNames(idim)) == 'nVertices') then
+write(0,*) '... outer dimension is nVertices'
+            do while (associated(field_ptr))
+               localDimSize = localDimSize + field_ptr % block % mesh % nVerticesSolve
+               field_ptr =&gt; field_ptr % next
+            end do 
+            call mpas_dmpar_sum_int(field % block % domain % dminfo, localDimSize, globalDimSize)
+            new_field_list_node % isDecomposed = .true.
+            new_field_list_node % totalDimSize = localDimSize
+         else
+            globalDimSize = field % dimSizes(idim)
+            new_field_list_node % isDecomposed = .false.
+            new_field_list_node % totalDimSize = globalDimSize
+         end if
+
+         deallocate(dimNamesInq)
+
       end if
 
       
@@ -318,6 +369,29 @@
       integer, intent(in) :: frame
       integer, intent(out), optional :: ierr
 
+      integer :: io_err
+      integer :: i
+      integer :: ownedSize
+      type (field0dInteger), pointer :: field_0dint_ptr
+      type (field1dInteger), pointer :: field_1dint_ptr
+      type (field2dInteger), pointer :: field_2dint_ptr
+      type (field3dInteger), pointer :: field_3dint_ptr
+      type (field0dReal), pointer :: field_0dreal_ptr
+      type (field1dReal), pointer :: field_1dreal_ptr
+      type (field2dReal), pointer :: field_2dreal_ptr
+      type (field3dReal), pointer :: field_3dreal_ptr
+      type (field0dChar), pointer :: field_0dchar_ptr
+      type (field1dChar), pointer :: field_1dchar_ptr
+      type (field_list_type), pointer :: field_cursor
+      integer                            :: int0d_temp
+      integer, dimension(:),     pointer :: int1d_temp
+      integer, dimension(:,:),   pointer :: int2d_temp
+      integer, dimension(:,:,:), pointer :: int3d_temp
+      real (kind=RKIND)                            :: real0d_temp
+      real (kind=RKIND), dimension(:),     pointer :: real1d_temp
+      real (kind=RKIND), dimension(:,:),   pointer :: real2d_temp
+      real (kind=RKIND), dimension(:,:,:), pointer :: real3d_temp
+
       if (present(ierr)) ierr = MPAS_STREAM_NOERR
 
       !
@@ -328,6 +402,87 @@
          return
       end if
 
+
+      !
+      ! Set time frame to real
+      !
+      call MPAS_io_set_frame(stream % fileHandle, frame, io_err) 
+      call MPAS_io_err_mesg(io_err, .false.)
+      if (io_err /= MPAS_IO_NOERR) then
+         if (present(ierr)) ierr = MPAS_IO_ERR
+         return
+      end if
+
+
+      !
+      ! Loop over fields in the stream
+      !
+      field_cursor =&gt; stream % fieldList
+      do while (associated(field_cursor))
+         if (field_cursor % field_type == FIELD_0D_INT) then
+
+         else if (field_cursor % field_type == FIELD_1D_INT) then
+write(0,*) 'Reading in field '//trim(field_cursor % int1dField % fieldName)
+write(0,*) '   &gt; is the field decomposed? ', field_cursor % isDecomposed
+write(0,*) '   &gt; outer dimension size ', field_cursor % totalDimSize
+
+            allocate(int1d_temp(field_cursor % totalDimSize))
+
+write(0,*) 'MGD calling MPAS_io_get_var now...'
+            call MPAS_io_get_var(stream % fileHandle, field_cursor % int1dField % fieldName, int1d_temp, io_err)
+            call MPAS_io_err_mesg(io_err, .false.)
+            if (io_err /= MPAS_IO_NOERR) then
+                if (present(ierr)) ierr = MPAS_IO_ERR
+                deallocate(int1d_temp)
+                return
+            end if
+
+            if (field_cursor % isDecomposed) then
+write(0,*) 'Gathering field from across all blocks'
+               ! Distribute field to multiple blocks
+               field_1dint_ptr =&gt; field_cursor % int1dField
+               i = 1
+! Could this be something we do in streamAddField routines, since we already have such tests?
+               if (trim(field_1dint_ptr % dimNames(1)) == 'nCells') then
+                  ownedSize = field_1dint_ptr % block % mesh % nCellsSolve
+               else if (trim(field_1dint_ptr % dimNames(1)) == 'nEdges') then
+                  ownedSize = field_1dint_ptr % block % mesh % nEdgesSolve
+               else if (trim(field_1dint_ptr % dimNames(1)) == 'nVertices') then
+                  ownedSize = field_1dint_ptr % block % mesh % nVerticesSolve
+               else
+                  ownedSize = field_1dint_ptr % dimSizes(1)
+               end if
+               do while (associated(field_1dint_ptr))
+write(0,*) '   &gt; copying block ', i, i+ownedSize-1
+                  field_1dint_ptr % array(1:ownedSize) = int1d_temp(i:i+ownedSize-1)
+                  i = i + ownedSize
+                  field_1dint_ptr =&gt; field_1dint_ptr % next
+               end do
+            else
+write(0,*) 'Distributing and Copying field to other blocks'
+
+               call mpas_dmpar_bcast_ints(field_cursor % int1dField % block % domain % dminfo, size(int1d_temp), int1d_temp(:))
+               field_1dint_ptr =&gt; field_cursor % int1dField
+               do while (associated(field_1dint_ptr))
+                  field_1dint_ptr % array(:) = int1d_temp(:)
+                  field_1dint_ptr =&gt; field_1dint_ptr % next
+               end do
+            end if
+
+            deallocate(int1d_temp)
+
+         else if (field_cursor % field_type == FIELD_2D_INT) then
+         else if (field_cursor % field_type == FIELD_3D_INT) then
+         else if (field_cursor % field_type == FIELD_0D_REAL) then
+         else if (field_cursor % field_type == FIELD_1D_REAL) then
+         else if (field_cursor % field_type == FIELD_2D_REAL) then
+         else if (field_cursor % field_type == FIELD_3D_REAL) then
+         else if (field_cursor % field_type == FIELD_0D_CHAR) then
+         else if (field_cursor % field_type == FIELD_1D_CHAR) then
+         end if
+         field_cursor =&gt; field_cursor % next
+      end do
+
    end subroutine MPAS_readStream
 
 
@@ -342,7 +497,16 @@
       integer :: io_err
       integer :: i
       integer :: ownedSize
+      type (field0dInteger), pointer :: field_0dint_ptr
       type (field1dInteger), pointer :: field_1dint_ptr
+      type (field2dInteger), pointer :: field_2dint_ptr
+      type (field3dInteger), pointer :: field_3dint_ptr
+      type (field0dReal), pointer :: field_0dreal_ptr
+      type (field1dReal), pointer :: field_1dreal_ptr
+      type (field2dReal), pointer :: field_2dreal_ptr
+      type (field3dReal), pointer :: field_3dreal_ptr
+      type (field0dChar), pointer :: field_0dchar_ptr
+      type (field1dChar), pointer :: field_1dchar_ptr
       type (field_list_type), pointer :: field_cursor
       integer                            :: int0d_temp
       integer, dimension(:),     pointer :: int1d_temp
@@ -363,6 +527,9 @@
          return
       end if
 
+      !
+      ! Set time frame to write
+      !
       call MPAS_io_set_frame(stream % fileHandle, frame, io_err) 
       call MPAS_io_err_mesg(io_err, .false.)
       if (io_err /= MPAS_IO_NOERR) then
@@ -370,6 +537,9 @@
          return
       end if
 
+      !
+      ! Loop over fields in the stream
+      !
       field_cursor =&gt; stream % fieldList
       do while (associated(field_cursor))
          if (field_cursor % field_type == FIELD_0D_INT) then

</font>
</pre>