#include "ecosystem.h" #include "errorhandler.h" #include "gadget.h" #include "interruptinterface.h" #include "global.h" void Ecosystem::updatePredationOneArea(int area) { int i; // calculate the number of preys and predators in area. for (i = 0; i < basevec.Size(); i++) if (basevec[i]->isInArea(area)) basevec[i]->calcNumbers(area, TimeInfo); for (i = 0; i < basevec.Size(); i++) if (basevec[i]->isInArea(area)) basevec[i]->calcEat(area, Area, TimeInfo); for (i = 0; i < basevec.Size(); i++) if (basevec[i]->isInArea(area)) basevec[i]->checkEat(area, TimeInfo); for (i = 0; i < basevec.Size(); i++) if (basevec[i]->isInArea(area)) basevec[i]->adjustEat(area, TimeInfo); for (i = 0; i < basevec.Size(); i++) if (basevec[i]->isInArea(area)) basevec[i]->reducePop(area, TimeInfo); } void Ecosystem::updatePopulationOneArea(int area) { int i; // under updates are movements to mature stock, renewal, spawning and straying. for (i = 0; i < basevec.Size(); i++) if (basevec[i]->isInArea(area)) basevec[i]->Grow(area, Area, TimeInfo); for (i = 0; i < basevec.Size(); i++) if (basevec[i]->isInArea(area)) basevec[i]->updatePopulationPart1(area, TimeInfo); for (i = 0; i < basevec.Size(); i++) if (basevec[i]->isInArea(area)) basevec[i]->updatePopulationPart2(area, TimeInfo); for (i = 0; i < basevec.Size(); i++) if (basevec[i]->isInArea(area)) basevec[i]->updatePopulationPart3(area, TimeInfo); for (i = 0; i < basevec.Size(); i++) if (basevec[i]->isInArea(area)) basevec[i]->updatePopulationPart4(area, TimeInfo); for (i = 0; i < basevec.Size(); i++) if (basevec[i]->isInArea(area)) basevec[i]->updatePopulationPart5(area, TimeInfo); } void Ecosystem::updateAgesOneArea(int area) { int i; // age related update and movements between stocks. for (i = 0; i < basevec.Size(); i++) if (basevec[i]->isInArea(area)) basevec[i]->updateAgePart1(area, TimeInfo); for (i = 0; i < basevec.Size(); i++) if (basevec[i]->isInArea(area)) basevec[i]->updateAgePart2(area, TimeInfo); for (i = 0; i < basevec.Size(); i++) if (basevec[i]->isInArea(area)) basevec[i]->updateAgePart3(area, TimeInfo); } void Ecosystem::Simulate(int print) { int i, j, k; handle.logMessage(LOGMESSAGE, ""); //write blank line to log file for (j = 0; j < likevec.Size(); j++) likevec[j]->Reset(keeper); for (j = 0; j < likevec.Size(); j++) likevec[j]->addLikelihoodKeeper(TimeInfo, keeper); for (j = 0; j < tagvec.Size(); j++) tagvec[j]->Reset(); TimeInfo->Reset(); for (i = 0; i < TimeInfo->numTotalSteps(); i++) { for (j = 0; j < basevec.Size(); j++) basevec[j]->Reset(TimeInfo); // add in any new tagging experiments tagvec.updateTags(TimeInfo); if (print) for (j = 0; j < printvec.Size(); j++) printvec[j]->Print(TimeInfo, 1); //start of timestep, so printtime is 1 // migration between areas if (Area->numAreas() > 1) //no migration if there is only one area for (j = 0; j < basevec.Size(); j++) basevec[j]->Migrate(TimeInfo); // predation can be split into substeps for (k = 0; k < TimeInfo->numSubSteps(); k++) { for (j = 0; j < Area->numAreas(); j++) this->updatePredationOneArea(j); TimeInfo->IncrementSubstep(); } // maturation, spawning, recruits etc for (j = 0; j < Area->numAreas(); j++) this->updatePopulationOneArea(j); for (j = 0; j < likevec.Size(); j++){ likevec[j]->addLikelihood(TimeInfo); // cout << "likelihood:" <getUnweightedLikelihood() << endl; } // cout << "###################################" << endl; if (print) for (j = 0; j < printvec.Size(); j++) printvec[j]->Print(TimeInfo, 0); //end of timestep, so printtime is 0 for (j = 0; j < Area->numAreas(); j++) this->updateAgesOneArea(j); #ifdef INTERRUPT_HANDLER if (interrupted) { InterruptInterface ui; if (!ui.menu()) { handle.logMessage(LOGMESSAGE, "\n** Gadget interrupted - quitting current simulation **"); char interruptfile[15]; strncpy(interruptfile, "", 15); strcpy(interruptfile, "interrupt.out"); this->writeParams(interruptfile, 0); handle.logMessage(LOGMESSAGE, "** Gadget interrupted - quitting current simulation **"); exit(EXIT_SUCCESS); } interrupted = 0; } #endif // remove any expired tagging experiments tagvec.deleteTags(TimeInfo); // increase the time in the simulation TimeInfo->IncrementTime(); } // remove all the tagging experiments - they must have expired now tagvec.deleteAllTags(); likelihood = 0.0; for (j = 0; j < likevec.Size(); j++) likelihood += likevec[j]->getLikelihood(); if (handle.getLogLevel() >= LOGMESSAGE) { handle.logMessage(LOGMESSAGE, "\nThe current likelihood scores for each component are:"); for (j = 0; j < likevec.Size(); j++) handle.logMessage(LOGMESSAGE, likevec[j]->getName(), likevec[j]->getLikelihood()); handle.logMessage(LOGMESSAGE, "\nThe current overall likelihood score is", likelihood); } }