possible bug or change regarding logical variables in NCL 5.1.0

From: Jonathan Vigh <vigh_at_nyahnyahspammersnyahnyah>
Date: Mon, 09 Mar 2009 22:10:46 +0000

Greetings,
    Upon upgrading to the new version of NCL (5.1.0), one of my
functions stopped working. I now get the following error:
 
warning:Logical type variable (whitespace) missing value can only be set
to Missing: setting to Missing
 fatal:Subscript out of range, error in subscript #0
 fatal:An error occurred reading tChr
 fatal:Execute: Error occurred at or near line 322 in file
./module_read_vdm.ncl

As you'll see in this function, I'm defining the _FillValue for a
logical variable (whitespace) to be False rather than the default (-1)
so that I can use it do some mask operations. For some reason, the new
NCL doesn't seem to like this. Has there been a change to the behavior
or handling of logical variables? My function code is below.

Jonathan

;----------------------------------------------------------------------
; This function parses a string into an array holding each
; of the strings ("words" or space- or tab-delimited items) with
; whitespace removed.
;
; It changes all the characters to upper case
;
; Author: Jonathan Vigh
;----------------------------------------------------------------------
undef("parse_by_whitespace")
function parse_by_whitespace(tStr[1]:string)
local
space,tab,ii,is,tStr,tChr,nchars,stringOn,string_begin,string_end,string_begin_indices,string_end_indices,nparsed_strings,output_array

begin
  space = inttochar(32)
  tab = inttochar(9)
  nullChar = inttochar(0)

  tChr = stringtochar(tStr)
  nchars = dimsizes(tChr)

; Get indices where there are no whitespaces .
  ii = ind(tChr.ne.space.and.tChr.ne.tab.and.tChr.ne.nullChar)

  if (.not.all(ismissing(ii))) then ; First check to make sure the
tStr isn't completely devoid of whitespace delimiters

; mask out a logical array that starts off being filled with 'True',
then falsified by tests (using mask)
     whitespace = new(nchars+2,"logical") ; make this bigger than the
actual character array by adding a phantom space in the beginning and
end

     whitespace = True ; all positions are assumed to be
whitespace at first (including the first and last positions which are
really phantom positions)
     whitespace@_FillValue = False

     notwhitespace = whitespace ; transfer to another array which
we will later make the opposite of whitespace
     notwhitespace(0) = False ; the first position in the array
is phantom and must always be whitespace
     notwhitespace(nchars+1) = False ; the last position in the array
is phantom and must always be whitespace

     whitespace(1:nchars) =
mask(whitespace(1:nchars),tChr.ne.space.and.tChr.ne.tab.and.tChr.ne.nullChar,False)
; mask all the nonwhitespace positions to be False, so what's left are
the whitespaces (as True)
     notwhitespace(1:nchars) =
mask(notwhitespace(1:nchars),tChr.eq.space.or.tChr.eq.tab.or.tChr.eq.nullChar,False)
; mask all the whitespace positions to be False, so what's left are the
nonwhitespaces (as True)
 
; explanation of the logic - the only way a string can begin is if the
current character position is NOT whitespace, so we start with an array
of all positions where this is True
; next we mask out all the possible ways a string can NOT start (i.e. if
the previous character position is also NOT whitespace)
     string_begin =
mask(notwhitespace(1:nchars),notwhitespace(0:nchars-1),False)

; and now we mask out all the possible ways a string can NOT end (i.e.
if the next character position is also NOT whitespace)
     string_end =
mask(notwhitespace(1:nchars),notwhitespace(2:nchars+1),False) ; now
mask as True all positions where the next character is whitespace but
the current one isn't

     string_begin_indices = ind(string_begin.eq.True)
     string_end_indices = ind(string_end.eq.True)

; Now load the parsed strings into a return array of strings
     nparsed_strings = dimsizes(string_begin_indices)

; Set up the output array filled with empty strings
     output_array = new(nparsed_strings,"string",string_FillValue)

     if (nparsed_strings .ge. 1) then
        do is = 0, nparsed_strings-1
           output_array(is) =
chartostring(tChr(string_begin_indices(is):string_end_indices(is)))
  ; <- this is line 322 in the original file - the error message
references this line
        end do
     else
        output_array = string_FillValue
     end if

  else
     output_array = tStr
  end if

  return(output_array)
end

_______________________________________________
ncl-talk mailing list
List instructions, subscriber options, unsubscribe:
http://mailman.ucar.edu/mailman/listinfo/ncl-talk
Received on Mon Mar 09 2009 - 16:10:46 MDT

This archive was generated by hypermail 2.2.0 : Mon Mar 09 2009 - 21:47:10 MDT