32 |
keeper->clearLast(); |
keeper->clearLast(); |
33 |
} |
} |
34 |
|
|
35 |
void GrowthCalcA::calcGrowth(int area, DoubleVector& Lgrowth, DoubleVector& Wgrowth, |
void GrowthCalcA::calcGrowth(int area, double* Lgrowth, double* Wgrowth, |
36 |
const PopInfoVector& numGrow, const AreaClass* const Area, |
const PopInfoVector& numGrow, const AreaClass* const Area, |
37 |
const TimeClass* const TimeInfo, const DoubleVector& Fphi, |
const TimeClass* const TimeInfo, const DoubleVector& Fphi, |
38 |
const DoubleVector& MaxCon, const LengthGroupDivision* const LgrpDiv) { |
const DoubleVector& MaxCon, const LengthGroupDivision* const LgrpDiv, int size) { |
39 |
|
|
40 |
growthPar.Update(TimeInfo); |
growthPar.Update(TimeInfo); |
41 |
double tempL = TimeInfo->getTimeStepSize() * growthPar[0] * |
double tempL = TimeInfo->getTimeStepSize() * growthPar[0] * |
44 |
(growthPar[7] * Area->getTemperature(area, TimeInfo->getTime()) + growthPar[8]); |
(growthPar[7] * Area->getTemperature(area, TimeInfo->getTime()) + growthPar[8]); |
45 |
|
|
46 |
int i; |
int i; |
47 |
for (i = 0; i < Lgrowth.Size(); i++) { |
for (i = 0; i < size; i++) { |
48 |
Lgrowth[i] = tempL * pow(LgrpDiv->meanLength(i), growthPar[1]) * Fphi[i]; |
Lgrowth[i] = tempL * pow(LgrpDiv->meanLength(i), growthPar[1]) * Fphi[i]; |
49 |
if (Lgrowth[i] < 0.0) |
if (Lgrowth[i] < 0.0) |
50 |
Lgrowth[i] = 0.0; |
Lgrowth[i] = 0.0; |
111 |
} |
} |
112 |
} |
} |
113 |
|
|
114 |
void GrowthCalcB::calcGrowth(int area, DoubleVector& Lgrowth, DoubleVector& Wgrowth, |
void GrowthCalcB::calcGrowth(int area, double* Lgrowth, double* Wgrowth, |
115 |
const PopInfoVector& numGrow, const AreaClass* const Area, |
const PopInfoVector& numGrow, const AreaClass* const Area, |
116 |
const TimeClass* const TimeInfo, const DoubleVector& Fphi, |
const TimeClass* const TimeInfo, const DoubleVector& Fphi, |
117 |
const DoubleVector& MaxCon, const LengthGroupDivision* const LgrpDiv) { |
const DoubleVector& MaxCon, const LengthGroupDivision* const LgrpDiv, int size) { |
118 |
|
|
119 |
int i, inarea = this->areaNum(area); |
int i, inarea = this->areaNum(area); |
120 |
for (i = 0; i < Lgrowth.Size(); i++) { |
for (i = 0; i < size; i++) { |
121 |
Lgrowth[i] = (*lgrowth[inarea])[TimeInfo->getTime()][i]; |
Lgrowth[i] = (*lgrowth[inarea])[TimeInfo->getTime()][i]; |
122 |
Wgrowth[i] = (*wgrowth[inarea])[TimeInfo->getTime()][i]; |
Wgrowth[i] = (*wgrowth[inarea])[TimeInfo->getTime()][i]; |
123 |
if ((handle.getLogLevel() >= LOGWARN) && ((Lgrowth[i] < 0.0) || (Wgrowth[i] < 0.0))) |
if ((handle.getLogLevel() >= LOGWARN) && ((Lgrowth[i] < 0.0) || (Wgrowth[i] < 0.0))) |
192 |
* final form of the function is |
* final form of the function is |
193 |
* dw/dt = a0*exp(a1*T)*((w/a2)^a4 - (w/a3)^a5) |
* dw/dt = a0*exp(a1*T)*((w/a2)^a4 - (w/a3)^a5) |
194 |
* For no temperature dependency a1 = 0 */ |
* For no temperature dependency a1 = 0 */ |
195 |
void GrowthCalcC::calcGrowth(int area, DoubleVector& Lgrowth, DoubleVector& Wgrowth, |
void GrowthCalcC::calcGrowth(int area, double* Lgrowth, double* Wgrowth, |
196 |
const PopInfoVector& numGrow, const AreaClass* const Area, |
const PopInfoVector& numGrow, const AreaClass* const Area, |
197 |
const TimeClass* const TimeInfo, const DoubleVector& Fphi, |
const TimeClass* const TimeInfo, const DoubleVector& Fphi, |
198 |
const DoubleVector& MaxCon, const LengthGroupDivision* const LgrpDiv) { |
const DoubleVector& MaxCon, const LengthGroupDivision* const LgrpDiv, int size) { |
199 |
|
|
200 |
wgrowthPar.Update(TimeInfo); |
wgrowthPar.Update(TimeInfo); |
201 |
lgrowthPar.Update(TimeInfo); |
lgrowthPar.Update(TimeInfo); |
216 |
double tempW = TimeInfo->getTimeStepSize() * wgrowthPar[0] * |
double tempW = TimeInfo->getTimeStepSize() * wgrowthPar[0] * |
217 |
exp(wgrowthPar[1] * Area->getTemperature(area, TimeInfo->getTime())); |
exp(wgrowthPar[1] * Area->getTemperature(area, TimeInfo->getTime())); |
218 |
|
|
219 |
for (i = 0; i < Wgrowth.Size(); i++) { |
for (i = 0; i < size; i++) { |
220 |
if (numGrow[i].W < verysmall || isZero(tempW)) { |
if (numGrow[i].W < verysmall || isZero(tempW)) { |
221 |
Wgrowth[i] = 0.0; |
Wgrowth[i] = 0.0; |
222 |
Lgrowth[i] = 0.0; |
Lgrowth[i] = 0.0; |
308 |
* part is derived from the weight increase part by assuming a formula |
* part is derived from the weight increase part by assuming a formula |
309 |
* w = a*l^b. If the weight is below the curve no length increase takes place |
* w = a*l^b. If the weight is below the curve no length increase takes place |
310 |
* but instead the weight increases until it reaches the curve. */ |
* but instead the weight increases until it reaches the curve. */ |
311 |
void GrowthCalcD::calcGrowth(int area, DoubleVector& Lgrowth, DoubleVector& Wgrowth, |
void GrowthCalcD::calcGrowth(int area, double* Lgrowth, double* Wgrowth, |
312 |
const PopInfoVector& numGrow, const AreaClass* const Area, |
const PopInfoVector& numGrow, const AreaClass* const Area, |
313 |
const TimeClass* const TimeInfo, const DoubleVector& Fphi, |
const TimeClass* const TimeInfo, const DoubleVector& Fphi, |
314 |
const DoubleVector& MaxCon, const LengthGroupDivision* const LgrpDiv) { |
const DoubleVector& MaxCon, const LengthGroupDivision* const LgrpDiv, int size) { |
315 |
|
|
316 |
wgrowthPar.Update(TimeInfo); |
wgrowthPar.Update(TimeInfo); |
317 |
lgrowthPar.Update(TimeInfo); |
lgrowthPar.Update(TimeInfo); |
332 |
double tempW = TimeInfo->getTimeStepSize() * wgrowthPar[2] * |
double tempW = TimeInfo->getTimeStepSize() * wgrowthPar[2] * |
333 |
exp(wgrowthPar[4] * Area->getTemperature(area, TimeInfo->getTime()) + wgrowthPar[5]); |
exp(wgrowthPar[4] * Area->getTemperature(area, TimeInfo->getTime()) + wgrowthPar[5]); |
334 |
|
|
335 |
for (i = 0; i < Wgrowth.Size(); i++) { |
for (i = 0; i < size; i++) { |
336 |
if (numGrow[i].W < verysmall) { |
if (numGrow[i].W < verysmall) { |
337 |
Wgrowth[i] = 0.0; |
Wgrowth[i] = 0.0; |
338 |
Lgrowth[i] = 0.0; |
Lgrowth[i] = 0.0; |
456 |
* AreaEffect |
* AreaEffect |
457 |
* StepEffect |
* StepEffect |
458 |
* Length increase is upgraded in the same way as earlier. */ |
* Length increase is upgraded in the same way as earlier. */ |
459 |
void GrowthCalcE::calcGrowth(int area, DoubleVector& Lgrowth, DoubleVector& Wgrowth, |
void GrowthCalcE::calcGrowth(int area, double* Lgrowth, double* Wgrowth, |
460 |
const PopInfoVector& numGrow, const AreaClass* const Area, |
const PopInfoVector& numGrow, const AreaClass* const Area, |
461 |
const TimeClass* const TimeInfo, const DoubleVector& Fphi, |
const TimeClass* const TimeInfo, const DoubleVector& Fphi, |
462 |
const DoubleVector& MaxCon, const LengthGroupDivision* const LgrpDiv) { |
const DoubleVector& MaxCon, const LengthGroupDivision* const LgrpDiv, int size) { |
463 |
|
|
464 |
wgrowthPar.Update(TimeInfo); |
wgrowthPar.Update(TimeInfo); |
465 |
lgrowthPar.Update(TimeInfo); |
lgrowthPar.Update(TimeInfo); |
482 |
double tempW = factor * TimeInfo->getTimeStepSize() * wgrowthPar[0] * |
double tempW = factor * TimeInfo->getTimeStepSize() * wgrowthPar[0] * |
483 |
exp(wgrowthPar[1] * Area->getTemperature(area, TimeInfo->getTime())); |
exp(wgrowthPar[1] * Area->getTemperature(area, TimeInfo->getTime())); |
484 |
|
|
485 |
for (i = 0; i < Wgrowth.Size(); i++) { |
for (i = 0; i < size; i++) { |
486 |
if (numGrow[i].W < verysmall || isZero(tempW)) { |
if (numGrow[i].W < verysmall || isZero(tempW)) { |
487 |
Wgrowth[i] = 0.0; |
Wgrowth[i] = 0.0; |
488 |
Lgrowth[i] = 0.0; |
Lgrowth[i] = 0.0; |
555 |
delete wgrowth[a]; |
delete wgrowth[a]; |
556 |
} |
} |
557 |
|
|
558 |
void GrowthCalcF::calcGrowth(int area, DoubleVector& Lgrowth, DoubleVector& Wgrowth, |
void GrowthCalcF::calcGrowth(int area, double* Lgrowth, double* Wgrowth, |
559 |
const PopInfoVector& numGrow, const AreaClass* const Area, |
const PopInfoVector& numGrow, const AreaClass* const Area, |
560 |
const TimeClass* const TimeInfo, const DoubleVector& Fphi, |
const TimeClass* const TimeInfo, const DoubleVector& Fphi, |
561 |
const DoubleVector& MaxCon, const LengthGroupDivision* const LgrpDiv) { |
const DoubleVector& MaxCon, const LengthGroupDivision* const LgrpDiv, int size) { |
562 |
|
|
563 |
growthPar.Update(TimeInfo); |
growthPar.Update(TimeInfo); |
564 |
int i, t, inarea; |
int i, t, inarea; |
566 |
inarea = this->areaNum(area); |
inarea = this->areaNum(area); |
567 |
double kval = 1.0 - exp(-growthPar[1] * TimeInfo->getTimeStepSize()); |
double kval = 1.0 - exp(-growthPar[1] * TimeInfo->getTimeStepSize()); |
568 |
|
|
569 |
for (i = 0; i < Lgrowth.Size(); i++) { |
for (i = 0; i < size; i++) { |
570 |
Lgrowth[i] = (growthPar[0] - LgrpDiv->meanLength(i)) * kval; |
Lgrowth[i] = (growthPar[0] - LgrpDiv->meanLength(i)) * kval; |
571 |
Wgrowth[i] = (*wgrowth[inarea])[t][i]; |
Wgrowth[i] = (*wgrowth[inarea])[t][i]; |
572 |
if ((handle.getLogLevel() >= LOGWARN) && (Wgrowth[i] < 0.0)) |
if ((handle.getLogLevel() >= LOGWARN) && (Wgrowth[i] < 0.0)) |
619 |
delete wgrowth[a]; |
delete wgrowth[a]; |
620 |
} |
} |
621 |
|
|
622 |
void GrowthCalcG::calcGrowth(int area, DoubleVector& Lgrowth, DoubleVector& Wgrowth, |
void GrowthCalcG::calcGrowth(int area, double* Lgrowth, double* Wgrowth, |
623 |
const PopInfoVector& numGrow, const AreaClass* const Area, |
const PopInfoVector& numGrow, const AreaClass* const Area, |
624 |
const TimeClass* const TimeInfo, const DoubleVector& Fphi, |
const TimeClass* const TimeInfo, const DoubleVector& Fphi, |
625 |
const DoubleVector& MaxCon, const LengthGroupDivision* const LgrpDiv) { |
const DoubleVector& MaxCon, const LengthGroupDivision* const LgrpDiv, int size) { |
626 |
|
|
627 |
//written by kgf 24/10 00 |
//written by kgf 24/10 00 |
628 |
//Gives linear growth (growthPar[0] == 0) or |
//Gives linear growth (growthPar[0] == 0) or |
637 |
handle.logMessage(LOGWARN, "Warning in growth calculation - growth parameter is positive"); |
handle.logMessage(LOGWARN, "Warning in growth calculation - growth parameter is positive"); |
638 |
|
|
639 |
if (isZero(growthPar[0])) { |
if (isZero(growthPar[0])) { |
640 |
for (i = 0; i < Lgrowth.Size(); i++) { |
for (i = 0; i < size; i++) { |
641 |
Lgrowth[i] = kval; |
Lgrowth[i] = kval; |
642 |
Wgrowth[i] = (*wgrowth[inarea])[t][i]; |
Wgrowth[i] = (*wgrowth[inarea])[t][i]; |
643 |
if ((handle.getLogLevel() >= LOGWARN) && (Wgrowth[i] < 0.0)) |
if ((handle.getLogLevel() >= LOGWARN) && (Wgrowth[i] < 0.0)) |
644 |
handle.logMessage(LOGWARN, "Warning in growth calculation - weight growth parameter is negative"); |
handle.logMessage(LOGWARN, "Warning in growth calculation - weight growth parameter is negative"); |
645 |
} |
} |
646 |
} else if (isEqual(growthPar[0], 1.0)) { |
} else if (isEqual(growthPar[0], 1.0)) { |
647 |
for (i = 0; i < Lgrowth.Size(); i++) { |
for (i = 0; i < size; i++) { |
648 |
Lgrowth[i] = kval * LgrpDiv->meanLength(i); |
Lgrowth[i] = kval * LgrpDiv->meanLength(i); |
649 |
Wgrowth[i] = (*wgrowth[inarea])[t][i]; |
Wgrowth[i] = (*wgrowth[inarea])[t][i]; |
650 |
if ((handle.getLogLevel() >= LOGWARN) && (Wgrowth[i] < 0.0)) |
if ((handle.getLogLevel() >= LOGWARN) && (Wgrowth[i] < 0.0)) |
651 |
handle.logMessage(LOGWARN, "Warning in growth calculation - weight growth parameter is negative"); |
handle.logMessage(LOGWARN, "Warning in growth calculation - weight growth parameter is negative"); |
652 |
} |
} |
653 |
} else { |
} else { |
654 |
for (i = 0; i < Lgrowth.Size(); i++) { |
for (i = 0; i < size; i++) { |
655 |
Lgrowth[i] = kval * pow(LgrpDiv->meanLength(i), growthPar[0]); |
Lgrowth[i] = kval * pow(LgrpDiv->meanLength(i), growthPar[0]); |
656 |
Wgrowth[i] = (*wgrowth[inarea])[t][i]; |
Wgrowth[i] = (*wgrowth[inarea])[t][i]; |
657 |
if ((handle.getLogLevel() >= LOGWARN) && (Wgrowth[i] < 0.0)) |
if ((handle.getLogLevel() >= LOGWARN) && (Wgrowth[i] < 0.0)) |
681 |
|
|
682 |
/* Simplified 2 parameter length based Von Bertalanffy growth function |
/* Simplified 2 parameter length based Von Bertalanffy growth function |
683 |
* compare with GrowthCalcC for the more complex weight based version */ |
* compare with GrowthCalcC for the more complex weight based version */ |
|
void GrowthCalcH::calcGrowth(int area, DoubleVector& Lgrowth, DoubleVector& Wgrowth, |
|
|
const PopInfoVector& numGrow, const AreaClass* const Area, |
|
|
const TimeClass* const TimeInfo, const DoubleVector& Fphi, |
|
|
const DoubleVector& MaxCon, const LengthGroupDivision* const LgrpDiv) { |
|
|
|
|
|
growthPar.Update(TimeInfo); |
|
|
//JMB - first some error checking |
|
|
if ((handle.getLogLevel() >= LOGWARN) && (growthPar.didChange(TimeInfo))) { |
|
|
if (isZero(growthPar[1]) || isZero(growthPar[2])) |
|
|
handle.logMessage(LOGWARN, "Warning in growth calculation - growth parameter is zero"); |
|
|
if (LgrpDiv->maxLength() > growthPar[0]) |
|
|
handle.logMessage(LOGWARN, "Warning in growth calculation - length greater than length infinity"); |
|
|
} |
|
|
|
|
|
double mult = 1.0 - exp(-growthPar[1] * TimeInfo->getTimeStepSize()); |
|
|
int i; |
|
|
for (i = 0; i < Lgrowth.Size(); i++) |
|
|
Lgrowth[i] = (growthPar[0] - LgrpDiv->meanLength(i)) * mult; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
684 |
void GrowthCalcH::calcGrowth(int area, double* Lgrowth, double* Wgrowth, |
void GrowthCalcH::calcGrowth(int area, double* Lgrowth, double* Wgrowth, |
685 |
const PopInfoVector& numGrow, const AreaClass* const Area, |
const PopInfoVector& numGrow, const AreaClass* const Area, |
686 |
const TimeClass* const TimeInfo, const DoubleVector& Fphi, |
const TimeClass* const TimeInfo, const DoubleVector& Fphi, |
726 |
|
|
727 |
/* Simplified 4 parameter Jones growth function |
/* Simplified 4 parameter Jones growth function |
728 |
* compare with GrowthCalcD for the more complex version */ |
* compare with GrowthCalcD for the more complex version */ |
729 |
void GrowthCalcI::calcGrowth(int area, DoubleVector& Lgrowth, DoubleVector& Wgrowth, |
void GrowthCalcI::calcGrowth(int area, double* Lgrowth, double* Wgrowth, |
730 |
const PopInfoVector& numGrow, const AreaClass* const Area, |
const PopInfoVector& numGrow, const AreaClass* const Area, |
731 |
const TimeClass* const TimeInfo, const DoubleVector& Fphi, |
const TimeClass* const TimeInfo, const DoubleVector& Fphi, |
732 |
const DoubleVector& MaxCon, const LengthGroupDivision* const LgrpDiv) { |
const DoubleVector& MaxCon, const LengthGroupDivision* const LgrpDiv, int size) { |
733 |
|
|
734 |
growthPar.Update(TimeInfo); |
growthPar.Update(TimeInfo); |
735 |
//JMB - first some error checking |
//JMB - first some error checking |
745 |
exp(growthPar[3] * Area->getTemperature(area, TimeInfo->getTime())); |
exp(growthPar[3] * Area->getTemperature(area, TimeInfo->getTime())); |
746 |
|
|
747 |
int i; |
int i; |
748 |
for (i = 0; i < Wgrowth.Size(); i++) { |
for (i = 0; i < size; i++) { |
749 |
if (numGrow[i].W < verysmall) { |
if (numGrow[i].W < verysmall) { |
750 |
Wgrowth[i] = 0.0; |
Wgrowth[i] = 0.0; |
751 |
Lgrowth[i] = 0.0; |
Lgrowth[i] = 0.0; |
785 |
/* Simplified 2 parameter length based Von Bertalanffy growth function |
/* Simplified 2 parameter length based Von Bertalanffy growth function |
786 |
* compare with GrowthCalcC for the more complex weight based version |
* compare with GrowthCalcC for the more complex weight based version |
787 |
* with a non-zero value for t0 (compare to GrowthCalcH for simpler version */ |
* with a non-zero value for t0 (compare to GrowthCalcH for simpler version */ |
788 |
void GrowthCalcJ::calcGrowth(int area, DoubleVector& Lgrowth, DoubleVector& Wgrowth, |
void GrowthCalcJ::calcGrowth(int area, double* Lgrowth, double* Wgrowth, |
789 |
const PopInfoVector& numGrow, const AreaClass* const Area, |
const PopInfoVector& numGrow, const AreaClass* const Area, |
790 |
const TimeClass* const TimeInfo, const DoubleVector& Fphi, |
const TimeClass* const TimeInfo, const DoubleVector& Fphi, |
791 |
const DoubleVector& MaxCon, const LengthGroupDivision* const LgrpDiv) { |
const DoubleVector& MaxCon, const LengthGroupDivision* const LgrpDiv, int size) { |
792 |
|
|
793 |
growthPar.Update(TimeInfo); |
growthPar.Update(TimeInfo); |
794 |
//JMB - first some error checking |
//JMB - first some error checking |
801 |
|
|
802 |
double mult = 1.0 - exp(-growthPar[1] * TimeInfo->getTimeStepSize()); |
double mult = 1.0 - exp(-growthPar[1] * TimeInfo->getTimeStepSize()); |
803 |
int i; |
int i; |
804 |
for (i = 0; i < Lgrowth.Size(); i++) |
for (i = 0; i < size; i++) |
805 |
Lgrowth[i] = (growthPar[0] - LgrpDiv->meanLength(i)) * mult; |
Lgrowth[i] = (growthPar[0] - LgrpDiv->meanLength(i)) * mult; |
806 |
} |
} |
807 |
|
|
825 |
} |
} |
826 |
|
|
827 |
/* Simplified length based Gompertz growth function */ |
/* Simplified length based Gompertz growth function */ |
828 |
void GrowthCalcK::calcGrowth(int area, DoubleVector& Lgrowth, DoubleVector& Wgrowth, |
void GrowthCalcK::calcGrowth(int area, double* Lgrowth, double* Wgrowth, |
829 |
const PopInfoVector& numGrow, const AreaClass* const Area, |
const PopInfoVector& numGrow, const AreaClass* const Area, |
830 |
const TimeClass* const TimeInfo, const DoubleVector& Fphi, |
const TimeClass* const TimeInfo, const DoubleVector& Fphi, |
831 |
const DoubleVector& MaxCon, const LengthGroupDivision* const LgrpDiv) { |
const DoubleVector& MaxCon, const LengthGroupDivision* const LgrpDiv, int size) { |
832 |
|
|
833 |
growthPar.Update(TimeInfo); |
growthPar.Update(TimeInfo); |
834 |
//JMB - first some error checking |
//JMB - first some error checking |
841 |
|
|
842 |
double mult = 1.0 - exp(-growthPar[1] * TimeInfo->getTimeStepSize()); |
double mult = 1.0 - exp(-growthPar[1] * TimeInfo->getTimeStepSize()); |
843 |
int i; |
int i; |
844 |
for (i = 0; i < Lgrowth.Size(); i++) |
for (i = 0; i < size; i++) |
845 |
Lgrowth[i] = (growthPar[0] - LgrpDiv->meanLength(i)) * mult; |
Lgrowth[i] = (growthPar[0] - LgrpDiv->meanLength(i)) * mult; |
846 |
} |
} |