Skip to content
Snippets Groups Projects
Commit ca481664 authored by Peter Alexander's avatar Peter Alexander
Browse files

no message

parent 9531261e
No related branches found
No related tags found
No related merge requests found
...@@ -12,6 +12,7 @@ import java.util.Set; ...@@ -12,6 +12,7 @@ import java.util.Set;
import ac.ed.lurg.landuse.AreasItem; import ac.ed.lurg.landuse.AreasItem;
import ac.ed.lurg.landuse.IntensitiesItem; import ac.ed.lurg.landuse.IntensitiesItem;
import ac.ed.lurg.types.CropType; import ac.ed.lurg.types.CropType;
import ac.ed.lurg.types.LandDataType;
import ac.ed.lurg.types.YieldType; import ac.ed.lurg.types.YieldType;
import ac.ed.lurg.utils.LogWriter; import ac.ed.lurg.utils.LogWriter;
import ac.ed.lurg.yield.AveragingYieldResponsesItem; import ac.ed.lurg.yield.AveragingYieldResponsesItem;
...@@ -42,20 +43,78 @@ public class GamsRasterOptimiser { ...@@ -42,20 +43,78 @@ public class GamsRasterOptimiser {
} }
private GamsRasterOutput convertToRaster(GamsInput gamsInput, GamsOutput gamsOutput) { private GamsRasterOutput convertToRaster(GamsInput gamsInput, GamsOutput gamsOutput) {
// intensities - constant over single category?
RasterSet<IntensitiesItem> intensityRaster = new RasterSet<IntensitiesItem>(); RasterSet<AreasItem> newAreaRaster = new RasterSet<AreasItem>();
RasterSet<IntensitiesItem> newIntensityRaster = new RasterSet<IntensitiesItem>();
for (Map.Entry<Integer, IntensitiesItem> entry : gamsOutput.getIntensities().entrySet()) { for (Map.Entry<Integer, AreasItem> entry : gamsOutput.getCropAreas().entrySet()) {
for (RasterKey key : mapping.get(entry.getKey())) { Integer locId = entry.getKey();
intensityRaster.put(key, entry.getValue()); AreasItem newAreaAggItem = entry.getValue();
Set<RasterKey> keys = mapping.get(locId);
AreasItem prevAreaAggItem = gamsInput.getPreviousAreas().get(locId);
IntensitiesItem newIntensitiesItem = gamsOutput.getIntensities().get(locId);
Map<CropType, Double> avgCropChangeTotals = newAreaAggItem.getScaledCropChanges(prevAreaAggItem, 1.0d/keys.size());
double totalShortfall = 0;
Set<RasterKey> keysWithSpace = new HashSet<RasterKey>();
for (RasterKey key : keys) {
AreasItem prevAreasRasterItem = rasterInputData.getPreviousAreas().get(key);
AreasItem newAreasRasterItem = new AreasItem();
double shortfall = allocationChangeArea(prevAreasRasterItem, avgCropChangeTotals, newAreasRasterItem);
if (shortfall == 0)
keysWithSpace.add(key);
else
totalShortfall += shortfall;
newAreaRaster.put(key, newAreasRasterItem);
newIntensityRaster.put(key, newIntensitiesItem); // intensities constant over single aggregated land category
} }
} }
RasterSet<AreasItem> areaRaster = new RasterSet<AreasItem>(); return new GamsRasterOutput(gamsOutput.getStatus(), newIntensityRaster, newAreaRaster, gamsOutput.getFeedAmounts(), gamsOutput.getNetImports());
}
// crop areas - need some allocation process private double allocationChangeArea(AreasItem prevAreasRasterItem,
Map<CropType, Double> cropChanges,
return null; AreasItem newAreasRasterItem) {
double netAddedCrop = 0;
for (double d : cropChanges.values())
netAddedCrop += d;
double forestRemoved = netAddedCrop/2;
double naturalRemoved = netAddedCrop/2;
double prevForest = prevAreasRasterItem.getLandCoverArea(LandDataType.FOREST);
double prevNatural = prevAreasRasterItem.getLandCoverArea(LandDataType.OTHER_NATURAL);
if (prevForest < forestRemoved) {
forestRemoved = prevForest;
naturalRemoved = netAddedCrop - forestRemoved;
}
if (prevNatural < naturalRemoved) {
naturalRemoved = prevNatural;
}
double ratioOfChanges = (forestRemoved + naturalRemoved)/netAddedCrop;
double shortfall = netAddedCrop - forestRemoved - naturalRemoved;
if (shortfall > 0)
LogWriter.printlnError("Not able to incorporate all changes, as not enough forest or natural areas left: " + ratioOfChanges);
newAreasRasterItem.setLandCoverArea(LandDataType.LAND, prevAreasRasterItem.getLandCoverArea(LandDataType.LAND));
newAreasRasterItem.setLandCoverArea(LandDataType.FOREST, prevForest - forestRemoved);
newAreasRasterItem.setLandCoverArea(LandDataType.OTHER_NATURAL, prevNatural - naturalRemoved);
for (CropType crop : CropType.values()) {
double prevCropArea = prevAreasRasterItem.getCropArea(crop);
double additionalArea = cropChanges.get(crop) * ratioOfChanges;
newAreasRasterItem.setCropArea(crop, prevCropArea + additionalArea);
}
return shortfall;
} }
...@@ -92,6 +151,8 @@ public class GamsRasterOptimiser { ...@@ -92,6 +151,8 @@ public class GamsRasterOptimiser {
} }
aggAreas.setCropArea(crop, aggAreas.getCropArea(crop) + cropAreas.getCropArea(crop)); aggAreas.setCropArea(crop, aggAreas.getCropArea(crop) + cropAreas.getCropArea(crop));
} }
aggAreas.setLandCoverArea(LandDataType.LAND, aggAreas.getLandCoverArea(LandDataType.LAND) + cropAreas.getLandCoverArea(LandDataType.LAND));
} }
return new GamsInput(aggregatedYield, aggregatedAreas, rasterInputData.getCountryInput()); return new GamsInput(aggregatedYield, aggregatedAreas, rasterInputData.getCountryInput());
......
...@@ -22,7 +22,7 @@ public class GamsTest { ...@@ -22,7 +22,7 @@ public class GamsTest {
GamsInput gamsInput = new GamsInput(getYields(), getPreviousArea(), countryLevelInputs); GamsInput gamsInput = new GamsInput(getYields(), getPreviousArea(), countryLevelInputs);
GamsLandUseOptimiser opti = new GamsLandUseOptimiser(gamsInput); GamsLandUseOptimiser opti = new GamsLandUseOptimiser(gamsInput);
GamsOutput gamsOutput = opti.run(); opti.run();
} }
public Map<CropType, Double> getProjectedDemand() { public Map<CropType, Double> getProjectedDemand() {
......
...@@ -2,6 +2,7 @@ package ac.ed.lurg.landuse; ...@@ -2,6 +2,7 @@ package ac.ed.lurg.landuse;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry;
import ac.ed.lurg.types.CropType; import ac.ed.lurg.types.CropType;
import ac.ed.lurg.types.LandDataType; import ac.ed.lurg.types.LandDataType;
...@@ -33,4 +34,23 @@ public class AreasItem implements RasterItem { ...@@ -33,4 +34,23 @@ public class AreasItem implements RasterItem {
public void setLandCoverArea(LandDataType c, double d) { public void setLandCoverArea(LandDataType c, double d) {
landCoverAreas.put(c, d); landCoverAreas.put(c, d);
} }
public double getTotalCropIncPastureArea() {
double total = 0;
for (double d : cropAreas.values()) {
total += d;
}
return total;
}
public Map<CropType, Double> getScaledCropChanges(AreasItem prevAreaAggItem, double factor) {
Map<CropType, Double> changes = new HashMap<CropType, Double>();
for (Entry<CropType, Double> entry : cropAreas.entrySet()) {
double change = entry.getValue() - prevAreaAggItem.getCropArea(entry.getKey());
changes.put(entry.getKey(), change*factor);
}
return changes;
}
} }
...@@ -17,15 +17,19 @@ public class YieldResponse { ...@@ -17,15 +17,19 @@ public class YieldResponse {
} }
public double getFertParam() { public double getFertParam() {
double fertMin = 0, fertMid = 0.5, fertMax = 1; return calcParam(getYield(YieldType.NONE), getYield(YieldType.FERT_MID_ONLY), getYield(YieldType.FERT_MAX_ONLY));
return Math.log((yields.get(YieldType.FERT_MID_ONLY)-getYield(YieldType.NONE))/(yields.get(YieldType.FERT_MAX_ONLY)-getYield(YieldType.NONE))) /
Math.log((fertMid - fertMin)/(fertMax - fertMin))/fertMax;
} }
public double getIrrigParam() { public double getIrrigParam() {
double irrigMin = 0, irrigMid = 0.5, irrigMax = 1; return calcParam(getYield(YieldType.NONE), getYield(YieldType.IRRIG_MID_ONLY), getYield(YieldType.IRRIG_MAX_ONLY));
return Math.log((yields.get(YieldType.IRRIG_MID_ONLY)-getYield(YieldType.NONE))/(yields.get(YieldType.IRRIG_MAX_ONLY)-getYield(YieldType.NONE))) /
Math.log((irrigMid - irrigMin)/(irrigMax - irrigMin))/irrigMax;
} }
}
private double calcParam(double yMin, double yMid, double yMax) {
double xMin = 0, xMid = 0.5, xMax = 1;
if (yMid <= yMin || yMax <= yMid)
return 1; // default to linear
return Math.log((yMid - yMin)/(yMax - yMin)) / Math.log((xMid - xMin)/(xMax - xMin)) / xMax;
}
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment