multi-vector-simulator icon indicating copy to clipboard operation
multi-vector-simulator copied to clipboard

Electrolyzer model needs improvement

Open smartie2076 opened this issue 5 years ago • 6 comments

The electrolyzer is currently only modelled through a transformer with a fix efficiency. However, it in reality has a minimal operation level (~5% CAP), and below this standby consumption.

How to model the standy mode specifically (while being able to optimize the capacity) is being discussen in the openmod forum: LINK

smartie2076 avatar Jan 13 '20 10:01 smartie2076

We have now two possibilities on the table, both discussed in the openmod forum (linked above).

  1. Use a transformer with fixed efficiency. This option does not take into account the 5% consumption in standby mode (when the electrolyser is not operating).
  2. Use a transformer with fixed efficiency and a sink, together with a constraint that forces a minimum 5% consumption either by the electrolyser and the sink. The constraint can look something like this: image This option gets some nice results if the electrolyser is operating, when operating, almost a 100% of capacity (which in the first tests it does) image

Other options might consider a transformer and a sink that always consumes 5% of the power capacity (without constraint, and therefore overestimating the consumption) or an off-set transformer, which cannot be optimized.

marc-juanpera avatar Jan 31 '20 12:01 marc-juanpera

We should discuss this further in the openmod forum, as there are new answers.

smartie2076 avatar Feb 24 '20 13:02 smartie2076

I have closed the PR #118 now, as I want the electrolyzer to be implemented differently: Not based on checking the asset´s name only, but rather by defining a new parameter in ´energyConversion.csv´ or by adding a csv that gathers all additional constraints. Also, I am not sure of the introduced constraint:

    def standby_rule(model, t):
        minimum = 0.05 * model.InvestmentFlow.invest[electrolyser, bus_H2] / efficiency
        expr = -minimum
        expr += model.flow[bus_electricity, standby_sink, t]
        expr += model.flow[bus_electricity, electrolyser, t] / 10
        return expr >= 0

    model.stanby_consumption_constraint = po.Constraint(
        model.TIMESTEPS, rule=standby_rule
    )
    return model

As /10 is an experimental and somewhat volatile number that had "the best resulting dispatch". Let us remember this solution, but we need further discussion on this. Especially in the discussion in the openmod forum, where two people are already ready to help us with the issue.

smartie2076 avatar Apr 29 '20 09:04 smartie2076

Is @marc-juanpera still in charge of this or should assign somebody else?

SabineHaas avatar Jun 10 '20 10:06 SabineHaas

No, he is not in charge anymore. We will for now go with a simple transformer, to which two inputs have to be added (water, electricity). Due to issue #186 this has to be simplified currently to only electricity intake.

smartie2076 avatar Jun 10 '20 18:06 smartie2076

The electrolzer model is very simplified right now, and the question stays how we can improve this. One way, for now, would be to optimize with the simplified model, but allow a more complex electrolyzer (and, for that matter, any transformer) representation with a designated capacity. Process:

  1. Optimize capacity and preliminary dispatch with simplified model (efficiency, potentially multiple in/outputs, marginal costs)
  2. Optimize dispatch with capacity from (1). This may not result in the real optimal solution, but a realistic dispatch scenario for the capacity identified in (1).

The idea would be to integrate:

  • Start up and shut off costs
  • Minimal uptime and minimal downtime requirements
  • Minimal and maximal load factors All of this can be covered with existing oemof functionalities: https://oemof-solph.readthedocs.io/en/latest/_modules/oemof/solph/blocks/non_convex_flow.html?highlight=startup#

This does not solve the issue on how to integrate standby consumption nor of an efficiency curve.

I see following todos for implementing this in the MVS:

  • [ ] Determine the required input parameters for the new feature (1 hrs)
  • [ ] Determine how to pass this parameters to the MVS. This could either be solved like the thermal storage #667 by adding optional arguments in the original energyConversion.csv files, or by defining an additional csv file that has to be defined within that file, in the case that the asset_type is not transformer (3 hrs)
  • [ ] Consider if a new asset_type should be defined, eg. advanced_transformer (2 hrs)
  • [ ] Implement parsing of new parameters (8 hrs)
  • [ ] Add validity check that new parameters are only possible if optimize_cap==False (2 hrs)
  • [ ] Add validity check that parameters for optimized conversion assets are not affected (2 hrs)
  • [ ] Add possible pre-processing of parameters (2 hrs)
  • [ ] Add (a) new parameters within the exisiting component models or (b) write a new component model in D1 (4 hrs)
  • [ ] Consider if evaluation can be just as with the standard energyConversion assets, if new KPI need to be added or if a whole new evaluation is necessary (1 hrs)
  • [ ] Implement evaluation of advanced model (4 hrs)
  • [ ] Add 2 benchmark tests (one with general transformer, one with advanced transformer) (8 hrs)
  • [ ] Make sure that pytests are added along the way (8 hrs)
  • [ ] Make sure that EPA is not affected / add default values (8 hrs)

Overall, I would expect that to do this properly, one should plan with 53 hrs of work. This can go faster with more MVS experience (30 hrs), but also take 70 hrs if that knowledge is not really there or if another person has to discuss repeatedly with them.

smartie2076 avatar Nov 02 '21 08:11 smartie2076