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/naturalm.cc
[mareframe] / trunk / gadget / naturalm.cc Repository:
ViewVC logotype

View of /trunk/gadget/naturalm.cc

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1 - (download) (annotate)
Mon Feb 10 17:09:07 2014 UTC (10 years, 4 months ago) by agomez
File size: 3511 byte(s)
Initial version based on Gadget 2.2.00
#include "naturalm.h"
#include "readfunc.h"
#include "areatime.h"
#include "readword.h"
#include "keeper.h"
#include "errorhandler.h"
#include "gadget.h"
#include "global.h"

NaturalMortality::NaturalMortality(CommentStream& infile, int minage, int numage,
  const char* givenname, const IntVector& Areas, const TimeClass* const TimeInfo,
  Keeper* const keeper) : HasName(givenname), LivesOnAreas(Areas) {

  minStockAge = minage;
  readoption = 0;
  proportion.AddRows(areas.Size(), numage, 0.0);
  keeper->addString("naturalmortality");

  infile >> ws;
  char c = infile.peek();
  if ((c == 'm') || (c == 'M')) {
    //JMB experimental mortality function
    readoption = 1;
    char text[MaxStrLength];
    strncpy(text, "", MaxStrLength);
    readWordAndValue(infile, "mortalityfunction", text);
    if (strcasecmp(text, "constant") == 0)
      fnMortality = new ConstSelectFunc();
    else if (strcasecmp(text, "straightline") == 0)
      fnMortality = new StraightSelectFunc();
    else if (strcasecmp(text, "exponential") == 0)
      fnMortality = new ExpSelectFunc();
    else
      handle.logFileMessage(LOGFAIL, "unrecognised mortality function", text);
    fnMortality->readConstants(infile, TimeInfo, keeper);

  } else {
    mortality.setsize(numage);
    mortality.read(infile, TimeInfo, keeper);
  }

  keeper->clearLast();
}

NaturalMortality::~NaturalMortality() {
  if (readoption == 1)
    delete fnMortality;
}

void NaturalMortality::Reset(const TimeClass* const TimeInfo) {
  if (readoption == 0) {
    mortality.Update(TimeInfo);
    if (mortality.didChange(TimeInfo) || TimeInfo->didStepSizeChange()) {
      int i, j;
      for (i = 0; i < proportion.Nrow(); i++) {
        for (j = 0; j < proportion.Ncol(i); j++) {
          if (mortality[j] > verysmall)
            proportion[i][j] = exp(-mortality[j] * TimeInfo->getTimeStepSize());
          else
            proportion[i][j] = 1.0; //use mortality rate 0
        }
      }

      if (handle.getLogLevel() >= LOGMESSAGE)
        handle.logMessage(LOGMESSAGE, "Reset natural mortality data for stock", this->getName());
    }

  } else if (readoption == 1) {
    //JMB experimental mortality function
    fnMortality->updateConstants(TimeInfo);
    if (fnMortality->didChange(TimeInfo) || TimeInfo->didStepSizeChange()) {
      int i, j;
      double m;
      for (i = 0; i < proportion.Nrow(); i++) {
        for (j = 0; j < proportion.Ncol(i); j++) {
          m = fnMortality->calculate(double(minStockAge + j));
          if (m > verysmall)
            proportion[i][j] = exp(-m * TimeInfo->getTimeStepSize());
          else
            proportion[i][j] = 1.0; //use mortality rate 0
        }
      }

      if (handle.getLogLevel() >= LOGMESSAGE)
        handle.logMessage(LOGMESSAGE, "Reset natural mortality data for stock", this->getName());
    }

  } else
    handle.logMessage(LOGFAIL, "Error in natural mortality - unrecognised mortality function", readoption);
}

void NaturalMortality::Print(ofstream& outfile) {
  int i;
  outfile << "Natural mortality\n\t";
  if (readoption == 0) {
    for (i = 0; i < mortality.Size(); i++)
      outfile << mortality[i] << sep;
    outfile << endl;

  } else if (readoption == 1) {
    double m;
    for (i = 0; i < proportion.Ncol(); i++) {
      m = fnMortality->calculate(double(minStockAge + i));
      outfile << m << sep;
    }
    outfile << endl;

  } else
    handle.logMessage(LOGFAIL, "Error in natural mortality - unrecognised mortality function", readoption);
}

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

Powered By FusionForge