diff --git a/src/ac/ed/lurg/ModelConfig.java b/src/ac/ed/lurg/ModelConfig.java index 7ac5b295d14fef6588e4054acc2de71d9b6112c3..69c9cea0015383ec9f061e6ebfab7698b43950c8 100755 --- a/src/ac/ed/lurg/ModelConfig.java +++ b/src/ac/ed/lurg/ModelConfig.java @@ -255,6 +255,8 @@ public class ModelConfig { public static final String NATURAL_FOREST_GROWTH_FILENAME = "growth_natural.out"; public static final String LAND_COVER_AGE_DIST_FILENAME = SPATIAL_DATA_DIR + File.separator + "land_cover_age_dist.txt"; public static final int WOOD_AND_CARBON_TIMESTEP_SIZE = getIntProperty("WOOD_AND_CARBON_TIMESTEP_SIZE", 20); // years + public static final double WOOD_YIELD_CALIB_FACTOR = getDoubleProperty("WOOD_YIELD_CALIB_FACTOR", 8.0); + public static final int CARBON_WOOD_MAX_TIME = getIntProperty("CARBON_WOOD_AGE_CLASSES", 165); // Output public static final String LAND_COVER_OUTPUT_FILE = OUTPUT_DIR + File.separator + "lc.txt"; diff --git a/src/ac/ed/lurg/ModelMain.java b/src/ac/ed/lurg/ModelMain.java index cac798d8e9acba3f053cf04ee59cf4cab2328499..89406182b07844433ddcc9c1e72a0bfaf1e214ff 100644 --- a/src/ac/ed/lurg/ModelMain.java +++ b/src/ac/ed/lurg/ModelMain.java @@ -28,7 +28,6 @@ import ac.ed.lurg.demand.CalorieManager; import ac.ed.lurg.demand.DemandManagerFromFile; import ac.ed.lurg.demand.DemandManagerSSP; import ac.ed.lurg.demand.ElasticDemandManager; -import ac.ed.lurg.forestry.WoodYieldItem; import ac.ed.lurg.forestry.WoodYieldRasterSet; import ac.ed.lurg.landuse.ConversionCostReader; import ac.ed.lurg.landuse.CropUsageData; @@ -45,7 +44,6 @@ import ac.ed.lurg.landuse.LandCoverItem; import ac.ed.lurg.landuse.LandCoverReader; import ac.ed.lurg.landuse.LandCoverTile; import ac.ed.lurg.landuse.LandUseItem; -import ac.ed.lurg.landuse.LandUseSerializer; import ac.ed.lurg.landuse.LandTileReader; import ac.ed.lurg.landuse.LandUseBinarySerializer; import ac.ed.lurg.landuse.MaxCropAreaReader; @@ -64,11 +62,8 @@ import ac.ed.lurg.utils.FileWriterHelper; import ac.ed.lurg.utils.LogWriter; import ac.ed.lurg.yield.LPJYieldResponseMapReader; import ac.ed.lurg.yield.YieldRaster; -import ac.sac.raster.AbstractBinaryRasterReader; -import ac.sac.raster.AbstractTabularRasterReader; import ac.sac.raster.IntegerRasterItem; import ac.sac.raster.IntegerRasterReader; -import ac.sac.raster.InterpolatingRasterSet; import ac.sac.raster.RasterHeaderDetails; import ac.sac.raster.RasterKey; import ac.sac.raster.RasterOutputer; diff --git a/src/ac/ed/lurg/carbon/CarbonFluxItem.java b/src/ac/ed/lurg/carbon/CarbonFluxItem.java index 9dd7c6dbece4fc3651e592f849988179bca474c5..25d9abbaf580427775eeea6b35b7534d47d0ab45 100644 --- a/src/ac/ed/lurg/carbon/CarbonFluxItem.java +++ b/src/ac/ed/lurg/carbon/CarbonFluxItem.java @@ -6,6 +6,7 @@ import java.io.Serializable; import java.util.HashMap; import java.util.Map; +import ac.ed.lurg.ModelConfig; import ac.ed.lurg.Timestep; import ac.ed.lurg.landuse.LandCoverTile; import ac.ed.lurg.landuse.LccKey; @@ -31,7 +32,8 @@ public class CarbonFluxItem implements RasterItem, Serializable { } else { double totalFlux = 0; for (int age=0; age<=LandCoverTile.getMaxAgeBin(); age++) { - totalFlux += cFluxes[age] * tiles.getArea(LandProtectionType.CONVERTIBLE, age); + int ageCapped = Math.min(age, ModelConfig.CARBON_WOOD_MAX_TIME - 1); + totalFlux += cFluxes[ageCapped] * tiles.getArea(LandProtectionType.CONVERTIBLE, age); } double meanFlux = totalFlux / totalArea; this.conversionCarbonFlux.put(key, meanFlux); @@ -52,7 +54,8 @@ public class CarbonFluxItem implements RasterItem, Serializable { } else { double totalFlux = 0; for (int age=0; age<=LandCoverTile.getMaxAgeBin(); age++) { - totalFlux += cFluxes[age] * tiles.getArea(LandProtectionType.CONVERTIBLE, age); + int ageCapped = Math.min(age, ModelConfig.CARBON_WOOD_MAX_TIME - 1); + totalFlux += cFluxes[ageCapped] * tiles.getArea(LandProtectionType.CONVERTIBLE, age); } double meanFlux = totalFlux / totalArea; this.ecosystemCarbonFlux.put(lcType, meanFlux); diff --git a/src/ac/ed/lurg/carbon/CarbonFluxReader.java b/src/ac/ed/lurg/carbon/CarbonFluxReader.java index 8fc5350c8f6ade46d7f3ffc060f4487f5d1ef422..3f5ed1c3565714cd3d14e3e4f70249b0fa63dad9 100644 --- a/src/ac/ed/lurg/carbon/CarbonFluxReader.java +++ b/src/ac/ed/lurg/carbon/CarbonFluxReader.java @@ -9,14 +9,12 @@ import ac.ed.lurg.landuse.LandUseItem; import ac.ed.lurg.landuse.LccKey; import ac.ed.lurg.types.LandCoverType; import ac.sac.raster.AbstractBinaryRasterReader; -import ac.sac.raster.AbstractTabularRasterReader; import ac.sac.raster.RasterHeaderDetails; import ac.sac.raster.RasterKey; import ac.sac.raster.RasterSet; public class CarbonFluxReader { - private static final int MIN_COLS = 263; - private static final String DELIMITER = "[ |\t]+"; + private static final int MIN_COLS = ModelConfig.CARBON_WOOD_MAX_TIME + 2; private static final double CONVERSION_FACTOR = 10.0; // convert kgC/m2 to tC/ha private RasterHeaderDetails rasterProj; private String[] header = new String[MIN_COLS]; @@ -33,36 +31,35 @@ public class CarbonFluxReader { public CarbonFluxRasterSet getCarbonFluxes(RasterSet<LandUseItem> landUseRaster, Timestep timestep) { CarbonFluxRasterSet cFluxData = new CarbonFluxRasterSet(rasterProj); - getCarbonFluxesConversion("cflux_conv_ntrl_to_past.dat", cFluxData, landUseRaster, timestep, new LccKey(LandCoverType.NATURAL, LandCoverType.PASTURE)); - getCarbonFluxesConversion("cflux_conv_ntrl_to_forC.dat", cFluxData, landUseRaster, timestep, new LccKey(LandCoverType.NATURAL, LandCoverType.CARBON_FOREST)); - getCarbonFluxesConversion("cflux_conv_ntrl_to_forT.dat", cFluxData, landUseRaster, timestep, new LccKey(LandCoverType.NATURAL, LandCoverType.TIMBER_FOREST)); - getCarbonFluxesConversion("cflux_conv_ntrl_to_crop.dat", cFluxData, landUseRaster, timestep, new LccKey(LandCoverType.NATURAL, LandCoverType.CROPLAND)); + getCarbonFluxesConversion("cflux_ntrl_to_past.dat", cFluxData, landUseRaster, timestep, new LccKey(LandCoverType.NATURAL, LandCoverType.PASTURE)); + getCarbonFluxesConversion("cflux_ntrl_to_forC.dat", cFluxData, landUseRaster, timestep, new LccKey(LandCoverType.NATURAL, LandCoverType.CARBON_FOREST)); + getCarbonFluxesConversion("cflux_ntrl_to_forC.dat", cFluxData, landUseRaster, timestep, new LccKey(LandCoverType.NATURAL, LandCoverType.TIMBER_FOREST)); + getCarbonFluxesConversion("cflux_ntrl_to_crop.dat", cFluxData, landUseRaster, timestep, new LccKey(LandCoverType.NATURAL, LandCoverType.CROPLAND)); - getCarbonFluxesConversion("cflux_conv_past_to_ntrl.dat", cFluxData, landUseRaster, timestep, new LccKey(LandCoverType.PASTURE, LandCoverType.NATURAL)); - getCarbonFluxesConversion("cflux_conv_past_to_forC.dat", cFluxData, landUseRaster, timestep, new LccKey(LandCoverType.PASTURE, LandCoverType.CARBON_FOREST)); - getCarbonFluxesConversion("cflux_conv_past_to_forT.dat", cFluxData, landUseRaster, timestep, new LccKey(LandCoverType.PASTURE, LandCoverType.TIMBER_FOREST)); - getCarbonFluxesConversion("cflux_conv_past_to_crop.dat", cFluxData, landUseRaster, timestep, new LccKey(LandCoverType.PASTURE, LandCoverType.CROPLAND)); + getCarbonFluxesConversion("cflux_past_to_ntrl.dat", cFluxData, landUseRaster, timestep, new LccKey(LandCoverType.PASTURE, LandCoverType.NATURAL)); + getCarbonFluxesConversion("cflux_past_to_forC.dat", cFluxData, landUseRaster, timestep, new LccKey(LandCoverType.PASTURE, LandCoverType.CARBON_FOREST)); + getCarbonFluxesConversion("cflux_past_to_forC.dat", cFluxData, landUseRaster, timestep, new LccKey(LandCoverType.PASTURE, LandCoverType.TIMBER_FOREST)); + getCarbonFluxesConversion("cflux_past_to_crop.dat", cFluxData, landUseRaster, timestep, new LccKey(LandCoverType.PASTURE, LandCoverType.CROPLAND)); - getCarbonFluxesConversion("cflux_conv_forC_to_ntrl.dat", cFluxData, landUseRaster, timestep, new LccKey(LandCoverType.CARBON_FOREST, LandCoverType.NATURAL)); - getCarbonFluxesConversion("cflux_conv_forC_to_past.dat", cFluxData, landUseRaster, timestep, new LccKey(LandCoverType.CARBON_FOREST, LandCoverType.PASTURE)); - getCarbonFluxesConversion("cflux_conv_forC_to_forT.dat", cFluxData, landUseRaster, timestep, new LccKey(LandCoverType.CARBON_FOREST, LandCoverType.TIMBER_FOREST)); - getCarbonFluxesConversion("cflux_conv_forC_to_crop.dat", cFluxData, landUseRaster, timestep, new LccKey(LandCoverType.CARBON_FOREST, LandCoverType.CROPLAND)); + getCarbonFluxesConversion("cflux_forC_to_ntrl.dat", cFluxData, landUseRaster, timestep, new LccKey(LandCoverType.CARBON_FOREST, LandCoverType.NATURAL)); + getCarbonFluxesConversion("cflux_forC_to_past.dat", cFluxData, landUseRaster, timestep, new LccKey(LandCoverType.CARBON_FOREST, LandCoverType.PASTURE)); + getCarbonFluxesConversion("cflux_forC_to_forC.dat", cFluxData, landUseRaster, timestep, new LccKey(LandCoverType.CARBON_FOREST, LandCoverType.TIMBER_FOREST)); + getCarbonFluxesConversion("cflux_forC_to_crop.dat", cFluxData, landUseRaster, timestep, new LccKey(LandCoverType.CARBON_FOREST, LandCoverType.CROPLAND)); - getCarbonFluxesConversion("cflux_conv_forT_to_ntrl.dat", cFluxData, landUseRaster, timestep, new LccKey(LandCoverType.TIMBER_FOREST, LandCoverType.NATURAL)); - getCarbonFluxesConversion("cflux_conv_forT_to_past.dat", cFluxData, landUseRaster, timestep, new LccKey(LandCoverType.TIMBER_FOREST, LandCoverType.PASTURE)); - getCarbonFluxesConversion("cflux_conv_forT_to_forC.dat", cFluxData, landUseRaster, timestep, new LccKey(LandCoverType.TIMBER_FOREST, LandCoverType.CARBON_FOREST)); - getCarbonFluxesConversion("cflux_conv_forT_to_forT.dat", cFluxData, landUseRaster, timestep, new LccKey(LandCoverType.TIMBER_FOREST, LandCoverType.TIMBER_FOREST)); - getCarbonFluxesConversion("cflux_conv_forT_to_crop.dat", cFluxData, landUseRaster, timestep, new LccKey(LandCoverType.TIMBER_FOREST, LandCoverType.CROPLAND)); + getCarbonFluxesConversion("cflux_forC_to_ntrl.dat", cFluxData, landUseRaster, timestep, new LccKey(LandCoverType.TIMBER_FOREST, LandCoverType.NATURAL)); + getCarbonFluxesConversion("cflux_forC_to_past.dat", cFluxData, landUseRaster, timestep, new LccKey(LandCoverType.TIMBER_FOREST, LandCoverType.PASTURE)); + getCarbonFluxesConversion("cflux_forC_to_forC.dat", cFluxData, landUseRaster, timestep, new LccKey(LandCoverType.TIMBER_FOREST, LandCoverType.CARBON_FOREST)); + getCarbonFluxesConversion("cflux_forC_to_crop.dat", cFluxData, landUseRaster, timestep, new LccKey(LandCoverType.TIMBER_FOREST, LandCoverType.CROPLAND)); - getCarbonFluxesConversion("cflux_conv_crop_to_ntrl.dat", cFluxData, landUseRaster, timestep, new LccKey(LandCoverType.CROPLAND, LandCoverType.NATURAL)); - getCarbonFluxesConversion("cflux_conv_crop_to_past.dat", cFluxData, landUseRaster, timestep, new LccKey(LandCoverType.CROPLAND, LandCoverType.PASTURE)); - getCarbonFluxesConversion("cflux_conv_crop_to_forC.dat", cFluxData, landUseRaster, timestep, new LccKey(LandCoverType.CROPLAND, LandCoverType.CARBON_FOREST)); - getCarbonFluxesConversion("cflux_conv_crop_to_forT.dat", cFluxData, landUseRaster, timestep, new LccKey(LandCoverType.CROPLAND, LandCoverType.TIMBER_FOREST)); + getCarbonFluxesConversion("cflux_crop_to_ntrl.dat", cFluxData, landUseRaster, timestep, new LccKey(LandCoverType.CROPLAND, LandCoverType.NATURAL)); + getCarbonFluxesConversion("cflux_crop_to_past.dat", cFluxData, landUseRaster, timestep, new LccKey(LandCoverType.CROPLAND, LandCoverType.PASTURE)); + getCarbonFluxesConversion("cflux_crop_to_forC.dat", cFluxData, landUseRaster, timestep, new LccKey(LandCoverType.CROPLAND, LandCoverType.CARBON_FOREST)); + getCarbonFluxesConversion("cflux_crop_to_forC.dat", cFluxData, landUseRaster, timestep, new LccKey(LandCoverType.CROPLAND, LandCoverType.TIMBER_FOREST)); getCarbonFluxesEcosystem("cflux_sts_ntrl.dat", cFluxData, landUseRaster, timestep, LandCoverType.NATURAL); getCarbonFluxesEcosystem("cflux_sts_past.dat", cFluxData, landUseRaster, timestep, LandCoverType.PASTURE); getCarbonFluxesEcosystem("cflux_sts_forC.dat", cFluxData, landUseRaster, timestep, LandCoverType.CARBON_FOREST); - getCarbonFluxesEcosystem("cflux_sts_forT.dat", cFluxData, landUseRaster, timestep, LandCoverType.TIMBER_FOREST); + getCarbonFluxesEcosystem("cflux_sts_forC.dat", cFluxData, landUseRaster, timestep, LandCoverType.TIMBER_FOREST); getCarbonFluxesEcosystem("cflux_sts_crop.dat", cFluxData, landUseRaster, timestep, LandCoverType.CROPLAND); return cFluxData; diff --git a/src/ac/ed/lurg/country/CountryAgent.java b/src/ac/ed/lurg/country/CountryAgent.java index 19a035738fe228196f25f19f00a77ad23bc9c06d..09bb7019651787fc3bd508fa7db017dfe685e6b5 100644 --- a/src/ac/ed/lurg/country/CountryAgent.java +++ b/src/ac/ed/lurg/country/CountryAgent.java @@ -5,7 +5,6 @@ import java.io.IOException; import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.StandardCopyOption; -import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.List; diff --git a/src/ac/ed/lurg/forestry/WoodYieldItem.java b/src/ac/ed/lurg/forestry/WoodYieldItem.java index 1530e83c8c77e5869aea95dd169a02a481863f58..b8476d4b76f1feb607233903848764d76b679812 100644 --- a/src/ac/ed/lurg/forestry/WoodYieldItem.java +++ b/src/ac/ed/lurg/forestry/WoodYieldItem.java @@ -38,7 +38,8 @@ public class WoodYieldItem implements RasterItem { } else { double totalYield = 0; for (int age=0; age<=LandCoverTile.getMaxAgeBin(); age++) { - totalYield += yields[age] * tiles.getArea(LandProtectionType.CONVERTIBLE, age); + int ageCapped = Math.min(age, ModelConfig.CARBON_WOOD_MAX_TIME - 1); + totalYield += yields[ageCapped] * tiles.getArea(LandProtectionType.CONVERTIBLE, age); } double meanYield = totalYield / totalArea; @@ -52,7 +53,7 @@ public class WoodYieldItem implements RasterItem { List<Double> levArr = new ArrayList<Double>(); Double[] yields = woodYields.get(new LccKey(LandCoverType.TIMBER_FOREST, LandCoverType.TIMBER_FOREST)); // will need to update if yields no longer symmetrical - for (int age = 0; age <= WoodYieldItem.MAX_AGE; age++) { + for (int age = 0; age < ModelConfig.CARBON_WOOD_MAX_TIME; age++) { double yield = yields[age]; double lev = (woodPrice * yield * Math.exp(-ModelConfig.DISCOUNT_RATE * age) - ModelConfig.FOREST_ESTABLISHMENT_COST) / (1 - Math.exp(-ModelConfig.DISCOUNT_RATE * age)); levArr.add(lev); diff --git a/src/ac/ed/lurg/forestry/WoodYieldReader.java b/src/ac/ed/lurg/forestry/WoodYieldReader.java index 900f38e4f9c2f9e1530666e97234a9c8c8edc921..8f44095458d056fe2c75bcc3b236ed7aa3c6d235 100644 --- a/src/ac/ed/lurg/forestry/WoodYieldReader.java +++ b/src/ac/ed/lurg/forestry/WoodYieldReader.java @@ -18,8 +18,8 @@ import ac.sac.raster.RasterKey; import ac.sac.raster.RasterSet; public class WoodYieldReader { - private static final int MIN_COLS = 263; // number of years + 2 for coords - private static final double CONVERSION_FACTOR = 80.0; // convert kgC/m2 to tC/ha with calib factor + private static final int MIN_COLS = ModelConfig.CARBON_WOOD_MAX_TIME + 2; // number of years + 2 for coords + private static final double CONVERSION_FACTOR = 10.0 * ModelConfig.WOOD_YIELD_CALIB_FACTOR; // convert kgC/m2 to tC/ha with calib factor private RasterHeaderDetails rasterProj; private String[] header = new String[MIN_COLS]; @@ -101,8 +101,8 @@ public class WoodYieldReader { } private Double[] getYieldsFromRowValues(Map<String, Double> rowValues) { - Double[] yields = new Double[251]; - for (int i=0; i<=250; i++) { + Double[] yields = new Double[ModelConfig.CARBON_WOOD_MAX_TIME]; + for (int i=0; i<ModelConfig.CARBON_WOOD_MAX_TIME; i++) { yields[i] = rowValues.get(Integer.toString(i)) * CONVERSION_FACTOR; } return yields; diff --git a/src/ac/ed/lurg/landuse/LandCoverTile.java b/src/ac/ed/lurg/landuse/LandCoverTile.java index b79af9b860b097f3d2cff7cce1338c5df4170e25..ecc8d4c077752ad978be8aa4eb87563be8fcf098 100644 --- a/src/ac/ed/lurg/landuse/LandCoverTile.java +++ b/src/ac/ed/lurg/landuse/LandCoverTile.java @@ -1,7 +1,6 @@ package ac.ed.lurg.landuse; import java.io.Serializable; -import java.util.Arrays; import java.util.HashMap; import java.util.Map; diff --git a/src/ac/ed/lurg/landuse/LandUseBinarySerializer.java b/src/ac/ed/lurg/landuse/LandUseBinarySerializer.java index 96b62f83e1e50366106a654080316dfef6e6bc89..832afbc4be74b15c8bef0327c4a3317d16c28e4f 100644 --- a/src/ac/ed/lurg/landuse/LandUseBinarySerializer.java +++ b/src/ac/ed/lurg/landuse/LandUseBinarySerializer.java @@ -7,8 +7,6 @@ import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; import java.util.HashMap; import java.util.Map; @@ -20,10 +18,8 @@ import ac.sac.raster.RasterKey; import ac.sac.raster.RasterSet; public class LandUseBinarySerializer { - private static final int NUM_LC_TYPES = LandCoverType.values().length; private static final int NUM_PROTECTION_CLASSES = 3; // convertible, protected, unavailable private static final int NUM_AGE_CLASSES = LandCoverTile.getMaxAgeBin() + 1; - private static final int NUM_UNAVAILABLE_BINS = 1; // how many age classes are stored for unavailable land cover private static final int CONVERTIBLE_IDX = 0; private static final int PROTECTED_IDX = 1; private static final int UNVAVAILABLE_IDX = 2; diff --git a/src/ac/ed/lurg/landuse/LandUseSerializer.java b/src/ac/ed/lurg/landuse/LandUseSerializer.java index 9cfd1e829fc5f7de4d066963edca86df9154bf76..7f2d3091ba96d27954e67cc9994a6108a01c4b53 100644 --- a/src/ac/ed/lurg/landuse/LandUseSerializer.java +++ b/src/ac/ed/lurg/landuse/LandUseSerializer.java @@ -8,7 +8,6 @@ import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.util.HashMap; -import java.util.List; import java.util.Map; import javax.xml.stream.FactoryConfigurationError; diff --git a/src/ac/sac/raster/AbstractBinaryRasterReader.java b/src/ac/sac/raster/AbstractBinaryRasterReader.java index 46fbfb0eedc67efd580584dc6943e1b53598fd9d..a1d2fae7335a26ac5667a3762eeb9ee00b7dbf76 100644 --- a/src/ac/sac/raster/AbstractBinaryRasterReader.java +++ b/src/ac/sac/raster/AbstractBinaryRasterReader.java @@ -1,7 +1,6 @@ package ac.sac.raster; import java.io.BufferedInputStream; -import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; @@ -44,10 +43,6 @@ public abstract class AbstractBinaryRasterReader<D extends RasterItem> { double x = dline[X_COL]; double y = dline[Y_COL]; - - if (x > 180 || x < -180 || y > 90 || y < -90) { - int foo2 = 1; - } D item = dataset.getFromCoordinates(x, y); RasterKey key = dataset.getKeyFromCoordinates(x, y);