Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

adding average LCO-ccsinje and adjustment cost bugfixes #492

Merged
merged 10 commits into from
Jan 4, 2024

Conversation

tabeado
Copy link
Contributor

@tabeado tabeado commented Dec 8, 2023

  • added average levelized cost of ccsinje and cost from electricity demand for ccsinje in report.LCOE.
  • bugfix of average adjustment cost in report.LCOE
  • bugfix of "capital cost w/ adjCost" for ccsinje, dac, and some transport techs in report.Technology

@tabeado tabeado requested a review from cchrisgong December 8, 2023 16:44
@tabeado
Copy link
Contributor Author

tabeado commented Dec 8, 2023

@robertpietzcker @JakobBD

R/reportLCOE.R Outdated
v_directteinv_wadj <- readGDX(gdx,name=c("o_avgAdjCostInv"),field="l",format="first_found")[,ttot,]
v_directteinv <- readGDX(gdx,name=c("v_costInvTeDir","vm_costInvTeDir","v_directteinv"),field="l",format="first_found")[,ttot,] ## Total direct Investment Cost in Timestep
#v_directteinv_wadj <- readGDX(gdx,name=c("o_avgAdjCostInv"),field="l",format="first_found")[,ttot,] ## average adjustment cost per unit installed in period
v_adjteinv <- readGDX(gdx,name=c("v_costInvTeAdj"),field="l",format="first_found")[,ttot,] ## total adjustment cost in period
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe the R variable can also be called "v_costInvTeAdj"? normally I think the convention is to go with the REMIND variable name unless it is not possible.. (like v_directteinv above this)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree in principle, but wanted to stick with the convention used in this part of the script. "v_costInvTeDir" turns into "v_directteinv", and I just applied the same logic. What did you mean saying "(like v_directteinv above this)"?


# calculate secondary Fuel cost for ccsinje
te_annual_secFuel_cost <- new.magpie(getRegions(te_inv_annuity),ttot_from2005, "ccsinje" , fill=0)
te_annual_secFuel_cost[,,"ccsinje"] <- setNames(-pm_prodCouple[,,"ccsinje"] * Fuel.Price[,,"seel"] * vm_co2CCS[,,"ccsinje.1"], "ccsinje")
Copy link
Contributor

@cchrisgong cchrisgong Dec 8, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am probably missing something, but why negative here? (-pm_prodCouple) oh I see nevermind it is because CCS consumes energy, would be nice to write this more explicitly (like below)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

could also write a short documentation of the meanings of the three things multiplied here, I read it as
negative sign (so pm_prodCouple turns positive) * energy demand of CO2 injection (pm_prodCouple) * secondary electricity price * amount of CO2 captured (with units like below)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It says in line 249 that negative values mean own consumption, positive values mean coupled product. As I want positive cost, I need to multiply.
I can adjust the line with the units if you want to have a more detailed documentation.

R/reportLCOE.R Outdated
# calculate secondary Fuel cost for ccsinje
te_annual_secFuel_cost <- new.magpie(getRegions(te_inv_annuity),ttot_from2005, "ccsinje" , fill=0)
te_annual_secFuel_cost[,,"ccsinje"] <- setNames(-pm_prodCouple[,,"ccsinje"] * Fuel.Price[,,"seel"] * vm_co2CCS[,,"ccsinje.1"], "ccsinje")
# units: pm_prodCouple[,,"ccsinje"] = [TWa/GtC]; Fuel.Price = [USD2005/GtC]; vm_co2CCS= [GtC]; te_annual_secFuel_cost = [USD2005]
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fuel price has unit USD2005/TWa, right?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch, will adjust

R/reportLCOE.R Outdated
te_annual_OMF_cost[,,"ccsinje"])
# distribute ccs injection cost over techs
te_annual_OMF_cost[,,"ccsinje"] + te_annual_secFuel_cost[,,"ccsinje"])
# distribute ccs injection cost over techs => this does not include adjustment cost incurred! => what is the reasoning behind it?
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

don't quite understand this comment, do you mean why is adjustment cost not added as a OMF cost? What is the unit of total_ccsInj_cost?

Btw I don't quite get the formula here; shouldn't the total cost = annuitized (investment cost + other fixed costs (OMF, adjCost)) + running cost (energy cost, OMV cost, CO2 tax)... It looks like OMF and energy cost are here, but the others(?)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I put this in the commit accidentally. The point is that only ccs injection cost without adjustment cost are distributed across technologies. I just wondered why there is no version that includes adjustment cost as these can be very substantial

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The general formula for total cost should be (and is):
annuitized (investment cost + adjCost) + OMF cost (don't need to be annuitized) + running cost (energy cost, OMV cost, CO2 tax).
The ccs cost only has investment cost + OMF cost + now also energy cost
Adjustment cost are missing, that was precisely the point of my comment

R/reportLCOE.R Outdated
#### Carbon Transport and storage ("ccsinje")
setNames(te_annual_inv_cost[,ttot_from2005,"ccsinje"]/
vm_co2CCS_tCO2[,,"ccsinje.1"],
paste0("LCOx|average|","cco2_stored|","ccsinje","|supply-side", "|Investment Cost")),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

instead of calling it LCOx, maybe something more concrete like "LCOCS" Levelized cost of carbon/Co2 storage?

Copy link
Contributor

@cchrisgong cchrisgong Dec 8, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why do we give "cco2_stored" in the variable name? I thought usually for readability we have something more like "Captured CO2|Injected CO2 |Supply side|..." etc. not sure what the convention is

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I called it "cco2_stored" because the convention for the other items in this dimension is pe2se$all_te. In my understanding, "cco2" would be the remind element corresponding to that. However, it is not about cco2 (all captured co2) but only the part of it that is stored, thus the additional "_stored"

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

about LCOx vs LCOCS: I think that is a general question of how we want to call "LCO other than E" in this script. There are plans to also add LCO of CDR options. Do we want to give all of them their own abbreviation? Or do we want to have a generic LCOx and then filter according to the technologies, as it is the case with LCOE?

R/reportLCOE.R Outdated

# calculate standing system LCOE
# divide total cost of standing system in that time step by total generation (before curtailment) in that time step
# exception: grid and storage cost are calculate by dividing by generation after curtailment
# convert from USD2005/MWh to USD2015/MWh (*1.2)
# exceptions: grid and storage cost are calculate by dividing by generation after curtailment
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe add another exception here that for CCS, it is divided by CO2 (or C?) stored

Copy link
Contributor

@cchrisgong cchrisgong left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe would also be nice to have a trial run (or output LCOE csv available - or its screenshot), so a CCS expert can comment on the costs (not an expert here :P) maybe Jess or Anne?

@tabeado
Copy link
Contributor Author

tabeado commented Dec 12, 2023

You can compare results here: /p/tmp/tabeado/remind2_clean/reportLCOE_adjustment

Copy link
Contributor

@cchrisgong cchrisgong left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the nice edits! I approve this change :) Happy holiday~ :3

@tabeado tabeado merged commit bb3bd38 into pik-piam:master Jan 4, 2024
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants