/* masksnc.c * Emilio 4/1/99 * Updated program. * Emilio 4/22/98 * * * COMPILE AS: gccemu masksnc * RUN AS: masksnc ******************************************************************************/ #include "emu.h" const char * cpszUsage = {"usage: masksnc \n\ Create netcdf Mask file from binary (2-byte) files.\n\ \n\ "}; /* local functions */ void Setup(void); void ProcessAndOutput(void); /* local variables */ short *vars, *maskdata_s; unsigned char *maskdata_uc; int ncID; /* netCDF file IDs */ int errnc; int main(int argc, char *argv[]) { Initialize(&argc, argv, NOMASK); Setup(); ProcessAndOutput(); CleanUp(); return(0); } /* ================================================================= */ void Setup(void) { vars = alloc1d_s(0,nRows*nCols-1); maskdata_s = alloc1d_s(0,nRows*nCols-1); maskdata_uc = alloc1d_uc(0,nRows*nCols-1); } /* ================================================================= */ void ProcessAndOutput(void) { FILE *binfin; int i, irev, col, row, nmasks; int maskID=1; /* mask ID */ size_t strlen; nc_type ncType; char maskvarname[FILENAMELEN], file[FILENAMELEN], *filename; char ncfile[FILENAMELEN]; /* cdf file to be written */ char baseCDLtoNC[FILENAMELEN]; /* ncgen command to generate header nc file */ /* TRANSLATE DEFAULT CDL HEADER FILE TO netcdf FORMAT USING ncgen */ strcpy(ncfile, "/oc7/casa/modelinput/nc/masks.nc"); sprintf(baseCDLtoNC, "%s -o %s /oc7/casa/results/netcdf/cdls/masks.cdl", pszNCGenFile, ncfile); system(baseCDLtoNC); /* OPEN AND INITIALIZE netCDF FILE DEFINITIONS */ errnc = nc_open(ncfile, NC_WRITE, &ncID); errnc = nc_inq_nvars(ncID, &nmasks); if (!bQuiet) printf("ncinquire: nmasks=%d, Number of mask variables: %d\n", nmasks, nmasks-2); while (++maskID <= nmasks-1) { if (!bQuiet) printf("maskID=%d\n", maskID); /* EXTRACT VARTYPE (NC_BYTE or NC_SHORT), THEN NUMBER OF BYTES (1 or 2) */ errnc = nc_inq_varname(ncID, maskID, maskvarname); errnc = nc_inq_vartype(ncID, maskID, &ncType); /* EXTRACT FILENAME FROM CDL/NC FILE ITSELF */ errnc = nc_inq_attlen(ncID, maskID, "long_name_mod", &strlen); filename = (char *) malloc(strlen * sizeof(char)); errnc = nc_get_att_text(ncID, maskID, "long_name_mod", filename); strcpy(file, "/oc7/casa/modelinput/input/mask/0.05deg/"); strcat(file, filename); if (bDebug) printf("ncvarinq: maskvarname=%s, %s, ncType=%d\n", maskvarname,filename, ncType); /* OPEN BINARY FILE, READ DATA */ if ((binfin = fopen(file, "r")) == NULL) nrerror("Couldn't open file %s for reading\n", filename); if (fread(vars, sizeof(short), nRows*nCols, binfin) != nRows*nCols) nrerror("Could not do fread in %s\n", filename); fclose(binfin); /* WRITE MASK DATA */ for (i = 0; i < nRows*nCols; i++) { irev = getRowRevCol(i, &col, &row); /* handle fill values (areas outside mask) */ if (ncType == NC_BYTE) maskdata_uc[irev] = (vars[i] <= 0) ? 255 : (char) vars[i]; else if (ncType == NC_SHORT) maskdata_s[irev] = (vars[i] <= 0) ? -999 : vars[i]; } /* END i FOR-LOOP */ /* write data to NC file */ if (ncType == NC_BYTE) errnc = nc_put_var_uchar(ncID, maskID, maskdata_uc); else if (ncType == NC_SHORT) errnc = nc_put_var_short(ncID, maskID, maskdata_s); } /* END maskID-LOOP */ errnc = nc_close(ncID); } /* ================================================================= */ void ProcessCommandLineArgs(int * pArgc, char * argv[]) {} /* ================================================================= */ void LocalCleanUp(void) { free1d_s(vars,0,nRows*nCols-1); free1d_s(maskdata_s,0,nRows*nCols-1); free1d_uc(maskdata_uc,0,nRows*nCols-1); }