[Dart-dev] [5284] DART/trunk/models/wrf/model_mod.f90: For localization in SCALEHEIGHT units the surface pressure is required.

nancy at ucar.edu nancy at ucar.edu
Wed Sep 28 10:12:33 MDT 2011


Revision: 5284
Author:   nancy
Date:     2011-09-28 10:12:33 -0600 (Wed, 28 Sep 2011)
Log Message:
-----------
For localization in SCALEHEIGHT units the surface pressure is required.
Compute it correctly for the staggered U and V fields.  The original code
was computing it on the mass points and was referencing outside an array
for the last row and column of those fields.

Modified Paths:
--------------
    DART/trunk/models/wrf/model_mod.f90

-------------- next part --------------
Modified: DART/trunk/models/wrf/model_mod.f90
===================================================================
--- DART/trunk/models/wrf/model_mod.f90	2011-09-26 22:30:18 UTC (rev 5283)
+++ DART/trunk/models/wrf/model_mod.f90	2011-09-28 16:12:33 UTC (rev 5284)
@@ -864,7 +864,7 @@
    lev = model_height(ip,jp,kp,id,var_type,ens_mean)
 elseif (wrf%dom(id)%localization_coord == VERTISSCALEHEIGHT) then
    lev = -log(model_pressure(ip,jp,kp,id,var_type,ens_mean) / &
-              model_pressure(ip,jp,1,id,wrf%dom(id)%type_mu,ens_mean))
+              model_surface_pressure(ip,jp,id,var_type,ens_mean))
 endif
 
 if(debug) write(*,*) 'lon, lat, lev: ',lon, lat, lev
@@ -5175,6 +5175,137 @@
 
 !#######################################################
 
+function model_surface_pressure(i,j,id,var_type,x)
+
+! Calculate the surface pressure at grid point (i,j), domain id.
+! The grid is defined according to var_type.
+
+integer,  intent(in)  :: i,j,id,var_type
+real(r8), intent(in)  :: x(:)
+real(r8)              :: model_surface_pressure
+
+integer  :: off
+real(r8) :: pres1, pres2
+
+model_surface_pressure = missing_r8
+
+
+! If U-grid, then pressure is defined between U points, so average --
+!   averaging depends on longitude periodicity
+if( var_type == wrf%dom(id)%type_u ) then
+
+   if( i == wrf%dom(id)%var_size(1,wrf%dom(id)%type_u) ) then
+
+      ! Check to see if periodic in longitude
+      if ( wrf%dom(id)%periodic_x ) then
+
+         ! We are at seam in longitude, take first and last M-grid points
+         pres1 = model_pressure_s(i-1,j,id,x)
+         pres2 = model_pressure_s(1,  j,id,x)
+         model_surface_pressure = (pres1 + pres2)/2.0_r8
+         
+      else
+
+         ! If not periodic, then try extrapolating
+         pres1 = model_pressure_s(i-1,j,id,x)
+         pres2 = model_pressure_s(i-2,j,id,x)
+         model_surface_pressure = (3.0_r8*pres1 - pres2)/2.0_r8
+
+      endif
+
+   elseif( i == 1 ) then
+
+      ! Check to see if periodic in longitude
+      if ( wrf%dom(id)%periodic_x ) then
+
+         ! We are at seam in longitude, take first and last M-grid points
+         pres1 = model_pressure_s(i,             j,id,x)
+         pres2 = model_pressure_s(wrf%dom(id)%we,j,id,x)
+         model_surface_pressure = (pres1 + pres2)/2.0_r8
+         
+      else
+
+         ! If not periodic, then try extrapolating
+         pres1 = model_pressure_s(i,  j,id,x)
+         pres2 = model_pressure_s(i+1,j,id,x)
+         model_surface_pressure = (3.0_r8*pres1 - pres2)/2.0_r8
+
+      endif
+
+   else
+
+      pres1 = model_pressure_s(i,  j,id,x)
+      pres2 = model_pressure_s(i-1,j,id,x)
+      model_surface_pressure = (pres1 + pres2)/2.0_r8
+
+   endif
+
+! If V-grid, then pressure is defined between V points, so average --
+!   averaging depends on polar periodicity
+elseif( var_type == wrf%dom(id)%type_v ) then
+
+   if( j == wrf%dom(id)%var_size(2,wrf%dom(id)%type_v) ) then
+
+      ! Check to see if periodic in latitude (polar)
+      if ( wrf%dom(id)%polar ) then
+
+         ! The upper corner is 180 degrees of longitude away
+         off = i + wrf%dom(id)%we/2
+         if ( off > wrf%dom(id)%we ) off = off - wrf%dom(id)%we
+
+         pres1 = model_pressure_s(off,j-1,id,x)
+         pres2 = model_pressure_s(i  ,j-1,id,x)
+         model_surface_pressure = (pres1 + pres2)/2.0_r8
+
+      ! If not periodic, then try extrapolating
+      else
+
+         pres1 = model_pressure_s(i,j-1,id,x)
+         pres2 = model_pressure_s(i,j-2,id,x)
+         model_surface_pressure = (3.0_r8*pres1 - pres2)/2.0_r8
+
+      endif
+
+   elseif( j == 1 ) then
+
+      ! Check to see if periodic in latitude (polar)
+      if ( wrf%dom(id)%polar ) then
+
+         ! The lower corner is 180 degrees of longitude away
+         off = i + wrf%dom(id)%we/2
+         if ( off > wrf%dom(id)%we ) off = off - wrf%dom(id)%we
+
+         pres1 = model_pressure_s(off,j,id,x)
+         pres2 = model_pressure_s(i,  j,id,x)
+         model_surface_pressure = (pres1 + pres2)/2.0_r8
+
+      ! If not periodic, then try extrapolating
+      else
+
+         pres1 = model_pressure_s(i,j,  id,x)
+         pres2 = model_pressure_s(i,j+1,id,x)
+         model_surface_pressure = (3.0_r8*pres1 - pres2)/2.0_r8
+
+      endif
+
+   else
+
+      pres1 = model_pressure_s(i,j,  id,x)
+      pres2 = model_pressure_s(i,j-1,id,x)
+      model_surface_pressure = (pres1 + pres2)/2.0_r8
+
+   endif
+
+else
+
+   model_surface_pressure = model_pressure_s(i,j,id,x)
+
+endif
+
+end function model_surface_pressure
+
+!#######################################################
+
 function model_pressure_t(i,j,k,id,x)
 
 ! Calculate total pressure on mass point (half (mass) levels, T-point).


More information about the Dart-dev mailing list