<p><b>dwj07@fsu.edu</b> 2012-08-14 15:33:46 -0600 (Tue, 14 Aug 2012)</p><p><br>
        -- BRANCH COMMIT --<br>
<br>
        Adding changes to ocean core that supposed bit reproducibility.<br>
</p><hr noshade><pre><font color="gray">Modified: branches/ocean_projects/option1_b4b_test/Makefile
===================================================================
--- branches/ocean_projects/option1_b4b_test/Makefile        2012-08-14 21:29:46 UTC (rev 2100)
+++ branches/ocean_projects/option1_b4b_test/Makefile        2012-08-14 21:33:46 UTC (rev 2101)
@@ -131,7 +131,7 @@
         &quot;DEBUG = $(DEBUG)&quot; \
         &quot;SERIAL = $(SERIAL)&quot; \
         &quot;USE_PAPI = $(USE_PAPI)&quot; \
-        &quot;CPPFLAGS = $(MODEL_FORMULATION) -DUNDERSCORE -m64 $(FILE_OFFSET) $(ZOLTAN_DEFINE)&quot; )
+        &quot;CPPFLAGS = $(MODEL_FORMULATION) -DUNDERSCORE -D_BITREPRODUCIBLE -m64 $(FILE_OFFSET) $(ZOLTAN_DEFINE)&quot; )
 
 g95:
         ( $(MAKE) all \

Modified: branches/ocean_projects/option1_b4b_test/src/core_ocean/Registry
===================================================================
--- branches/ocean_projects/option1_b4b_test/src/core_ocean/Registry        2012-08-14 21:29:46 UTC (rev 2100)
+++ branches/ocean_projects/option1_b4b_test/src/core_ocean/Registry        2012-08-14 21:33:46 UTC (rev 2101)
@@ -209,12 +209,12 @@
 var persistent real    salinityRestore ( nCells ) 0 iro salinityRestore mesh - -
 
 % mrp trying to figure out why these do not appear
-var persistent real    windStressMonthly ( nMonths nEdges ) 0 iro windStressMonthly mesh - -
-var persistent real    temperatureRestoreMonthly ( nMonths nCells ) 0 iro temperatureRestoreMonthly mesh - -
-var persistent real    salinityRestoreMonthly ( nMonths nCells ) 0 iro salinityRestoreMonthly mesh - -
+var persistent real    windStressMonthly ( nMonths nEdges ) 0 - windStressMonthly mesh - -
+var persistent real    temperatureRestoreMonthly ( nMonths nCells ) 0 - temperatureRestoreMonthly mesh - -
+var persistent real    salinityRestoreMonthly ( nMonths nCells ) 0 - salinityRestoreMonthly mesh - -
 
 % Prognostic variables: read from input, saved in restart, and written to output
-var persistent real    u ( nVertLevels nEdges Time ) 2 ir u state - -
+var persistent real    u ( nVertLevels nEdges Time ) 2 iro u state - -
 var persistent real    h ( nVertLevels nCells Time ) 2 iro h state - -
 var persistent real    rho ( nVertLevels nCells Time ) 2 iro rho state - -
 var persistent real    temperature ( nVertLevels nCells Time ) 2 iro temperature state tracers dynamics
@@ -307,3 +307,7 @@
 var persistent real    acc_uReconstructMeridionalVar ( nVertLevels nCells Time ) 2 o acc_uReconstructMeridionalVar state - -
 var persistent real    acc_u ( nVertLevels nEdges Time ) 2 o acc_u state - -
 var persistent real    acc_uVar ( nVertLevels nEdges Time ) 2 o acc_uVar state - -
+
+var persistent integer cellPermute ( nCells ) 0 - cellPermute mesh - -
+var persistent integer edgePermute ( nEdges ) 0 - edgePermute mesh - -
+var persistent integer vertexPermute ( nVertices ) 0 - vertexPermute mesh - -

Modified: branches/ocean_projects/option1_b4b_test/src/core_ocean/mpas_ocn_tendency.F
===================================================================
--- branches/ocean_projects/option1_b4b_test/src/core_ocean/mpas_ocn_tendency.F        2012-08-14 21:29:46 UTC (rev 2100)
+++ branches/ocean_projects/option1_b4b_test/src/core_ocean/mpas_ocn_tendency.F        2012-08-14 21:33:46 UTC (rev 2101)
@@ -396,7 +396,8 @@
       type (state_type), intent(inout) :: s !&lt; Input/Output: State information
       type (mesh_type), intent(in) :: grid !&lt; Input: Grid information
 
-
+      integer :: edgeIndex, vertexIndex
+      integer, dimension(:), pointer :: edgePermute, vertexPermute
       integer :: iEdge, iCell, iVertex, k, cell1, cell2, vertex1, vertex2, eoe, i, j
       integer :: boundaryMask, velMask, nCells, nEdges, nVertices, nVertLevels, vertexDegree, err
 
@@ -468,6 +469,8 @@
       maxLevelEdgeTop   =&gt; grid % maxLevelEdgeTop % array
       maxLevelEdgeBot   =&gt; grid % maxLevelEdgeBot % array
       maxLevelVertexBot =&gt; grid % maxLevelVertexBot % array
+      edgePermute =&gt; grid % edgePermute % array
+      vertexPermute =&gt; grid % vertexPermute % array
                   
       nCells      = grid % nCells
       nEdges      = grid % nEdges
@@ -489,7 +492,7 @@
       h_edge = -1.0e34
       coef_3rd_order = config_coef_3rd_order
 
-      do iEdge=1,nEdges*hadv2nd
+      do iEdge=1,nEdges
          cell1 = cellsOnEdge(1,iEdge)
          cell2 = cellsOnEdge(2,iEdge)
          do k=1,maxLevelEdgeTop(iEdge)
@@ -497,72 +500,72 @@
          end do
       end do
 
-      do iEdge=1,nEdges*hadv3rd
-         cell1 = cellsOnEdge(1,iEdge)
-         cell2 = cellsOnEdge(2,iEdge)
+!     do iEdge=1,nEdges*hadv3rd
+!        cell1 = cellsOnEdge(1,iEdge)
+!        cell2 = cellsOnEdge(2,iEdge)
 
-         do k=1,maxLevelEdgeTop(iEdge)
+!        do k=1,maxLevelEdgeTop(iEdge)
 
-            d2fdx2_cell1 = 0.0
-            d2fdx2_cell2 = 0.0
+!           d2fdx2_cell1 = 0.0
+!           d2fdx2_cell2 = 0.0
 
-            boundaryMask = abs(transfer(.not.(boundaryCell(k,cell1) == 0 .and. boundaryCell(k,cell2) == 0), boundaryMask))
+!           boundaryMask = abs(transfer(.not.(boundaryCell(k,cell1) == 0 .and. boundaryCell(k,cell2) == 0), boundaryMask))
 
-            d2fdx2_cell1 = deriv_two(1,1,iEdge) * h(k,cell1) * boundaryMask
-            d2fdx2_cell2 = deriv_two(1,2,iEdge) * h(k,cell2) * boundaryMask
+!           d2fdx2_cell1 = deriv_two(1,1,iEdge) * h(k,cell1) * boundaryMask
+!           d2fdx2_cell2 = deriv_two(1,2,iEdge) * h(k,cell2) * boundaryMask
 
-            !-- all edges of cell 1
-            do i=1, nEdgesOnCell(cell1) * boundaryMask
-               d2fdx2_cell1 = d2fdx2_cell1 + &amp;
-               deriv_two(i+1,1,iEdge) * h(k,grid % CellsOnCell % array (i,cell1))
-            end do
+!           !-- all edges of cell 1
+!           do i=1, nEdgesOnCell(cell1) * boundaryMask
+!              d2fdx2_cell1 = d2fdx2_cell1 + &amp;
+!              deriv_two(i+1,1,iEdge) * h(k,grid % CellsOnCell % array (i,cell1))
+!           end do
 
-            !-- all edges of cell 2
-            do i=1, nEdgesOnCell(cell2) * boundaryMask
-               d2fdx2_cell2 = d2fdx2_cell2 + &amp;
-               deriv_two(i+1,2,iEdge) * h(k,grid % CellsOnCell % array (i,cell2))
-            end do
+!           !-- all edges of cell 2
+!           do i=1, nEdgesOnCell(cell2) * boundaryMask
+!              d2fdx2_cell2 = d2fdx2_cell2 + &amp;
+!              deriv_two(i+1,2,iEdge) * h(k,grid % CellsOnCell % array (i,cell2))
+!           end do
 
-            velMask = 2*(abs(transfer(u(k,iEdge) &lt;= 0, velMask))) - 1
+!           velMask = 2*(abs(transfer(u(k,iEdge) &lt;= 0, velMask))) - 1
 
-            h_edge(k,iEdge) = 0.5*(h(k,cell1) + h(k,cell2)) - (dcEdge(iEdge) **2) * (d2fdx2_cell1 + d2fdx2_cell2) / 12.          &amp;
-                            + velMask * (dcEdge(iEdge) **2) * coef_3rd_order*(d2fdx2_cell1 - d2fdx2_cell2) / 12.
+!           h_edge(k,iEdge) = 0.5*(h(k,cell1) + h(k,cell2)) - (dcEdge(iEdge) **2) * (d2fdx2_cell1 + d2fdx2_cell2) / 12.          &amp;
+!                           + velMask * (dcEdge(iEdge) **2) * coef_3rd_order*(d2fdx2_cell1 - d2fdx2_cell2) / 12.
 
-         end do   ! do k
-      end do         ! do iEdge
+!        end do   ! do k
+!     end do         ! do iEdge
 
-      do iEdge=1,nEdges*hadv4th
-         cell1 = cellsOnEdge(1,iEdge)
-         cell2 = cellsOnEdge(2,iEdge)
+!     do iEdge=1,nEdges*hadv4th
+!        cell1 = cellsOnEdge(1,iEdge)
+!        cell2 = cellsOnEdge(2,iEdge)
 
-         do k=1,maxLevelEdgeTop(iEdge)
+!        do k=1,maxLevelEdgeTop(iEdge)
 
-            d2fdx2_cell1 = 0.0
-            d2fdx2_cell2 = 0.0
+!           d2fdx2_cell1 = 0.0
+!           d2fdx2_cell2 = 0.0
 
-            boundaryMask = abs(transfer(.not.(boundaryCell(k,cell1) == 0 .and. boundaryCell(k,cell2) == 0), boundaryMask))
+!           boundaryMask = abs(transfer(.not.(boundaryCell(k,cell1) == 0 .and. boundaryCell(k,cell2) == 0), boundaryMask))
 
-            d2fdx2_cell1 = deriv_two(1,1,iEdge) * h(k,cell1) * boundaryMask
-            d2fdx2_cell2 = deriv_two(1,2,iEdge) * h(k,cell2) * boundaryMask
+!           d2fdx2_cell1 = deriv_two(1,1,iEdge) * h(k,cell1) * boundaryMask
+!           d2fdx2_cell2 = deriv_two(1,2,iEdge) * h(k,cell2) * boundaryMask
 
-            !-- all edges of cell 1
-            do i=1, nEdgesOnCell(cell1) * boundaryMask
-               d2fdx2_cell1 = d2fdx2_cell1 + &amp;
-               deriv_two(i+1,1,iEdge) * h(k,grid % CellsOnCell % array (i,cell1))
-            end do
+!           !-- all edges of cell 1
+!           do i=1, nEdgesOnCell(cell1) * boundaryMask
+!              d2fdx2_cell1 = d2fdx2_cell1 + &amp;
+!              deriv_two(i+1,1,iEdge) * h(k,grid % CellsOnCell % array (i,cell1))
+!           end do
 
-            !-- all edges of cell 2
-            do i=1, nEdgesOnCell(cell2) * boundaryMask
-               d2fdx2_cell2 = d2fdx2_cell2 + &amp;
-               deriv_two(i+1,2,iEdge) * h(k,grid % CellsOnCell % array (i,cell2))
-            end do
+!           !-- all edges of cell 2
+!           do i=1, nEdgesOnCell(cell2) * boundaryMask
+!              d2fdx2_cell2 = d2fdx2_cell2 + &amp;
+!              deriv_two(i+1,2,iEdge) * h(k,grid % CellsOnCell % array (i,cell2))
+!           end do
 
-            h_edge(k,iEdge) =   &amp;
-                 0.5*(h(k,cell1) + h(k,cell2))      &amp;
-                    -(dcEdge(iEdge) **2) * (d2fdx2_cell1 + d2fdx2_cell2) / 12.
+!           h_edge(k,iEdge) =   &amp;
+!                0.5*(h(k,cell1) + h(k,cell2))      &amp;
+!                   -(dcEdge(iEdge) **2) * (d2fdx2_cell1 + d2fdx2_cell2) / 12.
 
-         end do   ! do k
-      end do         ! do iEdge
+!        end do   ! do k
+!     end do         ! do iEdge
 
       !
       ! set the velocity and height at dummy address
@@ -579,11 +582,16 @@
       ke(:,:) = 0.0
       v(:,:) = 0.0
       do iEdge=1,nEdges
-         vertex1 = verticesOnEdge(1,iEdge)
-         vertex2 = verticesOnEdge(2,iEdge)
+#ifdef _BITREPRODUCIBLE      
+         edgeIndex = edgePermute(iEdge)
+#else
+         edgeIndex = iEdge
+#endif
+         vertex1 = verticesOnEdge(1,edgeIndex)
+         vertex2 = verticesOnEdge(2,edgeIndex)
 
-         cell1 = cellsOnEdge(1,iEdge)
-         cell2 = cellsOnEdge(2,iEdge)
+         cell1 = cellsOnEdge(1,edgeIndex)
+         cell2 = cellsOnEdge(2,edgeIndex)
 
          invAreaTri1 = 1.0 / areaTriangle(vertex1)
          invAreaTri2 = 1.0 / areaTriangle(vertex2)
@@ -592,9 +600,9 @@
          invAreaCell1 = 1.0 / max(areaCell(cell1), 1.0)
          invAreaCell2 = 1.0 / max(areaCell(cell2), 1.0)
 
-         do k=1,maxLevelEdgeBot(iEdge)
+         do k=1,maxLevelEdgeBot(edgeIndex)
             ! Compute circulation and relative vorticity at each vertex
-            r_tmp = dcEdge(iEdge) * u(k,iEdge)
+            r_tmp = dcEdge(edgeIndex) * u(k,edgeIndex)
             circulation(k,vertex1) = circulation(k,vertex1) - r_tmp
             circulation(k,vertex2) = circulation(k,vertex2) + r_tmp
 
@@ -602,23 +610,23 @@
             vorticity(k, vertex2) = vorticity(k, vertex2) + r_tmp * invAreaTri2
 
             ! Compute the divergence at each cell center
-            r_tmp = dvEdge(iEdge) * u(k, iEdge)
+            r_tmp = dvEdge(edgeIndex) * u(k, edgeIndex)
             divergence(k,cell1) = divergence(k,cell1) + r_tmp * invAreaCell1
             divergence(k,cell2) = divergence(k,cell2) - r_tmp * invAreaCell2
 
             ! Compute kinetic energy in each cell
-            r_tmp = r_tmp * dcEdge(iEdge) * u(k,iEdge)
+            r_tmp = r_tmp * dcEdge(edgeIndex) * u(k,edgeIndex)
             ke(k,cell1) = ke(k,cell1) + 0.25 * r_tmp * invAreaCell1
             ke(k,cell2) = ke(k,cell2) + 0.25 * r_tmp * invAreaCell2
          end do
 
          ! Compute v (tangential) velocities
-         do i=1,nEdgesOnEdge(iEdge)
-            eoe = edgesOnEdge(i,iEdge)
+         do i=1,nEdgesOnEdge(edgeIndex)
+            eoe = edgesOnEdge(i,edgeIndex)
             ! mrp 101115 note: in order to include flux boundary conditions,
             ! the following loop may need to change to maxLevelEdgeBot
-            do k = 1,maxLevelEdgeTop(iEdge) 
-               v(k,iEdge) = v(k,iEdge) + weightsOnEdge(i,iEdge) * u(k, eoe)
+            do k = 1,maxLevelEdgeTop(edgeIndex) 
+               v(k,edgeIndex) = v(k,edgeIndex) + weightsOnEdge(i,edgeIndex) * u(k, eoe)
             end do
          end do
 
@@ -629,10 +637,15 @@
       !
       kev(:,:) = 0.0; kevc(:,:) = 0.0
       do iEdge=1,nEdges*ke_vertex_flag
+#ifdef _BITREPRODUCIBLE      
+         edgeIndex = edgePermute(iEdge)
+#else
+         edgeIndex = iEdge
+#endif
          do k=1,nVertLevels
-            r_tmp = dcEdge(iEdge) * dvEdge(iEdge) * u(k, iEdge)**2
-            kev(k,verticesOnEdge(1,iEdge)) = kev(k,verticesOnEdge(1,iEdge)) + r_tmp
-            kev(k,verticesOnEdge(2,iEdge)) = kev(k,verticesOnEdge(2,iEdge)) + r_tmp
+            r_tmp = dcEdge(edgeIndex) * dvEdge(edgeIndex) * u(k, edgeIndex)**2
+            kev(k,verticesOnEdge(1,edgeIndex)) = kev(k,verticesOnEdge(1,edgeIndex)) + r_tmp
+            kev(k,verticesOnEdge(2,edgeIndex)) = kev(k,verticesOnEdge(2,edgeIndex)) + r_tmp
          end do
       end do
       do iVertex = 1,nVertices*ke_vertex_flag
@@ -641,12 +654,17 @@
          enddo
       enddo
       do iVertex = 1, nVertices*ke_vertex_flag
+#ifdef _BITREPRODUCIBLE
+       vertexIndex = vertexPermute(iVertex)
+#else
+       vertexIndex = iVertex
+#endif
        do i=1,grid % vertexDegree
-         iCell = cellsOnVertex(i,iVertex)
+         iCell = cellsOnVertex(i,vertexIndex)
          !dwj: 02/23/12 arraCell(nCells+1) is still 0, this is a temporary fix
          invAreaCell1 = 1.0 / max(areaCell(iCell), 1.0)
          do k=1,nVertLevels
-           kevc(k,iCell) = kevc(k,iCell) + kiteAreasOnVertex(i, iVertex) * kev(k, iVertex) * invAreaCell1
+           kevc(k,iCell) = kevc(k,iCell) + kiteAreasOnVertex(i, vertexIndex) * kev(k, vertexIndex) * invAreaCell1
          enddo
        enddo
       enddo
@@ -693,9 +711,14 @@
       Vor_cell(:,:) = 0.0
       Vor_edge(:,:) = 0.0
       do iVertex = 1,nVertices
+#ifdef _BITREPRODUCIBLE
+         vertexIndex = vertexPermute(iVertex)
+#else
+         vertexIndex = iVertex
+#endif
          do i=1,vertexDegree
-            iCell = cellsOnVertex(i,iVertex)
-            iEdge = edgesOnVertex(i,iVertex)
+            iCell = cellsOnVertex(i,vertexIndex)
+            iEdge = edgesOnVertex(i,vertexIndex)
 
             !dwj: 02/23/12 arraCell(nCells+1) is still 0, this is a temporary fix
             invAreaCell1 = 1.0 / max(areaCell(iCell), 1.0)
@@ -703,13 +726,13 @@
             ! Compute pv at cell centers
             !    ( this computes Vor_cell for all real cells and distance-1 ghost cells )
             do k = 1,maxLevelCell(iCell)
-               Vor_cell(k,iCell) = Vor_cell(k,iCell) + kiteAreasOnVertex(i, iVertex) * Vor_vertex(k, iVertex) * invAreaCell1
+               Vor_cell(k,iCell) = Vor_cell(k,iCell) + kiteAreasOnVertex(i, vertexIndex) * Vor_vertex(k, vertexIndex) * invAreaCell1
             enddo
 
             ! Compute pv at the edges
             !   ( this computes Vor_edge at all edges bounding real cells )
             do k=1,maxLevelEdgeBot(iEdge)
-               Vor_edge(k,iEdge) = Vor_edge(k,iEdge) + 0.5 * Vor_vertex(k,iVertex)
+               Vor_edge(k,iEdge) = Vor_edge(k,iEdge) + 0.5 * Vor_vertex(k,vertexIndex)
             enddo
          enddo
       enddo
@@ -871,6 +894,8 @@
       type (state_type), intent(inout) :: s2 !&lt; Input/Output: State 2 information
       type (mesh_type), intent(in) :: grid !&lt; Input: Grid information
 
+      integer :: edgeIndex
+      integer, dimension(:), pointer :: edgePermute
       integer :: iEdge, iCell, iVertex, k, cell1, cell2, vertex1, vertex2, eoe, i, j, cov
       real (kind=RKIND) :: flux, vorticity_abs, h_vertex, workpv, rho0Inv, hSum
 
@@ -901,6 +926,7 @@
       maxLevelEdgeBot   =&gt; grid % maxLevelEdgeBot % array
       dvEdge            =&gt; grid % dvEdge % array
       zstarWeight       =&gt; grid % zstarWeight % array
+      edgePermute =&gt; grid % edgePermute % array
 
       nCells      = grid % nCells
       nEdges      = grid % nEdges
@@ -915,10 +941,15 @@
       !
       div_hu(:,:) = 0.0
       do iEdge=1,nEdges
-         cell1 = cellsOnEdge(1,iEdge)
-         cell2 = cellsOnEdge(2,iEdge)
-         do k=1,maxLevelEdgeBot(iEdge)
-            flux = uTransport(k,iEdge) * dvEdge(iEdge) * h_edge(k,iEdge) 
+#ifdef _BITREPRODUCIBLE      
+         edgeIndex = edgePermute(iEdge)
+#else
+         edgeIndex = iEdge
+#endif
+         cell1 = cellsOnEdge(1,edgeIndex)
+         cell2 = cellsOnEdge(2,edgeIndex)
+         do k=1,maxLevelEdgeBot(edgeIndex)
+            flux = uTransport(k,edgeIndex) * dvEdge(edgeIndex) * h_edge(k,edgeIndex) 
             div_hu(k,cell1) = div_hu(k,cell1) + flux
             div_hu(k,cell2) = div_hu(k,cell2) - flux
          end do 

Modified: branches/ocean_projects/option1_b4b_test/src/core_ocean/mpas_ocn_thick_hadv.F
===================================================================
--- branches/ocean_projects/option1_b4b_test/src/core_ocean/mpas_ocn_thick_hadv.F        2012-08-14 21:29:46 UTC (rev 2100)
+++ branches/ocean_projects/option1_b4b_test/src/core_ocean/mpas_ocn_thick_hadv.F        2012-08-14 21:33:46 UTC (rev 2101)
@@ -103,8 +103,10 @@
 
       integer :: iEdge, nEdges, cell1, cell2, nVertLevels, k
       integer :: iCell, nCells
+      integer :: edgeIndex
 
       integer, dimension(:), pointer :: maxLevelEdgeBot, MaxLevelCell
+      integer, dimension(:), pointer :: edgePermute
       integer, dimension(:,:), pointer :: cellsOnEdge
 
       real (kind=RKIND) :: flux, invAreaCell1, invAreaCell2
@@ -129,12 +131,18 @@
       cellsOnEdge =&gt; grid % cellsOnEdge % array
       dvEdge =&gt; grid % dvEdge % array
       areaCell =&gt; grid % areaCell % array
+      edgePermute =&gt; grid % edgePermute % array
 
       do iEdge=1,nEdges
-         cell1 = cellsOnEdge(1,iEdge)
-         cell2 = cellsOnEdge(2,iEdge)
-         do k=1,maxLevelEdgeBot(iEdge)
-            flux = u(k,iEdge) * dvEdge(iEdge) * h_edge(k,iEdge)
+#ifdef _BITREPRODUCIBLE
+         edgeIndex = edgePermute(iEdge)
+#else
+         edgeIndex = iEdge
+#endif
+         cell1 = cellsOnEdge(1,edgeIndex)
+         cell2 = cellsOnEdge(2,edgeIndex)
+         do k=1,maxLevelEdgeBot(edgeIndex)
+            flux = u(k,edgeIndex) * dvEdge(edgeIndex) * h_edge(k,edgeIndex)
             tend(k,cell1) = tend(k,cell1) - flux 
             tend(k,cell2) = tend(k,cell2) + flux 
          end do

Modified: branches/ocean_projects/option1_b4b_test/src/core_ocean/mpas_ocn_time_integration_split.F
===================================================================
--- branches/ocean_projects/option1_b4b_test/src/core_ocean/mpas_ocn_time_integration_split.F        2012-08-14 21:29:46 UTC (rev 2100)
+++ branches/ocean_projects/option1_b4b_test/src/core_ocean/mpas_ocn_time_integration_split.F        2012-08-14 21:33:46 UTC (rev 2101)
@@ -99,6 +99,8 @@
       real (kind=RKIND), dimension(:), allocatable:: uTemp
       real (kind=RKIND), dimension(:,:), allocatable:: tracersTemp
 
+      integer :: edgeIndex
+
       call mpas_timer_start(&quot;se timestep&quot;, .false., timer_main)
 
       !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -409,21 +411,26 @@
                 ! config_btr_gam1_uWt1=  0     flux = uBtrOld*H
                 ! mrp 120201 efficiency: could we combine the following edge and cell loops?
                 do iEdge=1,block % mesh % nEdges
-                   cell1 = block % mesh % cellsOnEdge % array(1,iEdge)
-                   cell2 = block % mesh % cellsOnEdge % array(2,iEdge)
+#ifdef _BITREPRODUCIBLE
+                   edgeIndex = block % mesh % edgePermute % array(iEdge)
+#else
+                   edgeIndex = iEdge
+#endif
+                   cell1 = block % mesh % cellsOnEdge % array(1,edgeIndex)
+                   cell2 = block % mesh % cellsOnEdge % array(2,edgeIndex)
       
                    sshEdge = 0.5 * (block % state % time_levs(oldBtrSubcycleTime) % state % sshSubcycle % array(cell1) &amp;
                              + block % state % time_levs(oldBtrSubcycleTime) % state % sshSubcycle % array(cell2) )
-                   hSum = sshEdge + block % mesh % referenceBottomDepthTopOfCell % array (block % mesh % maxLevelEdgeTop % array(iEdge)+1)
+                   hSum = sshEdge + block % mesh % referenceBottomDepthTopOfCell % array (block % mesh % maxLevelEdgeTop % array(edgeIndex)+1)
       
-                   flux = ((1.0-config_btr_gam1_uWt1) * block % state % time_levs(oldBtrSubcycleTime) % state % uBtrSubcycle % array(iEdge) &amp;
-                          + config_btr_gam1_uWt1 * block % state % time_levs(newBtrSubcycleTime) % state % uBtrSubcycle % array(iEdge)) &amp;
+                   flux = ((1.0-config_btr_gam1_uWt1) * block % state % time_levs(oldBtrSubcycleTime) % state % uBtrSubcycle % array(edgeIndex) &amp;
+                          + config_btr_gam1_uWt1 * block % state % time_levs(newBtrSubcycleTime) % state % uBtrSubcycle % array(edgeIndex)) &amp;
                           * hSum 
 
-                   block % tend % ssh % array(cell1) = block % tend % ssh % array(cell1) - flux * block % mesh % dvEdge % array(iEdge)
-                   block % tend % ssh % array(cell2) = block % tend % ssh % array(cell2) + flux * block % mesh % dvEdge % array(iEdge) 
+                   block % tend % ssh % array(cell1) = block % tend % ssh % array(cell1) - flux * block % mesh % dvEdge % array(edgeIndex)
+                   block % tend % ssh % array(cell2) = block % tend % ssh % array(cell2) + flux * block % mesh % dvEdge % array(edgeIndex) 
       
-                   block % state % time_levs(1) % state % FBtr % array(iEdge) = block % state % time_levs(1) % state % FBtr % array(iEdge) &amp;
+                   block % state % time_levs(1) % state % FBtr % array(edgeIndex) = block % state % time_levs(1) % state % FBtr % array(edgeIndex) &amp;
                      + FBtr_coeff*flux
                 end do
       
@@ -452,6 +459,8 @@
       
                 block =&gt; domain % blocklist
                 do while (associated(block))
+                   allocate(utemp(block % mesh % nEdges+1))
+                   uTemp(:) = block % state % time_levs(newBtrSubcycleTime) % state % uBtrSubcycle % array(:)
                    do iEdge=1,block % mesh % nEdges 
                      cell1 = block % mesh % cellsOnEdge % array(1,iEdge)
                      cell2 = block % mesh % cellsOnEdge % array(2,iEdge)
@@ -460,8 +469,9 @@
                      CoriolisTerm = 0.0
                      do i = 1,block % mesh % nEdgesOnEdge % array(iEdge)
                          eoe = block % mesh % edgesOnEdge % array(i,iEdge)
-                       CoriolisTerm = CoriolisTerm + block % mesh % weightsOnEdge % array(i,iEdge) &amp;
-                             * block % state % time_levs(uPerpTime) % state % uBtrSubcycle % array(eoe) &amp;
+                         CoriolisTerm = CoriolisTerm + block % mesh % weightsOnEdge % array(i,iEdge) &amp;
+!                            * block % state % time_levs(uPerpTime) % state % uBtrSubcycle % array(eoe) &amp;
+                             * uTemp(eoe) &amp;
                              * block % mesh % fEdge  % array(eoe) 
                      end do
       
@@ -478,6 +488,7 @@
                          + dt/config_n_btr_subcycles *(CoriolisTerm - gravity *(sshCell2 - sshCell1) /block % mesh % dcEdge % array(iEdge) &amp;
                          + block % state % time_levs(1) % state % GBtrForcing % array(iEdge))) * block % mesh % edgeMask % array(1,iEdge)
                    end do
