<p><b>mpetersen@lanl.gov</b> 2012-09-27 12:32:06 -0600 (Thu, 27 Sep 2012)</p><p>Added mpas_stress_tensor to operator directory on this branch.  Curently tested with linear velocity functions on a quad grid.<br>
</p><hr noshade><pre><font color="gray">Modified: branches/ocean_projects/strain_rate/src/core_ocean/Registry
===================================================================
--- branches/ocean_projects/strain_rate/src/core_ocean/Registry        2012-09-26 20:56:32 UTC (rev 2169)
+++ branches/ocean_projects/strain_rate/src/core_ocean/Registry        2012-09-27 18:32:06 UTC (rev 2170)
@@ -276,6 +276,9 @@
 var persistent real    pressure ( nVertLevels nCells Time ) 2 - pressure state - -
 var persistent real    wTop ( nVertLevelsP1 nCells Time ) 2 - wTop state - -
 var persistent real    rhoDisplaced ( nVertLevels nCells Time ) 2 - rhoDisplaced state - -
+var persistent real    strainRateNormal ( R3 nVertLevels nCells Time ) 2 o strainRateNormal state - -
+var persistent real    strainRateShear ( R3 nVertLevels nVertices Time ) 2 o strainRateShear  state - -
+var persistent real    divStressTensor ( nVertLevels nEdges Time ) 2 o divStressTensor    state - -
 
 % Other diagnostic variables: neither read nor written to any files
 var persistent real    vh ( nVertLevels nEdges Time ) 2 - vh state - -

Modified: branches/ocean_projects/strain_rate/src/core_ocean/mpas_ocn_mpas_core.F
===================================================================
--- branches/ocean_projects/strain_rate/src/core_ocean/mpas_ocn_mpas_core.F        2012-09-26 20:56:32 UTC (rev 2169)
+++ branches/ocean_projects/strain_rate/src/core_ocean/mpas_ocn_mpas_core.F        2012-09-27 18:32:06 UTC (rev 2170)
@@ -5,6 +5,8 @@
    use mpas_timekeeping
    use mpas_dmpar
    use mpas_timer
+   ! mrp added to test stress tensor:
+   use mpas_stress_tensor
 
    use ocn_global_diagnostics
    use ocn_test_cases
@@ -110,6 +112,13 @@
 
       call ocn_init_z_level(domain)
 
+      ! mrp added just to test stress tensor ops:
+      print *, 'mpas_test_stress_tensor'
+      call mpas_test_stress_tensor(domain)
+      print *, 'mpas_test_stress_tensor complete'
+      stop
+      ! mrp added just to test stress tensor ops end
+
       if (config_enforce_zstar_at_restart) then
          call ocn_init_h_zstar(domain)
       endif
@@ -569,9 +578,9 @@
          ! When the transition is done, hZLevel can be removed from
          ! registry and the following four lines deleted.
          referenceBottomDepth(1) = hZLevel(1)
-         do k = 2,nVertLevels
-            referenceBottomDepth(k) = referenceBottomDepth(k-1) + hZLevel(k)
-         end do
+         !do k = 2,nVertLevels
+         !   referenceBottomDepth(k) = referenceBottomDepth(k-1) + hZLevel(k)
+         !end do
 
          ! TopOfCell needed where zero depth for the very top may be referenced.
          referenceBottomDepthTopOfCell(1) = 0.0

Modified: branches/ocean_projects/strain_rate/src/operators/Makefile
===================================================================
--- branches/ocean_projects/strain_rate/src/operators/Makefile        2012-09-26 20:56:32 UTC (rev 2169)
+++ branches/ocean_projects/strain_rate/src/operators/Makefile        2012-09-27 18:32:06 UTC (rev 2170)
@@ -1,6 +1,6 @@
 .SUFFIXES: .F .o
 
-OBJS = mpas_rbf_interpolation.o mpas_vector_reconstruction.o mpas_spline_interpolation.o
+OBJS = mpas_rbf_interpolation.o mpas_vector_reconstruction.o mpas_spline_interpolation.o mpas_stress_tensor.o
 
 all: operators
 
