<p><b>mpetersen@lanl.gov</b> 2011-11-08 07:33:59 -0700 (Tue, 08 Nov 2011)</p><p>Remove implicit barotropic momentum decay and barotropic viscous damping.  These worked correctly, but never really helped improve the barotropic solver.<br>
</p><hr noshade><pre><font color="gray">
Property changes on: branches/ocean_projects/split_explicit_mrp
___________________________________________________________________
Modified: svn:mergeinfo
   - /branches/ocean_projects/imp_vert_mix_mrp:754-986
/branches/ocean_projects/split_explicit_timestepping:1044-1097
/branches/ocean_projects/vert_adv_mrp:704-745
/branches/source_renaming:1082-1113
/branches/time_manager:924-962
   + /branches/ocean_projects/imp_vert_mix_mrp:754-986
/branches/ocean_projects/split_explicit_timestepping:1044-1097
/branches/ocean_projects/vert_adv_mrp:704-745
/branches/source_renaming:1082-1113
/branches/time_manager:924-962
/trunk/mpas:1134-1178

Modified: branches/ocean_projects/split_explicit_mrp/Makefile
===================================================================
--- branches/ocean_projects/split_explicit_mrp/Makefile        2011-11-07 22:52:37 UTC (rev 1178)
+++ branches/ocean_projects/split_explicit_mrp/Makefile        2011-11-08 14:33:59 UTC (rev 1179)
@@ -1,6 +1,7 @@
 #MODEL_FORMULATION = -DNCAR_FORMULATION
 MODEL_FORMULATION = -DLANL_FORMULATION
 
+# This flag must be off for nersc hopper:
 FILE_OFFSET = -DOFFSET64BIT
 
 #########################
@@ -56,6 +57,18 @@
         &quot;CORE = $(CORE)&quot; \
         &quot;CPPFLAGS = -DRKIND=8 $(MODEL_FORMULATION) -D_MPI -DUNDERSCORE $(FILE_OFFSET) $(ZOLTAN_DEFINE)&quot; )
 
+pgi-nersc:
+        ( make all \
+        &quot;FC = ftn&quot; \
+        &quot;CC = cc&quot; \
+        &quot;SFC = ftn&quot; \
+        &quot;SCC = cc&quot; \
+        &quot;FFLAGS = -r8 -O3 -byteswapio -Mfree&quot; \
+        &quot;CFLAGS = -O3&quot; \
+        &quot;LDFLAGS = -O3&quot; \
+        &quot;CORE = $(CORE)&quot; \
+        &quot;CPPFLAGS = -DRKIND=8 $(MODEL_FORMULATION) -D_MPI -DUNDERSCORE $(FILE_OFFSET) $(ZOLTAN_DEFINE)&quot; )
+
 pgi-llnl:
         ( make all \
         &quot;FC = mpipgf90&quot; \
@@ -178,7 +191,42 @@
         &quot;CORE = $(CORE)&quot; \
         &quot;CPPFLAGS = -DRKIND=8 $(MODEL_FORMULATION) -DUNDERSCORE $(FILE_OFFSET) $(ZOLTAN_DEFINE)&quot; )
 
+pathscale-nersc:
+        ( make all \
+        &quot;FC = ftn&quot; \
+        &quot;CC = cc&quot; \
+        &quot;SFC = ftn&quot; \
+        &quot;SCC = cc&quot; \
+        &quot;FFLAGS = -r8 -O3 -freeform -extend-source&quot; \
+        &quot;CFLAGS = -O3&quot; \
+        &quot;LDFLAGS = -O3&quot; \
+        &quot;CORE = $(CORE)&quot; \
+        &quot;CPPFLAGS = -DRKIND=8 $(MODEL_FORMULATION) -D_MPI -DUNDERSCORE $(FILE_OFFSET) $(ZOLTAN_DEFINE)&quot; )
 
