From 23e9318e1286d897859362f91f10c0fa7a9a8fef Mon Sep 17 00:00:00 2001 From: Peter Alexander <peter@blackhillock.co.uk> Date: Wed, 29 Jun 2016 12:19:43 +0100 Subject: [PATCH] Fix problems reading irrigation data --- convertOldToNewLPJData.sh | 24 ++++++++++--------- .../landuse/IrrigationMaxAmountReader.java | 22 ++++++++++++----- src/ac/ed/lurg/yield/LPJCropTypes.java | 23 ++++++++++++++++++ .../lurg/yield/LPJYieldResponseMapReader.java | 16 +++++++------ 4 files changed, 61 insertions(+), 24 deletions(-) create mode 100644 src/ac/ed/lurg/yield/LPJCropTypes.java diff --git a/convertOldToNewLPJData.sh b/convertOldToNewLPJData.sh index 08ef9a28..e1ac0199 100755 --- a/convertOldToNewLPJData.sh +++ b/convertOldToNewLPJData.sh @@ -7,6 +7,16 @@ fi cd $1 +function extractAndConvertHeader { + if [ "$#" -ne 2 ]; then + echo "Illegal number of parameters to extractAndConvertHeader" + fi + + #old runs 2016-01-.. change header e.g. C3G_pas C3G_pNhi TeWWhi -> PC3G PC3GN200 TeWW200 + head -n 1 $1 | sed 's,C\(.\)G_p,PC\1G,g' | sed 's,Gas,G,g' | sed 's,hi,200,g' | sed 's,me,020,g' | sed 's,lo,005,g' > $2 + grep -i " $YEAR " $1 >> $2 +} + YEAR=2000 while [ $YEAR -le 2095 ]; do echo item: $YEAR @@ -14,18 +24,10 @@ while [ $YEAR -le 2095 ]; do mkdir $YEAR fi - grep -i "Year\| $YEAR " gsirrigation.out > $YEAR/gsirrigation_plum.out - - NEW_ANPP=$YEAR/anpp_plum.out - #old runs 2016-01-.. change header e.g. C3G_pas C3G_pNhi TeWWhi -> PC3G PC3GN200 TeWW200 - head -n 1 anpp.out | sed 's,C\(.\)G_p,PC\1G,g' | sed 's,Gas,G,g' | sed 's,hi,200,g' | sed 's,me,020,g' | sed 's,lo,005,g' > $NEW_ANPP - grep -i " $YEAR " anpp.out >> $NEW_ANPP - - NEW_YIELD=$YEAR/yield_plum.out - head -n 1 yield.out | sed 's,C\(.\)G_p,PC\1G,g' | sed 's,Gas,G,g' | sed 's,hi,200,g' | sed 's,me,020,g' | sed 's,lo,005,g' > $NEW_YIELD - grep -i " $YEAR " yield.out >> $NEW_YIELD + extractAndConvertHeader gsirrigation.out $YEAR/gsirrigation_plum.out + extractAndConvertHeader anpp.out $YEAR/anpp_plum.out + extractAndConvertHeader yield.out $YEAR/yield_plum.out touch $YEAR/done let YEAR+=5 done - diff --git a/src/ac/ed/lurg/landuse/IrrigationMaxAmountReader.java b/src/ac/ed/lurg/landuse/IrrigationMaxAmountReader.java index 1488acc8..8bd515b2 100644 --- a/src/ac/ed/lurg/landuse/IrrigationMaxAmountReader.java +++ b/src/ac/ed/lurg/landuse/IrrigationMaxAmountReader.java @@ -4,6 +4,10 @@ import java.util.Map; import ac.ed.lurg.ModelConfig; import ac.ed.lurg.types.CropType; +import ac.ed.lurg.types.FertiliserRate; +import ac.ed.lurg.types.IrrigationRate; +import ac.ed.lurg.types.YieldType; +import ac.ed.lurg.yield.LPJCropTypes; import ac.ed.lurg.yield.YieldRaster; import ac.sac.raster.AbstractTabularRasterReader; import ac.sac.raster.RasterKey; @@ -23,12 +27,18 @@ public class IrrigationMaxAmountReader extends AbstractTabularRasterReader<Irrig protected void setData(RasterKey key, IrrigationItem item, Map<String, Double> rowValues) { boolean isSpringWheat = yieldSurfaces.isSpringWheat(key); + String highFertIrrigString = YieldType.getYieldType(FertiliserRate.MAX_FERT, IrrigationRate.MAX_IRRIG).getFertIrrigString(); + + double ww = getValueForCol(rowValues, LPJCropTypes.WINTER_WHEAT + highFertIrrigString) / ModelConfig.IRRIGIATION_EFFICIENCY; + double sw = getValueForCol(rowValues, LPJCropTypes.SPRING_WHEAT + highFertIrrigString) / ModelConfig.IRRIGIATION_EFFICIENCY; + double co = getValueForCol(rowValues, LPJCropTypes.MAIZE + highFertIrrigString) / ModelConfig.IRRIGIATION_EFFICIENCY; + double ri = getValueForCol(rowValues, LPJCropTypes.RICE + highFertIrrigString) / ModelConfig.IRRIGIATION_EFFICIENCY; - item.setMaxIrrigAmount(CropType.WHEAT, getValueForCol(rowValues, isSpringWheat ? "TeSWi" : "TeWWi") / ModelConfig.IRRIGIATION_EFFICIENCY); - item.setMaxIrrigAmount(CropType.MAIZE, getValueForCol(rowValues, "TeCoi") / ModelConfig.IRRIGIATION_EFFICIENCY); - item.setMaxIrrigAmount(CropType.RICE, getValueForCol(rowValues, "TrRii") / ModelConfig.IRRIGIATION_EFFICIENCY); - item.setMaxIrrigAmount(CropType.OILCROPS, getValueForCol(rowValues, isSpringWheat ? "TeSWi" : "TeWWi") / ModelConfig.IRRIGIATION_EFFICIENCY); - item.setMaxIrrigAmount(CropType.PULSES, getValueForCol(rowValues, "TeSWi") / ModelConfig.IRRIGIATION_EFFICIENCY); - item.setMaxIrrigAmount(CropType.STARCHY_ROOTS, getValueForCol(rowValues, "TeSWi") / ModelConfig.IRRIGIATION_EFFICIENCY); + item.setMaxIrrigAmount(CropType.WHEAT, isSpringWheat ? sw : ww); + item.setMaxIrrigAmount(CropType.MAIZE, co); + item.setMaxIrrigAmount(CropType.RICE, ri); + item.setMaxIrrigAmount(CropType.OILCROPS, isSpringWheat ? sw : ww); + item.setMaxIrrigAmount(CropType.PULSES, sw); + item.setMaxIrrigAmount(CropType.STARCHY_ROOTS, sw); } } diff --git a/src/ac/ed/lurg/yield/LPJCropTypes.java b/src/ac/ed/lurg/yield/LPJCropTypes.java new file mode 100644 index 00000000..689a9d54 --- /dev/null +++ b/src/ac/ed/lurg/yield/LPJCropTypes.java @@ -0,0 +1,23 @@ +package ac.ed.lurg.yield; + +public enum LPJCropTypes { + // LPJ column names strings + + WINTER_WHEAT("TeWW"), + SPRING_WHEAT("TeSW"), + RICE("TrRi"), + MAIZE("TeCo"), + PASTURE_C3("PC3GN"), + PASTURE_C4("PC4GN"); + + private String lpjName; + + LPJCropTypes (String lpjName) { + this.lpjName = lpjName; + } + + @Override + public String toString() { + return lpjName; + } +} diff --git a/src/ac/ed/lurg/yield/LPJYieldResponseMapReader.java b/src/ac/ed/lurg/yield/LPJYieldResponseMapReader.java index f2e0d151..d31edf67 100644 --- a/src/ac/ed/lurg/yield/LPJYieldResponseMapReader.java +++ b/src/ac/ed/lurg/yield/LPJYieldResponseMapReader.java @@ -48,10 +48,12 @@ public class LPJYieldResponseMapReader { AbstractTabularRasterReader<YieldResponsesItem> nppReader = new AbstractTabularRasterReader<YieldResponsesItem>(" +", 10, yieldRaster) { protected void setData(RasterKey key, YieldResponsesItem item, Map<String, Double> rowValues) { double adjFactor = 2 * 10 * ModelConfig.PASTURE_HARVEST_FRACTION; // 2 for carbon units, 10 for kg/m2 to t/ha, and 0.5 for half grazed - boolean isC3 = (getValueForCol(rowValues, "PC3GN005") > getValueForCol(rowValues, "PC4GN005")); + + String lowFertString = YieldType.getYieldType(FertiliserRate.NO_FERT, IrrigationRate.NO_IRRIG).getFertIrrigString(); + boolean isC3 = (getValueForCol(rowValues, LPJCropTypes.PASTURE_C3 + lowFertString) > getValueForCol(rowValues, LPJCropTypes.PASTURE_C4 + lowFertString)); for (FertiliserRate fert : FertiliserRate.values()) { - double pastureYield = (isC3 ? getValueForCol(rowValues, "PC3GN" + fert.getId()) : getValueForCol(rowValues, "PC4GN" + fert.getId())) * adjFactor; + double pastureYield = (isC3 ? getValueForCol(rowValues, LPJCropTypes.PASTURE_C3 + fert.getId()) : getValueForCol(rowValues, LPJCropTypes.PASTURE_C4 + fert.getId())) * adjFactor; item.setYield(YieldType.getYieldType(fert, IrrigationRate.NO_IRRIG), CropType.PASTURE, pastureYield); item.setYield(YieldType.getYieldType(fert, IrrigationRate.MAX_IRRIG), CropType.PASTURE, pastureYield); } @@ -69,7 +71,7 @@ public class LPJYieldResponseMapReader { String highFertString = YieldType.getYieldType(FertiliserRate.MAX_FERT, IrrigationRate.NO_IRRIG).getFertIrrigString(); - boolean isSpringWheat = (getValueForCol(rowValues, "teSW" + highFertString) > getValueForCol(rowValues, "TeWW" + highFertString)); + boolean isSpringWheat = (getValueForCol(rowValues, LPJCropTypes.SPRING_WHEAT + highFertString) > getValueForCol(rowValues, LPJCropTypes.WINTER_WHEAT + highFertString)); item.setIsSpringWheat(isSpringWheat); for (FertiliserRate fert : FertiliserRate.values()) { @@ -80,10 +82,10 @@ public class LPJYieldResponseMapReader { /* * WARNING: if you change mapping below you also need to change LpjgOutputer and IrrigationMaxAmountReader to match */ - double ww = getValueForCol(rowValues, "TeWW" + fertIrrigString) * adjFactor; - double sw = getValueForCol(rowValues, "TeSW" + fertIrrigString) * adjFactor; - double co = getValueForCol(rowValues, "TeCo" + fertIrrigString) * adjFactor; - double ri = getValueForCol(rowValues, "TrRi" + fertIrrigString) * adjFactor; + double ww = getValueForCol(rowValues, LPJCropTypes.WINTER_WHEAT + fertIrrigString) * adjFactor; + double sw = getValueForCol(rowValues, LPJCropTypes.SPRING_WHEAT + fertIrrigString) * adjFactor; + double co = getValueForCol(rowValues, LPJCropTypes.MAIZE + fertIrrigString) * adjFactor; + double ri = getValueForCol(rowValues, LPJCropTypes.RICE + fertIrrigString) * adjFactor; item.setYield(yieldType, CropType.WHEAT, isSpringWheat ? sw : ww); item.setYield(yieldType, CropType.MAIZE, co); -- GitLab