<p><b>mpetersen@lanl.gov</b> 2010-05-13 15:55:22 -0600 (Thu, 13 May 2010)</p><p>Clean up comments in tendency subroutines.<br>
</p><hr noshade><pre><font color="gray">Modified: branches/ocean_projects/z_level_mrp/mpas/src/core_ocean/module_time_integration.F
===================================================================
--- branches/ocean_projects/z_level_mrp/mpas/src/core_ocean/module_time_integration.F        2010-05-13 19:32:10 UTC (rev 269)
+++ branches/ocean_projects/z_level_mrp/mpas/src/core_ocean/module_time_integration.F        2010-05-13 21:55:22 UTC (rev 270)
@@ -284,7 +284,6 @@
       u           =&gt; s % u % array
       v           =&gt; s % v % array
       wBot        =&gt; s % wBot % array
-      hFluxBot          =&gt; tend % wBot % array
       h_edge      =&gt; s % h_edge % array
       circulation =&gt; s % circulation % array
       vorticity   =&gt; s % vorticity % array
@@ -318,6 +317,7 @@
 
       tend_h      =&gt; tend % h % array
       tend_u      =&gt; tend % u % array
+      hFluxBot    =&gt; tend % wBot % array
                   
       nCells      = grid % nCells
       nEdges      = grid % nEdges
@@ -327,9 +327,10 @@
       u_src =&gt; grid % u_src % array
 
       !
-      ! Compute height tendency for each cell
-      ! See Ringler et al. (2010) jcp paper, eqn 19, 21, and fig. 3.
+      ! height tendency: horizontal advection term -</font>
<font color="gray">abla\cdot ( hu)
       !
+      ! See Ringler et al. (2010) jcp paper, eqn 19, 21, and fig. 3. 
+      ! for explanation of divergence operator.
       tend_h(:,:) = 0.0
       do iEdge=1,nEdges
             cell1 = cellsOnEdge(1,iEdge)
@@ -347,13 +348,15 @@
                end do 
             end if
       end do 
-
       do iCell=1,nCells
          do k=1,nVertLevels
             tend_h(k,iCell) = tend_h(k,iCell) / areaCell(iCell)
          end do
       end do
 
+      !
+      ! height tendency: vertical advection term -d/dz(hw)
+      !
       if (config_vert_grid_type.eq.'isopycnal') then
         hFluxBot=0.0  ! vertical fluxes are zero
 
@@ -387,42 +390,23 @@
 
         end do
       endif ! coordinate type
-      ! mrp 100409 end
 
-!print *, 'ncells,grid % nCellsSolve, size(hFluxBot)',ncells,grid % nCellsSolve, size(hFluxBot,1), size(hFluxBot,2)
-! print '(a,i5,f10.5)', &amp;
-!  'k,   min(tend_h(k,2:)),max(tend_h(k,2:)),min(hFluxBot(k,:)),max(hFluxBot(k,:))'
-! do k=1,nVertLevels
-!   print '(i5,10es10.2)', &amp;
-!     k,minval(tend_h(k,1:grid % ncellssolve)),maxval(tend_h(k,1:grid % ncellssolve)), &amp;
-! minval(hFluxBot(k,1:grid % ncellssolve)),maxval(hFluxBot(k,1:grid % ncellssolve))
-! enddo
-
       !
-      ! Compute u (normal) velocity tendency for each edge (cell face)
+      ! velocity tendency: vertical advection term -w du/dz
       !
       tend_u(:,:) = 0.0
-      rho0Inv = 1.0/config_rho0
-      do iEdge=1,grid % nEdgesSolve
+      if (config_vert_grid_type.eq.'zlevel') then
+       do iEdge=1,grid % nEdgesSolve
          cell1 = cellsOnEdge(1,iEdge)
          cell2 = cellsOnEdge(2,iEdge)
-         vertex1 = verticesOnEdge(1,iEdge)
-         vertex2 = verticesOnEdge(2,iEdge)
 
-         ! mrp 100422 add -w*dudz term to tendancy
-         ! For isopycnal mode, wBot should be zero.
-         ! change nvertlevels to kmt later
          do k=1,nVertLevels-1
            ! Average w from cell center to edge
            wBotEdge = 0.5*(wBot(k,cell1)+wBot(k,cell2))
 
            ! compute dudz at vertical interface with first order derivative.
-! mrp 100511 new:
-!           w_dudzBotEdge(k) = wBotEdge * (u(k,iEdge)-u(k+1,iEdge)) &amp;
-!                        / (zMidZLevel(k) - zMidZLevel(k+1))
-! mrp 100511 old:
            w_dudzBotEdge(k) = wBotEdge * (u(k,iEdge)-u(k+1,iEdge)) &amp;
-                       * 2.0 / (h_edge(k,iEdge) + h_edge(k+1,iEdge))
+                        / (zMidZLevel(k) - zMidZLevel(k+1))
          end do
          w_dudzBotEdge(nVertLevels) = 0.0
 
@@ -431,29 +415,48 @@
          do k=2,nVertLevels
             tend_u(k,iEdge) = - 0.5 * (w_dudzBotEdge(k-1) + w_dudzBotEdge(k))
          enddo
-         ! mrp 100422 end: add -w*dudz term to tendancy
+       enddo
+      endif
 
-         ! mrp 100426: add pressure gradient
-         if (config_vert_grid_type.eq.'isopycnal') then
-           do k=1,nVertLevels
+      !
+      ! velocity tendency: pressure gradient
+      !
+      rho0Inv = 1.0/config_rho0
+      if (config_vert_grid_type.eq.'isopycnal') then
+        do iEdge=1,grid % nEdgesSolve
+          cell1 = cellsOnEdge(1,iEdge)
+          cell2 = cellsOnEdge(2,iEdge)
+          do k=1,nVertLevels
              tend_u(k,iEdge) = tend_u(k,iEdge)     &amp;
                - (MontPot(k,cell2) - MontPot(k,cell1))/dcEdge(iEdge)
            end do
-         elseif (config_vert_grid_type.eq.'zlevel') then
-           do k=1,nVertLevels
+        enddo
+      elseif (config_vert_grid_type.eq.'zlevel') then
+        do iEdge=1,grid % nEdgesSolve
+          cell1 = cellsOnEdge(1,iEdge)
+          cell2 = cellsOnEdge(2,iEdge)
+          do k=1,nVertLevels
              tend_u(k,iEdge) = tend_u(k,iEdge)     &amp;
                - rho0Inv*(  pmidZLevel(k,cell2) &amp;
                           - pmidZLevel(k,cell1) )/dcEdge(iEdge)
-           end do
-         endif
-         ! mrp 100426 end: add pressure gradient
+          end do
+        enddo
+      endif
 
+      !
+      ! velocity tendency: -q(h u^\perp) - </font>
<font color="blue">abla K 
+      !                +</font>
<font color="black">u_h(</font>
<font color="black">abla \delta + {\bf k}\times </font>
<font color="blue">abla \xi)
+      !
+      ! Compute diffusion, computed as </font>
<font color="black">abla divergence - k \times </font>
<font color="red">abla vorticity
+      !                    only valid for visc == constant
+       do iEdge=1,grid % nEdgesSolve
+         cell1 = cellsOnEdge(1,iEdge)
+         cell2 = cellsOnEdge(2,iEdge)
+         vertex1 = verticesOnEdge(1,iEdge)
+         vertex2 = verticesOnEdge(2,iEdge)
+
          do k=1,nVertLevels
 
-         !
-         ! Compute diffusion, computed as </font>
<font color="black">abla divergence - k \times </font>
<font color="gray">abla vorticity
-         !                    only valid for visc == constant
-         !
             u_diffusion =   ( divergence(k,cell2)  -  divergence(k,cell1) ) / dcEdge(iEdge) &amp;
                            -(vorticity(k,vertex2)  - vorticity(k,vertex1) ) / dvEdge(iEdge)
             u_diffusion = visc * u_diffusion
@@ -472,6 +475,9 @@
          end do
       end do
 
+      !
+      ! velocity tendency: forcing and bottom drag
+      !
       do iEdge=1,grid % nEdgesSolve
 
          ! forcing in top layer only
@@ -484,13 +490,14 @@
 
       enddo
 
-      ! vertical mixing
+      !
+      ! velocity tendency: vertical mixing d/dz( nu_v du/dz))
+      !
       allocate(fluxVert(0:nVertLevels))
       do iEdge=1,grid % nEdgesSolve
          fluxVert(0) = 0.0
          fluxVert(nVertLevels) = 0.0
          do k=nVertLevels-1,1,-1
