diff --git a/src/ac/ed/lurg/ModelMain.java b/src/ac/ed/lurg/ModelMain.java index f78d8bc2b5f0779c5c96f46d95e6ff176ef4a0a5..cf69278e5a4fecf726b0024967c655cc214c883a 100644 --- a/src/ac/ed/lurg/ModelMain.java +++ b/src/ac/ed/lurg/ModelMain.java @@ -36,6 +36,7 @@ import ac.ed.lurg.landuse.CropUsageReader; import ac.ed.lurg.landuse.IrrigationItem; import ac.ed.lurg.landuse.IrrigationMaxAmountReader; import ac.ed.lurg.landuse.IrrigationRasterSet; +import ac.ed.lurg.landuse.IrrigiationCostReader; import ac.ed.lurg.landuse.LandCoverItem; import ac.ed.lurg.landuse.LandCoverReader; import ac.ed.lurg.landuse.LandUseItem; @@ -98,7 +99,7 @@ public class ModelMain { tradeManager = new TradeManager(compositeCountryManager); fpuManager = new FPUManager(desiredProjection); - currentIrrigationData = new IrrigationRasterSet(desiredProjection); + currentIrrigationData = getFixedIrrigationData(); countryBoundaryRaster = getCountryBoundaryRaster(); clusterIdRaster = (ModelConfig.IS_CALIBRATION_RUN) ? new RasterSet<IntegerRasterItem>(desiredProjection) : getClusterRaster(); @@ -551,6 +552,12 @@ public class ModelMain { } + private IrrigationRasterSet getFixedIrrigationData() { + IrrigationRasterSet fixedIrrigData = new IrrigationRasterSet(desiredProjection); + new IrrigiationCostReader(fixedIrrigData).getRasterDataFromFile(ModelConfig.IRRIGATION_COST_FILE); + return fixedIrrigData; + } + private RasterSet<IrrigationItem> getUpdateIrrigationData(Timestep timestep, YieldRaster yieldSurfaces) { String rootDir = timestep.getYearSubDir(ModelConfig.YIELD_DIR); new IrrigationMaxAmountReader(currentIrrigationData, yieldSurfaces).getRasterDataFromFile(rootDir + File.separator + ModelConfig.IRRIG_MAX_WATER_FILENAME); diff --git a/src/ac/ed/lurg/landuse/FPUManager.java b/src/ac/ed/lurg/landuse/FPUManager.java index 41a38764ed02865417bd6ea7ec749e5e9a49207e..531dad35d5a75b07805e763ffb13cc651f91d4b7 100644 --- a/src/ac/ed/lurg/landuse/FPUManager.java +++ b/src/ac/ed/lurg/landuse/FPUManager.java @@ -18,82 +18,80 @@ import ac.sac.raster.RasterKey; import ac.sac.raster.RasterSet; public class FPUManager { - private static final int FPU_COL = 0; - private static final int YEAR_COL = 1; - private static final int USAGE_COL = 2; - + private static final int FPU_COL = 0; + private static final int YEAR_COL = 1; + private static final int USAGE_COL = 2; + RasterSet<IntegerRasterItem> fpuBoundaries; Map<IntegerRasterItem, List<RasterKey>> fpuMap; - Map<Integer, Map<Integer,Double>> fpuOtherUses; - + Map<Integer, Map<Integer, Double>> fpuOtherUses; + public FPUManager(RasterHeaderDetails desiredProjection) { getFPUBoundaryRaster(desiredProjection); - fpuMap=CollectionHelper.invertMap(fpuBoundaries); + fpuMap = CollectionHelper.invertMap(fpuBoundaries); readOtherUses(); } public void getFPUBoundaryRaster(RasterHeaderDetails desiredProjection) { - fpuBoundaries = new RasterSet<IntegerRasterItem>(desiredProjection){ + fpuBoundaries = new RasterSet<IntegerRasterItem>(desiredProjection) { private static final long serialVersionUID = -8620255271155259176L; + protected IntegerRasterItem createRasterData() { return new IntegerRasterItem(0); } }; - + FPUBoundaryReader fpuReader = new FPUBoundaryReader(fpuBoundaries); fpuReader.getRasterDataFromFile(ModelConfig.FPU_BOUNDARIES_FILE); } - + @SuppressWarnings("serial") - public void readOtherUses(){ - - LazyHashMap<Integer, Map<Integer,Double>> usageMap = new LazyHashMap<Integer, Map<Integer,Double>>() { - protected Map<Integer, Double> createValue() { return new HashMap<Integer, Double>(); } + public void readOtherUses() { + + LazyHashMap<Integer, Map<Integer, Double>> usageMap = new LazyHashMap<Integer, Map<Integer, Double>>() { + protected Map<Integer, Double> createValue() { + return new HashMap<Integer, Double>(); + } }; - + String filename = ModelConfig.OTHER_WATER_USES_FILE; try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); + BufferedReader reader = new BufferedReader(new FileReader(filename)); String line; int fpu, year; double waterUsage; - + reader.readLine(); // read header - - while ((line=reader.readLine()) != null) { + + while ((line = reader.readLine()) != null) { String[] tokens = line.split(","); - + if (tokens.length < 3) LogWriter.printlnError("Too few columns in " + filename + ", " + line); - - - fpu = Integer.parseInt(tokens[FPU_COL]); - year = Integer.parseInt(tokens[YEAR_COL]); - waterUsage = Double.parseDouble(tokens[USAGE_COL]); - - Map<Integer, Double> fpuData = usageMap.lazyGet(fpu); - fpuData.put(year, waterUsage); - } - reader.close(); - - } catch (IOException e) { - LogWriter.printlnError("Failed in reading water usage"); - LogWriter.print(e); + + fpu = Integer.parseInt(tokens[FPU_COL]); + year = Integer.parseInt(tokens[YEAR_COL]); + waterUsage = Double.parseDouble(tokens[USAGE_COL]); + + Map<Integer, Double> fpuData = usageMap.lazyGet(fpu); + fpuData.put(year, waterUsage); } - LogWriter.println("Processed " + filename + ", create " + usageMap.size() + " water usage maps values"); - - fpuOtherUses = usageMap; + reader.close(); + + } catch (IOException e) { + LogWriter.printlnError("Failed in reading water usage"); + LogWriter.print(e); } - - - - + LogWriter.println("Processed " + filename + ", create " + usageMap.size() + " water usage maps values"); + + fpuOtherUses = usageMap; + } + public List<RasterKey> getKeysFor(IntegerRasterItem fpu) { List<RasterKey> keys = fpuMap.get(fpu); if (keys == null) keys = new ArrayList<RasterKey>(); return keys; } - - + } diff --git a/src/ac/ed/lurg/landuse/IrrigationRasterSet.java b/src/ac/ed/lurg/landuse/IrrigationRasterSet.java index fffedff6d2533a312b9fd3281e709c6294c162f7..c3c39ad86157448453086b4ec5791967d31edd71 100644 --- a/src/ac/ed/lurg/landuse/IrrigationRasterSet.java +++ b/src/ac/ed/lurg/landuse/IrrigationRasterSet.java @@ -5,25 +5,24 @@ import java.util.Map; import ac.ed.lurg.ModelConfig; import ac.ed.lurg.Timestep; +import ac.ed.lurg.utils.LogWriter; import ac.sac.raster.IntegerRasterItem; import ac.sac.raster.RasterHeaderDetails; import ac.sac.raster.RasterKey; import ac.sac.raster.RasterSet; -public class IrrigationRasterSet extends RasterSet<IrrigationItem>{ - +public class IrrigationRasterSet extends RasterSet<IrrigationItem> { + private static final long serialVersionUID = 4794790389538053286L; public IrrigationRasterSet(RasterHeaderDetails header) { super(header); - new IrrigiationCostReader(this).getRasterDataFromFile(ModelConfig.IRRIGATION_COST_FILE); //this isn't very nice in here... } - protected IrrigationItem createRasterData() { return new IrrigationItem(); } - + public void updateConstraintByFPU(FPUManager fpuManager, Timestep timestep) { Collection<RasterKey> fpuKeys; @@ -32,42 +31,41 @@ public class IrrigationRasterSet extends RasterSet<IrrigationItem>{ int yearsOfIrrigChange = (timestep.getTimestep() - ModelConfig.START_TIMESTEP) * ModelConfig.TIMESTEP_SIZE; double waterAvailabilityAdj = 1.0 + yearsOfIrrigChange * ModelConfig.WATER_AVAILIBILITY_RATE_OF_CHANGE; int year = timestep.getYear(); - - - + for (IntegerRasterItem fpu : keyset) { - - fpuKeys =fpuManager.getKeysFor(fpu); + + fpuKeys = fpuManager.getKeysFor(fpu); RasterSet<IrrigationItem> irrigData = this.createSubsetForKeys(fpuKeys); double fpuRunOff = 0.0; double otherUses = 0.0; double waterAvailForIrrigPerCell = 0.0; int cellCount = 0; - + for (Map.Entry<RasterKey, IrrigationItem> entry : irrigData.entrySet()) { - if (entry.getValue() != null) { - fpuRunOff += entry.getValue().getRunOff()*fpuManager.fpuBoundaries.getAreaMha(entry.getKey())*0.01; - + fpuRunOff += entry.getValue().getRunOff() * fpuManager.fpuBoundaries.getAreaMha(entry.getKey()) + * 0.01; cellCount++; } - + } - Double fpuRunOffAvailable = fpuRunOff*0.4 * ModelConfig.ENVIRONMENTAL_WATER_CONSTRAINT; //0.4 from elliott paper - - + Double fpuRunOffAvailable = fpuRunOff * 0.4 * ModelConfig.ENVIRONMENTAL_WATER_CONSTRAINT; // 0.4 + // from + // elliott + // paper + otherUses = fpuManager.fpuOtherUses.get(fpu.getInt()).get(year) * waterAvailabilityAdj; - if (fpuRunOffAvailable - otherUses < 0){ + if (fpuRunOffAvailable - otherUses < 0) { waterAvailForIrrigPerCell = 0; - } - else waterAvailForIrrigPerCell = (fpuRunOffAvailable - otherUses) / cellCount; - + } else + waterAvailForIrrigPerCell = (fpuRunOffAvailable - otherUses) / cellCount; + for (Map.Entry<RasterKey, IrrigationItem> entry : irrigData.entrySet()) { if (entry.getValue() != null) { entry.getValue().setIrrigConstraint(waterAvailForIrrigPerCell); - + } } @@ -75,5 +73,4 @@ public class IrrigationRasterSet extends RasterSet<IrrigationItem>{ } - }