OGS
CreateFlowAndTemperatureControl.cpp
Go to the documentation of this file.
1
12
13#include "BaseLib/Algorithm.h"
14#include "BaseLib/ConfigTree.h"
15#include "BuildingPowerCurves.h"
18
19namespace ProcessLib
20{
21namespace HeatTransportBHE
22{
23namespace BHE
24{
26 std::optional<BaseLib::ConfigTree> const& config,
27 std::map<std::string,
28 std::unique_ptr<MathLib::PiecewiseLinearInterpolation>> const&
29 curves)
30{
31 auto const& power_curve = *BaseLib::getOrError(
32 curves,
34 config->getConfigParameter<std::string>("power_curve"),
35 "Required power curve not found.");
36
37 auto const& cop_curve = *BaseLib::getOrError(
38 curves,
40 config->getConfigParameter<std::string>("cop_curve"),
41 "Required cop curve not found.");
42
43 return BuildingPowerCurves{power_curve, cop_curve};
44};
45
47 std::optional<BaseLib::ConfigTree> const& cooling_config,
48 std::map<std::string,
49 std::unique_ptr<MathLib::PiecewiseLinearInterpolation>> const&
50 curves)
51{
52 if (
53 cooling_config->getConfigParameter<bool>("active", false))
54 {
55 return createBuildingPowerCurvesStruct(cooling_config, curves);
56 }
57 else
58 {
59 return std::ref(*BaseLib::getOrError(
60 curves,
62 cooling_config->getConfigParameter<std::string>("power_curve"),
63 "Required cooling power curve not found."));
64 }
65};
66
68 std::optional<BuildingPowerCurves> const& heating,
69 std::optional<BuildingPowerCurves> const& hot_water,
70 std::optional<CoolingVariant> const& cooling,
71 MathLib::PiecewiseLinearInterpolation const& flow_rate_curve,
72 RefrigerantProperties const& refrigerant,
73 double const flow_rate_min,
74 double const power_min)
75{
76 if (std::holds_alternative<BuildingPowerCurves>(*cooling))
77 {
79 std::in_place_type<
81 *heating,
82 *hot_water,
83 std::get<BuildingPowerCurves>(*cooling),
84 flow_rate_curve,
85 refrigerant.specific_heat_capacity,
86 refrigerant.density,
87 flow_rate_min,
88 power_min};
89 }
90 else
91 {
93 std::in_place_type<
95 *heating,
96 *hot_water,
97 std::get<
98 std::reference_wrapper<MathLib::PiecewiseLinearInterpolation>>(
99 *cooling)
100 .get(),
101 flow_rate_curve,
102 refrigerant.specific_heat_capacity,
103 refrigerant.density,
104 flow_rate_min,
105 power_min};
106 }
107};
108
110 std::optional<BuildingPowerCurves> const& heating,
111 std::optional<BuildingPowerCurves> const& /*hot_water*/,
112 std::optional<CoolingVariant> const& cooling,
113 MathLib::PiecewiseLinearInterpolation const& flow_rate_curve,
114 RefrigerantProperties const& refrigerant,
115 double const flow_rate_min,
116 double const power_min)
117{
118 if (std::holds_alternative<BuildingPowerCurves>(*cooling))
119 {
121 std::in_place_type<BuildingPowerCurveActiveCoolingCurveFlowCurve>,
122 *heating,
123 std::get<BuildingPowerCurves>(*cooling),
124 flow_rate_curve,
125 refrigerant.specific_heat_capacity,
126 refrigerant.density,
127 flow_rate_min,
128 power_min};
129 }
130 else
131 {
133 std::in_place_type<BuildingPowerCurvePassiveCoolingCurveFlowCurve>,
134 *heating,
135 std::get<
136 std::reference_wrapper<MathLib::PiecewiseLinearInterpolation>>(
137 *cooling)
138 .get(),
139 flow_rate_curve,
140 refrigerant.specific_heat_capacity,
141 refrigerant.density,
142 flow_rate_min,
143 power_min};
144 }
145};
146
148 std::optional<BuildingPowerCurves> const& /*heating*/,
149 std::optional<BuildingPowerCurves> const& hot_water,
150 std::optional<CoolingVariant> const& cooling,
151 MathLib::PiecewiseLinearInterpolation const& flow_rate_curve,
152 RefrigerantProperties const& refrigerant,
153 double const flow_rate_min,
154 double const power_min)
155{
156 if (std::holds_alternative<BuildingPowerCurves>(*cooling))
157 {
159 std::in_place_type<BuildingPowerCurveActiveCoolingCurveFlowCurve>,
160 *hot_water,
161 std::get<BuildingPowerCurves>(*cooling),
162 flow_rate_curve,
163 refrigerant.specific_heat_capacity,
164 refrigerant.density,
165 flow_rate_min,
166 power_min};
167 }
168 else
169 {
171 std::in_place_type<BuildingPowerCurvePassiveCoolingCurveFlowCurve>,
172 *hot_water,
173 std::get<
174 std::reference_wrapper<MathLib::PiecewiseLinearInterpolation>>(
175 *cooling)
176 .get(),
177 flow_rate_curve,
178 refrigerant.specific_heat_capacity,
179 refrigerant.density,
180 flow_rate_min,
181 power_min};
182 }
183};
184
186 std::optional<BuildingPowerCurves> const& /*heating*/,
187 std::optional<BuildingPowerCurves> const& /*hot_water*/,
188 std::optional<CoolingVariant> const& cooling,
189 MathLib::PiecewiseLinearInterpolation const& flow_rate_curve,
190 RefrigerantProperties const& refrigerant,
191 double const flow_rate_min,
192 double const power_min)
193{
194 if (std::holds_alternative<BuildingPowerCurves>(*cooling))
195 {
197 std::in_place_type<ActiveCoolingCurveFlowCurve>,
198 std::get<BuildingPowerCurves>(*cooling),
199 flow_rate_curve,
200 refrigerant.specific_heat_capacity,
201 refrigerant.density,
202 flow_rate_min,
203 power_min};
204 }
205 else
206 {
208 std::in_place_type<PowerCurveFlowCurve>,
209 std::get<
210 std::reference_wrapper<MathLib::PiecewiseLinearInterpolation>>(
211 *cooling)
212 .get(),
213 flow_rate_curve,
214 refrigerant.specific_heat_capacity,
215 refrigerant.density,
216 flow_rate_min,
217 power_min};
218 }
219};
220
222 std::function<FlowAndTemperatureControl(
223 std::optional<BuildingPowerCurves>, // heating
224 std::optional<BuildingPowerCurves>, // hot water
225 std::optional<CoolingVariant>, // cooling
226 MathLib::PiecewiseLinearInterpolation const&, // flow rate curve
228 double const, // flow rate min
229 double const)>; // power min
230
231const std::map<std::tuple<bool, bool, bool>, // heating, hot_water,
232 // cooling
235 {{true, true, true}, &createHeatingHotWaterCooling},
236 {{true, true, false},
237 [](std::optional<BuildingPowerCurves> const& heating,
238 std::optional<BuildingPowerCurves> const& hot_water,
239 std::optional<CoolingVariant> const& /*cooling*/,
240 auto const& flow_rate_curve, auto const& refrigerant,
241 auto const flow_rate_min, auto const power_min)
242 {
244 std::in_place_type<BuildingPowerCurveHotWaterCurveFlowCurve>,
245 *heating,
246 *hot_water,
247 flow_rate_curve,
248 refrigerant.specific_heat_capacity,
249 refrigerant.density,
250 flow_rate_min,
251 power_min};
252 }},
253 {{true, false, true}, &createHeatingCooling},
254 {{false, true, true}, &createHotWaterCooling},
255 {{true, false, false},
256 [](std::optional<BuildingPowerCurves> const& heating,
257 std::optional<BuildingPowerCurves> const& /*hot_water*/,
258 std::optional<CoolingVariant> const& /*cooling*/,
259 auto const& flow_rate_curve, auto const& refrigerant,
260 auto const flow_rate_min, auto const power_min)
261 {
263 std::in_place_type<BuildingPowerCurveFlowCurve>,
264 *heating,
265 flow_rate_curve,
266 refrigerant.specific_heat_capacity,
267 refrigerant.density,
268 flow_rate_min,
269 power_min};
270 }},
271 {{false, true, false},
272 [](std::optional<BuildingPowerCurves> const& /*heating*/,
273 std::optional<BuildingPowerCurves> const& hot_water,
274 std::optional<CoolingVariant> const& /*cooling*/,
275 auto const& flow_rate_curve, auto const& refrigerant,
276 auto const flow_rate_min, auto const power_min)
277 {
279 std::in_place_type<BuildingPowerCurveFlowCurve>,
280 *hot_water,
281 flow_rate_curve,
282 refrigerant.specific_heat_capacity,
283 refrigerant.density,
284 flow_rate_min,
285 power_min};
286 }},
287 {{false, false, true}, &createCooling}};
288
290 std::optional<BaseLib::ConfigTree> const& heating_config,
291 std::optional<BaseLib::ConfigTree> const& hot_water_config,
292 std::optional<BaseLib::ConfigTree> const& cooling_config,
293 std::map<std::string,
294 std::unique_ptr<MathLib::PiecewiseLinearInterpolation>> const&
295 curves,
296 MathLib::PiecewiseLinearInterpolation const& flow_rate_curve,
297 RefrigerantProperties const& refrigerant,
298 double const flow_rate_min,
299 double const power_min)
300{
301 std::optional<BuildingPowerCurves> building_heating_curves;
302 std::optional<BuildingPowerCurves> building_hot_water_curves;
303 std::optional<CoolingVariant> building_cooling_curves;
304
305 bool heating = false;
306 bool hot_water = false;
307 bool cooling = false;
308
309 if (heating_config)
310 {
311 building_heating_curves.emplace(
312 createBuildingPowerCurvesStruct(heating_config, curves));
313 heating = true;
314 }
315 if (hot_water_config)
316 {
317 building_hot_water_curves.emplace(
318 createBuildingPowerCurvesStruct(hot_water_config, curves));
319 hot_water = true;
320 }
321 if (cooling_config)
322 {
323 building_cooling_curves.emplace(
324 createCoolingVariant(cooling_config, curves));
325 cooling = true;
326 }
327 auto key = std::make_tuple(heating, hot_water, cooling);
328
329 auto it = advancedBuildingPowerCurvesFlowCurve.find(key);
331 OGS_FATAL(
332 "AdvancedBuildingPowerCurvesFlowCurve combination is not "
333 "implemented.");
334 auto factory = it->second;
335
336 return factory(building_heating_curves,
337 building_hot_water_curves,
338 building_cooling_curves,
339 flow_rate_curve,
340 refrigerant,
341 flow_rate_min,
342 power_min);
343}
345 BaseLib::ConfigTree const& config,
346 std::map<std::string,
347 std::unique_ptr<MathLib::PiecewiseLinearInterpolation>> const&
348 curves,
349 RefrigerantProperties const& refrigerant)
350{
352 auto const type = config.getConfigParameter<std::string>("type");
353
354 auto const flow_rate_min =
356 config.getConfigParameter<double>("flow_rate_min", 1e-6);
358 auto const power_min = config.getConfigParameter<double>("power_min", 1e-3);
359 if (type == "TemperatureCurveConstantFlow")
360 {
362 auto const flow_rate = config.getConfigParameter<double>("flow_rate");
363
364 auto const& temperature_curve = *BaseLib::getOrError(
365 curves,
367 config.getConfigParameter<std::string>("temperature_curve"),
368 "Required temperature curve not found.");
369
370 return TemperatureCurveConstantFlow{flow_rate, temperature_curve,
371 flow_rate_min};
372 }
373 if (type == "TemperatureCurveFlowCurve")
374 {
375 auto const& flow_rate_curve = *BaseLib::getOrError(
376 curves,
378 config.getConfigParameter<std::string>("flow_rate_curve"),
379 "Required flow curve not found.");
380
381 auto const& temperature_curve = *BaseLib::getOrError(
382 curves,
384 config.getConfigParameter<std::string>("temperature_curve"),
385 "Required temperature curve not found.");
386
387 return TemperatureCurveFlowCurve{flow_rate_curve, temperature_curve,
388 flow_rate_min};
389 }
390 if (type == "FixedPowerConstantFlow")
391 {
393 auto const power = config.getConfigParameter<double>("power");
394
396 auto const flow_rate = config.getConfigParameter<double>("flow_rate");
397
398 return FixedPowerConstantFlow{flow_rate,
399 power,
400 refrigerant.specific_heat_capacity,
401 refrigerant.density,
402 flow_rate_min,
403 power_min};
404 }
405
406 if (type == "FixedPowerFlowCurve")
407 {
408 auto const& flow_rate_curve = *BaseLib::getOrError(
409 curves,
411 config.getConfigParameter<std::string>("flow_rate_curve"),
412 "Required flow rate curve not found.");
413
415 auto const power = config.getConfigParameter<double>("power");
416
417 return FixedPowerFlowCurve{flow_rate_curve,
418 power,
419 refrigerant.specific_heat_capacity,
420 refrigerant.density,
421 flow_rate_min,
422 power_min};
423 }
424
425 if (type == "PowerCurveConstantFlow")
426 {
427 auto const& power_curve = *BaseLib::getOrError(
428 curves,
430 config.getConfigParameter<std::string>("power_curve"),
431 "Required power curve not found.");
432
434 auto const flow_rate = config.getConfigParameter<double>("flow_rate");
435
436 return PowerCurveConstantFlow{power_curve,
437 flow_rate,
438 refrigerant.specific_heat_capacity,
439 refrigerant.density,
440 flow_rate_min,
441 power_min};
442 }
443
444 if (type == "PowerCurveFlowCurve")
445 {
446 auto const& power_curve = *BaseLib::getOrError(
447 curves,
449 config.getConfigParameter<std::string>("power_curve"),
450 "Required power curve not found.");
451
452 auto const& flow_rate_curve = *BaseLib::getOrError(
453 curves,
455 config.getConfigParameter<std::string>("flow_rate_curve"),
456 "Required flow rate curve not found.");
457
458 return PowerCurveFlowCurve{power_curve,
459 flow_rate_curve,
460 refrigerant.specific_heat_capacity,
461 refrigerant.density,
462 flow_rate_min,
463 power_min};
464 }
465
466 if (type == "AdvancedBuildingPowerCurvesFlowCurve")
467 {
468 // add a heating, hot water and cooling config as optional to handle
469 // different combinations later
470 auto const& heating_config =
473 "heating"); // Optional, take care if it is not present
474
475 // add a heating config to differ between different types
476 auto const& hot_water_config =
479 "hot_water"); // Optional, take care if it is not present
480
481 // add a heating config to differ between different types
482 auto const& cooling_config =
485 "cooling"); // Optional, take care if it is not present
486
487 auto const& flow_rate_curve = *BaseLib::getOrError(
488 curves,
490 config.getConfigParameter<std::string>("flow_rate_curve"),
491 "Required flow rate curve not found.");
492
493 return createAdvancedBuildingPowerCurvesFlowCurve(heating_config,
494 hot_water_config,
495 cooling_config,
496 curves,
497 flow_rate_curve,
498 refrigerant,
499 flow_rate_min,
500 power_min);
501 }
502 OGS_FATAL("FlowAndTemperatureControl type '{:s}' is not implemented.",
503 type);
504}
505} // namespace BHE
506} // namespace HeatTransportBHE
507} // namespace ProcessLib
#define OGS_FATAL(...)
Definition Error.h:26
Definition of the PiecewiseLinearInterpolation class.
std::optional< ConfigTree > getConfigSubtreeOptional(std::string const &root) const
T getConfigParameter(std::string const &param) const
OGS_NO_DANGLING Map::mapped_type & getOrError(Map &map, Key const &key, std::string const &error_message)
Definition Algorithm.h:118
const std::map< std::tuple< bool, bool, bool >, FactoryAdvancedBuildingCurvesFlowCurve > advancedBuildingPowerCurvesFlowCurve
FlowAndTemperatureControl createHotWaterCooling(std::optional< BuildingPowerCurves > const &, std::optional< BuildingPowerCurves > const &hot_water, std::optional< CoolingVariant > const &cooling, MathLib::PiecewiseLinearInterpolation const &flow_rate_curve, RefrigerantProperties const &refrigerant, double const flow_rate_min, double const power_min)
std::variant< TemperatureCurveConstantFlow, TemperatureCurveFlowCurve, FixedPowerConstantFlow, FixedPowerFlowCurve, PowerCurveConstantFlow, PowerCurveFlowCurve, BuildingPowerCurveConstantFlow, BuildingPowerCurveHotWaterCurveActiveCoolingCurveFlowCurve, BuildingPowerCurveHotWaterCurvePassiveCoolingCurveFlowCurve, BuildingPowerCurveHotWaterCurveFlowCurve, BuildingPowerCurveActiveCoolingCurveFlowCurve, BuildingPowerCurvePassiveCoolingCurveFlowCurve, BuildingPowerCurveFlowCurve, ActiveCoolingCurveFlowCurve > FlowAndTemperatureControl
FlowAndTemperatureControl createCooling(std::optional< BuildingPowerCurves > const &, std::optional< BuildingPowerCurves > const &, std::optional< CoolingVariant > const &cooling, MathLib::PiecewiseLinearInterpolation const &flow_rate_curve, RefrigerantProperties const &refrigerant, double const flow_rate_min, double const power_min)
FlowAndTemperatureControl createAdvancedBuildingPowerCurvesFlowCurve(std::optional< BaseLib::ConfigTree > const &heating_config, std::optional< BaseLib::ConfigTree > const &hot_water_config, std::optional< BaseLib::ConfigTree > const &cooling_config, std::map< std::string, std::unique_ptr< MathLib::PiecewiseLinearInterpolation > > const &curves, MathLib::PiecewiseLinearInterpolation const &flow_rate_curve, RefrigerantProperties const &refrigerant, double const flow_rate_min, double const power_min)
FlowAndTemperatureControl createFlowAndTemperatureControl(BaseLib::ConfigTree const &config, std::map< std::string, std::unique_ptr< MathLib::PiecewiseLinearInterpolation > > const &curves, RefrigerantProperties const &refrigerant)
std::function< FlowAndTemperatureControl( std::optional< BuildingPowerCurves >, std::optional< BuildingPowerCurves >, std::optional< CoolingVariant >, MathLib::PiecewiseLinearInterpolation const &, RefrigerantProperties const &, double const, double const)> FactoryAdvancedBuildingCurvesFlowCurve
FlowAndTemperatureControl createHeatingHotWaterCooling(std::optional< BuildingPowerCurves > const &heating, std::optional< BuildingPowerCurves > const &hot_water, std::optional< CoolingVariant > const &cooling, MathLib::PiecewiseLinearInterpolation const &flow_rate_curve, RefrigerantProperties const &refrigerant, double const flow_rate_min, double const power_min)
BuildingPowerCurves createBuildingPowerCurvesStruct(std::optional< BaseLib::ConfigTree > const &config, std::map< std::string, std::unique_ptr< MathLib::PiecewiseLinearInterpolation > > const &curves)
FlowAndTemperatureControl createHeatingCooling(std::optional< BuildingPowerCurves > const &heating, std::optional< BuildingPowerCurves > const &, std::optional< CoolingVariant > const &cooling, MathLib::PiecewiseLinearInterpolation const &flow_rate_curve, RefrigerantProperties const &refrigerant, double const flow_rate_min, double const power_min)
std::variant< BuildingPowerCurves, std::reference_wrapper< MathLib::PiecewiseLinearInterpolation > > CoolingVariant
CoolingVariant createCoolingVariant(std::optional< BaseLib::ConfigTree > const &cooling_config, std::map< std::string, std::unique_ptr< MathLib::PiecewiseLinearInterpolation > > const &curves)