Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature critical demand #165

Open
wants to merge 29 commits into
base: dev
Choose a base branch
from
Open

Feature critical demand #165

wants to merge 29 commits into from

Conversation

adnanalakori
Copy link
Collaborator

@adnanalakori adnanalakori commented Nov 30, 2021

Adresses issue #162

The following subtasks have been implemented:

  • Defined title_demand_ac_critical and title_demand_dc_critical in the excel

  • Define constants in

    TITLE_DEMAND_AC = "title_demand_ac"

  • Added columns for demand_ac_critical and demand_dc_critical in input timeseries file

  • Run simulation, check that new parameters are in simulation_experiments.csv (output)

  • If not, needs to be implemented in D0 https://github.com/rl-institut/offgridders/blob/dev/src/D0_process_input.py

  • Check that timeseries was parsed correctly, add DEMAND_PROFILE_AC_CRITICAL and DEMAND_PROFILE_DC_CRITICAL

  • Add generate_demand for new critical demands, see

    # ------------demand sink ac------------#

    --- For later ---

  • Run a simulation with demands split into normal and critical demand to compare if KPI like demand_total stay the same (do not use shortage here), and also which do not. We might have to adapt KPI definitions accordingly (G3, G3a, G3b`)

  • Add a constraint that allows shortage to replace non-critical demands (G2b)

  • Think of KPI that represents how much non-critical demand is not covered. Should this be in total_shortage etc?

  • Add plausability tests, ie. is critical demand always supplied, and is the shortage activated ADDITIONALLY? (G3a)

  • Define benchmark test, ie. scenarios where you already can estimate some results and with which we can test that the new feature works.

  • Make sure that all excel files in the repo now are up-to-date and have the new parameters

  • Make sure that it is possible to parse excel files that do not have the new parameters. Give a warning about outdated input files.

  • Update the changelog.md

  • Use black for linting

@smartie2076
Copy link
Collaborator

Hi @adnanalakori! I edited the first post according to what is common use in github. There is a specific way to reference the issues that you are working on with a hashtag, and the to-do-list are clickable.

It may be that you do not want to adress each of tasks in this PR. Then delete some of the rows again. The PR can be closed if you can make sure that your changes do not interfere with the existing functionalities.

Copy link
Collaborator

@smartie2076 smartie2076 left a comment

Choose a reason for hiding this comment

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

You did the first steps to implement the timeseries, let me know if you have trouble following though the next steps!

One remark: Your excel file as it is would not be helping you to implement the feature, as it calls column Demand four times
grafik
Instead of calling demand_ac_non_critical etc. which are the actual column heads of your demand profiles in inputs/timeseries/test_site.csv.

@adnanalakori
Copy link
Collaborator Author

adnanalakori commented Dec 1, 2021

Hi @smartie2076 , thanks! I unified names demand_ac_non_critical etc in the inputs/timeseries/test_site.csv, test_sitie.csv, and also constants in

TITLE_DEMAND_AC = "title_demand_ac"

The simulation up to now runs well and checked in simulation_experiments.csv.

@smartie2076
Copy link
Collaborator

smartie2076 commented Dec 1, 2021

Can you upload the simulation_experiments.csv?

I wonder if it did load the timeseries of demand_ac_critical and demand_dc_critical (ie. a vector of 8760 entries), or only the title_demand. We need to make sure that it writes the vector to the data, so that you can process it later.

I think we might need to add it to https://github.com/rl-institut/offgridders/blob/dev/src/B_read_from_files.py#L551 in B, or also some processing in D0 to really get it into simulation_experiments.

(I am not sure if the following two points are really checked, or if some more work has to be done)

  • If not, needs to be implemented in D0 https://github.com/rl-institut/offgridders/blob/dev/src/D0_process_input.py
  • Check that timeseries was parsed correctly, add DEMAND_PROFILE_AC_CRITICAL and DEMAND_PROFILE_DC_CRITICAL
    If you want an easier time to check whether or not the vectors/timeseries for the different demand categories are parsed, you could also have different timeseries for each of them (for now you just copied the columns in the timeseries input file).

@adnanalakori
Copy link
Collaborator Author

adnanalakori commented Dec 1, 2021

Can you upload the simulation_experiments.csv?

@smartie2076 , please find a cope of the simulation_experiments.csv attached. It seems up to now the title is shown:

image

Regarding the next point, I did not consider it as the new parameters have been shown in simulation_experiments.csv

Also same apply to this point -> I understood "parsed correctly" that the simulation run with no errors:_

  • Check that timeseries was parsed correctly, add DEMAND_PROFILE_AC_CRITICAL and DEMAND_PROFILE_DC_CRITICAL

@smartie2076
Copy link
Collaborator

You do not have to quote reply all of it, just the parts you want to hightlight ;)

Ah, I realized that actually we can not figure out if it worked with sensitivity_experiments alone. :(
Can you upload the log-file? Directly with drag-and-drop, then I can also read it fully.

I am sure, actually, that we have to adapt this function:
`https://github.com/rl-institut/offgridders/blob/feature-critical-demand/src/D0_process_input.py#L234
...but, sadly, I was not very good at programming at this point, and there are very few logging messages, and the code is repetative. There are two options:

  • Just adapt everything that exists there for the initial title_demand_ac and title_demand_dc
  • Do it properly and generalize functions, to have less lines of code

There should definitly be more logging messages. So, try to understand the idea of the function and add some logging messages that help you understand which dara is added to the input data here. To observe what is changed in the function, you can add

import pp
pp.print(experiments_s)

Right below

max_date_time_index, max_evaluated_days = process_input.add_timeseries(
, and then you can check if you added the timeseries properly.

You can also check if you can store the experiments_s as a json file, which would be easier to read:

    json_data = json.dumps(
        experiments_s,
        skipkeys=False,
        sort_keys=True,
        indent=4,
    )

@smartie2076
Copy link
Collaborator

If you choose to improve the offgridders code and go for...

* Do it properly and generalize functions, to have less lines of code

You should push the related commits in a seperate PR, ideally WITHOUT the demand_ac_cricical, which we would then merge into dev. Then we pull the new, nice dev with improved functions and logging messages into this branch, and continue working. That way, this PR does not get heavy with "maintenance work" within the Offgridders code.

Copy link
Collaborator

@smartie2076 smartie2076 left a comment

Choose a reason for hiding this comment

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

Hi @adnanalakori,

I added some comments in the code below. It is very important in python not to make the code more bulky and especcially important to try and avoid code duplications - write new functions instead, that you call multiple times. That way, you can also write unit tests for them and figure out if they work.

There are some logical errors, but I know that Offgridders is just big, it is hard to know what is going into where. Take special care when you change if-loops, and read the existing logging messages to figure out how the code should be changed.

I recommend you to add more logging.debug messages to your code to make sure that your changes make sense.

Did you check the experiment dict for the new information on the critical demand, and if it is parsed? This is very important, you need to know your code does what it should do before you go further and change stuff in other, later modules.

I think you error message might have to do with the fact that you completely removed the normal demand profile, and Offgridders can not parse the new critical ones jet. That is just a guess. If it persists, this PR is the right place to paste the full error message (not as a screenshot, either as a code or, if too long, as a txt).

/.idea/
Copy link
Collaborator

Choose a reason for hiding this comment

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

This file should not be commited.

@@ -0,0 +1,28 @@
******************************************************
Copy link
Collaborator

Choose a reason for hiding this comment

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

This file should not be commited.

src/B_read_from_files.py Outdated Show resolved Hide resolved
Comment on lines 41 to 59
TOTAL_DEMAND_AC_CRITICAL,
PEAK_DEMAND_AC,
PEAK_DEMAND_AC_CRITICAL,
TOTAL_DEMAND_DC,
TOTAL_DEMAND_DC_CRITICAL,
PEAK_DEMAND_DC,
PEAK_DEMAND_DC_CRITICAL,
PEAK_PV_GENERATION_PER_KWP,
PEAK_WIND_GENERATION_PER_KW,
MEAN_DEMAND_AC,
MEAN_DEMAND_AC_CRITICAL,
MEAN_DEMAND_DC,
MEAN_DEMAND_DC_CRITICAL,
PEAK_MEAN_DEMAND_RATIO_AC,
PEAK_MEAN_DEMAND_RATIO_AC_CRITICAL,
PEAK_MEAN_DEMAND_RATIO_DC,
PEAK_MEAN_DEMAND_RATIO_DC_CRITICAL,
ABS_PEAK_DEMAND_AC_SIDE,
ABS_PEAK_DEMAND_AC_CRITICAL_SIDE,
Copy link
Collaborator

Choose a reason for hiding this comment

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

This is an executive decision - it seems you want to calculate the indicators for every demand type, an not aggregated? Fine by me, makes sense, but we will have to make sure that these parameters are also printed to the results file. This happens far at the end of the Offgridders process, though. Keep this comment open in Github as a reminder.

src/D0_process_input.py Outdated Show resolved Hide resolved
Comment on lines 100 to 116
# ------------demand sink ac critical ------------#
demand_ac_critical = generate.demand_ac_critical(
micro_grid_system, bus_electricity_ac, experiment[DEMAND_PROFILE_AC]
)

# ------------demand sink dc critical ------------#
demand_dc_critical = generate.demand_dc_critical(
micro_grid_system, bus_electricity_ac, experiment[DEMAND_PROFILE_DC]
)
Copy link
Collaborator

Choose a reason for hiding this comment

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

You are defining new functions demand_ac_critical and demand_dc_critical here. However, those functions are absolutely identical - apart from the input argument of the demand. Create one single function for all these instances, ie. use a new function generate.demand() four times, for demand_ac, demand_dc, demand_ac_critical, demand_dc_critical. That is the pythonic way.

@@ -745,6 +746,21 @@ def maingrid_feedin(micro_grid_system, experiment):
)
},
)

