<p><b>duda</b> 2009-11-23 10:31:54 -0700 (Mon, 23 Nov 2009)</p><p>Add horizontal divergence as a diagnostic field from repository trunk.<br>
Add del2 mixing for velocity from repository trunk.<br>
Add namelist options to control eddy viscosities for theta and <br>
  velocity in the horizontal and vertical.<br>
<br>
M    src/module_time_integration.F<br>
M    src/module_constants.F<br>
M    Registry/Registry<br>
M    namelist.input<br>
</p><hr noshade><pre><font color="gray">Modified: branches/hyd_model/Registry/Registry
===================================================================
--- branches/hyd_model/Registry/Registry        2009-11-20 00:50:42 UTC (rev 78)
+++ branches/hyd_model/Registry/Registry        2009-11-23 17:31:54 UTC (rev 79)
@@ -6,6 +6,10 @@
 namelist real      sw_model config_dt                   172.8
 namelist integer   sw_model config_ntimesteps           7500
 namelist integer   sw_model config_output_interval      500
+namelist real      sw_model config_h_mom_eddy_visc2     0.0
+namelist real      sw_model config_v_mom_eddy_visc2     0.0
+namelist real      sw_model config_h_theta_eddy_visc2   0.0
+namelist real      sw_model config_v_theta_eddy_visc2   0.0
 namelist integer   restart  config_restart_interval     0
 namelist logical   restart  config_do_restart           false
 namelist real      restart  config_restart_time         172800.0
@@ -98,6 +102,7 @@
 
 # Diagnostic fields: only written to output
 var real    v ( nVertLevels nEdges Time ) o v
+var real    divergence ( nVertLevels nCells Time ) o divergence
 var real    vorticity ( nVertLevels nVertices Time ) o vorticity
 var real    pv_edge ( nVertLevels nEdges Time ) o pv_edge
 var real    h_edge ( nVertLevels nEdges Time ) o h_edge

Modified: branches/hyd_model/namelist.input
===================================================================
--- branches/hyd_model/namelist.input        2009-11-20 00:50:42 UTC (rev 78)
+++ branches/hyd_model/namelist.input        2009-11-23 17:31:54 UTC (rev 79)
@@ -5,6 +5,10 @@
    config_ntimesteps = 240
    config_output_interval = 24
    config_number_of_sub_steps = 4
+   config_h_mom_eddy_visc2 = 0.0
+   config_v_mom_eddy_visc2 = 0.0
+   config_h_theta_eddy_visc2 = 0.0
+   config_v_theta_eddy_visc2 = 0.0
 /
 
 &amp;restart

Modified: branches/hyd_model/src/module_constants.F
===================================================================
--- branches/hyd_model/src/module_constants.F        2009-11-20 00:50:42 UTC (rev 78)
+++ branches/hyd_model/src/module_constants.F        2009-11-23 17:31:54 UTC (rev 79)
@@ -8,7 +8,7 @@
    real (kind=RKIND), parameter :: cp = 1003.
    real (kind=RKIND), parameter :: cv = 716.  ! cp - rgas
    real (kind=RKIND), parameter :: cvpm = -.71385842 ! -cv/cp
-   real (kind=RKIND), parameter :: prandtl = 3.
+   real (kind=RKIND), parameter :: prandtl = 1.0
 
 
    contains

Modified: branches/hyd_model/src/module_time_integration.F
===================================================================
--- branches/hyd_model/src/module_time_integration.F        2009-11-20 00:50:42 UTC (rev 78)
+++ branches/hyd_model/src/module_time_integration.F        2009-11-23 17:31:54 UTC (rev 79)
@@ -491,12 +491,13 @@
       real (kind=RKIND) :: flux, vorticity_abs, h_vertex, workpv, q, upstream_bias
 
       integer :: nCells, nEdges, nVertices, nVertLevels
-!      real (kind=RKIND), pointer :: vnu, hnu
-      real (kind=RKIND) :: vnu, hnu
+      real (kind=RKIND) :: h_mom_eddy_visc2,   v_mom_eddy_visc2
+      real (kind=RKIND) :: h_theta_eddy_visc2, v_theta_eddy_visc2
+      real (kind=RKIND) :: u_diffusion
       real (kind=RKIND), dimension(:), pointer :: h_s, fVertex, fEdge, dvEdge, dcEdge, areaCell, areaTriangle, p_s
       real (kind=RKIND), dimension(:,:), pointer :: vh, weightsOnEdge, kiteAreasOnVertex, h_edge, h, u, v, tend_h, tend_u, &amp;
