stream_record.c 13 KB
Newer Older
Uwe Schulzweida's avatar
Uwe Schulzweida committed
1
2
3
4
5
6
7
8
9
10
11
12
#if defined (HAVE_CONFIG_H)
#  include "config.h"
#endif

#include <stdio.h>
#include <string.h>

#include "dmemory.h"

#include "cdi.h"
#include "cdf_int.h"
#include "stream_int.h"
Uwe Schulzweida's avatar
Uwe Schulzweida committed
13
#include "stream_grb.h"
Uwe Schulzweida's avatar
Uwe Schulzweida committed
14
15
16
17
18
19
#include "stream_cdf.h"
#include "stream_srv.h"
#include "stream_ext.h"
#include "stream_ieg.h"


Uwe Schulzweida's avatar
Uwe Schulzweida committed
20
void recordInitEntry(record_t *record)
Uwe Schulzweida's avatar
Uwe Schulzweida committed
21
22
23
{
  (*record).position = CDI_UNDEFID;
  (*record).size     = 0;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
24
  (*record).param    = 0;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
25
26
27
28
29
30
31
32
33
34
35
  (*record).ilevel   = CDI_UNDEFID;
  (*record).used     = FALSE;
  (*record).varID    = CDI_UNDEFID;
  (*record).levelID  = CDI_UNDEFID;
}


int recordNewEntry(int streamID, int tsID)
{
  int recordID = 0;
  int recordSize;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
36
  record_t *records;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
37
  stream_t *streamptr;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
38

Uwe Schulzweida's avatar
Uwe Schulzweida committed
39
40
41
42
  streamptr = stream_to_pointer(streamID);

  recordSize = streamptr->tsteps[tsID].recordSize;
  records    = streamptr->tsteps[tsID].records;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
43
44
45
46
47
48
49
50
  /*
    Look for a free slot in record.
    (Create the table the first time through).
  */
  if ( ! recordSize )
    {
      int i;
      recordSize = 1;   /*  <<<<----  */
Uwe Schulzweida's avatar
Uwe Schulzweida committed
51
      records = (record_t *) malloc(recordSize*sizeof(record_t));
Uwe Schulzweida's avatar
Uwe Schulzweida committed
52
53
      if ( records == NULL )
	{
54
55
          Message("recordSize = %d", recordSize);
	  SysError("Allocation of record_tTABLE failed");
Uwe Schulzweida's avatar
Uwe Schulzweida committed
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
	}

      for ( i = 0; i < recordSize; i++ )
	records[i].used = CDI_UNDEFID;
    }
  else
    {
      while ( recordID < recordSize )
	{
	  if ( records[recordID].used == CDI_UNDEFID ) break;
	  recordID++;
	}
    }
  /*
    If the table overflows, double its size.
  */
  if ( recordID == recordSize )
    {
      int i;

      recordSize = 2*recordSize;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
77
      records    = (record_t *) realloc(records, recordSize*sizeof(record_t));
Uwe Schulzweida's avatar
Uwe Schulzweida committed
78
79
      if ( records == NULL )
	{
80
81
          Message("recordSize = %d", recordSize);
	  SysError("Reallocation of record_tTABLE failed");
Uwe Schulzweida's avatar
Uwe Schulzweida committed
82
83
84
85
86
87
88
89
90
91
92
93
	}
      recordID = recordSize/2;

      for ( i = recordID; i < recordSize; i++ )
	records[i].used = CDI_UNDEFID;
    }


  recordInitEntry(&records[recordID]);

  records[recordID].used = 1;

Uwe Schulzweida's avatar
Uwe Schulzweida committed
94
95
  streamptr->tsteps[tsID].recordSize = recordSize;
  streamptr->tsteps[tsID].records    = records;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
96
97
98
99
100
101
102

  return (recordID);
}


