Log In | Get Help   
Home My Page Projects Code Snippets Project Openings Mareframe
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files
[mareframe] View of /trunk/gadget/simulation.cc
[mareframe] / trunk / gadget / simulation.cc Repository:
ViewVC logotype

View of /trunk/gadget/simulation.cc

Parent Directory Parent Directory | Revision Log Revision Log


Revision 17 - (download) (annotate)
Mon Nov 9 10:22:57 2015 UTC (8 years, 6 months ago) by ulcessvp
File size: 5260 byte(s)
Ahora la version OpenMP permite el realizar ctrl-c. Corregido el error en el que no siempre se imprimian bien el likelihood final con SA en el fichero de salida params.out.
#include "ecosystem.h"
#include "errorhandler.h"
#include "gadget.h"
#include "interruptinterface.h"
#include "global.h"

#ifdef INTERRUPT_HANDLER
extern volatile int interrupted;
extern volatile int interrupted_print;
extern Ecosystem* EcoSystem;
#endif


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);
    }

    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");
        EcoSystem->writeParams(interruptfile, 0);
        handle.logMessage(LOGMESSAGE, "** Gadget interrupted - quitting current simulation **");
        exit(EXIT_SUCCESS);
      }
      interrupted = 0;
      interrupted_print = 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);
  }
}

root@forge.cesga.es
ViewVC Help
Powered by ViewVC 1.0.0  

Powered By FusionForge