nco/nco_rth_utl.h File Reference

#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)


Function Documentation

int nco_op_prs_rlt const char *const   op_sng  ) 
 

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() */

int nco_op_typ_get const char *const   nco_op_sng  ) 
 

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() */

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
 

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() */

void nco_zero_long const long  sz,
long *restrict const   op1
 

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() */

void vec_set const nc_type  type,
const long  sz,
ptr_unn  op1,
const double  op2
 

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() */


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