diff --git a/GAMS/IntExtOpt.gms b/GAMS/IntExtOpt.gms index d7bb4bf9482983e9dbf6f2275700df5fd841977d..23de53504e77f0e24e1bf4beab9a19ee97f1e83c 100644 --- a/GAMS/IntExtOpt.gms +++ b/GAMS/IntExtOpt.gms @@ -22,6 +22,7 @@ PARAMETER yieldFertOnly(crop, location) yield in t per ha; PARAMETER yieldIrrigOnly(crop, location) yield in t per ha; PARAMETER yieldBoth(crop, location) yield in t per ha; + PARAMETER yieldShock(crop, location) rate of yield shock; PARAMETER fertParam(crop, location) yield response to fertilizer parameter; PARAMETER irrigParam(crop, location) yield response to irrigation parameter; PARAMETER demand(all_types) in t; @@ -57,7 +58,7 @@ $gdxin %gdxincname% $load location, suitableLandArea, demand, agriExpansionCost, cropIncCost, pastureIncCost, cropDecCost, pastureDecCost $load previousArea, previousFertIntensity, previousIrrigIntensity, previousOtherIntensity, previousRuminantFeed, previousMonogastricFeed, previousImportAmount, previousExportAmount -$load yieldNone, yieldFertOnly, yieldIrrigOnly, yieldBoth +$load yieldNone, yieldFertOnly, yieldIrrigOnly, yieldBoth, yieldShock $load fertParam, irrigParam, otherIParam, exportPrices, importPrices, maxNetImport, minNetImport, unhandledCropRate, setAsideRate, maxLandExpansionRate, subsidyRate $load meatEfficency, otherICost, irrigCost, irrigMaxRate, irrigConstraint, fertiliserUnitCost, domesticPriceMarkup, minDemandPerCereal, minDemandPerOilcrop, seedAndWasteRate, animalFeedFromOtherSources $gdxin @@ -248,9 +249,11 @@ $gdxin parameter netImportAmount(all_types); parameter netImportCost(all_types); parameter feedCostRate(feed_crop); + parameter productionShock(all_types); * Production quantities based on smaller area (before unhandledCropArea adjustment applied) totalProd(crop) = sum(location, area.l(crop, location) * yield.l(crop, location)); + productionShock(crop) = sum(location, area.l(crop, location) * yield.l(crop, location) * yieldShock(crop, location)); totalProd('ruminants') = meatEfficency*(sum(feed_crop, ruminantFeed.l(feed_crop) * cropDM(feed_crop)) + ruminantOtherFeed); totalProd('monogastrics') = meatEfficency*(sum(feed_crop, monogastricFeed.l(feed_crop) * cropDM(feed_crop)) + monogastricOtherFeed); diff --git a/debug_config.properties b/debug_config.properties index 73b3dc21b578011f48ac77b4b6dd653bfe1bac77..1b2a6f3461ce037b51973c35f48f6bbc4ebb667a 100644 --- a/debug_config.properties +++ b/debug_config.properties @@ -6,8 +6,8 @@ YIELD_FILENAME=yield.out DEBUG_LIMIT_COUNTRIES=false DEBUG_COUNTRY_NAME=Mongolia -IS_CALIBRATION_RUN = false -GENERATE_NEW_YIELD_CLUSTERS = false +IS_CALIBRATION_RUN = true +GENERATE_NEW_YIELD_CLUSTERS = true NUM_YIELD_CLUSTERS=8000 END_TIMESTEP=0 @@ -17,9 +17,9 @@ INTERPOLATE_OUTPUT_YEARS = false CHANGE_YIELD_DATA_YEAR=false -ORIG_LEAST_COST_MIN=false +ORIG_LEAST_COST_MIN=true -DEBUG_JUST_DEMAND_OUTPUT=true +DEBUG_JUST_DEMAND_OUTPUT=false PRICE_ELASTIC_DEMAND=true GAMS_COUNTRY_TO_SAVE=Brazil diff --git a/src/ac/ed/lurg/InternationalMarket.java b/src/ac/ed/lurg/InternationalMarket.java index 47a1f0c68cf76f7a745940b282e3951ef450992c..8315add3c592f3b5fbbdfb1bbbe9116677ee0aeb 100644 --- a/src/ac/ed/lurg/InternationalMarket.java +++ b/src/ac/ed/lurg/InternationalMarket.java @@ -48,7 +48,8 @@ public class InternationalMarket { for (Entry<CropType, CropUsageData> entry : cropUsage.entrySet()) { CropType c = entry.getKey(); - double countryNetImports = entry.getValue().getShockedNetImports() != null ? entry.getValue().getShockedNetImports() : entry.getValue().getNetImports(); + + double countryNetImports = entry.getValue().getShockedNetImports(); if (countryNetImports > 0) totalImportCommodities.incrementValue(c, countryNetImports); diff --git a/src/ac/ed/lurg/ModelMain.java b/src/ac/ed/lurg/ModelMain.java index dacfeac8e2504f8214edf0da534dd01cfabef0f7..af3bbfe7bac314baa610345c87b134530d4e49f7 100644 --- a/src/ac/ed/lurg/ModelMain.java +++ b/src/ac/ed/lurg/ModelMain.java @@ -197,7 +197,7 @@ public class ModelMain { Map<CropType, CropUsageData> allCropUsage = ca.getCropUsageData(); CropUsageData cropUsage = allCropUsage.get(crop); if (cropUsage != null) { - prod += cropUsage.getProduction(); + prod += cropUsage.getProductionExpected(); prodArea += cropUsage.getArea(); feedMonogastrics += cropUsage.getMonogastricFeed(); feedRuminants += cropUsage.getRuminantFeed(); @@ -265,7 +265,7 @@ public class ModelMain { private void writeDomesticProductionFile(Timestep timestep) { try { - StringBuffer sbHeadings = new StringBuffer("Year, Country, Crop, Area, Production, Production_cost, Import_price, Export_price, Net_imports, Net_import_cost, Rum_feed_amount, Mon_feed_amount"); + StringBuffer sbHeadings = new StringBuffer("Year, Country, Crop, Area, Production, Production_cost, Import_price, Export_price, Net_imports, Net_import_cost, Prod_shock, Rum_feed_amount, Mon_feed_amount"); BufferedWriter outputFile = FileWriterHelper.getFileWriter(timestep, ModelConfig.DOMESTIC_OUTPUT_FILE, sbHeadings.toString()); for (CropType crop : CropType.getAllItems()) { @@ -277,28 +277,29 @@ public class ModelMain { if (cropUsage == null) continue; - Double prodCosts = cropUsage.getProdCost(); - Double prod = cropUsage.getProduction(); - Double area = cropUsage.getArea(); - Double rumFeedAmount = cropUsage.getRuminantFeed(); - Double monFeedAmount = cropUsage.getMonogastricFeed(); + double prodCosts = cropUsage.getProdCost(); + double prod = cropUsage.getProductionExpected(); + double prodShock = cropUsage.getProductionShock(); + double area = cropUsage.getArea(); + double rumFeedAmount = cropUsage.getRuminantFeed(); + double monFeedAmount = cropUsage.getMonogastricFeed(); - Double importPrice = null; - Double exportPrice = null; - Double netImports = null; - Double netImportCost = null; + double importPrice = 0; + double exportPrice = 0 ; + double netImports = 0; + double netImportCost = 0; if (crop.isImportedCrop()) { CountryPrice px = country.getCurrentCountryPrices().get(crop); importPrice = px.getImportPrice(); exportPrice = px.getExportPrice(); - netImports = cropUsage.getNetImports(); //this isn't accounting for transport losses in exports - netImportCost = cropUsage.getNetImportCost(); + netImports = cropUsage.getNetImportsExpected(); //this isn't accounting for transport losses in exports + netImportCost = cropUsage.getNetImportCostExpected(); } StringBuffer sbData = new StringBuffer(); sbData.append(String.format("%d,%s,%s", timestep.getYear(), country.getCountry(), crop.getGamsName())); - sbData.append(String.format(",%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f", area, prod, prodCosts, importPrice, exportPrice, netImports, netImportCost, rumFeedAmount, monFeedAmount)); + sbData.append(String.format(",%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f", area, prod, prodCosts, importPrice, exportPrice, netImports, netImportCost, prodShock, rumFeedAmount, monFeedAmount)); outputFile.write(sbData.toString()); outputFile.newLine(); @@ -348,7 +349,7 @@ public class ModelMain { CropUsageData cropusage = cropUsageAllCrops.get(crop); if (cropusage == null) continue; - double prod = cropusage.getProduction(); + double prod = cropusage.getProductionExpected(); Map<String, Double> animalRates = animalRateManager.getAnimalRates(country.getCountry(), crop); for (Entry<String, Double> entry : animalRates.entrySet()) { @@ -553,7 +554,7 @@ public class ModelMain { } private YieldRaster getYieldSurfaces(Timestep timestep) { - return lpjYieldReader.getShockedRasterData(timestep); + return lpjYieldReader.getRasterData(timestep); } /** Get irrigation data that does not change with time, should only be called once */ diff --git a/src/ac/ed/lurg/country/AbstractCountryAgent.java b/src/ac/ed/lurg/country/AbstractCountryAgent.java index 37a709956278ef5f3c75d593abb3fbf16af9f0d4..33d81da774f648e9c4093b17e55496bbc95f6425 100644 --- a/src/ac/ed/lurg/country/AbstractCountryAgent.java +++ b/src/ac/ed/lurg/country/AbstractCountryAgent.java @@ -121,7 +121,7 @@ public abstract class AbstractCountryAgent { for (CropType crop : commodity.getCropTypes()) { CropUsageData cropUsage = cropUsages.get(crop); - double prod = cropUsage.getProduction() *(1-crop.getSeedAndWasteRate()) - cropUsage.getMonogastricFeed() - cropUsage.getRuminantFeed(); + double prod = cropUsage.getProductionExpected() *(1-crop.getSeedAndWasteRate()) - cropUsage.getMonogastricFeed() - cropUsage.getRuminantFeed(); totalProd += prod; double minFract = minDemandFracts.get(commodity).containsKey(crop) ? minDemandFracts.get(commodity).get(crop) : 0.0; double netImportsFromMinDemand = minFract * demand - prod; @@ -158,7 +158,7 @@ public abstract class AbstractCountryAgent { // simple 1-1 commodity to cereal mappings for (CropType crop : commodity.getCropTypes()) { CropUsageData cropUsage = cropUsages.get(crop); - double prod = cropUsage.getProduction() *(1-crop.getSeedAndWasteRate()) - cropUsage.getMonogastricFeed() - cropUsage.getRuminantFeed(); + double prod = cropUsage.getProductionExpected() *(1-crop.getSeedAndWasteRate()) - cropUsage.getMonogastricFeed() - cropUsage.getRuminantFeed(); double netImports = demand - prod; LogWriter.println("Updating net imports " + crop + " to " + netImports); cropUsage.updateNetImports(netImports); diff --git a/src/ac/ed/lurg/country/CountryAgent.java b/src/ac/ed/lurg/country/CountryAgent.java index 1ab0bae7bd5af0801462f251fef50ea94e647042..3fff02ae45e1e66903eb4e253e4254b8334e4135 100644 --- a/src/ac/ed/lurg/country/CountryAgent.java +++ b/src/ac/ed/lurg/country/CountryAgent.java @@ -102,7 +102,7 @@ public class CountryAgent extends AbstractCountryAgent { } public GamsRasterOutput determineProduction(Timestep timestep, YieldRaster countryYieldSurfaces, RasterSet<IrrigationItem> irrigData, - Map<CropType, GlobalPrice> worldPrices, double globalGen2EcIncrease, Map<CropType,Double> productionShocks) { + Map<CropType, GlobalPrice> worldPrices, double globalGen2EcIncrease) { currentTimestep = timestep; calculateCountryPrices(worldPrices, currentTimestep); @@ -137,14 +137,6 @@ public class CountryAgent extends AbstractCountryAgent { GamsRasterOutput result = opti.run(); - for (Entry<CropType, Double> entry : productionShocks.entrySet()) { - if(entry != null) { - CropType crop = entry.getKey(); - double shockValue = entry.getValue(); - result.getCropUsageData().get(crop).updateForShock(shockValue); - } - - } // No longer need this as even profit max calcs imports in GAMS now // if (!ModelConfig.ORIG_LEAST_COST_MIN) { // GamsCountryInput countryInput = input.getCountryInput(); @@ -188,12 +180,12 @@ public class CountryAgent extends AbstractCountryAgent { for (Map.Entry<CropType, CropUsageData> entry : previousGamsRasterOutput.getCropUsageData().entrySet()) { CropUsageData cropUsage = entry.getValue(); CropType crop = entry.getKey(); - double baseTrade = cropUsage.getNetImports(); + double baseTrade = cropUsage.getNetImportsExpected(); double changeUp = 0.0; double changeDown = 0.0; if (allowedImportChange > 0.0) { - double maxOfProdOrSupply = cropUsage.getProduction() + Math.max(baseTrade, 0); //max of supply for food + double maxOfProdOrSupply = cropUsage.getProductionExpected() + Math.max(baseTrade, 0); //max of supply for food // max of supply overall, needed for when imports are supplying feed and change is zero to allow for production to replace imports // CONFUSING NOT SURE IF NEEDED if (maxOfProdOrSupply == 0) maxOfProdOrSupply = Math.max(cropUsage.getNetImports() + cropUsage.getProduction() , cropUsage.getProduction()); diff --git a/src/ac/ed/lurg/country/CountryAgentManager.java b/src/ac/ed/lurg/country/CountryAgentManager.java index faae8d2aae50c875f01f4d4561f96c4cb53c1bb2..3c59266712c3800427b72d0b7068906098dee646 100644 --- a/src/ac/ed/lurg/country/CountryAgentManager.java +++ b/src/ac/ed/lurg/country/CountryAgentManager.java @@ -15,7 +15,6 @@ import ac.ed.lurg.landuse.CropUsageData; import ac.ed.lurg.landuse.IrrigationItem; import ac.ed.lurg.landuse.IrrigationRasterSet; import ac.ed.lurg.landuse.LandUseItem; -import ac.ed.lurg.shock.ProductionShockManager; import ac.ed.lurg.types.CropType; import ac.ed.lurg.utils.LogWriter; import ac.ed.lurg.yield.YieldRaster; @@ -27,7 +26,6 @@ public class CountryAgentManager { private AbstractDemandManager demandManager; private TradeManager tradeBarrierManager; private SubsidyRateManager subsidyRateManager; - private ProductionShockManager productionShockManager; private InternationalMarket internationalMarket; private CountryBoundaryRaster countryBoundaryRaster; private RasterSet<IntegerRasterItem> clusterIdRaster; @@ -47,7 +45,6 @@ public class CountryAgentManager { this.internationalMarket = internationalMarket; this.globalLandUseRaster = globalLandUseRaster; tradeBarrierManager = new TradeManager(compositeCountryManager); - productionShockManager = new ProductionShockManager(); subsidyRateManager = new SubsidyRateManager(compositeCountryManager); craftyManager = new CraftyProdManager(); } @@ -111,11 +108,10 @@ public class CountryAgentManager { Collection<RasterKey> countryKeys = countryBoundaryRaster.getKeysFor(ca.getCountry()); YieldRaster countryYieldSurfaces = yieldSurfaces.createSubsetForKeys(countryKeys); RasterSet<IrrigationItem> irrigData = currentIrrigationData.createSubsetForKeys(countryKeys); - Map<CropType, Double> productionShocks=productionShockManager.getShocksForCountry(timestep, ca.getCountry()); // do the optimization try { - ca.determineProduction(timestep, countryYieldSurfaces, irrigData, internationalMarket.getWorldPrices(), gen2Increase, productionShocks); + ca.determineProduction(timestep, countryYieldSurfaces, irrigData, internationalMarket.getWorldPrices(), gen2Increase); // update global rasters globalLandUseRaster.putAll(ca.getLandUses()); diff --git a/src/ac/ed/lurg/country/gams/GamsLocationOptimiser.java b/src/ac/ed/lurg/country/gams/GamsLocationOptimiser.java index dfd245c294d12c03654f0105b90532901eb200ac..b08f26f1a4e0dbfa248a3e516953f8e5dbdc0ca3 100644 --- a/src/ac/ed/lurg/country/gams/GamsLocationOptimiser.java +++ b/src/ac/ed/lurg/country/gams/GamsLocationOptimiser.java @@ -197,11 +197,12 @@ public class GamsLocationOptimiser { } } - if (DEBUG) LogWriter.println("\nYield (fert/irrig) None/None, Max/None, None/Max, Max/Max,\t [fert p],\t [irrig p],\t {max irrig}"); + if (DEBUG) LogWriter.println("\nYield (fert/irrig) None/None, Max/None, None/Max, Max/Max, Shock,\t [fert p],\t [irrig p],\t {max irrig}"); GAMSParameter yNoneP = inDB.addParameter("yieldNone", 2); GAMSParameter y_fert = inDB.addParameter("yieldFertOnly", 2); GAMSParameter y_irrig = inDB.addParameter("yieldIrrigOnly", 2); GAMSParameter y_both = inDB.addParameter("yieldBoth", 2); + GAMSParameter y_shock = inDB.addParameter("yieldShock", 2); GAMSParameter fert_p = inDB.addParameter("fertParam", 2); GAMSParameter irrig_p = inDB.addParameter("irrigParam", 2); GAMSParameter irrigMaxP = inDB.addParameter("irrigMaxRate", 2); @@ -224,14 +225,15 @@ public class GamsLocationOptimiser { double maxIrrig = irrigationItem.getMaxIrrigAmount(crop); - if (DEBUG) LogWriter.println(String.format("%d %15s,\t %.1f,\t %.1f, \t %.1f,\t %.1f,\t\t [%.2f],\t [%.2f],\t {%.2f}", - locationId, crop.getGamsName(), yresp.getYieldNone(crop), yresp.getYieldFertOnly(crop), yresp.getYieldIrrigOnly(crop), yresp.getYieldMax(crop), + if (DEBUG) LogWriter.println(String.format("%d %15s,\t %.1f,\t %.1f, \t %.1f,\t %.1f,\t %.2f,\t\t [%.2f],\t [%.2f],\t {%.2f}", + locationId, crop.getGamsName(), yresp.getYieldNone(crop), yresp.getYieldFertOnly(crop), yresp.getYieldIrrigOnly(crop), yresp.getYieldMax(crop), yresp.getShockRate(crop), yresp.getFertParam(crop), yresp.getIrrigParam(crop), maxIrrig)); setGamsParamValue(yNoneP.addRecord(v), yresp.getYieldNone(crop), 4); setGamsParamValue(y_fert.addRecord(v), yresp.getYieldFertOnly(crop), 4); setGamsParamValue(y_irrig.addRecord(v), yresp.getYieldIrrigOnly(crop), 4); setGamsParamValue(y_both.addRecord(v), yresp.getYieldMax(crop), 4); + setGamsParamValue(y_shock.addRecord(v), yresp.getShockRate(crop), 4); setGamsParamValue(fert_p.addRecord(v), yresp.getFertParam(crop), 4); setGamsParamValue(irrig_p.addRecord(v), yresp.getIrrigParam(crop), 4); setGamsParamValue(irrigMaxP.addRecord(v), maxIrrig, 3); @@ -266,7 +268,7 @@ public class GamsLocationOptimiser { double exportPrice = gp.getExportPrice(); CropUsageData cu = countryInput.getPreviousCropUsageData().get(crop); - double netImports = cu.getNetImports(); + double netImports = cu.getNetImportsExpected(); double imports = netImports>0 ? netImports : 0; double exports = netImports<0 ? -netImports : 0; @@ -356,6 +358,7 @@ public class GamsLocationOptimiser { GAMSParameter parmProdCost = outDB.getParameter("totalProdCost"); GAMSParameter parmCroplandArea = outDB.getParameter("totalCropland"); GAMSParameter parmTotalArea = outDB.getParameter("totalArea"); + GAMSParameter parmProdShock = outDB.getParameter("productionShock"); double totalCropArea = 0; double totalPastureArea = 0; @@ -390,9 +393,10 @@ public class GamsLocationOptimiser { prod = getParmValue(parmProd, itemName); prodCost = getParmValue(parmProdCost, itemName); double totalArea = getParmValue(parmTotalArea, itemName); + double prodShock = getParmValue(parmProdShock, itemName); - cropUsageData.put(cropType, new CropUsageData(ruminantFeed, monogastricFeed, netImport, netImportCost, prod, prodCost, totalArea)); - if (DEBUG) LogWriter.println(String.format("\n%s:\tarea= %.1f,\tmonogastricFeed= %.1f,\truminantFeed= %.1f,\tnetImports= %.3f,\tnetImportCost= %.3f,\tprod= %.3f,\tprodCost= %.3f,\tprodCostRate= %.3f", itemName, totalArea, monogastricFeed, ruminantFeed, netImport, netImportCost, prod, prodCost, prodCost/prod)); + cropUsageData.put(cropType, new CropUsageData(ruminantFeed, monogastricFeed, netImport, netImportCost, prod, prodCost, totalArea, prodShock)); + if (DEBUG) LogWriter.println(String.format("\n%s:\tarea= %.1f,\tmonogastricFeed= %.1f,\truminantFeed= %.1f,\tnetImports= %.3f,\tnetImportCost= %.3f,\tprod= %.3f, \tprodCost= %.3f,\tprodCostRate= %.3f,\tprodShock= %.3f", itemName, totalArea, monogastricFeed, ruminantFeed, netImport, netImportCost, prod, prodCost, prodCost/prod, prodShock)); } @@ -424,14 +428,14 @@ public class GamsLocationOptimiser { prod = getParmValue(parmProd, meatTypes.getGamsName()); prodCost = getParmValue(parmProdCost, meatTypes.getGamsName()); - cropUsageData.put(meatTypes, new CropUsageData(0.0, 0.0, netImport, netImportCost, prod, prodCost, Double.NaN)); + cropUsageData.put(meatTypes, new CropUsageData(0.0, 0.0, netImport, netImportCost, prod, prodCost, Double.NaN, 0)); if (DEBUG) LogWriter.println(String.format("\n%s:\t\t\t\t\tnetImports= %.3f,\tnetImportCost= %.3f,\tprod= %.3f,\tprodCost= %.3f", meatTypes.getGamsName(), netImport, netImportCost, prod, prodCost)); } LogWriter.println(String.format("\n%s %s: Total area= %.1f (crop=%.1f, pasture %.1f)", inputData.getCountryInput().getCountry(), inputData.getTimestep().getYear(), totalCropArea+totalPastureArea, totalCropArea, totalPastureArea)); - GamsLocationOutput results = new GamsLocationOutput(modelStatus, landUses, cropUsageData, null); + GamsLocationOutput results = new GamsLocationOutput(modelStatus, landUses, cropUsageData); return results; } diff --git a/src/ac/ed/lurg/country/gams/GamsLocationOutput.java b/src/ac/ed/lurg/country/gams/GamsLocationOutput.java index 5e8d1abf4dd69e54987a4a4fd4263fece059b4bf..df3ed1a1ea10d85f142bcbf29993035e978c90ad 100644 --- a/src/ac/ed/lurg/country/gams/GamsLocationOutput.java +++ b/src/ac/ed/lurg/country/gams/GamsLocationOutput.java @@ -14,8 +14,7 @@ public class GamsLocationOutput { public GamsLocationOutput(int status, Map<Integer, LandUseItem> landUses, - Map<CropType, CropUsageData> cropUsageData, - Map<CropType, Double> cropAdjustments) { + Map<CropType, CropUsageData> cropUsageData) { super(); this.status = status; this.landUses = landUses; diff --git a/src/ac/ed/lurg/country/gams/GamsRasterOptimiser.java b/src/ac/ed/lurg/country/gams/GamsRasterOptimiser.java index e222e515c3681c47c76ab412d5d40d9f053f27a2..b6602c587c6356b96f3672708019d982c47bd8a2 100644 --- a/src/ac/ed/lurg/country/gams/GamsRasterOptimiser.java +++ b/src/ac/ed/lurg/country/gams/GamsRasterOptimiser.java @@ -366,6 +366,13 @@ public class GamsRasterOptimiser { aggYResp.setYield(yieldType, crop, updatedYield); } } + + double s = yresp.getShockRate(crop); + if (!Double.isNaN(s)) { + double shockSoFar = aggYResp.getShockRate(crop); + double updatedShock = aggregateMean(shockSoFar, suitableAreaSoFar, s, suitableAreaThisTime); + aggYResp.setShockRate(crop, updatedShock); + } } double areaSoFar = aggLandUse.getCropArea(crop); diff --git a/src/ac/ed/lurg/landuse/CropUsageData.java b/src/ac/ed/lurg/landuse/CropUsageData.java index 1299392bb2643ad1dcebc578a2f617c5cc54c1c7..4f6049ae0ae97dfcbad5fc2d4ae3e9e80115317b 100644 --- a/src/ac/ed/lurg/landuse/CropUsageData.java +++ b/src/ac/ed/lurg/landuse/CropUsageData.java @@ -4,26 +4,26 @@ public class CropUsageData { private double ruminantFeed; private double monogastricFeed; - private double netImports; - private double netImportCost; + private double netImportsExpected; + private double prodShock; + private double netImportCostExpected; private double prod; private double prodCost; private double area; - private Double shockedNetImports; - private Double shockedProd; public CropUsageData(double prod) { this.prod = prod; } - public CropUsageData(double ruminantFeed, double monogastricFeed, double netImports, double netImportCost, double prod, double prodCost, double area) { + public CropUsageData(double ruminantFeed, double monogastricFeed, double netImportsExpected, double netImportCost, double prod, double prodCost, double area, double prodShock) { this.ruminantFeed = ruminantFeed; this.monogastricFeed = monogastricFeed; - this.netImports = netImports; - this.netImportCost = netImportCost; + this.netImportsExpected = netImportsExpected; + this.netImportCostExpected = netImportCost; this.prod = prod; this.prodCost = prodCost; this.area= area; + this.prodShock = prodShock; } public double getRuminantFeed() { @@ -34,24 +34,24 @@ public class CropUsageData { return monogastricFeed; } - public double getNetImportCost() { - return netImportCost; + public double getNetImportCostExpected() { + return netImportCostExpected; } - public double getNetImports() { - return netImports; + public double getNetImportsExpected() { + return netImportsExpected; } - public double getProduction() { + public double getProductionExpected() { return prod; } - public Double getShockedNetImports() { - return shockedNetImports; + public double getShockedNetImports() { + return netImportsExpected + prodShock; } - public Double getShockedProduction() { - return shockedProd; + public double getProductionShock() { + return prodShock; } public double getProdCost() { @@ -59,20 +59,10 @@ public class CropUsageData { } public void updateNetImports(double netImports) { - this.netImports = netImports; + this.netImportsExpected = netImports; } public double getArea(){ return area; } - - public void updateForShock(double shockValue) { - - double productionLoss = prod*shockValue; - this.shockedProd = prod - productionLoss; - this.shockedNetImports = netImports + productionLoss; - - } - - -} +} \ No newline at end of file diff --git a/src/ac/ed/lurg/landuse/CropUsageReader.java b/src/ac/ed/lurg/landuse/CropUsageReader.java index 8882fb170899f426ab4db5a49cdf9017cdcb4527..195475162e0fe17cf77c44cfde047dd75a2aa9f4 100644 --- a/src/ac/ed/lurg/landuse/CropUsageReader.java +++ b/src/ac/ed/lurg/landuse/CropUsageReader.java @@ -33,7 +33,7 @@ public class CropUsageReader { LazyHashMap<CompositeCountry, Map<CropType, CropUsageData>> commodityMap = new LazyHashMap<CompositeCountry, Map<CropType, CropUsageData>>() { protected Map<CropType, CropUsageData> createValue() { Map<CropType, CropUsageData> countryData = new HashMap<CropType, CropUsageData>(); - countryData.put(CropType.ENERGY_CROPS, new CropUsageData(Double.NaN, Double.NaN, 0.0, Double.NaN,Double.NaN, Double.NaN, Double.NaN)); // 2nd generation energy crops not in FAO data, so adding zero values. + countryData.put(CropType.ENERGY_CROPS, new CropUsageData(Double.NaN, Double.NaN, 0.0, Double.NaN,Double.NaN, Double.NaN, Double.NaN, 0)); // 2nd generation energy crops not in FAO data, so adding zero values. return countryData; } }; @@ -66,11 +66,11 @@ public class CropUsageReader { // aggregate if multiple countries for cc if (oldData != null) { - netImports += oldData.getNetImports(); - production += oldData.getProduction(); + netImports += oldData.getNetImportsExpected(); + production += oldData.getProductionExpected(); } - CropUsageData newData = new CropUsageData(0, 0, netImports, Double.NaN, production, Double.NaN, Double.NaN); + CropUsageData newData = new CropUsageData(0, 0, netImports, Double.NaN, production, Double.NaN, Double.NaN, 0); countryData.put(crop, newData); } fitReader.close(); diff --git a/src/ac/ed/lurg/shock/YieldShockManager.java b/src/ac/ed/lurg/shock/YieldShockManager.java index 76f6d87cf09c5a524e4faa0d07ed2f869f1a5686..00f0858664ada4baf2289de1c026884efdc81b2d 100644 --- a/src/ac/ed/lurg/shock/YieldShockManager.java +++ b/src/ac/ed/lurg/shock/YieldShockManager.java @@ -55,7 +55,7 @@ public class YieldShockManager { return yieldShockMap; } - public void applyShock(YieldRaster yieldRaster, Timestep timestep) { + public void setShocks(YieldRaster yieldRaster, Timestep timestep) { Map<String, String> queryMap = new HashMap<String, String>(); queryMap.put("year", Integer.toString(timestep.getYear())); @@ -87,9 +87,8 @@ public class YieldShockManager { if (value.isShocked()) { YieldResponsesItem yieldRespItem = yieldRaster.get(entry.getKey()); if (yieldRespItem != null) - yieldRespItem.adjustYields(crop, yieldAdjustment); + yieldRespItem.setShockRate(crop, yieldAdjustment); } } - return ; } -} +} \ No newline at end of file diff --git a/src/ac/ed/lurg/yield/LPJYieldResponseMapReader.java b/src/ac/ed/lurg/yield/LPJYieldResponseMapReader.java index ed9832d766114f3bc0a4164fba3c0d8a839ad94e..19263fe102b462bd54e11801be7f819f3cc01aad 100644 --- a/src/ac/ed/lurg/yield/LPJYieldResponseMapReader.java +++ b/src/ac/ed/lurg/yield/LPJYieldResponseMapReader.java @@ -24,16 +24,10 @@ public class LPJYieldResponseMapReader { private YieldShockManager yieldShockManager; public LPJYieldResponseMapReader(RasterHeaderDetails rasterProj) { - this.rasterProj = rasterProj; + this.rasterProj = rasterProj; yieldShockManager = new YieldShockManager(rasterProj); } - public YieldRaster getShockedRasterData(Timestep timestep) { - YieldRaster yieldRaster = getRasterData(timestep); - yieldShockManager.applyShock(yieldRaster, timestep); - return yieldRaster; - } - public YieldRaster getRasterData(Timestep timestep) { String rootDir = timestep.getYearSubDir(ModelConfig.YIELD_DIR); @@ -60,6 +54,8 @@ public class LPJYieldResponseMapReader { readNppFile(yieldRaster, rootDir+File.separator+ModelConfig.ANPP_FILENAME); readYieldFile(yieldRaster, rootDir+File.separator+ModelConfig.YIELD_FILENAME); + yieldShockManager.setShocks(yieldRaster, timestep); + return yieldRaster; } diff --git a/src/ac/ed/lurg/yield/YieldResponse.java b/src/ac/ed/lurg/yield/YieldResponse.java index 66c9272c1b86c5614feef1c7606b007bdd45cff7..86e1e9b2a66110c20f554b4cfd9a50422a2d7230 100644 --- a/src/ac/ed/lurg/yield/YieldResponse.java +++ b/src/ac/ed/lurg/yield/YieldResponse.java @@ -7,7 +7,8 @@ import ac.ed.lurg.ModelConfig; import ac.ed.lurg.types.YieldType; public class YieldResponse { - Map<YieldType, Double> yields = new HashMap<YieldType, Double>(); + private Map<YieldType, Double> yields = new HashMap<YieldType, Double>(); + private double yieldShock; private double fertParm; private double irrigParm; @@ -62,9 +63,11 @@ public class YieldResponse { // return Math.log((yMid - yMin)/(yMax - yMin)) / Math.log((xMid - xMin)/(xMax - xMin)) / xMax; // Cobb-Douglas } - public void adjustYields(double adjustment) { - for (Map.Entry<YieldType, Double> entry : yields.entrySet()) { - yields.put(entry.getKey(), entry.getValue() * (1-adjustment)); - } + public void setShock(double yieldShock) { + this.yieldShock = yieldShock; + } + + public double getShock() { + return yieldShock; } } \ No newline at end of file diff --git a/src/ac/ed/lurg/yield/YieldResponsesItem.java b/src/ac/ed/lurg/yield/YieldResponsesItem.java index 97b2a5d3a3068e916bb05f40541704f70b344f4a..e78fa2ff79316084cd243949d99aa0d0a9265720 100644 --- a/src/ac/ed/lurg/yield/YieldResponsesItem.java +++ b/src/ac/ed/lurg/yield/YieldResponsesItem.java @@ -57,8 +57,11 @@ public class YieldResponsesItem implements RasterItem { return getYieldResponseForCrop(crop).getIrrigParam(); } - public void adjustYields(CropType crop, double adjustment) { - YieldResponse yresp = getYieldResponseForCrop(crop); - yresp.adjustYields(adjustment); + public void setShockRate(CropType crop, double yieldShock) { + getYieldResponseForCrop(crop).setShock(yieldShock); + } + + public double getShockRate(CropType crop) { + return getYieldResponseForCrop(crop).getShock(); } } \ No newline at end of file