Conversation
elenya-grant
left a comment
There was a problem hiding this comment.
This is looking good! I added a few suggestions and noted a possible edge-case that may result in an error. But - I think this is really clean and is looking awesome!
| filename = self.config.filename | ||
|
|
||
| # Check if the file exists | ||
| if not Path(filename).is_file(): |
There was a problem hiding this comment.
A couple thoughts on the filename/loading file.
I think that the function check_resource_dir could be useful, this would be best if resource_dir was an optional config input. If you look at the get_data() method in ResourceBaseAPIModel, you'll see the logic there for finding/loading files.
from h2integrate.resource.utilities.file_tools import check_resource_dir
resource_dir = Path(self.config.filename).parent
resource_dir = check_resource_dir(resource_dir=Path(self.config.resource_dir))And/or, I think that the find_file function in file_utils.py may be useful here :)
There was a problem hiding this comment.
I've attempted to add this in but seem to have some file path stuff. so maybe find_file is the way to go?
There was a problem hiding this comment.
Fixed (assuming the tests pass!)
There was a problem hiding this comment.
maybe we could put this in resource_files/tidal/?
There was a problem hiding this comment.
done! I might need a bit of help to make sure I can still use it in the example correctly (filepath stuff...)
| ) | ||
| site_config = self.options["plant_config"]["site"] | ||
|
|
||
| self.add_input("latitude", site_config.get("latitude", 0.0), units="deg") |
There was a problem hiding this comment.
it doesn't seem like latitude and longitude are used as inputs, right? But maybe this has to be here since the site's lat/lon are connected to resource models?
There was a problem hiding this comment.
Looks like they can't be removed because of h2integrate_model and how the site is promoted
| dic = {} | ||
|
|
||
| # Extract outputs | ||
| dic["tidal_velocity"] = data_df["tidal_velocity"] |
There was a problem hiding this comment.
why extract the outputs if they're not needed? I think the logic towards the end here could be simplified to:
if len(hours) < 8760:
... # code that makes/modifies data_df
data_df = data_df.reset_index()
outputs["tidal_velocity"] = data_df["tidal_velocity"]
return
if len(hours) == 8760:
outputs["tidal_velocity"] = tidalfile_model.Outputs.tidal_velocity
return
raise ValueError("Resource time-series cannot be subhourly.")There was a problem hiding this comment.
I was lazy and it was hold over from how HOPP needed the data, thanks for calling me on it and writing simpler code :)
elenya-grant
left a comment
There was a problem hiding this comment.
Thanks for making those changes! Looks good!
* 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>
PySAM Marine Models
In this PR I add:
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
#611 created a new issue for getting the cost year correctly updated.
Section 4: Impacted Areas of the Software
Section 4.1: New Files
docstidal_resource.md: Added doc page about what the tidal resource is (essentially a file reader and interpolator).marine_hydrokinetic.md: An overview page for all the MHK models including hydro, tidal, and mhk costs.tidal.md: Describes PySAM tidal model, how to usepysam_optionsand the power curve refit calculation.examples/31_tidal/Tidal_resource_timeseries.csv: Example tidal resource timeseries. Used in example and tests.`h2integrate/converters/water_power/tidal_pysam.py
PySAMTidalPerformanceConfig: Required inputs from the user for tidal performance modeling.__attrs_post_init__checkspysam_optionsand sets the input dictionary for instantiating the PySAM tidal module.PySAMTidalPerformanceModel: Typical H2I formatinitialize,setup,compute. In thesetupit creates theMhkTidalPySAM model.recalculate_power_curve(): Method to resample an existing power curve based on an updated device rating.`h2integrate/converters/water_power/pysam_marine_cost.py
PySAMMarineCostConfig: Required inputs from the user for MHK cost modeling.__attrs_post_init__checkspysam_optionsand sets the input dictionary for instantiating the PySAM MhkCosts module. The default behavior is to use the internal cost models for all components. A user can set their own costs via thepysam_optionsdictionary. One issue is it's unclear the cost year for the model and there is an issue about it Update cost year for MHKCosts #611.PySAMMarineCostModel: Typical H2I formatinitialize,setup,compute. In thesetupit creates theMhkCostsPySAM model. OutputsCapExandOpEx, it does not have an output ofVarOpEx.h2integrate/converters/water_power/test/test_marine_pysam_cost.py: Tests capex and opex values from all reference models available in the model.test_tidal_pysam.py: Subtests for outputs, test actual values, test therecalculate_power_curveis working correctly, test instantiating from a Default.Section 4.2: Modified Files
docsrun_of_river.md: Added reference to call inmarine_hydrokinetic.mddoc page_toc.md: updated with new files.resource_index.md: Added tidal to the overview.examples/test/test_all_examples.pytest_tidal_example: Integration test for tidal. Tests AEP, Capex, Opex, LCOE.supported_models.pySection 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