+cray-nersc:
+        ( make all \
+        &quot;FC = ftn&quot; \
+        &quot;CC = cc&quot; \
+        &quot;SFC = ftn&quot; \
+        &quot;SCC = cc&quot; \
+        &quot;FFLAGS = -default64 -O3 -f free&quot; \
+        &quot;CFLAGS = -O3&quot; \
+        &quot;LDFLAGS = -O3&quot; \
+        &quot;CORE = $(CORE)&quot; \
+        &quot;CPPFLAGS = -DRKIND=8 $(MODEL_FORMULATION) -D_MPI -DUNDERSCORE $(FILE_OFFSET) $(ZOLTAN_DEFINE)&quot; )
+
+intel-nersc:
+        ( make all \
+        &quot;FC = ftn&quot; \
+        &quot;CC = cc&quot; \
+        &quot;SFC = ftn&quot; \
+        &quot;SCC = cc&quot; \
+        &quot;FFLAGS = -real-size 64 -O3 -FR&quot; \
+        &quot;CFLAGS = -O3&quot; \
+        &quot;LDFLAGS = -O3&quot; \
+        &quot;CORE = $(CORE)&quot; \
+        &quot;CPPFLAGS = -DRKIND=8 $(MODEL_FORMULATION) -D_MPI -DUNDERSCORE $(FILE_OFFSET) $(ZOLTAN_DEFINE)&quot; )
+
 CPPINCLUDES = -I../inc -I$(NETCDF)/include -I$(PAPI)/include
 FCINCLUDES = -I../inc -I$(NETCDF)/include -I$(PAPI)/include
 LIBS = -L$(NETCDF)/lib -lnetcdf $(PAPILIBS)

Modified: branches/ocean_projects/split_explicit_mrp/namelist.input.ocean
===================================================================
--- branches/ocean_projects/split_explicit_mrp/namelist.input.ocean        2011-11-07 22:52:37 UTC (rev 1178)
+++ branches/ocean_projects/split_explicit_mrp/namelist.input.ocean        2011-11-08 14:33:59 UTC (rev 1179)
@@ -31,9 +31,6 @@
    config_n_btr_cor_iter = 2
    config_u_correction = .true.
    config_filter_btr_mode = .false.
-   config_btr_mom_decay  = .false.
-   config_btr_mom_decay_time =   3600.0
-   config_btr_mom_eddy_visc2 =   0.0
    config_btr_subcycle_loop_factor =  2
    config_SSH_from =  'avg_flux'
    config_new_btr_variables_from = 'btr_avg'

Modified: branches/ocean_projects/split_explicit_mrp/namelist.input.sw
===================================================================
--- branches/ocean_projects/split_explicit_mrp/namelist.input.sw        2011-11-07 22:52:37 UTC (rev 1178)
+++ branches/ocean_projects/split_explicit_mrp/namelist.input.sw        2011-11-08 14:33:59 UTC (rev 1179)
@@ -1,9 +1,9 @@
 &amp;sw_model
    config_test_case = 5
    config_time_integration = 'RK4'
-   config_dt = 200.0
+   config_dt = 172.8
    config_start_time = '0000-01-01_00:00:00'
-   config_run_duration = '00_05:00:00'
+   config_run_duration = '15_00:00:00'
    config_stats_interval = 0
    config_h_ScaleWithMesh = .false.
    config_h_mom_eddy_visc2  = 0.0
@@ -23,7 +23,7 @@
    config_input_name = 'grid.nc'
    config_output_name = 'output.nc'
    config_restart_name = 'restart.nc'
-   config_output_interval = '0_01:00:00'
+   config_output_interval = '1_00:00:00'
    config_frames_per_outfile = 0
 /
 

Modified: branches/ocean_projects/split_explicit_mrp/src/core_hyd_atmos/mpas_atmh_mpas_core.F
===================================================================
--- branches/ocean_projects/split_explicit_mrp/src/core_hyd_atmos/mpas_atmh_mpas_core.F        2011-11-07 22:52:37 UTC (rev 1178)
+++ branches/ocean_projects/split_explicit_mrp/src/core_hyd_atmos/mpas_atmh_mpas_core.F        2011-11-08 14:33:59 UTC (rev 1179)
@@ -4,7 +4,6 @@
    use mpas_timekeeping
 
    type (io_output_object) :: restart_obj
-   integer :: restart_frame
 
    integer :: current_outfile_frames
 
@@ -48,7 +47,6 @@
          block =&gt; block % next
       end do
 
-      restart_frame = 1
       current_outfile_frames = 0
 
    end subroutine mpas_core_init
@@ -108,9 +106,11 @@
 
          if (mpas_is_alarm_ringing(clock, restartAlarmID, ierr=ierr)) then
             call mpas_reset_clock_alarm(clock, restartAlarmID, ierr=ierr)
-            if (restart_frame == 1) call mpas_output_state_init(restart_obj, domain, &quot;RESTART&quot;)
-            call mpas_output_state_for_domain(restart_obj, domain, restart_frame)
-            restart_frame = restart_frame + 1
+
+            ! Write one restart time per file
+            call mpas_output_state_init(restart_obj, domain, &quot;RESTART&quot;, trim(timeStamp))
+            call mpas_output_state_for_domain(restart_obj, domain, 1)
+            call mpas_output_state_finalize(restart_obj, domain % dminfo)
          end if
 
       end do
