<p><b>mhoffman@lanl.gov</b> 2012-03-07 16:27:50 -0700 (Wed, 07 Mar 2012)</p><p>BRANCH COMMIT -- land_ice<br>
<br>
Cleanup of land ice core, including:<br>
* Removal of test cases module (test cases will be run from python I.C. setup scripts from now on)<br>
* Addition of needed state initialization to land_ice_mpas_core (that had previously been done in the test cases module)<br>
* Removal of unused parts of the time integration module<br>
* Symlinking namelist.input to the default land ice namelist<br>
* Removal of dimension nTracers from the Registry (not used)<br>
* Added plots of upper and lowerSurface to the dome viz script to allow validation that the needed state init occurred.<br>
</p><hr noshade><pre><font color="gray">Modified: branches/land_ice_projects/implement_core/namelist.input
===================================================================
--- branches/land_ice_projects/implement_core/namelist.input        2012-03-07 22:50:57 UTC (rev 1603)
+++ branches/land_ice_projects/implement_core/namelist.input        2012-03-07 23:27:50 UTC (rev 1604)
@@ -1 +1 @@
-link namelist.input.ocean
\ No newline at end of file
+link namelist.input.land_ice
\ No newline at end of file

Modified: branches/land_ice_projects/implement_core/src/core_land_ice/Registry
===================================================================
--- branches/land_ice_projects/implement_core/src/core_land_ice/Registry        2012-03-07 22:50:57 UTC (rev 1603)
+++ branches/land_ice_projects/implement_core/src/core_land_ice/Registry        2012-03-07 23:27:50 UTC (rev 1604)
@@ -40,7 +40,6 @@
 dim vertexDegree vertexDegree
 dim nVertLevels nVertLevels
 dim nVertLevelsPlus2 nVertLevels+2
-dim nTracers nTracers
 
 %
 % var persistence type  name_in_file  ( dims )  time_levs iro-  name_in_code struct super-array array_class

Modified: branches/land_ice_projects/implement_core/src/core_land_ice/mpas_land_ice_mpas_core.F
===================================================================
--- branches/land_ice_projects/implement_core/src/core_land_ice/mpas_land_ice_mpas_core.F        2012-03-07 22:50:57 UTC (rev 1603)
+++ branches/land_ice_projects/implement_core/src/core_land_ice/mpas_land_ice_mpas_core.F        2012-03-07 23:27:50 UTC (rev 1604)
@@ -34,8 +34,6 @@
       err = 0
 
 
-      if (.not. config_do_restart) call setup_land_ice_test_case(domain)
-
       !
       ! Initialize core
       !
@@ -133,9 +131,24 @@
       type (dm_info) :: dminfo
       integer :: err, err_tmp
 
+      integer :: iCell, iLevel, nCells, nVertLevels
+      real (kind=RKIND), dimension(:), pointer :: thickness, upperSurface, &amp;
+        lowerSurface, bedTopography, layerThicknessFractions
+      real (kind=RKIND), dimension(:,:), pointer :: layerThickness

       err = 0
 
-      call land_ice_compute_solve_diagnostics(dt, block % state % time_levs(1) % state, mesh)
+      nCells = mesh % nCells
+      nVertLevels = mesh % nVertLevels
+      layerThicknessFractions =&gt; mesh % layerThicknessFractions % array
+      thickness =&gt; block % state % time_levs(1) % state % thickness % array
+      upperSurface =&gt; block % state % time_levs(1) % state % upperSurface % array
+      lowerSurface =&gt; block % state % time_levs(1) % state % lowerSurface % array
+      bedTopography =&gt; block % state % time_levs(1) % state % bedTopography % array
+      layerThickness =&gt; block % state % time_levs(1) % state % layerThickness % array

+
+
       call compute_mesh_scaling(mesh) 
 
       call mpas_rbf_interp_initialize(mesh)
@@ -147,7 +160,25 @@
                        block % state % time_levs(1) % state % uReconstructZonal % array,        &amp;
                        block % state % time_levs(1) % state % uReconstructMeridional % array    &amp;
                       )
-   
+  
+
+      ! Initialize state ==== eventually this should be moved to its own subroutine/module
+      ! no ice shelves -- lower surface same as bed topography
+      ! Eventually this should consider floatation!
+      lowerSurface(:) = bedTopography(:)
+
+      ! as always, upper surface is the lower surface plus the thickness
+      upperSurface(:) = lowerSurface(:) + thickness(:)
+
+      ! set up layerThickness from thickness using the layerThicknessFractions
+      do iCell = 1, nCells
+         do iLevel = 1, nVertLevels
+           layerThickness(iLevel,iCell) = layerThicknessFractions(iLevel)*thickness(iCell)
+         end do
+      end do
+      ! end initalize state ====
+
+
       call land_ice_vel_block_init(mesh, err_tmp)
       err = ior(err, err_tmp)
 