+                   deallocate(uTemp)
       
                    block =&gt; block % next
                 end do  ! block
@@ -503,8 +514,13 @@
                   ! config_btr_gam3_uWt2=  0     flux = uBtrOld*H
                   ! mrp 120201 efficiency: could we combine the following edge and cell loops?
                   do iEdge=1,block % mesh % nEdges
-                     cell1 = block % mesh % cellsOnEdge % array(1,iEdge)
-                     cell2 = block % mesh % cellsOnEdge % array(2,iEdge)
+#ifdef _BITREPRODUCIBLE
+                     edgeIndex = block % mesh % edgePermute % array(iEdge)
+#else
+                     edgeIndex = iEdge
+#endif
+                     cell1 = block % mesh % cellsOnEdge % array(1,edgeIndex)
+                     cell2 = block % mesh % cellsOnEdge % array(2,edgeIndex)
       
                      ! SSH is a linear combination of SSHold and SSHnew.
                      sshCell1 = (1-config_btr_gam2_SSHWt1)*block % state % time_levs(oldBtrSubcycleTime) % state % sshSubcycle % array(cell1) &amp;
@@ -513,16 +529,16 @@
                                +   config_btr_gam2_SSHWt1 *block % state % time_levs(newBtrSubcycleTime) % state % sshSubcycle % array(cell2)
 
                      sshEdge = 0.5 * (sshCell1 + sshCell2)
