Completed
Push — dev ( 68ddc7...49e927 )
by Patrik
58s queued 48s
created

test_variable_chp.test_variable_chp()   B

Complexity

Conditions 3

Size

Total Lines 182
Code Lines 105

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 105
dl 0
loc 182
rs 7
c 0
b 0
f 0
cc 3
nop 2

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
# -*- coding: utf-8 -*-
2
3
"""
4
This test contains a ExtractionTurbineCHP class.
5
6
7
This file is part of project oemof (github.com/oemof/oemof). It's copyrighted
8
by the contributors recorded in the version control history of the file,
9
available from its original location
10
oemof/tests/test_scripts/test_solph/test_variable_chp/test_variable_chp.py
11
12
SPDX-License-Identifier: MIT
13
"""
14
15
import logging
16
import os
17
18
import pandas as pd
19
import pytest
20
21
from oemof import solph
22
from oemof.solph import views
23
24
25
def test_variable_chp(filename="variable_chp.csv", solver="cbc"):
26
    logging.info("Initialize the energy system")
27
28
    # create time index for 192 hours in May.
29
    date_time_index = pd.date_range("5/5/2012", periods=5, freq="h")
30
    energysystem = solph.EnergySystem(
31
        timeindex=date_time_index, infer_last_interval=True
32
    )
33
34
    # Read data file with heat and electrical demand (192 hours)
35
    full_filename = os.path.join(os.path.dirname(__file__), filename)
36
    data = pd.read_csv(full_filename, sep=",")
37
38
    ##########################################################################
39
    # Create oemof.solph objects
40
    ##########################################################################
41
42
    logging.info("Create oemof.solph objects")
43
44
    # create natural gas bus
45
    bgas = solph.buses.Bus(label=("natural", "gas"))
46
    energysystem.add(bgas)
47
48
    # create commodity object for gas resource
49
    energysystem.add(
50
        solph.components.Source(
51
            label=("commodity", "gas"),
52
            outputs={bgas: solph.flows.Flow(variable_costs=50)},
53
        )
54
    )
55
56
    # create two electricity buses and two heat buses
57
    bel = solph.buses.Bus(label=("electricity", 1))
58
    bel2 = solph.buses.Bus(label=("electricity", 2))
59
    bth = solph.buses.Bus(label=("heat", 1))
60
    bth2 = solph.buses.Bus(label=("heat", 2))
61
    energysystem.add(bel, bel2, bth, bth2)
62
63
    # create excess components for the elec/heat bus to allow overproduction
64
    energysystem.add(
65
        solph.components.Sink(
66
            label=("excess", "bth_2"), inputs={bth2: solph.flows.Flow()}
67
        )
68
    )
69
    energysystem.add(
70
        solph.components.Sink(
71
            label=("excess", "bth_1"), inputs={bth: solph.flows.Flow()}
72
        )
73
    )
74
    energysystem.add(
75
        solph.components.Sink(
76
            label=("excess", "bel_2"), inputs={bel2: solph.flows.Flow()}
77
        )
78
    )
79
    energysystem.add(
80
        solph.components.Sink(
81
            label=("excess", "bel_1"), inputs={bel: solph.flows.Flow()}
82
        )
83
    )
84
85
    # create simple sink object for electrical demand for each electrical bus
86
    energysystem.add(
87
        solph.components.Sink(
88
            label=("demand", "elec1"),
89
            inputs={
90
                bel: solph.flows.Flow(
91
                    fix=data["demand_el"], nominal_capacity=1
92
                )
93
            },
94
        )
95
    )
96
    energysystem.add(
97
        solph.components.Sink(
98
            label=("demand", "elec2"),
99
            inputs={
100
                bel2: solph.flows.Flow(
101
                    fix=data["demand_el"], nominal_capacity=1
102
                )
103
            },
104
        )
105
    )
106
107
    # create simple sink object for heat demand for each thermal bus
