[ncl-talk] problem with dim_avg_n and userdefined function (numeric and float)
李嘉鹏
lijpbasin at 126.com
Tue Oct 28 05:39:09 MDT 2014
I agree with 陶玮 on the second script.
To be sure, I replaced all the variable and function names while checking for typos, and eliminated as much code as possible to make the problem look more obvious (at least obvious enough for me) like a bug.
- The program crashed in the second loop (i = 2), causing a "Segmentation fault".
- I thought `numeric` is equivalent to `integer` since two integer values are passed to the function, so I tried `integer` too, same problem, and `float` did not cause any trouble.
Here is the script I tested:
undef("max2n")
function max2n(n1:numeric, n2:numeric) ; Crashes
;function max2n(n1:integer, n2:integer) ; Crashes
;function max2n(n1:float, n2:float) ; Fine
begin
if (n1 .ge. n2) then
return(n1)
else
return(n2)
end if
end
begin
; abnormal loops !!!!
do i=1, 2
print("i="+(/i/))
print("Before v=max2n(i-3,0)") ; Printed, got here
v=max2n(i-3,0)
print("After v=max2n(i-3,0)") ; Crashed, didn't get here
print("v is " + v)
end do
end
At 2014-10-28 12:53:25, "陶玮" <1201111616 at pku.edu.cn> wrote:
>Hi, everyone.
>Q1:
>I was using NCL V6.2.0 to extract data from WRF results, however, it seemed that there was a bug in function of dim_avg_n.To simplify matters, I used dummy data, the script is as follows:
>QUESTION 1:-----------------------------------------------------------------
>load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl"
>load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl"
>load "$NCARG_ROOT/lib/ncarg/nclscripts/wrf/WRFUserARW.ncl"
>
>begin
>
>nyears=5
>ncases=4
>nspec=4
>ntimes_real=680
>nvlevs=2
>
>colspectmp=new((/nyears,ncases,nspec,ntimes_real,100,100/), float)
>colspec=new((/nyears,ncases,nspec,100,100/), float)
>colspectmp=1.
>
>specdntmp=new((/nyears,ncases,nspec,ntimes_real,nvlevs,100,100/), float)
>specdn=new( (/nyears,ncases,nspec,nvlevs,100,100/), float)
>specdntmp=1.
>
>;abnormal !!!! It seemed that no values were passed to colspec !!!!
>colsepc=dim_avg_n((/colspectmp/), 3)
>print(avg(colspec))
>
>;normal !!!!
>specdn=dim_avg_n((/specdntmp/), 3)
>print(avg(specdn))
>
>end
>--------------------------------------------------------------------------------------
>
>Q2:What's the difference between numeric and float when using userdefined function. though max((/a,b/)) would do the same thing, I am
>eager to know the answer.
>QUESTION2---------------------------------------------------------------------------------
>load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl"
>load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl"
>load "$NCARG_ROOT/lib/ncarg/nclscripts/wrf/WRFUserARW.ncl"
>
>undef( "fmax2v")
>function fmax2v(x:float, y:float)
>begin
> if (x .ge. y) then
> return(x)
> else
> return(y)
> end if
>end
>
>undef( "max2v")
>function max2v(x:numeric, y:numeric)
>begin
> if (x .ge. y) then
> return(x)
> else
> return(y)
> end if
>end
>
>begin
>
>x=3
>
>; normal loops !!!!!
>do ii=1, 2
>do jj=1, 3
> print("ii="+(/ii/)+" jj="+(/jj/))
> print("1: "+(/fmax2v(ii-x,0)/))
> tmp=(/fmax2v(ii-x,0)/)
> print("2: "+ (/tmp/))
>end do
>end do
>
>; abnormal loops !!!!
>do ii=1, 2
>do jj=1, 3
> print("ii="+(/ii/)+" jj="+(/jj/))
> print("1: "+(/max2v(ii-x,0)/))
> tmp=(/max2v(ii-x,0)/)
> print("2: "+ (/tmp/))
>end do
>end do
>
>
>end
>--------------------------------------------------------
>
>With best regards.
>
>
>
>
>
>
>_______________________________________________
>ncl-talk mailing list
>List instructions, subscriber options, unsubscribe:
>http://mailman.ucar.edu/mailman/listinfo/ncl-talk
More information about the ncl-talk
mailing list