-           ! default vertical viscosity is 2.5e-4m^2/s
            fluxVert(k) = config_vert_viscosity &amp;
               * ( u(k,iEdge) - u(k+1,iEdge) ) &amp;
               / (zMidEdge(k,iEdge) -zMidEdge(k+1,iEdge))
@@ -508,7 +515,16 @@
       end do
       deallocate(fluxVert)
 
+!print *, 'ncells,grid % nCellsSolve, size(hFluxBot)',ncells,grid % nCellsSolve, size(hFluxBot,1), size(hFluxBot,2)
 ! print '(a,i5,f10.5)', &amp;
+!  'k,   min(tend_h(k,2:)),max(tend_h(k,2:)),min(hFluxBot(k,:)),max(hFluxBot(k,:))'
+! do k=1,nVertLevels
+!   print '(i5,10es10.2)', &amp;
+!     k,minval(tend_h(k,1:grid % ncellssolve)),maxval(tend_h(k,1:grid % ncellssolve)), &amp;
+! minval(hFluxBot(k,1:grid % ncellssolve)),maxval(hFluxBot(k,1:grid % ncellssolve))
+! enddo
+
+! print '(a,i5,f10.5)', &amp;
 !  'k,   min(tend_u(k,:)),max(tend_u(k,:))'
 ! do k=1,nVertLevels
 !   print '(i5,10es22.12)', &amp;
@@ -535,8 +551,7 @@
 
       integer :: iCell, iEdge, k, iTracer, cell1, cell2, upwindCell,&amp;
         nEdges, nCells, nVertLevels
-      real (kind=RKIND) :: flux, tracer_edge, r, &amp;
-        Tmid(num_tracers,grid % nVertLevels)
+      real (kind=RKIND) :: flux, tracer_edge, r
       real (kind=RKIND) :: dist
       real (kind=RKIND), dimension(:), pointer :: &amp;
         h_s, fVertex, fEdge, dvEdge, dcEdge, areaCell, areaTriangle, zsurface
@@ -546,7 +561,8 @@
         tracers, tend_tr
       integer, dimension(:), pointer :: nEdgesOnCell, nEdgesOnEdge
       integer, dimension(:,:), pointer :: cellsOnEdge
-      real (kind=RKIND), dimension(:,:), allocatable:: fluxVert
+      real (kind=RKIND), dimension(:), allocatable:: hFluxBotCol
+      real (kind=RKIND), dimension(:,:), allocatable:: fluxVert, tracerBot
       real (kind=RKIND), dimension(:,:,:), allocatable::tr_flux, tr_div
 
       u           =&gt; s % u % array
@@ -568,7 +584,9 @@
       nCells      = grid % nCells
       nVertLevels = grid % nVertLevels
 
-      ! Horizontal advection of tracers
+      !
+      ! tracer tendency: horizontal advection term -</font>
<font color="gray">abla\cdot ( h \phi u)
+      !
       tend_tr(:,:,:) = 0.0
       if (config_hor_tracer_adv.eq.'centered') then
 
@@ -612,104 +630,74 @@
        end do 
 
       endif
+      do iCell=1,grid % nCellsSolve
+         do k=1,grid % nVertLevelsSolve
+            do iTracer=1,num_tracers
+               tend_tr(iTracer,k,iCell) = tend_tr(iTracer,k,iCell) / areaCell(iCell)
+            end do
+         end do
+      end do
 
-      ! mrp 100409 computation of h tendency was, only had div.(huT) term
-      !do iCell=1,grid % nCellsSolve
-      !   do k=1,grid % nVertLevelsSolve
-      !      do iTracer=1,num_tracers
-      !         tend_tr(iTracer,k,iCell) = tend_tr(iTracer,k,iCell) / areaCell(iCell)
-      !      end do
-      !   end do
-      !end do
-      ! mrp 100409 replace with
-      allocate(fluxVert(num_tracers,0:nVertLevels))
-      Tmid=0.0
+      !
+      ! tracer tendency: vertical advection term -d/dz( h \phi w)
+      !
+      allocate(tracerBot(num_tracers,0:nVertLevels))
+      allocate(hFluxBotCol(0:nVertLevels))
+      tracerBot(:,0)=0.0
+      tracerBot(:,nVertLevels)=0.0
+      hFluxBotCol(0)=0.0
+      hFluxBotCol(nVertLevels)=0.0
       do iCell=1,grid % nCellsSolve 
 
-         ! Tmid(:,k) is the tracer value at the interface between layers k and k+1
-         ! Surface tracer Tmid(:,1) is not used
-         ! For now, Tmid is just the average of the upper and lower points.
-         ! Can use a fancier interpolation later.
-         ! change nVertLevels to KMT later
          if (config_vert_tracer_adv.eq.'centered') then
-
-          do k=1,nVertLevels-1
-            do iTracer=1,num_tracers
-               Tmid(iTracer,k) = (   tracers(iTracer,k  ,iCell) &amp;
+           do k=1,nVertLevels-1
+             do iTracer=1,num_tracers
+               tracerBot(iTracer,k) = (   tracers(iTracer,k  ,iCell) &amp;
                                    + tracers(iTracer,k+1,iCell))/2.0
-            end do
-          end do
+             end do
+           end do
          
          elseif (config_vert_tracer_adv.eq.'upwind') then
+           do k=1,nVertLevels-1
+             if (hFluxBot(k,iCell)&gt;0.0) then
+               upwindCell = k+1
+             else
+               upwindCell = k
+             endif
+             do iTracer=1,num_tracers
+               tracerBot(iTracer,k) = tracers(iTracer,upwindCell,iCell)
+             end do
+           end do
 
-          do k=1,nVertLevels-1
-            if (hFluxBot(k,iCell)&gt;0.0) then
-              upwindCell = k+1
-            else
-              upwindCell = k
-            endif
-            do iTracer=1,num_tracers
-               Tmid(iTracer,k) = tracers(iTracer,upwindCell,iCell)
-            end do
-          end do
-
-         elseif (config_vert_tracer_adv.eq.'downwind') then
-
-          do k=1,nVertLevels-1
-            if (hFluxBot(k,iCell)&gt;0.0) then
-              upwindCell = k
-            else
-              upwindCell = k+1
-            endif
-            do iTracer=1,num_tracers
-               Tmid(iTracer,k) = tracers(iTracer,upwindCell,iCell)
-            end do
-          end do
-
          endif
 
-         ! The next loop could be combined with the later two for better efficiency.
-         ! Keep separate now for clarity.
-         do k=1,grid % nVertLevelsSolve
+         hFluxBotCol(1:nVertLevels)=hFluxBot(1:nVertLevels,iCell)
+         do k=1,nVertLevels  
             do iTracer=1,num_tracers
-               ! this is just div.(huT) term:
-               tend_tr(iTracer,k,iCell) = tend_tr(iTracer,k,iCell) / areaCell(iCell)
-            end do
-         end do
-
-         ! top layer: flux from below only
-         k=1
-            do iTracer=1,num_tracers
-               ! this is -div.(huT) - d/dz(hwT) terms.
-               ! note flux at surface is hFluxBot(1,iCell)=0 so index can go to k=1.
                tend_tr(iTracer,k,iCell) = tend_tr(iTracer,k,iCell) &amp;
-                  - ( - hFluxBot(k,iCell)*Tmid(iTracer,k))/h(k,icell)
+                  - (   hFluxBotCol(k-1)*tracerBot(iTracer,k-1) &amp;
+                      - hFluxBotCol(k  )*tracerBot(iTracer,k  ))/h(k,icell)
             end do
-
-         ! change nVertLevels to KMT later
-         do k=2,nVertLevels  
-            do iTracer=1,num_tracers
-               ! this is -div.(huT) - d/dz(hwT) terms.
-               ! note flux at surface is hFluxBot(1,iCell)=0 so index can go to k=1.
-               tend_tr(iTracer,k,iCell) = tend_tr(iTracer,k,iCell) &amp;
-                  - (   hFluxBot(k-1,iCell)*Tmid(iTracer,k-1) &amp;
-                      - hFluxBot(k  ,iCell)*Tmid(iTracer,k  ))/h(k,icell)
-            end do
          end do
 
-         ! vertical mixing
-         fluxVert(:,0) = 0.0
-         fluxVert(:,nVertLevels) = 0.0
+      enddo ! iCell
+      deallocate(tracerBot,hFluxBotcol)
+
+      !
+      ! tracer tendency: vertical mixing d/dz( \kappa_v d\phi/dz))
+      !
+      allocate(fluxVert(num_tracers,0:nVertLevels))
+      fluxVert(:,0) = 0.0
+      fluxVert(:,nVertLevels) = 0.0
+      do iCell=1,grid % nCellsSolve 
          do k=1,nVertLevels-1
            do iTracer=1,num_tracers
