<p><b>qchen3@fsu.edu</b> 2013-03-25 10:55:55 -0600 (Mon, 25 Mar 2013)</p><p>BRANCH COMMIT<br>
<br>
Branch commit for gm_implement.<br>
</p><hr noshade><pre><font color="gray">Modified: branches/ocean_projects/gm_implement/src/core_ocean/Registry
===================================================================
--- branches/ocean_projects/gm_implement/src/core_ocean/Registry        2013-03-22 21:31:57 UTC (rev 2665)
+++ branches/ocean_projects/gm_implement/src/core_ocean/Registry        2013-03-25 16:55:55 UTC (rev 2666)
@@ -57,6 +57,7 @@
 namelist real      standard_GM     config_h_kappa              0.0
 namelist real      standard_GM     config_h_kappa_q            0.0
 namelist real      standard_GM     config_diapycnal_diff       0.0000001
+namelist real      standard_GM     config_gravWaveSpeed_trunc  0.3
 
 namelist logical   Rayleigh_damping     config_Rayleigh_friction    .false.
 namelist real      Rayleigh_damping     config_Rayleigh_damping_coeff 0.0
@@ -403,4 +404,5 @@
 var scratch real tridiagA ( nVertLevels ) 0 - tridiagA scratch - -
 var scratch real tridiagB ( nVertLevels ) 0 - tridiagB scratch - -
 var scratch real tridiagC ( nVertLevels ) 0 - tridiagC scratch - -
+var scratch real rightHandSide ( nVertLevels ) 0 - rightHandSide scratch - -
 

Modified: branches/ocean_projects/gm_implement/src/core_ocean/mpas_ocn_gm.F
===================================================================
--- branches/ocean_projects/gm_implement/src/core_ocean/mpas_ocn_gm.F        2013-03-22 21:31:57 UTC (rev 2665)
+++ branches/ocean_projects/gm_implement/src/core_ocean/mpas_ocn_gm.F        2013-03-25 16:55:55 UTC (rev 2666)
@@ -3,6 +3,7 @@
    use mpas_grid_types
    use mpas_configure
    use mpas_timer
+   use mpas_constants
    
    implicit none
    private 
@@ -39,12 +40,12 @@
 
       real(kind=RKIND), dimension(:,:), pointer :: rho, zMid, uBolusGM, hEddyFlux, h_edge,  &amp;
                    grad_rho, grad_rho_interface, grad_rho_constZ, rhoz_edge, rhoz, grad_zMid, &amp;
-                   grad_zMid_interface, slopeRelative, k33, rhoz_center, gmStreamFunc
-      real(kind=RKIND), dimension(:), pointer   :: areaCell, dcEdge, dvEdge, tridiagA, tridiagB, tridiagC
+                   grad_zMid_interface, slopeRelative, k33, rhoz_center, gmStreamFunc, BruntVaisalaFreqTop
+      real(kind=RKIND), dimension(:), pointer   :: areaCell, dcEdge, dvEdge, tridiagA, tridiagB, tridiagC, rightHandSide
       integer, dimension(:), pointer   :: maxLevelEdgeTop, maxLevelCell
       integer, dimension(:,:), pointer :: cellsOnEdge
-      integer                          :: k, iEdge, nEdges, cell1, cell2, iCell, nCells
-      real(kind=RKIND)                 :: h1, h2, areaEdge
+      integer                          :: k, iEdge, nEdges, cell1, cell2, iCell, nCells, N
+      real(kind=RKIND)                 :: h1, h2, areaEdge, c, BruntVaisalaFreqTopEdge
 
       call mpas_allocate_scratch_field(scratch % grad_rho, .True.)
       call mpas_allocate_scratch_field(scratch % grad_rho_interface, .True.)
@@ -55,6 +56,7 @@
       call mpas_allocate_scratch_field(scratch % grad_zMid, .True.)
       call mpas_allocate_scratch_field(scratch % grad_zMid_interface, .True.)
       call mpas_allocate_scratch_field(scratch % gmStreamFunc, .True.)
+      call mpas_allocate_scratch_field(scratch % rightHandSide, .True.)
       call mpas_allocate_scratch_field(scratch % tridiagA, .True.)
       call mpas_allocate_scratch_field(scratch % tridiagB, .True.)
       call mpas_allocate_scratch_field(scratch % tridiagC, .True.)
@@ -68,6 +70,7 @@
       h_edge               =&gt; s % h_edge % array
       hEddyFlux            =&gt; s % hEddyFlux % array
       zMid                 =&gt; s % zMid % array
+      BruntVaisalaFreqTop  =&gt; s % BruntVaisalaFreqTop % array
 
       grad_rho             =&gt; scratch % grad_rho % array
       grad_rho_interface   =&gt; scratch % grad_rho_interface % array
@@ -78,6 +81,7 @@
       grad_zMid            =&gt; scratch % grad_zMid % array
       grad_zMid_interface  =&gt; scratch % grad_zMid_interface % array
       gmStreamFunc         =&gt; scratch % gmStreamFunc % array
