Bugfix on storage so storage can't charge with unavailable input commodity#664
Conversation
…_control in storage baseclass setup()
jaredthomas68
left a comment
There was a problem hiding this comment.
The storage base class changes to make all controllers take in the available commodity makes sense on the surface, but could ultimately limit the ability to charge storage from the grid because storage would never charge. I went and checked on the PLM optimized control and found it has not been correctly connected to the grid yet and so I would like to get that figured out first so we can appropriately address it in this PR. I made a draft PR with my ideas in #745 that I think should help clarify my concerns.
That said, I really the ideas in this PR and expect them to come in once we have a clear path forward (probably this week I think). I just want to make sure we are all on the same page and don't negatively impact existing capabilities.
vijay092
left a comment
There was a problem hiding this comment.
I looked at Example 34 and it looks good to me! Thanks, Elenya!
Bugfix on storage so storage can't charge with unavailable input commodity
Storage performance models were not constrained to only charge with the available input commodity. If a controller were to tell the storage performance model to charge more than the available input commodity, then the storage would charge more than the available input commodity. This shouldn't be allowed to happen, storage performance models should only be able limited to only be able to charge with the commodity_in. This PR fixes that.
This PR also fixes some of the logic in the storage model baseclass to decide whether it's using feedback control. The previous logic was:
and was updated to:
Previously, if you had a technology named "battery" that uses a pyomo controller and another technology named "battery_1" that uses an open-loop controller. Then the logic in "battery_1" would have said it's using feedback control (when it isn't). Using
==instead ofinmakes it so that the logic inbattery_1will run as expected.Both of these changes have new tests!
Section 1: Type of Contribution
Section 2: Draft PR Checklist
TODO:
Type of Reviewer Feedback Requested (on Draft PR)
Structural feedback:
Implementation feedback:
Other feedback:
Section 3: General PR Checklist
docs/files are up-to-date, or added when necessaryCHANGELOG.md"A complete thought. [PR XYZ]((https://github.com/NatLabRockies/H2Integrate/pull/XYZ)", where
XYZshould be replaced with the actual number.Section 3: Related Issues
Section 4: Impacted Areas of the Software
Section 4.1: New Files
Section 4.2: Modified Files
examples/34_plm_optimized_dispatch/: tech config and plant config were updated to use an electricity feedstock instead of the grid. This change was made based on input from @vijay092 and the planned future work thats captured in Issue SLC: sync up peak load management capabilities #749.h2integrate/storage/battery/pysam_battery.py: modifiedPySAMBatteryPerformanceModelsimulate(): updated to take commodity_available as an input and constrain charge based on the available commodity.h2integrate/storage/storage_baseclass.py: modifiedStoragePerformanceBaserun_storage(): updated calls tosimulate()and addedcommodity_availableas a key in the kwargs dictionary to pass to feedback controllers.simulate(): updated to take commodity_available as an input and constrain charge based on the available commodity.setup(): minor change in logic for deciding whether using feedback control or notNew tests
h2integrate/control/test/test_multistorage_pyomo_openloop_control.py::test_battery_pyomo_battery_openloop: test that would've failed before this PR that tests the naming logic for deciding whether a technology has a feedback control strategy or not.h2integrate/storage/test/test_storage_performance_model.py::test_generic_storage_charge_more_than_available: test that would've failed before this PR. Tests when the commodity_set_point tells the storage to charge more than what's available.Section 5: Additional Supporting Information
Section 6: Test Results, if applicable
Section 7 (Optional): New Model Checklist
docs/developer_guide/coding_guidelines.mdattrsclass to define theConfigto load in attributes for the modelBaseConfigorCostModelBaseConfiginitialize()method,setup()method,compute()methodCostModelBaseClasssupported_models.pycreate_financial_modelinh2integrate_model.pytest_all_examples.pydocs/user_guide/model_overview.mddocs/section<model_name>.mdis added to the_toc.yml