diff --git a/data/shockDistributions.csv b/data/shockDistributions.csv new file mode 100644 index 0000000000000000000000000000000000000000..0ff6362b4513739d78c9f44a124b9006d3426c0c --- /dev/null +++ b/data/shockDistributions.csv @@ -0,0 +1,23 @@ +shock,pname,min,max,type +protectionism,TRADE_BARRIERS_MULTIPLIER,0.1,0.2,additive +protectionism ,TRANSPORT_COST,0.5,1,multiplicative +protectionism ,TRANSPORT_LOSSES,0.05,0.1,additive +automation,TRANSPORT_COST,-0.25,-0.5,multiplicative +automation,TRANSPORT_LOSSES,-0.05,-0.1,additive +automation,TECHNOLOGY_CHANGE_ANNUAL_RATE,0.002,0.004,additive +automation,MEAT_EFFICIENCY,0.025,0.05,additive +automation,FERTILISER_COST_PER_T,-0.25,-0.5,multiplicative +automation,OTHER_INTENSITY_COST,-0.25,-0.5,multiplicative +automation,IRRIG_COST_MULTIPLIER,-0.25,-0.5,additive +automation,IRRIG_EFF_MULTIPLIER,0.1,0.2,additive +diet,RUMINANT_CHANGE_ANNUAL_RATE,0.4,0.6,additive +diet,MONOGASTRIC_CHANGE_ANNUAL_RATE,0.4,0.6,additive +cyber,TRANSPORT_COST,0.5,1,multiplicative +cyber,TRANSPORT_LOSSES,0.1,0.2,additive +cyber,TECHNOLOGY_CHANGE_ANNUAL_RATE,-0.002,-0.004,additive +cyber,MEAT_EFFICIENCY,-0.025,-0.05,additive +cyber,FERTILISER_COST_PER_T,0.25,0.5,multiplicative +cyber,OTHER_INTENSITY_COST,0.25,0.5,multiplicative +cyber,IRRIG_COST_MULTIPLIER,0.25,0.5,additive +cyber,IRRIG_EFF_MULTIPLIER,-0.1,-0.2,additive +financial,FINANCIAL_SPECULATION_MULTIPLIER,0.5,1,additive diff --git a/data/shockProbabilities.csv b/data/shockProbabilities.csv new file mode 100644 index 0000000000000000000000000000000000000000..98a6ef059e752606e22604c7258a1eb9609f9331 --- /dev/null +++ b/data/shockProbabilities.csv @@ -0,0 +1,6 @@ +ssp,protectionism,automation,diet,climate,cyber,financial +SSP1,0.1,0.5,0.9,0.01,0.05,0.01 +SSP2,0.7,0.5,0.3,0.07,0.05,0.03 +SSP3,0.9,0.1,0.1,0.07,0.01,0.09 +SSP4,0.3,0.7,0.3,0.09,0.07,0.05 +SSP5,0.1,0.9,0.1,0.09,0.09,0.03 diff --git a/data/sims/shocks_params.csv b/data/sims/shocks_params.csv new file mode 100644 index 0000000000000000000000000000000000000000..9582d147843a5156eae7e792d7acce969adb3097 --- /dev/null +++ b/data/sims/shocks_params.csv @@ -0,0 +1,151 @@ +Ensemble,pname,dist,xmin,xmax,x05,xmode,x95,value +SSP1,AGRI_LAND_EXPANSION_COST_FACTOR,beta,0,2,1.2,1.4,1.8, +SSP2,AGRI_LAND_EXPANSION_COST_FACTOR,beta,0,2,0.8,1,1.2, +SSP3,AGRI_LAND_EXPANSION_COST_FACTOR,beta,0,2,0.3,0.5,0.8, +SSP4,AGRI_LAND_EXPANSION_COST_FACTOR,beta,0,2,0.5,0.8,1, +SSP5,AGRI_LAND_EXPANSION_COST_FACTOR,beta,0,2,0.5,0.8,1.2, +SSP1,ANNUAL_MAX_IMPORT_CHANGE,beta,0.008,0.032,0.02,0.023,0.026, +SSP2,ANNUAL_MAX_IMPORT_CHANGE,beta,0.008,0.032,0.017,0.02,0.023, +SSP3,ANNUAL_MAX_IMPORT_CHANGE,beta,0.008,0.032,0.011,0.014,0.017, +SSP4,ANNUAL_MAX_IMPORT_CHANGE,beta,0.008,0.032,0.014,0.017,0.02, +SSP5,ANNUAL_MAX_IMPORT_CHANGE,beta,0.008,0.032,0.023,0.026,0.029, +SSP1,BIOENERGY_DEMAND_SHIFT,unif,0.9,1.1,,,, +SSP2,BIOENERGY_DEMAND_SHIFT,unif,0.9,1.1,,,, +SSP3,BIOENERGY_DEMAND_SHIFT,unif,0.9,1.1,,,, +SSP4,BIOENERGY_DEMAND_SHIFT,unif,0.9,1.1,,,, +SSP5,BIOENERGY_DEMAND_SHIFT,unif,0.9,1.1,,,, +SSP1,CROP_TO_PASTURE_COST_FACTOR,unif,0.8,1.2,,,, +SSP2,CROP_TO_PASTURE_COST_FACTOR,unif,0.8,1.2,,,, +SSP3,CROP_TO_PASTURE_COST_FACTOR,unif,0.8,1.2,,,, +SSP4,CROP_TO_PASTURE_COST_FACTOR,unif,0.8,1.2,,,, +SSP5,CROP_TO_PASTURE_COST_FACTOR,unif,0.8,1.2,,,, +SSP1,FERTILISER_COST_PER_T,beta,0.2,2.6,1.4,2,2.3, +SSP2,FERTILISER_COST_PER_T,beta,0.2,2.6,1.1,1.4,1.7, +SSP3,FERTILISER_COST_PER_T,beta,0.2,2.6,0.4,1.1,1.7, +SSP4,FERTILISER_COST_PER_T,beta,0.2,2.6,0.8,1.7,2.3, +SSP5,FERTILISER_COST_PER_T,beta,0.2,2.6,0.4,0.8,1.4, +SSP1,INITIAL_PRICE_SHIFT,unif,0.8,1.2,,,, +SSP2,INITIAL_PRICE_SHIFT,unif,0.8,1.2,,,, +SSP3,INITIAL_PRICE_SHIFT,unif,0.8,1.2,,,, +SSP4,INITIAL_PRICE_SHIFT,unif,0.8,1.2,,,, +SSP5,INITIAL_PRICE_SHIFT,unif,0.8,1.2,,,, +SSP1,IRRIG_COST_SCALE_FACTOR,beta,0,0.0006,0.0003,0.0004,0.0005, +SSP2,IRRIG_COST_SCALE_FACTOR,beta,0,0.0006,0.0002,0.0003,0.0004, +SSP3,IRRIG_COST_SCALE_FACTOR,beta,0,0.0006,0.00005,0.00015,0.0002, +SSP4,IRRIG_COST_SCALE_FACTOR,beta,0,0.0006,0.0001,0.0003,0.0005, +SSP5,IRRIG_COST_SCALE_FACTOR,beta,0,0.0006,0.00005,0.00015,0.0003, +SSP1,IRRIGATION_EFFICIENCY,beta,0.4,0.6,0.52,0.55,0.58, +SSP2,IRRIGATION_EFFICIENCY,beta,0.4,0.6,0.48,0.5,0.52, +SSP3,IRRIGATION_EFFICIENCY,beta,0.4,0.6,0.42,0.45,0.48, +SSP4,IRRIGATION_EFFICIENCY,beta,0.4,0.6,0.45,0.5,0.55, +SSP5,IRRIGATION_EFFICIENCY,beta,0.4,0.6,0.5,0.52,0.55, +SSP1,LAND_CHANGE_COST,beta,0.05,0.35,0.225,0.275,0.3, +SSP2,LAND_CHANGE_COST,beta,0.05,0.35,0.175,0.2,0.225, +SSP3,LAND_CHANGE_COST,beta,0.05,0.35,0.15,0.2,0.25, +SSP4,LAND_CHANGE_COST,beta,0.05,0.35,0.2,0.225,0.275, +SSP5,LAND_CHANGE_COST,beta,0.05,0.35,0.1,0.15,0.175, +SSP1,MARKET_LAMBA,unif,0.3,0.5,,,, +SSP2,MARKET_LAMBA,unif,0.3,0.5,,,, +SSP3,MARKET_LAMBA,unif,0.3,0.5,,,, +SSP4,MARKET_LAMBA,unif,0.3,0.5,,,, +SSP5,MARKET_LAMBA,unif,0.3,0.5,,,, +SSP1,MEAT_EFFICIENCY,beta,0.95,1.05,1.01,1.02,1.04, +SSP2,MEAT_EFFICIENCY,beta,0.95,1.05,0.99,1,1.01, +SSP3,MEAT_EFFICIENCY,beta,0.95,1.05,0.98,1,1.02, +SSP4,MEAT_EFFICIENCY,beta,0.95,1.05,0.98,1,1.02, +SSP5,MEAT_EFFICIENCY,beta,0.95,1.05,1,1.01,1.02, +SSP1,MIN_NATURAL_RATE,beta,0,0.3,0.14,0.2,0.25, +SSP2,MIN_NATURAL_RATE,beta,0,0.3,0.06,0.1,0.14, +SSP3,MIN_NATURAL_RATE,beta,0,0.3,0.02,0.04,0.07, +SSP4,MIN_NATURAL_RATE,beta,0,0.3,0.04,0.06,0.1, +SSP5,MIN_NATURAL_RATE,beta,0,0.3,0.02,0.04,0.06, +SSP1,OTHER_INTENSITY_COST,beta,0.5,0.9,0.7,0.8,0.85, +SSP2,OTHER_INTENSITY_COST,beta,0.5,0.9,0.65,0.7,0.75, +SSP3,OTHER_INTENSITY_COST,beta,0.5,0.9,0.55,0.65,0.75, +SSP4,OTHER_INTENSITY_COST,beta,0.5,0.9,0.6,0.75,0.85, +SSP5,OTHER_INTENSITY_COST,beta,0.5,0.9,0.55,0.6,0.7, +SSP1,PASTURE_HARVEST_FRACTION,unif,0.4,0.6,,,, +SSP2,PASTURE_HARVEST_FRACTION,unif,0.4,0.6,,,, +SSP3,PASTURE_HARVEST_FRACTION,unif,0.4,0.6,,,, +SSP4,PASTURE_HARVEST_FRACTION,unif,0.4,0.6,,,, +SSP5,PASTURE_HARVEST_FRACTION,unif,0.4,0.6,,,, +SSP1,SSP_GDP_PC_FACTOR,unif,0.9,1.1,,,, +SSP2,SSP_GDP_PC_FACTOR,unif,0.9,1.1,,,, +SSP3,SSP_GDP_PC_FACTOR,unif,0.9,1.1,,,, +SSP4,SSP_GDP_PC_FACTOR,unif,0.9,1.1,,,, +SSP5,SSP_GDP_PC_FACTOR,unif,0.9,1.1,,,, +SSP1,SSP_POPULATION_FACTOR,unif,0.9,1.1,,,, +SSP2,SSP_POPULATION_FACTOR,unif,0.9,1.1,,,, +SSP3,SSP_POPULATION_FACTOR,unif,0.9,1.1,,,, +SSP4,SSP_POPULATION_FACTOR,unif,0.9,1.1,,,, +SSP5,SSP_POPULATION_FACTOR,unif,0.9,1.1,,,, +SSP1,SSP_SCENARIO,value,,,,,,SSP1_v9_130325 +SSP2,SSP_SCENARIO,value,,,,,,SSP2_v9_130325 +SSP3,SSP_SCENARIO,value,,,,,,SSP3_v9_130325 +SSP4,SSP_SCENARIO,value,,,,,,SSP4_v9_130325 +SSP5,SSP_SCENARIO,value,,,,,,SSP5_v9_130325 +SSP1,TECHNOLOGY_CHANGE_ANNUAL_RATE,beta,-0.004,0.008,0.003,0.005,0.007, +SSP2,TECHNOLOGY_CHANGE_ANNUAL_RATE,beta,-0.004,0.008,0.001,0.002,0.003, +SSP3,TECHNOLOGY_CHANGE_ANNUAL_RATE,beta,-0.004,0.008,-0.001,0,0.001, +SSP4,TECHNOLOGY_CHANGE_ANNUAL_RATE,beta,-0.004,0.008,0,0.002,0.005, +SSP5,TECHNOLOGY_CHANGE_ANNUAL_RATE,beta,-0.004,0.008,0.002,0.004,0.005, +SSP1,TRADE_BARRIERS_MULTIPLIER,beta,0,2,0.6,0.8,1, +SSP2,TRADE_BARRIERS_MULTIPLIER,beta,0,2,0.8,1,1.2, +SSP3,TRADE_BARRIERS_MULTIPLIER,beta,0,2,1.2,1.5,1.8, +SSP4,TRADE_BARRIERS_MULTIPLIER,beta,0,2,1,1.2,1.5, +SSP5,TRADE_BARRIERS_MULTIPLIER,beta,0,2,0.3,0.6,0.8, +SSP1,TRANSPORT_COST,beta,0.01,0.09,0.05,0.065,0.08, +SSP2,TRANSPORT_COST,beta,0.01,0.09,0.04,0.05,0.06, +SSP3,TRANSPORT_COST,beta,0.01,0.09,0.02,0.04,0.06, +SSP4,TRANSPORT_COST,beta,0.01,0.09,0.04,0.06,0.08, +SSP5,TRANSPORT_COST,beta,0.01,0.09,0.02,0.035,0.05, +SSP1,RCP,rcp,,,,,,ssp1 +SSP2,RCP,rcp,,,,,,ssp2 +SSP3,RCP,rcp,,,,,,ssp3 +SSP4,RCP,rcp,,,,,,ssp4 +SSP5,RCP,rcp,,,,,,ssp5 +SSP1,BIOENERGY_DEMAND_SCENARIO,value,,,,,,ssp1 +SSP2,BIOENERGY_DEMAND_SCENARIO,value,,,,,,ssp2 +SSP3,BIOENERGY_DEMAND_SCENARIO,value,,,,,,ssp3 +SSP4,BIOENERGY_DEMAND_SCENARIO,value,,,,,,ssp4 +SSP5,BIOENERGY_DEMAND_SCENARIO,value,,,,,,ssp5 +SSP1,YIELD_DIR_TOP,value,,,,,,ssp1 +SSP2,YIELD_DIR_TOP,value,,,,,,ssp2 +SSP3,YIELD_DIR_TOP,value,,,,,,ssp3 +SSP4,YIELD_DIR_TOP,value,,,,,,ssp4 +SSP5,YIELD_DIR_TOP,value,,,,,,ssp5 +SSP1,BIOENERGY_FUTURE_DEMAND_FILENAME,value,,,,,,bioenergy_scenario_data.csv +SSP2,BIOENERGY_FUTURE_DEMAND_FILENAME,value,,,,,,bioenergy_scenario_data.csv +SSP3,BIOENERGY_FUTURE_DEMAND_FILENAME,value,,,,,,bioenergy_scenario_data.csv +SSP4,BIOENERGY_FUTURE_DEMAND_FILENAME,value,,,,,,bioenergy_scenario_data.csv +SSP5,BIOENERGY_FUTURE_DEMAND_FILENAME,value,,,,,,bioenergy_scenario_data.csv +SSP1,SHOCKS_POSSIBLE,value,,,,,,TRUE +SSP2,SHOCKS_POSSIBLE,value,,,,,,TRUE +SSP3,SHOCKS_POSSIBLE,value,,,,,,TRUE +SSP4,SHOCKS_POSSIBLE,value,,,,,,TRUE +SSP5,SHOCKS_POSSIBLE,value,,,,,,TRUE +SSP1,CEREALS_SUB_PROPORTION,unif,0.15,0.45,,,, +SSP2,CEREALS_SUB_PROPORTION,unif,0.15,0.45,,,, +SSP3,CEREALS_SUB_PROPORTION,unif,0.15,0.45,,,, +SSP4,CEREALS_SUB_PROPORTION,unif,0.15,0.45,,,, +SSP5,CEREALS_SUB_PROPORTION,unif,0.15,0.45,,,, +SSP1,PULSES_SUB_PROPORTION,unif,0.175,0.525,,,, +SSP2,PULSES_SUB_PROPORTION,unif,0.175,0.525,,,, +SSP3,PULSES_SUB_PROPORTION,unif,0.175,0.525,,,, +SSP4,PULSES_SUB_PROPORTION,unif,0.175,0.525,,,, +SSP5,PULSES_SUB_PROPORTION,unif,0.175,0.525,,,, +SSP1,OILCROPS_SUB_PROPORTION,unif,0.025,0.075,,,, +SSP2,OILCROPS_SUB_PROPORTION,unif,0.025,0.075,,,, +SSP3,OILCROPS_SUB_PROPORTION,unif,0.025,0.075,,,, +SSP4,OILCROPS_SUB_PROPORTION,unif,0.025,0.075,,,, +SSP5,OILCROPS_SUB_PROPORTION,unif,0.025,0.075,,,, +SSP1,STARCHY_ROOTS_SUB_PROPORTION,unif,0.15,0.45,,,, +SSP2,STARCHY_ROOTS_SUB_PROPORTION,unif,0.15,0.45,,,, +SSP3,STARCHY_ROOTS_SUB_PROPORTION,unif,0.15,0.45,,,, +SSP4,STARCHY_ROOTS_SUB_PROPORTION,unif,0.15,0.45,,,, +SSP5,STARCHY_ROOTS_SUB_PROPORTION,unif,0.15,0.45,,,, +SSP1,ORIG_LEAST_COST_MIN,value,,,,,,FALSE +SSP2,ORIG_LEAST_COST_MIN,value,,,,,,FALSE +SSP3,ORIG_LEAST_COST_MIN,value,,,,,,FALSE +SSP4,ORIG_LEAST_COST_MIN,value,,,,,,FALSE +SSP5,ORIG_LEAST_COST_MIN,value,,,,,,FALSE diff --git a/data/sims/shocks_sims.csv b/data/sims/shocks_sims.csv new file mode 100644 index 0000000000000000000000000000000000000000..d94b701b01321bb8415c4e21d1696c784a3454d7 --- /dev/null +++ b/data/sims/shocks_sims.csv @@ -0,0 +1,51 @@ +Ensemble,Scenario,AGRI_LAND_EXPANSION_COST_FACTOR,ANNUAL_MAX_IMPORT_CHANGE,BIOENERGY_DEMAND_SHIFT,CROP_TO_PASTURE_COST_FACTOR,FERTILISER_COST_PER_T,INITIAL_PRICE_SHIFT,IRRIG_COST_SCALE_FACTOR,IRRIGATION_EFFICIENCY,LAND_CHANGE_COST,MARKET_LAMBA,MEAT_EFFICIENCY,MIN_NATURAL_RATE,OTHER_INTENSITY_COST,PASTURE_HARVEST_FRACTION,SSP_GDP_PC_FACTOR,SSP_POPULATION_FACTOR,SSP_SCENARIO,TECHNOLOGY_CHANGE_ANNUAL_RATE,TRADE_BARRIERS_MULTIPLIER,TRANSPORT_COST,RCP,BIOENERGY_FUTURE_DEMAND_FILENAME,SHOCKS_POSSIBLE,CEREALS_SUB_PROPORTION,PULSES_SUB_PROPORTION,OILCROPS_SUB_PROPORTION,STARCHY_ROOTS_SUB_PROPORTION,ORIG_LEAST_COST_MIN,YIELD_DIR_TOP,BIOENERGY_DEMAND_SCENARIO +shocks/SSP1,s1,1.30660468251533,0.0228770160929893,1,1,1.95478849592337,1,0.000390070160965327,0.543143007232545,0.273082824305185,0.4,1.01533023412577,0.195035080482664,0.792464749320561,0.5,1,1,SSP1_v9_130325,0.0043697548242007,0.804684232679383,0.0625529531354358,rcp45,bioenergy_scenario_data.csv,TRUE,0.3,0.35,0.05,0.3,FALSE,rcp45,SSP1_RCP45 +shocks/SSP1,s2,1.54790984303127,0.0214839384786384,1.05,0.9,2.11331205428652,0.9,0.000439712506444229,0.522883961636984,0.260497349959828,0.45,1.00172299275499,0.219856253222114,0.762938815233838,0.55,0.95,1.05,SSP1_v9_130325,0.00284782774978011,0.892981559287351,0.0534306136855851,rcp60,bioenergy_scenario_data.csv,TRUE,0.340909090909091,0.397727272727273,0.0568181818181818,0.204545454545455,FALSE,rcp60,SSP1_RCP60 +shocks/SSP1,s3,1.03445985509982,0.0242169546991675,0.95,1.1,1.77763289140303,1.1,0.000336454765220775,0.560804997269742,0.284824516367045,0.35,1.02739549215156,0.168227382610388,0.818885342381086,0.45,1.05,0.95,SSP1_v9_130325,0.00567673525237017,0.718456680365365,0.0707791804420796,rcp45,bioenergy_scenario_data.csv,TRUE,0.25,0.291666666666667,0.0416666666666667,0.416666666666667,FALSE,rcp45,SSP1_RCP45 +shocks/SSP1,s4,1.18011203692493,0.0222238146836663,1.025,0.85,2.21138114822018,1.15,0.000297658154750587,0.55187750477836,0.251190281847944,0.475,1.00900560184625,0.207081890146159,0.740803236535345,0.475,1.025,0.925,SSP1_v9_130325,0.00366905314915087,0.763628922290554,0.0757348286419711,rcp60,bioenergy_scenario_data.csv,TRUE,0.44,0.326666666666667,0.0333333333333333,0.2,FALSE,rcp60,SSP1_RCP60 +shocks/SSP1,s5,1.68712459733118,0.0251160485505954,0.925,1.05,1.87306648304096,0.95,0.000414163780292317,0.507738565320178,0.278743046214026,0.375,1.03435622986656,0.148829077375294,0.805387725330027,0.575,0.925,1.025,SSP1_v9_130325,0.00641323525127281,0.955955002707142,0.0583130649033555,rcp45,bioenergy_scenario_data.csv,TRUE,0.230769230769231,0.423076923076923,0.0494505494505494,0.296703296703297,FALSE,rcp45,SSP1_RCP45 +shocks/SSP1,s6,1.42608431668559,0.020484656645973,0.975,0.95,1.64481941921207,1.05,0.000471149717022949,0.571197905518257,0.267233889736522,0.325,0.992019633340972,0.182541367124365,0.77884441384016,0.525,1.075,1.075,SSP1_v9_130325,0.00172654612000884,0.846202333458787,0.0665902063269412,rcp45,bioenergy_scenario_data.csv,TRUE,0.205479452054795,0.431506849315068,0.0753424657534247,0.287671232876712,FALSE,rcp45,SSP1_RCP45 +shocks/SSP1,s7,0.840392666819443,0.0235183190940216,1.075,1.15,2.03232635198016,0.85,0.000365082734248729,0.533822367498968,0.292533770487903,0.425,1.02130421583428,0.235574858511474,0.83523019137003,0.425,0.975,0.975,SSP1_v9_130325,0.00502166031087259,0.659406330981701,0.0468469071878789,rcp60,bioenergy_scenario_data.csv,TRUE,0.333333333333333,0.216049382716049,0.0432098765432099,0.407407407407407,FALSE,rcp60,SSP1_RCP60 +shocks/SSP1,s8,0.947079413058987,0.0218711945581873,0.9625,1.075,1.99362745293572,0.875,0.000266547291002851,0.578207463425012,0.256377522723662,0.3125,1.02430218052628,0.227088490947081,0.798937908822619,0.5375,0.9375,1.0375,SSP1_v9_130325,0.00083953812772664,0.613112316714834,0.0730918071675773,rcp60,bioenergy_scenario_data.csv,TRUE,0.284810126582278,0.420886075949367,0.0474683544303797,0.246835443037975,FALSE,rcp60,SSP1_RCP60 +shocks/SSP1,s9,1.48604361052557,0.0246241323378201,1.0625,0.875,1.53497915088738,1.075,0.000402092805288833,0.538606920741212,0.28168325290689,0.4125,0.997353970652949,0.175733923722865,0.722496525147897,0.4375,1.0375,0.9375,SSP1_v9_130325,0.0046985541914294,0.82513042147288,0.0559918173191546,rcp45,bioenergy_scenario_data.csv,TRUE,0.379120879120879,0.211538461538462,0.0631868131868132,0.346153846153846,FALSE,rcp45,SSP1_RCP45 +shocks/SSP1,s10,1.7775717843041,0.0196770094284043,1.0125,1.175,1.82793270700347,0.975,0.000454176981894161,0.556262112241531,0.270217915435747,0.4625,1.03887858921521,0.133273645501426,0.826440118671977,0.4875,0.9875,0.9875,SSP1_v9_130325,0.00328017089364283,0.921083111431939,0.0645757939740144,rcp45,bioenergy_scenario_data.csv,TRUE,0.39041095890411,0.35958904109589,0.0650684931506849,0.184931506849315,FALSE,rcp45,SSP1_RCP45 +shocks/SSP2,s1,1,0.02,1,1,1.4,1,3e-04,0.5,0.2,0.4,1,0.102766896900118,0.7,0.5,1,1,SSP2_v9_130325,0.002,1,0.05,rcp60,bioenergy_scenario_data.csv,TRUE,0.3,0.35,0.05,0.3,FALSE,rcp60,SSP2_RCP60 +shocks/SSP2,s2,1.08270938702243,0.0187532681030967,1.05,0.9,1.52467318969033,0.9,0.000342014778383574,0.491729061297757,0.189688362297416,0.45,0.995864530648878,0.122695883337939,0.679221135051611,0.55,0.95,1.05,SSP2_v9_130325,0.00158753449189663,1.08270938702243,0.0458442270103222,rcp60,bioenergy_scenario_data.csv,TRUE,0.340909090909091,0.397727272727273,0.0568181818181818,0.204545454545455,FALSE,rcp60,SSP2_RCP60 +shocks/SSP2,s3,0.91729061297757,0.0212467318969033,0.95,1.1,1.27532681030967,1.1,0.000257985221616426,0.508270938702243,0.210311637702584,0.35,1.00413546935112,0.0840110432944513,0.720778864948389,0.45,1.05,0.95,SSP2_v9_130325,0.00241246550810337,0.91729061297757,0.0541557729896778,rcp60,bioenergy_scenario_data.csv,TRUE,0.25,0.291666666666667,0.0416666666666667,0.416666666666667,FALSE,rcp60,SSP2_RCP60 +shocks/SSP2,s4,0.960874657414893,0.0194097808551165,1.025,0.85,1.61153483560056,1.15,0.000229015531982238,0.503912534258511,0.182453074797474,0.475,0.998043732870745,0.112067534446962,0.664744194066573,0.475,1.025,0.925,SSP2_v9_130325,0.00180496552244993,0.960874657414893,0.0570511611866855,rcp85,bioenergy_scenario_data.csv,TRUE,0.44,0.326666666666667,0.0333333333333333,0.2,FALSE,rcp85,SSP2_RCP85 +shocks/SSP2,s5,1.14060088096457,0.0221153483560056,0.925,1.05,1.34097808551165,0.95,0.000319925055308764,0.485939911903543,0.204875861938752,0.375,1.00703004404823,0.0717421347364521,0.709836985748058,0.575,0.925,1.025,SSP2_v9_130325,0.00270187700810103,1.14060088096457,0.0480326028503884,rcp60,bioenergy_scenario_data.csv,TRUE,0.230769230769231,0.423076923076923,0.0494505494505494,0.296703296703297,FALSE,rcp60,SSP2_RCP60 +shocks/SSP2,s6,1.03912534258511,0.0178846516439944,0.975,0.95,1.18846516439944,1.05,0.000370984468017762,0.514060088096457,0.195124138061248,0.325,0.992969955951772,0.0937292467329929,0.690163014251942,0.525,1.075,1.075,SSP2_v9_130325,0.00129812299189897,1.03912534258511,0.0519673971496117,rcp60,bioenergy_scenario_data.csv,TRUE,0.205479452054795,0.431506849315068,0.0753424657534247,0.287671232876712,FALSE,rcp60,SSP2_RCP60 +shocks/SSP2,s7,0.859399119035433,0.0205902191448835,1.075,1.15,1.45902191448835,0.85,0.000280074944691236,0.496087465741489,0.217546925202526,0.425,1.00195626712926,0.13716683564989,0.735255805933427,0.425,0.975,0.975,SSP2_v9_130325,0.00219503447755007,0.859399119035433,0.0429488388133145,rcp60,bioenergy_scenario_data.csv,TRUE,0.333333333333333,0.216049382716049,0.0432098765432099,0.407407407407407,FALSE,rcp60,SSP2_RCP60 +shocks/SSP2,s8,0.891349695386158,0.0190953765627878,0.9625,1.075,1.42915219840989,0.875,0.000206379438102187,0.518678231924779,0.186448969904585,0.3125,1.00299925739028,0.129136314317571,0.704858699734982,0.5375,0.9375,1.0375,SSP2_v9_130325,0.00106646891392977,0.813217680752207,0.0554552181300731,rcp85,bioenergy_scenario_data.csv,TRUE,0.284810126582278,0.420886075949367,0.0474683544303797,0.246835443037975,FALSE,rcp85,SSP2_RCP85 +shocks/SSP2,s9,1.05998514780556,0.0216365654390219,1.0625,0.875,1.11961312890323,1.075,0.000309845153366947,0.498067840937043,0.207476646078755,0.4125,0.994567484769308,0.0890295783085543,0.653268854817205,0.4375,1.0375,0.9375,SSP2_v9_130325,0.00209630682320497,1.01932159062957,0.0469845885426258,rcp60,bioenergy_scenario_data.csv,TRUE,0.379120879120879,0.211538461538462,0.0631868131868132,0.346153846153846,FALSE,rcp60,SSP2_RCP60 +shocks/SSP2,s10,1.18678231924779,0.0171961312890323,1.0125,1.175,1.30953765627878,0.975,0.00035506220712875,0.505998514780556,0.197592329419876,0.4625,1.00933911596239,0.0625340908685169,0.727276090650366,0.4875,0.9875,0.9875,SSP2_v9_130325,0.00170093415684978,1.10865030461384,0.0509717399469965,rcp60,bioenergy_scenario_data.csv,TRUE,0.39041095890411,0.35958904109589,0.0650684931506849,0.184931506849315,FALSE,rcp60,SSP2_RCP60 +shocks/SSP3,s1,0.52024973082015,0.0144521138994884,1,1,1.24996893009364,1,0.000181512340250704,0.456856935948328,0.2,0.4,1,0.0445126831921568,0.663245104481559,0.5,1,1,SSP3_v9_130325,3.69271604227922e-05,1.43143007232545,0.0426490208963119,rcp60,bioenergy_scenario_data.csv,TRUE,0.3,0.35,0.05,0.3,FALSE,rcp60,SSP3_RCP60 +shocks/SSP3,s2,0.626836319372511,0.0128668802502573,1.05,0.9,1.71576868292866,0.9,0.000257608797012638,0.439195017296463,0.178992610808213,0.45,0.991499566495146,0.057952756518755,0.609099799539873,0.55,0.95,1.05,SSP3_v9_130325,-0.000403161804191794,1.60804997269742,0.0318199599079746,rcp85,bioenergy_scenario_data.csv,TRUE,0.340909090909091,0.397727272727273,0.0568181818181818,0.204545454545455,FALSE,rcp85,SSP3_RCP85 +shocks/SSP3,s3,0.42240292862359,0.0162236675874247,0.95,1.1,0.81494452402692,1.1,0.000116163234931558,0.477115892757839,0.221007389191787,0.35,1.00850043350485,0.0330090823549182,0.721568949329571,0.45,1.05,0.95,SSP3_v9_130325,0.000493430076903505,1.22883961636984,0.0543137898659143,rcp60,bioenergy_scenario_data.csv,TRUE,0.25,0.291666666666667,0.0416666666666667,0.416666666666667,FALSE,rcp60,SSP3_RCP60 +shocks/SSP3,s4,0.472828658836114,0.0136767363178329,1.025,0.85,2.00628515703454,1.15,7.93381979158249e-05,0.466177534970001,0.164507765991119,0.475,0.995961271646254,0.0506301059058289,0.576813814608971,0.475,1.025,0.925,SSP3_v9_130325,-0.000173264707884575,1.33822367498968,0.0622443170156101,rcp85,bioenergy_scenario_data.csv,TRUE,0.44,0.326666666666667,0.0333333333333333,0.2,FALSE,rcp85,SSP3_RCP85 +shocks/SSP3,s5,0.706212456808112,0.0175518005237929,0.925,1.05,1.03427294323604,0.95,0.000216547471988307,0.428802142902719,0.209962527654382,0.375,1.01429697586053,0.0261085152314528,0.690726165466602,0.575,0.925,1.025,SSP3_v9_130325,0.000823126072871327,1.71197905518257,0.0373432953175058,rcp60,bioenergy_scenario_data.csv,TRUE,0.230769230769231,0.423076923076923,0.0494505494505494,0.296703296703297,FALSE,rcp60,SSP3_RCP60 +shocks/SSP3,s6,0.569627876199485,0.0118861903281928,0.975,0.95,0.575006888801793,1.05,0.000313672946680845,0.492261225015423,0.190037472345618,0.325,0.985703024139469,0.0388290458435607,0.636716476587529,0.525,1.075,1.075,SSP3_v9_130325,-0.00070170222053337,1.5187750477836,0.0481452330933205,rcp45,bioenergy_scenario_data.csv,TRUE,0.205479452054795,0.431506849315068,0.0753424657534247,0.287671232876712,FALSE,rcp45,SSP3_RCP45 +shocks/SSP3,s7,0.35950033211296,0.0152693329537884,1.075,1.15,1.47281094120852,0.85,0.000148917022380211,0.448122475133549,0.235492234008881,0.425,1.00403872835375,0.0684984107814919,0.761221585078051,0.425,0.975,0.975,SSP3_v9_130325,0.000250787709514898,1.07738565320178,0.0253627629217942,rcp60,bioenergy_scenario_data.csv,TRUE,0.333333333333333,0.216049382716049,0.0432098765432099,0.407407407407407,FALSE,rcp60,SSP3_RCP60 +shocks/SSP3,s8,0.393630352957537,0.0132817729600999,0.9625,1.075,1.35981822722675,0.875,5.57880317639894e-05,0.504575935346175,0.172468896435625,0.3125,1.00618145203469,0.0625634106275243,0.676741762503836,0.5375,0.9375,1.0375,SSP3_v9_130325,-0.000934322350810428,0.95423807573882,0.0579273940735087,rcp85,bioenergy_scenario_data.csv,TRUE,0.284810126582278,0.420886075949367,0.0474683544303797,0.246835443037975,FALSE,rcp85,SSP3_RCP85 +shocks/SSP3,s9,0.596725537287047,0.0168110877200933,1.0625,0.875,0.432703060835255,1.075,0.000198549210969431,0.452464080654622,0.215259115964058,0.4125,0.988879099276111,0.0359763457745679,0.555379009321426,0.4375,1.0375,0.9375,SSP3_v9_130325,0.000142076929961531,1.47535881251776,0.0346392703707599,rcp60,bioenergy_scenario_data.csv,TRUE,0.379120879120879,0.211538461538462,0.0631868131868132,0.346153846153846,FALSE,rcp60,SSP3_RCP60 +shocks/SSP3,s10,0.772118515732619,0.0111863738577089,1.0125,1.175,0.925831345256541,0.975,0.000282646540713303,0.471349162143331,0.195077423316527,0.4625,1.01875730938355,0.0212752105246864,0.739636970367543,0.4875,0.9875,0.9875,SSP3_v9_130325,-0.000283850702175425,1.65677298115535,0.0453483525007672,rcp60,bioenergy_scenario_data.csv,TRUE,0.39041095890411,0.35958904109589,0.0650684931506849,0.184931506849315,FALSE,rcp60,SSP3_RCP60 +shocks/SSP4,s1,0.811640789284124,0.0171229837882688,1,1,1.62052874275472,1,3e-04,0.5,0.223224848256224,0.4,1,0.0617946629980457,0.73675479045912,0.5,1,1,SSP4_v9_130325,0.002,1.18835921530899,0.057350958091824,rcp60,bioenergy_scenario_data.csv,TRUE,0.3,0.35,0.05,0.3,FALSE,rcp60,SSP4_RCP60 +shocks/SSP4,s2,0.950913447119588,0.0157830458101546,1.05,0.9,1.94540176353163,0.9,0.000392219996545916,0.47825814477904,0.200109409407399,0.45,0.991499566495146,0.0721511689357051,0.678430727670076,0.55,0.95,1.05,SSP4_v9_130325,0.00115970443232851,1.32271087533741,0.0456861455340151,rcp60,bioenergy_scenario_data.csv,TRUE,0.340909090909091,0.397727272727273,0.0568181818181818,0.204545454545455,FALSE,rcp60,SSP4_RCP60 +shocks/SSP4,s3,0.677289103652929,0.0185160607259331,0.95,1.1,1.27058436602045,1.1,0.000207780003454084,0.52174185522096,0.245602104047409,0.35,1.00850043350485,0.0522332070850587,0.790900293921938,0.45,1.05,0.95,SSP4_v9_130325,0.00284029556767149,1.04908658487231,0.0681800587843877,rcp45,bioenergy_scenario_data.csv,TRUE,0.25,0.291666666666667,0.0416666666666667,0.416666666666667,FALSE,rcp45,SSP4_RCP45 +shocks/SSP4,s4,0.747317644437761,0.0164816810924002,1.025,0.85,2.13911822036366,1.15,0.000149872893774089,0.510368611745326,0.18380421752541,0.475,0.995961271646254,0.0665930165455536,0.638777971110566,0.475,1.025,0.925,SSP4_v9_130325,0.00160149889382473,1.12293272169141,0.0746372740121221,rcp60,bioenergy_scenario_data.csv,TRUE,0.44,0.326666666666667,0.0333333333333333,0.2,FALSE,rcp60,SSP4_RCP60 +shocks/SSP4,s5,1.04992250232152,0.0195153420744095,0.925,1.05,1.45564174279705,0.95,0.000344420554391967,0.463759734884964,0.233937129448582,0.375,1.01429697586053,0.0460025680312655,0.763283519442843,0.575,0.925,1.025,SSP4_v9_130325,0.00341968936035525,1.41248926790519,0.0518547247599017,rcp60,bioenergy_scenario_data.csv,TRUE,0.230769230769231,0.423076923076923,0.0494505494505494,0.296703296703297,FALSE,rcp60,SSP4_RCP60 +shocks/SSP4,s6,0.877067295765406,0.014883952352434,0.975,0.95,1.0326678266634,1.05,0.000450127106225911,0.536240265115036,0.212346886972287,0.325,0.985703024139469,0.0571740490794656,0.709273623799508,0.525,1.075,1.075,SSP4_v9_130325,0.000580310639644753,1.25268234769637,0.0626567038885685,rcp45,bioenergy_scenario_data.csv,TRUE,0.205479452054795,0.431506849315068,0.0753424657534247,0.287671232876712,FALSE,rcp45,SSP4_RCP45 +shocks/SSP4,s7,0.58751069527749,0.0177761848815033,1.075,1.15,1.77970111665706,0.85,0.000255579445608033,0.489631388254674,0.260527881418834,0.425,1.00403872835375,0.0798896931694546,0.82318637006061,0.425,0.975,0.975,SSP4_v9_130325,0.00239850110617527,0.950077548783454,0.0377555942221132,rcp60,bioenergy_scenario_data.csv,TRUE,0.333333333333333,0.216049382716049,0.0432098765432099,0.407407407407407,FALSE,rcp60,SSP4_RCP60 +shocks/SSP4,s8,0.63656265300707,0.0161451239025991,0.9625,1.075,1.70010973398956,0.875,0.000110146094662154,0.547056058716041,0.192800029046496,0.3125,1.00618145203469,0.075567884872693,0.750018288998261,0.5375,0.9375,1.0375,SSP4_v9_130325,0.00012758876204373,0.870914911636531,0.0712118788776287,rcp85,bioenergy_scenario_data.csv,TRUE,0.284810126582278,0.420886075949367,0.0474683544303797,0.246835443037975,FALSE,rcp85,SSP4_RCP85 +shocks/SSP4,s9,0.912306235156161,0.0189617450307193,1.0625,0.875,0.857329300359078,1.075,0.000322023747407471,0.494870514918668,0.239559992470989,0.4125,0.988879099276111,0.0547823376612273,0.60955488339318,0.4375,1.0375,0.9375,SSP4_v9_130325,0.00219690306733894,1.22027912056015,0.0488966261241963,rcp60,bioenergy_scenario_data.csv,TRUE,0.379120879120879,0.211538461538462,0.0631868131868132,0.346153846153846,FALSE,rcp60,SSP4_RCP60 +shocks/SSP4,s10,1.12908515409343,0.0141930803193253,1.0125,1.175,1.36689878372589,0.975,0.000419131787359978,0.515846543233086,0.217869810476089,0.4625,1.01875730938355,0.0413016340925494,0.806059394388144,0.4875,0.9875,0.9875,SSP4_v9_130325,0.00138963536143769,1.36343731863701,0.0600036577996521,rcp45,bioenergy_scenario_data.csv,TRUE,0.39041095890411,0.35958904109589,0.0650684931506849,0.184931506849315,FALSE,rcp45,SSP4_RCP45 +shocks/SSP5,s1,0.811640789284124,0.0255478849592337,1,1,0.926049361002817,1,0.000181512340250704,0.518835921530899,0.154964919394384,0.4,1.00976578836866,0.0445126831921568,0.607535231658141,0.5,1,1,SSP5_v9_130325,0.00396307283703912,0.635905109239572,0.0374470532300597,rcp85,bioenergy_scenario_data.csv,TRUE,0.3,0.35,0.05,0.3,FALSE,rcp85,SSP5_RCP85 +shocks/SSP5,s2,0.950913447119588,0.0237763289140303,1.05,0.9,1.23043518805055,0.9,0.000257608797012638,0.504908658487231,0.130143746947899,0.45,1.00535092206312,0.057952756518755,0.581114670837621,0.55,0.95,1.05,SSP5_v9_130325,0.00350656990464916,0.803172883434773,0.0292208157420578,rcp85,bioenergy_scenario_data.csv,TRUE,0.340909090909091,0.397727272727273,0.0568181818181818,0.204545454545455,FALSE,rcp85,SSP5_RCP85 +shocks/SSP5,s3,0.677289103652929,0.0271331205428652,0.95,1.1,0.664652939726232,1.1,0.000116163234931558,0.532271087533741,0.181772616931047,0.35,1.01407716596062,0.0330090823549182,0.637061126457078,0.45,1.05,0.95,SSP5_v9_130325,0.00440316181646114,0.483175490607284,0.0465694046538295,rcp60,bioenergy_scenario_data.csv,TRUE,0.25,0.291666666666667,0.0416666666666667,0.416666666666667,FALSE,rcp60,SSP5_RCP60 +shocks/SSP5,s4,0.747317644437761,0.0247306648304096,1.025,0.85,1.45469178672338,1.15,7.93381979158249e-05,0.525268234769637,0.114425141818419,0.475,1.00768988334135,0.0506301059058289,0.564769838803214,0.475,1.025,0.925,SSP5_v9_130325,0.00374921228054304,0.561543291189036,0.0531531191676086,rcp85,bioenergy_scenario_data.csv,TRUE,0.44,0.326666666666667,0.0333333333333333,0.2,FALSE,rcp85,SSP5_RCP85 +shocks/SSP5,s5,1.04992250232152,0.0281138114822018,0.925,1.05,0.795668089520843,0.95,0.000216547471988307,0.495007754878345,0.167458632596606,0.375,1.01702968341419,0.0261085152314528,0.621155549229806,0.575,0.925,1.025,SSP5_v9_130325,0.00470170224237687,0.92597876013111,0.0334097948543317,rcp60,bioenergy_scenario_data.csv,TRUE,0.230769230769231,0.423076923076923,0.0494505494505494,0.296703296703297,FALSE,rcp60,SSP5_RCP60 +shocks/SSP5,s6,0.877067295765406,0.0224481941921206,0.975,0.95,0.5173527916633,1.05,0.000313672946680845,0.541248926790519,0.142918109877283,0.325,1.00220224990988,0.0388290458435607,0.594612271963882,0.525,1.075,1.075,SSP5_v9_130325,0.00317687389702778,0.713535210739204,0.0416869470585662,rcp60,bioenergy_scenario_data.csv,TRUE,0.205479452054795,0.431506849315068,0.0753424657534247,0.287671232876712,FALSE,rcp60,SSP5_RCP60 +shocks/SSP5,s7,0.58751069527749,0.0263232635198016,1.075,1.15,1.06618988795323,0.85,0.000148917022380211,0.512293272169141,0.201170921929993,0.425,1.0118185538767,0.0684984107814919,0.659196675396549,0.425,0.975,0.975,SSP5_v9_130325,0.00417326471250381,0.387371373137462,0.0242651625750109,rcp85,bioenergy_scenario_data.csv,TRUE,0.333333333333333,0.216049382716049,0.0432098765432099,0.407407407407407,FALSE,rcp85,SSP5_RCP85 +shocks/SSP5,s8,0.63656265300707,0.0242793270700347,0.9625,1.075,0.994196843877722,0.875,5.57880317639894e-05,0.548097210546723,0.122911509299956,0.3125,1.01290330152184,0.0625634106275243,0.614178583117231,0.5375,0.9375,1.0375,SSP5_v9_130325,0.00290758694314781,0.318435110768064,0.0495172071217179,rcp85,bioenergy_scenario_data.csv,TRUE,0.284810126582278,0.420886075949367,0.0474683544303797,0.246835443037975,FALSE,rcp85,SSP5_RCP85 +shocks/SSP5,s9,0.912306235156161,0.0275864071203186,1.0625,0.875,0.423152127055958,1.075,0.000198549210969431,0.515617011061736,0.174266075912534,0.4125,1.00394584446383,0.0359763457745679,0.553106230961815,0.4375,1.0375,0.9375,SSP5_v9_130325,0.00406732813461995,0.673867127371789,0.0313602797328327,rcp60,bioenergy_scenario_data.csv,TRUE,0.379120879120879,0.211538461538462,0.0631868131868132,0.346153846153846,FALSE,rcp60,SSP5_RCP60 +shocks/SSP5,s10,1.12908515409343,0.0213497915088738,1.0125,1.175,0.730943888305931,0.975,0.000282646540713303,0.528643312224093,0.14895359730641,0.4625,1.01934438411581,0.0212752105246864,0.646851462001555,0.4875,0.9875,0.9875,SSP5_v9_130325,0.00363366757352137,0.85777615593929,0.0395194273741454,rcp60,bioenergy_scenario_data.csv,TRUE,0.39041095890411,0.35958904109589,0.0650684931506849,0.184931506849315,FALSE,rcp60,SSP5_RCP60 diff --git a/scripts/createScenarios.sh b/scripts/createScenarios.sh index a3dbec07c91240e62201d6bb866711d22f3626ce..5f859d1d8669ad75e94acb5d2f7aaecb28bcf17f 100755 --- a/scripts/createScenarios.sh +++ b/scripts/createScenarios.sh @@ -45,8 +45,14 @@ do do echo "${header[index]}"="${array[index]}" >> $config_file done - + echo "$scenario generated" fi + done < $filename +echo "Running R shock script" + module load R + R < /exports/csce/eddie/geos/groups/LURG/models/PLUM/plumv2/scripts/createShockFiles.R --no-save --args $1 + + diff --git a/scripts/createShockFiles.R b/scripts/createShockFiles.R new file mode 100644 index 0000000000000000000000000000000000000000..a831a3411b3ba905b96bb94adefac5e2c2901b5c --- /dev/null +++ b/scripts/createShockFiles.R @@ -0,0 +1,135 @@ +# TODO: Add comment +# +# Author: rhenry2 +############################################################################### +library(data.table) + +createShockFile = function(scenario){ + +#setting all parameters to default values. If parameters are changed according to ssp then pull value from samp table, if not +#set as default same as in config file or to a value that makes no change + + paramValues = data.table(Year = seq(2010,2100,1), + trendYearValue = c(rep(0,16),seq(0.2,1,0.2),rep(1,70)), + TRADE_BARRIERS_MULTIPLIER =scenario[,TRADE_BARRIERS_MULTIPLIER], + TRANSPORT_COST = scenario[,TRANSPORT_COST], + TECHNOLOGY_CHANGE_ANNUAL_RATE = scenario[,TECHNOLOGY_CHANGE_ANNUAL_RATE], + MEAT_EFFICIENCY = scenario[,MEAT_EFFICIENCY], + FERTILISER_COST_PER_T=scenario[,FERTILISER_COST_PER_T], + OTHER_INTENSITY_COST = scenario[,OTHER_INTENSITY_COST], + TRANSPORT_LOSSES = 0.05, + IRRIG_COST_MULTIPLIER = 1.0, + RUMINANT_CHANGE_ANNUAL_RATE = 0.0, + MONOGASTRIC_CHANGE_ANNUAL_RATE = 0.0, + IRRIG_EFF_MULTIPLIER = 1.0, + FINANCIAL_SPECULATION_MULTIPLIER = 1.0) + + paramValues[, names(paramValues) := lapply(.SD, as.numeric)] + + shocksHappen = data.table(SSP_Scenario = scenario[,SSP_SCENARIO], Scenario = scenario[,Scenario], Year = seq(2010,2100,1), + climate =as.logical(rbinom(91,size=1,prob = shockProbs[ssp == substr(scenario[,SSP_SCENARIO],1,4),climate])), + cyber=as.logical(rbinom(91,size=1,prob = shockProbs[ssp == substr(scenario[,SSP_SCENARIO],1,4),cyber])), + financial =as.logical(rbinom(91,size=1,prob = shockProbs[ssp == substr(scenario[,SSP_SCENARIO],1,4),financial]))) + + shockValues = data.table(Year = rep(seq(2010,2100,1),6),shock = rep(c("protectionism","automation","diet","cyber","climate","financial"), each=91), + TRADE_BARRIERS_MULTIPLIER = 0, + TRANSPORT_COST = 0, + TECHNOLOGY_CHANGE_ANNUAL_RATE = 0, + MEAT_EFFICIENCY = 0, + FERTILISER_COST_PER_T=0, + OTHER_INTENSITY_COST = 0, + TRANSPORT_LOSSES = 0, + IRRIG_COST_MULTIPLIER = 0, + RUMINANT_CHANGE_ANNUAL_RATE = 0, + MONOGASTRIC_CHANGE_ANNUAL_RATE = 0, + IRRIG_EFF_MULTIPLIER = 0, + FINANCIAL_SPECULATION_MULTIPLIER = 0) + + for (trendType in c("protectionism", "automation", "diet")){ + if(as.logical(rbinom(1,size=1,prob =shockProbs[ssp == substr(scenario[,SSP_SCENARIO],1,4),get(trendType)]))){ + for(paramName in shockDistFile[shock == trendType]$pname){ + + randomValue = drawValue(trendType, paramName) + #put in records table + shockValues[shock == trendType, c(paramName) := randomValue * paramValues[,trendYearValue]] + + if(shockDistFile[shock == trendType & pname == paramName]$type == 'additive'){ + paramValues[,c(paramName) := get(paramName) + randomValue * trendYearValue] + } + else{ + paramValues[,c(paramName) := get(paramName) * (1 + randomValue*trendYearValue)] + } + } + } + } + + + for(year in paramValues[,Year]){ + for (shockType in names(shocksHappen)[4:6]){ + if(shocksHappen[Year == year, get(shockType)]){ + for(paramName in shockDistFile[shock == shockType]$pname){ + + randomValue = drawValue(shockType, paramName) + #put in records table + shockValues[shock == shockType & Year == year, c(paramName) := randomValue] + + #shock is changed from baseline value not change from previous year + if(shockDistFile[shock == shockType & pname == paramName]$type == 'additive'){ + paramValues[Year == year,c(paramName) := get(paramName) + randomValue] + } + else{ + paramValues[Year == year,c(paramName) := get(paramName) * (1 + randomValue)] + } + } + } + } + } + + #if negative set to zero, or need to change shock distributions so zero can't happen + for(col in names(paramValues)) set(paramValues, i=which(paramValues[[col]]<0), j=col, value=0) + + ensDir=file.path(scenario[,Ensemble],scenario[,Scenario]) + + if (dir.exists(file.path(baseOutputDir,ensDir))) { + print(paste(ensDir, "exists. Creating shock file")) + write.csv(paramValues, file.path(baseOutputDir,ensDir,"shocks.csv"), row.names=FALSE, quote=FALSE) + write.csv(shockValues, file.path(baseOutputDir,ensDir,"shocksRecord.csv"), row.names=FALSE, quote=FALSE) + } + else{ + print(paste(ensDir, "does not exist. Stopping")) + } +} + +drawValue <- function(shockType, paramName){ + + randomValue = runif(1, abs(shockDistFile[shock == shockType & pname == paramName]$min), + abs(shockDistFile[shock == shockType & pname == paramName]$max)) + + if (shockDistFile[shock == shockType & pname == paramName]$min <0){ + randomValue = randomValue*-1 + } + + randomValue +} + +baseDataDir = "/exports/csce/eddie/geos/groups/LURG/models/PLUM/plumv2/data" +baseOutputDir="/exports/csce/eddie/geos/groups/LURG/models/PLUM/output" # "~/Downloads" + +shockDistFile = fread(file.path(baseDataDir, "shockDistributions.csv")) +shockProbs = fread(file.path(baseDataDir,"shockProbabilities.csv")) + +ensembleFile = commandArgs(trailingOnly = TRUE)[1] + +scenarioTable = fread(file.path(baseDataDir,"sims",ensembleFile)) + +for(i in 1:nrow(scenarioTable)){ +#first if column exists + if("SHOCKS_POSSIBLE" %in% colnames(scenarioTable)){ + if(scenarioTable[i,SHOCKS_POSSIBLE]){ + print(paste("Shocks possible in ",scenarioTable[i,Ensemble],scenarioTable[i,Scenario])) + createShockFile(scenario = scenarioTable[i]) + } + } +} + + diff --git a/src/ac/ed/lurg/InternationalMarket.java b/src/ac/ed/lurg/InternationalMarket.java index 3d93f9d153ef98559bbe6a27cb430e3c9816aad0..a8ef535db5eea52216a970ad353d5358a50e2190 100644 --- a/src/ac/ed/lurg/InternationalMarket.java +++ b/src/ac/ed/lurg/InternationalMarket.java @@ -48,7 +48,7 @@ public class InternationalMarket { return initialStockLevels; } - void determineInternationalTrade(Collection<CountryAgent> countryAgents, double gen2EcDDemand) { + void determineInternationalTrade(Collection<CountryAgent> countryAgents, double gen2EcDDemand, Timestep timestep) { CropToDoubleMap totalImportCommodities = new CropToDoubleMap(); CropToDoubleMap totalExportCommodities = new CropToDoubleMap(); for (CountryAgent ca : countryAgents) { @@ -77,7 +77,7 @@ public class InternationalMarket { double exportsBeforeTransportLosses = totalExportCommodities.containsKey(crop) ? totalExportCommodities.get(crop) : 0.0; double previousStockLevel = stockLevel.get(crop); - GlobalPrice adjustedPrice = prevPrice.createWithUpdatedMarketPrices(imports, exportsBeforeTransportLosses, exportsBeforeTransportLosses * ModelConfig.TRANSPORT_LOSSES, (ModelConfig.MARKET_ADJ_PRICE)); + GlobalPrice adjustedPrice = prevPrice.createWithUpdatedMarketPrices(imports, exportsBeforeTransportLosses, exportsBeforeTransportLosses * ModelConfig.TRANSPORT_LOSSES, (ModelConfig.MARKET_ADJ_PRICE), timestep); LogWriter.println( String.format("Price for %s updated from %s (imports amount %.0f, exports amount %.0f) to %s ", crop.getGamsName(), prevPrice, imports, adjustedPrice.getExportsAfterTransportLosses(), adjustedPrice)); worldPrices.put(crop, adjustedPrice); @@ -95,7 +95,7 @@ public class InternationalMarket { GlobalPrice priceQuantity = worldPrices.get(crop); sbData.append(String.format("%d,%s", timestep.getYear(), crop.getGamsName())); sbData.append(String.format(",%.1f,%.1f", priceQuantity.getImportAmount(), priceQuantity.getExportsAfterTransportLosses())); - sbData.append(String.format(",%.3f,%.3f", priceQuantity.getExportPrice(), stockLevel.get(crop))); + sbData.append(String.format(",%.3f,%.3f", priceQuantity.getExportPrice(timestep), stockLevel.get(crop))); outputFile.write(sbData.toString()); outputFile.newLine(); diff --git a/src/ac/ed/lurg/ModelConfig.java b/src/ac/ed/lurg/ModelConfig.java index 8f4c6f1d31fadb0149a6471d0635047370941363..b9fb3255bfb3b447a94003aafbad38ce6b1831ec 100644 --- a/src/ac/ed/lurg/ModelConfig.java +++ b/src/ac/ed/lurg/ModelConfig.java @@ -4,9 +4,17 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Enumeration; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.Properties; +import ac.ed.lurg.country.SingleCountry; +import ac.ed.lurg.types.CommodityType; import ac.ed.lurg.types.ModelFitType; +import ac.ed.lurg.types.Parameter; +import ac.ed.lurg.utils.LogWriter; +import ac.ed.lurg.utils.StringTabularReader; public class ModelConfig { @@ -14,6 +22,8 @@ public class ModelConfig { private static ModelConfig modelConfig; public static final String CONFIG_FILE = System.getProperty("CONFIG_FILE"); + private static StringTabularReader shocksReader; + private ModelConfig() { configFile = new Properties(); try { @@ -95,6 +105,37 @@ public class ModelConfig { return v==null ? defaultBoolean : Boolean.valueOf(v); } + + public static void readInShocksFile(){ + + shocksReader = new StringTabularReader(",", new String[]{"Year","trendYearValue", "TRADE_BARRIERS_MULTIPLIER", "TRANSPORT_COST", "TECHNOLOGY_CHANGE_ANNUAL_RATE", "MEAT_EFFICIENCY", + "FERTILISER_COST_PER_T","OTHER_INTENSITY_COST", "TRANSPORT_LOSSES", "IRRIG_COST_MULTIPLIER", "RUMINANT_CHANGE_ANNUAL_RATE", "MONOGASTRIC_CHANGE_ANNUAL_RATE", + "IRRIG_EFF_MULTIPLIER", "FINANCIAL_SPECULATION_MULTIPLIER"}); + + shocksReader.read(ModelConfig.SHOCKS_PARAMETER_FILE); + + } + + + public static Double getParameter(Parameter parameter, int year){ + + Map<String, String> queryMap = new HashMap<String, String>(); + queryMap.put("Year", Integer.toString(year)); + + Double parameterValue=null; + + try { + Map<String, String> row = shocksReader.querySingle(queryMap); + String parameterOfInterest = row.get(parameter.getCsvName()); + parameterValue = Double.valueOf(parameterOfInterest); + } + catch (Exception e) { + LogWriter.println("Problem finding shock parameter: " + parameter.getCsvName() + ", " + year); + } + + return parameterValue; + } + public static final boolean SUPPRESS_STD_OUTPUT = getBooleanProperty("SUPPRESS_STD_OUTPUT", Boolean.FALSE); // Directory information @@ -127,6 +168,7 @@ public class ModelConfig { public static final String COUNTRY_GROUPING_FILE = DATA_DIR + File.separator + "country_groups.csv"; public static final String OTHER_WATER_USES_FILE = DATA_DIR + File.separator + "other_water_uses.csv"; public static final String BASE_CEREAL_DEMAND_FILE = DATA_DIR + File.separator + "base_cereal_demand.csv"; + public static final String SHOCKS_PARAMETER_FILE = OUTPUT_DIR + File.separator+ "shocks.csv"; // yield data public static final String YIELD_DIR_BASE = getProperty("YIELD_DIR_BASE"); @@ -237,7 +279,7 @@ public class ModelConfig { public static final double TECHNOLOGY_CHANGE_ANNUAL_RATE = getDoubleProperty("TECHNOLOGY_CHANGE_ANNUAL_RATE", 0.002); public static final int TECHNOLOGY_CHANGE_START_STEP = getIntProperty("TECHNOLOGY_CHANGE_START_STEP", 0); - + public static final boolean USE_BIOENERGY_TRAJECTORY = getBooleanProperty("USE_BIOENERGY_TRAJECTORY", true); // false is the old style, i.e. BIOENERGY_CHANGE_ANNUAL_RATE, BIOENERGY_CHANGE_START_YEAR and BIOENERGY_CHANGE_END_YEAR // original way to specify changes in bioenergy public static final double BIOENERGY_CHANGE_ANNUAL_RATE = IS_CALIBRATION_RUN ? 0.0 : getDoubleProperty("BIOENERGY_CHANGE_ANNUAL_RATE", 0.10); // 6.2/2.31/20 @@ -250,11 +292,8 @@ public class ModelConfig { // public static final double BIOENERGY_HEATING_VALUE_GJ_PER_T = getDoubleProperty("BIOENERGY_HEATING_VALUE_GJ_PER_T", 17.5); // GJ per t DM //Dietary stuff - public static final boolean ACTIVE_DIETARY_SHIFT = getBooleanProperty("ACTIVE_DIETARY_SHIFT", false); - public static final int DIETARY_CHANGE_START_YEAR = getIntProperty("DIETARY_CHANGE_START_YEAR", 2010); - public static final int DIETARY_CHANGE_END_YEAR = getIntProperty("DIETARY_CHANGE_END_YEAR", 2050); - public static final double RUMINANT_CHANGE_ANNUAL_RATE = getDoubleProperty("RUMINANT_CHANGE_ANNUAL_RATE", 0.05); - public static final double MONOGASTRIC_CHANGE_ANNUAL_RATE = getDoubleProperty("MONOGASTRIC_CHANGE_ANNUAL_RATE", 0.05); + public static final double RUMINANT_CHANGE_ANNUAL_RATE = getDoubleProperty("RUMINANT_CHANGE_ANNUAL_RATE", 0.0); + public static final double MONOGASTRIC_CHANGE_ANNUAL_RATE = getDoubleProperty("MONOGASTRIC_CHANGE_ANNUAL_RATE", 0.00); public static final boolean CONSTANT_DIET_LOW_INCOME = getBooleanProperty("CONSTANT_DIET_LOW_INCOME", false); public static final boolean CONSTANT_DIET_HIGH_INCOME = getBooleanProperty("CONSTANT_DIET_HIGH_INCOME", false); //below should all sum to zero @@ -262,20 +301,7 @@ public class ModelConfig { public static final double PULSES_SUB_PROPORTION = getDoubleProperty("PULSES_SUB_PROPORTION", 0.35); public static final double OILCROPS_SUB_PROPORTION = getDoubleProperty("OILCROPS_SUB_PROPORTION", 0.05); public static final double STARCHY_ROOTS_SUB_PROPORTION = getDoubleProperty("STARCHY_ROOTS_SUB_PROPORTION", 0.3); - - //RUGS limit yield in argentina - public static final boolean LIMIT_MAIZE_YIELD_SAMERICA = getBooleanProperty("LIMIT_MAIZE_YIELD_SAMERICA", false); - public static final double LIMIT_YIELD_BY = getDoubleProperty("LIMIT_YIELD_BY", 0.0); - //RUGS trade changes scenarios - - public static final int TRADE_START_YEAR = getIntProperty("TRADE_START_YEAR", 2010); - public static final int TRADE_END_YEAR = getIntProperty("TRADE_END_YEAR", 2010); - public static final double TRADE_BARRIER_ANNUAL_CHANGE = getDoubleProperty("TRADE_BARRIER_ANNUAL_CHANGE", 0.0); - public static final double TRADE_LOSSES_ANNUAL_CHANGE = getDoubleProperty("TRADE_LOSSES_ANNUAL_CHANGE", 0.0); - public static final double TRADE_COSTS_ANNUAL_CHANGE = getDoubleProperty("TRADE_COSTS_ANNUAL_CHANGE", 0.0); - - public static final double MARKET_LAMBA = getDoubleProperty("MARKET_LAMBA", 0.4); // controls international market price adjustment rate public static final double POPULATION_AGGREG_LIMIT = getDoubleProperty("POPULATION_AGGREG_LIMIT", 30.0); // in millions, smaller countries are aggregated on a regional basis @@ -293,6 +319,7 @@ public class ModelConfig { public static final double OTHER_INTENSITY_PARAM = getDoubleProperty("OTHER_INTENSITY_PARAM", 3.22); public static final double IRRIG_COST_SCALE_FACTOR = getDoubleProperty("IRRIG_COST_SCALE_FACTOR", 0.0003); + public static final double IRRIG_COST_MULTIPLIER = getDoubleProperty("IRRIG_COST_MULTIPLIER", 1.0); public static final double FERTILISER_COST_PER_T = getDoubleProperty("FERTILISER_COST_PER_T", 1.4); // $500/t, 18% N/t public static final double FERTILISER_MAX_COST = FERTILISER_COST_PER_T * MAX_FERT_AMOUNT/1000; @@ -300,9 +327,11 @@ public class ModelConfig { public static final double TRANSPORT_LOSSES = getDoubleProperty("TRANSPORT_LOSSES", 0.05); // in international trade public static final double TRANSPORT_COST = getDoubleProperty("TRANSPORT_COST", 0.1); // 100 $/t see Wheat Transportation Profile - USDA public static final double TRADE_BARRIER_FACTOR_DEFAULT = getDoubleProperty("TRADE_BARRIER_FACTOR_DEFAULT", 0.2); // price factor in international trade, transport cost and real trade barriers - public static final double TRADE_BARRIER_ADJ = getDoubleProperty("TRADE_BARRIER_ADJ", 1.0); + public static final double TRADE_BARRIER_MULTIPLIER = getDoubleProperty("TRADE_BARRIER_MULTIPLIER", 1.0); 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 boolean SHOCKS_POSSIBLE = getBooleanProperty("SHOCKS_POSSIBLE", false); + + public static final boolean PROTECTED_AREAS_ENABLED = getBooleanProperty("PROTECTED_AREAS_ENABLED", true); public static final double MIN_NATURAL_RATE = getDoubleProperty("MIN_NATURAL_RATE", 0.05); public static final double MAX_CHINA_LAND_EXPANSION_RATE = getDoubleProperty("MAX_CHINA_LAND_EXPANSION_RATE", 0.011*0.4); // 1.1% max forest change 40% of natural land is forest diff --git a/src/ac/ed/lurg/ModelMain.java b/src/ac/ed/lurg/ModelMain.java index 6f79d1a3a7bd6833920bc8dad8ec0ca813e1040c..43368a70b0663022947bc0b580fdc91ace7233af 100644 --- a/src/ac/ed/lurg/ModelMain.java +++ b/src/ac/ed/lurg/ModelMain.java @@ -91,7 +91,9 @@ public class ModelMain { demandManager = new DemandManagerFromFile(compositeCountryManager); else demandManager = new DemandManagerSSP(ModelConfig.SSP_SCENARIO, baseConsumpManager, compositeCountryManager); - + + if (ModelConfig.SHOCKS_POSSIBLE) ModelConfig.readInShocksFile(); + tradeManager = new TradeManager(compositeCountryManager); currentIrrigationData = getFixedIrrigationData(); countryBoundaryRaster = getCountryBoundaryRaster(); @@ -167,7 +169,7 @@ public class ModelMain { clusterIdRaster.putAll(ca.getYieldClusters()); } - internationalMarket.determineInternationalTrade(countryAgents, gen2EcDDemand); + internationalMarket.determineInternationalTrade(countryAgents, gen2EcDDemand, timestep); // output results outputTimestepResults(timestep, globalLandUseRaster); @@ -590,6 +592,7 @@ private void writeDomesticProductionFile(Timestep timestep) { /** Ugly in situ update of currentIrrigationData, better if IrrigationRasterSets were handled more immutably */ private void getUpdateIrrigationData(Timestep timestep, YieldRaster yieldSurfaces) { String rootDir = timestep.getYearSubDir(ModelConfig.YIELD_DIR); + new IrrigationMaxAmountReader(currentIrrigationData).getRasterDataFromFile(rootDir + File.separator + ModelConfig.IRRIG_MAX_WATER_FILENAME); if (!ModelConfig.USE_BLUE_WATER_FILE_IRRIG_CONSTRAINT) { diff --git a/src/ac/ed/lurg/country/CountryAgent.java b/src/ac/ed/lurg/country/CountryAgent.java index 189fe04550126b7cadf58b7a357da0d00edafa18..030f7e25366d4af33600f97fb28c43d6c6165192 100644 --- a/src/ac/ed/lurg/country/CountryAgent.java +++ b/src/ac/ed/lurg/country/CountryAgent.java @@ -115,18 +115,6 @@ public class CountryAgent { } currentCountryPrices = calculateCountryPrices(worldPrices); - - if(ModelConfig.LIMIT_MAIZE_YIELD_SAMERICA & country.getRegion().equals("Latin America & Caribbean")){ - for (Entry<RasterKey, YieldResponsesItem> entry : countryYieldSurfaces.entrySet()) { - YieldResponsesItem yresp = entry.getValue(); - if (yresp != null){ - for (YieldType yt : YieldType.values()) { - double prevYield = yresp.getYield(yt, CropType.MAIZE); - yresp.setYield(yt,CropType.MAIZE, prevYield*(1-ModelConfig.LIMIT_YIELD_BY)); - } - } - } - } if (currentProjectedDemand.size() == 0) { LogWriter.printlnError("No demand for country " + country + " so skipping it"); @@ -301,7 +289,7 @@ public class CountryAgent { for (CropType c : CropType.getImportedTypes()) { GlobalPrice worldPrice = worldPrices.get(c); - CountryPrice prices = new CountryPrice(worldPrice.getCountryImportPrice(tradeBarriers.get(c), currentTimestep.getYear()), worldPrice.getExportPrice()); + CountryPrice prices = new CountryPrice(worldPrice.getCountryImportPrice(tradeBarriers.get(c), currentTimestep), worldPrice.getExportPrice(currentTimestep)); countryPrices.put(c, prices); } diff --git a/src/ac/ed/lurg/country/GlobalPrice.java b/src/ac/ed/lurg/country/GlobalPrice.java index f59744bbc0b33f42986cd79c101b45f05c7034d4..725042a9c49637ac95fee209c63f4cfb12bc1763 100644 --- a/src/ac/ed/lurg/country/GlobalPrice.java +++ b/src/ac/ed/lurg/country/GlobalPrice.java @@ -1,6 +1,8 @@ package ac.ed.lurg.country; import ac.ed.lurg.ModelConfig; +import ac.ed.lurg.Timestep; +import ac.ed.lurg.types.Parameter; import ac.ed.lurg.utils.LogWriter; public class GlobalPrice { @@ -20,24 +22,23 @@ public class GlobalPrice { return new GlobalPrice(exportPrice, Double.NaN, Double.NaN, Double.NaN); } - public double getExportPrice() { - return exportPrice; + public double getExportPrice(Timestep timestep) { + + double financialSpeculationMultiplier = (!ModelConfig.SHOCKS_POSSIBLE)? 1.0 : ModelConfig.getParameter(Parameter.FINANCIAL_SPECULATION_MULTIPLIER,timestep.getYear()); + + return exportPrice * financialSpeculationMultiplier; } - public double getCountryImportPrice(double countryTradeBarrier, int year) { - - double tradeBarAdj =0; - double tradeLossAdj = 0; - double tradeCostAdj = 0; - int yearsOfChange = Math.min(ModelConfig.TRADE_END_YEAR - ModelConfig.TRADE_START_YEAR, year - ModelConfig.TRADE_START_YEAR); + public double getCountryImportPrice(double countryTradeBarrier, Timestep timestep) { + + int currentYear = timestep.getYear(); - if (yearsOfChange>0) { - tradeBarAdj = yearsOfChange * ModelConfig.TRADE_BARRIER_ANNUAL_CHANGE; - tradeLossAdj = yearsOfChange * ModelConfig.TRADE_LOSSES_ANNUAL_CHANGE; - tradeCostAdj = yearsOfChange * ModelConfig.TRADE_COSTS_ANNUAL_CHANGE; - } + double tradeBarrierMultiplier = (!ModelConfig.SHOCKS_POSSIBLE)? ModelConfig.TRADE_BARRIER_MULTIPLIER: ModelConfig.getParameter(Parameter.TRADE_BARRIERS_MULTIPLIER, currentYear); + double transportLosses =(!ModelConfig.SHOCKS_POSSIBLE) ? ModelConfig.TRANSPORT_LOSSES : ModelConfig.getParameter(Parameter.TRANSPORT_LOSSES, currentYear); + double transportCosts = (!ModelConfig.SHOCKS_POSSIBLE) ? ModelConfig.TRANSPORT_COST : ModelConfig.getParameter(Parameter.TRANSPORT_COST, currentYear); - double importPrice = (exportPrice * (1.0 + countryTradeBarrier*ModelConfig.TRADE_BARRIER_ADJ+tradeBarAdj) / (1.0 - ModelConfig.TRANSPORT_LOSSES+tradeLossAdj)) + ModelConfig.TRANSPORT_COST+tradeCostAdj; + double importPrice = (getExportPrice(timestep) * (1.0 + countryTradeBarrier*tradeBarrierMultiplier) + / (1.0 - transportLosses)) + transportCosts; return importPrice; } @@ -57,7 +58,7 @@ public class GlobalPrice { return transportLosses; } - public GlobalPrice createWithUpdatedMarketPrices(double imports, double exportsBeforeTransportLosses, double transportLosses, boolean adjustPrice) { + public GlobalPrice createWithUpdatedMarketPrices(double imports, double exportsBeforeTransportLosses, double transportLosses, boolean adjustPrice, Timestep timestep) { double exportsAfterTransportLosses = exportsBeforeTransportLosses - transportLosses; if (imports > 0 || exportsAfterTransportLosses > 0) { double ratio; @@ -70,10 +71,10 @@ public class GlobalPrice { double adjustment = adjustPrice ? Math.exp(ratio * ModelConfig.MARKET_LAMBA) : 1.0; //adjustment = Math.min(adjustment, 2.0); // can only double in a time step //adjustment = Math.max(adjustment, 0.5); // can only half in a time step - return new GlobalPrice(exportPrice * adjustment, imports, exportsBeforeTransportLosses, transportLosses); + return new GlobalPrice(getExportPrice(timestep) * adjustment, imports, exportsBeforeTransportLosses, transportLosses); } else { - LogWriter.printlnError(String.format("Price for not updated (still %s), as no imports and no exports for it", exportPrice)); + LogWriter.printlnError(String.format("Price for not updated (still %s), as no imports and no exports for it", getExportPrice(timestep))); return this; } } diff --git a/src/ac/ed/lurg/country/gams/GamsCountryInput.java b/src/ac/ed/lurg/country/gams/GamsCountryInput.java index 6272692d072e6f8c02db11d4dd180e6415c9de4f..9e244d8ccd872485850b52e73ce6803633cc76c6 100644 --- a/src/ac/ed/lurg/country/gams/GamsCountryInput.java +++ b/src/ac/ed/lurg/country/gams/GamsCountryInput.java @@ -55,6 +55,8 @@ public class GamsCountryInput { } public double getMeatEfficiency() { + + return ModelConfig.MEAT_EFFICIENCY; // this is already handled by the feed conversion efficiency for each animal product } diff --git a/src/ac/ed/lurg/country/gams/GamsLocationOptimiser.java b/src/ac/ed/lurg/country/gams/GamsLocationOptimiser.java index c29ab3645f11ae73f9aee50c7627b202dd9175bc..74fc28b30a278bad406c18562635162dc68f2e14 100644 --- a/src/ac/ed/lurg/country/gams/GamsLocationOptimiser.java +++ b/src/ac/ed/lurg/country/gams/GamsLocationOptimiser.java @@ -29,6 +29,7 @@ import ac.ed.lurg.landuse.LandUseItem; import ac.ed.lurg.types.CommodityType; import ac.ed.lurg.types.CropType; import ac.ed.lurg.types.LandCoverType; +import ac.ed.lurg.types.Parameter; import ac.ed.lurg.utils.LazyHashMap; import ac.ed.lurg.utils.LogWriter; import ac.ed.lurg.yield.YieldResponsesItem; @@ -163,10 +164,12 @@ public class GamsLocationOptimiser { GAMSParameter irrigConstraintP = inDB.addParameter("irrigConstraint", 1); Map<Integer, ? extends IrrigationItem> irrigationData = inputData.getIrrigationCosts(); + double irrigCostMultiplier = (!ModelConfig.SHOCKS_POSSIBLE) ? 1.0 : ModelConfig.getParameter(Parameter.IRRIG_COST_MULTIPLIER, inputData.getTimestep().getYear()); + for (Entry<Integer, ? extends IrrigationItem> entry : irrigationData.entrySet()) { Integer locationId = entry.getKey(); IrrigationItem irrigCostItem = entry.getValue(); - double irrigCost = irrigCostItem.getIrrigCost(); + double irrigCost = irrigCostItem.getIrrigCost()*irrigCostMultiplier; double irrigConstraint = irrigCostItem.getIrrigConstraint(); if (DEBUG) LogWriter.println(String.format(" %d \t %.5f,\t %.1f", locationId, irrigCost, irrigConstraint)); setGamsParamValue(irrigCostP.addRecord(Integer.toString(locationId)), irrigCost, 5); @@ -273,14 +276,20 @@ public class GamsLocationOptimiser { setGamsParamValue(seedAndWasteRateP.addRecord(crop.getGamsName()), seedAndWasteRate, 3); } + //below in case running without shocks to use original values in model config + + double meatEff = (!ModelConfig.SHOCKS_POSSIBLE) ? ModelConfig.MEAT_EFFICIENCY: ModelConfig.getParameter(Parameter.MEAT_EFFICIENCY, inputData.getTimestep().getYear()); + double fertCost = (!ModelConfig.SHOCKS_POSSIBLE) ? ModelConfig.FERTILISER_MAX_COST : ModelConfig.getParameter(Parameter.FERTILISER_COST_PER_T, inputData.getTimestep().getYear()) * ModelConfig.MAX_FERT_AMOUNT/1000; + double otherIntCost = (!ModelConfig.SHOCKS_POSSIBLE) ? ModelConfig.OTHER_INTENSITY_COST : ModelConfig.getParameter(Parameter.OTHER_INTENSITY_COST, inputData.getTimestep().getYear()); + LogWriter.print("\n"); addScalar(inDB, "cropIncCost", ModelConfig.CROP_INCREASE_COST, 3); addScalar(inDB, "cropDecCost", ModelConfig.CROP_DECREASE_COST, 3); addScalar(inDB, "pastureDecCost", ModelConfig.PASTURE_DECREASE_COST, 3); addScalar(inDB, "pastureIncCost", ModelConfig.PASTURE_INCREASE_COST, 3); - addScalar(inDB, "meatEfficency", countryInput.getMeatEfficiency(), 3); - addScalar(inDB, "fertiliserUnitCost", ModelConfig.FERTILISER_MAX_COST, 3); - addScalar(inDB, "otherICost",ModelConfig.OTHER_INTENSITY_COST, 3); + addScalar(inDB, "meatEfficency", meatEff, 3); + addScalar(inDB, "fertiliserUnitCost", fertCost, 3); + addScalar(inDB, "otherICost",otherIntCost, 3); addScalar(inDB, "otherIParam", ModelConfig.OTHER_INTENSITY_PARAM, 3); addScalar(inDB, "unhandledCropRate", ModelConfig.UNHANDLED_CROP_RATE, 3); addScalar(inDB, "setAsideRate", ModelConfig.SETASIDE_RATE, 5); diff --git a/src/ac/ed/lurg/demand/AbstractDemandManager.java b/src/ac/ed/lurg/demand/AbstractDemandManager.java index d4d7e138f990b99f272db284802bffbdb6c3070d..cbdf9dc5ec8bd67977cc2311bf7132b8efe918c6 100644 --- a/src/ac/ed/lurg/demand/AbstractDemandManager.java +++ b/src/ac/ed/lurg/demand/AbstractDemandManager.java @@ -10,6 +10,7 @@ import ac.ed.lurg.country.CompositeCountryManager; import ac.ed.lurg.country.SingleCountry; import ac.ed.lurg.types.CommodityType; import ac.ed.lurg.types.CropType; +import ac.ed.lurg.types.Parameter; import ac.ed.lurg.utils.LogWriter; public abstract class AbstractDemandManager { @@ -72,11 +73,10 @@ public abstract class AbstractDemandManager { public Map<CommodityType, Double> dietaryAdjustment(Map<CommodityType, Double> originalFoodDemandMap, int year) { - int yearsOfChange = Math.min(ModelConfig.DIETARY_CHANGE_END_YEAR - ModelConfig.DIETARY_CHANGE_START_YEAR, - year - ModelConfig.DIETARY_CHANGE_START_YEAR); - double monoDemandAdj = yearsOfChange > 0 ? (yearsOfChange * CommodityType.MONOGASTRICS.demandChangeRate()) : 0.0; - double rumDemandAdj = yearsOfChange > 0 ? (yearsOfChange * CommodityType.RUMINANTS.demandChangeRate()) : 0.0; + double monoDemandAdj = (!ModelConfig.SHOCKS_POSSIBLE) ? 0.0 : ModelConfig.getParameter(Parameter.MONOGASTRIC_CHANGE_ANNUAL_RATE, year); + double rumDemandAdj = (!ModelConfig.SHOCKS_POSSIBLE) ? 0.0 : ModelConfig.getParameter(Parameter.RUMINANT_CHANGE_ANNUAL_RATE, year); + Double monogastricDemand = originalFoodDemandMap.get(CommodityType.MONOGASTRICS); double monogastricEnergyShortfall = (monogastricDemand != null) ? monogastricDemand * monoDemandAdj * CommodityType.MONOGASTRICS.getEJPerMT() : 0.0; @@ -92,7 +92,7 @@ public abstract class AbstractDemandManager { if (originalCommodityDemand != null) { if (commodity.isAnimalProduct()) { - double adj = yearsOfChange > 0 ? (yearsOfChange * commodity.demandChangeRate()) : 0.0; + double adj = commodity.getGamsName() == "ruminants" ? rumDemandAdj : monoDemandAdj; updatedFoodDemandMap.put(commodity, originalCommodityDemand*(1-adj)); } else { diff --git a/src/ac/ed/lurg/demand/DemandManagerFromFile.java b/src/ac/ed/lurg/demand/DemandManagerFromFile.java index 261e7ec1b05f63ba0dfacbb10a66ed52349c0399..5c336dcaef87b7e559ee7960ce7e0f5326234ff7 100644 --- a/src/ac/ed/lurg/demand/DemandManagerFromFile.java +++ b/src/ac/ed/lurg/demand/DemandManagerFromFile.java @@ -43,7 +43,7 @@ public class DemandManagerFromFile extends AbstractDemandManager { } } - if(!ModelConfig.ACTIVE_DIETARY_SHIFT){ + if(!ModelConfig.SHOCKS_POSSIBLE){ return foodDemandMap; } return dietaryAdjustment(foodDemandMap, year); diff --git a/src/ac/ed/lurg/demand/DemandManagerSSP.java b/src/ac/ed/lurg/demand/DemandManagerSSP.java index 61641d12d0daf0deef4857946c876137f5c75ad6..2d934230d39c4f30de01a90e4b3e00e0a2413af7 100644 --- a/src/ac/ed/lurg/demand/DemandManagerSSP.java +++ b/src/ac/ed/lurg/demand/DemandManagerSSP.java @@ -53,7 +53,7 @@ public class DemandManagerSSP extends AbstractDemandManager { foodDemandMap.put(commodity, d); } - if(!ModelConfig.ACTIVE_DIETARY_SHIFT){ + if(!ModelConfig.SHOCKS_POSSIBLE){ return foodDemandMap; } return dietaryAdjustment(foodDemandMap, year); diff --git a/src/ac/ed/lurg/landuse/IrrigationItem.java b/src/ac/ed/lurg/landuse/IrrigationItem.java index 2a5a544b9e19c8f4128453278d909128185adf11..49dd5934bf21cb73dba99a4f03d4e414d2e23190 100644 --- a/src/ac/ed/lurg/landuse/IrrigationItem.java +++ b/src/ac/ed/lurg/landuse/IrrigationItem.java @@ -33,6 +33,10 @@ public class IrrigationItem implements RasterItem { return ModelConfig.PASTURE_MAX_IRRIGATION_RATE; Double d = maxIrrigAmounts.get(crop); + + //double irrigEffMultiplier = (!ModelConfig.SHOCKS_POSSIBLE) ? ModelConfig.IRRIG_EFF_MULTIPLIER : ModelConfig.getParameter(IRRIG_EFF_MULTIPLIER, timestep.getYear()); + + return d==null ? 0.0 : d.doubleValue(); } diff --git a/src/ac/ed/lurg/types/CommodityType.java b/src/ac/ed/lurg/types/CommodityType.java index 7d029f59f6257f1b5eea06af0088465f7e1338b8..3f2a843b183c285211fea86be6999a045b2ec535 100644 --- a/src/ac/ed/lurg/types/CommodityType.java +++ b/src/ac/ed/lurg/types/CommodityType.java @@ -9,12 +9,12 @@ import ac.ed.lurg.ModelConfig; public enum CommodityType { - CEREALS("Cereals", "cereals", false, null, 0.0115335812,ModelConfig.CEREALS_SUB_PROPORTION,Double.NaN), - OILCROPS("Oilcrops", "oilcrops", false, CropType.OILCROPS, 0.0243500061,ModelConfig.OILCROPS_SUB_PROPORTION,Double.NaN), - PULSES("Pulses", "pulses", false, CropType.PULSES, 0.0146872440,ModelConfig.PULSES_SUB_PROPORTION,Double.NaN), - STARCHY_ROOTS("Starchy Roots", "starchyRoots", false, CropType.STARCHY_ROOTS, 0.0034561229,ModelConfig.STARCHY_ROOTS_SUB_PROPORTION,Double.NaN), - MONOGASTRICS("Monogastrics", "monogastrics", true, CropType.MONOGASTRICS, 0.0019100435, Double.NaN, ModelConfig.MONOGASTRIC_CHANGE_ANNUAL_RATE), - RUMINANTS("Ruminants", "ruminants", true, CropType.RUMINANTS, 0.0009951162, Double.NaN, ModelConfig.RUMINANT_CHANGE_ANNUAL_RATE); + CEREALS("Cereals", "cereals", false, null, 0.0115335812,ModelConfig.CEREALS_SUB_PROPORTION), + OILCROPS("Oilcrops", "oilcrops", false, CropType.OILCROPS, 0.0243500061,ModelConfig.OILCROPS_SUB_PROPORTION), + PULSES("Pulses", "pulses", false, CropType.PULSES, 0.0146872440,ModelConfig.PULSES_SUB_PROPORTION), + STARCHY_ROOTS("Starchy Roots", "starchyRoots", false, CropType.STARCHY_ROOTS, 0.0034561229,ModelConfig.STARCHY_ROOTS_SUB_PROPORTION), + MONOGASTRICS("Monogastrics", "monogastrics", true, CropType.MONOGASTRICS, 0.0019100435, Double.NaN), + RUMINANTS("Ruminants", "ruminants", true, CropType.RUMINANTS, 0.0009951162, Double.NaN); private String faoName; private String gamsName; @@ -22,16 +22,14 @@ public enum CommodityType { private CropType cropTypeMapping; private double ejPerMt; private double meatSubstitutionProportion; - private double demandChangeRate; - CommodityType (String faoName, String gamsName, boolean isAnimalProduct, CropType cropTypeMapping, double energyPerTon, double meatSubstitutionProportion,double demandChangeRate) { + CommodityType (String faoName, String gamsName, boolean isAnimalProduct, CropType cropTypeMapping, double energyPerTon, double meatSubstitutionProportion) { this.faoName = faoName; this.gamsName = gamsName; this.isAnimalProduct = isAnimalProduct; this.cropTypeMapping = cropTypeMapping; this.ejPerMt = energyPerTon; //energy EJ per Mt this.meatSubstitutionProportion = meatSubstitutionProportion; - this.demandChangeRate =demandChangeRate; } private static final Map<String, CommodityType> faoNameCache = new HashMap<String, CommodityType>(); @@ -74,10 +72,6 @@ public enum CommodityType { return meatSubstitutionProportion; } - public double demandChangeRate(){ - return demandChangeRate; - } - public Collection<CropType> getCropTypes(){ Collection<CropType> comms = new HashSet<CropType>(); if (this == CEREALS) { diff --git a/src/ac/ed/lurg/types/Parameter.java b/src/ac/ed/lurg/types/Parameter.java new file mode 100644 index 0000000000000000000000000000000000000000..9dd25305f2ef1a8ea5b7d0351a2d28ce6c7cf28a --- /dev/null +++ b/src/ac/ed/lurg/types/Parameter.java @@ -0,0 +1,29 @@ +package ac.ed.lurg.types; + +public enum Parameter { + + TRADE_BARRIERS_MULTIPLIER("TRADE_BARRIERS_MULTIPLIER"), + TRANSPORT_LOSSES("TRANSPORT_LOSSES"), + TRANSPORT_COST("TRANSPORT_COST"), + TECHNOLOGY_CHANGE_ANNUAL_RATE("TECHNOLOGY_CHANGE_ANNUAL_RATE"), + IRRIG_COST_MULTIPLIER("IRRIG_COST_MULTIPLIER"), + FERTILISER_COST_PER_T("FERTILISER_COST_PER_T"), + OTHER_INTENSITY_COST("OTHER_INTENSITY_COST"), + RUMINANT_CHANGE_ANNUAL_RATE("RUMINANT_CHANGE_ANNUAL_RATE"), + MONOGASTRIC_CHANGE_ANNUAL_RATE("MONOGASTRIC_CHANGE_ANNUAL_RATE"), + MEAT_EFFICIENCY("MEAT_EFFICIENCY"), + IRRIG_EFF_MULTIPLIER("IRRIG_EFF_MULTIPLIER"), //not implemented yet as need to double check something with PA + FINANCIAL_SPECULATION_MULTIPLIER("FINANCIAL_SPECULATION_MULTIPLIER"); + + private String csvName; + + + Parameter (String csvName) { + this.csvName = csvName; + } + + public String getCsvName() { + return csvName; + } + +} diff --git a/src/ac/ed/lurg/yield/LPJYieldResponseMapReader.java b/src/ac/ed/lurg/yield/LPJYieldResponseMapReader.java index 9c18a78d7bce6d9f333f247123853f031d018c67..86d01a80f4dcb2f9bbe3f68b2011707ef2df14fe 100644 --- a/src/ac/ed/lurg/yield/LPJYieldResponseMapReader.java +++ b/src/ac/ed/lurg/yield/LPJYieldResponseMapReader.java @@ -8,6 +8,7 @@ import ac.ed.lurg.Timestep; import ac.ed.lurg.types.CropType; import ac.ed.lurg.types.FertiliserRate; import ac.ed.lurg.types.IrrigationRate; +import ac.ed.lurg.types.Parameter; import ac.ed.lurg.types.YieldType; import ac.ed.lurg.utils.LogWriter; import ac.ed.lurg.utils.WatchForFile; @@ -41,7 +42,9 @@ public class LPJYieldResponseMapReader { int timeStepForTechChange = ModelConfig.IS_CALIBRATION_RUN ? ModelConfig.START_TIMESTEP : timestep.getTimestep(); // we don't want technology to change in calibration, but sometime we run tech change backwards int yearsOfTech = (timeStepForTechChange - ModelConfig.TECHNOLOGY_CHANGE_START_STEP) * ModelConfig.TIMESTEP_SIZE; - techYieldAdj = 1.0 + yearsOfTech * ModelConfig.TECHNOLOGY_CHANGE_ANNUAL_RATE; + double techChangeAnnualRate = (!ModelConfig.SHOCKS_POSSIBLE)? ModelConfig.TECHNOLOGY_CHANGE_ANNUAL_RATE: ModelConfig.getParameter(Parameter.TECHNOLOGY_CHANGE_ANNUAL_RATE, timestep.getYear()); + + techYieldAdj = 1.0 + yearsOfTech * techChangeAnnualRate; LogWriter.println("Yield adjustment for technology for " + timestep + " is " + techYieldAdj); YieldRaster yieldRaster = new YieldRaster(rasterProj);