108
    energysystem.add(
109
        solph.components.Sink(
110
            label=("demand", "therm1"),
111
            inputs={
112
                bth: solph.flows.Flow(
113
                    fix=data["demand_th"], nominal_capacity=741000
114
                )
115
            },
116
        )
117
    )
118
    energysystem.add(
119
        solph.components.Sink(
120
            label=("demand", "therm2"),
121
            inputs={
122
                bth2: solph.flows.Flow(
123
                    fix=data["demand_th"], nominal_capacity=741000
124
                )
125
            },
126
        )
127
    )
128
129
    # create a fixed converter to distribute to the heat_2 and elec_2 buses
130
    energysystem.add(
131
        solph.components.Converter(
132
            label=("fixed_chp", "gas"),
133
            inputs={bgas: solph.flows.Flow(nominal_capacity=1e11)},
134
            outputs={bel2: solph.flows.Flow(), bth2: solph.flows.Flow()},
135
            conversion_factors={bel2: 0.3, bth2: 0.5},
136
        )
137
    )
138
139
    # create a fixed converter to distribute to the heat and elec buses
140
    energysystem.add(
141
        solph.components.ExtractionTurbineCHP(
142
            label=("variable_chp", "gas"),
143
            inputs={bgas: solph.flows.Flow(nominal_capacity=1e11)},
144
            outputs={bel: solph.flows.Flow(), bth: solph.flows.Flow()},
145
            conversion_factors={bel: 0.3, bth: 0.5},
146
            conversion_factor_full_condensation={bel: 0.5},
147
        )
148
    )
149
150
    ##########################################################################
151
    # Optimise the energy system and plot the results
152
    ##########################################################################
153
154
    logging.info("Optimise the energy system")
155
156
    om = solph.Model(energysystem)
157
158
    logging.info("Solve the optimization problem")
159
    om.solve(solver=solver)
160
161
    optimisation_results = solph.processing.results(om)
162
    parameter = solph.processing.parameter_as_dict(energysystem)
163
164
    myresults = views.node(optimisation_results, "('natural', 'gas')")
165
    sumresults = myresults["sequences"].sum(axis=0)
166
    maxresults = myresults["sequences"].max(axis=0)
167
168
    variable_chp_dict_sum = {
169
        (("('natural', 'gas')", "('variable_chp', 'gas')"), "flow"): 2823024,
170
        (("('natural', 'gas')", "('fixed_chp', 'gas')"), "flow"): 3710208,
171
        (("('commodity', 'gas')", "('natural', 'gas')"), "flow"): 6533232,
172
    }
173
174
    variable_chp_dict_max = {
175
        (("('natural', 'gas')", "('variable_chp', 'gas')"), "flow"): 630332,
176
        (("('natural', 'gas')", "('fixed_chp', 'gas')"), "flow"): 785934,
177
        (("('commodity', 'gas')", "('natural', 'gas')"), "flow"): 1416266,
178
    }
179
180
    for key in variable_chp_dict_max.keys():
181
        logging.debug("Test the maximum value of {0}".format(key))
182
        assert maxresults[[key]].iloc[0] == pytest.approx(
183
            variable_chp_dict_max[key]
184
        )
185
186
    for key in variable_chp_dict_sum.keys():
187
        logging.debug("Test the summed up value of {0}".format(key))
188
        assert sumresults[[key]].iloc[0] == pytest.approx(
189
            variable_chp_dict_sum[key]
190
        )
191
192
    assert (
193
        parameter[(energysystem.groups["('fixed_chp', 'gas')"], None)][
194
            "scalars"
195
        ]["label"]
196
        == "('fixed_chp', 'gas')"
197
    )
198
    assert (
199
        parameter[(energysystem.groups["('fixed_chp', 'gas')"], None)][
200
            "scalars"
201
        ]["conversion_factors_('electricity', 2)"]
202
    ) == pytest.approx(0.3)
203
204
    # objective function
205
    assert solph.processing.meta_results(om)["objective"] == pytest.approx(
206
        326661590, abs=0.5
207
    )
208