#include "timevariable.h"
#include "errorhandler.h"
#include "readword.h"
#include "gadget.h"
#include "global.h"
void TimeVariable::read(CommentStream& infile,
const TimeClass* const TimeInfo, Keeper* const keeper) {
int i, check, tmpint;
char text[MaxStrLength];
strncpy(text, "", MaxStrLength);
i = 0;
while (!infile.eof()) {
infile >> ws >> tmpint;
years.resize(1, tmpint);
if (infile.fail())
handle.logFileMessage(LOGFAIL, "failed to read timevariable year");
infile >> ws >> tmpint;
steps.resize(1, tmpint);
if (infile.fail())
handle.logFileMessage(LOGFAIL, "failed to read timevariable step");
values.resize(1, keeper);
infile >> ws >> values[i];
if (infile.fail())
handle.logFileMessage(LOGFAIL, "failed to read timevariable value");
values[i].Inform(keeper);
infile >> ws;
i++;
}
handle.logMessage(LOGMESSAGE, "Read timevariable data - number of timesteps", years.Size());
//check if years and steps are ordered in time
for (i = 0; i < years.Size() - 1; i++)
if ((years[i + 1] < years[i]) ||
(years[i + 1] == years[i] && steps[i + 1] <= steps[i]))
handle.logMessage(LOGFAIL, "Error in timevariable - years and steps are not increasing");
check = -1;
for (i = 0; i < years.Size(); i++)
if (years[i] == TimeInfo->getFirstYear() && steps[i] == TimeInfo->getFirstStep())
check = i;
if (check == -1)
handle.logMessage(LOGFAIL, "Error in timevariable - nothing specified for first timestep of the simulation");
}
int TimeVariable::didChange(const TimeClass* const TimeInfo) {
if (TimeInfo->getTime() == 1)
return 1; //return true for the first timestep
return ((!(isEqual(lastvalue, value))) && (time == TimeInfo->getTime()));
}
void TimeVariable::Update(const TimeClass* const TimeInfo) {
if (TimeInfo->getTime() == 1)
timeid = 0;
int i;
for (i = timeid; i < steps.Size(); i++) {
if (steps[i] == TimeInfo->getStep() && years[i] == TimeInfo->getYear()) {
timeid = i;
time = TimeInfo->getTime();
break;
}
}
lastvalue = value;
value = values[timeid];
}
void TimeVariable::Delete(Keeper* const keeper) const {
int i;
for (i = 0; i < values.Size(); i++)
values[i].Delete(keeper);
}
void TimeVariable::Interchange(TimeVariable& newTV, Keeper* const keeper) const {
int i;
newTV.value = value;
newTV.lastvalue = lastvalue;
newTV.timeid = timeid;
newTV.time = time;
newTV.years = years;
newTV.steps = steps;
newTV.values.resize(values.Size(), keeper);
for (i = 0; i < steps.Size(); i++)
values[i].Interchange(newTV.values[i], keeper);
}