From 5adb831e34541affec03c8d8afba8a0f3e39f22e Mon Sep 17 00:00:00 2001
From: Peter Alexander <peter@blackhillock.co.uk>
Date: Fri, 31 Oct 2014 12:23:26 +0000
Subject: [PATCH] no message

---
 GAMS/IntExtOpt.gms            |  70 ++++++++++++++++++++++++++++++++++
 bin/ac/ed/lurg/GamsTest.class | Bin 5406 -> 0 bytes
 src/ac/ed/lurg/GamsTest.java  |  15 +++-----
 3 files changed, 75 insertions(+), 10 deletions(-)
 create mode 100644 GAMS/IntExtOpt.gms
 delete mode 100644 bin/ac/ed/lurg/GamsTest.class

diff --git a/GAMS/IntExtOpt.gms b/GAMS/IntExtOpt.gms
new file mode 100644
index 00000000..19eff5da
--- /dev/null
+++ b/GAMS/IntExtOpt.gms
@@ -0,0 +1,70 @@
+  
+ SET crop crop types including pasture / cereals, fruits, oilcrops, starchyRoots, treenuts, vegetables, pasture /
+ SET crop_less_pasture(crop) arable crops types includes treenuts but not pasture / cereals, fruits, oilcrops, starchyRoots, treenuts, vegetables /
+ SET feed_crop(crop)  / cereals, oilcrops /
+ SET landuse land use type / cropland, pasture /
+     
+ PARAMETER previous_area(landuse) areas for previous timestep in ha       
+ PARAMETER demand(crop) yield in t per ha
+ PARAMETER yield_ref(crop) yield in t per ha
+ 
+$gdxin %gdxincname%
+$load previous_area, demand, yield_ref
+$gdxin
+       
+                                  
+ PARAMETER
+       feedEnergy(crop) energy from feed in MJ per t
+         /    cereals       1
+              oilcrops      1.5
+              pasture       0.4
+              / ;
+              
+ SCALAR meatDemand /200/;
+ SCALAR meatEfficency /0.1/;
+ SCALAR maxLandUseChange /0.1/;   
+              
+ VARIABLES
+       area(crop) total area for each crop
+       feedArea(crop)  area used for feed for each crop
+       intensity(crop)  intensity for each crop
+       yield(crop) energy per area for each crop
+       unit_energy(crop) energy per area for each crop
+       energy      total input energy
+       ;
+       
+ POSITIVE VARIABLE area, intensity, feedArea;
+  
+ EQUATIONS
+       UNIT_ENERGY_EQ(crop) energy per area
+       YIELD_EQ(crop) yield given chosen intensity
+       CROP_DEMAND_CONSTRAINT(crop_less_pasture) satisfy demand for crop 
+       MEAT_DEMAND_CONSTRAINT satisfy demand for crop 
+       INTENSITY_CONSTRAINT(crop) intensity constraint 
+       CROPLAND_CHANGE_CONSTRAINT constraint on the rate of land use change 
+       PASTURE_CHANGE_CONSTRAINT constraint on the rate of land use change 
+       AGRI_LAND_CHANGE_CONSTRAINT constraint expansion of agricultural land
+       ENERGY_EQ define objective function;
+       
+ UNIT_ENERGY_EQ(crop) .. unit_energy(crop) =E= intensity(crop) + intensity(crop) / 2 * intensity(crop) / 8;
+  
+ YIELD_EQ(crop) .. yield(crop) =E= yield_ref(crop) * intensity(crop);
+  
+ CROP_DEMAND_CONSTRAINT(crop_less_pasture) .. (area(crop_less_pasture) - feedArea(crop_less_pasture)) * yield(crop_less_pasture) =G= demand(crop_less_pasture);
+  
+ MEAT_DEMAND_CONSTRAINT .. meatEfficency*sum(feed_crop, feedEnergy(feed_crop) * feedArea(feed_crop) * yield(feed_crop)) + 
+  			feedEnergy('pasture') * area('pasture') * yield('pasture') =G= meatDemand;
+  
+ INTENSITY_CONSTRAINT(crop) .. intensity(crop) =G= 1;
+  
+ CROPLAND_CHANGE_CONSTRAINT .. abs(sum(crop_less_pasture, area(crop_less_pasture))/previous_area('cropland') - 1) =L= maxLandUseChange;
+  
+ PASTURE_CHANGE_CONSTRAINT ..  abs(area('pasture')/previous_area('pasture') - 1) =L= maxLandUseChange;
+  
+ AGRI_LAND_CHANGE_CONSTRAINT .. abs(sum(crop, area(crop)) / sum(landuse, previous_area(landuse)) - 1) =L= maxLandUseChange;
+  
+ ENERGY_EQ .. energy =E= SUM(crop, area(crop)*unit_energy(crop));
+  
+ MODEL LAND_USE /ALL/ ;
+ SOLVE LAND_USE USING DNLP MINIMIZING energy;
+
diff --git a/bin/ac/ed/lurg/GamsTest.class b/bin/ac/ed/lurg/GamsTest.class
deleted file mode 100644
index 6e6d3546bd597db783ca2346c807837a05d1f0c3..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 5406
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
UIYmoc#Z5M+n*x_mQAI5MFF%)DZU6uP

diff --git a/src/ac/ed/lurg/GamsTest.java b/src/ac/ed/lurg/GamsTest.java
index 55e9345d..a62e52cb 100644
--- a/src/ac/ed/lurg/GamsTest.java
+++ b/src/ac/ed/lurg/GamsTest.java
@@ -15,15 +15,13 @@ import com.gams.api.GAMSWorkspaceInfo;
 
 public class GamsTest {
 	
+	private final static String WORKING_DIR = "/Users/peteralexander/Documents/R_Workspace/tempDir";
+	
     public static void main(String[] args)  {
-
-        // create GAMSWorkspace "ws" with default working directory 
-        // (the directory named with current date and time under System.getProperty("java.io.tmpdir"))
-    	System.out.println(System.getProperty("user.dir"));
-        File workingDirectory = new File(System.getProperty("user.dir"), "GamsTest");
+    	
+    	File workingDirectory = new File(WORKING_DIR, "GamsTest");
         workingDirectory.mkdir();
 
-        // create a workspace
         GAMSWorkspaceInfo  wsInfo  = new GAMSWorkspaceInfo();
         wsInfo.setWorkingDirectory(workingDirectory.getAbsolutePath());
 
@@ -59,7 +57,6 @@ public class GamsTest {
         }
 
         // add a database and add input data into the database
-
         GAMSParameter a = db.addParameter("previous_area", 1, "previous area");
         for(String c : previous_area.keySet())
             a.addRecord(c).setValue(previous_area.get(c));
@@ -73,7 +70,7 @@ public class GamsTest {
             y.addRecord(c).setValue(yield_ref.get(c));
 
         // create GAMSJob "t2" from the "model" string variable
-        GAMSJob t2 = ws.addJobFromFile("/Users/peteralexander/Documents/R_Workspace/landalloc/GAMS/IntExtOpt.gms");
+        GAMSJob t2 = ws.addJobFromFile("/Users/peteralexander/Documents/R_Workspace/UNPLUM/GAMS/IntExtOpt.gms");
         GAMSOptions opt = ws.addOptions();
 
         System.out.println(db.getName());
@@ -90,8 +87,6 @@ public class GamsTest {
 
         // cleanup GAMSWorkspace's working directory
         cleanup(ws.workingDirectory());
-        // terminate program
-        System.exit(0);
    }
 
    static void cleanup(String directory)  {
-- 
GitLab