/* statsmonthly.c
* *
* Emilio 3/31/99
* Updated program.
* Emilio 4/22/98
* *
* COMPILE AS: gccemu statsmonthly
* RUN AS: statsmonthly <parameter>
******************************************************************************/
#include "emu.h"
const char * cpszUsage = {"usage: statsmonthly \n\
Program to extract preliminary descriptive statistics (mean, sd, min, max)\n\
for different CASA runs, for each month, and for the annual cycle.\n\
\n\
"};
/* local functions */
void Setup(void);
void Process(void);
void Output(void);
/* local variables */
float *x, ***out;
#define NUMPARAM 4
int main(int argc, char *argv[])
{
Initialize(&argc, argv, DOMASK);
Setup();
Process();
Output();
CleanUp();
return(0);
}
/* ================================================================= */
void Setup(void)
{
int v, i;
/* allocate memory and initialize out[][][] TO 0.0 */
out = alloc3d_f(0,NUMPARAM-1,0,nVars-1,0,nTimeSteps-1);
for (v=0; v < nVars;v++)
for (i=0; i < nTimeSteps;i++)
{
out[MEAN][v][i] = 0.0; /* mean */
out[SD][v][i] = 0.0; /* s.d. */
out[MIN][v][i] = 0.0; /* min */
out[MAX][v][i] = 0.0; /* max */
}
x = alloc1d_f(0,nRows*nCols-1);
}
/* ================================================================= */
/* READ DATA AND CALCULATE STATISTICAL PARAMETERS */
void Process(void)
{
int v, yr, mo, i, n; int bug=0;
int tvar = 0;
float xval;
double scalar_mo, mean_mo, sd_mo, stats[NUMPARAM];
for (v = 0; v < nVars; v++)
for (tvar = 0; tvar < nTimeSteps;tvar++)
{
getyrmonth(tvar, &yr, &mo);
ReadXY(x, pstVars[v], yr, mo);
if (bDebug) printf("\n pstVars[%d]=%s: tvar=%d, year=%d, month=%d * ",
v,pstVars[v].param,tvar,yr,mo+1);
stats[SUM] = 0.0;
stats[SUM2] = 0.0;
stats[MIN] = 100000000.0;
stats[MAX] = -100000000.0;
for (i = 0; i < nRows*nCols; i++)
if (masktest(pMask[i]))
{
xval = x[i];
/* catch floating-point underflow errors w/ tolerance "TOL" */
if (xval > TOL || xval < -TOL) {
stats[SUM] += cellarea(i) * xval;
stats[SUM2] += cellarea(i) * xval * xval;
}
if (xval < stats[MIN])
stats[MIN] = xval;
if (xval > stats[MAX])
stats[MAX] = xval;
} /* END masktest() IF-BLOCK */
scalar_mo = MskTotArea;
mean_mo = stats[SUM]/scalar_mo;
sd_mo = stats[SUM2]/scalar_mo - mean_mo*mean_mo;
out[MEAN][v][tvar] = (float) mean_mo;
out[SD][v][tvar] = (float) sqrt(sd_mo);
out[MIN][v][tvar] = stats[MIN];
out[MAX][v][tvar] = stats[MAX];
} /* END tvar FOR-LOOP (loop thru each time step) */
}
/* ================================================================= */
/* == CALCULATE AND WRITE TO FILE MONTHLY STATS (FOR ANNUAL CYCLE) = */
void Output(void)
{
FILE *fout;
int v, yr, mo, n, tvar = 0; int bug=0;
fout = OUTPUTfile(pszOutputFile, ".stat");
for (v = 0; v < nVars; v++)
fprintf(fout,", mean");
for (v = 0; v < nVars; v++)
fprintf(fout,", s.d.");
for (v = 0; v < nVars; v++)
fprintf(fout,", min");
for (v = 0; v < nVars; v++)
fprintf(fout,", max");
fprintf(fout,"\n");
for (n=0; n < NUMPARAM; n++)
for (v = 0; v < nVars; v++)
fprintf(fout,", %s", pstVars[v].param);
/* write out data (out[][][]) per site */
for (tvar = 0; tvar < nTimeSteps;tvar++)
{
getyrmonth(tvar, &yr, &mo);
if (pstVars[0].tTimeType == MONMEAN) /* if monmean, don't print out a year */
fprintf(fout,"\n%d", mo+1);
else
fprintf(fout,"\n%d/%d", mo+1, yr);
for (n=0; n < NUMPARAM; n++)
for (v = 0; v < nVars; v++)
fprintf(fout,", %f", out[n][v][tvar]);
} /* END tvar FOR-LOOP */
fclose(fout);
}
/* ================================================================= */
void ProcessCommandLineArgs(int * pArgc, char * argv[])
{
}
/* ================================================================= */
void LocalCleanUp(void)
{
free3d_f(out,0,NUMPARAM-1,0,nVars-1,0,nTimeSteps-1);
free1d_f(x,0,nRows*nCols-1);
}