-                                                    circulation, vorticity, ke, pv_edge, geopotential, theta, ww, h_diabatic, &amp;
-                                                    tend_theta
+                                                    circulation, divergence, vorticity, ke, pv_edge, geopotential, theta, ww, &amp;
+                                                    h_diabatic, tend_theta
       integer, dimension(:,:), pointer :: cellsOnEdge, cellsOnVertex, verticesOnEdge, edgesOnCell, edgesOnEdge, edgesOnVertex
       integer, dimension(:), pointer :: nEdgesOnCell, nEdgesOnEdge
 
@@ -511,6 +512,8 @@
       u            =&gt; s % u % array
       h_edge       =&gt; s % h_edge % array
       circulation  =&gt; s % circulation % array
+      divergence   =&gt; s % divergence % array
+      vorticity    =&gt; s % vorticity % array
       ke           =&gt; s % ke % array
       pv_edge      =&gt; s % pv_edge % array
       geopotential =&gt; s % geopotential % array
@@ -542,11 +545,12 @@
       nEdges      = grid % nEdges
       nVertLevels = grid % nVertLevels
 
-!      vnu         =&gt; grid % vnu
-!      hnu         =&gt; grid % hnu
-      hnu = 0.
-      vnu = 0.
+      h_mom_eddy_visc2 = config_h_mom_eddy_visc2
+      v_mom_eddy_visc2 = config_v_mom_eddy_visc2
+      h_theta_eddy_visc2 = config_h_theta_eddy_visc2
+      v_theta_eddy_visc2 = config_v_theta_eddy_visc2
 
+
       !
       ! Compute u (normal) velocity tendency for each edge (cell face)
       !
@@ -557,6 +561,7 @@
       do iEdge=1,grid % nEdgesSolve
          cell1 = cellsOnEdge(1,iEdge)
          cell2 = cellsOnEdge(2,iEdge)
+
          do k=1,nVertLevels
             q = 0.0
             do j = 1,nEdgesOnEdge(iEdge)
@@ -601,58 +606,86 @@
       end do
 #endif
 
+
       !
+      !  horizontal mixing for u
+      !
+      if ( h_mom_eddy_visc2 &gt; 0.0 ) then
+
+         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 h_mom_eddy_visc2 == constant
+               !
+               u_diffusion =   ( divergence(k,cell2)  - divergence(k,cell1) ) / dcEdge(iEdge)  &amp;
+                              -( vorticity(k,vertex2) - vorticity(k,vertex1) ) / dvEdge(iEdge)
+               u_diffusion = h_mom_eddy_visc2 * u_diffusion

+               tend_u(k,iEdge) = tend_u(k,iEdge) + u_diffusion
+            end do
+         end do
+
+      end if
+
+
+      !
       !  vertical advection for u
       !
-      do iEdge=1,grid % nEdges
+      do iEdge=1,grid % nEdgesSolve
          cell1 = cellsOnEdge(1,iEdge)
          cell2 = cellsOnEdge(2,iEdge)
 
          wdun(1) = 0.
-         if (cell1 &gt; 0 .and. cell2 &gt; 0) then
          do k=2,nVertLevels
-           wdun(k) =                                                                         &amp;
-           (ww(k,cell1)/(h(k,cell1)+h(k-1,cell1)) +ww(k,cell2)/(h(k,cell2)+h(k-1,cell2)))*   &amp;
-            rdnu(k)*(u(k,iEdge)-u(k-1,iEdge))
+            wdun(k) =                                                                                  &amp;
+                     (ww(k,cell1)/(h(k,cell1)+h(k-1,cell1)) +ww(k,cell2)/(h(k,cell2)+h(k-1,cell2)))*   &amp;
+                      rdnu(k)*(u(k,iEdge)-u(k-1,iEdge))
          end do
-         end if
          wdun(nVertLevels+1) = 0.
 
          do k=1,nVertLevels
-           tend_u(k,iEdge) = tend_u(k,iEdge) - 0.5*(wdun(k+1)+wdun(k))
+            tend_u(k,iEdge) = tend_u(k,iEdge) - 0.5*(wdun(k+1)+wdun(k))
          end do
       end do
 
-!  --- any mixing for u needs to be added here.
 
       !
-      ! ---- vertical mixing - 2nd order 
+      !  vertical mixing for u - 2nd order 
       !
+      if ( v_mom_eddy_visc2 &gt; 0.0 ) then
 
