[ncl-talk] avoiding loops

Micah Sklut micahs2005 at gmail.com
Mon Sep 23 17:32:07 MDT 2019


Aha! Perfect, thanks Dennis.

On Mon, Sep 23, 2019 at 7:30 PM Dennis Shea <shea at ucar.edu> wrote:

>  If array 'x' is (say) float, abd you do
>
>    x = toint(x)   ; floattointeger(x)
>    print(typeof(x))   ; float
>
> the 'x' will still be float. NCL coerces to integer to float. Use the
> reassignment operator  :=
>
>   x *:=* toint(x)   ; use syntac := to reassign float to integer
>   print(typeof(x))   ; integer
>
> Then you can use the fortran integer  descriptors.
>
>
> On Mon, Sep 23, 2019 at 1:32 PM Dave Allured - NOAA Affiliate via ncl-talk
> <ncl-talk at ucar.edu> wrote:
>
>> Fortran 90+ also has I0 format to suppress leading zeros on integers.
>> Use that with integer data for this application.
>>
>> Floattointeger will not convert to integer if you assign the result to a
>> pre-existing float variable.  Try assigning the result to a new variable
>> not previously defined, or a previously defined variable of type integer.
>> Use printVarSummary to confirm.
>>
>> I think you could also use floattointeger in-line within the write_matrix
>> procedure call, and save a little memory that way.
>>
>>
>> On Mon, Sep 23, 2019 at 11:00 AM Micah Sklut <micahs2005 at gmail.com>
>> wrote:
>>
>>> NCL wont allow me to use i5 format on the variable. I've used the
>>> floattointeger, but when I print that variable, it still shows that is of
>>> type float, even though the values were properly converted to integer.
>>>
>>> On Mon, Sep 23, 2019 at 12:57 PM Dennis Shea <shea at ucar.edu> wrote:
>>>
>>>> *  fmtf*
>>>>
>>>> Format to be used, specified *via Fortran style*. The format string
>>>> used must agree with the variable type.
>>>>
>>>> ===
>>>>
>>>> Google fortran edit descriptors..
>>>>
>>>> "384(f0.1,','),f0.1"
>>>>
>>>> "384(i5,','),i5"
>>>>
>>>> On Mon, Sep 23, 2019 at 12:43 PM Micah Sklut via ncl-talk <
>>>> ncl-talk at ucar.edu> wrote:
>>>>
>>>>> This worked great Dave. I appreciate the great support. I did the
>>>>> asciiread to read back in all the string arrays, and then used write_table
>>>>> to format the final output.
>>>>>
>>>>> One last question. When formating the write_matrix calls, I'm trying
>>>>> to write a float variable to integer format.  When I use, floattointeger
>>>>> function, it properly converts the values to integers, however, it doesn't
>>>>> change the variable type in the metadata from float to integer. This
>>>>> doesn't allow me to write_matrix using integer format. Is there an easy way
>>>>> to get around this?
>>>>>
>>>>> On Sun, Sep 22, 2019 at 8:31 PM Dave Allured - NOAA Affiliate <
>>>>> dave.allured at noaa.gov> wrote:
>>>>>
>>>>>> Write_matrix is strictly for output to only a text file, or Unix
>>>>>> standard output.  There is no internal write capability.  However, you can
>>>>>> simulate internal writes by using one or more temporary files.
>>>>>>
>>>>>> Read the formatted lines back in from a temp file with asciiread
>>>>>> ("tmp.txt", -1, "string").  This gives you a 1-D array of strings, one full
>>>>>> line for each of your grid points.  Then repeat for each of your other
>>>>>> variables.  This will efficiently give you arrays of full formatted line
>>>>>> strings for several variables.
>>>>>>
>>>>>> You should then be able to join these line strings together, however
>>>>>> you have in mind.  Also, now that you are operating on strings, you can add
>>>>>> text columns at the beginning or end of each string, if this would be of
>>>>>> any help.  For example:
>>>>>>
>>>>>> long_lines = "precip," + p_lines(:) + ",Tmin," + tmin_lines(:) +
>>>>>> ",Tmax," + tmax_lines(:)
>>>>>>
>>>>>> This example is for joining horizontally.  You could also join
>>>>>> vertically by simply joining the string arrays, with or without
>>>>>> interleaving.  There are many variations on this theme, depending on how
>>>>>> you want your final output to be structured.
>>>>>>
>>>>>>
>>>>>> On Sun, Sep 22, 2019 at 5:29 PM Micah Sklut <micahs2005 at gmail.com>
>>>>>> wrote:
>>>>>>
>>>>>>> Instead of sending output to a file, is it possible to do a
>>>>>>> write_matrix formatting to 1d array?  I need to add more than 1 of these
>>>>>>> variables together, so if I can create 1d arrays for all of the variables
>>>>>>> and metadata, such as lat/lon, then I can use write_table to join
>>>>>>> everything together. When I'm re-ordering or reshaping the arrays, I'll
>>>>>>> just need to delete the old arrays, to free up memory.
>>>>>>>
>>>>>>> On Sun, Sep 22, 2019 at 1:51 PM Dave Allured - NOAA Affiliate <
>>>>>>> dave.allured at noaa.gov> wrote:
>>>>>>>
>>>>>>>> There is a mistake in the untested example that I sent.  Please
>>>>>>>> change the format spec from "384(f0.1,','),f0.1" to "383(f0.1,','),f0.1".
>>>>>>>> The latter is correct for 384 numbers per line.  I split the format spec
>>>>>>>> into two parts so that there would not be a trailing comma at the end of
>>>>>>>> each line.
>>>>>>>>
>>>>>>>> Generally speaking, the format spec in write_matrix is specified
>>>>>>>> for a single output line.  It is repeated for each output line.  It is
>>>>>>>> important that the total item count in the format spec (383 + 1 in this
>>>>>>>> case) exactly matches the intended number of items per line.
>>>>>>>>
>>>>>>>>
>>>>>>>> On Sun, Sep 22, 2019 at 11:32 AM Micah Sklut <micahs2005 at gmail.com>
>>>>>>>> wrote:
>>>>>>>>
>>>>>>>>> Okay, thanks, Dave.  That sounds like what I need. I've always
>>>>>>>>> struggled with the formatting in NCL, but I'll give that a go and see where
>>>>>>>>> I get.
>>>>>>>>>
>>>>>>>>> On Sun, Sep 22, 2019 at 1:26 PM Dave Allured - NOAA Affiliate <
>>>>>>>>> dave.allured at noaa.gov> wrote:
>>>>>>>>>
>>>>>>>>>> Try write_matrix and the F0 format descriptor.  F0 format is part
>>>>>>>>>> of fortran 90 and up.  It is described in modern fortran documentation.  It
>>>>>>>>>> is like the common Fw.d format descriptor, except leading blanks to the
>>>>>>>>>> left of the decimal point are suppressed.
>>>>>>>>>>
>>>>>>>>>> Reshape your array from, e.g. (lat,lon,time), to a 2-D array in
>>>>>>>>>> the desired output order, (points,time).  Npoints = Nlats x Nlons.  Then a
>>>>>>>>>> single call to write_matrix should write the entire output file:
>>>>>>>>>>
>>>>>>>>>>     opt = True
>>>>>>>>>>     opt at fout = "temperature.csv"
>>>>>>>>>>     write_matrix (data_out, "384(f0.1,','),f0.1", opt)
>>>>>>>>>>
>>>>>>>>>> You can add arbitrary extra numeric columns to the output array,
>>>>>>>>>> if it would be helpful to have lats and lons, or other such metadata, on
>>>>>>>>>> each line of output.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> On Sat, Sep 21, 2019 at 2:53 PM Micah Sklut via ncl-talk <
>>>>>>>>>> ncl-talk at ucar.edu> wrote:
>>>>>>>>>>
>>>>>>>>>>> Hi,
>>>>>>>>>>>
>>>>>>>>>>> I have a task to take GFS data and concatenate variables across
>>>>>>>>>>> all the forecast hours, for each grid point.
>>>>>>>>>>>
>>>>>>>>>>> For example, taking a temperature variable for each grid point,
>>>>>>>>>>> for all latitude and longitudes, and creating a string that represents the
>>>>>>>>>>> values for each forecast hour.
>>>>>>>>>>> So, if we have for latitude y, and longitude x, there would be a
>>>>>>>>>>> string value like "70.5,71.5,71.5,72.0,...nHours".  The end product will be
>>>>>>>>>>> a line for each grid point for the variables i"m looking at that will be
>>>>>>>>>>> written to a file to be imported into a database.
>>>>>>>>>>>
>>>>>>>>>>> Creating loops through all hours, latitudes, and longitudes will
>>>>>>>>>>> get the job done, but is expensive and was looking to see if there were any
>>>>>>>>>>> NCL functions that would help here.
>>>>>>>>>>>
>>>>>>>>>>> Thank you.
>>>>>>>>>>>
>>>>>>>>>> _______________________________________________
>
>
>> ncl-talk mailing list
>> ncl-talk at ucar.edu
>> List instructions, subscriber options, unsubscribe:
>> http://mailman.ucar.edu/mailman/listinfo/ncl-talk
>
> --
Micah Sklut
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.ucar.edu/pipermail/ncl-talk/attachments/20190923/f7e8c163/attachment.html>


More information about the ncl-talk mailing list