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