/* rxyfactors.c
* *
* Emilio 3/31/99
* Updated program.
* Emilio 4/22/98
* *
* COMPILE AS: gccemu rxyfactors
* RUN AS: rxyfactors <parameter>
******************************************************************************/
#include "emu.h"
const char * cpszUsage = {"usage: rxyfactors \n\
Program to calculate spatial correlation time series (Rxy) between a\n\
Dependent Variable and a number of factors (Independent Variables).\n\
\n\
"};
/* local functions */
void Setup(void);
void Process(void);
void Output(void);
/* local variables */
float *x, *depvarx, ***out;
#define NUMPARAM 3
#define NPP 0
#define FAC 1
#define R 0
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,1-1,0,nVars-1,0,nTimeSteps-1);
for (v=0; v < nVars;v++)
for (i=0; i < nTimeSteps;i++)
out[R][v][i] = 0.0; R="#009900">/* correlation, R */
x = alloc1d_f(0,nRows*nCols-1);
depvarx = 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 l1, l2, tvar = 0;
double scalar_mo, stats_mo[2][NUMPARAM], cov_mo;
float xmap, xval, depvarxval;
for (v = 1; v < nVars; v++)
{
for (tvar = 0; tvar < nTimeSteps;tvar++)
{
getyrmonth(tvar, &yr, &mo);
ReadXY(x, pstVars[v], yr, mo);
ReadXY(depvarx, pstVars[NPP], yr, mo);
if (bDebug)
printf("\n pstVars[%d]=%s: tvar=%d, year=%d, month=%d * ", v,pstVars[v].param,tvar,yr,mo+1);
for (l1=0; l1<2; l1++)
for (l2=0; l2<NUMPARAM; l2++)
stats_mo[l1][l2] = 0.0;
for (i = 0; i < nRows*nCols; i++)
{
if (masktest(pMask[i]))
{
/* catch floating-point underflow errors w/ tolerance "TOL" */
xmap = x[i]; /* INDEPENDENT VAR */
xval = (xmap > TOL || xmap < -TOL) ? xmap : 0.0;
xmap = depvarx[i]; /* NPP */
depvarxval = (xmap > TOL || xmap < -TOL) ? xmap : 0.0;
stats_mo[FAC][SUM] += cellarea(i) * xval;
stats_mo[FAC][SUM2] += cellarea(i) * xval * xval;
stats_mo[NPP][SUM] += cellarea(i) * depvarxval;
stats_mo[NPP][SUM2] += cellarea(i) * depvarxval * depvarxval;
stats_mo[FAC][SUM2XY] += cellarea(i) * xval * depvarxval;
} /* END masktest() IF-BLOCK */
} /* END i-loop (read each pixel) */
scalar_mo = MskTotArea;
stats_mo[FAC][MEAN] = stats_mo[FAC][SUM] / scalar_mo;
stats_mo[FAC][SD] = sqrt(stats_mo[FAC][SUM2]/scalar_mo - DSQR(stats_mo[FAC][MEAN]));
stats_mo[NPP][MEAN] = stats_mo[NPP][SUM] / scalar_mo;
stats_mo[NPP][SD] = sqrt(stats_mo[NPP][SUM2]/scalar_mo - DSQR(stats_mo[NPP][MEAN]));
cov_mo = stats_mo[FAC][SUM2XY]/scalar_mo - stats_mo[FAC][MEAN]*stats_mo[NPP][MEAN];
out[R][v][tvar] = (float) cov_mo/(stats_mo[FAC][SD] * stats_mo[NPP][SD]);
} /* END tvar FOR-LOOP (loop thru each time step) */
} /* END v FOR-LOOP (loop thru each variable) */
}
/* ================================================================= */
/* ========== CALCULATE AND WRITE TO FILE MONTHLY STATS ============ */
void Output(void)
{
FILE *fout;
int v, yr, mo, n, tvar = 0; int bug=0;
fout = OUTPUTfile(pszOutputFile, ".rxy");
/* write out headers */
for (v = 1; v < nVars; v++)
fprintf(fout,", Rxy");
fprintf(fout,"\n");
for (n=0; n < 1; n++)
for (v = 1; 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 < 1; n++)
for (v = 1; v < nVars; v++)
fprintf(fout,", %.3f", out[n][v][tvar]);
} /* END tvar FOR-LOOP */
fclose(fout);
}
/* ================================================================= */
void ProcessCommandLineArgs(int * pArgc, char * argv[])
{
}
/* ================================================================= */
void LocalCleanUp(void)
{
free3d_f(out,0,1-1,0,nVars-1,0,nTimeSteps-1);
free1d_f(x,0,nRows*nCols-1);
free1d_f(depvarx,0,nRows*nCols-1);
}