Skip to content
Snippets Groups Projects
Commit 249644d5 authored by Peter Alexander's avatar Peter Alexander
Browse files

Output detailed demand results for each country

parent bce2ba6e
No related branches found
No related tags found
No related merge requests found
......@@ -2,14 +2,14 @@ BASE_DIR=..
YIELD_DIR=/Users/peteralexander/Documents/LURG/LPJ/LPJGPLUM_expt1.1_2006-2100_PLUM6xtra_20180412171654/rcp60
DEBUG_LIMIT_COUNTRIES=true
DEBUG_COUNTRY_NAME=United States of America
DEBUG_LIMIT_COUNTRIES=false
DEBUG_COUNTRY_NAME=Peru & Ecuador
IS_CALIBRATION_RUN = false
GENERATE_NEW_YIELD_CLUSTERS = false
NUM_YIELD_CLUSTERS=8000
END_TIMESTEP=18
END_TIMESTEP=0
TIMESTEP_SIZE=5
INTERPOLATE_OUTPUT_YEARS = false
......
......@@ -205,8 +205,8 @@ public class ModelConfig {
public static final double INITAL_PRICE_MONOGASTRICS = getDoubleProperty("INITAL_PRICE_MONOGASTRICS", 0.4 * 0.5 * ModelConfig.INITIAL_PRICE_SHIFT); // quantities is in feed equivalent term (0.4 is weighted average price per feed, and 0.5 accounts for mark-up for additional processing)
public static final double INITAL_PRICE_RUMINANTS = getDoubleProperty("INITAL_PRICE_RUMINANTS", 0.1 * 0.6 * ModelConfig.INITIAL_PRICE_SHIFT); // quantities is in feed equivalent term
public static final double INITAL_PRICE_ENERGYCROPS = getDoubleProperty("INITAL_PRICE_ENERGYCROPS", 0.04 * ModelConfig.INITIAL_PRICE_SHIFT);
public static final double INITAL_PRICE_FRUITVEG = getDoubleProperty("INITAL_PRICE_FRUITVEG", 0.1 * ModelConfig.INITIAL_PRICE_SHIFT);
public static final double INITAL_PRICE_SUGAR = getDoubleProperty("INITAL_PRICE_SUGAR", 0.01 * ModelConfig.INITIAL_PRICE_SHIFT);
public static final double INITAL_PRICE_FRUITVEG = getDoubleProperty("INITAL_PRICE_FRUITVEG", 0.3 * ModelConfig.INITIAL_PRICE_SHIFT);
public static final double INITAL_PRICE_SUGAR = getDoubleProperty("INITAL_PRICE_SUGAR", 0.1 * ModelConfig.INITIAL_PRICE_SHIFT);
// These are initial demand system prices in 2000 kcal terms
public static final double INITAL_DEMAND_PRICE_CEREALS = getDoubleProperty("INITAL_DEMAND_PRICE_CEREALS", 120.2364695);
......@@ -242,6 +242,7 @@ public class ModelConfig {
public static final String DEMAND_OUTPUT_FILE = OUTPUT_DIR + File.separator + "demand.txt";
public static final String DOMESTIC_OUTPUT_FILE = OUTPUT_DIR + File.separator + "domestic.txt";
public static final String COUNTRY_DEMAND_FILE = OUTPUT_DIR + File.separator + "countryDemand.txt";
public static final String DEMAND_OPTIMISATION_OUTPUT_FILE = OUTPUT_DIR + File.separator + "countryDemandOpt.txt";
public static final String FOOD_BALANCE_SHEET_FILE = OUTPUT_DIR + File.separator + "fbs.txt";
public static final String ANIMAL_NUMBERS_OUTPUT_FILE = OUTPUT_DIR + File.separator + "animals.txt";;
......
......@@ -4,7 +4,6 @@ import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
......@@ -45,6 +44,7 @@ import ac.ed.lurg.output.LpjgOutputer;
import ac.ed.lurg.types.CommodityType;
import ac.ed.lurg.types.CropType;
import ac.ed.lurg.types.LandCoverType;
import ac.ed.lurg.utils.FileWriterHelper;
import ac.ed.lurg.utils.LogWriter;
import ac.ed.lurg.yield.LPJYieldResponseMapReader;
import ac.ed.lurg.yield.YieldRaster;
......@@ -136,23 +136,10 @@ public class ModelMain {
outputTimestepResults(timestep, globalLandUseRaster);
}
private BufferedWriter getFileWriter(Timestep timestep, String file, String columnHeadings) throws IOException {
if (timestep.isInitialTimestep()) {
FileWriter fstream = new FileWriter(file, false);
BufferedWriter outputFile = new BufferedWriter(fstream);
outputFile.write(columnHeadings);
outputFile.newLine();
return outputFile;
} else {
FileWriter fstream = new FileWriter(file, true);
return new BufferedWriter(fstream);
}
}
private void writeLandCoverFile(Timestep timestep, RasterSet<LandUseItem> landUseRaster) {
try {
StringBuffer sbHeadings = new StringBuffer("Year,Cropland,Pasture,ManForest,UnmanForest,Natural,AbPasture,EnergyCrop,FertCrop,IrrigCrop");
BufferedWriter outputFile = getFileWriter(timestep, ModelConfig.LAND_COVER_OUTPUT_FILE, sbHeadings.toString());
BufferedWriter outputFile = FileWriterHelper.getFileWriter(timestep, ModelConfig.LAND_COVER_OUTPUT_FILE, sbHeadings.toString());
StringBuffer sbData = new StringBuffer();
sbData.append(String.format("%d,%.1f,%.1f,%.1f,%.1f,%.1f,%.1f", timestep.getYear(),
......@@ -178,7 +165,7 @@ public class ModelMain {
private void writeGlobalMarketFile(Timestep timestep) {
try {
BufferedWriter outputFile = getFileWriter(timestep, ModelConfig.PRICES_OUTPUT_FILE, "Year,Crop,Imports (Mt),Exports (Mt),New export price, Stock Levels (Mt)");
BufferedWriter outputFile = FileWriterHelper.getFileWriter(timestep, ModelConfig.PRICES_OUTPUT_FILE, "Year,Crop,Imports (Mt),Exports (Mt),New export price, Stock Levels (Mt)");
internationalMarket.writeGlobalMarketFile(timestep, outputFile);
outputFile.close();
} catch (IOException e) {
......@@ -188,7 +175,7 @@ public class ModelMain {
private void writeGlobalFoodBalanceSheet(Timestep timestep, RasterSet<LandUseItem> landUseRaster) {
try {
BufferedWriter outputFile = getFileWriter(timestep, ModelConfig.FOOD_BALANCE_SHEET_FILE, "Year,Crop,Production,Imports,Export,TransportLosses,StockVar,Supply,MonogastricsFeed,RuminantsFeed,SeedAndOtherLosses,FoodAnd1stGen,ProdArea");
BufferedWriter outputFile = FileWriterHelper.getFileWriter(timestep, ModelConfig.FOOD_BALANCE_SHEET_FILE, "Year,Crop,Production,Imports,Export,TransportLosses,StockVar,Supply,MonogastricsFeed,RuminantsFeed,SeedAndOtherLosses,FoodAnd1stGen,ProdArea");
Map<CropType, GlobalPrice> worldPrices = internationalMarket.getWorldPrices();
double harvestedAndFallowArea = 0;
......@@ -248,7 +235,7 @@ public class ModelMain {
private void writeDemandFile(Timestep timestep) {
try {
BufferedWriter outputFile = getFileWriter(timestep, ModelConfig.DEMAND_OUTPUT_FILE, "Year,Commodity,Amount (Mt)");
BufferedWriter outputFile = FileWriterHelper.getFileWriter(timestep, ModelConfig.DEMAND_OUTPUT_FILE, "Year,Commodity,Amount (Mt)");
for (CommodityType comm : CommodityType.getAllFoodItems()) {
double demandAmount = 0;
......@@ -277,7 +264,7 @@ public class ModelMain {
private void writeDomesticProductionFile(Timestep timestep) {
try {
StringBuffer sbHeadings = new StringBuffer("Year, Country, Crop, Area, Production, Production_cost, Import_price, Export_price, Net_imports, Net_import_cost, Rum_feed_amount, Mon_feed_amount");
BufferedWriter outputFile = getFileWriter(timestep, ModelConfig.DOMESTIC_OUTPUT_FILE, sbHeadings.toString());
BufferedWriter outputFile = FileWriterHelper.getFileWriter(timestep, ModelConfig.DOMESTIC_OUTPUT_FILE, sbHeadings.toString());
for (CropType crop : CropType.getAllItems()) {
for (AbstractCountryAgent country : countryAgents.getAll()) {
......@@ -326,7 +313,7 @@ public class ModelMain {
try {
StringBuffer sbHeadings = new StringBuffer("Year, Country, Commodity, Demand, BioenergyDemand");
BufferedWriter outputFile = getFileWriter(timestep, ModelConfig.COUNTRY_DEMAND_FILE, sbHeadings.toString());
BufferedWriter outputFile = FileWriterHelper.getFileWriter(timestep, ModelConfig.COUNTRY_DEMAND_FILE, sbHeadings.toString());
for (AbstractCountryAgent country : countryAgents.getAll()) {
for (CommodityType commodity : CommodityType.getAllFoodItems()) {
......@@ -351,7 +338,7 @@ public class ModelMain {
private void writeAnimalNumber(Timestep timestep) {
try {
StringBuffer sbHeadings = new StringBuffer("Year,Country,FAOItem,Heads(M)");
BufferedWriter outputFile = getFileWriter(timestep, ModelConfig.ANIMAL_NUMBERS_OUTPUT_FILE, sbHeadings.toString());
BufferedWriter outputFile = FileWriterHelper.getFileWriter(timestep, ModelConfig.ANIMAL_NUMBERS_OUTPUT_FILE, sbHeadings.toString());
for (AbstractCountryAgent country : countryAgents.getAll()) {
Map<CropType, CropUsageData> cropUsageAllCrops = country.getCropUsageData();
......
......@@ -7,14 +7,16 @@ import ac.ed.lurg.types.CommodityType;
public class GamsDemandInput {
private SingleCountry country;
private int year;
private double gdpPc;
private Map<CommodityType, Double> prices;
private double usaGdpPc;
private GamsDemandOutput previousGamsDemands;
public GamsDemandInput(SingleCountry country, double gdpPc, Map<CommodityType, Double> prices, double usaGdpPc, GamsDemandOutput previousGamsDemands) {
public GamsDemandInput(SingleCountry country, int year, double gdpPc, Map<CommodityType, Double> prices, double usaGdpPc, GamsDemandOutput previousGamsDemands) {
super();
this.country = country;
this.year = year;
this.gdpPc = gdpPc;
this.prices = prices;
this.usaGdpPc = usaGdpPc;
......@@ -24,6 +26,9 @@ public class GamsDemandInput {
public SingleCountry getCountry() {
return country;
}
public int getYear() {
return year;
}
public double getGdpPc() {
return gdpPc;
}
......
package ac.ed.lurg.country.gams;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashSet;
import java.util.Map;
import java.util.Vector;
import java.util.Map.Entry;
import com.gams.api.GAMSDatabase;
import com.gams.api.GAMSGlobals;
......@@ -21,11 +17,7 @@ import com.gams.api.GAMSWorkspace;
import com.gams.api.GAMSWorkspaceInfo;
import ac.ed.lurg.ModelConfig;
import ac.ed.lurg.Timestep;
import ac.ed.lurg.country.AbstractCountryAgent;
import ac.ed.lurg.landuse.CropUsageData;
import ac.ed.lurg.types.CommodityType;
import ac.ed.lurg.types.CropType;
import ac.ed.lurg.utils.LogWriter;
public class GamsDemandOptimiser {
......@@ -79,11 +71,9 @@ public class GamsDemandOptimiser {
for (Map.Entry<CommodityType, Double> entry : inputData.getPrices().entrySet()) {
CommodityType comm = entry.getKey();
double priceComm = entry.getValue();
doCommodity(inDB, priceP, prevSubsP, prevDiscP, gdpPc, previousGamsDemands, comm, priceComm, 0.1, 0.1);
doCommodity(inDB, priceP, prevSubsP, prevDiscP, gdpPc, previousGamsDemands, comm, priceComm,
comm==CommodityType.NONFOOD ? 5 : 0.05, comm==CommodityType.NONFOOD ? 0.5 : 0.05);
}
double nonfoodPrice = 45.376+53.036*gdpPc/inputData.getUsaGdpPc();
doCommodity(inDB, priceP, prevSubsP, prevDiscP, gdpPc, previousGamsDemands, CommodityType.NONFOOD, nonfoodPrice, 5, 1);
}
private void doCommodity(GAMSDatabase inDB, GAMSParameter priceP, GAMSParameter prevSubsP, GAMSParameter prevDiscP, double gdpPc,
......@@ -113,9 +103,9 @@ public class GamsDemandOptimiser {
private GamsDemandOutput handleResults(GAMSDatabase outDB) {
int modelStatus = (int) outDB.getParameter("ms").findRecord().getValue();
String status = GAMSGlobals.ModelStat.lookup(modelStatus).toString();
LogWriter.println(String.format("\nDemamd %s: Modelstatus %s, Solvestatus %s", inputData.getCountry(),
GAMSGlobals.ModelStat.lookup( modelStatus ),
GAMSGlobals.SolveStat.lookup((int) outDB.getParameter("ss").findRecord().getValue()) ));
status, GAMSGlobals.SolveStat.lookup((int) outDB.getParameter("ss").findRecord().getValue()) ));
GAMSVariable varU = outDB.getVariable("u");
double utility = varU.getFirstRecord().getLevel();
......@@ -141,6 +131,6 @@ public class GamsDemandOptimiser {
}
}
return new GamsDemandOutput(demandMap, utility);
return new GamsDemandOutput(status, demandMap, utility);
}
}
......@@ -7,10 +7,13 @@ import java.util.Map;
import ac.ed.lurg.types.CommodityType;
public class GamsDemandOutput {
public Collection<GamsCommodityDemand> demands;
public double utility;
private String status;
private Collection<GamsCommodityDemand> demands;
private double utility;
public GamsDemandOutput(Collection<GamsCommodityDemand> demands, double utility) {
public GamsDemandOutput(String status, Collection<GamsCommodityDemand> demands, double utility) {
this.status = status;
this.demands = demands;
this.utility = utility;
}
......@@ -35,4 +38,7 @@ public class GamsDemandOutput {
public double getUtility() {
return utility;
}
public String getStatus() {
return status;
}
}
......@@ -45,7 +45,7 @@ public abstract class AbstractSSPDemandManager extends AbstractDemandManager {
SspData usaSd = sspManager.get(ssp_scenario, year, usa);
LogWriter.println("Got ssp data for " + c.getCountryName() + " of " + sd);
foodDemandMap = getFoodDemandMap(c, gdpPcYear * ModelConfig.SSP_GDP_PC_FACTOR, sd.getPopulation() * ModelConfig.SSP_POPULATION_FACTOR, prices, usaSd.getGdpPc());
foodDemandMap = getFoodDemandMap(c, year, gdpPcYear * ModelConfig.SSP_GDP_PC_FACTOR, sd.getPopulation() * ModelConfig.SSP_POPULATION_FACTOR, prices, usaSd.getGdpPc());
if(!ModelConfig.SHOCKS_POSSIBLE){
return foodDemandMap;
......@@ -63,5 +63,5 @@ public abstract class AbstractSSPDemandManager extends AbstractDemandManager {
return projectedCpc;
}
abstract Map<CommodityType, Double> getFoodDemandMap(SingleCountry c, double gdpPc, double population, Map<CommodityType, Double> prices, double usaGdpPc);
abstract Map<CommodityType, Double> getFoodDemandMap(SingleCountry c, int year, double gdpPc, double population, Map<CommodityType, Double> prices, double usaGdpPc);
}
......@@ -19,7 +19,7 @@ public class DemandManagerSSP extends AbstractSSPDemandManager {
}
@Override
Map<CommodityType, Double> getFoodDemandMap(SingleCountry c, double gdpPc, double population, Map<CommodityType, Double> prices, double usaGdpPc) {
Map<CommodityType, Double> getFoodDemandMap(SingleCountry c, int year, double gdpPc, double population, Map<CommodityType, Double> prices, double usaGdpPc) {
Map<CommodityType, Double> aFoodDemandMap = new HashMap<CommodityType, Double>();
SspData baseSspData = sspManager.get(ssp_scenario, ModelConfig.BASE_YEAR, c);
double baseGdpPc = baseSspData.getGdpPc();
......
package ac.ed.lurg.demand;
import java.io.BufferedWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
......@@ -10,26 +12,39 @@ import ac.ed.lurg.country.gams.GamsDemandInput;
import ac.ed.lurg.country.gams.GamsDemandOptimiser;
import ac.ed.lurg.country.gams.GamsDemandOutput;
import ac.ed.lurg.types.CommodityType;
import ac.ed.lurg.utils.FileWriterHelper;
import ac.ed.lurg.utils.LogWriter;
public class ElasticDemandManager extends AbstractSSPDemandManager {
private Map<SingleCountry, Map<CommodityType, Double>> baseCpcCache = new HashMap<SingleCountry, Map<CommodityType, Double>>();
private Map<SingleCountry, GamsDemandOutput> previousGamsDemands = new HashMap<SingleCountry, GamsDemandOutput>();
private BufferedWriter outputFile;
public ElasticDemandManager(String ssp_scenario, BaseConsumpManager baseConsumpManager, CompositeCountryManager compositeCountryManager) {
super(ssp_scenario, baseConsumpManager, compositeCountryManager);
try {
outputFile = FileWriterHelper.getFileWriter(true, true, ModelConfig.DEMAND_OPTIMISATION_OUTPUT_FILE, getDamsDemandOutputsHeader());
} catch (IOException e) {
LogWriter.print(e);
}
}
@Override
Map<CommodityType, Double> getFoodDemandMap(SingleCountry c, double gdpPc, double population, Map<CommodityType, Double> prices, double usaGdpPc) {
GamsDemandInput inputData = new GamsDemandInput(c, gdpPc, prices, usaGdpPc, previousGamsDemands.get(c));
Map<CommodityType, Double> getFoodDemandMap(SingleCountry c, int year, double gdpPc, double population, Map<CommodityType, Double> prices, double usaGdpPc) {
double nonfoodPrice = 45.376+53.036*gdpPc/usaGdpPc;
prices.put(CommodityType.NONFOOD, nonfoodPrice);
GamsDemandInput inputData = new GamsDemandInput(c, year, gdpPc, prices, usaGdpPc, previousGamsDemands.get(c));
// Do the projection
GamsDemandOutput gamsOutput = new GamsDemandOptimiser(inputData).getDemandPc();
previousGamsDemands.put(c, gamsOutput);
Map<CommodityType, Double> foodPc = gamsOutput.getPlumDemands();
Map<CommodityType, Double> foodDemands = new HashMap<CommodityType, Double>();
SspData baseSspData = sspManager.get(ssp_scenario, ModelConfig.BASE_YEAR, c);
double baseGdpPc = baseSspData.getGdp();
......@@ -45,12 +60,60 @@ public class ElasticDemandManager extends AbstractSSPDemandManager {
double newExpCpc = entry.getValue();
double baseExpCpc = baseExpCpcMap.get(commodity);
double baseCpc = baseConsumpManager.get(c, commodity);
double cpc = rebaseConsumption(baseGdpPc, baseCpc, baseExpCpc, gdpPc, newExpCpc);
double d = cpc * population;
foodDemands.put(commodity, d);
}
writeGamsDemandOutputs(inputData, gamsOutput, foodDemands);
return foodDemands;
}
private String getDamsDemandOutputsHeader() {
StringBuffer sbHeader = new StringBuffer("country,year,gdpPc");
for (CommodityType commodity : CommodityType.values())
sbHeader.append(",price_" + commodity.getGamsName());
sbHeader.append(",status,utility");
for (CommodityType commodity : CommodityType.values())
sbHeader.append(",gamssubs_" + commodity.getGamsName());
for (CommodityType commodity : CommodityType.values())
sbHeader.append(",gamsdisc_" + commodity.getGamsName());
for (CommodityType commodity : CommodityType.getAllFoodItems())
sbHeader.append(",plumdemand_" + commodity.getGamsName());
for (CommodityType commodity : CommodityType.getAllFoodItems())
sbHeader.append(",plumrebased_" + commodity.getGamsName());
return sbHeader.toString();
}
private void writeGamsDemandOutputs(GamsDemandInput inputData, GamsDemandOutput gamsOutput, Map<CommodityType, Double> foodDemands) {
try {
StringBuffer sbData = new StringBuffer(String.format("%s,%d,%.2f", inputData.getCountry(), inputData.getYear(),inputData.getGdpPc()));
for (CommodityType commodity : CommodityType.values())
sbData.append(String.format(",%.4f", inputData.getPrices().get(commodity)));
sbData.append(String.format(",%s,%.6f", gamsOutput.getStatus(), gamsOutput.getUtility()));
for (CommodityType commodity : CommodityType.values())
sbData.append(String.format(",%.4f", gamsOutput.getGamsDemands(commodity).getSubsistence()));
for (CommodityType commodity : CommodityType.values())
sbData.append(String.format(",%.4f", gamsOutput.getGamsDemands(commodity).getDiscretionary()));
for (CommodityType commodity : CommodityType.getAllFoodItems())
sbData.append(String.format(",%.4f", gamsOutput.getPlumDemands().get(commodity)));
for (CommodityType commodity : CommodityType.getAllFoodItems())
sbData.append(String.format(",%.4f", foodDemands.get(commodity)));
outputFile.write(sbData.toString());
outputFile.newLine();
}
catch (IOException e) {
LogWriter.print(e);
}
}
}
\ No newline at end of file
package ac.ed.lurg.utils;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import ac.ed.lurg.Timestep;
public class FileWriterHelper {
static public BufferedWriter getFileWriter(Timestep timestep, String file, String columnHeadings) throws IOException {
return getFileWriter(timestep.isInitialTimestep(), false, file, columnHeadings);
}
static public BufferedWriter getFileWriter(boolean initialise, boolean addShutdownHook, String file, String columnHeadings) throws IOException {
BufferedWriter outputFile;
FileWriter fstream = new FileWriter(file, !initialise);
outputFile = new BufferedWriter(fstream);
if (initialise) {
outputFile.write(columnHeadings);
outputFile.newLine();
if (addShutdownHook) {
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
public void run() {
try {
outputFile.close();
} catch (IOException e) {
LogWriter.print(e);
}
}
}));
}
}
return outputFile;
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment