h2integrate.control.control_strategies.converters.flexible_demand_openloop_controller#

Classes

FlexibleDemandOpenLoopConverterController(...)

Open-loop controller for flexible demand with ramping and utilization constraints.

FlexibleDemandOpenLoopConverterControllerConfig(*, ...)

Configuration for defining a flexible demand open-loop controller.

class h2integrate.control.control_strategies.converters.flexible_demand_openloop_controller.FlexibleDemandOpenLoopConverterControllerConfig(*, commodity_units, commodity_name, demand_profile, rated_demand, turndown_ratio, ramp_down_rate_fraction, ramp_up_rate_fraction, min_utilization)#

Configuration for defining a flexible demand open-loop controller.

Extends DemandOpenLoopControlBaseConfig with additional parameters required for dynamically adjusting demand based on turndown, ramping, and minimum utilization constraints. These parameters are expressed as fractions of maximum_demand and must lie within (0, 1).

Parameters:
  • commodity_units (str)

  • commodity_name (str)

  • demand_profile (int | float | list)

  • rated_demand (float)

  • turndown_ratio (float)

  • ramp_down_rate_fraction (float)

  • ramp_up_rate_fraction (float)

  • min_utilization (float)

rated_demand#

maximum demand in the same units as commodity_units, used to convert the constraint parameters from fractions to units of commodity_units.

Type:

float

turndown_ratio#

Minimum allowable operating demand expressed as a fraction of the maximum demand. Must be in the range (0, 1).

Type:

float

ramp_down_rate_fraction#

Maximum allowable ramp-down rate per timestep, expressed as a fraction of maximum demand. Must be in (0, 1).

Type:

float

ramp_up_rate_fraction#

Maximum allowable ramp-up rate per timestep, expressed as a fraction of maximum demand. Must be in (0, 1).

Type:

float

min_utilization#

Minimum total fraction of demand that must be met over the entire simulation. Must be in (0, 1). Utilization is defined as:

sum({commodity}_flexible_demand_profile)/sum({commodity}_demand)

Type:

float

rated_demand: float#
turndown_ratio: float#
ramp_down_rate_fraction: float#
ramp_up_rate_fraction: float#
min_utilization: float#
class h2integrate.control.control_strategies.converters.flexible_demand_openloop_controller.FlexibleDemandOpenLoopConverterController(**kwargs)#

Open-loop controller for flexible demand with ramping and utilization constraints.

This controller extends the base demand controller by allowing the effective demand to vary dynamically based on turndown constraints, ramp-rate limits, and minimum-utilization requirements. A flexible demand profile is generated and used to compute unmet demand, unused commodity, and delivered output.

setup()#

Set up component inputs and outputs for flexible demand control.

Adds inputs for turndown ratio, ramp up/down rates, and minimum utilization, all expressed as fractions of maximum demand. Adds the flexible demand output profile, which will be populated in compute.

adjust_demand_for_ramping(pre_demand_met_clipped, demand_bounds, ramp_rate_bounds)#

Apply ramp-rate limits to a demand profile.

Enforces maximum up-ramp and down-ramp rates across timesteps to ensure that the demand does not change faster than allowed.

Parameters:
  • pre_demand_met_clipped (np.ndarray) -- Demand profile after applying minimum and maximum demand limits.

  • demand_bounds (tuple[float, float]) -- (min_demand, rated_demand) bounds.

  • ramp_rate_bounds (tuple[float, float]) -- (ramp_down_rate, ramp_up_rate) in commodity units per timestep.

Returns:

np.ndarray -- Ramped and bounded demand profile.

adjust_remaining_demand_for_min_utilization_by_threshold(flexible_demand_profile, min_total_demand, demand_bounds, demand_threshold)#

Increase demand in periods of low <commodity>_in to meet minimum utilization.

Adds additional demand to timesteps whose flexible demand is at or below a selected threshold, distributing the required adjustment evenly.

Parameters:
  • flexible_demand_profile (np.ndarray) -- Current flexible demand profile.

  • min_total_demand (float) -- Required minimum total integrated demand.

  • demand_bounds (tuple[float, float]) -- (min_demand, rated_demand) limits.

  • demand_threshold (float) -- Threshold below which demand should be increased.

Returns:

np.ndarray -- Demand profile after applying minimum utilization adjustments.

make_flexible_demand(maximum_demand_profile, pre_demand_met, inputs)#

Generate a flexible demand profile satisfying all constraints.

Applies constraints in the following order: 1. Turndown ratio 2. Ramp-rate limits 3. Minimum-utilization requirement (iteratively increased)

Parameters:
  • maximum_demand_profile (np.ndarray) -- Maximum allowable demand at each timestep.

  • pre_demand_met (np.ndarray) -- Initial demand that can be met with the available input.

  • inputs (dict) -- Input values containing ramp rates, turndown ratio, and minimum utilization as fractions of maximum demand.

Returns:

np.ndarray -- Final flexible demand profile that satisfies all operational constraints.

compute(inputs, outputs)#

Compute unmet demand, unused commodity, and output under flexible demand.

If min_utilization == 1.0, the behavior matches the regular open-loop controller with no flexible demand adjustments.

Otherwise:
  • Construct a flexible demand profile.

  • Use it to compute unmet demand and unused commodity.

  • Output is supply minus unused commodity.

Parameters:
  • inputs (dict-like) -- Mapping of model inputs, including {commodity}_demand, {commodity}_in, and flexible-demand parameters.

  • outputs (dict-like) -- Mapping where computed outputs are written.