Skip to content

Thermodynamic NGCT model - #805

Draft
cfrontin wants to merge 10 commits into
NatLabRockies:developfrom
cfrontin:feature/thermodynamic_NGCT_model
Draft

Thermodynamic NGCT model#805
cfrontin wants to merge 10 commits into
NatLabRockies:developfrom
cfrontin:feature/thermodynamic_NGCT_model

Conversation

@cfrontin

@cfrontin cfrontin commented Jul 20, 2026

Copy link
Copy Markdown
Collaborator

Thermodynamic models for NGCT (w/ support for future combustion_machines)

The performance of combustion machines, including both combustion turbines, combined cycle turbines, and reciprocating internal combustion engines, has significant dependence on ambient conditions (real time and design-specified).

These models use standard thermodynamic cycles to increase the fidelity of ICE combustion systems in H2I. These are critical for understanding complementarity of renewables and fuel combustion systems in hybrid energy generation, where ambient conditions determine the performance of nominally firm power sources as well as renewables, often in mutually complimentary ways.

Demonstration of code addendum showing diurnal and seasonal performance cycles as a function of ambient pressure and temperature.

Section 1: Type of Contribution

  • Feature Enhancement
    • Framework
    • New Model
    • Updated Model
    • Tools/Utilities
    • Other (please describe):
  • Bug Fix
  • Documentation Update
  • CI Changes
  • Other (please describe):

Section 2: Draft PR Checklist

  • Open draft PR
  • Describe the feature that will be added
  • Fill out TODO list steps
  • Describe requested feedback from reviewers on draft PR
  • Complete Section 7: New Model Checklist (if applicable)

TODO:

  • remove debug runner script
  • add upgraded cost model w/ fuel-consumption driven costs
  • develop example case(s)

Type of Reviewer Feedback Requested (on Draft PR)

Structural feedback:

Implementation feedback:

Other feedback:

Section 3: General PR Checklist

  • PR description thoroughly describes the new feature, bug fix, etc.
  • Added tests for new functionality or bug fixes
  • Tests pass (If not, and this is expected, please elaborate in the Section 6: Test Results)
  • Documentation
    • Docstrings are up-to-date
    • Related docs/ files are up-to-date, or added when necessary
    • Documentation has been rebuilt successfully
    • Examples have been updated (if applicable)
  • CHANGELOG.md
    • At least one complete sentence has been provided to describe the changes made in this PR
    • After the above, a hyperlink has been provided to the PR using the following format:
      "A complete thought. [PR XYZ]((https://github.com/NatLabRockies/H2Integrate/pull/XYZ)", where
      XYZ should be replaced with the actual number.

Section 4: Related Issues

Section 5: Impacted Areas of the Software

Section 5.1: New Files

  • h2integrate/converters/combustion_machines/__init__.py
    • allow import
  • h2integrate/converters/combustion_machines/NGCT_thermo_model.py
    • isolate thermodynamic modeling for independent testing w.r.t. H2I wrapper
  • h2integrate/converters/combustion_machines/test_NGCT_thermo_model.py
    • isolated testing for purely single-system thermodynamic modeling
  • h2integrate/converters/combustion_machines/turbine_simple_cycle.py
    • the H2I wrapper for the NGCT model

Section 5.2: Modified Files

  • h2integrate/core/supported_models.py
    • added new converter performance & cost model

Section 6: Additional Supporting Information

Section 7: Test Results, if applicable

Section 8 (Optional): New Model Checklist

  • Model Structure:
    • Follows established naming conventions outlined in docs/developer_guide/coding_guidelines.md
    • Used attrs class to define the Config to load in attributes for the model
      • If applicable: inherit from BaseConfig or CostModelBaseConfig
    • Added: initialize() method, setup() method, compute() method
      • If applicable: inherit from CostModelBaseClass
  • Integration: Model has been properly integrated into H2Integrate
    • Added to supported_models.py
    • If a new commodity_type is added, update create_financial_model in h2integrate_model.py
  • Tests: Unit tests have been added for the new model
    • Pytest-style unit tests
    • Unit tests are in a "test" folder within the folder a new model was added to
    • If applicable add integration tests
  • Example: If applicable, a working example demonstrating the new model has been created
    • Input file comments
    • Run file comments
    • Example has been tested and runs successfully in test_all_examples.py
  • Documentation:
    • Write docstrings using the Google style
    • Model added to the main models list in docs/user_guide/model_overview.md
      • Model documentation page added to the appropriate docs/ section
      • <model_name>.md is added to the _toc.yml
    • Run generate_class_hierarchy.py to update the class hierarchy diagram in docs/developer_guide/class_structure.md

@cfrontin cfrontin changed the title Feature/thermodynamic ngct model Thermodynamic NGCT model Jul 20, 2026
@jaredthomas68
jaredthomas68 self-requested a review July 20, 2026 20:43
Comment thread pyproject.toml

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've added both the optional dependency as well as the mainline dependency here; one should be removed, at the discretion of the H2I devs. I actually thought at first (said this to @johnjasa) that pyfluids was already in the dependency chain, but I was apparently incorrect in that understanding.

Comment thread pyproject.toml
Comment on lines 120 to 121
extras = ["h2integrate[gis,ard]"]
all = ["h2integrate[develop,extras,examples]"]

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
extras = ["h2integrate[gis,ard]"]
all = ["h2integrate[develop,extras,examples]"]
extras = ["h2integrate[gis,ard,thermo]"]
all = ["h2integrate[develop,extras,examples]"]

@kbrunik kbrunik left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@cfrontin this is super exciting stuff, I like the linking of resource data to other models that have been rather simplistically modeled up to this point. I left a few comments and thoughts, but overall, it's really great

state_outlet,
mass_flow_fluid=1.0, # by default unity, returns unit-mass kJ/kg
):
# heat transfer to a system should be positive

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should there be a user warning or error message if this isn't true?

return state_outlet


class ThermodynamicCycleResult:

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

could you add a docstring to this?



@define(kw_only=True)
class SimpleCycleTurbinePerformanceConfig(BaseConfig):

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It seems useful to add design_conditions as an input to the config to be able to use all of the functionality of the NGCT model

return float(np.min(mass_flowrate_candidates))


class GE_7FA05_NGCT(NGCT):

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd be inclined to see the GE_7FA05_NGCT and GE_7EA_NGCT_2014 classes be converted to yaml files for easy inclusion when running the SimpleCycleTurbinePerformanceModel. It seems right now their functionality is limited to this particular file and not as something that would be able to be used within the larger H2I system.

) # (min, max) time step lengths (in seconds) compatible with this model
_control_classifier = "dispatchable"

def initialize(self, fuel_source="natural_gas"):

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a reason to initialize the fuel_source here vs using the typical feedstocks? Is this to limit the fuel source type?

m * q for m, q in zip(mass_flowrates, unit_mass_net_heat_input_vec)
] # kJ/s

# import matplotlib.pyplot as plt

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You could functionalize this and add a show_plots attribute to the base config for folks to be able to see these outputs if they want.

Q_fluid_max=1.0, # (explicitly) unit-mass analysis
)

# try to run NGCT cycle here expensively, and all compute variations

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there that big of a computational advantage precomputing this in the setup method versus using the given temperature and pressure data based on the solar resource in the actual compute method? It seems slightly redundant but maybe I'm missing something?

for T, P in wx_data
]
self.fundamental_cycle = self.ngct.run_turbine_model(self.ambient_fluid_list)
# print("DEBUG!!!!! RE-COMPUTING UNIT-MASS CYCLE B/C AMBIENT FLUID STATES CHANGED")

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can we remove these print statements but keep the comment of what's happening in the if statement?

)


if __name__ == "__main__":

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd love to see this as a test and remove everything after if __name__ == "__main__": in this file

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants