$Header: /cvsroot/nco/nco/doc/TODO,v 1.202 2003/01/20 23:39:59 zender Exp $ 

******************************************************************************
NCO Wish list:
Numbers were assigned in chronological order
Organization:
Autoconf build items: Items specifically related to building and installation
ncap-specific items: These items do not affect rest of NCO
NCO-wide items: 15 high priority items are shown first, then another ~100 items
******************************************************************************

Autoconf-build items:
06. Track VERSION in ./configure, use doc/VERSION for now
11. Use autoconf standard for VERSION, HOSTNAME, USER
14. Replace #ifdef tokens in NCO code with autoconf-style tokens, e.g., #ifdef HDF5 -> #ifdef HAVE_HDF5, etc. Other tokens to consider are WIN32, _OPENMP, I18N, _LIBINTL_H, USE_FORTRAN_ARITHMETIC (deprecated). Of course must modify bld/Makefile to pass these style tokens as well so that config.h is not _required_, and that token use is consistent.
17. Fix CXX valarray to work on AIX
19. Implement autotools processing of doc/nco.texi to generate standard documentation: nco.info, nco.dvi, nco.ps, nco.pdf
20. DODS linkage appears broken on Linux
22. Many compiler flags in configure.in should be compiler specific--not just OS specific, e.g., case $host in *-cray-unicos) case $CC in CC) CFLAGS= ....

ncap-specific items:
04. Fix memory leak in ncap_var_cnf_dmn() or delete routine completely after replacing it with ncap_var_stretch()
07. Combine binary operations into binary_op_var_var and binary_op_var_att types to reduce number of functions
08. Cure final few bothersome compilation warnings, mainly in bison.simple.
Note that fixing these via hardcoded prototypes should allow for pure_parser
to be turned off, since this apparently changes the prototypes.
ncap.tab.c (warning with Linux when compiling parser):
/usr/lib/bison.simple:432: warning: implicit declaration of function `yylex'
This must be something like
extern int yylex(YYSTYPE *,prs_arg); /* Prototype for lexer */
but where?
ncap.tab.c (IRIX warnings caused by using IRIX cc rather than GNU gcc, so 
function prototypes are dumbed-down in bison.simple, and size should be
cast to (unsigned char)):
cc-1177 cc: WARNING File = /usr/freeware/share/bison.simple, Line = 334
  The indicated argument is incompatible with the corresponding formal parameter.
        __yy_memcpy ((char *)yyss, (char *)yyss1, size * sizeof (*yyssp));
cc-1177 cc: WARNING File = /usr/freeware/share/bison.simple, Line = 336
  The indicated argument is incompatible with the corresponding formal parameter.
        __yy_memcpy ((char *)yyvs, (char *)yyvs1, size * sizeof (*yyvsp));
09. Add outer loop over files so script may apply to each file
12. Ensure lexer does not perform un-necessary work during initial_scan (e.g., LHS casting...)
13. Test that LHS casting works regardless of value of LHS template. If true, remove value initialization block
14. If tally is superfluous in ncap then do not ever allocate it
15. Link to GSL functions, especially gsl_sf_* (special functions)
16. Get ncap build working with pure_parser turned off so lex/yacc builds work
17. Start in console mode if no script and no output file specified, e.g., nco> 
19. Make all binary operators handle ordering of operands consistently, e.g., divide(1,2)=1/2 not 2/1
20. Print out contents of each non-comment statement when dbg_lvl==1
21. Add two-argument functions like fmodf to ncap_sym_init() (using va_args?)
25. Turn arbitrarily fixed size array tokens NCAP_ATT_LST_NBR_MAX, NCAP_SPT_NBR_MAX into dynamically allocatable arrays
26. Make sym_tbl_nbr dynamic by implementing sym_add(), sym_rm() functions or linked list
27. Write and implement ncap_var_var_pow(), currently only ncap_var_att_pow() and ncap_att_att_pow() work
28. Make provision for pack() and unpack() to copy all attributes except scale_factor and add_offset from disk into new variable on disk?
29. Rewrite nco_var_pck() to use var_scv() arithmetic operations rather than more complex var_var() operations
30. Allow -S to specify multiple input scripts to be sequentially parsed
31. Put globals fl_spt_crr,ncl_dpt_crr,ln_nbr_crr in prs_arg or remove fl_spt from it
32. Need filename expander and $NCO_DATA_PATH handling so #include's may be generic
33. Document new math/rounding functions (acosh, floor...)
34. Make parse errors always print current line to terminal rather than silently failing
36. cygwin builds of ncap.l and netcdf fail because of dependence on syslimits.h. non-kludge fix may require updated gcc and mingw packages
37. Implement float function definitions in nco_rth_flt as inline to improve speed for MACOSX builds (inline is OK in C99 but will it break C89?)
38. Finish dimension-reducing operations (min/max/avg)
39. Document procedure for computing covariance of two variables using http://jisao.washington.edu/data/nco/ as template
41. Make ncap function prototypes consistent with rest of NCO

Highest priority NCO-wide items that You can help with:
59. Add "averaged over dimension x from y to z" attribute to ncwa-processed variables
95. Handle CCM "time since..." conversions in ncrcat (use Unidata udunits)?
97. Add x_op=average... attributes to averagers for ncar_csm
124. Use `install' program and mkdir -p
128. Ensure target 'dir' is made before *.d dependency files 
150. Fully automate RPM production, e.g., 'make rpm' should build rpms and upload to redhat.com
152. Change make or nco_dst.pl to add docs to /usr/doc in RPM
164. Spiff up NCO homepage web page (Logo?)
165. Create Makefile dependency to do 'make dir' if lib, obj, bin directories do not exist
177. Make RPM production allowable by non-root, since building RPMs as sudo root screws up permissions in obj/bin directories of user
178. Make _FillValue behave same as missing_value
179. add netCDF to required packages list in RPM build
191. Create short man page for ncap which points user to info pages or online manual
212. Ensure structures are always passed by reference (default is pass by value)

