OGS
CreateFlowAndTemperatureControl.cpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
5
6#include "BaseLib/Algorithm.h"
11
12namespace ProcessLib
13{
14namespace HeatTransportBHE
15{
16namespace BHE
17{
19 std::optional<BaseLib::ConfigTree> const& config,
20 std::map<std::string,
21 std::unique_ptr<MathLib::PiecewiseLinearInterpolation>> const&
22 curves)
23{
24 auto const& power_curve = *BaseLib::getOrError(
25 curves,
28 config->getConfigParameter<std::string>("power_curve"),
29 "Required power curve not found.");
30
31 auto const& cop_curve = *BaseLib::getOrError(
32 curves,
36 config->getConfigParameter<std::string>("cop_curve"),
37 "Required cop curve not found.");
38
39 return BuildingPowerCurves{power_curve, cop_curve};
40};
41
43 std::optional<BaseLib::ConfigTree> const& cooling_config,
44 std::map<std::string,
45 std::unique_ptr<MathLib::PiecewiseLinearInterpolation>> const&
46 curves)
47{
48 if (
49 cooling_config->getConfigParameter<bool>("active", false))
50 {
51 return createBuildingPowerCurvesStruct(cooling_config, curves);
52 }
53 else
54 {
55 return std::ref(*BaseLib::getOrError(
56 curves,
58 cooling_config->getConfigParameter<std::string>("power_curve"),
59 "Required cooling power curve not found."));
60 }
61};
62
64 std::optional<BuildingPowerCurves> const& heating,
65 std::optional<BuildingPowerCurves> const& hot_water,
66 std::optional<CoolingVariant> const& cooling,
67 MathLib::PiecewiseLinearInterpolation const& flow_rate_curve,
68 RefrigerantProperties const& refrigerant,
69 double const flow_rate_min,
70 double const power_min)
71{
72 if (std::holds_alternative<BuildingPowerCurves>(*cooling))
73 {
75 std::in_place_type<
77 *heating,
78 *hot_water,
79 std::get<BuildingPowerCurves>(*cooling),
80 flow_rate_curve,
81 refrigerant.specific_heat_capacity,
82 refrigerant.density,
83 flow_rate_min,
84 power_min};
85 }
86 else
87 {
89 std::in_place_type<
91 *heating,
92 *hot_water,
93 std::get<
94 std::reference_wrapper<MathLib::PiecewiseLinearInterpolation>>(
95 *cooling)
96 .get(),
97 flow_rate_curve,
98 refrigerant.specific_heat_capacity,
99 refrigerant.density,
100 flow_rate_min,
101 power_min};
102 }
103};
104
106 std::optional<BuildingPowerCurves> const& heating,
107 std::optional<BuildingPowerCurves> const& /*hot_water*/,
108 std::optional<CoolingVariant> const& cooling,
109 MathLib::PiecewiseLinearInterpolation const& flow_rate_curve,
110 RefrigerantProperties const& refrigerant,
111 double const flow_rate_min,
112 double const power_min)
113{
114 if (std::holds_alternative<BuildingPowerCurves>(*cooling))
115 {
117 std::in_place_type<BuildingPowerCurveActiveCoolingCurveFlowCurve>,
118 *heating,
119 std::get<BuildingPowerCurves>(*cooling),
120 flow_rate_curve,
121 refrigerant.specific_heat_capacity,
122 refrigerant.density,
123 flow_rate_min,
124 power_min};
125 }
126 else
127 {
129 std::in_place_type<BuildingPowerCurvePassiveCoolingCurveFlowCurve>,
130 *heating,
131 std::get<
132 std::reference_wrapper<MathLib::PiecewiseLinearInterpolation>>(
133 *cooling)
134 .get(),
135 flow_rate_curve,
136 refrigerant.specific_heat_capacity,
137 refrigerant.density,
138 flow_rate_min,
139 power_min};
140 }
141};
142
144 std::optional<BuildingPowerCurves> const& /*heating*/,
145 std::optional<BuildingPowerCurves> const& hot_water,
146 std::optional<CoolingVariant> const& cooling,
147 MathLib::PiecewiseLinearInterpolation const& flow_rate_curve,
148 RefrigerantProperties const& refrigerant,
149 double const flow_rate_min,
150 double const power_min)
151{
152 if (std::holds_alternative<BuildingPowerCurves>(*cooling))
153 {
155 std::in_place_type<BuildingPowerCurveActiveCoolingCurveFlowCurve>,
156 *hot_water,
157 std::get<BuildingPowerCurves>(*cooling),
158 flow_rate_curve,
159 refrigerant.specific_heat_capacity,
160 refrigerant.density,
161 flow_rate_min,
162 power_min};
163 }
164 else
165 {
167 std::in_place_type<BuildingPowerCurvePassiveCoolingCurveFlowCurve>,
168 *hot_water,
169 std::get<
170 std::reference_wrapper<MathLib::PiecewiseLinearInterpolation>>(
171 *cooling)
172 .get(),
173 flow_rate_curve,
174 refrigerant.specific_heat_capacity,
175 refrigerant.density,
176 flow_rate_min,
177 power_min};
178 }
179};
180
182 std::optional<BuildingPowerCurves> const& /*heating*/,
183 std::optional<BuildingPowerCurves> const& /*hot_water*/,
184 std::optional<CoolingVariant> const& cooling,
185 MathLib::PiecewiseLinearInterpolation const& flow_rate_curve,
186 RefrigerantProperties const& refrigerant,
187 double const flow_rate_min,
188 double const power_min)
189{
190 if (std::holds_alternative<BuildingPowerCurves>(*cooling))
191 {
193 std::in_place_type<ActiveCoolingCurveFlowCurve>,
194 std::get<BuildingPowerCurves>(*cooling),
195 flow_rate_curve,
196 refrigerant.specific_heat_capacity,
197 refrigerant.density,
198 flow_rate_min,
199 power_min};
200 }
201 else
202 {
204 std::in_place_type<PowerCurveFlowCurve>,
205 std::get<
206 std::reference_wrapper<MathLib::PiecewiseLinearInterpolation>>(
207 *cooling)
208 .get(),
209 flow_rate_curve,
210 refrigerant.specific_heat_capacity,
211 refrigerant.density,
212 flow_rate_min,
213 power_min};
214 }
215};
216
218 std::function<FlowAndTemperatureControl(
219 std::optional<BuildingPowerCurves>, // heating
220 std::optional<BuildingPowerCurves>, // hot water
221 std::optional<CoolingVariant>, // cooling
222 MathLib::PiecewiseLinearInterpolation const&, // flow rate curve
224 double const, // flow rate min
225 double const)>; // power min
226
227const std::map<std::tuple<bool, bool, bool>, // heating, hot_water,
228 // cooling
231 {{true, true, true}, &createHeatingHotWaterCooling},
232 {{true, true, false},
233 [](std::optional<BuildingPowerCurves> const& heating,
234 std::optional<BuildingPowerCurves> const& hot_water,
235 std::optional<CoolingVariant> const& /*cooling*/,
236 auto const& flow_rate_curve, auto const& refrigerant,
237 auto const flow_rate_min, auto const power_min)
238 {
240 std::in_place_type<BuildingPowerCurveHotWaterCurveFlowCurve>,
241 *heating,
242 *hot_water,
243 flow_rate_curve,
244 refrigerant.specific_heat_capacity,
245 refrigerant.density,
246 flow_rate_min,
247 power_min};
248 }},
249 {{true, false, true}, &createHeatingCooling},
250 {{false, true, true}, &createHotWaterCooling},
251 {{true, false, false},
252 [](std::optional<BuildingPowerCurves> const& heating,
253 std::optional<BuildingPowerCurves> const& /*hot_water*/,
254 std::optional<CoolingVariant> const& /*cooling*/,
255 auto const& flow_rate_curve, auto const& refrigerant,
256 auto const flow_rate_min, auto const power_min)
257 {
259 std::in_place_type<BuildingPowerCurveFlowCurve>,
260 *heating,
261 flow_rate_curve,
262 refrigerant.specific_heat_capacity,
263 refrigerant.density,
264 flow_rate_min,
265 power_min};
266 }},
267 {{false, true, false},
268 [](std::optional<BuildingPowerCurves> const& /*heating*/,
269 std::optional<BuildingPowerCurves> const& hot_water,
270 std::optional<CoolingVariant> const& /*cooling*/,
271 auto const& flow_rate_curve, auto const& refrigerant,
272 auto const flow_rate_min, auto const power_min)
273 {
275 std::in_place_type<BuildingPowerCurveFlowCurve>,
276 *hot_water,
277 flow_rate_curve,
278 refrigerant.specific_heat_capacity,
279 refrigerant.density,
280 flow_rate_min,
281 power_min};
282 }},
283 {{false, false, true}, &createCooling}};
284
286 std::optional<BaseLib::ConfigTree> const& heating_config,
287 std::optional<BaseLib::ConfigTree> const& hot_water_config,
288 std::optional<BaseLib::ConfigTree> const& cooling_config,
289 std::map<std::string,
290 std::unique_ptr<MathLib::PiecewiseLinearInterpolation>> const&
291 curves,
292 MathLib::PiecewiseLinearInterpolation const& flow_rate_curve,
293 RefrigerantProperties const& refrigerant,
294 double const flow_rate_min,
295 double const power_min)
296{
297 std::optional<BuildingPowerCurves> building_heating_curves;
298 std::optional<BuildingPowerCurves> building_hot_water_curves;
299 std::optional<CoolingVariant> building_cooling_curves;
300
301 bool heating = false;
302 bool hot_water = false;
303 bool cooling = false;
304
305 if (heating_config)
306 {
307 building_heating_curves.emplace(
308 createBuildingPowerCurvesStruct(heating_config, curves));
309 heating = true;
310 }
311 if (hot_water_config)
312 {
313 building_hot_water_curves.emplace(
314 createBuildingPowerCurvesStruct(hot_water_config, curves));
315 hot_water = true;
316 }
317 if (cooling_config)
318 {
319 building_cooling_curves.emplace(
320 createCoolingVariant(cooling_config, curves));
321 cooling = true;
322 }
323 auto key = std::make_tuple(heating, hot_water, cooling);
324
325 auto it = advancedBuildingPowerCurvesFlowCurve.find(key);
327 OGS_FATAL(
328 "AdvancedBuildingPowerCurvesFlowCurve combination is not "
329 "implemented.");
330 auto factory = it->second;
331
332 return factory(building_heating_curves,
333 building_hot_water_curves,
334 building_cooling_curves,
335 flow_rate_curve,
336 refrigerant,
337 flow_rate_min,
338 power_min);
339}
341 BaseLib::ConfigTree const& config,
342 std::map<std::string,
343 std::unique_ptr<MathLib::PiecewiseLinearInterpolation>> const&
344 curves,
345 RefrigerantProperties const& refrigerant)
346{
348 auto const type = config.getConfigParameter<std::string>("type");
349
350 auto const flow_rate_min =
352 config.getConfigParameter<double>("flow_rate_min", 1e-6);
354 auto const power_min = config.getConfigParameter<double>("power_min", 1e-3);
355 if (type == "TemperatureCurveConstantFlow")
356 {
358 auto const flow_rate = config.getConfigParameter<double>("flow_rate");
359
360 auto const& temperature_curve = *BaseLib::getOrError(
361 curves,
363 config.getConfigParameter<std::string>("temperature_curve"),
364 "Required temperature curve not found.");
365
366 return TemperatureCurveConstantFlow{flow_rate, temperature_curve,
367 flow_rate_min};
368 }
369 if (type == "TemperatureCurveFlowCurve")
370 {
371 auto const& flow_rate_curve = *BaseLib::getOrError(
372 curves,
374 config.getConfigParameter<std::string>("flow_rate_curve"),
375 "Required flow curve not found.");
376
377 auto const& temperature_curve = *BaseLib::getOrError(
378 curves,
380 config.getConfigParameter<std::string>("temperature_curve"),
381 "Required temperature curve not found.");
382
383 return TemperatureCurveFlowCurve{flow_rate_curve, temperature_curve,
384 flow_rate_min};
385 }
386 if (type == "FixedPowerConstantFlow")
387 {
389 auto const power = config.getConfigParameter<double>("power");
390
392 auto const flow_rate = config.getConfigParameter<double>("flow_rate");
393
394 return FixedPowerConstantFlow{flow_rate,
395 power,
396 refrigerant.specific_heat_capacity,
397 refrigerant.density,
398 flow_rate_min,
399 power_min};
400 }
401
402 if (type == "FixedPowerFlowCurve")
403 {
404 auto const& flow_rate_curve = *BaseLib::getOrError(
405 curves,
407 config.getConfigParameter<std::string>("flow_rate_curve"),
408 "Required flow rate curve not found.");
409
411 auto const power = config.getConfigParameter<double>("power");
412
413 return FixedPowerFlowCurve{flow_rate_curve,
414 power,
415 refrigerant.specific_heat_capacity,
416 refrigerant.density,
417 flow_rate_min,
418 power_min};
419 }
420
421 if (type == "PowerCurveConstantFlow")
422 {
423 auto const& power_curve = *BaseLib::getOrError(
424 curves,
426 config.getConfigParameter<std::string>("power_curve"),
427 "Required power curve not found.");
428
430 auto const flow_rate = config.getConfigParameter<double>("flow_rate");
431
432 return PowerCurveConstantFlow{power_curve,
433 flow_rate,
434 refrigerant.specific_heat_capacity,
435 refrigerant.density,
436 flow_rate_min,
437 power_min};
438 }
439
440 if (type == "PowerCurveFlowCurve")
441 {
442 auto const& power_curve = *BaseLib::getOrError(
443 curves,
445 config.getConfigParameter<std::string>("power_curve"),
446 "Required power curve not found.");
447
448 auto const& flow_rate_curve = *BaseLib::getOrError(
449 curves,
451 config.getConfigParameter<std::string>("flow_rate_curve"),
452 "Required flow rate curve not found.");
453
454 return PowerCurveFlowCurve{power_curve,
455 flow_rate_curve,
456 refrigerant.specific_heat_capacity,
457 refrigerant.density,
458 flow_rate_min,
459 power_min};
460 }
461
462 if (type == "BuildingPowerCurveConstantFlow")
463 {
464 auto const& power_curve = *BaseLib::getOrError(
465 curves,
467 config.getConfigParameter<std::string>("power_curve"),
468 "Required power curve not found.");
469
470 auto const& cop_heating_curve = *BaseLib::getOrError(
471 curves,
473 config.getConfigParameter<std::string>("cop_heating_curve"),
474 "Required power curve not found.");
475
476 BuildingPowerCurves const building_power_curves{power_curve,
477 cop_heating_curve};
478
480 auto const flow_rate = config.getConfigParameter<double>("flow_rate");
481
483 building_power_curves,
484 flow_rate,
485 refrigerant.specific_heat_capacity,
486 refrigerant.density,
487 flow_rate_min,
488 power_min};
489 }
490
491 if (type == "AdvancedBuildingPowerCurvesFlowCurve")
492 {
493 // add a heating, hot water and cooling config as optional to handle
494 // different combinations later
495 auto const& heating_config =
498 "heating"); // Optional, take care if it is not present
499
500 // add a heating config to differ between different types
501 auto const& hot_water_config =
504 "hot_water"); // Optional, take care if it is not present
505
506 // add a heating config to differ between different types
507 auto const& cooling_config =
510 "cooling"); // Optional, take care if it is not present
511
512 auto const& flow_rate_curve = *BaseLib::getOrError(
513 curves,
515 config.getConfigParameter<std::string>("flow_rate_curve"),
516 "Required flow rate curve not found.");
517
518 return createAdvancedBuildingPowerCurvesFlowCurve(heating_config,
519 hot_water_config,
520 cooling_config,
521 curves,
522 flow_rate_curve,
523 refrigerant,
524 flow_rate_min,
525 power_min);
526 }
527 OGS_FATAL("FlowAndTemperatureControl type '{:s}' is not implemented.",
528 type);
529}
530} // namespace BHE
531} // namespace HeatTransportBHE
532} // namespace ProcessLib
#define OGS_FATAL(...)
Definition Error.h:19
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:111
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)