diff --git a/data/agriculturalGdpFraction.csv b/data/agriculturalGdpFraction.csv new file mode 100644 index 0000000000000000000000000000000000000000..05d7e02e86816023b96f1f2e6b5da88dfc2d3ef9 --- /dev/null +++ b/data/agriculturalGdpFraction.csv @@ -0,0 +1,194 @@ +Country,fraction +Afghanistan,0.2581565808 +Albania,0.1832942988 +Algeria,0.08708967689 +Angola,0.06199380534 +Antigua and Barbuda,0.01700428661 +Argentina,0.0661401926 +Armenia,0.179106503 +Aruba,0.00401357843 +Australia,0.02367137746 +Austria,0.01279189297 +Azerbaijan,0.06099559543 +Bahamas,0.01011714549 +Bahrain,0.00292198203 +Bangladesh,0.16793504 +Barbados,0.0135735265 +Belarus,0.07945372955 +Belgium,0.00746337589 +Belize,0.1228766543 +Benin,0.231954022 +Bermuda,0.00775529553 +Bhutan,0.1796140278 +Bolivia (Plurinational State of),0.1038678025 +Bosnia and Herzegovina,0.0700575211 +Botswana,0.02340370127 +Brazil,0.04387319845 +Brunei Darussalam,0.0077281516 +Bulgaria,0.04980568509 +Burkina Faso,0.3242746123 +Burundi,0.3688254133 +Cabo Verde,0.08292752365 +Cambodia,0.3142795083 +Cameroon,0.1376563025 +Canada,0.01544013257 +Central African Republic,0.3529591252 +Chad,0.5222986505 +Chile,0.03683433961 +China,0.09634029424 +Colombia,0.06358310428 +Comoros,0.2989714596 +Congo,0.04417626555 +Costa Rica,0.06560268357 +Cote d'Ivoire,0.2266061304 +Croatia,0.03604404619 +Cuba,0.03835602436 +Cyprus,0.02097669337 +Czechia,0.02086215145 +Democratic People's Republic of Korea,0.02334943788 +Democratic Republic of the Congo,0.2088374509 +Denmark,0.01180696337 +Djibouti,0.01829220217 +Dominica,0.1216757392 +Dominican Republic,0.0602685663 +Ecuador,0.09313812312 +Egypt,0.1261418982 +El Salvador,0.06436895085 +Equatorial Guinea,0.01238719632 +Eritrea,0.204733031 +Estonia,0.02862890396 +Ethiopia,0.4180687189 +Fiji,0.1010639784 +Finland,0.02302931645 +France,0.01559701231 +French Polynesia,0.04599999962 +Gabon,0.04190003454 +Gambia,0.2364791771 +Georgia,0.08885716567 +Germany,0.00735886747 +Ghana,0.2623913844 +Greece,0.03237217008 +Greenland,0.1521904781 +Grenada,0.04633166577 +Guatemala,0.1112852289 +Guinea,0.1735996962 +Guinea-Bissau,0.4450191865 +Guyana,0.2114192794 +Haiti,0.212288354 +Honduras,0.1232148999 +Hungary,0.03563392712 +Iceland,0.05471501845 +India,0.1689942691 +Indonesia,0.1369005133 +Iran (Islamic Republic of),0.07585279186 +Iraq,0.0500388504 +Ireland,0.00975278487 +Israel,0.01450977299 +Italy,0.01926645469 +Jamaica,0.0547841756 +Japan,0.01092310337 +Jordan,0.03739654856 +Kazakhstan,0.05119983175 +Kenya,0.2475334772 +Kiribati,0.2352963321 +Kosovo,0.1271282639 +Kuwait,0.00342516546 +Kyrgyzstan,0.2003410177 +Lao People's Democratic Republic,0.2222707114 +Latvia,0.03421218766 +Lebanon,0.03998841362 +Lesotho,0.05383849651 +Liberia,0.5035707916 +Libya,0.02190232387 +Lithuania,0.03490220068 +Luxembourg,0.00302405387 +Macau,0.00060012319 +Madagascar,0.2481731698 +Malawi,0.2938470303 +Malaysia,0.09440037951 +Maldives,0.05934487638 +Mali,0.3418386289 +Malta,0.01443496596 +Marshall Islands,0.1359720386 +Mauritania,0.2186368236 +Mauritius,0.03909741671 +Mexico,0.03153112377 +Micronesia (Federated States of),0.2521983526 +Mongolia,0.1512350298 +Montenegro,0.07936906575 +Morocco,0.124855228 +Mozambique,0.2509941642 +Myanmar,0.3603517688 +Namibia,0.08060025646 +Nepal,0.3195230878 +Netherlands,0.01734523 +New Caledonia,0.037 +New Zealand,0.07210339424 +Nicaragua,0.1669256421 +Niger,0.3795415556 +Nigeria,0.2335314558 +Norway,0.01345390077 +Oman,0.01394111816 +Pakistan,0.2294185908 +Palau,0.03711472668 +Panama,0.03942828207 +Papua New Guinea,0.1944835157 +Paraguay,0.119436435 +Peru,0.06899552714 +Philippines,0.1214251337 +Poland,0.02667672178 +Portugal,0.02023238685 +Puerto Rico,0.00703642781 +Qatar,0.00117858758 +Republic of Korea,0.02334943788 +Republic of Moldova,0.1149674725 +Romania,0.05857877118 +Russian Federation,0.03641176135 +Rwanda,0.3006284909 +Saint Kitts and Nevis,0.01228199508 +Saint Lucia,0.02783139767 +Saint Vincent and the Grenadines,0.05964641049 +Samoa,0.1068053547 +Sao Tome and Principe,0.1093036621 +Saudi Arabia,0.02545932478 +Senegal,0.1400431336 +Serbia,0.06908240365 +Sierra Leone,0.5248472462 +Singapore,0.00039518565 +Slovakia,0.03331109761 +Slovenia,0.01894128906 +Solomon Islands,0.3441094511 +Somalia,0.627 +South Africa,0.02375722081 +South Sudan,0.07349285354 +Spain,0.02404780229 +Sri Lanka,0.09958601909 +Sudan,0.2826523631 +Suriname,0.09018533172 +Swaziland,0.1016397857 +Sweden,0.01280729805 +Switzerland,0.007442333 +Tajikistan,0.2129757047 +Thailand,0.101581181 +The former Yugoslav Republic of Macedonia,0.09816396315 +Togo,0.353426866 +Tonga,0.1661701566 +Trinidad and Tobago,0.00442886034 +Tunisia,0.08793431968 +Turkey,0.07798347154 +Turkmenistan,0.1187436765 +Tuvalu,0.2192198904 +Uganda,0.2462129706 +Ukraine,0.08337232035 +United Arab Emirates,0.00857184804 +United Kingdom,0.00604061786 +United Republic of Tanzania,0.2534671393 +United States of America,0.01111512627 +Uruguay,0.07986460913 +Uzbekistan,0.2224703387 +Vanuatu,0.2265324542 +Venezuela (Bolivarian Republic of),0.04631998867 +Viet Nam,0.1873509988 +Yemen,0.08833806231 +Zambia,0.1011677284 +Zimbabwe,0.1253035863 diff --git a/src/ac/ed/lurg/InternationalMarket.java b/src/ac/ed/lurg/InternationalMarket.java index 3c329fd61d1a3383803588de7004125a80c6dbeb..6a4b9fa17673069fd2330916dff5e110f0d36b9c 100644 --- a/src/ac/ed/lurg/InternationalMarket.java +++ b/src/ac/ed/lurg/InternationalMarket.java @@ -41,6 +41,7 @@ public class InternationalMarket { void determineInternationalTrade(Collection<AbstractCountryAgent> countryAgents, double gen2EcDDemand, Timestep timestep) { CropToDoubleMap totalImportCommodities = new CropToDoubleMap(); CropToDoubleMap totalExportCommodities = new CropToDoubleMap(); + CropToDoubleMap totalProduction = new CropToDoubleMap(); for (AbstractCountryAgent ca : countryAgents) { // Get values for world input costs @@ -50,6 +51,7 @@ public class InternationalMarket { CropType c = entry.getKey(); double countryNetImports = entry.getValue().getShockedNetImports(); + totalProduction.incrementValue(c, (entry.getValue().getProductionExpected()-entry.getValue().getProductionShock())); if (countryNetImports > 0) totalImportCommodities.incrementValue(c, countryNetImports); @@ -69,7 +71,7 @@ public class InternationalMarket { double exportsBeforeTransportLosses = totalExportCommodities.containsKey(crop) ? totalExportCommodities.get(crop) : 0.0; double previousStockLevel = stockLevel.get(crop); double transportLossRate=(!ModelConfig.SHOCKS_POSSIBLE) ? ModelConfig.TRANSPORT_LOSSES : ModelConfig.getParameter(Parameter.TRANSPORT_LOSSES, timestep.getYear()); - GlobalPrice adjustedPrice = prevPrice.createWithUpdatedMarketPrices(imports, exportsBeforeTransportLosses, exportsBeforeTransportLosses * transportLossRate, (ModelConfig.MARKET_ADJ_PRICE), timestep); + GlobalPrice adjustedPrice = prevPrice.createWithUpdatedMarketPrices(imports, exportsBeforeTransportLosses, exportsBeforeTransportLosses * transportLossRate, (ModelConfig.MARKET_ADJ_PRICE), timestep, totalProduction.get(crop)); LogWriter.println( String.format("Price for %s updated from %s (imports amount %.1f, exports amount %.1f) to %s ", crop.getGamsName(), prevPrice, imports, adjustedPrice.getExportsAfterTransportLosses(), adjustedPrice)); worldPrices.put(crop, adjustedPrice); diff --git a/src/ac/ed/lurg/ModelConfig.java b/src/ac/ed/lurg/ModelConfig.java index e7207624674d1e37e65ed871f49d71e2a22bdf6e..2176b2fe1fc1f1f531340e5622340dfae40feb89 100755 --- a/src/ac/ed/lurg/ModelConfig.java +++ b/src/ac/ed/lurg/ModelConfig.java @@ -177,6 +177,7 @@ public class ModelConfig { public static final String ANIMAL_RATES_FILE = DATA_DIR + File.separator + "animal_numbers.csv";; public static final String INITIAL_CONSUMER_PRICE_FILE = DATA_DIR + File.separator + "consumerprices.csv";; public static final String PRODUCTIONSHOCKS_PARAMETER_FILE = getProperty("PRODUCTIONSHOCKS_PARAMETER_FILE", OUTPUT_DIR + File.separator+ "productionShocks.csv"); + public static final String GDP_FRACTIONS_FILE = DATA_DIR + File.separator + "agriculturalGdpFraction.csv"; // yield data public static final String YIELD_DIR_BASE = getProperty("YIELD_DIR_BASE"); diff --git a/src/ac/ed/lurg/country/AgriculturalGDPManager.java b/src/ac/ed/lurg/country/AgriculturalGDPManager.java new file mode 100644 index 0000000000000000000000000000000000000000..6ed45b66ab46485a2ce2c8cb0cfab141a9aac8e4 --- /dev/null +++ b/src/ac/ed/lurg/country/AgriculturalGDPManager.java @@ -0,0 +1,63 @@ +package ac.ed.lurg.country; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +import ac.ed.lurg.ModelConfig; +import ac.ed.lurg.utils.LogWriter; + + +public class AgriculturalGDPManager { + + private static final int COUNTRY_COL = 0; + private static final int FRACTION_COL = 1; + + private Map<SingleCountry, Double> fractionsMap = new HashMap<SingleCountry, Double>(); + + public AgriculturalGDPManager() { + read(); + } + + + public double getProportion(SingleCountry c) { + LogWriter.println("country in get prop " + c); + return fractionsMap.get(c); + } + + private void read() { + + String filename = ModelConfig.GDP_FRACTIONS_FILE; + try { + BufferedReader fitReader = new BufferedReader(new FileReader(filename)); + String line, countryName; + Double proportion; + fitReader.readLine(); // read header + + while ((line=fitReader.readLine()) != null) { + String[] tokens = line.split(","); + + if (tokens.length < 2) + LogWriter.printlnError("Too few columns in " + filename + ", " + line); + + countryName = tokens[COUNTRY_COL]; + proportion = Double.parseDouble(tokens[FRACTION_COL]); + + SingleCountry country = CountryManager.getForName(countryName); + + fractionsMap.put(country,proportion); + LogWriter.println("country in fractionsMap " + fractionsMap.get(country)); + + } + fitReader.close(); + + } catch (IOException e) { + LogWriter.printlnError("Failed in reading gdp fractions file"); + LogWriter.print(e); + } + LogWriter.println("Processed " + filename); + } + +} diff --git a/src/ac/ed/lurg/country/CountryAgent.java b/src/ac/ed/lurg/country/CountryAgent.java index 06736d5c22b9fe93de0bab0b776ae90282185aaf..bf795fbe5acba73c4b9e16cce31b134222db21ac 100644 --- a/src/ac/ed/lurg/country/CountryAgent.java +++ b/src/ac/ed/lurg/country/CountryAgent.java @@ -225,6 +225,20 @@ public class CountryAgent extends AbstractCountryAgent { return commPricePlum; } + + public void shockGDP() { + + double totalProduction = getTotalProduction(); + double shockMagnitude = 0.0; + Map<CropType, CropUsageData> cropUsages = previousGamsRasterOutput.getCropUsageData(); + + for (CropType crop : CropType.getImportedTypes()) { + + if(cropUsages.get(crop).getProductionExpected() != 0) + shockMagnitude += (cropUsages.get(crop).getProductionShock() /cropUsages.get(crop).getProductionExpected()) * (cropUsages.get(crop).getProductionExpected()/totalProduction); + } + demandManager.updateGdpLossesFromShock(country, currentTimestep.getYear(), shockMagnitude); + } public RasterSet<LandUseItem> getLandUses() { return previousGamsRasterOutput.getLandUses(); @@ -233,4 +247,12 @@ public class CountryAgent extends AbstractCountryAgent { public Map<CropType, CropUsageData> getCropUsageData() { return previousGamsRasterOutput.getCropUsageData(); } + + public double getTotalProduction() { + double totalProduction = 0; + for (CropType crop : CropType.getImportedTypes()) { //assuming pasture and set aside not part of agricultural value, valid or not? + totalProduction += previousGamsRasterOutput.getCropUsageData().get(crop).getProductionExpected(); + } + return totalProduction; + } } \ No newline at end of file diff --git a/src/ac/ed/lurg/country/CountryAgentManager.java b/src/ac/ed/lurg/country/CountryAgentManager.java index 273bd8b4755d69d6a3a732320d057fe7566acb59..256b087f15379074811758b143deae3f92034294 100644 --- a/src/ac/ed/lurg/country/CountryAgentManager.java +++ b/src/ac/ed/lurg/country/CountryAgentManager.java @@ -56,7 +56,7 @@ public class CountryAgentManager { } Map<CropType, Double> tradeBarriers = tradeBarrierManager.getTradeBarriers(cc); - + if (ModelConfig.USE_CRAFTY_COUNTRIES && craftyManager.getCraftyCountries().contains(cc)) { LogWriter.println("Creating CRAFTY agent for: " + cc); CraftyCountryAgent cca = new CraftyCountryAgent(demandManager, cc, tradeBarriers); @@ -79,7 +79,7 @@ public class CountryAgentManager { } else { Map<CropType, Double> subsidyRates = subsidyRateManager.getSubsidyRates(cc); - + CountryAgent ca = new CountryAgent(demandManager, cc, initCountryLandUse, countryCommodityData, tradeBarriers, yieldClusters, subsidyRates); gamsCountryAgents.add(ca); countryAgents.add(ca); @@ -133,6 +133,7 @@ public class CountryAgentManager { public void recalculateDemandForAll() { for (CountryAgent ca : gamsCountryAgents) { + ca.shockGDP(); ca.calculateCountryPricesAndDemand(internationalMarket.getWorldPrices()); } } diff --git a/src/ac/ed/lurg/country/GlobalPrice.java b/src/ac/ed/lurg/country/GlobalPrice.java index 213afeb00caab66ad26fb4db985877b93dbc24f7..dcbaeced3899a1b67c24623f72e28e09548924fb 100644 --- a/src/ac/ed/lurg/country/GlobalPrice.java +++ b/src/ac/ed/lurg/country/GlobalPrice.java @@ -55,16 +55,12 @@ public class GlobalPrice { return transportLosses; } - public GlobalPrice createWithUpdatedMarketPrices(double imports, double exportsBeforeTransportLosses, double transportLosses, boolean adjustPrice, Timestep timestep) { + public GlobalPrice createWithUpdatedMarketPrices(double imports, double exportsBeforeTransportLosses, double transportLosses, boolean adjustPrice, Timestep timestep, double production) { double exportsAfterTransportLosses = exportsBeforeTransportLosses - transportLosses; if (imports > 0 || exportsAfterTransportLosses > 0) { double ratio; - if (imports > exportsAfterTransportLosses) - ratio = (imports-exportsAfterTransportLosses)/imports; - else - ratio = (imports-exportsAfterTransportLosses)/exportsAfterTransportLosses; - + ratio = (imports-exportsAfterTransportLosses)/(imports-exportsAfterTransportLosses+production); double adjustment = adjustPrice ? Math.exp(ratio * ModelConfig.MARKET_LAMBA) : 1.0; //adjustment = Math.min(adjustment, 2.0); // can only double in a time step //adjustment = Math.max(adjustment, 0.5); // can only half in a time step diff --git a/src/ac/ed/lurg/demand/AbstractDemandManager.java b/src/ac/ed/lurg/demand/AbstractDemandManager.java index ce2ce7fd6f87603f2d815c2d484a97a4d05ef85d..18a176741a436eb1da932173c38cce9b1aac7ba3 100644 --- a/src/ac/ed/lurg/demand/AbstractDemandManager.java +++ b/src/ac/ed/lurg/demand/AbstractDemandManager.java @@ -61,6 +61,8 @@ public abstract class AbstractDemandManager { } protected abstract Map<CommodityType, Double> getFoodDemand(SingleCountry c, int year, Map<CommodityType, Double> prices); + + public void updateGdpLossesFromShock(CompositeCountry cc, int year, double shockMagnitude) {} public double getSecondGenBioenergyDemand(Timestep timestep) { int year = ModelConfig.CHANGE_DEMAND_YEAR ? timestep.getYear() : ModelConfig.BASE_YEAR; diff --git a/src/ac/ed/lurg/demand/AbstractSSPDemandManager.java b/src/ac/ed/lurg/demand/AbstractSSPDemandManager.java index 6aadbbeec739d805566cd463f4e698b55ce24e7e..7781a43a54b997f6e36d607e039c42bfbb054f5b 100644 --- a/src/ac/ed/lurg/demand/AbstractSSPDemandManager.java +++ b/src/ac/ed/lurg/demand/AbstractSSPDemandManager.java @@ -4,6 +4,8 @@ import java.util.HashMap; import java.util.Map; import ac.ed.lurg.ModelConfig; +import ac.ed.lurg.country.AgriculturalGDPManager; +import ac.ed.lurg.country.CompositeCountry; import ac.ed.lurg.country.CompositeCountryManager; import ac.ed.lurg.country.CountryManager; import ac.ed.lurg.country.SingleCountry; @@ -17,6 +19,7 @@ public abstract class AbstractSSPDemandManager extends AbstractDemandManager { protected BaseConsumpManager baseConsumpManager; protected CalorieManager calorieManager; private SingleCountry usa; + private AgriculturalGDPManager agriculturalGDPManager; public AbstractSSPDemandManager(String ssp_scenario, BaseConsumpManager baseConsumpManager,CalorieManager calorieManager, CompositeCountryManager compositeCountryManager) { super(compositeCountryManager, calorieManager); @@ -25,6 +28,23 @@ public abstract class AbstractSSPDemandManager extends AbstractDemandManager { this.calorieManager = calorieManager; sspManager = new SspManager(); usa = CountryManager.getForName("United States of America"); + agriculturalGDPManager = new AgriculturalGDPManager(); + } + + @Override + public void updateGdpLossesFromShock(CompositeCountry cc, int year, double shockMagnitude) { + + for (SingleCountry c : compositeCountryManager.getAllForCompositeCountry(cc)) { + SspData sd = sspManager.get(ssp_scenario, year, c); + LogWriter.println("sd data " + sd); + if(sd != null) { + double gdp = sd.getGdp(); + double agriculturalGDPProportion = agriculturalGDPManager.getProportion(c); + double gdpLost = gdp * agriculturalGDPProportion * shockMagnitude; + sd.updateShockedGdpLosses(gdpLost); + } + } + } @Override @@ -40,10 +60,10 @@ public abstract class AbstractSSPDemandManager extends AbstractDemandManager { double gdpPcYear; if((ModelConfig.CONSTANT_DIET_HIGH_INCOME & c.getIncomeGroup().toLowerCase().contains("high")) || (ModelConfig.CONSTANT_DIET_LOW_INCOME & !c.getIncomeGroup().toLowerCase().contains("high"))) - gdpPcYear = sspManager.get(ssp_scenario, ModelConfig.BASE_YEAR, c).getGdpPc(); + gdpPcYear = sspManager.get(ssp_scenario, ModelConfig.BASE_YEAR, c).getShockedGdpPc(); - else gdpPcYear= sd.getGdpPc(); - + else gdpPcYear= sd.getShockedGdpPc(); + SspData usaSd = sspManager.get(ssp_scenario, year, usa); LogWriter.println("Got ssp data for " + c.getCountryName() + " of " + sd); diff --git a/src/ac/ed/lurg/demand/DemandManagerFromFile.java b/src/ac/ed/lurg/demand/DemandManagerFromFile.java index 765730b9dfce9139cf3b8e1b7271eb0249b70371..766ea12c09034046b13277188d8072aae2dfbc31 100644 --- a/src/ac/ed/lurg/demand/DemandManagerFromFile.java +++ b/src/ac/ed/lurg/demand/DemandManagerFromFile.java @@ -47,5 +47,5 @@ public class DemandManagerFromFile extends AbstractDemandManager { return foodDemandMap; } return dietaryAdjustment(foodDemandMap, year, calorieManager.get(c)); - } + } } \ No newline at end of file diff --git a/src/ac/ed/lurg/demand/SspData.java b/src/ac/ed/lurg/demand/SspData.java index 04f83c5c8caabfb31b7078f15fbbd1bc618e2c01..e400f16fa8872b2005e96029d16a319ec09234ac 100644 --- a/src/ac/ed/lurg/demand/SspData.java +++ b/src/ac/ed/lurg/demand/SspData.java @@ -5,11 +5,13 @@ public class SspData { private double population; private double gdp; + private double shockedGdp; public SspData(double population, double gdp) { super(); this.population = population; this.gdp = gdp; + this.shockedGdp = 0.0; } public double getPopulation() { @@ -18,10 +20,18 @@ public class SspData { public double getGdp() { return gdp; } - + public double getGdpPc() { return gdp/population; } + + public double getShockedGdpPc() { + return (gdp - shockedGdp)/population; + } + + public void updateShockedGdpLosses(double gdpLoss) { + shockedGdp = gdpLoss; + } @Override public String toString() {