/* runoffbasins.c
* *
* Emilio 4/1/99
* Updated program.
* Emilio 7/21/98
* *
* COMPILE AS: gccemu runoffbasins
* RUN AS: runoffbasins <output file>
******************************************************************************/
#include "emu.h"
const char * cpszUsage = {"usage: runoffbasins \n\
Given a mask file with unique integer ids (values), runoffbasins\n\
creates a table containing time series of total runoff in m^3/sec.\n\
\n\
Command-line switches specific to this program are:\n\
\t-nh Don't print series headers (1st two rows) \n\
\n\
"};
/* local functions */
void Setup(void);
void Process(void);
void Output(void);
/* local variables */
float *x, ***series;
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;
series = 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++)
series[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];
series[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 UnitConversion;
int yr, mo, n, tvar = 0; int bug=0;
int m, sindex;
fout = OUTPUTfile(pszOutputFile, ".mts");
/* write series headers */
if (!bNoHeaders)
fprintf(fout,"RUNOFF\n");
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);
/* fprintf(fout,", %d", MskSitesIDs[n]); */
fprintf(fout,"%d,", MskSitesIDs[n]);
}
/* write series data (series[][][]) per site */
for (tvar=0; tvar < nTimeSteps; tvar++)
{
getyrmonth(tvar, &yr, &mo);
if (!bNoHeaders)
if (pstVars[0].tTimeType == MONMEAN) /* if monmean, don't print series a year */
fprintf(fout,"\n%d", mo+1);
else
fprintf(fout,"\n%d/%d", mo+1, yr);
fprintf(fout,"\n");
for (n=0; n < MskSitesN; n++)
{
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; */
UnitConversion = FlMskSitesArea[sindex] * MM2M / MONTH2SEC;
mean_mo += series[sindex][0][tvar] * UnitConversion;
/* runoff = (runofflow+runoffup [in mm])*(10^-3 m/mm) * (total area of pixels)
* (10^6 m2/km2) / [(30.417 days/month)*(86400 secs/day)] */
}
if (!bNoHeaders)
fprintf(fout,", %f", mean_mo);
else
fprintf(fout,"%f,", mean_mo);
}
} /* 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(series,0,FlMskSitesN-1,0,nVars-1,0,nTimeSteps-1);
free1d_f(x,0,nRows*nCols-1);
free1d_d(sum_mo,0,MskSitesN-1);
}