-                     hSum = sshEdge + block % mesh % referenceBottomDepthTopOfCell % array (block % mesh % maxLevelEdgeTop % array(iEdge)+1)
+                     hSum = sshEdge + block % mesh % referenceBottomDepthTopOfCell % array (block % mesh % maxLevelEdgeTop % array(edgeIndex)+1)
       
-                     flux = ((1.0-config_btr_gam3_uWt2) * block % state % time_levs(oldBtrSubcycleTime) % state % uBtrSubcycle % array(iEdge) &amp;
-                            + config_btr_gam3_uWt2 * block % state % time_levs(newBtrSubcycleTime) % state % uBtrSubcycle % array(iEdge)) &amp;
+                     flux = ((1.0-config_btr_gam3_uWt2) * block % state % time_levs(oldBtrSubcycleTime) % state % uBtrSubcycle % array(edgeIndex) &amp;
+                            + config_btr_gam3_uWt2 * block % state % time_levs(newBtrSubcycleTime) % state % uBtrSubcycle % array(edgeIndex)) &amp;
                             * hSum
       
-                     block % tend % ssh % array(cell1) = block % tend % ssh % array(cell1) - flux * block % mesh % dvEdge % array(iEdge) 
-                     block % tend % ssh % array(cell2) = block % tend % ssh % array(cell2) + flux * block % mesh % dvEdge % array(iEdge) 
+                     block % tend % ssh % array(cell1) = block % tend % ssh % array(cell1) - flux * block % mesh % dvEdge % array(edgeIndex) 
+                     block % tend % ssh % array(cell2) = block % tend % ssh % array(cell2) + flux * block % mesh % dvEdge % array(edgeIndex) 
       
