Skip to content

Commit

Permalink
Changed the way disturbance event data is passed (DM values, etc.) - …
Browse files Browse the repository at this point in the history
…now possible to change the disturbance type and code in modules as well as the DM values.
  • Loading branch information
mfellows committed Dec 12, 2024
1 parent 09e2362 commit 8173cc7
Show file tree
Hide file tree
Showing 12 changed files with 73 additions and 98 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -337,7 +337,21 @@ namespace moja {
double _proportion;
};

class CBMDisturbanceListener : public CBMModuleBase {
struct DisturbanceData {
DisturbanceData(std::string disturbanceType, int disturbanceCode,
const std::vector<CBMDistEventTransfer>& distMatrix,
int transitionId, const DynamicObject& metaData = DynamicObject())
: disturbanceType(disturbanceType), disturbanceCode(disturbanceCode),
distMatrix(distMatrix), transitionId(transitionId), metaData(metaData) {}

std::string disturbanceType;
int disturbanceCode = 0;
std::vector<CBMDistEventTransfer> distMatrix;
int transitionId = -1;
DynamicObject metaData;
};

class CBMDisturbanceListener : public CBMModuleBase {
public:
CBMDisturbanceListener() : CBMModuleBase() {
_disturbanceHistory = std::make_shared<std::deque<DisturbanceHistoryRecord>>();
Expand Down
15 changes: 6 additions & 9 deletions Source/moja.modules.cbm/src/cbmdisturbanceeventmodule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
********/

#include "moja/modules/cbm/cbmdisturbanceeventmodule.h"
#include "moja/modules/cbm/cbmdisturbancelistener.h"
#include "moja/modules/cbm/peatlands.h"
#include "moja/modules/cbm/peatlandgrowthcurve.h"

Expand Down Expand Up @@ -96,20 +97,16 @@ namespace moja {
* @return void
* ************************/
void CBMDisturbanceEventModule::doDisturbanceEvent(DynamicVar n) {
auto& data = n.extract<const DynamicObject>();
auto data = n.extract<std::shared_ptr<DisturbanceData>>();

// Get the disturbance type for either historical or last disturbance event.
std::string disturbanceType = data["disturbance"];
int disturbanceCode = data["disturbance_type_code"];

DynamicVar metadata = DynamicObject({
{ "disturbance", disturbanceType },
{ "disturbance_type_code", disturbanceCode }
});
{ "disturbance", data->disturbanceType },
{ "disturbance_type_code", data->disturbanceCode }
});

auto disturbanceEvent = _landUnitData->createProportionalOperation(metadata);
auto transferVec = data["transfers"].extract<std::shared_ptr<std::vector<CBMDistEventTransfer>>>();
for (const auto& transfer : *transferVec) {
for (const auto& transfer : data->distMatrix) {
auto srcPool = transfer.sourcePool();
auto dstPool = transfer.destPool();
if (srcPool != dstPool) {
Expand Down
53 changes: 19 additions & 34 deletions Source/moja.modules.cbm/src/cbmdisturbancelistener.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -125,8 +125,8 @@ namespace moja {
const auto& timing = _landUnitData->timing();
auto year = timing->curStartDate().year();

auto& data = n.extract<const DynamicObject>();
std::string disturbanceType = data["disturbance"];
auto data = n.extract<std::shared_ptr<DisturbanceData>>();
std::string disturbanceType = data->disturbanceType;

_disturbanceHistory->emplace_front(DisturbanceHistoryRecord{
disturbanceType, year, _age->value() });
Expand Down Expand Up @@ -458,26 +458,19 @@ namespace moja {
_landClass->set_value(landClassTransition);
}

auto distMatrix = std::make_shared<std::vector<CBMDistEventTransfer>>();
std::vector<CBMDistEventTransfer> distMatrix;

//if disturbance is applied in this peatland, prepare the event data object
//disturbance matrix will be injected by peatland disturbance module
auto data = DynamicObject({
{ "disturbance", e.disturbanceType() },
{ "disturbance_type_code", disturbanceTypeCode },
{ "transfers", distMatrix },
{ "transition", e.transitionRuleId() }
});

// Merge any additional metadata into disturbance data.
for (const auto& item : e.metadata()) {
if (!data.contains(item.first)) {
data[item.first] = item.second;
}
}
// Now fire the disturbance events.
auto data = std::make_shared<DisturbanceData>(e.disturbanceType(),
disturbanceTypeCode,
distMatrix,
e.transitionRuleId(),
e.metadata());

// Now fire the disturbance events.
_notificationCenter->postNotificationWithPostNotification(
moja::signals::DisturbanceEvent, (DynamicVar)data);
moja::signals::DisturbanceEvent, DynamicVar(data));
}

/**
Expand Down Expand Up @@ -523,32 +516,24 @@ namespace moja {
disturbanceTypeCode = code->second;
}

auto distMatrix = std::make_shared<std::vector<CBMDistEventTransfer>>();
std::vector<CBMDistEventTransfer> distMatrix;
{
const auto& it = _matrices.find(dmId);
const auto& operations = it->second;
for (const auto& transfer : operations) {
distMatrix->push_back(CBMDistEventTransfer(transfer));
distMatrix.push_back(CBMDistEventTransfer(transfer));
}
}

auto data = DynamicObject({
{ "disturbance", e.disturbanceType() },
{ "disturbance_type_code", disturbanceTypeCode },
{ "transfers", distMatrix },
{ "transition", e.transitionRuleId() }
});

// Merge any additional metadata into disturbance data.
for (const auto& item : e.metadata()) {
if (!data.contains(item.first)) {
data[item.first] = item.second;
}
}
auto data = std::make_shared<DisturbanceData>(e.disturbanceType(),
disturbanceTypeCode,
distMatrix,
e.transitionRuleId(),
e.metadata());

// Now fire the disturbance events.
_notificationCenter->postNotificationWithPostNotification(
moja::signals::DisturbanceEvent, (DynamicVar)data);
moja::signals::DisturbanceEvent, DynamicVar(data));
}

/**
Expand Down
5 changes: 3 additions & 2 deletions Source/moja.modules.cbm/src/cbmpartitioningmodule.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include "moja/modules/cbm/cbmpartitioningmodule.h"
#include "moja/modules/cbm/cbmdisturbancelistener.h"

#include <moja/flint/variable.h>
#include <moja/flint/timing.h>
Expand Down Expand Up @@ -159,8 +160,8 @@ namespace cbm {
* @return void
*/
void CBMPartitioningModule::doDisturbanceEvent(DynamicVar e) {
auto& data = e.extract<const DynamicObject>();
std::string disturbanceType = data["disturbance"];
auto data = e.extract<std::shared_ptr<DisturbanceData>>();
const auto& disturbanceType = data->disturbanceType;
auto mortality = _disturbanceMortality[disturbanceType][_spuId];
if (mortality < 0.2) {
doSmallDisturbanceEvent(disturbanceType, mortality);
Expand Down
13 changes: 5 additions & 8 deletions Source/moja.modules.cbm/src/cbmspinupdisturbancemodule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
* biomass is reduced to zero.
* ******/
#include "moja/modules/cbm/cbmspinupdisturbancemodule.h"
#include "moja/modules/cbm/cbmdisturbancelistener.h"
#include "moja/modules/cbm/cbmdisturbanceeventmodule.h"
#include "moja/modules/cbm/printpools.h"

Expand Down Expand Up @@ -73,10 +74,10 @@ namespace moja {
* @return void
* ************************/
void CBMSpinupDisturbanceModule::doDisturbanceEvent(DynamicVar n) {
auto& data = n.extract<const DynamicObject>();
auto data = n.extract<std::shared_ptr<DisturbanceData>>();

// Get the disturbance type for either historical or last disturbance event fired in spinup call
std::string disturbanceType = data["disturbance"];
std::string disturbanceType = data->disturbanceType;

bool runPeatland = false;
if (_landUnitData->hasVariable("enable_peatland") &&
Expand Down Expand Up @@ -107,9 +108,7 @@ namespace moja {

// in case of runing moss too
// use Moss DM transfers which are injected in MossDisturbanceModule
auto transferVec = data["transfers"].extract<std::shared_ptr<std::vector<CBMDistEventTransfer>>>();

for (const auto& transfer : *transferVec) {
for (const auto& transfer : data->distMatrix) {
auto srcPool = transfer.sourcePool();
auto dstPool = transfer.destPool();
auto portion = transfer.proportion();
Expand All @@ -120,9 +119,7 @@ namespace moja {
}
else {
// use peatland DM transfers which are injected in PeatlandDisturbanceModule
auto transferVec = data["transfers"].extract<std::shared_ptr<std::vector<CBMDistEventTransfer>>>();

for (const auto& transfer : *transferVec) {
for (const auto& transfer : data->distMatrix) {
auto srcPool = transfer.sourcePool();
auto dstPool = transfer.destPool();
if (srcPool != dstPool) {
Expand Down
10 changes: 4 additions & 6 deletions Source/moja.modules.cbm/src/cbmspinupsequencer.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#include "moja/modules/cbm/cbmspinupsequencer.h"
#include "moja/modules/cbm/cbmdisturbanceeventmodule.h"
#include "moja/modules/cbm/cbmdisturbancelistener.h"
#include "moja/modules/cbm/timeseries.h"
#include "moja/modules/cbm/peatlands.h"

Expand Down Expand Up @@ -830,17 +831,14 @@ namespace moja {
ILandUnitController& luc,
std::string disturbanceName) {
// Create a placeholder vector to keep the event pool transfers.
auto transfer = std::make_shared<std::vector<CBMDistEventTransfer>>();
std::vector<CBMDistEventTransfer> transfer;

// Fire the disturbance with the transfers vector to be filled in by
// any modules that build the disturbance matrix.
DynamicVar data = DynamicObject({
{ "disturbance", disturbanceName },
{ "transfers", transfer }
});
auto data = std::make_shared<DisturbanceData>(disturbanceName, 0, transfer, -1);

notificationCenter.postNotificationWithPostNotification(
moja::signals::DisturbanceEvent, data);
moja::signals::DisturbanceEvent, DynamicVar(data));
}

/**
Expand Down
10 changes: 4 additions & 6 deletions Source/moja.modules.cbm/src/cbmtransitionrulesmodule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
* as well as applying any regeneration delay which will prevent the stand from growing for a number of years after a disturbance.
* *******************************/
#include "moja/modules/cbm/cbmtransitionrulesmodule.h"
#include "moja/modules/cbm/cbmdisturbancelistener.h"

#include <moja/flint/ivariable.h>
#include <moja/signals.h>
Expand Down Expand Up @@ -171,14 +172,11 @@ namespace moja {
* @return void
* ************************/
void CBMTransitionRulesModule::doDisturbanceEvent(DynamicVar n) {
auto& data = n.extract<const DynamicObject>();
int transitionRuleId = -1;
if (data.contains("transition")) {
transitionRuleId = data["transition"];
}
auto data = n.extract<std::shared_ptr<DisturbanceData>>();
int transitionRuleId = data->transitionId;

if (_allowMatchingRules && transitionRuleId == -1) {
transitionRuleId = findTransitionRule(data["disturbance"]);
transitionRuleId = findTransitionRule(data->disturbanceType);
}

if (transitionRuleId == -1) {
Expand Down
6 changes: 3 additions & 3 deletions Source/moja.modules.cbm/src/disturbancemonitormodule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
* *******************/

#include "moja/modules/cbm/disturbancemonitormodule.h"
#include "moja/modules/cbm/cbmdisturbancelistener.h"

#include <moja/flint/ivariable.h>
#include <moja/logging.h>
Expand Down Expand Up @@ -87,9 +88,8 @@ namespace cbm {
return;
}

auto& data = e.extract<const DynamicObject>();
int distType = data["disturbance_type_code"].extract<int>();
_currentDisturbance->set_value(distType);
auto data = e.extract<std::shared_ptr<DisturbanceData>>();
_currentDisturbance->set_value(data->disturbanceCode);
}

}}} // namespace moja::modules::cbm
10 changes: 3 additions & 7 deletions Source/moja.modules.cbm/src/esgymspinupsequencer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -300,19 +300,15 @@ namespace cbm {
std::string disturbanceName) {

// Create a place holder vector to keep the event pool transfers.
auto transfer = std::make_shared<std::vector<CBMDistEventTransfer>>();
std::vector<CBMDistEventTransfer> transfer;
int distCode = _distTypeCodes.count(disturbanceName) == 0 ? -1 : _distTypeCodes[disturbanceName];

// Fire the disturbance with the transfers vector to be filled in by
// any modules that build the disturbance matrix.
DynamicVar data = DynamicObject({
{ "disturbance", disturbanceName },
{ "disturbance_type_code", distCode },
{ "transfers", transfer }
});
auto data = std::make_shared<DisturbanceData>(disturbanceName, distCode, transfer, -1);

notificationCenter.postNotificationWithPostNotification(
moja::signals::DisturbanceEvent, data);
moja::signals::DisturbanceEvent, DynamicVar(data));
}

/**
Expand Down
5 changes: 3 additions & 2 deletions Source/moja.modules.cbm/src/growthmultipliermodule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
* vary over time to represent degradation or enhancement of the stand. Growth multipliers are normally stored in the growth_multiplier_* tables in the GCBM input database
********************/
#include "moja/modules/cbm/growthmultipliermodule.h"
#include "moja/modules/cbm/cbmdisturbancelistener.h"

#include <moja/flint/ivariable.h>
#include <moja/logging.h>
Expand Down Expand Up @@ -175,8 +176,8 @@ namespace cbm {
return;
}

auto& data = e.extract<const DynamicObject>();
auto distType = data["disturbance"].convert<std::string>();
auto data = e.extract<std::shared_ptr<DisturbanceData>>();
const auto& distType = data->disturbanceType;
auto it = _growthMultiplierSets.find(distType);
_activeMultiplierSet = it == _growthMultiplierSets.end()
? GrowthMultiplierSet()
Expand Down
14 changes: 4 additions & 10 deletions Source/moja.modules.cbm/src/mossdisturbancemodule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
********************/
#include "moja/modules/cbm/mossdisturbancemodule.h"
#include "moja/modules/cbm/cbmdisturbanceeventmodule.h"
#include "moja/modules/cbm/cbmdisturbancelistener.h"
#include "moja/modules/cbm/helper.h"

#include <moja/flint/variable.h>
Expand Down Expand Up @@ -91,24 +92,17 @@ namespace moja {
void MossDisturbanceModule::doDisturbanceEvent(DynamicVar n) {
if (!_runMoss) { return; } //skip if not run moss

auto& data = n.extract<const DynamicObject>();

// Get the disturbance type for either historical or last disturbance event.
std::string disturbanceType = data["disturbance"];
const auto& dmAssociation = _dmAssociations.find(disturbanceType);

auto data = n.extract<std::shared_ptr<DisturbanceData>>();
const auto& dmAssociation = _dmAssociations.find(data->disturbanceType);
if (dmAssociation != _dmAssociations.end()) {
int dmId = dmAssociation->second;

//this disturbance is applied to the current moss layer
auto distMatrix = data["transfers"].extract<std::shared_ptr<std::vector<CBMDistEventTransfer>>>();


const auto& it = _matrices.find(dmId);
if (it != _matrices.end()) {
const auto& operations = it->second;
for (const auto& transfer : operations) {
distMatrix->push_back(CBMDistEventTransfer(transfer));
data->distMatrix.push_back(CBMDistEventTransfer(transfer));
}
}
else {
Expand Down
14 changes: 4 additions & 10 deletions Source/moja.modules.cbm/src/peatlanddisturbancemodule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -88,18 +88,12 @@ namespace moja {
* **********************************/
void PeatlandDisturbanceModule::doDisturbanceEvent(DynamicVar n) {
if (!_runPeatland) { return; }

auto& data = n.extract<const DynamicObject>();

// Get the disturbance type.
std::string disturbanceType = data["disturbance"];

const auto& dmAssociation = _dmAssociations.find(std::make_pair(_peatlandId, disturbanceType));

auto data = n.extract<std::shared_ptr<DisturbanceData>>();
const auto& dmAssociation = _dmAssociations.find(std::make_pair(_peatlandId, data->disturbanceType));
if (dmAssociation != _dmAssociations.end()) {

// this distubance type is applied to the current peatland
auto distMatrix = data["transfers"].extract<std::shared_ptr<std::vector<CBMDistEventTransfer>>>();

const auto& dmIDandWtdModifer = dmAssociation->second;
int dmId = dmIDandWtdModifer.first;
int wtdModifierId = dmIDandWtdModifer.second;
Expand All @@ -111,7 +105,7 @@ namespace moja {
if (it != _matrices.end()) {
const auto& operations = it->second;
for (const auto& transfer : operations) {
distMatrix->push_back(CBMDistEventTransfer(transfer));
data->distMatrix.push_back(CBMDistEventTransfer(transfer));
}
}
else {
Expand Down

0 comments on commit 8173cc7

Please sign in to comment.