/* clclimate.c
* *
* Emilio 4/1/99
* Updated program.
* Emilio 3/11-15/99
* Wrote and debugged program.
* COMPILE AS: gccemu clclimate
******************************************************************************/
#include "emu.h"
const char * cpszUsage = {"usage: lcclimate \n\
.\n\
"};
/* local functions */
void Setup(void);
void ProcessAndOutput(void);
/* local variables */
#define TOTPIXELS 62483
int errnc;
int ncID, tID;
float *map;
static size_t count[] = {1,0,0}, start[] = {0,0,0};
/* The coordinates are in degree-decimals and indicate the SW corner of each pixel */
typedef struct _climate
{
float lon;
float lat;
float data[12];
} CLIMATE;
CLIMATE clim[TOTPIXELS];
int main(int argc, char *argv[])
{
AssignString(&pszNCtitle, "Cramer & Leemans CLIMATE v2.1 Climatology");
AssignString(&pszNChist, "Created by EMU/clclimate.c., March 15, 1999");
Initialize(&argc, argv, NOMASK);
Setup();
ProcessAndOutput();
CleanUp();
return(0);
}
/* ================================================================= */
void Setup(void)
{
map = alloc1d_f(0,nRows*nCols-1);
/* Create output netcdf file */
SetupDefaultAxes(TRUE, TRUE);
count[1] = stAxes[1].length;
count[2] = stAxes[0].length;
ncID = newNCsetup(&tID, pszOutputFile, pszNCtitle, pszNChist);
}
/* ================================================================= */
void ProcessAndOutput(void)
{
int iout, i, col, row, v, p, mo;
short sFillValue = -999, FillValue;
BYTE byFillValue = 255;
float fFillValue = -999.0;
float scale_factor, lon;
emu_type VarEmuType;
FILE *fin;
int varID;
for (v=0; v < nVars; v++)
{
if (bDebug) printf("\n Var %d, %s \n", v,pstVars[v].name);
if ((fin = fopen(pstVars[v].path,"r")) == NULL)
nrerror("Couldn't open file %s for writing\n", pstVars[v].path);
for (p=0; p < TOTPIXELS; p++)
fscanf(fin, "%f %f %f %f %f %f %f %f %f %f %f %f %f %f", &clim[p].lon, &clim[p].lat,
&clim[p].data[0], &clim[p].data[1], &clim[p].data[2], &clim[p].data[3],
&clim[p].data[4], &clim[p].data[5], &clim[p].data[6], &clim[p].data[7],
&clim[p].data[8], &clim[p].data[9], &clim[p].data[10], &clim[p].data[11]);
fclose(fin);
VarEmuType = pstVars[v].tEmuType;
if (VarEmuType == EMU_FLOAT)
FillValue = fFillValue;
else if (VarEmuType == EMU_SHORT)
FillValue = sFillValue;
else if (VarEmuType == EMU_BYTE)
FillValue = byFillValue;
varID = DefNCvar(ncID, pstVars[v].name, VarEmuType, "xyt", pstVars[v].szP[0], pstVars[v].szP[1]);
if (pstVars[v].nParams > 0)
{
scale_factor = pstVars[v].P[0];
AddNCCompressionAttributes(ncID, varID, scale_factor, 0.0);
}
else
scale_factor = 1.0;
for (mo=0; mo < 12; mo++)
{
for (i=0; i < nRows*nCols; i++)
map[i] = FillValue;
for (p=0; p < TOTPIXELS; p++)
{
/* adjust lon * lat from SW corner (LC format) to center of pixel, shift lon,
then convert to col,row and then to array index */
climate.c.html#lon">lon = clim[p].climate.c.html#lon">lon+0.5*fHScale;
lon += (lon < 0) ? 360.0 : 0.0;
col = (int)floor((lon - fLonLeft)/fHScale + 0.5);
row = (int)floor(((clim[p].lat+0.5*fVScale) - fLatBtm)/fVScale + 0.5);
iout = nCols*row + col;
climate.c.html#map">map[iout] = clim[p].data[mo] / scale_factor;
}
start[0] = mo;
errnc = nc_put_vara_float(ncID, varID, start, count, map);
}
}
errnc = nc_close(ncID);
}
/* ================================================================= */
void ProcessCommandLineArgs(int * pArgc, char * argv[])
{
}
/* ================================================================= */
void LocalCleanUp(void)
{
free1d_f(map,0,nRows*nCols-1);
}