stream_record.c 12.5 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
  (*record).ilevel   = CDI_UNDEFID;
  (*record).used     = FALSE;
  (*record).varID    = CDI_UNDEFID;
  (*record).levelID  = CDI_UNDEFID;
}


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

  recordSize = streamptr->tsteps[tsID].recordSize;
  records    = streamptr->tsteps[tsID].records;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
40
41
42
43
44
45
46
47
  /*
    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
48
      records = (record_t *) malloc(recordSize*sizeof(record_t));
Uwe Schulzweida's avatar
Uwe Schulzweida committed
49
50
      if ( records == NULL )
	{
51
52
          Message("recordSize = %d", recordSize);
	  SysError("Allocation of record_tTABLE failed");
Uwe Schulzweida's avatar
Uwe Schulzweida committed
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
	}

      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
74
      records    = (record_t *) realloc(records, recordSize*sizeof(record_t));
Uwe Schulzweida's avatar
Uwe Schulzweida committed
75
76
      if ( records == NULL )
	{
77
78
          Message("recordSize = %d", recordSize);
	  SysError("Reallocation of record_tTABLE failed");
Uwe Schulzweida's avatar
Uwe Schulzweida committed
79
80
81
82
83
84
85
86
87
88
89
90
	}
      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
91
92
  streamptr->tsteps[tsID].recordSize = recordSize;
  streamptr->tsteps[tsID].records    = records;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
93
94
95
96

  return (recordID);
}

97
98
static
void cdiInitRecord(stream_t *streamptr)
Uwe Schulzweida's avatar
Uwe Schulzweida committed
99
{
Uwe Schulzweida's avatar
Uwe Schulzweida committed
100
101
102
103
104
  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
105
  streamptr->record->param      = 0;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
106
107
108
109
110
111
112
113
114
115
116
  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
117
118
119
120
121
}


void streamInqRecord(int streamID, int *varID, int *levelID)
{
122
  /* int rec = 0; */
Uwe Schulzweida's avatar
Uwe Schulzweida committed
123
124
  int recID, tsID, rindex;
  int lindex;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
125
  stream_t *streamptr;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
126

127
128
129
  check_parg(varID);
  check_parg(levelID);

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

132
  stream_check_ptr(__func__, streamptr);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
133
134
135

  cdiDefAccesstype(streamID, TYPE_REC);

136
  if ( ! streamptr->record ) cdiInitRecord(streamptr);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
137

Uwe Schulzweida's avatar
Uwe Schulzweida committed
138
139
  tsID   = streamptr->curTsID;
  rindex = streamptr->tsteps[tsID].curRecID + 1;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
140

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

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

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

Uwe Schulzweida's avatar
Uwe Schulzweida committed
149
150
  *varID   = streamptr->tsteps[tsID].records[recID].varID;
  lindex   = streamptr->tsteps[tsID].records[recID].levelID;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
151

Uwe Schulzweida's avatar
Uwe Schulzweida committed
152
  *levelID = streamptr->vars[*varID].lindex[lindex];
Uwe Schulzweida's avatar
Uwe Schulzweida committed
153
154

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

Uwe Schulzweida's avatar
Uwe Schulzweida committed
158
159
  streamptr->curTsID = tsID;
  streamptr->tsteps[tsID].curRecID = rindex;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
160
161

  /*
162
  rec = recID + 1;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
163
  filetype = streamptr->filetype;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
164
165
166
167
168
169
170
171
172
173

  switch ( filetype )
    {
    case FILETYPE_GRB:
      {
        rec = grbInqRecord(streamID, varID, levelID);
	break;
      }
    case FILETYPE_SRV:
      {
174
        rec = srvInqRecord(streamptr, varID, levelID);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
175
176
177
178
179
	break;
      }
#if  defined  (HAVE_LIBNETCDF)
    case FILETYPE_NC:
    case FILETYPE_NC2:
180
    case FILETYPE_NC4:
181
    case FILETYPE_NC4C:
Uwe Schulzweida's avatar
Uwe Schulzweida committed
182
183
184
185
186
187
188
      {
	rec = cdfInqRecord(streamID, varID, levelID);
	break;
      }
#endif
    default:
      {
189
	Error("%s support not compiled in!", strfiletype(filetype));
Uwe Schulzweida's avatar
Uwe Schulzweida committed
190
191
192
193
194
195
196
197
198
199
200
	break;
      }
    }
  */
}


