Sync PySAM Battery and Generic Storage Pyomo Performance models with open-loop controllers#613
Conversation
…ble with updated open-loop controllers
jaredthomas68
left a comment
There was a problem hiding this comment.
Wow, nice PR @elenya-grant ! I gave pretty minor comments and am hoping for some discussion from other reviewers regarding some naming thoughts.
| self.add_discrete_input("pyomo_dispatch_solver", val=dummy_function) | ||
| break | ||
| else: | ||
| # using open-loop controller |
There was a problem hiding this comment.
| # using open-loop controller |
There was a problem hiding this comment.
same response as I had with the Pysam battery, I don't think this comment is incorrect and I think it gives some clarity on what input expect when using open-loop controllers.
There was a problem hiding this comment.
Same response. I don't think it is incorrect, just not needed since the logic is basically showing that we are either using a pyomo controller or another controller. I'm ok with leaving it if you want to.
…EART into dispatch/sync_ol_pyo
genevievestarke
left a comment
There was a problem hiding this comment.
I think this is looking really good and I'm excited to have the storage performance and control models integrated!!!
I've weighed in on a few naming questions, but ultimately, I don't think they're blocking changes.
| """ | ||
|
|
||
| n = self.config.n_control_window | ||
| n = len(storage_dispatch_commands) |
There was a problem hiding this comment.
I think to keep this in line with naming, I would advocate for storage_cost.py
There was a problem hiding this comment.
yeah - I guess we're getting a bit casual with whether "generic" is included in names. @jaredthomas68 @kbrunik - y'all got any opinions on this?
There was a problem hiding this comment.
I think giving it a generic name like "storage_cost" says generic without explicitly saying it, which I think is fine.
jaredthomas68
left a comment
There was a problem hiding this comment.
One non-blocking change requested. I don't think I need to review again.
| @@ -7,8 +7,8 @@ The open-loop storage controllers can be attached as the control strategy in the | |||
| 2. Demand Open-Loop Storage Controller - uses simple logic to attempt to meet demand using the storage technology. | |||
|
|
|||
| (pass-through-controller)= | |||
There was a problem hiding this comment.
The link name should still be changed I think.
| self.add_discrete_input("pyomo_dispatch_solver", val=dummy_function) | ||
| break | ||
| else: | ||
| # using open-loop controller |
There was a problem hiding this comment.
Same response. I don't think it is incorrect, just not needed since the logic is basically showing that we are either using a pyomo controller or another controller. I'm ok with leaving it if you want to.
There was a problem hiding this comment.
I think giving it a generic name like "storage_cost" says generic without explicitly saying it, which I think is fine.
| if any(intended_dispatch_tech in name for name in self.tech_group_name): | ||
| self.add_discrete_input("pyomo_dispatch_solver", val=dummy_function) | ||
| break | ||
| # using open-loop controller |
There was a problem hiding this comment.
I guess I was not clear. I think the logic makes it clear and no comment is needed, but I think it is ok either way
* Remove old iron models (#601) * removed temporary iron and steel models * supported models * update example 28 with updated models * remove outdated files * consolidate iron examples * fix all the stuff I broke * update docs and changelog * update example name and add model names to docs * update changelog --------- Co-authored-by: elenya-grant <116225007+elenya-grant@users.noreply.github.com> * update SMR energy conversion ratio and tests (#606) * update SMR energy conversion ratio and tests * update changelog * docs * minor updates to inline comments * update usage based on hydrogen production --------- Co-authored-by: Rob Hammond <13874373+RHammond2@users.noreply.github.com> Co-authored-by: elenya-grant <116225007+elenya-grant@users.noreply.github.com> Co-authored-by: John Jasa <john.jasa@nrel.gov> Co-authored-by: genevievestarke <103534902+genevievestarke@users.noreply.github.com> Co-authored-by: Jared Thomas <jaredthomas68@gmail.com> Co-authored-by: bayc <christopher.j.bay@gmail.com> Co-authored-by: John Jasa <johnjasa11@gmail.com> Co-authored-by: Jared Thomas <jaredthomas68@users.noreply.github.com> Co-authored-by: Jonathan Martin <94018654+jmartin4u@users.noreply.github.com> Co-authored-by: jmartin4 <jonathan.martin@nrel.gov> Co-authored-by: Jonathan Martin <94018654+jmartin4nrel@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Chris Bay <12664940+bayc@users.noreply.github.com> * Break out Pyomo controller simulation code (#587) * Breakout simulation code * Remove duplicate code * Fix testing * Update doc strings and docs * added docstring for heuristic controller config * fixed issue that I made with the HeuristicLoadFollowingControllerConfig * Update docs/control/pyomo_controllers.md Co-authored-by: Jared Thomas <jaredthomas68@users.noreply.github.com> * Make initialize_parameters() functions the same for both controllers * Apply suggestion from @jaredthomas68 Co-authored-by: Jared Thomas <jaredthomas68@users.noreply.github.com> * Fix doc string format * Update h2integrate/control/control_strategies/heuristic_pyomo_controller.py Co-authored-by: Jared Thomas <jaredthomas68@users.noreply.github.com> * Update h2integrate/control/control_strategies/heuristic_pyomo_controller.py Co-authored-by: Jared Thomas <jaredthomas68@users.noreply.github.com> * Fix ruff formatting --------- Co-authored-by: John Jasa <johnjasa11@gmail.com> Co-authored-by: elenya-grant <116225007+elenya-grant@users.noreply.github.com> Co-authored-by: Jared Thomas <jaredthomas68@users.noreply.github.com> Co-authored-by: kbrunik <102193481+kbrunik@users.noreply.github.com> * Bugfix in Charge/Discharge efficiency handling in `StoragePerformanceModel` (#600) * fixed how charge and discharge rates are applied in generic_storage_pyo model --------- Co-authored-by: John Jasa <johnjasa11@gmail.com> * Tests for non-one battery efficiencies (#610) * add unit tests for openloop storage controller with non-one efficiencies * rearrange usage of pytest.approx so the target comes second and uses approx * update changelog: * Sync Storage Autosizing Model and Pass-Through controller to Align with Pyomo Controllers (#608) * updated the storage autosizing and pass through controller for new control and performance model structure * added subtest for integration with pass through controller * updated to use commodity_set_point instead of input-demand * made set_demand_as_avg_commodity_in a required input parameter * moved passthrough controller to storage subfolder * Added minor changes that got missed in PR 600 --------- Co-authored-by: kbrunik <102193481+kbrunik@users.noreply.github.com> * Sync Demand Open Loop Controller and Simple Generic Storage to Align with Pyomo Controllers (#612) * updated simple_generic_storage to simulate storage performance * updated demand openloop controller so discharge setpoint is correct * PySAM Marine Models (#607) * tidal resource model and performance model * add performance values for testing * test power curve scaling * marine cost model * tidal example * integration test * documentation * update docs * small changes * update for failing tests * fix equation rendering * fix segmentation fault * add test for using default pysam config * address reviewer feedback * fix wind pysam * attempt to modify file path handling for resource data * fix path stuff * Sync PySAM Battery and Generic Storage Pyomo Performance models with open-loop controllers (#613) * refactored pysam battery and storage performance models to be compatible with updated open-loop controllers * updated generic storage pyo to use pass through controller * renamed PassThroughOpenLoopController to SimpleStorageOpenLoopController * removed simple_generic_storage * renamed xx_charge_fraction to xx_soc_fraction --------- Co-authored-by: Genevieve Starke <genevieve.starke@nrel.gov> * minor error msg and doc corrections (#618) * CO2 Model Fixes (#617) * units and connecting variables * fix doc page * catch if annual_input_energy is 0 * remove base class * fix oae test * failing doc test * fix value call * final touchs * Bugfix: Update storage models so can use different control types per storage type (#615) * updated logic in pysam batery and generic storage to handle multiple storage types * added tests and bugfix in heuristic with setting efficiencies --------- Co-authored-by: John Jasa <johnjasa11@gmail.com> * Baseclass for Openloop Storage Control Strategies (#619) * added openloop control storage baseclass * Enable use of Pyomo Controllers in the Storage Autosizing Model (#621) * updated autosizing storage model to be compatible with pyomo controllers * renamed fixures in heuristic controller tests * aggregated heuristic controller tests into one file * added simple test for storage autosizing and heuristic * renamed fixtures in optimized controller tests * aggregated optimized control tests into one file * updated test for heuristic controller with autosizing * updated so simple storage autosizing can run with optimal pyomo control * Generic cost model for converters (#622) * added generic cost model * added tests and updated model * updated example 3 to use new converter model and added to supported models * updated docstrings and input descriptions * updated changelog * added to model overview * Clarified error message --------- Co-authored-by: John Jasa <johnjasa11@gmail.com> * Introducing multivariable commodity streams (#480) * Working out first steps of multivariable streams * Adding to multivariable streams work * expanding multivariable stream definition * Building out more of the gas combiner * Improving example for multivariable streams * Updating examples and merging * Apply suggestions from code review Co-authored-by: genevievestarke <103534902+genevievestarke@users.noreply.github.com> * Many updates based on PR feedback * Updated to mass fractions for multicommodity stream * renamed a few multicommodity variable names * Added helper functions for multivariable stream definitions * Updated names throughout for multivariable streams * Updated docs for multivariable streams * Added commodity stream tests * Addressing PR feedback * Updates based on PR feedback * Updates based on PR feedback --------- Co-authored-by: genevievestarke <103534902+genevievestarke@users.noreply.github.com> Co-authored-by: kbrunik <102193481+kbrunik@users.noreply.github.com> * Removed some shape_by_conn calls due to OM issues (#632) * Removed some shape_by_conn calls due to OM issues * Moved last calls of copy_shape * Fixing test_pipe fail --------- Co-authored-by: jmartin4 <jonathan.martin@nrel.gov> * Move xdsm call in H2IntegrateModel to its own method (#629) * move xdsm creation in H2IModel to a method so user has to call it if desired instead of having it be automatic * update changelog and docs and adjust create_xdsm logic to reflect that it is an optional call * update docs * update docs * update docs for visualization * change xdsm code cell to not execute on build * switch pdf for png * minor comments update in code example * remove xdsm call * Updated XDSM explanation link --------- Co-authored-by: John Jasa <johnjasa11@gmail.com> * Handling Leap Years in OpenMeteo Resource Data (#633) * updated openmeteo resource models to handle leap day * added resource files for leap year * added tests for leap year resource data * added integration w pvwatts test for leap year * Methodized leap day handling for base class for future resource handling --------- Co-authored-by: John Jasa <johnjasa11@gmail.com> * Baseclass for Storage Performance Models (#624) * added draft storage model baseclass * updated draft storage baseclass * added docstring to run_storage method * minor updates to comments in storage_model_baseclass * updated storage performance model to inherit baseclass * fixed storage performance model and storage baseclass * updated storage autosizing model * updated pysam battery to use baseclass and removed battery_baseclass * removed commented out code and simplified some docstrings * removed unnecessary docstrings * updated changelog * PR review: minor personal preferences * updated inline comment --------- Co-authored-by: John Jasa <johnjasa11@gmail.com> * Modified the calc tilt angle function for pysam solar (#646) * Oxygen output from PEM electrolyzer (#642) * added oxygen output from electrolyzer * updated example 14 to calc LCOO --------- Co-authored-by: John Jasa <johnjasa11@gmail.com> * Removed remaining naming dependencies (#654) * Removed remaining naming dependencies * Added to changelog and fixed CI issue * PR feedback * Fixed schema reqs * Update validators to allow zero values for costs for nuclear * Bugfix: Connecting resource to multiple techs (#655) * bugfix and added test for connecting one resource model to multiple techs * updated changelog * Updated test to call setup to trigger connection error --------- Co-authored-by: John Jasa <johnjasa11@gmail.com> * Update urls for NLR pages and github repositories (#658) * Update urls for NLR pages and github repositories * Updated from WISDM to NLRWindSystems org for some repos * Updated and removed more NREL references --------- Co-authored-by: John Jasa <johnjasa11@gmail.com> * Enhancement/windows ci (#590) * update installation instructions * add windows to CI and use conda consistently for Python across OS * merge develop and update changelog * adopt 'extras' flag for analysis extras to correctly use optional CI * update changelog * reorder ci setup * update order * attempt python version restructure * reinstate old python version * update URL * move runs-on back to below strategy * add os to optional matrix * reorganize the conditional for extras * convert lists to yaml bullet lists * skip gis-dependent tests when not installed * update changelog * use optional deps for all tests and add single runner for validating dependency-determined skipped tests * reformatting * reduce sql file access scope to functions to avoid windows errors * downgrade temp_dir to a function scope to avoid windows access errors * move temp examples fixture to be in main conftest, and enable repo-wide access * add module scoped example directory copy * apply module scoped example copy fixture to recorder tests and update * update changelog * update miniconda action usage * use the example copy fixture to isolate sql access in tests for potential windows resolution * reorganize changelog * fix typo in parameter name * update workflow * remove max-parallel * Revert "reorganize changelog" This reverts commit 679a38d. * add shell to all tests * don't allow coverage upload to fail ci * uncomment windows * add garbage collection to help with sql file handling * temporarily only run windows to reduce runner usage * add sleep to see if small timeout resolves issue * only run single test * remove garbage collection * fix typo * remove manual folder removal in favor of pytest cleanup * reinstate normal CI processes * add file removal to avoid OpenMDAO silent failure * temporarily only run single file on single windows runner * fix typo * fix typo * move manual recorder_path deletion * put ci back * handle None case * track model state using IntEnum * add xfail for windows because of OpenMDAO improper SQL file handling for Windows * add todo about removing manual removal * restore accidentally deleted file --------- Co-authored-by: John Jasa <johnjasa11@gmail.com> Co-authored-by: kbrunik <kbrunik@gmail.com> * updated CI workflow to disable windows (#668) * Check for extraneous or mis-categorized input parameters (#647) * added dictionary utilities * bugfix in setup() and added start of a test * added fix to calling check_inputs * fixed check_inputs * added another check in check_inputs * updated error messages in check_inputs and fixed example 1 * Added tests * added another subtest to test_check_inputs * fixed tech configs for examples * added some inline comments * check for requisite models and return if none * perform check from note and collapse checking logic * collapse user input regeneration to reduce number of loops * remove nested looping approach * move assert to proper context manager level * add indent level back * fix min combinations logic for passing tests * flatten improperly shared parameterization checking logic * update test to include multiple categories for improperly shared * fix typo * update docstring * added handling for combined cost and performance models * Added tech config fpath to the error messages for parameter checking * changlog * changed strict to True for six converter models * reverted strict setting for electrolyzer --------- Co-authored-by: John Jasa <johnjasa11@gmail.com> Co-authored-by: Hammond, Rob <13874373+RHammond2@users.noreply.github.com> Co-authored-by: kbrunik <kbrunik@gmail.com> * Update Naming Convention in Open-Loop Converter Control Strategies (#631) * renamed outputs in converter openloop controllers * updated tests and examples with updated naming * added performance model outputs to the converter control strategies * moved converter control strategies to demand folder * removed commodity_set_point as output * renamed demand component to be performance model instead of control strategy * moved output calculations to shared method in baseclass --------- Co-authored-by: kbrunik <102193481+kbrunik@users.noreply.github.com> Co-authored-by: John Jasa <johnjasa11@gmail.com> * modified state check for setup and run (#669) * Add interactive class hierarchy visualization to docs (#643) * Added class hierarchy diagram * merging * Updated the PR template * Changed class hierarchy embedding * moved class hierachy * Breaking the sphinx narrow rule * Combined colors based on feedback * Updated colors based on Gen's feedback * Shifted diagram location right * Reformatting embedding the class viz structure * Updated dev pyproject for viz tool --------- Co-authored-by: kbrunik <102193481+kbrunik@users.noreply.github.com> * Standardize Feedstock Outputs (follow-on to 463) (#523) * added capacity and price as inputs to feedstock component * updated feedstock mdoel to have standard outputs * added commodity_amount_units to FeedstockCostConfig * added standard output to feedstock cost model and connected commodity_out between performance and cost model * renamed config inputs for feedstocks * updated ex 23 which is untested and cleaned up feedstocks.py * minor docstring updates and added comments * added in notes of questions for reviewers to feedstocks.py * updated MMBtu units to MMBtu/h * fixed iron and steel tests * made changes to feedstock * fixed tests * removed unused comment * removed shape from price input * added integration test for feedstock integrated with finance model * updated feedstocks.md * changed based on reviewer feedback * added subtests to test_feedstocks * small changes to feedstock doc * docs --------- Co-authored-by: John Jasa <johnjasa11@gmail.com> Co-authored-by: kbrunik <kbrunik@gmail.com> Co-authored-by: kbrunik <102193481+kbrunik@users.noreply.github.com> * Framework to allow for variable dt (#653) * add draft for variable timestep framework * Changed error wording * switch bounds to tuple * minor test correction * include time-series generation functions * add tests for variable dt and update simulation length check for non-hourly dt * update docs * update changelog * update docs and doc strings * restore develop version of utilities.py * update dt bounds error * Apply suggestions from code review Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Fixing tests * Adding time step bounds to all models * Adding time step bounds to the combiner/splitter/transporters * Updates for tests * Adding time step bounds to the custom paper mill performance model * Added time step bounds to paper mill cost --------- Co-authored-by: John Jasa <johnjasa11@gmail.com> Co-authored-by: kbrunik <102193481+kbrunik@users.noreply.github.com> Co-authored-by: John Jasa <john.jasa@nrel.gov> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * patch: Variable dt (#671) * update dt bounds error to require `_time_step_bounds` * Apply suggestions from code review Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Add time step bounds to all tech models * Apply time step bounds check to feedstocks, transporters, and combiners --------- Co-authored-by: John Jasa <johnjasa11@gmail.com> Co-authored-by: kbrunik <102193481+kbrunik@users.noreply.github.com> Co-authored-by: John Jasa <john.jasa@nrel.gov> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Remove system-level outputs from storage and replace with demand component (follow-on to 631) (#666) * removed system level calcs from storage and updated most tests * updated examples with storage but dont use storage as a commodity_stream in finances * updated examples with storage defined as a commodity_stream for a finance subgroup * added time_step_bounds to demand components * added test for example 23 * added example for different demand between storage and demand component * added demo for the demand components using example 13 * made it so demand is only input to battery performance model if using feedback control * added standard_capacity_factor as output from storage * added doc page for storage performance models --------- Co-authored-by: kbrunik <102193481+kbrunik@users.noreply.github.com> Co-authored-by: John Jasa <johnjasa11@gmail.com> Co-authored-by: kbrunik <kbrunik@gmail.com> * Updating the readme and intro doc page ahead of v0.8 release (#677) * Updating the readme * Updated intro.md and changelog * Minor readme updates * Addressing Kaitlin's comments * Added more lingo to readme * Addressing PR suggestions --------- Co-authored-by: kbrunik <102193481+kbrunik@users.noreply.github.com> * Move storage controllers into `storage` folder in `control_strategies` (#678) * moved controllers to storage folder * renamed pyomo controllers to include storage in the control name * moved control strategy tests * moved tests to the right folder * moved pyomo baseclass and controller_opt_problem_state to top-level control_strategies * updated import statements * renamed pyomo baseclass file * updated import for pyomo storage baseclass * made storage chapter in docs * removed backslashes from eqn since they dont render properly on readthedocs * Making changes per Gen's suggestion (#681) * Bump version from 0.7.2 to 0.8.0 --------- Co-authored-by: kbrunik <102193481+kbrunik@users.noreply.github.com> Co-authored-by: elenya-grant <116225007+elenya-grant@users.noreply.github.com> Co-authored-by: Rob Hammond <13874373+RHammond2@users.noreply.github.com> Co-authored-by: genevievestarke <103534902+genevievestarke@users.noreply.github.com> Co-authored-by: Jared Thomas <jaredthomas68@gmail.com> Co-authored-by: bayc <christopher.j.bay@gmail.com> Co-authored-by: Jared Thomas <jaredthomas68@users.noreply.github.com> Co-authored-by: Jonathan Martin <94018654+jmartin4u@users.noreply.github.com> Co-authored-by: jmartin4 <jonathan.martin@nrel.gov> Co-authored-by: Jonathan Martin <94018654+jmartin4nrel@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Chris Bay <12664940+bayc@users.noreply.github.com> Co-authored-by: Genevieve Starke <genevieve.starke@nrel.gov> Co-authored-by: kbrunik <kbrunik@gmail.com>
Sync PySAM Battery and Generic Storage Pyomo Performance models with open-loop controllers
The PR updates the two storage performance models (PySAM battery and the
StoragePerformanceModel) that were previously only used with Pyomo Controllers to be compatible with the open-loop controllers.This PR also has a MAJOR bugfix. The tests in
h2integrate/control/test/test_optimal_controller_with_generic_storage.pyandh2integrate/control/test/test_heuristic_with_generic_storage.pywere not actually running the generic storage model with the Pyomo Controllers, it was running the generic storage model without a controller because the pathnames were not correct (long story). Anyway - once the pathnames were corrected, there were issues with pyomo units being in kg/h instead of kW, so we had to make some changes to the pyomo rule classes so that they were compatible with units other than kW. Now - these tests are running as expected and the pyomo controllers can actually be run with the generic storage model for a non-electricity commodity.Note: it appears that a lot of files changed but this is due to some renaming that was done! The files that should be focused on in a review are:
h2integrate/storage/generic_storage_pyo.pyh2integrate/storage/battery/pysam_battery.pypyomo_setupmethod ofh2integrate/control/control_strategies/heuristic_pyomo_controller.pypyomo_setupmethod ofh2integrate/control/control_strategies/optimized_pyomo_controller.pyh2integrate/control/control_strategies/storage/demand_openloop_storage_controller.pyMain changes:
PassThroughOpenLoopControllertoSimpleStorageOpenLoopControllermax_charge_fractiontomax_soc_fraction, renamedmin_charge_fractiontomin_soc_fraction, and renamedinit_charge_fractiontoinit_soc_fraction.SimpleGenericStorageperformance model, this usage of this has been replaced with theStoragePerformanceModeldemand_profileas a config input to the storage performance models so that the commodity_demand is initialized insetup()with the same value as the controllers.StoragePerformanceModelthat don't use a controller were updated to use the pass-through controller (which has the previous logic that was used without a controller)Follow-on PRs will:
h2integrate/storage/battery/battery_baseclass.pyfile to be removedh2integrate/control/test/test_heuristic_controllers.pyandh2integrate/control/test/test_heuristic_with_generic_storage.pyh2integrate/control/test/test_optimal_controllers.pyandh2integrate/control/test/test_optimal_controller_with_generic_storage.pySection 1: Type of Contribution
Section 2: Draft PR Checklist
TODO:
SimpleGenericStorageperformance model, this usage of this can be replaced with theStoragePerformanceModel(requires 612 to be merged)StoragePerformanceModelwith the demand open-loop controller (requires 612 to be merged)StoragePerformanceModelintegrated with the pass-through controller (requires 608 to be merged)charge_equals_dischargetocharge_rate_equals_discharge_rateor something similar (optional, possibly as a future PR)h2integrate/storage/generic_storage_pyo.pytoh2integrate/storage/storage_performance_model.pyType 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
This is a step in Issue #564
Section 4: Impacted Areas of the Software
Section 4.1: New Files
h2integrate/control/test/test_openloop_storage_integration.py: basic integration tests of all three storage performance models with each of the open-loop storage control strategiesSection 4.2: Modified Files
PySAMBatteryPerformanceModelinh2integrate/storage/battery/pysam_battery.pysetup(): added input forelectricity_set_pointiftech_to_dispatch_connectionsis not in the plant configcompute(): added use of the inputelectricity_set_pointifpyomo_dispatch_solveris not in the discrete inputs instead of usingpseudo_commandcalc.simulate(): updated to initialize output arrays based on a the length ofstorage_dispatch_commandsinstead ofself.config.n_control_windowStoragePerformanceModelinh2integrate/storage/generic_storage_pyo.pysetup(): added input forcommodity_set_pointiftech_to_dispatch_connectionsis not in the plant configcompute(): added use of the inputcommodity_set_pointifpyomo_dispatch_solveris not in the discrete inputs instead of usingpseudo_commandcalc.simulate(): updated to initialize output arrays based on a the length ofstorage_dispatch_commandsinstead ofself.config.n_control_windowh2integrate/control/control_strategies/heuristic_pyomo_controller.py: updated thepyomo_dispatch_solverfunction (inHeuristicLoadFollowingController.pyomo_setup()) to only returnstorage_commodity_outandsoch2integrate/control/control_strategies/optimized_pyomo_controller.py: updated thepyomo_dispatch_solverfunction (inOptimizedDispatchController.pyomo_setup()) to only returnstorage_commodity_outandsoch2integrate/storage/test/test_generic_storage_pyo.py: added usage ofPassThroughOpenLoopControllerforhydrogen_set_pointcalculationh2integrate/storage/battery/test/test_pysam_battery.py: added IVC forelectricity_set_pointSection 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