<p><b>duda</b> 2012-03-28 14:51:22 -0600 (Wed, 28 Mar 2012)</p><p>BRANCH COMMIT<br>
<br>
Update code to handle super-arrays.<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-28 00:23:25 UTC (rev 1728)
+++ branches/omp_blocks/io/src/framework/mpas_io_streams.F        2012-03-28 20:51:22 UTC (rev 1729)
@@ -235,8 +235,17 @@
 #include &quot;add_field_indices.inc&quot;
 
       
-      call MPAS_streamAddField_generic(stream, trim(field % fieldName), MPAS_IO_INT, field % dimNames, field % dimSizes, &amp;
-                                       field % hasTimeDimension, isDecomposed, totalDimSize, globalDimSize, indices, io_err)
+      if (field % isSuperArray) then
+!MGD This could use some testing, in particular, so see whether dimNames(2:1) will pass a 0-sized array
+         do i=1,size(field % constituentNames)
+            call MPAS_streamAddField_generic(stream, trim(field % constituentNames(i)), MPAS_IO_INT, field % dimNames(2:ndims), &amp;
+                                             field % dimSizes(2:ndims), field % hasTimeDimension, isDecomposed, totalDimSize, globalDimSize, &amp;
+                                             indices, io_err)
+         end do
+      else
+         call MPAS_streamAddField_generic(stream, trim(field % fieldName), MPAS_IO_INT, field % dimNames, field % dimSizes, &amp;
+                                          field % hasTimeDimension, isDecomposed, totalDimSize, globalDimSize, indices, io_err)
+      end if
 
       deallocate(indices)
       if (io_err /= MPAS_STREAM_NOERR) then
@@ -244,7 +253,13 @@
           return
       end if
 
-      call put_get_field_atts(stream % fileHandle, stream % ioDirection, trim(field % fieldname), field % attList)
+      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
 
 
       !
@@ -306,8 +321,16 @@
 #include &quot;add_field_indices.inc&quot;
 
       
-      call MPAS_streamAddField_generic(stream, trim(field % fieldName), MPAS_IO_INT, field % dimNames, field % dimSizes, &amp;
-                                       field % hasTimeDimension, isDecomposed, totalDimSize, globalDimSize, indices, io_err)
+      if (field % isSuperArray) then
+         do i=1,size(field % constituentNames)
+            call MPAS_streamAddField_generic(stream, trim(field % constituentNames(i)), MPAS_IO_INT, field % dimNames(2:ndims), &amp;
+                                             field % dimSizes(2:ndims), field % hasTimeDimension, isDecomposed, totalDimSize, globalDimSize, &amp;
+                                             indices, io_err)
+         end do
+      else
+         call MPAS_streamAddField_generic(stream, trim(field % fieldName), MPAS_IO_INT, field % dimNames, field % dimSizes, &amp;
+                                          field % hasTimeDimension, isDecomposed, totalDimSize, globalDimSize, indices, io_err)
+      end if
 
       deallocate(indices)
       if (io_err /= MPAS_STREAM_NOERR) then
@@ -315,7 +338,13 @@
           return
       end if
 
-      call put_get_field_atts(stream % fileHandle, stream % ioDirection, trim(field % fieldname), field % attList)
+      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
 
 
       !
@@ -376,8 +405,16 @@
       ! 
 #include &quot;add_field_indices.inc&quot;
       
-      call MPAS_streamAddField_generic(stream, trim(field % fieldName), MPAS_IO_INT, field % dimNames, field % dimSizes, &amp;
-                                       field % hasTimeDimension, isDecomposed, totalDimSize, globalDimSize, indices, io_err)
+      if (field % isSuperArray) then
+         do i=1,size(field % constituentNames)
+            call MPAS_streamAddField_generic(stream, trim(field % constituentNames(i)), MPAS_IO_INT, field % dimNames(2:ndims), &amp;
+                                             field % dimSizes(2:ndims), field % hasTimeDimension, isDecomposed, totalDimSize, globalDimSize, &amp;
+                                             indices, io_err)
+         end do
+      else
+         call MPAS_streamAddField_generic(stream, trim(field % fieldName), MPAS_IO_INT, field % dimNames, field % dimSizes, &amp;
+                                          field % hasTimeDimension, isDecomposed, totalDimSize, globalDimSize, indices, io_err)
+      end if
 
       deallocate(indices)
       if (io_err /= MPAS_STREAM_NOERR) then
@@ -385,7 +422,13 @@
           return
       end if
 
-      call put_get_field_atts(stream % fileHandle, stream % ioDirection, trim(field % fieldname), field % attList)
+      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
 
 
       !
@@ -525,8 +568,17 @@
 #include &quot;add_field_indices.inc&quot;
 
       
-      call MPAS_streamAddField_generic(stream, trim(field % fieldName), MPAS_IO_DOUBLE, field % dimNames, field % dimSizes, &amp;
-                                       field % hasTimeDimension, isDecomposed, totalDimSize, globalDimSize, indices, io_err)
+      if (field % isSuperArray) then
+!MGD This could use some testing, in particular, so see whether dimNames(2:1) will pass a 0-sized array
+         do i=1,size(field % constituentNames)
+            call MPAS_streamAddField_generic(stream, trim(field % constituentNames(i)), MPAS_IO_DOUBLE, field % dimNames(2:ndims), &amp;
+                                             field % dimSizes(2:ndims), field % hasTimeDimension, isDecomposed, totalDimSize, globalDimSize, &amp;
+                                             indices, io_err)
+         end do
+      else
+         call MPAS_streamAddField_generic(stream, trim(field % fieldName), MPAS_IO_DOUBLE, field % dimNames, field % dimSizes, &amp;
+                                          field % hasTimeDimension, isDecomposed, totalDimSize, globalDimSize, indices, io_err)
+      end if
 
       deallocate(indices)
       if (io_err /= MPAS_STREAM_NOERR) then
@@ -534,7 +586,13 @@
           return
       end if
 
-      call put_get_field_atts(stream % fileHandle, stream % ioDirection, trim(field % fieldname), field % attList)
+      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
 
 
       !
@@ -596,8 +654,16 @@
 #include &quot;add_field_indices.inc&quot;
 
       
-      call MPAS_streamAddField_generic(stream, trim(field % fieldName), MPAS_IO_DOUBLE, field % dimNames, field % dimSizes, &amp;
-                                       field % hasTimeDimension, isDecomposed, totalDimSize, globalDimSize, indices, io_err)
+      if (field % isSuperArray) then
+         do i=1,size(field % constituentNames)
+            call MPAS_streamAddField_generic(stream, trim(field % constituentNames(i)), MPAS_IO_DOUBLE, field % dimNames(2:ndims), &amp;
+                                             field % dimSizes(2:ndims), field % hasTimeDimension, isDecomposed, totalDimSize, globalDimSize, &amp;
+                                             indices, io_err)
+         end do
+      else
+         call MPAS_streamAddField_generic(stream, trim(field % fieldName), MPAS_IO_DOUBLE, field % dimNames, field % dimSizes, &amp;
+                                          field % hasTimeDimension, isDecomposed, totalDimSize, globalDimSize, indices, io_err)
+      end if
 
       deallocate(indices)
       if (io_err /= MPAS_STREAM_NOERR) then
@@ -605,7 +671,13 @@
           return
       end if
 
-      call put_get_field_atts(stream % fileHandle, stream % ioDirection, trim(field % fieldname), field % attList)
+      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
 
 
       !
@@ -667,8 +739,17 @@
 #include &quot;add_field_indices.inc&quot;
 
       
-      call MPAS_streamAddField_generic(stream, trim(field % fieldName), MPAS_IO_DOUBLE, field % dimNames, field % dimSizes, &amp;
-                                       field % hasTimeDimension, isDecomposed, totalDimSize, globalDimSize, indices, io_err)
+      if (field % isSuperArray) then
+write(0,*) '^^^^^^^^^^^^^^^^^^^^^^^^^^^ we are adding a super-array'
+         do i=1,size(field % constituentNames)
+            call MPAS_streamAddField_generic(stream, trim(field % constituentNames(i)), MPAS_IO_DOUBLE, field % dimNames(2:ndims), &amp;
+                                             field % dimSizes(2:ndims), field % hasTimeDimension, isDecomposed, totalDimSize, globalDimSize, &amp;
+                                             indices, io_err)
+         end do
+      else
+         call MPAS_streamAddField_generic(stream, trim(field % fieldName), MPAS_IO_DOUBLE, field % dimNames, field % dimSizes, &amp;
+                                          field % hasTimeDimension, isDecomposed, totalDimSize, globalDimSize, indices, io_err)
+      end if
 
       deallocate(indices)
       if (io_err /= MPAS_STREAM_NOERR) then
@@ -676,7 +757,13 @@
           return
       end if
 
-      call put_get_field_atts(stream % fileHandle, stream % ioDirection, trim(field % fieldname), field % attList)
+      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
 
 
       !
@@ -872,7 +959,8 @@
       integer, intent(out), optional :: ierr
 
       integer :: io_err