void cdiInitRecord(int streamID)
{
Uwe Schulzweida's avatar
Uwe Schulzweida committed
103
  stream_t *streamptr;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
104
105
106
107
108
109
110
111

  streamptr = stream_to_pointer(streamID);

  streamptr->record = (Record *) malloc(sizeof(Record));

  streamptr->record->used       = 0;
  streamptr->record->nrec       = 0;
  streamptr->record->dataread   = 1;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
112
  streamptr->record->param      = 0;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
113
114
115
116
117
118
119
120
121
122
123
  streamptr->record->level      = 0;
  streamptr->record->date       = 0;
  streamptr->record->time       = 0;
  streamptr->record->gridID     = 0;
  streamptr->record->zaxisID    = 0;
  streamptr->record->buffer     = NULL;
  streamptr->record->buffersize = 0;
  streamptr->record->position   = 0;
  streamptr->record->varID      = 0;
  streamptr->record->levelID    = CDI_UNDEFID;
  streamptr->record->recid      = 0;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
124
125
126
127
128
129
130
131
}


void streamInqRecord(int streamID, int *varID, int *levelID)
{
  int rec = 0;
  int recID, tsID, rindex;
  int lindex;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
132
  stream_t *streamptr;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
133

134
135
136
  check_parg(varID);
  check_parg(levelID);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
137
138
  streamptr = stream_to_pointer(streamID);

139
  stream_check_ptr(__func__, streamptr);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
140
141
142

  cdiDefAccesstype(streamID, TYPE_REC);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
143
  if ( ! streamptr->record ) cdiInitRecord(streamID);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
144

Uwe Schulzweida's avatar
Uwe Schulzweida committed
145
146
  tsID   = streamptr->curTsID;
  rindex = streamptr->tsteps[tsID].curRecID + 1;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
147

Uwe Schulzweida's avatar
Uwe Schulzweida committed
148
  if ( rindex >= streamptr->tsteps[tsID].nrecs )
149
    Error("record %d not available at timestep %d", rindex+1, tsID+1);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
150

Uwe Schulzweida's avatar
Uwe Schulzweida committed
151
  recID  = streamptr->tsteps[tsID].recIDs[rindex];
Uwe Schulzweida's avatar
Uwe Schulzweida committed
152

Uwe Schulzweida's avatar
Uwe Schulzweida committed
153
  if ( recID == -1 || recID >= streamptr->tsteps[tsID].nallrecs )
154
    Error("Internal problem! tsID = %d recID = %d", tsID, recID);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
155

Uwe Schulzweida's avatar
Uwe Schulzweida committed
156
157
  *varID   = streamptr->tsteps[tsID].records[recID].varID;
  lindex   = streamptr->tsteps[tsID].records[recID].levelID;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
158

Uwe Schulzweida's avatar
Uwe Schulzweida committed
159
  *levelID = streamptr->vars[*varID].lindex[lindex];
Uwe Schulzweida's avatar
Uwe Schulzweida committed
160
161

  if ( CDI_Debug )
162
    Message("tsID = %d, recID = %d, varID = %d, levelID = %d\n",
Uwe Schulzweida's avatar
Uwe Schulzweida committed
163
164
	    tsID, recID, *varID, *levelID);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
165
166
  streamptr->curTsID = tsID;
  streamptr->tsteps[tsID].curRecID = rindex;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
167
168
169

  rec = recID + 1;
  /*
Uwe Schulzweida's avatar
Uwe Schulzweida committed
170
  filetype = streamptr->filetype;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186

  switch ( filetype )
    {
    case FILETYPE_GRB:
      {
        rec = grbInqRecord(streamID, varID, levelID);
	break;
      }
    case FILETYPE_SRV:
      {
        rec = srvInqRecord(streamID, varID, levelID);
	break;
      }
#if  defined  (HAVE_LIBNETCDF)
    case FILETYPE_NC:
    case FILETYPE_NC2:
187
    case FILETYPE_NC4:
188
    case FILETYPE_NC4C:
Uwe Schulzweida's avatar
Uwe Schulzweida committed
189
190
191
192
193
194
195
      {
	rec = cdfInqRecord(streamID, varID, levelID);
	break;
      }
#endif
    default:
      {
196
	Error("%s support not compiled in!", strfiletype(filetype));
Uwe Schulzweida's avatar
Uwe Schulzweida committed
197
198
199
200
201
202
203
204
205
206
207
	break;
      }
    }
  */
}