Remaining items of lesser priority:
28. Use var.nc_id as file ID from now on and rewrite old routines to do so
32. Implement packing with scale_factor and add_offset in all pertinent operators
50. Allow user-specified scalar weights to ncwa
51. Make getopt() a shared subroutine?
53. Add -t wall clock timer option? (then again, users can always use, e.g., timex())
55. nco_var_cnf_dmn() should be able to expand (x,64,128) array into (nx,64,128) array (maybe)
58. Add -o fl_out switch to supercede positional argument (GNU style)
60. Make something that can mask a field without having to average over a dimension
66. Make history attribute get appended, rather than overwritten, when in append mode
69. ncks option for file/field summary: var name list,var min,max,avg,mss_val,# mss_val,
70. ncxx with no options should do usg_prn() without error msg (like ncwa does)
75. Add warning to ncwa triggered by averaging over lat without weighting by gw with NCAR_CSM_FORMAT
79. Allow ncrename .$var_nm syntax to work on all operators (so variables not present cause warning, not error)
82. Make libnco namespace-safe by prefixing all library subroutines with nco_
86. Extend stride/wraparound capability to all operators possible
92. ncrcat -O -v base_time,time_offset arm.cdf arm.cdf foo.nc;ncks -H -C -h foo.nc | m gives bad time_offset on LINUX not SUNMP (problem with LINUX adding record coordinate to open file?)
99. Allow ncatted to dump file in ncatted format
103. Implement trapezoidal rule option in ncra, ncea
104. Investigate/Document reliability of -A operator when appending from large rank variables to small rank files. Add error message when variables are same size but one has a degenerate dimension.
In general, adding large rank variable to small rank file does work, e.g.,
ncks -C -O -v one_dmn_rec_var in.nc foo.nc
ncks -C -A -v three_dmn_rec_var in.nc foo.nc
ncdump foo.nc
105. Add easy-to-read tabular display option for file contents for ncks
106. Add switch to keep degenerate dimensions with ncwa, remove them from ncra
109. Change copyright printing so order is NCO vrs, netCDF vrs, URL, Copyright
111. Investigate whether using ncwa to average files where variables of type 
NC_CHAR have a record dimension causes core dumps or other problems.
i.e., LSM variable timecom caused subtle ncra problems for a while.
Problem caused when weight or mask has dimension not in dimension extraction list
ncwa -O -C -D 5 -v fl_nm -w gw ~/nco/data/in.nc ~/foo.nc
fails because fl_nm has dimension char_dmn_lng but gw has dimension lat
call to nco_var_fll() for gw requires that lat be in dmn_lst
113. Rethink normalization switch options in ncwa
114. Fix nco_var_cnf_dmn() so that returned weight always has same size tally array as template variable
115. When sum of denominator in ncwa (i.e., sum of weight) is zero, SIGFPE results 
Users should not be doing weighted averages if denominator sums to zero, but...
Desired fix here is a graceful exit instead of core dump
121. Problem reported when mss_val = 0.0 in averagers. C and Fortran 
versions of nco_var_add_real() etc. do not handle missing_value attributes in 
exactly the same way. C versions test both operands agains mss_val,
Fortran tests only op1. Since running averages are initialized to 0.0 before
entry, problems arise in C version when missing_value = 0.0. Only fix seems
to be checking whether tally == 0 before checking whether op2 == mss_val
123. Add HTTP protocol to fl_get() (in addition to DODS)
127. Make mss: signal retrieval from NCAR mass store
134. Problem on CRAY with ncra test #2, averaging float whose
missing value is double:
ncra -O -C -v rec_var_flt_mss_val_dbl in.nc foo.nc;ncks -H foo.nc
ncra -O -C -d time,0,1 -v rec_var_flt_mss_val_dbl in.nc foo.nc ; ncks -H foo.nc
Not too worried about this since it is Cray specific, 
Maybe 1.0e36d does not convert to 1.0e36f on Crays?
138. If fastest varying dimension of NC_CHAR variable is of size one, then should not expect it to be NUL-terminated.
139. ncks does not correctly print coordinate indices in hyperslabs with wrapping
ncks -H -C -v one_dmn_rec_var -d time,9,6 ~/nco/data/in.nc
Must compute dmn_ss using WRP information for each dimension
140. ncks prints dimensional indices relative to disk values, but
variable index relative to hyperslab origin for all data types except
NC_CHAR. For NC_CHAR the variable index is also relative to the disk
value, not the hyperslab origin. 
141. NC_CHAR printing should include final dimension coordinates and
character ranges relative to disk. Change variable index-ranges to be
relative to hyperslab to be consistent with all other data types.
142. Implement some way of discriminating between NUL-terminated
strings and non-NUL-terminated characters arrays in ncks printouts.
Perhaps double quotes around former and single quotes around latter
143. Add -W or -q switch to turn off squelch most warning messages in ncra, ncrcat (especially warnings about non-monotonicity)
144. Add option(s) to select all N-D variables where N=0,1,2...
145. Talk to Brian and implement latest netCDF and CF conventions, e.g., time_op
146. Allow proxies for coordinate variables so that, e.g., hyperslabs
may be specified for "date" even though "time" is the coordinate. 
Proxies must be one dimensional and monotonic, of course.
147. Use builtin mkstemp() so file is built in fast directory rather than, say, NFS-mounted directory like /fs/cgd  
148. Put in more useful error diagnostics for Schweitzer's data holes
These only appear in ncra/ncrcat because ncks treats same hyperslab as a wrap!
Must define a consistent convention here
cd ~/nco/data
ncks -O -C -d lon,10.0,80.0 -v time_lon in.nc foo.nc;ncks -H foo.nc
ncrcat -O -C -d lon,10.0,80.0 -v time_lon in.nc foo.nc;ncks -H foo.nc
149. Add ncks hyperslab tests to nco_tst to catch inconsistencies like #148
151. Figure out how to dynamically modify web pages so files with
changing version numbers can be directly linked
154. Add mirror capability to web pages
158. Add policy for hyperslabbing single level values to User's Guide. 
Multi-file operators with record coordinate
treat single point hyperslabs differently than single file operators 
or than any operators with single point cuts on non-record coordinates.
See explanatory notes in nco_lmt_evl().
159. Add capability to handle superfluous intermediate files to ncra,
ncrcat when lmt_typ = dim_idx.
This would allow these multifile operators to handle hyperslabs where,
for example, every other file was not needed. This capability is already
implemented for lmt_typ = crd_val. This is an issue only when stride
is non-unity.
160. Add documentation of ncra, ncrcat superfluous file capabilities to nco.texi
162. Add GiNaC (Computer Algebra System) support to ncap www.ginac.de (maybe?)
163. Figure out way to make doc/TAG and doc/VERSION change automagically. Currently must be updated manually unless distribute with nco_dst.pl
166. Document 'make test' so people know it exists and use it
167. Improve/redesign test suite so it is more comprehensive and easier to add to
169. Merge TODO into sourceforge Task manager and bug manager as appropriate
173. Add switch to ncra which allows user to remove degenerate time dimension from result
174. Setup ncra,ncea,ncwa to do standard deviations sdn with one call
176. Replace Bison, Flex components of ncap with smaller C++ parser
182. Add -L switch to print license terms
187. Are OpenMP critical regions sufficient for netCDF or must all other threads stop completely?
188. Make binary RPMS build with DODS option
189. Verify ncrcat multithreading works, produced "not a netCDF file error" once
190. Make typ_pck et al. use nc_type enum or something sane for default
192. ncdiff will sometimes subtract files of incommensurate sizes without complaint
ncks -O -v one_dmn_rec_var -d time,0,1 in.nc foo1.nc
ncks -O -v one_dmn_rec_var -d time,0,2 in.nc foo2.nc
ncdiff -O foo1.nc foo2.nc foo3.nc
This may make sense, e.g., for 1-D record variables of different lengths, but not for multidimensional variables
Former case should print warning, latter case should exit with error
193. Convert dimension sizes from type "long int" to type "size_t"?
195. Itanium builds!
196. ncwa errors in nco_tst.sh tests 15--29 when built with HDF4 libraries
No ncwa problems when built with NETCDF2_ONLY with Unidata libraries
197. Construct HDF format in.hdf from in.cdl for testing HDF-enabled NCO:
ncks -O in.nc in.hdf 
Command executes but in.hdf is full of screwy values
198. HDF-enabled ncgen does not parse in.cdl
199. Internationalize (i18n) NCO with gettext()
202. Make nco_tst.sh somehow summarize its own errors, e.g., "Total errors reported = 12" so that regression testing is easier. Perhaps nco_tst.sh should be rewritten in Perl or Python to accomplish this.
203. Perform I/O timing tests with NCO 1.3.x vs NCO 1.2.x to see if netCDF3 interface really speeds up I/O
206. Add sample NCO script, such as dst.sh, to doc directory
209. Add rules to make MANIFEST and automagically update Sourceforge download area
214. Disable threads > 1 on SGI temporarily because thread #0 is doing all the work, why?
215. nco_var_cnf_dmn() does not abort when variables do not conform because dimension list of one is subset of other but ORDER of dimensions differs, e.g., a(lat,lev,lon) !~ b(lon,lev). Attempting this will return incorrect answers!
222. Warn when ncea/ncra/ncrcat/ncecat operate on scaled variables ("Results will be meaningless if scale_factor and add_offset are not identical in each file")
224. Copy var_nm from command line so program, not system, owns memory. Then modify nco_var_free() to release var_nm structure member, and nco_var_dpl() to copy it. Same for dimension names and nco_dmn_dpl()
225. Pass aed by reference in nco_aed_prc()
226. See if xrf in nco_var_cnf_dmn() is really necessary, if not, remove it and make wgt arg const var_sct * const
228. g++ linking requiring #ifndef GNUC++ around fabsf,fmodf defs in nco_var_scv.c
230. Keep track of type of missing_value field in variable structure for reasons described in nco_cnf_var_typ()/nco_cnv_mss_val_typ()
232. Warn when arithmetic operators encounter packed variables?
233. Makefile.old rule for make tst appears broken for long ftp rule
237. Break down nco.texi into bite-size chunks, e.g., one file per section
238. Replace y=(typ *)malloc(nbr*sizeof(typ)) with y=(typ *)malloc(nbr*sizeof(*y))?
239. Create one global compatibility file (nco_xpf.[ch]?) activated by HAVE_ or NEED_ actions so do not have multiple platform dependent #includes as is case now with HAVE_STRCASECMP, HAVE_STRDUP requiring nco_sng_utl.h
241. Add run-time switch which requests that output be missing_value where ANY of the input fields are missing_value. 
244. Get builds working on testdrive.hp.com
245. Eliminate all instances of passing naked constants
246. Deprecate USE_FORTRAN_ARITHMETIC from Makefile
************************************************************************
End NCO Wish list
************************************************************************

