diff --git a/src/ac/ed/lurg/ModelConfig.java b/src/ac/ed/lurg/ModelConfig.java index 2176b2fe1fc1f1f531340e5622340dfae40feb89..384ea68390ae1cf78561290857a839d6d052bdcd 100755 --- a/src/ac/ed/lurg/ModelConfig.java +++ b/src/ac/ed/lurg/ModelConfig.java @@ -392,8 +392,8 @@ public class ModelConfig { public static final boolean FORCE_PROTECTED_AREAS = IS_CALIBRATION_RUN ? false : getBooleanProperty("FORCE_PROTECTED_AREAS", false); public static final int FORCE_PROTECTED_AREAS_START_YEAR = getIntProperty("FORCE_PROTECTED_AREAS_START_YEAR", 2020); public static final int FORCE_PROTECTED_AREAS_END_YEAR = getIntProperty("FORCE_PROTECTED_AREAS_END_YEAR", 2050); - + public static final double CONSTANT_PROTECTED_AREA_RATE = getDoubleProperty("CONSTANT_PROTECTED_AREA_RATE", Double.NaN); + public static final boolean USE_CRAFTY_COUNTRIES = getBooleanProperty("USE_CRAFTY_COUNTRIES", false); - public static final String CRAFTY_PRODUCTION_DIR = getProperty("CRAFTY_PRODUCTION_DIR", OUTPUT_DIR + File.separator + "crafty"); - + public static final String CRAFTY_PRODUCTION_DIR = getProperty("CRAFTY_PRODUCTION_DIR", OUTPUT_DIR + File.separator + "crafty"); } diff --git a/src/ac/ed/lurg/ModelMain.java b/src/ac/ed/lurg/ModelMain.java index 6f1cd5bc06533247c048f84c9a5d6b437211434c..052f7b514a20f0d8826d700b30f306e01ff30d80 100644 --- a/src/ac/ed/lurg/ModelMain.java +++ b/src/ac/ed/lurg/ModelMain.java @@ -487,10 +487,14 @@ public class ModelMain { } private RasterSet<LandUseItem> getInitialLandUse() { + RasterSet<LandUseItem> initialLU; if (ModelConfig.IS_CALIBRATION_RUN) - return getLandUseFromBaseline(); + initialLU = getLandUseFromBaseline(); else - return deserializeLandUse(); + initialLU = deserializeLandUse(); + + new ProtectedAreasReader(initialLU).getRasterDataFromFile(ModelConfig.PROTECTED_AREAS_FILE); + return initialLU; } private void serializeLandUse(RasterSet<LandUseItem> landUseRaster) { @@ -539,23 +543,13 @@ public class ModelMain { } }; - new ProtectedAreasReader(initialLC).getRasterDataFromFile(ModelConfig.PROTECTED_AREAS_FILE); new MaxCropAreaReader(initialLC).getRasterDataFromFile(ModelConfig.HIGH_SLOPE_AREAS_FILE); new LandCoverReader(initialLC).getRasterDataFromFile(ModelConfig.INITAL_LAND_COVER_FILE); RasterSet<LandUseItem> landUseRaster = new RasterSet<LandUseItem>(initialLC.getHeaderDetails()); - for (Map.Entry<RasterKey, LandCoverItem> entry : initialLC.entrySet()) { - LandUseItem areasItem = new LandUseItem(); - RasterKey key = entry.getKey(); - LandCoverItem landCover = entry.getValue(); - areasItem.setLandCoverAreas(landCover); - areasItem.setCropFraction(CropType.WHEAT, 0.5); // random start as don't have better data - areasItem.setCropFraction(CropType.MAIZE, 0.5); - areasItem.setProtectedArea(landCover.getProtectedArea()); - areasItem.setUnavailableFract(landCover.getUnavailableFract()); - landUseRaster.put(key, areasItem); - } + for (Map.Entry<RasterKey, LandCoverItem> entry : initialLC.entrySet()) + landUseRaster.put(entry.getKey(), new LandUseItem(entry.getValue())); return landUseRaster; } diff --git a/src/ac/ed/lurg/landuse/LandCoverItem.java b/src/ac/ed/lurg/landuse/LandCoverItem.java index 0c8ad94f4c2d543c60ec388599bce4e0f4d6e63c..bade97744ba7b3b82618fc726d36af27416124ba 100644 --- a/src/ac/ed/lurg/landuse/LandCoverItem.java +++ b/src/ac/ed/lurg/landuse/LandCoverItem.java @@ -12,7 +12,6 @@ public class LandCoverItem implements RasterItem { private Map<LandCoverType, Double> landcover = new HashMap<LandCoverType, Double>(); private double totalArea; - private double proportionProtectedFract; private double unavailableFract; // due to slope /** Area in Mha */ @@ -39,14 +38,6 @@ public class LandCoverItem implements RasterItem { landcover.put(landType, d); } - public void setProtectedFract(double proportionProtectedFract){ - this.proportionProtectedFract=proportionProtectedFract; - } - - public double getProtectedArea(){ - return proportionProtectedFract*totalArea; - } - public double getUnavailableFract(){ return unavailableFract; } diff --git a/src/ac/ed/lurg/landuse/LandUseItem.java b/src/ac/ed/lurg/landuse/LandUseItem.java index b933746bbcedcc12bf0c9640087a60168538d5ff..5be76b1516dd86b60ad4af2da99a893333bf38df 100644 --- a/src/ac/ed/lurg/landuse/LandUseItem.java +++ b/src/ac/ed/lurg/landuse/LandUseItem.java @@ -23,6 +23,18 @@ public class LandUseItem implements InterpolatingRasterItem<LandUseItem>, Serial public LandUseItem() {} + public LandUseItem(LandCoverItem landCover) { + this(); + if (landCover != null) { + for (LandCoverType lcType : LandCoverType.values()) + landCoverAreas.put(lcType, landCover.getLandCoverArea(lcType)); + + setCropFraction(CropType.WHEAT, 0.5); // random start as don't have better data + setCropFraction(CropType.MAIZE, 0.5); + setUnavailableFract(landCover.getUnavailableFract()); + } + } + public LandUseItem(LandUseItem luItemToCopy) { this(); intensityMap.putAll(luItemToCopy.intensityMap); @@ -31,7 +43,14 @@ public class LandUseItem implements InterpolatingRasterItem<LandUseItem>, Serial protectedArea = (luItemToCopy.protectedArea); } - public void setProtectedArea(double protectedArea){ + public void setProtectedFract(double protFrac) { + if (!Double.isNaN(ModelConfig.CONSTANT_PROTECTED_AREA_RATE)) + protFrac=ModelConfig.CONSTANT_PROTECTED_AREA_RATE; + + this.protectedArea = protFrac*getTotalLandCoverArea(); + } + + public void setProtectedArea(double protectedArea) { this.protectedArea = protectedArea; } @@ -152,15 +171,6 @@ public class LandUseItem implements InterpolatingRasterItem<LandUseItem>, Serial return getIrrigationTotal(items, crops.toArray(new CropType[crops.size()])); } - - - public void setLandCoverAreas(LandCoverItem landCover) { - if (landCover != null) { - for (LandCoverType lcType : LandCoverType.values()) - landCoverAreas.put(lcType, landCover.getLandCoverArea(lcType)); - } - } - /** move areas from one land cover to another, return any residual not possible */ public double moveAreas(LandCoverType toType, LandCoverType fromType, double changeReq) { @@ -284,7 +294,7 @@ public class LandUseItem implements InterpolatingRasterItem<LandUseItem>, Serial double proportion = 1; if (year < ModelConfig.FORCE_PROTECTED_AREAS_END_YEAR) - proportion = 1.0 / (ModelConfig.FORCE_PROTECTED_AREAS_END_YEAR - year); + proportion = 1.0 - (ModelConfig.FORCE_PROTECTED_AREAS_END_YEAR - year) / (ModelConfig.FORCE_PROTECTED_AREAS_END_YEAR - ModelConfig.FORCE_PROTECTED_AREAS_START_YEAR); suitable = Math.max(0, currentAgri + natAvailForAgri * proportion); // netNatAvailForAgri is negative, but suitable area < 0 is not sensible (seems to happen with high barren areas) } diff --git a/src/ac/ed/lurg/landuse/ProtectedAreasReader.java b/src/ac/ed/lurg/landuse/ProtectedAreasReader.java index d036f47f3bd85a2e30d84e6ca13c71ca37fbb6d3..dcf8ca6a17a83adf660fa8be887179d8621b0ac4 100644 --- a/src/ac/ed/lurg/landuse/ProtectedAreasReader.java +++ b/src/ac/ed/lurg/landuse/ProtectedAreasReader.java @@ -3,18 +3,17 @@ package ac.ed.lurg.landuse; import ac.sac.raster.AbstractRasterReader; import ac.sac.raster.RasterSet; -public class ProtectedAreasReader extends AbstractRasterReader<LandCoverItem> { +public class ProtectedAreasReader extends AbstractRasterReader<LandUseItem> { - public ProtectedAreasReader (RasterSet<LandCoverItem> dataset) { + public ProtectedAreasReader (RasterSet<LandUseItem> dataset) { super(dataset); } @Override - public void setData(LandCoverItem lcData, String token) { + public void setData(LandUseItem lcData, String token) { if (!"nan".equals(token)) { double protFrac = Double.parseDouble(token); lcData.setProtectedFract(protFrac); } } - } \ No newline at end of file