[Dart-dev] [4379] DART/trunk/models/tiegcm/model_mod.f90: Bugs in model_interpolate and get_val subroutines are fixed.
nancy at ucar.edu
nancy at ucar.edu
Fri May 28 12:24:38 MDT 2010
Revision: 4379
Author: tmatsuo
Date: 2010-05-28 12:24:38 -0600 (Fri, 28 May 2010)
Log Message:
-----------
Bugs in model_interpolate and get_val subroutines are fixed.
Density vertical interpolation are now done in after being converted to log-scale.
Modified Paths:
--------------
DART/trunk/models/tiegcm/model_mod.f90
-------------- next part --------------
Modified: DART/trunk/models/tiegcm/model_mod.f90
===================================================================
--- DART/trunk/models/tiegcm/model_mod.f90 2010-05-27 22:39:43 UTC (rev 4378)
+++ DART/trunk/models/tiegcm/model_mod.f90 2010-05-28 18:24:38 UTC (rev 4379)
@@ -301,7 +301,7 @@
integer :: lat_below, lat_above, lon_below, lon_above
real(r8) :: lon_fract, temp_lon, lat_fract
real(r8) :: lon, lat, height, lon_lat_lev(3)
-real(r8) :: bot_lon, top_lon, delta_lon, bot_lat, top_lat, delta_lat
+real(r8) :: bot_lon, top_lon, zero_lon, delta_lon, bot_lat, top_lat, delta_lat
real(r8) :: val(2,2), a(2)
if ( .not. module_initialized ) call static_init_model
@@ -323,34 +323,29 @@
endif
! Get lon and lat grid specs
-bot_lon = lons(1) ! 0
-top_lon = lons(nlon) ! 355
+bot_lon = lons(1) ! 180
+zero_lon = lons(37) ! 0
+top_lon = lons(nlon) ! 175
delta_lon = abs((lons(1)-lons(2))) ! 5
bot_lat = lats(1) ! -87.5
top_lat = lats(nlat) ! 87.5
delta_lat = abs((lats(1)-lats(2))) ! 5
-! Compute bracketing lon indices: DART [0, 360] TIEGCM [0, 355]
-if(lon >= bot_lon .and. lon <= top_lon) then ! 0 <= lon <= 355
+! Compute bracketing lon indices:
+! TIEGCM [-180 180] = DART [180, 185, ..., 355, 0, 5, ..., 175]
+if(lon > top_lon .and. lon < bot_lon) then ! at wraparound point [175 < lon < 180]
+ lon_below = nlon !175
+ lon_above = 1 !180
+ lon_fract = (lon - top_lon) / delta_lon
+else if (lon >= bot_lon) then ! [180 <= lon <= 360]
lon_below = int((lon - bot_lon) / delta_lon) + 1
lon_above = lon_below + 1
lon_fract = (lon - lons(lon_below)) / delta_lon
-elseif (lon < bot_lon) then ! lon < 0
- temp_lon = lon + 360.0
- lon_below = int((temp_lon - bot_lon) / delta_lon) + 1
+else ! [0 <= lon <= 175 ]
+ lon_below = int((lon - zero_lon) / delta_lon) + 37
lon_above = lon_below + 1
- lon_fract = (temp_lon - lons(lon_below)) / delta_lon
-
-elseif (lon >= (top_lon+delta_lon)) then ! 360 <= lon
- temp_lon = lon - 360.0
- lon_below = int((temp_lon - bot_lon) / delta_lon) + 1
- lon_above = lon_below + 1
- lon_fract = (temp_lon - lons(lon_below)) / delta_lon
-else ! 355 < lon < 360 at wraparound point
- lon_below = nlon
- lon_above = 1
- lon_fract = (lon - top_lon) / delta_lon
+ lon_fract = (lon - lons(lon_below)) / delta_lon
endif
! compute neighboring lat rows: TIEGCM [-87.5, 87.5] DART [-90, 90]
@@ -391,6 +386,7 @@
obs_val = 0.
endif
+!write(11,*,access='APPEND') lon, lat, lon_fract, lat_fract, a(1), a(2), obs_val
!print*, 'model_interpolate', lon, lat, height,obs_val
@@ -419,13 +415,27 @@
! To find a layer height: what's the unit of height [m]
h_loop:do k = 1, nlev
zgrid = ZGtiegcm(lon_index,lat_index,k)/100.0_r8 ! [m] = ZGtiegcm/100 [cm]
+
+ if (k == 1 .and. zgrid > height) then
+ istatus = 1
+ val = 0.0
+ return
+ endif
+
+ if (k == nlev .and. zgrid < height) then
+ istatus = 1
+ val = 0.0
+ return
+ endif
+
if (height <= zgrid) then
lev_top = k
lev_bottom = lev_top -1
- delta_z = zgrid - ZGtiegcm(lon_index,lat_index,lev_bottom)
+ delta_z = zgrid - ZGtiegcm(lon_index,lat_index,lev_bottom)/100.0_r8
frac_lev = (zgrid - height)/delta_z
exit h_loop
endif
+
enddo h_loop
if (obs_kind == KIND_DENSITY) then
@@ -448,8 +458,10 @@
end if
-val = frac_lev * val_bottom + (1.0 - frac_lev) * val_top
+val = exp(frac_lev * log(val_bottom) + (1.0 - frac_lev) * log(val_top))
+!write(11,*,access='APPEND') lat_index, lon_index, lev_top, lev_bottom, frac_lev, val_top, val_bottom, val
+
end subroutine get_val
More information about the Dart-dev
mailing list