FFSM++ 1.1.0
French Forest Sector Model ++
Loading...
Searching...
No Matches
ModelCoreSpatial.h
Go to the documentation of this file.
1/***************************************************************************
2 * Copyright (C) 2015 by Laboratoire d'Economie Forestière *
3 * http://ffsm-project.org *
4 * *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 3 of the License, or *
8 * (at your option) any later version, given the compliance with the *
9 * exceptions listed in the file COPYING that is distribued together *
10 * with this file. *
11 * *
12 * This program is distributed in the hope that it will be useful, *
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15 * GNU General Public License for more details. *
16 * *
17 * You should have received a copy of the GNU General Public License *
18 * along with this program; if not, write to the *
19 * Free Software Foundation, Inc., *
20 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
21 ***************************************************************************/
22#ifndef MODELCORESPATIAL_H
23#define MODELCORESPATIAL_H
24
25// Core C++ headers
26#include <string>
27#include <vector>
28#include <map>
29#include <stdexcept>
30#include <iostream>
31#include <sstream>
32
33// Qt headers...
34
35// FFSM headers...
36#include "BaseClass.h"
37#include "ThreadManager.h"
38#include "ModelData.h"
39#include "Pixel.h"
40
41/**
42* \brief The core of the model (spatial version).
43*
44* Once the environment is initialised (mainly data load, space created), the model is run through the two functions runInitPeriod()
45* and runSimulationYear().
46*
47*
48* Some importan notes:
49* V (volumes) -> at the end of the year
50* In (inventary) -> at the beginning of the year
51* Area -> at the end of the year
52* Harvesting -> at the beginning of the year
53* 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.
54* Policy balances (- -> public cost,subside; + -> public revenue) and surpluses are in milion €
55*
56* BALANCE:
57* 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)
58* note that this means that sl includes alread reg_trade_out, and dl includes already reg_trade_in
59*
60* Where are volumes information ?
61* - ip px->vol - by px, ft and dc
62* - in forDataMap (through gft()) - by reg, ft and dc
63* Where is area information ?
64* - in px->area - by px, ft and dc
65* - in forDataMap (through gft()) - by reg, ft and dc
66* - in px->values map (forArea_* layer, through px->getDoubleValue()) - by px and ft
67*
68* Aggregation of the Expected returns
69*
70* 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
71* total forest level and finally at national level from regional one.
72*
73* A - From pixel to region
74* - weighted by total forest area in the pixel
75* B1 - From ft to ft group
76* - in each pixel we take the highest expRet within the pixel and we weight by farea to get the regional value
77* B2 - From ft group to forest
78* - actually, from ft to group: like b1, but we take the highest value in each px for any ft and we weight by forest area in the px to get the regional value
79* C - From region to country
80* - we weight the individual ft, ft group and forest by the different regional total forest areas.*
81*
82*/
84
85public:
88
89 void runInitPeriod();
90 void runSimulationYear();
91
92 void initMarketModule(); ///< computes st and pw for second year and several needed-only-at-t0-vars for the market module
93 void runMarketModule(); ///< computes st (supply total) and pw (weighted price). Optimisation inside.
94 void runBiologicalModule(); ///< computes hV, hArea and new vol at end of year
95 void runManagementModule(); ///< computes regArea and expectedReturns
96 void sumRegionalForData(); ///< computes vol, hV, harvestedArea, regArea and expReturns at reg level from the pixel level
97 void initialiseCarbonModule(); ///< call initialiseDeathBiomassStocks(), initialiseProductsStocks() and initialiseEmissionCounters()
98 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)
99
100 void registerCarbonEvents(); ///< call registerHarvesting(), registerDeathBiomass(), registerProducts() and registerTransports()
101 void cacheSettings(); ///< just cache exogenous settings from ModelData
102 void cacheDynamicSettings(); ///< cache settings that may change with time
103 void initializePixelVolumes(); ///< distribuite regional exogenous volumes to pixel volumes using corine land cover area as weight
104 void assignSpMultiplierPropToVols(); // assign 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
105 void initializePixelArea(); ///< compute px->area for each ft and dc
106 void resetPixelValues(); ///< swap volumes->lagged_volumes and reset the other pixel vectors
107 void cachePixelExogenousData();///< computes pixel level tp, meta and mort
108 void computeInventary(); ///< in=f(vol_t-1)
109 void computeCumulativeData(); ///< computes cumTp_exp, vHa_exp, vHa
110 void updateMapAreas(); ///< computes forArea_{ft}
111 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
112 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.
113 void printDebugInitRegionalValues(); ///< print initial inv, st, sl and sa in each region
114 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.
115 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.
116 void computeEconomicBalances();///< compute the policy balances (- -> costs; + -> rev) and the producer/consumer surpluses
117 double getAvgAgeByDc(Pixel* px, int ft, int dc); ///< return the average age of a tree at a given diameter class, using the cumTp vector
118
119 // added for carbon project
120 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
121
122 // convenient handles to equivalent ModelData functions..
123 double gpd(const string &type_h, const int& regId_h, const string &prodId_h, const int& year=DATA_NOW, const string &freeDim_h="") const {return MTHREAD->MD->getProdData(type_h, regId_h, prodId_h, year, freeDim_h);};
124 double gfd(const string &type_h, const int& regId_h, const string &forType_h, const string &freeDim_h, const int& year=DATA_NOW) const {return MTHREAD->MD->getForData(type_h, regId_h, forType_h, freeDim_h, year);};
125 void spd(const double& value_h, const string &type_h, const int& regId_h, const string &prodId_h, const int& year=DATA_NOW, const bool& allowCreate=false, const string &freeDim_h="") const {MTHREAD->MD->setProdData(value_h, type_h, regId_h, prodId_h, year, allowCreate, freeDim_h);};
126 void sfd(const double& value_h, const string &type_h, const int& regId_h, const string &forType_h, const string &freeDim_h, const int& year=DATA_NOW, const bool& allowCreate=false) const {MTHREAD->MD->setForData(value_h, type_h, regId_h, forType_h, freeDim_h, year, allowCreate);};
127 bool app(const string &prod_h, const string &forType_h, const string &dClass_h) const {return MTHREAD->MD->assessProdPossibility(prod_h, forType_h, dClass_h);};
128
129private:
134 int WL2;
135 vector <int> regIds2;
136 vector <string> priProducts;
137 vector <string> secProducts;
138 vector <string> allProducts;
139 vector <string> dClasses;
140 vector <string> pDClasses;
141 vector <string> fTypes;
142 vector <vector <int> > l2r;
143 string regType;
145 //double mr;
146 vector <Pixel*> regPx; // pixels behaving to the current region
150 double ir; // interest rate
151};
152
153#endif // MODELCORESPATIAL_H
This file is the header of BaseClass and it is included by ALL compiled code.
@ DATA_NOW
The required data is for the current year.
Definition BaseClass.h:73
Base class for the regmas application.
Definition BaseClass.h:239
ThreadManager * MTHREAD
Pointer to the Thread manager.
Definition BaseClass.h:467
The core of the model (spatial version).
void runMarketModule()
computes st (supply total) and pw (weighted price). Optimisation inside.
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...
void sumRegionalForData()
computes vol, hV, harvestedArea, regArea and expReturns at reg level from the pixel level
vector< string > allProducts
vector< string > fTypes
void cachePixelExogenousData()
computes pixel level tp, meta and mort
void cacheSettings()
just cache exogenous settings from ModelData
void computeInventary()
in=f(vol_t-1)
void registerCarbonEvents()
call registerHarvesting(), registerDeathBiomass(), registerProducts() and registerTransports()
void printDebugInitRegionalValues()
print initial inv, st, sl and sa in each region
void computeEconomicBalances()
compute the policy balances (- -> costs; + -> rev) and the producer/consumer surpluses
void loadExogenousForestLayers(const string &what)
Set pixel volumes (what="vol") OR areas (what="area") by specific forest types as defined in gis laye...
void runBiologicalModule()
computes hV, hArea and new vol at end of year
void resetPixelValues()
swap volumes->lagged_volumes and reset the other pixel vectors
vector< Pixel * > regPx
void updateMapAreas()
computes forArea_{ft}
vector< string > priProducts
void assignSpMultiplierPropToVols()
ModelCoreSpatial::assignSpMultiplierPropToVols assigns the spatial multiplier (used in the time of re...
void runManagementModule()
computes regArea and expectedReturns
double getAvgAgeByDc(Pixel *px, int ft, int dc)
return the average age of a tree at a given diameter class, using the cumTp vector
double gfd(const string &type_h, const int &regId_h, const string &forType_h, const string &freeDim_h, const int &year=DATA_NOW) const
void computeCumulativeData()
computes cumTp_exp, vHa_exp, vHa
void initMarketModule()
computes st and pw for second year and several needed-only-at-t0-vars for the market module
vector< vector< int > > l2r
void initializePixelVolumes()
distribuite regional exogenous volumes to pixel volumes using corine land cover area as weight
vector< string > secProducts
void sfd(const double &value_h, const string &type_h, const int &regId_h, const string &forType_h, const string &freeDim_h, const int &year=DATA_NOW, const bool &allowCreate=false) const
double gpd(const string &type_h, const int &regId_h, const string &prodId_h, const int &year=DATA_NOW, const string &freeDim_h="") const
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.
bool app(const string &prod_h, const string &forType_h, const string &dClass_h) const
vector< string > dClasses
vector< string > pDClasses
void initialiseDeathTimber()
Set deathTimberInventory to zero for the previous years (under the hipotesis that we don't have advan...
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 t...
void spd(const double &value_h, const string &type_h, const int &regId_h, const string &prodId_h, const int &year=DATA_NOW, const bool &allowCreate=false, const string &freeDim_h="") const
void initialiseCarbonModule()
call initialiseDeathBiomassStocks(), initialiseProductsStocks() and initialiseEmissionCounters()
void initializePixelArea()
compute px->area for each ft and dc
vector< int > regIds2
void updateOtherMapData()
update (if the layer exists) other gis-based data, as volumes and expected returns,...
void cacheDynamicSettings()
cache settings that may change with time
Regional data, including macros and settings.
Definition ModelData.h:80
void setProdData(const double &value_h, const string &type_h, const int &regId_h, const string &prodId_h, const int &year=DATA_NOW, const bool &allowCreate=false, const string &freeDim_h="")
const double getForData(const string &type_h, const int &regId_h, const string &forType_h, const string &freeDim_h, const int &year=DATA_NOW)
void setForData(const double &value_h, const string &type_h, const int &regId_h, const string &forType_h, const string &freeDim_h, const int &year=DATA_NOW, const bool &allowCreate=false)
const bool assessProdPossibility(const string &prod_h, const string &forType_h, const string &dClass_h)
A simple function to assess if a specified product can be made by a certain forest type and diameter ...
const double getProdData(const string &type_h, const int &regId_h, const string &prodId_h, const int &year=DATA_NOW, const string &freeDim_h="")
Pixel-level class.
Definition Pixel.h:47
Thread manager. Responsable to manage the main thread and "speak" with the GUI.
ModelData * MD
the model data object