<p><b>duda</b> 2009-08-03 12:33:16 -0600 (Mon, 03 Aug 2009)</p><p>Compute u field from streamfunction sampled at vertices to ensure <br>
zero divergence in initial conditions for test cases 1, 2, 5.<br>
The initial conditions for test case 6 still need to be corrected,<br>
since the initial height field appears to be incorrect.<br>
<br>
M    module_test_cases.F<br>
</p><hr noshade><pre><font color="gray">Modified: trunk/swmodel/module_test_cases.F
===================================================================
--- trunk/swmodel/module_test_cases.F        2009-08-02 01:28:52 UTC (rev 14)
+++ trunk/swmodel/module_test_cases.F        2009-08-03 18:33:16 UTC (rev 15)
@@ -108,8 +108,9 @@
       real (kind=RKIND), parameter :: lambda_c = 3.0*pii/2.0
       real (kind=RKIND), parameter :: alpha = pii/4.0
 
-      integer :: iCell, iEdge
+      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
@@ -132,19 +133,22 @@
       !
       ! 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
-         u =  cos(grid%latEdge%array(iEdge)) * cos(alpha) + &amp;
-              sin(grid%latEdge%array(iEdge)) * cos(grid%lonEdge%array(iEdge)) * sin(alpha)
-         v = -sin(grid%lonEdge%array(iEdge)) * sin(alpha)
-         state % u % array(1,iEdge) = u * cos(grid%angleEdge%array(iEdge)) + v * sin(grid%angleEdge%array(iEdge))
+         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)
 
       !
-      ! Scale wind field from 1.0 m/s at equator for solid-body rotation
-      !
-      state % u % array = state % u % array * u0
-      
-      !
       ! Initialize cosine bell at (theta_c, lambda_c)
       !
       do iCell=1,grid % nCells
@@ -180,6 +184,7 @@
 
       integer :: iCell, iEdge, iVtx
       real (kind=RKIND) :: u, v
+      real (kind=RKIND), allocatable, dimension(:) :: psiVertex
 
 
       !
@@ -199,23 +204,27 @@
       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
-         u =  cos(grid%latEdge%array(iEdge)) * cos(alpha) + &amp;
-              sin(grid%latEdge%array(iEdge)) * cos(grid%lonEdge%array(iEdge)) * sin(alpha)
-         v = -sin(grid%lonEdge%array(iEdge)) * sin(alpha)
-         state % u % array(1,iEdge) = u * cos(grid%angleEdge%array(iEdge)) + v * sin(grid%angleEdge%array(iEdge))
+         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)
 
       !
-      ! Scale wind field from 1.0 m/s at equator for solid-body rotation
-      !
-      state % u % array = state % u % array * u0
-      
-      !
       ! Generate rotated Coriolis field
       !
       do iEdge=1,grid % nEdges
@@ -270,6 +279,7 @@
 
       integer :: iCell, iEdge, iVtx
       real (kind=RKIND) :: r, u, v
+      real (kind=RKIND), allocatable, dimension(:) :: psiVertex
 
 
       !
@@ -293,19 +303,22 @@
       !
       ! 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
-         u =  cos(grid%latEdge%array(iEdge)) * cos(alpha) + &amp;
-              sin(grid%latEdge%array(iEdge)) * cos(grid%lonEdge%array(iEdge)) * sin(alpha)
-         v = -sin(grid%lonEdge%array(iEdge)) * sin(alpha)
-         state % u % array(1,iEdge) = u * cos(grid%angleEdge%array(iEdge)) + v * sin(grid%angleEdge%array(iEdge))
+         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)
 
       !
-      ! Scale wind field from 1.0 m/s at equator for solid-body rotation
-      !
-      state % u % array = state % u % array * u0
-      
-      !
       ! Generate rotated Coriolis field
       !
       do iEdge=1,grid % nEdges
@@ -379,8 +392,9 @@
       real (kind=RKIND), parameter :: K = 7.848e-6
       real (kind=RKIND), parameter :: R = 4.0
 
-      integer :: iCell, iEdge
+      integer :: iCell, iEdge, iVtx
       real (kind=RKIND) :: u, v
+      real (kind=RKIND), allocatable, dimension(:) :: psiVertex
 
 
       !
@@ -404,25 +418,27 @@
       !
       ! Initialize wind field
       !
+      allocate(psiVertex(grid % nVertices))
+      do iVtx=1,grid % nVertices
+         psiVertex(iVtx) = -a * a * w * sin(grid%latVertex%array(iVtx)) + &amp;
+                            a *a * K * (cos(grid%latVertex%array(iVtx))**R) * sin(grid%latVertex%array(iVtx)) * cos(R * grid%lonVertex%array(iVtx))
+      end do
       do iEdge=1,grid % nEdges
-         u =  a * w * cos(grid%latEdge%array(iEdge)) + &amp;
-              a * K * cos(grid%latEdge%array(iEdge))**(R-1.0) * &amp;
-              (R * sin(grid%latEdge%array(iEdge))**2.0 - cos(grid%latEdge%array(iEdge))**2.0) * &amp;
-              cos(R*grid%lonEdge%array(iEdge))
-         v = -a * K * R * cos(grid%latEdge%array(iEdge))**(R-1.0) * sin(grid%latEdge%array(iEdge)) * &amp;
-             sin(R*grid%lonEdge%array(iEdge))
-         state % u % array(1,iEdge) = u * cos(grid%angleEdge%array(iEdge)) + v * sin(grid%angleEdge%array(iEdge))
+         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 height field (actually, fluid thickness field)
       !
       do iCell=1,grid % nCells
-         state % h % array(1,iCell) = (gravity * h0 + a**2.0*AA(grid%latCell%array(iCell)) + &amp;
-                                              a**2.0*BB(grid%latCell%array(iCell))*cos(R*grid%lonCell%array(iCell)) + &amp;
-                                              a**2.0*CC(grid%latCell%array(iCell))*cos(2.0*R*grid%lonCell%array(iCell))&amp;
-                              ) / &amp; 
-                              gravity
+         state % h % array(1,iCell) = (gravity * h0 + a*a*AA(grid%latCell%array(iCell)) + &amp;
+                                                      a*a*BB(grid%latCell%array(iCell)) * cos(R*grid%lonCell%array(iCell)) + &amp;
+                                                      a*a*CC(grid%latCell%array(iCell)) * cos(2.0*R*grid%lonCell%array(iCell)) &amp;
+                                      ) / gravity
       end do
 
    end subroutine sw_test_case_6
@@ -461,7 +477,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.0*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*cos(theta))**2.0)
 
    end function AA
 
@@ -479,7 +495,7 @@
 
       real (kind=RKIND), intent(in) :: theta
 
-      BB = 2.0*(omega + w)*K / ((R+1.0)*(R+2.0)) * cos(theta)**R * ((R**2.0 + 2.0*R + 2.0) - (R+1.0)**2.0*cos(theta)**2.0)
+      BB = (2.0*(omega + w)*K / ((R+1.0)*(R+2.0))) * cos(theta)**R * ((R**2.0 + 2.0*R + 2.0) - ((R+1.0)*cos(theta))**2.0)
 
    end function BB
 

</font>
</pre>