@@ -10,6 +10,7 @@
 mpas_vector_reconstruction.o: mpas_rbf_interpolation.o
 mpas_rbf_interpolation.o:
 mpas_spline_interpolation:
+mpas_stress_tensor.o:
 
 clean:
         $(RM) *.o *.mod *.f90 libops.a

Added: branches/ocean_projects/strain_rate/src/operators/mpas_stress_tensor.F
===================================================================
--- branches/ocean_projects/strain_rate/src/operators/mpas_stress_tensor.F                                (rev 0)
+++ branches/ocean_projects/strain_rate/src/operators/mpas_stress_tensor.F        2012-09-27 18:32:06 UTC (rev 2170)
@@ -0,0 +1,532 @@
+!|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+!
+!  mpas_stress_tensor
+!
+!&gt; \brief MPAS strain rate and stress tensor computation
+!&gt; \author Mark Petersen
+!&gt; \date    25 September 2012
+!&gt; \version SVN:$Id:$
+!&gt; \details
+!&gt;  This module contains the routines for computing
+!&gt;  the strain rate tensor, the divergence of a tensor,
+!&gt;  and a testing routine to verify these work properly.
+!
+!-----------------------------------------------------------------------
+
+module mpas_stress_tensor
+
+   use mpas_grid_types
+   use mpas_constants
+
+   implicit none
+   private
+   save
+
+   !--------------------------------------------------------------------
+   !
+   ! Public parameters
+   !
+   !--------------------------------------------------------------------
+
+   !--------------------------------------------------------------------
+   !
+   ! Public member functions
+   !
+   !--------------------------------------------------------------------
+
+   public :: mpas_strain_rate, &amp;
+             mpas_div_stress_tensor, &amp;
+             mpas_test_stress_tensor
+
+   !--------------------------------------------------------------------
+   !
+   ! Private module variables
+   !
+   !--------------------------------------------------------------------
+
+!***********************************************************************
+
+contains
+
+!***********************************************************************
+!
+!  routine mpas_strain_rate
+!
+!&gt; \brief   Computes normal and shear strain rate
+!&gt; \author  Mark Petersen
+!&gt; \date    25 September 2012
+!&gt; \version SVN:$Id$
+!&gt; \details 
+!&gt;  This routine computes the normal strain rate at the cell centers
+!&gt;  and the shear strain rate at vertices using the weak derivative.
+!
+!-----------------------------------------------------------------------
+
+   subroutine mpas_strain_rate(grid, u,v, strainRateNormal, strainRateShear)!{{{
+
+      !-----------------------------------------------------------------
+      !
+      ! input variables
+      !
+      !-----------------------------------------------------------------
+
+      real (kind=RKIND), dimension(:,:), intent(in) :: &amp;
+         u, &amp;!&lt; Input: Horizontal velocity normal to edge
+         v   !&lt; Input: Horizontal velocity tangent to edge
+
+      type (mesh_type), intent(in) :: &amp;
+         grid          !&lt; Input: grid information
+
+      !-----------------------------------------------------------------
+      !
+      ! input/output variables
+      !
+      !-----------------------------------------------------------------
+
+      !-----------------------------------------------------------------
+      !
+      ! output variables
+      !
+      !-----------------------------------------------------------------
+
+      real (kind=RKIND), dimension(:,:,:), intent(out) :: &amp;
+         strainRateNormal  !&lt; Output: Normal component of strain rate tensor
+      real (kind=RKIND), dimension(:,:,:), intent(out) :: &amp;
+         strainRateShear  !&lt; Output: Shear component of strain rate tensor
+
+      !-----------------------------------------------------------------
+      !
+      ! local variables
+      !
+      !-----------------------------------------------------------------
+
+      integer :: iEdge, nEdges, nCells,nVertices, cell1, cell2, vertex1, vertex2, k
+
+      integer, dimension(:), pointer :: maxLevelEdgeBot
+      integer, dimension(:,:), pointer :: cellsOnEdge, verticesOnEdge
+
+      real (kind=RKIND) :: invAreaCell1, invAreaCell2, invAreaTri1, invAreaTri2, &amp;
+        cos1, sin1, cos2, sin2, cossin, uDvEdge, uDcEdge, eps11, eps22, eps12, nVertLevels
+      real (kind=RKIND), dimension(:), pointer :: dvEdge, dcEdge, areaCell, areaTriangle, angleEdge
+
+      !-----------------------------------------------------------------
+      !
+      ! call relevant routines for computing tendencies
+      ! note that the user can choose multiple options and the 
+      !   tendencies will be added together
+      !
+      !-----------------------------------------------------------------
+
+      nEdges = grid % nEdges
+      nCells = grid % nCells
+      nVertices = grid % nVertices
+      nVertLevels = grid % nVertLevels
+
+      maxLevelEdgeBot   =&gt; grid % maxLevelEdgeBot % array
+      cellsOnEdge =&gt; grid % cellsOnEdge % array
+      verticesOnEdge    =&gt; grid % verticesOnEdge % array
+      dcEdge            =&gt; grid % dcEdge % array
+      dvEdge            =&gt; grid % dvEdge % array
+      areaCell          =&gt; grid % areaCell % array
+      areaTriangle      =&gt; grid % areaTriangle % array
+      angleEdge         =&gt; grid % angleEdge % array
+
+      strainRateNormal = 0.0
+      strainRateShear  = 0.0
+
+      do iEdge=1,nEdges
+         vertex1 = verticesOnEdge(1,iEdge)
+         vertex2 = verticesOnEdge(2,iEdge)
+
+         cell1 = cellsOnEdge(1,iEdge)
+         cell2 = cellsOnEdge(2,iEdge)
+
+         invAreaTri1 = 1.0 / areaTriangle(vertex1)
+         invAreaTri2 = 1.0 / areaTriangle(vertex2)
+
+         !dwj: 02/23/12 arraCell(nCells+1) is still 0, this is a temporary fix
+         invAreaCell1 = 1.0 / max(areaCell(cell1), 1.0)
+         invAreaCell2 = 1.0 / max(areaCell(cell2), 1.0)
+
+         cos1 = cos(angleEdge(iEdge))
+         cos2 = cos1**2
+         sin1 = sin(angleEdge(iEdge))
+         sin2 = sin1**2
+         cossin = cos1*sin1
+
+         ! change later:
+         !do k=1,maxLevelEdgeBot(iEdge)
+         do k=1,nVertLevels
+            !eps11 = uDvEdge*cos2
+            !eps22 = uDvEdge*sin2
+            !eps12 = uDvEdge*cossin
+
+            ! using u and v both:
+            eps11 = u(k,iEdge)*cos2   - v(k,iEdge)*cossin
+            eps22 = u(k,iEdge)*sin2   + v(k,iEdge)*cossin
+            eps12 = u(k,iEdge)*cossin + v(k,iEdge)*0.5*(cos2-sin2)
+
+            !eps11 = u(k,iEdge)*cos2   
+            !eps22 = u(k,iEdge)*sin2   
+            !eps12 = u(k,iEdge)*cossin 
+
+            strainRateNormal(1,k,cell1) = strainRateNormal(1,k,cell1) + eps11*invAreaCell1 * dvEdge(iEdge)
+            strainRateNormal(1,k,cell2) = strainRateNormal(1,k,cell2) - eps11*invAreaCell2 * dvEdge(iEdge)
+            strainRateNormal(2,k,cell1) = strainRateNormal(2,k,cell1) + eps22*invAreaCell1 * dvEdge(iEdge)
+            strainRateNormal(2,k,cell2) = strainRateNormal(2,k,cell2) - eps22*invAreaCell2 * dvEdge(iEdge)
+            strainRateNormal(3,k,cell1) = strainRateNormal(3,k,cell1) + eps12*invAreaCell1 * dvEdge(iEdge)
+            strainRateNormal(3,k,cell2) = strainRateNormal(3,k,cell2) - eps12*invAreaCell2 * dvEdge(iEdge)
+
+            ! using u and v both:
+            eps11 = -v(k,iEdge)*sin2   + u(k,iEdge)*cossin
+            eps22 = -v(k,iEdge)*cos2   - u(k,iEdge)*cossin
+            eps12 =  v(k,iEdge)*cossin - u(k,iEdge)*0.5*(cos2-sin2)
+
+            strainRateShear(1,k,vertex1) = strainRateShear(1,k,vertex1) - eps11*invAreaTri1* dcEdge(iEdge)
+            strainRateShear(1,k,vertex2) = strainRateShear(1,k,vertex2) + eps11*invAreaTri2* dcEdge(iEdge)
+            strainRateShear(2,k,vertex1) = strainRateShear(2,k,vertex1) - eps22*invAreaTri1* dcEdge(iEdge)
+            strainRateShear(2,k,vertex2) = strainRateShear(2,k,vertex2) + eps22*invAreaTri2* dcEdge(iEdge)
+            strainRateShear(3,k,vertex1) = strainRateShear(3,k,vertex1) - eps12*invAreaTri1* dcEdge(iEdge)
+            strainRateShear(3,k,vertex2) = strainRateShear(3,k,vertex2) + eps12*invAreaTri2* dcEdge(iEdge)
+
+         end do
+      end do
+
+
+
+
+
+   print '(a,100f8.3)', 'xCell     ',grid % xCell % array(6:7)
+   print '(a,100f8.3)', 'yCell     ',grid % yCell % array(6:7)
+   print '(a,100f8.3)', 'xEdge     ',grid % xEdge % array(1:nEdges)
+   print '(a,100f8.3)', 'yEdge     ',grid % yEdge % array(1:nEdges)
+   print '(a,100f8.3)', 'angleEdge ',angleEdge(1:nEdges)
+   print '(a,100f8.3)', 'u         ',u(:,1:nEdges)
+   print '(a,100f8.3)', 'v         ',v(:,1:nEdges)
+   print '(a,100f8.3)', 'eps Nor 1 ',strainRateNormal(1,:,6:7)
+   print '(a,100f8.3)', 'eps Nor 2 ',strainRateNormal(2,:,6:7)
+   print '(a,100f8.3)', 'eps Nor 3 ',strainRateNormal(3,:,6:7)
+   print '(a,100f8.3)', 'xVertex   ',grid % xVertex % array(10:11)
+   print '(a,100f8.3)', 'yVertex   ',grid % yVertex % array(10:11)
+   print '(a,100f8.3)', 'eps Shr 1 ',strainRateShear(1,:,10:11)
+   print '(a,100f8.3)', 'eps Shr 2 ',strainRateShear(2,:,10:11)
+   print '(a,100f8.3)', 'eps Shr 3 ',strainRateShear(3,:,10:11)
+
+   ! print '(a,100f8.3)', 'xCell     ',grid % xCell % array(1:nCells)
+   ! print '(a,100f8.3)', 'yCell     ',grid % yCell % array(1:nCells)
+   ! print '(a,100f8.3)', 'xEdge     ',grid % xEdge % array(1:nEdges)
+   ! print '(a,100f8.3)', 'yEdge     ',grid % yEdge % array(1:nEdges)
+   ! print '(a,100f8.3)', 'angleEdge ',angleEdge(1:nEdges)
+   ! print '(a,100f8.3)', 'u         ',u(:,1:nEdges)
+   ! print '(a,100f8.3)', 'v         ',v(:,1:nEdges)
+   ! print '(a,100f8.3)', 'eps Nor 1 ',strainRateNormal(1,:,1:nCells)
+   ! print '(a,100f8.3)', 'eps Nor 2 ',strainRateNormal(2,:,1:nCells)
+   ! print '(a,100f8.3)', 'eps Nor 3 ',strainRateNormal(3,:,1:nCells)
+   ! print '(a,100f8.3)', 'xVertex   ',grid % xVertex % array(1:nVertices)
+   ! print '(a,100f8.3)', 'yVertex   ',grid % yVertex % array(1:nVertices)
+   ! print '(a,100f8.3)', 'eps Shr 1 ',strainRateShear(1,:,1:nVertices)
+   ! print '(a,100f8.3)', 'eps Shr 2 ',strainRateShear(2,:,1:nVertices)
+   ! print '(a,100f8.3)', 'eps Shr 3 ',strainRateShear(3,:,1:nVertices)
+
+
+
+   end subroutine mpas_strain_rate!}}}
+
+!***********************************************************************
+!
+!  routine mpas_div_stress_tensor
+!
+!&gt; \brief   Computes normal and shear strain rate
+!&gt; \author  Mark Petersen
+!&gt; \date    25 September 2012
+!&gt; \version SVN:$Id$
+!&gt; \details 
+!&gt;  This routine computes the normal strain rate at the cell centers
+!&gt;  and the shear strain rate at vertices using the weak derivative.
+!
+!-----------------------------------------------------------------------
+
+   subroutine mpas_div_stress_tensor(grid, sigmaN, sigmaS, divStressTensor)!{{{
+
+      !-----------------------------------------------------------------
+      !
+      ! input variables
+      !
+      !-----------------------------------------------------------------
+
+      real (kind=RKIND), dimension(:,:,:), intent(in) :: &amp;
+         sigmaN  !&lt; Input: Normal component of stress tensor
+      real (kind=RKIND), dimension(:,:,:), intent(in) :: &amp;
+         sigmaS  !&lt; Input: Shear component of stress tensor
+
+      type (mesh_type), intent(in) :: &amp;
+         grid          !&lt; Input: grid information
+
+      !-----------------------------------------------------------------
+      !
+      ! input/output variables
+      !
+      !-----------------------------------------------------------------
+
+      !-----------------------------------------------------------------
+      !
+      ! output variables
+      !
+      !-----------------------------------------------------------------
+
+      real (kind=RKIND), dimension(:,:), intent(out) :: &amp;
+         divStressTensor  !&lt; Output: divergence of the stress tensor
+
+      !-----------------------------------------------------------------
+      !
+      ! local variables
+      !
+      !-----------------------------------------------------------------
+
+      integer :: iEdge, nEdgesSolve, cell1, cell2, vertex1, vertex2, k
+
+      integer, dimension(:), pointer :: maxLevelEdgeTop
+      integer, dimension(:,:), pointer :: cellsOnEdge, verticesOnEdge, edgeMask
+
+      real (kind=RKIND) :: invAreaCell1, invAreaCell2, invAreaTri1, invAreaTri2, &amp;
+        cos1, sin1, cos2, sin2, cossin, uDvEdge, uDcEdge, eps11, eps22, eps12, &amp;
+        invdcEdge, invdvEdge
+      real (kind=RKIND), dimension(:), pointer :: dvEdge, dcEdge, areaCell, areaTriangle, angleEdge
+
+      !-----------------------------------------------------------------
+      !
+      ! call relevant routines for computing tendencies
+      ! note that the user can choose multiple options and the 
+      !   tendencies will be added together
+      !
+      !-----------------------------------------------------------------
+
+      nEdgesSolve = grid % nEdgesSolve
+
+      maxLevelEdgeTop   =&gt; grid % maxLevelEdgeTop % array
+      cellsOnEdge =&gt; grid % cellsOnEdge % array
+      verticesOnEdge    =&gt; grid % verticesOnEdge % array
+      dcEdge            =&gt; grid % dcEdge % array
+      dvEdge            =&gt; grid % dvEdge % array
+      angleEdge         =&gt; grid % angleEdge % array
+      edgeMask =&gt; grid % edgeMask % array
+
+      do iEdge=1,nEdgesSolve
+         vertex1 = verticesOnEdge(1,iEdge)
+         vertex2 = verticesOnEdge(2,iEdge)
+
+         cell1 = cellsOnEdge(1,iEdge)
+         cell2 = cellsOnEdge(2,iEdge)
+
+         cos1 = cos(angleEdge(iEdge))
+         cos2 = cos1**2
+         sin1 = sin(angleEdge(iEdge))
+         sin2 = sin1**2
+         cossin = cos1*sin1
+
+         invdcEdge = 1.0 / dcEdge(iEdge)
+         invdvEdge = 1.0 / dvEdge(iEdge)
+
+         do k=1,maxLevelEdgeTop(iEdge)
+            divStressTensor(k,iEdge) = edgeMask(k,iEdge) * invdcEdge &amp;
+               * (  cos2*sigmaN(1,k,cell2) - 2.0*cossin*sigmaN(3,k,cell2) + sin2*sigmaN(2,k,cell2) &amp;
+                  -(cos2*sigmaN(1,k,cell1) - 2.0*cossin*sigmaN(3,k,cell1) + sin2*sigmaN(2,k,cell1)) ) &amp;
+               + edgeMask(k,iEdge) * invdvEdge &amp;
+               * (  (cos2-sin2)*sigmaS(3,k,vertex2) + cossin*(sigmaS(1,k,vertex2) - sigmaS(2,k,vertex2)) &amp;
+                  -((cos2-sin2)*sigmaS(3,k,vertex1) + cossin*(sigmaS(1,k,vertex1) - sigmaS(2,k,vertex1))))
+         end do
+
+      end do
+
+   end subroutine mpas_div_stress_tensor!}}}
+
+!***********************************************************************
+!
+!  routine mpas_test_stress_tensor
+!
+!&gt; \brief   Tests strain rate and stress tensor divergence operators
+!&gt; \author  Mark Petersen
+!&gt; \date    25 September 2012
+!&gt; \version SVN:$Id$
+!&gt; \details 
+!&gt;  This routine tests strain rate and stress tensor divergence operators.
+!
+!-----------------------------------------------------------------------
+
+   subroutine mpas_test_stress_tensor(domain) !{{{
+
+      !-----------------------------------------------------------------
+      !
+      ! input variables
+      !
+      !-----------------------------------------------------------------
+
+      !-----------------------------------------------------------------
+      !
+      ! input/output variables
+      !
+      !-----------------------------------------------------------------
+
+      type (domain_type), intent(inout) :: domain
+
+      !-----------------------------------------------------------------
+      !
+      ! output variables
+      !
+      !-----------------------------------------------------------------
+
+      !-----------------------------------------------------------------
+      !
+      ! local variables
+      !
+      !-----------------------------------------------------------------
+
+      type (block_type), pointer :: block
+
+      integer :: nCells, nEdges, nVertices, nVertLevels, iCell, iEdge, iVertex, k, i
+
+      integer, dimension(:), pointer :: maxLevelEdgeTop, nEdgesOnEdge
+      integer, dimension(:,:), pointer :: cellsOnEdge, verticesOnEdge, edgeMask, edgesOnEdge
+
+      real (kind=RKIND) :: invAreaCell1, invAreaCell2, invAreaTri1, invAreaTri2, &amp;
+        cos1, sin1, cos2, sin2, cossin, uDvEdge, uDcEdge, eps11, eps22, eps12, &amp;
+        invdcEdge, invdvEdge, ux, uy, a, eoe, cn, cs, r, theta, rot
+      real (kind=RKIND), dimension(:), pointer :: angleEdge, &amp; 
+         xCell, yCell, xEdge, yEdge, xVertex, yVertex
+      real (kind=RKIND), dimension(:,:), pointer :: u, v, divStressTensor, weightsOnEdge
+      real (kind=RKIND), dimension(:,:,:), pointer :: strainRateNormal, strainRateShear
+
+
+      !-----------------------------------------------------------------
+      !
+      ! call relevant routines for computing tendencies
+      ! note that the user can choose multiple options and the 
+      !   tendencies will be added together
+      !
+      !-----------------------------------------------------------------
+
+      ! Initialize z-level grid variables from h, read in from input file.
+   block =&gt; domain % blocklist
+   do while (associated(block))
+
+!      maxLevelCell =&gt; block % mesh % maxLevelCell % array
+!      maxLevelEdgeTop =&gt; block % mesh % maxLevelEdgeTop % array
+!      maxLevelEdgeBot =&gt; block % mesh % maxLevelEdgeBot % array
+!      maxLevelVertexTop =&gt; block % mesh % maxLevelVertexTop % array
+!      maxLevelVertexBot =&gt; block % mesh % maxLevelVertexBot % array
+!      cellsOnEdge    =&gt; block % mesh % cellsOnEdge % array
+!      cellsOnVertex  =&gt; block % mesh % cellsOnVertex % array
+!      verticesOnEdge =&gt; block % mesh % verticesOnEdge % array
+!      boundaryEdge   =&gt; block % mesh % boundaryEdge % array
+!      boundaryCell   =&gt; block % mesh % boundaryCell % array
+!      boundaryVertex =&gt; block % mesh % boundaryVertex % array
+!      edgeMask =&gt; block % mesh % edgeMask % array
+!      cellMask =&gt; block % mesh % cellMask % array
+!      vertexMask =&gt; block % mesh % vertexMask % array
+
+      nCells      = block % mesh % nCells
+      nEdges      = block % mesh % nEdges
+      nVertices   = block % mesh % nVertices
+      nVertLevels = block % mesh % nVertLevels
+
+      xCell  =&gt; block % mesh % xCell % array
+      yCell  =&gt; block % mesh % yCell % array
+      xEdge  =&gt; block % mesh % xEdge % array
+      yEdge  =&gt; block % mesh % yEdge % array
+      xVertex =&gt; block % mesh % xVertex % array
+      yVertex =&gt; block % mesh % yVertex % array
+      angleEdge =&gt; block % mesh % angleEdge % array
+
+      nEdgesOnEdge      =&gt; block % mesh % nEdgesOnEdge % array
+      edgesOnEdge       =&gt; block % mesh % edgesOnEdge % array
+      weightsOnEdge     =&gt; block % mesh % weightsOnEdge % array
+
+         u          =&gt; block % state % time_levs(1) % state % u % array
+         v          =&gt; block % state % time_levs(1) % state % v % array
+         strainRateNormal =&gt; block % state % time_levs(1) % state % strainRateNormal % array
+         strainRateShear =&gt; block % state % time_levs(1) % state % strainRateShear % array
+         divStressTensor =&gt; block % state % time_levs(1) % state % divStressTensor % array
+         
+      cn = 1.5
+      cs = 0.7
+
+      do iEdge = 1,nEdges
+         a = angleEdge(iEdge)
+
+         !ux = cn*xEdge(iEdge)
+         !uy = cs*xEdge(iEdge)
+         !ux = -cs*yEdge(iEdge)
+         !uy = cn*yEdge(iEdge)
+         r = sqrt(xEdge(iEdge)**2 + yEdge(iEdge)**2)
+         theta = atan(yEdge(iEdge)/xEdge(iEdge))
+         rot = 4*pii/5
+
+         ux = r*cos(theta-rot)*(cn*cos(rot) - cs*sin(rot))
+         uy = r*cos(theta-rot)*(cn*sin(rot) + cs*cos(rot))
+
+         do k=1,nVertLevels
+            !do k = 1,maxLevelEdgeTop(iEdge) 
+            u(k,iEdge) = ux*cos(a) + uy*sin(a)
+         end do
+      end do
+
+
+      do iEdge = 1,nEdges
+         ! Compute v (tangential) velocities
+         do i=1,nEdgesOnEdge(iEdge)
+            eoe = edgesOnEdge(i,iEdge)
+            ! mrp 101115 note: in order to include flux boundary conditions,
+            ! the following loop may need to change to maxLevelEdgeBot
+            do k=1,nVertLevels
+            !do k = 1,maxLevelEdgeTop(iEdge) 
+               v(k,iEdge) = v(k,iEdge) + weightsOnEdge(i,iEdge) * u(k, eoe)
+            end do
+         end do
+
+      end do
+
+
+      call mpas_strain_rate(block % mesh, u,v, strainRateNormal, strainRateShear)
+
+      call mpas_div_stress_tensor(block % mesh, strainRateNormal, strainRateShear, divStressTensor)
+      
+      print *, 'nedges, size(u)',nEdges, size(u)
+      print '(a,3f20.10)', 'min max mean u                ',minval(u(:,1:nEdges)),maxval(u(:,1:nEdges)),sum(u(:,1:nEdges))/nEdges/nVertLevels
+      print '(a,3f20.10)', 'min max mean v                ',minval(v(:,1:nEdges)),maxval(v(:,1:nEdges)),sum(v(:,1:nEdges))/nEdges/nVertLevels
+      print '(a,3f20.10)', 'min max mean strainRateNormal1',minval(strainRateNormal(1,:,1:nCells)),maxval(strainRateNormal(1,:,1:nCells)),sum(strainRateNormal(1,:,1:nCells))/nCells/nVertLevels
+      print '(a,3f20.10)', 'min max mean strainRateNormal2',minval(strainRateNormal(2,:,1:nCells)),maxval(strainRateNormal(2,:,1:nCells)),sum(strainRateNormal(2,:,1:nCells))/nCells/nVertLevels
+      print '(a,3f20.10)', 'min max mean strainRateNormal3',minval(strainRateNormal(3,:,1:nCells)),maxval(strainRateNormal(3,:,1:nCells)),sum(strainRateNormal(3,:,1:nCells))/nCells/nVertLevels
+      print '(a,3f20.10)', 'min max mean strainRateShear1 ',minval(strainRateShear(1,:,1:nVertices)),maxval(strainRateShear(1,:,1:nVertices)),sum(strainRateShear(1,:,1:nVertices))/nVertices/nVertLevels
+      print '(a,3f20.10)', 'min max mean strainRateShear2 ',minval(strainRateShear(2,:,1:nVertices)),maxval(strainRateShear(2,:,1:nVertices)),sum(strainRateShear(2,:,1:nVertices))/nVertices/nVertLevels
+      print '(a,3f20.10)', 'min max mean strainRateShear3 ',minval(strainRateShear(3,:,1:nVertices)),maxval(strainRateShear(3,:,1:nVertices)),sum(strainRateShear(3,:,1:nVertices))/nVertices/nVertLevels
+      print '(a,3f20.10)', 'min max mean divStressTensor  ',minval(divStressTensor(:,1:nEdges)),maxval(divStressTensor(:,1:nEdges)),sum(divStressTensor(:,1:nEdges))/nEdges/nVertLevels
+
+      block =&gt; block % next
+   end do
+
+   end subroutine mpas_test_stress_tensor!}}}
+
+!***********************************************************************
+!
+!  routine mpas_stress_tensor_init
+!
+!&gt; \brief   Initializes flags used within tendency routines.
+!&gt; \author  Mark Petersen
+!&gt; \date    25 September 2012
+!&gt; \version SVN:$Id$
+!&gt; \details 
+!&gt;  This routine initializes flags related to quantities computed within
+!&gt;  other tendency routines.
+!
+!-----------------------------------------------------------------------
+!    subroutine mpas_stress_tensor_init(err)!{{{
+!        integer, intent(out) :: err !&lt; Output: Error flag
+
+!    end subroutine mpas_stress_tensor_init!}}}
+
+!***********************************************************************
+
+end module mpas_stress_tensor
+
+!|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+! vim: foldmethod=marker

</font>
</pre>