Re: diurnal cycle over a subregion

From: Dennis Shea <shea_at_nyahnyahspammersnyahnyah>
Date: Fri, 14 Dec 2007 11:21:03 -0700

Some approaches that might help.
Caveat: I have not really looked at this in detail.
I'm not sure how days fits into this.

I always suggest using variables for subscripts. I makes changing
regions easier.

    iyStrt = 71
    iyLast = 92
    ixStrt = 43
    ixLast = 61

     RAIN = rain(iyStrt:iyLast, ixStrt:ixLast) ; subset and copy
meta data
     RAIN = where(RAIN.gt.0, RAIN, RAIN@_FillValue)
     nRAIN = num( .not. ismissing(RAIN) ) ; total number of rain
events in region
    
      nDAYS = 31
      nHR = 8
      rdc = new( nHR, typeof(RAIN) , RAIN@_FillValue)
      cnt = new( nHR, "integer", -999)

      rdc = 0.0
      cnt = 0.0

       n = 0
       do days=0,nDAYS-1
           do hr=0,nHR-1
                n=n+1
               rdc(hr) = sum( RAIN(:,:,hr) ) + rdc(hr)
               cnt(hr) = num( .not.ismissing( RAIN(:,:,hr) ) ) ) cnt(hr)
           end do
      end do

Please note that the dim_cumsum function could possibly be used

    http://www.ncl.ucar.edu/Document/Functions/Built-in/dim_cumsum.shtml

   

Mary Haley wrote:
> On Wed, 12 Dec 2007 jimmyc_at_iastate.edu wrote:
>
>> All I have a 3 dimensional array (i,j,time) of 3-hrly rain rate and
>> want to compute the diurnal cycle.
>>
>> I attempted to do a loop like this
>> n=0
>> do days=0,30
>> do hr=0,7
>> n=n+1
>> do ix=43,61
>> do iy=71,92
>> if(rain(iy,ix,hr) .gt. 0.0000)then
>> rdc(hr) = rain(iy,ix,hr) + rdc(hr)
>> cnt(hr) = cnt(hr) + 1
>> end if
>> end do
>> end do
>> end do
>> end do
>
> All,
>
> James figured out the problem using WRAPIT and Fortran code, but I just
> wanted to point out that you usually can avoid nested loops like this,
> by using NCL's array syntax, and the "ind" or "where" functions.
>
> For example, the above loop can be partially improved by
> removing the "hr" loop. (BTW, I'm not sure what the "days" loop
> is doing here, because "days" is not referenced by anybody,
> so it appears that the exact same calculations are being
> done 31 times).
>
> Anyway, here's a slight (untested) code change that would help:
>
> do days=0,30
> n=n+1
> do ix=43,61
> do iy=71,92
> ihr = ind(rain(iy,ix,:).gt.0.0000)
> if(.not.any(ismissing(ihr))) then
> rdc(ihr) = rain(iy,ix,ihr) + rdc(ihr)
> cnt(ihr) = cnt(ihr) + 1
> end if
> delete(ihr) ; necessary as it may be different size next time
> end do
> end do
> end do
>
>
> --Mary
>
>> Now the code gets into the if block but the value of rdc is the
>> _FillValue of -999 . So, the documentation states that when asigning
>> one variable to another they need to be the same shape. Is there a
>> way to do the sum either more simply than with loops or am I stuck in
>> Fortran language techniques?
>>
>> I do define the rdc,cnt,rain arrays prior to the loop.
>> And I can printVarSummary all of them, just no values accumulate in
>> the rdc array.
>>
>> Thanks for your time.
>>
>> --
>> James Correia, Jr. PhD.
>> Email: jimmyc @ iastate.edu
>> Email: jimmyc42 @ gmail.com
>> Web: http://bruce.agron.iastate.edu/jimmyc/
>> *********************************************

_______________________________________________
ncl-talk mailing list
ncl-talk_at_ucar.edu
http://mailman.ucar.edu/mailman/listinfo/ncl-talk
Received on Fri Dec 14 2007 - 11:21:03 MST

This archive was generated by hypermail 2.2.0 : Mon Dec 17 2007 - 08:25:02 MST