1 |
char *cvsinfo_jretile_maxmem = "cvsinfo: $Header: /home/cvsuser/cvsroot/JSOC/proj/globalhs/apps/jretile_maxmem.c,v 1.2 2014/09/18 14:18:29 tplarson Exp $"; |
2 |
|
3 |
int jretile_maxmem(void) |
4 |
{ |
5 |
int newstat = 0; |
6 |
int status = DRMS_SUCCESS; |
7 |
|
8 |
char *inrecquery = NULL; |
9 |
char *outseries = NULL; |
10 |
char *segnamein = NULL; |
11 |
char *segnameout = NULL; |
12 |
DRMS_RecordSet_t *inrecset = NULL; |
13 |
DRMS_RecordSet_t *outrecset = NULL; |
14 |
int irecin, irecout, nrecsin=0, nrecsout=0, nlchunks; |
15 |
DRMS_Record_t *inrec = NULL; |
16 |
DRMS_Record_t *outrec = NULL; |
17 |
DRMS_Segment_t *segin = NULL; |
18 |
DRMS_Segment_t *segout = NULL; |
19 |
DRMS_Array_t *inarr = NULL; |
20 |
DRMS_Array_t *outarr = NULL; |
21 |
DRMS_RecLifetime_t lifetime; |
22 |
DRMS_Type_t usetype = DRMS_TYPE_FLOAT; |
23 |
int length[2], startind[2], endind[2]; |
24 |
float *inptr, *outptr; |
25 |
long long histrecnum=-1; |
26 |
int quality; |
27 |
int mapmmax=-1; |
28 |
int sinbdivs=-1; |
29 |
double cadence=0; |
30 |
int i; |
31 |
|
32 |
TIME tnow, UNIX_epoch = -220924792.000; /* 1970.01.01_00:00:00_UTC */ |
33 |
char tstartstr[100]; |
34 |
|
35 |
double tstart, tepoch, tstep, tround, tstop, tstartin, tstopin, tstepin, tstartuse, tstopuse, nseconds, chunksecs; |
36 |
char *ttotal, *tchunk; |
37 |
int ndt, ndtin; |
38 |
int lmin, lmax, lminin, lmaxin, lminuse, lmaxuse, lchunk, lchunksize, lchunkfirst, lchunklast; |
39 |
int ntimechunks, nmodes, npts, imode, itime; |
40 |
int out_time_offset, out_modes_offset, out_offset, in_time_offset, in_modes_offset, in_offset, out_index, in_index; |
41 |
int iset, lminout, lmaxout; |
42 |
double tstartout, tstopout; |
43 |
float *arrptr; |
44 |
int nrecords, nsegments, nskip; |
45 |
|
46 |
int errbufstat=setvbuf(stderr, NULL, _IONBF, BUFSIZ); |
47 |
int outbufstat=setvbuf(stdout, NULL, _IONBF, BUFSIZ); |
48 |
|
49 |
double wt0, wt1, wt2, wt3, wt; |
50 |
double ut0, ut1, ut2, ut3, ut; |
51 |
double st0, st1, st2, st3, st; |
52 |
double ct0, ct1, ct2, ct3, ct; |
53 |
|
54 |
wt0=getwalltime(); |
55 |
ct0=getcputime(&ut0, &st0); |
56 |
|
57 |
inrecquery = (char *)cmdparams_save_str(&cmdparams, "in", &newstat); |
58 |
outseries = (char *)cmdparams_save_str(&cmdparams, "out", &newstat); |
59 |
segnamein = (char *)cmdparams_save_str(&cmdparams, "segin", &newstat); |
60 |
segnameout = (char *)cmdparams_save_str(&cmdparams, "segout", &newstat); |
61 |
int seginflag = strcmp(kNOTSPECIFIED, segnamein); |
62 |
int segoutflag = strcmp(kNOTSPECIFIED, segnameout); |
63 |
int verbflag = cmdparams_save_int(&cmdparams, "VERB", &newstat); |
64 |
int permflag = cmdparams_save_int(&cmdparams, "PERM", &newstat); |
65 |
if (permflag) |
66 |
lifetime = DRMS_PERMANENT; |
67 |
else |
68 |
lifetime = DRMS_TRANSIENT; |
69 |
unsigned short calverkey = (unsigned short)cmdparams_save_int(&cmdparams, "CALVERKEY", &newstat); |
70 |
|
71 |
char *histlinkname = (char *)cmdparams_save_str(&cmdparams, "histlink", &newstat); |
72 |
|
73 |
tstart=cmdparams_save_time(&cmdparams, "TSTART", &newstat); |
74 |
ttotal=(char *)cmdparams_save_str(&cmdparams, "TTOTAL", &newstat); |
75 |
status=drms_names_parseduration(&ttotal, &nseconds, 1); |
76 |
if (status != DRMS_SUCCESS) |
77 |
{ |
78 |
// newstat = newstat | CPSAVE_UNKNOWN_ERROR; |
79 |
fprintf(stderr, "ERROR: problem parsing TTOTAL, = %s\n", ttotal); |
80 |
return 1; |
81 |
} |
82 |
tchunk=(char *)cmdparams_save_str(&cmdparams, "TCHUNK", &newstat); |
83 |
if (strcmp(kNOTSPECIFIED, tchunk)) |
84 |
{ |
85 |
status=drms_names_parseduration(&tchunk, &chunksecs, 1); |
86 |
if (status != DRMS_SUCCESS) |
87 |
newstat = newstat | CPSAVE_UNKNOWN_ERROR; |
88 |
} |
89 |
else |
90 |
chunksecs=0; |
91 |
|
92 |
lmin=cmdparams_save_int(&cmdparams, "LMIN", &newstat); |
93 |
lmax=cmdparams_save_int(&cmdparams, "LMAX", &newstat); |
94 |
lchunksize=cmdparams_save_int(&cmdparams, "LCHUNK", &newstat); |
95 |
if (lchunksize == 0) |
96 |
lchunksize=lmax+1; |
97 |
|
98 |
if (newstat) |
99 |
{ |
100 |
fprintf(stderr, "ERROR: problem with input arguments, status = %d, diagnosis follows\n", newstat); |
101 |
cpsave_decode_error(newstat); |
102 |
return 1; |
103 |
} |
104 |
else if (savestrlen != strlen(savestr)) |
105 |
{ |
106 |
fprintf(stderr, "ERROR: problem with savestr, savestrlen = %d, strlen(savestr) = %d\n", savestrlen, (int)strlen(savestr)); |
107 |
return 1; |
108 |
} |
109 |
|
110 |
DRMS_Record_t *tempoutrec = drms_create_record(drms_env, |
111 |
outseries, |
112 |
DRMS_TRANSIENT, |
113 |
&status); |
114 |
|
115 |
if (status != DRMS_SUCCESS) |
116 |
{ |
117 |
fprintf(stderr,"ERROR: couldn't open a record in output dataseries %s, status = %d\n", outseries, status); |
118 |
return 1; |
119 |
} |
120 |
|
121 |
// set up ancillary dataseries for processing metadata |
122 |
DRMS_Link_t *histlink = hcon_lookup_lower(&tempoutrec->links, histlinkname); |
123 |
if (histlink != NULL) |
124 |
{ |
125 |
histrecnum=set_history(histlink); |
126 |
if (histrecnum < 0) |
127 |
{ |
128 |
drms_close_record(tempoutrec, DRMS_FREE_RECORD); |
129 |
return 1; |
130 |
} |
131 |
} |
132 |
else |
133 |
{ |
134 |
fprintf(stderr,"WARNING: could not find history link in output dataseries\n"); |
135 |
} |
136 |
|
137 |
// these must be present in the output dataseries and variable, not links or constants |
138 |
// now done in DoIt() that calls this function |
139 |
/* |
140 |
char *outchecklist[] = {"T_START", "QUALITY", "LMIN", "LMAX", "NDT"}; |
141 |
int itest; |
142 |
for (itest=0; itest < ARRLENGTH(outchecklist); itest++) |
143 |
{ |
144 |
DRMS_Keyword_t *outkeytest = hcon_lookup_lower(&tempoutrec->keywords, outchecklist[itest]); |
145 |
if (outkeytest == NULL || outkeytest->info->islink || outkeytest->info->recscope == 1) |
146 |
{ |
147 |
fprintf(stderr, "ERROR: output keyword %s is either missing, constant, or a link\n", outchecklist[itest]); |
148 |
drms_close_record(tempoutrec, DRMS_FREE_RECORD); |
149 |
return 1; |
150 |
} |
151 |
} |
152 |
*/ |
153 |
|
154 |
tepoch=drms_getkey_time(tempoutrec, "T_START_epoch", &status); |
155 |
tstep=drms_getkey_float(tempoutrec, "T_START_step", &status); |
156 |
tround=drms_getkey_float(tempoutrec, "T_START_round", &status); |
157 |
cadence=drms_getkey_float(tempoutrec, "T_STEP", &status); |
158 |
if (fmod(tstart-tepoch,tstep) > tround/2) |
159 |
{ |
160 |
fprintf(stderr, "ERROR: output dataseries seems incompatible with input parameters (tstep must divide tstart-tepoch): tstart = %f, tepoch = %f, tstep = %f\n", tstart, tepoch, tstep); |
161 |
drms_close_record(tempoutrec, DRMS_FREE_RECORD); |
162 |
return 1; |
163 |
} |
164 |
if (chunksecs == 0.0) |
165 |
chunksecs = tstep; |
166 |
else if (fmod(chunksecs,tstep)) |
167 |
{ |
168 |
fprintf(stderr, "ERROR: output dataseries seems incompatible with input parameters (tstep must divide chunksecs): chunksecs = %f, tstep = %f\n", chunksecs, tstep); |
169 |
drms_close_record(tempoutrec, DRMS_FREE_RECORD); |
170 |
return 1; |
171 |
} |
172 |
if (fmod(nseconds,chunksecs) != 0.0) |
173 |
{ |
174 |
fprintf(stderr, "ERROR: input parameters seem incompatible (chunksecs must divide nseconds): nseconds = %f, chunksecs = %f\n", nseconds, chunksecs); |
175 |
drms_close_record(tempoutrec, DRMS_FREE_RECORD); |
176 |
return 1; |
177 |
} |
178 |
ntimechunks=nseconds/chunksecs; |
179 |
ndt=chunksecs/cadence; |
180 |
if (verbflag) |
181 |
{ |
182 |
printf("%d timechunks, %.1f seconds per chunk\n", ntimechunks, chunksecs); |
183 |
} |
184 |
|
185 |
int mapmmaxout=-1; |
186 |
int sinbdivsout=-1; |
187 |
DRMS_Keyword_t *outkeytest = hcon_lookup_lower(&tempoutrec->keywords, "MAPMMAX"); |
188 |
if (outkeytest != NULL && outkeytest->info->recscope == 1) |
189 |
mapmmaxout=drms_getkey_int(tempoutrec, "MAPMMAX", &status); |
190 |
outkeytest = hcon_lookup_lower(&tempoutrec->keywords, "SINBDIVS"); |
191 |
if (outkeytest != NULL && outkeytest->info->recscope == 1) |
192 |
sinbdivsout=drms_getkey_int(tempoutrec, "SINBDIVS", &status); |
193 |
|
194 |
drms_close_record(tempoutrec, DRMS_FREE_RECORD); |
195 |
|
196 |
|
197 |
char *inchecklist[] = {"T_START", "QUALITY", "LMIN", "LMAX", "T_STEP"}; |
198 |
DRMS_Keyword_t *inkeytest; |
199 |
int itest; |
200 |
inrecset = drms_open_records(drms_env, inrecquery, &status); |
201 |
// inrecset = drms_open_recordset(drms_env, inrecquery, &status); |
202 |
|
203 |
if (status != DRMS_SUCCESS || inrecset == NULL) |
204 |
{ |
205 |
fprintf(stderr, "ERROR: problem opening input recordset: status = %d\n", status); |
206 |
return 1; |
207 |
} |
208 |
nrecsin = inrecset->n; |
209 |
|
210 |
if (verbflag) |
211 |
printf("input recordset opened, nrecs = %d\n", nrecsin); |
212 |
|
213 |
int noinput=0; |
214 |
if (nrecsin == 0) |
215 |
{ |
216 |
printf("WARNING: input recordset contains no records\n"); |
217 |
noinput=1; |
218 |
goto skip1; |
219 |
// return 1; |
220 |
} |
221 |
|
222 |
inrec = inrecset->records[0]; |
223 |
|
224 |
for (itest=0; itest < ARRLENGTH(inchecklist); itest++) |
225 |
{ |
226 |
inkeytest = hcon_lookup_lower(&inrec->keywords, inchecklist[itest]); |
227 |
if (inkeytest == NULL) |
228 |
{ |
229 |
fprintf(stderr, "ERROR: required input keyword %s is missing\n", inchecklist[itest]); |
230 |
drms_close_records(inrecset, DRMS_FREE_RECORD); |
231 |
return 1; |
232 |
} |
233 |
} |
234 |
|
235 |
if (cadence != drms_getkey_float(inrec, "T_STEP", &status)) |
236 |
{ |
237 |
fprintf(stderr, "ERROR: input T_STEP does not equal output T_STEP\n"); |
238 |
drms_close_records(inrecset, DRMS_FREE_RECORD); |
239 |
return 1; |
240 |
} |
241 |
|
242 |
inkeytest = hcon_lookup_lower(&inrec->keywords, "MAPMMAX"); |
243 |
if (inkeytest != NULL) |
244 |
mapmmax=drms_getkey_int(inrec, "MAPMMAX", &status); |
245 |
if (mapmmaxout != -1 && mapmmaxout != mapmmax) |
246 |
{ |
247 |
fprintf(stderr, "ERROR: input MAPMMAX does not equal output MAPMMAX, in=%d, out=%d\n", mapmmax, mapmmaxout); |
248 |
drms_close_records(inrecset, DRMS_FREE_RECORD); |
249 |
return 1; |
250 |
} |
251 |
|
252 |
inkeytest = hcon_lookup_lower(&inrec->keywords, "SINBDIVS"); |
253 |
if (outkeytest != NULL) |
254 |
sinbdivs=drms_getkey_int(inrec, "SINBDIVS", &status); |
255 |
if (sinbdivsout != -1 && sinbdivsout != sinbdivs) |
256 |
{ |
257 |
fprintf(stderr, "ERROR: input SINBDIVS does not equal output SINBDIVS, in=%d, out=%d\n", sinbdivs, sinbdivsout); |
258 |
drms_close_records(inrecset, DRMS_FREE_RECORD); |
259 |
return 1; |
260 |
} |
261 |
|
262 |
|
263 |
status=drms_stage_records(inrecset, 1, 0); |
264 |
if (status != DRMS_SUCCESS) |
265 |
{ |
266 |
fprintf(stderr, "ERROR: drms_stage_records returned status = %d\n", status); |
267 |
return 1; |
268 |
} |
269 |
|
270 |
skip1: |
271 |
|
272 |
nrecords=0; |
273 |
nsegments=0; |
274 |
nskip=0; |
275 |
|
276 |
lchunkfirst = lmin/lchunksize; |
277 |
lchunklast = lmax/lchunksize; |
278 |
|
279 |
nlchunks = (lchunklast - lchunkfirst) + 1; |
280 |
nrecsout = nlchunks*ntimechunks; |
281 |
outrecset = drms_create_records(drms_env, nrecsout, outseries, lifetime, &status); |
282 |
if (status != DRMS_SUCCESS || outrecset == NULL) |
283 |
{ |
284 |
fprintf(stderr,"ERROR: unable to create records record in output dataseries %s, status = %d\n", outseries, status); |
285 |
drms_close_records(inrecset, DRMS_FREE_RECORD); |
286 |
return 1; |
287 |
} |
288 |
|
289 |
unsigned long long calversout, calvers; |
290 |
int calversunset=1; |
291 |
int mixflag=0; |
292 |
unsigned int nybblearrout[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; |
293 |
int fixflagarr[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; |
294 |
for (i=0;i<16;i++) |
295 |
{ |
296 |
if (getbits(calverkey,i,1)) |
297 |
fixflagarr[i]=1; |
298 |
} |
299 |
|
300 |
int *firstflagarr=(int *)malloc(nrecsin*sizeof(int)); |
301 |
DRMS_Array_t **inarrarr=(DRMS_Array_t **)malloc(nrecsin*sizeof(DRMS_Array_t *)); |
302 |
for (irecin=0; irecin < nrecsin; irecin++) |
303 |
{ |
304 |
firstflagarr[irecin]=1; |
305 |
inarrarr[irecin]=NULL; |
306 |
} |
307 |
|
308 |
irecout=0; |
309 |
for (iset=0; iset < ntimechunks; iset++) |
310 |
{ |
311 |
tstartout=tstart + iset * chunksecs; |
312 |
tstopout=tstartout+chunksecs; |
313 |
sprint_time(tstartstr, tstartout, "TAI", 0); |
314 |
|
315 |
if (verbflag) |
316 |
{ |
317 |
wt1=getwalltime(); |
318 |
ct1=getcputime(&ut1, &st1); |
319 |
printf("processing timechunk %d, tstart = %s\n", iset, tstartstr); |
320 |
} |
321 |
|
322 |
for (lchunk = lchunkfirst; lchunk <= lchunklast; lchunk++) |
323 |
{ |
324 |
lminout = lchunk * lchunksize; |
325 |
lmaxout = lminout + lchunksize - 1; |
326 |
lminout = MAXIMUM(lminout,lmin); |
327 |
lmaxout = MINIMUM(lmaxout,lmax); |
328 |
|
329 |
outrec = outrecset->records[irecout++]; |
330 |
if (histlink != NULL) |
331 |
drms_setlink_static(outrec, histlinkname, histrecnum); |
332 |
|
333 |
if (verbflag > 1) |
334 |
{ |
335 |
wt2=getwalltime(); |
336 |
ct2=getcputime(&ut2, &st2); |
337 |
printf(" processing lchunk %d, min = %d, max = %d\n", lchunk-lchunkfirst, lminout, lmaxout); |
338 |
} |
339 |
|
340 |
if (noinput) |
341 |
{ |
342 |
goto skip2; |
343 |
} |
344 |
|
345 |
if (segoutflag) |
346 |
segout = drms_segment_lookup(outrec, segnameout); |
347 |
else |
348 |
segout = drms_segment_lookupnum(outrec, 0); |
349 |
|
350 |
length[0]=2*ndt; |
351 |
length[1]=lmaxout*(lmaxout+1)/2+lmaxout - lminout*(lminout+1)/2 + 1; |
352 |
arrptr=(float *)(calloc(length[0]*length[1],sizeof(float))); |
353 |
outarr = drms_array_create(usetype, 2, length, arrptr, &status); |
354 |
if (status != DRMS_SUCCESS || outarr == NULL || segout == NULL) |
355 |
{ |
356 |
fprintf(stderr,"ERROR: problem creating output array or segment: length = [%d, %d], status = %d, histrecnum = %lld", length[0], length[1], status, histrecnum); |
357 |
drms_close_records(inrecset, DRMS_FREE_RECORD); |
358 |
drms_close_records(outrecset, DRMS_FREE_RECORD); |
359 |
return 0; |
360 |
} |
361 |
outptr = (float *)(outarr->data); |
362 |
|
363 |
nskip=0; |
364 |
mixflag=0; |
365 |
calversunset=1; |
366 |
for (irecin=0; irecin < nrecsin; irecin++) |
367 |
{ |
368 |
inrec = inrecset->records[irecin]; |
369 |
quality=drms_getkey_int(inrec, "QUALITY", &status); |
370 |
if (status != DRMS_SUCCESS || (quality & QUAL_NODATA)) //may want stricter test on quality here |
371 |
{ |
372 |
if (verbflag>2) printf("SKIP: input data not used due to quality, irecin = %d, status = %d, quality = %08x\n", irecin, status, quality); |
373 |
nskip++; |
374 |
continue; |
375 |
} |
376 |
|
377 |
tstartin=drms_getkey_time(inrec, "T_START", &status); |
378 |
tstopin=drms_getkey_time(inrec, "T_STOP", &status); |
379 |
lminin=drms_getkey_int(inrec, "LMIN", &status); |
380 |
lmaxin=drms_getkey_int(inrec, "LMAX", &status); |
381 |
ndtin=(tstopin-tstartin)/cadence; |
382 |
|
383 |
if (tstartin >= tstopout || tstopin <= tstartout || lminin > lmaxout || lmaxin < lminout) |
384 |
{ |
385 |
nskip++; |
386 |
continue; |
387 |
} |
388 |
|
389 |
if (calversunset) |
390 |
{ |
391 |
calversout=drms_getkey_longlong(inrec, "CALVER64", &status); |
392 |
if (status != DRMS_SUCCESS) |
393 |
calversout = 0; |
394 |
calversunset=0; |
395 |
for (i=0;i<16;i++) |
396 |
nybblearrout[i]=getbits(calversout,4*i+3,4); |
397 |
} |
398 |
|
399 |
if (firstflagarr[irecin]) |
400 |
{ |
401 |
calvers=drms_getkey_longlong(inrec, "CALVER64", &status); |
402 |
if (status != DRMS_SUCCESS) |
403 |
calvers = 0; |
404 |
|
405 |
for (i=0;i<16;i++) |
406 |
{ |
407 |
int nybble=getbits(calvers,4*i+3,4); |
408 |
if (fixflagarr[i]) |
409 |
{ |
410 |
if (nybble != nybblearrout[i]) |
411 |
{ |
412 |
fprintf(stderr, "ERROR: input data has mixed values for field %d of CALVER64: %d and %d, recnum = %lld, histrecnum = %lld\n", i, nybblearrout[i], nybble, inrec->recnum, histrecnum); |
413 |
return 0; |
414 |
} |
415 |
} |
416 |
else |
417 |
{ |
418 |
if (nybble < nybblearrout[i]) |
419 |
nybblearrout[i]=nybble; |
420 |
} |
421 |
} |
422 |
|
423 |
if (!mixflag && (quality & QUAL_MIXEDCALVER || calvers != calversout)) |
424 |
mixflag=1; |
425 |
|
426 |
if (seginflag) |
427 |
segin = drms_segment_lookup(inrec, segnamein); |
428 |
else |
429 |
segin = drms_segment_lookupnum(inrec, 0); |
430 |
if (segin != NULL) |
431 |
inarr = drms_segment_read(segin, usetype, &status); |
432 |
if (status != DRMS_SUCCESS || inarr == NULL || segin == NULL) |
433 |
{ |
434 |
fprintf(stderr, "ERROR: problem reading input segment: tstart = %f, lmin = %d, lmax = %d, irecin = %d, status = %d, histrecnum = %lld\n", tstartin, lminin, lmaxin, irecin, status, histrecnum); |
435 |
drms_close_records(inrecset, DRMS_FREE_RECORD); |
436 |
drms_close_records(outrecset, DRMS_FREE_RECORD); |
437 |
return 0; |
438 |
} |
439 |
else |
440 |
{ |
441 |
inarrarr[irecin]=inarr; |
442 |
} |
443 |
firstflagarr[irecin]=0; |
444 |
} |
445 |
|
446 |
inptr = (float *)(inarrarr[irecin])->data; |
447 |
|
448 |
tstartuse=MAXIMUM(tstartout, tstartin); |
449 |
tstopuse= MINIMUM(tstopout, tstopin); |
450 |
lminuse=MAXIMUM(lminout, lminin); |
451 |
lmaxuse=MINIMUM(lmaxout, lmaxin); |
452 |
nmodes=MODES(lmaxuse+1)-MODES(lminuse); |
453 |
npts=(tstopuse - tstartuse)/cadence; |
454 |
|
455 |
out_time_offset = (tstartuse - tstartout)/cadence; |
456 |
out_modes_offset = MODES(lminuse) - MODES(lminout); |
457 |
out_offset = 2 * (out_modes_offset * ndt + out_time_offset); |
458 |
in_time_offset = (tstartuse - tstartin)/cadence; |
459 |
in_modes_offset = MODES(lminuse) - MODES(lminin); |
460 |
in_offset = 2 * (in_modes_offset * ndtin + in_time_offset); |
461 |
|
462 |
for (imode=0; imode<nmodes; imode++) |
463 |
{ |
464 |
for (itime=0; itime<npts; itime++) |
465 |
{ |
466 |
in_index=in_offset + 2*itime; |
467 |
out_index=out_offset + 2*itime; |
468 |
outptr[out_index] = inptr[in_index]; |
469 |
outptr[out_index+1] = inptr[in_index+1]; |
470 |
} |
471 |
out_offset+=2*ndt; |
472 |
in_offset+=2*ndtin; |
473 |
} |
474 |
|
475 |
} |
476 |
|
477 |
if (nskip == nrecsin) |
478 |
{ |
479 |
fprintf(stderr, "WARNING: no inputs for this output, no segment written\n"); |
480 |
} |
481 |
else |
482 |
{ |
483 |
outarr->bzero=segout->bzero; |
484 |
outarr->bscale=segout->bscale; |
485 |
status=drms_segment_write(segout, outarr, 0); |
486 |
nsegments++; |
487 |
if (status != DRMS_SUCCESS) |
488 |
{ |
489 |
fprintf(stderr, "ERROR: problem writing output segment: status = %d, T_START = %s, LMIN = %d, LMAX = %d, histrecnum = %lld\n", status, tstartstr, lminout, lmaxout, histrecnum); |
490 |
drms_close_records(inrecset, DRMS_FREE_RECORD); |
491 |
drms_close_records(outrecset, DRMS_FREE_RECORD); |
492 |
return 0; |
493 |
} |
494 |
} |
495 |
drms_free_array(outarr); |
496 |
|
497 |
drms_copykeys(outrec, inrec, 0, kDRMS_KeyClass_Explicit); |
498 |
// copykeys takes care of MAPMMAX, SINBDIVS, etc. that should be constant across the input |
499 |
skip2: |
500 |
|
501 |
drms_setkey_int(outrec, "LMIN", lminout); |
502 |
drms_setkey_int(outrec, "LMAX", lmaxout); |
503 |
drms_setkey_time(outrec, "T_START", tstartout); |
504 |
drms_setkey_time(outrec, "T_STOP", tstopout); |
505 |
drms_setkey_time(outrec, "T_OBS", tstartout+chunksecs/2); |
506 |
drms_setkey_int(outrec, "NDT", ndt); |
507 |
|
508 |
for (i=0;i<16;i++) |
509 |
calversout=setbits(calversout,4*i+3,4,nybblearrout[i]); |
510 |
drms_setkey_longlong(outrec, "CALVER64", calversout); |
511 |
|
512 |
if (noinput || nskip == nrecsin) |
513 |
drms_setkey_int(outrec, "QUALITY", QUAL_NODATA); |
514 |
else if (mixflag) |
515 |
drms_setkey_int(outrec, "QUALITY", QUAL_MIXEDCALVER); |
516 |
else |
517 |
drms_setkey_int(outrec, "QUALITY", 0); |
518 |
|
519 |
tnow = (double)time(NULL); |
520 |
tnow += UNIX_epoch; |
521 |
drms_setkey_time(outrec, "DATE", tnow); |
522 |
|
523 |
nrecords++; |
524 |
|
525 |
if (verbflag > 1) |
526 |
{ |
527 |
wt=getwalltime(); |
528 |
ct=getcputime(&ut, &st); |
529 |
fprintf(stdout, " lchunk %d done: %.2f ms wall time, %.2f ms cpu time\n", lchunk-lchunkfirst, |
530 |
wt-wt2, |
531 |
ct-ct2); |
532 |
} |
533 |
|
534 |
} |
535 |
|
536 |
if (verbflag) |
537 |
{ |
538 |
wt=getwalltime(); |
539 |
ct=getcputime(&ut, &st); |
540 |
fprintf(stdout, "timechunk %d done: %.2f ms wall time, %.2f ms cpu time\n", iset, |
541 |
wt-wt1, |
542 |
ct-ct1); |
543 |
|
544 |
} |
545 |
|
546 |
} |
547 |
|
548 |
for (irecin=0; irecin < nrecsin; irecin++) |
549 |
if (inarrarr[irecin] != NULL) drms_free_array(inarrarr[irecin]); |
550 |
free(inarrarr); |
551 |
free(firstflagarr); |
552 |
|
553 |
drms_close_records(inrecset, DRMS_FREE_RECORD); |
554 |
drms_close_records(outrecset, DRMS_INSERT_RECORD); |
555 |
|
556 |
wt=getwalltime(); |
557 |
ct=getcputime(&ut, &st); |
558 |
if (verbflag) |
559 |
{ |
560 |
printf("number of records created = %d\n", nrecords); |
561 |
printf("number of segments created = %d\n", nsegments); |
562 |
fprintf(stdout, "total time spent: %.2f ms wall time, %.2f ms cpu time\n", |
563 |
wt-wt0, ct-ct0); |
564 |
} |
565 |
|
566 |
printf("module %s successful completion\n", cmdparams.argv[0]); |
567 |
|
568 |
return 0; |
569 |
|
570 |
} |