From aa0ffdd7553b3d3f25ff15e534ebf2b04640c6db Mon Sep 17 00:00:00 2001 From: ywpratama <48617743+ywpratama@users.noreply.github.com> Date: Tue, 7 Mar 2023 15:50:00 +0100 Subject: [PATCH 01/12] Update MESSAGE_master.gms --- message_ix/model/MESSAGE_master.gms | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/message_ix/model/MESSAGE_master.gms b/message_ix/model/MESSAGE_master.gms index bd6bb99fe..47dc6315b 100644 --- a/message_ix/model/MESSAGE_master.gms +++ b/message_ix/model/MESSAGE_master.gms @@ -1,7 +1,7 @@ $TITLE The MESSAGEix Integrated Assessment Model $ONDOLLAR $ONTEXT - +TEST Copyright 2018 IIASA Energy Program Licensed under the Apache License, Version 2.0 (the "License"); From 13bfa5d8318256303cd1870af002ce08cd636062 Mon Sep 17 00:00:00 2001 From: ywpratama <48617743+ywpratama@users.noreply.github.com> Date: Fri, 10 Mar 2023 14:25:35 +0100 Subject: [PATCH 02/12] Recursive Dynamic Module Updates on recursive dynamic development in MESSAGE and a Fix for No-"CAP_NEW" bug in the "model_learningeos.gms" --- message_ix/model/MESSAGE/data_load.gms | 2 + .../model/MESSAGE/model_learningeos.gms | 47 ++ message_ix/model/MESSAGE/model_setup.gms | 6 + message_ix/model/MESSAGE/model_solve.gms | 85 +- message_ix/model/MESSAGE/sets_maps_def.gms | 3 + message_ix/model/MESSAGE_master.gms | 9 +- message_ix/model/MESSAGE_project.gpr | 766 ++++++++++++++++++ message_ix/model/cplex.op2 | 5 + 8 files changed, 887 insertions(+), 36 deletions(-) create mode 100644 message_ix/model/MESSAGE/model_learningeos.gms create mode 100644 message_ix/model/cplex.op2 diff --git a/message_ix/model/MESSAGE/data_load.gms b/message_ix/model/MESSAGE/data_load.gms index f5848720d..95a99ae08 100644 --- a/message_ix/model/MESSAGE/data_load.gms +++ b/message_ix/model/MESSAGE/data_load.gms @@ -97,6 +97,8 @@ Set rating_unrated(rating) ; rating_unrated(rating) = yes ; rating_unrated('unrated') = no ; +Set newtec(tec) / wind_ppl / ; + *----------------------------------------------------------------------------------------------------------------------* * assignment and computation of MESSAGE-specific auxiliary parameters * *----------------------------------------------------------------------------------------------------------------------* diff --git a/message_ix/model/MESSAGE/model_learningeos.gms b/message_ix/model/MESSAGE/model_learningeos.gms new file mode 100644 index 000000000..389c5a00e --- /dev/null +++ b/message_ix/model/MESSAGE/model_learningeos.gms @@ -0,0 +1,47 @@ +SETS + size 'size' / small, medium, large / ; + +ALIAS (size,size2); +PARAMETERS + cap_new2(node,newtec,year_all2) 'annual newly installed capacity' + bin_cap_new(node,newtec,year_all2) 'binary of newly installed capacity' + rho(newtec) 'economy of scale parameter' / wind_ppl 1.0 / #0.8 + b(newtec) 'technology cost learning parameter' / wind_ppl 0.9 / #0.9 + u(size) 'unit size' + / small 5 + medium 10 + large 50 / + inv_cost_ref(node,newtec) 'initial capex' + nbr_unit_ref(newtec) 'initial number of unit' / wind_ppl 100 / + u_ref(newtec) 'reference size' / wind_ppl 5 / ; +inv_cost_ref(node,newtec) = 1500; + +SCALAR hist_length the length of historical periods; +hist_length = card(year_all2) - card(model_horizon); + +VARIABLES + NBR_UNIT(node,newtec,size,year_all2) number of units for each size every year + CAPEX_TEC(node,newtec,year_all2) capital cost in dollar per kW + OBJECT objective function ; + +POSITIVE VARIABLES + NBR_UNIT ; + +EQUATIONS + OBJECTIVE_INNER total investment cost + CAP_NEW_BALANCE installed capacity balance + CAPEX_ESTIMATE estimating average capex + NO_BUILT_YEAR annual investment cost +; + + +OBJECTIVE_INNER.. OBJECT =e= sum((node,newtec,year_all2), CAPEX_TEC(node,newtec,year_all2)*cap_new2(node,newtec,year_all2)) ; +CAP_NEW_BALANCE(node,newtec,year_all2).. sum(size, NBR_UNIT(node,newtec,size,year_all2)*u(size)) =e= cap_new2(node,newtec,year_all2) ; +CAPEX_ESTIMATE(node,newtec,year_all2).. CAPEX_TEC(node,newtec,year_all2)*cap_new2(node,newtec,year_all2) =g= sum(size,inv_cost_ref(node,newtec) + * NBR_UNIT(node,newtec,size,year_all2)*u(size) + * [(((sum((size2,year_all3)$(ord(year_all3) le ord(year_all2) and ord(year_all3) gt hist_length), NBR_UNIT(node,newtec,size2,year_all3))+nbr_unit_ref(newtec))/nbr_unit_ref(newtec))**(-b(newtec)))] + * [((u(size)/u_ref(newtec))**rho(newtec))]) ; +NO_BUILT_YEAR(node,newtec,year_all2).. CAPEX_TEC(node,newtec,year_all2) =e= bin_cap_new(node,newtec,year_all2)*CAPEX_TEC(node,newtec,year_all2) + + (1-bin_cap_new(node,newtec,year_all2))*CAPEX_TEC(node,newtec,year_all2-1) ; + +model learningeos / all /; diff --git a/message_ix/model/MESSAGE/model_setup.gms b/message_ix/model/MESSAGE/model_setup.gms index 74a27742f..bab699280 100644 --- a/message_ix/model/MESSAGE/model_setup.gms +++ b/message_ix/model/MESSAGE/model_setup.gms @@ -21,6 +21,11 @@ $IF NOT SET out $SETGLOBAL out "output/MsgOutput.gdx" * rolling horizon (period-by-period, recursive-dynamic with limited foresight - 'number of years of foresight' $IF NOT SET foresight $SETGLOBAL foresight "0" +** define learning mode (active / inactive) ** +* deactivate - 0 (assumed as default if not specified) +* activate - 1 +$IF NOT SET learningmode $SETGLOBAL learningmode "0" + ** specify optional additional calibration output ** $IF NOT SET calibration $SETGLOBAL calibration "" * mark with * to include detailed calibration information in outputs and get an extended GAMS listing (.lst) file @@ -84,3 +89,4 @@ $INCLUDE MESSAGE/scaling_investment_costs.gms *----------------------------------------------------------------------------------------------------------------------* $INCLUDE MESSAGE/model_core.gms +$INCLUDE MESSAGE/model_learningeos.gms diff --git a/message_ix/model/MESSAGE/model_solve.gms b/message_ix/model/MESSAGE/model_solve.gms index b6ae12891..918eaf023 100644 --- a/message_ix/model/MESSAGE/model_solve.gms +++ b/message_ix/model/MESSAGE/model_solve.gms @@ -5,6 +5,11 @@ * This part of the code includes the perfect-foresight, myopic and rolling-horizon model solve statements * including the required accounting of investment costs beyond the model horizon. *** +*set year_rd(year_all) /700, 710/; +*set year_rd(year_all) all year in recursive dynamic iterations ; +*year_rd(year_all) = ord(year_all) >1; +Parameter iter 'iteration number'; +iter = 1; if (%foresight% = 0, *** @@ -24,6 +29,7 @@ if (%foresight% = 0, * write a status update to the log file, solve the model put_utility 'log' /'+++ Solve the perfect-foresight version of MESSAGEix +++ ' ; + option threads = 4 ; Solve MESSAGE_LP using LP minimizing OBJ ; * write model status summary @@ -87,47 +93,56 @@ else * variables in additional reporting parameters - the last model solve automatically includes the results over the * entire model horizon and can be imported via the ixmp interface. *** - year(year_all) = no ; LOOP(year_all$( model_horizon(year_all) ), * include all past periods and future periods including the period where the %foresight% is reached - year(year_all) = yes ; - -* reset the investment cost scaling parameter - year(year_all2)$( ORD(year_all2) > ORD(year_all) - AND duration_period_sum(year_all,year_all2) < %foresight% ) = yes ; - -* write a status update and time elapsed to the log file, solve the model - put_utility 'log' /'+++ Solve the recursive-dynamic version of MESSAGEix - iteration ' year_all.tl:0 ' +++ ' ; - $$INCLUDE includes/aux_computation_time.gms - Solve MESSAGE_LP using LP minimizing OBJ ; - -* write model status summary - status(year_all,'modelstat') = MESSAGE_LP.modelstat ; - status(year_all,'solvestat') = MESSAGE_LP.solvestat ; - status(year_all,'resUsd') = MESSAGE_LP.resUsd ; - status(year_all,'objEst') = MESSAGE_LP.objEst ; - status(year_all,'objVal') = MESSAGE_LP.objVal ; - -* write an error message AND ABORT THE SOLVE LOOP if model did not solve to optimality - IF( NOT ( MESSAGE_LP.modelstat = 1 OR MESSAGE_LP.modelstat = 8 ), - put_utility 'log' /'+++ MESSAGEix did not solve to optimality - run is aborted, no output produced! +++ ' ; - ABORT "MESSAGEix did not solve to optimality!" - ) ; + year(year_all2)$( ORD(year_all2) < (ORD(year_all) + %foresight%) ) = yes ; + year4(year_all2)$((ord(year_all2) < ord(year_all))) = yes ; + + option threads = 4 ; + Solve MESSAGE_LP using LP minimizing OBJ ; +* write model status summary + status('perfect_foresight','modelstat') = MESSAGE_LP.modelstat ; + status('perfect_foresight','solvestat') = MESSAGE_LP.solvestat ; + status('perfect_foresight','resUsd') = MESSAGE_LP.resUsd ; + status('perfect_foresight','objEst') = MESSAGE_LP.objEst ; + status('perfect_foresight','objVal') = MESSAGE_LP.objVal ; + +* write an error message if model did not solve to optimality + IF( NOT ( MESSAGE_LP.modelstat = 1 OR MESSAGE_LP.modelstat = 8 ), + put_utility 'log' /'+++ MESSAGEix did not solve to optimality - run is aborted, no output produced! +++ ' ; + ABORT "MESSAGEix did not solve to optimality!" + ) ; + + IF(%learningmode% = 1, +* passing CAP_NEW values to update cap_new2 data for unit and size optimization + cap_new2(node,newtec,year_all2) = CAP_NEW.l(node,newtec,year_all2); +* this is to make bin param equal to 1 when technology is built, and 0 if otherwise + bin_cap_new(node,newtec,year_all2) = CAP_NEW.l(node,newtec,year_all2); + bin_cap_new(node,newtec,year_all2)$(bin_cap_new(node,newtec,year_all2) > 0) = 1 ; + solve learningeos using nlp minimizing OBJECT; +* passing CapexTec values to update inv_cost data for MESSAGE optimization + inv_cost(node,newtec,year_all2) = CAPEX_TEC.l(node,newtec,year_all2); + + display bin_cap_new, NBR_UNIT.l, CAPEX_TEC.l, inv_cost, cap_new2, CAP_NEW.l; + ); * fix all variables of the current iteration period 'year_all' to the optimal levels - EXT.fx(node,commodity,grade,year_all) = EXT.l(node,commodity,grade,year_all) ; - CAP_NEW.fx(node,tec,year_all) = CAP_NEW.l(node,tec,year_all) ; - CAP.fx(node,tec,year_all2,year_all)$( map_period(year_all2,year_all) ) = CAP.l(node,tec,year_all,year_all2) ; - ACT.fx(node,tec,year_all2,year_all,mode,time)$( map_period(year_all2,year_all) ) - = ACT.l(node,tec,year_all2,year_all,mode,time) ; - CAP_NEW_UP.fx(node,tec,year_all) = CAP_NEW_UP.l(node,tec,year_all) ; - CAP_NEW_LO.fx(node,tec,year_all) = CAP_NEW_LO.l(node,tec,year_all) ; - ACT_UP.fx(node,tec,year_all,time) = ACT_UP.l(node,tec,year_all,time) ; - ACT_LO.fx(node,tec,year_all,time) = ACT_LO.l(node,tec,year_all,time) ; - + EXT.fx(node,commodity,grade,year4) = EXT.l(node,commodity,grade,year4) ; + CAP_NEW.fx(node,tec,year4) = CAP_NEW.l(node,tec,year4) ; +* CAP.fx(node,tec,year4,year4) = CAP.l(node,tec,year4,year4) ; + CAP.up(node,tec,year4,year4) = 1.000001*CAP.l(node,tec,year4,year4) ; + CAP.lo(node,tec,year4,year4) = 0.999999*CAP.l(node,tec,year4,year4) ; + ACT.fx(node,tec,year4,year4,mode,time) = ACT.l(node,tec,year4,year4,mode,time) ; + CAP_NEW_UP.fx(node,tec,year4) = CAP_NEW_UP.l(node,tec,year4) ; + CAP_NEW_LO.fx(node,tec,year4) = CAP_NEW_LO.l(node,tec,year4) ; + ACT_UP.fx(node,tec,year4,time) = ACT_UP.l(node,tec,year4,time) ; + ACT_LO.fx(node,tec,year4,time) = ACT_LO.l(node,tec,year4,time) ; + + + Display year,year4,year_all,year_all2,model_horizon ; ) ; # end of the recursive-dynamic loop ) ; # end of if statement for the selection betwen perfect-foresight or recursive-dynamic model @@ -167,4 +182,4 @@ COST_NODAL_NET.L(node, year)$(NOT macro_base_period(year)) = ( AND map_node(node2,node) AND cat_year(type_year,year) ), emission_scaling(type_emission,emission) * tax_emission(node2,type_emission,type_tec,type_year) * EMISS.L(node,emission,type_tec,year) ) -) ; +) / 1000 ; diff --git a/message_ix/model/MESSAGE/sets_maps_def.gms b/message_ix/model/MESSAGE/sets_maps_def.gms index 1c0a5ea69..bdecb9799 100644 --- a/message_ix/model/MESSAGE/sets_maps_def.gms +++ b/message_ix/model/MESSAGE/sets_maps_def.gms @@ -152,6 +152,8 @@ Sets land_type types of land use year_all years (over entire model horizon) year (year_all) years included in a model instance (for myopic or rolling-horizon optimization) + year4 (year_all) years included in a model instance (for myopic or rolling-horizon optimization) + year_hist (year_all) historical year time subannual time periods (seasons - days - hours) shares share constraint relations relation generic linear relations @@ -301,6 +303,7 @@ Sets addon(tec) technologies that are an add-on to other (parent) technologies type_addon types of add-on technologies (that can be applied mutually exclusive) cat_addon(type_addon,addon) mapping of add-on technologies to respective add-on technology types + newtec(tec) new technologies that will experience technological learning type_year types of year aggregations cat_year(type_year,year_all) mapping of years to respective categories type_emission types of emission aggregations diff --git a/message_ix/model/MESSAGE_master.gms b/message_ix/model/MESSAGE_master.gms index 47dc6315b..8dcab16ec 100644 --- a/message_ix/model/MESSAGE_master.gms +++ b/message_ix/model/MESSAGE_master.gms @@ -1,7 +1,7 @@ $TITLE The MESSAGEix Integrated Assessment Model $ONDOLLAR $ONTEXT -TEST + Copyright 2018 IIASA Energy Program Licensed under the Apache License, Version 2.0 (the "License"); @@ -46,6 +46,7 @@ $ONGLOBAL ** scenario/case selection - this must match the name of the MsgData_<%%%>.gdx input data file ** $SETGLOBAL data "" +*$SETGLOBAL data "Westeros_Electrified_baseline" ** MACRO mode * "none": MESSAGEix is run in stand-alone mode @@ -58,6 +59,12 @@ $SETGLOBAL macromode "none" * rolling horizon (period-by-period, recursive-dynamic with limited foresight - 'number of years of foresight' $SETGLOBAL foresight "0" +** for recursive dynamic approach, this is to activate/deactivate technology learning module ** +* deactivate technology learning - 0 +* activate technology learning - 1 +$SETGLOBAL learningmode "0" + + ** add a comment and name extension for model report files (e.g. run-specific info, calibration notes) - optional ** $SETGLOBAL comment "" diff --git a/message_ix/model/MESSAGE_project.gpr b/message_ix/model/MESSAGE_project.gpr index ca6d47fe9..63c28a2b2 100644 --- a/message_ix/model/MESSAGE_project.gpr +++ b/message_ix/model/MESSAGE_project.gpr @@ -1,2 +1,768 @@ [PROJECT] +[RP:MESSAGE/MODEL_SOLVE] +1= + +[GDXDISP: CAP_NEW Var 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: CapexTec Var 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: abs_cost_activity_soft_lo Par 4] +PlaneDim=0 +RowDim=4 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: growth_activity_up Par 4] +PlaneDim=0 +RowDim=4 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: historical_gdp Par 2] +PlaneDim=0 +RowDim=2 +Squeeze=1 +SqTrail0=0 +Order=1,2 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: historical_land Par 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: historical_new_capacity Par 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: initial_activity_lo Par 4] +PlaneDim=0 +RowDim=4 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: initial_activity_up Par 4] +PlaneDim=0 +RowDim=4 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: initial_land_lo Par 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: initial_land_scen_lo Par 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: initial_land_scen_up Par 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: initial_land_up Par 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: initial_new_capacity_lo Par 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: initial_new_capacity_up Par 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: input Par 10] +PlaneDim=0 +RowDim=10 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4,5,6,7,8,9,10 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: interestrate Par 1] +PlaneDim=0 +RowDim=1 +Squeeze=1 +SqTrail0=0 +Order=1 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: inv_cost Par 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: inv_tec Set 1] +PlaneDim=0 +RowDim=1 +Squeeze=1 +SqTrail0=0 +Order=1 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_bound_activity_up Set 5] +PlaneDim=0 +RowDim=5 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4,5 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_bound_emission Set 4] +PlaneDim=0 +RowDim=4 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_bound_extraction_up Set 4] +PlaneDim=0 +RowDim=4 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_bound_new_capacity_lo Set 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_bound_new_capacity_up Set 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_bound_total_capacity_lo Set 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_bound_total_capacity_up Set 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_capacity_factor Set 5] +PlaneDim=0 +RowDim=5 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4,5 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_dynamic_activity_lo Set 4] +PlaneDim=0 +RowDim=4 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_dynamic_activity_up Set 4] +PlaneDim=0 +RowDim=4 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_dynamic_land_lo Set 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_dynamic_land_scen_lo Set 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_dynamic_land_scen_up Set 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_dynamic_land_up Set 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_dynamic_new_capacity_lo Set 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_dynamic_new_capacity_up Set 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_fixed_activity Set 6] +PlaneDim=0 +RowDim=6 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4,5,6 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_fixed_capacity Set 4] +PlaneDim=0 +RowDim=4 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_fixed_extraction Set 4] +PlaneDim=0 +RowDim=4 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_fixed_land Set 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_fixed_new_capacity Set 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_fixed_stock Set 4] +PlaneDim=0 +RowDim=4 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_relation_lower Set 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: is_relation_upper Set 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: land_cost Par 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: land_emission Par 4] +PlaneDim=0 +RowDim=4 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: land_input Par 6] +PlaneDim=0 +RowDim=6 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4,5,6 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: land_output Par 6] +PlaneDim=0 +RowDim=6 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4,5,6 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: land_scenario Set 1] +PlaneDim=0 +RowDim=1 +Squeeze=1 +SqTrail0=0 +Order=1 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: land_type Set 1] +PlaneDim=0 +RowDim=1 +Squeeze=1 +SqTrail0=0 +Order=1 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: land_use Par 4] +PlaneDim=0 +RowDim=4 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: level Set 1] +PlaneDim=0 +RowDim=1 +Squeeze=1 +SqTrail0=0 +Order=1 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: level_cost_activity_soft_lo Par 4] +PlaneDim=0 +RowDim=4 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: level_cost_activity_soft_up Par 4] +PlaneDim=0 +RowDim=4 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: level_cost_new_capacity_soft_lo Par 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: level_cost_new_capacity_soft_up Par 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: level_renewable Set 1] +PlaneDim=0 +RowDim=1 +Squeeze=1 +SqTrail0=0 +Order=1 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: level_resource Set 1] +PlaneDim=0 +RowDim=1 +Squeeze=1 +SqTrail0=0 +Order=1 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: level_stocks Set 1] +PlaneDim=0 +RowDim=1 +Squeeze=1 +SqTrail0=0 +Order=1 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: level_storage Set 1] +PlaneDim=0 +RowDim=1 +Squeeze=1 +SqTrail0=0 +Order=1 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: lvl_spatial Set 1] +PlaneDim=0 +RowDim=1 +Squeeze=1 +SqTrail0=0 +Order=1 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: lvl_temporal Set 1] +PlaneDim=0 +RowDim=1 +Squeeze=1 +SqTrail0=0 +Order=1 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: map_commodity Set 5] +PlaneDim=0 +RowDim=5 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4,5 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: map_land Set 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: map_node Set 2] +PlaneDim=0 +RowDim=2 +Squeeze=1 +SqTrail0=0 +Order=1,2 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: map_relation Set 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: map_resource Set 4] +PlaneDim=0 +RowDim=4 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: map_shares_commodity_share Set 7] +PlaneDim=0 +RowDim=7 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4,5,6,7 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: map_shares_commodity_total Set 7] +PlaneDim=0 +RowDim=7 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4,5,6,7 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: map_spatial_hierarchy Set 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: map_stocks Set 4] +PlaneDim=0 +RowDim=4 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: map_tec Set 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: map_tec_addon Set 2] +PlaneDim=0 +RowDim=2 +Squeeze=1 +SqTrail0=0 +Order=1,2 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: map_tec_mode Set 4] +PlaneDim=0 +RowDim=4 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: map_tec_storage Set 8] +PlaneDim=0 +RowDim=8 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4,5,6,7,8 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: map_tec_time Set 4] +PlaneDim=0 +RowDim=4 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: map_temporal_hierarchy Set 3] +PlaneDim=0 +RowDim=3 +Squeeze=1 +SqTrail0=0 +Order=1,2,3 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: map_time Set 2] +PlaneDim=0 +RowDim=2 +Squeeze=1 +SqTrail0=0 +Order=1,2 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: MESSAGE_ix_version Par 1] +PlaneDim=0 +RowDim=1 +Squeeze=1 +SqTrail0=0 +Order=1 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: min_utilization_factor Par 4] +PlaneDim=0 +RowDim=4 +Squeeze=1 +SqTrail0=0 +Order=1,2,3,4 +Decim=7 +PlaneRownr=-1 + +[GDXDISP: mode Set 1] +PlaneDim=0 +RowDim=1 +Squeeze=1 +SqTrail0=0 +Order=1 +Decim=7 +PlaneRownr=-1 + +[RP:MESSAGE/DATA_LOAD] +1= + +[RP:SETS_MAPS_DEF] +1= + +[RP:MODEL_SETUP] +1= + +[RP:MODEL_CORE] +1= + +[RP:MODEL_LEARNINGEOS] +1= + +[RP:MODEL_SOLVE] +1= + +[RP:MESSAGE_MASTER] +1= + +[MRUFILES] +1=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\MESSAGE\model_setup.gms +2=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\MESSAGE\sets_maps_def.gms +3=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\MESSAGE/data_load.gms +4=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\data\MsgData_Westeros_Electrified_baseline.gdx +5=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\MESSAGE_run.lst +6=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\output\MsgOutput_Westeros_Electrified_baseline.gdx +7=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\learningeos.gdx + +[OPENWINDOW_1] +FILE0=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\MESSAGE\model_core.gms +FILE1=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\MESSAGE\model_learningeos.gms +FILE2=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\MESSAGE\model_solve.gms +FILE3=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\MESSAGE_master.gms +FILE4=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\MESSAGE_master.lst +FILE5=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\model_solve.lst +FILE6=C:\Users\wiend\Documents\GitHub\message_ix\message_ix\model\MESSAGE_master.gms +MAXIM=0 +TOP=7 +LEFT=50 +HEIGHT=618 +WIDTH=1307 diff --git a/message_ix/model/cplex.op2 b/message_ix/model/cplex.op2 new file mode 100644 index 000000000..db3d36b8b --- /dev/null +++ b/message_ix/model/cplex.op2 @@ -0,0 +1,5 @@ +advind = 0 +lpmethod = 4 +threads = 4 +epopt = 1e-06 +barcrossalg = 2 \ No newline at end of file From e178624dcbf73132ea7b3dcd5c3e29018d8eae47 Mon Sep 17 00:00:00 2001 From: ywpratama <48617743+ywpratama@users.noreply.github.com> Date: Fri, 10 Mar 2023 14:27:07 +0100 Subject: [PATCH 03/12] Tutorial to activate recursive dynamic module This tutorial show how user can activate/deactivate recursive dynamic module in MESSAGE --- .../westeros_baseline_recursive-dynamic.ipynb | 212 ++++++++++++++++++ 1 file changed, 212 insertions(+) create mode 100644 tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb diff --git a/tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb b/tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb new file mode 100644 index 000000000..ea2dc8b10 --- /dev/null +++ b/tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb @@ -0,0 +1,212 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Westeros Tutorial: Running MESSAGE in Recursive Dynamic Mode\n", + "\n", + "While considering the full time horizon in a single run is useful for a long-term energy systems planning, the recursive dynamic approach can provide insights that reflect the relevant foresight windows decision makers can have in making adaptive and robust planning.\n", + "\n", + "In addition to running the model with the perfect foresights, MESSAGE can also be run using the recursive dynamic approach. Here, the model is run iteratively throughout the periods with key decision variables from the previous periods, or iterations, are fixed so that new informations do not alter decisions that are already made in the previous periods. These variables\n", + "include $CAP$ , $CAP\\_NEW$, $ACT$, and $EXT$. \n", + "\n", + "In this tutorial, we will implement the recursive dynamic mode on Westeros baseline scenario. Hence, before we start, we have to make sure that we can successfully run the baseline scenarion (``westeros_baseline.ipynb``).\n", + "\n", + "Let's start with importing all the libraries we need and connect to the `ixmp` platform." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import ixmp\n", + "import message_ix\n", + "\n", + "from message_ix.util import make_df\n", + "\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "mp = ixmp.Platform()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Making a clone of the existing scenario 'baseline'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "model = \"Westeros Electrified\"\n", + "\n", + "base = message_ix.Scenario(mp, model=model, scenario=\"baseline\")\n", + "scen = base.clone(\n", + " model,\n", + " \"recursive-dynamic\",\n", + " \"introducing recursive dynamic mode\",\n", + " keep_solution=False,\n", + ")\n", + "scen.check_out()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "year_df = scen.vintage_and_active_years()\n", + "vintage_years, act_years = year_df[\"year_vtg\"], year_df[\"year_act\"]\n", + "model_horizon = scen.set(\"year\")\n", + "country = \"Westeros\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Time to Solve the Model\n", + "\n", + "In perfect foresight mode, the solve statement we add is `scen.solve()` without any additional arguments. By default, this will tell MESSAGE to run in the perfect foreseight mode. To run MESSAGE using the recursive dynamic approach, we need to add `gams_args =[\"--foresight=X\"]` argument to the solve statement, with `X` being the length of the foresight windows. This will pass the argument directly to `GAMS`, overiding the default values set in `MESSAGE_master.gms` and `model_setup.gms` scripts. Here, let's use `X=1` as an example." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "scen.commit(comment=\"Introducing recursive dynamic mode in MESSAGE\")\n", + "scen.set_as_default()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "scen.solve(gams_args =[\"--foresight=1\"])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "scen.var(\"OBJ\")[\"lvl\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plotting Results" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from message_ix.reporting import Reporter\n", + "from message_ix.util.tutorial import prepare_plots\n", + "\n", + "rep = Reporter.from_scenario(scen)\n", + "prepare_plots(rep)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Activity\n", + "\n", + "How much energy is generated in each time period from the different potential sources?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "rep.set_filters(t=[\"coal_ppl\", \"wind_ppl\"])\n", + "rep.get(\"plot activity\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Capacity\n", + "\n", + "How much capacity of each plant is installed in each period?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "rep.get(\"plot capacity\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Close the connection to the database" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "mp.close_db()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.16" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From e3d7dc18298a9842b281f2a32f7428d0b757d953 Mon Sep 17 00:00:00 2001 From: ywpratama <48617743+ywpratama@users.noreply.github.com> Date: Fri, 10 Mar 2023 14:28:41 +0100 Subject: [PATCH 04/12] Tutorial to add DACCS to a MESSAGE model/scenario This tutorial shows how to add new technology (DACCS) to a MESSAGE model/scenario. In this example, we use the Westeros emissions bound scenario as baseline --- .../westeros_emissions_bounds_daccs.ipynb | 403 ++++++++++++++++++ 1 file changed, 403 insertions(+) create mode 100644 tutorial/westeros/westeros_emissions_bounds_daccs.ipynb diff --git a/tutorial/westeros/westeros_emissions_bounds_daccs.ipynb b/tutorial/westeros/westeros_emissions_bounds_daccs.ipynb new file mode 100644 index 000000000..bdbfe481a --- /dev/null +++ b/tutorial/westeros/westeros_emissions_bounds_daccs.ipynb @@ -0,0 +1,403 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "3ce427fd", + "metadata": {}, + "source": [ + "# Adding DACCS in MESSAGE\n", + "In the previous tutorials, we have learnt how to create a baseline scenario (`westeros_baseline.ipynb`) and add emissions bounds (`westeros_emissions_bounds.ipynb`) to the baseline scenario. Here, we will show how to include an additional/new technology to a MESSAGE model. While the combination of currently existing technologies might be able to deliver the Paris targets, the deployment of some new technologies might improve the probability of meeting the targets and/or reducing the costs. These technologies include CO2 removal (CDR) technologies. Hence, in this tutorial, we will use direct air carbon capture and storage (DACCS) as an example of new technologies to be considered in climate mitigation pathways. \n", + "\n", + "In order to smoothly follow this tutorial, you have to alrady have the MESSAGEix framework installed and working. Moreover, you should have run the Westeros baseline and emissions bounds scenarios successfully as this tutorial is built on top of those scenarios.\n", + "\n", + "If all set, we can start by importing all the packages we need and connect to a database that store the scenario input and results. We can also name the model as `Westeros Electrified` here." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "239a17a2", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import ixmp\n", + "import message_ix\n", + "\n", + "from message_ix.utils import make_df\n", + "\n", + "%matplotlib inline\n", + "\n", + "mp = ixmp.Platform()\n", + "\n", + "model = \"Westeros Electrified\"" + ] + }, + { + "cell_type": "markdown", + "id": "c82f18ff", + "metadata": {}, + "source": [ + "After we are connected to the database, we can call the prevously run `\"emission_bound\"` scenario as our base model and clone the data before we start adding DACCS to the model. As prevoiusly mentioned, to run this tutorial, you have to have succesfully run the `\"emission_bound\"` scenario, which was built based on the `\"baseline\"` scenario." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a868ad2", + "metadata": {}, + "outputs": [], + "source": [ + "base = message_ix.Scenario(mp, model=model, scenario=\"emission_bound\")\n", + "\n", + "scen = base.clone(\n", + " model,\n", + " \"emission_bound_DACCS\",\n", + " \"introducing an upper bound on emissions\",\n", + " keep_solution=False,)\n", + "scen.check_out()\n", + "\n", + "year_df = scen.vintage_and_active_years()\n", + "vintage_years, act_years = year_df[\"year_vtg\"], year_df[\"year_act\"]\n", + "model_horizon = scen.set(\"year\")\n", + "country = \"Westeros\"" + ] + }, + { + "cell_type": "markdown", + "id": "634cecd6", + "metadata": {}, + "source": [ + "Now, let's call the list of historical and model orizon years so we can use these lists for the next steps." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0a2bb27c", + "metadata": {}, + "outputs": [], + "source": [ + "history = [690]\n", + "model_horizon = [700, 710, 720]" + ] + }, + { + "cell_type": "markdown", + "id": "b5db71ca", + "metadata": {}, + "source": [ + "# Adding DACCS description\n", + "First step of adding DACCS as a technology in the model is by including DACCS into the `\"technology\"` set." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3b203192", + "metadata": {}, + "outputs": [], + "source": [ + "scen.add_set(\"technology\", [\"DACCS\"])" + ] + }, + { + "cell_type": "markdown", + "id": "017c5ca3", + "metadata": {}, + "source": [ + "Similar to what we did when generating the `\"baseline\"` scenario, the first thing we need to do is defining the input and output comodities of each technology. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c74cf466", + "metadata": {}, + "outputs": [], + "source": [ + "# Some common values to be used for both the \"input\" and \"output\" parameters\n", + "base = dict(\n", + " node_loc=country,\n", + " year_vtg=vintage_years,\n", + " year_act=act_years,\n", + " mode=\"standard\",\n", + " time=\"year\",\n", + " unit=\"-\",\n", + ")\n", + "\n", + "# Use the message_ix utility function make_df() to create a base data frame for\n", + "# different \"input\" parameter values\n", + "base_input = make_df(\"input\", **base, node_origin=country, time_origin=\"year\")\n", + "\n", + "# Create a base data frame for different \"output\" parameter values\n", + "base_output = make_df(\"output\", **base, node_dest=country, time_dest=\"year\")" + ] + }, + { + "cell_type": "markdown", + "id": "74bc41d1", + "metadata": {}, + "source": [ + "In this example, DACCS is described as a technology that consumes electricity in order to remove CO2 from the atmosphere. This electricity is assumed to be obtained from the grid. Hence, we define DACCS input as final energy in the form of electricity." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0dae391a", + "metadata": {}, + "outputs": [], + "source": [ + "daccs_in = base_input.assign(\n", + " technology=\"DACCS\", commodity=\"electricity\", level=\"final\", value=1.0\n", + ")\n", + "scen.add_par(\"input\", daccs_in)" + ] + }, + { + "cell_type": "markdown", + "id": "8e087a2c", + "metadata": {}, + "source": [ + "Then, we can also add emissions and capacity factors as well as the technical lifetime of the technology. As can be seen in the code block below, the emissions factor has a negative value, showing that the technology removes insted of emits CO2." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c80ec39f", + "metadata": {}, + "outputs": [], + "source": [ + "emission_factor = make_df(\n", + " \"emission_factor\",\n", + " node_loc=country,\n", + " year_vtg=vintage_years,\n", + " year_act=act_years,\n", + " mode=\"standard\",\n", + " unit=\"tCO2/kWa\",\n", + " technology=\"DACCS\",\n", + " emission=\"CO2\",\n", + " value=-20,\n", + ")\n", + "scen.add_par(\"emission_factor\", emission_factor)\n", + "\n", + "capacity_factor = make_df(\n", + " \"capacity_factor\",\n", + " node_loc=country,\n", + " year_vtg=vintage_years,\n", + " year_act=act_years,\n", + " time=\"year\",\n", + " unit=\"-\",\n", + " technology='DACCS',\n", + " value=1,\n", + ")\n", + "scen.add_par(\"capacity_factor\", capacity_factor)\n", + " \n", + "lifetime = make_df(\n", + " \"technical_lifetime\",\n", + " node_loc=country,\n", + " year_vtg=model_horizon,\n", + " unit=\"y\",\n", + " technology='DACCS',\n", + " value=20,\n", + ")\n", + "scen.add_par(\"technical_lifetime\", lifetime)" + ] + }, + { + "cell_type": "markdown", + "id": "cef799ae", + "metadata": {}, + "source": [ + "We also asume that DACCS is a first of a kind technology, i.e., the technology has never been historically deployed. Accordingly, to allow the technology to be installed in the system, we need to define initial deployment (`\"initial_new_capacity_up\"`) and capacity growth (`\"growth_new_capacity_up\"`) rates" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ad76ac94", + "metadata": {}, + "outputs": [], + "source": [ + "initial_newcapacity_up = {\n", + " \"DACCS\":0.5,\n", + "}\n", + "\n", + "for tec,val in initial_newcapacity_up.items():\n", + " df = make_df(\n", + " \"initial_new_capacity_up\",\n", + " node_loc=country,\n", + " year_vtg=model_horizon,\n", + " time=\"year\",\n", + " unit=\"GW\",\n", + " technology=tec,\n", + " value=val,\n", + " )\n", + " scen.add_par(\"initial_new_capacity_up\", df)\n", + "\n", + "growth_newcapacity_up = {\n", + " \"DACCS\":0.05,\n", + "}\n", + "\n", + "for tec,val in growth_newcapacity_up.items():\n", + " dfgrowth = make_df(\n", + " \"growth_new_capacity_up\",\n", + " node_loc=country,\n", + " year_vtg=model_horizon,\n", + " time=\"year\",\n", + " unit=\"-\",\n", + " technology=tec,\n", + " value=val,\n", + " )\n", + " scen.add_par(\"growth_new_capacity_up\", dfgrowth)" + ] + }, + { + "cell_type": "markdown", + "id": "dfe89d5e", + "metadata": {}, + "source": [ + "The last thing we need to do in describing DACCS is adding the technology costs data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3ae4574b", + "metadata": {}, + "outputs": [], + "source": [ + "# Add a new unit for ixmp to recognize as valid\n", + "mp.add_unit(\"USD/kW\")\n", + "\n", + "# in $ / kW (specific investment cost)\n", + "capex = make_df(\n", + " \"inv_cost\",\n", + " node_loc=country,\n", + " year_vtg=model_horizon,\n", + " unit=\"USD/kW\",\n", + " technology='DACCS',\n", + " value=2500,\n", + ")\n", + "scen.add_par(\"inv_cost\", capex)\n", + " \n", + "# in $ / kW / year (every year a fixed quantity is destinated to cover part of the O&M costs\n", + "# based on the size of the plant, e.g. lightning, labor, scheduled maintenance, etc.)\n", + "\n", + "omfix = make_df(\n", + " \"fix_cost\",\n", + " node_loc=country,\n", + " year_vtg=vintage_years,\n", + " year_act=act_years,\n", + " unit=\"USD/kWa\",\n", + " technology='DACCS',\n", + " value=5,\n", + ")\n", + "scen.add_par(\"fix_cost\", omfix)\n", + "\n", + "# In $ / kWa (costs associated to the degradation of equipment\n", + "# when the plant is functioning per unit of energy consumed\n", + "# kW·year = 8760 kWh in generating electricity. Therefore the costs represents USD per 8760 kWh\n", + "# of electricity consumed.\n", + "\n", + "omvar = make_df(\n", + " \"var_cost\",\n", + " node_loc=country,\n", + " year_vtg=vintage_years,\n", + " year_act=act_years,\n", + " mode=\"standard\",\n", + " time=\"year\",\n", + " unit=\"USD/kWa\",\n", + " technology='DACCS',\n", + " value=0,\n", + ")\n", + "scen.add_par(\"var_cost\", omvar)" + ] + }, + { + "cell_type": "markdown", + "id": "54cc0111", + "metadata": {}, + "source": [ + "# Solve Statement and Plotting Results\n", + "Finally, this is the solve statement and plotting results command" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fb160143", + "metadata": {}, + "outputs": [], + "source": [ + "scen.commit(comment=\"Introducing emissions, DACCS technology, and setting an upper bound\")\n", + "scen.set_as_default()\n", + "\n", + "scen.solve()\n", + "scen.var(\"OBJ\")[\"lvl\"]\n", + "\n", + "# Create a Reporter object to describe and carry out reporting\n", + "# calculations and operations (like plotting) based on `scenario`\n", + "# Add keys like \"plot activity\" to describe reporting operations.\n", + "# See tutorial/utils/plotting.py\n", + "from message_ix.reporting import Reporter\n", + "from message_ix.util.tutorial import prepare_plots\n", + "\n", + "rep = Reporter.from_scenario(scen)\n", + "\n", + "prepare_plots(rep)\n", + "\n", + "# Only show a subset of technologies in the follow plots;\n", + "# e.g. exclude \"bulb\" and \"grid\"\n", + "rep.set_filters(t=[\"coal_ppl\", \"wind_ppl\",\"DACCS\"])\n", + "\n", + "# Trigger the calculation and plotting\n", + "rep.get(\"plot activity\")\n", + "\n", + "# Create a different plot. The same filters are still active.\n", + "rep.get(\"plot capacity\")\n", + "\n", + "# Replace the technology filters with a commodity filter;\n", + "# show only \"light\" and not e.g. \"electricity\".\n", + "rep.set_filters(t=None, c=[\"light\"])\n", + "\n", + "# Create a price plot\n", + "rep.get(\"plot prices\")\n", + "\n", + "mp.close_db()" + ] + }, + { + "cell_type": "markdown", + "id": "3a6671bf", + "metadata": {}, + "source": [ + "# All Done\n", + "Voila! You can now see DACCS included in the model. Congratulations!" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.16" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 2fcce43c41e73493bcbdd5f953851096c8351657 Mon Sep 17 00:00:00 2001 From: ywpratama <48617743+ywpratama@users.noreply.github.com> Date: Fri, 10 Mar 2023 15:15:13 +0100 Subject: [PATCH 05/12] Add technology learning activation instruction --- .../westeros_baseline_recursive-dynamic.ipynb | 98 ++++++++++++++++--- 1 file changed, 82 insertions(+), 16 deletions(-) diff --git a/tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb b/tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb index ea2dc8b10..8de824dc8 100644 --- a/tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb +++ b/tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb @@ -18,9 +18,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "application/javascript": [ + "if (typeof IPython !== 'undefined') { IPython.OutputArea.prototype._should_scroll = function(lines){ return false; }}" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "import pandas as pd\n", "import ixmp\n", @@ -33,7 +46,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -49,7 +62,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -67,7 +80,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -83,12 +96,12 @@ "source": [ "## Time to Solve the Model\n", "\n", - "In perfect foresight mode, the solve statement we add is `scen.solve()` without any additional arguments. By default, this will tell MESSAGE to run in the perfect foreseight mode. To run MESSAGE using the recursive dynamic approach, we need to add `gams_args =[\"--foresight=X\"]` argument to the solve statement, with `X` being the length of the foresight windows. This will pass the argument directly to `GAMS`, overiding the default values set in `MESSAGE_master.gms` and `model_setup.gms` scripts. Here, let's use `X=1` as an example." + "In perfect foresight mode, the solve statement we add is `scen.solve()` without any additional arguments. By default, this will tell MESSAGE to run in the perfect foreseight mode. To run MESSAGE using the recursive dynamic approach, we need to add `gams_args =[\"--foresight=X\"]` argument to the solve statement, with `X` being the length of the foresight windows. This will pass the argument directly to `GAMS`, overiding the default values set in `MESSAGE_master.gms` and `model_setup.gms` scripts. Here, let's use `X=1` as an example. To activate technology cost learning module, an additional gams argument `\"--learningmode=1\"` needs to be included. Hence, the solve statement becomes `scen.solve(gams_args =[\"--foresight=1\",\"--learningmode=1\"])`. Please note that, in the current version, technology cost learning is only available if recursive dynamic mode is activated, i.e., the `X` in foresight argument is not equal to 0." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -98,7 +111,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -107,9 +120,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "173795.09375" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "scen.var(\"OBJ\")[\"lvl\"]" ] @@ -123,7 +147,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -145,9 +169,30 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "rep.set_filters(t=[\"coal_ppl\", \"wind_ppl\"])\n", "rep.get(\"plot activity\")" @@ -164,9 +209,30 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAArIAAAHTCAYAAADbOfviAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88F64QAAAACXBIWXMAAA9hAAAPYQGoP6dpAABKtUlEQVR4nO3dfXzO9f////uxzY7NTm2zM8aWxpwVEQ3lNAsp5SRShKh3iJSicp7TUjoRnSJvVHir6BNvYYqYc1ESvSdSm9NtTJuTPX9/+O74dbRNxrZjL27Xy+W41PF6PY/X8Tiee3ntvufxPJ6HzRhjBAAAAFiMm6sLAAAAAK4EQRYAAACWRJAFAACAJRFkAQAAYEkEWQAAAFgSQRYAAACWRJAFAACAJRFkAQAAYEkEWQAAAFgSQRYAcE2YPXu2bDabDhw44OpSAJQQgiws49NPP5XNZtOSJUvy7Lv55ptls9m0Zs2aPPsqVaqkRo0aFXk9EyZM0GeffVbkxy0Jo0ePls1mK/CWkpLi6hKL1dGjRzVo0CDFxcXJ29tboaGhatCggZ577jmdPn26yJ/vzJkzGj16tBITE4v82EVlyZIlatOmjUJCQuTp6anIyEh16dJFq1evdnVpV+Xtt9/W7NmzXV0GgGLi4eoCgMvVpEkTSdK6det03333ObZnZGRo9+7d8vDw0Pr169W8eXPHvkOHDunQoUPq2rVrkdczYcIEderUSR06dCjyY5eUGTNmyNfXN8/2wMDAki+mhJw4cUL169dXRkaGevfurbi4OB0/flzff/+9ZsyYoX/961/59snVOHPmjMaMGSNJatasWZEe+2oZY9S7d2/Nnj1bdevW1ZAhQxQeHq4//vhDS5YsUcuWLbV+/fpi+WOwqD388MPq2rWr7Ha7Y9vbb7+tkJAQPfLII64rDECxIcjCMiIjIxUTE6N169Y5bd+wYYOMMercuXOefbn3c0NwaZeVlSVPT0+5uZXMmyWdOnVSSEhIiTzXpWRmZsrHx6dEnuuDDz7QwYMH8w1nGRkZ8vT0LJE6SoupU6dq9uzZGjx4sF599VXZbDbHvhdeeEFz586Vh4c1flW4u7vL3d3d1WUAKEFMLYClNGnSRNu3b9eff/7p2LZ+/XrVrFlTbdq00caNG5WTk+O0z2azqXHjxo5t//73v1WvXj15e3srKChIXbt21aFDh5yeZ9++ferYsaPCw8Pl5eWlihUrqmvXrkpPT5ck2Ww2ZWZmas6cOY634/864nP48GH17t1bYWFhstvtqlmzpj788EOn50hMTJTNZtPHH3+sF198URUqVFDZsmWVkZEhSVq4cKGjzpCQED300EM6fPiw0zFSUlLUq1cvVaxYUXa7XREREbr33nuLbI5gbo2ffvqpxo8fr4oVK8rLy0stW7bU/v3787RPSkrSXXfdpYCAAJUtW1ZNmzbV+vXrndrkTmv48ccf9eCDD6pcuXKOPzRycnI0evRoRUZGqmzZsmrevLl+/PFHRUdHO/r3f//7n2w2m1577bU8z//dd9/JZrNpwYIFBb6mX375Re7u7rrtttvy7PP395eXl5ckadSoUSpTpoyOHj2ap12/fv0UGBiorKwsSdKWLVuUkJCgkJAQeXt7KyYmRr1795YkHThwQOXLl5ckjRkzxnG+jB492nG8n376SZ06dVJQUJC8vLxUv359ffHFF07PmTv/c926dXryySdVvnx5BQYG6rHHHtPZs2eVlpamHj16qFy5cipXrpyeffZZGWMK7AdJ+vPPPzVx4kTFxcXplVdecQqxuR5++GE1aNBA0sXR7GeeeUa1a9eWr6+v/P391aZNG+3cudPpMbnnzSeffKLnn39e4eHh8vHx0T333JPn39q3336rzp07q1KlSrLb7YqKitJTTz3l9G/8r/3UpUsXlS9fXt7e3qpWrZpeeOGFPH2Ue/5HR0frhx9+0Nq1ax393qxZs6s+hwCUHtb4Mxv4f5o0aaK5c+cqKSnJ8RZt7shao0aNlJ6ert27d+umm25y7IuLi1NwcLAkafz48RoxYoS6dOmiRx99VEePHtWbb76pO+64Q9u3b1dgYKDOnj2rhIQEZWdna+DAgQoPD9fhw4e1bNkypaWlKSAgQHPnztWjjz6qBg0aqF+/fpKkKlWqSJJSU1N12223yWazacCAASpfvry++uor9enTRxkZGRo8eLDTaxo3bpw8PT31zDPPKDs7W56enpo9e7Z69eqlW2+9VRMnTlRqaqpef/11rV+/3lGnJHXs2FE//PCDBg4cqOjoaB05ckQrV67UwYMHFR0d/Y/9eeLEiTzbPDw88kwtmDRpktzc3PTMM88oPT1dU6ZMUffu3ZWUlORos3r1arVp00b16tXTqFGj5ObmplmzZqlFixb69ttvHWEoV+fOnRUbG6sJEyY4Atfw4cM1ZcoUtW/fXgkJCdq5c6cSEhIcgVGSbrjhBjVu3Fjz5s3TU0895XTMefPmyc/PT/fee2+Br7ly5cq6cOGC5s6dq549exbY7uGHH9bYsWP1ySefaMCAAY7tZ8+e1aJFi9SxY0d5eXnpyJEjat26tcqXL69hw4YpMDBQBw4c0H/+8x9JUvny5R1TFu677z7df//9kuQ4R3/44Qc1btxYFSpU0LBhw+Tj46NPP/1UHTp00OLFi52m0UhynJNjxozRxo0b9e677yowMFDfffedKlWqpAkTJuj//u//9PLLL6tWrVrq0aNHga9x3bp1OnHihAYPHnxZI5n/+9//9Nlnn6lz586KiYlRamqq3nnnHTVt2lQ//vijIiMjndqPHz9eNptNzz33nI4cOaJp06apVatW2rFjh7y9vSVd/IPtzJkz+te//qXg4GBt2rRJb775pn777TctXLjQcazvv/9et99+u8qUKaN+/fopOjpav/zyi5YuXarx48fnW++0adM0cOBA+fr6OgJvWFjYVZ9DAEoRA1jIDz/8YCSZcePGGWOMOXfunPHx8TFz5swxxhgTFhZmpk+fbowxJiMjw7i7u5u+ffsaY4w5cOCAcXd3N+PHj3c65q5du4yHh4dj+/bt240ks3DhwkvW4uPjY3r27Jlne58+fUxERIQ5duyY0/auXbuagIAAc+bMGWOMMWvWrDGSzA033ODYZowxZ8+eNaGhoaZWrVrmzz//dGxftmyZkWRGjhxpjDHm5MmTRpJ5+eWXL91p+Rg1apSRlO+tWrVqjna5NVavXt1kZ2c7tr/++utGktm1a5cxxpicnBwTGxtrEhISTE5OjqPdmTNnTExMjLnzzjvzPHe3bt2cakpJSTEeHh6mQ4cOTttHjx5tJDn19TvvvGMkmT179jj1W0hISL4/k78/T/ny5Y0kExcXZx5//HEzf/58k5aWlqdtfHy8adiwodO2//znP0aSWbNmjTHGmCVLlhhJZvPmzQU+59GjR40kM2rUqDz7WrZsaWrXrm2ysrIc23JyckyjRo1MbGysY9usWbOMpDx9HB8fb2w2m3n88ccd286fP28qVqxomjZtesm+yP05Llmy5JLtcmVlZZkLFy44bUtOTjZ2u92MHTvWsS33vKlQoYLJyMhwbP/000+NJPP66687tv313M81ceJEY7PZzK+//urYdscddxg/Pz+nbcYYp77I7aPk5GTHtpo1a+bbD1dzDgEoPZhaAEupXr26goODHXNfd+7cqczMTMdcx0aNGjneyt6wYYMuXLjgeNv6P//5j3JyctSlSxcdO3bMcQsPD1dsbKxjxYOAgABJ0ooVK3TmzJlC1WeM0eLFi9W+fXsZY5yeJyEhQenp6dq2bZvTY3r27OkYnZIuvk195MgRPfHEE463uSWpXbt2iouL05dffilJ8vb2lqenpxITE3Xy5MlC1Zlr8eLFWrlypdNt1qxZedr16tXLae7o7bffLuniCJ0k7dixQ/v27dODDz6o48ePO15zZmamWrZsqW+++cZpyockPf744073V61apfPnz+uJJ55w2j5w4MA89XTp0kVeXl6aN2+eY9uKFSt07NgxPfTQQ5d8zWFhYdq5c6cef/xxnTx5UjNnztSDDz6o0NBQjRs3zunt+B49eigpKUm//PKLY9u8efMUFRWlpk2bSvr/Pxi3bNkynTt37pLP/XcnTpzQ6tWr1aVLF506dcrRb8ePH1dCQoL27duXZzpJnz59nKYANGzYUMYY9enTx7HN3d1d9evXd/x8CpI7jcXPz++y6rXb7Y752xcuXNDx48fl6+uratWq5TmvpYv999djd+rUSREREfq///s/x7a/nvuZmZk6duyYGjVqJGOMtm/fLuniKhPffPONevfurUqVKjk9R37TIS7H1ZxDAEoPgiwsxWazqVGjRo65sOvXr1doaKhuvPFGSc5BNve/uUF23759MsYoNjZW5cuXd7rt2bNHR44ckSTFxMRoyJAhev/99xUSEqKEhARNnz7dMT/2Uo4ePaq0tDS9++67eZ6jV69ekuR4nlwxMTFO93/99VdJUrVq1fIcPy4uzrHfbrdr8uTJ+uqrrxQWFqY77rhDU6ZMKdTSWXfccYdatWrldIuPj8/T7u/hoVy5cpLkCND79u2TdDGU//11v//++8rOzs7TfwW97tyfZa6goCDH8+UKDAxU+/btNX/+fMe2efPmqUKFCmrRosU/vu6IiAjNmDFDf/zxh/bu3as33nhD5cuX18iRI/XBBx842j3wwAOy2+2OsJOenq5ly5ape/fujgDVtGlTdezYUWPGjFFISIjuvfdezZo1S9nZ2f9Yx/79+2WM0YgRI/L026hRoyTlPV/+/rPI/cMrKioqz/Z/+gPH399fknTq1Kl/rFW6OIf5tddeU2xsrOx2u0JCQlS+fHl9//33+f77iI2Ndbpvs9l04403Os3hPnjwoB555BEFBQXJ19dX5cuXd/yRkHvM3EBeq1aty6rzclztOQSgdGCOLCynSZMmWrp0qXbt2pXnk+eNGjXS0KFDdfjwYa1bt06RkZG64YYbJF38JWyz2fTVV1/lOx/wr0suTZ06VY888og+//xz/fe//9WTTz6piRMnauPGjapYsWKBteWOOj700EMFzr/MnRuZ668jUoU1ePBgtW/fXp999plWrFihESNGaOLEiVq9erXq1q17xcf9u4LmT+aOXua+7pdffll16tTJt+3fl7S6mtctXRztW7hwob777jvVrl1bX3zxhZ544olCrfhgs9lUtWpVVa1aVe3atVNsbKzmzZunRx99VNLFwH733Xdr3rx5GjlypBYtWqTs7GynETubzaZFixZp48aNWrp0qVasWKHevXtr6tSp2rhx4yWX8srtt2eeeUYJCQn5tvl7sC/oZ5HfdvMPH/aKi4uTJO3ateuylpGbMGGCRowYod69e2vcuHEKCgqSm5ubBg8enGfE/XJcuHBBd955p06cOKHnnntOcXFx8vHx0eHDh/XII49c0TELoyjOIQCuRZCF5fx1Pdn169c7fXiqXr16stvtSkxMVFJSktq2bevYV6VKFRljFBMTo6pVq/7j89SuXVu1a9fWiy++qO+++06NGzfWzJkz9dJLL0nK/y3N8uXLy8/PTxcuXFCrVq2u6PVVrlxZkrR37948I0N79+517P/r63r66af19NNPa9++fapTp46mTp2qf//731f0/Fci94Nu/v7+V/269+/f7zRae/z48XxHFu+66y6VL19e8+bNU8OGDXXmzBk9/PDDV/Tc0sUPkZUrV05//PGH0/YePXro3nvv1ebNmzVv3jzVrVtXNWvWzPP42267TbfddpvGjx+v+fPnq3v37vr444/16KOPFvj2d+4fWWXKlLnifrsaTZo0Ubly5bRgwQI9//zz//iBr0WLFql58+ZOo9aSlJaWlu8ybrkj9bmMMdq/f7/jj7ldu3bp559/1pw5c5w+lLZy5Uqnx+X20+7duy//xf0/l5p6UNTnEICSx5+dsJz69es75rYdPnzYaUTWbrfrlltu0fTp05WZmem0fuz9998v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Wtu3b1d8fLzat2+v48eP52kzdepUbd68WeXLl1f79u0vax3Yq8WHvQAAAEqJU6dO6fXXX9dbb72lnj17SpKqVKmiJk2a6L333lNWVpY++ugj+fj4SJLeeusttW/fXpMnT1ZYWJhatGjhdLx3331XgYGBWrt2re6+++4rqmnAgAHq2LGjJGnGjBlavny5PvjgAz377LOONqNGjdKdd94pSZozZ44qVqyoJUuWqEuXLlf0nJeLEVkAAIBSYs+ePcrOzlbLli3z3XfzzTc7QqwkNW7cWDk5Odq7d68kKTU1VX379lVsbKwCAgLk7++v06dP6+DBg1dcU3x8vOP/PTw8VL9+fe3Zs6fANkFBQapWrVqeNsWhUCOylStXVosWLdS8eXM1b95cUVFRxVUXAADAdcfb2/uqHt+zZ08dP35cr7/+uipXriy73a74+HidPXu2iCosXQo1IturVy8lJyfrscceU3R0tG688Ub17dtXCxYsUEpKSnHVCAAAcF2IjY2Vt7e3Vq1alWdf9erVtXPnTmVmZjq2rV+/Xm5ubqpWrZrj/pNPPqm2bduqZs2astvtOnbs2FXVtHHjRsf/nz9/Xlu3blX16tULbHPy5En9/PPPedoUh0KNyI4ePVqSlJ2drfXr12vt2rVKTEzU3Llzde7cOVWtWlUtWrTQ9OnTi6NWAACAa5qXl5eee+45Pfvss/L09FTjxo119OhR/fDDD+revbtGjRqlnj17avTo0Tp69KgGDhyohx9+WGFhYZIuBuG5c+eqfv36ysjI0NChQ696lHf69OmKjY1V9erV9dprr+nkyZPq3bu3U5uxY8cqODhYYWFheuGFFxQSElIiX7hwRR/2stvtatGihWNC8cmTJzV16lS9+eabmjlzJkEWAACUSqXxm7b+bsSIEfLw8NDIkSP1+++/KyIiQo8//rjKli2rFStWaNCgQbr11ltVtmxZdezYUa+++qrjsR988IH69eunW265RVFRUZowYYKeeeaZq6pn0qRJmjRpknbs2KEbb7xRX3zxhUJCQvK0GTRokPbt26c6depo6dKl8vT0vKrnvRxXFGTPnj2rDRs2KDExUYmJiUpKSlKFChXUqVMnNW3atKhrBAAAuG64ubnphRde0AsvvJBnX+3atbV69eoCH1u3bl1t3rzZaVunTp2c7htjClVP9erVlZSUdMk2TZo0KXDt2EceeUSPPPJIoZ7zchUqyI4dO9YRXCtXrqw77rhD/fr107x58xQZGVksBQIAAAD5KfQc2UqVKmnq1Knq3LmzgoODi6suAAAAFKMJEyZowoQJ+e67/fbbNWPGjBKuqPAKFWS/+uorrVmzRrNnz9agQYNUtWpVNWvWTE2bNlXTpk1Vvnz54qoTAAAARejxxx8v8AsLvL29VaFChX+chtCsWbNCT1UoSoVafishIUGTJk3Sxo0bdezYMU2ePFlly5bVlClTVLFiRdWsWdPpa9KKwuHDh/XQQw8pODhY3t7eql27trZs2eLYb4zRyJEjFRERIW9vb7Vq1Ur79u0r0hoAAACuNUFBQbrxxhvzvVWoUMHV5V2WK/5mLz8/P7Vt21YTJkzQ66+/riFDhui3334r0mHokydPqnHjxipTpoy++uor/fjjj5o6darKlSvnaDNlyhS98cYbmjlzppKSkuTj46OEhARlZWUVWR0AAAAofQq9akFOTo62bNmiNWvWKDExUevXr1dmZqYqVqyo++67T82bNy+y4iZPnqyoqCjNmjXLsS0mJsbx/8YYTZs2TS+++KLuvfdeSdJHH32ksLAwffbZZ+ratWu+x83OzlZ2drbjfkZGRpHVDAAAgJJRqBHZNm3aqFy5crrtttv05ptvKiQkRK+99pr27dunX3/9VbNnz1bPnj2LrLgvvvhC9evXV+fOnRUaGqq6devqvffec+xPTk5WSkqKWrVq5dgWEBCghg0basOGDQUed+LEiQoICHDc+KpdAAAA6ynUiGxgYKBefvllNW/eXLGxscVVk8P//vc/zZgxQ0OGDNHzzz+vzZs368knn5Snp6d69uzp+Frc3G+zyBUWFnbJr8wdPny4hgwZ4rifkZFBmAUAALCYQgXZDz/8UKtWrXKE2OHDhzu9Re/u7q5x48bJy8urSIrLyclR/fr1HUtD1K1bV7t379bMmTOvauTXbrfLbrcXSY0AAABwjUIF2Tlz5ujLL7/U3XffLUl66623VLNmTcd3+P7000+KjIzUU089VSTFRUREqEaNGk7bqlevrsWLF0uSwsPDJUmpqamKiIhwtElNTVWdOnWKpAYAAHANGR1Qws+XXmyHnj17tgYPHqy0tLSrOk6zZs1Up04dTZs2rUjq+icHDhxQTEyMtm/fftV5rVBzZP/973+rX79+Ttvmz5+vNWvWaM2aNXr55Zf16aefXlVBf9W4cWPt3bvXadvPP/+sypUrS7r4wa/w8HCtWrXKsT8jI0NJSUmKj48vsjoAAABKmwceeEA///yzq8twqUIF2V9++UW1a9d23Pfy8pKb2/9/iAYNGujHH38ssuKeeuopbdy4URMmTND+/fs1f/58vfvuu+rfv78kyWazafDgwXrppZf0xRdfaNeuXerRo4ciIyPVoUOHIqsDAACgtPH29lZoaKiry3CpQgXZtLQ0pzmxR48eVXR0tON+Tk6O0/6rdeutt2rJkiVasGCBatWqpXHjxmnatGnq3r27o82zzz6rgQMHql+/frr11lt1+vRpLV++vMjm6QIAAJSUZcuWKTAwUBcuXJAk7dixQzabTcOGDXO0efTRR/XQQw9p9uzZCgwMdGwfPXq06tSpo7lz5yo6OloBAQHq2rWrTp065WiTmZmpHj16yNfXVxEREZo6dWqh6ouOjta4cePUrVs3+fj4qEKFCpo+fbpTG5vNphkzZqhNmzby9vbWDTfcoEWLFl1Bb/yzQgXZihUravfu3QXu//7771WxYsWrLuqv7r77bu3atUtZWVnas2eP+vbt67TfZrNp7NixSklJUVZWlr7++mtVrVq1SGsAAAAoCbfffrtOnTql7du3S5LWrl2rkJAQJSYmOtqsXbtWzZo1y/fxv/zyiz777DMtW7ZMy5Yt09q1azVp0iTH/qFDh2rt2rX6/PPP9d///leJiYnatm1boWp8+eWXdfPNN2v79u0aNmyYBg0apJUrVzq1GTFihDp27KidO3eqe/fu6tq1q/bs2VOo57kchQqybdu21ciRI/P91qw///xTY8aMUbt27YqsOAAAgOtJQECA6tSp4wiuiYmJeuqpp7R9+3adPn1ahw8f1v79+9W0adN8H5+Tk6PZs2erVq1auv322/Xwww87Pkt0+vRpffDBB3rllVfUsmVL1a5dW3PmzNH58+cLVWPjxo01bNgwVa1aVQMHDlSnTp302muvObXp3LmzHn30UVWtWlXjxo1T/fr19eabbxa+Q/5BoYLs888/rxMnTqhatWp6+eWX9fnnn+vzzz/XlClTVK1aNZ08eVLPP/98kRcJAABwvWjatKkSExNljNG3336r+++/X9WrV9e6deu0du1aRUZGFrief3R0tPz8/Bz3IyIidOTIEUkXR2vPnj2r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vviiuXDhgqvLdInTp0+b7t27G3d3d+Ph4WFCQ0NNaGio8fDwMO7u7uahhx4ymZmZri7TJThvCsb1Jn+cMwXjWgMrIMi6kK+vr9m2bVuB+7ds2WJ8fX1LsKLSY+jQoaZ8+fJm5syZJjk52Zw5c8acOXPGJCcnm3feeceEhoaaZ5991tVlukSfPn1MbGysWb58uTl//rxj+/nz582KFStM1apVzaOPPurCCl2H86ZgXG/yxzlTMK41sAKCrAsFBwebxMTEAvevWbPGBAcHl2BFpUdYWJhZvnx5gfuXL19uQkNDS7Ci0iMwMNCsX7++wP3r1q0zgYGBJVhR6cF5UzCuN/njnCkY1xpYAasWuNADDzygnj17asmSJcrIyHBsz8jI0JIlS9SrVy9169bNhRW6zqlTpxQZGVng/oiICGVmZpZgRaVHTk6OPD09C9zv6empnJycEqyo9OC8KRjXm/xxzhSMaw0swdVJ+nqWlZVlHn/8cePp6Wnc3NyMl5eX8fLyMm5ubsbT09P861//MllZWa4u0yXatm1rWrdubY4ePZpn39GjR81dd91l2rVr54LKXO/BBx80devWzfdt4m3btpl69eqZ7t27u6Ay1+O8KRjXm/xxzhSMaw2sgFULSoGMjAxt2bJFqampki5+IrRevXry9/d3cWWuc+jQIbVt21Y//fSTateu7fQJ6127dqlGjRpatmyZoqKiXFxpyTt58qQefPBBrVixQuXKlXN8yvzIkSNKS0tTQkKC5s+fr8DAQNcW6gKcN/+M640zzpmCca2BFRBkUWrl5ORoxYoV2rhxY541L1u3bi03t+t7ZsxPP/2U73qgcXFxLq7MtThvUFicM5fGtQalGUHWxf78808tWLBA69at0x9//CE3NzfdcMMN6tChg1q2bOnq8gBcQ7jeALjWEGRdaP/+/WrVqpX+/PNP2e12/fbbb2rbtq2OHTumLVu26P7779f8+fPl4XH9fgFbft9C1KhRI916660urqz0OnnypJYuXaoePXq4uhSXycnJyXcULScnR7/99psqVarkgqpci+vNpXGtKTyuNSgVXDc9F23atDGPPfaYycnJMcYYM2nSJNOmTRtjjDE///yziY6ONqNGjXJhha6TmppqmjRpYmw2m6lcubJp0KCBadCggalcubKx2WymSZMmJjU11dVllko7duwwbm5uri7D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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "rep.get(\"plot capacity\")" ] @@ -204,7 +270,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.16" + "version": "3.10.9" } }, "nbformat": 4, From eaf963e0c91f6bb78d85615206a4d91c3683924f Mon Sep 17 00:00:00 2001 From: ywpratama <48617743+ywpratama@users.noreply.github.com> Date: Fri, 10 Mar 2023 17:11:34 +0100 Subject: [PATCH 06/12] Revert "Add technology learning activation instruction" This reverts commit 2fcce43c41e73493bcbdd5f953851096c8351657. --- .../westeros_baseline_recursive-dynamic.ipynb | 98 +---- .../westeros_emissions_bounds_daccs.ipynb | 403 ------------------ 2 files changed, 16 insertions(+), 485 deletions(-) delete mode 100644 tutorial/westeros/westeros_emissions_bounds_daccs.ipynb diff --git a/tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb b/tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb index 8de824dc8..ea2dc8b10 100644 --- a/tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb +++ b/tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb @@ -18,22 +18,9 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "application/javascript": [ - "if (typeof IPython !== 'undefined') { IPython.OutputArea.prototype._should_scroll = function(lines){ return false; }}" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "import pandas as pd\n", "import ixmp\n", @@ -46,7 +33,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -62,7 +49,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -80,7 +67,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -96,12 +83,12 @@ "source": [ "## Time to Solve the Model\n", "\n", - "In perfect foresight mode, the solve statement we add is `scen.solve()` without any additional arguments. By default, this will tell MESSAGE to run in the perfect foreseight mode. To run MESSAGE using the recursive dynamic approach, we need to add `gams_args =[\"--foresight=X\"]` argument to the solve statement, with `X` being the length of the foresight windows. This will pass the argument directly to `GAMS`, overiding the default values set in `MESSAGE_master.gms` and `model_setup.gms` scripts. Here, let's use `X=1` as an example. To activate technology cost learning module, an additional gams argument `\"--learningmode=1\"` needs to be included. Hence, the solve statement becomes `scen.solve(gams_args =[\"--foresight=1\",\"--learningmode=1\"])`. Please note that, in the current version, technology cost learning is only available if recursive dynamic mode is activated, i.e., the `X` in foresight argument is not equal to 0." + "In perfect foresight mode, the solve statement we add is `scen.solve()` without any additional arguments. By default, this will tell MESSAGE to run in the perfect foreseight mode. To run MESSAGE using the recursive dynamic approach, we need to add `gams_args =[\"--foresight=X\"]` argument to the solve statement, with `X` being the length of the foresight windows. This will pass the argument directly to `GAMS`, overiding the default values set in `MESSAGE_master.gms` and `model_setup.gms` scripts. Here, let's use `X=1` as an example." ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -111,7 +98,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -120,20 +107,9 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "173795.09375" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "scen.var(\"OBJ\")[\"lvl\"]" ] @@ -147,7 +123,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -169,30 +145,9 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "rep.set_filters(t=[\"coal_ppl\", \"wind_ppl\"])\n", "rep.get(\"plot activity\")" @@ -209,30 +164,9 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAArIAAAHTCAYAAADbOfviAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88F64QAAAACXBIWXMAAA9hAAAPYQGoP6dpAABKtUlEQVR4nO3dfXzO9f////uxzY7NTm2zM8aWxpwVEQ3lNAsp5SRShKh3iJSicp7TUjoRnSJvVHir6BNvYYqYc1ESvSdSm9NtTJuTPX9/+O74dbRNxrZjL27Xy+W41PF6PY/X8Tiee3ntvufxPJ6HzRhjBAAAAFiMm6sLAAAAAK4EQRYAAACWRJAFAACAJRFkAQAAYEkEWQAAAFgSQRYAAACWRJAFAACAJRFkAQAAYEkEWQAAAFgSQRYAcE2YPXu2bDabDhw44OpSAJQQgiws49NPP5XNZtOSJUvy7Lv55ptls9m0Zs2aPPsqVaqkRo0aFXk9EyZM0GeffVbkxy0Jo0ePls1mK/CWkpLi6hKL1dGjRzVo0CDFxcXJ29tboaGhatCggZ577jmdPn26yJ/vzJkzGj16tBITE4v82EVlyZIlatOmjUJCQuTp6anIyEh16dJFq1evdnVpV+Xtt9/W7NmzXV0GgGLi4eoCgMvVpEkTSdK6det03333ObZnZGRo9+7d8vDw0Pr169W8eXPHvkOHDunQoUPq2rVrkdczYcIEderUSR06dCjyY5eUGTNmyNfXN8/2wMDAki+mhJw4cUL169dXRkaGevfurbi4OB0/flzff/+9ZsyYoX/961/59snVOHPmjMaMGSNJatasWZEe+2oZY9S7d2/Nnj1bdevW1ZAhQxQeHq4//vhDS5YsUcuWLbV+/fpi+WOwqD388MPq2rWr7Ha7Y9vbb7+tkJAQPfLII64rDECxIcjCMiIjIxUTE6N169Y5bd+wYYOMMercuXOefbn3c0NwaZeVlSVPT0+5uZXMmyWdOnVSSEhIiTzXpWRmZsrHx6dEnuuDDz7QwYMH8w1nGRkZ8vT0LJE6SoupU6dq9uzZGjx4sF599VXZbDbHvhdeeEFz586Vh4c1flW4u7vL3d3d1WUAKEFMLYClNGnSRNu3b9eff/7p2LZ+/XrVrFlTbdq00caNG5WTk+O0z2azqXHjxo5t//73v1WvXj15e3srKChIXbt21aFDh5yeZ9++ferYsaPCw8Pl5eWlihUrqmvXrkpPT5ck2Ww2ZWZmas6cOY634/864nP48GH17t1bYWFhstvtqlmzpj788EOn50hMTJTNZtPHH3+sF198URUqVFDZsmWVkZEhSVq4cKGjzpCQED300EM6fPiw0zFSUlLUq1cvVaxYUXa7XREREbr33nuLbI5gbo2ffvqpxo8fr4oVK8rLy0stW7bU/v3787RPSkrSXXfdpYCAAJUtW1ZNmzbV+vXrndrkTmv48ccf9eCDD6pcuXKOPzRycnI0evRoRUZGqmzZsmrevLl+/PFHRUdHO/r3f//7n2w2m1577bU8z//dd9/JZrNpwYIFBb6mX375Re7u7rrtttvy7PP395eXl5ckadSoUSpTpoyOHj2ap12/fv0UGBiorKwsSdKWLVuUkJCgkJAQeXt7KyYmRr1795YkHThwQOXLl5ckjRkzxnG+jB492nG8n376SZ06dVJQUJC8vLxUv359ffHFF07PmTv/c926dXryySdVvnx5BQYG6rHHHtPZs2eVlpamHj16qFy5cipXrpyeffZZGWMK7AdJ+vPPPzVx4kTFxcXplVdecQqxuR5++GE1aNBA0sXR7GeeeUa1a9eWr6+v/P391aZNG+3cudPpMbnnzSeffKLnn39e4eHh8vHx0T333JPn39q3336rzp07q1KlSrLb7YqKitJTTz3l9G/8r/3UpUsXlS9fXt7e3qpWrZpeeOGFPH2Ue/5HR0frhx9+0Nq1ax393qxZs6s+hwCUHtb4Mxv4f5o0aaK5c+cqKSnJ8RZt7shao0aNlJ6ert27d+umm25y7IuLi1NwcLAkafz48RoxYoS6dOmiRx99VEePHtWbb76pO+64Q9u3b1dgYKDOnj2rhIQEZWdna+DAgQoPD9fhw4e1bNkypaWlKSAgQHPnztWjjz6qBg0aqF+/fpKkKlWqSJJSU1N12223yWazacCAASpfvry++uor9enTRxkZGRo8eLDTaxo3bpw8PT31zDPPKDs7W56enpo9e7Z69eqlW2+9VRMnTlRqaqpef/11rV+/3lGnJHXs2FE//PCDBg4cqOjoaB05ckQrV67UwYMHFR0d/Y/9eeLEiTzbPDw88kwtmDRpktzc3PTMM88oPT1dU6ZMUffu3ZWUlORos3r1arVp00b16tXTqFGj5ObmplmzZqlFixb69ttvHWEoV+fOnRUbG6sJEyY4Atfw4cM1ZcoUtW/fXgkJCdq5c6cSEhIcgVGSbrjhBjVu3Fjz5s3TU0895XTMefPmyc/PT/fee2+Br7ly5cq6cOGC5s6dq549exbY7uGHH9bYsWP1ySefaMCAAY7tZ8+e1aJFi9SxY0d5eXnpyJEjat26tcqXL69hw4YpMDBQBw4c0H/+8x9JUvny5R1TFu677z7df//9kuQ4R3/44Qc1btxYFSpU0LBhw+Tj46NPP/1UHTp00OLFi52m0UhynJNjxozRxo0b9e677yowMFDfffedKlWqpAkTJuj//u//9PLLL6tWrVrq0aNHga9x3bp1OnHihAYPHnxZI5n/+9//9Nlnn6lz586KiYlRamqq3nnnHTVt2lQ//vijIiMjndqPHz9eNptNzz33nI4cOaJp06apVatW2rFjh7y9vSVd/IPtzJkz+te//qXg4GBt2rRJb775pn777TctXLjQcazvv/9et99+u8qUKaN+/fopOjpav/zyi5YuXarx48fnW++0adM0cOBA+fr6OgJvWFjYVZ9DAEoRA1jIDz/8YCSZcePGGWOMOXfunPHx8TFz5swxxhgTFhZmpk+fbowxJiMjw7i7u5u+ffsaY4w5cOCAcXd3N+PHj3c65q5du4yHh4dj+/bt240ks3DhwkvW4uPjY3r27Jlne58+fUxERIQ5duyY0/auXbuagIAAc+bMGWOMMWvWrDGSzA033ODYZowxZ8+eNaGhoaZWrVrmzz//dGxftmyZkWRGjhxpjDHm5MmTRpJ5+eWXL91p+Rg1apSRlO+tWrVqjna5NVavXt1kZ2c7tr/++utGktm1a5cxxpicnBwTGxtrEhISTE5OjqPdmTNnTExMjLnzzjvzPHe3bt2cakpJSTEeHh6mQ4cOTttHjx5tJDn19TvvvGMkmT179jj1W0hISL4/k78/T/ny5Y0kExcXZx5//HEzf/58k5aWlqdtfHy8adiwodO2//znP0aSWbNmjTHGmCVLlhhJZvPmzQU+59GjR40kM2rUqDz7WrZsaWrXrm2ysrIc23JyckyjRo1MbGysY9usWbOMpDx9HB8fb2w2m3n88ccd286fP28qVqxomjZtesm+yP05Llmy5JLtcmVlZZkLFy44bUtOTjZ2u92MHTvWsS33vKlQoYLJyMhwbP/000+NJPP66687tv313M81ceJEY7PZzK+//urYdscddxg/Pz+nbcYYp77I7aPk5GTHtpo1a+bbD1dzDgEoPZhaAEupXr26goODHXNfd+7cqczMTMdcx0aNGjneyt6wYYMuXLjgeNv6P//5j3JyctSlSxcdO3bMcQsPD1dsbKxjxYOAgABJ0ooVK3TmzJlC1WeM0eLFi9W+fXsZY5yeJyEhQenp6dq2bZvTY3r27OkYnZIuvk195MgRPfHEE463uSWpXbt2iouL05dffilJ8vb2lqenpxITE3Xy5MlC1Zlr8eLFWrlypdNt1qxZedr16tXLae7o7bffLuniCJ0k7dixQ/v27dODDz6o48ePO15zZmamWrZsqW+++cZpyockPf744073V61apfPnz+uJJ55w2j5w4MA89XTp0kVeXl6aN2+eY9uKFSt07NgxPfTQQ5d8zWFhYdq5c6cef/xxnTx5UjNnztSDDz6o0NBQjRs3zunt+B49eigpKUm//PKLY9u8efMUFRWlpk2bSvr/Pxi3bNkynTt37pLP/XcnTpzQ6tWr1aVLF506dcrRb8ePH1dCQoL27duXZzpJnz59nKYANGzYUMYY9enTx7HN3d1d9evXd/x8CpI7jcXPz++y6rXb7Y752xcuXNDx48fl6+uratWq5TmvpYv999djd+rUSREREfq///s/x7a/nvuZmZk6duyYGjVqJGOMtm/fLuniKhPffPONevfurUqVKjk9R37TIS7H1ZxDAEoPgiwsxWazqVGjRo65sOvXr1doaKhuvPFGSc5BNve/uUF23759MsYoNjZW5cuXd7rt2bNHR44ckSTFxMRoyJAhev/99xUSEqKEhARNnz7dMT/2Uo4ePaq0tDS9++67eZ6jV69ekuR4nlwxMTFO93/99VdJUrVq1fIcPy4uzrHfbrdr8uTJ+uqrrxQWFqY77rhDU6ZMKdTSWXfccYdatWrldIuPj8/T7u/hoVy5cpLkCND79u2TdDGU//11v//++8rOzs7TfwW97tyfZa6goCDH8+UKDAxU+/btNX/+fMe2efPmqUKFCmrRosU/vu6IiAjNmDFDf/zxh/bu3as33nhD5cuX18iRI/XBBx842j3wwAOy2+2OsJOenq5ly5ape/fujgDVtGlTdezYUWPGjFFISIjuvfdezZo1S9nZ2f9Yx/79+2WM0YgRI/L026hRoyTlPV/+/rPI/cMrKioqz/Z/+gPH399fknTq1Kl/rFW6OIf5tddeU2xsrOx2u0JCQlS+fHl9//33+f77iI2Ndbpvs9l04403Os3hPnjwoB555BEFBQXJ19dX5cuXd/yRkHvM3EBeq1aty6rzclztOQSgdGCOLCynSZMmWrp0qXbt2pXnk+eNGjXS0KFDdfjwYa1bt06RkZG64YYbJF38JWyz2fTVV1/lOx/wr0suTZ06VY888og+//xz/fe//9WTTz6piRMnauPGjapYsWKBteWOOj700EMFzr/MnRuZ668jUoU1ePBgtW/fXp999plWrFihESNGaOLEiVq9erXq1q17xcf9u4LmT+aOXua+7pdffll16tTJt+3fl7S6mtctXRztW7hwob777jvVrl1bX3zxhZ544olCrfhgs9lUtWpVVa1aVe3atVNsbKzmzZunRx99VNLFwH733Xdr3rx5GjlypBYtWqTs7GynETubzaZFixZp48aNWrp0qVasWKHevXtr6tSp2rhx4yWX8srtt2eeeUYJCQn5tvl7sC/oZ5HfdvMPH/aKi4uTJO3ateuylpGbMGGCRowYod69e2vcuHEKCgqSm5ubBg8enGfE/XJcuHBBd955p06cOKHnnntOcXFx8vHx0eHDh/XII49c0TELoyjOIQCuRZCF5fx1Pdn169c7fXiqXr16stvtSkxMVFJSktq2bevYV6VKFRljFBMTo6pVq/7j89SuXVu1a9fWiy++qO+++06NGzfWzJkz9dJLL0nK/y3N8uXLy8/PTxcuXFCrVq2u6PVVrlxZkrR37948I0N79+517P/r63r66af19NNPa9++fapTp46mTp2qf//731f0/Fci94Nu/v7+V/269+/f7zRae/z48XxHFu+66y6VL19e8+bNU8OGDXXmzBk9/PDDV/Tc0sUPkZUrV05//PGH0/YePXro3nvv1ebNmzVv3jzVrVtXNWvWzPP42267TbfddpvGjx+v+fPnq3v37vr444/16KOPFvj2d+4fWWXKlLnifrsaTZo0Ubly5bRgwQI9//zz//iBr0WLFql58+ZOo9aSlJaWlu8ybrkj9bmMMdq/f7/jj7ldu3bp559/1pw5c5w+lLZy5Uqnx+X20+7duy//xf0/l5p6UNTnEICSx5+dsJz69es75rYdPnzYaUTWbrfrlltu0fTp05WZmem0fuz9998v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Wtu3b1d8fLzat2+v48eP52kzdepUbd68WeXLl1f79u0vax3Yq8WHvQAAAEqJU6dO6fXXX9dbb72lnj17SpKqVKmiJk2a6L333lNWVpY++ugj+fj4SJLeeusttW/fXpMnT1ZYWJhatGjhdLx3331XgYGBWrt2re6+++4rqmnAgAHq2LGjJGnGjBlavny5PvjgAz377LOONqNGjdKdd94pSZozZ44qVqyoJUuWqEuXLlf0nJeLEVkAAIBSYs+ePcrOzlbLli3z3XfzzTc7QqwkNW7cWDk5Odq7d68kKTU1VX379lVsbKwCAgLk7++v06dP6+DBg1dcU3x8vOP/PTw8VL9+fe3Zs6fANkFBQapWrVqeNsWhUCOylStXVosWLdS8eXM1b95cUVFRxVUXAADAdcfb2/uqHt+zZ08dP35cr7/+uipXriy73a74+HidPXu2iCosXQo1IturVy8lJyfrscceU3R0tG688Ub17dtXCxYsUEpKSnHVCAAAcF2IjY2Vt7e3Vq1alWdf9erVtXPnTmVmZjq2rV+/Xm5ubqpWrZrj/pNPPqm2bduqZs2astvtOnbs2FXVtHHjRsf/nz9/Xlu3blX16tULbHPy5En9/PPPedoUh0KNyI4ePVqSlJ2drfXr12vt2rVKTEzU3Llzde7cOVWtWlUtWrTQ9OnTi6NWAACAa5qXl5eee+45Pfvss/L09FTjxo119OhR/fDDD+revbtGjRqlnj17avTo0Tp69KgGDhyohx9+WGFhYZIuBuG5c+eqfv36ysjI0NChQ696lHf69OmKjY1V9erV9dprr+nkyZPq3bu3U5uxY8cqODhYYWFheuGFFxQSElIiX7hwRR/2stvtatGihWNC8cmTJzV16lS9+eabmjlzJkEWAACUSqXxm7b+bsSIEfLw8NDIkSP1+++/KyIiQo8//rjKli2rFStWaNCgQbr11ltVtmxZdezYUa+++qrjsR988IH69eunW265RVFRUZowYYKeeeaZq6pn0qRJmjRpknbs2KEbb7xRX3zxhUJCQvK0GTRokPbt26c6depo6dKl8vT0vKrnvRxXFGTPnj2rDRs2KDExUYmJiUpKSlKFChXUqVMnNW3atKhrBAAAuG64ubnphRde0AsvvJBnX+3atbV69eoCH1u3bl1t3rzZaVunTp2c7htjClVP9erVlZSUdMk2TZo0KXDt2EceeUSPPPJIoZ7zchUqyI4dO9YRXCtXrqw77rhD/fr107x58xQZGVksBQIAAAD5KfQc2UqVKmnq1Knq3LmzgoODi6suAAAAFKMJEyZowoQJ+e67/fbbNWPGjBKuqPAKFWS/+uorrVmzRrNnz9agQYNUtWpVNWvWTE2bNlXTpk1Vvnz54qoTAAAARejxxx8v8AsLvL29VaFChX+chtCsWbNCT1UoSoVafishIUGTJk3Sxo0bdezYMU2ePFlly5bVlClTVLFiRdWsWdPpa9KKwuHDh/XQQw8pODhY3t7eql27trZs2eLYb4zRyJEjFRERIW9vb7Vq1Ur79u0r0hoAAACuNUFBQbrxxhvzvVWoUMHV5V2WK/5mLz8/P7Vt21YTJkzQ66+/riFDhui3334r0mHokydPqnHjxipTpoy++uor/fjjj5o6darKlSvnaDNlyhS98cYbmjlzppKSkuTj46OEhARlZWUVWR0AAAAofQq9akFOTo62bNmiNWvWKDExUevXr1dmZqYqVqyo++67T82bNy+y4iZPnqyoqCjNmjXLsS0mJsbx/8YYTZs2TS+++KLuvfdeSdJHH32ksLAwffbZZ+ratWu+x83OzlZ2drbjfkZGRpHVDAAAgJJRqBHZNm3aqFy5crrtttv05ptvKiQkRK+99pr27dunX3/9VbNnz1bPnj2LrLgvvvhC9evXV+fOnRUaGqq6devqvffec+xPTk5WSkqKWrVq5dgWEBCghg0basOGDQUed+LEiQoICHDc+KpdAAAA6ynUiGxgYKBefvllNW/eXLGxscVVk8P//vc/zZgxQ0OGDNHzzz+vzZs368knn5Snp6d69uzp+Frc3G+zyBUWFnbJr8wdPny4hgwZ4rifkZFBmAUAALCYQgXZDz/8UKtWrXKE2OHDhzu9Re/u7q5x48bJy8urSIrLyclR/fr1HUtD1K1bV7t379bMmTOvauTXbrfLbrcXSY0AAABwjUIF2Tlz5ujLL7/U3XffLUl66623VLNmTcd3+P7000+KjIzUU089VSTFRUREqEaNGk7bqlevrsWLF0uSwsPDJUmpqamKiIhwtElNTVWdOnWKpAYAAHANGR1Qws+XXmyHnj17tgYPHqy0tLSrOk6zZs1Up04dTZs2rUjq+icHDhxQTEyMtm/fftV5rVBzZP/973+rX79+Ttvmz5+vNWvWaM2aNXr55Zf16aefXlVBf9W4cWPt3bvXadvPP/+sypUrS7r4wa/w8HCtWrXKsT8jI0NJSUmKj48vsjoAAABKmwceeEA///yzq8twqUIF2V9++UW1a9d23Pfy8pKb2/9/iAYNGujHH38ssuKeeuopbdy4URMmTND+/fs1f/58vfvuu+rfv78kyWazafDgwXrppZf0xRdfaNeuXerRo4ciIyPVoUOHIqsDAACgtPH29lZoaKiry3CpQgXZtLQ0pzmxR48eVXR0tON+Tk6O0/6rdeutt2rJkiVasGCBatWqpXHjxmnatGnq3r27o82zzz6rgQMHql+/frr11lt1+vRpLV++vMjm6QIAAJSUZcuWKTAwUBcuXJAk7dixQzabTcOGDXO0efTRR/XQQw9p9uzZCgwMdGwfPXq06tSpo7lz5yo6OloBAQHq2rWrTp065WiTmZmpHj16yNfXVxEREZo6dWqh6ouOjta4cePUrVs3+fj4qEKFCpo+fbpTG5vNphkzZqhNmzby9vbWDTfcoEWLFl1Bb/yzQgXZihUravfu3QXu//7771WxYsWrLuqv7r77bu3atUtZWVnas2eP+vbt67TfZrNp7NixSklJUVZWlr7++mtVrVq1SGsAAAAoCbfffrtOnTql7du3S5LWrl2rkJAQJSYmOtqsXbtWzZo1y/fxv/zyiz777DMtW7ZMy5Yt09q1azVp0iTH/qFDh2rt2rX6/PPP9d///leJiYnatm1boWp8+eWXdfPNN2v79u0aNmyYBg0apJUrVzq1GTFihDp27KidO3eqe/fu6tq1q/bs2VOo57kchQqybdu21ciRI/P91qw///xTY8aMUbt27YqsOAAAgOtJQECA6tSp4wiuiYmJeuqpp7R9+3adPn1ahw8f1v79+9W0adN8H5+Tk6PZs2erVq1auv322/Xwww87Pkt0+vRpffDBB3rllVfUsmVL1a5dW3PmzNH58+cLVWPjxo01bNgwVa1aVQMHDlSnTp302muvObXp3LmzHn30UVWtWlXjxo1T/fr19eabbxa+Q/5BoYLs888/rxMnTqhatWp6+eWX9fnnn+vzzz/XlClTVK1aNZ08eVLPP/98kRcJAABwvWjatKkSExNljNG3336r+++/X9WrV9e6deu0du1aRUZGFrief3R0tPz8/Bz3IyIidOTIEUkXR2vPnj2r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vviiuXDhgqvLdInTp0+b7t27G3d3d+Ph4WFCQ0NNaGio8fDwMO7u7uahhx4ymZmZri7TJThvCsb1Jn+cMwXjWgMrIMi6kK+vr9m2bVuB+7ds2WJ8fX1LsKLSY+jQoaZ8+fJm5syZJjk52Zw5c8acOXPGJCcnm3feeceEhoaaZ5991tVlukSfPn1MbGysWb58uTl//rxj+/nz582KFStM1apVzaOPPurCCl2H86ZgXG/yxzlTMK41sAKCrAsFBwebxMTEAvevWbPGBAcHl2BFpUdYWJhZvnx5gfuXL19uQkNDS7Ci0iMwMNCsX7++wP3r1q0zgYGBJVhR6cF5UzCuN/njnCkY1xpYAasWuNADDzygnj17asmSJcrIyHBsz8jI0JIlS9SrVy9169bNhRW6zqlTpxQZGVng/oiICGVmZpZgRaVHTk6OPD09C9zv6empnJycEqyo9OC8KRjXm/xxzhSMaw0swdVJ+nqWlZVlHn/8cePp6Wnc3NyMl5eX8fLyMm5ubsbT09P861//MllZWa4u0yXatm1rWrdubY4ePZpn39GjR81dd91l2rVr54LKXO/BBx80devWzfdt4m3btpl69eqZ7t27u6Ay1+O8KRjXm/xxzhSMaw2sgFULSoGMjAxt2bJFqampki5+IrRevXry9/d3cWWuc+jQIbVt21Y//fSTateu7fQJ6127dqlGjRpatmyZoqKiXFxpyTt58qQefPBBrVixQuXKlXN8yvzIkSNKS0tTQkKC5s+fr8DAQNcW6gKcN/+M640zzpmCca2BFRBkUWrl5ORoxYoV2rhxY541L1u3bi03t+t7ZsxPP/2U73qgcXFxLq7MtThvUFicM5fGtQalGUHWxf78808tWLBA69at0x9//CE3NzfdcMMN6tChg1q2bOnq8gBcQ7jeALjWEGRdaP/+/WrVqpX+/PNP2e12/fbbb2rbtq2OHTumLVu26P7779f8+fPl4XH9fgFbft9C1KhRI916660urqz0OnnypJYuXaoePXq4uhSXycnJyXcULScnR7/99psqVarkgqpci+vNpXGtKTyuNSgVXDc9F23atDGPPfaYycnJMcYYM2nSJNOmTRtjjDE///yziY6ONqNGjXJhha6TmppqmjRpYmw2m6lcubJp0KCBadCggalcubKx2WymSZMmJjU11dVllko7duwwbm5uri7D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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "rep.get(\"plot capacity\")" ] @@ -270,7 +204,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.9" + "version": "3.9.16" } }, "nbformat": 4, diff --git a/tutorial/westeros/westeros_emissions_bounds_daccs.ipynb b/tutorial/westeros/westeros_emissions_bounds_daccs.ipynb deleted file mode 100644 index bdbfe481a..000000000 --- a/tutorial/westeros/westeros_emissions_bounds_daccs.ipynb +++ /dev/null @@ -1,403 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "3ce427fd", - "metadata": {}, - "source": [ - "# Adding DACCS in MESSAGE\n", - "In the previous tutorials, we have learnt how to create a baseline scenario (`westeros_baseline.ipynb`) and add emissions bounds (`westeros_emissions_bounds.ipynb`) to the baseline scenario. Here, we will show how to include an additional/new technology to a MESSAGE model. While the combination of currently existing technologies might be able to deliver the Paris targets, the deployment of some new technologies might improve the probability of meeting the targets and/or reducing the costs. These technologies include CO2 removal (CDR) technologies. Hence, in this tutorial, we will use direct air carbon capture and storage (DACCS) as an example of new technologies to be considered in climate mitigation pathways. \n", - "\n", - "In order to smoothly follow this tutorial, you have to alrady have the MESSAGEix framework installed and working. Moreover, you should have run the Westeros baseline and emissions bounds scenarios successfully as this tutorial is built on top of those scenarios.\n", - "\n", - "If all set, we can start by importing all the packages we need and connect to a database that store the scenario input and results. We can also name the model as `Westeros Electrified` here." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "239a17a2", - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "import ixmp\n", - "import message_ix\n", - "\n", - "from message_ix.utils import make_df\n", - "\n", - "%matplotlib inline\n", - "\n", - "mp = ixmp.Platform()\n", - "\n", - "model = \"Westeros Electrified\"" - ] - }, - { - "cell_type": "markdown", - "id": "c82f18ff", - "metadata": {}, - "source": [ - "After we are connected to the database, we can call the prevously run `\"emission_bound\"` scenario as our base model and clone the data before we start adding DACCS to the model. As prevoiusly mentioned, to run this tutorial, you have to have succesfully run the `\"emission_bound\"` scenario, which was built based on the `\"baseline\"` scenario." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9a868ad2", - "metadata": {}, - "outputs": [], - "source": [ - "base = message_ix.Scenario(mp, model=model, scenario=\"emission_bound\")\n", - "\n", - "scen = base.clone(\n", - " model,\n", - " \"emission_bound_DACCS\",\n", - " \"introducing an upper bound on emissions\",\n", - " keep_solution=False,)\n", - "scen.check_out()\n", - "\n", - "year_df = scen.vintage_and_active_years()\n", - "vintage_years, act_years = year_df[\"year_vtg\"], year_df[\"year_act\"]\n", - "model_horizon = scen.set(\"year\")\n", - "country = \"Westeros\"" - ] - }, - { - "cell_type": "markdown", - "id": "634cecd6", - "metadata": {}, - "source": [ - "Now, let's call the list of historical and model orizon years so we can use these lists for the next steps." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "0a2bb27c", - "metadata": {}, - "outputs": [], - "source": [ - "history = [690]\n", - "model_horizon = [700, 710, 720]" - ] - }, - { - "cell_type": "markdown", - "id": "b5db71ca", - "metadata": {}, - "source": [ - "# Adding DACCS description\n", - "First step of adding DACCS as a technology in the model is by including DACCS into the `\"technology\"` set." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3b203192", - "metadata": {}, - "outputs": [], - "source": [ - "scen.add_set(\"technology\", [\"DACCS\"])" - ] - }, - { - "cell_type": "markdown", - "id": "017c5ca3", - "metadata": {}, - "source": [ - "Similar to what we did when generating the `\"baseline\"` scenario, the first thing we need to do is defining the input and output comodities of each technology. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c74cf466", - "metadata": {}, - "outputs": [], - "source": [ - "# Some common values to be used for both the \"input\" and \"output\" parameters\n", - "base = dict(\n", - " node_loc=country,\n", - " year_vtg=vintage_years,\n", - " year_act=act_years,\n", - " mode=\"standard\",\n", - " time=\"year\",\n", - " unit=\"-\",\n", - ")\n", - "\n", - "# Use the message_ix utility function make_df() to create a base data frame for\n", - "# different \"input\" parameter values\n", - "base_input = make_df(\"input\", **base, node_origin=country, time_origin=\"year\")\n", - "\n", - "# Create a base data frame for different \"output\" parameter values\n", - "base_output = make_df(\"output\", **base, node_dest=country, time_dest=\"year\")" - ] - }, - { - "cell_type": "markdown", - "id": "74bc41d1", - "metadata": {}, - "source": [ - "In this example, DACCS is described as a technology that consumes electricity in order to remove CO2 from the atmosphere. This electricity is assumed to be obtained from the grid. Hence, we define DACCS input as final energy in the form of electricity." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "0dae391a", - "metadata": {}, - "outputs": [], - "source": [ - "daccs_in = base_input.assign(\n", - " technology=\"DACCS\", commodity=\"electricity\", level=\"final\", value=1.0\n", - ")\n", - "scen.add_par(\"input\", daccs_in)" - ] - }, - { - "cell_type": "markdown", - "id": "8e087a2c", - "metadata": {}, - "source": [ - "Then, we can also add emissions and capacity factors as well as the technical lifetime of the technology. As can be seen in the code block below, the emissions factor has a negative value, showing that the technology removes insted of emits CO2." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c80ec39f", - "metadata": {}, - "outputs": [], - "source": [ - "emission_factor = make_df(\n", - " \"emission_factor\",\n", - " node_loc=country,\n", - " year_vtg=vintage_years,\n", - " year_act=act_years,\n", - " mode=\"standard\",\n", - " unit=\"tCO2/kWa\",\n", - " technology=\"DACCS\",\n", - " emission=\"CO2\",\n", - " value=-20,\n", - ")\n", - "scen.add_par(\"emission_factor\", emission_factor)\n", - "\n", - "capacity_factor = make_df(\n", - " \"capacity_factor\",\n", - " node_loc=country,\n", - " year_vtg=vintage_years,\n", - " year_act=act_years,\n", - " time=\"year\",\n", - " unit=\"-\",\n", - " technology='DACCS',\n", - " value=1,\n", - ")\n", - "scen.add_par(\"capacity_factor\", capacity_factor)\n", - " \n", - "lifetime = make_df(\n", - " \"technical_lifetime\",\n", - " node_loc=country,\n", - " year_vtg=model_horizon,\n", - " unit=\"y\",\n", - " technology='DACCS',\n", - " value=20,\n", - ")\n", - "scen.add_par(\"technical_lifetime\", lifetime)" - ] - }, - { - "cell_type": "markdown", - "id": "cef799ae", - "metadata": {}, - "source": [ - "We also asume that DACCS is a first of a kind technology, i.e., the technology has never been historically deployed. Accordingly, to allow the technology to be installed in the system, we need to define initial deployment (`\"initial_new_capacity_up\"`) and capacity growth (`\"growth_new_capacity_up\"`) rates" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ad76ac94", - "metadata": {}, - "outputs": [], - "source": [ - "initial_newcapacity_up = {\n", - " \"DACCS\":0.5,\n", - "}\n", - "\n", - "for tec,val in initial_newcapacity_up.items():\n", - " df = make_df(\n", - " \"initial_new_capacity_up\",\n", - " node_loc=country,\n", - " year_vtg=model_horizon,\n", - " time=\"year\",\n", - " unit=\"GW\",\n", - " technology=tec,\n", - " value=val,\n", - " )\n", - " scen.add_par(\"initial_new_capacity_up\", df)\n", - "\n", - "growth_newcapacity_up = {\n", - " \"DACCS\":0.05,\n", - "}\n", - "\n", - "for tec,val in growth_newcapacity_up.items():\n", - " dfgrowth = make_df(\n", - " \"growth_new_capacity_up\",\n", - " node_loc=country,\n", - " year_vtg=model_horizon,\n", - " time=\"year\",\n", - " unit=\"-\",\n", - " technology=tec,\n", - " value=val,\n", - " )\n", - " scen.add_par(\"growth_new_capacity_up\", dfgrowth)" - ] - }, - { - "cell_type": "markdown", - "id": "dfe89d5e", - "metadata": {}, - "source": [ - "The last thing we need to do in describing DACCS is adding the technology costs data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3ae4574b", - "metadata": {}, - "outputs": [], - "source": [ - "# Add a new unit for ixmp to recognize as valid\n", - "mp.add_unit(\"USD/kW\")\n", - "\n", - "# in $ / kW (specific investment cost)\n", - "capex = make_df(\n", - " \"inv_cost\",\n", - " node_loc=country,\n", - " year_vtg=model_horizon,\n", - " unit=\"USD/kW\",\n", - " technology='DACCS',\n", - " value=2500,\n", - ")\n", - "scen.add_par(\"inv_cost\", capex)\n", - " \n", - "# in $ / kW / year (every year a fixed quantity is destinated to cover part of the O&M costs\n", - "# based on the size of the plant, e.g. lightning, labor, scheduled maintenance, etc.)\n", - "\n", - "omfix = make_df(\n", - " \"fix_cost\",\n", - " node_loc=country,\n", - " year_vtg=vintage_years,\n", - " year_act=act_years,\n", - " unit=\"USD/kWa\",\n", - " technology='DACCS',\n", - " value=5,\n", - ")\n", - "scen.add_par(\"fix_cost\", omfix)\n", - "\n", - "# In $ / kWa (costs associated to the degradation of equipment\n", - "# when the plant is functioning per unit of energy consumed\n", - "# kW·year = 8760 kWh in generating electricity. Therefore the costs represents USD per 8760 kWh\n", - "# of electricity consumed.\n", - "\n", - "omvar = make_df(\n", - " \"var_cost\",\n", - " node_loc=country,\n", - " year_vtg=vintage_years,\n", - " year_act=act_years,\n", - " mode=\"standard\",\n", - " time=\"year\",\n", - " unit=\"USD/kWa\",\n", - " technology='DACCS',\n", - " value=0,\n", - ")\n", - "scen.add_par(\"var_cost\", omvar)" - ] - }, - { - "cell_type": "markdown", - "id": "54cc0111", - "metadata": {}, - "source": [ - "# Solve Statement and Plotting Results\n", - "Finally, this is the solve statement and plotting results command" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "fb160143", - "metadata": {}, - "outputs": [], - "source": [ - "scen.commit(comment=\"Introducing emissions, DACCS technology, and setting an upper bound\")\n", - "scen.set_as_default()\n", - "\n", - "scen.solve()\n", - "scen.var(\"OBJ\")[\"lvl\"]\n", - "\n", - "# Create a Reporter object to describe and carry out reporting\n", - "# calculations and operations (like plotting) based on `scenario`\n", - "# Add keys like \"plot activity\" to describe reporting operations.\n", - "# See tutorial/utils/plotting.py\n", - "from message_ix.reporting import Reporter\n", - "from message_ix.util.tutorial import prepare_plots\n", - "\n", - "rep = Reporter.from_scenario(scen)\n", - "\n", - "prepare_plots(rep)\n", - "\n", - "# Only show a subset of technologies in the follow plots;\n", - "# e.g. exclude \"bulb\" and \"grid\"\n", - "rep.set_filters(t=[\"coal_ppl\", \"wind_ppl\",\"DACCS\"])\n", - "\n", - "# Trigger the calculation and plotting\n", - "rep.get(\"plot activity\")\n", - "\n", - "# Create a different plot. The same filters are still active.\n", - "rep.get(\"plot capacity\")\n", - "\n", - "# Replace the technology filters with a commodity filter;\n", - "# show only \"light\" and not e.g. \"electricity\".\n", - "rep.set_filters(t=None, c=[\"light\"])\n", - "\n", - "# Create a price plot\n", - "rep.get(\"plot prices\")\n", - "\n", - "mp.close_db()" - ] - }, - { - "cell_type": "markdown", - "id": "3a6671bf", - "metadata": {}, - "source": [ - "# All Done\n", - "Voila! You can now see DACCS included in the model. Congratulations!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.16" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} From 92a4dd8933d0f9bb21bfbae0a7007864e228e1c2 Mon Sep 17 00:00:00 2001 From: ywpratama <48617743+ywpratama@users.noreply.github.com> Date: Mon, 13 Mar 2023 04:58:17 +0100 Subject: [PATCH 07/12] Delete westeros_baseline_recursive-dynamic.ipynb --- .../westeros_baseline_recursive-dynamic.ipynb | 212 ------------------ 1 file changed, 212 deletions(-) delete mode 100644 tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb diff --git a/tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb b/tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb deleted file mode 100644 index ea2dc8b10..000000000 --- a/tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb +++ /dev/null @@ -1,212 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Westeros Tutorial: Running MESSAGE in Recursive Dynamic Mode\n", - "\n", - "While considering the full time horizon in a single run is useful for a long-term energy systems planning, the recursive dynamic approach can provide insights that reflect the relevant foresight windows decision makers can have in making adaptive and robust planning.\n", - "\n", - "In addition to running the model with the perfect foresights, MESSAGE can also be run using the recursive dynamic approach. Here, the model is run iteratively throughout the periods with key decision variables from the previous periods, or iterations, are fixed so that new informations do not alter decisions that are already made in the previous periods. These variables\n", - "include $CAP$ , $CAP\\_NEW$, $ACT$, and $EXT$. \n", - "\n", - "In this tutorial, we will implement the recursive dynamic mode on Westeros baseline scenario. Hence, before we start, we have to make sure that we can successfully run the baseline scenarion (``westeros_baseline.ipynb``).\n", - "\n", - "Let's start with importing all the libraries we need and connect to the `ixmp` platform." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "import ixmp\n", - "import message_ix\n", - "\n", - "from message_ix.util import make_df\n", - "\n", - "%matplotlib inline" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "mp = ixmp.Platform()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Making a clone of the existing scenario 'baseline'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "model = \"Westeros Electrified\"\n", - "\n", - "base = message_ix.Scenario(mp, model=model, scenario=\"baseline\")\n", - "scen = base.clone(\n", - " model,\n", - " \"recursive-dynamic\",\n", - " \"introducing recursive dynamic mode\",\n", - " keep_solution=False,\n", - ")\n", - "scen.check_out()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "year_df = scen.vintage_and_active_years()\n", - "vintage_years, act_years = year_df[\"year_vtg\"], year_df[\"year_act\"]\n", - "model_horizon = scen.set(\"year\")\n", - "country = \"Westeros\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Time to Solve the Model\n", - "\n", - "In perfect foresight mode, the solve statement we add is `scen.solve()` without any additional arguments. By default, this will tell MESSAGE to run in the perfect foreseight mode. To run MESSAGE using the recursive dynamic approach, we need to add `gams_args =[\"--foresight=X\"]` argument to the solve statement, with `X` being the length of the foresight windows. This will pass the argument directly to `GAMS`, overiding the default values set in `MESSAGE_master.gms` and `model_setup.gms` scripts. Here, let's use `X=1` as an example." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "scen.commit(comment=\"Introducing recursive dynamic mode in MESSAGE\")\n", - "scen.set_as_default()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "scen.solve(gams_args =[\"--foresight=1\"])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "scen.var(\"OBJ\")[\"lvl\"]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Plotting Results" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from message_ix.reporting import Reporter\n", - "from message_ix.util.tutorial import prepare_plots\n", - "\n", - "rep = Reporter.from_scenario(scen)\n", - "prepare_plots(rep)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Activity\n", - "\n", - "How much energy is generated in each time period from the different potential sources?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "rep.set_filters(t=[\"coal_ppl\", \"wind_ppl\"])\n", - "rep.get(\"plot activity\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Capacity\n", - "\n", - "How much capacity of each plant is installed in each period?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "rep.get(\"plot capacity\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Close the connection to the database" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "mp.close_db()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.16" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} From dd4d66564c6b67f7e9df5c444a86c1bee30efbdc Mon Sep 17 00:00:00 2001 From: ywpratama <48617743+ywpratama@users.noreply.github.com> Date: Mon, 13 Mar 2023 05:28:38 +0100 Subject: [PATCH 08/12] Create westeros_baseline_recursive-dynamic.ipynb --- .../westeros_baseline_recursive-dynamic.ipynb | 285 ++++++++++++++++++ 1 file changed, 285 insertions(+) create mode 100644 tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb diff --git a/tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb b/tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb new file mode 100644 index 000000000..72dbe9229 --- /dev/null +++ b/tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb @@ -0,0 +1,285 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Westeros Tutorial: Running MESSAGE in Recursive Dynamic Mode\n", + "\n", + "While considering the full time horizon in a single run is useful for a long-term energy systems planning, the recursive dynamic approach can provide insights that reflect the relevant foresight windows decision makers can have in making adaptive and robust planning.\n", + "\n", + "In addition to running the model with the perfect foresights, MESSAGE can also be run using the recursive dynamic approach. Here, the model is run iteratively throughout the periods with key decision variables from the previous periods, or iterations, are fixed so that new informations do not alter decisions that are already made in the previous periods. These variables\n", + "include $CAP$ , $CAP\\_NEW$, $ACT$, and $EXT$. \n", + "\n", + "In this tutorial, we will implement the recursive dynamic mode on Westeros baseline scenario. Hence, before we start, we have to make sure that we can successfully run the baseline scenarion (``westeros_baseline.ipynb``).\n", + "\n", + "Let's start with importing all the libraries we need and connect to the `ixmp` platform." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": [ + "if (typeof IPython !== 'undefined') { IPython.OutputArea.prototype._should_scroll = function(lines){ return false; }}" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import pandas as pd\n", + "import ixmp\n", + "import message_ix\n", + "\n", + "from message_ix.util import make_df\n", + "\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "mp = ixmp.Platform()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Making a clone of the existing scenario 'baseline'" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "model = \"Westeros Electrified\"\n", + "\n", + "base = message_ix.Scenario(mp, model=model, scenario=\"baseline\")\n", + "scen = base.clone(\n", + " model,\n", + " \"recursive-dynamic\",\n", + " \"introducing recursive dynamic mode\",\n", + " keep_solution=False,\n", + ")\n", + "scen.check_out()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "year_df = scen.vintage_and_active_years()\n", + "vintage_years, act_years = year_df[\"year_vtg\"], year_df[\"year_act\"]\n", + "model_horizon = scen.set(\"year\")\n", + "country = \"Westeros\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Time to Solve the Model\n", + "\n", + "In perfect foresight mode, the solve statement we add is `scen.solve()` without any additional arguments. By default, this will tell MESSAGE to run in the perfect foreseight mode. To run MESSAGE using the recursive dynamic approach, we need to add `gams_args =[\"--foresight=X\"]` argument to the solve statement, with `X` being the length of the foresight windows. This will pass the argument directly to `GAMS`, overiding the default values set in `MESSAGE_master.gms` and `model_setup.gms` scripts. Here, let's use `X=1` as an example." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "scen.commit(comment=\"Introducing recursive dynamic mode in MESSAGE\")\n", + "scen.set_as_default()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "scen.solve(gams_args =[\"--foresight=1\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "173795.09375" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "scen.var(\"OBJ\")[\"lvl\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plotting Results" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "from message_ix.reporting import Reporter\n", + "from message_ix.util.tutorial import prepare_plots\n", + "\n", + "rep = Reporter.from_scenario(scen)\n", + "prepare_plots(rep)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Activity\n", + "\n", + "How much energy is generated in each time period from the different potential sources?" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "rep.set_filters(t=[\"coal_ppl\", \"wind_ppl\"])\n", + "rep.get(\"plot activity\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Capacity\n", + "\n", + "How much capacity of each plant is installed in each period?" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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3M81ceJEY7PZzK+//urYdscddxg/Pz+nbcYYp77I7aPk5GTHtpo1a+bbD1dzDgEoPZhaAEupXr26goODHXNfd+7cqczMTMdcx0aNGjneyt6wYYMuXLjgeNv6P//5j3JyctSlSxcdO3bMcQsPD1dsbKxjxYOAgABJ0ooVK3TmzJlC1WeM0eLFi9W+fXsZY5yeJyEhQenp6dq2bZvTY3r27OkYnZIuvk195MgRPfHEE463uSWpXbt2iouL05dffilJ8vb2lqenpxITE3Xy5MlC1Zlr8eLFWrlypdNt1qxZedr16tXLae7o7bffLuniCJ0k7dixQ/v27dODDz6o48ePO15zZmamWrZsqW+++cZpyockPf744073V61apfPnz+uJJ55w2j5w4MA89XTp0kVeXl6aN2+eY9uKFSt07NgxPfTQQ5d8zWFhYdq5c6cef/xxnTx5UjNnztSDDz6o0NBQjRs3zunt+B49eigpKUm//PKLY9u8efMUFRWlpk2bSvr/Pxi3bNkynTt37pLP/XcnTpzQ6tWr1aVLF506dcrRb8ePH1dCQoL27duXZzpJnz59nKYANGzYUMYY9enTx7HN3d1d9evXd/x8CpI7jcXPz++y6rXb7Y752xcuXNDx48fl6+uratWq5TmvpYv999djd+rUSREREfq///s/x7a/nvuZmZk6duyYGjVqJGOMtm/fLuniKhPffPONevfurUqVKjk9R37TIS7H1ZxDAEoPgiwsxWazqVGjRo65sOvXr1doaKhuvPFGSc5BNve/uUF23759MsYoNjZW5cuXd7rt2bNHR44ckSTFxMRoyJAhev/99xUSEqKEhARNnz7dMT/2Uo4ePaq0tDS9++67eZ6jV69ekuR4nlwxMTFO93/99VdJUrVq1fIcPy4uzrHfbrdr8uTJ+uqrrxQWFqY77rhDU6ZMKdTSWXfccYdatWrldIuPj8/T7u/hoVy5cpLkCND79u2TdDGU//11v//++8rOzs7TfwW97tyfZa6goCDH8+UKDAxU+/btNX/+fMe2efPmqUKFCmrRosU/vu6IiAjNmDFDf/zxh/bu3as33nhD5cuX18iRI/XBBx842j3wwAOy2+2OsJOenq5ly5ape/fujgDVtGlTdezYUWPGjFFISIjuvfdezZo1S9nZ2f9Yx/79+2WM0YgRI/L026hRoyTlPV/+/rPI/cMrKioqz/Z/+gPH399fknTq1Kl/rFW6OIf5tddeU2xsrOx2u0JCQlS+fHl9//33+f77iI2Ndbpvs9l04403Os3hPnjwoB555BEFBQXJ19dX5cuXd/yRkHvM3EBeq1aty6rzclztOQSgdGCOLCynSZMmWrp0qXbt2pXnk+eNGjXS0KFDdfjwYa1bt06RkZG64YYbJF38JWyz2fTVV1/lOx/wr0suTZ06VY888og+//xz/fe//9WTTz6piRMnauPGjapYsWKBteWOOj700EMFzr/MnRuZ668jUoU1ePBgtW/fXp999plWrFihESNGaOLEiVq9erXq1q17xcf9u4LmT+aOXua+7pdffll16tTJt+3fl7S6mtctXRztW7hwob777jvVrl1bX3zxhZ544olCrfhgs9lUtWpVVa1aVe3atVNsbKzmzZunRx99VNLFwH733Xdr3rx5GjlypBYtWqTs7GynETubzaZFixZp48aNWrp0qVasWKHevXtr6tSp2rhx4yWX8srtt2eeeUYJCQn5tvl7sC/oZ5HfdvMPH/aKi4uTJO3ateuylpGbMGGCRowYod69e2vcuHEKCgqSm5ubBg8enGfE/XJcuHBBd955p06cOKHnnntOcXFx8vHx0eHDh/XII49c0TELoyjOIQCuRZCF5fx1Pdn169c7fXiqXr16stvtSkxMVFJSktq2bevYV6VKFRljFBMTo6pVq/7j89SuXVu1a9fWiy++qO+++06NGzfWzJkz9dJLL0nK/y3N8uXLy8/PTxcuXFCrVq2u6PVVrlxZkrR37948I0N79+517P/r63r66af19NNPa9++fapTp46mTp2qf//731f0/Fci94Nu/v7+V/269+/f7zRae/z48XxHFu+66y6VL19e8+bNU8OGDXXmzBk9/PDDV/Tc0sUPkZUrV05//PGH0/YePXro3nvv1ebNmzVv3jzVrVtXNWvWzPP42267TbfddpvGjx+v+fPnq3v37vr444/16KOPFvj2d+4fWWXKlLnifrsaTZo0Ubly5bRgwQI9//zz//iBr0WLFql58+ZOo9aSlJaWlu8ybrkj9bmMMdq/f7/jj7ldu3bp559/1pw5c5w+lLZy5Uqnx+X20+7duy//xf0/l5p6UNTnEICSx5+dsJz69es75rYdPnzYaUTWbrfrlltu0fTp05WZmem0fuz9998v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Wtu3b1d8fLzat2+v48eP52kzdepUbd68WeXLl1f79u0vax3Yq8WHvQAAAEqJU6dO6fXXX9dbb72lnj17SpKqVKmiJk2a6L333lNWVpY++ugj+fj4SJLeeusttW/fXpMnT1ZYWJhatGjhdLx3331XgYGBWrt2re6+++4rqmnAgAHq2LGjJGnGjBlavny5PvjgAz377LOONqNGjdKdd94pSZozZ44qVqyoJUuWqEuXLlf0nJeLEVkAAIBSYs+ePcrOzlbLli3z3XfzzTc7QqwkNW7cWDk5Odq7d68kKTU1VX379lVsbKwCAgLk7++v06dP6+DBg1dcU3x8vOP/PTw8VL9+fe3Zs6fANkFBQapWrVqeNsWhUCOylStXVosWLdS8eXM1b95cUVFRxVUXAADAdcfb2/uqHt+zZ08dP35cr7/+uipXriy73a74+HidPXu2iCosXQo1IturVy8lJyfrscceU3R0tG688Ub17dtXCxYsUEpKSnHVCAAAcF2IjY2Vt7e3Vq1alWdf9erVtXPnTmVmZjq2rV+/Xm5ubqpWrZrj/pNPPqm2bduqZs2astvtOnbs2FXVtHHjRsf/nz9/Xlu3blX16tULbHPy5En9/PPPedoUh0KNyI4ePVqSlJ2drfXr12vt2rVKTEzU3Llzde7cOVWtWlUtWrTQ9OnTi6NWAACAa5qXl5eee+45Pfvss/L09FTjxo119OhR/fDDD+revbtGjRqlnj17avTo0Tp69KgGDhyohx9+WGFhYZIuBuG5c+eqfv36ysjI0NChQ696lHf69OmKjY1V9erV9dprr+nkyZPq3bu3U5uxY8cqODhYYWFheuGFFxQSElIiX7hwRR/2stvtatGihWNC8cmTJzV16lS9+eabmjlzJkEWAACUSqXxm7b+bsSIEfLw8NDIkSP1+++/KyIiQo8//rjKli2rFStWaNCgQbr11ltVtmxZdezYUa+++qrjsR988IH69eunW265RVFRUZowYYKeeeaZq6pn0qRJmjRpknbs2KEbb7xRX3zxhUJCQvK0GTRokPbt26c6depo6dKl8vT0vKrnvRxXFGTPnj2rDRs2KDExUYmJiUpKSlKFChXUqVMnNW3atKhrBAAAuG64ubnphRde0AsvvJBnX+3atbV69eoCH1u3bl1t3rzZaVunTp2c7htjClVP9erVlZSUdMk2TZo0KXDt2EceeUSPPPJIoZ7zchUqyI4dO9YRXCtXrqw77rhD/fr107x58xQZGVksBQIAAAD5KfQc2UqVKmnq1Knq3LmzgoODi6suAAAAFKMJEyZowoQJ+e67/fbbNWPGjBKuqPAKFWS/+uorrVmzRrNnz9agQYNUtWpVNWvWTE2bNlXTpk1Vvnz54qoTAAAARejxxx8v8AsLvL29VaFChX+chtCsWbNCT1UoSoVafishIUGTJk3Sxo0bdezYMU2ePFlly5bVlClTVLFiRdWsWdPpa9KKwuHDh/XQQw8pODhY3t7eql27trZs2eLYb4zRyJEjFRERIW9vb7Vq1Ur79u0r0hoAAACuNUFBQbrxxhvzvVWoUMHV5V2WK/5mLz8/P7Vt21YTJkzQ66+/riFDhui3334r0mHokydPqnHjxipTpoy++uor/fjjj5o6darKlSvnaDNlyhS98cYbmjlzppKSkuTj46OEhARlZWUVWR0AAAAofQq9akFOTo62bNmiNWvWKDExUevXr1dmZqYqVqyo++67T82bNy+y4iZPnqyoqCjNmjXLsS0mJsbx/8YYTZs2TS+++KLuvfdeSdJHH32ksLAwffbZZ+ratWu+x83OzlZ2drbjfkZGRpHVDAAAgJJRqBHZNm3aqFy5crrtttv05ptvKiQkRK+99pr27dunX3/9VbNnz1bPnj2LrLgvvvhC9evXV+fOnRUaGqq6devqvffec+xPTk5WSkqKWrVq5dgWEBCghg0basOGDQUed+LEiQoICHDc+KpdAAAA6ynUiGxgYKBefvllNW/eXLGxscVVk8P//vc/zZgxQ0OGDNHzzz+vzZs368knn5Snp6d69uzp+Frc3G+zyBUWFnbJr8wdPny4hgwZ4rifkZFBmAUAALCYQgXZDz/8UKtWrXKE2OHDhzu9Re/u7q5x48bJy8urSIrLyclR/fr1HUtD1K1bV7t379bMmTOvauTXbrfLbrcXSY0AAABwjUIF2Tlz5ujLL7/U3XffLUl66623VLNmTcd3+P7000+KjIzUU089VSTFRUREqEaNGk7bqlevrsWLF0uSwsPDJUmpqamKiIhwtElNTVWdOnWKpAYAAHANGR1Qws+XXmyHnj17tgYPHqy0tLSrOk6zZs1Up04dTZs2rUjq+icHDhxQTEyMtm/fftV5rVBzZP/973+rX79+Ttvmz5+vNWvWaM2aNXr55Zf16aefXlVBf9W4cWPt3bvXadvPP/+sypUrS7r4wa/w8HCtWrXKsT8jI0NJSUmKj48vsjoAAABKmwceeEA///yzq8twqUIF2V9++UW1a9d23Pfy8pKb2/9/iAYNGujHH38ssuKeeuopbdy4URMmTND+/fs1f/58vfvuu+rfv78kyWazafDgwXrppZf0xRdfaNeuXerRo4ciIyPVoUOHIqsDAACgtPH29lZoaKiry3CpQgXZtLQ0pzmxR48eVXR0tON+Tk6O0/6rdeutt2rJkiVasGCBatWqpXHjxmnatGnq3r27o82zzz6rgQMHql+/frr11lt1+vRpLV++vMjm6QIAAJSUZcuWKTAwUBcuXJAk7dixQzabTcOGDXO0efTRR/XQQw9p9uzZCgwMdGwfPXq06tSpo7lz5yo6OloBAQHq2rWrTp065WiTmZmpHj16yNfXVxEREZo6dWqh6ouOjta4cePUrVs3+fj4qEKFCpo+fbpTG5vNphkzZqhNmzby9vbWDTfcoEWLFl1Bb/yzQgXZihUravfu3QXu//7771WxYsWrLuqv7r77bu3atUtZWVnas2eP+vbt67TfZrNp7NixSklJUVZWlr7++mtVrVq1SGsAAAAoCbfffrtOnTql7du3S5LWrl2rkJAQJSYmOtqsXbtWzZo1y/fxv/zyiz777DMtW7ZMy5Yt09q1azVp0iTH/qFDh2rt2rX6/PPP9d///leJiYnatm1boWp8+eWXdfPNN2v79u0aNmyYBg0apJUrVzq1GTFihDp27KidO3eqe/fu6tq1q/bs2VOo57kchQqybdu21ciRI/P91qw///xTY8aMUbt27YqsOAAAgOtJQECA6tSp4wiuiYmJeuqpp7R9+3adPn1ahw8f1v79+9W0adN8H5+Tk6PZs2erVq1auv322/Xwww87Pkt0+vRpffDBB3rllVfUsmVL1a5dW3PmzNH58+cLVWPjxo01bNgwVa1aVQMHDlSnTp302muvObXp3LmzHn30UVWtWlXjxo1T/fr19eabbxa+Q/5BoYLs888/rxMnTqhatWp6+eWX9fnnn+vzzz/XlClTVK1aNZ08eVLPP/98kRcJAABwvWjatKkSExNljNG3336r+++/X9WrV9e6deu0du1aRUZGFrief3R0tPz8/Bz3IyIidOTIEUkXR2vPnj2rhg0bOvYHBQWpWrVqharv7x+oj4+PzzPaejltikKhlt8KCwvTd999p3/9618aNmyYjDGSLr69f+edd+rtt9/O8+UEAAAAuHzNmjXThx9+qJ07d6pMmTKKi4tTs2bNlJiYqJMnTxY4GitJZcqUcbpvs9mUk5NT3CW7TKFGZKWLS14tX75cR48e1caNG7Vx40YdPXpUy5cv1w033FAcNQIAAFw3cufJvvbaa47QmhtkExMTC5wf+0+qVKmiMmXKKCkpybHt5MmThV7Ca+PGjXnuV69evdBtikKhRmT/KigoSA0aNCjKWgAAAK575cqV00033aR58+bprbfekiTdcccd6tKli86dO3fJEdlL8fX1VZ8+fTR06FAFBwcrNDRUL7zwgtNSqpdj/fr1mjJlijp06KCVK1dq4cKF+vLLL53aLFy4UPXr11eTJk00b948bdq0SR988MEV1X0pVxxkAQAALKcYv2mrKDVt2lQ7duxwjL4GBQWpRo0aSk1NLfSc1r96+eWXdfr0abVv315+fn56+umnlZ5euD55+umntWXLFo0ZM0b+/v569dVXlZCQ4NRmzJgx+vjjj/XEE08oIiJCCxYsyPNtrUXBZnInul7HMjIyFBAQoPT0dPn7+7u6nGtTSX8l4D8pRRey6GFf/nOjEnRgUulZeaQ09U1p6hcAF13q93dWVpaSk5MVExPD2vJFKDo6WoMHD9bgwYMLbGOz2bRkyZIr/nKqwvzsCj1HFgAAACgNCLIAAADQt99+K19f3wJvpRFzZAEAAKD69etrx44dl2xz4MCBfzxOSc5aJcgCAABA3t7euvHGG11dRqEwtQAAAFyz+Ey79RTmZ0aQBQAA1xx3d3dJ0tmzZ11cCQrrzJkzkvJ+S1l+mFoAAACuOR4eHipbtqyOHj2qMmXKFHrRf5Q8Y4zOnDmjI0eOKDAw0PHHyKUQZAEAwDXHZrMpIiJCycnJ+vXXX11dDgohMDBQ4eHhl9WWIAsAAK5Jnp6eio2NZXqBhZQpU+ayRmJzEWQBAMA1y83NjW/2uoYxYQQAAACWRJAFAACAJRFkAQAAYEkEWQAAAFgSQRYAAACWRJAFAACAJRFkAQAAYEkEWQAAAFgSQRYAAACWRJAFAACAJRFkAQAAYEkEWQAAAFgSQRYAAACWRJAFAACAJXm4ugBcH6Kz5ru6BCcHXF0AAAC4aozIAgAAwJIIsgAAALAkgiwAAAAsiSALAAAASyLIAgAAwJIIsgAAALAkgiwAAAAsiSALAAAASyLIAgAAwJIIsgAAALAkgiwAAAAsiSALAAAASyLIAgAAwJIIsgAAALAkgiwAAAAsiSALAAAASyLIAgAAwJIIsgAAALAkSwXZSZMmyWazafDgwY5tWVlZ6t+/v4KDg+Xr66uOHTsqNTXVdUUCAACgRFgmyG7evFnvvPOObrrpJqftTz31lJYuXaqFCxdq7dq1+v3333X//fe7qEoAAACUFEsE2dOnT6t79+567733VK5cOcf29PR0ffDBB3r11VfVokUL1atXT7NmzdJ3332njRs3Fni87OxsZWRkON0AAABgLZYIsv3791e7du3UqlUrp+1bt27VuXPnnLbHxcWpUqVK2rBhQ4HHmzhxogICAhy3qKioYqsdAAAAxaPUB9mPP/5Y27Zt08SJE/PsS0lJkaenpwIDA522h4WFKSUlpcBjDh8+XOnp6Y7boUOHirpsAAAAFDMPVxdwKYcOHdKgQYO0cuVKeXl5Fdlx7Xa77HZ7kR0PAAAAJa9Uj8hu3bpVR44c0S233CIPDw95eHho7dq1euONN+Th4aGwsDCdPXtWaWlpTo9LTU1VeHi4a4oGAABAiSjVI7ItW7bUrl27nLb16tVLcXFxeu655xQVFaUyZcpo1apV6tixoyRp7969OnjwoOLj411RMgAAAEpIqQ6yfn5+qlWrltM2Hx8fBQcHO7b36dNHQ4YMUVBQkPz9/TVw4EDFx8frtttuc0XJAAAAKCGlOshejtdee01ubm7q2LGjsrOzlZCQoLffftvVZQEAAKCYWS7IJiYmOt338vLS9OnTNX36dNcUBAAAAJco1R/2AgAAAApCkAUAAIAlEWQBAABgSQRZAAAAWBJBFgAAAJZEkAUAAIAlEWQBAABgSQRZAAAAWBJBFgAAAJZEkAUAAIAlEWQBAABgSQRZAAAAWBJBFgAAAJZEkAUAAIAlEWQBAABgSQRZAAAAWBJBFgAAAJZEkAUAAIAlEWQBAABgSQRZAAAAWBJBFgAAAJZEkAUAAIAlEWQBAABgSQRZAAAAWBJBFgAAAJZEkAUAAIAlEWQBAABgSQRZAAAAWBJBFgAAAJZEkAUAAIAlEWQBAABgSQRZAAAAWBJBFgAAAJZEkAUAAIAlEWQBAABgSQRZAAAAWBJBFgAAAJZEkAUAAIAlEWQBAABgSQRZAAAAWBJBFgAAAJZEkAUAAIAlEWQBAABgSQRZAAAAWBJBFgAAAJZEkAUAAIAlEWQBAABgSQRZAAAAWBJBFgAAAJZEkAUAAIAlleogO3HiRN16663y8/NTaGioOnTooL179zq1ycrKUv/+/RUcHCxfX1917NhRqampLqoYAAAAJaVUB9m1a9eqf//+2rhxo1auXKlz586pdevWyszMdLR56qmntHTpUi1cuFBr167V77//rvvvv9+FVQMAAKAkeLi6gEtZvny50/3Zs2crNDRUW7du1R133KH09HR98MEHmj9/vlq0aCFJmjVrlqpXr66NGzfqtttuy/e42dnZys7OdtzPyMgovhcBAACAYlGqR2T/Lj09XZIUFBQkSdq6davOnTunVq1aOdrExcWpUqVK2rBhQ4HHmThxogICAhy3qKio4i0cAAAARc4yQTYnJ0eDBw9W48aNVatWLUlSSkqKPD09FRgY6NQ2LCxMKSkpBR5r+PDhSk9Pd9wOHTpUnKUDAACgGJTqqQV/1b9/f+3evVvr1q276mPZ7XbZ7fYiqAoAAACuYokR2QEDBmjZsmVas2aNKlas6NgeHh6us2fPKi0tzal9amqqwsPDS7hKAAAAlKRSHWSNMRowYICWLFmi1atXKyYmxml/vXr1VKZMGa1atcqxbe/evTp48KDi4+NLulwAAACUoFI9taB///6aP3++Pv/8c/n5+TnmvQYEBMjb21sBAQHq06ePhgwZoqCgIPn7+2vgwIGKj48vcMUCAAAAXBtKdZCdMWOGJKlZs2ZO22fNmqVHHnlEkvTaa6/Jzc1NHTt2VHZ2thISEvT222+XcKUAAAAoaaU6yBpj/rGNl5eXpk+frunTp5dARQAAACgtSvUcWQAAAKAgBFkAAABYEkEWAAAAlkSQBQAAgCURZAEAAGBJBFkAAABYEkEWAAAAlkSQBQAAgCURZAEAAGBJBFkAAABYEkEWAAAAlkSQBQAAgCURZAEAAGBJBFkAAABYEkEWAAAAlkSQBQAAgCURZAEAAGBJBFkAAABYEkEWAAAAlkSQBQAAgCURZAEAAGBJBFkAAABYEkEWAAAAlkSQBQAAgCURZAEAAGBJBFkAAABYEkEWAAAAlkSQBQAAgCURZAEAAGBJBFkAAABYEkEWAAAAlkSQBQAAgCURZAEAAGBJBFkAAABYEkEWAAAAlkSQBQAAgCURZAEAAGBJBFkAAABYEkEWAAAAlkSQBQAAgCURZAEAAGBJBFkAAABYEkEWAAAAlkSQBQAAgCURZAEAAGBJBFkAAABYEkEWAAAAlkSQBQAAgCURZAEAAGBJ10yQnT59uqKjo+Xl5aWGDRtq06ZNri4JAAAAxeiaCLKffPKJhgwZolGjRmnbtm26+eablZCQoCNHjri6NAAAABSTayLIvvrqq+rbt6969eqlGjVqaObMmSpbtqw+/PBDV5cGAACAYuLh6gKu1tmzZ7V161YNHz7csc3NzU2tWrXShg0b8n1Mdna2srOzHffT09MlSRkZGcVb7HUsJ/uMq0twUpp+1vRNwUpT35SmfgFwUe6/S2OMiyuBq1g+yB47dkwXLlxQWFiY0/awsDD99NNP+T5m4sSJGjNmTJ7tUVFRxVIjSp+Aaa6uoPSib/JHvwCl16lTpxQQEODqMuAClg+yV2L48OEaMmSI435OTo5OnDih4OBg2Ww2F1Z28a/LqKgoHTp0SP7+/i6tpbShbwpG3xSMvikYfZM/+qVgpa1vjDE6deqUIiMjXV0KXMTyQTYkJETu7u5KTU112p6amqrw8PB8H2O322W32522BQYGFleJV8Tf379UXCRKI/qmYPRNweibgtE3+aNfClaa+oaR2Oub5T/s5enpqXr16mnVqlWObTk5OVq1apXi4+NdWBkAAACKk+VHZCVpyJAh6tmzp+rXr68GDRpo2rRpyszMVK9evVxdGgAAAIrJNRFkH3jgAR09elQjR45USkqK6tSpo+XLl+f5AJgV2O12jRo1Ks/UB9A3l0LfFIy+KRh9kz/6pWD0DUobm2HNCgAAAFiQ5efIAgAA4PpEkAUAAIAlEWQBAABgSQRZAAAAWBJBFgAAAJZEkAUAAIAlXRPryFrdpk2btGHDBqWkpEiSwsPDFR8frwYNGri4MgDXGq43AK4lrCPrQkeOHFHHjh21fv16VapUyfEFDqmpqTp48KAaN26sxYsXKzQ01MWVus758+f1ww8/OP3SrVGjhsqUKePiylwvJSVFSUlJTn3TsGFDhYeHu7gy1+O8yYvrzaVxzhSMaw1KNQOX6dixo4mPjzc//fRTnn0//fSTadSokenUqZMLKnO9CxcumBdeeMEEBgYam83mdAsMDDQvvviiuXDhgqvLdInTp0+b7t27G3d3d+Ph4WFCQ0NNaGio8fDwMO7u7uahhx4ymZmZri7TJThvCsb1Jn+cMwXjWgMrIMi6kK+vr9m2bVuB+7ds2WJ8fX1LsKLSY+jQoaZ8+fJm5syZJjk52Zw5c8acOXPGJCcnm3feeceEhoaaZ5991tVlukSfPn1MbGysWb58uTl//rxj+/nz582KFStM1apVzaOPPurCCl2H86ZgXG/yxzlTMK41sAKCrAsFBwebxMTEAvevWbPGBAcHl2BFpUdYWJhZvnx5gfuXL19uQkNDS7Ci0iMwMNCsX7++wP3r1q0zgYGBJVhR6cF5UzCuN/njnCkY1xpYAasWuNADDzygnj17asmSJcrIyHBsz8jI0JIlS9SrVy9169bNhRW6zqlTpxQZGVng/oiICGVmZpZgRaVHTk6OPD09C9zv6empnJycEqyo9OC8KRjXm/xxzhSMaw0swdVJ+nqWlZVlHn/8cePp6Wnc3NyMl5eX8fLyMm5ubsbT09P861//MllZWa4u0yXatm1rWrdubY4ePZpn39GjR81dd91l2rVr54LKXO/BBx80devWzfdt4m3btpl69eqZ7t27u6Ay1+O8KRjXm/xxzhSMaw2sgFULSoGMjAxt2bJFqampki5+IrRevXry9/d3cWWuc+jQIbVt21Y//fSTateu7fQJ6127dqlGjRpatmyZoqKiXFxpyTt58qQefPBBrVixQuXKlXN8yvzIkSNKS0tTQkKC5s+fr8DAQNcW6gKcN/+M640zzpmCca2BFRBkUWrl5ORoxYoV2rhxY541L1u3bi03t+t7ZsxPP/2U73qgcXFxLq7MtThvUFicM5fGtQalGUHWxf78808tWLBA69at0x9//CE3NzfdcMMN6tChg1q2bOnq8gBcQ7jeALjWEGRdaP/+/WrVqpX+/PNP2e12/fbbb2rbtq2OHTumLVu26P7779f8+fPl4XH9fgFbft9C1KhRI916660urqz0OnnypJYuXaoePXq4uhSXycnJyXcULScnR7/99psqVarkgqpci+vNpXGtKTyuNSgVXDc9F23atDGPPfaYycnJMcYYM2nSJNOmTRtjjDE///yziY6ONqNGjXJhha6TmppqmjRpYmw2m6lcubJp0KCBadCggalcubKx2WymSZMmJjU11dVllko7duwwbm5uri7D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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "rep.get(\"plot capacity\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Close the connection to the database" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "mp.close_db()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 8c92531ecb18e1cd3c97710e31e4dad7c9b00d38 Mon Sep 17 00:00:00 2001 From: ywpratama <48617743+ywpratama@users.noreply.github.com> Date: Mon, 13 Mar 2023 05:34:05 +0100 Subject: [PATCH 09/12] Create westeros_emissions_bounds_daccs.ipynb --- .../westeros_emissions_bounds_daccs.ipynb | 455 ++++++++++++++++++ 1 file changed, 455 insertions(+) create mode 100644 tutorial/westeros/westeros_emissions_bounds_daccs.ipynb diff --git a/tutorial/westeros/westeros_emissions_bounds_daccs.ipynb b/tutorial/westeros/westeros_emissions_bounds_daccs.ipynb new file mode 100644 index 000000000..bf1dcbeac --- /dev/null +++ b/tutorial/westeros/westeros_emissions_bounds_daccs.ipynb @@ -0,0 +1,455 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "3ce427fd", + "metadata": {}, + "source": [ + "# Adding DACCS in MESSAGE\n", + "In the previous tutorials, we have learnt how to create a baseline scenario (`westeros_baseline.ipynb`) and add emissions bounds (`westeros_emissions_bounds.ipynb`) to the baseline scenario. Here, we will show how to include an additional/new technology to a MESSAGE model. While the combination of currently existing technologies might be able to deliver the Paris targets, the deployment of some new technologies might improve the probability of meeting the targets and/or reducing the costs. These technologies include CO2 removal (CDR) technologies. Hence, in this tutorial, we will use direct air carbon capture and storage (DACCS) as an example of new technologies to be considered in climate mitigation pathways. \n", + "\n", + "In order to smoothly follow this tutorial, you have to alrady have the MESSAGEix framework installed and working. Moreover, you should have run the Westeros baseline and emissions bounds scenarios successfully as this tutorial is built on top of those scenarios.\n", + "\n", + "If all set, we can start by importing all the packages we need and connect to a database that store the scenario input and results. We can also name the model as `Westeros Electrified` here." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "239a17a2", + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": [ + "if (typeof IPython !== 'undefined') { IPython.OutputArea.prototype._should_scroll = function(lines){ return false; }}" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import pandas as pd\n", + "import ixmp\n", + "import message_ix\n", + "\n", + "from message_ix.utils import make_df\n", + "\n", + "%matplotlib inline\n", + "\n", + "mp = ixmp.Platform()\n", + "\n", + "model = \"Westeros Electrified\"" + ] + }, + { + "cell_type": "markdown", + "id": "c82f18ff", + "metadata": {}, + "source": [ + "After we are connected to the database, we can call the prevously run `\"emission_bound\"` scenario as our base model and clone the data before we start adding DACCS to the model. As prevoiusly mentioned, to run this tutorial, you have to have succesfully run the `\"emission_bound\"` scenario, which was built based on the `\"baseline\"` scenario." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "9a868ad2", + "metadata": {}, + "outputs": [], + "source": [ + "base = message_ix.Scenario(mp, model=model, scenario=\"emission_bound\")\n", + "\n", + "scen = base.clone(\n", + " model,\n", + " \"emission_bound_DACCS\",\n", + " \"introducing an upper bound on emissions\",\n", + " keep_solution=False,)\n", + "scen.check_out()\n", + "\n", + "year_df = scen.vintage_and_active_years()\n", + "vintage_years, act_years = year_df[\"year_vtg\"], year_df[\"year_act\"]\n", + "model_horizon = scen.set(\"year\")\n", + "country = \"Westeros\"" + ] + }, + { + "cell_type": "markdown", + "id": "634cecd6", + "metadata": {}, + "source": [ + "Now, let's call the list of historical and model orizon years so we can use these lists for the next steps." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "0a2bb27c", + "metadata": {}, + "outputs": [], + "source": [ + "history = [690]\n", + "model_horizon = [700, 710, 720]" + ] + }, + { + "cell_type": "markdown", + "id": "b5db71ca", + "metadata": {}, + "source": [ + "# Adding DACCS description\n", + "First step of adding DACCS as a technology in the model is by including DACCS into the `\"technology\"` set." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "3b203192", + "metadata": {}, + "outputs": [], + "source": [ + "scen.add_set(\"technology\", [\"DACCS\"])" + ] + }, + { + "cell_type": "markdown", + "id": "017c5ca3", + "metadata": {}, + "source": [ + "Similar to what we did when generating the `\"baseline\"` scenario, the first thing we need to do is defining the input and output comodities of each technology. " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "c74cf466", + "metadata": {}, + "outputs": [], + "source": [ + "# Some common values to be used for both the \"input\" and \"output\" parameters\n", + "base = dict(\n", + " node_loc=country,\n", + " year_vtg=vintage_years,\n", + " year_act=act_years,\n", + " mode=\"standard\",\n", + " time=\"year\",\n", + " unit=\"-\",\n", + ")\n", + "\n", + "# Use the message_ix utility function make_df() to create a base data frame for\n", + "# different \"input\" parameter values\n", + "base_input = make_df(\"input\", **base, node_origin=country, time_origin=\"year\")\n", + "\n", + "# Create a base data frame for different \"output\" parameter values\n", + "base_output = make_df(\"output\", **base, node_dest=country, time_dest=\"year\")" + ] + }, + { + "cell_type": "markdown", + "id": "74bc41d1", + "metadata": {}, + "source": [ + "In this example, DACCS is described as a technology that consumes electricity in order to remove CO2 from the atmosphere. This electricity is assumed to be obtained from the grid. Hence, we define DACCS input as final energy in the form of electricity." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "0dae391a", + "metadata": {}, + "outputs": [], + "source": [ + "daccs_in = base_input.assign(\n", + " technology=\"DACCS\", commodity=\"electricity\", level=\"final\", value=1.0\n", + ")\n", + "scen.add_par(\"input\", daccs_in)" + ] + }, + { + "cell_type": "markdown", + "id": "8e087a2c", + "metadata": {}, + "source": [ + "Then, we can also add emissions and capacity factors as well as the technical lifetime of the technology. As can be seen in the code block below, the emissions factor has a negative value, showing that the technology removes insted of emits CO2." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "c80ec39f", + "metadata": {}, + "outputs": [], + "source": [ + "emission_factor = make_df(\n", + " \"emission_factor\",\n", + " node_loc=country,\n", + " year_vtg=vintage_years,\n", + " year_act=act_years,\n", + " mode=\"standard\",\n", + " unit=\"tCO2/kWa\",\n", + " technology=\"DACCS\",\n", + " emission=\"CO2\",\n", + " value=-20,\n", + ")\n", + "scen.add_par(\"emission_factor\", emission_factor)\n", + "\n", + "capacity_factor = make_df(\n", + " \"capacity_factor\",\n", + " node_loc=country,\n", + " year_vtg=vintage_years,\n", + " year_act=act_years,\n", + " time=\"year\",\n", + " unit=\"-\",\n", + " technology='DACCS',\n", + " value=1,\n", + ")\n", + "scen.add_par(\"capacity_factor\", capacity_factor)\n", + " \n", + "lifetime = make_df(\n", + " \"technical_lifetime\",\n", + " node_loc=country,\n", + " year_vtg=model_horizon,\n", + " unit=\"y\",\n", + " technology='DACCS',\n", + " value=20,\n", + ")\n", + "scen.add_par(\"technical_lifetime\", lifetime)" + ] + }, + { + "cell_type": "markdown", + "id": "cef799ae", + "metadata": {}, + "source": [ + "We also asume that DACCS is a first of a kind technology, i.e., the technology has never been historically deployed. Accordingly, to allow the technology to be installed in the system, we need to define initial deployment (`\"initial_new_capacity_up\"`) and capacity growth (`\"growth_new_capacity_up\"`) rates" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "ad76ac94", + "metadata": {}, + "outputs": [], + "source": [ + "initial_newcapacity_up = {\n", + " \"DACCS\":0.5,\n", + "}\n", + "\n", + "for tec,val in initial_newcapacity_up.items():\n", + " df = make_df(\n", + " \"initial_new_capacity_up\",\n", + " node_loc=country,\n", + " year_vtg=model_horizon,\n", + " time=\"year\",\n", + " unit=\"GW\",\n", + " technology=tec,\n", + " value=val,\n", + " )\n", + " scen.add_par(\"initial_new_capacity_up\", df)\n", + "\n", + "growth_newcapacity_up = {\n", + " \"DACCS\":0.05,\n", + "}\n", + "\n", + "for tec,val in growth_newcapacity_up.items():\n", + " dfgrowth = make_df(\n", + " \"growth_new_capacity_up\",\n", + " node_loc=country,\n", + " year_vtg=model_horizon,\n", + " time=\"year\",\n", + " unit=\"-\",\n", + " technology=tec,\n", + " value=val,\n", + " )\n", + " scen.add_par(\"growth_new_capacity_up\", dfgrowth)" + ] + }, + { + "cell_type": "markdown", + "id": "dfe89d5e", + "metadata": {}, + "source": [ + "The last thing we need to do in describing DACCS is adding the technology costs data" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "3ae4574b", + "metadata": {}, + "outputs": [], + "source": [ + "# Add a new unit for ixmp to recognize as valid\n", + "mp.add_unit(\"USD/kW\")\n", + "\n", + "# in $ / kW (specific investment cost)\n", + "capex = make_df(\n", + " \"inv_cost\",\n", + " node_loc=country,\n", + " year_vtg=model_horizon,\n", + " unit=\"USD/kW\",\n", + " technology='DACCS',\n", + " value=2500,\n", + ")\n", + "scen.add_par(\"inv_cost\", capex)\n", + " \n", + "# in $ / kW / year (every year a fixed quantity is destinated to cover part of the O&M costs\n", + "# based on the size of the plant, e.g. lightning, labor, scheduled maintenance, etc.)\n", + "\n", + "omfix = make_df(\n", + " \"fix_cost\",\n", + " node_loc=country,\n", + " year_vtg=vintage_years,\n", + " year_act=act_years,\n", + " unit=\"USD/kWa\",\n", + " technology='DACCS',\n", + " value=5,\n", + ")\n", + "scen.add_par(\"fix_cost\", omfix)\n", + "\n", + "# In $ / kWa (costs associated to the degradation of equipment\n", + "# when the plant is functioning per unit of energy consumed\n", + "# kW·year = 8760 kWh in generating electricity. Therefore the costs represents USD per 8760 kWh\n", + "# of electricity consumed.\n", + "\n", + "omvar = make_df(\n", + " \"var_cost\",\n", + " node_loc=country,\n", + " year_vtg=vintage_years,\n", + " year_act=act_years,\n", + " mode=\"standard\",\n", + " time=\"year\",\n", + " unit=\"USD/kWa\",\n", + " technology='DACCS',\n", + " value=0,\n", + ")\n", + "scen.add_par(\"var_cost\", omvar)" + ] + }, + { + "cell_type": "markdown", + "id": "54cc0111", + "metadata": {}, + "source": [ + "# Solve Statement and Plotting Results\n", + "Finally, this is the solve statement and plotting results command" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "fb160143", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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SDLeeecd27K/X/vZJkyYYFgsFuPPP/+0LWvWrJlRsmRJu2WGYdidi+xzdOjQIduymjVr5noebuUaAlB8MLQAplK9enWVLl3aNvZ1x44dSktLs411bNy4se2t7I0bNyozM9P2tvXXX3+trKwsdevWTadOnbI9rFarqlSpYpvxwNfXV5K0fPlyXbx4MU/1GYahhQsXqnPnzjIMw24/UVFRSklJ0a+//mr3mpiYGFvvlHT1berk5GQ988wztre5Jaljx44KDw/Xd999J0ny9PSUm5ubEhISdPbs2TzVmW3hwoVasWKF3WPWrFk52vXp08du7Oh9990n6WoPnSRt375d+/fv16OPPqrTp0/bjjktLU2tW7fWjz/+aDfkQ5Keeuopu+erVq1SRkaGnnnmGbvlgwcPzlFPt27d5OHhofj4eNuy5cuX69SpU3rssceue8xBQUHasWOHnnrqKZ09e1YzZszQo48+qsDAQI0bN87u7fjevXtr8+bNOnjwoG1ZfHy8QkND1bx5c0n//4NxS5Ys0ZUrV6677386c+aMVq9erW7duun8+fO283b69GlFRUVp//79OYaT9OvXz24IQMOGDWUYhvr162db5uzsrPr169u+PteSPYylZMmSN1Wvu7u7bfx2ZmamTp8+LW9vb1WrVi3HdS1dPX9/33bXrl0VHBys77//3rbs79d+WlqaTp06pcaNG8swDG3btk3S1VkmfvzxR/Xt21fly5e320duwyFuxq1cQwCKD4IsTMVisahx48a2sbDr169XYGCgKleuLMk+yGb/mx1k9+/fL8MwVKVKFZUpU8busXfvXiUnJ0uSwsLCNGzYMH3yyScKCAhQVFSUpk2bZhsfez0nT57UuXPn9NFHH+XYR58+fSTJtp9sYWFhds///PNPSVK1atVybD88PNy23t3dXW+88YaWLl2qoKAgNWvWTJMmTcrT1FnNmjVTmzZt7B6RkZE52v0zPJQqVUqSbAF6//79kq6G8n8e9yeffKL09PQc5+9ax539tczm7+9v2182Pz8/de7cWXPnzrUti4+PV9myZdWqVasbHndwcLCmT5+uEydOaN++fXr33XdVpkwZvfLKK5o5c6at3SOPPCJ3d3db2ElJSdGSJUvUs2dPW4Bq3ry5oqOjNXbsWAUEBOiBBx7QrFmzlJ6efsM6Dhw4IMMwNGrUqBznbfTo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6f4OT+yYp/aPP/64Zs+eLUlycXGRv7+/ateurR49eujxxx/PMftCVFSUVq5cqU2bNqlBgwY5trdt2zaNHz9eP/74o1JSUhQaGqoWLVpoxIgRqlq1qq3dwoUL9d5772nbtm3KzMzUXXfdpa5du2rQoEHy9/dXZmamJk+erLi4OP3555/y9PRUlSpV1L9/fz3xxBP5ODMFw6E9shMmTFCDBg1UsmRJBQYGqkuXLtq3b59dm0uXLmngwIEqXbq0vL29FR0draSkJLs2R44cUceOHVWiRAkFBgZqxIgRysjIKMpDAQAAKBD333+/Tpw4ocOHD2vp0qVq2bKlhgwZok6dOtnlmyNHjmjDhg0aNGiQPv300xzbWbJkiRo1aqT09HTFx8dr7969+vzzz+Xr66tRo0bZ2r300kt65JFH1KBBAy1dulS7du3SlClTtGPHDs2ZM0eSNHbsWL399tsaN26c9uzZozVr1mjAgAE6d+5coZ+P63Foj+zatWs1cOBANWjQQBkZGXrxxRfVrl077dmzR15eXpKkZ599Vt99953mz58vX19fDRo0SA899JDWr18v6eqnEjt27Cir1aoNGzboxIkT6t27t1xdXTV+/HhHHh4AAECeubu7y2q1SpLKli2re+65R40aNVLr1q0VFxdn6wGdNWuWOnXqpKefflqNGjXSW2+9ZZu+6uLFi+rTp486dOigRYsW2bYdFhamhg0b2gLoli1bNH78eE2dOlVDhgyxtatYsaLatm1ra/ftt9/qmWee0cMPP2xrU6dOncI8DTfFoT2yy5Yt0+OPP66aNWuqTp06iouL05EjR7R161ZJUkpKimbOnKm33npLrVq1Ur169TRr1ixt2LBBmzZtkiT98MMP2rNnjz7//HPVrVtX7du317hx4zRt2jRuSQcAAG4LrVq1Up06dfT1119LunrzgFmzZumxxx5TeHi4KleurAULFtjaL1++XKdOndLzzz+f6/b8/PwkSfHx8fL29tYzzzxz3XZWq1WrV6/WyZMnC+6gCkCx+rBXSkqKJMnf31+StHXrVl25ckVt2rSxtQkPD1f58uW1ceNGSdLGjRsVERGhoKAgW5uoqCilpqZq9+7due4nPT1dqampdg8AAIDiLDw8XIcPH5YkrVy5UhcvXlRUVJQk6bHHHtPMmTNtbffv3297zfXs379fd911l1xdXa/b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quWpvsjIyBzP/9nbejNtCgIf9gIAAChGWrRooU8//VQ7duyQq6urwsPD1aJFCyUkJOjs2bPX7I2VJFdXV7vnFotFWVlZhV2yw9AjCwAAUIxkj5N9++23baE1O8gmJCRcc3zsjVSqVEmurq7avHmzbdnZs2f13//+N0/b2bRpU47n1atXz3ObgkCPLAAAQDFSqlQp1a5dW/Hx8Xr//fclSc2aNVO3bt105cqV6/bIXo+3t7f69eunESNGqHTp0goMDNRLL70kJ6e89WuuX79ekyZNUpcuXbRixQrNnz9f3333nV2b+fPnq379+mratKni4+O1ZcsWzZw5M191Xw9BFgAA3DEK8wYFBal58+bavn27rffV399fNWrUUFJSUp7HtP7d5MmTdeHCBXXu3FklS5bUc889p5SUlDxt47nnntMvv/yisWPHysfHR2+99ZaioqLs2owdO1bz5s3TM888o+DgYH3xxReqUaNGvuu+FothGEaBb9VkUlNT5evrq5SUFPn4+Di6HADArRjj6+gKbg9j8hZuHOF6v78vXbqkQ4cOKSwsTB4eHg6q8PZTsWJFDR069Lq3tLVYLFq0aJG6dOmSr33k5Wvn0DGyP/74ozp37qyQkBBZLBZ98803dusff/xxWSwWu8f9999v1+bMmTPq2bOnfHx85Ofnp379+unChQtFeBQAAABwBIcG2bS0NNWpUyfHHSH+7v7779eJEydsjy+++MJufc+ePbV7926tWLFCS5Ys0Y8//qgBAwYUdukAAAC3lZ9++kne3t7XfBRHDh0j2759e7Vv3/66bdzd3WW1WnNdt3fvXi1btkw///yz6tevL0l677331KFDB7355psKCQkp8JoBAABuR/Xr19f27duv2+bw4cM33E5Rjlot9h/2SkhIUGBgoEqVKqVWrVrptddeU+nSpSVJGzdulJ+fny3ESlKbNm3k5OSkzZs368EHH8x1m+np6UpPT7c9T01NLdyDAAAAKOY8PT1VuXJlR5eRJ8V6Htn7779fn332mVatWqU33nhDa9euVfv27ZWZmSlJSkxMVGBgoN1rXFxc5O/vr8TExGtud8KECfL19bU9QkNDC/U4AACAY/CZdvPJy9esWPfIdu/e3fb/iIgI1a5dW5UqVVJCQoJat26d7+3GxsZq2LBhtuepqamEWQAAbiPOzs6SpMuXL8vT09PB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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoEAAAHTCAYAAABY/cLZAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88F64QAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA3TklEQVR4nO3deXgUVd728buzdSBkAZIQkIQAApFNdiQgYREi2wPKiKAzQRYBBQYGGZVHARlUFsXBUQZBR1CMwyqMoBjZMgxhB2EQAdkiiJCwZSGRAOl6/+BNP7YJyBLSIef7ua6+TNeprvpVpejcnqo6ZbMsyxIAAACM4uHuAgAAAFD0CIEAAAAGIgQCAAAYiBAIAABgIEIgAACAgQiBAAAABiIEAgAAGIgQCAAAYCBCIAAAgIEIgQCAG2Kz2fTKK6+4uwwAhYQQiGJn4cKFstlsWrp0ab62+++/XzabTevWrcvXFhERoejo6EKv5/XXX9eyZcsKfblF4ZVXXpHNZrvm69SpU+4u8Y46ffq0RowYoaioKJUqVUqhoaFq1qyZXnjhBV24cKHQ15edna1XXnlFiYmJhb7s29WmTRuX3325cuXUtGlTffjhh3I4HO4uD4AbeLm7AODXWrVqJUnasGGDHnnkEef0jIwMffvtt/Ly8lJSUpLatm3rbDt+/LiOHz+u3r17F3o9r7/+un73u9+pR48ehb7sojJz5kyVKVMm3/SgoKCiL6aInDt3Tk2aNFFGRob69++vqKgonT17Vv/97381c+ZMPfPMMwXuk9uRnZ2tCRMmSLoauoqbypUra9KkSZKuBuSPP/5YAwYM0Pfff6/Jkyf/5ud//vlneXnxZwMoKfjXjGKnUqVKqlq1qjZs2OAyfdOmTbIsS4899li+trz3eQGyuLt48aJ8fHzk4VE0nfG/+93vFBwcXCTrup6srCz5+fkVybr+8Y9/6NixY0pKSsrXQ5yRkSEfH58iqaM4CQwM1O9//3vn+8GDB6tWrVp69913NXHiRHl7e+f7jMPh0KVLl+Tr6ytfX9+iLBfAHcbpYBRLrVq10jfffKOff/7ZOS0pKUl16tRRp06dtHnzZpdTWElJSbLZbGrZsqVz2ieffKLGjRurVKlSKleunHr37q3jx4+7rOfgwYPq2bOnwsLC5Ovrq8qVK6t3795KT0+XdPUaqKysLH300UfO02hPPfWU8/MnTpxQ//79VaFCBdntdtWpU0cffvihyzoSExNls9k0f/58vfzyy7rnnntUunRpZWRkSJIWLVrkrDM4OFi///3vdeLECZdlnDp1Sv369VPlypVlt9tVsWJFde/eXcnJybe1n39d48KFC/Xaa6+pcuXK8vX1Vfv27XXo0KF882/ZskUPP/ywAgMDVbp0acXExCgpKcllnrxT0d99952eeOIJlS1b1hnSHQ6HXnnlFVWqVEmlS5dW27Zt9d133ykyMtK5f48cOSKbzaa//vWv+da/ceNG2Ww2/fOf/7zmNh0+fFienp564IEH8rUFBAQ4A8348ePl7e2t06dP55tv0KBBCgoK0sWLFyVJ27dvV2xsrIKDg1WqVClVrVpV/fv3lyQlJycrJCREkjRhwgTn8fLLa+j279+v3/3udypXrpx8fX3VpEkTff755y7rnDt3rmw2mzZs2KA//vGPCgkJUVBQkAYPHqxLly4pLS1NcXFxKlu2rMqWLavnn39elmVdcz9cT+nSpfXAAw8oKyvLuf02m03Dhg1TfHy86tSpI7vdrq+++srZ9utrAk+cOKEBAwaoUqVKstvtqlq1qp555hldunTJOU9aWppGjhyp8PBw2e123XvvvZoyZUq+09Dz589X48aN5e/vr4CAANWrV09vv/32LW0bgN9GTyCKpVatWmnevHnasmWL87RaXo9OdHS00tPT9e2336p+/frOtqioKJUvX16S9Nprr2ns2LHq1auXBg4cqNOnT+udd95R69at9c033ygoKEiXLl1SbGyscnJyNHz4cIWFhenEiRNasWKF0tLSFBgYqHnz5mngwIFq1qyZBg0aJEmqXr26JCklJUUPPPCA849mSEiIVq5cqQEDBigjI0MjR4502aaJEyfKx8dHo0ePVk5Ojnx8fDR37lz169dPTZs21aRJk5SSkqK3335bSUlJzjolqWfPntq7d6+GDx+uyMhIpaamatWqVTp27JgiIyN/c3+eO3cu3zQvL698p4MnT54sDw8PjR49Wunp6Zo6daqefPJJbdmyxTnP2rVr1alTJzVu3Fjjx4+Xh4eH5syZo3bt2uk///mPmjVr5rLMxx57TDVq1NDrr7/uDCtjxozR1KlT1a1bN8XGxmr37t2KjY11hi1Jqlatmlq2bKn4+Hj96U9/cllmfHy8/P391b1792tuc5UqVZSbm6t58+apb9++15zvD3/4g/7yl79owYIFGjZsmHP6pUuXtHjxYvXs2VO+vr5KTU1Vx44dFRISohdffFFBQUFKTk7WZ599JkkKCQlxnmZ+5JFH9Oijj0qS8xjdu3evWrZsqXvuuUcvvvii/Pz8tHDhQvXo0UNLlixxufRBkvOYnDBhgjZv3qzZs2crKChIGzduVEREhF5//XV9+eWXeuONN1S3bl3FxcVdcxuv58iRI/L09HQ5FtauXauFCxdq2LBhCg4OvuYx9tNPP6lZs2ZKS0vToEGDFBUVpRMnTmjx4sXKzs6Wj4+PsrOzFRMToxMnTmjw4MGKiIjQxo0bNWbMGJ08eVLTp0+XJK1atUp9+vRR+/btNWXKFEnSvn37lJSUpBEjRtzStgH4DRZQDO3du9eSZE2cONGyLMu6fPmy5efnZ3300UeWZVlWhQoVrBkzZliWZVkZGRmWp6en9fTTT1uWZVnJycmWp6en9dprr7ksc8+ePZaXl5dz+jfffGNJshYtWnTdWvz8/Ky+ffvmmz5gwACrYsWK1pkzZ1ym9+7d2woMDLSys7Mty7KsdevWWZKsatWqOadZlmVdunTJCg0NterWrWv9/PPPzukrVqywJFnjxo2zLMuyzp8/b0my3njjjevvtAKMHz/eklTgq1atWs758mq87777rJycHOf0t99+25Jk7dmzx7Isy3I4HFaNGjWs2NhYy+FwOOfLzs62qlatanXo0CHfuvv06eNS06lTpywvLy+rR48eLtNfeeUVS5LLvp41a5Ylydq3b5/LfgsODi7wd/Lr9YSEhFiSrKioKGvIkCHWp59+aqWlpeWbt0WLFlbz5s1dpn322WeWJGvdunWWZVnW0qVLLUnWtm3brrnO06dPW5Ks8ePH52tr3769Va9ePevixYvOaQ6Hw4qOjrZq1KjhnDZnzhxLUr593KJFC8tms1lDhgxxTrty5YpVuXJlKyYm5rr7wrIsKyYmxoqKirJOnz5tnT592tq3b5/1xz/+0ZJkdevWzTmfJMvDw8Pau3dvvmX8etvi4uIsDw+PAvdJXu0TJ060/Pz8rO+//96l/cUXX7Q8PT2tY8eOWZZlWSNGjLACAgKsK1eu/Oa2ACgcnA5GsXTfffepfPnyzmv9du/eraysLOe1XdHR0c7Tj5s2bVJubq7zVONnn30mh8OhXr166cyZM85XWFiYatSo4byzODAwUJKUkJCg7Ozsm6rPsiwtWbJE3bp1k2VZLuuJjY1Venq6du7c6fKZvn37qlSpUs7327dvV2pqqp599lmXa626dOmiqKgoffHFF5KkUqVKycfHR4mJiTp//vxN1ZlnyZIlWrVqlctrzpw5+ebr16+fy7VyDz74oKSrvUWStGvXLh08eFBPPPGEzp4969zmrKwstW/fXuvXr893im/IkCEu79esWaMrV67o2WefdZk+fPjwfPX06tVLvr6+io+Pd05LSEjQmTNnXK5tK0iFChW0e/duDRkyROfPn9d7772nJ554QqGhoZo4caLLKdS4uDht2bJFhw8fdk6Lj49XeHi4YmJiJP3fTTQrVqzQ5cuXr7vuXzt37pzWrl2rXr16KTMz07nfzp49q9jYWB08eDDfJQADBgyQzWZzvm/evLksy9KAAQOc0zw9PdWkSRPn7+e37N+/XyEhIQoJCdF9992nd955R126dMl3CUNMTIxq16593WU5HA4tW7ZM3bp1U5MmTfK159W+aNEiPfjggypbtqzLv5OHHnpIubm5Wr9+vaSr+zcrK0urVq26oW0BcPsIgSiWbDaboqOjndf+JSUlKTQ0VPfee68k1xCY99+8EHjw4EFZlqUaNWo4/+Dlvfbt26fU1FRJUtWqVTVq1Ch98MEHCg4OVmxsrGbMmOG8HvB6Tp8+rbS0NM2ePTvfOvr16ydJzvXkqVq1qsv7H374QZJUq1atfMuPiopyttvtdk2ZMkUrV65UhQoV1Lp1a02dOvWmhndp3bq1HnroIZdXixYt8s0XERHh8r5s2bKS5AyfBw8elHQ10P56uz/44APl5OTk23/X2u6832WecuXKOdeXJygoSN26ddOnn37qnBYfH6977rlH7dq1+83trlixombOnKmTJ0/qwIED+tvf/qaQkBCNGzdO//jHP5zzPf7447Lb7c6wmZ6erhUrVujJJ590hpmYmBj17NlTEyZMUHBwsLp37645c+YoJyfnN+s4dOiQLMvS2LFj8+238ePHS8p/vPz6d5H3Py3h4eH5pt/o/xxERkZq1apVWr16tTZs2KBTp05pxYoV+W4a+vXvrCCnT59WRkaG6tate935Dh48qK+++irfdj/00EOS/m+7n332WdWsWVOdOnVS5cqV1b9/f+e1iADuDK4JRLHVqlUrLV++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Db3uqeHbCoEff/yxsrOzb2cRAAAATnnXAJYuXdrNldy98vbd5cuX71wIbNq06e18HAAAoECcAr51N7rvbmqw6L59++rjjz/WsWPHbqkoAAAAFA83FQJ/+OEHDR48WFWrVlX16tU1cOBAxcfH6+TJk3eqPgAAgLtCmzZtNHLkSElSZGSkpk+ffsOfTU5Ols1m065du+5IbQW5qdPBiYmJysnJ0caNG5WYmKjExER98sknunz5smrUqKG2bduqXbt2euyxx+5UvQAAwFCRL35RZOtKntzltj6/bds2+fn5FVI1V82dO1cjR44stKFzbvqaQLvdrrZt26pt27aSpIsXL2rjxo1auXKlZs+erdmzZxMCAQCA0UJCQtxdwm+6qdPBv3Tp0iX9+9//1pQpU/SXv/xF7777roKDg9W3b9/CrA8AAOCu8+vTwfv371erVq3k6+ur2rVra/Xq1bLZbFq2bJnL544cOaK2bduqdOnSuv/++7Vp0yZJV8/G9uvXT+np6bLZbLLZbHrllVduq8ab6glcv369EhMTtW7dOm3ZskURERGKiYnRoEGD9Mknn6hy5cq3VQwAAEBJk5ubqx49eigiIkJbtmxRZmamnnvuuQLnfemll/Tmm2+qRo0aeumll9SnTx8dOnRI0dHRmj59usaNG6cDBw5IksqUKXNbdd1UCGzTpo0iIiL0wgsvaP78+apQocJtrRwAAKCkW7VqlQ4fPqzExESFhYVJkl577TV16NAh37yjR49Wly5Xr0ecMGGC6tSpo0OHDikqKkqBgYGy2WzOZdyumzod/PzzzyssLEwjR45Uhw4dNHz4cC1ZskRnzpwplGIAAABKmgMHDig8PNwlvDVr1qzAeevXr+/8Oe+xb3mPgStsNxUCJ0+erM2bN+vs2bOaMmWKSpcuralTp6pSpUqqW7euhg4dqsWLF9+RQgEAAEo6b29v5895gz47HI47sq5bemJImTJl1KlTJ3Xq1EmSdO7cOb311lt655139N577/EsYQAAgP+vVq1aOn78uFJSUpyX0m3btu2ml+Pj41OoGeuWQqDD4dC2bducYwUmJSXpwoULioiI0KOPPlpoxQEAANztOnTooOrVq6tv376aOnWqMjMz9fLLL0u6ucfjRUZG6sKFC1qzZo3uv/9+lS5d+raesXxTp4OnTp2qzp07q2zZsmrRooVzWJjp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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "scen.commit(comment=\"Introducing emissions, DACCS technology, and setting an upper bound\")\n", + "scen.set_as_default()\n", + "\n", + "scen.solve()\n", + "scen.var(\"OBJ\")[\"lvl\"]\n", + "\n", + "# Create a Reporter object to describe and carry out reporting\n", + "# calculations and operations (like plotting) based on `scenario`\n", + "# Add keys like \"plot activity\" to describe reporting operations.\n", + "# See tutorial/utils/plotting.py\n", + "from message_ix.reporting import Reporter\n", + "from message_ix.util.tutorial import prepare_plots\n", + "\n", + "rep = Reporter.from_scenario(scen)\n", + "\n", + "prepare_plots(rep)\n", + "\n", + "# Only show a subset of technologies in the follow plots;\n", + "# e.g. exclude \"bulb\" and \"grid\"\n", + "rep.set_filters(t=[\"coal_ppl\", \"wind_ppl\",\"DACCS\"])\n", + "\n", + "# Trigger the calculation and plotting\n", + "rep.get(\"plot activity\")\n", + "\n", + "# Create a different plot. The same filters are still active.\n", + "rep.get(\"plot capacity\")\n", + "\n", + "# Replace the technology filters with a commodity filter;\n", + "# show only \"light\" and not e.g. \"electricity\".\n", + "rep.set_filters(t=None, c=[\"light\"])\n", + "\n", + "# Create a price plot\n", + "rep.get(\"plot prices\")\n", + "\n", + "mp.close_db()" + ] + }, + { + "cell_type": "markdown", + "id": "3a6671bf", + "metadata": {}, + "source": [ + "# All Done\n", + "Voila! You can now see DACCS included in the model. Congratulations!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c2009f76", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 88b52de03aed8fbd0682961fc6abec1f88c785dd Mon Sep 17 00:00:00 2001 From: ywpratama <48617743+ywpratama@users.noreply.github.com> Date: Mon, 13 Mar 2023 05:46:10 +0100 Subject: [PATCH 10/12] Update westeros_baseline_recursive-dynamic.ipynb --- tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb b/tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb index 72dbe9229..526a52b04 100644 --- a/tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb +++ b/tutorial/westeros/westeros_baseline_recursive-dynamic.ipynb @@ -96,7 +96,9 @@ "source": [ "## Time to Solve the Model\n", "\n", - "In perfect foresight mode, the solve statement we add is `scen.solve()` without any additional arguments. By default, this will tell MESSAGE to run in the perfect foreseight mode. To run MESSAGE using the recursive dynamic approach, we need to add `gams_args =[\"--foresight=X\"]` argument to the solve statement, with `X` being the length of the foresight windows. This will pass the argument directly to `GAMS`, overiding the default values set in `MESSAGE_master.gms` and `model_setup.gms` scripts. Here, let's use `X=1` as an example." + "In perfect foresight mode, the solve statement we add is `scen.solve()` without any additional arguments. By default, this will tell MESSAGE to run in the perfect foreseight mode. To run MESSAGE using the recursive dynamic approach, we need to add `gams_args =[\"--foresight=X\"]` argument to the solve statement, with `X` being the length of the foresight windows. This will pass the argument directly to `GAMS`, overiding the default values set in `MESSAGE_master.gms` and `model_setup.gms` scripts. Here, let's use `X=1` as an example. \n", + "\n", + "Similarly, technology cost learning module can be activated by setting `learningmode` value to 1. This can also be done by passing `\"--learningmode=1\"` GAMS argument in the solve statement, i.e., `gams_args =[\"--foresight=X\",\"--learningmode=1\"]`. It is important to note that the learning module lives under the recursive dynamic module. Hence, this module needs to be active if learning module is used." ] }, { From 0a066916fc1cb14e666afd7b07f310a9894c0876 Mon Sep 17 00:00:00 2001 From: PRATAMA Yoga <48617743+ywpratama@users.noreply.github.com> Date: Wed, 28 Jun 2023 14:15:56 +0200 Subject: [PATCH 11/12] Fix Price Emission calculation bugs --- message_ix/model/MESSAGE/model_solve.gms | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/message_ix/model/MESSAGE/model_solve.gms b/message_ix/model/MESSAGE/model_solve.gms index 918eaf023..890ed628f 100644 --- a/message_ix/model/MESSAGE/model_solve.gms +++ b/message_ix/model/MESSAGE/model_solve.gms @@ -61,7 +61,7 @@ EMISSION_CONSTRAINT.m(node,type_emission,type_tec,type_year)$( PRICE_EMISSION.l(node,type_emission,type_tec,year)$( SUM(type_year$( cat_year(type_year,year) ), 1 ) ) = SMAX(type_year$( cat_year(type_year,year) ), - EMISSION_CONSTRAINT.m(node,type_emission,type_tec,type_year) ) - / df_year(year) ; + * (df_period("1950")/df_period(year)) * (duration_period(year)/duration_period("1950")) ; PRICE_EMISSION.l(node,type_emission,type_tec,year)$( PRICE_EMISSION.l(node,type_emission,type_tec,year) = - inf ) = 0 ; From e34b1d504640c45f99b8cb6ee4f76cc04b513076 Mon Sep 17 00:00:00 2001 From: PRATAMA Yoga <48617743+ywpratama@users.noreply.github.com> Date: Wed, 28 Jun 2023 15:13:17 +0200 Subject: [PATCH 12/12] Making base year definition dynamic --- message_ix/model/MESSAGE/model_solve.gms | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/message_ix/model/MESSAGE/model_solve.gms b/message_ix/model/MESSAGE/model_solve.gms index 890ed628f..05cc60ad7 100644 --- a/message_ix/model/MESSAGE/model_solve.gms +++ b/message_ix/model/MESSAGE/model_solve.gms @@ -61,7 +61,7 @@ EMISSION_CONSTRAINT.m(node,type_emission,type_tec,type_year)$( PRICE_EMISSION.l(node,type_emission,type_tec,year)$( SUM(type_year$( cat_year(type_year,year) ), 1 ) ) = SMAX(type_year$( cat_year(type_year,year) ), - EMISSION_CONSTRAINT.m(node,type_emission,type_tec,type_year) ) - * (df_period("1950")/df_period(year)) * (duration_period(year)/duration_period("1950")) ; + * (sum(year_all$(ord(year_all) = 1), df_period(year_all))/df_period(year)) * (duration_period(year)/(sum(year_all$(ord(year_all) = 1), duration_period(year_all)))) ; PRICE_EMISSION.l(node,type_emission,type_tec,year)$( PRICE_EMISSION.l(node,type_emission,type_tec,year) = - inf ) = 0 ;