<p><b>duda</b> 2012-03-22 18:24:20 -0600 (Thu, 22 Mar 2012)</p><p>BRANCH COMMIT<br>
<br>
Factor out reusable parts of MPAS_streamAddField to make it easier to implement<br>
this routine (using less code, too) for field types besides 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 22:53:57 UTC (rev 1697)
+++ branches/omp_blocks/io/src/framework/mpas_io_streams.F        2012-03-23 00:24:20 UTC (rev 1698)
@@ -117,7 +117,8 @@
       integer :: io_err
       integer :: i
       integer :: idim
-      integer :: localDimSize, globalDimSize
+      integer :: totalDimSize, globalDimSize
+      logical :: isDecomposed
       integer :: ndims
       type (field1dInteger), pointer :: field_ptr
       character (len=64), dimension(5) :: dimNames
@@ -142,18 +143,126 @@
 
 write(0,*) '... field has ', ndims, ' dimensions'
 
-      allocate(new_field_list_node)
-      nullify(new_field_list_node % next)
+      ! 
+      ! 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
+      totalDimSize = 0
+      field_ptr =&gt; field
+      if (trim(field % dimNames(idim)) == 'nCells') then
+write(0,*) '... outer dimension is nCells'
+         allocate(indices(0))
+         do while (associated(field_ptr)) 
+            call mergeArrays(indices, field_ptr % block % mesh % indexToCellID % array(1:field_ptr % block % mesh % nCellsSolve))
+            totalDimSize = totalDimSize + field_ptr % block % mesh % nCellsSolve
+            field_ptr =&gt; field_ptr % next
+         end do 
+         call mpas_dmpar_sum_int(field % block % domain % dminfo, totalDimSize, globalDimSize)
+         isDecomposed = .true.
+      else if (trim(field % dimNames(idim)) == 'nEdges') then
+write(0,*) '... outer dimension is nEdges'
+         allocate(indices(0))
+         do while (associated(field_ptr)) 
+            call mergeArrays(indices, field_ptr % block % mesh % indexToEdgeID % array(1:field_ptr % block % mesh % nEdgesSolve))
+            totalDimSize = totalDimSize + field_ptr % block % mesh % nEdgesSolve
+            field_ptr =&gt; field_ptr % next
+         end do 
+         call mpas_dmpar_sum_int(field % block % domain % dminfo, totalDimSize, globalDimSize)
+         isDecomposed = .true.
+      else if (trim(field % dimNames(idim)) == 'nVertices') then
+write(0,*) '... outer dimension is nVertices'
+         allocate(indices(0))
+         do while (associated(field_ptr)) 
+            call mergeArrays(indices, field_ptr % block % mesh % indexToVertexID % array(1:field_ptr % block % mesh % nVerticesSolve))
+            totalDimSize = totalDimSize + field_ptr % block % mesh % nVerticesSolve
+            field_ptr =&gt; field_ptr % next
+         end do 
+         call mpas_dmpar_sum_int(field % block % domain % dminfo, totalDimSize, globalDimSize)
+         isDecomposed = .true.
+      else
+         isDecomposed = .false.
+         globalDimSize = field % dimSizes(idim)
+         totalDimSize = globalDimSize
+
+         if (field % block % domain % dminfo % my_proc_id == IO_NODE) then
+            ndims = 1
+            allocate(indices(field % dimSizes(ndims)))
+            do i=1,field % dimSizes(ndims)
+               indices(i) = i 
+            end do
+         else
+            allocate(indices(0))
+         end if
+      end if
+
+      
+      call MPAS_streamAddField_generic(stream, trim(field % fieldName), MPAS_IO_INT, field % dimNames, field % dimSizes, &amp;
+                                       field % hasTimeDimension, isDecomposed, totalDimSize, globalDimSize, indices, ierr)
+
+      deallocate(indices)
+
+
+      !
+      ! 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_1D_INT
       new_field_list_node % int1dField =&gt; field
 
+write(0,*) '... done adding field'
+
+   end subroutine MPAS_streamAddField_1dInteger
+
+
+   subroutine MPAS_streamAddField_generic(stream, fieldName, fieldType, dimNames, dimSizes, hasTimeDimension, isDecomposed, &amp;
+                                          totalDimSize, globalDimSize, indices, ierr)
+
+      implicit none
+
+      type (MPAS_Stream_type), intent(inout) :: stream
+      character (len=*), intent(in) :: fieldName
+      integer, intent(in) :: fieldType
+      character (len=64), dimension(:), intent(in) :: dimNames
+      integer, dimension(:), intent(in) :: dimSizes
+      logical, intent(in) :: hasTimeDimension
+      logical, intent(in) :: isDecomposed
+      integer, intent(in) :: totalDimSize
+      integer, intent(in) :: globalDimSize
+      integer, dimension(:), intent(in) :: indices
+      integer, intent(out), optional :: ierr
+
+      integer :: io_err
+      integer :: i
+      integer :: idim
+      integer :: ndims
+      character (len=64), dimension(5) :: dimNamesLocal
+      character (len=64), dimension(:), pointer :: dimNamesInq
+      type (field_list_type), pointer :: field_list_cursor
+      type (field_list_type), pointer :: new_field_list_node
+
+      if (present(ierr)) ierr = MPAS_STREAM_NOERR
+
+      ndims = size(dimNames)
+
+write(0,*) '... field has ', ndims, ' dimensions'
+
+      allocate(new_field_list_node)
+      nullify(new_field_list_node % next)
+
       if (stream % ioDirection == MPAS_IO_WRITE) then
 write(0,*) '... defining field'
 
+         !
+         ! Define inner dimensions
+         !
          do idim = 1, ndims-1
-write(0,*) '... defining dimension ', trim(field % dimNames(idim)), field % dimSizes(idim)
-            write(dimNames(idim),'(a)') field % dimNames(idim)
-            call MPAS_io_def_dim(stream % fileHandle, trim(field % dimNames(idim)), field % dimSizes(idim), io_err)
+write(0,*) '... defining dimension ', trim(dimNames(idim)), dimSizes(idim)
+            write(dimNamesLocal(idim),'(a)') dimNames(idim)
+            call MPAS_io_def_dim(stream % fileHandle, trim(dimNames(idim)), dimSizes(idim), io_err)
             call MPAS_io_err_mesg(io_err, .false.)
             if (io_err /= MPAS_IO_NOERR) then
                if (present(ierr)) ierr = MPAS_IO_ERR
@@ -161,54 +270,32 @@
             end if
          end do
 
-         ! Define outer-most dimension; handle known decomposed dimensions
+         !
+         ! Define outer-most dimension
+         !
          idim = ndims
-         localDimSize = 0
-         field_ptr =&gt; field
-         write(dimNames(idim),'(a)') field % dimNames(idim)
-         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
+         write(dimNamesLocal(idim),'(a)') dimNames(idim)
+
+         if (isDecomposed) then
+            new_field_list_node % totalDimSize = totalDimSize
          else
-            globalDimSize = field % dimSizes(idim)
-            new_field_list_node % isDecomposed = .false.
             new_field_list_node % totalDimSize = globalDimSize
          end if
 
-write(0,*) '... defining dimension ', trim(field % dimNames(idim)), globalDimSize
-         call MPAS_io_def_dim(stream % fileHandle, trim(field % dimNames(idim)), globalDimSize, io_err)
+         new_field_list_node % isDecomposed = isDecomposed
+  
+write(0,*) '... defining dimension ', trim(dimNames(idim)), globalDimSize
+         call MPAS_io_def_dim(stream % fileHandle, trim(dimNames(idim)), globalDimSize, 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
 
+         !
          ! Define time dimension if necessary
-         if (field % hasTimeDimension) then
+         !
+         if (hasTimeDimension) then
 write(0,*) '... defining Time dimension '
             call MPAS_io_def_dim(stream % fileHandle, 'Time', MPAS_IO_UNLIMITED_DIM, io_err)
             call MPAS_io_err_mesg(io_err, .false.)
@@ -217,15 +304,15 @@
                return
             end if
             ndims = ndims + 1
-            write(dimNames(ndims),'(a)') 'Time'
+            write(dimNamesLocal(ndims),'(a)') 'Time'
          end if
 
+         !
          ! Define variable to low-level interface
+         !
 write(0,*) '... defining var to low-level interface with ndims ', ndims
-do i=1,ndims
-   write(0,*) '   ...   '//trim(dimNames(i))
-end do
-         call MPAS_io_def_var(stream % fileHandle, trim(field % fieldName), MPAS_IO_INT, dimNames(1:ndims), io_err)
+
+         call MPAS_io_def_var(stream % fileHandle, trim(fieldName), fieldType, dimNamesLocal(1:ndims), io_err)
          call MPAS_io_err_mesg(io_err, .false.)
          if (io_err /= MPAS_IO_NOERR) then
             if (present(ierr)) ierr = MPAS_IO_ERR
@@ -235,54 +322,27 @@
       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_inq_var(stream % fileHandle, trim(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 
+! Here, we should probably do a check to make sure the file agrees with what MPAS expects for the field
+!         do i=1,ndims
+!write(0,*) 'Comparing '//trim(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
+         ! Set outer dimension sizes depending on whether the field is decomposed
+         if (isDecomposed) then
+            new_field_list_node % totalDimSize = totalDimSize
          else
-            globalDimSize = field % dimSizes(idim)
-            new_field_list_node % isDecomposed = .false.
             new_field_list_node % totalDimSize = globalDimSize
          end if
 
+         new_field_list_node % isDecomposed = isDecomposed
+
          deallocate(dimNamesInq)
 
       end if
@@ -291,49 +351,7 @@
       !
       ! Set variable indices
       !
-      if (trim(field % dimNames(1)) == 'nCells') then
-         allocate(indices(0))
-         field_ptr =&gt; field
-         do while (associated(field_ptr)) 
-            call mergeArrays(indices, field_ptr % block % mesh % indexToCellID % array(1:field_ptr % block % mesh % nCellsSolve))
-            field_ptr =&gt; field_ptr % next
-         end do
-         call MPAS_io_set_var_indices(stream % fileHandle, trim(field % fieldName), indices, io_err)
-
-      else if (trim(field % dimNames(1)) == 'nEdges') then
-         allocate(indices(0))
-         field_ptr =&gt; field
-         do while (associated(field_ptr)) 
-            call mergeArrays(indices, field_ptr % block % mesh % indexToEdgeID % array(1:field_ptr % block % mesh % nEdgesSolve))
-            field_ptr =&gt; field_ptr % next
-         end do
-         call MPAS_io_set_var_indices(stream % fileHandle, trim(field % fieldName), indices, io_err)
-
-      else if (trim(field % dimNames(1)) == 'nVertices') then
-         allocate(indices(0))
-         field_ptr =&gt; field
-         do while (associated(field_ptr)) 
-            call mergeArrays(indices, field_ptr % block % mesh % indexToVertexID % array(1:field_ptr % block % mesh % nVerticesSolve))
-            field_ptr =&gt; field_ptr % next
-         end do
-         call MPAS_io_set_var_indices(stream % fileHandle, trim(field % fieldName), indices, io_err)
-
-      else
-
-         if (field % block % domain % dminfo % my_proc_id == IO_NODE) then
-            ndims = 1
-            allocate(indices(field % dimSizes(ndims)))
-            do i=1,field % dimSizes(ndims)
-               indices(i) = i 
-            end do
-         else
-            allocate(indices(0))
-         end if
-         call MPAS_io_set_var_indices(stream % fileHandle, trim(field % fieldName), indices, io_err)
-      end if
-
-      deallocate(indices)
-
+      call MPAS_io_set_var_indices(stream % fileHandle, trim(fieldName), indices, io_err)
       call MPAS_io_err_mesg(io_err, .false.)
       if (io_err /= MPAS_IO_NOERR) then
          if (present(ierr)) ierr = MPAS_IO_ERR
@@ -356,11 +374,9 @@
          field_list_cursor % next =&gt; new_field_list_node
       end if
 
-write(0,*) '... done adding field'
+   end subroutine MPAS_streamAddField_generic
 
-   end subroutine MPAS_streamAddField_1dInteger
 
-
    subroutine MPAS_readStream(stream, frame, ierr)
 
       implicit none

</font>
</pre>