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

class rework Splitdate.cc

parent 0f91116a
No related branches found
No related tags found
1 merge request!96Develop
......@@ -18,181 +18,216 @@
#include "param_conversion.h"
#include "util_files.h"
void *
Splitdate(void *process)
class ModuleSplitdate
{
cdo_initialize(process);
if (process_self().m_ID != 0) cdo_abort("This operator can't be combined with other operators!");
int noffset;
CdoStreamID streamID1;
int taxisID1;
auto dataIsUnchanged = data_is_unchanged();
CdoStreamID streamID2 = CDO_STREAM_UNDEF;
int taxisID2;
int vlistID2;
auto SPLITDATE = cdo_operator_add("splitdate", 0, 0, nullptr);
cdo_operator_add("splitdatetime", 0, 0, nullptr);
bool splitDate;
bool haveConstVars;
bool dataIsUnchanged;
auto operatorID = cdo_operator_id();
auto splitDate = (operatorID == SPLITDATE);
char filename[8192] = { 0 };
char filesuffix[32] = { 0 };
std::string obase;
auto streamID1 = cdo_open_read(0);
VarList varList1;
FieldVector2D vars;
Varray<double> array;
auto vlistID1 = cdo_stream_inq_vlist(streamID1);
auto vlistID2 = vlistDuplicate(vlistID1);
public:
void
init(void *process)
{
cdo_initialize(process);
auto taxisID1 = vlistInqTaxis(vlistID1);
auto taxisID2 = taxisDuplicate(taxisID1);
vlistDefTaxis(vlistID2, taxisID2);
if (process_self().m_ID != 0) cdo_abort("This operator can't be combined with other operators!");
VarList varList1;
varListInit(varList1, vlistID1);
dataIsUnchanged = data_is_unchanged();
char filename[8192] = { 0 };
auto obase = cdo_get_obase();
auto SPLITDATE = cdo_operator_add("splitdate", 0, 0, nullptr);
cdo_operator_add("splitdatetime", 0, 0, nullptr);
auto refname = cdo_get_stream_name(0);
char filesuffix[32] = { 0 };
FileUtils::gen_suffix(filesuffix, sizeof(filesuffix), cdo_inq_filetype(streamID1), vlistID1, refname);
auto operatorID = cdo_operator_id();
splitDate = (operatorID == SPLITDATE);
Varray<double> array;
// if (! dataIsUnchanged)
{
auto gridsizemax = vlistGridsizeMax(vlistID1);
if (vlistNumber(vlistID1) != CDI_REAL) gridsizemax *= 2;
array.resize(gridsizemax);
}
streamID1 = cdo_open_read(0);
auto haveConstVars = (varList_numConstVars(varList1) > 0);
auto vlistID1 = cdo_stream_inq_vlist(streamID1);
vlistID2 = vlistDuplicate(vlistID1);
FieldVector2D vars;
if (haveConstVars)
{
int numVars = varList1.size();
vars.resize(numVars);
for (int varID = 0; varID < numVars; ++varID)
{
const auto &var = varList1[varID];
if (var.isConstant)
{
vars[varID].resize(var.nlevels);
for (int levelID = 0; levelID < var.nlevels; ++levelID)
{
vars[varID][levelID].grid = var.gridID;
vars[varID][levelID].resize(var.gridsize);
}
}
}
}
taxisID1 = vlistInqTaxis(vlistID1);
taxisID2 = taxisDuplicate(taxisID1);
vlistDefTaxis(vlistID2, taxisID2);
int64_t vDate0 = -1;
varListInit(varList1, vlistID1);
CdoStreamID streamID2 = CDO_STREAM_UNDEF;
int tsID2 = 0;
int tsID = 0;
obase = cdo_get_obase();
auto refname = cdo_get_stream_name(0);
FileUtils::gen_suffix(filesuffix, sizeof(filesuffix), cdo_inq_filetype(streamID1), vlistID1, refname);
while (true)
// if (! dataIsUnchanged)
{
auto nrecs = cdo_stream_inq_timestep(streamID1, tsID);
if (nrecs == 0) break;
cdo_taxis_copy_timestep(taxisID2, taxisID1);
auto vDateTime = taxisInqVdatetime(taxisID1);
if (splitDate)
{
auto vDate = cdiDate_get(vDateTime.date);
if (vDate != vDate0)
{
if (streamID2 != CDO_STREAM_UNDEF) cdo_stream_close(streamID2);
vDate0 = vDate;
tsID2 = 0;
int year, month, day;
cdiDate_decode(vDateTime.date, &year, &month, &day);
sprintf(filename, "%s%04d-%02d-%02d%s", obase.c_str(), year, month, day, filesuffix);
if (Options::cdoVerbose) cdo_print("create file %s", filename);
streamID2 = cdo_open_write(filename);
cdo_def_vlist(streamID2, vlistID2);
}
}
else
{
if (streamID2 != CDO_STREAM_UNDEF) cdo_stream_close(streamID2);
tsID2 = 0;
int year, month, day;
cdiDate_decode(vDateTime.date, &year, &month, &day);
int hour, minute, second, ms;
cdiTime_decode(vDateTime.time, &hour, &minute, &second, &ms);
snprintf(filename, sizeof(filename), "%s%04d-%02d-%02dT%02d:%02d:%02d%s", obase.c_str(), year, month, day, hour, minute, second, filesuffix);
if (Options::cdoVerbose) cdo_print("create file %s", filename);
streamID2 = cdo_open_write(filename);
cdo_def_vlist(streamID2, vlistID2);
}
cdo_def_timestep(streamID2, tsID2);
if (tsID > 0 && tsID2 == 0 && haveConstVars)
{
int numVars = varList1.size();
for (int varID = 0; varID < numVars; ++varID)
{
const auto &var = varList1[varID];
if (var.isConstant)
{
for (int levelID = 0; levelID < var.nlevels; ++levelID)
{
cdo_def_record(streamID2, varID, levelID);
auto nmiss = vars[varID][levelID].nmiss;
cdo_write_record(streamID2, vars[varID][levelID].vec_d.data(), nmiss);
}
}
}
}
for (int recID = 0; recID < nrecs; ++recID)
{
int varID, levelID;
cdo_inq_record(streamID1, &varID, &levelID);
cdo_def_record(streamID2, varID, levelID);
if (dataIsUnchanged && !(tsID == 0 && haveConstVars)) { cdo_copy_record(streamID2, streamID1); }
else
{
size_t nmiss;
cdo_read_record(streamID1, array.data(), &nmiss);
cdo_write_record(streamID2, array.data(), nmiss);
if (tsID == 0 && haveConstVars)
{
const auto &var = varList1[varID];
if (var.isConstant)
{
varray_copy(var.gridsize, array, vars[varID][levelID].vec_d);
vars[varID][levelID].nmiss = nmiss;
}
}
}
}
tsID++;
tsID2++;
auto gridsizemax = vlistGridsizeMax(vlistID1);
if (vlistNumber(vlistID1) != CDI_REAL) gridsizemax *= 2;
array.resize(gridsizemax);
}
if (streamID2 != CDO_STREAM_UNDEF) cdo_stream_close(streamID2);
haveConstVars = (varList_numConstVars(varList1) > 0);
if (haveConstVars)
{
int numVars = varList1.size();
vars.resize(numVars);
for (int varID = 0; varID < numVars; ++varID)
{
const auto &var = varList1[varID];
if (var.isConstant)
{
vars[varID].resize(var.nlevels);
for (int levelID = 0; levelID < var.nlevels; ++levelID)
{
vars[varID][levelID].grid = var.gridID;
vars[varID][levelID].resize(var.gridsize);
}
}
}
}
}
void
run()
{
int64_t vDate0 = -1;
streamID2 = CDO_STREAM_UNDEF;
int tsID2 = 0;
int tsID = 0;
while (true)
{
auto nrecs = cdo_stream_inq_timestep(streamID1, tsID);
if (nrecs == 0) break;
cdo_taxis_copy_timestep(taxisID2, taxisID1);
auto vDateTime = taxisInqVdatetime(taxisID1);
if (splitDate)
{
auto vDate = cdiDate_get(vDateTime.date);
if (vDate != vDate0)
{
if (streamID2 != CDO_STREAM_UNDEF) cdo_stream_close(streamID2);
vDate0 = vDate;
tsID2 = 0;
int year, month, day;
cdiDate_decode(vDateTime.date, &year, &month, &day);
sprintf(filename, "%s%04d-%02d-%02d%s", obase.c_str(), year, month, day, filesuffix);
if (Options::cdoVerbose) cdo_print("create file %s", filename);
streamID2 = cdo_open_write(filename);
cdo_def_vlist(streamID2, vlistID2);
}
}
else
{
if (streamID2 != CDO_STREAM_UNDEF) cdo_stream_close(streamID2);
tsID2 = 0;
int year, month, day;
cdiDate_decode(vDateTime.date, &year, &month, &day);
int hour, minute, second, ms;
cdiTime_decode(vDateTime.time, &hour, &minute, &second, &ms);
snprintf(filename, sizeof(filename), "%s%04d-%02d-%02dT%02d:%02d:%02d%s", obase.c_str(), year, month, day, hour, minute,
second, filesuffix);
if (Options::cdoVerbose) cdo_print("create file %s", filename);
streamID2 = cdo_open_write(filename);
cdo_def_vlist(streamID2, vlistID2);
}
cdo_def_timestep(streamID2, tsID2);
if (tsID > 0 && tsID2 == 0 && haveConstVars)
{
int numVars = varList1.size();
for (int varID = 0; varID < numVars; ++varID)
{
const auto &var = varList1[varID];
if (var.isConstant)
{
for (int levelID = 0; levelID < var.nlevels; ++levelID)
{
cdo_def_record(streamID2, varID, levelID);
auto nmiss = vars[varID][levelID].nmiss;
cdo_write_record(streamID2, vars[varID][levelID].vec_d.data(), nmiss);
}
}
}
}
for (int recID = 0; recID < nrecs; ++recID)
{
int varID, levelID;
cdo_inq_record(streamID1, &varID, &levelID);
cdo_def_record(streamID2, varID, levelID);
if (dataIsUnchanged && !(tsID == 0 && haveConstVars)) { cdo_copy_record(streamID2, streamID1); }
else
{
size_t nmiss;
cdo_read_record(streamID1, array.data(), &nmiss);
cdo_write_record(streamID2, array.data(), nmiss);
if (tsID == 0 && haveConstVars)
{
const auto &var = varList1[varID];
if (var.isConstant)
{
varray_copy(var.gridsize, array, vars[varID][levelID].vec_d);
vars[varID][levelID].nmiss = nmiss;
}
}
}
}
tsID++;
tsID2++;
}
}
void
close()
{
if (streamID2 != CDO_STREAM_UNDEF) cdo_stream_close(streamID2);
cdo_stream_close(streamID1);
cdo_stream_close(streamID1);
vlistDestroy(vlistID2);
vlistDestroy(vlistID2);
cdo_finish();
cdo_finish();
}
};
void *
Splitdate(void *process)
{
ModuleSplitdate splitdate;
splitdate.init(process);
splitdate.run();
splitdate.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