FFSM++
1.1.0
French Forest Sector Model ++
|
The core of the model (spatial version). More...
#include <ModelCoreSpatial.h>
Public Member Functions | |
ModelCoreSpatial (ThreadManager *MTHREAD_h) | |
~ModelCoreSpatial () | |
void | runInitPeriod () |
void | runSimulationYear () |
void | initMarketModule () |
computes st and pw for second year and several needed-only-at-t0-vars for the market module More... | |
void | runMarketModule () |
computes st (supply total) and pw (weighted price). Optimisation inside. More... | |
void | runBiologicalModule () |
computes hV, hArea and new vol at end of year More... | |
void | runManagementModule () |
computes regArea and expectedReturns More... | |
void | sumRegionalForData () |
computes vol, hV, harvestedArea, regArea and expReturns at reg level from the pixel level More... | |
void | initialiseCarbonModule () |
call initialiseDeathBiomassStocks(), initialiseProductsStocks() and initialiseEmissionCounters() More... | |
void | initialiseDeathTimber () |
Set deathTimberInventory to zero for the previous years (under the hipotesis that we don't have advanced stock of death biomass usable as timber at the beginning of the simulation) More... | |
void | registerCarbonEvents () |
call registerHarvesting(), registerDeathBiomass(), registerProducts() and registerTransports() More... | |
void | cacheSettings () |
just cache exogenous settings from ModelData More... | |
void | cacheDynamicSettings () |
cache settings that may change with time More... | |
void | initializePixelVolumes () |
distribuite regional exogenous volumes to pixel volumes using corine land cover area as weight More... | |
void | assignSpMultiplierPropToVols () |
ModelCoreSpatial::assignSpMultiplierPropToVols assigns the spatial multiplier (used in the time of return) based no more on a Normal distribution but on the volumes present in the pixel: more volume, more the pixel is fit for the ft. More... | |
void | initializePixelArea () |
compute px->area for each ft and dc More... | |
void | resetPixelValues () |
swap volumes->lagged_volumes and reset the other pixel vectors More... | |
void | cachePixelExogenousData () |
computes pixel level tp, meta and mort More... | |
void | computeInventary () |
in=f(vol_t-1) More... | |
void | computeCumulativeData () |
computes cumTp_exp, vHa_exp, vHa More... | |
void | updateMapAreas () |
computes forArea_{ft} More... | |
void | updateOtherMapData () |
update (if the layer exists) other gis-based data, as volumes and expected returns, taking them from the data in the px object More... | |
double | computeExpectedPrice (const double &curLocPrice, const double &worldCurPrice, const double &worldFutPrice, const double &sl, const double &sa, const double &expCoef) |
Compute weighted expected price for a given product. More... | |
void | printDebugInitRegionalValues () |
print initial inv, st, sl and sa in each region More... | |
vector< double > | allocateHarvesting (vector< double > total_st, const int ®Id) |
Using the deathTimberInventory map, this function allocate the total st in st from death timber (that goes reduce the deathTimberInventory map) and stFromHarvesting that is what it remains after the allocation to death timber. More... | |
void | loadExogenousForestLayers (const string &what) |
Set pixel volumes (what="vol") OR areas (what="area") by specific forest types as defined in gis layers for volumes and proportionally to volumes for areas. More... | |
void | computeEconomicBalances () |
compute the policy balances (- -> costs; + -> rev) and the producer/consumer surpluses More... | |
double | getAvgAgeByDc (Pixel *px, int ft, int dc) |
return the average age of a tree at a given diameter class, using the cumTp vector More... | |
double | getVHaByYear (const Pixel *px, const int &ft, const int &year, const double &extraBiomass_ratio, const int ®Id) const |
return the Volume/ha in a forest after a given number of year after planting, for a specific forest type More... | |
double | gpd (const string &type_h, const int ®Id_h, const string &prodId_h, const int &year=DATA_NOW, const string &freeDim_h="") const |
double | gfd (const string &type_h, const int ®Id_h, const string &forType_h, const string &freeDim_h, const int &year=DATA_NOW) const |
void | spd (const double &value_h, const string &type_h, const int ®Id_h, const string &prodId_h, const int &year=DATA_NOW, const bool &allowCreate=false, const string &freeDim_h="") const |
void | sfd (const double &value_h, const string &type_h, const int ®Id_h, const string &forType_h, const string &freeDim_h, const int &year=DATA_NOW, const bool &allowCreate=false) const |
bool | app (const string &prod_h, const string &forType_h, const string &dClass_h) const |
Public Member Functions inherited from BaseClass | |
BaseClass () | |
~BaseClass () | |
void | msgOut (const int &msgCode_h, const string &msg_h, const bool &refreshGUI_h=true) const |
Overloaded function to print the output log. More... | |
void | msgOut (const int &msgCode_h, const int &msg_h, const bool &refreshGUI_h=true) const |
Overloaded function to print the output log. More... | |
void | msgOut (const int &msgCode_h, const double &msg_h, const bool &refreshGUI_h=true) const |
Overloaded function to print the output log. More... | |
int | s2i (const string &string_h) const |
string to integer conversion More... | |
double | s2d (const string &string_h) const |
string to double conversion More... | |
double | s2d (const string &string_h, const bool &replaceComma) const |
string to double conversion More... | |
bool | s2b (const string &string_h) const |
string to bool conversion More... | |
string | i2s (const int &int_h) const |
integer to string conversion More... | |
string | d2s (const double &double_h) const |
double to string conversion More... | |
string | b2s (const bool &bool_h) const |
bool to string conversion More... | |
vector< int > | s2i (const vector< string > &string_h) const |
string to integer conversion (vector) More... | |
vector< double > | s2d (const vector< string > &string_h, const bool &replaceComma=false) const |
string to double conversion (vector) More... | |
vector< bool > | s2b (const vector< string > &string_h) const |
string to bool conversion (vector) More... | |
vector< string > | i2s (const vector< int > &int_h) const |
integer to string conversion (vector) More... | |
vector< string > | d2s (const vector< double > &double_h) const |
double to string conversion (vector) More... | |
vector< string > | b2s (const vector< bool > &bool_h) const |
bool to string conversion (vector) More... | |
int | getType (const string &type_h) const |
Return a type according to enum TYPE_* from a string (eg: "string" -> TYPE_STRING (2)) More... | |
void | refreshGUI () const |
Ping to periodically return the control to the GUI. More... | |
template<typename T > | |
string | toString (const T &x) const |
template<typename T > | |
T | stringTo (const std::string &s) const |
int | vSum (const vector< int > &vector_h) const |
double | vSum (const vector< double > &vector_h) const |
int | vSum (const vector< vector< int > > &vector_h) const |
double | vSum (const vector< vector< double > > &vector_h) const |
void | tokenize (const string &str, vector< string > &tokens, const string &delimiter=" ") const |
Tokenize a string using a delimiter (default is space) More... | |
void | untokenize (string &str, vector< string > &tokens, const string &delimiter=" ") const |
template<typename K , typename V > | |
V | findMap (const map< K, V > &mymap, const K &key, const int &error_level=MSG_CRITICAL_ERROR, const V ¬FoundValue=numeric_limits< V >::min()) const |
Lookup a map for a value. Return the value starting from the key. More... | |
template<typename K , typename V > | |
void | changeMapValue (map< K, V > &mymap, const K &key, const V &value, const int &error_level=MSG_CRITICAL_ERROR) |
Change the value stored in a map given the key and the new value. More... | |
template<typename K , typename V > | |
void | incrMapValue (map< K, V > &mymap, const K &key, const V &value, const int &error_level=MSG_CRITICAL_ERROR) |
Increments a value stored in a map of the specified value, given the key. More... | |
template<typename K , typename V > | |
void | incrOrAddMapValue (map< K, V > &mymap, const K &key, const V &value) |
Increments a value stored in a map of the specified value, given the key. More... | |
template<typename K , typename V > | |
void | resetMapValues (map< K, V > &mymap, const V &value) |
Reset all values stored in a map to the specified one. More... | |
template<typename K , typename V > | |
map< K, V > | vectorToMap (const vector< K > &keys, const V &value=0.0) |
Returns a map built using the given vector and the given (scalar) value as keys/values pairs. More... | |
template<typename T > | |
vector< T > | positionsToContent (const vector< T > &vector_h, const vector< int > &positions) |
Return a vector of content from a vector and a vector of positions (int) More... | |
template<typename V > | |
void | debugMap (const map< iisskey, V > &mymap) |
Debug a map. More... | |
template<typename K , typename V > | |
void | debugMap (const map< K, V > &mymap, const K &key) |
template<typename K > | |
int | getMaxPos (const vector< K > &v) |
Returns the position of the maximum element in the vector (the last one in case of multiple equivalent maxima) More... | |
template<typename K > | |
int | getMinPos (const vector< K > &v) |
Returns the position of the minimum element in the vector (the first one in case of multiple equivalent minima) More... | |
template<typename K > | |
K | getMax (const vector< K > &v) |
Returns the value of the maximum element in the vector (the last one in case of multiple equivalent maxima) More... | |
template<typename K > | |
K | getMin (const vector< K > &v) |
Returns the value of the minimum element in the vector (the first one in case of multiple equivalent minima) More... | |
template<typename K > | |
double | getAvg (const vector< K > &v) |
Returns the average of the elements in the vector. More... | |
template<typename K > | |
double | getSd (const vector< K > &v, bool sample=true) |
template<typename K > | |
int | getPos (const K &element, const vector< K > &v, const int &msgCode_h=MSG_CRITICAL_ERROR) |
template<typename K > | |
bool | inVector (const K &element, const vector< K > &v) |
double | normSample (const double &avg, const double &stdev, const double &minval=NULL, const double &maxval=NULL) const |
Sample from a normal distribution with bounds. Slower (double time, but still you see the diff only after milion of loops). More... | |
template<typename K > | |
K | normSample (normal_distribution< K > &d, std::mt19937 &gen, const K &minval=NULL, const K &maxval=NULL) const |
Sample from a normal distribution with bounds. Faster (half time) as the normal_distribution is made only once. More... | |
template<typename T > | |
std::string | toString (const T &x) const |
Private Attributes | |
ModelData * | MD |
int | firstYear |
int | secondYear |
int | thirdYear |
int | WL2 |
vector< int > | regIds2 |
vector< string > | priProducts |
vector< string > | secProducts |
vector< string > | allProducts |
vector< string > | dClasses |
vector< string > | pDClasses |
vector< string > | fTypes |
vector< vector< int > > | l2r |
string | regType |
string | natRegAllocation |
vector< Pixel * > | regPx |
bool | rescaleFrequencies |
bool | oldVol2AreaMethod |
string | forestAreaChangeMethod |
double | ir |
Additional Inherited Members | |
Protected Attributes inherited from BaseClass | |
ThreadManager * | MTHREAD |
Pointer to the Thread manager. More... | |
The core of the model (spatial version).
Once the environment is initialised (mainly data load, space created), the model is run through the two functions runInitPeriod() and runSimulationYear().
Some importan notes: V (volumes) -> at the end of the year In (inventary) -> at the beginning of the year Area -> at the end of the year Harvesting -> at the beginning of the year Volumes are in Mm^3, Areas in the model in Ha (10000 m^2), in the layers in m^2, vHa in m^3/ha. Prices are in €/m^3. Policy balances (- -> public cost,subside; + -> public revenue) and surpluses are in milion €
BALANCE: PROD_forLocal (sl) + PROD_forExp (sa) + IMP (da) + sum_reg(reg_trade_in) = CONS_fromLocal (dl) + CONS_fromImp (da) + EXP (sa) + sum_reg(reg_trade_out) note that this means that sl includes alread reg_trade_out, and dl includes already reg_trade_in
Where are volumes information ?
Aggregation of the Expected returns
The problem is how to aggregate the expected returns, given at pixel anf ft level, first at the regional level, then at the ft group level (B/C) and total forest level and finally at national level from regional one.
A - From pixel to region
Definition at line 83 of file ModelCoreSpatial.h.
ModelCoreSpatial | ( | ThreadManager * | MTHREAD_h | ) |
Definition at line 39 of file ModelCoreSpatial.cpp.
~ModelCoreSpatial | ( | ) |
Definition at line 44 of file ModelCoreSpatial.cpp.
vector< double > allocateHarvesting | ( | vector< double > | total_st, |
const int & | regId | ||
) |
Using the deathTimberInventory map, this function allocate the total st in st from death timber (that goes reduce the deathTimberInventory map) and stFromHarvesting that is what it remains after the allocation to death timber.
ModelCoreSpatial::allocateHarvesting.
total_st | vector of total supply by primary products |
The algorithm is such that is loops the deathTimberInventory map for each year (newer to older), dc (higher to smaller) and ft. It compute the primary products allocable from that combination and allocate the cell amount to decrease the total_st of that products in a proportional way to what still remain of the allocable products.
It is called in the runMarketModule() function.
Definition at line 2696 of file ModelCoreSpatial.cpp.
Referenced by runMarketModule().
|
inline |
Definition at line 127 of file ModelCoreSpatial.h.
Referenced by computeInventary(), runBiologicalModule(), and runManagementModule().
void assignSpMultiplierPropToVols | ( | ) |
ModelCoreSpatial::assignSpMultiplierPropToVols assigns the spatial multiplier (used in the time of return) based no more on a Normal distribution but on the volumes present in the pixel: more volume, more the pixel is fit for the ft.
This function apply to the pixel a multiplier of time of passage that is inversely proportional to the volumes of that forest type present in the pixel. The idea is that in the spots where we observe more of a given forest type are probabily the most suited ones to it.
The overall multipliers of time of passage (that is, the one returned by Pixel::getMultiplier("tp_multiplier") ) will then be the product of this multiplier that account for spatial heterogeneity and of an eventual exogenous multiplier that accounts for different scenarios among the spatio-temporal dimensions.
Given that (forest type index omitted):
This multiplier is computed as:
And it has the following properties:
For spreadsheet "proof" see the file computation_of_growth_multipliers_from_know_avg_sd_and_proportional_to_share_of_area_in_each_pixel.ods
Definition at line 1502 of file ModelCoreSpatial.cpp.
Referenced by runInitPeriod().
void cacheDynamicSettings | ( | ) |
cache settings that may change with time
Definition at line 1425 of file ModelCoreSpatial.cpp.
Referenced by runInitPeriod(), and runSimulationYear().
void cachePixelExogenousData | ( | ) |
computes pixel level tp, meta and mort
Definition at line 1945 of file ModelCoreSpatial.cpp.
Referenced by runInitPeriod(), and runSimulationYear().
void cacheSettings | ( | ) |
just cache exogenous settings from ModelData
Definition at line 1405 of file ModelCoreSpatial.cpp.
Referenced by runInitPeriod().
void computeCumulativeData | ( | ) |
computes cumTp_exp, vHa_exp, vHa
Note on the effect of mortality modifiers on the entryVolHa. Unfortunatly for how it is defined the mortality multiplier (the ratio with the new mortality rate over the old one) we can't compute a entryVolHa based on it. It is NOT infact just like: vHa_adjusted = vHa_orig / mort_multiplier. The effect of mortality on the vHa of the first diameter class is unknow, and so we can't compute the effect of a relative increase.
param expType Specify how the forest owners (those that make the investments) behave will be the time of passage in the future in order to calculate the cumulative time of passage in turn used to discount future revenues. Will forest owners behave adaptively believing the time of passage between diameter classes will be like the observed one at time they make decision (0) or they will have full expectations believing forecasts (1) or something in the middle ? For compatibility with the GAMS code, a -1 value means using initial simulation tp values (fixed cumTp)."
Definition at line 1700 of file ModelCoreSpatial.cpp.
Referenced by runInitPeriod(), and runSimulationYear().
void computeEconomicBalances | ( | ) |
compute the policy balances (- -> costs; + -> rev) and the producer/consumer surpluses
This function has two tasks: 1) compute the policy balances (- -> public cost,subside; + -> public revenue, tax) for pol_mktDirInt_s, pol_mktDirInt_d, pol_trSub and pol_tcSub (pol_fiSub are done directly in the runManagementModule() function) 2) compute the producer/consumer surpluses
Definition at line 2735 of file ModelCoreSpatial.cpp.
Referenced by runSimulationYear().
double computeExpectedPrice | ( | const double & | curLocPrice, |
const double & | worldCurPrice, | ||
const double & | worldFutPrice, | ||
const double & | sl, | ||
const double & | sa, | ||
const double & | expCoef | ||
) |
Compute weighted expected price for a given product.
Compute the expectation weighted price based on the ratio of the international (world) price between the future and now.
curLocPrice | The local current price |
worldCurPrice | The world current price |
worldFutPrice | The world future price |
sl | Supply local |
sa | Supply abroad |
expCoef | The expectation coefficient for prices for the agent [0,1] |
Definition at line 2464 of file ModelCoreSpatial.cpp.
Referenced by runManagementModule().
void computeInventary | ( | ) |
in=f(vol_t-1)
Definition at line 2010 of file ModelCoreSpatial.cpp.
Referenced by runInitPeriod(), and runSimulationYear().
double getAvgAgeByDc | ( | Pixel * | px, |
int | ft, | ||
int | dc | ||
) |
return the average age of a tree at a given diameter class, using the cumTp vector
Return the average age using cumTp vector
Definition at line 2820 of file ModelCoreSpatial.cpp.
Referenced by runBiologicalModule().
double getVHaByYear | ( | const Pixel * | px, |
const int & | ft, | ||
const int & | year, | ||
const double & | extraBiomass_ratio, | ||
const int & | regId | ||
) | const |
return the Volume/ha in a forest after a given number of year after planting, for a specific forest type
Definition at line 2831 of file ModelCoreSpatial.cpp.
Referenced by runManagementModule().
|
inline |
Definition at line 124 of file ModelCoreSpatial.h.
Referenced by assignSpMultiplierPropToVols(), cachePixelExogenousData(), computeCumulativeData(), getVHaByYear(), initialiseCarbonModule(), initializePixelArea(), initializePixelVolumes(), registerCarbonEvents(), runBiologicalModule(), runManagementModule(), and sumRegionalForData().
|
inline |
Definition at line 123 of file ModelCoreSpatial.h.
Referenced by computeEconomicBalances(), initialiseCarbonModule(), initMarketModule(), printDebugInitRegionalValues(), registerCarbonEvents(), runBiologicalModule(), runManagementModule(), and runMarketModule().
void initialiseCarbonModule | ( | ) |
call initialiseDeathBiomassStocks(), initialiseProductsStocks() and initialiseEmissionCounters()
< call initialiseDeathBiomassStocks(), initialiseProductsStocks() and initialiseEmissionCounters()
Definition at line 1576 of file ModelCoreSpatial.cpp.
Referenced by runInitPeriod().
void initialiseDeathTimber | ( | ) |
Set deathTimberInventory to zero for the previous years (under the hipotesis that we don't have advanced stock of death biomass usable as timber at the beginning of the simulation)
Definition at line 1605 of file ModelCoreSpatial.cpp.
Referenced by runInitPeriod().
void initializePixelArea | ( | ) |
compute px->area for each ft and dc
ModelCoreSpatial::initializePixelArea.
This function compute the initial area by ft and dc. It requires vHa computed in computeCumulativeData, this is why it is separated form the other initialisedPixelValues(). As the sum of area computed using vHa may differ from the one memorised in forArea_* layer, all values are scaled to match it before being memorised. Also assign area = area_l
Definition at line 1630 of file ModelCoreSpatial.cpp.
Referenced by runInitPeriod().
void initializePixelVolumes | ( | ) |
distribuite regional exogenous volumes to pixel volumes using corine land cover area as weight
Definition at line 1438 of file ModelCoreSpatial.cpp.
Referenced by runInitPeriod().
void initMarketModule | ( | ) |
computes st and pw for second year and several needed-only-at-t0-vars for the market module
Definition at line 99 of file ModelCoreSpatial.cpp.
Referenced by runInitPeriod().
void loadExogenousForestLayers | ( | const string & | what | ) |
Set pixel volumes (what="vol") OR areas (what="area") by specific forest types as defined in gis layers for volumes and proportionally to volumes for areas.
It uses volumes from gis data to "move" volumes from one forest type to the other (when called with what="vol"). Then it moves areas proportionally and, as dc0 volumes are not defined but area it is, compute, again proportionally, area in destination forest times for dc=0 It acts on the pix->vol, pix->area and pix->area_l vectors. It also create/update the px->values layer map for the area, but it doesn't cash the results in forDataMap.
It is called first with parameter what="vol" in initializePixelVolumes() and then with what="area" in initializePixelAreas(). As we need the original volumes in the area allocation, original_vols is set as a static variable.
Allocate area proportionally to volumes (see file test_proportional_computation_of_areas_from_volumes.ods) Example: FtIn FtOut Vtrasfer con ash 0.2 brHf ash 0.1 brCopp ash 0.3 con oak 0.3 brHf oak 0.2 brCopp oak 0.1
Vorig Aorig Vnew Anew
con 10 30 9.5 28.5 Aorig-Aorig*(Vtrasfer1/Vorig)-Aorig(Vtrasfer2/Vorig) brHf 5 20 4.7 18.8 brCopp 2 20 1.6 16 ash 0 0 0.6 4 Aorig1*Vtrasfer1/(Vorig1)+Aorig2*Vtrasfer2/(Vorig2)+... oak 0 0 0.6 2.7 70 70
Definition at line 2481 of file ModelCoreSpatial.cpp.
Referenced by initializePixelArea(), and initializePixelVolumes().
void printDebugInitRegionalValues | ( | ) |
print initial inv, st, sl and sa in each region
Definition at line 2662 of file ModelCoreSpatial.cpp.
void registerCarbonEvents | ( | ) |
call registerHarvesting(), registerDeathBiomass(), registerProducts() and registerTransports()
This function call registerHarvesting() (accounts for emissions from for. operations), registerDeathBiomass() (registers new stocks of death biomass), registerProducts() (registers new stock of products) and registerTransports() (accounts for emissions from transportation).
It pass to registerProducts():
Definition at line 2406 of file ModelCoreSpatial.cpp.
Referenced by runSimulationYear().
void resetPixelValues | ( | ) |
swap volumes->lagged_volumes and reset the other pixel vectors
Definition at line 1904 of file ModelCoreSpatial.cpp.
Referenced by runInitPeriod(), and runSimulationYear().
void runBiologicalModule | ( | ) |
computes hV, hArea and new vol at end of year
ModelCoreSpatial::runBiologicalModule.
Changes in Area: dc area_l area diff 0 ------—> +regArea -areaFirstProdClass (areaMovingUp_00) 15 ------—> +areaFirstPrClass -hArea_15 -areaMovingUp_15 25 ------—> +areaMovingUp15 - hArea_25 - areaMovingUp_25 35 ------—> +areaMovingUp25 - hArea_35 - areaMovingUp_35 ... 95 ------—> +areaMovingUp85 - hArea_95 - areaMovingUp_95 105 ------—> +areaMovingUp95 - hArea_105
note: regArea is computed in the management module, not here. Further, regArea is already the net one of forest area changes
Definition at line 562 of file ModelCoreSpatial.cpp.
Referenced by runInitPeriod(), and runSimulationYear().
void runInitPeriod | ( | ) |
< cashe things like first year, second year, dClasses...
< compute px volumes vol for 2005 (including exogenous loaded volumes)
< inside it uses first year, second year
< 2005->2006
< swap volumes->lagged_volumes and reset the other pixel vectors
< compute pixel tp, meta and mort
< in=f(vol_t-1)
< compute cumTp_exp, vHa_exp, vHa
< compute px->area for each ft and dc (including exogenous loaded areas)
< update the forArea_{ft} layer on each pixel as old value-hArea+regArea
< update (if the layer exists) other gis-based data, as volumes and expected returns, taking them from the data in the px object
< only for printing stats as forest data is never used at regional level
Definition at line 49 of file ModelCoreSpatial.cpp.
Referenced by Init::setInitLevel3().
void runManagementModule | ( | ) |
computes regArea and expectedReturns
Definition at line 875 of file ModelCoreSpatial.cpp.
Referenced by runInitPeriod(), and runSimulationYear().
void runMarketModule | ( | ) |
computes st (supply total) and pw (weighted price). Optimisation inside.
Definition at line 235 of file ModelCoreSpatial.cpp.
Referenced by runSimulationYear().
void runSimulationYear | ( | ) |
Definition at line 78 of file ModelCoreSpatial.cpp.
Referenced by Scheduler::run().
|
inline |
Definition at line 126 of file ModelCoreSpatial.h.
Referenced by runManagementModule(), and sumRegionalForData().
|
inline |
Definition at line 125 of file ModelCoreSpatial.h.
Referenced by computeEconomicBalances(), computeInventary(), initMarketModule(), and runMarketModule().
void sumRegionalForData | ( | ) |
computes vol, hV, harvestedArea, regArea and expReturns at reg level from the pixel level
Definition at line 2194 of file ModelCoreSpatial.cpp.
Referenced by runInitPeriod(), and runSimulationYear().