-             ! compute kappa_v dphi/dz
-             ! Default vertical diffusivity is 2.5e-5m^2/s.
-             ! In POP, default vertical tracer diffusion is 0.25cm^2/s=2.5e-5m^2/s
              fluxVert(iTracer,k) = config_vert_diffusion &amp;
                 * (tracers(iTracer,k,iCell) - tracers(iTracer,k+1,iCell) )&amp;
                 / (zMid(k,iCell) -zMid(k+1,iCell))
            enddo
          enddo
+
          k=1
            dist = zSurface(iCell) - zBot(k,iCell)
            do iTracer=1,num_tracers
@@ -727,31 +715,28 @@
 
       enddo ! iCell loop
       deallocate(fluxVert)
-      ! mrp 100409 end
 
-      ! mrp 100501: Horizontal tracer diffusion 
-      ! first compute kappa*grad(phi) at edges.
-      ! note this could be combined with the above loops for tracer flux.
-      ! leave it separate for now for clarity.
-      ! default kappa is 2e3m^2/s, from 2e7cm^2/s in the POP Users Guide p. 39
+      !
+      ! tracer tendency: horizontal tracer diffusion 
+      !   </font>
<font color="black">abla\cdot (\kappa_h </font>
<font color="blue">abla\phi )
+      !
+      ! first compute \kappa_h </font>
<font color="red">abla\phi at horizontal edges.
       allocate(tr_flux(num_tracers,nVertLevels,nEdges))
       tr_flux(:,:,:) = 0.0
       do iEdge=1,nEdges
-         cell1 = cellsOnEdge(1,iEdge)
-         cell2 = cellsOnEdge(2,iEdge)
-         if (cell1 &lt;= nCells .and. cell2 &lt;= nCells) then
-
-         do k=1,nVertLevels
-           do iTracer=1,num_tracers
-             tr_flux(iTracer,k,iEdge) =  config_hor_diffusion *    &amp;
-                (Tracers(iTracer,k,cell2) - Tracers(iTracer,k,cell1))/dcEdge(iEdge)
-           enddo
-         enddo
+        cell1 = cellsOnEdge(1,iEdge)
+        cell2 = cellsOnEdge(2,iEdge)
+        if (cell1 &lt;= nCells .and. cell2 &lt;= nCells) then
+          do k=1,nVertLevels
+            do iTracer=1,num_tracers
+              tr_flux(iTracer,k,iEdge) =  config_hor_diffusion *    &amp;
+                 (Tracers(iTracer,k,cell2) - Tracers(iTracer,k,cell1))/dcEdge(iEdge)
+            enddo
+          enddo
         endif
       enddo
 
-      ! Compute the divergence, div(k grad(phi)) at each cell center
-      !
+      ! Compute the divergence, div(\kappa_h </font>
<font color="gray">abla\phi) at cell centers
       allocate(tr_div(num_tracers,nVertLevels,nCells))
       tr_div(:,:,:) = 0.0
       do iEdge=1,nEdges
@@ -775,8 +760,8 @@
          end if
       end do
 
-      ! The term div(k grad(phi)) is then added to each cell center below.
-       do iCell = 1,nCells
+      ! add </font>
<font color="black">abla\cdot (\kappa_h </font>
<font color="gray">abla\phi ) to tracer tendency
+      do iCell = 1,nCells
         r = 1.0 / areaCell(iCell)
         do k = 1,nVertLevels
            do iTracer=1,num_tracers
@@ -786,7 +771,6 @@
         enddo
       enddo
       deallocate(tr_flux, tr_div)
-      ! mrp 100501 end: Horizontal tracer diffusion
 
           ! print some diagnostics - for debugging
 !         print *, 'after vertical mixing',&amp;
@@ -1102,18 +1086,15 @@
       !
       ! For a isopycnal model, density should remain constant.
       if (config_vert_grid_type.eq.'zlevel') then
-
-      do iCell=1,nCells
-         do k=1,nVertLevels
+        do iCell=1,nCells
+          do k=1,nVertLevels
             ! Linear equation of state, for the time being
             rho(k,iCell) = 1000.0*(  1.0 &amp;
                - 2.5e-4*tracers(index_temperature,k,iCell) &amp;
                + 7.6e-4*tracers(index_salinity,k,iCell))
-         end do
-      end do
-
+          end do
+        end do
       endif
-      !mrp 100324 end
 
 
       ! For Isopycnal model.

</font>
</pre>