-                     block % state % time_levs(1) % state % FBtr % array(iEdge) = block % state % time_levs(1) % state % FBtr % array(iEdge) + flux
+                     block % state % time_levs(1) % state % FBtr % array(edgeIndex) = block % state % time_levs(1) % state % FBtr % array(edgeIndex) + flux
                   end do
       
                   ! SSHnew = SSHold + dt/J*(-div(Flux))
@@ -684,6 +700,7 @@
          ! update halo for thickness and tracer tendencies
          call mpas_timer_start(&quot;se halo h&quot;, .false., timer_halo_h)
          call mpas_dmpar_exch_halo_field(domain % blocklist % tend % h)
+         call mpas_dmpar_exch_halo_field(domain % blocklist % state % time_levs(2) % state % tracers)
          call mpas_timer_stop(&quot;se halo h&quot;, timer_halo_h)
 
          block =&gt; domain % blocklist

Modified: branches/ocean_projects/option1_b4b_test/src/core_ocean/mpas_ocn_tracer_advection_mono.F
===================================================================
--- branches/ocean_projects/option1_b4b_test/src/core_ocean/mpas_ocn_tracer_advection_mono.F        2012-08-14 21:29:46 UTC (rev 2100)
+++ branches/ocean_projects/option1_b4b_test/src/core_ocean/mpas_ocn_tracer_advection_mono.F        2012-08-14 21:33:46 UTC (rev 2101)
@@ -61,8 +61,10 @@
       type (mesh_type), intent(in) :: grid !&lt; Input: Grid information
       real (kind=RKIND), dimension(:,:,:), intent(inout) :: tend !&lt; Input/Output: Tracer tendency
 