@@ -124,12 +124,9 @@
    
       implicit none
   
+      type (domain_type), intent(inout) :: domain 
       integer :: ierr
  
-      type (domain_type), intent(inout) :: domain 
-
-      if (restart_frame &gt; 1) call mpas_output_state_finalize(restart_obj, domain % dminfo)
-
       call mpas_destroy_clock(clock, ierr)
 
    end subroutine mpas_core_finalize

Modified: branches/ocean_projects/split_explicit_mrp/src/core_ocean/Registry
===================================================================
--- branches/ocean_projects/split_explicit_mrp/src/core_ocean/Registry        2011-11-07 22:52:37 UTC (rev 1178)
+++ branches/ocean_projects/split_explicit_mrp/src/core_ocean/Registry        2011-11-08 14:33:59 UTC (rev 1179)
@@ -21,16 +21,13 @@
 namelist character grid     config_vert_grid_type      isopycnal
 namelist real      grid     config_rho0                1028
 namelist integer   split_explicit_ts config_n_ts_iter     2
-namelist integer   split_explicit_ts config_n_bcl_iter_beg   4
-namelist integer   split_explicit_ts config_n_bcl_iter_mid   4
-namelist integer   split_explicit_ts config_n_bcl_iter_end   4
-namelist integer   split_explicit_ts config_n_btr_subcycles  10
-namelist integer   split_explicit_ts config_n_btr_cor_iter  1
+namelist integer   split_explicit_ts config_n_bcl_iter_beg   2
+namelist integer   split_explicit_ts config_n_bcl_iter_mid   2
+namelist integer   split_explicit_ts config_n_bcl_iter_end   2
+namelist integer   split_explicit_ts config_n_btr_subcycles  20
+namelist integer   split_explicit_ts config_n_btr_cor_iter  2
 namelist logical   split_explicit_ts config_u_correction true
 namelist logical   split_explicit_ts config_filter_btr_mode false
-namelist logical   split_explicit_ts config_btr_mom_decay         false 
-namelist real      split_explicit_ts config_btr_mom_decay_time    3600.0
-namelist real      split_explicit_ts config_btr_mom_eddy_visc2    0.0
 namelist integer   split_explicit_ts config_btr_subcycle_loop_factor  2
 namelist character split_explicit_ts config_SSH_from  avg_flux
 namelist character split_explicit_ts config_new_btr_variables_from  btr_avg
@@ -44,6 +41,7 @@
 namelist logical   hmix     config_visc_vorticity_term true
 namelist real      hmix     config_visc_vorticity_visc2_scale 1.0
 namelist real      hmix     config_visc_vorticity_visc4_scale 1.0
+namelist logical   hmix     config_include_KE_vertex false
 namelist real      hmix     config_h_tracer_eddy_diff2  0.0
 namelist real      hmix     config_h_tracer_eddy_diff4  0.0
 namelist real      hmix     config_apvm_upwinding       0.5
@@ -224,6 +222,8 @@
 var persistent real    h_edge ( nVertLevels nEdges Time ) 2 - h_edge state - -
 var persistent real    h_vertex ( nVertLevels nVertices Time ) 2 - h_vertex state - -
 var persistent real    ke ( nVertLevels nCells Time ) 2 o ke state - -
+var persistent real    kev ( nVertLevels nVertices Time ) 2 o kev state - -
+var persistent real    kevc ( nVertLevels nCells Time ) 2 o kevc state - -
 var persistent real    ke_edge ( nVertLevels nEdges Time ) 2 - ke_edge state - -
 var persistent real    pv_vertex ( nVertLevels nVertices Time ) 2 - pv_vertex state - -
 var persistent real    pv_cell ( nVertLevels nCells Time ) 2 - pv_cell state - -

Modified: branches/ocean_projects/split_explicit_mrp/src/core_ocean/mpas_ocn_mpas_core.F
===================================================================
--- branches/ocean_projects/split_explicit_mrp/src/core_ocean/mpas_ocn_mpas_core.F        2011-11-07 22:52:37 UTC (rev 1178)
+++ branches/ocean_projects/split_explicit_mrp/src/core_ocean/mpas_ocn_mpas_core.F        2011-11-08 14:33:59 UTC (rev 1179)
@@ -24,7 +24,6 @@
    use ocn_vmix
 
    type (io_output_object) :: restart_obj
-   integer :: restart_frame
 
    integer :: current_outfile_frames
 
@@ -80,7 +79,7 @@
       call ocn_equation_of_state_init(err_tmp)
       err = err .or. err_tmp
 
-      if(err) then
+      if(err.eq.1) then
           call mpas_dmpar_abort(dminfo)
       endif
 
@@ -133,7 +132,6 @@
    !   call mpas_output_state_init(output_obj, domain, &quot;OUTPUT&quot;)
    !   call write_output_frame(output_obj, domain)
 
-      restart_frame = 1
       current_outfile_frames = 0
 
    end subroutine mpas_core_init!}}}
@@ -330,9 +328,11 @@
 
          if (mpas_is_alarm_ringing(clock, restartAlarmID, ierr=ierr)) then
             call mpas_reset_clock_alarm(clock, restartAlarmID, ierr=ierr)
-            if (restart_frame == 1) call mpas_output_state_init(restart_obj, domain, &quot;RESTART&quot;)
-            call mpas_output_state_for_domain(restart_obj, domain, restart_frame)
-            restart_frame = restart_frame + 1
+
+            ! Write one restart time per file
+            call mpas_output_state_init(restart_obj, domain, &quot;RESTART&quot;, trim(timeStamp))
+            call mpas_output_state_for_domain(restart_obj, domain, 1)
+            call mpas_output_state_finalize(restart_obj, domain % dminfo)
          end if
 
       end do
@@ -749,12 +749,9 @@
    
       implicit none
 
+      type (domain_type), intent(inout) :: domain 
       integer :: ierr
 
-      type (domain_type), intent(inout) :: domain 
-
-      if (restart_frame &gt; 1) call mpas_output_state_finalize(restart_obj, domain % dminfo)
-
       call mpas_destroy_clock(clock, ierr)
 
    end subroutine mpas_core_finalize!}}}

Modified: branches/ocean_projects/split_explicit_mrp/src/core_ocean/mpas_ocn_tendency.F
===================================================================
--- branches/ocean_projects/split_explicit_mrp/src/core_ocean/mpas_ocn_tendency.F        2011-11-07 22:52:37 UTC (rev 1178)
+++ branches/ocean_projects/split_explicit_mrp/src/core_ocean/mpas_ocn_tendency.F        2011-11-08 14:33:59 UTC (rev 1179)
@@ -620,7 +620,7 @@
         weightsOnEdge, kiteAreasOnVertex, h_edge, h, u, v, w, pressure,&amp;
         circulation, vorticity, ke, ke_edge, MontPot, wTop, &amp;
         pv_edge, pv_vertex, pv_cell, gradPVn, gradPVt, divergence, &amp;
-        rho, temperature, salinity
+        rho, temperature, salinity, kev, kevc
       real (kind=RKIND), dimension(:,:,:), pointer :: tracers
       real (kind=RKIND), dimension(:), allocatable:: pTop
       real (kind=RKIND), dimension(:,:), allocatable:: div_u
@@ -648,6 +648,8 @@
       vorticity   =&gt; s % vorticity % array
       divergence  =&gt; s % divergence % array
       ke          =&gt; s % ke % array
+      kev         =&gt; s % kev % array
+      kevc        =&gt; s % kevc % array
       ke_edge     =&gt; s % ke_edge % array
       pv_edge     =&gt; s % pv_edge % array
       pv_vertex   =&gt; s % pv_vertex % array
@@ -880,6 +882,41 @@
       enddo
 
       !
+      ! Compute kinetic energy in each vertex
+      !
+      kev(:,:) = 0.0; kevc(:,:) = 0.0
+      do iEdge=1,nEdges
+         do k=1,nVertLevels
+            kev(k,verticesOnEdge(1,iEdge)) = kev(k,verticesOnEdge(1,iEdge)) + dcEdge(iEdge) * dvEdge(iEdge) * u(k,iEdge)**2
+            kev(k,verticesOnEdge(2,iEdge)) = kev(k,verticesOnEdge(2,iEdge)) + dcEdge(iEdge) * dvEdge(iEdge) * u(k,iEdge)**2
+         end do
+      end do
+      do iVertex = 1,nVertices
+         do k=1,nVertLevels
+           kev(k,iVertex) = kev(k,iVertex) / areaTriangle(iVertex) / 4.0
+         enddo
+      enddo
+      do iVertex = 1, nVertices
+       do i=1,grid % vertexDegree
+         iCell = cellsOnVertex(i,iVertex)
+         do k=1,nVertLevels
+           kevc(k,iCell) = kevc(k,iCell) + kiteAreasOnVertex(i, iVertex) * kev(k, iVertex) / areaCell(iCell)
+         enddo
+       enddo
+      enddo
+
+      !
+      ! Compute kinetic energy in each cell by blending ke and kevc
+      !
+      if(config_include_KE_vertex) then
+      do iCell=1,nCells
+         do k=1,nVertLevels
+            ke(k,iCell) = 5.0/8.0*ke(k,iCell) + 3.0/8.0*kevc(k,iCell)
+         end do
+      end do
+      endif
+
+      !
       ! Compute v (tangential) velocities
       !
       v(:,:) = 0.0

