<p><b>mpetersen@lanl.gov</b> 2011-05-18 15:01:25 -0600 (Wed, 18 May 2011)</p><p>Linear Coriolis term, f*u^{perp} was separated out of the eta*u term.  This revision works with config_n_bcl_iter_beg&gt;1.  Tested using config_n_bcl_iter_beg = 1, 2, 10.<br>
</p><hr noshade><pre><font color="gray">Modified: branches/ocean_projects/timesplitting_mrp/src/core_ocean/module_time_integration.F
===================================================================
--- branches/ocean_projects/timesplitting_mrp/src/core_ocean/module_time_integration.F        2011-05-18 20:48:10 UTC (rev 842)
+++ branches/ocean_projects/timesplitting_mrp/src/core_ocean/module_time_integration.F        2011-05-18 21:01:25 UTC (rev 843)
@@ -500,6 +500,9 @@
          do while (associated(block))
            allocate(G(block % mesh % nVertLevels))
 
+           ! Put f*uBcl^{perp} in uNew as a work variable
+           call compute_f_uperp(block % state % time_levs(2) % state , block % mesh)
+
            do iEdge=1,block % mesh % nEdges
               G = 0.0  ! could put this after with G(maxleveledgetop+1:nvertlevels)=0
               do k=1,block % mesh % maxLevelEdgeTop % array(iEdge)
@@ -507,7 +510,12 @@
 
 ! This soon, with coriolis:
 !                G(k) = -fEdge(iEdge)*uBclPerp(k,iEdge) + tend_u(k,iEdge)
-                 G(k) = block % tend % u % array (k,iEdge)
+                 ! Here uNew is a work variable containing -fEdge(iEdge)*uBclPerp(k,iEdge)
+! mrp temp new one:
+                 G(k) = block % state % time_levs(2) % state % u % array (k,iEdge) &amp;
+                      + block % tend % u % array (k,iEdge)
+! mrp old one:
+!                 G(k) = block % tend % u % array (k,iEdge)
 
 !             GBtrForcing(iEdge) = GBtrForcing(iEdge) + hOld(k,iEdge)* G(k))
 
@@ -528,6 +536,7 @@
            enddo
 
            deallocate(G)
+
            block =&gt; block % next
          end do
 
@@ -536,10 +545,17 @@
            call dmpar_exch_halo_field2dReal(domain % dminfo, block % state % time_levs(2) % state % uBcl % array(:,:), &amp;
                                             block % mesh % nVertLevels, block % mesh % nEdges, &amp;
                                             block % parinfo % edgesToSend, block % parinfo % edgesToRecv)
+
+! printing:
+         nCells      = block % mesh % nCells
+         nEdges      = block % mesh % nEdges
+print *, 'ubcl, j= ',j,minval(block % state % time_levs(2) % state % uBcl % array(:,1:nEdges)),&amp;
+                   maxval(block % state % time_levs(2) % state % uBcl % array(:,1:nEdges))
+
            block =&gt; block % next
         end do
 
-      enddo  ! config_n_bcl_iter
+      enddo  ! do j=1,config_n_bcl_iter
 !print *, '5'
 
 
@@ -586,7 +602,7 @@
            call compute_scalar_tend(block % tend, block % state % time_levs(2) % state , block % diagnostics, block % mesh)
 
 ! printing:
-!         nCells      = block % mesh % nCells
+         nCells      = block % mesh % nCells
 print *, 'h_tend ',minval(block % tend % h % array(1,1:nCells)),&amp;
                    maxval(block % tend % h % array(1,1:nCells))
 print *, 'tr_tend',minval(block % tend % tracers % array(3,1,1:nCells)),&amp;
@@ -1315,7 +1331,119 @@
 
    end subroutine compute_tend_u
 
