Re: problem with dim_pqsort?

From: Mary Haley <haley_at_nyahnyahspammersnyahnyah>
Date: Mon, 21 Sep 2009 12:24:21 -0600 (MDT)

Melissa,

I ran some tests using different versions of NCL on dim_pqsort, and
for at least three versions back, I got the same results: you cannot
reorder an arry directly in a call to dim_pqsort and have the
reordered array saved upon exit. *This is not a bug*.

As Dennis pointed out in an earlier posting , this is because a
temporary variable has to be created when you do the reorder, and
"dim_pqsort" doesn't know anything about the original array to
reorder it upon return.

The example on the dim_pqsort page that you reference is passing in
opt=1, which specifies to *not* reorder the original array. You are
using opt=2 which is to reorder the original array.

I've added a caveat to this page that explains if you want the
original array reordered, then you either need to use a temporary
variable and reassign it upon exit, or, better yet, use dim_pqsort_n.

--Mary

>>>>> with this function anymore? There is still an example on the function
>>>>> page using it. dim_pqsort_n solves this problem, but that requires
>>>>> finding and replacing dim_pqsort in a number of my functions.

On Fri, 18 Sep 2009, Mary Haley wrote:

>
> Hi Melissa,
>
> While dim_psqort_n fixes the problem, I think the original problem
> you reported may be a bug. We'll look into it.
>
> --Mary
>
> On Thu, 17 Sep 2009, Melissa Bukovsky wrote:
>
>> Yes, dim_pqsort_n does solve the problem. If your theory on how the
>> function works is correct, it's a change from previous ncl versions
>> (this wasn't a problem before).
>> In any case, it's been fixed using the new version of the function.
>>
>> Thanks for the feedback,
>>
>> Melissa
>>
>> Dennis Shea wrote:
>>> Consider
>>>
>>> pv22 = dim_pqsort(b2(nlsd|:,time|:),2)
>>>
>>> I *think* that NCL creates a temporary variable [say, "q"].
>>> This temporary variable which contains reordered "b2"
>>> is sorted correctly. However, the temporary variable
>>> "q" is not being placed back into the *original* variable
>>> "b2" address space.
>>>
>>> I have not tested but I speculate that using dim_pqsort_n
>>> will fix the problem
>>>
>>> pv22 = dim_pqsort_n(b2, 2, 0)
>>>
>>> Good Luck
>>>
>>>
>>>
>>> Rick Brownrigg wrote:
>>>> Hi Melissa,
>>>>
>>>> Curiously, if the reordered b2 is assigned to a variable first, and
>>>> then dim_pqsort is called on that variable, things seem to work (see
>>>> below). I know this doesn't answer your question directly nor
>>>> explain any change in behavior. I will try to find out more.
>>>>
>>>> Had you upgraded to a new NCL version since your scripts were
>>>> originally developed?
>>>>
>>>> Rick
>>>>
>>>> ...
>>>> b2!0 = "time"
>>>> b2!1 = "nlsd"
>>>> foo=b2(nlsd|:,time|:)
>>>> print(foo)
>>>>
>>>> Variable: foo
>>>> Type: float
>>>> Total Size: 32 bytes
>>>> 8 values
>>>> Number of Dimensions: 2
>>>> Dimensions and sizes: [nlsd | 4] x [time | 2]
>>>> Coordinates:
>>>> Number Of Attributes: 1
>>>> _FillValue : -999
>>>> (0,0) 54
>>>> (0,1) 98
>>>> (1,0) -999
>>>> (1,1) 5
>>>> (2,0) 3
>>>> (2,1) 34
>>>> (3,0) 455
>>>> (3,1) 0
>>>> ;;pv22 = dim_pqsort(b2(nlsd|:,time|:),2)
>>>> pv22 = dim_pqsort(foo, 2)
>>>> ;;print(b2)
>>>> print(foo)
>>>>
>>>> Variable: foo
>>>> Type: float
>>>> Total Size: 32 bytes
>>>> 8 values
>>>> Number of Dimensions: 2
>>>> Dimensions and sizes: [nlsd | 4] x [time | 2]
>>>> Coordinates:
>>>> Number Of Attributes: 1
>>>> _FillValue : -999
>>>> (0,0) 54
>>>> (0,1) 98
>>>> (1,0) -999
>>>> (1,1) 5
>>>> (2,0) 3
>>>> (2,1) 34
>>>> (3,0) 0
>>>> (3,1) 455
>>>>
>>>>
>>>>
>>>> On Sep 17, 2009, at 1:18 PM, Melissa Bukovsky wrote:
>>>>
>>>>> Hi,
>>>>>
>>>>> I have a handful of scripts that started failing recently (or giving
>>>>> very strange output). They used to work fine with the same
>>>>> dataset. I
>>>>> finally think I've figured out why, but the answer doesn't seem to
>>>>> make
>>>>> sense to me. I narrowed down the problem to the dim_pqsort function.
>>>>> It seems that it doesn't sort the input variable if I use named
>>>>> dimensions to reorder the input array anymore. Is this not supported
>>>>> with this function anymore? There is still an example on the function
>>>>> page using it. dim_pqsort_n solves this problem, but that requires
>>>>> finding and replacing dim_pqsort in a number of my functions.
>>>>>
>>>>> Instead of attaching my lengthy scripts, a command line test of the
>>>>> problem with comments added is pasted below. If I'm wrong about
>>>>> this or
>>>>> doing something wrong, please let me know.
>>>>>
>>>>> Thanks,
>>>>>
>>>>> Melissa
>>>>>
>>>>>
>>>>> /fs/home/bukovsky/ncl/phd/my_ncl_funct % ncl
>>>>> Copyright (C) 1995-2009 - All Rights Reserved
>>>>> University Corporation for Atmospheric Research
>>>>> NCAR Command Language Version 5.1.1
>>>>> The use of this software is governed by a License Agreement.
>>>>> See http://www.ncl.ucar.edu/ for more details.
>>>>> ncl 0> a = (/54,67,8,23,45,654,77/)
>>>>> ncl 1> b = a
>>>>> ncl 3> pv = dim_pqsort(a,2)
>>>>> ncl 4> print(a)
>>>>>
>>>>> Variable: a
>>>>> Type: integer
>>>>> Total Size: 28 bytes
>>>>> 7 values
>>>>> Number of Dimensions: 1
>>>>> Dimensions and sizes: [7]
>>>>> Coordinates:
>>>>> (0) 8
>>>>> (1) 23
>>>>> (2) 45
>>>>> (3) 54
>>>>> (4) 67
>>>>> (5) 77
>>>>> (6) 654
>>>>> ;NO PROBLEM WITH A 1D ARRAY, TRY A 2D...
>>>>>
>>>>> ncl 5> a2 = new( (/2,4/),float)
>>>>> ncl 6> print(a2)
>>>>>
>>>>> Variable: a2
>>>>> Type: float
>>>>> Total Size: 32 bytes
>>>>> 8 values
>>>>> Number of Dimensions: 2
>>>>> Dimensions and sizes: [2] x [4]
>>>>> Coordinates:
>>>>> Number Of Attributes: 1
>>>>> _FillValue : -999
>>>>> (0,0) -999
>>>>> (0,1) -999
>>>>> (0,2) -999
>>>>> (0,3) -999
>>>>> (1,0) -999
>>>>> (1,1) -999
>>>>> (1,2) -999
>>>>> (1,3) -999
>>>>>
>>>>> ncl 8> a2(0,0) = 54
>>>>> ncl 9> a2(0,2) = 3
>>>>> ncl 10> a2(0,3) = 455
>>>>> ncl 12> a2(1,0) = 98
>>>>> ncl 13> a2(1,1) = 5
>>>>> ncl 14> a2(1,2) = 34
>>>>> ncl 15> a2(1,3) = 0
>>>>> ncl 16> b2 = a2 ;save a2
>>>>> ncl 17> c2 = a2 ;save a2 again
>>>>> ncl 18> print(a2)
>>>>>
>>>>> ;ORIGINAL 2D ARRAY
>>>>> Variable: a2
>>>>> Type: float
>>>>> Total Size: 32 bytes
>>>>> 8 values
>>>>> Number of Dimensions: 2
>>>>> Dimensions and sizes: [2] x [4]
>>>>> Coordinates:
>>>>> Number Of Attributes: 1
>>>>> _FillValue : -999
>>>>> (0,0) 54
>>>>> (0,1) -999
>>>>> (0,2) 3
>>>>> (0,3) 455
>>>>> (1,0) 98
>>>>> (1,1) 5
>>>>> (1,2) 34
>>>>> (1,3) 0
>>>>> ncl 19> pv2 = dim_pqsort(a2,2)
>>>>> ncl 20> print(a2)
>>>>>
>>>>> ;SORTING IT WITHOUT REORDERING THE DIMENSIONS WORKED...
>>>>> Variable: a2
>>>>> Type: float
>>>>> Total Size: 32 bytes
>>>>> 8 values
>>>>> Number of Dimensions: 2
>>>>> Dimensions and sizes: [2] x [4]
>>>>> Coordinates:
>>>>> Number Of Attributes: 1
>>>>> _FillValue : -999
>>>>> (0,0) -999
>>>>> (0,1) 3
>>>>> (0,2) 54
>>>>> (0,3) 455
>>>>> (1,0) 0
>>>>> (1,1) 5
>>>>> (1,2) 34
>>>>> (1,3) 98
>>>>>
>>>>> ;TRY AGAIN REORDERING WITH NAMED DIMS...
>>>>> ncl 21> b2!0 = "time"
>>>>> ncl 22> b2!1 = "nlsd"
>>>>> ncl 23> pv22 = dim_pqsort(b2(nlsd|:,time|:),2)
>>>>> ncl 24> print(b2)
>>>>>
>>>>> ;B2 2D ARRAY SORTED, BUT IT DIDN'T WORK (THERE IS NO DIFFERENCE
>>>>> FROM THE
>>>>> ORIGINAL)
>>>>> Variable: b2
>>>>> Type: float
>>>>> Total Size: 32 bytes
>>>>> 8 values
>>>>> Number of Dimensions: 2
>>>>> Dimensions and sizes: [time | 2] x [nlsd | 4]
>>>>> Coordinates:
>>>>> Number Of Attributes: 1
>>>>> _FillValue : -999
>>>>> (0,0) 54
>>>>> (0,1) -999
>>>>> (0,2) 3
>>>>> (0,3) 455
>>>>> (1,0) 98
>>>>> (1,1) 5
>>>>> (1,2) 34
>>>>> (1,3) 0
>>>>> ncl 25> print(c2)
>>>>>
>>>>> ;C2 IS STILL THE ORIGINAL (TO COMPARE ABOVE)
>>>>> Variable: c2
>>>>> Type: float
>>>>> Total Size: 32 bytes
>>>>> 8 values
>>>>> Number of Dimensions: 2
>>>>> Dimensions and sizes: [2] x [4]
>>>>> Coordinates:
>>>>> Number Of Attributes: 1
>>>>> _FillValue : -999
>>>>> (0,0) 54
>>>>> (0,1) -999
>>>>> (0,2) 3
>>>>> (0,3) 455
>>>>> (1,0) 98
>>>>> (1,1) 5
>>>>> (1,2) 34
>>>>> (1,3) 0
>>>>>
>>>>> ;SORT DIMINSION 0 USING dim_pqsort_n NOW
>>>>> ncl 26> pv5 = dim_pqsort_n(b2,2,0)
>>>>> ncl 27> print(b2)
>>>>>
>>>>> ;THIS TIME IT WORKED
>>>>> Variable: b2
>>>>> Type: float
>>>>> Total Size: 32 bytes
>>>>> 8 values
>>>>> Number of Dimensions: 2
>>>>> Dimensions and sizes: [time | 2] x [nlsd | 4]
>>>>> Coordinates:
>>>>> Number Of Attributes: 1
>>>>> _FillValue : -999
>>>>> (0,0) 54
>>>>> (0,1) -999
>>>>> (0,2) 3
>>>>> (0,3) 0
>>>>> (1,0) 98
>>>>> (1,1) 5
>>>>> (1,2) 34
>>>>> (1,3) 455
>>>>>
>>>>> ;TO SEE THIS MORE EASILY
>>>>> ncl 28> print(b2(nlsd|:,time|:))
>>>>>
>>>>> Variable: b2 (subsection)
>>>>> Type: float
>>>>> Total Size: 32 bytes
>>>>> 8 values
>>>>> Number of Dimensions: 2
>>>>> Dimensions and sizes: [nlsd | 4] x [time | 2]
>>>>> Coordinates:
>>>>> Number Of Attributes: 1
>>>>> _FillValue : -999
>>>>> (0,0) 54
>>>>> (0,1) 98
>>>>> (1,0) -999
>>>>> (1,1) 5
>>>>> (2,0) 3
>>>>> (2,1) 34
>>>>> (3,0) 0
>>>>> (3,1) 455
>>>>>
>>>>> ;THIS IS A PROBLEM WITH 3D ARRAYS TOO, BUT I CUT THAT PART OUT (THOUGH
>>>>> THAT IS WHAT THE ORIGINAL PROBLEM WAS WITH)
>>>>>
>>>>> _______________________________________________
>>>>> ncl-talk mailing list
>>>>> List instructions, subscriber options, unsubscribe:
>>>>> http://mailman.ucar.edu/mailman/listinfo/ncl-talk
>>>>
>>>> _______________________________________________
>>>> ncl-talk mailing list
>>>> List instructions, subscriber options, unsubscribe:
>>>> http://mailman.ucar.edu/mailman/listinfo/ncl-talk
>>
>> _______________________________________________
>> ncl-talk mailing list
>> List instructions, subscriber options, unsubscribe:
>> http://mailman.ucar.edu/mailman/listinfo/ncl-talk
>>
> _______________________________________________
> ncl-talk mailing list
> List instructions, subscriber options, unsubscribe:
> http://mailman.ucar.edu/mailman/listinfo/ncl-talk
>
_______________________________________________
ncl-talk mailing list
List instructions, subscriber options, unsubscribe:
http://mailman.ucar.edu/mailman/listinfo/ncl-talk
Received on Mon Sep 21 2009 - 12:24:21 MDT

This archive was generated by hypermail 2.2.0 : Thu Sep 24 2009 - 13:55:09 MDT