Modified: branches/ocean_projects/split_explicit_mrp/src/core_ocean/mpas_ocn_test_cases.F
===================================================================
--- branches/ocean_projects/split_explicit_mrp/src/core_ocean/mpas_ocn_test_cases.F        2011-11-07 22:52:37 UTC (rev 1178)
+++ branches/ocean_projects/split_explicit_mrp/src/core_ocean/mpas_ocn_test_cases.F        2011-11-08 14:33:59 UTC (rev 1179)
@@ -483,7 +483,7 @@
       real (kind=RKIND), intent(in) :: theta
 
       aa = 0.5 * w * (2.0 * omega + w) * cos(theta)**2.0 + &amp;
-          0.25 * K**2.0 * cos(theta)**(2.0*R) * ((R+1.0)*cos(theta)**2.0 + 2.0*R**2.0 - R - 2.0 - 2.0*R**2*cos(theta)**-2.0)
+          0.25 * K**2.0 * cos(theta)**(2.0*R) * ((R+1.0)*cos(theta)**2.0 + 2.0*R**2.0 - R - 2.0 - 2.0*R**2*cos(theta)**(-2.0))
 
    end function aa
 

Modified: branches/ocean_projects/split_explicit_mrp/src/core_ocean/mpas_ocn_time_integration_split.F
===================================================================
--- branches/ocean_projects/split_explicit_mrp/src/core_ocean/mpas_ocn_time_integration_split.F        2011-11-07 22:52:37 UTC (rev 1178)
+++ branches/ocean_projects/split_explicit_mrp/src/core_ocean/mpas_ocn_time_integration_split.F        2011-11-08 14:33:59 UTC (rev 1179)
@@ -390,24 +390,6 @@
 
          end do
 
-         !  Implicit solve for barotropic momentum decay
-         if ( config_btr_mom_decay) then
-            !
-            !  Add term to RHS of momentum equation: -1/gamma u
-            !
-            !  This changes the solve to:
-            !  u^{n+1} = u_provis^{n+1}/(1+dt/gamma)
-            !
-            coef = 1.0/(1.0 + dt/config_n_btr_subcycles/config_btr_mom_decay_time)
-            do iEdge=1,block % mesh % nEdges
-                block % state % time_levs(newBtrSubcycleTime) % state % uBtrSubcycle % array(iEdge) &amp;
-              = block % state % time_levs(newBtrSubcycleTime) % state % uBtrSubcycle % array(iEdge) &amp;
-              * coef
-            end do
-
-          endif
-
-
                block =&gt; block % next
             end do  ! block
 
@@ -501,86 +483,7 @@
             end do  ! block
 
 
-! mrp 110801 begin
-! This whole section, bounded by 'mrp 110801', may be deleted later if it is found
-! that barotropic del2 is not useful.
             !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-            ! Barotropic subcycle: compute btr_divergence and btr_vorticity for del2(u_btr) 
