<p><b>duda</b> 2010-05-13 17:37:03 -0600 (Thu, 13 May 2010)</p><p>Fix bug that was preventing fields whose outermost dimension<br>
is nVertLevelsP1 from being read or written correctly; specifically,<br>
the last vertical level for such fields was not being read or <br>
written at all, potentially leaving uninitialized memory in that<br>
level.<br>
<br>
<br>
M    src/registry/gen_inc.c<br>
M    src/framework/module_io_input.F<br>
M    src/framework/module_io_output.F<br>
</p><hr noshade><pre><font color="gray">Modified: trunk/mpas/src/framework/module_io_input.F
===================================================================
--- trunk/mpas/src/framework/module_io_input.F        2010-05-13 21:55:22 UTC (rev 270)
+++ trunk/mpas/src/framework/module_io_input.F        2010-05-13 23:37:03 UTC (rev 271)
@@ -103,6 +103,7 @@
       type (exchange_list), pointer :: sendEdgeList, recvEdgeList
       type (exchange_list), pointer :: sendVertexList, recvVertexList
       type (exchange_list), pointer :: sendVertLevelList, recvVertLevelList
+      type (exchange_list), pointer :: sendVertLevelP1List, recvVertLevelP1List
       type (exchange_list), pointer :: send1Halo, recv1Halo
       type (exchange_list), pointer :: send2Halo, recv2Halo
       type (graph) :: partial_global_graph_info
@@ -693,7 +694,28 @@
       deallocate(local_vertlevel_list)
       deallocate(needed_vertlevel_list)
 
+      if (domain % dminfo % my_proc_id == 0) then
+         allocate(local_vertlevel_list(nVertLevels+1))
+         do i=1,nVertLevels+1
+            local_vertlevel_list(i) = i
+         end do
+      else
+         allocate(local_vertlevel_list(0))
+      end if
+      allocate(needed_vertlevel_list(nVertLevels+1))
+      do i=1,nVertLevels+1
+         needed_vertlevel_list(i) = i
+      end do
 
+      call dmpar_get_owner_list(domain % dminfo, &amp;
+                                size(local_vertlevel_list), size(needed_vertlevel_list), &amp;
+                                local_vertlevel_list, needed_vertlevel_list, &amp;
+                                sendVertLevelP1List, recvVertLevelP1List)
+
+      deallocate(local_vertlevel_list)
+      deallocate(needed_vertlevel_list)
+
+
       !
       ! Read and distribute all fields given ownership lists and exchange lists (maybe already in block?)
       !
@@ -765,7 +787,7 @@
                                       readCellStart, nReadCells, readEdgeStart, nReadEdges, readVertexStart, nReadVertices, &amp;
                                       readVertLevelStart, nReadVertLevels, &amp;
                                       sendCellList, recvCellList, sendEdgeList, recvEdgeList, sendVertexList, recvVertexList, &amp;
-                                      sendVertLevelList, recvVertLevelList) 
+                                      sendVertLevelList, recvVertLevelList, sendVertLevelP1List, recvVertLevelP1List) 
 
 
       call io_input_finalize(input_obj, domain % dminfo)
@@ -977,7 +999,8 @@
                                      sendCellsList, recvCellsList, &amp;
                                      sendEdgesList, recvEdgesList, &amp;
                                      sendVerticesList, recvVerticesList, &amp;
-                                     sendVertLevelsList, recvVertLevelsList) 
+                                     sendVertLevelsList, recvVertLevelsList, &amp; 
+                                     sendVertLevelsP1List, recvVertLevelsP1List) 
       
       implicit none
 
@@ -990,6 +1013,7 @@
       type (exchange_list), pointer :: sendEdgesList, recvEdgesList
       type (exchange_list), pointer :: sendVerticesList, recvVerticesList
       type (exchange_list), pointer :: sendVertLevelsList, recvVertLevelsList
+      type (exchange_list), pointer :: sendVertLevelsP1List, recvVertLevelsP1List
 
       type (field1dInteger) :: int1d
       type (field2dInteger) :: int2d

Modified: trunk/mpas/src/framework/module_io_output.F
===================================================================
--- trunk/mpas/src/framework/module_io_output.F        2010-05-13 21:55:22 UTC (rev 270)
+++ trunk/mpas/src/framework/module_io_output.F        2010-05-13 23:37:03 UTC (rev 271)
@@ -23,6 +23,7 @@
       type (exchange_list), pointer :: sendEdgesList, recvEdgesList
       type (exchange_list), pointer :: sendVerticesList, recvVerticesList
       type (exchange_list), pointer :: sendVertLevelsList, recvVertLevelsList
+      type (exchange_list), pointer :: sendVertLevelsP1List, recvVertLevelsP1List
    end type io_output_object
 
 