-      do iEdge=1,grid % nEdges
+         do iEdge=1,grid % nEdgesSolve
+   
+            cell1 = cellsOnEdge(1,iEdge)
+            cell2 = cellsOnEdge(2,iEdge)
+    
+            do k=2,nVertLevels-1
+    
+               z1 = 0.5*(geopotential(k-1,cell1)+geopotential(k-1,cell2))/gravity
+               z2 = 0.5*(geopotential(k  ,cell1)+geopotential(k  ,cell2))/gravity
+               z3 = 0.5*(geopotential(k+1,cell1)+geopotential(k+1,cell2))/gravity
+               z4 = 0.5*(geopotential(k+2,cell1)+geopotential(k+2,cell2))/gravity
+     
+               zm = 0.5*(z1+z2)
+               z0 = 0.5*(z2+z3)
+               zp = 0.5*(z3+z4)
+     
+               tend_u(k,iEdge) = tend_u(k,iEdge) + v_mom_eddy_visc2*(                 &amp;
+                                  (u(k+1,iEdge)-u(k  ,iEdge))/(zp-z0)                 &amp;
+                                 -(u(k  ,iEdge)-u(k-1,iEdge))/(z0-zm) )/(0.5*(zp-zm))
+            end do
+         end do
 
-        cell1 = cellsOnEdge(1,iEdge)
-        cell2 = cellsOnEdge(2,iEdge)
+      end if
 
-        if (cell1 &gt; 0 .and. cell2 &gt; 0) then
-        do k=2,nVertLevels-1
 
-          z1 = 0.5*(geopotential(k-1,cell1)+geopotential(k-1,cell2))/gravity
-          z2 = 0.5*(geopotential(k  ,cell1)+geopotential(k  ,cell2))/gravity
-          z3 = 0.5*(geopotential(k+1,cell1)+geopotential(k+1,cell2))/gravity
-          z4 = 0.5*(geopotential(k+2,cell1)+geopotential(k+2,cell2))/gravity
-
-          zm = 0.5*(z1+z2)
-          z0 = 0.5*(z2+z3)
-          zp = 0.5*(z3+z4)
-
-          tend_u(k,iEdge) = tend_u(k,iEdge) + vnu*(                              &amp;
-                             (u(k+1,iEdge)-u(k  ,iEdge))/(zp-z0)                 &amp;
-                            -(u(k  ,iEdge)-u(k-1,iEdge))/(z0-zm) )/(0.5*(zp-zm))
-        end do
-        end if
-      end do
-
 !----------- rhs for theta
 
       tend_theta(:,:) = 0.
@@ -660,89 +693,99 @@
 !      delsq_theta(:,:) = 0.
 
       !
-      !  horizontal mixing - we could combine this with advection directly (i.e. as a turbulent flux),
+      !  horizontal mixing for theta - we could combine this with advection directly (i.e. as a turbulent flux),
       !  but here we can also code in hyperdiffusion if we wish (2nd order at present)
       !
+      if ( h_theta_eddy_visc2 &gt; 0.0 ) then
 
-      do iEdge=1,grid % nEdges
+         do iEdge=1,grid % nEdges
             cell1 = grid % cellsOnEdge % array(1,iEdge)
             cell2 = grid % cellsOnEdge % array(2,iEdge)
             if (cell1 &gt; 0 .and. cell2 &gt; 0) then
+
                do k=1,grid % nVertLevels
-                     theta_turb_flux = hnu*prandtl*(theta(k,cell2) - theta(k,cell1))/dcEdge(iEdge)
-                     flux = dvEdge (iEdge) * h_edge(k,iEdge) * theta_turb_flux
-                     tend_theta(k,cell1) = tend_theta(k,cell1) + flux
-                     tend_theta(k,cell2) = tend_theta(k,cell2) - flux
+                  theta_turb_flux = h_theta_eddy_visc2*prandtl*(theta(k,cell2) - theta(k,cell1))/dcEdge(iEdge)
+                  flux = dvEdge (iEdge) * h_edge(k,iEdge) * theta_turb_flux
+                  tend_theta(k,cell1) = tend_theta(k,cell1) + flux
+                  tend_theta(k,cell2) = tend_theta(k,cell2) - flux
 
