Executables are available for
- linux RHEL5 and equivalent, 32-bit and 64-bit
- linux RHEL6 and equivalent, 32-bit and 64-bit
- Mac OSX 10
- Ferret v6.8 retains the full precision of all variables that it reads. Variables and calculations are double precision.
- Ferret v6.8 implements a 6-dimensioned grid.
Bug fixes and minor changes
- Simplified SHOW ATTRIBUTE command.
- The size of gif images is no longer limited.
- The SAMPLEXY function now handles modulo longitude data correctly.
- A bug in SCAT2GRIDGAUSS_ZT is fixed.
- Cannot define variable with names that coincide with operators.
All variables are stored and computations are done in double precision. Previously only coordinate data (the coordinate values that describe 1-D axes) were treated in double precision. The NetCDF library is used to read data from the data type in netCDF datasets and convert it to double-precision data.
Your existing scripts do not need any changes to run with double-precision Ferret. You will see little difference in output. Most computational results will not change significantly.
- This change will be most particularly helpful when you are working with variables representing time. In single-precision arithmetic we can only represent a couple of years of time in units of seconds, depending on where the time origin has been set. With double-precision, there is plenty of accuracy to handle 1-second time axes since year 0000. (Ferret has always represented coordinate axes in double precision for this reason, but user-defined variables were always single precision). For instance, here is a time axis defined with the default time origin in the year 1901, with units of minutes. We did not have enough precision to accurately represent the time coordinates if we want to put those coordinates into a user-defined variable and work with them.
NOAA/PMEL TMAP FERRET v6.72 Linux 2.6.18-274.el5PAE 32-bit - 09/13/11 18-Jul-12 16:19
yes? define axis/t=1-jan-1980:6-jan-1980:1/units=minutes minute_axisyes? sh axis/t="1-jan-1980:00:01":"1-jan-1980:00:10" minute_axis name axis # pts start end MINUTE_AXIS TIME 7201 r 01-JAN-1980 00:00 06-JAN-1980 00:00T0 = 15-JAN-1901 Axis span (to cell edges) = 7201 L T TBOX TBOXLO TSTEP (MINUTES) 2> 01-JAN-1980 00:01:00 1 01-JAN-1980 00:00:30 41529600 3> 01-JAN-1980 00:02:00 1 01-JAN-1980 00:01:30 41529600 4> 01-JAN-1980 00:03:00 1 01-JAN-1980 00:02:30 41529604 5> 01-JAN-1980 00:04:00 1 01-JAN-1980 00:03:30 41529604 6> 01-JAN-1980 00:05:00 1 01-JAN-1980 00:04:30 41529604 7> 01-JAN-1980 00:06:00 1 01-JAN-1980 00:05:30 41529608 8> 01-JAN-1980 00:07:00 1 01-JAN-1980 00:06:30 41529608 9> 01-JAN-1980 00:08:00 1 01-JAN-1980 00:07:30 41529608 10> 01-JAN-1980 00:09:00 1 01-JAN-1980 00:08:30 41529608 11> 01-JAN-1980 00:10:00 1 01-JAN-1980 00:09:30 41529608
With the variable TT now stored as a double-precision variable, this is no longer a problem.
NOAA/PMEL TMAP FERRET v6.8 Linux 2.6.18-308.8.2.el5PAE 32-bit - 07/16/12 18-Jul-12 16:19
yes? define axis/t=1-jan-1980:6-jan-1980:1/units=minutes minute_axisyes? sh axis/t="1-jan-1980:00:01":"1-jan-1980:00:10" minute_axis name axis # pts start end MINUTE_AXIS TIME 7201 r 01-JAN-1980 00:00 06-JAN-1980 00:00T0 = 15-JAN-1901 Axis span (to cell edges) = 7201 L T TBOX TBOXLO TSTEP (MINUTES) 2> 01-JAN-1980 00:01:00 1 01-JAN-1980 00:00:30 41529601 3> 01-JAN-1980 00:02:00 1 01-JAN-1980 00:01:30 41529602 4> 01-JAN-1980 00:03:00 1 01-JAN-1980 00:02:30 41529603 5> 01-JAN-1980 00:04:00 1 01-JAN-1980 00:03:30 41529604 6> 01-JAN-1980 00:05:00 1 01-JAN-1980 00:04:30 41529605 7> 01-JAN-1980 00:06:00 1 01-JAN-1980 00:05:30 41529606 8> 01-JAN-1980 00:07:00 1 01-JAN-1980 00:06:30 41529607 9> 01-JAN-1980 00:08:00 1 01-JAN-1980 00:07:30 41529608 10> 01-JAN-1980 00:09:00 1 01-JAN-1980 00:08:30 41529609 11> 01-JAN-1980 00:10:00 1 01-JAN-1980 00:09:30 41529610
- A symbol is defined on startup, FERRET_PRECISION, so that you can check in a script whether this is the double-precision version of Ferret.
- By default, data is written to NetCDF files using the same data type as the input data (for variables that come from netCDF files). For user-defined data or data read in from an ascii file, they will be written to NetCDF files as double precision. You may set the output data type, using the SET VAR/OUTTYPE command.
- Note that SET MEMORY now allocates the requested number of double-words of data. This means that your existing SET MEMORY commands will let you load the same grids of data, but will request twice the amount of memory from the operating system.
- The default for the length of grave-accent expressions is now 16 digits. The default for listings is still 4 digits, but any listing can be controlled with the PRECISION keyword, and the SET LIST/PRECISION changes the setting for the current Ferret session.
If you compile your own external functions, they must be re-compiled. You must add two gfortran compiler flags,-fdefault-real-8 -fdefault-double-8. These treat all REAL declarationsfunction as REAL*8, and keep REAL*8 as REAL*8, not changing that type. Italso takes care of constants so that numbers in expressions, such as tt =6.1*a are used as double-precision constants, and the calculation is donein double precision. If your functions call any C code, you will have to change declarations from float to double. There is a tar file at EF_double_precision.tar.gz that contains examples showing how we made changes using Ifdefs in the code, and a flag -Ddouble to be set in the Makefiles; note there is no need now for an extra dimension to handle string variables or double-precision work arrays (though it won't cause trouble if you leave it in). Refer to the External Functions documentation for notes about writing and using your own functions.
- The EOF functions (empirical orthogonal functions) did not return consistent results under 64-bit systems when we compiled them to run in double precision. We have replaced them with a new set of functions EOFSVD_space, EOFSVD_time, EOFSVD_stat. These run code to solve for the eigenfunctions and time variations, contributed by Billy Kessler (as was the code underlying the previous EOF functions). The solver is based on the Numerical Recipes svdcmp.f which uses a Singular Value Decomposition. This code returns identical or nearly identical results to the previous functions under older versions of Ferret. The new functions do not handle gappy data; they require that all timesteps have data for a result to be returned at a location. If you have gappy data, you could pre-fill it with one of the filling transformations. This code runs faster than the old EOF routines did.
- If you run LAS, the NEXT release of LAS will work fine with either Ferret v6.8 or the previous release Ferret v6.72. LAS v7.3 will not work correctly with Ferret v6.8.
- Two new dimensions are added to the four dimensions that typically represent X,Y,Z, and T. These new dimensions are called E and F. They may of course represent any coordinate direction but they are implemented in particular to let users represent an Ensemble, for instance a set of model runs; and Forecast time.
- Ferret can open Datasets that have 6-dimensioned grids, and create grids for the variables.
- Axes may be defined using DEFINE AXIS/E or DEFINE AXIS/F. F axes may be defined with time descriptions equivalent to Ferret's commands for T axes.
- The keywords for axes and directions are extended to E and F axes, except that the new pseudo-variables for the E and F axis coordinates are _E and _F, and the pseudo-variables for the indices on these axes are _M and _N. This means that existing scripts that use E, F, M, or N as variables will still work correctly. For symmetry, new pseudo-variables _X, _Y, _Z, _T, _I, _J, _K, and _L are defined for the original 4 Ferret dimensions. The "box" pseudo-variables to get grid-cell information are called EBOX, EBOXHI, EBOXLO, etc.
DEFINE AXIS/F="1-jan-1980":"1-jan-1982":48/t0="1-jan-1920" forecast48
DEFINE GRID/F=forecast48 g48
LET a48 = _F[g=g48]
LET fboxes = FBOX[gF=g48]
Here's another. Note how /M is the qualifier for the repeat loop, but _M is the pseudo-variable
let a = _m;\
Regridding uses the usual syntax:
LET newvar = oldvar[GXYE=file_var]
- The output of SHOW and STAT commands that list information about the grid, now shows information about axes 5 and 6.
yes? use coads_climatology
yes? sh dat
currently SET data sets:
1> ./coads_climatology.cdf (default)
name title I J K L M N
SST SEA SURFACE TEMPERATURE 1:180 1:90 ... 1:3 ... ...
yes? sh grid sst
name axis # pts start end
COADSX LONGITUDE 180mr 21E 19E(379
COADSY LATITUDE 90 r 89S 89N
TIME TIME 3mr 16-JAN 06:00 17-MAR 02:58
yes? stat speh
LONGITUDE: 20E to 20E(380)
LATITUDE: 90S to 90N
TIME: 01-JAN 00:45 to 31-DEC 06:34
DATA SET: /home/users/tmap/ferret/linux/fer_dsets/data/coads_climatology.cdf
Total # of data points: 194400 (180*90*1*12*1*1)
# flagged as bad data: 93677
Minimum value: 0.05
Maximum value: 25.593
Mean value: 11.646 (unweighted average)
Standard deviation: 5.4955
When working with 4-D data, the descriptions of the E and F directions clutters up the output. You can
yes? CANCEL MODE 6D_LAB
and then the listings will show only the first 4 axes as always. This mode applies only to the SHOW output; it doesn't change the ability to work with 6D grids, including LISTing data to the screen or to files.
- A new command, DEFINE DATA/AGGREGATE lets you set up an ensemble dataset from a group of existing datasets, say a collection of model runs. Specify the datasets, and Ferret will create a virtual dataset containing all of the variables that have the same name and grid in all files. Ferret defines an E-axis and the ensemble members are aggregated in the E direction to create a virtual dataset. See the Ferret Users Guide documentation on DEFINE DATA for the details.
This capability, to define virtual datasets within a Ferret session will be expanded and refined as it is used more and we find ways to improve upon it. Please report your experiences and send ideas to the Users List or to the contact email listed on the Ferret contacts page.
- Existing external functions will work on variables having 4D grids. (Note you need to recompile them because this Ferret is double precision, see above). To write functions that work with 6D grids, there is a new family of utility functions which make the settings for 6D grids. They're exactlylike the equivalent 4D functions but they expect 6-dimensioned arguments, or where the arguments refer to dimensions, they will need arguments in the E and F directions.
Bug fixes and minor changes
- Simplified SHOW ATTRIBUTE command
Previously we had these commands to examine the attributes of variables and datsets:
SHOW ATTRIBUTES/ALL varname ! to list the attributes of the variable
SHOW DATA/ATTRIBUTES dset ! to list all attributes of datasets
In V6.8, we also allow:
SHOW ATTRIBUTES varname ! to list the attributes of the variable
SHOW ATTRIBUTES dset ! to list all attributes in a dataset
- The size of the plot window is no longer limited. This means that in gif mode (start Ferret with "ferret -gif") you can give Ferret a very large size in SET WINDOW/SIZE= command. Recall that there is an FAQ about setting a particular image size in pixels for gif images, which gives the details about setting a gif image size. In standard x-windows mode, the window is no longer limited by the size of the monitor window, so the image may extend outside your viewing area, and in some instances Ferret may crash. In batch postscript mode, and when using metafiles, setting the size of the window has no effect.
- The SAMPLEXY function now handles modulo longitudes correctly. If the x locations at which to sample can be brought within the range of the modulo longitude axis, then the sampled variable is returned at the locations.
- A bug in scat2gridgauss_zt had it always returning an error about an irregular T axis. This is fixed.
- Cannot define variable with names that coincide with operators. The operators are AND, OR, GT, GE, LT, LE, EQ, NE, IF , and ELSE. Previously the LET command allowed us to define a variable having these names, as in "LET and = 6", but then when we went to use the variable, we'd get a syntax error. Now the LET command will issue an error message if these names are given as the variable name.
yes? LET AND = 5
**ERROR: command syntax: illegal name, matches an operator: AND