@@ -66,6 +67,8 @@
       nullify(output_obj % recvVerticesList)
       nullify(output_obj % sendVertLevelsList)
       nullify(output_obj % recvVertLevelsList)
+      nullify(output_obj % sendVertLevelsP1List)
+      nullify(output_obj % recvVertLevelsP1List)
       output_obj % validExchangeLists = .false.
 
 #include &quot;output_dim_inits.inc&quot;
@@ -110,6 +113,7 @@
       integer, dimension(:), pointer :: neededEdgeList
       integer, dimension(:), pointer :: neededVertexList
       integer, dimension(:), pointer :: neededVertLevelList
+      integer, dimension(:), pointer :: neededVertLevelP1List
       integer, dimension(:,:), pointer :: cellsOnCell, edgesOnCell, verticesOnCell, &amp;
                                           cellsOnEdge, verticesOnEdge, edgesOnEdge, cellsOnVertex, edgesOnVertex
       integer, dimension(:,:), pointer :: cellsOnCell_save, edgesOnCell_save, verticesOnCell_save, &amp;
@@ -210,6 +214,7 @@
          allocate(neededEdgeList(nEdgesGlobal))
          allocate(neededVertexList(nVerticesGlobal))
          allocate(neededVertLevelList(nVertLevelsGlobal))
+         allocate(neededVertLevelP1List(nVertLevelsGlobal+1))
          do i=1,nCellsGlobal
             neededCellList(i) = i
          end do
@@ -222,11 +227,15 @@
          do i=1,nVertLevelsGlobal
             neededVertLevelList(i) = i
          end do
+         do i=1,nVertLevelsGlobal+1
+            neededVertLevelP1List(i) = i
+         end do
       else
          allocate(neededCellList(0))
          allocate(neededEdgeList(0))
          allocate(neededVertexList(0))
          allocate(neededVertLevelList(0))
+         allocate(neededVertLevelP1List(0))
       end if
 
       if (.not. output_obj % validExchangeLists) then
@@ -250,6 +259,11 @@
                                    neededVertLevelList, neededVertLevelList, &amp;
                                    output_obj % sendVertLevelsList, output_obj % recvVertLevelsList)
 
+         call dmpar_get_owner_list(domain % dminfo, &amp;
+                                   size(neededVertLevelP1List), size(neededVertLevelP1List), &amp;
+                                   neededVertLevelP1List, neededVertLevelP1List, &amp;
+                                   output_obj % sendVertLevelsP1List, output_obj % recvVertLevelsP1List)
+
          output_obj % validExchangeLists = .true.
       end if
 

Modified: trunk/mpas/src/registry/gen_inc.c
===================================================================
--- trunk/mpas/src/registry/gen_inc.c        2010-05-13 21:55:22 UTC (rev 270)
+++ trunk/mpas/src/registry/gen_inc.c        2010-05-13 23:37:03 UTC (rev 271)
@@ -1024,10 +1024,7 @@
          fortprintf(fd, &quot;, block %% mesh %% %s, &amp;</font>
<font color="red">&quot;, lastdim-&gt;dim-&gt;name_in_code);
    
          if (is_derived_dim(lastdim-&gt;dim-&gt;name_in_code)) {
-            split_derived_dim_string(lastdim-&gt;dim-&gt;name_in_code, &amp;cp1, &amp;cp2);
-            fortprintf(fd, &quot;                                send%sList, recv%sList)</font>
<font color="red">&quot;, cp1, cp1);
-            free(cp1);
-            free(cp2);
+            fortprintf(fd, &quot;                                send%sList, recv%sList)</font>
<font color="black">&quot;, lastdim-&gt;dim-&gt;name_in_file+1, lastdim-&gt;dim-&gt;name_in_file+1);
          }
          else
             fortprintf(fd, &quot;                                send%sList, recv%sList)</font>
<font color="gray">&quot;, lastdim-&gt;dim-&gt;name_in_code+1, lastdim-&gt;dim-&gt;name_in_code+1);
@@ -1537,7 +1534,7 @@
          if (is_derived_dim(lastdim-&gt;dim-&gt;name_in_code)) {
             split_derived_dim_string(lastdim-&gt;dim-&gt;name_in_code, &amp;cp1, &amp;cp2);
             fortprintf(fd, &quot;, n%sGlobal%s, &amp;</font>
<font color="red">&quot;, cp1, cp2);
-            fortprintf(fd, &quot;                                output_obj %% send%sList, output_obj %% recv%sList)</font>
<font color="blue">&quot;, cp1, cp1);
+            fortprintf(fd, &quot;                                output_obj %% send%sList, output_obj %% recv%sList)</font>
<font color="black">&quot;, lastdim-&gt;dim-&gt;name_in_file+1, lastdim-&gt;dim-&gt;name_in_file+1);
             free(cp1);
             free(cp2);
          }

</font>
</pre>