#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) |
|
|
Referenced by copyright_prn(), and main(). |
|
|
|
|
|
|
|
|
|
|
||||||||||||
|
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()
|
1.4.4