[ncl-talk] Using functions
Wei Huang
huangwei at ucar.edu
Thu Jan 15 08:57:11 MST 2015
Emma,
Your function is slow is because you did not take the advantage of NCL's
array operation, but looped through individuals.
You may try to change your code to something like:
undef("Qsave")
function Qsave(quality:numeric)
local ntime,nxtrack,nx,ii,ic,bit,bstr,nn,mm,xq,xq_tmp,xq_ref,xq_ref1
begin
xq_ref1 = "1010101010011111" ; Never allow these flags to be set in the
filtering
xq_ref = stringtocharacter(xq_ref1)
nbits = dimsizes(xq_ref)
q_save = new(dimsizes(quality),integer)
dims = dimsizes(quality)
ntime = dims(2)
nxtrack = dims(1)
ii = touint(quality)
bstr = new((/ntime, nxtrack/), string)
bstr = ""
ic = ii
do nn = 0, nbits-1
bit = (ic % 2) ; pick off the lowest bit
ic = ic/2 ; shift right one bit, drop lowest
bstr = bit + bstr
end do ; nn
xq = toint64(bstr)
q_save(nt,nx) = where(xq .eq. 0, 0, 1)
return(q_save)
end
and let us know if this works for your case.
Regards,
Wei
================================================
1850 Table Mesa Dr.
Boulder, CO 80307
Phone: 303-497-8924
On Thu, Jan 15, 2015 at 3:35 AM, Emma Andersson <emma.andersson at chalmers.se>
wrote:
> Hi NCL-talk,
>
> I’m having some trouble with a my own written function that I call within
> a loop.
>
> The function I’ve written converts quality flags from a satellite data set
> into an array of integers with zeros and ones.
> The quality flags are given in ushort and corresponds to a 16-bit number.
> What I do is that I check each pixels
> bit number if certain flags has been set. I compare with a reference bit
> number which contains the flags that I don’t want to be set
> and then determines whether my new array value should be set to a one or a
> zero. I have basically written a kind of “bitand” function,
> where if the output from the comparison are all zeros then I set my new
> array value to zero. I hope this description was understandable.
>
> What happens when I call my function from a main script, is that it goes
> slower and slower for each step in the loop. My question is,
> why it goes slower? Is something accumulating inside the function for each
> time I call it? I’m quite sure it doesn’t accumulate outside
> in the main script, because I did some print statements inside the
> function and it was clearly there it was going slower. I also delete
> the output in the main script after it being used? Would it be better to
> use a procedure instead of a function?
>
> Kind regards,
> Emma Andersson
>
>
> -----------------------------------------------------------------------------------
> PhD student
> Global Environmental Measurement Techniques and Modelling
> Earth and Space Sciences
> Chalmers University of Technology
> Gothenburg, Sweden
> emma.andersson(at)chalmers.se
>
> -----------------------------------------------------------------------------------
>
>
>
>
>
>
> _______________________________________________
> ncl-talk mailing list
> List instructions, subscriber options, unsubscribe:
> http://mailman.ucar.edu/mailman/listinfo/ncl-talk
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mailman.ucar.edu/pipermail/ncl-talk/attachments/20150115/cceb80b6/attachment.html
More information about the ncl-talk
mailing list