+      ! Put f*uBcl^{perp} in u as a work variable
+   subroutine compute_f_uperp(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 (state_type), intent(inout) :: s
+      type (mesh_type), intent(in) :: grid
+
+! mrp 110512 I just split compute_tend into compute_tend_u and compute_tend_h.
+!  Some of these variables can be removed, but at a later time.
+      integer :: iEdge, iCell, iVertex, k, cell1, cell2, &amp;
+        vertex1, vertex2, eoe, i, j
+
+      integer :: nCells, nEdges, nVertices, nVertLevels, nEdgesSolve
+      real (kind=RKIND) :: flux, vorticity_abs, h_vertex, workpv, q, &amp;
+        upstream_bias, wTopEdge, rho0Inv, r
+      real (kind=RKIND), dimension(:), pointer :: &amp;
+        h_s, fVertex, fEdge, dvEdge, dcEdge, areaCell, areaTriangle, &amp;
+        zMidZLevel, zTopZLevel 
+      real (kind=RKIND), dimension(:,:), pointer :: &amp;
+        weightsOnEdge, kiteAreasOnVertex, h_edge, h, u, uBcl, v, pressure, &amp;
+        tend_u, circulation, vorticity, ke, ke_edge, pv_edge, &amp;
+        MontPot, wTop, divergence, vertViscTopOfEdge
+      type (dm_info) :: dminfo
+
+      integer, dimension(:), pointer :: nEdgesOnCell, nEdgesOnEdge, &amp;
+        maxLevelCell, maxLevelEdgeTop, maxLevelVertexBot
+      integer, dimension(:,:), pointer :: &amp;
+        cellsOnEdge, cellsOnVertex, verticesOnEdge, edgesOnCell, &amp;
+        edgesOnEdge, edgesOnVertex
+      real (kind=RKIND) :: u_diffusion
+      real (kind=RKIND), dimension(:), allocatable:: fluxVertTop,w_dudzTopEdge
+
+      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
+
+      h           =&gt; s % h % array
+      u           =&gt; s % u % array
+      uBcl        =&gt; s % uBcl % array
+      v           =&gt; s % v % array
+      wTop        =&gt; s % wTop % array
+      h_edge      =&gt; s % h_edge % array
+      circulation =&gt; s % circulation % array
+      vorticity   =&gt; s % vorticity % array
+      divergence  =&gt; s % divergence % array
+      ke          =&gt; s % ke % array
+      ke_edge     =&gt; s % ke_edge % array
+      pv_edge     =&gt; s % pv_edge % array
+      MontPot     =&gt; s % MontPot % array
+      pressure    =&gt; s % pressure % 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
+      zMidZLevel        =&gt; grid % zMidZLevel % array
+      zTopZLevel        =&gt; grid % zTopZLevel % array
+      maxLevelCell      =&gt; grid % maxLevelCell % array
+      maxLevelEdgeTop      =&gt; grid % maxLevelEdgeTop % array
+      maxLevelVertexBot    =&gt; grid % maxLevelVertexBot % array
+
+                  
+      nCells      = grid % nCells
+      nEdges      = grid % nEdges
+      nEdgesSolve = grid % nEdgesSolve
+      nVertices   = grid % nVertices
+      nVertLevels = grid % nVertLevels
+
+      !
+      ! Put f*uBcl^{perp} in u as a work variable
+      !
+      do iEdge=1,grid % nEdgesSolve
+         cell1 = cellsOnEdge(1,iEdge)
+         cell2 = cellsOnEdge(2,iEdge)
+
+         do k=1,maxLevelEdgeTop(iEdge)
+
+            u(k,iEdge) = 0.0
+            do j = 1,nEdgesOnEdge(iEdge)
+               eoe = edgesOnEdge(j,iEdge)
+               u(k,iEdge) = u(k,iEdge) + weightsOnEdge(j,iEdge) * uBcl(k,eoe) * fEdge(eoe) 
+            end do
+         end do
+      end do
+
+   end subroutine compute_f_uperp
+
    subroutine compute_scalar_tend(tend, s, d, grid)
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    !
@@ -1934,7 +2062,7 @@
       integer :: iEdge, iCell, iVertex, k, cell1, cell2, vertex1, vertex2, eoe, i, j, cov
       real (kind=RKIND) :: flux, vorticity_abs, h_vertex, workpv, rho0Inv
 
-      integer :: nCells, nEdges, nVertices, nVertLevels, vertexDegree
+      integer :: nCells, nEdges, nVertices, nVertLevels, vertexDegree, fCoef
 
 
       real (kind=RKIND), dimension(:), pointer :: &amp;
@@ -2226,6 +2354,18 @@
       ! 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 )
       !
+      if (trim(config_time_integration) == 'RK4') then
+         ! for RK4, PV is really PV = (eta+f)/h
+         fCoef = 1
+      elseif (trim(config_time_integration) == 'higdon_split' &amp;
+          .or.trim(config_time_integration) == 'higdon_unsplit') then
+         ! for higdon, PV is eta/h because f is added separately to the momentum forcing.
+! mrp temp, new should be:
+         fCoef = 0
+! old, for testing:
+!         fCoef = 1
+      end if
+
       do iVertex = 1,nVertices
          do k=1,maxLevelVertexBot(iVertex)
             h_vertex = 0.0
@@ -2234,7 +2374,7 @@
             end do
             h_vertex = h_vertex / areaTriangle(iVertex)
 
-            pv_vertex(k,iVertex) = (fVertex(iVertex) + vorticity(k,iVertex)) / h_vertex
+            pv_vertex(k,iVertex) = (fCoef*fVertex(iVertex) + vorticity(k,iVertex)) / h_vertex
          end do
       end do
 

</font>
</pre>