|
|
Definition at line 76 of file ncwa.c.
References prs_sct::att_lst, ptr_unn::bp, copyright_prn(), ptr_unn::cp, prs_sct::dmn_in, prs_sct::dmn_out, double_CEWI, ptr_unn::dp, EXIT_FAILURE, EXIT_SUCCESS, False, FILE, prs_sct::fl_in, prs_sct::fl_out, ptr_unn::fp, getopt_long, var_sct_tag::has_mss_val, dmn_sct_tag::id, prs_sct::in_id, int_CEWI, var_sct_tag::is_crd_var, ptr_unn::lp, lst_prs_2D(), var_sct_tag::mss_val, option::name, prs_sct::nbr_att, var_sct_tag::nbr_dim, prs_sct::nbr_dmn_in, prs_sct::nbr_dmn_out, NC_BYTE, NC_CHAR, NC_DOUBLE, NC_FLOAT, NC_FORMAT_64BIT, NC_FORMAT_CLASSIC, NC_FORMAT_NETCDF4, NC_GLOBAL, NC_INT, NC_MAX_DIMS, NC_NOERR, NC_NOFILL, NC_NOWRITE, NC_SHORT, ncap_ln_nbr_crr, ncap_ncl_dpt_crr, ncap_ncwa_scn(), nco_att_cpy(), nco_bool, nco_close(), nco_cmd_ln_sng(), nco_cnv_ccm_ccsm_cf_inq(), nco_create_mode_prs(), nco_dfl_case_nc_type_err(), nco_dmn_dfn(), nco_dmn_dpl(), nco_dmn_fll(), nco_dmn_lmt_mrg(), nco_dmn_lst_ass_var(), nco_dmn_lst_free(), nco_dmn_lst_mk(), nco_dmn_xrf(), nco_enddef(), nco_exit(), nco_exit_gracefully(), nco_fl_cmp_err_chk(), nco_fl_lst_mk(), nco_fl_mk_lcl(), nco_fl_nm_prs(), nco_fl_out_cls(), nco_fl_out_open(), nco_fl_rm(), nco_free(), nco_hst_att_cat(), nco_inq(), nco_inq_varid(), nco_lbr_vrs_prn(), nco_lmt_evl(), nco_lmt_lst_free(), nco_lmt_prs(), nco_lst_comma2hash(), nco_lst_srt_nm_id(), nco_malloc(), nco_malloc_flg(), nco_mss_val_cp(), nco_mss_val_mk(), nco_nm_id_lst_free(), nco_op_avg, nco_op_avgsqr, nco_op_max, nco_op_min, nco_op_ne, nco_op_nil, nco_op_prs_rlt(), nco_op_rms, nco_op_rmssdn, nco_op_sqravg, nco_op_sqrt, nco_op_ttl, prs_sct::nco_op_typ, nco_op_typ_get(), nco_open(), nco_openmp_ini(), nco_pck_map_nil, nco_pck_plc_nil, nco_put_att(), nco_put_var1(), nco_put_vara(), nco_realloc(), NCO_REC_DMN_UNDEFINED, nco_set_fill(), nco_sng_lst_free(), nco_thr_att_cat(), nco_typ_cnv_rth(), nco_typ_lng(), nco_usg_prn(), nco_var_avg(), nco_var_cnf_dmn(), nco_var_cnf_typ(), nco_var_dfn(), nco_var_dpl(), nco_var_dvd(), nco_var_fll(), nco_var_free(), nco_var_get(), nco_var_lst_add_crd(), nco_var_lst_ass_crd_add(), nco_var_lst_dvd(), nco_var_lst_free(), nco_var_lst_mk(), nco_var_lst_xcl(), nco_var_mlt(), nco_var_msk(), nco_var_mtd_refresh(), nco_var_nrm(), nco_var_nrm_sdn(), nco_var_prc_crr_prn(), nco_var_sqrt(), nco_var_srt_zero(), nco_var_val_cpy(), nco_var_zero(), nco_xrf_dmn(), nco_xrf_var(), nco_zero_long(), var_sct_tag::nm, no_argument, prs_sct::ntl_scn, NULL_CEWI, omp_get_thread_num(), optarg, optind, prs_sct::out_id, prg_nm_get(), prg_prs(), required_argument, ptr_unn::sp, prs_sct::sym_tbl, prs_sct::sym_tbl_nbr, var_sct_tag::sz, var_sct_tag::tally, True, var_sct_tag::type, type, option::val, var_sct_tag::val, prs_sct::var_LHS, and ptr_unn::vp. 00077 {
00078 nco_bool DO_CONFORM_MSK=False;
00079 nco_bool DO_CONFORM_WGT=False;
00080 nco_bool EXCLUDE_INPUT_LIST=False;
00081 nco_bool EXTRACT_ALL_COORDINATES=False;
00082 nco_bool EXTRACT_ASSOCIATED_COORDINATES=True;
00083 nco_bool FILE_RETRIEVED_FROM_REMOTE_LOCATION;
00084 nco_bool FL_LST_IN_FROM_STDIN=False;
00085 nco_bool FORCE_APPEND=False;
00086 nco_bool FORCE_OVERWRITE=False;
00087 nco_bool FORTRAN_IDX_CNV=False;
00088 nco_bool HISTORY_APPEND=True;
00089 nco_bool MULTIPLY_BY_TALLY=False;
00090 nco_bool MUST_CONFORM=False;
00091 nco_bool CNV_CCM_CCSM_CF;
00092 nco_bool NORMALIZE_BY_TALLY=True;
00093 nco_bool NORMALIZE_BY_WEIGHT=True;
00094 nco_bool NRM_BY_DNM=True;
00095 nco_bool REMOVE_REMOTE_FILES_AFTER_PROCESSING=True;
00096 nco_bool WGT_MSK_CRD_VAR=True;
00097 nco_bool opt_a_flg=False;
00098
00099 char **dmn_avg_lst_in=NULL_CEWI;
00100 char **fl_lst_abb=NULL;
00101 char **fl_lst_in=NULL_CEWI;
00102 char **var_lst_in=NULL_CEWI;
00103 char *cmd_ln;
00104 char *fl_in=NULL;
00105 char *fl_out=NULL;
00106 char *fl_out_tmp=NULL_CEWI;
00107 char *fl_pth=NULL;
00108 char *fl_pth_lcl=NULL;
00109 char *lmt_arg[NC_MAX_DIMS];
00110 char *msk_nm=NULL;
00111 char *msk_sng=NULL;
00112 char *nco_op_typ_sng;
00113 char *opt_crr=NULL;
00114 char *optarg_lcl=NULL;
00115 char *time_bfr_srt;
00116 char *wgt_nm=NULL;
00117
00118 const char * const CVS_Id="$Id: ncwa.c,v 1.198 2006/02/26 07:41:55 zender Exp $";
00119 const char * const CVS_Revision="$Revision: 1.198 $";
00120 const char * const opt_sht_lst="4Aa:CcD:d:FhIl:M:m:nNOo:p:rRT:t:v:Ww:xy:z:-:";
00121
00122 dmn_sct **dim=NULL_CEWI;
00123 dmn_sct **dmn_out=NULL_CEWI;
00124 dmn_sct **dmn_avg=NULL_CEWI;
00125
00126 double msk_val=1.0;
00127
00128 extern char *optarg;
00129 extern int optind;
00130
00131
00132
00133 FILE * const fp_stderr=stderr;
00134 FILE * const fp_stdout=stdout;
00135
00136 int *in_id_arr;
00137
00138 int abb_arg_nbr=0;
00139 int dmn_avg_nbr=0;
00140 int fl_idx=int_CEWI;
00141 int fl_nbr=0;
00142 int fl_out_fmt=NC_FORMAT_CLASSIC;
00143 int fll_md_old;
00144 int idx=int_CEWI;
00145 int idx_avg;
00146 int in_id;
00147 int lmt_nbr=0;
00148 int nbr_dmn_fl;
00149 int nbr_dmn_out=0;
00150 int nbr_dmn_xtr;
00151 int nbr_var_fix;
00152 int nbr_var_fl;
00153 int nbr_var_prc;
00154 int nbr_xtr=0;
00155 int nco_op_typ=nco_op_avg;
00156 int op_typ_rlt=0;
00157 int opt;
00158 int out_id;
00159 int rcd=NC_NOERR;
00160 int rec_dmn_id=NCO_REC_DMN_UNDEFINED;
00161 int thr_idx;
00162 int thr_nbr=int_CEWI;
00163 int var_lst_in_nbr=0;
00164
00165 lmt_sct **lmt;
00166
00167 nm_id_sct *dmn_lst;
00168 nm_id_sct *xtr_lst=NULL;
00169 nm_id_sct *dmn_avg_lst;
00170
00171 time_t time_crr_time_t;
00172
00173 var_sct **var;
00174 var_sct **var_fix;
00175 var_sct **var_fix_out;
00176 var_sct **var_out;
00177 var_sct **var_prc;
00178 var_sct **var_prc_out;
00179 var_sct *msk=NULL;
00180 var_sct *msk_out=NULL;
00181 var_sct *wgt=NULL;
00182 var_sct *wgt_avg=NULL;
00183 var_sct *wgt_out=NULL;
00184
00185 prs_sct prs_arg;
00186
00187 static struct option opt_lng[]=
00188 {
00189
00190
00191 {"fl_fmt",required_argument,0,0},
00192 {"file_format",required_argument,0,0},
00193
00194 {"4",no_argument,0,'4'},
00195 {"64bit",no_argument,0,'4'},
00196 {"netcdf4",no_argument,0,'4'},
00197 {"average",required_argument,0,'a'},
00198 {"avg",required_argument,0,'a'},
00199 {"append",no_argument,0,'A'},
00200 {"coords",no_argument,0,'c'},
00201 {"crd",no_argument,0,'c'},
00202 {"no-coords",no_argument,0,'C'},
00203 {"no-crd",no_argument,0,'C'},
00204 {"debug",required_argument,0,'D'},
00205 {"dbg_lvl",required_argument,0,'D'},
00206 {"dimension",required_argument,0,'d'},
00207 {"dmn",required_argument,0,'d'},
00208 {"fortran",no_argument,0,'F'},
00209 {"ftn",no_argument,0,'F'},
00210 {"history",no_argument,0,'h'},
00211 {"hst",no_argument,0,'h'},
00212 {"wgt_msk_crd_var",no_argument,0,'I'},
00213 {"local",required_argument,0,'l'},
00214 {"lcl",required_argument,0,'l'},
00215 {"mask-variable",required_argument,0,'m'},
00216 {"mask_variable",required_argument,0,'m'},
00217 {"mask",required_argument,0,'m'},
00218 {"msk_var",required_argument,0,'m'},
00219 {"msk_nm",required_argument,0,'m'},
00220 {"mask-value",required_argument,0,'M'},
00221 {"mask_value",required_argument,0,'M'},
00222 {"msk_val",required_argument,0,'M'},
00223 {"nintap",required_argument,0,'n'},
00224 {"nmr",no_argument,0,'N'},
00225 {"numerator",no_argument,0,'N'},
00226 {"overwrite",no_argument,0,'O'},
00227 {"ovr",no_argument,0,'O'},
00228 {"output",required_argument,0,'o'},
00229 {"fl_out",required_argument,0,'o'},
00230 {"path",required_argument,0,'p'},
00231 {"retain",no_argument,0,'R'},
00232 {"rtn",no_argument,0,'R'},
00233 {"revision",no_argument,0,'r'},
00234 {"truth_condition",required_argument,0,'T'},
00235 {"msk_cmp_typ",required_argument,0,'T'},
00236 {"op_rlt",required_argument,0,'T'},
00237 {"thr_nbr",required_argument,0,'t'},
00238 {"threads",required_argument,0,'t'},
00239 {"omp_num_threads",required_argument,0,'t'},
00240 {"variable",required_argument,0,'v'},
00241 {"version",no_argument,0,'r'},
00242 {"vrs",no_argument,0,'r'},
00243 {"normalize-by-tally",no_argument,0,'W',},
00244 {"exclude",no_argument,0,'x'},
00245 {"xcl",no_argument,0,'x'},
00246 {"weight",no_argument,0,'w'},
00247 {"wgt",no_argument,0,'w'},
00248 {"wgt_var",no_argument,0,'w'},
00249 {"operation",required_argument,0,'y'},
00250 {"op_typ",required_argument,0,'y'},
00251 {"mask_string",required_argument,0,'z'},
00252 {"msk_sng",required_argument,0,'z'},
00253 {"help",no_argument,0,'?'},
00254 {0,0,0,0}
00255 };
00256 int opt_idx=0;
00257
00258
00259 cmd_ln=nco_cmd_ln_sng(argc,argv);
00260 time_crr_time_t=time((time_t *)NULL);
00261 time_bfr_srt=ctime(&time_crr_time_t); time_bfr_srt=time_bfr_srt;
00262
00263 time_bfr_srt=time_bfr_srt;
00264 NORMALIZE_BY_TALLY=NORMALIZE_BY_TALLY;
00265 NORMALIZE_BY_WEIGHT=NORMALIZE_BY_WEIGHT;
00266
00267
00268 prg_nm=prg_prs(argv[0],&prg);
00269
00270
00271 while(1){
00272
00273 opt=getopt_long(argc,argv,opt_sht_lst,opt_lng,&opt_idx);
00274
00275 if(opt == EOF) break;
00276 opt_crr=(char *)strdup(opt_lng[opt_idx].name);
00277
00278
00279 if(opt == 0){
00280 if(!strcmp(opt_crr,"fl_fmt") || !strcmp(opt_crr,"file_format")) rcd=nco_create_mode_prs(optarg,&fl_out_fmt);
00281 }
00282
00283 switch(opt){
00284 case 0:
00285 break;
00286 case '4':
00287 if(!strcmp(opt_crr,"64bit")) fl_out_fmt=NC_FORMAT_64BIT; else fl_out_fmt=NC_FORMAT_NETCDF4;
00288 break;
00289 case 'A':
00290 FORCE_APPEND=!FORCE_APPEND;
00291 break;
00292 case 'a':
00293 if(opt_a_flg){
00294 (void)fprintf(fp_stdout,"%s: ERROR Option -a appears more than once\n",prg_nm);
00295 (void)fprintf(fp_stdout,"%s: HINT Use -a dim1,dim2,... not -a dim1 -a dim2 ...\n",prg_nm);
00296 (void)nco_usg_prn();
00297 nco_exit(EXIT_FAILURE);
00298 }
00299 dmn_avg_lst_in=lst_prs_2D(optarg,",",&dmn_avg_nbr);
00300 opt_a_flg=True;
00301 break;
00302 case 'C':
00303 EXTRACT_ASSOCIATED_COORDINATES=False;
00304 break;
00305 case 'c':
00306 EXTRACT_ALL_COORDINATES=True;
00307 break;
00308 case 'D':
00309 dbg_lvl=(unsigned short)strtol(optarg,(char **)NULL,10);
00310 break;
00311 case 'd':
00312 lmt_arg[lmt_nbr]=(char *)strdup(optarg);
00313 lmt_nbr++;
00314 break;
00315 case 'F':
00316 FORTRAN_IDX_CNV=!FORTRAN_IDX_CNV;
00317 break;
00318 case 'h':
00319 HISTORY_APPEND=!HISTORY_APPEND;
00320 break;
00321 case 'I':
00322 WGT_MSK_CRD_VAR=!WGT_MSK_CRD_VAR;
00323 break;
00324 case 'l':
00325 fl_pth_lcl=(char *)strdup(optarg);
00326 break;
00327 case 'm':
00328 msk_nm=(char *)strdup(optarg);
00329 break;
00330 case 'M':
00331 msk_val=strtod(optarg,(char **)NULL);
00332 break;
00333 case 'N':
00334 NRM_BY_DNM=False;
00335 NORMALIZE_BY_TALLY=False;
00336 NORMALIZE_BY_WEIGHT=False;
00337 break;
00338 case 'n':
00339 NORMALIZE_BY_WEIGHT=False;
00340 (void)fprintf(fp_stdout,"%s: ERROR This option has been disabled while I rethink its implementation\n",prg_nm);
00341 nco_exit(EXIT_FAILURE);
00342 break;
00343 case 'O':
00344 FORCE_OVERWRITE=!FORCE_OVERWRITE;
00345 break;
00346 case 'o':
00347 fl_out=(char *)strdup(optarg);
00348 break;
00349 case 'p':
00350 fl_pth=(char *)strdup(optarg);
00351 break;
00352 case 'R':
00353 REMOVE_REMOTE_FILES_AFTER_PROCESSING=!REMOVE_REMOTE_FILES_AFTER_PROCESSING;
00354 break;
00355 case 'r':
00356 (void)copyright_prn(CVS_Id,CVS_Revision);
00357 (void)nco_lbr_vrs_prn();
00358 nco_exit(EXIT_SUCCESS);
00359 break;
00360 case 'T':
00361 op_typ_rlt=nco_op_prs_rlt(optarg);
00362 break;
00363 case 't':
00364 thr_nbr=(int)strtol(optarg,(char **)NULL,10);
00365 break;
00366 case 'v':
00367
00368 optarg_lcl=(char *)strdup(optarg);
00369 (void)nco_lst_comma2hash(optarg_lcl);
00370 var_lst_in=lst_prs_2D(optarg_lcl,",",&var_lst_in_nbr);
00371 optarg_lcl=(char *)nco_free(optarg_lcl);
00372 nbr_xtr=var_lst_in_nbr;
00373 break;
00374 case 'W':
00375 NORMALIZE_BY_TALLY=False;
00376 (void)fprintf(fp_stdout,"%s: ERROR This option has been disabled while I rethink its implementation\n",prg_nm);
00377 nco_exit(EXIT_FAILURE);
00378 break;
00379 case 'w':
00380 wgt_nm=(char *)strdup(optarg);
00381 break;
00382 case 'x':
00383 EXCLUDE_INPUT_LIST=True;
00384 break;
00385 case 'y':
00386 nco_op_typ_sng=(char *)strdup(optarg);
00387 nco_op_typ=nco_op_typ_get(nco_op_typ_sng);
00388 break;
00389 case 'z':
00390 msk_sng=(char *)strdup(optarg);
00391 break;
00392 case '?':
00393 (void)nco_usg_prn();
00394 nco_exit(EXIT_SUCCESS);
00395 break;
00396 case '-':
00397 (void)fprintf(stderr,"%s: ERROR Long options are not available in this build. Use single letter options instead.\n",prg_nm_get());
00398 nco_exit(EXIT_FAILURE);
00399 break;
00400 default:
00401 (void)nco_usg_prn();
00402 nco_exit(EXIT_FAILURE);
00403 break;
00404 }
00405 if(opt_crr != NULL) opt_crr=(char *)nco_free(opt_crr);
00406 }
00407
00408
00409 if(msk_sng){
00410 int zero=0;
00411
00412 prs_arg.fl_in=NULL;
00413 prs_arg.in_id=0;
00414 prs_arg.fl_out=NULL;
00415 prs_arg.out_id=0;
00416 prs_arg.att_lst=NULL;
00417 prs_arg.nbr_att=&zero;
00418 prs_arg.dmn_in=NULL;
00419 prs_arg.nbr_dmn_in=0;
00420 prs_arg.dmn_out=NULL;
00421 prs_arg.nbr_dmn_out=&zero;
00422 prs_arg.sym_tbl=NULL;
00423 prs_arg.sym_tbl_nbr=0;
00424 prs_arg.ntl_scn=False;
00425 prs_arg.var_LHS=NULL;
00426 prs_arg.nco_op_typ=nco_op_nil;
00427
00428
00429 ncap_ln_nbr_crr=(size_t *)nco_realloc(ncap_ln_nbr_crr,ncap_ncl_dpt_crr+1UL);
00430 ncap_ln_nbr_crr[ncap_ncl_dpt_crr]=1UL;
00431 if(ncap_ncwa_scn(&prs_arg,msk_sng,&msk_nm,&msk_val,&op_typ_rlt) == 0) nco_exit(EXIT_FAILURE);
00432 }
00433
00434
00435 if(wgt_nm == NULL) NORMALIZE_BY_WEIGHT=False;
00436
00437
00438 fl_lst_in=nco_fl_lst_mk(argv,argc,optind,&fl_nbr,&fl_out,&FL_LST_IN_FROM_STDIN);
00439
00440
00441 lmt=nco_lmt_prs(lmt_nbr,lmt_arg);
00442
00443
00444 thr_nbr=nco_openmp_ini(thr_nbr);
00445 in_id_arr=(int *)nco_malloc(thr_nbr*sizeof(int));
00446
00447
00448 fl_in=nco_fl_nm_prs(fl_in,0,&fl_nbr,fl_lst_in,abb_arg_nbr,fl_lst_abb,fl_pth);
00449
00450 fl_in=nco_fl_mk_lcl(fl_in,fl_pth_lcl,&FILE_RETRIEVED_FROM_REMOTE_LOCATION);
00451
00452 rcd=nco_open(fl_in,NC_NOWRITE,&in_id);
00453
00454
00455 (void)nco_inq(in_id,&nbr_dmn_fl,&nbr_var_fl,(int *)NULL,&rec_dmn_id);
00456
00457
00458 xtr_lst=nco_var_lst_mk(in_id,nbr_var_fl,var_lst_in,EXTRACT_ALL_COORDINATES,&nbr_xtr);
00459
00460
00461 if(EXCLUDE_INPUT_LIST) xtr_lst=nco_var_lst_xcl(in_id,nbr_var_fl,xtr_lst,&nbr_xtr);
00462
00463
00464 if(EXTRACT_ALL_COORDINATES) xtr_lst=nco_var_lst_add_crd(in_id,nbr_dmn_fl,xtr_lst,&nbr_xtr);
00465
00466
00467 if(EXTRACT_ASSOCIATED_COORDINATES) xtr_lst=nco_var_lst_ass_crd_add(in_id,xtr_lst,&nbr_xtr);
00468
00469
00470 if(nbr_xtr > 1) xtr_lst=nco_lst_srt_nm_id(xtr_lst,nbr_xtr,False);
00471
00472
00473
00474 for(idx=0;idx<lmt_nbr;idx++) (void)nco_lmt_evl(in_id,lmt[idx],0L,FORTRAN_IDX_CNV);
00475
00476
00477 dmn_lst=nco_dmn_lst_ass_var(in_id,xtr_lst,nbr_xtr,&nbr_dmn_xtr);
00478
00479
00480 dim=(dmn_sct **)nco_malloc(nbr_dmn_xtr*sizeof(dmn_sct *));
00481 for(idx=0;idx<nbr_dmn_xtr;idx++) dim[idx]=nco_dmn_fll(in_id,dmn_lst[idx].id,dmn_lst[idx].nm);
00482
00483
00484 if(lmt_nbr > 0) (void)nco_dmn_lmt_mrg(dim,nbr_dmn_xtr,lmt,lmt_nbr);
00485
00486
00487 if(dmn_avg_nbr == 0){
00488 dmn_avg_nbr=nbr_dmn_xtr;
00489 dmn_avg_lst_in=(char **)nco_malloc(dmn_avg_nbr*sizeof(char *));
00490 for(idx=0;idx<dmn_avg_nbr;idx++){
00491 dmn_avg_lst_in[idx]=(char *)strdup(dmn_lst[idx].nm);
00492 }
00493 (void)fprintf(stderr,"%s: INFO No dimensions specified with -a, therefore reducing (averaging, taking minimum, etc.) over all dimensions\n",prg_nm);
00494 }
00495
00496 dmn_lst=nco_nm_id_lst_free(dmn_lst,nbr_dmn_xtr);
00497
00498 if(dmn_avg_nbr > 0){
00499 if(dmn_avg_nbr > nbr_dmn_xtr){
00500 (void)fprintf(fp_stdout,"%s: ERROR More reducing dimensions than extracted dimensions\n",prg_nm);
00501 nco_exit(EXIT_FAILURE);
00502 }
00503
00504
00505 dmn_avg_lst=nco_dmn_lst_mk(in_id,dmn_avg_lst_in,dmn_avg_nbr);
00506
00507 if(dmn_avg_nbr > 0) dmn_avg_lst_in=nco_sng_lst_free(dmn_avg_lst_in,dmn_avg_nbr);
00508
00509
00510 dmn_avg=(dmn_sct **)nco_malloc(dmn_avg_nbr*sizeof(dmn_sct *));
00511 for(idx_avg=0;idx_avg<dmn_avg_nbr;idx_avg++){
00512 for(idx=0;idx<nbr_dmn_xtr;idx++){
00513 if(!strcmp(dmn_avg_lst[idx_avg].nm,dim[idx]->nm)) break;
00514 }
00515 if(idx != nbr_dmn_xtr){
00516 dmn_avg[idx_avg]=dim[idx];
00517 }else{
00518 (void)fprintf(stderr,"%s: WARNING reducing dimension \"%s\" is not contained in any variable in extraction list\n",prg_nm,dmn_avg_lst[idx_avg].nm);
00519
00520 (void)memmove(dmn_avg_lst+idx_avg*sizeof(nm_id_sct),dmn_avg_lst+(idx_avg+1)*sizeof(nm_id_sct),(dmn_avg_nbr-idx_avg-1)*sizeof(nm_id_sct));
00521 --dmn_avg_nbr;
00522 dmn_avg_lst=(nm_id_sct *)nco_realloc(dmn_avg_lst,dmn_avg_nbr*sizeof(nm_id_sct));
00523 dmn_avg=(dmn_sct **)nco_realloc(dmn_avg,dmn_avg_nbr*sizeof(dmn_sct *));
00524 }
00525 }
00526
00527
00528 for(idx=0;idx<dmn_avg_nbr;idx++){
00529 for(idx_avg=0;idx_avg<dmn_avg_nbr;idx_avg++){
00530 if(idx_avg != idx){
00531 if(dmn_avg[idx]->id == dmn_avg[idx_avg]->id){
00532 (void)fprintf(fp_stdout,"%s: ERROR %s specified more than once in reducing list\n",prg_nm,dmn_avg[idx]->nm);
00533 nco_exit(EXIT_FAILURE);
00534 }
00535 }
00536 }
00537 }
00538
00539
00540 dmn_out=(dmn_sct **)nco_malloc((nbr_dmn_xtr-dmn_avg_nbr)*sizeof(dmn_sct *));
00541 nbr_dmn_out=0;
00542 for(idx=0;idx<nbr_dmn_xtr;idx++){
00543 for(idx_avg=0;idx_avg<dmn_avg_nbr;idx_avg++){
00544 if(!strcmp(dmn_avg_lst[idx_avg].nm,dim[idx]->nm)) break;
00545 }
00546 if(idx_avg == dmn_avg_nbr){
00547 dmn_out[nbr_dmn_out]=nco_dmn_dpl(dim[idx]);
00548 (void)nco_dmn_xrf(dim[idx],dmn_out[nbr_dmn_out]);
00549 nbr_dmn_out++;
00550 }
00551 }
00552
00553 dmn_avg_lst=nco_nm_id_lst_free(dmn_avg_lst,dmn_avg_nbr);
00554
00555 if(nbr_dmn_out != nbr_dmn_xtr-dmn_avg_nbr){
00556 (void)fprintf(fp_stdout,"%s: ERROR nbr_dmn_out != nbr_dmn_xtr-dmn_avg_nbr\n",prg_nm);
00557 nco_exit(EXIT_FAILURE);
00558 }
00559
00560 }
00561
00562
00563 CNV_CCM_CCSM_CF=nco_cnv_ccm_ccsm_cf_inq(in_id);
00564
00565
00566 var=(var_sct **)nco_malloc(nbr_xtr*sizeof(var_sct *));
00567 var_out=(var_sct **)nco_malloc(nbr_xtr*sizeof(var_sct *));
00568 for(idx=0;idx<nbr_xtr;idx++){
00569 var[idx]=nco_var_fll(in_id,xtr_lst[idx].id,xtr_lst[idx].nm,dim,nbr_dmn_xtr);
00570 var_out[idx]=nco_var_dpl(var[idx]);
00571 (void)nco_xrf_var(var[idx],var_out[idx]);
00572 (void)nco_xrf_dmn(var_out[idx]);
00573 }
00574
00575 xtr_lst=nco_nm_id_lst_free(xtr_lst,nbr_xtr);
00576
00577
00578 (void)nco_var_lst_dvd(var,var_out,nbr_xtr,CNV_CCM_CCSM_CF,nco_pck_plc_nil,nco_pck_map_nil,dmn_avg,dmn_avg_nbr,&var_fix,&var_fix_out,&nbr_var_fix,&var_prc,&var_prc_out,&nbr_var_prc);
00579
00580
00581 if(dbg_lvl > 0){
00582 for(idx=0;idx<nbr_xtr;idx++) (void)fprintf(stderr,"var[%d]->nm = %s, ->id=[%d]\n",idx,var[idx]->nm,var[idx]->id);
00583 for(idx=0;idx<nbr_var_fix;idx++) (void)fprintf(stderr,"var_fix[%d]->nm = %s, ->id=[%d]\n",idx,var_fix[idx]->nm,var_fix[idx]->id);
00584 for(idx=0;idx<nbr_var_prc;idx++) (void)fprintf(stderr,"var_prc[%d]->nm = %s, ->id=[%d]\n",idx,var_prc[idx]->nm,var_prc[idx]->id);
00585 }
00586
00587
00588 fl_out_tmp=nco_fl_out_open(fl_out,FORCE_APPEND,FORCE_OVERWRITE,fl_out_fmt,&out_id);
00589 if(dbg_lvl > 4) (void)fprintf(stderr,"Input, output file IDs = %d, %d\n",in_id,out_id);
00590
00591
00592 (void)nco_att_cpy(in_id,out_id,NC_GLOBAL,NC_GLOBAL,True);
00593
00594
00595 if(HISTORY_APPEND) (void)nco_hst_att_cat(out_id,cmd_ln);
00596
00597 if(thr_nbr > 0 && HISTORY_APPEND) (void)nco_thr_att_cat(out_id,thr_nbr);
00598
00599
00600 (void)nco_dmn_dfn(fl_out,out_id,dmn_out,nbr_dmn_out);
00601
00602
00603 (void)nco_var_dfn(in_id,fl_out,out_id,var_out,nbr_xtr,dmn_out,nbr_dmn_out,nco_pck_plc_nil,nco_pck_map_nil);
00604
00605
00606 if(msk_nm != NULL){
00607 for(idx=0;idx<nbr_var_prc;idx++){
00608
00609 if(!var_prc_out[idx]->has_mss_val){
00610 var_prc_out[idx]->has_mss_val=True;
00611 var_prc_out[idx]->mss_val=nco_mss_val_mk(var_prc[idx]->type);
00612 (void)nco_put_att(out_id,var_prc_out[idx]->id,"missing_value",var_prc_out[idx]->type,1,var_prc_out[idx]->mss_val.vp);
00613 }
00614 }
00615 }
00616
00617
00618 rcd=nco_set_fill(out_id,NC_NOFILL,&fll_md_old);
00619
00620
00621 (void)nco_enddef(out_id);
00622
00623
00624 (void)nco_var_srt_zero(var_out,nbr_xtr);
00625
00626
00627 (void)nco_var_val_cpy(in_id,out_id,var_fix,nbr_var_fix);
00628
00629
00630 nco_close(in_id);
00631
00632
00633 for(fl_idx=0;fl_idx<fl_nbr;fl_idx++){
00634
00635 if(fl_idx != 0) fl_in=nco_fl_nm_prs(fl_in,fl_idx,&fl_nbr,fl_lst_in,abb_arg_nbr,fl_lst_abb,fl_pth);
00636 if(dbg_lvl > 0) (void)fprintf(stderr,"\nInput file %d is %s; ",fl_idx,fl_in);
00637
00638 if(fl_idx != 0) fl_in=nco_fl_mk_lcl(fl_in,fl_pth_lcl,&FILE_RETRIEVED_FROM_REMOTE_LOCATION);
00639 if(dbg_lvl > 0) (void)fprintf(stderr,"local file %s:\n",fl_in);
00640
00641
00642 for(thr_idx=0;thr_idx<thr_nbr;thr_idx++) rcd=nco_open(fl_in,NC_NOWRITE,in_id_arr+thr_idx);
00643 in_id=in_id_arr[0];
00644
00645
00646 if(False) (void)nco_fl_cmp_err_chk();
00647
00648
00649 if(wgt_nm != NULL){
00650 int wgt_id;
00651
00652 rcd=nco_inq_varid(in_id,wgt_nm,&wgt_id);
00653
00654 wgt=nco_var_fll(in_id,wgt_id,wgt_nm,dim,nbr_dmn_xtr);
00655
00656
00657 (void)nco_var_get(in_id,wgt);
00658
00659
00660
00661
00662
00663 }
00664
00665
00666 if(msk_nm != NULL){
00667 int msk_id;
00668
00669 rcd=nco_inq_varid(in_id,msk_nm,&msk_id);
00670
00671 msk=nco_var_fll(in_id,msk_id,msk_nm,dim,nbr_dmn_xtr);
00672
00673
00674
00675 (void)nco_var_get(in_id,msk);
00676 }
00677
00678 #ifdef _OPENMP
00679
00680
00681
00682
00683 #pragma omp parallel for default(none) firstprivate(DO_CONFORM_MSK,DO_CONFORM_WGT,msk_out,wgt_out) private(idx,in_id,wgt_avg) shared(MULTIPLY_BY_TALLY,MUST_CONFORM,NRM_BY_DNM,WGT_MSK_CRD_VAR,dbg_lvl,dmn_avg,dmn_avg_nbr,fp_stderr,fp_stdout,in_id_arr,msk,msk_nm,msk_val,nbr_var_prc,nco_op_typ,op_typ_rlt,out_id,prg_nm,rcd,var_prc,var_prc_out,wgt,wgt_nm)
00684 #endif
00685 for(idx=0;idx<nbr_var_prc;idx++){
00686 in_id=in_id_arr[omp_get_thread_num()];
00687 if(dbg_lvl > 0) rcd+=nco_var_prc_crr_prn(idx,var_prc[idx]->nm);
00688 if(dbg_lvl > 0) (void)fflush(fp_stderr);
00689
00690
00691 var_prc_out[idx]->sz=var_prc[idx]->sz;
00692
00693
00694 if((var_prc_out[idx]->tally=(long *)nco_malloc_flg(var_prc_out[idx]->sz*sizeof(long))) == NULL){
00695 (void)fprintf(fp_stdout,"%s: ERROR Unable to malloc() %ld*%ld bytes for tally buffer for variable %s in main()\n",prg_nm_get(),var_prc_out[idx]->sz,(long)sizeof(long),var_prc_out[idx]->nm);
00696 nco_exit(EXIT_FAILURE);
00697 }
00698 (void)nco_zero_long(var_prc_out[idx]->sz,var_prc_out[idx]->tally);
00699 if((var_prc_out[idx]->val.vp=(void *)nco_malloc_flg(var_prc_out[idx]->sz*nco_typ_lng(var_prc_out[idx]->type))) == NULL){
00700 (void)fprintf(fp_stdout,"%s: ERROR Unable to malloc() %ld*%lu bytes for value buffer for variable %s in main()\n",prg_nm_get(),var_prc_out[idx]->sz,(unsigned long)nco_typ_lng(var_prc_out[idx]->type),var_prc_out[idx]->nm);
00701 nco_exit(EXIT_FAILURE);
00702 }
00703 (void)nco_var_zero(var_prc_out[idx]->type,var_prc_out[idx]->sz,var_prc_out[idx]->val);
00704
00705 (void)nco_var_mtd_refresh(in_id,var_prc[idx]);
00706
00707 if(dbg_lvl > 4) (void)fprintf(fp_stdout,"%s: DEBUG: fxm TODO nco354 About to nco_var_get() %s\n",prg_nm,var_prc[idx]->nm);
00708
00709 (void)nco_var_get(in_id,var_prc[idx]);
00710 if(dbg_lvl > 4) (void)fprintf(fp_stdout,"%s: DEBUG: fxm TODO nco354 Finished nco_var_get() %s\n",prg_nm,var_prc[idx]->nm);
00711
00712
00713 var_prc[idx]=nco_typ_cnv_rth(var_prc[idx],nco_op_typ);
00714 var_prc_out[idx]=nco_typ_cnv_rth(var_prc_out[idx],nco_op_typ);
00715
00716 if(msk_nm != NULL && (!var_prc[idx]->is_crd_var || WGT_MSK_CRD_VAR)){
00717 msk_out=nco_var_cnf_dmn(var_prc[idx],msk,msk_out,MUST_CONFORM,&DO_CONFORM_MSK);
00718
00719 if(DO_CONFORM_MSK){
00720 msk_out=nco_var_cnf_typ(var_prc[idx]->type,msk_out);
00721
00722
00723 if(!var_prc[idx]->has_mss_val){
00724 var_prc[idx]->has_mss_val=True;
00725 var_prc[idx]->mss_val=nco_mss_val_mk(var_prc[idx]->type);
00726 }
00727
00728
00729 (void)nco_var_msk(var_prc[idx]->type,var_prc[idx]->sz,var_prc[idx]->has_mss_val,var_prc[idx]->mss_val,msk_val,op_typ_rlt,msk_out->val,var_prc[idx]->val);
00730 }
00731 }
00732
00733 switch(nco_op_typ){
00734 case nco_op_avgsqr:
00735 case nco_op_rms:
00736 case nco_op_rmssdn:
00737 (void)nco_var_mlt(var_prc[idx]->type,var_prc[idx]->sz,var_prc[idx]->has_mss_val,var_prc[idx]->mss_val,var_prc[idx]->val,var_prc[idx]->val);
00738 break;
00739 default:
00740 break;
00741 }
00742 if(wgt_nm != NULL && (!var_prc[idx]->is_crd_var || WGT_MSK_CRD_VAR)){
00743
00744
00745 wgt_out=nco_var_cnf_dmn(var_prc[idx],wgt,wgt_out,MUST_CONFORM,&DO_CONFORM_WGT);
00746 if(DO_CONFORM_WGT){
00747 wgt_out=nco_var_cnf_typ(var_prc[idx]->type,wgt_out);
00748
00749
00750 (void)nco_var_mlt(var_prc[idx]->type,var_prc[idx]->sz,var_prc[idx]->has_mss_val,var_prc[idx]->mss_val,wgt_out->val,var_prc[idx]->val);
00751 }
00752 }
00753
00754 (void)memcpy((void *)(var_prc_out[idx]->val.vp),(void *)(var_prc[idx]->val.vp),var_prc_out[idx]->sz*nco_typ_lng(var_prc_out[idx]->type));
00755
00756
00757
00758 var_prc_out[idx]=nco_var_avg(var_prc_out[idx],dmn_avg,dmn_avg_nbr,nco_op_typ);
00759
00760
00761
00762 if(NRM_BY_DNM && DO_CONFORM_WGT && (!var_prc[idx]->is_crd_var || WGT_MSK_CRD_VAR)){
00763
00764
00765
00766 wgt_avg=nco_var_dpl(wgt_out);
00767
00768 if(var_prc[idx]->has_mss_val){
00769 double mss_val_dbl=double_CEWI;
00770
00771
00772
00773
00774
00775 (void)nco_mss_val_cp(var_prc[idx],wgt_avg);
00776
00777 switch(wgt_avg->type){
00778 case NC_FLOAT: mss_val_dbl=wgt_avg->mss_val.fp[0]; break;
00779 case NC_DOUBLE: mss_val_dbl=wgt_avg->mss_val.dp[0]; break;
00780 case NC_INT: mss_val_dbl=wgt_avg->mss_val.lp[0]; break;
00781 case NC_SHORT: mss_val_dbl=wgt_avg->mss_val.sp[0]; break;
00782 case NC_CHAR: mss_val_dbl=wgt_avg->mss_val.cp[0]; break;
00783 case NC_BYTE: mss_val_dbl=wgt_avg->mss_val.bp[0]; break;
00784 default: nco_dfl_case_nc_type_err(); break;
00785 }
00786
00787 (void)nco_var_msk(wgt_avg->type,wgt_avg->sz,var_prc[idx]->has_mss_val,var_prc[idx]->mss_val,mss_val_dbl,nco_op_ne,var_prc[idx]->val,wgt_avg->val);
00788 }
00789
00790
00791 var_prc[idx]->val.vp=nco_free(var_prc[idx]->val.vp);
00792
00793 if(msk_nm != NULL && DO_CONFORM_MSK){
00794
00795
00796
00797 if(!wgt_avg->has_mss_val){
00798 wgt_avg->has_mss_val=True;
00799 wgt_avg->mss_val=nco_mss_val_mk(wgt_avg->type);
00800 }
00801
00802 (void)nco_var_msk(wgt_avg->type,wgt_avg->sz,wgt_avg->has_mss_val,wgt_avg->mss_val,msk_val,op_typ_rlt,msk_out->val,wgt_avg->val);
00803 }
00804
00805
00806
00807
00808
00809
00810 if(wgt_avg->sz > 0)
00811 if((wgt_avg->tally=(long *)nco_realloc(wgt_avg->tally,wgt_avg->sz*sizeof(long))) == NULL){
00812 (void)fprintf(fp_stdout,"%s: ERROR Unable to realloc() %ld*%ld bytes for tally buffer for weight %s in main()\n",prg_nm_get(),wgt_avg->sz,(long)sizeof(long),wgt_avg->nm);
00813 nco_exit(EXIT_FAILURE);
00814 }
00815
00816 wgt_avg=nco_var_avg(wgt_avg,dmn_avg,dmn_avg_nbr,nco_op_avg);
00817 if(MULTIPLY_BY_TALLY){
00818
00819
00820
00821 (void)nco_var_nrm(wgt_avg->type,wgt_avg->sz,wgt_avg->has_mss_val,wgt_avg->mss_val,wgt_avg->tally,wgt_avg->val);
00822 }
00823
00824
00825 if(var_prc_out[idx]->sz == 1L && var_prc_out[idx]->type == NC_INT && var_prc_out[idx]->val.lp[0] == 0){
00826 (void)fprintf(fp_stdout,"%s: ERROR Weight in denominator weight = 0.0, will cause SIGFPE\n%s: HINT Sum of masked, averaged weights must be non-zero\n%s: HINT A possible workaround is to remove variable \"%s\" from output file using \"%s -x -v %s ...\"\n%s: Expecting core dump...now!\n",prg_nm,prg_nm,prg_nm,var_prc_out[idx]->nm,prg_nm,var_prc_out[idx]->nm,prg_nm);
00827 }
00828
00829 switch(nco_op_typ){
00830 case nco_op_avg:
00831 case nco_op_sqravg:
00832 case nco_op_avgsqr:
00833 case nco_op_rms:
00834 case nco_op_sqrt:
00835 case nco_op_rmssdn:
00836 (void)nco_var_dvd(var_prc_out[idx]->type,var_prc_out[idx]->sz,var_prc_out[idx]->has_mss_val,var_prc_out[idx]->mss_val,wgt_avg->val,var_prc_out[idx]->val);
00837 break;
00838 case nco_op_min:
00839 case nco_op_max:
00840 case nco_op_ttl:
00841 break;
00842 default:
00843 (void)fprintf(fp_stdout,"%s: ERROR Illegal nco_op_typ in weighted normalization\n",prg_nm);
00844 nco_exit(EXIT_FAILURE);
00845 break;
00846 }
00847
00848 if(wgt_avg != NULL) wgt_avg=nco_var_free(wgt_avg);
00849
00850 }else if(NRM_BY_DNM){
00851
00852
00853 switch(nco_op_typ){
00854 case nco_op_avg:
00855 case nco_op_sqravg:
00856 case nco_op_avgsqr:
00857 case nco_op_rms:
00858 case nco_op_sqrt:
00859 (void)nco_var_nrm(var_prc_out[idx]->type,var_prc_out[idx]->sz,var_prc_out[idx]->has_mss_val,var_prc_out[idx]->mss_val,var_prc_out[idx]->tally,var_prc_out[idx]->val);
00860 break;
00861 case nco_op_rmssdn:
00862 (void)nco_var_nrm_sdn(var_prc_out[idx]->type,var_prc_out[idx]->sz,var_prc_out[idx]->has_mss_val,var_prc_out[idx]->mss_val,var_prc_out[idx]->tally,var_prc_out[idx]->val);
00863 break;
00864 case nco_op_min:
00865 case nco_op_max:
00866 case nco_op_ttl:
00867 break;
00868 default:
00869 (void)fprintf(fp_stdout,"%s: ERROR Illegal nco_op_typ in non-weighted normalization\n",prg_nm);
00870 nco_exit(EXIT_FAILURE);
00871 break;
00872 }
00873 }else if(!NRM_BY_DNM){
00874
00875 ;
00876 }else{
00877 (void)fprintf(fp_stdout,"%s: ERROR Unforeseen logical branch in main()\n",prg_nm);
00878 nco_exit(EXIT_FAILURE);
00879 }
00880
00881 switch(nco_op_typ){
00882 case nco_op_sqravg:
00883 (void)nco_var_mlt(var_prc_out[idx]->type,var_prc_out[idx]->sz,var_prc_out[idx]->has_mss_val,var_prc_out[idx]->mss_val,var_prc_out[idx]->val,var_prc_out[idx]->val);
00884 break;
00885 case nco_op_sqrt:
00886 case nco_op_rms:
00887 case nco_op_rmssdn:
00888 (void)nco_var_sqrt(var_prc_out[idx]->type,var_prc_out[idx]->sz,var_prc_out[idx]->has_mss_val,var_prc_out[idx]->mss_val,var_prc_out[idx]->tally,var_prc_out[idx]->val,var_prc_out[idx]->val);
00889 break;
00890 default:
00891 break;
00892 }
00893
00894 var_prc_out[idx]->tally=(long *)nco_free(var_prc_out[idx]->tally);
00895
00896
00897 var_prc_out[idx]=nco_var_cnf_typ(var_prc_out[idx]->typ_upk,var_prc_out[idx]);
00898
00899 #ifdef _OPENMP
00900 #pragma omp critical
00901 #endif
00902 {
00903
00904 if(var_prc_out[idx]->nbr_dim == 0){
00905 (void)nco_put_var1(out_id,var_prc_out[idx]->id,var_prc_out[idx]->srt,var_prc_out[idx]->val.vp,var_prc_out[idx]->type);
00906 }else{
00907 (void)nco_put_vara(out_id,var_prc_out[idx]->id,var_prc_out[idx]->srt,var_prc_out[idx]->cnt,var_prc_out[idx]->val.vp,var_prc_out[idx]->type);
00908 }
00909 }
00910
00911
00912 var_prc_out[idx]->val.vp=nco_free(var_prc_out[idx]->val.vp);
00913
00914 }
00915
00916 if(dbg_lvl > 0) (void)fprintf(stderr,"\n");
00917
00918
00919 for(thr_idx=0;thr_idx<thr_nbr;thr_idx++) nco_close(in_id_arr[thr_idx]);
00920
00921
00922 if(FILE_RETRIEVED_FROM_REMOTE_LOCATION && REMOVE_REMOTE_FILES_AFTER_PROCESSING) (void)nco_fl_rm(fl_in);
00923
00924 }
00925
00926
00927 (void)nco_fl_out_cls(fl_out,fl_out_tmp,out_id);
00928
00929
00930 if(dmn_avg_nbr > 0) dmn_avg=(dmn_sct **)nco_free(dmn_avg);
00931 if(msk != NULL) msk=nco_var_free(msk);
00932 if(msk_nm != NULL) msk_nm=(char *)nco_free(msk_nm);
00933 if(msk_out != NULL) msk_out=nco_var_free(msk_out);
00934 if(msk_sng != NULL) msk_sng=(char *)nco_free(msk_sng);
00935 if(wgt != NULL) wgt=nco_var_free(wgt);
00936 if(wgt_avg != NULL) wgt_avg=nco_var_free(wgt_avg);
00937 if(wgt_nm != NULL) wgt_nm=(char *)nco_free(wgt_nm);
00938 if(wgt_out != NULL) wgt_out=nco_var_free(wgt_out);
00939
00940
00941
00942 if(cmd_ln != NULL) cmd_ln=(char *)nco_free(cmd_ln);
00943 if(fl_in != NULL) fl_in=(char *)nco_free(fl_in);
00944 if(fl_out != NULL) fl_out=(char *)nco_free(fl_out);
00945 if(fl_out_tmp != NULL) fl_out_tmp=(char *)nco_free(fl_out_tmp);
00946 if(fl_pth != NULL) fl_pth=(char *)nco_free(fl_pth);
00947 if(fl_pth_lcl != NULL) fl_pth_lcl=(char *)nco_free(fl_pth_lcl);
00948 if(in_id_arr != NULL) in_id_arr=(int *)nco_free(in_id_arr);
00949
00950 if(fl_lst_in != NULL && fl_lst_abb == NULL) fl_lst_in=nco_sng_lst_free(fl_lst_in,fl_nbr);
00951 if(fl_lst_in != NULL && fl_lst_abb != NULL) fl_lst_in=nco_sng_lst_free(fl_lst_in,1);
00952 if(fl_lst_abb != NULL) fl_lst_abb=nco_sng_lst_free(fl_lst_abb,abb_arg_nbr);
00953 if(var_lst_in_nbr > 0) var_lst_in=nco_sng_lst_free(var_lst_in,var_lst_in_nbr);
00954
00955 for(idx=0;idx<lmt_nbr;idx++) lmt_arg[idx]=(char *)nco_free(lmt_arg[idx]);
00956 if(lmt_nbr > 0) lmt=nco_lmt_lst_free(lmt,lmt_nbr);
00957
00958 if(nbr_dmn_xtr > 0) dim=nco_dmn_lst_free(dim,nbr_dmn_xtr);
00959 if(nbr_dmn_out > 0) dmn_out=nco_dmn_lst_free(dmn_out,nbr_dmn_out);
00960
00961 if(nbr_xtr > 0) var=nco_var_lst_free(var,nbr_xtr);
00962
00963 if(nbr_var_fix > 0) var_fix_out=nco_var_lst_free(var_fix_out,nbr_var_fix);
00964 if(nbr_var_prc > 0) var_prc_out=nco_var_lst_free(var_prc_out,nbr_var_prc);
00965 var_prc=(var_sct **)nco_free(var_prc);
00966 var_fix=(var_sct **)nco_free(var_fix);
00967 var_out=(var_sct **)nco_free(var_out);
00968
00969 nco_exit_gracefully();
00970 return EXIT_SUCCESS;
00971 }
|