diff --git a/src/ac/ed/lurg/ModelMain.java b/src/ac/ed/lurg/ModelMain.java index 6991c744ae186a8b03d216e1df443d604c9973c3..88353ad8fbf2386873a3c5033f3c8d62bde5acf3 100644 --- a/src/ac/ed/lurg/ModelMain.java +++ b/src/ac/ed/lurg/ModelMain.java @@ -18,10 +18,9 @@ import ac.ed.lurg.country.CountryBoundaryReader; import ac.ed.lurg.country.gams.GamsRasterOutput; import ac.ed.lurg.demand.BaseConsumpManager; import ac.ed.lurg.demand.DemandManager; -import ac.ed.lurg.landuse.AreasItem; import ac.ed.lurg.landuse.CropUsageData; import ac.ed.lurg.landuse.CropUsageReader; -import ac.ed.lurg.landuse.IntensitiesItem; +import ac.ed.lurg.landuse.LandUseItem; import ac.ed.lurg.landuse.IrrigationConstraintReader; import ac.ed.lurg.landuse.IrrigationItem; import ac.ed.lurg.landuse.IrrigationMaxAmountReader; @@ -52,9 +51,7 @@ public class ModelMain { private RasterHeaderDetails desiredProjection; private Map<CropType, Double> prevWorldPrices; - private RasterSet<IntensitiesItem> prevIntensityRaster; - private RasterSet<AreasItem> prevCropAreaRaster; - + private RasterSet<LandUseItem> prevIntensityRaster; public static void main(String[] args) { ModelMain theModel = new ModelMain(); @@ -106,8 +103,7 @@ public class ModelMain { CropToDoubleMap totalImportCommodities = new CropToDoubleMap(); CropToDoubleMap totalExportCommodities = new CropToDoubleMap(); - RasterSet<IntensitiesItem> globalIntensityRaster = new RasterSet<IntensitiesItem>(desiredProjection); - RasterSet<AreasItem> globalCropAreaRaster = new RasterSet<AreasItem>(desiredProjection); + RasterSet<LandUseItem> globalIntensityRaster = new RasterSet<LandUseItem>(desiredProjection); RasterSet<IntegerRasterItem> globalLocationIdRaster = new RasterSet<IntegerRasterItem>(desiredProjection); for (CountryAgent ca : countryAgents) { @@ -135,7 +131,6 @@ public class ModelMain { // update global rasters globalIntensityRaster.putAll(result.getIntensityRaster()); - globalCropAreaRaster.putAll(result.getCropAreaRaster()); globalLocationIdRaster.putAll(result.getLocationIdRaster()); // Get values for world input costs @@ -170,11 +165,10 @@ public class ModelMain { // output results - outputTimestepResults(timestep, globalIntensityRaster, globalCropAreaRaster, globalLocationIdRaster, yieldSurfaces); + outputTimestepResults(timestep, globalIntensityRaster, globalLocationIdRaster, yieldSurfaces); // keep last to allow interpolation prevIntensityRaster = globalIntensityRaster; - prevCropAreaRaster = globalCropAreaRaster; } public double updateMarketPrices(double previousPrice, double demand, double supply) { @@ -208,7 +202,7 @@ public class ModelMain { } } - private void writeMarketFile(Timestep timestep, RasterSet<IntensitiesItem> intensityRaster, RasterSet<AreasItem> cropAreaRaster) { + private void writeMarketFile(Timestep timestep, RasterSet<LandUseItem> intensityRaster) { try { StringBuffer sbHeadings = new StringBuffer("Year, Cropland (Mha), Pasture (Mha), Natural (Mha), Fert crop (Mt), Fert pasture (Mt), Fert crop (M litre), Fert pasture (M litre)"); for (CropType crop : CropType.getImportedTypes()) @@ -219,15 +213,15 @@ public class ModelMain { StringBuffer sbData = new StringBuffer(); sbData.append(String.format("%d, %.1f, %.1f, %.1f", timestep.getYear(), - AreasItem.getTotalLandCover(cropAreaRaster, LandCoverType.CROPLAND), - AreasItem.getTotalLandCover(cropAreaRaster, LandCoverType.PASTURE), - AreasItem.getTotalLandCover(cropAreaRaster, LandCoverType.OTHER_NATURAL))); + LandUseItem.getTotalLandCover(intensityRaster, LandCoverType.CROPLAND), + LandUseItem.getTotalLandCover(intensityRaster, LandCoverType.PASTURE), + LandUseItem.getTotalLandCover(intensityRaster, LandCoverType.OTHER_NATURAL))); - sbData.append(String.format(", %.1f", IntensitiesItem.getFertiliserTotal(intensityRaster.values(), CropType.getCropsLessPasture())/1000)); - sbData.append(String.format(", %.1f", IntensitiesItem.getFertiliserTotal(intensityRaster.values(), CropType.PASTURE)/1000)); + sbData.append(String.format(", %.1f", LandUseItem.getFertiliserTotal(intensityRaster.values(), CropType.getCropsLessPasture())/1000)); + sbData.append(String.format(", %.1f", LandUseItem.getFertiliserTotal(intensityRaster.values(), CropType.PASTURE)/1000)); - sbData.append(String.format(", %.1f", IntensitiesItem.getIrrigationTotal(intensityRaster.values(), CropType.getCropsLessPasture()))); - sbData.append(String.format(", %.1f", IntensitiesItem.getIrrigationTotal(intensityRaster.values(), CropType.PASTURE))); + sbData.append(String.format(", %.1f", LandUseItem.getIrrigationTotal(intensityRaster.values(), CropType.getCropsLessPasture()))); + sbData.append(String.format(", %.1f", LandUseItem.getIrrigationTotal(intensityRaster.values(), CropType.PASTURE))); for (CropType crop : CropType.getImportedTypes() ) sbData.append(String.format(", %.3f", prevWorldPrices.get(crop))); @@ -241,44 +235,43 @@ public class ModelMain { } } - private void outputTimestepResults(Timestep timestep, RasterSet<IntensitiesItem> intensityRaster, RasterSet<AreasItem> cropAreaRaster, - RasterSet<IntegerRasterItem> locationIdRaster, YieldRaster yieldSurfaces) { + private void outputTimestepResults(Timestep timestep, RasterSet<LandUseItem> intensityRaster, RasterSet<IntegerRasterItem> locationIdRaster, YieldRaster yieldSurfaces) { - writeMarketFile(timestep, intensityRaster, cropAreaRaster); + writeMarketFile(timestep, intensityRaster); if (ModelConfig.OUTPUT_FOR_LPJG) { for (int outputYear : timestep.getYearsFromLast()) { LogWriter.printlnError("Outputing Year: " + outputYear); - RasterSet<AreasItem> areasToOutput; + RasterSet<LandUseItem> areasToOutput; if (outputYear == timestep.getYear()) { - areasToOutput = cropAreaRaster; + areasToOutput = intensityRaster; } else { - InterpolatingRasterSet<AreasItem> intermediateAreas = new InterpolatingRasterSet<AreasItem>(cropAreaRaster.getHeaderDetails()) { + InterpolatingRasterSet<LandUseItem> intermediateAreas = new InterpolatingRasterSet<LandUseItem>(intensityRaster.getHeaderDetails()) { private static final long serialVersionUID = 1306045141011047760L; - protected AreasItem createRasterData() { - return new AreasItem(); + protected LandUseItem createRasterData() { + return new LandUseItem(); } }; - intermediateAreas.setup(prevCropAreaRaster, cropAreaRaster, timestep.getPreviousTimestep().getYear(), timestep.getYear(), outputYear); + intermediateAreas.setup(prevIntensityRaster, intensityRaster, timestep.getPreviousTimestep().getYear(), timestep.getYear(), outputYear); areasToOutput = intermediateAreas; } - LpjgOutputer lpjOutputer = new LpjgOutputer(outputYear, intensityRaster, areasToOutput, yieldSurfaces); + LpjgOutputer lpjOutputer = new LpjgOutputer(outputYear, areasToOutput, yieldSurfaces); lpjOutputer.writeOutput(); } } - outputLandCover(timestep.getYear(), cropAreaRaster, LandCoverType.CROPLAND); - outputLandCover(timestep.getYear(), cropAreaRaster, LandCoverType.PASTURE); + outputLandCover(timestep.getYear(), intensityRaster, LandCoverType.CROPLAND); + outputLandCover(timestep.getYear(), intensityRaster, LandCoverType.PASTURE); } - private void outputLandCover(int year, RasterSet<AreasItem> cropAreaRaster, final LandCoverType lcType) { - new RasterOutputer<AreasItem>(cropAreaRaster, lcType.getName() + "Area" + year) { + private void outputLandCover(int year, RasterSet<LandUseItem> cropAreaRaster, final LandCoverType lcType) { + new RasterOutputer<LandUseItem>(cropAreaRaster, lcType.getName() + "Area" + year) { @Override public Double getValue(RasterKey location) { - AreasItem area = results.get(location); + LandUseItem area = results.get(location); if (area == null) return null; @@ -299,7 +292,7 @@ public class ModelMain { Collection<CountryAgent> countryAgents = new HashSet<CountryAgent>(); RasterSet<LandCoverItem> initLC = getInitialLandCover(); - RasterSet<IrrigationItem> allIrrigationCosts = getIrrigationCosts(); + RasterSet<IrrigationItem> allIrrigationCosts = getIrrigationData(); Map<CompositeCountry, Map<CropType, CropUsageData>> cropUsageDataMap = new CropUsageReader(compositeCountryManager).getCommodityData(); for (CompositeCountry cc : countryGrouping) { @@ -343,8 +336,8 @@ public class ModelMain { return yieldReader.getRasterData(timestep); } - private RasterSet<IrrigationItem> getIrrigationCosts() { - RasterSet<IrrigationItem> irigCosts = new RasterSet<IrrigationItem>(desiredProjection) { + private RasterSet<IrrigationItem> getIrrigationData() { + RasterSet<IrrigationItem> irigData = new RasterSet<IrrigationItem>(desiredProjection) { private static final long serialVersionUID = 8393130687550888654L; protected IrrigationItem createRasterData() { @@ -352,11 +345,10 @@ public class ModelMain { } }; - new IrrigiationCostReader(irigCosts).getRasterDataFromFile(ModelConfig.IRRIGATION_COST_FILE); - new IrrigationConstraintReader(irigCosts).getRasterDataFromFile(ModelConfig.IRRIGATION_CONSTRAINT_FILE); - new IrrigationMaxAmountReader(irigCosts).getRasterDataFromFile(ModelConfig.IRRIG_MAX_WATER_FILE); + new IrrigiationCostReader(irigData).getRasterDataFromFile(ModelConfig.IRRIGATION_COST_FILE); + new IrrigationConstraintReader(irigData).getRasterDataFromFile(ModelConfig.IRRIGATION_CONSTRAINT_FILE); + new IrrigationMaxAmountReader(irigData).getRasterDataFromFile(ModelConfig.IRRIG_MAX_WATER_FILE); - - return irigCosts; + return irigData; } } \ No newline at end of file diff --git a/src/ac/ed/lurg/country/CountryAgent.java b/src/ac/ed/lurg/country/CountryAgent.java index e81e6aab2aeaa89516f53bf304a2933567859871..f2139364506bb5f275c685b876805a285b1af4fa 100644 --- a/src/ac/ed/lurg/country/CountryAgent.java +++ b/src/ac/ed/lurg/country/CountryAgent.java @@ -9,8 +9,8 @@ import ac.ed.lurg.country.gams.GamsRasterInput; import ac.ed.lurg.country.gams.GamsRasterOptimiser; import ac.ed.lurg.country.gams.GamsRasterOutput; import ac.ed.lurg.demand.DemandManager; -import ac.ed.lurg.landuse.AreasItem; import ac.ed.lurg.landuse.CropUsageData; +import ac.ed.lurg.landuse.LandUseItem; import ac.ed.lurg.landuse.IrrigationItem; import ac.ed.lurg.landuse.LandCoverItem; import ac.ed.lurg.types.CommodityType; @@ -36,18 +36,18 @@ public class CountryAgent { this.demandManager = demandManager; this.country = country; - RasterSet<AreasItem> cropAreaRaster = convertInitialLC(initialLC); + RasterSet<LandUseItem> cropAreaRaster = convertInitialLC(initialLC); this.irrigationCostRaster = irrigationCostRaster; GamsRasterOutput initialData = new GamsRasterOutput(cropAreaRaster, cropUsageData); resultsTimeseries.put(new Timestep(0), initialData); } - private RasterSet<AreasItem> convertInitialLC(RasterSet<LandCoverItem> initialLC) { - RasterSet<AreasItem> cropAreaRaster = new RasterSet<AreasItem>(initialLC.getHeaderDetails()); + private RasterSet<LandUseItem> convertInitialLC(RasterSet<LandCoverItem> initialLC) { + RasterSet<LandUseItem> cropAreaRaster = new RasterSet<LandUseItem>(initialLC.getHeaderDetails()); for (Map.Entry<RasterKey, LandCoverItem> entry : initialLC.entrySet()) { - AreasItem areasItem = new AreasItem(); + LandUseItem areasItem = new LandUseItem(); RasterKey key = entry.getKey(); areasItem.setLandCoverAreas(entry.getValue()); areasItem.setCropFraction(CropType.WHEAT, 0.5); // random start, better if we could get data, but free substitution between crops so not critical @@ -117,7 +117,7 @@ public class CountryAgent { } GamsCountryInput countryLevelInputs = GamsCountryInput.createInput(country, projectedDemand, worldInputPrices, baseNetImport, maxOfProdOrSupply, cropAdjs, calibrate); - GamsRasterInput input = new GamsRasterInput(currentTimestep, countryYieldSurfaces, prevOutput.getCropAreaRaster(), irrigationCostRaster, countryLevelInputs); + GamsRasterInput input = new GamsRasterInput(currentTimestep, countryYieldSurfaces, prevOutput.getIntensityRaster(), irrigationCostRaster, countryLevelInputs); return input; } diff --git a/src/ac/ed/lurg/country/gams/GamsLocationInput.java b/src/ac/ed/lurg/country/gams/GamsLocationInput.java index 5ec01267f01396bb6948ee17c2624e7c5fee9c09..bfd808f1431c7d9edbb61814a798a7e236345cac 100644 --- a/src/ac/ed/lurg/country/gams/GamsLocationInput.java +++ b/src/ac/ed/lurg/country/gams/GamsLocationInput.java @@ -3,7 +3,7 @@ package ac.ed.lurg.country.gams; import java.util.Map; import ac.ed.lurg.Timestep; -import ac.ed.lurg.landuse.AreasItem; +import ac.ed.lurg.landuse.LandUseItem; import ac.ed.lurg.landuse.IrrigationItem; import ac.ed.lurg.types.CropType; import ac.ed.lurg.yield.YieldResponsesItem; @@ -12,11 +12,11 @@ public class GamsLocationInput { private Timestep timestep; private Map<Integer, ? extends YieldResponsesItem> yields; - private Map<Integer, ? extends AreasItem> previousAreas; + private Map<Integer, ? extends LandUseItem> previousAreas; private Map<Integer, ? extends IrrigationItem> irrigationCosts; private GamsCountryInput countryInput; - public GamsLocationInput(Timestep timestep, Map<Integer, ? extends YieldResponsesItem> yields, Map<Integer, ? extends AreasItem> previousAreas, + public GamsLocationInput(Timestep timestep, Map<Integer, ? extends YieldResponsesItem> yields, Map<Integer, ? extends LandUseItem> previousAreas, Map<Integer, ? extends IrrigationItem> irrigationCosts, GamsCountryInput countryInput) { super(); this.timestep = timestep; @@ -35,7 +35,7 @@ public class GamsLocationInput { return yields; } - public Map<Integer, ? extends AreasItem> getPreviousAreas() { + public Map<Integer, ? extends LandUseItem> getPreviousAreas() { return previousAreas; } diff --git a/src/ac/ed/lurg/country/gams/GamsLocationOptimiser.java b/src/ac/ed/lurg/country/gams/GamsLocationOptimiser.java index 2bb0e6b8f39e34677dd3a4e43e1ea256028d166e..b935e34a51edc87680fbc203e9330ff1fc35fc0f 100644 --- a/src/ac/ed/lurg/country/gams/GamsLocationOptimiser.java +++ b/src/ac/ed/lurg/country/gams/GamsLocationOptimiser.java @@ -7,9 +7,8 @@ import java.util.Map.Entry; import java.util.Vector; import ac.ed.lurg.ModelConfig; -import ac.ed.lurg.landuse.AreasItem; import ac.ed.lurg.landuse.CropUsageData; -import ac.ed.lurg.landuse.IntensitiesItem; +import ac.ed.lurg.landuse.LandUseItem; import ac.ed.lurg.landuse.Intensity; import ac.ed.lurg.landuse.IrrigationItem; import ac.ed.lurg.types.CommodityType; @@ -93,10 +92,10 @@ public class GamsLocationOptimiser { double totalAgriLand = 0; - for (Map.Entry<Integer, ? extends AreasItem> entry : inputData.getPreviousAreas().entrySet()) { + for (Map.Entry<Integer, ? extends LandUseItem> entry : inputData.getPreviousAreas().entrySet()) { Integer locationId = entry.getKey(); String locString = Integer.toString(locationId); - AreasItem areasItem = entry.getValue(); + LandUseItem areasItem = entry.getValue(); double suitableLand = areasItem.getSuitableLand(); if (DEBUG) LogWriter.println(String.format(" %d %15s,\t %.1f", locationId, "suitableLand", suitableLand)); @@ -219,12 +218,9 @@ public class GamsLocationOptimiser { double totalPastureArea = 0; double area, fertIntensity, irrigIntensity, otherIntensity = Double.NaN, feedAmount, netImport, yield, unitEnergy, cropAdj, prod, prodCost; - final LazyHashMap<Integer, AreasItem> cropAreas = new LazyHashMap<Integer, AreasItem>() { - protected AreasItem createValue() { return new AreasItem(); } - }; - - HashMap<Integer, IntensitiesItem> intensities = new HashMap<Integer, IntensitiesItem>(); - + final LazyHashMap<Integer, LandUseItem> cropAreas = new LazyHashMap<Integer, LandUseItem>() { + protected LandUseItem createValue() { return new LandUseItem(); } + }; Map<CropType, CropUsageData> cropUsageData = new HashMap<CropType, CropUsageData>(); Map<CropType, Double> cropAdjs = new HashMap<CropType, Double>(); @@ -254,20 +250,14 @@ public class GamsLocationOptimiser { if (DEBUG) LogWriter.println(String.format("\n%s:\tfeedAmount= %.1f,\tnetImports= %.3f,\tprod= %.3f,\tprodCost= %.3f,\tcropAdj= %.3f", itemName, feedAmount, netImport, prod, prodCost, cropAdj)); } + LandUseItem areasItem = cropAreas.lazyGet(locId); + if (area > 0) { - if (DEBUG) LogWriter.println(String.format("\t location %s, %s:\tarea= %.1f,\tfert= %.3f,\tirrg= %.3f,\tintensity= %.3f", locationName, itemName, area, fertIntensity, irrigIntensity, otherIntensity)); - - IntensitiesItem intensityItem = intensities.get(locId); - if (intensityItem == null) { - intensityItem = new IntensitiesItem(cropAreas.lazyGet(locId)); - intensities.put(locId, intensityItem); - } - - intensityItem.setIntensity(cropType, new Intensity(fertIntensity, irrigIntensity, otherIntensity, yield, unitEnergy)); + if (DEBUG) LogWriter.println(String.format("\t location %s, %s:\tarea= %.1f,\tfert= %.3f,\tirrg= %.3f,\tintensity= %.3f", locationName, itemName, area, fertIntensity, irrigIntensity, otherIntensity)); + areasItem.setIntensity(cropType, new Intensity(fertIntensity, irrigIntensity, otherIntensity, yield, unitEnergy)); } double croplandArea = getParmValue(parmCroplandArea, locationName); - AreasItem areasItem = cropAreas.lazyGet(locId); if (cropType.equals(CropType.PASTURE)) { areasItem.setLandCoverArea(LandCoverType.PASTURE, area); totalPastureArea += area; @@ -290,7 +280,7 @@ public class GamsLocationOptimiser { LogWriter.println(String.format("\nTotal area= %.1f (crop=%.1f, pasture %.1f)", totalCropArea+totalPastureArea, totalCropArea, totalPastureArea)); } - GamsLocationOutput results = new GamsLocationOutput(modelStatus, intensities, cropAreas, cropUsageData, cropAdjs); + GamsLocationOutput results = new GamsLocationOutput(modelStatus, cropAreas, cropUsageData, cropAdjs); return results; } diff --git a/src/ac/ed/lurg/country/gams/GamsLocationOutput.java b/src/ac/ed/lurg/country/gams/GamsLocationOutput.java index 327662bb21ffa2770852e3151613063251bf92c4..34c0992e6518ee2f5449f8321cce4cf3575a03b2 100644 --- a/src/ac/ed/lurg/country/gams/GamsLocationOutput.java +++ b/src/ac/ed/lurg/country/gams/GamsLocationOutput.java @@ -2,28 +2,24 @@ package ac.ed.lurg.country.gams; import java.util.Map; -import ac.ed.lurg.landuse.AreasItem; import ac.ed.lurg.landuse.CropUsageData; -import ac.ed.lurg.landuse.IntensitiesItem; +import ac.ed.lurg.landuse.LandUseItem; import ac.ed.lurg.types.CropType; public class GamsLocationOutput { int status; - Map<Integer, IntensitiesItem> intensities; // data mapped from id (not raster) - Map<Integer, AreasItem> cropAreas; + Map<Integer, LandUseItem> intensities; // data mapped from id (not raster) private Map<CropType, CropUsageData> cropUsageData; Map<CropType, Double> cropAdjustments; public GamsLocationOutput(int status, - Map<Integer, IntensitiesItem> intensities, - Map<Integer, AreasItem> cropAreas, + Map<Integer, LandUseItem> intensities, Map<CropType, CropUsageData> cropUsageData, Map<CropType, Double> cropAdjustments) { super(); this.status = status; this.intensities = intensities; - this.cropAreas = cropAreas; this.cropUsageData = cropUsageData; this.cropAdjustments = cropAdjustments; } @@ -31,12 +27,10 @@ public class GamsLocationOutput { public int getStatus() { return status; } - public Map<Integer, IntensitiesItem> getIntensities() { + public Map<Integer, LandUseItem> getIntensities() { return intensities; } - public Map<Integer, AreasItem> getCropAreas() { - return cropAreas; - } + public Map<CropType, CropUsageData> getCommoditiesData() { return cropUsageData; } diff --git a/src/ac/ed/lurg/country/gams/GamsLocationTest.java b/src/ac/ed/lurg/country/gams/GamsLocationTest.java index b47779cdd47e1b7408491fde0a04733970993f60..aac6c0de67b46f7c02a5104636f219babde3348c 100644 --- a/src/ac/ed/lurg/country/gams/GamsLocationTest.java +++ b/src/ac/ed/lurg/country/gams/GamsLocationTest.java @@ -5,7 +5,7 @@ import java.util.Map; import ac.ed.lurg.Timestep; import ac.ed.lurg.country.CompositeCountry; -import ac.ed.lurg.landuse.AreasItem; +import ac.ed.lurg.landuse.LandUseItem; import ac.ed.lurg.landuse.IrrigationItem; import ac.ed.lurg.types.CommodityType; import ac.ed.lurg.types.CropType; @@ -82,9 +82,9 @@ public class GamsLocationTest { return returnMap; } - private Map<Integer, AreasItem> getPreviousArea() { - AreasItem dummyMap = getAreaItem(0,0); - Map<Integer, AreasItem> returnMap = new HashMap<Integer, AreasItem>(); + private Map<Integer, LandUseItem> getPreviousArea() { + LandUseItem dummyMap = getAreaItem(0,0); + Map<Integer, LandUseItem> returnMap = new HashMap<Integer, LandUseItem>(); for (int i= 1; i<=NUM_LOCATIONS_PER_COUNTRY; i++) returnMap.put(i, dummyMap); @@ -92,8 +92,8 @@ public class GamsLocationTest { return returnMap; } - AreasItem getAreaItem(double cereal, double pasture) { - AreasItem dummyMap = new AreasItem(); + LandUseItem getAreaItem(double cereal, double pasture) { + LandUseItem dummyMap = new LandUseItem(); dummyMap.setCropFraction(CropType.WHEAT, 0.2); dummyMap.setCropFraction(CropType.MAIZE, 0.2); diff --git a/src/ac/ed/lurg/country/gams/GamsRasterInput.java b/src/ac/ed/lurg/country/gams/GamsRasterInput.java index af3d8d073dd2b919cef22f5774a0a8695aa6f18b..b093c51df3295ba92cfec1f72ac5d8f0323e9b60 100644 --- a/src/ac/ed/lurg/country/gams/GamsRasterInput.java +++ b/src/ac/ed/lurg/country/gams/GamsRasterInput.java @@ -1,7 +1,7 @@ package ac.ed.lurg.country.gams; import ac.ed.lurg.Timestep; -import ac.ed.lurg.landuse.AreasItem; +import ac.ed.lurg.landuse.LandUseItem; import ac.ed.lurg.landuse.IrrigationItem; import ac.ed.lurg.yield.YieldRaster; import ac.sac.raster.RasterSet; @@ -10,16 +10,16 @@ public class GamsRasterInput { private Timestep timestep; private YieldRaster yields; - private RasterSet<AreasItem> previousAreas; + private RasterSet<LandUseItem> previousIntensityAreas; private RasterSet<IrrigationItem> irrigationCost; private GamsCountryInput countryInput; - public GamsRasterInput(Timestep timestep, YieldRaster yields, RasterSet<AreasItem> previousAreas, + public GamsRasterInput(Timestep timestep, YieldRaster yields, RasterSet<LandUseItem> previousIntensityAreas, RasterSet<IrrigationItem> irrigationCost, GamsCountryInput countryInput) { super(); this.timestep = timestep; this.yields = yields; - this.previousAreas = previousAreas; + this.previousIntensityAreas = previousIntensityAreas; this.irrigationCost = irrigationCost; this.countryInput = countryInput; } @@ -28,8 +28,8 @@ public class GamsRasterInput { return yields; } - public RasterSet<AreasItem> getPreviousAreas() { - return previousAreas; + public RasterSet<LandUseItem> getPreviousAreas() { + return previousIntensityAreas; } public RasterSet<IrrigationItem> getIrrigationCost() { diff --git a/src/ac/ed/lurg/country/gams/GamsRasterOptimiser.java b/src/ac/ed/lurg/country/gams/GamsRasterOptimiser.java index 19d76b6f9e44510821c00d070f65253d05e9352c..90a3931a1af97841d772b8fca7380275fee0d200 100644 --- a/src/ac/ed/lurg/country/gams/GamsRasterOptimiser.java +++ b/src/ac/ed/lurg/country/gams/GamsRasterOptimiser.java @@ -10,8 +10,7 @@ import java.util.Map.Entry; import java.util.Set; import ac.ed.lurg.ModelConfig; -import ac.ed.lurg.landuse.AreasItem; -import ac.ed.lurg.landuse.IntensitiesItem; +import ac.ed.lurg.landuse.LandUseItem; import ac.ed.lurg.landuse.IrrigationItem; import ac.ed.lurg.types.CropType; import ac.ed.lurg.types.LandCoverType; @@ -62,8 +61,8 @@ public class GamsRasterOptimiser { cropAdjustments.put(c, 1.0); } - double baseCropland = AreasItem.getTotalLandCover(gamsInput.getPreviousAreas(), LandCoverType.CROPLAND); - double basePasture = AreasItem.getTotalLandCover(gamsInput.getPreviousAreas(), LandCoverType.PASTURE); + double baseCropland = LandUseItem.getTotalLandCover(gamsInput.getPreviousAreas(), LandCoverType.CROPLAND); + double basePasture = LandUseItem.getTotalLandCover(gamsInput.getPreviousAreas(), LandCoverType.PASTURE); LogWriter.println("baseCropland=" + baseCropland + ", basePasture=" + basePasture); @@ -74,7 +73,7 @@ public class GamsRasterOptimiser { result = opti.run(); if (baseCropland > 0) { - double cropAdjSingle = AreasItem.getTotalLandCover(result.getCropAreas(), LandCoverType.CROPLAND) / baseCropland; + double cropAdjSingle = LandUseItem.getTotalLandCover(result.getIntensities(), LandCoverType.CROPLAND) / baseCropland; cropAdjSingle = Math.min(Math.max(cropAdjSingle, 0.5), 2); for (CropType c : CropType.getCropsLessPasture()) { @@ -83,7 +82,7 @@ public class GamsRasterOptimiser { } if (basePasture > 0) { - double pastureAdjSingle = AreasItem.getTotalLandCover(result.getCropAreas(), LandCoverType.PASTURE) / basePasture; + double pastureAdjSingle = LandUseItem.getTotalLandCover(result.getIntensities(), LandCoverType.PASTURE) / basePasture; pastureAdjSingle = Math.min(Math.max(pastureAdjSingle, 0.5), 2); cropAdjustments.put(CropType.PASTURE, Math.min(Math.max(cropAdjustments.get(CropType.PASTURE) * pastureAdjSingle, 0.2), 5)); } @@ -98,8 +97,7 @@ public class GamsRasterOptimiser { private GamsRasterOutput convertToRaster(GamsLocationInput gamsInput, GamsLocationOutput gamsOutput) { - RasterSet<AreasItem> newAreaRaster = allocAreas(gamsInput.getPreviousAreas(), gamsOutput); - RasterSet<IntensitiesItem> newIntensityRaster = allocIntensities(gamsOutput); + RasterSet<LandUseItem> newIntensityRaster = allocAreas(gamsInput.getPreviousAreas(), gamsOutput); RasterSet<IntegerRasterItem> locationIdRaster = new RasterSet<IntegerRasterItem>(rasterInputData.getPreviousAreas().getHeaderDetails()); for (Entry<Integer, Set<RasterKey>> entry : mapping.entrySet()) { @@ -108,14 +106,14 @@ public class GamsRasterOptimiser { locationIdRaster.put(key, new IntegerRasterItem(locId)); } - return new GamsRasterOutput(gamsOutput.getStatus(), newIntensityRaster, newAreaRaster, gamsOutput.getCommoditiesData(), gamsOutput.getCropAdjustments(), locationIdRaster); + return new GamsRasterOutput(gamsOutput.getStatus(), newIntensityRaster, gamsOutput.getCommoditiesData(), gamsOutput.getCropAdjustments(), locationIdRaster); } - private RasterSet<AreasItem> createWithSameLandCovers(RasterSet<AreasItem> toCopy) { - RasterSet<AreasItem> theCopy = new RasterSet<AreasItem>(toCopy.getHeaderDetails()); + private RasterSet<LandUseItem> createWithSameLandCovers(RasterSet<LandUseItem> toCopy) { + RasterSet<LandUseItem> theCopy = new RasterSet<LandUseItem>(toCopy.getHeaderDetails()); - for (Entry<RasterKey, AreasItem> entry : toCopy.entrySet()) { - AreasItem newAreasItem = new AreasItem(); + for (Entry<RasterKey, LandUseItem> entry : toCopy.entrySet()) { + LandUseItem newAreasItem = new LandUseItem(); newAreasItem.setLandCoverAreas(entry.getValue()); theCopy.put(entry.getKey(), newAreasItem); } @@ -123,10 +121,10 @@ public class GamsRasterOptimiser { return theCopy; } - private void checkedTotalAreas(RasterSet<AreasItem> areaRaster, String comment) { + private void checkedTotalAreas(RasterSet<LandUseItem> areaRaster, String comment) { for (LandCoverType l : LandCoverType.values()) { double total = 0; - for (AreasItem a : areaRaster.values()) { + for (LandUseItem a : areaRaster.values()) { total += a.getLandCoverArea(l); } @@ -134,20 +132,20 @@ public class GamsRasterOptimiser { } } - private RasterSet<AreasItem> allocAreas(Map<Integer, ? extends AreasItem> prevAreasAgg, GamsLocationOutput gamsOutput) { - RasterSet<AreasItem> newAreaRaster = createWithSameLandCovers(rasterInputData.getPreviousAreas()); + private RasterSet<LandUseItem> allocAreas(Map<Integer, ? extends LandUseItem> prevAreasAgg, GamsLocationOutput gamsOutput) { + RasterSet<LandUseItem> newAreaRaster = createWithSameLandCovers(rasterInputData.getPreviousAreas()); //checkedTotalAreas(rasterInputData.getPreviousAreas(), "old"); //checkedTotalAreas(newAreaRaster, "new"); - for (Map.Entry<Integer, AreasItem> entry : gamsOutput.getCropAreas().entrySet()) { + for (Map.Entry<Integer, LandUseItem> entry : gamsOutput.getIntensities().entrySet()) { Integer locId = entry.getKey(); - AreasItem newAreaAggItem = entry.getValue(); - AreasItem prevAreaAggItem = prevAreasAgg.get(locId); + LandUseItem newAreaAggItem = entry.getValue(); + LandUseItem prevAreaAggItem = prevAreasAgg.get(locId); Set<RasterKey> keys = mapping.get(locId); if (DEBUG) - checkedTotalAreas(newAreaRaster.popSubsetForKeys(new RasterSet<AreasItem>(newAreaRaster.getHeaderDetails()), keys), locId + " before"); + checkedTotalAreas(newAreaRaster.popSubsetForKeys(new RasterSet<LandUseItem>(newAreaRaster.getHeaderDetails()), keys), locId + " before"); double pastureChange = newAreaAggItem.getLandCoverArea(LandCoverType.PASTURE) - prevAreaAggItem.getLandCoverArea(LandCoverType.PASTURE); double croplandChange = newAreaAggItem.getLandCoverArea(LandCoverType.CROPLAND) - prevAreaAggItem.getLandCoverArea(LandCoverType.CROPLAND); @@ -189,12 +187,13 @@ public class GamsRasterOptimiser { LogWriter.printlnError("This should never happen, due to GAMS constraint. Not able to incorporate all changes, as not enough forest or natural areas left: " + locId + ": " + shortfall); if (DEBUG) - checkedTotalAreas(newAreaRaster.popSubsetForKeys(new RasterSet<AreasItem>(newAreaRaster.getHeaderDetails()), keys), locId + " after"); + checkedTotalAreas(newAreaRaster.popSubsetForKeys(new RasterSet<LandUseItem>(newAreaRaster.getHeaderDetails()), keys), locId + " after"); for (RasterKey key : keys) { - AreasItem newAreasRasterItem = newAreaRaster.get(key); + LandUseItem newAreasRasterItem = newAreaRaster.get(key); for (CropType crop : CropType.values()) { newAreasRasterItem.setCropFraction(crop, newAreaAggItem.getCropFraction(crop)); + newAreasRasterItem.setIntensity(crop, newAreaAggItem.getIntensity(crop)); // intensities constant over single aggregated land category } } } @@ -202,7 +201,7 @@ public class GamsRasterOptimiser { return newAreaRaster; } - private double allocAllLandCrops(RasterSet<AreasItem> newAreaRaster, Set<RasterKey> keys, LandCoverType toLC, LandCoverType fromLC, double change) { + private double allocAllLandCrops(RasterSet<LandUseItem> newAreaRaster, Set<RasterKey> keys, LandCoverType toLC, LandCoverType fromLC, double change) { LandCoverType toType = toLC; LandCoverType fromType = fromLC; @@ -219,7 +218,7 @@ public class GamsRasterOptimiser { for (RasterKey key : keys) { //if (DEBUG) LogWriter.println(" Processing raster key " + key); - AreasItem newAreasRasterItem = newAreaRaster.get(key); + LandUseItem newAreasRasterItem = newAreaRaster.get(key); double shortfall = newAreasRasterItem.moveAreas(toType, fromType, avgChange); if (shortfall == 0) @@ -236,26 +235,11 @@ public class GamsRasterOptimiser { return totalShortfall; } - private RasterSet<IntensitiesItem> allocIntensities(GamsLocationOutput gamsOutput) { - - RasterSet<IntensitiesItem> newIntensityRaster = new RasterSet<IntensitiesItem>(rasterInputData.getPreviousAreas().getHeaderDetails()); - - for (Map.Entry<Integer, AreasItem> entry : gamsOutput.getCropAreas().entrySet()) { - Integer locId = entry.getKey(); - IntensitiesItem newIntensitiesItem = gamsOutput.getIntensities().get(locId); - - for (RasterKey key : mapping.get(locId)) { - newIntensityRaster.put(key, newIntensitiesItem); // intensities constant over single aggregated land category - } - } - return newIntensityRaster; - } - @SuppressWarnings("serial") private GamsLocationInput 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<AreasItem> cropAreaRaster = rasterInputData.getPreviousAreas(); + RasterSet<LandUseItem> cropAreaRaster = rasterInputData.getPreviousAreas(); /* checkedTotalAreas(cropAreaRaster, "before"); new RasterOutputer<AreasItem>(cropAreaRaster, "BeforeLandCover") { @@ -319,8 +303,8 @@ public class GamsRasterOptimiser { LazyTreeMap<Integer, AveragingYieldResponsesItem> aggregatedYields = new LazyTreeMap<Integer, AveragingYieldResponsesItem>() { protected AveragingYieldResponsesItem createValue() { return new AveragingYieldResponsesItem(); } }; - LazyTreeMap<Integer, AreasItem> aggregatedAreas = new LazyTreeMap<Integer, AreasItem>() { - protected AreasItem createValue() { return new AreasItem(); } + LazyTreeMap<Integer, LandUseItem> aggregatedAreas = new LazyTreeMap<Integer, LandUseItem>() { + protected LandUseItem createValue() { return new LandUseItem(); } }; LazyTreeMap<Integer, IrrigationItem> aggregatedIrrigCosts = new LazyTreeMap<Integer, IrrigationItem>() { protected IrrigationItem createValue() { return new IrrigationItem(); } @@ -345,7 +329,7 @@ public class GamsRasterOptimiser { countFound++; //LogWriter.println("YieldResponsesItem found for " + key + ", x=" + yieldRaster.getXCoordin(key) + ", y=" + yieldRaster.getYCoordin(key)); - AreasItem cropAreas = cropAreaRaster.get(key); + LandUseItem cropAreas = cropAreaRaster.get(key); if (cropAreas == null) { LogWriter.printlnError("GamsRasterOptimiser: Can't find cropAreas for " + key); continue; @@ -358,7 +342,7 @@ public class GamsRasterOptimiser { Integer id = cerealCat + pastureCat * numCerealCats; AveragingYieldResponsesItem avgYResp = aggregatedYields.lazyGet(id); - AreasItem aggAreas = aggregatedAreas.lazyGet(id); + LandUseItem aggAreas = aggregatedAreas.lazyGet(id); IrrigationItem avgIrigCost = aggregatedIrrigCosts.lazyGet(id); mapping.lazyGet(id).add(key); diff --git a/src/ac/ed/lurg/country/gams/GamsRasterOutput.java b/src/ac/ed/lurg/country/gams/GamsRasterOutput.java index 30c2eb072c061c08852d2d25addd480f0f1beff4..1787e2b1b9752dafa2d1b6450917585b03bbf51e 100644 --- a/src/ac/ed/lurg/country/gams/GamsRasterOutput.java +++ b/src/ac/ed/lurg/country/gams/GamsRasterOutput.java @@ -2,9 +2,8 @@ package ac.ed.lurg.country.gams; import java.util.Map; -import ac.ed.lurg.landuse.AreasItem; import ac.ed.lurg.landuse.CropUsageData; -import ac.ed.lurg.landuse.IntensitiesItem; +import ac.ed.lurg.landuse.LandUseItem; import ac.ed.lurg.types.CropType; import ac.sac.raster.IntegerRasterItem; import ac.sac.raster.RasterSet; @@ -13,24 +12,22 @@ public class GamsRasterOutput { private int status; - private RasterSet<IntensitiesItem> intensityRaster; - private RasterSet<AreasItem> cropAreaRaster; + private RasterSet<LandUseItem> intensityRaster; private RasterSet<IntegerRasterItem> locationIdRaster; private Map<CropType, CropUsageData> cropUsageData; private Map<CropType, Double> cropAdjustments; - public GamsRasterOutput(RasterSet<AreasItem> cropAreaRaster, Map<CropType, CropUsageData> cropUsageData) { + public GamsRasterOutput(RasterSet<LandUseItem> intensityRaster, Map<CropType, CropUsageData> cropUsageData) { super(); - this.cropAreaRaster = cropAreaRaster; - this.cropUsageData = cropUsageData; + this.intensityRaster = intensityRaster; + this.cropUsageData = cropUsageData; } - public GamsRasterOutput(int status, RasterSet<IntensitiesItem> intensityRaster, RasterSet<AreasItem> cropAreaRaster, Map<CropType, CropUsageData> cropUsageData, + public GamsRasterOutput(int status, RasterSet<LandUseItem> intensityRaster, Map<CropType, CropUsageData> cropUsageData, Map<CropType, Double> cropAdjustments, RasterSet<IntegerRasterItem> locationIdRaster) { - this(cropAreaRaster, cropUsageData); + this(intensityRaster, cropUsageData); this.status = status; - this.intensityRaster = intensityRaster; this.cropAdjustments = cropAdjustments; this.locationIdRaster = locationIdRaster; } @@ -39,14 +36,10 @@ public class GamsRasterOutput { return status; } - public RasterSet<IntensitiesItem> getIntensityRaster() { + public RasterSet<LandUseItem> getIntensityRaster() { return intensityRaster; } - - public RasterSet<AreasItem> getCropAreaRaster() { - return cropAreaRaster; - } - + public RasterSet<IntegerRasterItem> getLocationIdRaster() { return locationIdRaster; } diff --git a/src/ac/ed/lurg/country/gams/GamsRasterTest.java b/src/ac/ed/lurg/country/gams/GamsRasterTest.java index ec5c5e048934d7b3caf0339b59c597f06056a310..8b1c1b7e84f9a130cd71f19766b967e31baba65d 100644 --- a/src/ac/ed/lurg/country/gams/GamsRasterTest.java +++ b/src/ac/ed/lurg/country/gams/GamsRasterTest.java @@ -2,7 +2,7 @@ package ac.ed.lurg.country.gams; import ac.ed.lurg.Timestep; import ac.ed.lurg.country.CompositeCountry; -import ac.ed.lurg.landuse.AreasItem; +import ac.ed.lurg.landuse.LandUseItem; import ac.ed.lurg.landuse.IrrigationItem; import ac.ed.lurg.utils.LogWriter; import ac.ed.lurg.yield.YieldRaster; @@ -63,13 +63,13 @@ public class GamsRasterTest extends GamsLocationTest { } - public RasterSet<AreasItem> getPreviousAreaRaster() { - RasterSet<AreasItem> testAreaRaster= new RasterSet<AreasItem>(null); + public RasterSet<LandUseItem> getPreviousAreaRaster() { + RasterSet<LandUseItem> testAreaRaster= new RasterSet<LandUseItem>(null); for (int i = 0; i<X_RANGE; i++) { for (int j = 0; j<Y_RANGE; j++) { RasterKey key = new RasterKey(i,j); - AreasItem areaItem = getAreaItem(i * 20, j * 30); + LandUseItem areaItem = getAreaItem(i * 20, j * 30); testAreaRaster.put(key, areaItem); } } diff --git a/src/ac/ed/lurg/landuse/IntensitiesItem.java b/src/ac/ed/lurg/landuse/IntensitiesItem.java deleted file mode 100644 index 37ec5897af921908ffa350523889cb7d62cd597b..0000000000000000000000000000000000000000 --- a/src/ac/ed/lurg/landuse/IntensitiesItem.java +++ /dev/null @@ -1,112 +0,0 @@ -package ac.ed.lurg.landuse; - -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; - -import ac.ed.lurg.types.CropType; -import ac.sac.raster.RasterItem; - -public class IntensitiesItem implements RasterItem { - - private Map<CropType, Intensity> intensityMap = new HashMap<CropType, Intensity>(); - private AreasItem areaItem; - - public IntensitiesItem(AreasItem areaItem) { - this.areaItem = areaItem; - } - - public Intensity getIntensity(CropType crop) { - return intensityMap.get(crop); - } - - public void setIntensity(CropType crop, Intensity intensityData) { - intensityMap.put(crop, intensityData); - } - - /** Fertiliser rate in kg/ha */ - public double getFertiliserRate(CropType crop) { - Intensity i = getIntensity(crop); - return (i == null) ? 0 : i.getFertiliserAmount(); - } - - /** Fertiliser amount in kt (1000 tonnes), for this location */ - public double getFertiliserAmount(CropType c) { - double rate = getFertiliserRate(c); - double area = areaItem.getCropArea(c); - return rate * area; - } - - public double getFertiliserAverageRate(CropType... crops) { - double fertTotal = 0; - double areaTotal = 0; - - for (CropType c : crops) { - fertTotal += getFertiliserAmount(c); - areaTotal = areaItem.getCropArea(c); - } - - return areaTotal > 0 ? fertTotal / areaTotal : 0; - } - - - public static double getFertiliserTotal(Collection<? extends IntensitiesItem> items, CropType... crops) { - double total = 0; - for (IntensitiesItem a : items) { - if (a == null) - continue; - - for (CropType c : crops) - total += a.getFertiliserAmount(c); - } - - return total; - } - - public static double getFertiliserTotal(Collection<? extends IntensitiesItem> items, Collection<CropType> crops) { - return getFertiliserTotal(items, crops.toArray(new CropType[crops.size()])); - } - - /** Irrigation rate in litre/ha */ - public double getIrrigationRate(CropType crop) { - Intensity i = getIntensity(crop); - - return (i == null) ? 0 : i.getIrrigationRate(999); - } - - /** Irrigation amount in M litres, for this location */ - public double getIrrigationAmount(CropType c) { - double rate = getIrrigationRate(c); - double area = areaItem.getCropArea(c); - return rate * area; - } - - public double getIrrigationAverageRate(CropType... crops) { - double irrigTotal = 0; - double areaTotal = 0; - - for (CropType c : crops) { - irrigTotal += getIrrigationAmount(c); - areaTotal = areaItem.getCropArea(c); - } - - return areaTotal > 0 ? irrigTotal / areaTotal : 0; - } - - public static double getIrrigationTotal(Collection<? extends IntensitiesItem> items, CropType... crops) { - double total = 0; - for (IntensitiesItem a : items) { - if (a == null) - continue; - - for (CropType c : crops) - total += a.getIrrigationAmount(c); - } - - return total; - } - - public static double getIrrigationTotal(Collection<? extends IntensitiesItem> items, Collection<CropType> crops) { - return getIrrigationTotal(items, crops.toArray(new CropType[crops.size()])); - } -} diff --git a/src/ac/ed/lurg/landuse/AreasItem.java b/src/ac/ed/lurg/landuse/LandUseItem.java similarity index 56% rename from src/ac/ed/lurg/landuse/AreasItem.java rename to src/ac/ed/lurg/landuse/LandUseItem.java index 2056c57074fd8a46ca9a8b2b152cf19455b73cef..699025e1ce663a3588781e2e79682926bf3863ad 100644 --- a/src/ac/ed/lurg/landuse/AreasItem.java +++ b/src/ac/ed/lurg/landuse/LandUseItem.java @@ -1,5 +1,6 @@ package ac.ed.lurg.landuse; +import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; @@ -9,14 +10,108 @@ import ac.ed.lurg.types.CropType; import ac.ed.lurg.types.LandCoverType; import ac.sac.raster.InterpolatingRasterItem; -/* - * Data for one year and country, but it does not know which one - */ -public class AreasItem implements InterpolatingRasterItem<AreasItem> { +public class LandUseItem implements InterpolatingRasterItem<LandUseItem> { + private Map<CropType, Intensity> intensityMap = new HashMap<CropType, Intensity>(); private Map<CropType, Double> cropFractions = new HashMap<CropType, Double>(); private Map<LandCoverType, Double> landCoverAreas = new HashMap<LandCoverType, Double>(); + public Intensity getIntensity(CropType crop) { + return intensityMap.get(crop); + } + + public void setIntensity(CropType crop, Intensity intensityData) { + intensityMap.put(crop, intensityData); + } + + /** Fertiliser rate in kg/ha */ + public double getFertiliserRate(CropType crop) { + Intensity i = getIntensity(crop); + return (i == null) ? 0 : i.getFertiliserAmount(); + } + + /** Fertiliser amount in kt (1000 tonnes), for this location */ + public double getFertiliserAmount(CropType c) { + double rate = getFertiliserRate(c); + double area = getCropArea(c); + return rate * area; + } + + public double getFertiliserAverageRate(CropType... crops) { + double fertTotal = 0; + double areaTotal = 0; + + for (CropType c : crops) { + fertTotal += getFertiliserAmount(c); + areaTotal = getCropArea(c); + } + + return areaTotal > 0 ? fertTotal / areaTotal : 0; + } + + + public static double getFertiliserTotal(Collection<? extends LandUseItem> items, CropType... crops) { + double total = 0; + for (LandUseItem a : items) { + if (a == null) + continue; + + for (CropType c : crops) + total += a.getFertiliserAmount(c); + } + + return total; + } + + public static double getFertiliserTotal(Collection<? extends LandUseItem> items, Collection<CropType> crops) { + return getFertiliserTotal(items, crops.toArray(new CropType[crops.size()])); + } + + /** Irrigation rate in litre/ha */ + public double getIrrigationRate(CropType crop) { + Intensity i = getIntensity(crop); + + return (i == null) ? 0 : i.getIrrigationRate(999); + } + + /** Irrigation amount in M litres, for this location */ + public double getIrrigationAmount(CropType c) { + double rate = getIrrigationRate(c); + double area = getCropArea(c); + return rate * area; + } + + public double getIrrigationAverageRate(CropType... crops) { + double irrigTotal = 0; + double areaTotal = 0; + + for (CropType c : crops) { + irrigTotal += getIrrigationAmount(c); + areaTotal = getCropArea(c); + } + + return areaTotal > 0 ? irrigTotal / areaTotal : 0; + } + + public static double getIrrigationTotal(Collection<? extends LandUseItem> items, CropType... crops) { + double total = 0; + for (LandUseItem a : items) { + if (a == null) + continue; + + for (CropType c : crops) + total += a.getIrrigationAmount(c); + } + + return total; + } + + public static double getIrrigationTotal(Collection<? extends LandUseItem> items, Collection<CropType> crops) { + return getIrrigationTotal(items, crops.toArray(new CropType[crops.size()])); + } + + + public void setLandCoverAreas(LandCoverItem landCover) { if (landCover != null) { for (LandCoverType lcType : LandCoverType.values()) @@ -24,7 +119,7 @@ public class AreasItem implements InterpolatingRasterItem<AreasItem> { } } - public void setLandCoverAreas(AreasItem otherAreasItem) { + public void setLandCoverAreas(LandUseItem otherAreasItem) { for (Entry<LandCoverType, Double> entry : otherAreasItem.landCoverAreas.entrySet()) { landCoverAreas.put(entry.getKey(), entry.getValue()); } @@ -105,7 +200,7 @@ public class AreasItem implements InterpolatingRasterItem<AreasItem> { return (Double.isNaN(d) || Double.isInfinite(d)) ? 1.0 : d; } - public CropToDouble getCropChanges(AreasItem prevAreaAggItem) { + public CropToDouble getCropChanges(LandUseItem prevAreaAggItem) { CropToDouble changes = new CropToDouble(); for (CropType c : CropType.getCropsLessPasture()) { @@ -117,7 +212,7 @@ public class AreasItem implements InterpolatingRasterItem<AreasItem> { } @Override - public void interpolateAll(AreasItem fromItem, AreasItem toItem, double factor) { + public void interpolateAll(LandUseItem fromItem, LandUseItem toItem, double factor) { cropFractions = new HashMap<CropType, Double>(); landCoverAreas = new HashMap<LandCoverType, Double>(); @@ -149,12 +244,13 @@ public class AreasItem implements InterpolatingRasterItem<AreasItem> { return res; } - public static double getTotalLandCover(Map<?, ? extends AreasItem> areaRaster, LandCoverType landCover) { + public static double getTotalLandCover(Map<?, ? extends LandUseItem> areaRaster, LandCoverType landCover) { double total = 0; - for (AreasItem a : areaRaster.values()) { + for (LandUseItem a : areaRaster.values()) { total += a.getLandCoverArea(landCover); } return total; } + } diff --git a/src/ac/ed/lurg/output/LpjgOutputer.java b/src/ac/ed/lurg/output/LpjgOutputer.java index 27e6290d3c0f227e9509d1ed35d974259cc00913..219c8901d23a42c844f3c365e3770cbebbca6c27 100644 --- a/src/ac/ed/lurg/output/LpjgOutputer.java +++ b/src/ac/ed/lurg/output/LpjgOutputer.java @@ -8,8 +8,7 @@ import java.io.IOException; import java.util.Map.Entry; import ac.ed.lurg.ModelConfig; -import ac.ed.lurg.landuse.AreasItem; -import ac.ed.lurg.landuse.IntensitiesItem; +import ac.ed.lurg.landuse.LandUseItem; import ac.ed.lurg.types.CropType; import ac.ed.lurg.types.LandCoverType; import ac.ed.lurg.utils.LogWriter; @@ -20,15 +19,13 @@ import ac.sac.raster.RasterSet; public class LpjgOutputer { - private RasterSet<IntensitiesItem> intensityRaster; - private RasterSet<AreasItem> cropAreaRaster; + private RasterSet<LandUseItem> intensityRaster; private YieldRaster yieldSurfaces; private int year; - public LpjgOutputer(int year, RasterSet<IntensitiesItem> intensityRaster, RasterSet<AreasItem> cropAreaRaster, YieldRaster yieldSurfaces) { + public LpjgOutputer(int year, RasterSet<LandUseItem> intensityRaster, YieldRaster yieldSurfaces) { this.year = year; this.intensityRaster = intensityRaster; - this.cropAreaRaster = cropAreaRaster; this.yieldSurfaces = yieldSurfaces; } @@ -62,15 +59,15 @@ public class LpjgOutputer { fertWriter.write("Lon Lat TeWWirr TeSWirr TeCoirr TrRiirr Pasture"); irrigWriter.newLine(); - for (Entry<RasterKey, IntensitiesItem> entry : intensityRaster.entrySet()) { + for (Entry<RasterKey, LandUseItem> entry : intensityRaster.entrySet()) { RasterKey key = entry.getKey(); - IntensitiesItem item = entry.getValue(); + LandUseItem item = entry.getValue(); if (item == null) continue; - double lat = cropAreaRaster.getXCoordin(key); - double lon = cropAreaRaster.getYCoordin(key); + double lat = intensityRaster.getXCoordin(key); + double lon = intensityRaster.getYCoordin(key); boolean isSpringWheat = isSpringWheat(key); double winterWheatIrrig = item.getIrrigationAverageRate(CropType.OILCROPS, isSpringWheat ? null : CropType.WHEAT); @@ -153,13 +150,13 @@ public class LpjgOutputer { cropFractWriter.write("Lon Lat TeWWirr TeSWirr TeCoirr TrRiirr"); cropFractWriter.newLine(); - for (Entry<RasterKey, AreasItem> entry : cropAreaRaster.entrySet()) { + for (Entry<RasterKey, LandUseItem> entry : intensityRaster.entrySet()) { RasterKey key = entry.getKey(); - AreasItem item = entry.getValue(); - double lat = cropAreaRaster.getXCoordin(key); - double lon = cropAreaRaster.getYCoordin(key); + LandUseItem item = entry.getValue(); + double lat = intensityRaster.getXCoordin(key); + double lon = intensityRaster.getYCoordin(key); - double expectedArea = cropAreaRaster.getAreaMha(key); + double expectedArea = intensityRaster.getAreaMha(key); double area = item.getTotalLandCoverArea(); if (area > 0 && Math.abs((expectedArea-area)/expectedArea) > 0.01) { // zero area, due to data not being found, already reported so ignored here