void streamDefRecord(int streamID, int varID, int levelID)
{
  int status = 0;
  int filetype;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
208
  int param, gridID, zaxisID, level;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
209
210
  int tsID;
  int vlistID;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
211
  stream_t *streamptr;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
212
213

  streamptr = stream_to_pointer(streamID);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
214

215
  stream_check_ptr(__func__, streamptr);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
216

Uwe Schulzweida's avatar
Uwe Schulzweida committed
217
  tsID = streamptr->curTsID;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
218
219
220
221
222
223
224

  if ( tsID == CDI_UNDEFID )
    {
      tsID++;
      streamDefTimestep(streamID, tsID);
    }

Uwe Schulzweida's avatar
Uwe Schulzweida committed
225
  if ( ! streamptr->record ) cdiInitRecord(streamID);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
226
227
228
229

  vlistID = streamInqVlist(streamID);
  gridID  = vlistInqVarGrid(vlistID, varID);
  zaxisID = vlistInqVarZaxis(vlistID, varID);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
230
  param   = vlistInqVarParam(vlistID, varID);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
231
  level   = (int) zaxisInqLevel(zaxisID, levelID);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
232

Uwe Schulzweida's avatar
Uwe Schulzweida committed
233
234
  streamptr->record->varID    = varID;
  streamptr->record->levelID  = levelID;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
235
  streamptr->record->param    = param;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
236
237
238
239
240
241
  streamptr->record->level    = level;
  streamptr->record->date     = streamptr->tsteps[tsID].taxis.vdate;
  streamptr->record->time     = streamptr->tsteps[tsID].taxis.vtime;
  streamptr->record->gridID   = gridID;
  streamptr->record->zaxisID  = zaxisID;
  streamptr->record->prec     = vlistInqVarDatatype(vlistID, varID);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
242

Uwe Schulzweida's avatar
Uwe Schulzweida committed
243
  filetype = streamptr->filetype;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
244
245
246
247
248

  switch (filetype)
    {
#if  defined  (HAVE_LIBGRIB)
    case FILETYPE_GRB:
Uwe Schulzweida's avatar
Uwe Schulzweida committed
249
250
251
252
253
254
    case FILETYPE_GRB2:
      {
        status = grbDefRecord(streamID);
	break;
      }
#endif
Uwe Schulzweida's avatar
Uwe Schulzweida committed
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
#if  defined  (HAVE_LIBSERVICE)
    case FILETYPE_SRV:
      {
        status = srvDefRecord(streamID);
	break;
      }
#endif
#if  defined  (HAVE_LIBEXTRA)
    case FILETYPE_EXT:
      {
        status = extDefRecord(streamID);
	break;
      }
#endif
#if  defined  (HAVE_LIBIEG)
    case FILETYPE_IEG:
      {
        status = iegDefRecord(streamID);
	break;
      }
#endif
#if  defined  (HAVE_LIBNETCDF)
    case FILETYPE_NC:
    case FILETYPE_NC2:
279
    case FILETYPE_NC4:
280
    case FILETYPE_NC4C:
Uwe Schulzweida's avatar
Uwe Schulzweida committed
281
      {
Uwe Schulzweida's avatar
Uwe Schulzweida committed
282
	if ( streamptr->accessmode == 0 ) cdfEndDef(streamID);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
283
284
285
286
287
288
	status = cdfDefRecord(streamID);
	break;
      }
#endif
    default:
      {
289
	Error("%s support not compiled in!", strfiletype(filetype));
Uwe Schulzweida's avatar
Uwe Schulzweida committed
290
291
292
293
294
295
296
297
298
299
	break;
      }
    }
}


