<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
+!
+!> \brief Ocean horizontal mixing - Laplacian parameterization
+!> \author Phil Jones, Doug Jacobsen
+!> \date 15 September 2011
+!> \version SVN:$Id:$
+!> \details
+!> This module contains routines for computing horizontal mixing
+!> 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, &
+ ocn_vel_hmix_leith_init
+
+ !-------------------------------------------------------------------
+ !
+ ! Private module variables
+ !
+ !--------------------------------------------------------------------
+
+ logical :: hmixLeithOn !< integer flag to determine whether Leith chosen
+
+ real (kind=RKIND) :: &
+ leith_parameter, &!< nondimensional Leith parameter
+ leith_dx !< length scale of finest mesh resolution
+
+!***********************************************************************
+
+contains
+
+!***********************************************************************
+!
+! routine ocn_vel_hmix_leith_tend
+!
+!> \brief Computes velocity tendency term based on Leith turblence closure
+!> \author Todd Ringler
+!> \date 2 March 2012
+!> \version SVN:$Id$
+!> \details
+!> This routine computes a velocity tendency consistent with the Leith turbulence
+!> closure for an enstrophy cascade.
+!
+!-----------------------------------------------------------------------
+
+ subroutine ocn_vel_hmix_leith_tend(grid, vorticity, tend, err)!{{{
+
+ !-----------------------------------------------------------------
+ !
+ ! input variables
+ !
+ !-----------------------------------------------------------------
+
+ real (kind=RKIND), dimension(:,:), intent(in) :: &
+ vorticity !< Input: vorticity
+
+ type (mesh_type), intent(in) :: &
+ grid !< Input: grid information
+
+ !-----------------------------------------------------------------
+ !
+ ! input/output variables
+ !
+ !-----------------------------------------------------------------
+
+ real (kind=RKIND), dimension(:,:), intent(inout) :: &
+ tend !< Input/Output: velocity tendency
+
+
+ !-----------------------------------------------------------------
+ !
+ ! output variables
+ !
+ !-----------------------------------------------------------------
+
+ integer, intent(out) :: err !< 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 => grid % maxLevelEdgeTop % array
+ verticesOnEdge => grid % verticesOnEdge % array
+ meshScaling => grid % meshScaling % array
+ edgeMask => grid % edgeMask % array
+ dvEdge => 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 &
+ * 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
+!
+!> \brief Initializes parameters related to the Leith turblence closure
+!> \author Todd Ringler
+!> \date 2 March 2012
+!> \version SVN:$Id$
+!> \details
+!> This routine initializes parameters related to the Leith turblence closure.
+!-----------------------------------------------------------------------
+
+ subroutine ocn_vel_hmix_leith_init(err)!{{{
+
+
+ integer, intent(out) :: err !< Output: error flag
+
+ !--------------------------------------------------------------------
+ !
+ ! set some local module variables based on input config choices
+ !
+ !--------------------------------------------------------------------
+
+ err = 0
+
+ hmixLeithOn = .false.
+
+ if ( config_leith_parameter > 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
+!
+!> \brief Ocean horizontal mixing - Laplacian parameterization
+!> \author Phil Jones, Doug Jacobsen
+!> \date 15 September 2011
+!> \version SVN:$Id:$
+!> \details
+!> This module contains routines for computing horizontal mixing
+!> 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, &
+ ocn_vel_hmix_saAPVM_init
+
+ !-------------------------------------------------------------------
+ !
+ ! Private module variables
+ !
+ !--------------------------------------------------------------------
+
+ logical :: hmixsaAPVMOn !< integer flag to determine whether scale-aware APVM is chosen
+
+ real (kind=RKIND) :: &
+ saAPVM_parameter, &!< nondimensional APVM parameter
+ saAPVM_dx !< length scale of finest mesh resolution
+
+!***********************************************************************
+
+contains
+
+!***********************************************************************
+!
+! routine ocn_vel_hmix_saAPVM_tend
+!
+!> \brief Computes velocity tendency term based on scale-aware APVM enstrophy closure
+!> \author Todd Ringler
+!> \date 2 March 2012
+!> \version SVN:$Id$
+!> \details
+!> This routine computes a velocity tendency consistent with the scale-aware APVM enstrophy
+!> closure for an enstrophy cascade.
+!
+!-----------------------------------------------------------------------
+
+ subroutine ocn_vel_hmix_saAPVM_tend(grid, vorticity, tend, err)!{{{
+
+ !-----------------------------------------------------------------
+ !
+ ! input variables
+ !
+ !-----------------------------------------------------------------
+
+ real (kind=RKIND), dimension(:,:), intent(in) :: &
+ vorticity !< Input: vorticity
+
+ type (mesh_type), intent(in) :: &
+ grid !< Input: grid information
+
+ !-----------------------------------------------------------------
+ !
+ ! input/output variables
+ !
+ !-----------------------------------------------------------------
+
+ real (kind=RKIND), dimension(:,:), intent(inout) :: &
+ tend !< Input/Output: velocity tendency
+
+
+ !-----------------------------------------------------------------
+ !
+ ! output variables
+ !
+ !-----------------------------------------------------------------
+
+ integer, intent(out) :: err !< 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 => grid % maxLevelEdgeTop % array
+ verticesOnEdge => grid % verticesOnEdge % array
+ meshScaling => grid % meshScaling % array
+ edgeMask => grid % edgeMask % array
+ dvEdge => 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 &
+ * 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
+!
+!> \brief Initializes parameters related to the scale-aware APVM turblence closure
+!> \author Todd Ringler
+!> \date 2 March 2012
+!> \version SVN:$Id$
+!> \details
+!> This routine initializes parameters related to the scale-aware APVM turblence closure.
+!-----------------------------------------------------------------------
+
+ subroutine ocn_vel_hmix_saAPVM_init(err)!{{{
+
+
+ integer, intent(out) :: err !< Output: error flag
+
+ !--------------------------------------------------------------------
+ !
+ ! set some local module variables based on input config choices
+ !
+ !--------------------------------------------------------------------
+
+ err = 0
+
+ hmixsaAPVMOn = .false.
+
+ if ( config_saAPVM_parameter > 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>