/* vegdynvsci.c
* *
* Emilio 3/31/99
* Updated program.
* Emilio 12/7-8/98
* Wrote and debugged program.
* COMPILE AS: gccemu vegdynvsci
******************************************************************************/
#include "emu.h"
const char * cpszUsage = {"usage: vegdynvsci \n\
\n\
.\n\
"};
/* local functions */
void Setup(void);
void ProcessAndOutput(void);
void writeNCvar(int ncID, char *parameter, char *Type, char *LongType, float *array);
/* local variables */
int binindex, bintot;
float binmin, binmax, bindel;
double *binmidpt;
float *x, *clindexMap, **out;
int errnc;
int main(int argc, char *argv[])
{
AssignString(&pszNCtitle, "Average Vegetation Dynamics vs. Climate Index");
AssignString(&pszNChist, "file created by vegdynvsci");
Initialize(&argc, argv, DOMASK);
Setup();
ProcessAndOutput();
CleanUp();
return(0);
}
/* ================================================================= */
void Setup(void)
{
int b, tb, tvar;
binmin = P[0];
binmax = P[1];
intot">bintot = (int)P[2];
bindel = (binmax-binmin)/(float)bintot;
/* write midpoint of each bin into array binmidpt */
binmidpt = alloc1d_d(0,bintot-1);
for (b=0; b < bintot; b++)
binmidpt[b] = binmin + bindel*((double) b + 0.5);
out = alloc2d_f(0,2-1,0,nTimeSteps*bintot-1);
for (tvar=0; tvar < nTimeSteps; tvar++)
for (b=0; b < bintot; b++) {
tb = bintot*tvar + b;
out[SUM][tb] = 0.0;
out[COUNT][tb] = 0.0;
}
clindexMap = alloc1d_f(0,nRows*nCols-1);
x = alloc1d_f(0,nRows*nCols-1);
}
/* ================================================================= */
void ProcessAndOutput(void)
{
int v, yr, mo, i, b, tb, tvar, t1; int bug=0;
int ncID, tID;
double *Tvalues;
/* CREATE OUTPUT NETCDF FILE */
Tvalues = alloc1d_d(0,nTimeSteps);
t1 = (nFirstYear - (YEARORIGIN + 1))*12 + nFirstMonth;
for (tvar=0; tvar < nTimeSteps; tvar++)
Tvalues[tvar] = (double) MONTH2HOUR*(t1 + tvar + 0.001);
FillAxisProp("z", "Rainfall Climate Index", "0-1", 1, binmin+bindel, binmax-bindel, bintot, binmidpt, FALSE);
FillTAxisProp("time", "time", "default", 1, Tvalues[0], Tvalues[nTimeSteps-1], nTimeSteps, Tvalues, "default", FALSE);
ncID = newNCsetup(&tID, pszOutputFile, pszNCtitle, pszNChist);
free1d_d(Tvalues, 0,nTimeSteps);
/* read in climate index map (time-independent variable) */
ReadXY(clindexMap, pstVars[0], NONE, NONE);
for (v = 1; v < nVars; v++)
{
for (tvar = 0; tvar < nTimeSteps; tvar++)
{
getyrmonth(tvar, &yr, &mo);
ReadXY(x, pstVars[v], yr, mo);
for (b=0; b < bintot; b++) {
tb = bintot*tvar + b;
out[SUM][tb] = 0.0;
out[COUNT][tb] = 0.0;
}
for (i = 0; i < nRows*nCols; i++)
if (masktest(pMask[i]))
{
binindex = floor((double)(clindexMap[i] - binmin)/bindel);
if (binindex >= 0 && binindex < bintot)
{
tb = bintot*tvar + binindex;
out[SUM][tb] += x[i];
out[COUNT][tb] += 1.0;
}
}
for (b=0; b < bintot; b++) {
tb = bintot*tvar + b;
if (out[COUNT][tb] > 0) out[MEAN][tb] /= out[COUNT][tb];
}
}
/* Define and Write the output nc variable */
writeNCvar(ncID, pstVars[v].param, "avci", "av long name", out[MEAN]);
writeNCvar(ncID, pstVars[v].param, "count", "cnt long name", out[COUNT]);
}
errnc = nc_close(ncID);
}
/* ================================================================= */
void ProcessCommandLineArgs(int * pArgc, char * argv[])
{
}
/* ================================================================= */
void LocalCleanUp(void)
{
free2d_f(out,0,2-1,0,nTimeSteps*bintot-1);
free1d_d(binmidpt,0,bintot-1);
free1d_f(clindexMap,0,nRows*nCols-1);
free1d_f(x,0,nRows*nCols-1);
}
/* ============================================================ */
void writeNCvar(int ncID, char *parameter, char *Type, char *LongType, float *array)
{
int varID; /* variable ID */
char varName[NAMELEN]; /* Name of NC variable(s) to be written */
char varLongName[NAMELEN]; /* Long Name of NC variable(s) to be written */
sprintf(varName,"%s_%s", parameter,Type);
sprintf(varLongName,"%s %s", parameter,LongType);
varID = DefNCvar(ncID, varName, EMU_FLOAT, "zt", varLongName, "");
errnc = nc_put_var_float(ncID, varID, array);
}