-!                     delsq_theta(k,cell1) = delsq_theta(k,iCell) + dvEdge(iEdge)*(theta(k,cell2) - theta(k,cell1))/dcEdge(iEdge)
-!                     delsq_theta(k,cell2) = delsq_theta(k,iCell) - dvEdge(iEdge)*(theta(k,cell2) - theta(k,cell1))/dcEdge(iEdge)
+!                  delsq_theta(k,cell1) = delsq_theta(k,iCell) + dvEdge(iEdge)*(theta(k,cell2) - theta(k,cell1))/dcEdge(iEdge)
+!                  delsq_theta(k,cell2) = delsq_theta(k,iCell) - dvEdge(iEdge)*(theta(k,cell2) - theta(k,cell1))/dcEdge(iEdge)
+               end do 
 
-               end do 
             end if 
-      end do 
+         end do 
 
+      end if 
+
+
       !
-      ! horizontal advection
+      !  horizontal advection for theta
       !
-
       do iEdge=1,nEdges
-            cell1 = cellsOnEdge(1,iEdge)
-            cell2 = cellsOnEdge(2,iEdge)
-            if (cell1 &gt; 0 .and. cell2 &gt; 0) then
-               do k=1,grid % nVertLevels
-                     theta_edge = 0.5 * (theta(k,cell1) + theta(k,cell2))
+         cell1 = cellsOnEdge(1,iEdge)
+         cell2 = cellsOnEdge(2,iEdge)
+         if (cell1 &gt; 0 .and. cell2 &gt; 0) then
 
-!                     if(u(k,iEdge) .gt. 0.) then
-!                       theta_edge = theta_edge - (1./6.)*delsq_theta(k,cell1)
-!                     else
-!                       theta_edge = theta_edge - (1./6.)*delsq_theta(k,cell2)
-!                     end if
+            do k=1,grid % nVertLevels
+               theta_edge = 0.5 * (theta(k,cell1) + theta(k,cell2))
 
-                     flux = dvEdge (iEdge) * h_edge(k,iEdge) * u(k,iEdge)* theta_edge
-                     tend_theta(k,cell1) = tend_theta(k,cell1) - flux
-                     tend_theta(k,cell2) = tend_theta(k,cell2) + flux
-               end do 
-            end if
+!               if(u(k,iEdge) .gt. 0.) then
+!                 theta_edge = theta_edge - (1./6.)*delsq_theta(k,cell1)
+!               else
+!                 theta_edge = theta_edge - (1./6.)*delsq_theta(k,cell2)
+!               end if
+
+               flux = dvEdge (iEdge) * h_edge(k,iEdge) * u(k,iEdge)* theta_edge
+               tend_theta(k,cell1) = tend_theta(k,cell1) - flux
+               tend_theta(k,cell2) = tend_theta(k,cell2) + flux
+            end do 
+
+         end if
       end do 
 
+
       !
-      ! vertical advection plus diabatic term
-      ! Note: we are also dividing through by the cell area after the horizontal flux divergence
+      !  vertical advection plus diabatic term
+      !  Note: we are also dividing through by the cell area after the horizontal flux divergence
       !
-
       do iCell = 1, nCells
-        wdtn(1) = 0.
-        do k=2,nVertLevels
-          wdtn(k) =  ww(k,icell)*(fnm(k)*theta(k,iCell)+fnp(k)*theta(k-1,iCell))
-        end do
-        wdtn(nVertLevels+1) = 0.
-        do k=1,nVertLevels
-          tend_theta(k,iCell) = tend_theta(k,iCell)/areaCell(iCell) -rdnw(k)*(wdtn(k+1)-wdtn(k))
-!!          tend_theta(k,iCell) = tend_theta(k) + h(k,iCell)*h_diabatic(k,iCell)
-        end do
+         wdtn(1) = 0.
+         do k=2,nVertLevels
+            wdtn(k) =  ww(k,icell)*(fnm(k)*theta(k,iCell)+fnp(k)*theta(k-1,iCell))
+         end do
+         wdtn(nVertLevels+1) = 0.
+         do k=1,nVertLevels
+            tend_theta(k,iCell) = tend_theta(k,iCell)/areaCell(iCell) -rdnw(k)*(wdtn(k+1)-wdtn(k))
+!!           tend_theta(k,iCell) = tend_theta(k) + h(k,iCell)*h_diabatic(k,iCell)
+         end do
       end do
 
+
       !
-      ! ---- vertical mixing - 2nd order 
+      !  vertical mixing for theta - 2nd order 
       !
+      if ( v_theta_eddy_visc2 &gt; 0.0 ) then
 