def demand_dc_critical(micro_grid_system, bus_electricity_dc, demand_profile):
Copy link
Collaborator

Choose a reason for hiding this comment

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

As described above, generalize these functions:

def demand(micro_grid_system, bus_electricity, demand_profile, profile_title):
...

src/constants.py Outdated Show resolved Hide resolved
src/constants.py Outdated Show resolved Hide resolved
src/constants.py Outdated Show resolved Hide resolved
src/constants.py Outdated Show resolved Hide resolved
src/constants.py Outdated Show resolved Hide resolved
src/constants.py Outdated Show resolved Hide resolved
src/constants.py Outdated Show resolved Hide resolved
src/D0_process_input.py Outdated Show resolved Hide resolved
@adnanalakori
Copy link
Collaborator Author

adnanalakori commented Mar 29, 2022

Hi @smartie2076 ,
It seems the error below because when we merged 4 similar functions in one and added demand_type in DO line 361, so we might need to mention it in line 476, would that help? Still not clear how it should be recognized as a demand for AC and DC and the demand_type have not been defined in constant.py?

def update_demand_profile(experiment_s, experiment, demand_profile, demand_type):
experiment_s[experiment].update(
{
demand_profile: pd.Series(
experiment_s[experiment][demand_type][0 : len(index)].values,
index=index,
)
return

2022-03-28 13_34_24-Settings

@smartie2076
Copy link
Collaborator

smartie2076 commented Mar 29, 2022

Hi @adnanalakori! Thanks for posting the issue here - it makes it easier to follow up on. Ideally, when posting issues here, you add links to the appropriate code passages, so that it is absolutely without possibility of error clear which lines of code you are referring to. For that, you open the file in github (here D0), go to the appropriate line, click on the line number, click on the three points and click "copy permalink":

grafik

I add the links below, so that we are for sure talking about the same thing.

merged 4 similar functions in one and added demand_type in DO line 361

We are talking about this function:

def update_demand_profile(experiment_s, experiment, demand_profile, demand_type):

Thing is, it is not a proper function definition - you can (almost) only define functions on the first level (no tabs in front of def), but here you define it within a if-elif-loop:

elif experiment_s[experiment][FILE_INDEX] == None:
            # limit based on index

            def update_demand_profile(experiment_s, experiment, demand_profile, demand_type):
                experiment_s[experiment].update(
                    {
                        demand_profile: pd.Series(
                            experiment_s[experiment][demand_type][0: len(index)].values,
                            index=index,
                        )
                    }
                )
                return

So, move this function out of your if-else-loop, and only call the function within this if-else-loop. Otherwise, the function is not recognized.

so we might need to mention it in line 476, would that help?

Line 476 would be this, so I guess the line where you got an error.

ACCUMULATED_PROFILE_AC_SIDE: experiment_s[experiment][DEMAND_PROFILE_AC]

Still not clear how it should be recognized as a demand for AC and DC and the demand_type have not been defined in constant.py?

I think the problem is that you removed 4 similar code snippets and replaceAd them by D0.update_demand_profile, but then did not add the new calls of exactly this function - therefore, none of DEMAND_PROFILE_AC, DEMAND_PROFILE_DC, DEMAND_PROFILE_AC_CRITICAL, DEMAND_PROFILE_DC_CRITICAL are added to the experiment. Add the function calls, maybe this fixes the error.

grafik

@adnanalakori
Copy link
Collaborator Author

  • Add a constraint that allows shortage to replace non-critical demands (G2b)

Means adding constraint that allows capacity dispatch to supply critical load first and then non-critical load after that? The constraints shall work as a check point, correct?

@adnanalakori
Copy link
Collaborator Author

  • Think of KPI that represents how much non-critical demand is not covered. Should this be in total_shortage etc?

I assumed that the amount of “non-critical demand is not covered” is already fixed at input constant as scenarios e.g. 10% 30% etc.? Do we still need to apply a KPI here?

@adnanalakori
Copy link
Collaborator Author

  • Add plausability tests, ie. is critical demand always supplied, and is the shortage activated ADDITIONALLY? (G3a)

I assumed that the critical demand always supplied. Do we still to implement something here as well? could you elaborate on?

@adnanalakori
Copy link
Collaborator Author

adnanalakori commented Mar 31, 2022

Regarding model inputs and outputs, I could imagine the followings:

Model inputs:

  • We are willing to implement various shortages in the input constant excel file shortage_max_allowed
    (10%, 30%, etc.). However this has to be applied only for non-critical load (we named it in our coding as DEMAND_AC and DEMAND_DC), is it ok?

Model outputs:

  • I assume that we are able to visualized electricity flow, etc. for both normal demand and critical demand as well, correct?
  • Techo-economic results will be the same as the current version of Offgridders?

@smartie2076
Copy link
Collaborator

  • Add a constraint that allows shortage to replace non-critical demands (G2b)

Means adding constraint that allows capacity dispatch to supply critical load first and then non-critical load after that? The constraints shall work as a check point, correct?

Means that the shortage that is allowed can only be as high as non-critical load only, so that critical load is always supplied. The constraints are defined in G2b, but I would have to check more in detail what needs to be changed. It can be that the shortage is included implicitly within the stability constraints. In that case, all stability constraints need to be changed.

The constraint

def timestep(model, case_dict, experiment, el_bus, sink_demand, source_shortage):

Is not implemented or used, so do not just change that, it will not help. However, it also seems to me that the "timestep" constraint is anyway added with ? Because the nominal capacity, not the sum over the whole year is limited my the "max_shortage". I would have to put some time into this to know for sure. It would surprise me a bit, because if I have a household with blackouts, the simulation should terminate if the shortage source was not able to cover demand, but this did not happen.


Sidenote, can also be moved into an own issue

I would greatly appreciate if this PR could do a fix and rename the variable SHORTAGE_LIMIT to STABILITY_LIMIT. Maybe start here and replace all occurrences in the code.

SHORTAGE_LIMIT = "stability_limit"

I am not sure how this came to be, but it is very, very misleading in G2b, for example:

stability_limit = experiment[SHORTAGE_LIMIT]

@smartie2076
Copy link
Collaborator

  • Add plausability tests, ie. is critical demand always supplied, and is the shortage activated ADDITIONALLY? (G3a)

I assumed that the critical demand always supplied. Do we still to implement something here as well? could you elaborate on?

Yeah, if you implement is correctly it is. But there are some parameters/KPI, that should take this into account - for example the % of shortage should then not be calculated based on shortage/non-cricitcal demand but `shortage/(non-critical + critical demand).

@smartie2076
Copy link
Collaborator

Regarding model inputs and outputs, I could imagine the followings:

Model inputs:

* We are willing to  implement various shortages in the input constant excel file `shortage_max_allowed `
  (10%, 30%, etc.). However this has to be applied only for non-critical load (we named it in our coding as DEMAND_AC and DEMAND_DC), is it ok?

That is the idea.

Model outputs:

* I assumed that we are able to visualized electricity flow, etc. for both normal demand and critical demand as well, correct?

You have to implement this into the plots, only if you do it will be plotted.

* Techo-economic results will be the same as the current version of Offgridders?

Some KPI calculations might have to be changed, as they have the demand as a denominator, which currently is only the non-critical demand.

@Bachibouzouk
Copy link
Collaborator

  • Add a constraint that allows shortage to replace non-critical demands (G2b)

Means adding constraint that allows capacity dispatch to supply critical load first and then non-critical load after that? The constraints shall work as a check point, correct?

This would be added in G2b and called under # ------------Stability constraint------------# in G1.build (around line 400)?

@smartie2076
Copy link
Collaborator

This would be added in G2b and called under # ------------Stability constraint------------# in G1.build (around line 400)?

Yeah it would. I am just not sure if it is basically already in the different stability constraints that I defined, or if it is not. Stability constraints would be:



They are always written with a validity-check that has to pass after the optimization finished, eg:

def backup_test(case_dict, oemof_results, experiment, e_flows_df):

You would call the constraint in G1, if you did have to define a new constraint, I would probably add it at the end, so around here

# ------------Allow shortage only for certain percentage of demand in a timestep------------#

"""

def meet_critical_demand_rule(model):
# TODO express the fact that the critical demand must be met as a constraint
Copy link
Collaborator

Choose a reason for hiding this comment

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

@smartie2076 - would something like this work? (Provided we then define total_production with arguments form the function

Copy link
Collaborator

Choose a reason for hiding this comment

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

Yeah, this should work.

)

stability_constraint = case_dict.get(STABILITY_CONSTRAINT, None)
if stability_constraint == CRITICAL:
Copy link
Collaborator

@Bachibouzouk Bachibouzouk Apr 4, 2022

Choose a reason for hiding this comment

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

I am not sure if this was the correct way to go with the shortage for critical demand @smartie2076

Copy link
Collaborator

Choose a reason for hiding this comment

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

I am having issues with the naming here. stability_constraint should be a simplified electro-technical stability constraint, but here you are not assessing stability, but more something like a load_shedding option.

Also, here, you access the same stability_constraint value:

# ------------Stability constraint------------#

But this stability constraint is, for me, not the same as the load shedding option. Actually, as soon as you define non-critical demand, load shedding will per definitionem be allowed. This is also not very beautiful, but okay, as it is within the naming. You do not have to access the STABILITY_CONSTRAINT value for this.

I am not sure if allowing for load shedding will require all three stability constraints (share_backup, share_hybrid, share_usage) to be re-defined. Because, if there is intentional load-shedding, then it should be okay that also only a relative part of the remaining demand is covered by renewables or whatever. However, if 100% demand (critical+non-critical) is supplied, the share of renewables or whatever should be based on that effective demand. Meaning, all four (AC/DC critical/non-critical) demands need to be in the constraint - maybe the shortage asset then plays the deciding role here?

About shortage: I do not remember if this is the only part where it is implemented. In general, one needs to decide, whether load shedding of non-critical loads is considered shortage or not. I think right now, load shedding would be allowed within the margin of allowed shortage, effectively limiting its potential.

Comment on lines 153 to 160
e_flows_df = timeseries.get_demand(
case_dict,
oemof_results,
electricity_bus_ac,
electricity_bus_dc,
critical,
experiment,
)
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

@smartie2076 would that help for results plotting of the critical?

Copy link
Collaborator

Choose a reason for hiding this comment

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

I don´t know, as I am not quite sure what your CRITICAL is right now - I did not find it in the code apart from something, where I thought it was a string only, not something added to the oemof model itself. I also don´t know what you are planning to plot...

Did the code run though with this new code bit? What results/graph did it generate?

Copy link
Collaborator Author

@adnanalakori adnanalakori Apr 25, 2022

Choose a reason for hiding this comment

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

The purpose is to separate, simulate and plot results of critical demand. This new function still did not run it yet, we still not sure about it yet.

Copy link
Collaborator

Choose a reason for hiding this comment

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

I am sorry, I do not understand. I suggest that you create a blueprint plot with excel, to showcase what kind of graph you want to have generated.

Dont think I can help you here, though, as I am also not really in tune with the Offgridders code anymore.

Copy link
Collaborator Author

@adnanalakori adnanalakori Apr 26, 2022

Choose a reason for hiding this comment

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

In other words, offgridders shows power flow of the demand as in this figure below, in our case we want to show critical demand as well. That is all.

image

Copy link
Collaborator

Choose a reason for hiding this comment

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

I think the "Demand" is supposed to be the total demand, including the DC and AC demand, and thus it should include critical demand as well. You just need to change the calculation of the "Demand". If you want to highlight that there is a specific (total) critical demand, I would suggest to add a dotted line of the same color as the total demand. The allowed shortage would then be the margin between those two lines.

Comment on lines 544 to 545
# TODO maybe important for critical
# AD: We might leave this certain of shortage to assign to the non critical demand?
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Any suggestion here? @smartie2076

Copy link
Collaborator

Choose a reason for hiding this comment

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

I am sorry, I do not understand the question.

In general, the question about allowed shortage, reliability and shedded load ends up in this questio: Is load shedding of non-critical loads considered shortage? If it is, then load shedding must be limited to the allowed shortage as defined in the input template. The resulting reliability will most often be equal to the allowed shortage. If load shedding is not considered shortage, I think it would still make sense that the reliability is then lower than if no load was shedded - so the above calculation should reflect that.

I suggest writing pytests or benchmark tests to make sure the feature is working properly and continues working properly in the future.

Comment on lines 544 to 583
# TODO maybe important for critical
# AD: We might leave this certain of shortage to assign to the non critical demand?
"""
# ------------Allow shortage only for certain percentage of demand in a timestep------------#
if case_dict['allow_shortage'] is True:
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Any suggestion here? @smartie2076

Comment on lines 544 to 583
# TODO maybe important for critical
# AD: We might leave this certain of shortage to assign to the non critical demand?
"""
# ------------Allow shortage only for certain percentage of demand in a timestep------------#
if case_dict['allow_shortage'] is True:
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Any suggestion here? @smartie2076

Comment on lines 452 to 460
elif case_dict[STABILITY_CONSTRAINT] == CRITICAL:
# ADDED: a function to make the stability constraint favor critical demand over demand
logging.info(
"Added constraint: Stability though actual generation of diesel generators and backup through batteries."
)
constraints_custom.critical(
model,
case_dict,
experiment=experiment,
storage=storage,
sink_demand=sink_demand_ac,
genset=genset,
pcc_consumption=pointofcoupling_consumption,
source_shortage=source_shortage,
el_bus_ac=bus_electricity_ac,
el_bus_dc=bus_electricity_dc,
Copy link
Collaborator Author

@adnanalakori adnanalakori Apr 26, 2022

Choose a reason for hiding this comment

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

I am trying to add a function to make the stability constraint in favor critical demand, not sure!

@smartie2076
Copy link
Collaborator

I just noticed that you should make sure that your code still works with the old input template - ie. that if title critical demand (etc) is not included, that value is set to None. Same for the old title demand AC/DC.

The aim is to compute the energy balance between production and
consumption of each AC and DC busses and make sure there is enough
energy to fullfill criticial demand at all timesteps
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