#ifndef GLM_GRID_CELL_H_ #define GLM_GRID_CELL_H_ #include #include #include #include "config.h" namespace glm { // Note: VRGN has to be first! SCND has to be second! enum lu_types { VRGN, SCND, URBN, CROP, PSTR, N_LU_TYPES }; const char* getLandUseName(lu_types lu); std::string getFlowName(size_t source, size_t target); // Note:: PRIM types have to be first, SECD types have to be next! enum sub_lu_types { PRIMF, PRIMN, SECDF, SECDN, URBAN, C3ANN, C4ANN, C3PER, C4PER, C3NFX, PASTR, RANGE, N_SUB_LU_TYPES }; const char* getSubLandUseName(sub_lu_types lu); const char* getSubLandUseLongName(sub_lu_types lu); std::string getSubFlowName(size_t source, size_t target); class InputFiles; class Zone; class GridInfo; class GridCell { static double harvestProbability (double biomass, InputFiles& inputs); public: int zdis; int Ldis; struct State { double lu[N_LU_TYPES]; double subLU[N_SUB_LU_TYPES]; int priorWH; double sc_c2s, sc_p2s, sc_v2c, sc_v2p, sc_s2c, sc_s2p, sc_c, sc_p, sc_v, sc_s; double u_u2s, u_u2p, u_p2u, u_s2u, u_v2u; double scndMeanAge; double scndMeanBiomass; double RSForestLossRemaining; double landsat; double irrgData; double riceData; double irrig[N_SUB_LU_TYPES]; double fert[N_SUB_LU_TYPES]; double cropBiofuels[N_SUB_LU_TYPES]; double flooded; double shftCult; double iamFlood; double iamC4P; double iamC3P; double iamC3A; double iamC4A; double iamC3N; double iamFert[N_SUB_LU_TYPES]; double iamIrrig[N_SUB_LU_TYPES]; double iamCropBiofuel; double iamC3PBiofuel; double iamC4PBiofuel; double biomassHarvestFraction[N_SUB_LU_TYPES]; double tillage; double fuelwoodFraction; double commercialBiofuelsFraction; double industrialRoundwoodFraction; double nonCropBiofuel; double totalCropBiofuel; }; class Flows { double transitions[N_LU_TYPES][N_LU_TYPES]; double subTransitions[N_SUB_LU_TYPES][N_SUB_LU_TYPES]; public: inline double get(size_t from, size_t to) { return transitions[from][to]; } inline void set(lu_types from, lu_types to, double flow) { transitions[from][to] = flow; } inline double getSub(size_t from, size_t to) { return subTransitions[from][to]; } inline void setSub(sub_lu_types from, sub_lu_types to, double flow) { subTransitions[from][to] = flow; } inline double getFlowsAway(size_t from) { double away = 0.0; for (size_t to=VRGN+1; to(frac[now].subLU[type]); } float getFlowForOutput (sub_lu_types from, sub_lu_types to) { return static_cast(flow.getSub(from, to)); } float getIrrigForOutput (size_t now, sub_lu_types type) { return static_cast(frac[now].irrig[type]); } float getFertForOutput (size_t now, sub_lu_types type) { return static_cast(frac[now].fert[type]); } float getTotalCropBiofuel (size_t now) { return static_cast(frac[now].totalCropBiofuel); } float getNonCropBiofuel (size_t now) { return static_cast(frac[now].nonCropBiofuel); } float getFlooded (size_t now) { return static_cast(frac[now].flooded); } float getTillage (size_t now) { return static_cast(frac[now].tillage); } float getCroplandBiofuelsForOutput (size_t now, sub_lu_types type) { return static_cast(frac[now].cropBiofuels[type]); } float getBiomassHarvestForOutput (size_t now, sub_lu_types type) { return static_cast(frac[now].biomassHarvestFraction[type]); } float getFuelwoodFraction (size_t now) { return static_cast(frac[now].fuelwoodFraction); } float getCommercialBiofuelFraction (size_t now) { return static_cast(frac[now].commercialBiofuelsFraction); } float getRoundwoodFraction (size_t now) { return static_cast(frac[now].industrialRoundwoodFraction); } float getVBH1 (size_t now) { return static_cast(flow.vrgnHarvBiomass1); } float getVBH2 (size_t now) { return static_cast(flow.vrgnHarvBiomass2); } float getSBH1 (size_t now) { return static_cast(flow.scndHarvBiomass1); } float getSBH2 (size_t now) { return static_cast(flow.scndHarvBiomass2); } float getSBH3 (size_t now) { return static_cast(flow.scndHarvBiomass3); } float getVAH1 (size_t now) { return static_cast(flow.vrgnHarvArea1); } float getVAH2 (size_t now) { return static_cast(flow.vrgnHarvArea2); } float getSAH1 (size_t now) { return static_cast(flow.scndHarvArea1); } float getSAH2 (size_t now) { return static_cast(flow.scndHarvArea2); } float getSAH3 (size_t now) { return static_cast(flow.scndHarvArea3); } float getSSMB (size_t now) { return static_cast(frac[now].scndMeanBiomass);} float getSSMA (size_t now) { return static_cast(frac[now].scndMeanAge); } float getZdis (size_t now) { return static_cast(zdis); } float getLdis (size_t now) { return static_cast(Ldis); } float getPotBio (size_t now) { return static_cast(potentialBiomass); } float getRSLossRem (size_t now) { return static_cast(frac[now].RSForestLossRemaining); } float getS2C_SC (size_t now) { return static_cast(frac[now].sc_s2c); } float getV2C_SC (size_t now) { return static_cast(frac[now].sc_v2c); } float getC2S_SC (size_t now) { return static_cast(frac[now].sc_c2s); } inline bool hasLandUse (size_t now) { for (size_t lu=VRGN+1; lu 0.0000001) { if (lu!=SCND) { if (lu==PSTR) { if (frac[now].subLU[PASTR] > 0.0000001) { return true; } } else { return true; } } } } return false; } inline bool hasLandsat (size_t now) { if (frac[now].landsat > 0.01*(1-ice-water)) { return true; } return false; } inline void printState (size_t lu, size_t now, size_t next, const char* prefix=NULL) { if (prefix != NULL) { std::cout << prefix; } std::cout << getLandUseName((lu_types) lu) << "(t)=" << frac[now].lu[lu] << " " << getLandUseName((lu_types) lu) << "(t+1)=" << frac[next].lu[lu]; for (size_t olu=VRGN; olu