nco_c++/tst.cc File Reference

#include <iostream>
#include <map>
#include <string>
#include <valarray>
#include <netcdf.h>
#include <libnco_c++.hh>

Include dependency graph for tst.cc:

Go to the source code of this file.

Defines

#define XTKN2SNG(x)   #x
#define TKN2SNG(x)   XTKN2SNG(x)

Typedefs

typedef float prc_cmp
typedef std::map< std::string,
var_mtd_sct, std::less< std::string > > 
sng2var_mtd_map

Functions

int main (int argc, char **argv)


Define Documentation

#define TKN2SNG  )     XTKN2SNG(x)
 

Referenced by copyright_prn(), and main().

#define XTKN2SNG  )     #x
 


Typedef Documentation

typedef float prc_cmp
 

Definition at line 37 of file tst.cc.

typedef std::map<std::string,var_mtd_sct,std::less<std::string> > sng2var_mtd_map
 

Definition at line 40 of file tst.cc.


Function Documentation

int main int  argc,
char **  argv
 

Definition at line 42 of file tst.cc.

00043 {
00044   const std::string fl_in("in.nc"); // [sng] Input file
00045   const std::string fl_out("out.nc"); // [sng] Output file
00046   int rcd(0); // [rcd] Return success code
00047   long bnd_nbr(1); // [nbr] Number of bands
00048   long lat_nbr(1); // [nbr] Number of latitudes
00049   long lon_nbr(1); // [nbr] Number of longitudes
00050   long sz_nbr(1); // [nbr] Number of sizes
00051   register long idx; // [idx] Counting index
00052 
00053   const std::string CVS_Date("$Date: 2005/01/07 23:54:59 $"); // [sng] CVS date string
00054   const std::string CVS_Header("$Header: /cvsroot/nco/nco/src/nco_c++/tst.cc,v 1.16 2005/01/07 23:54:59 zender Exp $"); // [sng] CVS header string
00055   const std::string CVS_Id("$Id: tst.cc,v 1.16 2005/01/07 23:54:59 zender Exp $"); // [sng] CVS identification string
00056   const std::string CVS_Revision("$Revision: 1.16 $"); // [sng] CVS revision string
00057   const std::string date_cvs(CVS_Date.length() > 7 ? CVS_Date.substr(7,19) : static_cast<std::string>("Unknown")); // [sng] Date from CVS
00058   const std::string sbr_nm("main"); // [sng] Subroutine name
00059   const std::string prg_nm("libnco_c++"); // [sng] Program name
00060   const std::string vrs_cvs(CVS_Revision.length() > 10 ? CVS_Revision.substr(10,4) : static_cast<std::string>("Unknown")); // [sng] Version from CVS
00061 #define XTKN2SNG(x) #x
00062 #define TKN2SNG(x) XTKN2SNG(x)
00063   const std::string date_cpp(__DATE__); // [sng] Date from C pre-processor
00064   const std::string time_cpp(__TIME__); // [sng] Time from C pre-processor
00065   const std::string vrs_cpp(TKN2SNG(VERSION)); // [sng] Version from C pre-processor
00066   const std::string hst_cpp(TKN2SNG(HOSTNAME)); // [sng] Hostname from C pre-processor
00067   const std::string usr_cpp(TKN2SNG(USER)); // [sng] Hostname from C pre-processor
00068   if(vrs_cvs == "Unknown") std::cerr << prg_nm << " version " << vrs_cpp << " built " << date_cpp << " on " << hst_cpp << " by " << usr_cpp << std::endl;
00069   if(vrs_cvs != "Unknown") std::cerr << prg_nm << " version " << vrs_cvs << " last modified " << date_cvs << " built " << date_cpp << " on " << hst_cpp << " by " << usr_cpp << std::endl;
00070 
00071   // Open input file
00072   int nc_id=nco_open(fl_in,NC_NOWRITE); // [fnc] Open netCDF file
00073   // Input required data
00074   const long wvl_nbr(nco_inq_dimlen(nc_id,static_cast<std::string>("wvl"))); // [nbr] Number of wavelengths
00075   std::cerr << "Number of wavelengths in "+fl_in+" is "<< wvl_nbr << std::endl;
00076   /* netCDF C++ interface automatically allocates memory required by get_var()
00077      User is responsible for freeing this memory when no longer needed
00078      Currently this is done after input array is written to output file */
00079   prc_cmp *wvl; // [m] Wavelength
00080   rcd=nco_get_var(nc_id,static_cast<std::string>("wvl"),wvl); // [m] Wavelength
00081   std::cerr << "Value of wvl[0] in "+fl_in+" is "<< wvl[0] << std::endl;
00082   rcd=nco_close(nc_id); // [fnc] Close netCDF file
00083   std::valarray<prc_cmp> wvl_valarray(0.0,wvl_nbr); // [frc] 
00084 
00085   // Allocate dynamic arrays
00086   prc_cmp *sz=new prc_cmp[sz_nbr]; // [m] Size at bin center
00087   long double *sz_ldb=new long double[sz_nbr]; // [m] Size at bin center
00088 
00089   // Dummy data
00090   for(idx=0;idx<sz_nbr;idx++){
00091     sz[idx]=0.5e-6; // [m] Size at bin center
00092     sz_ldb[idx]=sz[idx]; // [m] Size at bin center
00093   } // end loop over idx
00094 
00095   // Open output file
00096   const int nc_out(nco_create(fl_out,NC_CLOBBER)); 
00097   const nc_type nco_xtyp(nco_get_xtype(static_cast<prc_cmp>(1.0))); // [enm] External netCDF type
00098   std::cout << "INFO External netCDF type of prc_cmp variables will be " << nco_typ_sng(nco_xtyp) << std::endl;
00099  
00100   // Create dimensions
00101   const int sz_dmn(nco_def_dim(nc_out,static_cast<std::string>("sz"),sz_nbr)); // [dmn] Size dimension
00102   const int bnd_dmn(nco_def_dim(nc_out,static_cast<std::string>("bnd"),bnd_nbr)); // [dmn] Band dimension
00103   const int wvl_dmn(nco_def_dim(nc_out,static_cast<std::string>("wvl"),wvl_nbr)); // [dmn] Wavelength dimension
00104 
00105   // Derive dimensions
00106   const int dmn_bnd_sz[2]={bnd_dmn,sz_dmn};
00107   const int *dmn_sz(&sz_dmn); // [dmn] Pointer to size dimension
00108   const int *dmn_wvl(&wvl_dmn); // [dmn] Pointer to wavelength dimension
00109   const int CEWI_int(-2147483647); // [frc] Compiler Error Warning Initializer for int
00110   const int *dmn_scl(&CEWI_int); // [dmn] Dummy argument, not used
00111 
00112   std::cerr << "Currently there are " << nco_inq_ndims(nc_out) << " dimensions defined" << std::endl;
00113 
00114   // Global attributes
00115   rcd=nco_put_att(nc_out,NC_GLOBAL,"CVS_Id",CVS_Id);
00116 
00117   var_mtd_sct var_mtd[]={
00118     {0,"wvl",nco_xtyp,1,dmn_wvl,"long_name","Wavelength at band center","units","meter"},
00119     {0,"wvl_valarray",nco_xtyp,1,dmn_wvl,"long_name","valarray","units","meter"},
00120     {0,"sz",nco_xtyp,1,dmn_sz,"long_name","Size at bin center","units","meter"},
00121     {0,"sz_ldb",nco_xtyp,1,dmn_sz,"long_name","Size at bin center","units","meter"},
00122     {0,"sz_nbr",NC_INT,0,dmn_scl,"long_name","Number of sizes","units","number"},
00123   }; // end var_mtd_sct var_mtd[]
00124   const int var_mtd_nbr(sizeof(var_mtd)/sizeof(var_mtd_sct));
00125 
00126   sng2var_mtd_map var_mtd_map;
00127   for(idx=0;idx<var_mtd_nbr;idx++){
00128     /* fxm: Define variables before inserting into map, because map values 
00129        seem to be unwritable (read-only) once they are in map. */
00130     rcd=nco_def_var(nc_out,var_mtd[idx].nm,var_mtd[idx].type,var_mtd[idx].dmn_nbr,var_mtd[idx].dmn_id,var_mtd[idx].var_id);
00131     var_mtd_map.insert(sng2var_mtd_map::value_type(var_mtd[idx].nm,var_mtd[idx]));
00132   } // end loop over itr
00133 
00134   sng2var_mtd_map::const_iterator var_mtd_itr;
00135   for(var_mtd_itr=var_mtd_map.begin();var_mtd_itr!=var_mtd_map.end();++var_mtd_itr){
00136     // Write first attribute (long_name)
00137     rcd=nco_put_att(nc_out,var_mtd_itr->second.var_id,var_mtd_itr->second.att_1_nm,var_mtd_itr->second.att_1_val);
00138     // Write second attribute (units)
00139     rcd=nco_put_att(nc_out,var_mtd_itr->second.var_id,var_mtd_itr->second.att_2_nm,var_mtd_itr->second.att_2_val);
00140     std::cout << "Defined " << var_mtd_itr->first << " with long_name = " << var_mtd_itr->second.att_1_val << " and units = " << var_mtd_itr->second.att_2_val << std::endl;
00141   } // end loop over var_mtd_itr
00142 
00143   // Leave define mode
00144   rcd=nco_enddef(nc_out,NC_ENOTINDEFINE); // [fnc] Leave define mode
00145 
00146   // Write data and delete dynamic arrays
00147   // Syntax valid for statically allocated arrays foo[dim1][dim2]
00148   // rcd=nco_put_var(nc_out,static_cast<std::string>("tpt_d2d"),&tpt_d2d[0]);
00149   // Syntax valid for vector< vector<prc_cmp> > foo(dim1,vector<prc_cmp>(dim2))
00150   // rcd=nco_put_var(nc_out,static_cast<std::string>("tpt_v2d"),&tpt_v2d[0][0]);
00151   // Syntax valid for vector<prc_cmp> foo(dim1*dim2)
00152   // rcd=nco_put_var(nc_out,static_cast<std::string>("tpt_v1d"),&tpt_v1d[0]);
00153   // Syntax valid for a2d_cls<prc_cmp> foo(dim1,dim2)
00154   // rcd=nco_put_var(nc_out,static_cast<std::string>("tpt_a2d"),&tpt_a2d(0,0));
00155   rcd=nco_put_var(nc_out,static_cast<std::string>("wvl_valarray"),wvl_valarray);
00156   rcd=nco_put_var(nc_out,static_cast<std::string>("wvl"),wvl); delete []wvl;
00157   rcd=nco_put_var(nc_out,static_cast<std::string>("sz"),sz); delete []sz;
00158   rcd=nco_put_var(nc_out,static_cast<std::string>("sz_ldb"),sz_ldb); delete []sz_ldb;
00159   rcd=nco_put_var(nc_out,static_cast<std::string>("sz_nbr"),sz_nbr);
00160 
00161   // Close output file
00162   rcd=nco_close(nc_out); // [fnc] Close netCDF file
00163   std::cerr << "Wrote results to " << fl_out << std::endl;
00164   std::cerr << "ncks: ncks -C -H -F -m -u -d wvl,0.5e-6 -v wvl " << fl_out << std::endl;
00165 
00166   // Fix all unused identifiers at end where no harm can be done
00167   idx=0*(rcd+lat_nbr+lon_nbr+dmn_bnd_sz[0]+argc+sizeof(argv)); // [idx] Counting index CEWI
00168 
00169   return EXIT_SUCCESS;
00170 } // end main()


Generated on Thu Mar 16 18:17:27 2006 for nco by  doxygen 1.4.4