Skip to content

Commit

Permalink
adding support for output of subgrid lat/lon variables in wps
Browse files Browse the repository at this point in the history
  • Loading branch information
jbeezley committed Sep 17, 2010
1 parent b2bc7ad commit d7ebe29
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 13 deletions.
48 changes: 39 additions & 9 deletions WPS/geogrid/src/output_module.F
Expand Up @@ -444,7 +444,7 @@ subroutine init_output_fields(nest_num, grid_type, &
character (len=128) :: fieldname
character (len=128) :: memorder, units, description
character (len=128), dimension(3) :: dimnames
integer :: sr_x, sr_y
integer :: sr_x, sr_y, istatus

!
! First find out how many fields there are
Expand All @@ -467,7 +467,7 @@ subroutine init_output_fields(nest_num, grid_type, &
#endif

#ifdef _GEOGRID
if (grid_type == 'C') NUM_AUTOMATIC_FIELDS = 22
if (grid_type == 'C') NUM_AUTOMATIC_FIELDS = 24
if (grid_type == 'E') NUM_AUTOMATIC_FIELDS = 7

NUM_FIELDS = nfields+NUM_AUTOMATIC_FIELDS
Expand Down Expand Up @@ -569,7 +569,15 @@ subroutine init_output_fields(nest_num, grid_type, &
fields(22)%fieldname = 'LANDMASK'
fields(22)%units = 'none'
fields(22)%descr = 'Landmask : 1=land, 0=water'


fields(23)%fieldname = 'FXLONG'
fields(23)%units = 'degrees longitude'
fields(23)%descr = 'Longitude on refined grid'

fields(24)%fieldname = 'FXLAT'
fields(24)%units = 'degrees latitude'
fields(24)%descr = 'Latitude on refined grid'

else if (grid_type == 'E') then
fields(1)%fieldname = 'XLAT_M'
fields(1)%units = 'degrees latitude'
Expand Down Expand Up @@ -761,7 +769,29 @@ subroutine init_output_fields(nest_num, grid_type, &
fields(17)%dimnames(1) = 'west_east_stag'
fields(17)%stagger = 'U'
fields(17)%istagger = U


!
! Perform adjustments for subgrid lat/lon fields
!
do i=23,24

call get_subgrid_dim_default(nest_num,fields(i)%dimnames, &
fields(i)%sr_x,fields(i)%sr_y,istatus)
fields(i)%dom_end(1)=(fields(i)%dom_end(1)-fields(i)%dom_start(1)+2) &
* fields(i)%sr_x
fields(i)%dom_end(2)=(fields(i)%dom_end(2)-fields(i)%dom_start(2)+2) &
* fields(i)%sr_y
fields(i)%mem_end(1)=(fields(i)%mem_end(1)-fields(i)%mem_start(1)+2) &
* fields(i)%sr_x
fields(i)%mem_end(2)=(fields(i)%mem_end(2)-fields(i)%mem_start(2)+2) &
* fields(i)%sr_y
fields(i)%patch_end(1)=(fields(i)%patch_end(1)-fields(i)%patch_start(1)+2) &
* fields(i)%sr_x
fields(i)%patch_end(2)=(fields(i)%patch_end(2)-fields(i)%patch_start(2)+2) &
* fields(i)%sr_y

enddo

else if (grid_type == 'E') then
! Lat V
fields(3)%stagger = 'V'
Expand Down Expand Up @@ -868,26 +898,26 @@ subroutine init_output_fields(nest_num, grid_type, &
thalo_width = 0
#endif

if (sr_x > 1) then
if (sr_x > 1 .and. sr_y > 1) then
fields(nfields)%mem_start(1) = (fields(nfields)%mem_start(1) + lhalo_width - 1)*sr_x + 1 - lhalo_width
fields(nfields)%patch_start(1) = (fields(nfields)%patch_start(1) - 1)*sr_x + 1
fields(nfields)%dom_start(1) = (fields(nfields)%dom_start(1) - 1)*sr_x + 1

fields(nfields)%mem_end(1) = (fields(nfields)%mem_end(1) - rhalo_width)*sr_x + rhalo_width
fields(nfields)%patch_end(1) = (fields(nfields)%patch_end(1) )*sr_x
fields(nfields)%dom_end(1) = (fields(nfields)%dom_end(1) )*sr_x
endif

if (sr_y > 1) then

fields(nfields)%mem_start(2) = (fields(nfields)%mem_start(2) + bhalo_width - 1)*sr_y + 1 - bhalo_width
fields(nfields)%patch_start(2) = (fields(nfields)%patch_start(2) - 1)*sr_y + 1
fields(nfields)%dom_start(2) = (fields(nfields)%dom_start(2) - 1)*sr_y + 1

fields(nfields)%mem_end(2) = (fields(nfields)%mem_end(2) - thalo_width)*sr_y + thalo_width
fields(nfields)%patch_end(2) = (fields(nfields)%patch_end(2) )*sr_y
fields(nfields)%dom_end(2) = (fields(nfields)%dom_end(2) )*sr_y
endif

call get_subgrid_dim_default(nest_num,fields(nfields)%dimnames, &
sr_x,sr_y,istatus)
endif

nfields = nfields + 1

Expand Down
30 changes: 26 additions & 4 deletions WPS/geogrid/src/source_data_module.F
Expand Up @@ -2335,6 +2335,13 @@ subroutine get_subgrid_dim_name(nest_num, field_name, dimnames, &
sub_y = 1

istatus = 0
if (((index(trim(field_name),'FXLAT') /= 0) .and. &
(len_trim(field_name) == len_trim('FXLAT'))) .or. &
((index(trim(field_name),'FXLONG') /=0) .and. &
(len_trim(field_name) == len_trim('FXLONG'))))then
call get_subgrid_dim_default(nest_num,dimnames,sub_x,sub_y,istatus)
endif

do idx=1,num_entries
if ((index(source_fieldname(idx),trim(field_name)) /= 0) .and. &
(len_trim(source_fieldname(idx)) == len_trim(field_name))) then
Expand All @@ -2343,17 +2350,32 @@ subroutine get_subgrid_dim_name(nest_num, field_name, dimnames, &
if (is_output_stagger(idx)) then
call mprintf(.true.,ERROR,'Cannot use subgrids on variables with staggered grids')
end if
dimnames(1) = trim(dimnames(1))//"_subgrid"
dimnames(2) = trim(dimnames(2))//"_subgrid"
sub_x = subgrid_ratio_x(nest_num)
sub_y = subgrid_ratio_y(nest_num)
call get_subgrid_dim_default(nest_num,dimnames,sub_x,sub_y,istatus)
end if
end if
end do

end subroutine get_subgrid_dim_name


subroutine get_subgrid_dim_default(nest_num,dimnames,sub_x,sub_y,istatus)
use gridinfo_module

implicit none

integer,intent(in)::nest_num
integer,intent(out)::sub_x,sub_y,istatus
character(len=128),dimension(2),intent(out)::dimnames

dimnames(1)='west_east_subgrid'
dimnames(2)='south_north_subgrid'
sub_x=subgrid_ratio_x(nest_num)
sub_y=subgrid_ratio_y(nest_num)
istatus=0

end subroutine get_subgrid_dim_default


!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! Name: get_interp_option
!
Expand Down

0 comments on commit d7ebe29

Please sign in to comment.