<p><b>ringler@lanl.gov</b> 2012-04-17 12:44:55 -0600 (Tue, 17 Apr 2012)</p><p><br>
adding Leith and scale-aware APVM closures<br>
</p><hr noshade><pre><font color="gray">Added: branches/ocean_projects/closureN/src/core_ocean/mpas_ocn_vel_hmix_leith.F
===================================================================
--- branches/ocean_projects/closureN/src/core_ocean/mpas_ocn_vel_hmix_leith.F                                (rev 0)
+++ branches/ocean_projects/closureN/src/core_ocean/mpas_ocn_vel_hmix_leith.F        2012-04-17 18:44:55 UTC (rev 1787)
@@ -0,0 +1,204 @@
+!|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+!
+!  ocn_vel_hmix_leith
+!
+!&gt; \brief Ocean horizontal mixing - Laplacian parameterization 
+!&gt; \author Phil Jones, Doug Jacobsen
+!&gt; \date   15 September 2011
+!&gt; \version SVN:$Id:$
+!&gt; \details
+!&gt;  This module contains routines for computing horizontal mixing 
+!&gt;  tendencies using a Laplacian formulation.
+!
+!-----------------------------------------------------------------------
+
+module ocn_vel_hmix_leith
+
+   use mpas_grid_types
+   use mpas_configure
+
+   implicit none
+   private
+   save
+
+   !--------------------------------------------------------------------
+   !
+   ! Public parameters
+   !
+   !--------------------------------------------------------------------
+
+   !--------------------------------------------------------------------
+   !
+   ! Public member functions
+   !
+   !--------------------------------------------------------------------
+
+   public :: ocn_vel_hmix_leith_tend, &amp;
+             ocn_vel_hmix_leith_init
+
+   !-------------------------------------------------------------------
+   !
+   ! Private module variables
+   !
+   !--------------------------------------------------------------------
+
+   logical ::  hmixLeithOn  !&lt; integer flag to determine whether Leith chosen
+
+   real (kind=RKIND) :: &amp;
+      leith_parameter,         &amp;!&lt; nondimensional Leith parameter
+      leith_dx                  !&lt; length scale of finest mesh resolution
+
+!***********************************************************************
+
+contains
+
+!***********************************************************************
+!
+!  routine ocn_vel_hmix_leith_tend
+!
+!&gt; \brief   Computes velocity tendency term based on Leith turblence closure
+!&gt; \author  Todd Ringler
+!&gt; \date    2 March 2012
+!&gt; \version SVN:$Id$
+!&gt; \details 
+!&gt;  This routine computes a velocity tendency consistent with the Leith turbulence
+!&gt;  closure for an enstrophy cascade.
+!
+!-----------------------------------------------------------------------
+
+   subroutine ocn_vel_hmix_leith_tend(grid, vorticity, tend, err)!{{{
+
+      !-----------------------------------------------------------------
+      !
+      ! input variables
+      !
+      !-----------------------------------------------------------------
+
+      real (kind=RKIND), dimension(:,:), intent(in) :: &amp;
+         vorticity       !&lt; Input: vorticity
+
+      type (mesh_type), intent(in) :: &amp;
+         grid            !&lt; Input: grid information
+
+      !-----------------------------------------------------------------
+      !
+      ! input/output variables
+      !
+      !-----------------------------------------------------------------
+
+      real (kind=RKIND), dimension(:,:), intent(inout) :: &amp;
+         tend             !&lt; Input/Output: velocity tendency
+
+
+      !-----------------------------------------------------------------
+      !
+      ! output variables
+      !
+      !-----------------------------------------------------------------
+
+      integer, intent(out) :: err !&lt; Output: error flag
+
+      !-----------------------------------------------------------------
+      !
+      ! local variables
+      !
+      !-----------------------------------------------------------------
+
+      integer :: k, iEdge, nEdgesSolve, vertex1, vertex2
+      integer, dimension(:), pointer :: maxLevelEdgeTop
+      integer, dimension(:,:), pointer :: verticesOnEdge, edgeMask
+
+      real (kind=RKIND) :: u_diffusion, invLength2, leithVisc, pii
+      real (kind=RKIND), dimension(:), pointer :: meshScaling, dvEdge
+
+      !-----------------------------------------------------------------
+      !
+      ! exit if this mixing is not selected
+      !
+      !-----------------------------------------------------------------
+
+      err = 0
+
+      if(.not.hmixLeithOn) return
+
+      nEdgesSolve = grid % nEdgesSolve
+      maxLevelEdgeTop =&gt; grid % maxLevelEdgeTop % array
+      verticesOnEdge =&gt; grid % verticesOnEdge % array
+      meshScaling =&gt; grid % meshScaling % array
+      edgeMask =&gt; grid % edgeMask % array
+      dvEdge =&gt; grid % dvEdge % array
+      pii = 2.*asin(1.0)
+
+      !write(0,*) ' min/max before Leith : ', minval(tend), maxval(tend)
+
+      do iEdge=1,nEdgesSolve
+         vertex1 = verticesOnEdge(1,iEdge)
+         vertex2 = verticesOnEdge(2,iEdge)
+
+         invLength2 = 1.0 / dvEdge(iEdge)
+
+         do k=1,maxLevelEdgeTop(iEdge)
+
+            leithVisc = ( leith_parameter * leith_dx * meshScaling(iEdge) / pii)**3 &amp;
+                        * abs( vorticity(k,vertex2) - vorticity(k,vertex1) ) * invLength2
+
+            u_diffusion = -leithVisc * ( vorticity(k,vertex2) - vorticity(k,vertex1) ) * invLength2
+                         
+            tend(k,iEdge) = tend(k,iEdge) + edgeMask(k, iEdge) * u_diffusion
+
+         end do
+      end do
+
+      !write(0,*) ' min/max after  Leith : ', minval(tend), maxval(tend)
+      !write(0,*) leith_parameter, leith_dx
+      !write(0,*) minval(meshScaling), maxval(meshScaling)
+
+   !--------------------------------------------------------------------
+
+   end subroutine ocn_vel_hmix_leith_tend!}}}
+
+!***********************************************************************
+!
+!  routine ocn_vel_hmix_leith_init
+!
+!&gt; \brief   Initializes parameters related to the Leith turblence closure 
+!&gt; \author  Todd Ringler
+!&gt; \date    2 March 2012
+!&gt; \version SVN:$Id$
+!&gt; \details
+!&gt;  This routine initializes parameters related to the Leith turblence closure. 
+!-----------------------------------------------------------------------
+
+   subroutine ocn_vel_hmix_leith_init(err)!{{{
+
+
+   integer, intent(out) :: err !&lt; Output: error flag
+
+   !--------------------------------------------------------------------
+   !
+   ! set some local module variables based on input config choices
+   !
+   !--------------------------------------------------------------------
+
+   err = 0
+
+   hmixLeithOn = .false.
+
+   if ( config_leith_parameter &gt; 0.0 ) then
+      hmixLeithOn = .true.
+      leith_parameter = config_leith_parameter
+      leith_dx = config_leith_dx
+      write(0,*) ' Leith ', hmixLeithOn, leith_parameter, leith_dx
+   endif
+
+
+   !--------------------------------------------------------------------
+
+   end subroutine ocn_vel_hmix_leith_init!}}}
+
+!***********************************************************************
+
+end module ocn_vel_hmix_leith
+
+!|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+! vim: foldmethod=marker

