diff --git a/GAMS/IntExtOpt.gms b/GAMS/IntExtOpt.gms index 35bdcdc5070ca0bdad8f065c44b166f9c2a0d972..64029a6a85526750b2fc1e54b0346969b9ae464b 100644 --- a/GAMS/IntExtOpt.gms +++ b/GAMS/IntExtOpt.gms @@ -5,6 +5,7 @@ SET not_feed_crops(crop) / fruits, starchyRoots, treenuts, vegetables, pulses, pasture_or_meat /; SET location / 1*5 /; + PARAMETER landArea(location) areas of land in ha; PARAMETER previous_area(crop, location) areas for previous timestep in ha; PARAMETER yieldNone(crop, location) yield in t per ha; PARAMETER yieldFertOnly(crop, location) yield in t per ha; @@ -24,7 +25,7 @@ SCALAR minFeedRate minimum rate of feed for producing animal products; $gdxin %gdxincname% -$load previous_area, demand, yieldNone, yieldFertOnly, yieldIrrigOnly, yieldBoth, fertParam, irrigParam, world_input_energy, maxNetImport, minNetImport, meatEfficency, maxLandUseChange, tradeBarrier, landChangeEnergy, minFeedRate +$load landArea, previous_area, demand, yieldNone, yieldFertOnly, yieldIrrigOnly, yieldBoth, fertParam, irrigParam, world_input_energy, maxNetImport, minNetImport, meatEfficency, maxLandUseChange, tradeBarrier, landChangeEnergy, minFeedRate $gdxin SCALAR delta use to smooth power function see 7.5 www.gams.com dd docs solversconopt.pdf / 0.00000000001 / @@ -59,6 +60,7 @@ $gdxin MEAT_DEMAND_CONSTRAINT satisfy demand for crop MAX_FERT_INTENSITY_CONSTRAINT(crop, location) constraint on maximum fertilizer intensity MAX_IRRIG_INTENSITY_CONSTRAINT(crop, location) constraint on maximum irrigation intensity + TOTAL_LAND_CHANGE_CONSTRAINT(location) constraint on the rate of land use change CROPLAND_CHANGE_CONSTRAINT(location) constraint on the rate of land use change PASTURE_CHANGE_CONSTRAINT(location) constraint on the rate of land use change AGRI_LAND_INCREASE_CONSTRAINT(location) constraint expansion of agricultural land @@ -96,6 +98,8 @@ $gdxin MAX_IRRIG_INTENSITY_CONSTRAINT(crop, location) .. irrigI(crop, location) =L= 1; + TOTAL_LAND_CHANGE_CONSTRAINT(location) .. landArea(location) =G= sum(crop, area(crop, location)); + CROPLAND_CHANGE_CONSTRAINT(location) .. 1 - sum(crop_less_pasture, area(crop_less_pasture, location))/sum(crop_less_pasture, previous_area(crop_less_pasture, location)) =L= maxLandUseChange; PASTURE_CHANGE_CONSTRAINT(location) .. 1 - area('pasture_or_meat', location)/previous_area('pasture_or_meat', location) =L= maxLandUseChange; diff --git a/src/ac/ed/lurg/ModelMain.java b/src/ac/ed/lurg/ModelMain.java index cbde493f792cba63cf707bf84795014fb3f4b292..d13f045004bc2e7d7bb022ffbeb344b3f52c90a3 100644 --- a/src/ac/ed/lurg/ModelMain.java +++ b/src/ac/ed/lurg/ModelMain.java @@ -10,7 +10,7 @@ import ac.ed.lurg.types.CropType; import ac.ed.lurg.types.ModelFitType; import ac.ed.lurg.types.YieldType; import ac.ed.lurg.yield.YieldManager; -import ac.ed.lurg.yield.YieldResponses; +import ac.ed.lurg.yield.YieldResponsesItem; import ac.ed.lurg.yield.YieldResponseMapReader; import ac.sac.raster.RasterSet; @@ -43,7 +43,7 @@ public class ModelMain { } private void doTimestep(int timestep) { - RasterSet<YieldResponses> yieldSurfaces = getYieldSurfaces(timestep); + RasterSet<YieldResponsesItem> yieldSurfaces = getYieldSurfaces(timestep); for (CountryAgent ca : countryAgents) { ca.determineProduction(timestep); @@ -52,9 +52,9 @@ public class ModelMain { // examine global trade balance } - private RasterSet<YieldResponses> getYieldSurfaces(int timestep) { + private RasterSet<YieldResponsesItem> getYieldSurfaces(int timestep) { String rootDir = ModelConfig.YIELD_DIR + File.separator + (timestep + ModelConfig.START_TIMESTEP) + File.separator; - RasterSet<YieldResponses> yieldSurfaces = null; + RasterSet<YieldResponsesItem> yieldSurfaces = null; for (CropType cropType : CropType.values()) { for (YieldType yieldType : YieldType.values()) { diff --git a/src/ac/ed/lurg/country/CountryAgent.java b/src/ac/ed/lurg/country/CountryAgent.java index 8d05fd3308b7e24d200924b0cbed909c557e100f..c5b97f3935884f6b4653355bec66804d0e335f03 100644 --- a/src/ac/ed/lurg/country/CountryAgent.java +++ b/src/ac/ed/lurg/country/CountryAgent.java @@ -9,28 +9,29 @@ import ac.ed.lurg.country.gams.GamsCountryInput; import ac.ed.lurg.country.gams.GamsInput; import ac.ed.lurg.country.gams.GamsLandUseOptimiser; import ac.ed.lurg.country.gams.GamsOutput; -import ac.ed.lurg.landuse.CropAreas; +import ac.ed.lurg.landuse.AreasItem; import ac.ed.lurg.types.CropType; +import ac.ed.lurg.types.LandDataType; import ac.ed.lurg.utils.LogWriter; -import ac.ed.lurg.yield.YieldResponses; +import ac.ed.lurg.yield.YieldResponsesItem; public class CountryAgent { private ModelContext modelContext; private Country country; - private Map<Integer, CropAreas> cropAreasTimeseries = new HashMap<Integer, CropAreas>(); - private Map<Integer, LandCoverAreas> landUseAreasTimeseries = new HashMap<Integer, LandCoverAreas>(); + private Map<Integer, AreasItem> cropAreasTimeseries = new HashMap<Integer, AreasItem>(); +// private Map<Integer, LandCoverAreas> landUseAreasTimeseries = new HashMap<Integer, LandCoverAreas>(); private int currentTimestep; private Map<CropType, Double> currentProjectedDemand; private Map<CropType, Double> currentRefYield; - public CountryAgent(ModelContext modelContext, Country country, CropAreas initialCropAreas, LandCoverAreas initialLandCover) { + public CountryAgent(ModelContext modelContext, Country country, AreasItem initialCropAreas) { this.modelContext = modelContext; this.country = country; cropAreasTimeseries.put(0, initialCropAreas); - landUseAreasTimeseries.put(0, initialLandCover); +// landUseAreasTimeseries.put(0, initialLandCover); } public Country getCountry() { @@ -38,7 +39,7 @@ public class CountryAgent { } public double getCropArea(int timestep, CropType item) { - CropAreas cd = cropAreasTimeseries.get(timestep); + AreasItem cd = cropAreasTimeseries.get(timestep); if (cd == null) { LogWriter.printlnError("Asked for timestep that we don't have " + timestep); return Double.NaN; @@ -60,7 +61,7 @@ public class CountryAgent { // optimise areas and intensity GamsCountryInput countryLevelInputs = new GamsCountryInput(getProjectedDemand(), getWorldInputEnergy(), getMaxNetImport(), getMinNetImport()); - GamsInput gamsInput = new GamsInput(getYields(), getPreviousCropArea(), countryLevelInputs); + GamsInput gamsInput = new GamsInput(getYields(), getPreviousAreas(), countryLevelInputs); GamsLandUseOptimiser opti = new GamsLandUseOptimiser(gamsInput); LogWriter.println("Running " + country.getCountryName() + ", year " + year); @@ -73,7 +74,7 @@ public class CountryAgent { return currentProjectedDemand; } - public Map<Integer, YieldResponses> getYields() { + public Map<Integer, YieldResponsesItem> getYields() { // Map<Integer, Map<CropType, YieldResponse>> returnMap = new HashMap<Integer, Map<CropType, YieldResponse>>(); // for (int i= 1; i<=ModelConfig.NUM_LOCATIONS_PER_COUNTRY; i++) @@ -82,15 +83,20 @@ public class CountryAgent { return null; // this should be from LPJ data } - public Map<Integer, CropAreas> getPreviousCropArea() { - CropAreas previousCropAreas = new CropAreas(); + public Map<Integer, AreasItem> getPreviousAreas() { + AreasItem previousCropAreas = new AreasItem(); int previousTimestep = currentTimestep==0 ? 0 : currentTimestep-1; - CropAreas cd = cropAreasTimeseries.get(previousTimestep); + AreasItem cd = cropAreasTimeseries.get(previousTimestep); - for (CropType crop : CropType.getAllItems()) + double totalCropArea = 0; + for (CropType crop : CropType.getAllItems()) { previousCropAreas.setCropArea(crop, cd.getCropArea(crop)); + totalCropArea += cd.getCropArea(crop); + } + + previousCropAreas.setLandCoverArea(LandDataType.LAND, totalCropArea*2); - Map<Integer, CropAreas> returnMap = new HashMap<Integer, CropAreas>(); + Map<Integer, AreasItem> returnMap = new HashMap<Integer, AreasItem>(); for (int i= 1; i<=ModelConfig.NUM_LOCATIONS_PER_COUNTRY; i++) returnMap.put(i, previousCropAreas); diff --git a/src/ac/ed/lurg/country/CountryAgentCreator.java b/src/ac/ed/lurg/country/CountryAgentCreator.java index 3200c2e110f0a3dc6001235fef907dee836db20c..93a21f376c7ca62258e703927b75c17152cfb28c 100644 --- a/src/ac/ed/lurg/country/CountryAgentCreator.java +++ b/src/ac/ed/lurg/country/CountryAgentCreator.java @@ -7,9 +7,9 @@ import java.util.HashSet; import ac.ed.lurg.ModelConfig; import ac.ed.lurg.ModelContext; -import ac.ed.lurg.landuse.CropAreas; +import ac.ed.lurg.landuse.AreasItem; import ac.ed.lurg.types.CropType; -import ac.ed.lurg.types.LandCoverType; +import ac.ed.lurg.types.LandDataType; import ac.ed.lurg.utils.LogWriter; public class CountryAgentCreator { @@ -55,18 +55,18 @@ public class CountryAgentCreator { // double intensity = Math.sqrt(Double.parseDouble(tokens[FERT_N_COL])/arableArea); - LandCoverAreas initialLandCover = new LandCoverAreas(); - initialLandCover.setLandCoverArea(LandCoverType.LAND, Double.parseDouble(tokens[LAND_COL])/1000); - initialLandCover.setLandCoverArea(LandCoverType.ARABLE, arableArea); - initialLandCover.setLandCoverArea(LandCoverType.FOREST, Double.parseDouble(tokens[FOREST_COL])/1000); - initialLandCover.setLandCoverArea(LandCoverType.PERM_CROP, Double.parseDouble(tokens[PERM_CROP_COL])/1000); - initialLandCover.setLandCoverArea(LandCoverType.PASTURE, pastureArea); - - CropAreas initialCropData = new CropAreas(); + /* LandCoverAreas initialLandCover = new LandCoverAreas(); + initialLandCover.setLandCoverArea(LandDataType.LAND, Double.parseDouble(tokens[LAND_COL])/1000); + initialLandCover.setLandCoverArea(LandDataType.ARABLE, arableArea); + initialLandCover.setLandCoverArea(LandDataType.FOREST, Double.parseDouble(tokens[FOREST_COL])/1000); + initialLandCover.setLandCoverArea(LandDataType.PERM_CROP, Double.parseDouble(tokens[PERM_CROP_COL])/1000); + initialLandCover.setLandCoverArea(LandDataType.PASTURE, pastureArea); + */ + AreasItem initialCropData = new AreasItem(); initialCropData.setCropArea(CropType.CEREALS, arableArea); // at the moment can substitute freely between arable crops so this is ok-ish initialCropData.setCropArea(CropType.MEAT_OR_PASTURE, pastureArea); - CountryAgent ca = new CountryAgent(modelContext, Country.get(countryName), initialCropData, initialLandCover); + CountryAgent ca = new CountryAgent(modelContext, Country.get(countryName), initialCropData); countryAgents.add(ca); } diff --git a/src/ac/ed/lurg/country/LandCoverAreas.java b/src/ac/ed/lurg/country/LandCoverAreas.java deleted file mode 100644 index 39fb3c6651d6577c1ea88d3860f8e9dd731c2d0d..0000000000000000000000000000000000000000 --- a/src/ac/ed/lurg/country/LandCoverAreas.java +++ /dev/null @@ -1,20 +0,0 @@ -package ac.ed.lurg.country; - -import java.util.HashMap; -import java.util.Map; - -import ac.ed.lurg.types.LandCoverType; - -public class LandCoverAreas { - private Map<LandCoverType, Double> landCoverAreas = new HashMap<LandCoverType, Double>(); - - public double getLandCoverArea(LandCoverType c) { - Double d = landCoverAreas.get(c); - return d == null ? Double.NaN : d; - } - - public void setLandCoverArea(LandCoverType c, double d) { - landCoverAreas.put(c, d); - } - -} diff --git a/src/ac/ed/lurg/country/gams/GamsInput.java b/src/ac/ed/lurg/country/gams/GamsInput.java index f60adfdef28ea8ab86ac3f7f8d5c1b90c5be6d95..88d305cdc4765eb9e754901b80595dc9d6535e7c 100644 --- a/src/ac/ed/lurg/country/gams/GamsInput.java +++ b/src/ac/ed/lurg/country/gams/GamsInput.java @@ -2,27 +2,27 @@ package ac.ed.lurg.country.gams; import java.util.Map; -import ac.ed.lurg.landuse.CropAreas; -import ac.ed.lurg.yield.YieldResponses; +import ac.ed.lurg.landuse.AreasItem; +import ac.ed.lurg.yield.YieldResponsesItem; public class GamsInput { - private Map<Integer, ? extends YieldResponses> yields; - private Map<Integer, ? extends CropAreas> previousCropArea; + private Map<Integer, ? extends YieldResponsesItem> yields; + private Map<Integer, ? extends AreasItem> previousAreas; private GamsCountryInput countryInput; - public GamsInput(Map<Integer, ? extends YieldResponses> yields, Map<Integer, ? extends CropAreas> previousCropArea, GamsCountryInput countryInput) { + public GamsInput(Map<Integer, ? extends YieldResponsesItem> yields, Map<Integer, ? extends AreasItem> previousAreas, GamsCountryInput countryInput) { super(); this.yields = yields; - this.previousCropArea = previousCropArea; + this.previousAreas = previousAreas; this.countryInput = countryInput; } - public Map<Integer, ? extends YieldResponses> getYields() { + public Map<Integer, ? extends YieldResponsesItem> getYields() { return yields; } - public Map<Integer, ? extends CropAreas> getPreviousCropArea() { - return previousCropArea; + public Map<Integer, ? extends AreasItem> getPreviousAreas() { + return previousAreas; } public GamsCountryInput getCountryInput() { diff --git a/src/ac/ed/lurg/country/gams/GamsLandUseOptimiser.java b/src/ac/ed/lurg/country/gams/GamsLandUseOptimiser.java index c30f97434e576a97697c940b960e896561be1e08..a1759eba155e4d79ed62c2175e0220b644d42661 100644 --- a/src/ac/ed/lurg/country/gams/GamsLandUseOptimiser.java +++ b/src/ac/ed/lurg/country/gams/GamsLandUseOptimiser.java @@ -7,12 +7,13 @@ import java.util.Map.Entry; import java.util.Vector; import ac.ed.lurg.ModelConfig; -import ac.ed.lurg.landuse.CropAreas; -import ac.ed.lurg.landuse.Intensities; +import ac.ed.lurg.landuse.AreasItem; +import ac.ed.lurg.landuse.IntensitiesItem; import ac.ed.lurg.landuse.Intensity; import ac.ed.lurg.types.CropType; +import ac.ed.lurg.types.LandDataType; import ac.ed.lurg.utils.LogWriter; -import ac.ed.lurg.yield.YieldResponses; +import ac.ed.lurg.yield.YieldResponsesItem; import com.gams.api.GAMSDatabase; import com.gams.api.GAMSGlobals; @@ -58,12 +59,12 @@ public class GamsLandUseOptimiser { } private void setupInDB(GAMSDatabase inDB) { + LogWriter.println("\nPrevious areas"); - GAMSParameter param = inDB.addParameter("previous_area", 2, "the previous area for each land use"); - addLocationMapParm(param, inputData.getPreviousCropArea()); + addAreaParms(inDB, inputData.getPreviousAreas()); LogWriter.println("\nDemand"); - param = inDB.addParameter("demand", 1, "demand for crop"); + GAMSParameter param = inDB.addParameter("demand", 1); addItemMapParm(param, inputData.getCountryInput().getProjectedDemand()); LogWriter.println("\nYieldNone"); @@ -74,16 +75,17 @@ public class GamsLandUseOptimiser { GAMSParameter fert_p = inDB.addParameter("fertParam", 2); GAMSParameter irrig_p = inDB.addParameter("irrigParam", 2); - for (Entry<Integer, ? extends YieldResponses> cropsForALocation : inputData.getYields().entrySet()) { + for (Entry<Integer, ? extends YieldResponsesItem> cropsForALocation : inputData.getYields().entrySet()) { Integer locationId = cropsForALocation.getKey(); - YieldResponses yresp = cropsForALocation.getValue(); + String locString = Integer.toString(locationId); + YieldResponsesItem yresp = cropsForALocation.getValue(); for (CropType crop : CropType.values()) { LogWriter.println(String.format(" %15s,\t %.1f", crop.getGamsName(), yresp.getYieldNone(crop))); Vector<String> v = new Vector<String>(); v.add(crop.getGamsName()); - v.add(Integer.toString(locationId)); + v.add(locString); yNoneP.addRecord(v).setValue(yresp.getYieldNone(crop)); y_fert.addRecord(v).setValue(yresp.getYieldFertOnly(crop)); @@ -129,8 +131,8 @@ public class GamsLandUseOptimiser { double totalArea = 0; double area, fertIntensity, irrigIntensity, otherIntensity, feedAmount, netImport; - Map<Integer, Intensities> intensities = new HashMap<Integer, Intensities>(); - Map<Integer, CropAreas> cropAreas = new HashMap<Integer, CropAreas>(); + Map<Integer, IntensitiesItem> intensities = new HashMap<Integer, IntensitiesItem>(); + Map<Integer, AreasItem> cropAreas = new HashMap<Integer, AreasItem>(); Map<CropType, Double> feedAmounts = new HashMap<CropType, Double>(); Map<CropType, Double> netImports = new HashMap<CropType, Double>(); @@ -156,16 +158,16 @@ public class GamsLandUseOptimiser { LogWriter.println(String.format("\t location %s:\tarea= %.1f,\tfert= %.3f,\tirrg= %.3f,\tintensity= %.3f", locationName, area, fertIntensity, irrigIntensity, otherIntensity)); - Intensities intensityItem = intensities.get(locId); + IntensitiesItem intensityItem = intensities.get(locId); if (intensityItem == null) { - intensityItem = new Intensities(); + intensityItem = new IntensitiesItem(); intensities.put(locId, intensityItem); } intensityItem.setIntensity(cropType, new Intensity(fertIntensity, irrigIntensity, otherIntensity)); - CropAreas areaItem = cropAreas.get(locId); + AreasItem areaItem = cropAreas.get(locId); if (areaItem == null) { - areaItem = new CropAreas(); + areaItem = new AreasItem(); cropAreas.put(locId, areaItem); } areaItem.setCropArea(cropType, area); @@ -192,19 +194,27 @@ public class GamsLandUseOptimiser { } } - private void addLocationMapParm(GAMSParameter parm, Map<Integer, ? extends CropAreas> locationItemMap) { - for (Map.Entry<Integer, ? extends CropAreas> cropsForALocation : locationItemMap.entrySet()) { + private void addAreaParms(GAMSDatabase inDB, Map<Integer, ? extends AreasItem> locationItemMap) { + + GAMSParameter prevCropP = inDB.addParameter("previous_area", 2); + GAMSParameter landP = inDB.addParameter("landArea", 1); + + for (Map.Entry<Integer, ? extends AreasItem> cropsForALocation : locationItemMap.entrySet()) { Integer locationId = cropsForALocation.getKey(); - CropAreas itemMap = cropsForALocation.getValue(); + String locString = Integer.toString(locationId); + AreasItem areasItem = cropsForALocation.getValue(); for (CropType cropType : CropType.values()) { - double d = itemMap.getCropArea(cropType); + double d = areasItem.getCropArea(cropType); LogWriter.println(String.format(" %15s,\t %.1f", cropType.getGamsName(), d)); Vector<String> v = new Vector<String>(); v.add(cropType.getGamsName()); - v.add(Integer.toString(locationId)); - parm.addRecord(v).setValue(d); + v.add(locString); + prevCropP.addRecord(v).setValue(d); } + + landP.addRecord(locString).setValue(areasItem.getLandCoverArea(LandDataType.LAND)); + } } diff --git a/src/ac/ed/lurg/country/gams/GamsOutput.java b/src/ac/ed/lurg/country/gams/GamsOutput.java index b5956d83307602113b20fb4671f61da34f7762f5..199b2ab8c21f5e6888a6a926d108cfa803215056 100644 --- a/src/ac/ed/lurg/country/gams/GamsOutput.java +++ b/src/ac/ed/lurg/country/gams/GamsOutput.java @@ -2,21 +2,21 @@ package ac.ed.lurg.country.gams; import java.util.Map; -import ac.ed.lurg.landuse.CropAreas; -import ac.ed.lurg.landuse.Intensities; +import ac.ed.lurg.landuse.AreasItem; +import ac.ed.lurg.landuse.IntensitiesItem; import ac.ed.lurg.types.CropType; public class GamsOutput { int status; - Map<Integer, Intensities> intensities; // data mapped from id (not raster) - Map<Integer, CropAreas> cropAreas; + Map<Integer, IntensitiesItem> intensities; // data mapped from id (not raster) + Map<Integer, AreasItem> cropAreas; Map<CropType, Double> feedAmounts; Map<CropType, Double> netImports; public GamsOutput(int status, - Map<Integer, Intensities> intensities, - Map<Integer, CropAreas> cropAreas, + Map<Integer, IntensitiesItem> intensities, + Map<Integer, AreasItem> cropAreas, Map<CropType, Double> feedAmounts, Map<CropType, Double> netImports) { super(); @@ -30,10 +30,10 @@ public class GamsOutput { public int getStatus() { return status; } - public Map<Integer, Intensities> getIntensities() { + public Map<Integer, IntensitiesItem> getIntensities() { return intensities; } - public Map<Integer, CropAreas> getCropAreas() { + public Map<Integer, AreasItem> getCropAreas() { return cropAreas; } public Map<CropType, Double> getFeedAmounts() { diff --git a/src/ac/ed/lurg/country/gams/GamsRasterInput.java b/src/ac/ed/lurg/country/gams/GamsRasterInput.java index 2e0d3891afc17903b91fe007111900574f4811c6..e912d57741dd22c505e20614864acd3940af9cec 100644 --- a/src/ac/ed/lurg/country/gams/GamsRasterInput.java +++ b/src/ac/ed/lurg/country/gams/GamsRasterInput.java @@ -1,21 +1,20 @@ package ac.ed.lurg.country.gams; -import ac.ed.lurg.landuse.CropAreas; -import ac.ed.lurg.landuse.Intensities; +import ac.ed.lurg.landuse.AreasItem; import ac.ed.lurg.yield.YieldRaster; import ac.sac.raster.RasterSet; public class GamsRasterInput { private YieldRaster yields; - private RasterSet<CropAreas> previousCropAreas; + private RasterSet<AreasItem> previousAreas; private GamsCountryInput countryInput; public GamsRasterInput(YieldRaster yields, - RasterSet<CropAreas> previousCropAreas, GamsCountryInput countryInput) { + RasterSet<AreasItem> previousAreas, GamsCountryInput countryInput) { super(); this.yields = yields; - this.previousCropAreas = previousCropAreas; + this.previousAreas = previousAreas; this.countryInput = countryInput; } @@ -23,8 +22,8 @@ public class GamsRasterInput { return yields; } - public RasterSet<CropAreas> getPreviousCropAreas() { - return previousCropAreas; + public RasterSet<AreasItem> getPreviousAreas() { + return previousAreas; } public GamsCountryInput getCountryInput() { diff --git a/src/ac/ed/lurg/country/gams/GamsRasterOptimiser.java b/src/ac/ed/lurg/country/gams/GamsRasterOptimiser.java index 7d8d42214df15c9a9bf7d52afbd6c4490bad37de..34730bfad7232b72cc02468ff0e8437e2cc5e0d4 100644 --- a/src/ac/ed/lurg/country/gams/GamsRasterOptimiser.java +++ b/src/ac/ed/lurg/country/gams/GamsRasterOptimiser.java @@ -9,14 +9,14 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; -import ac.ed.lurg.landuse.CropAreas; -import ac.ed.lurg.landuse.Intensities; +import ac.ed.lurg.landuse.AreasItem; +import ac.ed.lurg.landuse.IntensitiesItem; import ac.ed.lurg.types.CropType; import ac.ed.lurg.types.YieldType; import ac.ed.lurg.utils.LogWriter; -import ac.ed.lurg.yield.AveragingYieldResponses; +import ac.ed.lurg.yield.AveragingYieldResponsesItem; import ac.ed.lurg.yield.YieldRaster; -import ac.ed.lurg.yield.YieldResponses; +import ac.ed.lurg.yield.YieldResponsesItem; import ac.sac.raster.RasterKey; import ac.sac.raster.RasterSet; @@ -43,15 +43,15 @@ public class GamsRasterOptimiser { private GamsRasterOutput convertToRaster(GamsInput gamsInput, GamsOutput gamsOutput) { // intensities - constant over single category? - RasterSet<Intensities> intensityRaster = new RasterSet<Intensities>(); + RasterSet<IntensitiesItem> intensityRaster = new RasterSet<IntensitiesItem>(); - for (Map.Entry<Integer, Intensities> entry : gamsOutput.getIntensities().entrySet()) { + for (Map.Entry<Integer, IntensitiesItem> entry : gamsOutput.getIntensities().entrySet()) { for (RasterKey key : mapping.get(entry.getKey())) { intensityRaster.put(key, entry.getValue()); } } - RasterSet<CropAreas> areaRaster = new RasterSet<CropAreas>(); + RasterSet<AreasItem> areaRaster = new RasterSet<AreasItem>(); // crop areas - need some allocation process @@ -62,7 +62,7 @@ public class GamsRasterOptimiser { private GamsInput convertFromRaster(GamsRasterInput rasterInputData) { // as a first attempt only going to look at pasture and cereal yields, assuming other yields will be correlated to one or the other. YieldRaster yieldRaster = rasterInputData.getYields(); - RasterSet<CropAreas> cropAreaRaster = rasterInputData.getPreviousCropAreas(); + RasterSet<AreasItem> cropAreaRaster = rasterInputData.getPreviousAreas(); List<Double> cerealDivisions = getDivisions(yieldRaster, CropType.CEREALS, 2); List<Double> pastureDivisions = getDivisions(yieldRaster, CropType.MEAT_OR_PASTURE, 2); @@ -70,20 +70,20 @@ public class GamsRasterOptimiser { int numCerealCats = (1+cerealDivisions.size()); LogWriter.println("Making " + numCerealCats * (1+pastureDivisions.size()) + " categories"); - Map<Integer, AveragingYieldResponses> aggregatedYield = new HashMap<Integer, AveragingYieldResponses>(); - Map<Integer, CropAreas> aggregatedAreas = new HashMap<Integer, CropAreas>(); + Map<Integer, AveragingYieldResponsesItem> aggregatedYield = new HashMap<Integer, AveragingYieldResponsesItem>(); + Map<Integer, AreasItem> aggregatedAreas = new HashMap<Integer, AreasItem>(); mapping = new HashMap<Integer, Set<RasterKey>>(); - for (Entry<RasterKey, YieldResponses> entry : yieldRaster.entrySet()) { - YieldResponses yresp = entry.getValue(); - CropAreas cropAreas = cropAreaRaster.get(entry.getKey()); + for (Entry<RasterKey, YieldResponsesItem> entry : yieldRaster.entrySet()) { + YieldResponsesItem yresp = entry.getValue(); + AreasItem cropAreas = cropAreaRaster.get(entry.getKey()); int cerealCat = findCategory(cerealDivisions, yresp.getYieldMax(CropType.CEREALS)); int pastureCat = findCategory(pastureDivisions, yresp.getYieldMax(CropType.MEAT_OR_PASTURE)); int id = cerealCat + pastureCat * numCerealCats; - AveragingYieldResponses avgYResp = getAverageYieldsForLocation(aggregatedYield, id); - CropAreas aggAreas = getAggregatedAreaForLocation(aggregatedAreas, id); + AveragingYieldResponsesItem avgYResp = getAverageYieldsForLocation(aggregatedYield, id); + AreasItem aggAreas = getAggregatedAreaForLocation(aggregatedAreas, id); getMappingForLocation(mapping, id).add(entry.getKey()); for (CropType crop : CropType.values()) { @@ -106,19 +106,19 @@ public class GamsRasterOptimiser { return keys; } - private CropAreas getAggregatedAreaForLocation(Map<Integer, CropAreas> aggregatedAreas, int id) { - CropAreas aggAreas = aggregatedAreas.get(id); + private AreasItem getAggregatedAreaForLocation(Map<Integer, AreasItem> aggregatedAreas, int id) { + AreasItem aggAreas = aggregatedAreas.get(id); if (aggAreas == null) { - aggAreas = new CropAreas(); + aggAreas = new AreasItem(); aggregatedAreas.put(id, aggAreas); } return aggAreas; } - private AveragingYieldResponses getAverageYieldsForLocation(Map<Integer, AveragingYieldResponses> aggregatedYield, int id) { - AveragingYieldResponses avgYResp = aggregatedYield.get(id); + private AveragingYieldResponsesItem getAverageYieldsForLocation(Map<Integer, AveragingYieldResponsesItem> aggregatedYield, int id) { + AveragingYieldResponsesItem avgYResp = aggregatedYield.get(id); if (avgYResp == null) { - avgYResp = new AveragingYieldResponses(); + avgYResp = new AveragingYieldResponsesItem(); aggregatedYield.put(id, avgYResp); } return avgYResp; @@ -139,7 +139,7 @@ public class GamsRasterOptimiser { private List<Double> getDivisions(YieldRaster yieldRaster, CropType crop, int numCategories) { List<Double> yieldValues = new ArrayList<Double>(); - for (YieldResponses yresp : yieldRaster.values()) { + for (YieldResponsesItem yresp : yieldRaster.values()) { yieldValues.add(yresp.getYieldMax(crop)); } diff --git a/src/ac/ed/lurg/country/gams/GamsRasterOutput.java b/src/ac/ed/lurg/country/gams/GamsRasterOutput.java index d5f7c61cd2a5323f51be9db80d3a042d883ca8de..ba94d2d5effdf225ddb821c178ef721131c99a10 100644 --- a/src/ac/ed/lurg/country/gams/GamsRasterOutput.java +++ b/src/ac/ed/lurg/country/gams/GamsRasterOutput.java @@ -2,20 +2,20 @@ package ac.ed.lurg.country.gams; import java.util.Map; -import ac.ed.lurg.landuse.CropAreas; -import ac.ed.lurg.landuse.Intensities; +import ac.ed.lurg.landuse.AreasItem; +import ac.ed.lurg.landuse.IntensitiesItem; import ac.ed.lurg.types.CropType; import ac.sac.raster.RasterSet; public class GamsRasterOutput { int status; - RasterSet<Intensities> intensityRaster; - RasterSet<CropAreas> cropAreaRaster; + RasterSet<IntensitiesItem> intensityRaster; + RasterSet<AreasItem> cropAreaRaster; Map<CropType, Double> feedAmounts; Map<CropType, Double> netImports; - public GamsRasterOutput(int status, RasterSet<Intensities> intensityRaster, RasterSet<CropAreas> cropAreaRaster, + public GamsRasterOutput(int status, RasterSet<IntensitiesItem> intensityRaster, RasterSet<AreasItem> cropAreaRaster, Map<CropType, Double> feedAmounts, Map<CropType, Double> netImports) { super(); this.status = status; @@ -28,10 +28,10 @@ public class GamsRasterOutput { public int getStatus() { return status; } - public RasterSet<Intensities> getIntensityRaster() { + public RasterSet<IntensitiesItem> getIntensityRaster() { return intensityRaster; } - public RasterSet<CropAreas> getCropAreaRaster() { + public RasterSet<AreasItem> getCropAreaRaster() { return cropAreaRaster; } public Map<CropType, Double> getFeedAmounts() { diff --git a/src/ac/ed/lurg/country/gams/GamsTest.java b/src/ac/ed/lurg/country/gams/GamsTest.java index f6b5a4f6ba6e1d19f1e7ab00be9e8d4641ff3404..befa8f060f8b809f86205c5bd30e06efe5d975c7 100644 --- a/src/ac/ed/lurg/country/gams/GamsTest.java +++ b/src/ac/ed/lurg/country/gams/GamsTest.java @@ -4,10 +4,11 @@ import java.util.HashMap; import java.util.Map; import ac.ed.lurg.ModelConfig; -import ac.ed.lurg.landuse.CropAreas; +import ac.ed.lurg.landuse.AreasItem; import ac.ed.lurg.types.CropType; +import ac.ed.lurg.types.LandDataType; import ac.ed.lurg.types.YieldType; -import ac.ed.lurg.yield.YieldResponses; +import ac.ed.lurg.yield.YieldResponsesItem; public class GamsTest { @@ -18,7 +19,7 @@ public class GamsTest { private void run() { GamsCountryInput countryLevelInputs = new GamsCountryInput(getProjectedDemand(), getWorldInputEnergy(), getMaxNetImport(), getMinNetImport()); - GamsInput gamsInput = new GamsInput(getYields(), getPreviousCropArea(), countryLevelInputs); + GamsInput gamsInput = new GamsInput(getYields(), getPreviousArea(), countryLevelInputs); GamsLandUseOptimiser opti = new GamsLandUseOptimiser(gamsInput); GamsOutput gamsOutput = opti.run(); @@ -38,9 +39,9 @@ public class GamsTest { } - public Map<Integer, YieldResponses> getYields() { + public Map<Integer, YieldResponsesItem> getYields() { - YieldResponses yresp = new YieldResponses(); + YieldResponsesItem yresp = new YieldResponsesItem(); for (CropType crop : CropType.getAllItems()) { yresp.setYield(YieldType.NONE, crop, 1); @@ -51,7 +52,7 @@ public class GamsTest { yresp.setYield(YieldType.FERT_IRRIG_MAX, crop, 4); } - Map<Integer, YieldResponses> returnMap = new HashMap<Integer, YieldResponses>(); + Map<Integer, YieldResponsesItem> returnMap = new HashMap<Integer, YieldResponsesItem>(); for (int i= 1; i<=ModelConfig.NUM_LOCATIONS_PER_COUNTRY; i++) returnMap.put(i, yresp); @@ -59,8 +60,8 @@ public class GamsTest { return returnMap; } - public Map<Integer, CropAreas> getPreviousCropArea() { - CropAreas dummyMap = new CropAreas(); + public Map<Integer, AreasItem> getPreviousArea() { + AreasItem dummyMap = new AreasItem(); dummyMap.setCropArea(CropType.CEREALS, 9.0); dummyMap.setCropArea(CropType.FRUIT, 5.0); dummyMap.setCropArea(CropType.OILCROPS, 10.0); @@ -70,7 +71,9 @@ public class GamsTest { dummyMap.setCropArea(CropType.MEAT_OR_PASTURE, 80.0); dummyMap.setCropArea(CropType.TREENUTS, 5.0); - Map<Integer, CropAreas> returnMap = new HashMap<Integer, CropAreas>(); + dummyMap.setLandCoverArea(LandDataType.LAND, 300); + + Map<Integer, AreasItem> returnMap = new HashMap<Integer, AreasItem>(); for (int i= 1; i<=ModelConfig.NUM_LOCATIONS_PER_COUNTRY; i++) returnMap.put(i, dummyMap); diff --git a/src/ac/ed/lurg/landuse/AreasItem.java b/src/ac/ed/lurg/landuse/AreasItem.java new file mode 100644 index 0000000000000000000000000000000000000000..e4cdd72471db8ea9a520476bc7c8d73a916a0f36 --- /dev/null +++ b/src/ac/ed/lurg/landuse/AreasItem.java @@ -0,0 +1,36 @@ +package ac.ed.lurg.landuse; + +import java.util.HashMap; +import java.util.Map; + +import ac.ed.lurg.types.CropType; +import ac.ed.lurg.types.LandDataType; +import ac.sac.raster.RasterItem; + +/* + * Data for one year and country, but it does not know which one + */ +public class AreasItem implements RasterItem { + + private Map<CropType, Double> cropAreas = new HashMap<CropType, Double>(); + private Map<LandDataType, Double> landCoverAreas = new HashMap<LandDataType, Double>(); + + public double getCropArea(CropType c) { + Double d = cropAreas.get(c); + return d == null ? Double.NaN : d; + } + + public void setCropArea(CropType c, double area) { + cropAreas.put(c, area); + } + + + public double getLandCoverArea(LandDataType c) { + Double d = landCoverAreas.get(c); + return d == null ? Double.NaN : d; + } + + public void setLandCoverArea(LandDataType c, double d) { + landCoverAreas.put(c, d); + } +} diff --git a/src/ac/ed/lurg/landuse/CropAreas.java b/src/ac/ed/lurg/landuse/CropAreas.java deleted file mode 100644 index ea90b32791373e332bdb03f4034cb4f835877e08..0000000000000000000000000000000000000000 --- a/src/ac/ed/lurg/landuse/CropAreas.java +++ /dev/null @@ -1,32 +0,0 @@ -package ac.ed.lurg.landuse; - -import java.util.HashMap; -import java.util.Map; - -import ac.ed.lurg.types.CropType; -import ac.sac.raster.RasterItem; - -/* - * Data for one year and country, but it does not know which one - */ -public class CropAreas implements RasterItem { - - private Map<CropType, Double> cropAreas = new HashMap<CropType, Double>(); - - public double getCropArea(CropType c) { - Double lu = cropAreas.get(c); - - if (lu != null) - return lu; - else - return 0; - } - - public void setCropArea(CropType c, double area) { - cropAreas.put(c, area); - } - - public int size() { - return cropAreas.size(); - } -} diff --git a/src/ac/ed/lurg/landuse/Intensities.java b/src/ac/ed/lurg/landuse/IntensitiesItem.java similarity index 88% rename from src/ac/ed/lurg/landuse/Intensities.java rename to src/ac/ed/lurg/landuse/IntensitiesItem.java index 218c6e10212c75c5943fcc1be7fad0b1adc36088..c7006850a54b0b7bad13a07489d125fdec4e760d 100644 --- a/src/ac/ed/lurg/landuse/Intensities.java +++ b/src/ac/ed/lurg/landuse/IntensitiesItem.java @@ -6,7 +6,7 @@ import java.util.Map; import ac.ed.lurg.types.CropType; import ac.sac.raster.RasterItem; -public class Intensities implements RasterItem { +public class IntensitiesItem implements RasterItem { Map<CropType, Intensity> intensityMap = new HashMap<CropType, Intensity>(); diff --git a/src/ac/ed/lurg/types/LandCoverType.java b/src/ac/ed/lurg/types/LandDataType.java similarity index 56% rename from src/ac/ed/lurg/types/LandCoverType.java rename to src/ac/ed/lurg/types/LandDataType.java index 4a4230acf271e9142b390897a3e98e7f01967512..b1b1b9c6cdc00ef9abc5877ddb618b64edd4824e 100644 --- a/src/ac/ed/lurg/types/LandCoverType.java +++ b/src/ac/ed/lurg/types/LandDataType.java @@ -1,16 +1,14 @@ package ac.ed.lurg.types; -public enum LandCoverType { +public enum LandDataType { LAND ("land"), - ARABLE ("cropland"), FOREST ("forest"), - PERM_CROP ("perm_crop"), - PASTURE ("pasture"); + OTHER_NATURAL ("perm_crop"); private String name; - LandCoverType(String name) { + LandDataType(String name) { this.name = name; } diff --git a/src/ac/ed/lurg/yield/AveragingYieldResponses.java b/src/ac/ed/lurg/yield/AveragingYieldResponsesItem.java similarity index 81% rename from src/ac/ed/lurg/yield/AveragingYieldResponses.java rename to src/ac/ed/lurg/yield/AveragingYieldResponsesItem.java index 0a5f857f15aad3bb27317b8c8fc2b6cad0c206ec..3999ed311911880144d81fbbcbc4b0f3c92e77a2 100644 --- a/src/ac/ed/lurg/yield/AveragingYieldResponses.java +++ b/src/ac/ed/lurg/yield/AveragingYieldResponsesItem.java @@ -2,7 +2,7 @@ package ac.ed.lurg.yield; import ac.ed.lurg.types.CropType; -public class AveragingYieldResponses extends YieldResponses { +public class AveragingYieldResponsesItem extends YieldResponsesItem { @Override YieldResponse getYieldResponseForCrop(CropType crop) { diff --git a/src/ac/ed/lurg/yield/YieldRaster.java b/src/ac/ed/lurg/yield/YieldRaster.java index 2642384190469d19500ccb5a49c784847464b621..6876bbf820cedd9a0f6ba0f1cf05e25082d53fd6 100644 --- a/src/ac/ed/lurg/yield/YieldRaster.java +++ b/src/ac/ed/lurg/yield/YieldRaster.java @@ -4,7 +4,7 @@ import ac.ed.lurg.country.Country; import ac.sac.raster.RasterHeaderDetails; import ac.sac.raster.RasterSet; -public class YieldRaster extends RasterSet<YieldResponses> { +public class YieldRaster extends RasterSet<YieldResponsesItem> { private static final long serialVersionUID = -4483319360580776344L; @@ -12,8 +12,8 @@ public class YieldRaster extends RasterSet<YieldResponses> { super(header); } - protected YieldResponses createRasterData() { - return new YieldResponses(); + protected YieldResponsesItem createRasterData() { + return new YieldResponsesItem(); } public YieldRaster getRasterForCountry(Country c) { diff --git a/src/ac/ed/lurg/yield/YieldResponseMapReader.java b/src/ac/ed/lurg/yield/YieldResponseMapReader.java index 6a19695eb886b98c197b7a38225a8db4b7caa965..549975d9485612cbf1528d191af0f155dd825446 100644 --- a/src/ac/ed/lurg/yield/YieldResponseMapReader.java +++ b/src/ac/ed/lurg/yield/YieldResponseMapReader.java @@ -7,12 +7,12 @@ import ac.sac.raster.AbstractRasterReader; import ac.sac.raster.RasterHeaderDetails; import ac.sac.raster.RasterSet; -public class YieldResponseMapReader extends AbstractRasterReader<YieldResponses> { +public class YieldResponseMapReader extends AbstractRasterReader<YieldResponsesItem> { private YieldType yieldType; private CropType cropType; - public YieldResponseMapReader (RasterSet<YieldResponses> dataset, YieldType yieldType, CropType cropType) { + public YieldResponseMapReader (RasterSet<YieldResponsesItem> dataset, YieldType yieldType, CropType cropType) { super(dataset); this.yieldType = yieldType; this.cropType = cropType; @@ -27,7 +27,7 @@ public class YieldResponseMapReader extends AbstractRasterReader<YieldResponses> } @Override - public void setData(YieldResponses item, String token) { + public void setData(YieldResponsesItem item, String token) { double d = Double.parseDouble(token); item.setYield(yieldType, cropType, d); } diff --git a/src/ac/ed/lurg/yield/YieldResponses.java b/src/ac/ed/lurg/yield/YieldResponsesItem.java similarity index 96% rename from src/ac/ed/lurg/yield/YieldResponses.java rename to src/ac/ed/lurg/yield/YieldResponsesItem.java index 799ec7a6cd71581652e5deba0fc533315af5ca85..db6a2776fd8d02469becc8e828020a5dd3cffafd 100644 --- a/src/ac/ed/lurg/yield/YieldResponses.java +++ b/src/ac/ed/lurg/yield/YieldResponsesItem.java @@ -7,7 +7,7 @@ import ac.ed.lurg.types.CropType; import ac.ed.lurg.types.YieldType; import ac.sac.raster.RasterItem; -public class YieldResponses implements RasterItem { +public class YieldResponsesItem implements RasterItem { Map<CropType, YieldResponse> yieldResponses = new HashMap<CropType, YieldResponse>(); public void setYield(YieldType type, CropType crop, double yield) {