-      do iCell = 1, nCells
-        do k=2,nVertLevels-1
-          z1 = geopotential(k-1,iCell)/gravity
-          z2 = geopotential(k  ,iCell)/gravity
-          z3 = geopotential(k+1,iCell)/gravity
-          z4 = geopotential(k+2,iCell)/gravity
+         do iCell = 1, grid % nCellsSolve
+            do k=2,nVertLevels-1
+               z1 = geopotential(k-1,iCell)/gravity
+               z2 = geopotential(k  ,iCell)/gravity
+               z3 = geopotential(k+1,iCell)/gravity
+               z4 = geopotential(k+2,iCell)/gravity
+     
+               zm = 0.5*(z1+z2)
+               z0 = 0.5*(z2+z3)
+               zp = 0.5*(z3+z4)
+     
+               tend_theta(k,iCell) = tend_theta(k,iCell) + v_theta_eddy_visc2*prandtl*h(k,iCell)*(  &amp;
+                                        (theta(k+1,iCell)-theta(k  ,iCell))/(zp-z0)                 &amp;
+                                       -(theta(k  ,iCell)-theta(k-1,iCell))/(z0-zm) )/(0.5*(zp-zm))
+            end do
+         end do
 
-          zm = 0.5*(z1+z2)
-          z0 = 0.5*(z2+z3)
-          zp = 0.5*(z3+z4)
+      end if
 
-          tend_theta(k,iCell) = tend_theta(k,iCell) + vnu*prandtl*h(k,iCell)*(                   &amp;
-                             (theta(k+1,iCell)-theta(k  ,iCell))/(zp-z0)                 &amp;
-                            -(theta(k  ,iCell)-theta(k-1,iCell))/(z0-zm) )/(0.5*(zp-zm))
-        end do
-      end do
-
    end subroutine compute_dyn_tend
 
 !---------------------------------------------------------------------------------------------------------
@@ -1119,12 +1162,13 @@
 
 
       integer :: iEdge, iCell, iVertex, k, cell1, cell2, vertex1, vertex2, eoe, i, j, cov
-      real (kind=RKIND) :: flux, vorticity_abs, h_vertex, workpv
+      real (kind=RKIND) :: flux, vorticity_abs, h_vertex, workpv, r
 
       integer :: nCells, nEdges, nVertices, nVertLevels
       real (kind=RKIND), dimension(:), pointer :: h_s, fVertex, fEdge, dvEdge, dcEdge, areaCell, areaTriangle
       real (kind=RKIND), dimension(:,:), pointer :: vh, weightsOnEdge, kiteAreasOnVertex, h_edge, h, u, v, tend_h, tend_u, &amp;
-                                                    circulation, vorticity, ke, pv_edge, pv_vertex, pv_cell, gradPVn, gradPVt
+                                                    circulation, vorticity, ke, pv_edge, pv_vertex, pv_cell, gradPVn, gradPVt, &amp;
+                                                    divergence
       integer, dimension(:,:), pointer :: cellsOnEdge, cellsOnVertex, verticesOnEdge, edgesOnCell, edgesOnEdge, edgesOnVertex
       integer, dimension(:), pointer :: nEdgesOnCell, nEdgesOnEdge
 
@@ -1138,6 +1182,7 @@
       tend_u      =&gt; s % u % array
       circulation =&gt; s % circulation % array
       vorticity   =&gt; s % vorticity % array
+      divergence  =&gt; s % divergence % array
       ke          =&gt; s % ke % array
       pv_edge     =&gt; s % pv_edge % array
       pv_vertex   =&gt; s % pv_vertex % array
@@ -1203,7 +1248,34 @@
          end do
       end do
 
+
       !
+      ! Compute the divergence at each cell center
+      !
+      divergence(:,:) = 0.0
+      do iEdge=1,nEdges
+         cell1 = cellsOnEdge(1,iEdge)
+         cell2 = cellsOnEdge(2,iEdge)
+         if (cell1 &gt; 0) then
+            do k=1,nVertLevels
+              divergence(k,cell1) = divergence(k,cell1) + u(k,iEdge)*dvEdge(iEdge)
+            enddo
+         endif
+         if(cell2 &gt; 0) then
+            do k=1,nVertLevels
+              divergence(k,cell2) = divergence(k,cell2) - u(k,iEdge)*dvEdge(iEdge)
+            enddo
+         end if
+      end do
+      do iCell = 1,nCells
+        r = 1.0 / areaCell(iCell)
+        do k = 1,nVertLevels
+           divergence(k,iCell) = divergence(k,iCell) * r
+        enddo
+      enddo
+
+
+      !
       ! Compute kinetic energy in each cell
       !
       ke(:,:) = 0.0

</font>
</pre>