<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. &
- (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. &
+ 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), &
+ dimSizes, field % hasTimeDimension, isDecomposed, totalDimSize, globalDimSize, &
+ indices, io_err)
+ end do
+ else
+ call MPAS_streamAddField_generic(stream, trim(field % fieldName), MPAS_IO_CHAR, dimNames(1:1), dimSizes, &
+ 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 => stream % fieldList
+ do while (associated(new_field_list_node % next))
+ new_field_list_node => new_field_list_node % next
+ end do
+ new_field_list_node % field_type = FIELD_0D_CHAR
+ new_field_list_node % char0dField => field
+
+write(0,*) '... done adding field'
+
+ end subroutine MPAS_streamAddField_0dChar
+
+
subroutine MPAS_streamAddField_generic(stream, fieldName, fieldType, dimNames, dimSizes, hasTimeDimension, isDecomposed, &
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,*) ' > is the field decomposed? ', field_cursor % isDecomposed
+write(0,*) ' > 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 => field_cursor % char0dField
+ do while (associated(field_0dchar_ptr))
+ field_0dchar_ptr % scalar = field_cursor % char0dField % scalar
+ field_0dchar_ptr => field_0dchar_ptr % next
+ end do
+
else if (field_cursor % field_type == FIELD_1D_CHAR) then
end if
field_cursor => 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,*) ' > is the field decomposed? ', field_cursor % isDecomposed
+write(0,*) ' > 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 => field_cursor % next
</font>
</pre>