void streamReadRecord(int streamID, double *data, int *nmiss)
{
  int status = 0;
  int filetype;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
300
  stream_t *streamptr;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
301

302
303
304
  check_parg(data);
  check_parg(nmiss);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
305
  streamptr = stream_to_pointer(streamID);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
306

307
  stream_check_ptr(__func__, streamptr);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
308
309

  filetype = streamptr->filetype;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
310
311
312
313
314
315
316

  *nmiss = 0;

  switch (filetype)
    {
#if  defined  (HAVE_LIBGRIB)
    case FILETYPE_GRB:
Uwe Schulzweida's avatar
Uwe Schulzweida committed
317
    case FILETYPE_GRB2:
Uwe Schulzweida's avatar
Uwe Schulzweida committed
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
      {
        status = grbReadRecord(streamID, data, nmiss);
	break;
      }
#endif
#if  defined  (HAVE_LIBSERVICE)
    case FILETYPE_SRV:
      {
        status = srvReadRecord(streamID, data, nmiss);
	break;
      }
#endif
#if  defined  (HAVE_LIBEXTRA)
    case FILETYPE_EXT:
      {
        status = extReadRecord(streamID, data, nmiss);
	break;
      }
#endif
#if  defined  (HAVE_LIBIEG)
    case FILETYPE_IEG:
      {
        status = iegReadRecord(streamID, data, nmiss);
	break;
      }
#endif
#if  defined  (HAVE_LIBNETCDF)
    case FILETYPE_NC:
    case FILETYPE_NC2:
347
    case FILETYPE_NC4:
348
    case FILETYPE_NC4C:
Uwe Schulzweida's avatar
Uwe Schulzweida committed
349
350
351
352
353
354
355
      {
	status = cdfReadRecord(streamID, data, nmiss);
	break;
      }
#endif
    default:
      {
356
	Error("%s support not compiled in!", strfiletype(filetype));
Uwe Schulzweida's avatar
Uwe Schulzweida committed
357
358
359
360
361
362
	break;
      }
    }
}


363
void stream_write_record(int streamID, int memtype, const void *data, int nmiss)
Uwe Schulzweida's avatar
Uwe Schulzweida committed
364
365
366
{
  int status = 0;
  int filetype;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
367
  stream_t *streamptr;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
368

369
370
  check_parg(data);

Uwe Schulzweida's avatar
Uwe Schulzweida committed
371
  streamptr = stream_to_pointer(streamID);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
372

373
  stream_check_ptr(__func__, streamptr);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
374

Uwe Schulzweida's avatar
Uwe Schulzweida committed
375
  filetype = streamptr->filetype;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
376
377
378
379
380

  switch (filetype)
    {
#if  defined  (HAVE_LIBGRIB)
    case FILETYPE_GRB:
Uwe Schulzweida's avatar
Uwe Schulzweida committed
381
    case FILETYPE_GRB2:
Uwe Schulzweida's avatar
Uwe Schulzweida committed
382
      {
383
        if ( memtype == MEMTYPE_FLOAT ) Error("grbWriteRecord not implemented for memtype float!");
Uwe Schulzweida's avatar
Uwe Schulzweida committed
384
385
386
387
388
389
390
        status = grbWriteRecord(streamID, data, nmiss);
	break;
      }
#endif
#if  defined  (HAVE_LIBSERVICE)
    case FILETYPE_SRV:
      {
391
        if ( memtype == MEMTYPE_FLOAT ) Error("srvWriteRecord not implemented for memtype float!");
Uwe Schulzweida's avatar
Uwe Schulzweida committed
392
393
394
395
396
397
398
        status = srvWriteRecord(streamID, data);
	break;
      }
#endif
#if  defined  (HAVE_LIBEXTRA)
    case FILETYPE_EXT:
      {
399
        if ( memtype == MEMTYPE_FLOAT ) Error("extWriteRecord not implemented for memtype float!");
Uwe Schulzweida's avatar
Uwe Schulzweida committed
400
401
402
403
404
405
406
        status = extWriteRecord(streamID, data);
	break;
      }
#endif
#if  defined  (HAVE_LIBIEG)
    case FILETYPE_IEG:
      {
407
        if ( memtype == MEMTYPE_FLOAT ) Error("iegWriteRecord not implemented for memtype float!");
Uwe Schulzweida's avatar
Uwe Schulzweida committed
408
409
410
411
412
413
414
        status = iegWriteRecord(streamID, data);
	break;
      }
#endif
#if  defined  (HAVE_LIBNETCDF)
    case FILETYPE_NC:
    case FILETYPE_NC2:
415
    case FILETYPE_NC4:
416
    case FILETYPE_NC4C:
Uwe Schulzweida's avatar
Uwe Schulzweida committed
417
      {
418
	cdf_write_record(streamID, memtype, data, nmiss);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
419
420
421
422
423
	break;
      }
#endif
    default:
      {
424
	Error("%s support not compiled in!", strfiletype(filetype));
Uwe Schulzweida's avatar
Uwe Schulzweida committed
425
426
427
428
429
430
	break;
      }
    }
}


