Coverage for bim2sim/plugins/PluginOpenFOAM/bim2sim_openfoam/task/set_boundary_conditions.py: 0%
444 statements
« prev ^ index » next coverage.py v7.10.7, created at 2025-10-01 10:24 +0000
« prev ^ index » next coverage.py v7.10.7, created at 2025-10-01 10:24 +0000
1from collections import OrderedDict
3import pandas as pd
5from bim2sim.elements.mapping.units import ureg
6from bim2sim.plugins.PluginEnergyPlus.bim2sim_energyplus.utils import \
7 PostprocessingUtils
8from bim2sim.plugins.PluginOpenFOAM.bim2sim_openfoam.openfoam_elements.openfoam_base_boundary_conditions import \
9 OpenFOAMBaseBoundaryFields
10from bim2sim.plugins.PluginOpenFOAM.bim2sim_openfoam.utils.openfoam_utils import \
11 OpenFOAMUtils as of_utils
12from bim2sim.tasks.base import ITask
13from bim2sim.utilities.common_functions import filter_elements
14from butterfly import boundaryRadiationProperties, alphat, aoa, \
15 g_radiation, idefault, k, nut, omega, p, p_rgh, qr, T, U, foamfile
18class SetOpenFOAMBoundaryConditions(ITask):
19 """This ITask initializes the OpenFOAM Setup.
20 """
22 reads = ('openfoam_elements', 'openfoam_case')
23 touches = ('openfoam_case', 'openfoam_elements')
25 def __init__(self, playground):
26 super().__init__(playground)
27 self.default_surface_names = ['Back', 'Bottom', 'Front', 'Top', 'Left',
28 'Right']
30 def run(self, openfoam_elements, openfoam_case):
31 self.assign_ep_results(
32 openfoam_elements, openfoam_case,
33 add_floor_heating=self.playground.sim_settings.add_floorheating)
34 self.init_boundary_conditions(openfoam_case, openfoam_elements)
35 self.add_fvOptions_for_heating(openfoam_case, openfoam_elements)
37 return openfoam_case, openfoam_elements
39 def assign_ep_results(self, openfoam_elements, openfoam_case,
40 add_floor_heating=False):
41 stl_bounds = filter_elements(openfoam_elements, 'StlBound')
42 timestep_df = openfoam_case.timestep_df
43 openfoam_case.current_zone.zone_heat_conduction = 0
44 openfoam_case.current_zone.air_temp = timestep_df[
45 openfoam_case.current_zone.guid.upper() +
46 ':' + (
47 'Zone Mean Air Temperature [C]('
48 'Hourly)')] + 273.15
49 for bound in stl_bounds:
50 bound.read_boundary_conditions(timestep_df, openfoam_case.current_zone.air_temp)
51 openfoam_case.current_zone.zone_heat_conduction += (
52 bound.bound_area * bound.heat_flux)
53 # todo: add gains from solar radiation
54 # compute internal gains
55 people = filter_elements(openfoam_elements, 'People')
56 # todo: add other internal gains from equipment etc.
57 openfoam_case.internal_gains = 0
58 for peo in people:
59 openfoam_case.internal_gains += peo.power
60 openfoam_case.required_heating_power = (
61 openfoam_case.current_zone.zone_heat_conduction)
62 if self.playground.sim_settings.level_heat_balance:
63 openfoam_case.required_heating_power += openfoam_case.internal_gains
64 # todo: consider radiation from windows once implemented
65 if openfoam_case.required_heating_power > 0:
66 openfoam_case.required_cooling_power = (
67 openfoam_case.required_heating_power)
68 openfoam_case.required_heating_power = 0
69 self.logger.warning(f'Heat balance cannot be leveled. Internal '
70 f'gains are higher than the heating '
71 f'demand. Required heating power is set to '
72 f'zero, cooling power is required of '
73 f'{openfoam_case.required_cooling_power}W.'
74 f'The the room may heat up '
75 f'eventually due to high internal gains '
76 f'if no air conditioning system is '
77 f'available.')
78 if add_floor_heating:
79 total_floor_area = 0
80 for bound in stl_bounds:
81 # reduce calculated floor heating by floor heat losses
82 # self.current_zone.floor_heating_qr = \
83 # (timestep_df[(f"{self.current_zone.guid.upper()} IDEAL LOADS AIR SYSTEM:Zone "
84 # f"Ideal Loads Zone Total Heating Rate [W](Hourly)")] /
85 # self.current_zone.net_area.m)
86 # todo: only works for spaces with a single floor surface
87 if any(s in bound.bound_element_type for s in ['Floor',
88 'GroundFloor']):
89 total_floor_area += bound.bound_area
90 openfoam_case.current_zone.abs_floor_heating_qr = \
91 abs(openfoam_case.required_heating_power /
92 total_floor_area)
93 for bound in stl_bounds:
94 if any(s in bound.bound_element_type for s in ['Floor',
95 'GroundFloor']):
96 bound.temperature_org = bound.temperature
97 bound.heat_flux_org = bound.heat_flux
98 bound.temperature = 30
99 # previous heat flux of the boundary has to be neglegted.
100 # the previous bound heat flux needs to be added to the
101 # total floor heating heat flux.
102 bound.heat_flux = abs(
103 openfoam_case.current_zone.abs_floor_heating_qr +
104 bound.heat_flux)
106 def init_boundary_conditions(self, openfoam_case, openfoam_elements):
107 stl_bounds, heaters, air_terminals, furniture, people = \
108 of_utils.split_openfoam_elements(openfoam_elements)
109 for bound in stl_bounds:
110 bound.set_boundary_conditions(
111 no_heatloss=self.playground.sim_settings.ignore_heatloss)
112 for heater in heaters:
113 heating_power_each = (abs(openfoam_case.required_heating_power) /
114 len(heaters))
115 # if openfoam_case.radiation_model == 'noRadiation':
116 # heater_radiation = 0
117 # else:
118 if self.playground.sim_settings.heater_radiation < 1e-4:
119 heater_radiation = 0
120 else:
121 heater_radiation = self.playground.sim_settings.heater_radiation
122 heater.set_boundary_conditions(
123 heating_power_each, heater_radiation)
124 vol_per_inlet = 0
125 vol_per_outlet = 0
126 # calculate volumetric flow rate in l/s according to
127 # DIN EN 16798-1:2022-03, Table B.6/B.7 + Table NA.6/NA.7
128 # building with high emissions, air quality cat 1: 2 l/s/m2
129 # building with low emissions, air quality cat 2: 0.7 l/s/m2
130 # building with very low emissions, air quality cat 2: 0.35 l/s/m2
131 # volumetric flow per person, air quality cat 2: 7 l/s/person
132 total_volumetric_flow_l_per_s = (openfoam_case.floor_area * 2.0 + 7 *
133 len(people))
134 dt_cooling = 0
135 num_inlets = len(
136 [i for i in air_terminals if 'INLET' in i.air_type.upper()])
137 if num_inlets > 0:
138 vol_per_inlet = total_volumetric_flow_l_per_s / num_inlets
139 cooling_power_each = (abs(
140 openfoam_case.required_cooling_power)/num_inlets) * ureg.watt
141 dt_cooling = cooling_power_each / (1004.5 * (ureg.joule)/(ureg.kg*ureg.kelvin) *
142 1.204*(ureg.kg/ureg.meter**3) *
143 vol_per_inlet *(ureg.l/ureg.s))
144 dt_cooling = dt_cooling.to(ureg.kelvin).m
145 self.logger.info(f"Required delta temperature of {dt_cooling}K is "
146 f"set for each inlet.")
147 if dt_cooling > 6:
148 self.logger.warning(f"The required delta temperature of "
149 f"{dt_cooling}K is {dt_cooling-6}K larger "
150 f"than a comfortable limit for delta "
151 f"temperature of 6K. To avoid local "
152 f"discomfort, please increase the airflow "
153 f"and the number of air inlets.")
154 num_outlets = len(
155 [i for i in air_terminals if 'OUTLET' in i.air_type.upper()])
156 if num_outlets > 0:
157 vol_per_outlet = total_volumetric_flow_l_per_s / num_outlets
158 for air_terminal in air_terminals:
159 if 'INLET' in air_terminal.air_type.upper():
160 volumetric_flow_l_per_s = vol_per_inlet
161 applicable_delta = dt_cooling
162 else:
163 volumetric_flow_l_per_s = vol_per_outlet
164 applicable_delta = 0
165 air_terminal.set_boundary_conditions(
166 openfoam_case.current_zone.air_temp - applicable_delta,
167 volumetric_flow_l_per_s)
168 for furn in furniture:
169 furn.set_boundary_conditions()
170 for person in people:
171 person.set_boundary_conditions()
172 for body_part in person.body_parts_dict.values():
173 body_part.set_boundary_conditions()
174 if people:
175 # export person dataframe for documentation of surface
176 # temperatures and surface area.
177 person_df = pd.DataFrame(
178 [[key,
179 part.area,
180 part.temperature,
181 part.hr_hc,
182 part.heat_flux,
183 part.area * part.heat_flux]
184 for key, part in people[0].body_parts_dict.items()],
185 columns=['PartName', 'Area', 'Temperature', 'hr_hc',
186 'HeatFlux', 'Power'])
187 person_df.to_csv(
188 openfoam_case.openfoam_dir / str(people[0].solid_name + '.csv'))
190 # todo: move initial boundary condition settings to OpenFOAM element
191 # classes.
192 self.create_alphat(openfoam_case, openfoam_elements)
193 self.create_AoA(openfoam_case, openfoam_elements)
194 self.create_G(openfoam_case, openfoam_elements)
195 self.create_IDefault(openfoam_case, openfoam_elements)
196 self.create_k(openfoam_case, openfoam_elements)
197 self.create_nut(openfoam_case, openfoam_elements)
198 self.create_omega(openfoam_case, openfoam_elements)
199 self.create_p(openfoam_case, openfoam_elements)
200 self.create_p_rgh(openfoam_case, openfoam_elements)
201 self.create_qr(openfoam_case, openfoam_elements)
202 self.create_T(openfoam_case, openfoam_elements)
203 self.create_U(openfoam_case, openfoam_elements)
204 self.create_boundaryRadiationProperties(openfoam_case,
205 openfoam_elements)
207 @staticmethod
208 def create_alphat(openfoam_case, openfoam_elements):
209 stl_bounds, heaters, air_terminals, furniture, people = \
210 of_utils.split_openfoam_elements(openfoam_elements)
211 openfoam_case.alphat = alphat.Alphat()
212 openfoam_case.alphat.values['boundaryField'] = {}
213 openfoam_case.alphat.values['dimensions'] = '[1 -1 -1 0 0 0 0]'
214 for bound in stl_bounds:
215 openfoam_case.alphat.values['boundaryField'].update(
216 {bound.solid_name: bound.alphat})
218 for heater in heaters:
219 # openfoam_case.alphat.values['boundaryField'].update(
220 # {heater.porous_media.solid_name: heater.porous_media.alphat})
221 openfoam_case.alphat.values['boundaryField'].update(
222 {
223 heater.heater_surface.solid_name: heater.heater_surface.alphat})
224 for air_terminal in air_terminals:
225 if air_terminal.diffuser.solid_name:
226 openfoam_case.alphat.values['boundaryField'].update(
227 {air_terminal.diffuser.solid_name: air_terminal.diffuser.alphat})
228 if air_terminal.source_sink.solid_name:
229 openfoam_case.alphat.values['boundaryField'].update(
230 {air_terminal.source_sink.solid_name:
231 air_terminal.source_sink.alphat})
232 if air_terminal.box.solid_name:
233 openfoam_case.alphat.values['boundaryField'].update(
234 {air_terminal.box.solid_name: air_terminal.box.alphat})
235 for furn in furniture:
236 openfoam_case.alphat.values['boundaryField'].update(
237 {furn.solid_name: furn.alphat})
238 for person in people:
239 for body_part in person.body_parts_dict.values():
240 openfoam_case.alphat.values['boundaryField'].update(
241 {body_part.solid_name: body_part.alphat})
242 default_name_list = openfoam_case.default_surface_names
243 for name in default_name_list:
244 openfoam_case.alphat.values['boundaryField'].update(
245 {name: OpenFOAMBaseBoundaryFields().alphat
246 })
248 openfoam_case.alphat.save(openfoam_case.openfoam_dir)
250 @staticmethod
251 def create_AoA(openfoam_case, openfoam_elements):
252 stl_bounds, heaters, air_terminals, furniture, people = \
253 of_utils.split_openfoam_elements(openfoam_elements)
254 openfoam_case.aoa = aoa.AoA()
255 openfoam_case.aoa.values['boundaryField'] = {}
256 for bound in stl_bounds:
257 openfoam_case.aoa.values['boundaryField'].update(
258 {bound.solid_name: bound.aoa})
259 for heater in heaters:
260 # openfoam_case.aoa.values['boundaryField'].update(
261 # {heater.porous_media.solid_name: heater.porous_media.aoa})
262 openfoam_case.aoa.values['boundaryField'].update(
263 {heater.heater_surface.solid_name: heater.heater_surface.aoa})
264 for air_terminal in air_terminals:
265 if air_terminal.diffuser.solid_name:
266 openfoam_case.aoa.values['boundaryField'].update(
267 {air_terminal.diffuser.solid_name: air_terminal.diffuser.aoa})
268 if air_terminal.source_sink.solid_name:
269 openfoam_case.aoa.values['boundaryField'].update(
270 {air_terminal.source_sink.solid_name:
271 air_terminal.source_sink.aoa})
272 if air_terminal.box.solid_name:
273 openfoam_case.aoa.values['boundaryField'].update({
274 air_terminal.box.solid_name: air_terminal.box.aoa
275 })
276 for furn in furniture:
277 openfoam_case.aoa.values['boundaryField'].update(
278 {furn.solid_name: furn.aoa})
279 for person in people:
280 for body_part in person.body_parts_dict.values():
281 openfoam_case.aoa.values['boundaryField'].update(
282 {body_part.solid_name: body_part.aoa})
283 default_name_list = openfoam_case.default_surface_names
284 for name in default_name_list:
285 openfoam_case.aoa.values['boundaryField'].update(
286 {name: OpenFOAMBaseBoundaryFields().aoa}
287 )
288 openfoam_case.aoa.save(openfoam_case.openfoam_dir)
290 @staticmethod
291 def create_G(openfoam_case, openfoam_elements):
292 stl_bounds, heaters, air_terminals, furniture, people = \
293 of_utils.split_openfoam_elements(openfoam_elements)
294 openfoam_case.g_radiation = g_radiation.G_radiation()
295 openfoam_case.g_radiation.values['boundaryField'] = {}
297 for bound in stl_bounds:
298 openfoam_case.g_radiation.values['boundaryField'].update(
299 {bound.solid_name: bound.g_radiation})
300 for heater in heaters:
301 # openfoam_case.g_radiation.values['boundaryField'].update(
302 # {heater.porous_media.solid_name:
303 # heater.porous_media.g_radiation})
304 openfoam_case.g_radiation.values['boundaryField'].update(
305 {heater.heater_surface.solid_name:
306 heater.heater_surface.g_radiation})
307 for air_terminal in air_terminals:
308 if air_terminal.diffuser.solid_name:
309 openfoam_case.g_radiation.values['boundaryField'].update(
310 {air_terminal.diffuser.solid_name: air_terminal.diffuser.g_radiation})
311 if air_terminal.source_sink.solid_name:
312 openfoam_case.g_radiation.values['boundaryField'].update(
313 {air_terminal.source_sink.solid_name:
314 air_terminal.source_sink.g_radiation})
315 if air_terminal.box.solid_name:
316 openfoam_case.g_radiation.values['boundaryField'].update(
317 {air_terminal.box.solid_name: air_terminal.box.g_radiation
318 })
319 for furn in furniture:
320 openfoam_case.g_radiation.values['boundaryField'].update(
321 {furn.solid_name: furn.g_radiation})
322 for person in people:
323 for body_part in person.body_parts_dict.values():
324 openfoam_case.g_radiation.values['boundaryField'].update(
325 {body_part.solid_name: body_part.g_radiation})
326 default_name_list = openfoam_case.default_surface_names
327 for name in default_name_list:
328 openfoam_case.g_radiation.values['boundaryField'].update(
329 {name: OpenFOAMBaseBoundaryFields().g_radiation})
330 openfoam_case.g_radiation.save(openfoam_case.openfoam_dir)
332 @staticmethod
333 def create_IDefault(openfoam_case, openfoam_elements):
334 stl_bounds, heaters, air_terminals, furniture, people = \
335 of_utils.split_openfoam_elements(openfoam_elements)
336 openfoam_case.idefault = idefault.IDefault()
337 openfoam_case.idefault.values['boundaryField'] = {}
339 for bound in stl_bounds:
340 openfoam_case.idefault.values['boundaryField'].update(
341 {bound.solid_name: bound.idefault})
342 for heater in heaters:
343 # openfoam_case.idefault.values['boundaryField'].update(
344 # {heater.porous_media.solid_name:
345 # heater.porous_media.idefault})
346 openfoam_case.idefault.values['boundaryField'].update(
347 {heater.heater_surface.solid_name:
348 heater.heater_surface.idefault})
349 for air_terminal in air_terminals:
350 if air_terminal.diffuser.solid_name:
351 openfoam_case.idefault.values['boundaryField'].update({
352 air_terminal.diffuser.solid_name: air_terminal.diffuser.idefault})
353 if air_terminal.source_sink.solid_name:
354 openfoam_case.idefault.values['boundaryField'].update({
355 air_terminal.source_sink.solid_name:
356 air_terminal.source_sink.idefault})
357 if air_terminal.box.solid_name:
358 openfoam_case.idefault.values['boundaryField'].update({
359 air_terminal.box.solid_name: air_terminal.box.idefault
360 })
361 for furn in furniture:
362 openfoam_case.idefault.values['boundaryField'].update(
363 {furn.solid_name: furn.idefault})
364 for person in people:
365 for body_part in person.body_parts_dict.values():
366 openfoam_case.idefault.values['boundaryField'].update(
367 {body_part.solid_name: body_part.idefault})
368 default_name_list = openfoam_case.default_surface_names
369 for name in default_name_list:
370 openfoam_case.idefault.values['boundaryField'].update(
371 {name: OpenFOAMBaseBoundaryFields().idefault})
372 openfoam_case.idefault.save(openfoam_case.openfoam_dir)
374 @staticmethod
375 def create_k(openfoam_case, openfoam_elements):
376 stl_bounds, heaters, air_terminals, furniture, people = \
377 of_utils.split_openfoam_elements(openfoam_elements)
378 openfoam_case.k = k.K()
379 openfoam_case.k.values['boundaryField'] = {}
381 for bound in stl_bounds:
382 openfoam_case.k.values['boundaryField'].update(
383 {bound.solid_name: bound.k})
384 for heater in heaters:
385 # openfoam_case.k.values['boundaryField'].update(
386 # {heater.porous_media.solid_name:
387 # heater.porous_media.k})
388 openfoam_case.k.values['boundaryField'].update(
389 {heater.heater_surface.solid_name:
390 heater.heater_surface.k})
391 for air_terminal in air_terminals:
392 if air_terminal.diffuser.solid_name:
393 openfoam_case.k.values['boundaryField'].update(
394 {air_terminal.diffuser.solid_name: air_terminal.diffuser.k})
395 if air_terminal.source_sink.solid_name:
396 openfoam_case.k.values['boundaryField'].update({
397 air_terminal.source_sink.solid_name:
398 air_terminal.source_sink.k})
399 if air_terminal.box.solid_name:
400 openfoam_case.k.values['boundaryField'].update({
401 air_terminal.box.solid_name: air_terminal.box.k
402 })
403 for furn in furniture:
404 openfoam_case.k.values['boundaryField'].update(
405 {furn.solid_name: furn.k})
406 for person in people:
407 for body_part in person.body_parts_dict.values():
408 openfoam_case.k.values['boundaryField'].update(
409 {body_part.solid_name: body_part.k})
410 default_name_list = openfoam_case.default_surface_names
411 for name in default_name_list:
412 openfoam_case.k.values['boundaryField'].update(
413 {name: OpenFOAMBaseBoundaryFields().k})
414 openfoam_case.k.save(openfoam_case.openfoam_dir)
416 @staticmethod
417 def create_nut(openfoam_case, openfoam_elements):
418 stl_bounds, heaters, air_terminals, furniture, people = \
419 of_utils.split_openfoam_elements(openfoam_elements)
420 openfoam_case.nut = nut.Nut()
421 openfoam_case.nut.values['boundaryField'] = {}
423 for bound in stl_bounds:
424 openfoam_case.nut.values['boundaryField'].update(
425 {bound.solid_name: bound.nut})
426 for heater in heaters:
427 # openfoam_case.nut.values['boundaryField'].update(
428 # {heater.porous_media.solid_name:
429 # heater.porous_media.nut})
430 openfoam_case.nut.values['boundaryField'].update(
431 {heater.heater_surface.solid_name:
432 heater.heater_surface.nut})
433 for air_terminal in air_terminals:
434 if air_terminal.diffuser.solid_name:
435 openfoam_case.nut.values['boundaryField'].update(
436 {air_terminal.diffuser.solid_name: air_terminal.diffuser.nut})
437 if air_terminal.source_sink.solid_name:
438 openfoam_case.nut.values['boundaryField'].update({
439 air_terminal.source_sink.solid_name:
440 air_terminal.source_sink.nut})
441 if air_terminal.box.solid_name:
442 openfoam_case.nut.values['boundaryField'].update({
443 air_terminal.box.solid_name: air_terminal.box.nut
444 })
445 for furn in furniture:
446 openfoam_case.nut.values['boundaryField'].update(
447 {furn.solid_name: furn.nut})
448 for person in people:
449 for body_part in person.body_parts_dict.values():
450 openfoam_case.nut.values['boundaryField'].update(
451 {body_part.solid_name: body_part.nut})
452 default_name_list = openfoam_case.default_surface_names
453 for name in default_name_list:
454 openfoam_case.nut.values['boundaryField'].update(
455 {name: OpenFOAMBaseBoundaryFields().nut})
456 openfoam_case.nut.save(openfoam_case.openfoam_dir)
458 @staticmethod
459 def create_omega(openfoam_case, openfoam_elements):
460 stl_bounds, heaters, air_terminals, furniture, people = \
461 of_utils.split_openfoam_elements(openfoam_elements)
462 openfoam_case.omega = omega.Omega()
463 openfoam_case.omega.values['boundaryField'] = {}
465 for bound in stl_bounds:
466 openfoam_case.omega.values['boundaryField'].update(
467 {bound.solid_name: bound.omega})
468 for heater in heaters:
469 # openfoam_case.omega.values['boundaryField'].update(
470 # {heater.porous_media.solid_name:
471 # heater.porous_media.omega})
472 openfoam_case.omega.values['boundaryField'].update(
473 {heater.heater_surface.solid_name:
474 heater.heater_surface.omega})
475 for air_terminal in air_terminals:
476 if air_terminal.diffuser.solid_name:
477 openfoam_case.omega.values['boundaryField'].update(
478 {air_terminal.diffuser.solid_name: air_terminal.diffuser.omega})
479 if air_terminal.source_sink.solid_name:
480 openfoam_case.omega.values['boundaryField'].update({
481 air_terminal.source_sink.solid_name:
482 air_terminal.source_sink.omega})
483 if air_terminal.box.solid_name:
484 openfoam_case.omega.values['boundaryField'].update({
485 air_terminal.box.solid_name: air_terminal.box.omega
486 })
487 for furn in furniture:
488 openfoam_case.omega.values['boundaryField'].update(
489 {furn.solid_name: furn.omega})
490 for person in people:
491 for body_part in person.body_parts_dict.values():
492 openfoam_case.omega.values['boundaryField'].update(
493 {body_part.solid_name: body_part.omega})
494 default_name_list = openfoam_case.default_surface_names
495 for name in default_name_list:
496 openfoam_case.omega.values['boundaryField'].update(
497 {name: OpenFOAMBaseBoundaryFields().omega})
498 openfoam_case.omega.save(openfoam_case.openfoam_dir)
500 @staticmethod
501 def create_p(openfoam_case, openfoam_elements):
502 stl_bounds, heaters, air_terminals, furniture, people = \
503 of_utils.split_openfoam_elements(openfoam_elements)
504 openfoam_case.p = p.P()
505 openfoam_case.p.values['boundaryField'] = {}
506 openfoam_case.p.values['internalField'] = 'uniform 101325'
507 openfoam_case.p.values['dimensions'] = '[1 -1 -2 0 0 0 0]'
509 for bound in stl_bounds:
510 openfoam_case.p.values['boundaryField'].update(
511 {bound.solid_name: bound.p})
512 for heater in heaters:
513 # openfoam_case.p.values['boundaryField'].update(
514 # {heater.porous_media.solid_name:
515 # heater.porous_media.p})
516 openfoam_case.p.values['boundaryField'].update(
517 {heater.heater_surface.solid_name:
518 heater.heater_surface.p})
519 for air_terminal in air_terminals:
520 if air_terminal.diffuser.solid_name:
521 openfoam_case.p.values['boundaryField'].update(
522 {air_terminal.diffuser.solid_name: air_terminal.diffuser.p})
523 if air_terminal.source_sink.solid_name:
524 openfoam_case.p.values['boundaryField'].update({
525 air_terminal.source_sink.solid_name:
526 air_terminal.source_sink.p})
527 if air_terminal.box.solid_name:
528 openfoam_case.p.values['boundaryField'].update({
529 air_terminal.box.solid_name: air_terminal.box.p
530 })
531 for furn in furniture:
532 openfoam_case.p.values['boundaryField'].update(
533 {furn.solid_name: furn.p})
534 for person in people:
535 for body_part in person.body_parts_dict.values():
536 openfoam_case.p.values['boundaryField'].update(
537 {body_part.solid_name: body_part.p})
538 default_name_list = openfoam_case.default_surface_names
539 for name in default_name_list:
540 openfoam_case.p.values['boundaryField'].update(
541 {name: OpenFOAMBaseBoundaryFields().p})
542 openfoam_case.p.save(openfoam_case.openfoam_dir)
544 def create_p_rgh(self, openfoam_case, openfoam_elements):
545 stl_bounds, heaters, air_terminals, furniture, people = \
546 of_utils.split_openfoam_elements(openfoam_elements)
547 openfoam_case.p_rgh = p_rgh.P_rgh()
548 openfoam_case.p_rgh.values['boundaryField'] = {}
549 openfoam_case.p_rgh.values['internalField'] = 'uniform 101325'
550 openfoam_case.p_rgh.values['dimensions'] = '[1 -1 -2 0 0 0 0]'
552 for bound in stl_bounds:
553 openfoam_case.p_rgh.values['boundaryField'].update(
554 {bound.solid_name: bound.p_rgh})
555 for heater in heaters:
556 # openfoam_case.p_rgh.values['boundaryField'].update(
557 # {heater.porous_media.solid_name:
558 # heater.porous_media.p_rgh})
559 openfoam_case.p_rgh.values['boundaryField'].update(
560 {heater.heater_surface.solid_name:
561 heater.heater_surface.p_rgh})
562 for air_terminal in air_terminals:
563 if air_terminal.diffuser.solid_name:
564 openfoam_case.p_rgh.values['boundaryField'].update(
565 {air_terminal.diffuser.solid_name: air_terminal.diffuser.p_rgh})
566 if air_terminal.source_sink.solid_name:
567 openfoam_case.p_rgh.values['boundaryField'].update({
568 air_terminal.source_sink.solid_name:
569 air_terminal.source_sink.p_rgh})
570 if air_terminal.box.solid_name:
571 openfoam_case.p_rgh.values['boundaryField'].update({
572 air_terminal.box.solid_name: air_terminal.box.p_rgh
573 })
574 for furn in furniture:
575 openfoam_case.p_rgh.values['boundaryField'].update(
576 {furn.solid_name: furn.p_rgh})
577 for person in people:
578 for body_part in person.body_parts_dict.values():
579 openfoam_case.p_rgh.values['boundaryField'].update(
580 {body_part.solid_name: body_part.p_rgh})
581 default_name_list = openfoam_case.default_surface_names
582 for name in default_name_list:
583 openfoam_case.p_rgh.values['boundaryField'].update(
584 {name: OpenFOAMBaseBoundaryFields().p_rgh})
585 openfoam_case.p_rgh.save(openfoam_case.openfoam_dir)
587 @staticmethod
588 def create_qr(openfoam_case, openfoam_elements):
589 stl_bounds, heaters, air_terminals, furniture, people = \
590 of_utils.split_openfoam_elements(openfoam_elements)
591 openfoam_case.qr = qr.Qr()
592 openfoam_case.qr.values['boundaryField'] = {}
594 for bound in stl_bounds:
595 openfoam_case.qr.values['boundaryField'].update(
596 {bound.solid_name: bound.qr})
597 for heater in heaters:
598 openfoam_case.qr.values['boundaryField'].update(
599 {heater.porous_media.solid_name:
600 heater.porous_media.qr})
601 openfoam_case.qr.values['boundaryField'].update(
602 {heater.heater_surface.solid_name:
603 heater.heater_surface.qr})
604 for air_terminal in air_terminals:
605 if air_terminal.diffuser.solid_name:
606 openfoam_case.qr.values['boundaryField'].update(
607 {air_terminal.diffuser.solid_name: air_terminal.diffuser.qr})
608 if air_terminal.source_sink.solid_name:
609 openfoam_case.qr.values['boundaryField'].update({
610 air_terminal.source_sink.solid_name:
611 air_terminal.source_sink.qr})
612 if air_terminal.box.solid_name:
613 openfoam_case.qr.values['boundaryField'].update({
614 air_terminal.box.solid_name: air_terminal.box.qr
615 })
616 for furn in furniture:
617 openfoam_case.qr.values['boundaryField'].update(
618 {furn.solid_name: furn.qr})
619 for person in people:
620 for body_part in person.body_parts_dict.values():
621 openfoam_case.qr.values['boundaryField'].update(
622 {body_part.solid_name: body_part.qr})
623 default_name_list = openfoam_case.default_surface_names
624 for name in default_name_list:
625 openfoam_case.qr.values['boundaryField'].update(
626 {name: OpenFOAMBaseBoundaryFields().qr})
627 openfoam_case.qr.save(openfoam_case.openfoam_dir)
629 @staticmethod
630 def create_T(openfoam_case, openfoam_elements):
631 default_name_list = openfoam_case.default_surface_names
633 stl_bounds, heaters, air_terminals, furniture, people = \
634 of_utils.split_openfoam_elements(openfoam_elements)
635 openfoam_case.T = T.T()
636 openfoam_case.T.values['boundaryField'] = {}
637 openfoam_case.T.values['internalField'] \
638 = f'uniform {openfoam_case.current_zone.air_temp}'
640 for bound in stl_bounds:
641 openfoam_case.T.values['boundaryField'].update(
642 {bound.solid_name: bound.T})
643 for heater in heaters:
644 # openfoam_case.T.values['boundaryField'].update(
645 # {heater.porous_media.solid_name:
646 # heater.porous_media.T})
647 openfoam_case.T.values['boundaryField'].update(
648 {heater.heater_surface.solid_name:
649 heater.heater_surface.T})
650 for air_terminal in air_terminals:
651 if air_terminal.diffuser.solid_name:
652 openfoam_case.T.values['boundaryField'].update(
653 {air_terminal.diffuser.solid_name: air_terminal.diffuser.T})
654 if air_terminal.source_sink.solid_name:
655 openfoam_case.T.values['boundaryField'].update({
656 air_terminal.source_sink.solid_name:
657 air_terminal.source_sink.T})
658 if air_terminal.box.solid_name:
659 openfoam_case.T.values['boundaryField'].update({
660 air_terminal.box.solid_name: air_terminal.box.T
661 })
662 for furn in furniture:
663 openfoam_case.T.values['boundaryField'].update(
664 {furn.solid_name: furn.T})
665 for person in people:
666 for body_part in person.body_parts_dict.values():
667 openfoam_case.T.values['boundaryField'].update(
668 {body_part.solid_name: body_part.T})
669 default_name_list = openfoam_case.default_surface_names
670 for name in default_name_list:
671 openfoam_case.T.values['boundaryField'].update(
672 {name: OpenFOAMBaseBoundaryFields().T})
673 openfoam_case.T.save(openfoam_case.openfoam_dir)
675 @staticmethod
676 def create_U(openfoam_case, openfoam_elements):
677 stl_bounds, heaters, air_terminals, furniture, people = \
678 of_utils.split_openfoam_elements(openfoam_elements)
679 openfoam_case.U = U.U()
680 openfoam_case.U.values['boundaryField'] = {}
682 for bound in stl_bounds:
683 openfoam_case.U.values['boundaryField'].update(
684 {bound.solid_name: bound.U})
685 for heater in heaters:
686 # openfoam_case.U.values['boundaryField'].update(
687 # {heater.porous_media.solid_name:
688 # heater.porous_media.U})
689 openfoam_case.U.values['boundaryField'].update(
690 {heater.heater_surface.solid_name:
691 heater.heater_surface.U})
692 for air_terminal in air_terminals:
693 if air_terminal.diffuser.solid_name:
694 openfoam_case.U.values['boundaryField'].update(
695 {air_terminal.diffuser.solid_name: air_terminal.diffuser.U})
696 if air_terminal.source_sink.solid_name:
697 openfoam_case.U.values['boundaryField'].update({
698 air_terminal.source_sink.solid_name:
699 air_terminal.source_sink.U})
700 if air_terminal.box.solid_name:
701 openfoam_case.U.values['boundaryField'].update({
702 air_terminal.box.solid_name: air_terminal.box.U
703 })
704 for furn in furniture:
705 openfoam_case.U.values['boundaryField'].update(
706 {furn.solid_name: furn.U})
707 for person in people:
708 for body_part in person.body_parts_dict.values():
709 openfoam_case.U.values['boundaryField'].update(
710 {body_part.solid_name: body_part.U})
711 default_name_list = openfoam_case.default_surface_names
712 for name in default_name_list:
713 openfoam_case.U.values['boundaryField'].update(
714 {name: OpenFOAMBaseBoundaryFields().U})
715 openfoam_case.U.save(openfoam_case.openfoam_dir)
717 @staticmethod
718 def create_boundaryRadiationProperties(openfoam_case,
719 openfoam_elements):
720 stl_bounds, heaters, air_terminals, furniture, people = \
721 of_utils.split_openfoam_elements(openfoam_elements)
722 openfoam_case.boundaryRadiationProperties = (
723 boundaryRadiationProperties.BoundaryRadiationProperties())
724 default_name_list = openfoam_case.default_surface_names
726 for bound in stl_bounds:
727 openfoam_case.boundaryRadiationProperties.values.update(
728 {bound.solid_name: bound.boundaryRadiationProperties})
729 for heater in heaters:
730 # openfoam_case.boundaryRadiationProperties.values.update(
731 # {heater.porous_media.solid_name:
732 # heater.porous_media.boundaryRadiationProperties})
733 openfoam_case.boundaryRadiationProperties.values.update(
734 {heater.heater_surface.solid_name:
735 heater.heater_surface.boundaryRadiationProperties})
736 for air_terminal in air_terminals:
737 if air_terminal.diffuser.solid_name:
738 openfoam_case.boundaryRadiationProperties.values.update(
739 {air_terminal.diffuser.solid_name:
740 air_terminal.diffuser.boundaryRadiationProperties})
741 if air_terminal.source_sink.solid_name:
742 openfoam_case.boundaryRadiationProperties.values.update({
743 air_terminal.source_sink.solid_name:
744 air_terminal.source_sink.boundaryRadiationProperties})
745 if air_terminal.box.solid_name:
746 openfoam_case.boundaryRadiationProperties.values.update({
747 air_terminal.box.solid_name:
748 air_terminal.box.boundaryRadiationProperties,
749 })
750 for furn in furniture:
751 openfoam_case.boundaryRadiationProperties.values.update(
752 {furn.solid_name: furn.boundaryRadiationProperties})
753 for person in people:
754 for body_part in person.body_parts_dict.values():
755 openfoam_case.boundaryRadiationProperties.values.update(
756 {body_part.solid_name: body_part.boundaryRadiationProperties})
757 for name in default_name_list:
758 openfoam_case.boundaryRadiationProperties.values.update(
759 {
760 name: OpenFOAMBaseBoundaryFields().boundaryRadiationProperties})
761 openfoam_case.boundaryRadiationProperties.save(
762 openfoam_case.openfoam_dir)
764 @staticmethod
765 def add_fvOptions_for_heating(openfoam_case, openfoam_elements):
766 heaters = filter_elements(openfoam_elements, 'Heater')
767 openfoam_case.fvOptions = foamfile.FoamFile(
768 name='fvOptions', cls='dictionary', location='system',
769 default_values=OrderedDict()
770 )
771 for heater in heaters:
772 openfoam_case.fvOptions.values.update(
773 {heater.porous_media.solid_name + '_ScalarSemiImplicitSource':
774 {'type': 'scalarSemiImplicitSource',
775 'scalarSemiImplicitSourceCoeffs':
776 {'mode': 'uniform',
777 'selectionMode': 'cellZone',
778 'volumeMode': 'absolute',
779 'cellZone':
780 heater.porous_media.solid_name,
781 'injectionRateSuSp':
782 {'h':
783 f"({heater.porous_media.power} 0)"
784 }
785 }
786 }
787 }
788 )
789 openfoam_case.fvOptions.save(openfoam_case.openfoam_dir)