#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <netcdf.h>#include "nco_netcdf.h"#include "nco.h"#include "nco_cnf_typ.h"#include "nco_ctl.h"#include "nco_mmr.h"#include "nco_var_utl.h"#include "nco_var_rth.h"Include dependency graph for nco_rth_utl.h:

This graph shows which files directly or indirectly include this file:

Go to the source code of this file.
Functions | |
| int | nco_op_typ_get (const char *const nco_op_sng) |
| void | nco_opr_drv (const long idx_rec, const int nco_op_typ, const var_sct *const var_prc, var_sct *const var_prc_out) |
| int | nco_op_prs_rlt (const char *const op_sng) |
| void | vec_set (const nc_type type, const long sz, ptr_unn op1, const double op2) |
| void | nco_zero_long (const long sz, long *restrict const op1) |
|
|
Definition at line 107 of file nco_rth_utl.c. References EXIT_FAILURE, False, nco_exit(), nco_op_eq, nco_op_ge, nco_op_gt, nco_op_le, nco_op_lt, nco_op_ne, and prg_nm_get(). Referenced by main(). 00108 { 00109 /* Purpose: Convert Fortran abbreviation for relational operator into NCO operation key */ 00110 00111 /* Classify the relation */ 00112 if(!strcmp(op_sng,"eq")){ 00113 return nco_op_eq; 00114 }else if(!strcmp(op_sng,"ne")){ 00115 return nco_op_ne; 00116 }else if(!strcmp(op_sng,"lt")){ 00117 return nco_op_lt; 00118 }else if(!strcmp(op_sng,"gt")){ 00119 return nco_op_gt; 00120 }else if(!strcmp(op_sng,"le")){ 00121 return nco_op_le; 00122 }else if(!strcmp(op_sng,"ge")){ 00123 return nco_op_ge; 00124 }else{ 00125 (void)fprintf(stdout,"%s: ERROR %s not registered in nco_op_prs_rlt()\n",prg_nm_get(),op_sng); 00126 nco_exit(EXIT_FAILURE); 00127 } /* end else */ 00128 00129 /* Some compilers, e.g., SGI cc, need return statement to end non-void functions */ 00130 return False; /* Statement should not be reached */ 00131 } /* end nco_op_prs_rlt() */
|
|
|
Definition at line 55 of file nco_rth_utl.c. References EXIT_FAILURE, False, ncbo, nco_exit(), nco_op_add, nco_op_avg, nco_op_avgsqr, nco_op_dvd, nco_op_max, nco_op_min, nco_op_mlt, nco_op_rms, nco_op_rmssdn, nco_op_sbt, nco_op_sqravg, nco_op_sqrt, nco_op_ttl, prg_get(), and prg_nm_get(). Referenced by main(). 00056 { 00057 /* Purpose: Process '-y' command line argument 00058 Convert user-specified string to enumerated operation type */ 00059 const char fnc_nm[]="nco_op_typ_get()"; /* [sng] Function name */ 00060 char *prg_nm; /* [sng] Program name */ 00061 int prg_id; /* [enm] Program ID */ 00062 00063 prg_nm=prg_nm_get(); /* [sng] Program name */ 00064 prg_id=prg_get(); /* [enm] Program ID */ 00065 00066 if(nco_op_sng == NULL){ 00067 /* If nco_op_typ_get() is called when user-specified option string is NULL, 00068 then operation type may be implied by program name itself */ 00069 if(!strcmp(prg_nm,"ncadd")) return nco_op_add; 00070 if(!strcmp(prg_nm,"mpncbo")) return nco_op_sbt; 00071 if(!strcmp(prg_nm,"mpncdiff")) return nco_op_sbt; 00072 if(!strcmp(prg_nm,"ncbo")) return nco_op_sbt; 00073 if(!strcmp(prg_nm,"ncdiff")) return nco_op_sbt; 00074 if(!strcmp(prg_nm,"ncsub")) return nco_op_sbt; 00075 if(!strcmp(prg_nm,"ncsubtract")) return nco_op_sbt; 00076 if(!strcmp(prg_nm,"ncmult")) return nco_op_mlt; 00077 if(!strcmp(prg_nm,"ncmultiply")) return nco_op_mlt; 00078 if(!strcmp(prg_nm,"ncdivide")) return nco_op_dvd; 00079 (void)fprintf(stderr,"%s: ERROR %s reports empty user-specified operation string in conjunction with unknown or ambiguous executable name %s\n",prg_nm,fnc_nm,prg_nm); 00080 nco_exit(EXIT_FAILURE); 00081 } /* endif */ 00082 00083 if(!strcmp(nco_op_sng,"avg")) return nco_op_avg; 00084 if(!strcmp(nco_op_sng,"avgsqr")) return nco_op_avgsqr; 00085 if(!strcmp(nco_op_sng,"max")) return nco_op_max; 00086 if(!strcmp(nco_op_sng,"min")) return nco_op_min; 00087 if(!strcmp(nco_op_sng,"rms")) return nco_op_rms; 00088 if(!strcmp(nco_op_sng,"rmssdn")) return nco_op_rmssdn; 00089 if(!strcmp(nco_op_sng,"sqravg")) return nco_op_sqravg; 00090 if(!strcmp(nco_op_sng,"sqrt")) return nco_op_sqrt; 00091 if(!strcmp(nco_op_sng,"total") || !strcmp(nco_op_sng,"ttl")) return nco_op_ttl; 00092 00093 if(!strcmp(nco_op_sng,"add") || !strcmp(nco_op_sng,"+") || !strcmp(nco_op_sng,"addition")) return nco_op_add; 00094 if(!strcmp(nco_op_sng,"sbt") || !strcmp(nco_op_sng,"-") || !strcmp(nco_op_sng,"dff") || !strcmp(nco_op_sng,"diff") || !strcmp(nco_op_sng,"sub") || !strcmp(nco_op_sng,"subtract") || !strcmp(nco_op_sng,"subtraction")) return nco_op_sbt; 00095 if(!strcmp(nco_op_sng,"dvd") || !strcmp(nco_op_sng,"/") || !strcmp(nco_op_sng,"divide") || !strcmp(nco_op_sng,"division")) return nco_op_dvd; 00096 if(!strcmp(nco_op_sng,"mlt") || !strcmp(nco_op_sng,"*") || !strcmp(nco_op_sng,"mult") || !strcmp(nco_op_sng,"multiply") || !strcmp(nco_op_sng,"multiplication")) return nco_op_mlt; 00097 00098 (void)fprintf(stderr,"%s: ERROR %s reports unknown user-specified operation type %s\n",prg_nm,fnc_nm,nco_op_sng); 00099 (void)fprintf(stderr,"%s: HINT Valid operation type (op_typ) choices:\n",prg_nm); 00100 if(prg_id == ncbo) (void)fprintf(stderr,"addition: add,+,addition\nsubtration: sbt,-,dff,diff,sub,subtract,subtraction\nmultiplication: mlt,*,mult,multiply,multiplication\ndivision: dvd,/,divide,division\n"); else (void)fprintf(stderr,"min,max,ttl,total,sqrt,sqravg,avgsqr,rms,rmssdn"); 00101 nco_exit(EXIT_FAILURE); 00102 return False; /* Statement should not be reached */ 00103 } /* end nco_op_typ_get() */
|
|
||||||||||||||||||||
|
Definition at line 13 of file nco_rth_utl.c. References nco_op_avg, nco_op_avgsqr, nco_op_max, nco_op_min, nco_op_rms, nco_op_rmssdn, nco_op_sqravg, nco_op_sqrt, nco_op_ttl, nco_var_add_tll_ncra(), nco_var_max_bnr(), nco_var_min_bnr(), nco_var_mlt(), and var_copy(). Referenced by main(). 00017 { 00018 /* Purpose: Perform appropriate ncra/ncea operation (avg, min, max, ttl, ...) on operands 00019 nco_opr_drv() is called within the record loop of ncra, and within file loop of ncea 00020 These operations perform some, but not all, of necessary operations for each procedure 00021 Most arithmetic operations require additional procedures such as normalization be performed after all files/records have been processed */ 00022 00023 /* var_prc_out->type and var_prc->type should be equal and thus interchangeable 00024 var_prc_out->sz and var_prc->sz should be equal and thus interchangeable */ 00025 switch (nco_op_typ){ 00026 case nco_op_min: /* Minimum */ 00027 /* On first loop, simply copy variables from var_prc to var_prc_out */ 00028 if(idx_rec == 0) (void)var_copy(var_prc->type,var_prc->sz,var_prc->val,var_prc_out->val); else 00029 (void)nco_var_min_bnr(var_prc_out->type,var_prc_out->sz,var_prc->has_mss_val,var_prc->mss_val,var_prc->val,var_prc_out->val); 00030 break; 00031 case nco_op_max: /* Maximium */ 00032 /* On first loop, simply copy variables from var_prc to var_prc_out */ 00033 if(idx_rec == 0) (void)var_copy(var_prc->type,var_prc->sz,var_prc->val,var_prc_out->val); else 00034 (void)nco_var_max_bnr(var_prc_out->type,var_prc_out->sz,var_prc->has_mss_val,var_prc->mss_val,var_prc->val,var_prc_out->val); 00035 break; 00036 case nco_op_avg: /* Average */ 00037 case nco_op_sqrt: /* Squareroot will produce the squareroot of the mean */ 00038 case nco_op_ttl: /* Total */ 00039 case nco_op_sqravg: /* Square of the mean */ 00040 (void)nco_var_add_tll_ncra(var_prc->type,var_prc->sz,var_prc->has_mss_val,var_prc->mss_val,var_prc->tally,var_prc->val,var_prc_out->val); 00041 break; 00042 case nco_op_rms: /* Root mean square */ 00043 case nco_op_rmssdn: /* Root mean square normalized by N-1 */ 00044 case nco_op_avgsqr: /* Mean square */ 00045 /* Square values in var_prc first */ 00046 nco_var_mlt(var_prc->type,var_prc->sz,var_prc->has_mss_val,var_prc->mss_val,var_prc->val,var_prc->val); 00047 /* Sum the squares */ 00048 (void)nco_var_add_tll_ncra(var_prc_out->type,var_prc_out->sz,var_prc->has_mss_val,var_prc->mss_val,var_prc->tally,var_prc->val,var_prc_out->val); 00049 break; 00050 } /* end switch */ 00051 } /* end nco_opr_drv() */
|
|
||||||||||||
|
Definition at line 174 of file nco_rth_utl.c. References EXIT_FAILURE, nco_exit(), and prg_nm_get(). Referenced by main(), and nco_var_avg(). 00176 { 00177 /* Purpose: Zero all values of long array */ 00178 00179 size_t sz_byt; /* [B] Number of bytes in variable buffer */ 00180 sz_byt=(size_t)sz*sizeof(long); 00181 (void)memset((void *)op1,(int)0,sz_byt); 00182 00183 #if 0 00184 /* Presumably this old method used until 20050321 is slower because of pointer de-referencing */ 00185 long idx; 00186 if(op1 == NULL){ 00187 (void)fprintf(stdout,"%s: ERROR nco_zero_long() asked to zero NULL pointer\n",prg_nm_get()); 00188 nco_exit(EXIT_FAILURE); 00189 } /* endif */ 00190 for(idx=0;idx<sz;idx++) op1[idx]=0L; 00191 #endif /* !0 */ 00192 00193 } /* end nco_zero_long() */
|
|
||||||||||||||||||||
|
Definition at line 135 of file nco_rth_utl.c. References cast_void_nctype(), NC_BYTE, NC_CHAR, NC_DOUBLE, NC_FLOAT, NC_INT, NC_SHORT, nco_dfl_case_nc_type_err(), and type. Referenced by nco_var_cnf_dmn(). 00139 { 00140 /* Purpose: Fill every value of first operand with value of second operand */ 00141 long idx; 00142 00143 /* Typecast pointer to values before access */ 00144 (void)cast_void_nctype(type,&op1); 00145 switch(type){ 00146 case NC_FLOAT: 00147 for(idx=0;idx<sz;idx++) op1.fp[idx]=op2; 00148 break; 00149 case NC_DOUBLE: 00150 for(idx=0;idx<sz;idx++) op1.dp[idx]=op2; 00151 break; 00152 case NC_INT: 00153 for(idx=0;idx<sz;idx++) op1.lp[idx]=(long)op2; /* Coerce to avoid C++ compiler assignment warning */ 00154 break; 00155 case NC_SHORT: 00156 for(idx=0;idx<sz;idx++) op1.sp[idx]=(short)op2; /* Coerce to avoid C++ compiler assignment warning */ 00157 break; 00158 case NC_CHAR: 00159 /* Do nothing */ 00160 break; 00161 case NC_BYTE: 00162 /* Do nothing */ 00163 break; 00164 default: nco_dfl_case_nc_type_err(); break; 00165 } /* end switch */ 00166 00167 /* NB: it is not neccessary to un-typecast pointers to values after access 00168 because we have only operated on local copies of them. */ 00169 00170 } /* end vec_set() */
|
1.4.4