#include "linearpredator.h" #include "keeper.h" #include "prey.h" #include "mathfunc.h" #include "errorhandler.h" #include "gadget.h" #include "global.h" LinearPredator::LinearPredator(CommentStream& infile, const char* givenname, const IntVector& Areas, const TimeClass* const TimeInfo, Keeper* const keeper, Formula multscaler) : LengthPredator(givenname, Areas, keeper, multscaler) { type = LINEARPREDATOR; keeper->addString("predator"); keeper->addString(givenname); this->readSuitability(infile, TimeInfo, keeper); keeper->clearLast(); keeper->clearLast(); } void LinearPredator::Eat(int area, const AreaClass* const Area, const TimeClass* const TimeInfo) { int inarea = this->areaNum(area); int prey, preyl; int predl = 0; //JMB there is only ever one length group ... totalcons[inarea][predl] = 0.0; double tmp; tmp = prednumber[inarea][predl].N * multi * TimeInfo->getTimeStepSize() / TimeInfo->numSubSteps(); if (isZero(tmp)) //JMB no predation takes place on this timestep return; if (tmp > 10.0) //JMB arbitrary value here ... handle.logMessage(LOGWARN, "Warning in linearpredator - excessive consumption required"); for (prey = 0; prey < this->numPreys(); prey++) { if (this->getPrey(prey)->isPreyArea(area)) { (*predratio[inarea])[prey][predl] = tmp; for (preyl = 0; preyl < (*cons[inarea][prey])[predl].Size(); preyl++) { (*cons[inarea][prey])[predl][preyl] = (*predratio[inarea])[prey][predl] * this->getSuitability(prey)[predl][preyl] * this->getPrey(prey)->getBiomass(area, preyl); totalcons[inarea][predl] += (*cons[inarea][prey])[predl][preyl]; } //inform the preys of the consumption this->getPrey(prey)->addBiomassConsumption(area, (*cons[inarea][prey])[predl]); } else { for (preyl = 0; preyl < (*cons[inarea][prey])[predl].Size(); preyl++) (*cons[inarea][prey])[predl][preyl] = 0.0; } } } void LinearPredator::adjustConsumption(int area, const TimeClass* const TimeInfo) { int prey, preyl; int inarea = this->areaNum(area); int predl = 0; //JMB there is only ever one length group ... overcons[inarea][predl] = 0.0; if (isZero(totalcons[inarea][predl])) //JMB no predation takes place on this timestep return; double maxRatio, tmp; maxRatio = TimeInfo->getMaxRatioConsumed(); for (prey = 0; prey < this->numPreys(); prey++) { if (this->getPrey(prey)->isOverConsumption(area)) { hasoverconsumption[inarea] = 1; DoubleVector ratio = this->getPrey(prey)->getRatio(area); for (preyl = 0; preyl < (*cons[inarea][prey])[predl].Size(); preyl++) { if (ratio[preyl] > maxRatio) { tmp = maxRatio / ratio[preyl]; overcons[inarea][predl] += (1.0 - tmp) * (*cons[inarea][prey])[predl][preyl]; (*cons[inarea][prey])[predl][preyl] *= tmp; (*usesuit[inarea][prey])[predl][preyl] *= tmp; } } } } if (hasoverconsumption[inarea]) { totalcons[inarea][predl] -= overcons[inarea][predl]; overconsumption[inarea][predl] += overcons[inarea][predl]; } totalconsumption[inarea][predl] += totalcons[inarea][predl]; for (prey = 0; prey < this->numPreys(); prey++) if (this->getPrey(prey)->isPreyArea(area)) for (preyl = 0; preyl < (*cons[inarea][prey])[predl].Size(); preyl++) (*consumption[inarea][prey])[predl][preyl] += (*cons[inarea][prey])[predl][preyl]; } void LinearPredator::Print(ofstream& outfile) const { outfile << "LinearPredator\n"; PopPredator::Print(outfile); }