Added: branches/ocean_projects/closureN/src/core_ocean/mpas_ocn_vel_hmix_saAPVM.F
===================================================================
--- branches/ocean_projects/closureN/src/core_ocean/mpas_ocn_vel_hmix_saAPVM.F                                (rev 0)
+++ branches/ocean_projects/closureN/src/core_ocean/mpas_ocn_vel_hmix_saAPVM.F        2012-04-17 18:44:55 UTC (rev 1787)
@@ -0,0 +1,206 @@
+!|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+!
+!  ocn_vel_hmix_saAPVM
+!
+!&gt; \brief Ocean horizontal mixing - Laplacian parameterization 
+!&gt; \author Phil Jones, Doug Jacobsen
+!&gt; \date   15 September 2011
+!&gt; \version SVN:$Id:$
+!&gt; \details
+!&gt;  This module contains routines for computing horizontal mixing 
+!&gt;  tendencies using a Laplacian formulation.
+!
+!-----------------------------------------------------------------------
+
+module ocn_vel_hmix_saAPVM
+
+   use mpas_grid_types
+   use mpas_configure
+
+   implicit none
+   private
+   save
+
+   !--------------------------------------------------------------------
+   !
+   ! Public parameters
+   !
+   !--------------------------------------------------------------------
+
+   !--------------------------------------------------------------------
+   !
+   ! Public member functions
+   !
+   !--------------------------------------------------------------------
+
+   public :: ocn_vel_hmix_saAPVM_tend, &amp;
+             ocn_vel_hmix_saAPVM_init
+
+   !-------------------------------------------------------------------
+   !
+   ! Private module variables
+   !
+   !--------------------------------------------------------------------
+
+   logical ::  hmixsaAPVMOn  !&lt; integer flag to determine whether scale-aware APVM is chosen
+
+   real (kind=RKIND) :: &amp;
+      saAPVM_parameter,         &amp;!&lt; nondimensional APVM parameter
+      saAPVM_dx                  !&lt; length scale of finest mesh resolution
+
+!***********************************************************************
+
+contains
+
+!***********************************************************************
+!
+!  routine ocn_vel_hmix_saAPVM_tend
+!
+!&gt; \brief   Computes velocity tendency term based on scale-aware APVM enstrophy closure
+!&gt; \author  Todd Ringler
+!&gt; \date    2 March 2012
+!&gt; \version SVN:$Id$
+!&gt; \details 
+!&gt;  This routine computes a velocity tendency consistent with the scale-aware APVM enstrophy
+!&gt;  closure for an enstrophy cascade.
+!
+!-----------------------------------------------------------------------
+
+   subroutine ocn_vel_hmix_saAPVM_tend(grid, vorticity, tend, err)!{{{
+
+      !-----------------------------------------------------------------
+      !
+      ! input variables
+      !
+      !-----------------------------------------------------------------
+
+      real (kind=RKIND), dimension(:,:), intent(in) :: &amp;
+         vorticity       !&lt; Input: vorticity
+
+      type (mesh_type), intent(in) :: &amp;
+         grid            !&lt; Input: grid information
+
+      !-----------------------------------------------------------------
+      !
+      ! input/output variables
+      !
+      !-----------------------------------------------------------------
+
+      real (kind=RKIND), dimension(:,:), intent(inout) :: &amp;
+         tend             !&lt; Input/Output: velocity tendency
+
+
+      !-----------------------------------------------------------------
+      !
+      ! output variables
+      !
+      !-----------------------------------------------------------------
+
+      integer, intent(out) :: err !&lt; Output: error flag
+
+      !-----------------------------------------------------------------
+      !
+      ! local variables
+      !
+      !-----------------------------------------------------------------
+
+      integer :: k, iEdge, nEdgesSolve, vertex1, vertex2
+      integer, dimension(:), pointer :: maxLevelEdgeTop
+      integer, dimension(:,:), pointer :: verticesOnEdge, edgeMask
+
+      real (kind=RKIND) :: u_diffusion, invLength2, pii
+      real (kind=RKIND), dimension(:), pointer :: meshScaling, dvEdge
+
+      !-----------------------------------------------------------------
+      !
+      ! exit if this mixing is not selected
+      !
+      !-----------------------------------------------------------------
+
+      err = 0
+
+      if(.not.hmixsaAPVMOn) return
+
+      nEdgesSolve = grid % nEdgesSolve
+      maxLevelEdgeTop =&gt; grid % maxLevelEdgeTop % array
+      verticesOnEdge =&gt; grid % verticesOnEdge % array
+      meshScaling =&gt; grid % meshScaling % array
+      edgeMask =&gt; grid % edgeMask % array
+      dvEdge =&gt; grid % dvEdge % array
+      pii = 2.*asin(1.0)
+
+      !write(0,*) ' min/max before saAPVM : ', minval(tend), maxval(tend)
+
+      do iEdge=1,nEdgesSolve
+         vertex1 = verticesOnEdge(1,iEdge)
+         vertex2 = verticesOnEdge(2,iEdge)
+
+         invLength2 = 1.0 / dvEdge(iEdge)
+
+         do k=1,maxLevelEdgeTop(iEdge)
+
+!here
+            leithVisc = ( leith_parameter * leith_dx * meshScaling(iEdge) / pii)**3 &amp;
+                        * abs( vorticity(k,vertex2) - vorticity(k,vertex1) ) * invLength2
+
+            u_diffusion = -leithVisc * ( vorticity(k,vertex2) - vorticity(k,vertex1) ) * invLength2
+                         
+            tend(k,iEdge) = tend(k,iEdge) + edgeMask(k, iEdge) * u_diffusion
+!here
+
+         end do
+      end do
+
+      write(0,*) ' min/max after scale-aware APVM: ', minval(tend), maxval(tend)
+      write(0,*) saAPVM_parameter, saAPVM_dx
+      write(0,*) minval(meshScaling), maxval(meshScaling)
+
+   !--------------------------------------------------------------------
+
+   end subroutine ocn_vel_hmix_saAPVM_tend!}}}
+
+!***********************************************************************
+!
+!  routine ocn_vel_hmix_saAPVM_init
+!
+!&gt; \brief   Initializes parameters related to the scale-aware APVM turblence closure 
+!&gt; \author  Todd Ringler
+!&gt; \date    2 March 2012
+!&gt; \version SVN:$Id$
+!&gt; \details
+!&gt;  This routine initializes parameters related to the scale-aware APVM turblence closure. 
+!-----------------------------------------------------------------------
+
+   subroutine ocn_vel_hmix_saAPVM_init(err)!{{{
+
+
+   integer, intent(out) :: err !&lt; Output: error flag
+
+   !--------------------------------------------------------------------
+   !
+   ! set some local module variables based on input config choices
+   !
+   !--------------------------------------------------------------------
+
+   err = 0
+
+   hmixsaAPVMOn = .false.
+
+   if ( config_saAPVM_parameter &gt; 0.0 ) then
+      hmixsaAPVMOn = .true.
+      saAPVM_parameter = config_saAPVM_parameter
+      saAPVM_dx = config_saAPVM_dx
+      write(0,*) ' Scale-Aware APVM ', hmixsaAPVMOn, saAPVM_parameter, saAPVM_dx
+   endif
+
+
+   !--------------------------------------------------------------------
+
+   end subroutine ocn_vel_hmix_saAPVM_init!}}}
+
+!***********************************************************************
+
+end module ocn_vel_hmix_saAPVM
+
+!|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+! vim: foldmethod=marker

</font>
</pre>