431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
void streamWriteRecord(int streamID, const double *data, int nmiss)
{
  stream_write_record(streamID, MEMTYPE_DOUBLE, (const void *) data, nmiss);
}

void streamWriteRecordDouble(int streamID, const double *data, int nmiss)
{
  stream_write_record(streamID, MEMTYPE_DOUBLE, (const void *) data, nmiss);
}

void streamWriteRecordFloat(int streamID, const float *data, int nmiss)
{
  stream_write_record(streamID, MEMTYPE_FLOAT, (const void *) data, nmiss);
}


Uwe Schulzweida's avatar
Uwe Schulzweida committed
447
void streamCopyRecord(int streamID2, int streamID1)
Uwe Schulzweida's avatar
Uwe Schulzweida committed
448
449
{
  int status = 0;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
450
  int filetype = CDI_UNDEFID, filetype1, filetype2;
451
  int byteorder1, byteorder2;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
452
453
  stream_t *streamptr1;
  stream_t *streamptr2;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
454

Uwe Schulzweida's avatar
Uwe Schulzweida committed
455
456
  streamptr1 = stream_to_pointer(streamID1);
  streamptr2 = stream_to_pointer(streamID2);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
457

458
459
  stream_check_ptr(__func__, streamptr1);
  stream_check_ptr(__func__, streamptr2);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
460

Uwe Schulzweida's avatar
Uwe Schulzweida committed
461
462
  filetype1 = streamptr1->filetype;
  filetype2 = streamptr2->filetype;
463
464
  byteorder1 = streamptr1->byteorder;
  byteorder2 = streamptr2->byteorder;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
465

Uwe Schulzweida's avatar
Uwe Schulzweida committed
466
  if ( filetype1  == filetype2 ) filetype = filetype2;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
467

Uwe Schulzweida's avatar
Uwe Schulzweida committed
468
  switch (filetype)
Uwe Schulzweida's avatar
Uwe Schulzweida committed
469
    {
Uwe Schulzweida's avatar
Uwe Schulzweida committed
470
471
472
473
474
475
476
477
#if  defined  (HAVE_LIBGRIB)
    case FILETYPE_GRB:
    case FILETYPE_GRB2:
      {
	status = grbCopyRecord(streamID2, streamID1);
	break;
      }
#endif
Uwe Schulzweida's avatar
Uwe Schulzweida committed
478
#if  defined  (HAVE_LIBSERVICE)
Uwe Schulzweida's avatar
Uwe Schulzweida committed
479
480
481
482
483
    case FILETYPE_SRV:
      {
	status = srvCopyRecord(streamID2, streamID1);
	break;
      }
Uwe Schulzweida's avatar
Uwe Schulzweida committed
484
485
#endif
#if  defined  (HAVE_LIBEXTRA)
Uwe Schulzweida's avatar
Uwe Schulzweida committed
486
487
488
489
490
    case FILETYPE_EXT:
      {
	status = extCopyRecord(streamID2, streamID1);
	break;
      }
Uwe Schulzweida's avatar
Uwe Schulzweida committed
491
492
#endif
#if  defined  (HAVE_LIBIEG)
Uwe Schulzweida's avatar
Uwe Schulzweida committed
493
494
495
496
497
    case FILETYPE_IEG:
      {
	status = iegCopyRecord(streamID2, streamID1);
	break;
      }
Uwe Schulzweida's avatar
Uwe Schulzweida committed
498
#endif
Uwe Schulzweida's avatar
Uwe Schulzweida committed
499
500
501
502
503
    default:
      {
	status = cdfCopyRecord(streamID2, streamID1);
	break;
      }
Uwe Schulzweida's avatar
Uwe Schulzweida committed
504
505
506
507
508
509
510
511
    }
}