-      integer :: i
+      integer :: i, j
+      integer :: ncons
       integer :: ownedSize
       type (field0dInteger), pointer :: field_0dint_ptr
       type (field1dInteger), pointer :: field_1dint_ptr
@@ -946,163 +1034,231 @@
 
          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
+            if (field_cursor % int1dField % isSuperArray) then
+               ncons = size(field_cursor % int1dField % constituentNames)
+            else
+               ncons = 1
+               allocate(int1d_temp(field_cursor % totalDimSize))
             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
+            do j=1,ncons
+               if (field_cursor % int1dField % isSuperArray) then
+                  call MPAS_io_get_var(stream % fileHandle, field_cursor % int1dField % constituentNames(j), int0d_temp, io_err)
                else
-                  ownedSize = field_1dint_ptr % dimSizes(1)
+                  call MPAS_io_get_var(stream % fileHandle, field_cursor % int1dField % fieldName, int1d_temp, io_err)
                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_io_err_mesg(io_err, .false.)
+               if (io_err /= MPAS_IO_NOERR) then
+                   if (present(ierr)) ierr = MPAS_IO_ERR
+                   if (.not. field_cursor % int1dField % isSuperArray) then
+                      deallocate(int1d_temp)
+                   end if
+                   return
+               end if
+   
+               if (field_cursor % isDecomposed) then
+                  ! Distribute field to multiple blocks
+                  field_1dint_ptr =&gt; field_cursor % int1dField
+                  i = 1
+                  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))
+                     if (field_cursor % int1dField % isSuperArray) then
+                        field_1dint_ptr % array(j) = int0d_temp
+                     else
+                        field_1dint_ptr % array(1:ownedSize) = int1d_temp(i:i+ownedSize-1)
+                     end if
+                     i = i + ownedSize
+                     field_1dint_ptr =&gt; field_1dint_ptr % next
+                  end do
 
-               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
+               else
+   
+                  if (field_cursor % int1dField % isSuperArray) then
+                     call mpas_dmpar_bcast_int(field_cursor % int1dField % block % domain % dminfo, int0d_temp)
+                     field_1dint_ptr =&gt; field_cursor % int1dField
+                     do while (associated(field_1dint_ptr))
+                        field_1dint_ptr % array(j) = int0d_temp
+                        field_1dint_ptr =&gt; field_1dint_ptr % next
+                     end do
+                  else
+                     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
+               end if
+            end do
+
+            if (.not. field_cursor % int1dField % isSuperArray) then
+               deallocate(int1d_temp)
             end if
 
-            deallocate(int1d_temp)
-
          else if (field_cursor % field_type == FIELD_2D_INT) then
 
-write(0,*) 'Reading in field '//trim(field_cursor % int2dField % fieldName)
-write(0,*) '   &gt; is the field decomposed? ', field_cursor % isDecomposed
-write(0,*) '   &gt; outer dimension size ', field_cursor % totalDimSize
-
-!!!!!!!!!!!!!
-            allocate(int2d_temp(field_cursor % int2dField % dimSizes(1), field_cursor % totalDimSize))
-
-write(0,*) 'MGD calling MPAS_io_get_var now...'
-!!!!!!!!!!!!!
-            call MPAS_io_get_var(stream % fileHandle, field_cursor % int2dField % fieldName, int2d_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(int2d_temp)
-                return
+            if (field_cursor % int2dField % isSuperArray) then
+               ncons = size(field_cursor % int2dField % constituentNames)
+               allocate(int1d_temp(field_cursor % totalDimSize))
+            else
+               ncons = 1
+               allocate(int2d_temp(field_cursor % int2dField % dimSizes(1), &amp;
+                                   field_cursor % totalDimSize))
             end if
 
-            if (field_cursor % isDecomposed) then
-write(0,*) 'Gathering field from across all blocks'
-               ! Distribute field to multiple blocks
-               field_2dint_ptr =&gt; field_cursor % int2dField
-               i = 1
-! Could this be something we do in streamAddField routines, since we already have such tests?
-               if (trim(field_2dint_ptr % dimNames(2)) == 'nCells') then
-                  ownedSize = field_2dint_ptr % block % mesh % nCellsSolve
-               else if (trim(field_2dint_ptr % dimNames(2)) == 'nEdges') then
-                  ownedSize = field_2dint_ptr % block % mesh % nEdgesSolve
-               else if (trim(field_2dint_ptr % dimNames(2)) == 'nVertices') then
-                  ownedSize = field_2dint_ptr % block % mesh % nVerticesSolve
+            do j=1,ncons
+               if (field_cursor % int2dField % isSuperArray) then
+                  call MPAS_io_get_var(stream % fileHandle, field_cursor % int2dField % constituentNames(j), int1d_temp, io_err)
                else
-                  ownedSize = field_2dint_ptr % dimSizes(2)
+                  call MPAS_io_get_var(stream % fileHandle, field_cursor % int2dField % fieldName, int2d_temp, io_err)
                end if
-               do while (associated(field_2dint_ptr))
-write(0,*) '   &gt; copying block ', i, i+ownedSize-1
-                  field_2dint_ptr % array(:,1:ownedSize) = int2d_temp(:,i:i+ownedSize-1)
-                  i = i + ownedSize
-                  field_2dint_ptr =&gt; field_2dint_ptr % next
-               end do
+               call MPAS_io_err_mesg(io_err, .false.)
+               if (io_err /= MPAS_IO_NOERR) then
+                   if (present(ierr)) ierr = MPAS_IO_ERR
+                   if (field_cursor % int2dField % isSuperArray) then
+                      deallocate(int1d_temp)
+                   else
+                      deallocate(int2d_temp)
+                   end if
+                   return
+               end if
+   
+               if (field_cursor % isDecomposed) then
+                  ! Distribute field to multiple blocks
+                  field_2dint_ptr =&gt; field_cursor % int2dField
+                  i = 1
+                  if (trim(field_2dint_ptr % dimNames(2)) == 'nCells') then
+                     ownedSize = field_2dint_ptr % block % mesh % nCellsSolve
+                  else if (trim(field_2dint_ptr % dimNames(2)) == 'nEdges') then
+                     ownedSize = field_2dint_ptr % block % mesh % nEdgesSolve
+                  else if (trim(field_2dint_ptr % dimNames(2)) == 'nVertices') then
+                     ownedSize = field_2dint_ptr % block % mesh % nVerticesSolve
+                  else
+                     ownedSize = field_2dint_ptr % dimSizes(2)
+                  end if
+                  do while (associated(field_2dint_ptr))
+                     if (field_cursor % int2dField % isSuperArray) then
+                        field_2dint_ptr % array(j,1:ownedSize) = int1d_temp(i:i+ownedSize-1)
+                     else
+                        field_2dint_ptr % array(:,1:ownedSize) = int2d_temp(:,i:i+ownedSize-1)
+                     end if
+                     i = i + ownedSize
+                     field_2dint_ptr =&gt; field_2dint_ptr % next
+                  end do
+
+               else
+   
+                  if (field_cursor % int2dField % isSuperArray) then
+                     call mpas_dmpar_bcast_ints(field_cursor % int2dField % block % domain % dminfo, size(int1d_temp), int1d_temp(:))
+                     field_2dint_ptr =&gt; field_cursor % int2dField
+                     do while (associated(field_2dint_ptr))
+                        field_2dint_ptr % array(j,:) = int1d_temp(:)
+                        field_2dint_ptr =&gt; field_2dint_ptr % next
+                     end do
+                  else
+                     call mpas_dmpar_bcast_ints(field_cursor % int2dField % block % domain % dminfo, size(int2d_temp), int2d_temp(:,1))
+                     field_2dint_ptr =&gt; field_cursor % int2dField
+                     do while (associated(field_2dint_ptr))
+                        field_2dint_ptr % array(:,:) = int2d_temp(:,:)
+                        field_2dint_ptr =&gt; field_2dint_ptr % next
+                     end do
+                  end if
+               end if
+            end do
+
+            if (field_cursor % int2dField % isSuperArray) then
+               deallocate(int1d_temp)
             else
-write(0,*) 'Distributing and Copying field to other blocks'
-
-               call mpas_dmpar_bcast_ints(field_cursor % int2dField % block % domain % dminfo, size(int2d_temp), int2d_temp(:,1))
-               field_2dint_ptr =&gt; field_cursor % int2dField
-               do while (associated(field_2dint_ptr))
-                  field_2dint_ptr % array(:,:) = int2d_temp(:,:)
-                  field_2dint_ptr =&gt; field_2dint_ptr % next
-               end do
+               deallocate(int2d_temp)
             end if
 
-            deallocate(int2d_temp)
-
          else if (field_cursor % field_type == FIELD_3D_INT) then
 
-write(0,*) 'Reading in field '//trim(field_cursor % int3dField % fieldName)
-write(0,*) '   &gt; is the field decomposed? ', field_cursor % isDecomposed
-write(0,*) '   &gt; outer dimension size ', field_cursor % totalDimSize
-
-!!!!!!!!!!!!!
-            allocate(int3d_temp(field_cursor % int3dField % dimSizes(1), &amp;
-                                field_cursor % int3dField % dimSizes(2), &amp;
-                                field_cursor % totalDimSize))
-
-write(0,*) 'MGD calling MPAS_io_get_var now...'
-!!!!!!!!!!!!!
-            call MPAS_io_get_var(stream % fileHandle, field_cursor % int3dField % fieldName, int3d_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(int3d_temp)
-                return
+            if (field_cursor % int3dField % isSuperArray) then
+               ncons = size(field_cursor % int3dField % constituentNames)
+               allocate(int2d_temp(field_cursor % int3dField % dimSizes(2), &amp;
+                                   field_cursor % totalDimSize))
+            else
+               ncons = 1
+               allocate(int3d_temp(field_cursor % int3dField % dimSizes(1), &amp;
+                                   field_cursor % int3dField % dimSizes(2), &amp;
+                                   field_cursor % totalDimSize))
             end if
 
-            if (field_cursor % isDecomposed) then
-write(0,*) 'Gathering field from across all blocks'
-               ! Distribute field to multiple blocks
-               field_3dint_ptr =&gt; field_cursor % int3dField
-               i = 1
-! Could this be something we do in streamAddField routines, since we already have such tests?
-               if (trim(field_3dint_ptr % dimNames(3)) == 'nCells') then
-                  ownedSize = field_3dint_ptr % block % mesh % nCellsSolve
-               else if (trim(field_3dint_ptr % dimNames(3)) == 'nEdges') then
-                  ownedSize = field_3dint_ptr % block % mesh % nEdgesSolve
-               else if (trim(field_3dint_ptr % dimNames(3)) == 'nVertices') then
-                  ownedSize = field_3dint_ptr % block % mesh % nVerticesSolve
+            do j=1,ncons
+               if (field_cursor % int3dField % isSuperArray) then
+                  call MPAS_io_get_var(stream % fileHandle, field_cursor % int3dField % constituentNames(j), int2d_temp, io_err)
                else
-                  ownedSize = field_3dint_ptr % dimSizes(3)
+                  call MPAS_io_get_var(stream % fileHandle, field_cursor % int3dField % fieldName, int3d_temp, io_err)
                end if
-               do while (associated(field_3dint_ptr))
-write(0,*) '   &gt; copying block ', i, i+ownedSize-1
-                  field_3dint_ptr % array(:,:,1:ownedSize) = int3d_temp(:,:,i:i+ownedSize-1)
-                  i = i + ownedSize
-                  field_3dint_ptr =&gt; field_3dint_ptr % next
-               end do
+               call MPAS_io_err_mesg(io_err, .false.)
+               if (io_err /= MPAS_IO_NOERR) then
+                   if (present(ierr)) ierr = MPAS_IO_ERR
+                   if (field_cursor % int3dField % isSuperArray) then
+                      deallocate(int2d_temp)
+                   else
+                      deallocate(int3d_temp)
+                   end if
+                   return
+               end if
+   
+               if (field_cursor % isDecomposed) then
+                  ! Distribute field to multiple blocks
+                  field_3dint_ptr =&gt; field_cursor % int3dField
+                  i = 1
+                  if (trim(field_3dint_ptr % dimNames(3)) == 'nCells') then
+                     ownedSize = field_3dint_ptr % block % mesh % nCellsSolve
+                  else if (trim(field_3dint_ptr % dimNames(3)) == 'nEdges') then
+                     ownedSize = field_3dint_ptr % block % mesh % nEdgesSolve
+                  else if (trim(field_3dint_ptr % dimNames(3)) == 'nVertices') then
+                     ownedSize = field_3dint_ptr % block % mesh % nVerticesSolve
+                  else
+                     ownedSize = field_3dint_ptr % dimSizes(3)
+                  end if
+                  do while (associated(field_3dint_ptr))
+                     if (field_cursor % int3dField % isSuperArray) then
+                        field_3dint_ptr % array(j,:,1:ownedSize) = int2d_temp(:,i:i+ownedSize-1)
+                     else
+                        field_3dint_ptr % array(:,:,1:ownedSize) = int3d_temp(:,:,i:i+ownedSize-1)
+                     end if
+                     i = i + ownedSize
+                     field_3dint_ptr =&gt; field_3dint_ptr % next
+                  end do
+
+               else
+   
+                  if (field_cursor % int3dField % isSuperArray) then
+                     call mpas_dmpar_bcast_ints(field_cursor % int3dField % block % domain % dminfo, size(int2d_temp), int2d_temp(:,1))
+                     field_3dint_ptr =&gt; field_cursor % int3dField
+                     do while (associated(field_3dint_ptr))
+                        field_3dint_ptr % array(j,:,:) = int2d_temp(:,:)
+                        field_3dint_ptr =&gt; field_3dint_ptr % next
+                     end do
+                  else
+                     call mpas_dmpar_bcast_ints(field_cursor % int3dField % block % domain % dminfo, size(int3d_temp), int3d_temp(:,1,1))
+                     field_3dint_ptr =&gt; field_cursor % int3dField
+                     do while (associated(field_3dint_ptr))
+                        field_3dint_ptr % array(:,:,:) = int3d_temp(:,:,:)
+                        field_3dint_ptr =&gt; field_3dint_ptr % next
+                     end do
+                  end if
+               end if
+            end do
+
+            if (field_cursor % int3dField % isSuperArray) then
+               deallocate(int2d_temp)
             else
-write(0,*) 'Distributing and Copying field to other blocks'
-
-               call mpas_dmpar_bcast_ints(field_cursor % int3dField % block % domain % dminfo, size(int3d_temp), int3d_temp(:,1,1))
-               field_3dint_ptr =&gt; field_cursor % int3dField
-               do while (associated(field_3dint_ptr))
-                  field_3dint_ptr % array(:,:,:) = int3d_temp(:,:,:)
-                  field_3dint_ptr =&gt; field_3dint_ptr % next
-               end do
+               deallocate(int3d_temp)
             end if
 
-            deallocate(int3d_temp)
-
          else if (field_cursor % field_type == FIELD_0D_REAL) then
 
 write(0,*) 'Reading in field '//trim(field_cursor % real0dField % fieldName)
@@ -1128,163 +1284,231 @@
 
          else if (field_cursor % field_type == FIELD_1D_REAL) then
 
-write(0,*) 'Reading in field '//trim(field_cursor % real1dField % fieldName)
-write(0,*) '   &gt; is the field decomposed? ', field_cursor % isDecomposed
-write(0,*) '   &gt; outer dimension size ', field_cursor % totalDimSize
-
-            allocate(real1d_temp(field_cursor % totalDimSize))
-
-write(0,*) 'MGD calling MPAS_io_get_var now...'
-            call MPAS_io_get_var(stream % fileHandle, field_cursor % real1dField % fieldName, real1d_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(real1d_temp)
-                return
+            if (field_cursor % real1dField % isSuperArray) then
+               ncons = size(field_cursor % real1dField % constituentNames)
+            else
+               ncons = 1
+               allocate(real1d_temp(field_cursor % totalDimSize))
             end if
 
-            if (field_cursor % isDecomposed) then
-write(0,*) 'Gathering field from across all blocks'
-               ! Distribute field to multiple blocks
-               field_1dreal_ptr =&gt; field_cursor % real1dField
-               i = 1
-! Could this be something we do in streamAddField routines, since we already have such tests?
-               if (trim(field_1dreal_ptr % dimNames(1)) == 'nCells') then
-                  ownedSize = field_1dreal_ptr % block % mesh % nCellsSolve
-               else if (trim(field_1dreal_ptr % dimNames(1)) == 'nEdges') then
-                  ownedSize = field_1dreal_ptr % block % mesh % nEdgesSolve
-               else if (trim(field_1dreal_ptr % dimNames(1)) == 'nVertices') then
-                  ownedSize = field_1dreal_ptr % block % mesh % nVerticesSolve
+            do j=1,ncons
+               if (field_cursor % real1dField % isSuperArray) then
+                  call MPAS_io_get_var(stream % fileHandle, field_cursor % real1dField % constituentNames(j), real0d_temp, io_err)
                else
-                  ownedSize = field_1dreal_ptr % dimSizes(1)
+                  call MPAS_io_get_var(stream % fileHandle, field_cursor % real1dField % fieldName, real1d_temp, io_err)
                end if
-               do while (associated(field_1dreal_ptr))
-write(0,*) '   &gt; copying block ', i, i+ownedSize-1
-                  field_1dreal_ptr % array(1:ownedSize) = real1d_temp(i:i+ownedSize-1)
-                  i = i + ownedSize
-                  field_1dreal_ptr =&gt; field_1dreal_ptr % next
-               end do
-            else
-write(0,*) 'Distributing and Copying field to other blocks'
+               call MPAS_io_err_mesg(io_err, .false.)
+               if (io_err /= MPAS_IO_NOERR) then
+                   if (present(ierr)) ierr = MPAS_IO_ERR
+                   if (.not. field_cursor % real1dField % isSuperArray) then
+                      deallocate(real1d_temp)
+                   end if
+                   return
+               end if
+   
+               if (field_cursor % isDecomposed) then
+                  ! Distribute field to multiple blocks
+                  field_1dreal_ptr =&gt; field_cursor % real1dField
+                  i = 1
+                  if (trim(field_1dreal_ptr % dimNames(1)) == 'nCells') then
+                     ownedSize = field_1dreal_ptr % block % mesh % nCellsSolve
+                  else if (trim(field_1dreal_ptr % dimNames(1)) == 'nEdges') then
+                     ownedSize = field_1dreal_ptr % block % mesh % nEdgesSolve
+                  else if (trim(field_1dreal_ptr % dimNames(1)) == 'nVertices') then
+                     ownedSize = field_1dreal_ptr % block % mesh % nVerticesSolve
+                  else
+                     ownedSize = field_1dreal_ptr % dimSizes(1)
+                  end if
+                  do while (associated(field_1dreal_ptr))
+                     if (field_cursor % real1dField % isSuperArray) then
+                        field_1dreal_ptr % array(j) = real0d_temp
+                     else
+                        field_1dreal_ptr % array(1:ownedSize) = real1d_temp(i:i+ownedSize-1)
+                     end if
+                     i = i + ownedSize
+                     field_1dreal_ptr =&gt; field_1dreal_ptr % next
+                  end do
 
-               call mpas_dmpar_bcast_reals(field_cursor % real1dField % block % domain % dminfo, size(real1d_temp), real1d_temp(:))
-               field_1dreal_ptr =&gt; field_cursor % real1dField
-               do while (associated(field_1dreal_ptr))
-                  field_1dreal_ptr % array(:) = real1d_temp(:)
-                  field_1dreal_ptr =&gt; field_1dreal_ptr % next
-               end do
+               else
+   
+                  if (field_cursor % real1dField % isSuperArray) then
+                     call mpas_dmpar_bcast_real(field_cursor % real1dField % block % domain % dminfo, real0d_temp)
+                     field_1dreal_ptr =&gt; field_cursor % real1dField
+                     do while (associated(field_1dreal_ptr))
+                        field_1dreal_ptr % array(j) = real0d_temp
+                        field_1dreal_ptr =&gt; field_1dreal_ptr % next
+                     end do
+                  else
+                     call mpas_dmpar_bcast_reals(field_cursor % real1dField % block % domain % dminfo, size(real1d_temp), real1d_temp(:))
+                     field_1dreal_ptr =&gt; field_cursor % real1dField
+                     do while (associated(field_1dreal_ptr))
+                        field_1dreal_ptr % array(:) = real1d_temp(:)
+                        field_1dreal_ptr =&gt; field_1dreal_ptr % next
+                     end do
+                  end if
+               end if
+            end do
+
+            if (.not. field_cursor % real1dField % isSuperArray) then
+               deallocate(real1d_temp)
             end if
 
-            deallocate(real1d_temp)
-
          else if (field_cursor % field_type == FIELD_2D_REAL) then
 
-write(0,*) 'Reading in field '//trim(field_cursor % real2dField % fieldName)
-write(0,*) '   &gt; is the field decomposed? ', field_cursor % isDecomposed
-write(0,*) '   &gt; outer dimension size ', field_cursor % totalDimSize
-
-!!!!!!!!!!!!!
-            allocate(real2d_temp(field_cursor % real2dField % dimSizes(1), field_cursor % totalDimSize))
-
-write(0,*) 'MGD calling MPAS_io_get_var now...'
-!!!!!!!!!!!!!
-            call MPAS_io_get_var(stream % fileHandle, field_cursor % real2dField % fieldName, real2d_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(real2d_temp)
-                return
+            if (field_cursor % real2dField % isSuperArray) then
+               ncons = size(field_cursor % real2dField % constituentNames)
+               allocate(real1d_temp(field_cursor % totalDimSize))
+            else
+               ncons = 1
+               allocate(real2d_temp(field_cursor % real2dField % dimSizes(1), &amp;
+                                    field_cursor % totalDimSize))
             end if
 
-            if (field_cursor % isDecomposed) then
-write(0,*) 'Gathering field from across all blocks'
-               ! Distribute field to multiple blocks
-               field_2dreal_ptr =&gt; field_cursor % real2dField
-               i = 1
-! Could this be something we do in streamAddField routines, since we already have such tests?
-               if (trim(field_2dreal_ptr % dimNames(2)) == 'nCells') then
-                  ownedSize = field_2dreal_ptr % block % mesh % nCellsSolve
-               else if (trim(field_2dreal_ptr % dimNames(2)) == 'nEdges') then
-                  ownedSize = field_2dreal_ptr % block % mesh % nEdgesSolve
-               else if (trim(field_2dreal_ptr % dimNames(2)) == 'nVertices') then
-                  ownedSize = field_2dreal_ptr % block % mesh % nVerticesSolve
+            do j=1,ncons
+               if (field_cursor % real2dField % isSuperArray) then
+                  call MPAS_io_get_var(stream % fileHandle, field_cursor % real2dField % constituentNames(j), real1d_temp, io_err)
                else
-                  ownedSize = field_2dreal_ptr % dimSizes(2)
+                  call MPAS_io_get_var(stream % fileHandle, field_cursor % real2dField % fieldName, real2d_temp, io_err)
                end if
-               do while (associated(field_2dreal_ptr))
-write(0,*) '   &gt; copying block ', i, i+ownedSize-1
-                  field_2dreal_ptr % array(:,1:ownedSize) = real2d_temp(:,i:i+ownedSize-1)
-                  i = i + ownedSize
-                  field_2dreal_ptr =&gt; field_2dreal_ptr % next
-               end do
+               call MPAS_io_err_mesg(io_err, .false.)
+               if (io_err /= MPAS_IO_NOERR) then
+                   if (present(ierr)) ierr = MPAS_IO_ERR
+                   if (field_cursor % real2dField % isSuperArray) then
+                      deallocate(real1d_temp)
+                   else
+                      deallocate(real2d_temp)
+                   end if
+                   return
+               end if
+   
+               if (field_cursor % isDecomposed) then
+                  ! Distribute field to multiple blocks
+                  field_2dreal_ptr =&gt; field_cursor % real2dField
+                  i = 1
+                  if (trim(field_2dreal_ptr % dimNames(2)) == 'nCells') then
+                     ownedSize = field_2dreal_ptr % block % mesh % nCellsSolve
+                  else if (trim(field_2dreal_ptr % dimNames(2)) == 'nEdges') then
+                     ownedSize = field_2dreal_ptr % block % mesh % nEdgesSolve
+                  else if (trim(field_2dreal_ptr % dimNames(2)) == 'nVertices') then
+                     ownedSize = field_2dreal_ptr % block % mesh % nVerticesSolve
+                  else
+                     ownedSize = field_2dreal_ptr % dimSizes(2)
+                  end if
+                  do while (associated(field_2dreal_ptr))
+                     if (field_cursor % real2dField % isSuperArray) then
+                        field_2dreal_ptr % array(j,1:ownedSize) = real1d_temp(i:i+ownedSize-1)
+                     else
+                        field_2dreal_ptr % array(:,1:ownedSize) = real2d_temp(:,i:i+ownedSize-1)
+                     end if
+                     i = i + ownedSize
+                     field_2dreal_ptr =&gt; field_2dreal_ptr % next
+                  end do
+
+               else
+   
+                  if (field_cursor % real2dField % isSuperArray) then
+                     call mpas_dmpar_bcast_reals(field_cursor % real2dField % block % domain % dminfo, size(real1d_temp), real1d_temp(:))
+                     field_2dreal_ptr =&gt; field_cursor % real2dField
+                     do while (associated(field_2dreal_ptr))
+                        field_2dreal_ptr % array(j,:) = real1d_temp(:)
+                        field_2dreal_ptr =&gt; field_2dreal_ptr % next
+                     end do
+                  else
+                     call mpas_dmpar_bcast_reals(field_cursor % real2dField % block % domain % dminfo, size(real2d_temp), real2d_temp(:,1))
+                     field_2dreal_ptr =&gt; field_cursor % real2dField
+                     do while (associated(field_2dreal_ptr))
+                        field_2dreal_ptr % array(:,:) = real2d_temp(:,:)
+                        field_2dreal_ptr =&gt; field_2dreal_ptr % next
+                     end do
+                  end if
+               end if
+            end do
+
+            if (field_cursor % real2dField % isSuperArray) then
+               deallocate(real1d_temp)
             else
-write(0,*) 'Distributing and Copying field to other blocks'
-
-               call mpas_dmpar_bcast_reals(field_cursor % real2dField % block % domain % dminfo, size(real2d_temp), real2d_temp(:,1))
-               field_2dreal_ptr =&gt; field_cursor % real2dField
-               do while (associated(field_2dreal_ptr))
-                  field_2dreal_ptr % array(:,:) = real2d_temp(:,:)
-                  field_2dreal_ptr =&gt; field_2dreal_ptr % next
-               end do
+               deallocate(real2d_temp)
             end if
 
-            deallocate(real2d_temp)
-
          else if (field_cursor % field_type == FIELD_3D_REAL) then
 
-write(0,*) 'Reading in field '//trim(field_cursor % real3dField % fieldName)
-write(0,*) '   &gt; is the field decomposed? ', field_cursor % isDecomposed
-write(0,*) '   &gt; outer dimension size ', field_cursor % totalDimSize
-
-!!!!!!!!!!!!!
-            allocate(real3d_temp(field_cursor % real3dField % dimSizes(1), &amp;
-                                 field_cursor % real3dField % dimSizes(2), &amp;
-                                 field_cursor % totalDimSize))
-
-write(0,*) 'MGD calling MPAS_io_get_var now...'
-!!!!!!!!!!!!!
-            call MPAS_io_get_var(stream % fileHandle, field_cursor % real3dField % fieldName, real3d_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(real3d_temp)
-                return
+            if (field_cursor % real3dField % isSuperArray) then
+               ncons = size(field_cursor % real3dField % constituentNames)
+               allocate(real2d_temp(field_cursor % real3dField % dimSizes(2), &amp;
+                                    field_cursor % totalDimSize))
+            else
+               ncons = 1
+               allocate(real3d_temp(field_cursor % real3dField % dimSizes(1), &amp;
+                                    field_cursor % real3dField % dimSizes(2), &amp;
+                                    field_cursor % totalDimSize))
             end if
 
-            if (field_cursor % isDecomposed) then
-write(0,*) 'Gathering field from across all blocks'
-               ! Distribute field to multiple blocks
-               field_3dreal_ptr =&gt; field_cursor % real3dField
-               i = 1
-! Could this be something we do in streamAddField routines, since we already have such tests?
-               if (trim(field_3dreal_ptr % dimNames(3)) == 'nCells') then
-                  ownedSize = field_3dreal_ptr % block % mesh % nCellsSolve
-               else if (trim(field_3dreal_ptr % dimNames(3)) == 'nEdges') then
-                  ownedSize = field_3dreal_ptr % block % mesh % nEdgesSolve
-               else if (trim(field_3dreal_ptr % dimNames(3)) == 'nVertices') then
-                  ownedSize = field_3dreal_ptr % block % mesh % nVerticesSolve
+            do j=1,ncons
+               if (field_cursor % real3dField % isSuperArray) then
+                  call MPAS_io_get_var(stream % fileHandle, field_cursor % real3dField % constituentNames(j), real2d_temp, io_err)
                else
-                  ownedSize = field_3dreal_ptr % dimSizes(3)
+                  call MPAS_io_get_var(stream % fileHandle, field_cursor % real3dField % fieldName, real3d_temp, io_err)
                end if
-               do while (associated(field_3dreal_ptr))
-write(0,*) '   &gt; copying block ', i, i+ownedSize-1
-                  field_3dreal_ptr % array(:,:,1:ownedSize) = real3d_temp(:,:,i:i+ownedSize-1)
-                  i = i + ownedSize
-                  field_3dreal_ptr =&gt; field_3dreal_ptr % next
-               end do
+               call MPAS_io_err_mesg(io_err, .false.)
+               if (io_err /= MPAS_IO_NOERR) then
+                   if (present(ierr)) ierr = MPAS_IO_ERR
+                   if (field_cursor % real3dField % isSuperArray) then
+                      deallocate(real2d_temp)
+                   else
+                      deallocate(real3d_temp)
+                   end if
+                   return
+               end if
+   
+               if (field_cursor % isDecomposed) then
+                  ! Distribute field to multiple blocks
+                  field_3dreal_ptr =&gt; field_cursor % real3dField
+                  i = 1
+                  if (trim(field_3dreal_ptr % dimNames(3)) == 'nCells') then
+                     ownedSize = field_3dreal_ptr % block % mesh % nCellsSolve
+                  else if (trim(field_3dreal_ptr % dimNames(3)) == 'nEdges') then
+                     ownedSize = field_3dreal_ptr % block % mesh % nEdgesSolve
+                  else if (trim(field_3dreal_ptr % dimNames(3)) == 'nVertices') then
+                     ownedSize = field_3dreal_ptr % block % mesh % nVerticesSolve
+                  else
+                     ownedSize = field_3dreal_ptr % dimSizes(3)
+                  end if
+                  do while (associated(field_3dreal_ptr))
+                     if (field_cursor % real3dField % isSuperArray) then
+                        field_3dreal_ptr % array(j,:,1:ownedSize) = real2d_temp(:,i:i+ownedSize-1)
+                     else
+                        field_3dreal_ptr % array(:,:,1:ownedSize) = real3d_temp(:,:,i:i+ownedSize-1)
+                     end if
+                     i = i + ownedSize
+                     field_3dreal_ptr =&gt; field_3dreal_ptr % next
+                  end do
+
+               else
+   
+                  if (field_cursor % real3dField % isSuperArray) then
+                     call mpas_dmpar_bcast_reals(field_cursor % real3dField % block % domain % dminfo, size(real2d_temp), real2d_temp(:,1))
+                     field_3dreal_ptr =&gt; field_cursor % real3dField
+                     do while (associated(field_3dreal_ptr))
+                        field_3dreal_ptr % array(j,:,:) = real2d_temp(:,:)
+                        field_3dreal_ptr =&gt; field_3dreal_ptr % next
+                     end do
+                  else
+                     call mpas_dmpar_bcast_reals(field_cursor % real3dField % block % domain % dminfo, size(real3d_temp), real3d_temp(:,1,1))
+                     field_3dreal_ptr =&gt; field_cursor % real3dField
+                     do while (associated(field_3dreal_ptr))
+                        field_3dreal_ptr % array(:,:,:) = real3d_temp(:,:,:)
+                        field_3dreal_ptr =&gt; field_3dreal_ptr % next
+                     end do
+                  end if
+               end if
+            end do
+
+            if (field_cursor % real3dField % isSuperArray) then
+               deallocate(real2d_temp)
             else
-write(0,*) 'Distributing and Copying field to other blocks'
-
-               call mpas_dmpar_bcast_reals(field_cursor % real3dField % block % domain % dminfo, size(real3d_temp), real3d_temp(:,1,1))
-               field_3dreal_ptr =&gt; field_cursor % real3dField
-               do while (associated(field_3dreal_ptr))
-                  field_3dreal_ptr % array(:,:,:) = real3d_temp(:,:,:)
-                  field_3dreal_ptr =&gt; field_3dreal_ptr % next
-               end do
+               deallocate(real3d_temp)
             end if
 
-            deallocate(real3d_temp)
-
          else if (field_cursor % field_type == FIELD_0D_CHAR) then
          else if (field_cursor % field_type == FIELD_1D_CHAR) then
          end if
@@ -1304,7 +1528,8 @@
       integer, intent(out), optional :: ierr
 
       integer :: io_err
-      integer :: i
+      integer :: i, j
+      integer :: ncons
       integer :: ownedSize
       type (field0dInteger), pointer :: field_0dint_ptr
       type (field1dInteger), pointer :: field_1dint_ptr
@@ -1351,6 +1576,7 @@
       !
       field_cursor =&gt; stream % fieldList
       do while (associated(field_cursor))
+
          if (field_cursor % field_type == FIELD_0D_INT) then
 
 write(0,*) 'Writing out field '//trim(field_cursor % int0dField % fieldName)
@@ -1367,129 +1593,177 @@
 
          else if (field_cursor % field_type == FIELD_1D_INT) then
 
-write(0,*) 'Writing out 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
+            if (field_cursor % int1dField % isSuperArray) then
+               ncons = size(field_cursor % int1dField % constituentNames)
+            else
+               ncons = 1
+               allocate(int1d_temp(field_cursor % totalDimSize))
+            end if
 
-            allocate(int1d_temp(field_cursor % totalDimSize))
+            do j=1,ncons
+               if (field_cursor % isDecomposed) then
+                  ! Gather field from across multiple blocks
+                  field_1dint_ptr =&gt; field_cursor % int1dField
+                  i = 1
+                  do while (associated(field_1dint_ptr))
+                     if (trim(field_1dint_ptr % dimNames(2)) == 'nCells') then
+                        ownedSize = field_1dint_ptr % block % mesh % nCellsSolve
+                     else if (trim(field_1dint_ptr % dimNames(2)) == 'nEdges') then
+                        ownedSize = field_1dint_ptr % block % mesh % nEdgesSolve
+                     else if (trim(field_1dint_ptr % dimNames(2)) == 'nVertices') then
+                        ownedSize = field_1dint_ptr % block % mesh % nVerticesSolve
+                     else
+                        ownedSize = field_1dint_ptr % dimSizes(2)
+                     end if
 
-            if (field_cursor % isDecomposed) then
-write(0,*) 'Gathering field from across all blocks'
-               ! Gather field from across multiple blocks
-               field_1dint_ptr =&gt; field_cursor % int1dField
-               i = 1
-               do while (associated(field_1dint_ptr))
-! 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
+                     if (field_cursor % int1dField % isSuperArray) then
+! I suspect we will never hit this code, as it doesn't make sense, really
+                        int0d_temp = field_1dint_ptr % array(j)
+                     else
+                        int1d_temp(i:i+ownedSize-1) = field_1dint_ptr % array(1:ownedSize)
+                     end if
+                     i = i + ownedSize
+                     field_1dint_ptr =&gt; field_1dint_ptr % next
+                  end do
+               else
+                  if (field_cursor % int1dField % isSuperArray) then
+                     int0d_temp = field_cursor % int1dField % array(j)
                   else
-                     ownedSize = field_1dint_ptr % dimSizes(1)
+                     int1d_temp(:) = field_cursor % int1dField % array(:)
                   end if
-write(0,*) '   &gt; copying block ', i, i+ownedSize-1
-                  int1d_temp(i:i+ownedSize-1) = field_1dint_ptr % array(1:ownedSize)
-                  i = i + ownedSize
-                  field_1dint_ptr =&gt; field_1dint_ptr % next
-               end do
-            else
-write(0,*) 'Copying field from first block'
-               int1d_temp(:) = field_cursor % int1dField % array(:)
-            end if
+               end if
 
-write(0,*) 'MGD calling MPAS_io_put_var now...'
-            call MPAS_io_put_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 .and. present(ierr)) ierr = MPAS_IO_ERR
+               if (field_cursor % int1dField % isSuperArray) then
+                  call MPAS_io_put_var(stream % fileHandle, field_cursor % int1dField % constituentNames(j), int0d_temp, io_err)
+               else
+                  call MPAS_io_put_var(stream % fileHandle, field_cursor % int1dField % fieldName, int1d_temp, io_err)
+               end if
+               call MPAS_io_err_mesg(io_err, .false.)
+               if (io_err /= MPAS_IO_NOERR .and. present(ierr)) ierr = MPAS_IO_ERR
+            end do
 
-            deallocate(int1d_temp)
+            if (.not. field_cursor % int1dField % isSuperArray) then
+               deallocate(int1d_temp)
+            end if
 
          else if (field_cursor % field_type == FIELD_2D_INT) then
 
-write(0,*) 'Writing out field '//trim(field_cursor % int2dField % fieldName)
-write(0,*) '   &gt; is the field decomposed? ', field_cursor % isDecomposed
-write(0,*) '   &gt; outer dimension size ', field_cursor % totalDimSize
+            if (field_cursor % int2dField % isSuperArray) then
+               ncons = size(field_cursor % int2dField % constituentNames)
+               allocate(int1d_temp(field_cursor % totalDimSize))
+            else
+               ncons = 1
+               allocate(int2d_temp(field_cursor % int2dField % dimSizes(1), &amp;
+                                   field_cursor % totalDimSize))
+            end if
 
-            allocate(int2d_temp(field_cursor % int2dField % dimSizes(1), field_cursor % totalDimSize))
+            do j=1,ncons
+               if (field_cursor % isDecomposed) then
+                  ! Gather field from across multiple blocks
+                  field_2dint_ptr =&gt; field_cursor % int2dField
+                  i = 1
+                  do while (associated(field_2dint_ptr))
+                     if (trim(field_2dint_ptr % dimNames(2)) == 'nCells') then
+                        ownedSize = field_2dint_ptr % block % mesh % nCellsSolve
+                     else if (trim(field_2dint_ptr % dimNames(2)) == 'nEdges') then
+                        ownedSize = field_2dint_ptr % block % mesh % nEdgesSolve
+                     else if (trim(field_2dint_ptr % dimNames(2)) == 'nVertices') then
+                        ownedSize = field_2dint_ptr % block % mesh % nVerticesSolve
+                     else
+                        ownedSize = field_2dint_ptr % dimSizes(2)
+                     end if
 
-            if (field_cursor % isDecomposed) then
-write(0,*) 'Gathering field from across all blocks'
-               ! Gather field from across multiple blocks
-               field_2dint_ptr =&gt; field_cursor % int2dField
-               i = 1
-               do while (associated(field_2dint_ptr))
-! Could this be something we do in streamAddField routines, since we already have such tests?
-                  if (trim(field_2dint_ptr % dimNames(2)) == 'nCells') then
-                     ownedSize = field_2dint_ptr % block % mesh % nCellsSolve
-                  else if (trim(field_2dint_ptr % dimNames(2)) == 'nEdges') then
-                     ownedSize = field_2dint_ptr % block % mesh % nEdgesSolve
-                  else if (trim(field_2dint_ptr % dimNames(2)) == 'nVertices') then
-                     ownedSize = field_2dint_ptr % block % mesh % nVerticesSolve
+                     if (field_cursor % int2dField % isSuperArray) then
+                        int1d_temp(i:i+ownedSize-1) = field_2dint_ptr % array(j,1:ownedSize)
+                     else
+                        int2d_temp(:,i:i+ownedSize-1) = field_2dint_ptr % array(:,1:ownedSize)
+                     end if
+                     i = i + ownedSize
+                     field_2dint_ptr =&gt; field_2dint_ptr % next
+                  end do
+               else
+                  if (field_cursor % int2dField % isSuperArray) then
+                     int1d_temp(:) = field_cursor % int2dField % array(j,:)
                   else
-                     ownedSize = field_2dint_ptr % dimSizes(2)
+                     int2d_temp(:,:) = field_cursor % int2dField % array(:,:)
                   end if
-write(0,*) '   &gt; copying block ', i, i+ownedSize-1
-                  int2d_temp(:,i:i+ownedSize-1) = field_2dint_ptr % array(:,1:ownedSize)
-                  i = i + ownedSize
-                  field_2dint_ptr =&gt; field_2dint_ptr % next
-               end do
+               end if
+
+               if (field_cursor % int2dField % isSuperArray) then
+                  call MPAS_io_put_var(stream % fileHandle, field_cursor % int2dField % constituentNames(j), int1d_temp, io_err)
+               else
+                  call MPAS_io_put_var(stream % fileHandle, field_cursor % int2dField % fieldName, int2d_temp, io_err)
+               end if
+               call MPAS_io_err_mesg(io_err, .false.)
+               if (io_err /= MPAS_IO_NOERR .and. present(ierr)) ierr = MPAS_IO_ERR
+            end do
+
+            if (field_cursor % int2dField % isSuperArray) then
+               deallocate(int1d_temp)
             else
-write(0,*) 'Copying field from first block'
-               int2d_temp(:,:) = field_cursor % int2dField % array(:,:)
+               deallocate(int2d_temp)
             end if
 
-write(0,*) 'MGD calling MPAS_io_put_var now...'
-            call MPAS_io_put_var(stream % fileHandle, field_cursor % int2dField % fieldName, int2d_temp, io_err)
-            call MPAS_io_err_mesg(io_err, .false.)
-            if (io_err /= MPAS_IO_NOERR .and. present(ierr)) ierr = MPAS_IO_ERR
-
-            deallocate(int2d_temp)
-
          else if (field_cursor % field_type == FIELD_3D_INT) then
 
-write(0,*) 'Writing out field '//trim(field_cursor % int3dField % fieldName)
-write(0,*) '   &gt; is the field decomposed? ', field_cursor % isDecomposed
-write(0,*) '   &gt; outer dimension size ', field_cursor % totalDimSize
+            if (field_cursor % int3dField % isSuperArray) then
+               ncons = size(field_cursor % int3dField % constituentNames)
+               allocate(int2d_temp(field_cursor % int3dField % dimSizes(2), &amp;
+                                   field_cursor % totalDimSize))
+            else
+               ncons = 1
+               allocate(int3d_temp(field_cursor % int3dField % dimSizes(1), &amp;
+                                   field_cursor % int3dField % dimSizes(2), &amp;
+                                   field_cursor % totalDimSize))
+            end if
 
-            allocate(int3d_temp(field_cursor % int3dField % dimSizes(1), &amp;
-                                field_cursor % int3dField % dimSizes(2), &amp;
-                                field_cursor % totalDimSize))
+            do j=1,ncons
+               if (field_cursor % isDecomposed) then
+                  ! Gather field from across multiple blocks
+                  field_3dint_ptr =&gt; field_cursor % int3dField
+                  i = 1
+                  do while (associated(field_3dint_ptr))
+                     if (trim(field_3dint_ptr % dimNames(3)) == 'nCells') then
+                        ownedSize = field_3dint_ptr % block % mesh % nCellsSolve
+                     else if (trim(field_3dint_ptr % dimNames(3)) == 'nEdges') then
+                        ownedSize = field_3dint_ptr % block % mesh % nEdgesSolve
+                     else if (trim(field_3dint_ptr % dimNames(3)) == 'nVertices') then
+                        ownedSize = field_3dint_ptr % block % mesh % nVerticesSolve
+                     else
+                        ownedSize = field_3dint_ptr % dimSizes(3)
+                     end if
 
-            if (field_cursor % isDecomposed) then
-write(0,*) 'Gathering field from across all blocks'
-               ! Gather field from across multiple blocks
-               field_3dint_ptr =&gt; field_cursor % int3dField
-               i = 1
-               do while (associated(field_3dint_ptr))
-! Could this be something we do in streamAddField routines, since we already have such tests?
-                  if (trim(field_3dint_ptr % dimNames(3)) == 'nCells') then
-                     ownedSize = field_3dint_ptr % block % mesh % nCellsSolve
-                  else if (trim(field_3dint_ptr % dimNames(3)) == 'nEdges') then
-                     ownedSize = field_3dint_ptr % block % mesh % nEdgesSolve
-                  else if (trim(field_3dint_ptr % dimNames(3)) == 'nVertices') then
-                     ownedSize = field_3dint_ptr % block % mesh % nVerticesSolve
+                     if (field_cursor % int3dField % isSuperArray) then
+                        int2d_temp(:,i:i+ownedSize-1) = field_3dint_ptr % array(j,:,1:ownedSize)
+                     else
+                        int3d_temp(:,:,i:i+ownedSize-1) = field_3dint_ptr % array(:,:,1:ownedSize)
+                     end if
+                     i = i + ownedSize
+                     field_3dint_ptr =&gt; field_3dint_ptr % next
+                  end do
+               else
+                  if (field_cursor % int3dField % isSuperArray) then
+                     int2d_temp(:,:) = field_cursor % int3dField % array(j,:,:)
                   else
-                     ownedSize = field_3dint_ptr % dimSizes(3)
+                     int3d_temp(:,:,:) = field_cursor % int3dField % array(:,:,:)
                   end if
-write(0,*) '   &gt; copying block ', i, i+ownedSize-1
-                  int3d_temp(:,:,i:i+ownedSize-1) = field_3dint_ptr % array(:,:,1:ownedSize)
-                  i = i + ownedSize
-                  field_3dint_ptr =&gt; field_3dint_ptr % next
-               end do
+               end if
+
+               if (field_cursor % int3dField % isSuperArray) then
+                  call MPAS_io_put_var(stream % fileHandle, field_cursor % int3dField % constituentNames(j), int2d_temp, io_err)
+               else
+                  call MPAS_io_put_var(stream % fileHandle, field_cursor % int3dField % fieldName, int3d_temp, io_err)
+               end if
+               call MPAS_io_err_mesg(io_err, .false.)
+               if (io_err /= MPAS_IO_NOERR .and. present(ierr)) ierr = MPAS_IO_ERR
+            end do
+
+            if (field_cursor % int3dField % isSuperArray) then
+               deallocate(int2d_temp)
             else
-write(0,*) 'Copying field from first block'
-               int3d_temp(:,:,:) = field_cursor % int3dField % array(:,:,:)
+               deallocate(int3d_temp)
             end if
 
-write(0,*) 'MGD calling MPAS_io_put_var now...'
-            call MPAS_io_put_var(stream % fileHandle, field_cursor % int3dField % fieldName, int3d_temp, io_err)
-            call MPAS_io_err_mesg(io_err, .false.)
-            if (io_err /= MPAS_IO_NOERR .and. present(ierr)) ierr = MPAS_IO_ERR
-
-            deallocate(int3d_temp)
-
          else if (field_cursor % field_type == FIELD_0D_REAL) then
 
 write(0,*) 'Writing out field '//trim(field_cursor % real0dField % fieldName)
@@ -1506,129 +1780,177 @@
 
          else if (field_cursor % field_type == FIELD_1D_REAL) then
 
-write(0,*) 'Writing out field '//trim(field_cursor % real1dField % fieldName)
-write(0,*) '   &gt; is the field decomposed? ', field_cursor % isDecomposed
-write(0,*) '   &gt; outer dimension size ', field_cursor % totalDimSize
+            if (field_cursor % real1dField % isSuperArray) then
+               ncons = size(field_cursor % real1dField % constituentNames)
+            else
+               ncons = 1
+               allocate(real1d_temp(field_cursor % totalDimSize))
+            end if
 
-            allocate(real1d_temp(field_cursor % totalDimSize))
+            do j=1,ncons
+               if (field_cursor % isDecomposed) then
+                  ! Gather field from across multiple blocks
+                  field_1dreal_ptr =&gt; field_cursor % real1dField
+                  i = 1
+                  do while (associated(field_1dreal_ptr))
+                     if (trim(field_1dreal_ptr % dimNames(2)) == 'nCells') then
+                        ownedSize = field_1dreal_ptr % block % mesh % nCellsSolve
+                     else if (trim(field_1dreal_ptr % dimNames(2)) == 'nEdges') then
+                        ownedSize = field_1dreal_ptr % block % mesh % nEdgesSolve
+                     else if (trim(field_1dreal_ptr % dimNames(2)) == 'nVertices') then
+                        ownedSize = field_1dreal_ptr % block % mesh % nVerticesSolve
+                     else
+                        ownedSize = field_1dreal_ptr % dimSizes(2)
+                     end if
 
-            if (field_cursor % isDecomposed) then
-write(0,*) 'Gathering field from across all blocks'
-               ! Gather field from across multiple blocks
-               field_1dreal_ptr =&gt; field_cursor % real1dField
-               i = 1
-               do while (associated(field_1dreal_ptr))
-! Could this be something we do in streamAddField routines, since we already have such tests?
-                  if (trim(field_1dreal_ptr % dimNames(1)) == 'nCells') then
-                     ownedSize = field_1dreal_ptr % block % mesh % nCellsSolve
-                  else if (trim(field_1dreal_ptr % dimNames(1)) == 'nEdges') then
-                     ownedSize = field_1dreal_ptr % block % mesh % nEdgesSolve
-                  else if (trim(field_1dreal_ptr % dimNames(1)) == 'nVertices') then
-                     ownedSize = field_1dreal_ptr % block % mesh % nVerticesSolve
+                     if (field_cursor % real1dField % isSuperArray) then
+! I suspect we will never hit this code, as it doesn't make sense, really
+                        real0d_temp = field_1dreal_ptr % array(j)
+                     else
+                        real1d_temp(i:i+ownedSize-1) = field_1dreal_ptr % array(1:ownedSize)
+                     end if
+                     i = i + ownedSize
+                     field_1dreal_ptr =&gt; field_1dreal_ptr % next
+                  end do
+               else
+                  if (field_cursor % real1dField % isSuperArray) then
+                     real0d_temp = field_cursor % real1dField % array(j)
                   else
-                     ownedSize = field_1dreal_ptr % dimSizes(1)
+                     real1d_temp(:) = field_cursor % real1dField % array(:)
                   end if
-write(0,*) '   &gt; copying block ', i, i+ownedSize-1
-                  real1d_temp(i:i+ownedSize-1) = field_1dreal_ptr % array(1:ownedSize)
-                  i = i + ownedSize
-                  field_1dreal_ptr =&gt; field_1dreal_ptr % next
-               end do
-            else
-write(0,*) 'Copying field from first block'
-               real1d_temp(:) = field_cursor % real1dField % array(:)
-            end if
+               end if
 
-write(0,*) 'MGD calling MPAS_io_put_var now...'
-            call MPAS_io_put_var(stream % fileHandle, field_cursor % real1dField % fieldName, real1d_temp, io_err)
-            call MPAS_io_err_mesg(io_err, .false.)
-            if (io_err /= MPAS_IO_NOERR .and. present(ierr)) ierr = MPAS_IO_ERR
+               if (field_cursor % real1dField % isSuperArray) then
+                  call MPAS_io_put_var(stream % fileHandle, field_cursor % real1dField % constituentNames(j), real0d_temp, io_err)
+               else
+                  call MPAS_io_put_var(stream % fileHandle, field_cursor % real1dField % fieldName, real1d_temp, io_err)
+               end if
+               call MPAS_io_err_mesg(io_err, .false.)
+               if (io_err /= MPAS_IO_NOERR .and. present(ierr)) ierr = MPAS_IO_ERR
+            end do
 
-            deallocate(real1d_temp)
+            if (.not. field_cursor % real1dField % isSuperArray) then
+               deallocate(real1d_temp)
+            end if
 
          else if (field_cursor % field_type == FIELD_2D_REAL) then
 
-write(0,*) 'Writing out field '//trim(field_cursor % real2dField % fieldName)
-write(0,*) '   &gt; is the field decomposed? ', field_cursor % isDecomposed
-write(0,*) '   &gt; outer dimension size ', field_cursor % totalDimSize
+            if (field_cursor % real2dField % isSuperArray) then
+               ncons = size(field_cursor % real2dField % constituentNames)
+               allocate(real1d_temp(field_cursor % totalDimSize))
+            else
+               ncons = 1
+               allocate(real2d_temp(field_cursor % real2dField % dimSizes(1), &amp;
+                                    field_cursor % totalDimSize))
+            end if
 
-            allocate(real2d_temp(field_cursor % real2dField % dimSizes(1), field_cursor % totalDimSize))
+            do j=1,ncons
+               if (field_cursor % isDecomposed) then
+                  ! Gather field from across multiple blocks
+                  field_2dreal_ptr =&gt; field_cursor % real2dField
+                  i = 1
+                  do while (associated(field_2dreal_ptr))
+                     if (trim(field_2dreal_ptr % dimNames(2)) == 'nCells') then
+                        ownedSize = field_2dreal_ptr % block % mesh % nCellsSolve
+                     else if (trim(field_2dreal_ptr % dimNames(2)) == 'nEdges') then
+                        ownedSize = field_2dreal_ptr % block % mesh % nEdgesSolve
+                     else if (trim(field_2dreal_ptr % dimNames(2)) == 'nVertices') then
+                        ownedSize = field_2dreal_ptr % block % mesh % nVerticesSolve
+                     else
+                        ownedSize = field_2dreal_ptr % dimSizes(2)
+                     end if
 
-            if (field_cursor % isDecomposed) then
-write(0,*) 'Gathering field from across all blocks'
-               ! Gather field from across multiple blocks
-               field_2dreal_ptr =&gt; field_cursor % real2dField
-               i = 1
-               do while (associated(field_2dreal_ptr))
-! Could this be something we do in streamAddField routines, since we already have such tests?
-                  if (trim(field_2dreal_ptr % dimNames(2)) == 'nCells') then
-                     ownedSize = field_2dreal_ptr % block % mesh % nCellsSolve
-                  else if (trim(field_2dreal_ptr % dimNames(2)) == 'nEdges') then
-                     ownedSize = field_2dreal_ptr % block % mesh % nEdgesSolve
-                  else if (trim(field_2dreal_ptr % dimNames(2)) == 'nVertices') then
-                     ownedSize = field_2dreal_ptr % block % mesh % nVerticesSolve
+                     if (field_cursor % real2dField % isSuperArray) then
+                        real1d_temp(i:i+ownedSize-1) = field_2dreal_ptr % array(j,1:ownedSize)
+                     else
+                        real2d_temp(:,i:i+ownedSize-1) = field_2dreal_ptr % array(:,1:ownedSize)
+                     end if
+                     i = i + ownedSize
+                     field_2dreal_ptr =&gt; field_2dreal_ptr % next
+                  end do
+               else
+                  if (field_cursor % real2dField % isSuperArray) then
+                     real1d_temp(:) = field_cursor % real2dField % array(j,:)
                   else
-                     ownedSize = field_2dreal_ptr % dimSizes(2)
+                     real2d_temp(:,:) = field_cursor % real2dField % array(:,:)
                   end if
-write(0,*) '   &gt; copying block ', i, i+ownedSize-1
-                  real2d_temp(:,i:i+ownedSize-1) = field_2dreal_ptr % array(:,1:ownedSize)
-                  i = i + ownedSize
-                  field_2dreal_ptr =&gt; field_2dreal_ptr % next
-               end do
+               end if
+
+               if (field_cursor % real2dField % isSuperArray) then
+                  call MPAS_io_put_var(stream % fileHandle, field_cursor % real2dField % constituentNames(j), real1d_temp, io_err)
+               else
+                  call MPAS_io_put_var(stream % fileHandle, field_cursor % real2dField % fieldName, real2d_temp, io_err)
+               end if
+               call MPAS_io_err_mesg(io_err, .false.)
+               if (io_err /= MPAS_IO_NOERR .and. present(ierr)) ierr = MPAS_IO_ERR
+            end do
+
+            if (field_cursor % real2dField % isSuperArray) then
+               deallocate(real1d_temp)
             else
-write(0,*) 'Copying field from first block'
-               real2d_temp(:,:) = field_cursor % real2dField % array(:,:)
+               deallocate(real2d_temp)
             end if
 
-write(0,*) 'MGD calling MPAS_io_put_var now...'
-            call MPAS_io_put_var(stream % fileHandle, field_cursor % real2dField % fieldName, real2d_temp, io_err)
-            call MPAS_io_err_mesg(io_err, .false.)
-            if (io_err /= MPAS_IO_NOERR .and. present(ierr)) ierr = MPAS_IO_ERR
-
-            deallocate(real2d_temp)
-
          else if (field_cursor % field_type == FIELD_3D_REAL) then
 
-write(0,*) 'Writing out field '//trim(field_cursor % real3dField % fieldName)
-write(0,*) '   &gt; is the field decomposed? ', field_cursor % isDecomposed
-write(0,*) '   &gt; outer dimension size ', field_cursor % totalDimSize
+            if (field_cursor % real3dField % isSuperArray) then
+               ncons = size(field_cursor % real3dField % constituentNames)
+               allocate(real2d_temp(field_cursor % real3dField % dimSizes(2), &amp;
+                                    field_cursor % totalDimSize))
+            else
+               ncons = 1
+               allocate(real3d_temp(field_cursor % real3dField % dimSizes(1), &amp;
+                                    field_cursor % real3dField % dimSizes(2), &amp;
+                                    field_cursor % totalDimSize))
+            end if
 
-            allocate(real3d_temp(field_cursor % real3dField % dimSizes(1), &amp;
-                                 field_cursor % real3dField % dimSizes(2), &amp;
-                                 field_cursor % totalDimSize))
+            do j=1,ncons
+               if (field_cursor % isDecomposed) then
+                  ! Gather field from across multiple blocks
+                  field_3dreal_ptr =&gt; field_cursor % real3dField
+                  i = 1
+                  do while (associated(field_3dreal_ptr))
+                     if (trim(field_3dreal_ptr % dimNames(3)) == 'nCells') then
+                        ownedSize = field_3dreal_ptr % block % mesh % nCellsSolve
+                     else if (trim(field_3dreal_ptr % dimNames(3)) == 'nEdges') then
+                        ownedSize = field_3dreal_ptr % block % mesh % nEdgesSolve
+                     else if (trim(field_3dreal_ptr % dimNames(3)) == 'nVertices') then
+                        ownedSize = field_3dreal_ptr % block % mesh % nVerticesSolve
+                     else
+                        ownedSize = field_3dreal_ptr % dimSizes(3)
+                     end if
 
-            if (field_cursor % isDecomposed) then
-write(0,*) 'Gathering field from across all blocks'
-               ! Gather field from across multiple blocks
-               field_3dreal_ptr =&gt; field_cursor % real3dField
-               i = 1
-               do while (associated(field_3dreal_ptr))
-! Could this be something we do in streamAddField routines, since we already have such tests?
-                  if (trim(field_3dreal_ptr % dimNames(3)) == 'nCells') then
-                     ownedSize = field_3dreal_ptr % block % mesh % nCellsSolve
-                  else if (trim(field_3dreal_ptr % dimNames(3)) == 'nEdges') then
-                     ownedSize = field_3dreal_ptr % block % mesh % nEdgesSolve
-                  else if (trim(field_3dreal_ptr % dimNames(3)) == 'nVertices') then
-                     ownedSize = field_3dreal_ptr % block % mesh % nVerticesSolve
+                     if (field_cursor % real3dField % isSuperArray) then
+                        real2d_temp(:,i:i+ownedSize-1) = field_3dreal_ptr % array(j,:,1:ownedSize)
+                     else
+                        real3d_temp(:,:,i:i+ownedSize-1) = field_3dreal_ptr % array(:,:,1:ownedSize)
+                     end if
+                     i = i + ownedSize
+                     field_3dreal_ptr =&gt; field_3dreal_ptr % next
+                  end do
+               else
+                  if (field_cursor % real3dField % isSuperArray) then
+                     real2d_temp(:,:) = field_cursor % real3dField % array(j,:,:)
                   else
-                     ownedSize = field_3dreal_ptr % dimSizes(3)
+                     real3d_temp(:,:,:) = field_cursor % real3dField % array(:,:,:)
                   end if
-write(0,*) '   &gt; copying block ', i, i+ownedSize-1
-                  real3d_temp(:,:,i:i+ownedSize-1) = field_3dreal_ptr % array(:,:,1:ownedSize)
-                  i = i + ownedSize
-                  field_3dreal_ptr =&gt; field_3dreal_ptr % next
-               end do
+               end if
+
+               if (field_cursor % real3dField % isSuperArray) then
+                  call MPAS_io_put_var(stream % fileHandle, field_cursor % real3dField % constituentNames(j), real2d_temp, io_err)
+               else
+                  call MPAS_io_put_var(stream % fileHandle, field_cursor % real3dField % fieldName, real3d_temp, io_err)
+               end if
+               call MPAS_io_err_mesg(io_err, .false.)
+               if (io_err /= MPAS_IO_NOERR .and. present(ierr)) ierr = MPAS_IO_ERR
+            end do
+
+            if (field_cursor % real3dField % isSuperArray) then
+               deallocate(real2d_temp)
             else
-write(0,*) 'Copying field from first block'
-               real3d_temp(:,:,:) = field_cursor % real3dField % array(:,:,:)
+               deallocate(real3d_temp)
             end if
 
-write(0,*) 'MGD calling MPAS_io_put_var now...'
-            call MPAS_io_put_var(stream % fileHandle, field_cursor % real3dField % fieldName, real3d_temp, io_err)
-            call MPAS_io_err_mesg(io_err, .false.)
-            if (io_err /= MPAS_IO_NOERR .and. present(ierr)) ierr = MPAS_IO_ERR
-
-            deallocate(real3d_temp)
-
          else if (field_cursor % field_type == FIELD_0D_CHAR) then
          else if (field_cursor % field_type == FIELD_1D_CHAR) then
          end if

</font>
</pre>