+      integer :: edgeIndex
       integer :: i, iCell, iEdge, k, iTracer, cell1, cell2
       integer :: nVertLevels, num_tracers, nCells, nEdges, nCellsSolve
+      integer, dimension(:), pointer :: edgePermute
       integer, dimension(:), pointer :: nAdvCellsForEdge, maxLevelCell, maxLevelEdgeTop, nEdgesOnCell
       integer, dimension(:,:), pointer :: cellsOnEdge, cellsOnCell, advCellsForEdge, highOrderAdvectionMask, lowOrderAdvectionMask
 
@@ -95,6 +97,7 @@
       maxLevelEdgeTop =&gt; grid % maxLevelEdgeTop % array
       highOrderAdvectionMask =&gt; grid % highOrderAdvectionMask % array
       lowOrderAdvectionMask =&gt; grid % lowOrderAdvectionMask % array
+      edgePermute =&gt; grid % edgePermute % array
 
       nCells = grid % nCells
       nCellsSolve = grid % nCellsSolve
@@ -240,24 +243,29 @@
         !  Store left over high order flux in high_order_horiz_flux array
         !  Upwind fluxes are accumulated in upwind_tendency
         do iEdge = 1, nEdges
-          cell1 = cellsOnEdge(1,iEdge)
-          cell2 = cellsOnEdge(2,iEdge)
+#ifdef _BITREPRODUCIBLE
+          edgeIndex = edgePermute(iEdge)
+#else
+          edgeIndex = iEdge
+#endif
+          cell1 = cellsOnEdge(1,edgeIndex)
+          cell2 = cellsOnEdge(2,edgeIndex)
 
           invAreaCell1 = 1.0 / areaCell(cell1)
           invAreaCell2 = 1.0 / areaCell(cell2)
 
-          do k = 1, maxLevelEdgeTop(iEdge)
-            flux_upwind = dvEdge(iEdge) * (max(0.,uh(k,iEdge))*tracer_cur(k,cell1) + min(0.,uh(k,iEdge))*tracer_cur(k,cell2))
-            high_order_horiz_flux(k,iEdge) = high_order_horiz_flux(k,iEdge) - flux_upwind
+          do k = 1, maxLevelEdgeTop(edgeIndex)
+            flux_upwind = dvEdge(edgeIndex) * (max(0.,uh(k,edgeIndex))*tracer_cur(k,cell1) + min(0.,uh(k,edgeIndex))*tracer_cur(k,cell2))
+            high_order_horiz_flux(k,edgeIndex) = high_order_horiz_flux(k,edgeIndex) - flux_upwind
 
             upwind_tendency(k,cell1) = upwind_tendency(k,cell1) - flux_upwind * invAreaCell1
             upwind_tendency(k,cell2) = upwind_tendency(k,cell2) + flux_upwind * invAreaCell2
 
             ! Accumulate remaining high order fluxes
-            flux_outgoing(k,cell1) = flux_outgoing(k,cell1) - max(0.,high_order_horiz_flux(k,iEdge)) * invAreaCell1
-            flux_incoming (k,cell1) = flux_incoming (k,cell1) - min(0.,high_order_horiz_flux(k,iEdge)) * invAreaCell1
-            flux_outgoing(k,cell2) = flux_outgoing(k,cell2) + min(0.,high_order_horiz_flux(k,iEdge)) * invAreaCell2
-            flux_incoming (k,cell2) = flux_incoming (k,cell2) + max(0.,high_order_horiz_flux(k,iEdge)) * invAreaCell2
+            flux_outgoing(k,cell1) = flux_outgoing(k,cell1) - max(0.,high_order_horiz_flux(k,edgeIndex)) * invAreaCell1
+            flux_incoming (k,cell1) = flux_incoming (k,cell1) - min(0.,high_order_horiz_flux(k,edgeIndex)) * invAreaCell1
+            flux_outgoing(k,cell2) = flux_outgoing(k,cell2) + min(0.,high_order_horiz_flux(k,edgeIndex)) * invAreaCell2
+            flux_incoming (k,cell2) = flux_incoming (k,cell2) + max(0.,high_order_horiz_flux(k,edgeIndex)) * invAreaCell2
           end do ! k loop
         end do ! iEdge loop
 
@@ -305,19 +313,24 @@
 
         ! Accumulate the scaled high order horizontal tendencies
         do iEdge = 1, nEdges
