diff --git a/.classpath b/.classpath index 5cf8c1dedb834e2749858a6a67f2f4057cff78db..22226a3608a785ccefe9f288a5f96f76ef1b1473 100644 --- a/.classpath +++ b/.classpath @@ -1,8 +1,9 @@ -<?xml version="1.0" encoding="UTF-8"?> -<classpath> - <classpathentry kind="src" path="src"/> - <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/> - <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/> - <classpathentry kind="lib" path="/Applications/GAMS24.7/sysdir/apifiles/Java/api/GAMSJavaAPI.jar"/> - <classpathentry kind="output" path="bin"/> -</classpath> +<?xml version="1.0" encoding="UTF-8"?> +<classpath> + <classpathentry kind="src" path="src"/> + <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/> + <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/> + <classpathentry kind="lib" path="C:/GAMS/win64/24.7/apifiles/Java/api/GAMSJavaAPI.jar"/> + <classpathentry kind="lib" path="C:/GAMS/win64/24.7/apifiles/Java/api/gams.jar"/> + <classpathentry kind="output" path="bin"/> +</classpath> diff --git a/GAMS/IntExtOpt.gms b/GAMS/IntExtOpt.gms index 81cb9de9b7c2c236a5d8648f456d827823caea4b..627ece299ad750e969002d20e3942050a96f21ae 100644 --- a/GAMS/IntExtOpt.gms +++ b/GAMS/IntExtOpt.gms @@ -20,7 +20,7 @@ PARAMETER irrigParam(crop, location) yield response to irrigation parameter; PARAMETER demand(all_types) in t; PARAMETER worldExportPrices(import_crop) prices for exports; - PARAMETER worldImportPrices(import_crop) prices for imports; + PARAMETER countryImportPrices(import_crop) prices for imports; PARAMETER maxNetImport(import_crop) maximum net import for each crop based on world market; PARAMETER minNetImport(import_crop) minimum net import for each crop based on world market; PARAMETER irrigCost(location) irrigation cost in cost per 1000 Mlitre or Mha for each litre per m2; @@ -40,7 +40,7 @@ $gdxin %gdxincname% $load location, suitableLandArea, previousArea, demand, landChangeCost $load yieldNone, yieldFertOnly, yieldIrrigOnly, yieldBoth -$load fertParam, irrigParam, otherIParam, worldExportPrices, worldImportPrices, maxNetImport, minNetImport, unhandledCropArea +$load fertParam, irrigParam, otherIParam, worldExportPrices, countryImportPrices, maxNetImport, minNetImport, unhandledCropArea $load meatEfficency, minFeedRate, otherICost, irrigCost, irrigMaxRate, irrigConstraint, fertiliserUnitCost, domesticPriceMarkup $gdxin @@ -182,7 +182,7 @@ $gdxin ) * landChangeCost ) * domesticPriceMarkup + - SUM(import_crop, importAmount(import_crop) * worldImportPrices(import_crop) - exportAmount(import_crop) * worldExportPrices(import_crop)) + SUM(import_crop, importAmount(import_crop) * countryImportPrices(import_crop) - exportAmount(import_crop) * worldExportPrices(import_crop)) ) / 1000000; MODEL LAND_USE /ALL/ ; @@ -218,7 +218,7 @@ $gdxin totalProdCost(crop) = sum(location, unitCost.l(crop, location) * area.l(crop, location)); totalCropland(location) = sum(crop_less_pasture, area.l(crop_less_pasture, location)); - netImportCost(import_crop) = importAmount.l(import_crop) * worldImportPrices(import_crop) - exportAmount.l(import_crop) * worldExportPrices(import_crop); + netImportCost(import_crop) = importAmount.l(import_crop) * countryImportPrices(import_crop) - exportAmount.l(import_crop) * worldExportPrices(import_crop); netImportAmount(import_crop) = importAmount.l(import_crop) - exportAmount.l(import_crop); feedCost(feed_crop)$(netImportAmount(feed_crop) gt 0) = (totalProdCost(feed_crop) + netImportCost(feed_crop)) * feedAmount.l(feed_crop) / (totalProd(feed_crop) + netImportAmount(feed_crop)); diff --git a/src/ac/ed/lurg/ModelConfig.java b/src/ac/ed/lurg/ModelConfig.java index e04b2ca136e8c28c4b896033b5f29bdc121d1d58..ef7a56b2238b715e31ddbcd75b3f72406a5bcacf 100644 --- a/src/ac/ed/lurg/ModelConfig.java +++ b/src/ac/ed/lurg/ModelConfig.java @@ -96,7 +96,7 @@ public class ModelConfig { public static final String COUNTRY_DATA_FILE = DATA_DIR + File.separator + "country_data.csv"; public static final String COMMODITY_DATA_FILE = DATA_DIR + File.separator + "con_prod_c_and_m.csv"; public static final String BIOENERGY_DEMAND_FILE = DATA_DIR + File.separator + "bio_demand.csv"; - public static final String TRADE_BARRIERS_FILE = DATA_DIR + File.separator + "trade_barriers.csv"; + public static final String TRADE_BARRIERS_FILE = DATA_DIR + File.separator + "trade_barriers_dummy.csv"; // yield data @@ -171,8 +171,10 @@ public class ModelConfig { public static final double DOMESTIC_PRICE_MARKUP = getDoubleProperty("DOMESTIC_PRICE_MARKUP", 1.0); public static final double TRANSPORT_LOSSES = getDoubleProperty("TRANSPORT_LOSSES", 0.1); // in international trade - //public static final double TRADE_BARRIER_FACTOR = getDoubleProperty("TRADE_BARRIER_FACTOR", 1.5); // price factor in international trade, transport cost and real trade barriers + public static final double TRADE_BARRIER_FACTOR_DEFAULT = getDoubleProperty("TRADE_BARRIER_FACTOR", 0.2); // price factor in international trade, transport cost and real trade barriers + public static final boolean ACTIVE_TRADE_BARRIERS = getBooleanProperty("ACTIVE_TRADE_BARRIERS", false); // if set to true read in barrier information from file, otherwise use default as above + public static final int NUM_CEREAL_CATEGORIES = getIntProperty("NUM_CEREAL_CATEGORIES", 5); public static final int NUM_PASTURE_CATEGORIES = getIntProperty("NUM_PASTURE_CATEGORIES", 1); diff --git a/src/ac/ed/lurg/ModelMain.java b/src/ac/ed/lurg/ModelMain.java index 746596cb954e33466df933b22964eac05fa67a65..4fa81ae5678f475849c665b9e3bcc84b067fcc50 100644 --- a/src/ac/ed/lurg/ModelMain.java +++ b/src/ac/ed/lurg/ModelMain.java @@ -17,7 +17,7 @@ import ac.ed.lurg.country.CountryAgent; import ac.ed.lurg.country.CountryBoundaryRaster; import ac.ed.lurg.country.CountryBoundaryReader; import ac.ed.lurg.country.GlobalPrice; -import ac.ed.lurg.country.TradeBarriersReader; +import ac.ed.lurg.country.TradeManager; import ac.ed.lurg.country.gams.GamsRasterOutput; import ac.ed.lurg.demand.BaseConsumpManager; import ac.ed.lurg.demand.DemandManager; @@ -37,6 +37,7 @@ import ac.ed.lurg.types.CropToDoubleMap; import ac.ed.lurg.types.CropType; import ac.ed.lurg.types.LandCoverType; import ac.ed.lurg.types.ModelFitType; +import ac.ed.lurg.utils.LazyHashMap; import ac.ed.lurg.utils.LogWriter; import ac.ed.lurg.yield.LPJYieldResponseMapReader; import ac.ed.lurg.yield.YieldRaster; @@ -53,6 +54,7 @@ public class ModelMain { private Collection<CountryAgent> countryAgents; private CountryBoundaryRaster countryBoundaryRaster; private DemandManager demandManager; + private TradeManager tradeManager; private CompositeCountryManager compositeCountryManager; private RasterHeaderDetails desiredProjection; @@ -73,6 +75,7 @@ public class ModelMain { BaseConsumpManager baseConsumpManager = new BaseConsumpManager(); compositeCountryManager = new CompositeCountryManager(baseConsumpManager); demandManager = new DemandManager(ModelFitType.LOGISTIC, ModelConfig.SSP_SCENARIO, baseConsumpManager, compositeCountryManager); + tradeManager = new TradeManager(compositeCountryManager); currentIrrigationData = getFixedIrrigationData(); countryBoundaryRaster = getCountryBoundaryRaster(); @@ -338,10 +341,8 @@ public class ModelMain { RasterSet<LandCoverItem> initLC = getInitialLandCover(); Map<CompositeCountry, Map<CropType, CropUsageData>> cropUsageDataMap = new CropUsageReader(compositeCountryManager).getCommodityData(); - Map<CompositeCountry, CropToDoubleMap> tradeBarriersMap = new TradeBarriersReader(compositeCountryManager).getTradeBarriers(); - - + for (CompositeCountry cc : countryGrouping) { // DEBUG code @@ -354,9 +355,10 @@ public class ModelMain { List<RasterKey> keys = countryBoundaryRaster.getKeysFor(cc); RasterSet<LandCoverItem> initCountryLC = initLC.createSubsetForKeys(keys); Map<CropType, CropUsageData> countryCommodityData = cropUsageDataMap.get(cc); - Map<CropType, Double> countryTradeBarriers = tradeBarriersMap.get(cc); - + Map<CropType, Double> countryTradeBarriers = tradeManager.getTradeBarriers(cc); + //Map<CropType, Double> countryTradeBarriers = (ModelConfig.ACTIVE_TRADE_BARRIERS) ? tradeBarriersMap.get(cc): getDefaultTradeBarriers(); + if (countryCommodityData == null) { LogWriter.printlnError("No commodities data for " + cc + ", so skipping"); } diff --git a/src/ac/ed/lurg/country/TradeBarriersReader.java b/src/ac/ed/lurg/country/TradeBarriersReader.java deleted file mode 100644 index 28ea881ae240d61ff26294771f5444a7c6757dc7..0000000000000000000000000000000000000000 --- a/src/ac/ed/lurg/country/TradeBarriersReader.java +++ /dev/null @@ -1,93 +0,0 @@ -package ac.ed.lurg.country; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.util.Map; -import java.util.Map.Entry; - -import ac.ed.lurg.ModelConfig; -import ac.ed.lurg.types.CropType; -import ac.ed.lurg.utils.LazyHashMap; -import ac.ed.lurg.utils.LogWriter; -import ac.ed.lurg.types.CropToDoubleMap; - - -public class TradeBarriersReader { - - private static final int COUNTRY_COL = 0; - private static final int ITEM_COL = 1; - private static final int TRADE_BARRIER_COL = 2; - - private CompositeCountryManager compositeCountryManager; - - public TradeBarriersReader(CompositeCountryManager compositeCountryManager) { - // super(); - this.compositeCountryManager = compositeCountryManager; - } - - public Map<CompositeCountry, CropToDoubleMap> getTradeBarriers() { - String filename = ModelConfig.TRADE_BARRIERS_FILE; - - @SuppressWarnings("serial") - LazyHashMap<CompositeCountry, CropToDoubleMap> tradeMap = new LazyHashMap<CompositeCountry, CropToDoubleMap>() { - protected CropToDoubleMap createValue() { return new CropToDoubleMap(); } - }; -// - - try { - BufferedReader reader = new BufferedReader(new FileReader(filename)); - String line, countryName, itemName; - double barrierValue; - reader.readLine(); // read header - - while ((line=reader.readLine()) != null) { - String[] tokens = line.split(","); - - if (tokens.length < 3) - LogWriter.printlnError("Too few columns in " + filename + ", " + line); - - try { - - countryName = tokens[COUNTRY_COL]; - itemName = tokens[ITEM_COL]; - barrierValue = Double.parseDouble(tokens[TRADE_BARRIER_COL]); - - SingleCountry country = CountryManager.getForName(countryName); - - CropType crop = CropType.getForFaoName(itemName); - - CompositeCountry cc = compositeCountryManager.getForSingleCountry(country); - - CropToDoubleMap countryData = tradeMap.lazyGet(cc); - - countryData.incrementValue(crop, barrierValue); - - } catch (Exception e) { - LogWriter.printlnError("Failed in processing trade barriers line " + line); - LogWriter.print(e); - } - } - reader.close(); - - } catch (Exception e) { - LogWriter.printlnError("Failed in reading trade barriers data file"); - LogWriter.print(e); - } - LogWriter.println("Processed " + filename + ", create " + tradeMap.size() + " barriers entries"); - - for (Entry<CompositeCountry, CropToDoubleMap> entry : tradeMap.entrySet()) { - -// LogWriter.println("country name " + entry.getKey()); -// LogWriter.println("crops " + entry.getValue()); - - entry.getValue().divideBy(compositeCountryManager.getAllForCompositeCountry(entry.getKey()).size()); - -// LogWriter.println("number of countries " + compositeCountryManager.getAllForCompositeCountry(entry.getKey()).size()); -// LogWriter.println("crops " + entry.getValue()); - - } - - return tradeMap; - } - -} diff --git a/src/ac/ed/lurg/country/gams/GamsCountryInput.java b/src/ac/ed/lurg/country/gams/GamsCountryInput.java index 92b8b96ee2f10f3f177cda269e6a993039d83be0..d31d9f8438b8df2471db06d7ccf61047db9da2dc 100644 --- a/src/ac/ed/lurg/country/gams/GamsCountryInput.java +++ b/src/ac/ed/lurg/country/gams/GamsCountryInput.java @@ -115,21 +115,25 @@ public class GamsCountryInput { return netImport; } - public Map<CropType, Double> getWorldImportPrices() { + public Map<CropType, Double> getCountryImportPrices() { + double tradeBarrier; + double baseImportPrice; Map<CropType, Double> prices = new HashMap<CropType, Double>(); for (Map.Entry<CropType, GlobalPrice> entry : worldPrices.entrySet()) { - - prices.put(entry.getKey(), entry.getValue().getImportPrice()); + + tradeBarrier = tradeBarriers.get(entry.getKey()); + baseImportPrice = entry.getValue().getImportPrice(); + prices.put(entry.getKey(), baseImportPrice+baseImportPrice*tradeBarrier); } return prices; } - public Map<CropType, Double> getCountryExportPrices() { + public Map<CropType, Double> getWorldExportPrices() { Map<CropType, Double> prices = new HashMap<CropType, Double>(); for (Map.Entry<CropType, GlobalPrice> entry : worldPrices.entrySet()) { - double tradeBarrier = tradeBarriers.get(entry.getKey()); - prices.put(entry.getKey(), entry.getValue().getExportPrice()*(1-tradeBarrier)); + + prices.put(entry.getKey(), entry.getValue().getExportPrice()); } return prices; diff --git a/src/ac/ed/lurg/country/gams/GamsLocationOptimiser.java b/src/ac/ed/lurg/country/gams/GamsLocationOptimiser.java index b7dff38d78011534837ffbcb50184941f3590b48..b6cbb46ab6173e35e2c6ec6df0d02089bfd4eea6 100644 --- a/src/ac/ed/lurg/country/gams/GamsLocationOptimiser.java +++ b/src/ac/ed/lurg/country/gams/GamsLocationOptimiser.java @@ -186,8 +186,8 @@ public class GamsLocationOptimiser { addItemMapParm(inDB.addParameter("minNetImport", 1), countryInput.getMinNetImport(), false); addItemMapParm(inDB.addParameter("maxNetImport", 1), countryInput.getMaxNetImport(), false); - addItemMapParm(inDB.addParameter("worldImportPrices", 1), countryInput.getWorldImportPrices(), false); - addItemMapParm(inDB.addParameter("worldExportPrices", 1), countryInput.getCountryExportPrices(), false); + addItemMapParm(inDB.addParameter("countryImportPrices", 1), countryInput.getCountryImportPrices(), false); + addItemMapParm(inDB.addParameter("worldExportPrices", 1), countryInput.getWorldExportPrices(), false); //the above is not really world export price because it is scaled by country tradeBarriers, might want to change //parameter name in GAMS i.e. countryExportPrices LogWriter.print("\n"); diff --git a/src/ac/ed/lurg/landuse/LandUseItem.java b/src/ac/ed/lurg/landuse/LandUseItem.java index f4a3d81741204a58bb9db5b61c6a74cea2fac7cc..14594356bd7d2086e3ca93fd30928d5ebdcf3eb8 100644 --- a/src/ac/ed/lurg/landuse/LandUseItem.java +++ b/src/ac/ed/lurg/landuse/LandUseItem.java @@ -202,25 +202,13 @@ public class LandUseItem implements InterpolatingRasterItem<LandUseItem> { double d = 0; double protectedTotal = protectedArea; - double forestArea = getLandCoverArea(LandCoverType.FOREST); - double naturalArea = getLandCoverArea(LandCoverType.OTHER_NATURAL); - double totalNatural = forestArea+naturalArea; + double totalNatural = getLandCoverArea(LandCoverType.OTHER_NATURAL) + getLandCoverArea(LandCoverType.FOREST); - if (totalNatural >= protectedTotal){ - - double unavailableNatural = naturalArea/totalNatural*protectedTotal; - unavailableNatural = (Double.isNaN(unavailableNatural) || Double.isInfinite(unavailableNatural)) ? 0.0 : unavailableNatural; - double unavailableForest = forestArea/totalNatural*protectedTotal; - unavailableForest = (Double.isNaN(unavailableForest) || Double.isInfinite(unavailableForest)) ? 0.0 : unavailableForest; - - d += naturalArea - unavailableNatural + forestArea - unavailableForest; + if (totalNatural >= protectedTotal) + d += totalNatural - protectedTotal; - } - - for (LandCoverType l : LandCoverType.values()) { - if (LandCoverType.PASTURE.equals(l)|| LandCoverType.CROPLAND.equals(l) ) // barren land is not suitable - d += getLandCoverArea(l); - } + d += getLandCoverArea(LandCoverType.PASTURE); + d += getLandCoverArea(LandCoverType.CROPLAND); return d; }