Commit 4b95fb97ec18f2fb6c67618e85c2240997b8cbd9
1 parent
b1aa926a
Exists in
master
and in
10 other branches
Add TimesUpdate & TimesUpdateNoData
Showing
6 changed files
with
812 additions
and
1 deletions
Show diff stats
CMakeLists.txt
@@ -45,6 +45,8 @@ add_subdirectory(src/DECODERS/themis/esafull2nc) | @@ -45,6 +45,8 @@ add_subdirectory(src/DECODERS/themis/esafull2nc) | ||
45 | add_subdirectory(src/DECODERS/themis/esamom2nc) | 45 | add_subdirectory(src/DECODERS/themis/esamom2nc) |
46 | add_subdirectory(src/DECODERS/themis/fgm2nc) | 46 | add_subdirectory(src/DECODERS/themis/fgm2nc) |
47 | add_subdirectory(src/DECODERS/themis/sst2nc) | 47 | add_subdirectory(src/DECODERS/themis/sst2nc) |
48 | +add_subdirectory(src/TIMESUPDATE) | ||
49 | +add_subdirectory(src/TIMESUPDATENODATA) | ||
48 | add_subdirectory(tests) | 50 | add_subdirectory(tests) |
49 | 51 | ||
50 | install(FILES "scripts/StartServer" DESTINATION . PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) | 52 | install(FILES "scripts/StartServer" DESTINATION . PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) |
scripts/StartServer.in
@@ -6,7 +6,7 @@ DDBASE=/home/budnik/AMDA-NG.core/DDBASE/DATA | @@ -6,7 +6,7 @@ DDBASE=/home/budnik/AMDA-NG.core/DDBASE/DATA | ||
6 | DDPATH=/home/budnik/AMDA-NG.core/DDBASE | 6 | DDPATH=/home/budnik/AMDA-NG.core/DDBASE |
7 | DDLIB=@CMAKE_INSTALL_PREFIX@/lib | 7 | DDLIB=@CMAKE_INSTALL_PREFIX@/lib |
8 | DDBASEBIN=@CMAKE_INSTALL_PREFIX@/bin | 8 | DDBASEBIN=@CMAKE_INSTALL_PREFIX@/bin |
9 | -LD_LIBRARY_PATH=$DDLIB/:@NETCDFLIB_DIR@:@USRLIB_DIR@ | 9 | +LD_LIBRARY_PATH=$DDLIB/:@NETCDFLIB_DIR@:@libcdf_LIBRARIES@:@USRLIB_DIR@ |
10 | export DDBASE DDPATH DDBASEBIN DDLIB LD_LIBRARY_PATH | 10 | export DDBASE DDPATH DDBASEBIN DDLIB LD_LIBRARY_PATH |
11 | 11 | ||
12 | #$DDBASEBIN/DD_Server 1>/dev/null 2>/dev/null& | 12 | #$DDBASEBIN/DD_Server 1>/dev/null 2>/dev/null& |
@@ -0,0 +1,24 @@ | @@ -0,0 +1,24 @@ | ||
1 | + | ||
2 | +PROJECT(TimesUpdate) | ||
3 | + | ||
4 | +include_directories( | ||
5 | + ${CMAKE_HOME_DIRECTORY}/src/INCLUDE/ | ||
6 | + ${NETCDFINCLUDE_DIR} | ||
7 | +) | ||
8 | + | ||
9 | +#Configuration de l'exécutable | ||
10 | +file( | ||
11 | + GLOB_RECURSE | ||
12 | + source_files | ||
13 | + ./* | ||
14 | +) | ||
15 | + | ||
16 | +ADD_EXECUTABLE (TimesUpdate ${source_files} ) | ||
17 | + | ||
18 | +target_link_libraries( | ||
19 | + TimesUpdate | ||
20 | + DD_Client | ||
21 | + ${NETCDFLIBRARY} | ||
22 | +) | ||
23 | + | ||
24 | +install (TARGETS TimesUpdate DESTINATION bin) |
@@ -0,0 +1,431 @@ | @@ -0,0 +1,431 @@ | ||
1 | +/* $Id: TimesUpdate.c,v 1.3 2008/02/19 16:24:58 elena Exp $*/ | ||
2 | +/*===================================================================== | ||
3 | + * DD SYSTEM base package | ||
4 | + * DD_Server library | ||
5 | + * TimesUpdate.c | ||
6 | + * V.4.6 | ||
7 | + * | ||
8 | + * usage TimesUpdate -r/-i[-u]/-d nc_times_file nc_data_file[*.gz] nc_data_file[*.gz] .... | ||
9 | + * Note that in most of cases at the end of activity you have to run ClearTimes nc_times_file | ||
10 | + * | ||
11 | + * Versions: | ||
12 | + * Apr 23 1997, Usung *.gz files V.2.0 | ||
13 | + * Jan 4, 2006, V.3.0 - insert file and check overlaping | ||
14 | + * Jan 13,2006, V.3.1 - error is corrected | ||
15 | + * Feb 02,2006, V.3.2 - Corrected removing database in case of error | ||
16 | + * Sep 20, 2007, V.4.0, Fedorov, from rehash.nc. New NetCDF V.3, syncronization | ||
17 | + * Sep 25, 2007 V.4.1 The very first file and first file insert | ||
18 | + * Nov 29, 2007 V.4.2 If several first records - bug correction | ||
19 | + * Feb 17, 2008 V.4.5 Fedorov: New options , remake, insert, delete | ||
20 | + * Feb 19, 2008 V.4.6 delete bugs corrected | ||
21 | + *=====================================================================*/ | ||
22 | + /*===================================================================== | ||
23 | + * Description: | ||
24 | + * Program reads list of nc_data_files, probabbly gzipped, reads StartTime and Stop time | ||
25 | + * and create or update nc_times_file. The sequence of data files are not important | ||
26 | + * -r remove nc_times_file and create new one | ||
27 | + * -i insert new file(s) | ||
28 | + * -d remove file(s) from nc_times | ||
29 | + * | ||
30 | + * Dimensions: | ||
31 | + * TimeLingth TIMELENGTH | ||
32 | + * NameLength NAME_DIM | ||
33 | + * Record Unlimited | ||
34 | + * Variables: | ||
35 | + * | ||
36 | + * char StartTime[TIMELENGTH] | ||
37 | + * char EndTime[TIMELENGTH] | ||
38 | + * | ||
39 | + * Attributes: | ||
40 | + * none | ||
41 | + *======================================================================*/ | ||
42 | +#include <stdio.h> | ||
43 | +#include <stdlib.h> | ||
44 | +#include <string.h> | ||
45 | +#include <ctype.h> | ||
46 | +#include <dirent.h> | ||
47 | +#include <netcdf.h> | ||
48 | +#include <math.h> | ||
49 | +#include <DD.h> | ||
50 | + | ||
51 | +/* Global Constant definitions */ | ||
52 | + | ||
53 | +#define TIME_LENGTH_NAME "TimeLength" | ||
54 | +#define TIME_LENGTH 17L | ||
55 | +#define REC_DIM_NAME "record" | ||
56 | +#define REC_DIM NC_UNLIMITED | ||
57 | +#define NAME_DIM_NAME "NameLength" | ||
58 | +#define NAME_DIM 32L | ||
59 | +#define NAME_LENGTH 100 | ||
60 | + | ||
61 | +#define STARTTIME "StartTime" | ||
62 | +#define STOPTIME "StopTime" | ||
63 | +#define FILENAME "FileName" | ||
64 | + | ||
65 | +#define TIME_TYPE NC_CHAR | ||
66 | + | ||
67 | +#define TEMPUNZIP "TimesUpdateTemp.nc\0" | ||
68 | +#define NODATA "NODATA\0" | ||
69 | + | ||
70 | +/*----------- Conditions --------------------------*/ | ||
71 | +enum Conditions {ALLLEFT,LEFTOVER,WELLIN,RIGHTOVER,ALLRIGHT,LEFTRIGHTOVER,LEFTIN}; | ||
72 | + | ||
73 | +/*----------- Modes -------------------------------*/ | ||
74 | +enum Modes {REMAKE, INSERT, DELETE}; | ||
75 | + | ||
76 | +/*----------- Type definition ------------------------------*/ | ||
77 | +typedef struct | ||
78 | +{ | ||
79 | + char Name[NAME_LENGTH]; // current data file | ||
80 | + char StartS[TIME_LENGTH]; // Start Time String | ||
81 | + char StopS[TIME_LENGTH]; // Stop Time String | ||
82 | + double StartD; // Start double | ||
83 | + double StopD; // Stop double | ||
84 | +} t_StartStop; | ||
85 | + | ||
86 | +/*---------- Global variables (IDs) of open times file -------------*/ | ||
87 | + int tmID; /* nc file descriptor */ | ||
88 | + int StartID, StopID, NameID; | ||
89 | + size_t RecordsNumber = 0; // Records Number of the existing times file | ||
90 | + static char ZeroTime[TIME_LENGTH] = "0000000000000000\0"; | ||
91 | + static int ToZipFlag = 0; | ||
92 | + static char UnzipName[NAME_LENGTH]; | ||
93 | + | ||
94 | +/*======================================================================== | ||
95 | + * FUNCTIONS | ||
96 | + *=======================================================================*/ | ||
97 | +/*======================================================================== | ||
98 | + * GetFileInfo | ||
99 | + *=======================================================================*/ | ||
100 | +t_StartStop *GetFileInfo(char *FileName) | ||
101 | +{ | ||
102 | + static t_StartStop StartStop; | ||
103 | + int dataID; | ||
104 | + int DataStartID, DataStopID; | ||
105 | + static size_t DataStart[1] = {0}; | ||
106 | + static size_t DataCount[1] = {TIME_LENGTH}; | ||
107 | + char command[200]; | ||
108 | + int Status; | ||
109 | + | ||
110 | + /*---- Check if this file exist ------------*/ | ||
111 | + if(strcmp(FileName+strlen(FileName)-3,".gz") == 0) // Zipped file | ||
112 | + { | ||
113 | + strcpy(UnzipName, TEMPUNZIP); | ||
114 | + sprintf(command,"gunzip -c %s > %s",FileName,UnzipName); | ||
115 | + system(command); | ||
116 | + ToZipFlag = 0; | ||
117 | + strncpy(StartStop.Name,FileName,strlen(FileName)-3); | ||
118 | + } else | ||
119 | + { | ||
120 | + ToZipFlag = 1; | ||
121 | + strcpy(UnzipName,FileName); | ||
122 | + strcpy(StartStop.Name,FileName); | ||
123 | + } | ||
124 | + | ||
125 | + if((Status = nc_open(UnzipName,NC_NOWRITE,&dataID)) == NC_NOERR) | ||
126 | + { | ||
127 | + Status = nc_inq_varid(dataID,STARTTIME,&DataStartID); | ||
128 | + Status = nc_inq_varid(dataID,STOPTIME, &DataStopID); | ||
129 | + | ||
130 | + Status = nc_get_vara_text(dataID,DataStartID,DataStart,DataCount,(char *)StartStop.StartS); | ||
131 | + Status = nc_get_vara_text(dataID,DataStopID,DataStart,DataCount,(char *)StartStop.StopS); | ||
132 | + Status = nc_close(dataID); | ||
133 | + } | ||
134 | + else if(Status == 2) | ||
135 | + { | ||
136 | + fprintf(stderr,"File %s does not exist\n",UnzipName); | ||
137 | + return NULL; | ||
138 | + } | ||
139 | + else | ||
140 | + { | ||
141 | + fprintf(stderr,"File %s is corrupted, Error = %d\n",UnzipName,Status); | ||
142 | + sprintf(command,"rm %s*",StartStop.Name); | ||
143 | + system(command); | ||
144 | + return NULL; | ||
145 | + } | ||
146 | + | ||
147 | + if((isdigit(StartStop.StartS[0]) == 0) || (isdigit(StartStop.StopS[0]) == 0)) | ||
148 | + { | ||
149 | + fprintf(stderr,"File %s is corrupted\n",UnzipName); | ||
150 | + sprintf(command,"rm %s*",StartStop.Name); | ||
151 | + system(command); | ||
152 | + return NULL; | ||
153 | + } | ||
154 | + | ||
155 | + StartStop.StartD = DD_Time2Double(StartStop.StartS); | ||
156 | + StartStop.StopD = DD_Time2Double(StartStop.StopS); | ||
157 | + | ||
158 | + return &StartStop; | ||
159 | +} | ||
160 | +/*-----------------------------------------------------------*/ | ||
161 | + | ||
162 | +/*------------------------------------------------------------ | ||
163 | + * RemoveRecord() | ||
164 | + *-----------------------------------------------------------*/ | ||
165 | +int RemoveRecord(size_t RecordPos, t_StartStop *StartStop) | ||
166 | +{ | ||
167 | + static size_t TimeStart[2] = {0,0}; | ||
168 | + static size_t TimeCount[2] = {1,TIME_LENGTH}; | ||
169 | + static size_t NameCount[2] = {1, NAME_DIM}; | ||
170 | + char CStart[TIME_LENGTH],CStop[TIME_LENGTH], CName[NAME_DIM]; | ||
171 | + size_t Crec; | ||
172 | + char command[200]; | ||
173 | + int status; | ||
174 | + char NewName[NAME_LENGTH]; | ||
175 | + | ||
176 | +/*------- Remove corresponding file -------------------*/ | ||
177 | + TimeStart[0] = RecordPos; | ||
178 | + nc_get_vara_text(tmID,NameID,TimeStart,NameCount,(char *)CName); | ||
179 | + if(StartStop == NULL) NewName[0] = '\0'; else strcpy(NewName,StartStop->Name); | ||
180 | + if((strcmp(CName,NODATA) != 0)&&(strcmp(CName,NewName) != 0)) | ||
181 | + { // Remove old file which overlap with new one */ | ||
182 | + sprintf(command,"rm %s*",CName); | ||
183 | + system(command); | ||
184 | + } | ||
185 | + | ||
186 | +/*--- replacing Variable -----------------------*/ | ||
187 | + for(Crec = RecordPos + 1; Crec < RecordsNumber; Crec++) | ||
188 | + { | ||
189 | + TimeStart[0] = Crec; | ||
190 | + status = nc_get_vara_text(tmID,StartID,TimeStart,TimeCount,(char *)CStart); | ||
191 | + status = nc_get_vara_text(tmID,StopID,TimeStart,TimeCount,(char *)CStop); | ||
192 | + status = nc_get_vara_text(tmID,NameID,TimeStart,NameCount,(char *)CName); | ||
193 | + TimeStart[0]--; | ||
194 | + status = nc_put_vara_text(tmID,StartID,TimeStart,TimeCount,(char *)CStart); | ||
195 | + status = nc_put_vara_text(tmID,StopID,TimeStart,TimeCount,(char *)CStop); | ||
196 | + status = nc_put_vara_text(tmID,NameID,TimeStart,NameCount,(char *)CName); | ||
197 | + } | ||
198 | + | ||
199 | +/*----- Set Zero at the end -------------------------*/ | ||
200 | + TimeStart[0] = RecordsNumber - 1; | ||
201 | + status = nc_put_vara_text(tmID,StartID,TimeStart,TimeCount,(char *)ZeroTime); | ||
202 | + status = nc_put_vara_text(tmID,StopID,TimeStart,TimeCount,(char *)ZeroTime); | ||
203 | + | ||
204 | + RecordsNumber--; | ||
205 | + nc_sync(tmID); | ||
206 | + return 1; | ||
207 | +} | ||
208 | +/*-----------------------------------------------------------*/ | ||
209 | + | ||
210 | +/*------------------------------------------------------------ | ||
211 | + * InsertRecord() | ||
212 | + *-----------------------------------------------------------*/ | ||
213 | +int InsertRecord(size_t RecordPos, t_StartStop *StartStop) | ||
214 | +{ | ||
215 | + static size_t TimeStart[2] = {0,0}; | ||
216 | + static size_t TimeCount[2] = {1,TIME_LENGTH}; | ||
217 | + static size_t NameCount[2] = {1, NAME_DIM}; | ||
218 | + char CStart[TIME_LENGTH],CStop[TIME_LENGTH], CName[NAME_DIM]; | ||
219 | + int Crec; | ||
220 | + int status; | ||
221 | + | ||
222 | +/*--- Scrall all wariables down-----------------------*/ | ||
223 | + for(Crec = RecordsNumber - 1; Crec >= (int)RecordPos; Crec--) | ||
224 | + { | ||
225 | + TimeStart[0] = (size_t)Crec; | ||
226 | + status = nc_get_vara_text (tmID,StartID,TimeStart,TimeCount,(char *)CStart); | ||
227 | + status = nc_get_vara_text (tmID,StopID,TimeStart,TimeCount,(char *)CStop); | ||
228 | + status = nc_get_vara_text (tmID,NameID,TimeStart,NameCount,(char *)CName); | ||
229 | + TimeStart[0]++; | ||
230 | + status = nc_put_vara_text(tmID,StartID,TimeStart,TimeCount,(char *)CStart); | ||
231 | + status = nc_put_vara_text(tmID,StopID,TimeStart,TimeCount,(char *)CStop); | ||
232 | + status = nc_put_vara_text(tmID,NameID,TimeStart,NameCount,(char *)CName); | ||
233 | + } | ||
234 | + | ||
235 | +/*------ Put the new record to empty space -----------------*/ | ||
236 | + TimeStart[0] = RecordPos; | ||
237 | + status = nc_put_vara_text(tmID,StartID,TimeStart,TimeCount,(char *)StartStop->StartS); | ||
238 | + status = nc_put_vara_text(tmID,StopID,TimeStart,TimeCount,(char *)StartStop->StopS); | ||
239 | + status = nc_put_vara_text(tmID,NameID,TimeStart,NameCount,(char *)StartStop->Name); | ||
240 | + | ||
241 | + RecordsNumber++; | ||
242 | + nc_sync(tmID); | ||
243 | + return 1; | ||
244 | +} | ||
245 | +/*==================================================================================*/ | ||
246 | + | ||
247 | +/*================================================================================== | ||
248 | + * MAIN | ||
249 | + *==================================================================================*/ | ||
250 | +main(int argc, char **argv) | ||
251 | +{ | ||
252 | + static char usage[] = "usage: TimesUpdate -r/-i[-u]/-d nc_times_file nc_data_file[*.gz] nc_data_file[*.gz]"; | ||
253 | + | ||
254 | + char Start[TIME_LENGTH], Stop[TIME_LENGTH], Name[NAME_DIM]; | ||
255 | + | ||
256 | +/* NC definitions */ | ||
257 | + int TlDimID,RecDimID, NlDimID; /* ID of dimensions */ | ||
258 | + | ||
259 | + static size_t TimeStart[2] = {0,0}; | ||
260 | + static size_t TimeCount[2] = {1,TIME_LENGTH}; | ||
261 | + static size_t NameCount[2] = {1, NAME_DIM}; | ||
262 | + | ||
263 | + int DimVector[2]; | ||
264 | + | ||
265 | + char tmName[NAME_DIM]; | ||
266 | + int i, InsertFlag, FindFlag, ihole; | ||
267 | + | ||
268 | + char command[100]; | ||
269 | + char name[100]; | ||
270 | + int compress = 0; | ||
271 | + int status; | ||
272 | + | ||
273 | + double LastTime = 0.0, FirstTime = 0.0; // Times of the hall between files | ||
274 | + | ||
275 | + t_StartStop *CurrentRecord; // pointer to the internal static structure | ||
276 | + enum Modes CurrMode; | ||
277 | + enum Conditions condition; | ||
278 | + | ||
279 | +/*================================================================= | ||
280 | + * Check arguments and options | ||
281 | + *=================================================================*/ | ||
282 | + if(argc < 4) {fprintf(stderr,"%s\n",usage); exit(1); } | ||
283 | + if((strcmp(argv[1], "-r")) == 0) CurrMode = REMAKE; | ||
284 | + else if((strcmp(argv[1], "-i")) == 0) CurrMode = INSERT; | ||
285 | + else if((strcmp(argv[1], "-u")) == 0) CurrMode = INSERT; | ||
286 | + else if((strcmp(argv[1], "-d")) == 0) CurrMode = DELETE; | ||
287 | + else {fprintf(stderr,"Unknown option %s\n",argv[1]); exit(1);} | ||
288 | +/*-----------------------------------------------------------------*/ | ||
289 | + | ||
290 | +/*================================================================= | ||
291 | + * Creating Times ncdf file if we have to make a new file | ||
292 | + *=================================================================*/ | ||
293 | + switch(CurrMode) | ||
294 | + { | ||
295 | + case REMAKE: /* Create New File */ | ||
296 | + if((status = nc_create(argv[2],NC_SHARE,&tmID)) != NC_NOERR) | ||
297 | + { | ||
298 | + fprintf(stderr,"Can not create file %s\n",argv[2]); | ||
299 | + exit(0); | ||
300 | + } | ||
301 | + status = nc_def_dim(tmID,TIME_LENGTH_NAME,TIME_LENGTH,&TlDimID); | ||
302 | + status = nc_def_dim(tmID,NAME_DIM_NAME,NAME_DIM,&NlDimID); | ||
303 | + status = nc_def_dim(tmID,REC_DIM_NAME,REC_DIM,&RecDimID); | ||
304 | + | ||
305 | + DimVector[0] = RecDimID; | ||
306 | + DimVector[1] = TlDimID; | ||
307 | + status = nc_def_var(tmID, STARTTIME,TIME_TYPE,2,DimVector,&StartID); | ||
308 | + status = nc_def_var(tmID, STOPTIME,TIME_TYPE,2,DimVector,&StopID); | ||
309 | + DimVector[1] = NlDimID; | ||
310 | + status = nc_def_var(tmID, FILENAME,TIME_TYPE,2,DimVector,&NameID); | ||
311 | + RecordsNumber = 0; | ||
312 | + TimeStart[0] = (size_t)RecordsNumber; | ||
313 | + status = nc_enddef(tmID); | ||
314 | + break; | ||
315 | +/*====== Or just open existing file ===================*/ | ||
316 | + case INSERT: | ||
317 | + case DELETE: /* Open existing file */ | ||
318 | + if((status = nc_open(argv[2],NC_WRITE|NC_SHARE,&tmID)) != NC_NOERR) | ||
319 | + { | ||
320 | + fprintf(stderr,"Can not open file %s to write\n",argv[2]); | ||
321 | + exit(0); | ||
322 | + } | ||
323 | + status = nc_inq_dimid(tmID,REC_DIM_NAME,&RecDimID); | ||
324 | + status = nc_inq_varid(tmID, STARTTIME,&StartID); | ||
325 | + status = nc_inq_varid(tmID, STOPTIME,&StopID); | ||
326 | + status = nc_inq_varid(tmID, FILENAME,&NameID); | ||
327 | + status = nc_inq_dimlen(tmID,RecDimID, &RecordsNumber); | ||
328 | + break; | ||
329 | + } | ||
330 | +/*==========================================================================*/ | ||
331 | + | ||
332 | + /*========================================================================== | ||
333 | + * For Each file in the argument list | ||
334 | + *=========================================================================*/ | ||
335 | + for(i = 3; i < argc; i++) | ||
336 | + { | ||
337 | + switch(CurrMode) | ||
338 | + { | ||
339 | + case DELETE: | ||
340 | + TimeStart[0] = 0; | ||
341 | + FindFlag = 0; | ||
342 | + while((FindFlag == 0) && (TimeStart[0] < RecordsNumber)) | ||
343 | + { | ||
344 | + status = nc_get_vara_text(tmID,NameID,TimeStart,NameCount,(char *)tmName); | ||
345 | + | ||
346 | + if(strncmp(tmName, argv[i], strlen(tmName)) == 0) | ||
347 | + { /* Record is found */ | ||
348 | + FindFlag = 1; | ||
349 | + RemoveRecord((size_t)TimeStart[0],(t_StartStop *)NULL); | ||
350 | + } | ||
351 | + else TimeStart[0]++; | ||
352 | + } | ||
353 | + break; | ||
354 | + case REMAKE: | ||
355 | + case INSERT: | ||
356 | + if((CurrentRecord = GetFileInfo(argv[i])) != NULL) /* Read current file information */ | ||
357 | + { | ||
358 | + /*----------------- The very first file in VI DIR -------------------*/ | ||
359 | + if (RecordsNumber == 0) | ||
360 | + { | ||
361 | + TimeStart[0] = (size_t)0; | ||
362 | + status = nc_put_vara_text(tmID,StartID,TimeStart,TimeCount,(char *)CurrentRecord->StartS); | ||
363 | + status = nc_put_vara_text(tmID,StopID,TimeStart,TimeCount,(char *)CurrentRecord->StopS); | ||
364 | + status = nc_put_vara_text(tmID,NameID,TimeStart,NameCount,(char *)CurrentRecord->Name); | ||
365 | + RecordsNumber++; | ||
366 | + } else | ||
367 | + { | ||
368 | + /*--------------------------------------------------------- | ||
369 | + * Searchig the same file or a hole to insert | ||
370 | + *-------------------------------------------------------*/ | ||
371 | + InsertFlag = 0; | ||
372 | + ihole = 0; | ||
373 | + while((InsertFlag == 0) && (ihole <= RecordsNumber)) | ||
374 | + { | ||
375 | + if(ihole > 0) /* Get the Left Time of the hole */ | ||
376 | + { | ||
377 | + TimeStart[0] = (size_t)(ihole-1); | ||
378 | + status = nc_get_vara_text (tmID,StopID,TimeStart,TimeCount,(char *)Stop); | ||
379 | + FirstTime = DD_Time2Double(Stop); | ||
380 | + } else FirstTime = 0.0; | ||
381 | + | ||
382 | + if(ihole < RecordsNumber) /* Get the Right Time of the hole */ | ||
383 | + { | ||
384 | + TimeStart[0] = (size_t)ihole; | ||
385 | + status = nc_get_vara_text(tmID,StartID,TimeStart,TimeCount,(char *)Start); | ||
386 | + LastTime = DD_Time2Double(Start); | ||
387 | + } | ||
388 | + else LastTime = 1.0e16; | ||
389 | + | ||
390 | + /*--------- Look the conditions ---------------*/ | ||
391 | + condition = ALLRIGHT; | ||
392 | + if((CurrentRecord->StartD < FirstTime - 60.0) && | ||
393 | + (CurrentRecord->StopD > LastTime + 60.0)) condition = LEFTRIGHTOVER; | ||
394 | + else if((CurrentRecord->StartD < FirstTime - 60.0) && | ||
395 | + (CurrentRecord->StopD < FirstTime + 60.0)) condition = ALLLEFT; | ||
396 | + else if((CurrentRecord->StartD < FirstTime - 60.0) && | ||
397 | + (CurrentRecord->StopD > FirstTime) && | ||
398 | + (CurrentRecord->StopD < LastTime + 60.0)) condition = LEFTOVER; | ||
399 | + else if((CurrentRecord->StartD >= FirstTime - 60.0) && | ||
400 | + (CurrentRecord->StopD <= LastTime + 60.0)) condition = WELLIN; | ||
401 | + else if((CurrentRecord->StartD >= FirstTime - 60.0) && | ||
402 | + (CurrentRecord->StartD < LastTime) && | ||
403 | + (CurrentRecord->StopD > LastTime + 60.0))condition = RIGHTOVER; | ||
404 | + else if((CurrentRecord->StartD > LastTime - 60.0) && (CurrentRecord->StopD > LastTime + 60.0)) | ||
405 | + condition = ALLRIGHT; | ||
406 | + | ||
407 | + /* What to do with these conditions ----------------*/ | ||
408 | + switch(condition) | ||
409 | + { | ||
410 | + case WELLIN : InsertRecord((size_t)ihole, CurrentRecord); InsertFlag = 1; break; | ||
411 | + case ALLLEFT : RemoveRecord((size_t)(ihole-1),CurrentRecord); ihole--; break; | ||
412 | + case ALLRIGHT : ihole++; break; | ||
413 | + case LEFTOVER : RemoveRecord((size_t)(ihole-1),CurrentRecord); ihole--; break; | ||
414 | + case RIGHTOVER : RemoveRecord((size_t)ihole,CurrentRecord); break; | ||
415 | + case LEFTRIGHTOVER : RemoveRecord((size_t)(ihole-1),CurrentRecord); | ||
416 | + RemoveRecord((size_t)(ihole-1),CurrentRecord); | ||
417 | + ihole--; break; | ||
418 | + } | ||
419 | + } // While InsertFlag | ||
420 | + } // if RecordsNumber > 0 | ||
421 | + /*---------- Zip or remove new nc file -----------------*/ | ||
422 | + if(ToZipFlag) sprintf(command,"gzip -f %s",CurrentRecord->Name); | ||
423 | + else sprintf(command,"rm %s",UnzipName); | ||
424 | + system(command); | ||
425 | + } // If current argument file is OK | ||
426 | + } // CASE | ||
427 | + } // For several arguments | ||
428 | + status = nc_close(tmID); | ||
429 | + return(0); | ||
430 | +} | ||
431 | +/*=========================================================================================================*/ |
@@ -0,0 +1,24 @@ | @@ -0,0 +1,24 @@ | ||
1 | + | ||
2 | +PROJECT(TimesUpdateNoData) | ||
3 | + | ||
4 | +include_directories( | ||
5 | + ${CMAKE_HOME_DIRECTORY}/src/INCLUDE/ | ||
6 | + ${NETCDFINCLUDE_DIR} | ||
7 | +) | ||
8 | + | ||
9 | +#Configuration de l'exécutable | ||
10 | +file( | ||
11 | + GLOB_RECURSE | ||
12 | + source_files | ||
13 | + ./* | ||
14 | +) | ||
15 | + | ||
16 | +ADD_EXECUTABLE (TimesUpdateNoData ${source_files} ) | ||
17 | + | ||
18 | +target_link_libraries( | ||
19 | + TimesUpdateNoData | ||
20 | + DD_Client | ||
21 | + ${NETCDFLIBRARY} | ||
22 | +) | ||
23 | + | ||
24 | +install (TARGETS TimesUpdateNoData DESTINATION bin) |
@@ -0,0 +1,330 @@ | @@ -0,0 +1,330 @@ | ||
1 | +/** | ||
2 | +* @file TimesUpdateNoData.c | ||
3 | +* @version $Id: TimesUpdateNoData.c,v 1.6 2009/07/07 11:37:40 budnik Exp $ | ||
4 | +* @brief Program reads StartTime and StopTime and add to nc_times_file NODATA intervals | ||
5 | +* | ||
6 | +* @arg nc_times_file OrderedStartTime OrderedStopTime | ||
7 | +*/ | ||
8 | + | ||
9 | +/*===================================================================== | ||
10 | + * DD SYSTEM base package | ||
11 | + * DD_Server library | ||
12 | + * TimesUpdateNoData.c | ||
13 | + * V.1.5 | ||
14 | + * | ||
15 | + * usage TimesUpdateNoData nc_times_file OrderedStartTime OrderedStopTime | ||
16 | + * | ||
17 | + *=====================================================================*/ | ||
18 | + /*===================================================================== | ||
19 | + * Description: | ||
20 | + * Program reads StartTime and StopTime and add to nc_times_file NODATA intervals | ||
21 | + * | ||
22 | + * | ||
23 | + * | ||
24 | + * Dimensions: | ||
25 | + * TimeLingth TIMELENGTH | ||
26 | + * NameLength NAME_DIM | ||
27 | + * Record Unlimited | ||
28 | + * Variables: | ||
29 | + * | ||
30 | + * char StartTime[TIMELENGTH] | ||
31 | + * char EndTime[TIMELENGTH] | ||
32 | + * | ||
33 | + * Attributes: | ||
34 | + * none | ||
35 | + *======================================================================*/ | ||
36 | +#include <stdio.h> | ||
37 | +#include <stdlib.h> | ||
38 | +#include <string.h> | ||
39 | +#include <ctype.h> | ||
40 | +#include <dirent.h> | ||
41 | +#include <netcdf.h> | ||
42 | +#include <math.h> | ||
43 | +#include <DD.h> | ||
44 | + | ||
45 | + | ||
46 | +/* Global Constant definitions */ | ||
47 | +#define ISOTIMER "%d-%d-%dT%d:%d:%d.%dZ" /* Format to READ time in ISO format */ | ||
48 | +#define TIME_LENGTH_NAME "TimeLength" | ||
49 | +#define TIME_LENGTH 17L | ||
50 | +#define REC_DIM_NAME "record" | ||
51 | +#define REC_DIM NC_UNLIMITED | ||
52 | +#define NAME_DIM_NAME "NameLength" | ||
53 | +#define NAME_DIM 32L | ||
54 | +#define NAME_LENGTH 100 | ||
55 | +#define ISO_LENGTH 25 | ||
56 | + | ||
57 | +#define STARTTIME "StartTime" | ||
58 | +#define STOPTIME "StopTime" | ||
59 | +#define FILENAME "FileName" | ||
60 | + | ||
61 | +#define TIME_TYPE NC_CHAR | ||
62 | + | ||
63 | + | ||
64 | +#define DATAGAP 7200 | ||
65 | +#define NODATA "NODATA\0" | ||
66 | + | ||
67 | + | ||
68 | +/*----------- Type definition ------------------------------*/ | ||
69 | +typedef struct | ||
70 | +{ | ||
71 | + char Name[NAME_LENGTH]; // current data file | ||
72 | + char StartS[TIME_LENGTH]; // Start Time String | ||
73 | + char StopS[TIME_LENGTH]; // Stop Time String | ||
74 | + | ||
75 | + double StartD; // Start double | ||
76 | + double StopD; // Stop double | ||
77 | +} t_StartStop; | ||
78 | + | ||
79 | +/*---------- Global variables (IDs) of open times file -------------*/ | ||
80 | + int tmID; /* nc file descriptor */ | ||
81 | + int StartID, StopID, NameID; | ||
82 | + size_t RecordsNumber = 0; // Records Number of the existing times file | ||
83 | + static char ZeroTime[TIME_LENGTH] = "0000000000000000\0"; | ||
84 | + | ||
85 | + | ||
86 | +/*======================================================================== | ||
87 | + * FUNCTIONS | ||
88 | + *=======================================================================*/ | ||
89 | +/*===================================================================== | ||
90 | + * ISOTime2Double() | ||
91 | + * Covert double time to ISO time to Double | ||
92 | + * | ||
93 | + *=====================================================================*/ | ||
94 | +double ISOTime2Double(char* ISO) | ||
95 | +{ | ||
96 | + unsigned UT[7]; | ||
97 | + dd_tmstr_t *Time; | ||
98 | + sscanf(ISO, ISOTIMER, &UT[0], &UT[1], &UT[2], &UT[3], &UT[4], &UT[5], &UT[6]); | ||
99 | + Time = (dd_tmstr_t *)UT2double(UT); | ||
100 | + return Time->times; | ||
101 | +} | ||
102 | + | ||
103 | +/*-----------------------------------------------------------*/ | ||
104 | + | ||
105 | +/*------------------------------------------------------------ | ||
106 | + * InsertRecord() | ||
107 | + *-----------------------------------------------------------*/ | ||
108 | +int InsertRecord(size_t RecordPos, t_StartStop *StartStop) | ||
109 | +{ | ||
110 | + static size_t TimeStart[2] = {0,0}; | ||
111 | + static size_t TimeCount[2] = {1,TIME_LENGTH}; | ||
112 | + static size_t NameCount[2] = {1, NAME_DIM}; | ||
113 | + char CStart[TIME_LENGTH],CStop[TIME_LENGTH], CName[NAME_DIM]; | ||
114 | + int Crec; | ||
115 | + int status; | ||
116 | + | ||
117 | +/*--- Scroll all variables down-----------------------*/ | ||
118 | + for(Crec = RecordsNumber - 1; Crec >= (int)RecordPos; Crec--) | ||
119 | + { | ||
120 | + TimeStart[0] = (size_t)Crec; | ||
121 | + status = nc_get_vara_text (tmID,StartID,TimeStart,TimeCount,(char *)CStart); | ||
122 | + status = nc_get_vara_text (tmID,StopID,TimeStart,TimeCount,(char *)CStop); | ||
123 | + status = nc_get_vara_text (tmID,NameID,TimeStart,NameCount,(char *)CName); | ||
124 | + TimeStart[0]++; | ||
125 | + status = nc_put_vara_text(tmID,StartID,TimeStart,TimeCount,(char *)CStart); | ||
126 | + status = nc_put_vara_text(tmID,StopID,TimeStart,TimeCount,(char *)CStop); | ||
127 | + status = nc_put_vara_text(tmID,NameID,TimeStart,NameCount,(char *)CName); | ||
128 | + } | ||
129 | + | ||
130 | +/*------ Put the new record to empty space -----------------*/ | ||
131 | + TimeStart[0] = RecordPos; | ||
132 | + status = nc_put_vara_text(tmID,StartID,TimeStart,TimeCount,(char *)StartStop->StartS); | ||
133 | + status = nc_put_vara_text(tmID,StopID,TimeStart,TimeCount,(char *)StartStop->StopS); | ||
134 | + status = nc_put_vara_text(tmID,NameID,TimeStart,NameCount,(char *)StartStop->Name); | ||
135 | + | ||
136 | + RecordsNumber++; | ||
137 | + nc_sync(tmID); | ||
138 | + return 1; | ||
139 | +} | ||
140 | +/*==================================================================================*/ | ||
141 | + | ||
142 | +/*================================================================================== | ||
143 | + * MAIN | ||
144 | + *==================================================================================*/ | ||
145 | +main(int argc, char **argv) | ||
146 | +{ | ||
147 | + static char usage[] = "usage: TimesUpdateNoData nc_times_file StartTime StopTime"; | ||
148 | + | ||
149 | + char Start[TIME_LENGTH], Stop[TIME_LENGTH], Name[NAME_DIM]; | ||
150 | + | ||
151 | +/* NC definitions */ | ||
152 | + int TlDimID,RecDimID, NlDimID; /* ID of dimensions */ | ||
153 | + | ||
154 | + static size_t TimeStart[2] = {0,0}; | ||
155 | + static size_t TimeCount[2] = {1,TIME_LENGTH}; | ||
156 | + static size_t NameCount[2] = {1, NAME_DIM}; | ||
157 | + | ||
158 | + int DimVector[2]; | ||
159 | + | ||
160 | + char tmName[NAME_DIM]; | ||
161 | + int InsertFlag; | ||
162 | + | ||
163 | + int i, hi, lo = 0; | ||
164 | + double StartD0, StartD1 = 0.0, StopD0, StopD1, STARTD, STOPD, CurrentStart; | ||
165 | + int StartRecord, StopRecord; | ||
166 | + | ||
167 | + char command[100]; | ||
168 | + char name[100]; | ||
169 | + | ||
170 | + int status; | ||
171 | + | ||
172 | + double LastTime = 0.0, FirstTime = 0.0; // Times of the hole between files | ||
173 | + | ||
174 | + t_StartStop CurrentRecord; // | ||
175 | + | ||
176 | + | ||
177 | +/*================================================================= | ||
178 | + * Check arguments and options | ||
179 | + *=================================================================*/ | ||
180 | + if(argc < 4) {fprintf(stderr,"%s\n",usage); exit(1); } | ||
181 | + | ||
182 | +/*-----------------------------------------------------------------*/ | ||
183 | + | ||
184 | + | ||
185 | + /* Open existing file */ | ||
186 | + if((status = nc_open(argv[1],NC_WRITE|NC_SHARE,&tmID)) != NC_NOERR) | ||
187 | + { | ||
188 | + fprintf(stderr,"Can not open file %s to write\n",argv[2]); | ||
189 | + exit(0); | ||
190 | + } | ||
191 | + status = nc_inq_dimid(tmID,REC_DIM_NAME,&RecDimID); | ||
192 | + status = nc_inq_varid(tmID, STARTTIME,&StartID); | ||
193 | + status = nc_inq_varid(tmID, STOPTIME,&StopID); | ||
194 | + status = nc_inq_varid(tmID, FILENAME,&NameID); | ||
195 | + status = nc_inq_dimlen(tmID,RecDimID, &RecordsNumber); | ||
196 | + | ||
197 | +/*==========================================================================*/ | ||
198 | + | ||
199 | + hi = RecordsNumber; | ||
200 | + | ||
201 | + STARTD = ISOTime2Double(argv[2]); | ||
202 | + STOPD = ISOTime2Double(argv[3]); | ||
203 | + | ||
204 | + while (lo <= hi) | ||
205 | + { | ||
206 | + i = (lo+hi)/2; | ||
207 | + TimeStart[0] = i + 1; | ||
208 | + status = nc_get_vara_text(tmID,StartID,TimeStart,TimeCount,(char *)Start); | ||
209 | + StartD1 = DD_Time2Double(Start); | ||
210 | + if (StartD1 > STARTD) hi--; | ||
211 | + TimeStart[0] = i; | ||
212 | + status = nc_get_vara_text(tmID,StartID,TimeStart,TimeCount,(char *)Start); | ||
213 | + StartD0 = DD_Time2Double(Start); | ||
214 | + if (StartD0 < STARTD) lo++; | ||
215 | + | ||
216 | + if (StartD1 <= STARTD && StartD0 >= STARTD) break; | ||
217 | + } | ||
218 | + | ||
219 | + StartRecord = i; | ||
220 | + status = nc_get_vara_text(tmID,StopID,TimeStart,TimeCount,(char *)Stop); | ||
221 | + StopD0 = DD_Time2Double(Stop); | ||
222 | + | ||
223 | + while (STOPD > StopD0 && TimeStart[0] <= RecordsNumber) { | ||
224 | + status = nc_get_vara_text(tmID,StopID,TimeStart,TimeCount,(char *)Stop); | ||
225 | + if (status != NC_NOERR) fprintf(stderr," %s\n", nc_strerror(status)); | ||
226 | + StopD0 = DD_Time2Double(Stop); | ||
227 | + TimeStart[0]++; | ||
228 | + } | ||
229 | + | ||
230 | + StopRecord = TimeStart[0]-1; | ||
231 | + | ||
232 | +// if NODATA is the very FIRST - insert NODATA | ||
233 | + if (StartRecord == 0 && (StartD0 - STARTD) > DATAGAP) { | ||
234 | + | ||
235 | + TimeStart[0] = 0; | ||
236 | + status = nc_get_vara_text(tmID, NameID, TimeStart, NameCount,(char *)Name); | ||
237 | + if (strcmp(Name,NODATA) == 0 && (StartD0 - STOPD) < DATAGAP) { | ||
238 | + status = nc_put_vara_text(tmID,StartID, TimeStart, TimeCount, Double2DD_Time(STARTD)); | ||
239 | + } | ||
240 | + else { | ||
241 | + strncpy(CurrentRecord.Name, NODATA, 7); | ||
242 | + strncpy(CurrentRecord.StartS,Double2DD_Time(STARTD),TIMELENGTH); | ||
243 | + if ((StartD0 - STOPD) < DATAGAP) strncpy(CurrentRecord.StopS,Start,TIMELENGTH); | ||
244 | + else strncpy(CurrentRecord.StopS,Double2DD_Time(STOPD),TIMELENGTH); | ||
245 | + InsertRecord((size_t)(0), &CurrentRecord); | ||
246 | + } | ||
247 | + } | ||
248 | + | ||
249 | + for (i = StartRecord; i < StopRecord ; i++) { | ||
250 | + | ||
251 | + InsertFlag = 0; | ||
252 | + TimeStart[0] = i; | ||
253 | + status = nc_get_vara_text(tmID,StopID, TimeStart, TimeCount,(char *)Stop); | ||
254 | + StopD0 = DD_Time2Double(Stop); | ||
255 | + TimeStart[0] = i+1; | ||
256 | + status = nc_get_vara_text(tmID,StartID, TimeStart, TimeCount, (char *)Start); | ||
257 | + StartD1 = DD_Time2Double(Start); | ||
258 | + | ||
259 | + | ||
260 | +// Data Gap -> NODATA | ||
261 | + | ||
262 | + if ((StartD1 - StopD0) > DATAGAP) { | ||
263 | + strncpy(CurrentRecord.Name, NODATA,7); | ||
264 | + | ||
265 | + TimeStart[0] = i; | ||
266 | + status = nc_get_vara_text(tmID, NameID, TimeStart, NameCount,(char *)Name); | ||
267 | + | ||
268 | + if (strcmp(Name,NODATA) == 0) { | ||
269 | + strncpy(Stop,Start,TIMELENGTH); | ||
270 | + status = nc_get_vara_text(tmID,StartID, TimeStart, TimeCount, (char *)Start); | ||
271 | + status = nc_put_vara_text(tmID,StartID, TimeStart, TimeCount, (char *)Start); | ||
272 | + if ((StartD1 - STOPD) < DATAGAP) | ||
273 | + status = nc_put_vara_text(tmID,StopID,TimeStart,TimeCount,(char *)Stop); | ||
274 | + else status = nc_put_vara_text(tmID,StopID,TimeStart,TimeCount,Double2DD_Time(STOPD)); | ||
275 | + status = nc_put_vara_text(tmID,NameID,TimeStart,NameCount,(char *)CurrentRecord.Name); | ||
276 | + | ||
277 | + InsertFlag = 1; | ||
278 | + } | ||
279 | + | ||
280 | + if (!InsertFlag) { | ||
281 | + if ((i == StartRecord) && (StopD0 < STARTD)) | ||
282 | + strncpy(CurrentRecord.StartS,Double2DD_Time(STARTD),TIMELENGTH); | ||
283 | + else strncpy(CurrentRecord.StartS,Stop,TIMELENGTH); | ||
284 | + if ((i == StopRecord-1) && (StartD1 > STOPD)) | ||
285 | + strncpy(CurrentRecord.StopS,Double2DD_Time(STOPD),TIMELENGTH); | ||
286 | + else strncpy(CurrentRecord.StopS,Start,TIMELENGTH); | ||
287 | + | ||
288 | + if ((DD_Time2Double(CurrentRecord.StopS) - | ||
289 | + DD_Time2Double(CurrentRecord.StartS)) > DATAGAP) | ||
290 | + InsertRecord((size_t)(i+1), &CurrentRecord); | ||
291 | + | ||
292 | + } | ||
293 | + } | ||
294 | + | ||
295 | + } | ||
296 | + | ||
297 | +// if NODATA is the very LAST - add NODATA | ||
298 | + | ||
299 | + if (StopRecord == RecordsNumber) { | ||
300 | + TimeStart[0] = StopRecord-1; | ||
301 | + status = nc_get_vara_text(tmID,StopID, TimeStart, TimeCount, (char *)Stop); | ||
302 | + StopD0 = DD_Time2Double(Stop); | ||
303 | + | ||
304 | + if (STOPD > StopD0) { | ||
305 | + status = nc_get_vara_text(tmID, NameID, TimeStart, NameCount,(char *)Name); | ||
306 | + | ||
307 | + if (strcmp(Name,NODATA) == 0 && (STARTD - StopD0) < DATAGAP) { | ||
308 | + status = nc_get_vara_text(tmID,StartID, TimeStart, TimeCount, (char *)Start); | ||
309 | + strncpy(Stop,Start,TIMELENGTH); | ||
310 | + } | ||
311 | + else { | ||
312 | + strncpy(Name, NODATA, 7); | ||
313 | + TimeStart[0]++; | ||
314 | + } | ||
315 | + if ((STARTD - StopD0) < DATAGAP) CurrentStart = DD_Time2Double(Stop); | ||
316 | + else CurrentStart = STARTD; | ||
317 | + if ((STOPD - CurrentStart) > DATAGAP) { | ||
318 | + status = nc_put_vara_text(tmID,StartID,TimeStart,TimeCount, Double2DD_Time(CurrentStart)); | ||
319 | + status = nc_put_vara_text(tmID,StopID,TimeStart,TimeCount, Double2DD_Time(STOPD)); | ||
320 | + status = nc_put_vara_text(tmID,NameID,TimeStart,NameCount,(char *)Name); | ||
321 | + } | ||
322 | + } | ||
323 | + } | ||
324 | + | ||
325 | + | ||
326 | + nc_sync(tmID); | ||
327 | + status = nc_close(tmID); | ||
328 | + exit(0); | ||
329 | +} | ||
330 | +/*=========================================================================================================*/ |