/* sitests.c
* *
* Emilio 10/27/99
* Updated program.
* Emilio 7/21/98
* *
* COMPILE AS: gccemu sitests
* RUN AS: sitests <output file>
******************************************************************************/
#include "emu.h"
const char * cpszUsage = {"usage: tsmultiplesites \n\
Given a mask file with unique integer ids (values), sitests\n\
creates a table containing time series of each specified variable, where\n\
corresponding to the spatial mean for each unique mask id.\n\
\n\
Command-line switches specific to this program are:\n\
\t-nh Don't print out headers (1st two rows) \n\
\n\
"};
/* local functions */
void Setup(void);
void Process(void);
void Output(void);
/* local variables */
float *x, ***out;
double *sum_mo, mean_mo;
BOOL bNoHeaders;
int errnc;
int main(int argc, char *argv[])
{
Initialize(&argc, argv, DOMASK);
Setup();
Process();
Output();
CleanUp();
return(0);
}
/* ================================================================= */
void Setup(void)
{
int v, i, sindex;
out = alloc3d_f(0,FlMskSitesN-1,0,nVars-1,0,nTimeSteps-1);
for (sindex=0; sindex < FlMskSitesN; sindex++)
for (v=0; v < nVars;v++)
for (i=0; i < nTimeSteps;i++)
out[sindex][v][i] = 0.0;
x = alloc1d_f(0,nRows*nCols-1);
sum_mo = alloc1d_d(0,FlMskSitesN-1);
}
/* ================================================================= */
void Process(void)
{
int v, yr, mo, i; int bug=0;
int tvar = 0, sindex, n;
for (v=0; v < nVars; v++)
{
for (tvar=0; tvar < nTimeSteps; tvar++)
{
getyrmonth(tvar, &yr, &mo);
if (bDebug) printf("\n pstVars[%d]=%s: tvar=%d, year=%d, month=%d * ",
v,pstVars[v].param,tvar,yr,mo+1);
ReadXY(x, pstVars[v], yr, mo);
/* initialize/clear cumulative temp variables */
mean_mo = 0.0;
for (sindex=0; sindex < FlMskSitesN; sindex++)
sum_mo[sindex] = 0.0;
for (i=0; i < nRows*nCols; i++)
if (masktest(pMask[i]))
{
sindex = siteindex(FlMskSitesIDs, pMask[i]);
/* catch floating-point underflow errors with tolerance "TOL" */
if (x[i] > TOL || x[i] < -TOL)
sum_mo[sindex] += cellarea(i) * x[i];
}
for (n=0; n < FlMskSitesN; n++)
{
mean_mo = sum_mo[n] / (double) FlMskSitesArea[n];
/* mean_mo = sum_mo[n] / (double) FlMskSitesCellcount[n]; */
/* sd_mo = sum2_mo[n]/ (double) FlMskSitesCellcount[n] - mean_mo*mean_mo; */
/* sd_mo = sqrt(sd_mo); */
out[n][v][tvar] = mean_mo;
}
} /* END tvar FOR-LOOP (loop thru each time step) */
} /* END v FOR-LOOP (loop thru each variable) */
}
/* ================================================================= */
/* ========== WRITE OUT COLUMN (SERIES) HEADERS PER SITE =========== */
void Output(void)
{
FILE *fout;
double mIDweight;
int v, yr, mo, n, tvar = 0; int bug=0;
int m, sindex;
fout = OUTPUTfile(pszOutputFile, ".mts");
/* write out headers */
if (!bNoHeaders)
if (nVars == 1) /* for print outs of single variables */
fprintf(fout,"%s\n", pstVars[0].param);
for (n=0; n < MskSitesN; n++)
{
if (!bQuiet) printf("\n sites: MskSitesIDs[%d] = %d, .cellcount = %d, .area = %.1f ",
n,MskSitesIDs[n],Masks[n].cellcount,Masks[n].area/1000000.0);
for (v=0; v < nVars; v++)
if (!bNoHeaders)
fprintf(fout,", %d", MskSitesIDs[n]);
else
fprintf(fout,"%d,", MskSitesIDs[n]);
}
if (nVars > 1)
{
fprintf(fout,"\n");
for (n=0; n < MskSitesN; 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 (bNoHeaders)
fprintf(fout,"\n");
else
{
if (pstVars[0].tTimeType == MONMEAN) /* print out month only */
fprintf(fout,"\n%d", mo+1);
else if (pstVars[0].tTimeType == ANNUAL) /* print out year only */
fprintf(fout,"\n%d", yr);
else /* print out month and year */
fprintf(fout,"\n%d/%d", mo+1, yr);
}
for (n=0; n < MskSitesN; n++)
for (v=0; v < nVars; v++)
{
mean_mo = 0.0;
for (m=0; m < Masks[n].nMaskids; m++)
{
sindex = siteindex(FlMskSitesIDs, Masks[n].maskids[m]);
/* cellcountWt = (double) FlMskSitesCellcount[sindex] /
(double) Masks[n].cellcount; */
mIDweight = FlMskSitesArea[sindex] / Masks[n].area;
mean_mo += out[sindex][v][tvar] * mIDweight;
}
if (!bNoHeaders)
fprintf(fout,", %f", mean_mo);
else
fprintf(fout,"%f,", mean_mo);
} /* END v FOR-LOOP */
} /* END tvar FOR-LOOP */
fclose(fout);
}
/* ================================================================= */
void ProcessCommandLineArgs(int * pArgc, char * argv[])
{
int i;
for (i=1; i<*pArgc; i++)
if (strcmp(argv[i], "-nh") == 0)
bNoHeaders = TRUE;
}
/* ================================================================= */
void LocalCleanUp(void)
{
free3d_f(out,0,FlMskSitesN-1,0,nVars-1,0,nTimeSteps-1);
free1d_f(x,0,nRows*nCols-1);
free1d_d(sum_mo,0,MskSitesN-1);
}