<p><b>mpetersen@lanl.gov</b> 2010-05-24 12:41:08 -0600 (Mon, 24 May 2010)</p><p>Added varying vertical viscosity and diffusivity using a tanh profile to the zlevel branch.  See mpas/namelist.input.ocean for example namelist.<br>
</p><hr noshade><pre><font color="gray">Modified: branches/ocean_projects/z_level_mrp/mpas/namelist.input.ocean
===================================================================
--- branches/ocean_projects/z_level_mrp/mpas/namelist.input.ocean        2010-05-24 16:03:23 UTC (rev 302)
+++ branches/ocean_projects/z_level_mrp/mpas/namelist.input.ocean        2010-05-24 18:41:08 UTC (rev 303)
@@ -1,21 +1,45 @@
 &amp;sw_model
    config_test_case = 0
    config_time_integration = 'RK4'
-   config_dt = 120.0
-   config_ntimesteps = 30
-   config_output_interval = 30
-   config_stats_interval = 10
-   config_visc  = 100.0
+   config_dt = 60.0
+   config_ntimesteps = 1440000 
+   config_output_interval = 14400 
+   config_stats_interval = 1440 
+   config_visc  = 1.0e5
 /
 
 &amp;io
-   config_input_name = 'grid.quad.20km.nc'
-   config_output_name = 'output.quad.20km.nc'
-   config_restart_name = 'restart.nc'
+   config_input_name = grid.nc
+   config_output_name = output.nc
+   config_restart_name = restart.nc
 /
 
 &amp;restart
-   config_restart_interval = 3000
+   config_restart_interval = 115200
    config_do_restart = .false.
    config_restart_time = 1036800.0
 /
+
+&amp;grid
+   config_vert_grid_type = 'zlevel'
+   config_rho0 = 1028
+/
+&amp;hmix
+   config_hor_diffusion  = 1.0e4
+/
+&amp;vmix
+   config_vert_visc_type  = 'tanh'
+   config_vert_diff_type  = 'tanh'
+   config_vmixTanhViscMax = 2.5e-1
+   config_vmixTanhViscMin = 1.0e-4
+   config_vmixTanhDiffMax = 2.5e-2
+   config_vmixTanhDiffMin = 1.0e-5
+   config_vmixTanhZMid    = -100
+   config_vmixTanhZWidth  = 100
+   config_vert_viscosity  = 2.5e-4
+   config_vert_diffusion  = 2.5e-5 
+/
+&amp;advection
+   config_hor_tracer_adv = 'upwind'
+   config_vert_tracer_adv = 'upwind'
+/

Modified: branches/ocean_projects/z_level_mrp/mpas/src/core_ocean/Registry
===================================================================
--- branches/ocean_projects/z_level_mrp/mpas/src/core_ocean/Registry        2010-05-24 16:03:23 UTC (rev 302)
+++ branches/ocean_projects/z_level_mrp/mpas/src/core_ocean/Registry        2010-05-24 18:41:08 UTC (rev 303)
@@ -17,8 +17,16 @@
 namelist character grid     config_vert_grid_type    isopycnal
 namelist real      grid     config_rho0              1028
 namelist real      hmix     config_hor_diffusion     2000.0
+namelist character vmix     config_vert_visc_type    const
+namelist character vmix     config_vert_diff_type    const
 namelist real      vmix     config_vert_viscosity    2.5e-4
 namelist real      vmix     config_vert_diffusion    2.5e-5
+namelist real      vmix     config_vmixTanhViscMax   2.5e-1
+namelist real      vmix     config_vmixTanhViscMin   1.0e-4
+namelist real      vmix     config_vmixTanhDiffMax   2.5e-2
+namelist real      vmix     config_vmixTanhDiffMin   1.0e-5
+namelist real      vmix     config_vmixTanhZMid      -100
+namelist real      vmix     config_vmixTanhZWidth    100
 namelist character advection  config_hor_tracer_adv  'centered'
 namelist character advection  config_vert_tracer_adv 'centered'
 

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-24 16:03:23 UTC (rev 302)
+++ branches/ocean_projects/z_level_mrp/mpas/src/core_ocean/module_time_integration.F        2010-05-24 18:41:08 UTC (rev 303)
@@ -266,19 +266,18 @@
         weightsOnEdge, kiteAreasOnVertex, h_edge, h, u, v, wTop, &amp;
         tend_h, tend_u, circulation, vorticity, ke, pv_edge, &amp;
         divergence, MontPot, pZLevel, zMidEdge, zTopEdge
+      type (dm_info) :: dminfo
 
       integer, dimension(:), pointer :: nEdgesOnCell, nEdgesOnEdge
       integer, dimension(:,:), pointer :: &amp;
         cellsOnEdge, cellsOnVertex, verticesOnEdge, edgesOnCell, &amp;
         edgesOnEdge, edgesOnVertex
-      real (kind=RKIND) :: u_diffusion, visc
-      real (kind=RKIND), dimension(:), allocatable:: fluxVertTop,w_dudzTopEdge
+      real (kind=RKIND) :: u_diffusion
+      real (kind=RKIND), dimension(:), allocatable:: fluxVertTop,w_dudzTopEdge, vertVisc
 
       real (kind=RKIND), dimension(:,:), pointer :: u_src
       real (kind=RKIND), parameter :: rho_ref = 1000.0
 
-      visc = config_visc
-
       h           =&gt; s % h % array
       u           =&gt; s % u % array
       v           =&gt; s % v % array
@@ -443,7 +442,7 @@
 
             u_diffusion =   ( divergence(k,cell2)  -  divergence(k,cell1) ) / dcEdge(iEdge) &amp;
                            -(vorticity(k,vertex2)  - vorticity(k,vertex1) ) / dvEdge(iEdge)
-            u_diffusion = visc * u_diffusion
+            u_diffusion = config_visc * u_diffusion
 
             q = 0.0
             do j = 1,nEdgesOnEdge(iEdge)
@@ -477,12 +476,33 @@
       !
       ! velocity tendency: vertical mixing d/dz( nu_v du/dz))
       !
+      allocate(vertVisc(nVertLevels))
+      if (config_vert_visc_type.eq.'const') then
+        vertVisc = config_vert_viscosity
+      elseif (config_vert_visc_type.eq.'tanh') then
+        if (config_vert_grid_type.ne.'zlevel') then
+          write(0,*) 'Abort: config_vert_visc_type.eq.tanh may only', &amp;
+            ' use config_vert_grid_type of zlevel at this time'
+          call dmpar_abort(dminfo)
+        endif
+  
+        do k=1,nVertLevels
+          vertVisc(k) = -(config_vmixTanhViscMax-config_vmixTanhViscMin)/2.0 &amp;
+            *tanh(-(zMidZLevel(k)-config_vmixTanhZMid) &amp;
+                  /config_vmixTanhZWidth) &amp;
+            + (config_vmixTanhViscMax+config_vmixTanhViscMin)/2
+        enddo
+      else
+        write(0,*) 'Abort: unrecognized config_vert_visc_type'
+        call dmpar_abort(dminfo)
+      endif
+
       allocate(fluxVertTop(1:nVertLevels+1))
       fluxVertTop(1) = 0.0
       fluxVertTop(nVertLevels+1) = 0.0
       do iEdge=1,grid % nEdgesSolve
          do k=2,nVertLevels
-           fluxVertTop(k) = config_vert_viscosity &amp;
+           fluxVertTop(k) = vertVisc(k) &amp;
               * ( u(k-1,iEdge) - u(k,iEdge) ) &amp;
               / (zMidEdge(k-1,iEdge) - zMidEdge(k,iEdge))
          enddo
@@ -492,7 +512,7 @@
               /(zTopEdge(k,iEdge) - zTopEdge(k+1,iEdge))
          enddo
       end do
-      deallocate(fluxVertTop)
+      deallocate(fluxVertTop, vertVisc)
 
 ! do k=1,nVertLevels
 !   print '(i5,10es10.2)', &amp;
@@ -534,11 +554,17 @@
         u,h,wTop, h_edge, zMid, zTop
       real (kind=RKIND), dimension(:,:,:), pointer :: &amp;
         tracers, tend_tr
+      type (dm_info) :: dminfo
+
       integer, dimension(:), pointer :: nEdgesOnCell, nEdgesOnEdge
       integer, dimension(:,:), pointer :: cellsOnEdge
+      real (kind=RKIND), dimension(:), pointer :: &amp;
+        zMidZLevel 
       real (kind=RKIND), dimension(:,:), allocatable:: fluxVertTop, tracerTop
       real (kind=RKIND), dimension(:,:,:), allocatable::tr_flux, tr_div
 
+      real (kind=RKIND), dimension(:), allocatable:: vertDiff
+
       u           =&gt; s % u % array
       h           =&gt; s % h % array
       wTop        =&gt; s % wTop % array
@@ -556,6 +582,7 @@
       nEdges      = grid % nEdges
       nCells      = grid % nCells
       nVertLevels = grid % nVertLevels
+      zMidZLevel  =&gt; grid % zMidZLevel % array
 
       !
       ! tracer tendency: horizontal advection term -div( h \phi u)
@@ -711,13 +738,34 @@
       !
       ! tracer tendency: vertical mixing d/dz( \kappa_v d\phi/dz))
       !
+      allocate(vertDiff(nVertLevels))
+      if (config_vert_diff_type.eq.'const') then
+        vertDiff = config_vert_diffusion
+      elseif (config_vert_diff_type.eq.'tanh') then
+        if (config_vert_grid_type.ne.'zlevel') then
+          write(0,*) 'Abort: config_vert_diff_type.eq.tanh may only', &amp;
+            ' use config_vert_grid_type of zlevel at this time'
+          call dmpar_abort(dminfo)
+        endif
+  
+        do k=1,nVertLevels
+          vertDiff(k) = -(config_vmixTanhDiffMax-config_vmixTanhDiffMin)/2.0 &amp;
+            *tanh(-(zMidZLevel(k)-config_vmixTanhZMid) &amp;
+                  /config_vmixTanhZWidth) &amp;
+            + (config_vmixTanhDiffMax+config_vmixTanhDiffMin)/2
+        enddo
+      else
+        write(0,*) 'Abort: unrecognized config_vert_diff_type'
+        call dmpar_abort(dminfo)
+      endif
+
       allocate(fluxVertTop(num_tracers,nVertLevels+1))
       fluxVertTop(:,1) = 0.0
       fluxVertTop(:,nVertLevels+1) = 0.0
       do iCell=1,grid % nCellsSolve 
          do k=2,nVertLevels
            do iTracer=1,num_tracers
-             fluxVertTop(iTracer,k) = config_vert_diffusion &amp;
+             fluxVertTop(iTracer,k) = vertDiff(k) &amp;
                 * (tracers(iTracer,k-1,iCell) - tracers(iTracer,k,iCell) )&amp;
                 / (zMid(k-1,iCell) -zMid(k,iCell))
            enddo
@@ -732,7 +780,7 @@
          enddo
 
       enddo ! iCell loop
-      deallocate(fluxVertTop)
+      deallocate(fluxVertTop, vertDiff)
 
 
           ! print some diagnostics - for debugging

</font>
</pre>