-            !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-            block =&gt; domain % blocklist
-            do while (associated(block))
-      block % state % time_levs(1) % state % u_diffusionBtr % array(:) = 0.0
-      if ( config_btr_mom_eddy_visc2 &gt; 0.0 ) then
-      !
-      ! Compute circulation and relative vorticity at each vertex
-      !
-      block % state % time_levs(1) % state % circulationBtr % array(:) = 0.0
-      do iEdge=1,block % mesh % nEdges
-         vertex1 = block % mesh % verticesOnEdge % array(1,iEdge)
-         vertex2 = block % mesh % verticesOnEdge % array(2,iEdge)
-             block % state % time_levs(1) % state % circulationBtr % array(vertex1) &amp;
-           = block % state % time_levs(1) % state % circulationBtr % array(vertex1) &amp;
-           - block % mesh % dcEdge % array (iEdge) &amp;
-            *block % state % time_levs(oldBtrSubcycleTime) % state % uBtrSubcycle % array(iEdge)
-
-             block % state % time_levs(1) % state % circulationBtr % array(vertex2) &amp;
-           = block % state % time_levs(1) % state % circulationBtr % array(vertex2) &amp;
-           + block % mesh % dcEdge % array (iEdge) &amp;
-            *block % state % time_levs(oldBtrSubcycleTime) % state % uBtrSubcycle % array(iEdge)
-      end do 
-      do iVertex=1,block % mesh % nVertices
-            block % state % time_levs(1) % state % vorticityBtr % array(iVertex) &amp;
-          = block % state % time_levs(1) % state % circulationBtr % array(iVertex) / block % mesh % areaTriangle % array (iVertex)
-      end do
-
-      !
-      ! Compute the divergence at each cell center
-      !
-      block % state % time_levs(1) % state % divergenceBtr % array(:) = 0.0
-      do iEdge=1,block % mesh % nEdges
-         cell1 = block % mesh % cellsOnEdge % array(1,iEdge)
-         cell2 = block % mesh % cellsOnEdge % array(2,iEdge)
-             block % state % time_levs(1) % state % divergenceBtr % array (cell1) &amp;
-           = block % state % time_levs(1) % state % divergenceBtr % array (cell1) &amp;
-           + block % state % time_levs(oldBtrSubcycleTime) % state % uBtrSubcycle % array(iEdge) &amp;
-            *block % mesh % dvEdge % array(iEdge)
-
-             block % state % time_levs(1) % state % divergenceBtr % array (cell2) &amp;
-           = block % state % time_levs(1) % state % divergenceBtr % array (cell2) &amp;
-           - block % state % time_levs(oldBtrSubcycleTime) % state % uBtrSubcycle % array(iEdge) &amp;
-            *block % mesh % dvEdge % array(iEdge)
-      end do
-      do iCell = 1,block % mesh % nCells
-         block % state % time_levs(1) % state % divergenceBtr % array(iCell) &amp;
-       = block % state % time_levs(1) % state % divergenceBtr % array(iCell) &amp;
-        /block % mesh % areaCell % array(iCell)
-      enddo
-
-      !
-      ! Compute Btr diffusion
-      !
-         do iEdge=1,block % mesh % nEdgesSolve
-            cell1 = block % mesh % cellsOnEdge % array(1,iEdge)
-            cell2 = block % mesh % cellsOnEdge % array(2,iEdge)
-            vertex1 = block % mesh % verticesOnEdge % array(1,iEdge)
-            vertex2 = block % mesh % verticesOnEdge % array(2,iEdge)
-
-               ! Here -( vorticityBtr(vertex2) - vorticityBtr(vertex1) ) / dvEdge % array (iEdge)
-               ! is - </font>
<font color="red">abla vorticity pointing from vertex 2 to vertex 1, or equivalently 
-               !    + k \times </font>
<font color="gray">abla vorticity pointing from cell1 to cell2.
-
-               block % state % time_levs(1) % state % u_diffusionBtr % array(iEdge) = block % mesh % meshScalingDel2 % array (iEdge) * config_btr_mom_eddy_visc2 * &amp;
-                   (( block % state % time_levs(1) % state % divergenceBtr % array(cell2)  - block % state % time_levs(1) % state % divergenceBtr % array(cell1) ) / block % mesh % dcEdge % array (iEdge)  &amp;
-                  -( block % state % time_levs(1) % state % vorticityBtr % array(vertex2) - block % state % time_levs(1) % state % vorticityBtr % array(vertex1) ) / block % mesh % dvEdge % array (iEdge))
-
-         end do
-      end if
-               block =&gt; block % next
-            end do  ! block
-! mrp 110801 end
-
-
-            !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
             ! Barotropic subcycle: Final solve for velocity.  Iterate for Coriolis term.
             !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -636,22 +539,6 @@
 
          end do
 
-            !  Implicit solve for barotropic momentum decay
-         if ( config_btr_mom_decay) then
-            !  Add term to RHS of momentum equation: -1/gamma u
-            !
-            !  This changes the solve to:
-            !  u^{n+1} = u_provis^{n+1}/(1+dt/gamma)
-            !
-            coef = 1.0/(1.0 + dt/config_n_btr_subcycles/config_btr_mom_decay_time)
-            do iEdge=1,block % mesh % nEdges 
-                block % state % time_levs(newBtrSubcycleTime) % state % uBtrSubcycle % array(iEdge) &amp; 
-              = block % state % time_levs(newBtrSubcycleTime) % state % uBtrSubcycle % array(iEdge) &amp;
-              * coef
-            end do
-
-         endif
-
                block =&gt; block % next
             end do  ! block
 

Modified: branches/ocean_projects/split_explicit_mrp/src/core_sw/mpas_sw_mpas_core.F
===================================================================
--- branches/ocean_projects/split_explicit_mrp/src/core_sw/mpas_sw_mpas_core.F        2011-11-07 22:52:37 UTC (rev 1178)
+++ branches/ocean_projects/split_explicit_mrp/src/core_sw/mpas_sw_mpas_core.F        2011-11-08 14:33:59 UTC (rev 1179)
@@ -4,7 +4,6 @@
    use mpas_timekeeping
 
    type (io_output_object) :: restart_obj
-   integer :: restart_frame
    integer :: current_outfile_frames
 
    type (MPAS_Clock_type) :: clock
@@ -46,7 +45,6 @@
          block =&gt; block % next
       end do
 
-      restart_frame = 1
       current_outfile_frames = 0
 
    end subroutine mpas_core_init
@@ -200,9 +198,11 @@
 
          if (mpas_is_alarm_ringing(clock, restartAlarmID, ierr=ierr)) then
             call mpas_reset_clock_alarm(clock, restartAlarmID, ierr=ierr)
-            if (restart_frame == 1) call mpas_output_state_init(restart_obj, domain, &quot;RESTART&quot;)
-            call mpas_output_state_for_domain(restart_obj, domain, restart_frame)
-            restart_frame = restart_frame + 1
+
+            ! Write one restart time per file
+            call mpas_output_state_init(restart_obj, domain, &quot;RESTART&quot;, trim(timeStamp))
+            call mpas_output_state_for_domain(restart_obj, domain, 1)
+            call mpas_output_state_finalize(restart_obj, domain % dminfo)
          end if
 
       end do
@@ -337,14 +337,11 @@
    
       implicit none
 
+      type (domain_type), intent(inout) :: domain 
       integer :: ierr

+     call mpas_destroy_clock(clock, ierr)
 
-      type (domain_type), intent(inout) :: domain 
-
-      if (restart_frame &gt; 1) call mpas_output_state_finalize(restart_obj, domain % dminfo)
-
-      call mpas_destroy_clock(clock, ierr)
-
    end subroutine mpas_core_finalize
 
 

Modified: branches/ocean_projects/split_explicit_mrp/src/framework/mpas_io_input.F
===================================================================
--- branches/ocean_projects/split_explicit_mrp/src/framework/mpas_io_input.F        2011-11-07 22:52:37 UTC (rev 1178)
+++ branches/ocean_projects/split_explicit_mrp/src/framework/mpas_io_input.F        2011-11-08 14:33:59 UTC (rev 1179)
@@ -128,9 +128,17 @@
       type (MPAS_TimeInterval_type) :: timeDiff
       type (MPAS_TimeInterval_type) :: minTimeDiff
       character(len=32) :: timeStamp
+      character(len=1024) :: filename
 
       if (config_do_restart) then
-         input_obj % filename = trim(config_restart_name)
+
+         ! this get followed by set is to ensure that the time is in standard format
+         call mpas_set_time(curr_time=startTime, dateTimeString=config_start_time)
+         call mpas_get_time(curr_time=startTime, dateTimeString=timeStamp)
+
+         call mpas_insert_string_suffix(trim(config_restart_name), timeStamp, filename)
+
+         input_obj % filename = trim(filename)
          input_obj % stream = STREAM_RESTART
       else
          input_obj % filename = trim(config_input_name)
@@ -772,6 +780,12 @@
                end if
             end do
 
+            ! require restart time to exactly match start time (this error should never be reached as we have by this point opened the restart file with a name containing the startTime)
+            if(sliceTime /= startTime) then
+               write(0,*) &quot;Error: restart file &quot;, filename, &quot; did not contain time &quot;, config_start_time
+               call mpas_dmpar_abort(domain % dminfo)
+            end if
+
             timeStamp = xtime % array(input_obj % time)
 
             deallocate(xtime % ioinfo)
@@ -1004,6 +1018,29 @@
    end subroutine mpas_input_state_for_domain
 
 