Deleted: branches/land_ice_projects/implement_core/src/core_land_ice/mpas_land_ice_test_cases.F
===================================================================
--- branches/land_ice_projects/implement_core/src/core_land_ice/mpas_land_ice_test_cases.F        2012-03-07 22:50:57 UTC (rev 1603)
+++ branches/land_ice_projects/implement_core/src/core_land_ice/mpas_land_ice_test_cases.F        2012-03-07 23:27:50 UTC (rev 1604)
@@ -1,240 +0,0 @@
-module land_ice_test_cases
-
-   use mpas_grid_types
-   use mpas_configure
-   use mpas_constants
-
-   contains
-
-
-   subroutine setup_land_ice_test_case(domain)
-   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-   ! Configure grid metadata and model state for the test case 
-   !   specified in the namelist
-   !
-   ! Output: block - a subset (not necessarily proper) of the model domain to be
-   !                 initialized
-   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-      implicit none
-
-      type (domain_type), intent(inout) :: domain
-
-      integer :: i
-      type (block_type), pointer :: block_ptr
-
-      if (config_test_case == 0) then
-         write(0,*) 'Using initial conditions supplied in input file'
-
-!!!      else if (config_test_case == 1) then
-!!!         write(0,*) 'Setting up shallow water test case 1'
-!!!         write(0,*) ' -- Advection of Cosine Bell over the Pole'
-
-!!!         block_ptr =&gt; domain % blocklist
-!!!         do while (associated(block_ptr))
-!!!            call sw_test_case_1(block_ptr % mesh, block_ptr % state % time_levs(1) % state)
-!!!            do i=2,nTimeLevs
-!!!               call mpas_copy_state(block_ptr % state % time_levs(i) % state, block_ptr % state % time_levs(1) % state)
-!!!            end do
-
-!!!            block_ptr =&gt; block_ptr % next
-!!!         end do
-
-!whl - removed remaining shallow water test cases
-      else if (config_test_case == 1) then
-         ! the dome test case
-         write(0,*) 'Setting up land ice test case 1'
-         write(0,*) ' -- Evolution of an isothermal dome'
-
-         block_ptr =&gt; domain % blocklist
-         do while (associated(block_ptr))
-            call land_ice_test_case_1(block_ptr % mesh, block_ptr % state % time_levs(1) % state)
-            do i=2,nTimeLevs
-               call mpas_copy_state(block_ptr % state % time_levs(i) % state, block_ptr % state % time_levs(1) % state)
-            end do
-
-            block_ptr =&gt; block_ptr % next
-         end do
-
-      else
-         write(0,*) 'Only test case 0 is currently supported.'
-         stop
-      end if
-
-   end subroutine setup_land_ice_test_case
-
-
-   subroutine land_ice_test_case_1(mesh, state)
-   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-   ! Setup land ice test case 1: Isothermal dome
-   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-      implicit none
-
-      type (mesh_type), intent(inout) :: mesh
-      type (state_type), intent(inout) :: state
-
-      real (kind=RKIND), parameter :: r0 = 60000.0*sqrt(0.125) !meters
-      real (kind=RKIND), parameter :: h0 = 2000.0*sqrt(0.125) !meters
-      real (kind=RKIND), parameter :: x0 = 30000.0 !meters
-      real (kind=RKIND), parameter :: y0 = 30000.0 !meters
-
-      integer :: iCell, iLevel, nCells, nVertLevels, index_temperature
-      real (kind=RKIND) :: r
-
-      real (kind=RKIND), dimension(:), pointer :: xCell, yCell, thickness, upperSurface, &amp;
-        lowerSurface, bedTopography, layerThicknessFractions
-      real (kind=RKIND), dimension(:,:), pointer :: normalVelocity, layerThickness
-      real (kind=RKIND), dimension(:,:,:), pointer :: tracers
-
-
-      if(mesh % on_a_sphere) then
-         print *, &quot;Land ice test case 1 only supports planar meshes.&quot;
-         stop
-      end if
-
-      nCells = mesh % nCells
-      nVertLevels = mesh % nVertLevels
-
-      xCell =&gt; mesh % xCell % array
-      yCell =&gt; mesh % yCell % array
-      layerThicknessFractions =&gt; mesh % layerThicknessFractions % array
-      thickness =&gt; state % thickness % array
-      upperSurface =&gt; state % upperSurface % array
-      lowerSurface =&gt; state % lowerSurface % array
-      bedTopography =&gt; state % bedTopography % array
-      normalVelocity =&gt; state % normalVelocity % array
-      layerThickness =&gt; state % layerThickness % array
-      tracers =&gt; state % tracers % array
-
-      index_temperature = state % index_temperature
-
-      ! zero velocity everywhere
-      normalVelocity(:,:) = 0.0
-
-      ! flat bed at sea level
-      bedTopography(:) = 0.0
-
-      ! constant, arbitrary temperature
-      tracers(index_temperature,:,:) = -20.0 ! degrees C
-
-      do iCell = 1, nCells
-         r = sqrt((xCell(iCell)-x0)**2 + (yCell(iCell)-y0)**2)
-         if(r &lt; r0) then
-            thickness(iCell) = h0*sqrt(1 - (r/r0)**2)
-         else
-            thickness(iCell) = 0.0
-         end if
-      end do
-
-      ! no ice shelves -- lower surface same as bed topography
-      lowerSurface(:) = bedTopography(:)
-
-      ! as always, upper surface is the lower surface plus the thickness
-      upperSurface(:) = lowerSurface(:) + thickness(:)
-
-      ! set up layerThickness from thickness using the layerThicknessFractions
-      do iCell = 1, nCells
-         do iLevel = 1, nVertLevels
-           layerThickness(iLevel,iCell) = layerThicknessFractions(iLevel)*thickness(iCell)
-         end do
-      end do
-
-
-   end subroutine land_ice_test_case_1
-
-!!!   subroutine sw_test_case_1(grid, state)
-   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-   ! Setup shallow water test case 1: Advection of Cosine Bell over the Pole
-   !
-   ! Reference: Williamson, D.L., et al., &quot;A Standard Test Set for Numerical 
-   !            Approximations to the Shallow Water Equations in Spherical 
-   !            Geometry&quot; J. of Comp. Phys., 102, pp. 211--224
-   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-!!!      implicit none
-
-!!!      type (mesh_type), intent(inout) :: grid
-!!!      type (state_type), intent(inout) :: state
-
-!!!      real (kind=RKIND), parameter :: u0 = 2.0 * pii * a / (12.0 * 86400.0)
-!!!      real (kind=RKIND), parameter :: h0 = 1000.0
-!!!      real (kind=RKIND), parameter :: theta_c = 0.0
-!!!      real (kind=RKIND), parameter :: lambda_c = 3.0*pii/2.0
-!!!      real (kind=RKIND), parameter :: alpha = pii/4.0
-
-!!!      integer :: iCell, iEdge, iVtx
-!!!      real (kind=RKIND) :: r, u, v
-!!!      real (kind=RKIND), allocatable, dimension(:) :: psiVertex
-
-      !
-      ! Scale all distances and areas from a unit sphere to one with radius a
-      !
-!!!      grid % xCell % array = grid % xCell % array * a
-!!!      grid % yCell % array = grid % yCell % array * a
-!!!      grid % zCell % array = grid % zCell % array * a
-!!!      grid % xVertex % array = grid % xVertex % array * a
-!!!      grid % yVertex % array = grid % yVertex % array * a
-!!!      grid % zVertex % array = grid % zVertex % array * a
-!!!      grid % xEdge % array = grid % xEdge % array * a
-!!!      grid % yEdge % array = grid % yEdge % array * a
-!!!      grid % zEdge % array = grid % zEdge % array * a
-!!!      grid % dvEdge % array = grid % dvEdge % array * a
-!!!      grid % dcEdge % array = grid % dcEdge % array * a
-!!!      grid % areaCell % array = grid % areaCell % array * a**2.0
-!!!      grid % areaTriangle % array = grid % areaTriangle % array * a**2.0
-!!!      grid % kiteAreasOnVertex % array = grid % kiteAreasOnVertex % array * a**2.0
-
-      !
-      ! Initialize wind field
-      !
-!!!      allocate(psiVertex(grid % nVertices))
-!!!      do iVtx=1,grid % nVertices
-!!!         psiVertex(iVtx) = -a * u0 * ( &amp;
-!!!                                       sin(grid%latVertex%array(iVtx)) * cos(alpha) - &amp;
-!!!                                       cos(grid%lonVertex%array(iVtx)) * cos(grid%latVertex%array(iVtx)) * sin(alpha) &amp;
-!!!                                     )
-!!!      end do
-!!!      do iEdge=1,grid % nEdges
-!!!         state % u % array(1,iEdge) = -1.0 * ( &amp;
-!!!                                               psiVertex(grid%verticesOnEdge%array(2,iEdge)) - &amp;
-!!!                                               psiVertex(grid%verticesOnEdge%array(1,iEdge)) &amp;
-!!!                                             ) / grid%dvEdge%array(iEdge)
-!!!      end do
-!!!      deallocate(psiVertex)
-
-      !
-      ! Initialize cosine bell at (theta_c, lambda_c)
-      !
-!!!      do iCell=1,grid % nCells
-!!!         r = sphere_distance(theta_c, lambda_c, grid % latCell % array(iCell), grid % lonCell % array(iCell), a) 
-!!!         if (r &lt; a/3.0) then
-!!!            state % h % array(1,iCell) = (h0 / 2.0) * (1.0 + cos(pii*r*3.0/a))
-!!!         else
-!!!            state % h % array(1,iCell) = 0.0
-!!!         end if
-!!!      end do
-
-!!!   end subroutine sw_test_case_1
-
-
-!!!   real function sphere_distance(lat1, lon1, lat2, lon2, radius)
-   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-   ! Compute the great-circle distance between (lat1, lon1) and (lat2, lon2) on a
-   !   sphere with given radius.
-   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-!!!      implicit none
-
-!!!      real (kind=RKIND), intent(in) :: lat1, lon1, lat2, lon2, radius
-
-!!!      real (kind=RKIND) :: arg1
-
-!!!      arg1 = sqrt( sin(0.5*(lat2-lat1))**2 +  &amp;
-!!!                   cos(lat1)*cos(lat2)*sin(0.5*(lon2-lon1))**2 )
-!!!      sphere_distance = 2.*radius*asin(arg1)
-
-!!!   end function sphere_distance
-
-
-end module land_ice_test_cases

Modified: branches/land_ice_projects/implement_core/src/core_land_ice/mpas_land_ice_time_integration.F
===================================================================
--- branches/land_ice_projects/implement_core/src/core_land_ice/mpas_land_ice_time_integration.F        2012-03-07 22:50:57 UTC (rev 1603)
+++ branches/land_ice_projects/implement_core/src/core_land_ice/mpas_land_ice_time_integration.F        2012-03-07 23:27:50 UTC (rev 1604)
@@ -69,1261 +69,4 @@
    end subroutine land_ice_timestep
 
 
