<p><b>duda</b> 2012-04-02 19:05:22 -0600 (Mon, 02 Apr 2012)</p><p>BRANCH COMMIT<br>
<br>
Minor fix in the low-level IO layer and new code at the stream layer to support reading and writing character strings.<br>
<br>
<br>
M    src/framework/mpas_io.F<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.F
===================================================================
--- branches/omp_blocks/io/src/framework/mpas_io.F        2012-04-02 23:21:37 UTC (rev 1741)
+++ branches/omp_blocks/io/src/framework/mpas_io.F        2012-04-03 01:05:22 UTC (rev 1742)
@@ -948,7 +948,8 @@
       ! If this is a scalar field, just return
       !
       if (field_cursor % fieldhandle % ndims == 0 .or. &amp;
-          (field_cursor % fieldhandle % ndims == 1 .and. field_cursor % fieldhandle % has_unlimited_dim)) then
+          (field_cursor % fieldhandle % ndims == 1 .and. field_cursor % fieldhandle % has_unlimited_dim) .or. &amp;
+          field_cursor % fieldhandle % field_type == MPAS_IO_CHAR) then
 write(0,*) 'No need to create a decomposition for a 0d field...'
          return
       end if

Modified: branches/omp_blocks/io/src/framework/mpas_io_streams.F
===================================================================
--- branches/omp_blocks/io/src/framework/mpas_io_streams.F        2012-04-02 23:21:37 UTC (rev 1741)
+++ branches/omp_blocks/io/src/framework/mpas_io_streams.F        2012-04-03 01:05:22 UTC (rev 1742)
@@ -41,6 +41,7 @@
       module procedure MPAS_streamAddField_1dReal
       module procedure MPAS_streamAddField_2dReal
       module procedure MPAS_streamAddField_3dReal
+      module procedure MPAS_streamAddField_0dChar
    end interface MPAS_streamAddField
 
    interface MPAS_readStreamAtt
@@ -783,6 +784,100 @@
    end subroutine MPAS_streamAddField_3dReal
 
 
+   subroutine MPAS_streamAddField_0dChar(stream, field, ierr)
+
+      implicit none
+
+      type (MPAS_Stream_type), intent(inout) :: stream
+      type (field0DChar), intent(in), target :: field
+      integer, intent(out), optional :: ierr
+
+      integer :: io_err
+      integer :: i
+      integer :: idim
+      integer :: totalDimSize, globalDimSize
+      logical :: isDecomposed
+      integer :: ndims
+      type (field0dChar), pointer :: field_ptr
+      character (len=64), dimension(5) :: dimNames
+      character (len=64), dimension(:), pointer :: dimNamesInq
+      integer, dimension(:), pointer :: dimSizes
+      integer, dimension(:), pointer :: indices
+      type (field_list_type), pointer :: field_list_cursor
+      type (field_list_type), pointer :: new_field_list_node
+
+      if (present(ierr)) ierr = MPAS_STREAM_NOERR
+
+      !
+      ! Sanity checks
+      !
+      if (.not. stream % isInitialized) then
+         if (present(ierr)) ierr = MPAS_STREAM_NOT_INITIALIZED
+         return
+      end if
+
+write(0,*) '... Adding field '//trim(field % fieldName)//' to stream'
+
+      ndims = 1
+
+write(0,*) '... field has ', ndims, ' dimensions'
+
+      ! 
+      ! Determine whether the field is decomposed, the indices that are owned by this task's blocks,
+      !    and the total number of outer-indices owned by this task
+      ! 
+      idim = ndims
+      allocate(indices(0))
+      allocate(dimSizes(1))
+      dimSizes(1) = 64
+      dimNames(1) = 'StrLen'
+      isDecomposed = .false.
+      globalDimSize = 64
+      totalDimSize = 64
+
+      
+      if (field % isSuperArray) then
+         do i=1,size(field % constituentNames)
+            call MPAS_streamAddField_generic(stream, trim(field % constituentNames(i)), MPAS_IO_CHAR, dimNames(1:1), &amp;
+                                             dimSizes, field % hasTimeDimension, isDecomposed, totalDimSize, globalDimSize, &amp;
+                                             indices, io_err)
+         end do
+      else
+         call MPAS_streamAddField_generic(stream, trim(field % fieldName), MPAS_IO_CHAR, dimNames(1:1), dimSizes, &amp;
+                                          field % hasTimeDimension, isDecomposed, totalDimSize, globalDimSize, indices, io_err)
+      end if
+
+      deallocate(indices)
+      deallocate(dimSizes)
+      if (io_err /= MPAS_STREAM_NOERR) then
+          if (present(ierr)) ierr = MPAS_IO_ERR
+          return
+      end if
+
+      if (field % isSuperArray) then
+         do i=1,size(field % constituentNames)
+            call put_get_field_atts(stream % fileHandle, stream % ioDirection, trim(field % constituentNames(i)), field % attList)
+         end do
+      else
+         call put_get_field_atts(stream % fileHandle, stream % ioDirection, trim(field % fieldname), field % attList)
+      end if
+
+
+      !
+      ! Set field pointer and type in fieldList
+      !
+      new_field_list_node =&gt; stream % fieldList
+      do while (associated(new_field_list_node % next))
+         new_field_list_node =&gt; new_field_list_node % next
+      end do
+      new_field_list_node % field_type = FIELD_0D_CHAR
+      new_field_list_node % char0dField =&gt; field
+
+write(0,*) '... done adding field'
+
+   end subroutine MPAS_streamAddField_0dChar
+
+
    subroutine MPAS_streamAddField_generic(stream, fieldName, fieldType, dimNames, dimSizes, hasTimeDimension, isDecomposed, &amp;
                                           totalDimSize, globalDimSize, indices, ierr)
 
