quintel / merit Goto Github PK
View Code? Open in Web Editor NEWA system for calculating hourly electricity and heat loads with a merit order
License: MIT License
A system for calculating hourly electricity and heat loads with a merit order
License: MIT License
Example:
CSVWriter.new(merit_order.load_curves).write!("output.csv")
NoMethodError: undefined method `values' for <Merit::LoadCurve: 8760 values>:Merit::LoadCurve
from /Users/kruip/Projects/merit/lib/merit/order.rb:142:in `block in load_curves'
first, set all electricity generation to zero.
in a scenario with _only_ 15,000 # of offshore wind turbines (Wind production is higher than electricity demand ), switching merit order on/off makes figures in the dashboard change.
In particular, CO2, energy imports, cost and renewables change slightly. However, electricity cost are not affected.
NOTE: effective_output_capacity is noted
in MW electric/plant according to documentation....
Compare this to e.g. nuclear:
availability is about the same.
So: We have ~5000 times as much agriculural chp power than Nuclear?
including @AlexanderWirtz
Make a 'clean' scenario that shows a residual load curve that is not 'messed up' by wind curves. Compare the FLH of the module with the ETM.
From #19
no more discussion needed, but it needs to be noted somewhere that and why it happens.
This happens because the area under the profiles needs to be scaled to the total produced electricity but the shape of the profiles does not always include all information.
For example, the profiles for wind may not describe every gush of wind that has been converted into electricity and therefore 'misses' features, i.e., it has a trough where it should have a peak. This is inevitable as we do not have measurement of every location in the Netherlands where a turbine is situated and we do not know the exact relation between the wind speeds (measured) and the production of a turbine.
This means that to reproduce the total production, the profile has to be scaled vertically (to make up for the lost peaks) and peaks in the load may become unphysically high. This is not a fundamental problem, as the curve is only indicative of the variability of the technology, but it might confuse the user.
When determining how much capacity is needed to meet demand (Load), the price setting plant will only turn out to use a fraction of its maximum capacity. This fraction is called load_fraction
and cannot be lower than some number.
This minimum_load_fraction
has to be researched per plant type. Chris Laumans probably knows them already.
The calculation should eventually make sure that a plant is not used less than its minimum_load_fraction
and that the next plant in the merit order should be tried, etc, etc until a fit is found.
N.B. it is theoretically possible that no fit would be found. In that case, what do we do?
Curves for demand, wind and solar are available for 2009, 2010 and 2011 in the DropBox folder:
/Dropbox/Merit order/Part Two (EnergieNederland)/Data/Curves
Now it reads, but should be more concrete on how to get this info out of the ETengine. (what query?)
The marginal_costs (EUR/MWh/year) are calculated by dividing the variable costs
(EUR/plant/year) of the participant by one plant's annual electricity
production (in MWh/plant). The marginal costs can be queried from the
ETEngine's GQL with the following query:
V(converter_key, variable_costs_per(:mwh_electricity))
See issue #25: this parameter is needed to calculate operational_expenses
(i.e. OPEX).
I have already added definition of OPEX in readme, but not updated all the lists of inputs etc.
Unit EUR/plant/year
According to the stub, the effective_output_capacity of a wind turbine (inland) is 1080 MW.
We discussed that the effective_output_capacity is the max load a producer can produce at any point in time...
...But when we look at the load_curve
, derived from the load_profile
, we see that the max load of this thing is 1266.34 MW, which is significantly higher.
@s.participant(:energy_power_wind_turbine_inland).load_curve.draw
-----------------------------------------------------------------o------ 9.66e+02
-----------------------------------------------------------------o------ 4.83e+02
-----------------------------------------------------------------o------ 3.22e+02
----------------o----------------------------------------------ooo------ 2.42e+02
----------------o----------------------------------------------ooo------ 1.93e+02
----------------o----------------------------------------------ooo------ 1.61e+02
---o---------o--o-------------------------------o--------------ooo------ 1.38e+02
---o---------o--o-------------------------------o--------------ooo------ 1.21e+02
---oo-o------o--o--------o----------------------o--------------ooo-----o 1.07e+02
--ooo-o-----oo--o-------ooo----------o-o--------o-----o--------ooo-----o 9.66e+01
--ooo-o-----oo--o-------ooo----------o-o-------oo-----o-------oooo-o---o 8.78e+01
--ooo-o----ooo--o-------ooo--o-------o-o-------oo-o---o-----o-oooo-o--oo 8.05e+01
--ooo-o----ooo--o-------ooo--o---oo--o-oo------oo-oo--oo-oo-oooooo-oo-oo 7.43e+01
o-ooo-o-ooooooo-o-oo-o--oooooooo-oo--ooooo---o-ooooo--ooooooooooooooo-oo 6.90e+01
o-ooo-oooooooooooooo-ooooooooooo-oo-oooooo--ooooooooo-oooooooooooooooooo 6.44e+01
o-ooooooooooooooooooooooooooooooooo-oooooooooooooooooooooooooooooooooooo 6.04e+01
=> nil
[8] pry(main)> @s.participant(:energy_power_wind_turbine_inland).load_curve.values.max
=> 1266.34104
Including @AlexanderWirtz.
In order to compare the outcome of the MO calculation with the current implementation of the MO in the ETM, a complete list of participants has to be used in the Rspec tests.
A sanity check would be nice...
> @s.calculate
=> true
> @s.producers.map{ |p| "#{p.key} #{(p.production / p.max_production)}" }
=> ["energy_power_solar_pv_solar_radiation NaN",
"energy_power_solar_csp_solar_radiation NaN",
"energy_power_wind_turbine_inland 0.9999996754680114",
"energy_power_wind_turbine_coastal 1.000001058912001",
"energy_power_wind_turbine_offshore 0.9999998874719702",
"buildings_solar_pv_solar_radiation 1.000000004721413",
"households_solar_pv_solar_radiation 1.0000000047214168",
"industry_chp_combined_cycle_gas_power_fuelmix 1.0000002527999505",
"industry_chp_supercritical_wood_pellets 1.0000002528001373",
"industry_chp_ultra_supercritical_coal NaN",
"energy_power_supercritical_waste_mix 1.0000002527998384",
"agriculture_chp_engine_gas_power_fuelmix 1.0000001606400828",
"buildings_collective_chp_wood_pellets NaN",
"buildings_collective_chp_gas_power_fuelmix 0.9999038923440943",
"households_collective_chp_wood_pellets NaN",
"households_collective_chp_network_gas NaN",
"households_water_heater_fuel_cell_chp_network_gas NaN",
"other_chp_engine_gas_power_fuelmix NaN",
"households_space_heater_micro_chp_network_gas NaN",
"households_water_heater_micro_chp_network_gas NaN",
"energy_power_nuclear_gen3_uranium_oxide 0.8997441764037145",
"energy_power_nuclear_gen2_uranium_oxide NaN",
"energy_power_ultra_supercritical_lignite NaN",
"energy_chp_ultra_supercritical_lignite NaN",
"energy_power_ultra_supercritical_oxyfuel_ccs_lignite NaN",
"energy_power_combined_cycle_coal 0.8992712487011134",
"energy_power_combined_cycle_ccs_coal NaN",
"energy_power_ultra_supercritical_coal 0.8458966087802168",
"energy_power_supercritical_coal NaN",
"energy_chp_ultra_supercritical_coal 0.6479913933028825",
"energy_power_ultra_supercritical_ccs_coal NaN",
"energy_power_combined_cycle_gas_power_fuelmix 0.2026446701852276",
"energy_power_combined_cycle_ccs_gas_power_fuelmix NaN",
"energy_chp_combined_cycle_gas_power_fuelmix 0.012113223432973608",
"energy_power_ultra_supercritical_gas_power_fuelmix 0.0",
"energy_power_turbine_network_gas 0.0",
"energy_power_ultra_supercritical_crude_oil NaN",
"energy_chp_ultra_supercritical_crude_oil NaN",
"energy_chp_ultra_supercritical_wood_pellets NaN",
"energy_power_engine_diesel NaN"]
When comparing the new merit order module with the current ETM implementation, some discrepancies for extreme (much volatile!) scenario's are popping up. For example, when increasing volatiles to almost maximum, the nuclear reactor still has ~4000 FLH in the ETM whereas the new module shuts the reactor off for most of the time.
Merit::LoadProfile.load(:key).values.inject(:+) * 3600
=> 1.0
This will tell us how realistic the MO module's results are. For example: if nuclear power plants are switching on/off every hour for the start-scenario, we have a problem.
@ChaelKruip already created an Excel file.
As discussed with @JAlsem.
The current definition of profitability is not correct:
:profitable
(if income >= total costs
):conditionally_profitable
(if variable costs =< income < total costs
):unprofitable
(if income < variable costs
)Since a plant the runs always earns back its variable costs (since electricity price is always higher than variable costs IFF a plant is running, otherwise it wouldn't be running), the comparison between variable and fixed costs is rather trivial.
The crux is that we want to know if the plant makes enough money to stay open. In effect this means we want to know if it covers its OPEX = variable costs + fixed O&M cost
Change the profitability definition as follows therefore:
:profitable
(if income >= total costs
):conditionally_profitable
(if OPEX =< income < total costs
):unprofitable
(if income < OPEX
)Note that since:
total costs = OPEX + CAPEX = variable costs + fixed costs
it is not necessary to define CAPEX anywhere.
We need to calculate OPEX in merit module, since variable costs are not input but output.
We need to make fixed_operation_and_maintenance_costs_per_year
an input for each (dispatchable) participant in order to be able to calculate OPEX.
+------------------------------------------------------+-----------------------------+--------------------------+------+--------+---------+-------------+-------------+----------------+-----------------+
| key | class | profitability | flh | profit | revenue | total_costs | fixed_costs | variable_costs | operating_costs |
+------------------------------------------------------+-----------------------------+--------------------------+------+--------+---------+-------------+-------------+----------------+-----------------+
| energy_power_solar_pv_solar_radiation | Merit::VolatileProducer | unprofitable | 1050 | 0 | 0 | 0 | 0 | 0 | 0 |
| energy_power_solar_csp_solar_radiation | Merit::VolatileProducer | unprofitable | 500 | 0 | 0 | 0 | 0 | 0 | 0 |
| energy_power_wind_turbine_inland | Merit::VolatileProducer | conditionally_profitable | 2500 | -16 | 176 | 191 | 191 | 0 | 53 |
| energy_power_wind_turbine_coastal | Merit::VolatileProducer | profitable | 3000 | 3 | 39 | 35 | 35 | 0 | 9 |
| energy_power_wind_turbine_offshore | Merit::VolatileProducer | conditionally_profitable | 3500 | -63 | 44 | 106 | 106 | 0 | 27 |
| buildings_solar_pv_solar_radiation | Merit::VolatileProducer | conditionally_profitable | 1050 | -5 | 2 | 6 | 6 | 0 | 0 |
| households_solar_pv_solar_radiation | Merit::VolatileProducer | conditionally_profitable | 1050 | -7 | 4 | 11 | 11 | 0 | 1 |
| industry_chp_combined_cycle_gas_power_fuelmix | Merit::MustRunProducer | unprofitable | 5442 | -1064 | 1097 | 2160 | 310 | 1850 | 1850 |
| industry_chp_supercritical_wood_pellets | Merit::MustRunProducer | unprofitable | 5247 | -235 | 116 | 351 | 99 | 251 | 282 |
| industry_chp_ultra_supercritical_coal | Merit::MustRunProducer | unprofitable | 4204 | 0 | 0 | 0 | 0 | 0 | 0 |
| energy_power_supercritical_waste_mix | Merit::MustRunProducer | conditionally_profitable | 6190 | -66 | 253 | 318 | 314 | 4 | 4 |
| agriculture_chp_engine_gas_power_fuelmix | Merit::MustRunProducer | unprofitable | 3980 | -535 | 772 | 1307 | 352 | 955 | 994 |
| buildings_collective_chp_wood_pellets | Merit::MustRunProducer | unprofitable | 6097 | 0 | 0 | 0 | 0 | 0 | 0 |
| buildings_collective_chp_gas_power_fuelmix | Merit::MustRunProducer | unprofitable | 3942 | -90 | 104 | 193 | 43 | 150 | 150 |
| households_collective_chp_wood_pellets | Merit::MustRunProducer | unprofitable | 6097 | 0 | 0 | 0 | 0 | 0 | 0 |
| households_collective_chp_network_gas | Merit::MustRunProducer | unprofitable | 3942 | 0 | 0 | 0 | 0 | 0 | 0 |
| households_water_heater_fuel_cell_chp_network_gas | Merit::MustRunProducer | unprofitable | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| other_chp_engine_gas_power_fuelmix | Merit::MustRunProducer | unprofitable | 4000 | 0 | 0 | 0 | 0 | 0 | 0 |
| households_space_heater_micro_chp_network_gas | Merit::MustRunProducer | unprofitable | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| households_water_heater_micro_chp_network_gas | Merit::MustRunProducer | unprofitable | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| energy_power_ultra_supercritical_oxyfuel_ccs_lignite | Merit::DispatchableProducer | unprofitable | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| energy_power_ultra_supercritical_lignite | Merit::DispatchableProducer | unprofitable | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| energy_chp_ultra_supercritical_crude_oil | Merit::DispatchableProducer | unprofitable | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| energy_chp_ultra_supercritical_lignite | Merit::DispatchableProducer | unprofitable | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| energy_chp_ultra_supercritical_wood_pellets | Merit::DispatchableProducer | unprofitable | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| energy_power_combined_cycle_ccs_coal | Merit::DispatchableProducer | unprofitable | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| energy_power_combined_cycle_ccs_gas_power_fuelmix | Merit::DispatchableProducer | unprofitable | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| energy_power_ultra_supercritical_crude_oil | Merit::DispatchableProducer | unprofitable | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| energy_power_ultra_supercritical_ccs_coal | Merit::DispatchableProducer | unprofitable | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| energy_power_engine_diesel | Merit::DispatchableProducer | unprofitable | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| energy_power_supercritical_coal | Merit::DispatchableProducer | unprofitable | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| energy_power_nuclear_gen2_uranium_oxide | Merit::DispatchableProducer | unprofitable | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| energy_power_nuclear_gen3_uranium_oxide | Merit::DispatchableProducer | profitable | 7884 | 53 | 261 | 207 | 184 | 23 | 49 |
| energy_power_combined_cycle_coal | Merit::DispatchableProducer | profitable | 7883 | 32 | 129 | 97 | 50 | 46 | 51 |
| energy_power_ultra_supercritical_coal | Merit::DispatchableProducer | profitable | 7708 | 369 | 1344 | 975 | 377 | 598 | 652 |
| energy_chp_ultra_supercritical_coal | Merit::DispatchableProducer | profitable | 7686 | 155 | 834 | 678 | 263 | 415 | 453 |
| energy_power_combined_cycle_gas_power_fuelmix | Merit::DispatchableProducer | profitable | 6498 | 255 | 1719 | 1464 | 314 | 1150 | 1196 |
| energy_chp_combined_cycle_gas_power_fuelmix | Merit::DispatchableProducer | conditionally_profitable | 2490 | -261 | 589 | 850 | 353 | 496 | 548 |
| energy_power_ultra_supercritical_gas_power_fuelmix | Merit::DispatchableProducer | conditionally_profitable | 468 | -119 | 139 | 258 | 140 | 117 | 124 |
| energy_power_turbine_network_gas | Merit::DispatchableProducer | unprofitable | 51 | -10 | 0 | 10 | 9 | 0 | 2 |
+------------------------------------------------------+-----------------------------+--------------------------+------+--------+---------+-------------+-------------+----------------+-----------------+
We have several technologies in the ETM that are not currently included in the MO calculation because they do not have load curves or sensible costs assigned:
When using pry-remote with a 'binding.remote_pry' in between these lines, the merit order info table looks like this:
@m.info:
+--------------------------------------------------------+-----------------------------+--------------------+--------------------+-----------------------+
| key | class | marginal costs | full load hours | production (PJ) |
+--------------------------------------------------------+-----------------------------+--------------------+--------------------+-----------------------+
| buildings_solar_pv_solar_radiation | Merit::VolatileProducer | 0.0 | 8584.799999998668 | 0.9801388799998477 |
| energy_power_solar_csp_solar_radiation | Merit::VolatileProducer | 1.0 | 0.0 | 0.0 |
| energy_power_solar_pv_solar_radiation | Merit::VolatileProducer | 0.0 | 0.0 | 0.0 |
| energy_power_wind_turbine_coastal | Merit::VolatileProducer | 0.0 | 8322.0 | 5.991839999999999 |
| energy_power_wind_turbine_inland | Merit::VolatileProducer | 0.0 | 8322.000000000024 | 32.35593599999999 |
| energy_power_wind_turbine_offshore | Merit::VolatileProducer | 0.0 | 8059.1999999988975 | 5.636834742856381 |
| households_solar_pv_solar_radiation | Merit::VolatileProducer | 0.0 | 8584.800000000983 | 1.9632211200002248 |
| agriculture_chp_engine_gas_power_fuelmix | Merit::MustRunProducer | 78.2912044043496 | 3980.42414355628 | 43.9200070553075 |
| buildings_collective_chp_gas_power_fuelmix | Merit::MustRunProducer | 94.00461948287406 | 3942.0 | 5.759999730892853 |
| buildings_collective_chp_wood_pellets | Merit::MustRunProducer | 154.16507000812567 | 6097.77777777778 | 0.0 |
| energy_power_geothermal | Merit::MustRunProducer | 0.0 | 8250.0 | 0.0 |
| energy_power_supercritical_waste_mix | Merit::MustRunProducer | 1.2060890798839186 | 6190.47619047619 | 14.040003549310445 |
| energy_power_ultra_supercritical_cofiring_wood_pellets | Merit::MustRunProducer | 76.54076672162961 | 6329.1 | 0.0 |
| households_collective_chp_network_gas | Merit::MustRunProducer | 85.59713754578537 | 3942.0 | 0.0 |
| households_collective_chp_wood_pellets | Merit::MustRunProducer | 119.97893462469432 | 6097.77777777778 | 0.0 |
| households_space_heater_micro_chp_network_gas | Merit::MustRunProducer | NaN | 0.0 | 0.0 |
| households_water_heater_fuel_cell_chp_network_gas | Merit::MustRunProducer | NaN | 0.0 | 0.0 |
| households_water_heater_micro_chp_network_gas | Merit::MustRunProducer | NaN | 0.0 | 0.0 |
| industry_chp_combined_cycle_gas_power_fuelmix | Merit::MustRunProducer | 109.48622367590018 | 5442.83413848631 | 60.840015380343736 |
| industry_chp_supercritical_wood_pellets | Merit::MustRunProducer | 139.78983050846998 | 5247.81341107872 | 6.480001638143425 |
| industry_chp_ultra_supercritical_coal | Merit::MustRunProducer | 32.155211147136 | 4204.8 | 0.0 |
| other_chp_engine_gas_power_fuelmix | Merit::MustRunProducer | 78.35349089083613 | 4000.0 | 0.0 |
| energy_power_nuclear_gen3_uranium_oxide | Merit::DispatchableProducer | 5.826162528219999 | 7884.000000000001 | 14.475024000000001 |
| energy_power_nuclear_gen2_uranium_oxide | Merit::DispatchableProducer | 6.133182844247499 | 0.0 | 0.0 |
| energy_power_ultra_supercritical_lignite | Merit::DispatchableProducer | 13.999791000000002 | 0.0 | 0.0 |
| energy_chp_ultra_supercritical_lignite | Merit::DispatchableProducer | 16.60280221570544 | 0.0 | 0.0 |
| energy_power_ultra_supercritical_oxyfuel_ccs_lignite | Merit::DispatchableProducer | 19.5875588852459 | 0.0 | 0.0 |
| energy_power_combined_cycle_coal | Merit::DispatchableProducer | 23.206235140069815 | 7883.999999998865 | 7.1807471999989865 |
| energy_power_combined_cycle_ccs_coal | Merit::DispatchableProducer | 28.368603091935135 | 0.0 | 0.0 |
| energy_power_ultra_supercritical_coal | Merit::DispatchableProducer | 28.88182917042096 | 7703.270989606596 | 74.49825668266205 |
| energy_power_supercritical_coal | Merit::DispatchableProducer | 29.9101120467295 | 0.0 | 0.0 |
| energy_chp_ultra_supercritical_coal | Merit::DispatchableProducer | 32.392018334153555 | 7562.661521001719 | 45.466243477619265 |
| energy_power_ultra_supercritical_ccs_coal | Merit::DispatchableProducer | 34.97149517639419 | 0.0 | 0.0 |
| energy_power_combined_cycle_gas_power_fuelmix | Merit::DispatchableProducer | 44.22593220218116 | 5268.837140035736 | 75.90919044392285 |
| energy_power_combined_cycle_ccs_gas_power_fuelmix | Merit::DispatchableProducer | 57.26112857757725 | 0.0 | 0.0 |
| energy_chp_combined_cycle_gas_power_fuelmix | Merit::DispatchableProducer | 60.30808936661068 | 1625.7070841086925 | 19.3461744140269 |
| energy_power_ultra_supercritical_gas_power_fuelmix | Merit::DispatchableProducer | 65.87652585429215 | 225.22181206417207 | 3.1004935536002223 |
| energy_power_turbine_network_gas | Merit::DispatchableProducer | 77.98197269622605 | 2.9405857154323356 | 0.0022442550180179596 |
| energy_power_ultra_supercritical_crude_oil | Merit::DispatchableProducer | 93.09320787177599 | 0.0 | 0.0 |
| energy_power_engine_diesel | Merit::DispatchableProducer | 93.09320787177599 | 0.0 | 0.0 |
| energy_chp_ultra_supercritical_crude_oil | Merit::DispatchableProducer | 109.37827642710315 | 0.0 | 0.0 |
| energy_chp_ultra_supercritical_wood_pellets | Merit::DispatchableProducer | 139.78983050846998 | 0.0 | 0.0 |
| TOTALS: | | | | 417.9463721237027 |
+--------------------------------------------------------+-----------------------------+--------------------+--------------------+-----------------------+
Curiously, the full_load_hours
(and, therefore, productions) of wind turbines are much higher than they should be. The the full_load_hours
are input to the MO module, and should be constant regardless.
This could very well be the reason for the discrepancy of production and demand when injecting the MO the full_load_hours
into the ETM:
NOTE: the the full_load_hours
in the table are correct again! They also look to be correct when using a stub with the MO module to reproduce the exact scenario. Only when printing the values inside the 'pry' session, do these weird values show up...
When you increase Gas CCGT plants from 5.1 (default) to 10, you see how Gas Turbines jump from the highest position in the merit order graph (most right) to the lowest position (most left). As Gas Turbines are replaced with Gas CCGT, Gas Turbines are no longer running. The module assigns the operation costs to zero in consequence.
Further increasing Gas CCGT to the max of the slider will also push Gas Steam down the merit order.
Are there other drawbacks from having zero operating costs for plants that do not run?
possible solutions,
So that the user can do this through the shell:
rake console:load et-engine.com 217811
We have to find out three things:
variable_cost_per(:MWh)
give different results than the previously used merit_order_variable_cost_per(:MWh)
?you find that the green block (must run CHPs) is sticking out above the other producers that have zero marginal costs. Even though the operating costs are displayed as 0,00 they look larger than zero.
One of the main deliverables of interview with Sytse Jelles is a precise and validated formulation of profitability.
@antw: a couple of methods your created are currently without tests yet, could you have a look at this?
According to documentation and discussion, MusRunConverters NEED to have a profile defined, but in the stub, some participants have none:
merit_order.add(
MustRunParticipant.new(
key: "energy_power_ultra_supercritical_cofiring_wood_pellets",
marginal_costs: 76.54109444,
effective_output_capacity: 0,
number_of_units: 0,
availability: 0.89,
fixed_costs: 133969444.4,
load_profile_key: "",
full_load_hours: 6329.1
)
)
merit_order.add(
MustRunParticipant.new(
key: "energy_power_hydro_river",
marginal_costs: 0,
effective_output_capacity: 37,
number_of_units: 3.7,
availability: 0.98,
fixed_costs: 3000000,
load_profile_key: "",
full_load_hours: 2702.702703
)
)
There's now only that the unit is hours.
This allows us to investigate the impact of different data on the outcomes of the MO module.
merit_order.add(
MustRunParticipant.new(
key: "energy_power_hydro_river",
marginal_costs: 0,
effective_output_capacity: 37,
number_of_units: 3.7,
availability: 0.98,
fixed_costs: 3000000,
load_profile_key: "",
full_load_hours: 2702.702703
)
)
merit_order.add(
MustRunParticipant.new(
key: "energy_power_hydro_mountain",
marginal_costs: 2.49208966,
effective_output_capacity: 0,
number_of_units: 0,
availability: 0.98,
fixed_costs: 51155234.43,
load_profile_key: "",
full_load_hours: 3942
)
)
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.