+   !CR:TODO: an identical subroutine is found in module_io_output - merge
+   subroutine mpas_insert_string_suffix(stream, suffix, filename)
+
+      implicit none
+
+      character (len=*), intent(in) :: stream
+      character (len=*), intent(in) :: suffix
+      character (len=*), intent(out) :: filename
+      integer :: length, i
+
+      filename = trim(stream) // '.' // trim(suffix)
+
+      length = len_trim(stream)
+      do i=length-1,1,-1
+         if(stream(i:i) == '.') then
+            filename = trim(stream(:i)) // trim(suffix) // trim(stream(i:))
+            exit
+         end if
+      end do
+
+   end subroutine mpas_insert_string_suffix
+
+
    subroutine mpas_read_and_distribute_fields(dminfo, input_obj, block, &amp;
                                      readCellsStart, readCellsCount, &amp;
                                      readEdgesStart, readEdgesCount, &amp;

Modified: branches/ocean_projects/split_explicit_mrp/src/framework/mpas_io_output.F
===================================================================
--- branches/ocean_projects/split_explicit_mrp/src/framework/mpas_io_output.F        2011-11-07 22:52:37 UTC (rev 1178)
+++ branches/ocean_projects/split_explicit_mrp/src/framework/mpas_io_output.F        2011-11-08 14:33:59 UTC (rev 1179)
@@ -94,7 +94,12 @@
          output_obj % filename = trim(tempfilename)
          output_obj % stream = OUTPUT
       else if (trim(stream) == 'RESTART') then
-         output_obj % filename = trim(config_restart_name)
+         if(present(outputSuffix)) then
+            call mpas_insert_string_suffix(config_restart_name, outputSuffix, tempfilename)
+         else
+            tempfilename = config_restart_name
+         end if
+         output_obj % filename = trim(tempfilename)
          output_obj % stream = RESTART
       else if (trim(stream) == 'SFC') then
          ! Keep filename as whatever was set by the user

Modified: branches/ocean_projects/split_explicit_mrp/src/framework/mpas_timekeeping.F
===================================================================
--- branches/ocean_projects/split_explicit_mrp/src/framework/mpas_timekeeping.F        2011-11-07 22:52:37 UTC (rev 1178)
+++ branches/ocean_projects/split_explicit_mrp/src/framework/mpas_timekeeping.F        2011-11-08 14:33:59 UTC (rev 1179)
@@ -615,7 +615,7 @@
       implicit none
       
       type (MPAS_Clock_type), intent(in) :: clock
-      type (MPAS_Alarm_type), pointer, intent(in) :: alarmPtr
+      type (MPAS_Alarm_type), pointer :: alarmPtr
       type (MPAS_TimeInterval_type), intent(in), optional :: interval
       integer, intent(out), optional :: ierr
       

Modified: branches/ocean_projects/split_explicit_mrp/src/framework/mpas_timer.F
===================================================================
--- branches/ocean_projects/split_explicit_mrp/src/framework/mpas_timer.F        2011-11-07 22:52:37 UTC (rev 1178)
+++ branches/ocean_projects/split_explicit_mrp/src/framework/mpas_timer.F        2011-11-08 14:33:59 UTC (rev 1179)
@@ -33,7 +33,7 @@
         subroutine mpas_timer_start(timer_name, clear_timer, timer_ptr)!{{{
           character (len=*), intent (in) :: timer_name !&lt; Input: name of timer, stored as name of timer
           logical, optional, intent(in) :: clear_timer !&lt; Input: flag to clear timer
-          type (timer_node), optional, pointer, intent(out) :: timer_ptr !&lt; Output: pointer to store timer in module
+          type (timer_node), optional, pointer :: timer_ptr !&lt; Output: pointer to store timer in module
 
           logical :: timer_added, timer_found, string_equal, check_flag
           type (timer_node), pointer :: current, temp
@@ -151,7 +151,7 @@
        
         subroutine mpas_timer_stop(timer_name, timer_ptr)!{{{
           character (len=*), intent(in) :: timer_name !&lt; Input: name of timer to stop
-          type (timer_node), pointer, intent(in), optional :: timer_ptr !&lt; Input: pointer to timer, for stopping
+          type (timer_node), pointer, optional :: timer_ptr !&lt; Input: pointer to timer, for stopping
 
           type (timer_node), pointer :: current
           
@@ -219,8 +219,8 @@
         end subroutine mpas_timer_stop!}}}
 
         recursive subroutine mpas_timer_write(timer_ptr, total_ptr)!{{{
-          type (timer_node), pointer, intent(inout), optional :: timer_ptr
-          type (timer_node), pointer, intent(in), optional :: total_ptr
+          type (timer_node), pointer, optional :: timer_ptr
+          type (timer_node), pointer, optional :: total_ptr
           character (len=10) :: tname
 
           logical :: total_found, string_equals

</font>
</pre>