/* histograms.c * * * Emilio 3/31/99 * Updated program. * Emilio 12/9/98 * Wrote and debugged program. * COMPILE AS: gccemu histograms ******************************************************************************/ #include <emu.h> const char * cpszUsage = {"usage: histograms \n\ \n\ .\n\ "}; /* local functions */ void Setup(void); void ProcessAndOutput(void); void writeNCvar(int ncID, char *parameter, char *Type, char *LongType, float *array, char *dims); /* local variables */ int binindex, bintot; float binmin, binmax, bindel; double *binmidpt; float *x, *varmeants, **out; int errnc; #define PERC 0 int main(int argc, char *argv[]) { AssignString(&pszNCtitle, "Time Series of Spatial Histograms"); AssignString(&pszNChist, "file created by histograms"); 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*((float) 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[PERC][tb] = 0.0; out[COUNT][tb] = 0.0; } varmeants = alloc1d_f(0,nTimeSteps-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; char axislname[20]; /* 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); strcpy(axislname, pstVars[0].param); /* strcpy(axisunits, pstVars[0].units); */ FillAxisProp("z", axislname, "units", TRUE, binmin+bindel, binmax-bindel, bintot, binmidpt, FALSE); FillTAxisProp("time", "time", "default", TRUE, Tvalues[0], Tvalues[nTimeSteps-1], nTimeSteps, Tvalues, "default", FALSE); ncID = newNCsetup(&tID, pszOutputFile, pszNCtitle, pszNChist); free1d_d(Tvalues, 0,nTimeSteps); for (v = 0; v < nVars; v++) { for (tvar = 0; tvar < nTimeSteps; tvar++) { getyrmonth(tvar, &yr, &mo); ReadXY(x, pstVars[v], yr, mo); varmeants[tvar] = 0.0; for (b=0; b < bintot; b++) { tb = bintot*tvar + b; out[COUNT][tb] = 0.0; } for (i = 0; i < nRows*nCols; i++) if (masktest(pMask[i])) { varmeants[tvar] += x[i]; x">binindex = floor((double)(x[i] - binmin)/bindel); if (binindex >= 0 && binindex < bintot) { tb = bintot*tvar + binindex; out[COUNT][tb] += 1.0; } } varmeants[tvar] /= (float)MskTotCellcount; for (b=0; b < bintot; b++) { tb = bintot*tvar + b; if (out[COUNT][tb] > 0) out[PERC][tb] = 100.0*out[COUNT][tb]/(float)MskTotCellcount; else out[PERC][tb] = -999.0; /* should be doing *area* weighing... */ } } /* Define and Write the output nc variable */ writeNCvar(ncID, pstVars[v].param, "perc", "percent long name", out[PERC], "zt"); writeNCvar(ncID, pstVars[v].param, "av", "average long name", varmeants, "t"); } 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(varmeants,0,nTimeSteps-1); free1d_f(x,0,nRows*nCols-1); } /* ============================================================ */ void writeNCvar(int ncID, char *parameter, char *Type, char *LongType, float *array, char *dims) { 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); if (istype(dims, "zt")) varID = DefNCvar(ncID, varName, EMU_FLOAT, "zt", varLongName, ""); else if (istype(dims, "t")) varID = DefNCvar(ncID, varName, EMU_FLOAT, "t", varLongName, ""); errnc = nc_put_var_float(ncID, varID, array); }