Electrolyzer model needs improvement
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
We have now two possibilities on the table, both discussed in the openmod forum (linked above).
- 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).
- 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:
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)

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.
We should discuss this further in the openmod forum, as there are new answers.
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.
Is @marc-juanpera still in charge of this or should assign somebody else?
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.
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:
- Optimize capacity and preliminary dispatch with simplified model (efficiency, potentially multiple in/outputs, marginal costs)
- 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.csvfiles, or by defining an additionalcsvfile that has to be defined within that file, in the case that theasset_typeis nottransformer(3 hrs) - [ ] Consider if a new
asset_typeshould 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
energyConversionassets, 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.