Is there an easier way to add a "data buffer" around a subset?

From: Bridget Thrasher <bthrasher_at_nyahnyahspammersnyahnyah>
Date: Fri Jan 08 2010 - 12:04:18 MST

I have some data files that contain values only over the continental US and
fill values in the other cells. In order to not lose data when interpolating
to a finer grid, I decided to add some buffer data around the group of
cells that contain values. Right now I'm doing it with several loops and if
statements (see below if interested) that basically copy values first along
the west coast, then the east coast, then the southern cells, and then the
northern cells. This is the only solution I could come up with, and while it
works, it's not particularly speedy. Is there a better way?

-Bridget

do i = 0,nlats-1
    do j = 1,nlons-2
        if
(num(ismissing(aggobs(:,i,j))).gt.0.and.num(ismissing(aggobs(:,i,j-1))).gt.0.and.num(ismissing(aggobs(:,i,j+1))).eq.0)
then
            aggobs(:,i,j) = aggobs(:,i,j+1)
        end if
    end do
    do j = nlons-2,1,1
        if
(num(ismissing(aggobs(:,i,j))).gt.0.and.num(ismissing(aggobs(:,i,j+1))).gt.0.and.num(ismissing(aggobs(:,i,j-1))).eq.0)
then
            aggobs(:,i,j) = aggobs(:,i,j-1)
        end if
    end do
    if
(num(ismissing(aggobs(:,i,0))).gt.0.and.(num(ismissing(aggobs(:,i,nlons-1))).eq.0.or.num(ismissing(aggobs(:,i,1))).eq.0))
then
        aggobs(:,i,0) = avg((/aggobs(:,i,nlons-1),aggobs(:,i,1)/))
    end if
    if
(num(ismissing(aggobs(:,i,nlons-1))).gt.0.and.(num(ismissing(aggobs(:,i,nlons-2))).eq.0.or.num(ismissing(aggobs(:,i,0))).eq.0))
then
        aggobs(:,i,nlons-1) = avg((/aggobs(:,i,nlons-2),aggobs(:,i,0)/))
    end if
end do
do j = 0,nlons-1
    do i = 1,nlats-2
        if
(num(ismissing(aggobs(:,i,j))).gt.0.and.num(ismissing(aggobs(:,i-1,j))).gt.0.and.num(ismissing(aggobs(:,i+1,j))).eq.0)
then
            aggobs(:,i,j) = aggobs(:,i+1,j)
        end if
    end do
    do i = nlats-2,1,1
        if
(num(ismissing(aggobs(:,i,j))).gt.0.and.num(ismissing(aggobs(:,i+1,j))).gt.0.and.num(ismissing(aggobs(:,i-1,j))).eq.0)
then
            aggobs(:,i,j) = aggobs(:,i-1,j)
        end if
    end do
    if
(num(ismissing(aggobs(:,0,j))).gt.0.and.(num(ismissing(aggobs(:,nlats-1,j))).eq.0.or.num(ismissing(aggobs(:,1,j))).eq.0))
then
        aggobs(:,0,j) = avg((/aggobs(:,nlats-1,j),aggobs(:,1,j)/))
    end if
    if
(num(ismissing(aggobs(:,nlats-1,j))).gt.0.and.(num(ismissing(aggobs(:,nlats-2,j))).eq.0.or.num(ismissing(aggobs(:,0,j))).eq.0))
then
        aggobs(:,nlats-1,j) = avg((/aggobs(:,nlats-2,j),aggobs(:,0,j)/))
    end if
end do

-- 
Bridget Thrasher, PhD
Postdoctoral Researcher
Climate Central
www.climatecentral.org

_______________________________________________
ncl-talk mailing list
List instructions, subscriber options, unsubscribe:
http://mailman.ucar.edu/mailman/listinfo/ncl-talk
Received on Fri Jan 8 12:04:29 2010

This archive was generated by hypermail 2.1.8 : Tue Jan 12 2010 - 15:38:20 MST