-          cell1 = cellsOnEdge(1,iEdge)
-          cell2 = cellsOnEdge(2,iEdge)
+#ifdef _BITREPRODUCIBLE
+          edgeIndex = edgePermute(iEdge)
+#else
+          edgeIndex = iEdge
+#endif
+          cell1 = cellsOnEdge(1,edgeIndex)
+          cell2 = cellsOnEdge(2,edgeIndex)
 
           invAreaCell1 = 1.0 / areaCell(cell1)
           invAreaCell2 = 1.0 / areaCell(cell2)
-          do k=1,maxLevelEdgeTop(iEdge)
-            tend(iTracer, k, cell1) = tend(iTracer, k, cell1) - high_order_horiz_flux(k, iEdge) * invAreaCell1
-            tend(iTracer, k, cell2) = tend(iTracer, k, cell2) + high_order_horiz_flux(k, iEdge) * invAreaCell2
+          do k=1,maxLevelEdgeTop(edgeIndex)
+            tend(iTracer, k, cell1) = tend(iTracer, k, cell1) - high_order_horiz_flux(k, edgeIndex) * invAreaCell1
+            tend(iTracer, k, cell2) = tend(iTracer, k, cell2) + high_order_horiz_flux(k, edgeIndex) * invAreaCell2
 
             if (config_check_monotonicity) then
               !tracer_new holds a tendency for now.
-              tracer_new(k, cell1) = tracer_new(k, cell1) - high_order_horiz_flux(k, iEdge) * invAreaCell1
-              tracer_new(k, cell2) = tracer_new(k, cell2) + high_order_horiz_flux(k, iEdge) * invAreaCell2
+              tracer_new(k, cell1) = tracer_new(k, cell1) - high_order_horiz_flux(k, edgeIndex) * invAreaCell1
+              tracer_new(k, cell2) = tracer_new(k, cell2) + high_order_horiz_flux(k, edgeIndex) * invAreaCell2
             end if
           end do ! k loop
         end do ! iEdge loop

Modified: branches/ocean_projects/option1_b4b_test/src/core_ocean/mpas_ocn_tracer_advection_std_hadv.F
===================================================================
--- branches/ocean_projects/option1_b4b_test/src/core_ocean/mpas_ocn_tracer_advection_std_hadv.F        2012-08-14 21:29:46 UTC (rev 2100)
+++ branches/ocean_projects/option1_b4b_test/src/core_ocean/mpas_ocn_tracer_advection_std_hadv.F        2012-08-14 21:33:46 UTC (rev 2101)
@@ -63,6 +63,9 @@
       real (kind=RKIND), dimension(:,:), allocatable :: flux_arr
       integer :: nVertLevels, num_tracers
 
+      integer :: edgeIndex
+      integer, dimension(:), pointer :: edgePermute
+
       if (.not. hadvOn) return
 
       cellsOnEdge =&gt; grid % cellsOnEdge % array
@@ -75,6 +78,7 @@
       adv_coefs_3rd =&gt; grid % adv_coefs_3rd % array
       highOrderAdvectionMask =&gt; grid % highOrderAdvectionMask % array
       lowOrderAdvectionMask =&gt; grid % lowOrderAdvectionMask % array
+      edgePermute =&gt; grid % edgePermute % array
 
       nVertLevels = grid % nVertLevels
       num_tracers = size(tracers, dim=1)
@@ -83,15 +87,20 @@
 
       !  horizontal flux divergence, accumulate in tracer_tend
       do iEdge=1,grid%nEdges
-         cell1 = cellsOnEdge(1,iEdge)
-         cell2 = cellsOnEdge(2,iEdge)
+#ifdef _BITREPRODUCIBLE
+         edgeIndex = edgePermute(iEdge)
+#else
+         edgeIndex = iEdge
+#endif
+         cell1 = cellsOnEdge(1,edgeIndex)
+         cell2 = cellsOnEdge(2,edgeIndex)
          if (cell1 &lt;= grid%nCellsSolve .or. cell2 &lt;= grid%nCellsSolve) then  ! only for owned cells
             flux_arr(:,:) = 0.
-            do i=1,nAdvCellsForEdge(iEdge)
-              iCell = advCellsForEdge(i,iEdge)
+            do i=1,nAdvCellsForEdge(edgeIndex)
+              iCell = advCellsForEdge(i,edgeIndex)
               do k=1,grid % nVertLevels
-              tracer_weight = lowOrderAdvectionMask(k, iEdge) * adv_coefs_2nd(i,iEdge) &amp; 
-                            + highOrderAdvectionMask(k, iEdge) * (adv_coefs(i,iEdge) + coef_3rd_order*sign(1.,uh(k,iEdge))*adv_coefs_3rd(i,iEdge))
+              tracer_weight = lowOrderAdvectionMask(k, edgeIndex) * adv_coefs_2nd(i,edgeIndex) &amp; 
+                            + highOrderAdvectionMask(k, edgeIndex) * (adv_coefs(i,edgeIndex) + coef_3rd_order*sign(1.,uh(k,edgeIndex))*adv_coefs_3rd(i,edgeIndex))
                 do iTracer=1,num_tracers
                   flux_arr(iTracer,k) = flux_arr(iTracer,k) + tracer_weight* tracers(iTracer,k,iCell)
                 end do
@@ -100,8 +109,8 @@
 
             do k=1,grid % nVertLevels
                do iTracer=1,num_tracers
-                  tend(iTracer,k,cell1) = tend(iTracer,k,cell1) - uh(k,iEdge)*flux_arr(iTracer,k)/areaCell(cell1)
-                  tend(iTracer,k,cell2) = tend(iTracer,k,cell2) + uh(k,iEdge)*flux_arr(iTracer,k)/areaCell(cell2)
+                  tend(iTracer,k,cell1) = tend(iTracer,k,cell1) - uh(k,edgeIndex)*flux_arr(iTracer,k)/areaCell(cell1)
+                  tend(iTracer,k,cell2) = tend(iTracer,k,cell2) + uh(k,edgeIndex)*flux_arr(iTracer,k)/areaCell(cell2)
                end do
             end do
          end if

Modified: branches/ocean_projects/option1_b4b_test/src/core_ocean/mpas_ocn_tracer_hmix_del2.F
===================================================================
--- branches/ocean_projects/option1_b4b_test/src/core_ocean/mpas_ocn_tracer_hmix_del2.F        2012-08-14 21:29:46 UTC (rev 2100)
+++ branches/ocean_projects/option1_b4b_test/src/core_ocean/mpas_ocn_tracer_hmix_del2.F        2012-08-14 21:33:46 UTC (rev 2101)
@@ -107,12 +107,14 @@
       !
       !-----------------------------------------------------------------
 
+      integer :: edgeIndex
       integer :: iEdge, nEdges, nVertLevels, cell1, cell2
       integer :: k, iTracer, num_tracers
 
       integer, dimension(:,:), allocatable :: boundaryMask
 
       integer, dimension(:), pointer :: maxLevelEdgeTop
+      integer, dimension(:), pointer :: edgePermute
       integer, dimension(:,:), pointer :: cellsOnEdge, edgeMask
 
       real (kind=RKIND) :: invAreaCell1, invAreaCell2
@@ -144,25 +146,31 @@
       dvEdge =&gt; grid % dvEdge % array
       dcEdge =&gt; grid % dcEdge % array
       meshScalingDel2 =&gt; grid % meshScalingDel2 % array
+      edgePermute =&gt; grid % edgePermute % array
 
       !
       ! compute a boundary mask to enforce insulating boundary conditions in the horizontal
       !
       do iEdge=1,nEdges
-         cell1 = cellsOnEdge(1,iEdge)
-         cell2 = cellsOnEdge(2,iEdge)
+#ifdef _BITREPRODUCIBLE
+         edgeIndex = edgePermute(iEdge)
+#else
+         edgeIndex = iEdge
+#endif
+         cell1 = cellsOnEdge(1,edgeIndex)
+         cell2 = cellsOnEdge(2,edgeIndex)
          invAreaCell1 = 1.0/areaCell(cell1)
          invAreaCell2 = 1.0/areaCell(cell2)
 
