Skip to content
Snippets Groups Projects
Commit 269189b0 authored by Oliver Heidmann's avatar Oliver Heidmann Committed by Uwe Schulzweida
Browse files

class rework Unpack.cc

parent 54b0d492
No related branches found
No related tags found
1 merge request!96Develop
......@@ -11,74 +11,103 @@
extern "C" void cdiPrintKeys(int cdiID, int varID);
void *
Unpack(void *process)
class ModuleUnpack
{
cdo_initialize(process);
operator_check_argc(0);
auto streamID1 = cdo_open_read(0);
auto vlistID1 = cdo_stream_inq_vlist(streamID1);
auto vlistID2 = vlistDuplicate(vlistID1);
CdoStreamID streamID1;
int taxisID1;
auto nvars = vlistNvars(vlistID1);
for (int varID = 0; varID < nvars; ++varID)
{
auto datatype = vlistInqVarDatatype(vlistID1, varID);
double addoffset = 0.0, scalefactor = 1.0;
auto haveAddoffset = (cdiInqKeyFloat(vlistID1, varID, CDI_KEY_ADDOFFSET, &addoffset) == CDI_NOERR);
auto haveScalefactor = (cdiInqKeyFloat(vlistID1, varID, CDI_KEY_SCALEFACTOR, &scalefactor) == CDI_NOERR);
if (haveAddoffset || haveScalefactor)
{
if (haveAddoffset) cdiDeleteKey(vlistID2, varID, CDI_KEY_ADDOFFSET);
if (haveScalefactor) cdiDeleteKey(vlistID2, varID, CDI_KEY_SCALEFACTOR);
if (datatype != CDI_DATATYPE_FLT64) vlistDefVarDatatype(vlistID2, varID, CDI_DATATYPE_FLT32);
}
}
auto taxisID1 = vlistInqTaxis(vlistID1);
auto taxisID2 = taxisDuplicate(taxisID1);
vlistDefTaxis(vlistID2, taxisID2);
auto streamID2 = cdo_open_write(1);
cdo_def_vlist(streamID2, vlistID2);
CdoStreamID streamID2;
int taxisID2;
int vlistID2;
Field field;
VarList varList1;
varListInit(varList1, vlistID1);
int tsID = 0;
while (true)
{
auto nrecs = cdo_stream_inq_timestep(streamID1, tsID);
if (nrecs == 0) break;
cdo_taxis_copy_timestep(taxisID2, taxisID1);
cdo_def_timestep(streamID2, tsID);
public:
void
init(void *process)
{
cdo_initialize(process);
operator_check_argc(0);
streamID1 = cdo_open_read(0);
auto vlistID1 = cdo_stream_inq_vlist(streamID1);
vlistID2 = vlistDuplicate(vlistID1);
auto nvars = vlistNvars(vlistID1);
for (int varID = 0; varID < nvars; ++varID)
{
auto datatype = vlistInqVarDatatype(vlistID1, varID);
double addoffset = 0.0, scalefactor = 1.0;
auto haveAddoffset = (cdiInqKeyFloat(vlistID1, varID, CDI_KEY_ADDOFFSET, &addoffset) == CDI_NOERR);
auto haveScalefactor = (cdiInqKeyFloat(vlistID1, varID, CDI_KEY_SCALEFACTOR, &scalefactor) == CDI_NOERR);
if (haveAddoffset || haveScalefactor)
{
if (haveAddoffset) cdiDeleteKey(vlistID2, varID, CDI_KEY_ADDOFFSET);
if (haveScalefactor) cdiDeleteKey(vlistID2, varID, CDI_KEY_SCALEFACTOR);
if (datatype != CDI_DATATYPE_FLT64) vlistDefVarDatatype(vlistID2, varID, CDI_DATATYPE_FLT32);
}
}
taxisID1 = vlistInqTaxis(vlistID1);
taxisID2 = taxisDuplicate(taxisID1);
vlistDefTaxis(vlistID2, taxisID2);
streamID2 = cdo_open_write(1);
cdo_def_vlist(streamID2, vlistID2);
varListInit(varList1, vlistID1);
}
void
run()
{
int tsID = 0;
while (true)
{
auto nrecs = cdo_stream_inq_timestep(streamID1, tsID);
if (nrecs == 0) break;
cdo_taxis_copy_timestep(taxisID2, taxisID1);
cdo_def_timestep(streamID2, tsID);
for (int recID = 0; recID < nrecs; ++recID)
{
int varID, levelID;
cdo_inq_record(streamID1, &varID, &levelID);
field.init(varList1[varID]);
cdo_read_record(streamID1, field);
cdo_def_record(streamID2, varID, levelID);
cdo_write_record(streamID2, field);
}
tsID++;
}
}
void
close()
{
cdo_stream_close(streamID1);
cdo_stream_close(streamID2);
vlistDestroy(vlistID2);
cdo_finish();
}
};
for (int recID = 0; recID < nrecs; ++recID)
{
int varID, levelID;
cdo_inq_record(streamID1, &varID, &levelID);
field.init(varList1[varID]);
cdo_read_record(streamID1, field);
cdo_def_record(streamID2, varID, levelID);
cdo_write_record(streamID2, field);
}
tsID++;
}
cdo_stream_close(streamID1);
cdo_stream_close(streamID2);
vlistDestroy(vlistID2);
void *
Unpack(void *process)
{
ModuleUnpack unpack;
cdo_finish();
unpack.init(process);
unpack.run();
unpack.close();
return nullptr;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment