Skip to content

Update ProFAST finance models to use utilization instead of capacity (1 of 3) #485

@elenya-grant

Description

@elenya-grant

This issue is intended to capture a follow-on PR to PR #463

Currently, the ProFAST finances models represent the annual commodity production by setting the 'capacity' parameter based on the actual commodity production and the long term utilization as 1. For models that account for variable commodity production over the lifetime (like the electrolyzer model), this is not accurately represented in the finance results. This can only be represented in the finance results by setting the long term utilization to the capacity factor of the tech and setting the capacity as the actual tech's rated production capacity.

Timeline for this: 3-10 days after PR #463 is merged.

Note: May result in changed test values depending on whether the electrolyzer model outputs the life average capacity factor vs the capacity factor per year of the plant life (see PR #491)

Benefits of this development:

  • Allow for lifetime performance to be reflected in financials
  • Reduction in amount of hard-coded tech-specific and/or commodity-specific logic in H2IntegrateModel
  • Lays the groundwork to potentially fully remove hard-coded tech-specific and/or commodity-specific logic in H2IntegrateModel. This would also allow for more consistent logic when commodity streams are not defined and not rely on the use of summer components.
  • Removal of tech-specific hard-coded logic in the finance models (all technologies in the finance subgroup would pass the replacement schedule to the finance model)
  • Allows more flexibility in what commodities and/or commodity streams may be connected to the finance models

Background

Currently, the only enforced naming convention in H2I is the use of "commodity_in" and "commodity_out" for models. The commodity_out stream is connected to a summer model, which sums the timeseries profile over the length of the simulation. The outputs of these summers are only accurate if a simulation is one year and has an hourly timestep. The output of the summer is connected to the finance models as total_commodity_produced, which sets the following values ProFAST:

capacity = inputs[f"total_{self.options['commodity_type']}_produced"][0] / 365.0
profast_params["capacity"] = capacity
profast_params["long term utilization"] = 1 

The capacity parameter cannot be set as an array to account for varying production over the lifetime of the plant. The long term utilization parameter (equivalent to capacity factor) can account for varying production over the lifetime of the plant. To allow for accurate accounting of annual variation of commodity production that some technology models are capable of estimating, we would have to move towards a framework where the ProFAST parameters are set as:

# create years of operation list
years_of_operation = create_years_of_operation(
            self.params.plant_life,
            self.params.analysis_start_year,
            self.params.installation_time,
        )
# below would assume hourly timestep
capacity = inputs[f"rated_{self.options['commodity_type']}_production"][0] * 24 # has to be in commodity/day
utilization = inputs[f"self.options['commodity_type']_capacity_factor"] # this is an array equal to the plant life
profast_params["capacity"] = capacity
profast_params["long term utilization"] = dict(zip(years_of_operation, utilization))

Sub tasks:

The steps to do this are:

  • [/] update the storage models to have standardized outputs (PR Standardized Performance Outputs: Generic Storage & Control #493)
  • [/] update combiner model to have standardized outputs (PR Standard Combiner Outputs (follow-on to 463) #501)
  • update splitter model to have standardized outputs (unsure if necessary, I don't think we have a way of handling a finance stream output from a splitter but I may be wrong)
  • update feedstock model to have standardized outputs
  • remove "ElectricitySumComp" and replace with "GenericSummerPerformanceModel" (perhaps)
  • remove use of summer components (perhaps)
  • move tech-specific hard-coded logic in connect_technologies() when connecting technology streams to the finance model to create_finance_model() and format as defining the commodity stream if its not specified
  • update finance model to use utilization and rated commodity production from the commodity stream, will require updates to finance models and H2IntegrateModel. This depends on most of the previous steps to be complete.

Optional steps but perhaps may be necessary:

  • create a finance model baseclass, update tech-specific finance models as needed
  • make a generic transport model (and/or update the pipe model) that has to be defined in the tech config, this would allow for more commodities to be introduced for transport
  • more often enforce use of commodity_stream in finance subgroups
  • add a generic subtractor to account for possible differences with use of storage components as commodity streams.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions