gridspec_api/host/nccf_put_host.c

00001 
00007 #include <string.h>
00008 #include <nccf_host.h>
00009 #include <nccf_errors.h>
00010 
00011 int nccf_put_host(int ncid, int hostid){
00012 
00013   int i;
00014   struct nccf_var_obj *mosaicFile;
00015   struct nccf_var_obj *vGridFiles;
00016   struct nccf_var_obj *vGridNames;
00017   struct nccf_var_obj *vStatDataFiles;
00018   struct nccf_var_obj *vTimeDataFiles;
00019   char *gridFilesBuff = NULL;
00020   char *gridNamesBuff = NULL;
00021   char *statDataFilesBuff = NULL;
00022   char *timeDataFilesBuff = NULL;
00023   int status;
00024   int totErr = NC_NOERR;
00025 
00026   struct nccf_host_type *self;
00027   self = nccf_li_find(&CFLIST_HOST, hostid);
00028 
00029   /* Build mosaic var */
00030   if( self->hasMosaic == 1 ){
00031     nccf_varCreate(&mosaicFile, CF_HOST_MOSAIC_FILENAME);
00032     nccf_varSetAttrib(&mosaicFile, CF_ATTNAME_CF_TYPE_NAME, 
00033                                         CF_GS_HOST_MOSAIC_FILENAME);
00034     int cfDims[] = {STRING_SIZE};
00035     const char *cfDimNames[] = {"string"};
00036     nccf_varSetDims( &mosaicFile, 1, cfDims, cfDimNames );
00037     nccf_varSetDataPtr( &mosaicFile, NC_CHAR, self->mosaicFileBuffer );
00038   }
00039 
00040   /* build the grid names var */
00041   if( self->nGrids > 0 ){
00042     int gfDims[2] = {self->nGrids, STRING_SIZE};
00043     const char *gfDimNames[2] = {CF_DIMNAME_NGRIDS, CF_DIMNAME_STRING};
00044     gridNamesBuff = (char*)calloc( self->nGrids, STRING_SIZE*sizeof(char));
00045     nccf_li_begin(&self->gridNames);
00046     i = -1;
00047     while (nccf_li_next(&self->gridNames)) {
00048       i++;
00049       int index = nccf_li_get_id(&self->gridNames);
00050       char *fn = (char *) nccf_li_find(&self->gridNames, index);
00051       strcpy(&gridNamesBuff[i*STRING_SIZE], fn);
00052     }
00053     nccf_varCreate(&vGridNames, CF_HOST_TILE_NAMES);
00054     nccf_varSetAttrib(&vGridNames, CF_ATTNAME_CF_TYPE_NAME, 
00055                                    CF_GS_HOST_TILE_NAMES);
00056     nccf_varSetDims(&vGridNames, 2, gfDims, gfDimNames);
00057     nccf_varSetDataPtr(&vGridNames, NC_CHAR, gridNamesBuff);
00058   }
00059 
00060   /* build the grid files var */
00061   if( self->nGrids > 0 ){
00062     int gfDims[2] = {self->nGrids, STRING_SIZE};
00063     const char *gfDimNames[2] = {CF_DIMNAME_NGRIDS, CF_DIMNAME_STRING};
00064     gridFilesBuff = (char*)calloc( self->nGrids, STRING_SIZE*sizeof(char));
00065     nccf_li_begin(&self->gridFiles);
00066     i = -1;
00067     while (nccf_li_next(&self->gridFiles)) {
00068       i++;
00069       int index = nccf_li_get_id(&self->gridFiles);
00070       char *fn = (char *) nccf_li_find(&self->gridFiles, index);
00071       strcpy(&gridFilesBuff[i*STRING_SIZE], fn);
00072     }
00073     nccf_varCreate(&vGridFiles, CF_HOST_TILE_FILENAMES);
00074     nccf_varSetAttrib(&vGridFiles, CF_ATTNAME_CF_TYPE_NAME, 
00075                                    CF_GS_HOST_TILE_FILENAMES);
00076     nccf_varSetDims(&vGridFiles, 2, gfDims, gfDimNames);
00077     nccf_varSetDataPtr(&vGridFiles, NC_CHAR, gridFilesBuff);
00078   }
00079 
00080   /* build static data files var */
00081   if( self->nStatDataFiles > 0 ){
00082     statDataFilesBuff = (char*)calloc( self->nStatDataFiles * self->nGrids, 
00083                                        STRING_SIZE*sizeof(char));
00084     nccf_li_begin(&self->statDataFiles);
00085     i = -1;
00086     while (nccf_li_next(&self->statDataFiles)) {
00087       i++;
00088       int index = nccf_li_get_id(&self->statDataFiles);
00089       char *fn = (char *) nccf_li_find(&self->statDataFiles, index);
00090       strcpy(&statDataFilesBuff[i*STRING_SIZE], fn);
00091     }
00092     nccf_varCreate(&vStatDataFiles, CF_HOST_STATDATA_FILENAME);
00093     nccf_varSetAttrib(&vStatDataFiles, CF_ATTNAME_CF_TYPE_NAME, 
00094                                        CF_GS_HOST_STATDATA_FILENAME);
00095     int nsd = self->nStatDataFiles / self->nGrids;
00096     int sdDims[3] = {nsd, self->nGrids, STRING_SIZE};
00097     const char *sdDimNames[3] = {CF_DIMNAME_NSTATDATA, 
00098                                  CF_DIMNAME_NGRIDS, 
00099                                  CF_DIMNAME_STRING};
00100     nccf_varSetDims(&vStatDataFiles, 3, sdDims, sdDimNames);
00101     nccf_varSetDataPtr(&vStatDataFiles, NC_CHAR, statDataFilesBuff);
00102   }
00103 
00104   /* write time dependent data files */
00105   if( self->nTimeDataFiles > 0 ){
00106     timeDataFilesBuff = (char*)calloc(self->nTimeDataFiles * self->nTimeSlices * self->nGrids, 
00107                           STRING_SIZE*sizeof(char));
00108     nccf_li_begin(&self->timeDataFiles);
00109     i = -1;
00110     while (nccf_li_next(&self->timeDataFiles)) {
00111       i++;
00112       int index = nccf_li_get_id(&self->timeDataFiles);
00113       char *fn = (char *) nccf_li_find(&self->timeDataFiles, index);
00114       strcpy(&timeDataFilesBuff[i*STRING_SIZE], fn);
00115     }
00116     nccf_varCreate(&vTimeDataFiles, CF_HOST_TIMEDATA_FILENAME);
00117     nccf_varSetAttrib(&vTimeDataFiles, CF_ATTNAME_CF_TYPE_NAME, 
00118                                        CF_GS_HOST_TIMEDATA_FILENAME);
00119     int ntd = self->nTimeDataFiles / ( self->nTimeSlices * self->nGrids );
00120     int tdDims[4] = {self->nTimeSlices, ntd, self->nGrids, STRING_SIZE};
00121     const char *tdDimNames[4] = {CF_DIMNAME_NTIMES, 
00122                                  CF_DIMNAME_NTIMEDATA, 
00123                                  CF_DIMNAME_NGRIDS, 
00124                                  CF_DIMNAME_STRING};
00125     nccf_varSetDims(&vTimeDataFiles, 4, tdDims, tdDimNames);
00126     nccf_varSetDataPtr(&vTimeDataFiles, NC_CHAR, timeDataFilesBuff);
00127   }
00128 
00129   /* write everything to disk */
00130   if (self->hasMosaic) {
00131     status = nccf_writeListOfVars(ncid, 1, mosaicFile);
00132     totErr += abs(status);
00133   }
00134   if (self->nGrids > 0) {
00135     status = nccf_writeListOfVars(ncid, 2, vGridNames, vGridFiles);
00136     totErr += abs(status);
00137   }
00138   if (self->nStatDataFiles > 0) {
00139     status = nccf_writeListOfVars(ncid, 1, vStatDataFiles);
00140     totErr += abs(status);
00141   }
00142   if (self->nTimeDataFiles > 0) {
00143     status = nccf_writeListOfVars(ncid, 1, vTimeDataFiles);
00144     totErr += abs(status);
00145   }
00146 
00147   /* clean up */
00148   if( self->hasMosaic ) nccf_varDestroy( &mosaicFile );
00149   if( gridFilesBuff ) free(gridFilesBuff);
00150   if( gridNamesBuff ) free(gridNamesBuff);
00151   
00152   if( self->nGrids > 0 ) nccf_varDestroy(&vGridFiles);
00153   if( self->nGrids > 0 ) nccf_varDestroy(&vGridNames);
00154 
00155   if( self->nStatDataFiles > 0 ){
00156     free(statDataFilesBuff);
00157     nccf_varDestroy(&vStatDataFiles);
00158   }
00159 
00160   if( self->nTimeDataFiles > 0 ){
00161     free(timeDataFilesBuff);
00162     nccf_varDestroy(&vTimeDataFiles);
00163   }
00164 
00165   if (totErr != NC_NOERR) {
00166     return NCCF_EPUTHOST;
00167   }
00168   else {
00169     return NC_NOERR;
00170   }
00171 }
00172 
00173 
 All Classes Files Functions Defines

Generated on Tue Mar 1 2011 06:36:59 for libCF. LibCF is a Unidata library.