-   subroutine land_ice_rk4(domain, dt)
-   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
-   ! Advance model state forward in time by the specified time step using 
-   !   4th order Runge-Kutta
-   !
-   ! Input: domain - current model state in time level 1 (e.g., time_levs(1)state%h(:,:)) 
-   !                 plus grid meta-data
-   ! Output: domain - upon exit, time level 2 (e.g., time_levs(2)%state%h(:,:)) contains 
-   !                  model state advanced forward in time by dt seconds
-   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
-
-      implicit none
-
-      type (domain_type), intent(inout) :: domain
-      real (kind=RKIND), intent(in) :: dt
-
-      integer :: iCell, k
-      type (block_type), pointer :: block
-      type (state_type) :: provis
-
-      integer :: rk_step
-
-      real (kind=RKIND), dimension(4) :: rk_weights, rk_substep_weights
-
-      block =&gt; domain % blocklist
-      call mpas_allocate_state(provis, &amp;
-                          block % mesh % nCells, block % mesh % nEdges, block % mesh % maxEdges, block % mesh % maxEdges2, &amp;
-                          block % mesh % nVertices, block % mesh % vertexDegree, block % mesh % nVertLevels, &amp;
-                          block % mesh % nTracers)
-
-      !
-      ! Initialize time_levs(2) with state at current time
-      ! Initialize first RK state
-      ! Couple tracers time_levs(2) with h in time-levels
-      ! Initialize RK weights
-      !
-      block =&gt; domain % blocklist
-      do while (associated(block))
-
-         block % state % time_levs(2) % state % normalVelocity % array(:,:) = block % state % time_levs(1) % state % normalVelocity % array(:,:)
-
-         block % state % time_levs(2) % state % layerThickness % array(:,:) = block % state % time_levs(1) % state % layerThickness % array(:,:)
-
-         do iCell=1,block % mesh % nCells  ! couple tracers to h
-           do k=1,block % mesh % nVertLevels
-             block % state % time_levs(2) % state % tracers % array(:,k,iCell) = &amp;
-                                                                 block % state % time_levs(1) % state % tracers % array(:,k,iCell) &amp;
-                                                               * block % state % time_levs(1) % state % layerThickness % array(k,iCell)
-            end do
-         end do
-
-         call mpas_copy_state(provis, block % state % time_levs(1) % state)
-
-         block =&gt; block % next
-      end do
-
-      rk_weights(1) = dt/6.
-      rk_weights(2) = dt/3.
-      rk_weights(3) = dt/3.
-      rk_weights(4) = dt/6.
-
-      rk_substep_weights(1) = dt/2.
-      rk_substep_weights(2) = dt/2.
-      rk_substep_weights(3) = dt
-      rk_substep_weights(4) = 0.
-
-
-      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
-      ! BEGIN RK loop 
-      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
-      do rk_step = 1, 4
-
-! ---  update halos for diagnostic variables
-
-        block =&gt; domain % blocklist
-        do while (associated(block))
-!!!           call mpas_dmpar_exch_halo_field2d_real(domain % dminfo, provis % pv_edge % array(:,:), &amp;
-!!!                                            block % mesh % nVertLevels, block % mesh % nEdges, &amp;
-!!!                                            block % parinfo % edgesToSend, block % parinfo % edgesToRecv)
-
-!!!           if (config_h_mom_eddy_visc4 &gt; 0.0) then
-!!!              call mpas_dmpar_exch_halo_field2d_real(domain % dminfo, provis % divergence % array(:,:), &amp;
-!!!                                               block % mesh % nVertLevels, block % mesh % nCells, &amp;
-!!!                                               block % parinfo % cellsToSend, block % parinfo % cellsToRecv)
-!!!              call mpas_dmpar_exch_halo_field2d_real(domain % dminfo, provis % vorticity % array(:,:), &amp;
-!!!                                               block % mesh % nVertLevels, block % mesh % nVertices, &amp;
-!!!                                               block % parinfo % verticesToSend, block % parinfo % verticesToRecv)
-!!!           end if
-
-           block =&gt; block % next
-        end do
-
-! ---  compute tendencies
-
-        block =&gt; domain % blocklist
-        do while (associated(block))
-           call land_ice_compute_tend(block % tend, provis, block % mesh)
-           call land_ice_compute_scalar_tend(block % tend, provis, block % mesh)
-           call land_ice_enforce_boundary_edge(block % tend, block % mesh)
-           block =&gt; block % next
-        end do
-
-! ---  update halos for prognostic variables
-
-        block =&gt; domain % blocklist
-        do while (associated(block))
-!           call mpas_dmpar_exch_halo_field2d_real(domain % dminfo, block % tend % normalVelocity % array(:,:), &amp;
-!                                            block % mesh % nVertLevels, block % mesh % nEdges, &amp;
-!                                            block % parinfo % edgesToSend, block % parinfo % edgesToRecv)
-           call mpas_dmpar_exch_halo_field2d_real(domain % dminfo, block % tend % layerThickness % array(:,:), &amp;
-                                            block % mesh % nVertLevels, block % mesh % nCells, &amp;
-                                            block % parinfo % cellsToSend, block % parinfo % cellsToRecv)
-           call mpas_dmpar_exch_halo_field3d_real(domain % dminfo, block % tend % tracers % array(:,:,:), &amp;
-                                            block % mesh % nTracers, block % mesh % nVertLevels, block % mesh % nCells, &amp;
-                                            block % parinfo % cellsToSend, block % parinfo % cellsToRecv)
-           block =&gt; block % next
-        end do
-
-! ---  compute next substep state
-
-        if (rk_step &lt; 4) then
-           block =&gt; domain % blocklist
-           do while (associated(block))
-!              provis % normalVelocity % array(:,:)       = block % state % time_levs(1) % state % normalVelocity % array(:,:)  &amp;
-!                                            + rk_substep_weights(rk_step) * block % tend % normalVelocity % array(:,:)
-              provis % layerThickness % array(:,:)       = block % state % time_levs(1) % state % layerThickness % array(:,:)  &amp;
-                                            + rk_substep_weights(rk_step) * block % tend % layerThickness % array(:,:)
-              do iCell=1,block % mesh % nCells
-                 do k=1,block % mesh % nVertLevels
-                    provis % tracers % array(:,k,iCell) = ( &amp;
-                                                           block % state % time_levs(1) % state % layerThickness % array(k,iCell) * &amp;
-                                                           block % state % time_levs(1) % state % tracers % array(:,k,iCell)  &amp;
-                                      + rk_substep_weights(rk_step) * block % tend % tracers % array(:,k,iCell) &amp;
-                                                          ) / provis % layerThickness % array(k,iCell)
-                 end do
-              end do
-              if (config_test_case == 1) then    ! For case 1, wind field should be fixed
-                 provis % normalVelocity % array(:,:) = block % state % time_levs(1) % state % normalVelocity % array(:,:)
-              end if
-              call land_ice_compute_solve_diagnostics(dt, provis, block % mesh)
-              block =&gt; block % next
-           end do
-        end if
-
-!--- accumulate update (for RK4)
-
-        block =&gt; domain % blocklist
-        do while (associated(block))
-!           block % state % time_levs(2) % state % normalVelocity % array(:,:) = block % state % time_levs(2) % state % normalVelocity % array(:,:) &amp;
-!                                   + rk_weights(rk_step) * block % tend % normalVelocity % array(:,:)
-           block % state % time_levs(2) % state % layerThickness % array(:,:) = block % state % time_levs(2) % state % layerThickness % array(:,:) &amp;
-                                   + rk_weights(rk_step) * block % tend % layerThickness % array(:,:)
-           do iCell=1,block % mesh % nCells
-              do k=1,block % mesh % nVertLevels
-                 block % state % time_levs(2) % state % tracers % array(:,k,iCell) =  &amp;
-                                                                   block % state % time_levs(2) % state % tracers % array(:,k,iCell) &amp;
-                                                                 + rk_weights(rk_step) * block % tend % tracers % array(:,k,iCell)
-              end do
-           end do
-           block =&gt; block % next
-        end do
-
-      end do
-      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
-      ! END RK loop 
-      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
-
-
-      !
-      !  A little clean up at the end: decouple new scalar fields and compute diagnostics for new state
-      !
-      block =&gt; domain % blocklist
-      do while (associated(block))
-         do iCell=1,block % mesh % nCells
-            do k=1,block % mesh % nVertLevels
-               block % state % time_levs(2) % state % tracers % array(:,k,iCell) = &amp;
-                                                                     block % state % time_levs(2) % state % tracers % array(:,k,iCell)  &amp;
-                                                                   / block % state % time_levs(2) % state % layerThickness % array(k,iCell)
-            end do
-         end do
-
-         if (config_test_case == 1) then    ! For case 1, wind field should be fixed
-            block % state % time_levs(2) % state % normalVelocity % array(:,:) = block % state % time_levs(1) % state % normalVelocity % array(:,:)
-         end if
-
-         call land_ice_compute_solve_diagnostics(dt, block % state % time_levs(2) % state, block % mesh)
-
-         call mpas_reconstruct(block % mesh, block % state % time_levs(2) % state % normalVelocity% array,          &amp;
-                          block % state % time_levs(2) % state % uReconstructX % array,            &amp;
-                          block % state % time_levs(2) % state % uReconstructY % array,            &amp;
-                          block % state % time_levs(2) % state % uReconstructZ % array,            &amp;
-                          block % state % time_levs(2) % state % uReconstructZonal % array,        &amp;
-                          block % state % time_levs(2) % state % uReconstructMeridional % array    &amp;
-                         )
-
-         block =&gt; block % next
-      end do
-
-      call mpas_deallocate_state(provis)
-
-   end subroutine land_ice_rk4
-
-
-   subroutine land_ice_compute_tend(tend, s, grid)
-   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
-   ! Compute height and normal wind tendencies, as well as diagnostic variables
-   !
-   ! Input: s - current model state
-   !        grid - grid metadata
-   !
-   ! Output: tend - computed tendencies for prognostic variables
-   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
-
-      implicit none
-
-      type (tend_type), intent(inout) :: tend
-      type (state_type), intent(in) :: s
-      type (mesh_type), intent(in) :: grid
-
-      integer :: iEdge, iCell, iVertex, k, cell1, cell2, vertex1, vertex2, eoe, i, j
-      real (kind=RKIND) :: flux, vorticity_abs, workpv, q, upstream_bias
-
-      integer :: nCells, nEdges, nVertices, nVertLevels
-      real (kind=RKIND), dimension(:), pointer :: dvEdge, dcEdge, areaCell, areaTriangle, &amp;
-                                                  meshScalingDel2, meshScalingDel4
-!!!      real (kind=RKIND), dimension(:), pointer :: h_s, fVertex, fEdge
-!!!      real (kind=RKIND), dimension(:,:), pointer :: vh
-      real (kind=RKIND), dimension(:,:), pointer :: weightsOnEdge, kiteAreasOnVertex, &amp;
-                                                    layerThicknessEdge, layerThickness, normalVelocity, tend_layerThickness, &amp;
-!!!                                                    layerThicknessEdge, h, u, v, tend_h, tend_u, &amp;
-!!!                                                    circulation, vorticity, ke, pv_edge, divergence,  &amp; 
-                                                    layerThicknessVertex
-      integer, dimension(:,:), pointer :: cellsOnEdge, cellsOnVertex, verticesOnEdge, edgesOnCell, edgesOnEdge, edgesOnVertex
-      integer, dimension(:), pointer :: nEdgesOnCell, nEdgesOnEdge
-      real (kind=RKIND) :: r
-!!!      real (kind=RKIND) :: u_diffusion
-
-!!!      real (kind=RKIND), allocatable, dimension(:,:) :: delsq_divergence
-!!!      real (kind=RKIND), allocatable, dimension(:,:) :: delsq_u
-!!!      real (kind=RKIND), allocatable, dimension(:,:) :: delsq_circulation, delsq_vorticity
-
-!!!      real (kind=RKIND), dimension(:,:), pointer :: u_src
-      real (kind=RKIND), parameter :: rho_ref = 1000.0
-      real (kind=RKIND) :: ke_edge
-
-
-!!!      h           =&gt; s % h % array
-!!!      u           =&gt; s % u % array
-!!!      v           =&gt; s % v % array
-      layerThickness  =&gt; s % layerThickness % array
-      normalVelocity       =&gt; s % normalVelocity % array
-
-      layerThicknessEdge      =&gt; s % layerThicknessEdge % 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
-!!!      vh          =&gt; s % vh % array
-
-      weightsOnEdge     =&gt; grid % weightsOnEdge % array
-      kiteAreasOnVertex =&gt; grid % kiteAreasOnVertex % array
-      cellsOnEdge       =&gt; grid % cellsOnEdge % array
-      cellsOnVertex     =&gt; grid % cellsOnVertex % array
-      verticesOnEdge    =&gt; grid % verticesOnEdge % array
-      nEdgesOnCell      =&gt; grid % nEdgesOnCell % array
-      edgesOnCell       =&gt; grid % edgesOnCell % array
-      nEdgesOnEdge      =&gt; grid % nEdgesOnEdge % array
-      edgesOnEdge       =&gt; grid % edgesOnEdge % array
-      edgesOnVertex     =&gt; grid % edgesOnVertex % array
-      dcEdge            =&gt; grid % dcEdge % array
-      dvEdge            =&gt; grid % dvEdge % array
-      areaCell          =&gt; grid % areaCell % array
-      areaTriangle      =&gt; grid % areaTriangle % array
-!!!      h_s               =&gt; grid % h_s % array
-!!!      fVertex           =&gt; grid % fVertex % array
-!!!      fEdge             =&gt; grid % fEdge % array
-
-      tend_layerThickness      =&gt; tend % layerThickness % array
-!      tend_u      =&gt; tend % u % array
-                  
-      nCells      = grid % nCells
-      nEdges      = grid % nEdges
-      nVertices   = grid % nVertices
-      nVertLevels = grid % nVertLevels
-
-!!!      u_src =&gt; grid % u_src % array
-
-      meshScalingDel2 =&gt; grid % meshScalingDel2 % array
-      meshScalingDel4 =&gt; grid % meshScalingDel4 % array
-
-
-      !
-      ! Compute height tendency for each cell
-      !
-      tend_layerThickness(:,:) = 0.0
-      do iEdge=1,nEdges
-         cell1 = cellsOnEdge(1,iEdge)
-         cell2 = cellsOnEdge(2,iEdge)
-         do k=1,nVertLevels
-            flux = normalVelocity(k,iEdge) * dvEdge(iEdge) * layerThicknessEdge(k,iEdge)
-            tend_layerThickness(k,cell1) = tend_layerThickness(k,cell1) - flux
-            tend_layerThickness(k,cell2) = tend_layerThickness(k,cell2) + flux
-         end do
-      end do 
-      do iCell=1,grid % nCellsSolve
-         do k=1,nVertLevels
-            tend_layerThickness(k,iCell) = tend_layerThickness(k,iCell) / areaCell(iCell)
-         end do
-      end do
-
-#ifdef LANL_FORMULATION
-      !
-      ! Compute u (normal) velocity tendency for each edge (cell face)
-      !
-!!!      tend_u(:,:) = 0.0
-!!!      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
-!!!            q = 0.0
-!!!            do j = 1,nEdgesOnEdge(iEdge)
-!!!               eoe = edgesOnEdge(j,iEdge)
-!!!               workpv = 0.5 * (pv_edge(k,iEdge) + pv_edge(k,eoe))
-!!!               q = q + weightsOnEdge(j,iEdge) * normalVelocity(k,eoe) * workpv * layerThicknessEdge(k,eoe)
-!!!            end do
-
-!!!            tend_normalVelocity(k,iEdge) =       &amp;
-!!!                              q     &amp;
-!!!                              - (   ke(k,cell2) - ke(k,cell1) + &amp;
-!!!                                    gravity * (h(k,cell2) + h_s(cell2) - h(k,cell1) - h_s(cell1)) &amp;
-!!!                                  ) / dcEdge(iEdge)
-!!!         end do
-!!!      end do
-
-
-#endif
-
-#ifdef NCAR_FORMULATION
-      !
-      ! Compute u (normal) velocity tendency for each edge (cell face)
-      !
-!!!      tend_u(:,:) = 0.0
-!!!      do iEdge=1,grid % nEdgesSolve
-!!!         vertex1 = verticesOnEdge(1,iEdge)
-!!!         vertex2 = verticesOnEdge(2,iEdge)
-!!!         cell1 = cellsOnEdge(1,iEdge)
-!!!         cell2 = cellsOnEdge(2,iEdge)
-
-!!!         do k=1,nVertLevels
-!!!            vorticity_abs = fEdge(iEdge) + (circulation(k,vertex1) + circulation(k,vertex2)) / &amp;
-!!!                                           (areaTriangle(vertex1) + areaTriangle(vertex2))
-
-!!!            workpv = 2.0 * vorticity_abs / (h(k,cell1) + h(k,cell2))
-
-!!!            tend_normalVelocity(k,iEdge) = workpv * vh(k,iEdge) - &amp;
-!!!                              (ke(k,cell2) - ke(k,cell1) + &amp;
-!!!                                 gravity * (h(k,cell2) + h_s(cell2) - h(k,cell1) - h_s(cell1)) &amp;
-!!!                              ) / &amp;
-!!!                              dcEdge(iEdge)
-!!!         end do
-!!!      end do
-#endif
-
-     ! Compute diffusion, computed as </font>
<font color="black">abla divergence - k \times </font>
<font color="red">abla vorticity
-     !                    only valid for visc == constant
-!!!     if (config_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
-!!!              u_diffusion =   ( divergence(k,cell2)  -  divergence(k,cell1) ) / dcEdge(iEdge) &amp;
-!!!                   -(vorticity(k,vertex2)  - vorticity(k,vertex1) ) / dvEdge(iEdge)
-!!!              u_diffusion = meshScalingDel2(iEdge) * config_h_mom_eddy_visc2 * u_diffusion
-!!!              tend_normalVelocity(k,iEdge) = tend_normalVelocity(k,iEdge) + u_diffusion
-!!!           end do
-!!!!        end do
-!!!     end if
-
-     !
-     ! velocity tendency: del4 dissipation, -</font>
<font color="black">u_4 </font>
<font color="red">abla^4 u
-     !   computed as </font>
<font color="black">abla^2 u = </font>
<font color="black">abla divergence + k \times </font>
<font color="red">abla vorticity
-     !   applied recursively.
-     !   strictly only valid for h_mom_eddy_visc4 == constant
-     !
-!!!     if (config_h_mom_eddy_visc4 &gt; 0.0) then
-!!!        allocate(delsq_divergence(nVertLevels, nCells+1))
-!!!        allocate(delsq_u(nVertLevels, nEdges+1))
-!!!        allocate(delsq_circulation(nVertLevels, nVertices+1))
-!!!        allocate(delsq_vorticity(nVertLevels, nVertices+1))
-
-!!!        delsq_u(:,:) = 0.0
-
-        ! Compute </font>
<font color="black">abla^2 u = </font>
<font color="black">abla divergence + k \times </font>
<font color="red">abla vorticity
-!!!        do iEdge=1,grid % nEdges
-!!!           cell1 = cellsOnEdge(1,iEdge)
-!!!           cell2 = cellsOnEdge(2,iEdge)
-!!!           vertex1 = verticesOnEdge(1,iEdge)
-!!!           vertex2 = verticesOnEdge(2,iEdge)
-
-!!!           do k=1,nVertLevels
-
-!!!              delsq_normalVelocity(k,iEdge) = ( divergence(k,cell2)  - divergence(k,cell1) ) / dcEdge(iEdge)  &amp;
-!!!                   -( vorticity(k,vertex2) - vorticity(k,vertex1)) / dvEdge(iEdge)
-
-!!!           end do
-!!!        end do
-
-        ! vorticity using </font>
<font color="red">abla^2 u
-!!!        delsq_circulation(:,:) = 0.0
-!!        do iEdge=1,nEdges
-!!!           vertex1 = verticesOnEdge(1,iEdge)
-!!!           vertex2 = verticesOnEdge(2,iEdge)
-!!!           do k=1,nVertLevels
-!!!              delsq_circulation(k,vertex1) = delsq_circulation(k,vertex1) &amp;
-!!!                   - dcEdge(iEdge) * delsq_u(k,iEdge)
-!!!              delsq_circulation(k,vertex2) = delsq_circulation(k,vertex2) &amp;
-!!!                   + dcEdge(iEdge) * delsq_u(k,iEdge)
-!!!           end do
-!!!        end do
-!!!        do iVertex=1,nVertices
-!!!           r = 1.0 / areaTriangle(iVertex)
-!!!           do k=1,nVertLevels
-!!!              delsq_vorticity(k,iVertex) = delsq_circulation(k,iVertex) * r
-!!!           end do
-!!!        end do
-
-        ! Divergence using </font>
<font color="red">abla^2 u
-!!!        delsq_divergence(:,:) = 0.0
-!!!        do iEdge=1,nEdges
-!!!           cell1 = cellsOnEdge(1,iEdge)
-!!!           cell2 = cellsOnEdge(2,iEdge)
-!!!           do k=1,nVertLevels
-!!!              delsq_divergence(k,cell1) = delsq_divergence(k,cell1) &amp;
-!!!                   + delsq_u(k,iEdge)*dvEdge(iEdge)
-!!!              delsq_divergence(k,cell2) = delsq_divergence(k,cell2) &amp;
-!!!                   - delsq_u(k,iEdge)*dvEdge(iEdge)
-!!!           end do
-!!!        end do
-!!!        do iCell = 1,nCells
-!!!           r = 1.0 / areaCell(iCell)
-!!!           do k = 1,nVertLevels
-!!!              delsq_divergence(k,iCell) = delsq_divergence(k,iCell) * r
-!!!           end do
-!!!        end do
-
-        ! Compute - \kappa </font>
<font color="red">abla^4 u 
-        ! as  </font>
<font color="black">abla div(</font>
<font color="black">abla^2 u) + k \times </font>
<font color="black">abla ( k \cross curl(</font>
<font color="red">abla^2 u) )
-!!!        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
-
-!!!              u_diffusion = (  delsq_divergence(k,cell2) &amp;
-!!!                   - delsq_divergence(k,cell1) ) / dcEdge(iEdge)  &amp;
-!!!                   -(  delsq_vorticity(k,vertex2) &amp;
-!!!                   - delsq_vorticity(k,vertex1) ) / dvEdge(iEdge)
-
-!!!              u_diffusion = meshScalingDel4(iEdge) * config_h_mom_eddy_visc4 * u_diffusion
-!!!              tend_u(k,iEdge) = tend_u(k,iEdge) - u_diffusion
-
-!!!           end do
-!!!        end do
-
-!!!        deallocate(delsq_divergence)
-!!!        deallocate(delsq_u)
-!!!        deallocate(delsq_circulation)
-!!!        deallocate(delsq_vorticity)
-
-!!!     end if
-
-     ! Compute u (velocity) tendency from wind stress (u_src)
-!!!     if(config_wind_stress) then
-!!!         do iEdge=1,grid % nEdges
-!!!            tend_u(1,iEdge) =  tend_u(1,iEdge) &amp;
-!!!                  + u_src(1,iEdge)/rho_ref/layerThicknessEdge(1,iEdge)
-!!!         end do
-!!!     endif
-
-!!!     if (config_bottom_drag) then
-!!!         do iEdge=1,grid % nEdges
-             ! bottom drag is the same as POP:
-             ! -c |u| u  where c is unitless and 1.0e-3.
-             ! see POP Reference guide, section 3.4.4.
-!!!             ke_edge = 0.5 * ( ke(1,cellsOnEdge(1,iEdge)) &amp;
-!!!                   + ke(1,cellsOnEdge(2,iEdge)))
-
-!!!             tend_u(1,iEdge) = tend_u(1,iEdge)  &amp;
-!!!                  - 1.0e-3*normalVelocity(1,iEdge) &amp;
-!!!                  *sqrt(2.0*ke_edge)/layerThicknessEdge(1,iEdge)
-!!!         end do
-!!!     endif

-   end subroutine land_ice_compute_tend
-
-   subroutine land_ice_compute_scalar_tend(tend, s, grid)
-   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
-   !
-   ! Input: s - current model state
-   !        grid - grid metadata
-   !
-   ! Output: tend - computed scalar tendencies
-   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
-
-      implicit none
-
-      type (tend_type), intent(inout) :: tend
-      type (state_type), intent(in) :: s
-      type (mesh_type), intent(in) :: grid
-
-      integer :: iCell, iEdge, k, iTracer, cell1, cell2, i
-      real (kind=RKIND) :: flux, tracer_edge, r
-      real (kind=RKIND) :: invAreaCell1, invAreaCell2, tracer_turb_flux
-      integer, dimension(:,:), pointer :: boundaryEdge
-      real (kind=RKIND), dimension(:,:), allocatable :: boundaryMask
-      real (kind=RKIND), dimension(:,:,:), allocatable:: delsq_tracer
-      
-      real (kind=RKIND) :: d2fdx2_cell1, d2fdx2_cell2
-      real (kind=RKIND), dimension(:), pointer :: dvEdge, dcEdge, areaCell
-      real (kind=RKIND), dimension(:,:,:), pointer :: tracers, tracer_tend
-      integer, dimension(:,:), pointer :: cellsOnEdge, boundaryCell
-      real (kind=RKIND), dimension(:,:,:), pointer :: deriv_two
-      real (kind=RKIND) :: coef_3rd_order
-      real (kind=RKIND), dimension(:,:), pointer :: normalVelocity, layerThicknessEdge
-
-      normalVelocity       =&gt; s % normalVelocity % array
-      layerThicknessEdge      =&gt; s % layerThicknessEdge % array
-      dcEdge      =&gt; grid % dcEdge % array
-      deriv_two   =&gt; grid % deriv_two % array
-      dvEdge      =&gt; grid % dvEdge % array
-      tracers     =&gt; s % tracers % array
-      cellsOnEdge =&gt; grid % cellsOnEdge % array
-      boundaryCell=&gt; grid % boundaryCell % array
-      boundaryEdge=&gt; grid % boundaryEdge % array
-      areaCell    =&gt; grid % areaCell % array
-      tracer_tend =&gt; tend % tracers % array
-
-      coef_3rd_order = 0.
-      if (config_tracer_adv_order == 3) coef_3rd_order = 1.0
-      if (config_tracer_adv_order == 3 .and. config_monotonic) coef_3rd_order = 0.25
-
-
-      tracer_tend(:,:,:) = 0.0
-
-      if (config_tracer_adv_order == 2) then
-
-      do iEdge=1,grid % nEdges
-            cell1 = cellsOnEdge(1,iEdge)
-            cell2 = cellsOnEdge(2,iEdge)
-            if (cell1 &lt;= grid%nCells .and. cell2 &lt;= grid%nCells) then
-               do k=1,grid % nVertLevels
-                  do iTracer=1,grid % nTracers
-                     tracer_edge = 0.5 * (tracers(iTracer,k,cell1) + tracers(iTracer,k,cell2))
-                     flux = normalVelocity(k,iEdge) * dvEdge(iEdge) * layerThicknessEdge(k,iEdge) * tracer_edge
-                     tracer_tend(iTracer,k,cell1) = tracer_tend(iTracer,k,cell1) - flux/areaCell(cell1)
-                     tracer_tend(iTracer,k,cell2) = tracer_tend(iTracer,k,cell2) + flux/areaCell(cell2)
-                  end do 
-               end do 
-            end if
-      end do 
-
-      else if (config_tracer_adv_order == 3) then
-
-         do iEdge=1,grid%nEdges
-            cell1 = cellsOnEdge(1,iEdge)
-            cell2 = cellsOnEdge(2,iEdge)
-
-            !-- if a cell not on the most outside ring of the halo
-            if (cell1 &lt;= grid%nCells .and. cell2 &lt;= grid%nCells) then
-
-               do k=1,grid % nVertLevels
-
-                  d2fdx2_cell1 = 0.0
-                  d2fdx2_cell2 = 0.0
-
-                  do iTracer=1,grid % nTracers

-                     !-- if not a boundary cell
-                     if(boundaryCell(k,cell1).eq.0.and.boundaryCell(k,cell2).eq.0) then
-
-                        d2fdx2_cell1 = deriv_two(1,1,iEdge) * tracers(iTracer,k,cell1)
-                        d2fdx2_cell2 = deriv_two(1,2,iEdge) * tracers(iTracer,k,cell2)
-
-                        !-- all edges of cell 1
-                        do i=1, grid % nEdgesOnCell % array (cell1)
-                                d2fdx2_cell1 = d2fdx2_cell1 + &amp;
-                                deriv_two(i+1,1,iEdge) * tracers(iTracer,k,grid % CellsOnCell % array (i,cell1))
-                        end do
-
-                        !-- all edges of cell 2
-                        do i=1, grid % nEdgesOnCell % array (cell2)
-                                d2fdx2_cell2 = d2fdx2_cell2 + &amp;
-                                deriv_two(i+1,2,iEdge) * tracers(iTracer,k,grid % CellsOnCell % array (i,cell2))
-                        end do
-
-                     endif
-
-                     !-- if u &gt; 0:
-                     if (normalVelocity(k,iEdge) &gt; 0) then
-                        flux = dvEdge(iEdge) * normalVelocity(k,iEdge) * layerThicknessEdge(k,iEdge) * (          &amp;
-                             0.5*(tracers(iTracer,k,cell1) + tracers(iTracer,k,cell2))      &amp;
-                             -(dcEdge(iEdge) **2) * (d2fdx2_cell1 + d2fdx2_cell2) / 12.          &amp;
-                             -(dcEdge(iEdge) **2) * coef_3rd_order*(d2fdx2_cell1 - d2fdx2_cell2) / 12. )
-                     !-- else u &lt;= 0:
-                     else
-                        flux = dvEdge(iEdge) *  normalVelocity(k,iEdge) * layerThicknessEdge(k,iEdge) * (          &amp;
-                             0.5*(tracers(iTracer,k,cell1) + tracers(iTracer,k,cell2))      &amp;
-                             -(dcEdge(iEdge) **2) * (d2fdx2_cell1 + d2fdx2_cell2) / 12.          &amp;
-                             +(dcEdge(iEdge) **2) * coef_3rd_order*(d2fdx2_cell1 - d2fdx2_cell2) / 12. )
-                     end if
-
-                     !-- update tendency
-                     tracer_tend(iTracer,k,cell1) = tracer_tend(iTracer,k,cell1) - flux/areaCell(cell1)
-                     tracer_tend(iTracer,k,cell2) = tracer_tend(iTracer,k,cell2) + flux/areaCell(cell2)
-                  enddo
-               end do
-            end if
-         end do
-
-      else  if (config_tracer_adv_order == 4) then
-
-         do iEdge=1,grid%nEdges
-            cell1 = cellsOnEdge(1,iEdge)
-            cell2 = cellsOnEdge(2,iEdge)
-
-            !-- if an edge is not on the outer-most ring of the halo
-            if (cell1 &lt;= grid%nCells .and. cell2 &lt;= grid%nCells) then
-
-               do k=1,grid % nVertLevels
-
-                  d2fdx2_cell1 = 0.0
-                  d2fdx2_cell2 = 0.0
-
-                  do iTracer=1,grid % nTracers
-
-                     !-- if not a boundary cell
-                     if(boundaryCell(k,cell1).eq.0.and.boundaryCell(k,cell2).eq.0) then
-
-                        d2fdx2_cell1 = deriv_two(1,1,iEdge) * tracers(iTracer,k,cell1)
-                        d2fdx2_cell2 = deriv_two(1,2,iEdge) * tracers(iTracer,k,cell2)
-
-                        !-- all edges of cell 1
-                        do i=1, grid % nEdgesOnCell % array (cell1)
-                                d2fdx2_cell1 = d2fdx2_cell1 + &amp;
-                                deriv_two(i+1,1,iEdge) * tracers(iTracer,k,grid % CellsOnCell % array (i,cell1))
-                        end do
-
-                        !-- all edges of cell 2
-                        do i=1, grid % nEdgesOnCell % array (cell2)
-                                d2fdx2_cell2 = d2fdx2_cell2 + &amp;
-                                deriv_two(i+1,2,iEdge) * tracers(iTracer,k,grid % CellsOnCell % array (i,cell2))
-                        end do
-
-                     endif
-
-                     flux = dvEdge(iEdge) *  normalVelocity(k,iEdge) * layerThicknessEdge(k,iEdge) * (          &amp;
-                          0.5*(tracers(iTracer,k,cell1) + tracers(iTracer,k,cell2))      &amp;
-                             -(dcEdge(iEdge) **2) * (d2fdx2_cell1 + d2fdx2_cell2) / 12. )
-
-                     !-- update tendency
-                     tracer_tend(iTracer,k,cell1) = tracer_tend(iTracer,k,cell1) - flux/areaCell(cell1)
-                     tracer_tend(iTracer,k,cell2) = tracer_tend(iTracer,k,cell2) + flux/areaCell(cell2)
-                  enddo
-               end do
-            end if
-         end do
-
-      endif   ! if (config_tracer_adv_order == 2 )
-
-      !
-      ! tracer tendency: del2 horizontal tracer diffusion, div(h \kappa_2 </font>
<font color="red">abla \phi)
-      !
-!!!      if ( config_h_tracer_eddy_diff2 &gt; 0.0 ) then
-
-         !
-         ! compute a boundary mask to enforce insulating boundary conditions in the horizontal
-         !
-!!!         allocate(boundaryMask(grid % nVertLevels, grid % nEdges+1))
-!!!         boundaryMask = 1.0
-!!!         where(boundaryEdge.eq.1) boundaryMask=0.0
-
-!!!         do iEdge=1,grid % nEdges
-!!!            cell1 = cellsOnEdge(1,iEdge)
-!!!            cell2 = cellsOnEdge(2,iEdge)
-!!!            invAreaCell1 = 1.0/areaCell(cell1)
-!!!            invAreaCell2 = 1.0/areaCell(cell2)
-
-!!!            do k=1,grid % nVertLevels
-!!!              do iTracer=1, grid % nTracers
-!!!                 ! \kappa_2 </font>
<font color="red">abla \phi on edge
-!!!                 tracer_turb_flux = config_h_tracer_eddy_diff2 &amp;
-!!!                    *( tracers(iTracer,k,cell2) - tracers(iTracer,k,cell1)) / dcEdge(iEdge)
-
-                 ! div(h \kappa_2 </font>
<font color="red">abla \phi) at cell center
-!!!                 flux = dvEdge(iEdge) * layerThicknessEdge(k,iEdge) * tracer_turb_flux * boundaryMask(k, iEdge)
-!!!                 tracer_tend(iTracer,k,cell1) = tracer_tend(iTracer,k,cell1) + flux * invAreaCell1
-!!!                 tracer_tend(iTracer,k,cell2) = tracer_tend(iTracer,k,cell2) - flux * invAreaCell2
-!!!              end do
-!!!            end do
-
-!!!         end do
-
-!!!        deallocate(boundaryMask)
-
-!!!      end if
-
-      !
-      ! tracer tendency: del4 horizontal tracer diffusion, &amp;
-      !    div(h \kappa_4 </font>
<font color="black">abla [div(h </font>
<font color="red">abla \phi)])
-      !
-!!!      if ( config_h_tracer_eddy_diff4 &gt; 0.0 ) then
-
-         !
-         ! compute a boundary mask to enforce insulating boundary conditions in the horizontal
-         !
-!!!         allocate(boundaryMask(grid % nVertLevels, grid % nEdges+1))
-!!!         boundaryMask = 1.0
-!!!         where(boundaryEdge.eq.1) boundaryMask=0.0
-
-!!!         allocate(delsq_tracer(grid % nTracers, grid % nVertLevels, grid % nCells+1))
-
-!!!         delsq_tracer(:,:,:) = 0.
-
-         ! first del2: div(h </font>
<font color="red">abla \phi) at cell center
-!!!         do iEdge=1,grid % nEdges
-!!!            cell1 = cellsOnEdge(1,iEdge)
-!!!            cell2 = cellsOnEdge(2,iEdge)
-
-!!!            do k=1,grid % nVertLevels
-!!!              do iTracer=1, grid % nTracers
-!!!                 delsq_tracer(iTracer,k,cell1) = delsq_tracer(iTracer,k,cell1) &amp;
-!!!                    + dvEdge(iEdge) * layerThicknessEdge(k,iEdge) * (tracers(iTracer,k,cell2) - tracers(iTracer,k,cell1)) / dcEdge(iEdge) * boundaryMask(k,iEdge)
-!!!                 delsq_tracer(iTracer,k,cell2) = delsq_tracer(iTracer,k,cell2) &amp;
-!!!                    - dvEdge(iEdge) * layerThicknessEdge(k,iEdge) * (tracers(iTracer,k,cell2) - tracers(iTracer,k,cell1)) / dcEdge(iEdge) * boundaryMask(k,iEdge)
-!!!              end do
-!!!            end do
-
-!!!         end do
-
-!!!         do iCell = 1, grid % nCells
-!!!            r = 1.0 / grid % areaCell % array(iCell)
-!!!            do k=1,grid % nVertLevels
-!!!            do iTracer=1,grid % nTracers
-!!!               delsq_tracer(iTracer,k,iCell) = delsq_tracer(iTracer,k,iCell) * r
-!!!            end do
-!!!            end do
-!!!         end do
-
-         ! second del2: div(h </font>
<font color="gray">abla [delsq_tracer]) at cell center
-!!!         do iEdge=1,grid % nEdges
-!!!            cell1 = grid % cellsOnEdge % array(1,iEdge)
-!!!            cell2 = grid % cellsOnEdge % array(2,iEdge)
-!!!            invAreaCell1 = 1.0 / grid % areaCell % array(cell1)
-!!!            invAreaCell2 = 1.0 / grid % areaCell % array(cell2)
-
-!!!            do k=1,grid % nVertLevels
-!!!            do iTracer=1,grid % nTracers
-!!!               tracer_turb_flux = config_h_tracer_eddy_diff4 * (delsq_tracer(iTracer,k,cell2) - delsq_tracer(iTracer,k,cell1)) / dcEdge(iEdge)
-!!!               flux = dvEdge(iEdge) * tracer_turb_flux
-!!!               tracer_tend(iTracer,k,cell1) = tracer_tend(iTracer,k,cell1) - flux * invAreaCell1 * boundaryMask(k,iEdge)
-!!!               tracer_tend(iTracer,k,cell2) = tracer_tend(iTracer,k,cell2) + flux * invAreaCell2 * boundaryMask(k,iEdge)
-!!!            end do
-!!!            enddo
-
-!!!         end do
-
-!!!         deallocate(delsq_tracer)
-!!!         deallocate(boundaryMask)
-
-!!!      end if
-
-   end subroutine land_ice_compute_scalar_tend
-
-
-   subroutine land_ice_compute_solve_diagnostics(dt, s, grid)
-   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
-   ! Compute diagnostic fields used in the tendency computations
-   !
-   ! Input: grid - grid metadata
-   !
-   ! Output: s - computed diagnostics
-   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
-
-      implicit none
-
-      real (kind=RKIND), intent(in) :: dt
-      type (state_type), intent(inout) :: s
-      type (mesh_type), intent(in) :: grid
-
-
-      integer :: iEdge, iCell, iVertex, k, cell1, cell2, vertex1, vertex2, eoe, i, j, cov
-      real (kind=RKIND) :: flux  !!!, vorticity_abs, workpv
-
-      integer :: nCells, nEdges, nVertices, nVertLevels
-      real (kind=RKIND), dimension(:), pointer :: dvEdge, dcEdge, areaCell, areaTriangle
-!!!      real (kind=RKIND), dimension(:), pointer :: h_s, fVertex, fEdge
-!!!      real (kind=RKIND), dimension(:,:), pointer :: vh
-      real (kind=RKIND), dimension(:,:), pointer :: weightsOnEdge, kiteAreasOnVertex, layerThicknessEdge, &amp;
-                                                    layerThickness, normalVelocity, tend_layerThickness, &amp;
-!!!      real (kind=RKIND), dimension(:,:), pointer :: vh, weightsOnEdge, kiteAreasOnVertex, layerThicknessEdge, h, u, v, tend_h, tend_u, &amp;
-!!!                                                    circulation, vorticity, ke, pv_edge, pv_vertex, pv_cell, &amp;
-!!!                                                    gradPVn, gradPVt, divergence, vorticity_cell, &amp;
-                                                    layerThicknessVertex
-      integer, dimension(:,:), pointer :: cellsOnEdge, cellsOnVertex, verticesOnEdge,  &amp;
-                                          edgesOnCell, edgesOnEdge, edgesOnVertex,     &amp;
-                                          boundaryEdge, boundaryCell
-      integer, dimension(:), pointer :: nEdgesOnCell, nEdgesOnEdge
-      real (kind=RKIND) :: r, h1, h2
-      real (kind=RKIND) :: d2fdx2_cell1, d2fdx2_cell2
-      real (kind=RKIND), dimension(:,:,:), pointer :: deriv_two
-      real (kind=RKIND) :: coef_3rd_order
-
-      layerThickness  =&gt; s % layerThickness % array
-      normalVelocity       =&gt; s % normalVelocity % array
-!!!      v           =&gt; s % v % array
-!!!      vh          =&gt; s % vh % array
-      layerThicknessEdge      =&gt; s % layerThicknessEdge % array
-      layerThicknessVertex    =&gt; s % layerThicknessVertex % array
-      tend_layerThickness =&gt; s % layerThickness % array
-!!!      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
-!!!      pv_cell     =&gt; s % pv_cell % array
-!!!      vorticity_cell =&gt; s % vorticity_cell % array
-!!!      gradPVn     =&gt; s % gradPVn % array
-!!!      gradPVt     =&gt; s % gradPVt % array
-
-      weightsOnEdge     =&gt; grid % weightsOnEdge % array
-      kiteAreasOnVertex =&gt; grid % kiteAreasOnVertex % array
-      cellsOnEdge       =&gt; grid % cellsOnEdge % array
-      cellsOnVertex     =&gt; grid % cellsOnVertex % array
-      verticesOnEdge    =&gt; grid % verticesOnEdge % array
-      nEdgesOnCell      =&gt; grid % nEdgesOnCell % array
-      edgesOnCell       =&gt; grid % edgesOnCell % array
-      nEdgesOnEdge      =&gt; grid % nEdgesOnEdge % array
-      edgesOnEdge       =&gt; grid % edgesOnEdge % array
-      edgesOnVertex     =&gt; grid % edgesOnVertex % array
-      dcEdge            =&gt; grid % dcEdge % array
-      dvEdge            =&gt; grid % dvEdge % array
-      areaCell          =&gt; grid % areaCell % array
-      areaTriangle      =&gt; grid % areaTriangle % array
-!!!      h_s               =&gt; grid % h_s % array
-!!!      fVertex           =&gt; grid % fVertex % array
-!!!      fEdge             =&gt; grid % fEdge % array
-      deriv_two         =&gt; grid % deriv_two % array
-                  
-      nCells      = grid % nCells
-      nEdges      = grid % nEdges
-      nVertices   = grid % nVertices
-      nVertLevels = grid % nVertLevels
-
-      boundaryEdge =&gt; grid % boundaryEdge % array
-      boundaryCell =&gt; grid % boundaryCell % array
-
-      !
-      ! Find those cells that have an edge on the boundary
-      !
-      boundaryCell(:,:) = 0
-      do iEdge=1,nEdges
-       do k=1,nVertLevels
-         if(boundaryEdge(k,iEdge).eq.1) then
-           cell1 = cellsOnEdge(1,iEdge)
-           cell2 = cellsOnEdge(2,iEdge)
-           boundaryCell(k,cell1) = 1
-           boundaryCell(k,cell2) = 1
-         endif
-       enddo
-      enddo
-
-      !
-      ! Compute height on cell edges at velocity locations
-      !   Namelist options control the order of accuracy of the reconstructed layerThicknessEdge value
-      !
-
-      coef_3rd_order = 0.
-      if (config_thickness_adv_order == 3) coef_3rd_order = 1.0
-      if (config_thickness_adv_order == 3 .and. config_monotonic) coef_3rd_order = 0.25
-
-      if (config_thickness_adv_order == 2) then
-
-         do iEdge=1,grid % nEdges
-            cell1 = cellsOnEdge(1,iEdge)
-            cell2 = cellsOnEdge(2,iEdge)
-            if (cell1 &lt;= grid%nCells .and. cell2 &lt;= grid%nCells) then
-               do k=1,grid % nVertLevels
-                  layerThicknessEdge(k,iEdge) = 0.5 * (layerThickness(k,cell1) + layerThickness(k,cell2))
-               end do 
-            end if
-         end do 
-
-      else if (config_thickness_adv_order == 3) then
-
-         do iEdge=1,grid%nEdges
-            cell1 = cellsOnEdge(1,iEdge)
-            cell2 = cellsOnEdge(2,iEdge)
-
-            !-- if a cell not on the most outside ring of the halo
-            if (cell1 &lt;= grid%nCells .and. cell2 &lt;= grid%nCells) then
-
-               do k=1,grid % nVertLevels
-
-                  d2fdx2_cell1 = 0.0
-                  d2fdx2_cell2 = 0.0
-
-                  !-- if not a boundary cell
-                  if(boundaryCell(k,cell1).eq.0.and.boundaryCell(k,cell2).eq.0) then
-
-                     d2fdx2_cell1 = deriv_two(1,1,iEdge) * layerThickness(k,cell1)
-                     d2fdx2_cell2 = deriv_two(1,2,iEdge) * layerThickness(k,cell2)
-
-                     !-- all edges of cell 1
-                     do i=1, grid % nEdgesOnCell % array (cell1)
-                             d2fdx2_cell1 = d2fdx2_cell1 + &amp;
-                             deriv_two(i+1,1,iEdge) * layerThickness(k,grid % CellsOnCell % array (i,cell1))
-                     end do
-
-                     !-- all edges of cell 2
-                     do i=1, grid % nEdgesOnCell % array (cell2)
-                             d2fdx2_cell2 = d2fdx2_cell2 + &amp;
-                             deriv_two(i+1,2,iEdge) * layerThickness(k,grid % CellsOnCell % array (i,cell2))
-                     end do
-
-                  endif
-
-                  !-- if u &gt; 0:
-                  if (normalVelocity(k,iEdge) &gt; 0) then
-                     layerThicknessEdge(k,iEdge) =     &amp;
-                          0.5*(layerThickness(k,cell1) + layerThickness(k,cell2))      &amp;
-                          -(dcEdge(iEdge) **2) * (d2fdx2_cell1 + d2fdx2_cell2) / 12.          &amp;
-                          -(dcEdge(iEdge) **2) * coef_3rd_order*(d2fdx2_cell1 - d2fdx2_cell2) / 12.
-                  !-- else normalVelocity &lt;= 0:
-                  else
-                     layerThicknessEdge(k,iEdge) =     &amp;
-                          0.5*(layerThickness(k,cell1) + layerThickness(k,cell2))      &amp;
-                          -(dcEdge(iEdge) **2) * (d2fdx2_cell1 + d2fdx2_cell2) / 12.          &amp;
-                          +(dcEdge(iEdge) **2) * coef_3rd_order*(d2fdx2_cell1 - d2fdx2_cell2) / 12.
-                  end if
-
-               end do   ! do k
-            end if      ! if (cell1 &lt;=
-         end do         ! do iEdge
-
-      else  if (config_thickness_adv_order == 4) then
-
-         do iEdge=1,grid%nEdges
-            cell1 = cellsOnEdge(1,iEdge)
-            cell2 = cellsOnEdge(2,iEdge)
-
-            !-- if a cell not on the most outside ring of the halo
-            if (cell1 &lt;= grid%nCells .and. cell2 &lt;= grid%nCells) then
-
-               do k=1,grid % nVertLevels
-
-                  d2fdx2_cell1 = 0.0
-                  d2fdx2_cell2 = 0.0
-
-                  !-- if not a boundary cell
-                  if(boundaryCell(k,cell1).eq.0.and.boundaryCell(k,cell2).eq.0) then
-
-                     d2fdx2_cell1 = deriv_two(1,1,iEdge) * layerThickness(k,cell1)
-                     d2fdx2_cell2 = deriv_two(1,2,iEdge) * layerThickness(k,cell2)
-
-                     !-- all edges of cell 1
-                     do i=1, grid % nEdgesOnCell % array (cell1)
-                             d2fdx2_cell1 = d2fdx2_cell1 + &amp;
-                             deriv_two(i+1,1,iEdge) * layerThickness(k,grid % CellsOnCell % array (i,cell1))
-                     end do
-
-                     !-- all edges of cell 2
-                     do i=1, grid % nEdgesOnCell % array (cell2)
-                             d2fdx2_cell2 = d2fdx2_cell2 + &amp;
-                             deriv_two(i+1,2,iEdge) * layerThickness(k,grid % CellsOnCell % array (i,cell2))
-                     end do
-
-                  endif
-
-                  layerThicknessEdge(k,iEdge) =   &amp;
-                       0.5*(layerThickness(k,cell1) + layerThickness(k,cell2))      &amp;
-                          -(dcEdge(iEdge) **2) * (d2fdx2_cell1 + d2fdx2_cell2) / 12.
-
-               end do   ! do k
-            end if      ! if (cell1 &lt;=
-         end do         ! do iEdge
-
-      endif   ! if(config_thickness_adv_order == 2)
-
-      !
-      ! set the velocity in the nEdges+1 slot to zero, this is a dummy address
-      !    used to when reading for edges that do not exist
-      !
-      normalVelocity(:,nEdges+1) = 0.0
-
-      !
-      ! Compute circulation and relative vorticity at each vertex
-      !
-!!!      circulation(:,:) = 0.0
-!!!      do iEdge=1,nEdges
-!!!         do k=1,nVertLevels
-!!!            circulation(k,verticesOnEdge(1,iEdge)) = circulation(k,verticesOnEdge(1,iEdge)) - dcEdge(iEdge) * normalVelocity(k,iEdge)
-!!!            circulation(k,verticesOnEdge(2,iEdge)) = circulation(k,verticesOnEdge(2,iEdge)) + dcEdge(iEdge) * normalVelocity(k,iEdge)
-!!!         end do
-!!!      end do
-!!!      do iVertex=1,nVertices
-!!!         do k=1,nVertLevels
-!!!            vorticity(k,iVertex) = circulation(k,iVertex) / areaTriangle(iVertex)
-!!!         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 &lt;= nCells) then
-!!!            do k=1,nVertLevels
-!!!              divergence(k,cell1) = divergence(k,cell1) + normalVelocity(k,iEdge)*dvEdge(iEdge)
-!!!            enddo
-!!!         endif
-!!!         if(cell2 &lt;= nCells) then
-!!!            do k=1,nVertLevels
-!!!              divergence(k,cell2) = divergence(k,cell2) - normalVelocity(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
-!!!      do iCell=1,nCells
-!!!         do i=1,nEdgesOnCell(iCell)
-!!!            iEdge = edgesOnCell(i,iCell)
-!!!            do k=1,nVertLevels
-!!!               ke(k,iCell) = ke(k,iCell) + 0.25 * dcEdge(iEdge) * dvEdge(iEdge) * normalVelocity(k,iEdge)**2.0
-!!!            end do
-!!!         end do
-!!!         do k=1,nVertLevels
-!!!            ke(k,iCell) = ke(k,iCell) / areaCell(iCell)
-!!!         end do
-!!!      end do
-
-      !
-      ! Compute v (tangential) velocities
-      !
-!!!      v(:,:) = 0.0
-!!!      do iEdge = 1,nEdges
-!!!         do i=1,nEdgesOnEdge(iEdge)
-!!!            eoe = edgesOnEdge(i,iEdge)
-!!!            do k = 1,nVertLevels
-!!!               v(k,iEdge) = v(k,iEdge) + weightsOnEdge(i,iEdge) * normalVelocity(k, eoe)
-!!!            end do
-!!!         end do
-!!!      end do
-
-#ifdef NCAR_FORMULATION
-      !
-      ! Compute mass fluxes tangential to each edge (i.e., through the faces of dual grid cells)
-      !
-!!!      vh(:,:) = 0.0
-!!!      do iEdge=1,grid % nEdgesSolve
-!!!         do j=1,nEdgesOnEdge(iEdge)
-!!!            eoe = edgesOnEdge(j,iEdge)
-!!!            do k=1,nVertLevels
-!!!               vh(k,iEdge) = vh(k,iEdge) + weightsOnEdge(j,iEdge) * normalVelocity(k,eoe) * layerThicknessEdge(k,eoe)
-!!!            end do
-!!!         end do
-!!!      end do
-#endif
-
-
-      !
-      ! Compute height at vertices, pv at vertices, and average pv to edge locations
-      !  ( this computes pv_vertex at all vertices bounding real cells and distance-1 ghost cells )
-      !
-      do iVertex = 1,nVertices
-         do k=1,nVertLevels
-            layerThicknessVertex(k,iVertex) = 0.0
-            do i=1,grid % vertexDegree
-               layerThicknessVertex(k,iVertex) = layerThicknessVertex(k,iVertex) + layerThickness(k,cellsOnVertex(i,iVertex)) * kiteAreasOnVertex(i,iVertex)
-            end do
-            layerThicknessVertex(k,iVertex) = layerThicknessVertex(k,iVertex) / areaTriangle(iVertex)
-
-!!!            pv_vertex(k,iVertex) = (fVertex(iVertex) + vorticity(k,iVertex)) / layerThicknessVertex(k,iVertex)
-         end do
-      end do
-
-
-      !
-      ! Compute gradient of PV in the tangent direction
-      !   ( this computes gradPVt at all edges bounding real cells and distance-1 ghost cells )
-      !
-!!!      do iEdge = 1,nEdges
-!!!         do k = 1,nVertLevels
-!!!           gradPVt(k,iEdge) = (pv_vertex(k,verticesOnEdge(2,iEdge)) - pv_vertex(k,verticesOnEdge(1,iEdge))) / &amp;
-!!!                              dvEdge(iEdge)
-!!!         enddo
-!!!      enddo
-
-      !
-      ! Compute pv at the edges
-      !   ( this computes pv_edge at all edges bounding real cells )
-      !
-!!!      pv_edge(:,:) = 0.0
-!!!      do iVertex = 1,nVertices
-!!!        do i=1,grid % vertexDegree
-!!!           iEdge = edgesOnVertex(i,iVertex)
-!!!           do k=1,nVertLevels
-!!!              pv_edge(k,iEdge) =  pv_edge(k,iEdge)  + 0.5 * pv_vertex(k,iVertex)
-!!!           end do
-!!!        end do
-!!!      end do
-
-
-      !
-      ! Modify PV edge with upstream bias. 
-      !
-!!!      do iEdge = 1,nEdges
-!!!         do k = 1,nVertLevels
-!!!           pv_edge(k,iEdge) = pv_edge(k,iEdge) - config_apvm_upwinding * v(k,iEdge) * dt * gradPVt(k,iEdge)
-!!!         enddo
-!!!      enddo
-
-
-      !
-      ! Compute pv at cell centers
-      !    ( this computes pv_cell for all real cells and distance-1 ghost cells )
-      !
-!!!      pv_cell(:,:) = 0.0
-!!!      vorticity_cell(:,:) = 0.0
-!!!      do iVertex = 1, nVertices
-!!!       do i=1,grid % vertexDegree
-!!!         iCell = cellsOnVertex(i,iVertex)
-!!!         if (iCell &lt;= nCells) then
-!!!           do k = 1,nVertLevels
-!!!             pv_cell(k,iCell) = pv_cell(k,iCell) + kiteAreasOnVertex(i, iVertex) * pv_vertex(k, iVertex) / areaCell(iCell)
-!!!             vorticity_cell(k,iCell) = vorticity_cell(k,iCell) + kiteAreasOnVertex(i, iVertex) * vorticity(k, iVertex) / areaCell(iCell)
-!!!           enddo
-!!!         endif
-!!!       enddo
-!!!      enddo
-
-
-      !
-      ! Compute gradient of PV in normal direction
-      !   ( this computes gradPVn for all edges bounding real cells )
-      !
-!!!      gradPVn(:,:) = 0.0
-!!!      do iEdge = 1,nEdges
-!!!        if( cellsOnEdge(1,iEdge) &lt;= nCells .and. cellsOnEdge(2,iEdge) &lt;= nCells) then
-!!!          do k = 1,nVertLevels
-!!!            gradPVn(k,iEdge) = (pv_cell(k,cellsOnEdge(2,iEdge)) - pv_cell(k,cellsOnEdge(1,iEdge))) / &amp;
-!!!                                 dcEdge(iEdge)
-!!!          enddo
-!!!        endif
-!!!      enddo
-
-      ! Modify PV edge with upstream bias.
-      !
-!!!      do iEdge = 1,nEdges
-!!!         do k = 1,nVertLevels
-!!!           pv_edge(k,iEdge) = pv_edge(k,iEdge) - config_apvm_upwinding * normalVelocity(k,iEdge) * dt * gradPVn(k,iEdge)
-!!!         enddo
-!!!      enddo
-
-      !
-      ! set pv_edge = fEdge / layerThicknessEdge at boundary points
-      !
-   !  if (maxval(boundaryEdge).ge.0) then
-   !  do iEdge = 1,nEdges
-   !     cell1 = cellsOnEdge(1,iEdge)
-   !     cell2 = cellsOnEdge(2,iEdge)
-   !     do k = 1,nVertLevels
-   !       if(boundaryEdge(k,iEdge).eq.1) then
-   !         v(k,iEdge) = 0.0
-   !         if(cell1.gt.0) then
-   !            h1 = layerThickness(k,cell1)
-   !            pv_edge(k,iEdge) = fEdge(iEdge) / h1
-   !            layerThicknessEdge(k,iEdge) = h1
-   !         else
-   !            h2 = layerThickness(k,cell2)
-   !            pv_edge(k,iEdge) = fEdge(iEdge) / h2
-   !            layerThicknessEdge(k,iEdge) = h2
-   !         endif
-   !       endif
-   !     enddo
-   !  enddo
-   !  endif
-
-
-   end subroutine land_ice_compute_solve_diagnostics
-
-
-   subroutine land_ice_enforce_boundary_edge(tend, grid)
-   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-   ! Enforce any boundary conditions on the normal velocity at each edge
-   !
-   ! Input: grid - grid metadata
-   !
-   ! Output: tend_u set to zero at boundaryEdge == 1 locations
-   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-
-      implicit none
-
-      type (tend_type), intent(inout) :: tend
-      type (mesh_type), intent(in) :: grid
-
-      integer, dimension(:,:), pointer :: boundaryEdge
-      real (kind=RKIND), dimension(:,:), pointer :: tend_u
-      integer :: nCells, nEdges, nVertices, nVertLevels
-      integer :: iEdge, k
-
-      nCells      = grid % nCells
-      nEdges      = grid % nEdges
-      nVertices   = grid % nVertices
-      nVertLevels = grid % nVertLevels
-
-      boundaryEdge         =&gt; grid % boundaryEdge % array
-!!!      tend_u               =&gt; tend % u % array
-
-      if(maxval(boundaryEdge).le.0) return
-
-      do iEdge = 1,nEdges
-        do k = 1,nVertLevels
-
-          if(boundaryEdge(k,iEdge).eq.1) then
-!!!             tend_u(k,iEdge) = 0.0
-          endif
-
-        enddo
-       enddo
-
-   end subroutine land_ice_enforce_boundary_edge
-
-
 end module land_ice_time_integration

Modified: branches/land_ice_projects/test_cases/dome/visualize_dome.py
===================================================================
--- branches/land_ice_projects/test_cases/dome/visualize_dome.py        2012-03-07 22:50:57 UTC (rev 1603)
+++ branches/land_ice_projects/test_cases/dome/visualize_dome.py        2012-03-07 23:27:50 UTC (rev 1604)
@@ -55,6 +55,8 @@
 xCell = f.variables['xCell']
 yCell = f.variables['yCell']
 temperature = f.variables['temperature']
+lowerSurface = f.variables['lowerSurface']
+upperSurface = f.variables['upperSurface']
 
 vert_levs = f.dimensions['nVertLevels']
 
@@ -92,6 +94,19 @@
 plt.draw()
 
 fig = plt.figure(2)
+ax = fig.add_subplot(121, aspect='equal')
+plt.scatter(xCell[:], yCell[:], 80, lowerSurface[time_slice,:], marker='h', edgecolors='none')
+plt.colorbar()
+plt.title('lower surface at time ' + str(time_slice) )
+plt.draw()
+ax = fig.add_subplot(122, aspect='equal')
+plt.scatter(xCell[:], yCell[:], 80, upperSurface[time_slice,:], marker='h', edgecolors='none')
+plt.colorbar()
+plt.title('upper surface at time ' + str(time_slice) )
+plt.draw()
+
+
+fig = plt.figure(3)
 for templevel in xrange(0,vert_levs+2):
     ax = fig.add_subplot(3,4,templevel+1, aspect='equal')
     var_slice = temperature[time_slice,:,templevel]

</font>
</pre>