-         r_tmp = meshScalingDel2(iEdge) * eddyDiff2 * dvEdge(iEdge) / dcEdge(iEdge)
+         r_tmp = meshScalingDel2(edgeIndex) * eddyDiff2 * dvEdge(edgeIndex) / dcEdge(edgeIndex)
 
-         do k=1,maxLevelEdgeTop(iEdge)
+         do k=1,maxLevelEdgeTop(edgeIndex)
            do iTracer=1,num_tracers
               ! \kappa_2 </font>
<font color="black">abla \phi on edge
               tracer_turb_flux = tracers(iTracer,k,cell2) - tracers(iTracer,k,cell1)
 
               ! div(h \kappa_2 </font>
<font color="gray">abla \phi) at cell center
-              flux = h_edge(k,iEdge) * tracer_turb_flux * edgeMask(k, iEdge) * r_tmp
+              flux = h_edge(k,edgeIndex) * tracer_turb_flux * edgeMask(k, edgeIndex) * r_tmp
 
               tend(iTracer,k,cell1) = tend(iTracer,k,cell1) + flux * invAreaCell1
               tend(iTracer,k,cell2) = tend(iTracer,k,cell2) - flux * invAreaCell2

Modified: branches/ocean_projects/option1_b4b_test/src/core_ocean/mpas_ocn_tracer_hmix_del4.F
===================================================================
--- branches/ocean_projects/option1_b4b_test/src/core_ocean/mpas_ocn_tracer_hmix_del4.F        2012-08-14 21:29:46 UTC (rev 2100)
+++ branches/ocean_projects/option1_b4b_test/src/core_ocean/mpas_ocn_tracer_hmix_del4.F        2012-08-14 21:33:46 UTC (rev 2101)
@@ -107,10 +107,12 @@
       !
       !-----------------------------------------------------------------
 
+      integer :: edgeIndex
       integer :: iEdge, nEdges, num_tracers, nVertLevels, nCells
       integer :: iTracer, k, iCell, cell1, cell2
 
       integer, dimension(:), pointer :: maxLevelEdgeTop, maxLevelCell
+      integer, dimension(:), pointer :: edgePermute
       integer, dimension(:,:), pointer :: edgeMask, cellsOnEdge
 
       real (kind=RKIND) :: invAreaCell1, invAreaCell2, tracer_turb_flux, flux, invdcEdge, r_tmp1, r_tmp2
@@ -146,6 +148,8 @@
       areaCell =&gt; grid % areaCell % array
       meshScalingDel4 =&gt; grid % meshScalingDel4 % array
 
+      edgePermute =&gt; grid % edgePermute % array
+
       edgeMask =&gt; grid % edgeMask % array
 
       allocate(delsq_tracer(num_tracers,nVertLevels, nCells+1))
@@ -154,18 +158,23 @@
 
       ! first del2: div(h </font>
<font color="gray">abla \phi) at cell center
       do iEdge=1,nEdges
-         cell1 = cellsOnEdge(1,iEdge)
-         cell2 = cellsOnEdge(2,iEdge)
+#ifdef _BITREPRODUCIBLE
+         edgeIndex = edgePermute(iEdge)
+#else
+         edgeIndex = iEdge
+#endif
+         cell1 = cellsOnEdge(1,edgeIndex)
+         cell2 = cellsOnEdge(2,edgeIndex)
 
-         invdcEdge = 1.0 / dcEdge(iEdge)
+         invdcEdge = 1.0 / dcEdge(edgeIndex)
 
          invAreaCell1 = 1.0 / areaCell(cell1)
          invAreaCell2 = 1.0 / areaCell(cell2)
 
-         do k=1,maxLevelEdgeTop(iEdge)
-           do iTracer=1,num_tracers * edgeMask(k, iEdge)
+         do k=1,maxLevelEdgeTop(edgeIndex)
+           do iTracer=1,num_tracers * edgeMask(k, edgeIndex)
 
-              r_tmp1 = dvEdge(iEdge) * h_edge(k,iEdge) * invdcEdge
+              r_tmp1 = dvEdge(edgeIndex) * h_edge(k,edgeIndex) * invdcEdge
 
               r_tmp2 = r_tmp1 * tracers(iTracer,k,cell2)
               r_tmp1 = r_tmp1 * tracers(iTracer,k,cell1)
@@ -178,21 +187,26 @@
 
       ! second del2: div(h </font>
<font color="gray">abla [delsq_tracer]) at cell center
       do iEdge=1,grid % nEdges
-         cell1 = grid % cellsOnEdge % array(1,iEdge)
-         cell2 = grid % cellsOnEdge % array(2,iEdge)
+#ifdef _BITREPRODUCIBLE
+         edgeIndex = edgePermute(iEdge)
+#else
+         edgeIndex = iEdge
+#endif
+         cell1 = grid % cellsOnEdge % array(1,edgeIndex)
+         cell2 = grid % cellsOnEdge % array(2,edgeIndex)
 
          invAreaCell1 = 1.0 / areaCell(cell1)
          invAreaCell2 = 1.0 / areaCell(cell2)
 
-         invdcEdge = 1.0 / dcEdge(iEdge)
+         invdcEdge = 1.0 / dcEdge(edgeIndex)
 
-         do k=1,maxLevelEdgeTop(iEdge)
-            do iTracer=1,num_tracers * edgeMask(k,iEdge)
-               tracer_turb_flux = meshScalingDel4(iEdge) * eddyDiff4 &amp;
+         do k=1,maxLevelEdgeTop(edgeIndex)
+            do iTracer=1,num_tracers * edgeMask(k,edgeIndex)
+               tracer_turb_flux = meshScalingDel4(edgeIndex) * eddyDiff4 &amp;
                   * (delsq_tracer(iTracer,k,cell2) - delsq_tracer(iTracer,k,cell1)) &amp;
                   * invdcEdge
 
-               flux = dvEdge (iEdge) * tracer_turb_flux
+               flux = dvEdge (edgeIndex) * tracer_turb_flux
 
                tend(iTracer,k,cell1) = tend(iTracer,k,cell1) - flux * invAreaCell1
                tend(iTracer,k,cell2) = tend(iTracer,k,cell2) + flux * invAreaCell2

Modified: branches/ocean_projects/option1_b4b_test/src/core_ocean/mpas_ocn_vel_hmix_del4.F
===================================================================
--- branches/ocean_projects/option1_b4b_test/src/core_ocean/mpas_ocn_vel_hmix_del4.F        2012-08-14 21:29:46 UTC (rev 2100)
+++ branches/ocean_projects/option1_b4b_test/src/core_ocean/mpas_ocn_vel_hmix_del4.F        2012-08-14 21:33:46 UTC (rev 2101)
@@ -112,10 +112,12 @@
       !
       !-----------------------------------------------------------------
 
+      integer :: edgeIndex
       integer :: iEdge, cell1, cell2, vertex1, vertex2, k
       integer :: iCell, iVertex
       integer :: nVertices, nVertLevels, nCells, nEdges, nEdgesSolve
 
+      integer, dimension(:), pointer :: edgePermute
       integer, dimension(:), pointer :: maxLevelEdgeTop, maxLevelVertexBot, &amp;
             maxLevelCell
       integer, dimension(:,:), pointer :: cellsOnEdge, verticesOnEdge, edgeMask
@@ -149,6 +151,7 @@
       areaCell =&gt; grid % areaCell % array
       meshScalingDel4 =&gt; grid % meshScalingDel4 % array
       edgeMask =&gt; grid % edgeMask % array
+      edgePermute =&gt; grid % edgePermute % array
 
       allocate(delsq_divergence(nVertLevels, nCells+1))
       allocate(delsq_vorticity(nVertLevels, nVertices+1))
@@ -157,11 +160,16 @@
       delsq_divergence(:,:) = 0.0
 
       do iEdge=1,nEdges
