From d106c5c5aeaa7c4d6467a500333e98b8e8fbecc7 Mon Sep 17 00:00:00 2001
From: Peter Alexander <peter@blackhillock.co.uk>
Date: Tue, 21 Jul 2015 12:45:16 +0100
Subject: [PATCH] no message

---
 .../country/gams/GamsRasterOptimiser.java     | 28 +++++++++++++++++--
 src/ac/ed/lurg/landuse/AreasItem.java         |  8 ++++++
 src/ac/ed/lurg/types/CropToDouble.java        |  9 ++++++
 src/ac/ed/lurg/types/CropType.java            | 12 +++++++-
 4 files changed, 54 insertions(+), 3 deletions(-)

diff --git a/src/ac/ed/lurg/country/gams/GamsRasterOptimiser.java b/src/ac/ed/lurg/country/gams/GamsRasterOptimiser.java
index 878f10c9..dcad1922 100644
--- a/src/ac/ed/lurg/country/gams/GamsRasterOptimiser.java
+++ b/src/ac/ed/lurg/country/gams/GamsRasterOptimiser.java
@@ -73,7 +73,31 @@ public class GamsRasterOptimiser {
 
 			CropToDouble cropChangeTotals = newAreaAggItem.getCropChanges(prevAreaAggItem);
 			// if (DEBUG) LogWriter.println("Processing location id " + locId);
+			
+			double pastureChange = cropChangeTotals.get(CropType.PASTURE);
+			double croplandChange = cropChangeTotals.getCroplandTotal();
+			double prevForestToNaturalFraction = prevAreaAggItem.getForestToNaturalFraction();
+
+			double pastureFromCrop = 0;
+			double pastureFromNatural = 0;
+			double cropFromNatural = 0;
+
+			if (pastureChange > 0 && croplandChange < 0) {
+				pastureFromCrop = Math.min(pastureChange, -croplandChange);
+				pastureFromNatural = (pastureChange > -croplandChange) ? 0 : pastureChange+croplandChange;
+			}
+			else if (pastureChange < 0 && croplandChange > 0) {
+				pastureFromCrop = -Math.min(-pastureChange, croplandChange);
+				cropFromNatural = (croplandChange > -pastureChange) ? 0 : -(pastureChange+croplandChange);
+			}
+			else {
+				pastureFromNatural = pastureChange;
+				cropFromNatural = croplandChange;
+			}
+			
+	//		allocAllAreasForAgg(newAreaRaster, prevAreaRaster, keys, pastureFromNatural);
 
+			
 			double shortfall = allocAllAreasForAgg(newAreaRaster, prevAreaRaster, keys, cropChangeTotals);
 			if (shortfall > 0.00001)
 				LogWriter.printlnError("This should never happen, due to GAMS constraint. Not able to incorporate all changes, as not enough forest or natural areas left: " + shortfall);
@@ -180,8 +204,8 @@ public class GamsRasterOptimiser {
 		RasterSet<IrrigationCostItem> irrigCostRaster = rasterInputData.getIrrigationCost();
 
 		{
-			//		YieldResponsesItem yresp = yieldRaster.getFromCoordinates(-118.0, -33.0);
-			//		LogWriter.printlnError("Test key2: " + yresp.getYieldMax(CropType.CEREALS)  + ", " + yresp.getYieldFertOnly(CropType.CEREALS) + ", " + yresp.getYieldIrrigOnly(CropType.CEREALS));
+				//	YieldResponsesItem yresp = yieldRaster.get(new RasterKey(40,38));//getFromCoordinates(-118.0, -33.0);
+				//	LogWriter.printlnError("Test key2: " + yresp.getYieldMax(CropType.WHEAT)  + ", " + yresp.getYieldFertOnly(CropType.WHEAT) + ", " + yresp.getYieldIrrigOnly(CropType.WHEAT));
 		}
 
 		// look for inconsistencies
diff --git a/src/ac/ed/lurg/landuse/AreasItem.java b/src/ac/ed/lurg/landuse/AreasItem.java
index b2a084ec..9b85996b 100644
--- a/src/ac/ed/lurg/landuse/AreasItem.java
+++ b/src/ac/ed/lurg/landuse/AreasItem.java
@@ -47,6 +47,14 @@ public class AreasItem implements RasterItem {
 		double d = getTotalCropIncPastureArea() + getLandCoverArea(LandDataType.FOREST) + getLandCoverArea(LandDataType.OTHER_NATURAL);
 		return d;
 	}
+	
+	public double getForestToNaturalFraction() {
+		double forest = getLandCoverArea(LandDataType.FOREST);
+		double natural = forest + getLandCoverArea(LandDataType.OTHER_NATURAL);
+		double d = forest / natural;
+		return d;
+	}
+
 
 	public CropToDouble getCropChanges(AreasItem prevAreaAggItem) {
 		CropToDouble changes = new CropToDouble();
diff --git a/src/ac/ed/lurg/types/CropToDouble.java b/src/ac/ed/lurg/types/CropToDouble.java
index ada35b77..b8f1176c 100644
--- a/src/ac/ed/lurg/types/CropToDouble.java
+++ b/src/ac/ed/lurg/types/CropToDouble.java
@@ -22,4 +22,13 @@ public class CropToDouble extends HashMap<CropType, Double> {
 		
 		return total;
 	}
+	
+	public double getCroplandTotal() {
+		double total = 0;
+		for (CropType c : CropType.getCropsLessPasture())
+			total += get(c);
+		
+		return total;
+
+	}
 }
diff --git a/src/ac/ed/lurg/types/CropType.java b/src/ac/ed/lurg/types/CropType.java
index 8ed5b07e..85c13bb3 100644
--- a/src/ac/ed/lurg/types/CropType.java
+++ b/src/ac/ed/lurg/types/CropType.java
@@ -17,7 +17,7 @@ public enum CropType {
 	SOYBEAN("Soyabeans", "soybean"),
 	PULSES("Pulses + (Total)", "pulses"),
 	STARCHY_ROOTS("Starchy Roots + (Total)", "starchyRoots"),
-	MEAT("meatmilkeggs", "meat", false, true),
+	MEAT("meatmilkeggs", "meat", true, true),
 	PASTURE("pasture", "pasture", false, false);
 
 	private String faoName;
@@ -36,6 +36,16 @@ public enum CropType {
 		this(faoName, gamsName, true, false);
 	}
 	
+	public static Collection<CropType> getCropsLessPasture() {
+		Collection<CropType> comms = new HashSet<CropType>();
+		
+		for (CropType c : values())
+			if (c.importedCrop || !c.isMeat)
+				comms.add(c);
+		
+		return comms;
+	}
+
 	public static Collection<CropType> getImportedTypes() {
 		Collection<CropType> comms = new HashSet<CropType>();
 		
-- 
GitLab