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
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
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
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
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
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
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
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