void streamDefRecord(int streamID, int varID, int levelID)
{
  int status = 0;
  int filetype;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
201
  int param, gridID, zaxisID, level;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
202
203
  int tsID;
  int vlistID;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
204
  stream_t *streamptr;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
205
206

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

208
  stream_check_ptr(__func__, streamptr);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
209

Uwe Schulzweida's avatar
Uwe Schulzweida committed
210
  tsID = streamptr->curTsID;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
211
212
213
214
215
216
217

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

218
  if ( ! streamptr->record ) cdiInitRecord(streamptr);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
219

Uwe Schulzweida's avatar
Uwe Schulzweida committed
220
  vlistID = streamptr->vlistID;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
221
222
  gridID  = vlistInqVarGrid(vlistID, varID);
  zaxisID = vlistInqVarZaxis(vlistID, varID);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
223
  param   = vlistInqVarParam(vlistID, varID);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
224
  level   = (int) zaxisInqLevel(zaxisID, levelID);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
225

Uwe Schulzweida's avatar
Uwe Schulzweida committed
226
227
  streamptr->record->varID    = varID;
  streamptr->record->levelID  = levelID;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
228
  streamptr->record->param    = param;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
229
230
231
232
233
234
  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
235

Uwe Schulzweida's avatar
Uwe Schulzweida committed
236
  filetype = streamptr->filetype;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
237
238
239
240
241

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


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

295
296
297
  check_parg(data);
  check_parg(nmiss);

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

300
  stream_check_ptr(__func__, streamptr);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
301
302

  filetype = streamptr->filetype;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
303
304
305
306
307
308
309

  *nmiss = 0;

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


356
void stream_write_record(int streamID, int memtype, const void *data, int nmiss)
Uwe Schulzweida's avatar
Uwe Schulzweida committed
357
358
359
{
  int status = 0;
  int filetype;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
360
  stream_t *streamptr;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
361

362
363
  check_parg(data);

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

366
  stream_check_ptr(__func__, streamptr);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
367

Uwe Schulzweida's avatar
Uwe Schulzweida committed
368
  filetype = streamptr->filetype;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
369
370
371
372
373

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


423
424
425
426
427
void streamWriteRecord(int streamID, const double *data, int nmiss)
{
  stream_write_record(streamID, MEMTYPE_DOUBLE, (const void *) data, nmiss);
}

428
void streamWriteRecordF(int streamID, const float *data, int nmiss)
429
430
431
432
433
{
  stream_write_record(streamID, MEMTYPE_FLOAT, (const void *) data, nmiss);
}


Uwe Schulzweida's avatar
Uwe Schulzweida committed
434
void streamCopyRecord(int streamID2, int streamID1)
Uwe Schulzweida's avatar
Uwe Schulzweida committed
435
436
{
  int status = 0;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
437
  int filetype = CDI_UNDEFID, filetype1, filetype2;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
438
439
  stream_t *streamptr1;
  stream_t *streamptr2;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
440

Uwe Schulzweida's avatar
Uwe Schulzweida committed
441
442
  streamptr1 = stream_to_pointer(streamID1);
  streamptr2 = stream_to_pointer(streamID2);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
443

444
445
  stream_check_ptr(__func__, streamptr1);
  stream_check_ptr(__func__, streamptr2);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
446

Uwe Schulzweida's avatar
Uwe Schulzweida committed
447
448
  filetype1 = streamptr1->filetype;
  filetype2 = streamptr2->filetype;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
449

Uwe Schulzweida's avatar
cleanup    
Uwe Schulzweida committed
450
  if ( filetype1 == filetype2 ) filetype = filetype2;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
451

Uwe Schulzweida's avatar
Uwe Schulzweida committed
452
  switch (filetype)
Uwe Schulzweida's avatar
Uwe Schulzweida committed
453
    {
Uwe Schulzweida's avatar
Uwe Schulzweida committed
454
455
456
457
#if  defined  (HAVE_LIBGRIB)
    case FILETYPE_GRB:
    case FILETYPE_GRB2:
      {
458
	status = grbCopyRecord(streamptr2, streamptr1);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
459
460
461
	break;
      }
#endif
Uwe Schulzweida's avatar
Uwe Schulzweida committed
462
#if  defined  (HAVE_LIBSERVICE)
Uwe Schulzweida's avatar
Uwe Schulzweida committed
463
464
    case FILETYPE_SRV:
      {
465
	status = srvCopyRecord(streamptr2, streamptr1);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
466
467
	break;
      }
Uwe Schulzweida's avatar
Uwe Schulzweida committed
468
469
#endif
#if  defined  (HAVE_LIBEXTRA)
Uwe Schulzweida's avatar
Uwe Schulzweida committed
470
471
    case FILETYPE_EXT:
      {
472
	status = extCopyRecord(streamptr2, streamptr1);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
473
474
	break;
      }
Uwe Schulzweida's avatar
Uwe Schulzweida committed
475
476
#endif
#if  defined  (HAVE_LIBIEG)
Uwe Schulzweida's avatar
Uwe Schulzweida committed
477
478
    case FILETYPE_IEG:
      {
479
	status = iegCopyRecord(streamptr2, streamptr1);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
480
481
	break;
      }
Uwe Schulzweida's avatar
Uwe Schulzweida committed
482
#endif
Uwe Schulzweida's avatar
Uwe Schulzweida committed
483
484
    default:
      {
485
	status = cdfCopyRecord(streamptr2, streamptr1);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
486
487
	break;
      }
Uwe Schulzweida's avatar
Uwe Schulzweida committed
488
489
490
491
    }
}


492
void cdi_create_records(stream_t *streamptr, int tsID)
Uwe Schulzweida's avatar
Uwe Schulzweida committed
493
494
495
{
  int nrecords, maxrecords;
  int nvars, varID, recID;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
496
  record_t *records;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
497
498
  int vlistID;

Uwe Schulzweida's avatar
Uwe Schulzweida committed
499
  if ( streamptr->tsteps[tsID].records ) return;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
500

501
  vlistID  = streamptr->vlistID;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
502
503
504
505

  if ( tsID == 0 )
    {
      maxrecords = 0;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
506
      nvars = streamptr->nvars;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
507
      for ( varID = 0; varID < nvars; varID++)
Uwe Schulzweida's avatar
Uwe Schulzweida committed
508
	maxrecords += streamptr->vars[varID].nlevs;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
509
510
    }
  else
Uwe Schulzweida's avatar
Uwe Schulzweida committed
511
    maxrecords = streamptr->tsteps[0].recordSize;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
512
513
514
515
516
517
518
519

  if ( tsID == 0 )
    {
      nrecords = maxrecords;
    }
  else if ( tsID == 1 )
    {
      nrecords = 0;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
520
      maxrecords = streamptr->tsteps[0].recordSize;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
521
522
      for ( recID = 0; recID < maxrecords; recID++ )
	{
Uwe Schulzweida's avatar
Uwe Schulzweida committed
523
	  varID = streamptr->tsteps[0].records[recID].varID;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
524
	  if ( varID != -1 ) /* varID = -1 for write mode !!! */
525
	    if ( vlistInqVarTsteptype(vlistID, varID) == TSTEP_CONSTANT )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
526
527
528
529
530
	      continue;
	  nrecords++;
	}
    }
  else
Uwe Schulzweida's avatar
Uwe Schulzweida committed
531
    nrecords = streamptr->tsteps[1].nallrecs;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
532

Uwe Schulzweida's avatar
Uwe Schulzweida committed
533
  if ( maxrecords > 0 )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
534
    records = (record_t *) malloc(maxrecords*sizeof(record_t));
Uwe Schulzweida's avatar
Uwe Schulzweida committed
535
536
537
  else
    records = NULL;

Uwe Schulzweida's avatar
Uwe Schulzweida committed
538
539
540
  streamptr->tsteps[tsID].records    = records;
  streamptr->tsteps[tsID].recordSize = maxrecords;
  streamptr->tsteps[tsID].nallrecs   = nrecords;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
541
542
543
544

  if ( tsID == 0 )
    {
      for ( recID = 0; recID < maxrecords; recID++ )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
545
	recordInitEntry(&streamptr->tsteps[tsID].records[recID]);
Uwe Schulzweida's avatar
Uwe Schulzweida committed
546
547
548
    }
  else
    {
Uwe Schulzweida's avatar
Uwe Schulzweida committed
549
550
      memcpy(streamptr->tsteps[tsID].records,
	     streamptr->tsteps[0].records,
Uwe Schulzweida's avatar
Uwe Schulzweida committed
551
	     maxrecords*sizeof(record_t));
Uwe Schulzweida's avatar
Uwe Schulzweida committed
552
553
554

      for ( recID = 0; recID < maxrecords; recID++ )
	{
Uwe Schulzweida's avatar
Uwe Schulzweida committed
555
	  varID = streamptr->tsteps[0].records[recID].varID;
Uwe Schulzweida's avatar
Uwe Schulzweida committed
556
	  if ( varID != -1 ) /* varID = -1 for write mode !!! */
557
	    if ( vlistInqVarTsteptype(vlistID, varID) != TSTEP_CONSTANT )
Uwe Schulzweida's avatar
Uwe Schulzweida committed
558
	      {
Uwe Schulzweida's avatar
Uwe Schulzweida committed
559
560
561
		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
562
563
564
565
	      }
	}
    }
}
566
567
568
569
570
571
572
573
574
/*
 * Local Variables:
 * c-file-style: "Java"
 * c-basic-offset: 2
 * indent-tabs-mode: nil
 * show-trailing-whitespace: t
 * require-trailing-newline: t
 * End:
 */