-         cell1 = cellsOnEdge(1,iEdge)
-         cell2 = cellsOnEdge(2,iEdge)
+#ifdef _BITREPRODUCIBLE
+         edgeIndex = edgePermute(iEdge)
+#else
+         edgeIndex = iEdge
+#endif
+         cell1 = cellsOnEdge(1,edgeIndex)
+         cell2 = cellsOnEdge(2,edgeIndex)
 
-         vertex1 = verticesOnEdge(1,iEdge)
-         vertex2 = verticesOnEdge(2,iEdge)
+         vertex1 = verticesOnEdge(1,edgeIndex)
+         vertex2 = verticesOnEdge(2,edgeIndex)
 
          invAreaTri1 = 1.0 / areaTriangle(vertex1)
          invAreaTri2 = 1.0 / areaTriangle(vertex2)
@@ -169,21 +177,21 @@
          invAreaCell1 = 1.0 / areaCell(cell1)
          invAreaCell2 = 1.0 / areaCell(cell2)
 
-         invDcEdge = 1.0 / dcEdge(iEdge)
-         invDvEdge = 1.0 / dvEdge(iEdge)
+         invDcEdge = 1.0 / dcEdge(edgeIndex)
+         invDvEdge = 1.0 / dvEdge(edgeIndex)
 
-         do k=1,maxLevelEdgeTop(iEdge)
+         do k=1,maxLevelEdgeTop(edgeIndex)
             ! Compute </font>
<font color="black">abla^2 u = </font>
<font color="black">abla divergence + k \times </font>
<font color="black">abla vorticity
             delsq_u =          ( divergence(k,cell2)  - divergence(k,cell1) ) * invDcEdge  &amp;
                 -viscVortCoef *( vorticity(k,vertex2) - vorticity(k,vertex1)) * invDcEdge * sqrt(3.0)   ! TDR
 
             ! vorticity using </font>
<font color="red">abla^2 u
-            r_tmp = dcEdge(iEdge) * delsq_u
+            r_tmp = dcEdge(edgeIndex) * delsq_u
             delsq_vorticity(k,vertex1) = delsq_vorticity(k,vertex1) - r_tmp * invAreaTri1
             delsq_vorticity(k,vertex2) = delsq_vorticity(k,vertex2) + r_tmp * invAreaTri2
 
             ! Divergence using </font>
<font color="gray">abla^2 u
-            r_tmp = dvEdge(iEdge) * delsq_u
+            r_tmp = dvEdge(edgeIndex) * delsq_u
             delsq_divergence(k, cell1) = delsq_divergence(k,cell1) + r_tmp * invAreaCell1
             delsq_divergence(k, cell2) = delsq_divergence(k,cell2) - r_tmp * invAreaCell2
          end do

Modified: branches/ocean_projects/option1_b4b_test/src/core_ocean/mpas_ocn_vmix_coefs_rich.F
===================================================================
--- branches/ocean_projects/option1_b4b_test/src/core_ocean/mpas_ocn_vmix_coefs_rich.F        2012-08-14 21:29:46 UTC (rev 2100)
+++ branches/ocean_projects/option1_b4b_test/src/core_ocean/mpas_ocn_vmix_coefs_rich.F        2012-08-14 21:33:46 UTC (rev 2101)
@@ -427,9 +427,11 @@
       !
       !-----------------------------------------------------------------
 
+      integer :: edgeIndex
       integer :: nVertLevels, nCells, nEdges, iCell, iEdge, k
       integer :: cell1, cell2
 
+      integer, dimension(:), pointer :: edgePermute
       integer, dimension(:), pointer :: maxLevelCell, maxLevelEdgeTop, maxLevelEdgeBot
       integer, dimension(:,:), pointer :: cellsOnEdge
 
@@ -453,6 +455,7 @@
       dvEdge =&gt; grid % dvEdge % array
       dcEdge =&gt; grid % dcEdge % array
       areaCell =&gt; grid % areaCell % array
+      edgePermute =&gt; grid % edgePermute % array
 
       allocate( &amp;
          drhoTopOfCell(nVertLevels+1,nCells+1), drhoTopOfEdge(nVertLevels+1,nEdges), &amp;
@@ -499,13 +502,18 @@
       ! interpolate du2TopOfEdge to du2TopOfCell
       du2TopOfCell = 0.0
       do iEdge=1,nEdges
-         cell1 = cellsOnEdge(1,iEdge)
-         cell2 = cellsOnEdge(2,iEdge)
-         do k=2,maxLevelEdgeBot(iEdge)
+#ifdef _BITREPRODUCIBLE
+         edgeIndex = edgePermute(iEdge)
+#else
+         edgeIndex = iEdge
+#endif
+         cell1 = cellsOnEdge(1,edgeIndex)
+         cell2 = cellsOnEdge(2,edgeIndex)
+         do k=2,maxLevelEdgeBot(edgeIndex)
             du2TopOfCell(k,cell1) = du2TopOfCell(k,cell1) &amp;
-               + 0.5 * dcEdge(iEdge) * dvEdge(iEdge) * du2TopOfEdge(k,iEdge)
+               + 0.5 * dcEdge(edgeIndex) * dvEdge(edgeIndex) * du2TopOfEdge(k,edgeIndex)
             du2TopOfCell(k,cell2) = du2TopOfCell(k,cell2) &amp;
-               + 0.5 * dcEdge(iEdge) * dvEdge(iEdge) * du2TopOfEdge(k,iEdge)
+               + 0.5 * dcEdge(edgeIndex) * dvEdge(edgeIndex) * du2TopOfEdge(k,edgeIndex)
          end do
       end do
       do iCell = 1,nCells

Modified: branches/ocean_projects/option1_b4b_test/src/framework/mpas_block_creator.F
===================================================================
--- branches/ocean_projects/option1_b4b_test/src/framework/mpas_block_creator.F        2012-08-14 21:29:46 UTC (rev 2100)
+++ branches/ocean_projects/option1_b4b_test/src/framework/mpas_block_creator.F        2012-08-14 21:33:46 UTC (rev 2101)
@@ -1136,20 +1136,25 @@
          cellIDSorted(2,i) = i
        end do
        call mpas_quicksort(block_ptr % mesh % nCells, cellIDSorted)
+       block_ptr % mesh % cellPermute % array(1:block_ptr % mesh % nCells) = cellIDSorted(2,:)
+       block_ptr % mesh % cellPermute % array(block_ptr % mesh % nCells + 1) = block_ptr % mesh % nCells + 1
  
        do i=1,block_ptr % mesh % nEdges
          edgeIDSorted(1,i) = block_ptr % mesh % indexToEdgeID % array(i)
          edgeIDSorted(2,i) = i
        end do
        call mpas_quicksort(block_ptr % mesh % nEdges, edgeIDSorted)
+       block_ptr % mesh % edgePermute % array(1:block_ptr % mesh % nEdges) = edgeIDSorted(2,:)
+       block_ptr % mesh % edgePermute % array(block_ptr % mesh % nEdges + 1) = block_ptr % mesh % nEdges + 1
  
        do i=1,block_ptr % mesh % nVertices
          vertexIDSorted(1,i) = block_ptr % mesh % indexToVertexID % array(i)
          vertexIDSorted(2,i) = i
        end do
        call mpas_quicksort(block_ptr % mesh % nVertices, vertexIDSorted)
+       block_ptr % mesh % vertexPermute % array(1:block_ptr % mesh % nVertices) = vertexIDSorted(2,:)
+       block_ptr % mesh % vertexPermute % array(block_ptr % mesh % nVertices + 1) = block_ptr % mesh % nVertices + 1
  

        do i=1,block_ptr % mesh % nCells
          do j=1,block_ptr % mesh % nEdgesOnCell % array(i)
            k = mpas_binary_search(cellIDSorted, 2, 1, block_ptr % mesh % nCells, &amp;

</font>
</pre>