+      rightHandSide        =&gt; scratch % rightHandSide % array
       tridiagA             =&gt; scratch % tridiagA % array
       tridiagB             =&gt; scratch % tridiagB % array
       tridiagC             =&gt; scratch % tridiagC % array
@@ -198,37 +202,66 @@
       !
       !Compute the stream function
       !
+      gmStreamFunc(:,:) = 0.0
+      c = config_gravWaveSpeed_trunc**2
+      do iEdge = 1, nEdges
+         cell1 = cellsOnEdge(1,iEdge)
+         cell2 = cellsOnEdge(2,iEdge)
 
-      ! Construct the tridiagonal matrices
+         ! Construct the tridiagonal matrix
+         ! First row
+         k = 2       
+         BruntVaisalaFreqTopEdge = 0.5 * (BruntVaisalaFreqTop(k,cell1) + BruntVaisalaFreqTop(k,cell2))
+         tridiagB(k-1) = - 0.5*c/(h_edge(k-1,iEdge)*h_edge(k,iEdge)) - BruntVaisalaFreqTopEdge
+         tridiagC(k-1) = 2.*c/h_edge(k,iEdge)/(h_edge(k-1,iEdge)+h_edge(k,iEdge))
+         rightHandSide(k-1) = config_h_kappa * gravity / config_rho0 * grad_rho_constZ(k,iEdge)
 
-      ! Call the tridiagonal solver
-      
+         ! Second to next to the last rows
+         do k = 3, maxLevelEdgeTop(iEdge)-1        
+             BruntVaisalaFreqTopEdge = 0.5 * (BruntVaisalaFreqTop(k,cell1) + BruntVaisalaFreqTop(k,cell2))
+             tridiagA(k-2) = 2.*c/h_edge(k-1,iEdge)/(h_edge(k-1,iEdge)+h_edge(k,iEdge))
+             tridiagB(k-1) = - 0.5*c/(h_edge(k-1,iEdge)*h_edge(k,iEdge)) - BruntVaisalaFreqTopEdge
+             tridiagC(k-1) = 2.*c/h_edge(k,iEdge)/(h_edge(k-1,iEdge)+h_edge(k,iEdge))
+             rightHandSide(k-1) = config_h_kappa * gravity / config_rho0 * grad_rho_constZ(k,iEdge)
+         end do
 
-      
-      if (config_vert_coord_movement .EQ. 'isopycnal') then
+         ! Last row
+         k = maxLevelEdgeTop(iEdge)                
+         tridiagA(k-2) = 2.*c/h_edge(k-1,iEdge)/(h_edge(k-1,iEdge)+h_edge(k,iEdge))
+         tridiagB(k-1) = - 0.5*c/(h_edge(k-1,iEdge)*h_edge(k,iEdge)) - BruntVaisalaFreqTopEdge
+         rightHandSide(k-1) = config_h_kappa * gravity / config_rho0 * grad_rho_constZ(k,iEdge)
 
-         do iEdge = 1, nEdges
-            do k = 1, maxLevelEdgeTop(iEdge)
-               uBolusGM(k,iEdge) = hEddyFlux(k,iEdge)/h_edge(k,iEdge)
-            end do
-         end do
+         ! Total number of rows
+         N = maxLevelEdgeTop(iEdge) - 1
+         
+         ! Call the tridiagonal solver
+         call tridiagonal_solve(tridiagA, tridiagB, tridiagC, rightHandSide, gmStreamFunc(2:maxLevelEdgeTop(iEdge),iEdge), N)
 
-      else
+      end do
 
-         ! Nothing for now for all other grid types (zlevel, zstar, ztilde)
-         uBolusGM(:,:) = 0.000000001     ! A tiny number just for testing for the moment
+      ! Compute uBolusGM from the stream function
+      do iEdge = 1, nEdges
+         do k = 1, maxLevelEdgeTop(iEdge)
+            uBolusGM(k,iEdge) = (gmStreamFunc(k,iEdge) - gmStreamFunc(k+1,iEdge)) / h_edge(k,iEdge)
+         end do
+      end do
 
-      end if
 
+      
       call mpas_deallocate_scratch_field(scratch % grad_rho)
       call mpas_deallocate_scratch_field(scratch % grad_rho_interface)
       call mpas_deallocate_scratch_field(scratch % rhoz)
       call mpas_deallocate_scratch_field(scratch % rhoz_edge)
       call mpas_deallocate_scratch_field(scratch % rhoz_center)
       call mpas_deallocate_scratch_field(scratch % grad_zMid)
-      call mpas_deallocate_scratch_field(scratch % grad_zMid_interface)
+      call mpas_deallocate_scratch_field(scratch % gmStreamFunc)
+      call mpas_deallocate_scratch_field(scratch % rightHandSide)
+      call mpas_deallocate_scratch_field(scratch % tridiagA)
+      call mpas_deallocate_scratch_field(scratch % tridiagB)
+      call mpas_deallocate_scratch_field(scratch % tridiagC)
 
 
+
    end subroutine ocn_gm_compute_uBolus!}}}
 
    subroutine ocn_gm_compute_slopeRelative(s, grid, scratch)

</font>
</pre>