void cdiCreateRecords(int streamID, int tsID)
{
  int nrecords, maxrecords;
  int nvars, varID, recID;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
512
  record_t *records;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
513
  int vlistID;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
514
  stream_t *streamptr;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
515
516

  streamptr = stream_to_pointer(streamID);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
517

518
  stream_check_ptr(__func__, streamptr);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
519

Uwe Schulzweida's avatar
Uwe Schulzweida committed
520
  if ( streamptr->tsteps[tsID].records ) return;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
521
522
523
524
525
526

  vlistID  = streamInqVlist(streamID);

  if ( tsID == 0 )
    {
      maxrecords = 0;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
527
      nvars = streamptr->nvars;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
528
      for ( varID = 0; varID < nvars; varID++)
Uwe Schulzweida's avatar
Uwe Schulzweida committed
529
	maxrecords += streamptr->vars[varID].nlevs;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
530
531
    }
  else
Uwe Schulzweida's avatar
Uwe Schulzweida committed
532
    maxrecords = streamptr->tsteps[0].recordSize;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
533
534
535
536
537
538
539
540

  if ( tsID == 0 )
    {
      nrecords = maxrecords;
    }
  else if ( tsID == 1 )
    {
      nrecords = 0;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
541
      maxrecords = streamptr->tsteps[0].recordSize;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
542
543
      for ( recID = 0; recID < maxrecords; recID++ )
	{
Uwe Schulzweida's avatar
Uwe Schulzweida committed
544
	  varID = streamptr->tsteps[0].records[recID].varID;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
545
546
547
548
549
550
551
	  if ( varID != -1 ) /* varID = -1 for write mode !!! */
	    if ( vlistInqVarTime(vlistID, varID) == TIME_CONSTANT )
	      continue;
	  nrecords++;
	}
    }
  else
Uwe Schulzweida's avatar
Uwe Schulzweida committed
552
    nrecords = streamptr->tsteps[1].nallrecs;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
553

Uwe Schulzweida's avatar
Uwe Schulzweida committed
554
  if ( maxrecords > 0 )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
555
    records = (record_t *) malloc(maxrecords*sizeof(record_t));
Uwe Schulzweida's avatar
Uwe Schulzweida committed
556
557
558
  else
    records = NULL;

Uwe Schulzweida's avatar
Uwe Schulzweida committed
559
560
561
  streamptr->tsteps[tsID].records    = records;
  streamptr->tsteps[tsID].recordSize = maxrecords;
  streamptr->tsteps[tsID].nallrecs   = nrecords;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
562
563
564
565

  if ( tsID == 0 )
    {
      for ( recID = 0; recID < maxrecords; recID++ )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
566
	recordInitEntry(&streamptr->tsteps[tsID].records[recID]);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
567
568
569
    }
  else
    {
Uwe Schulzweida's avatar
Uwe Schulzweida committed
570
571
      memcpy(streamptr->tsteps[tsID].records,
	     streamptr->tsteps[0].records,
Uwe Schulzweida's avatar
Uwe Schulzweida committed
572
	     maxrecords*sizeof(record_t));
Uwe Schulzweida's avatar
Uwe Schulzweida committed
573
574
575

      for ( recID = 0; recID < maxrecords; recID++ )
	{
Uwe Schulzweida's avatar
Uwe Schulzweida committed
576
	  varID = streamptr->tsteps[0].records[recID].varID;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
577
578
579
	  if ( varID != -1 ) /* varID = -1 for write mode !!! */
	    if ( vlistInqVarTime(vlistID, varID) == TIME_VARIABLE )
	      {
Uwe Schulzweida's avatar
Uwe Schulzweida committed
580
581
582
		streamptr->tsteps[tsID].records[recID].position = CDI_UNDEFID;
		streamptr->tsteps[tsID].records[recID].size     = 0;
		streamptr->tsteps[tsID].records[recID].used     = FALSE;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
583
584
585
586
	      }
	}
    }
}
587
588
589
590
591
592
593
594
595
/*
 * Local Variables:
 * c-file-style: "Java"
 * c-basic-offset: 2
 * indent-tabs-mode: nil
 * show-trailing-whitespace: t
 * require-trailing-newline: t
 * End:
 */