@@ -1512,6 +1607,28 @@
             end if
 
          else if (field_cursor % field_type == FIELD_0D_CHAR) then
+
+write(0,*) 'Reading in field '//trim(field_cursor % char0dField % fieldName)
+write(0,*) '   &gt; is the field decomposed? ', field_cursor % isDecomposed
+write(0,*) '   &gt; outer dimension size ', field_cursor % totalDimSize
+
+write(0,*) 'MGD calling MPAS_io_get_var now...'
+            call MPAS_io_get_var(stream % fileHandle, field_cursor % char0dField % fieldName, field_cursor % char0dField % scalar, 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
+
+write(0,*) 'Distributing and Copying field to other blocks'
+
+            call mpas_dmpar_bcast_char(field_cursor % int0dField % block % domain % dminfo, field_cursor % char0dField % scalar)
+            field_0dchar_ptr =&gt; field_cursor % char0dField
+            do while (associated(field_0dchar_ptr))
+               field_0dchar_ptr % scalar = field_cursor % char0dField % scalar
+               field_0dchar_ptr =&gt; field_0dchar_ptr % next
+            end do
+
          else if (field_cursor % field_type == FIELD_1D_CHAR) then
          end if
          field_cursor =&gt; field_cursor % next
@@ -1954,6 +2071,17 @@
             end if
 
          else if (field_cursor % field_type == FIELD_0D_CHAR) then
+
+write(0,*) 'Writing out field '//trim(field_cursor % char0dField % fieldName)
+write(0,*) '   &gt; is the field decomposed? ', field_cursor % isDecomposed
+write(0,*) '   &gt; outer dimension size ', field_cursor % totalDimSize
+
+write(0,*) 'Copying field from first block'
+write(0,*) 'MGD calling MPAS_io_put_var now...'
+            call MPAS_io_put_var(stream % fileHandle, field_cursor % char0dField % fieldName, field_cursor % char0dField % scalar, io_err)
+            call MPAS_io_err_mesg(io_err, .false.)
+            if (io_err /= MPAS_IO_NOERR .and. present(ierr)) ierr = MPAS_IO_ERR
+
          else if (field_cursor % field_type == FIELD_1D_CHAR) then
          end if
          field_cursor =&gt; field_cursor % next

</font>
</pre>