38 #define addObstacleReader(obsType, obsName) \
41 namespace PDRobstacles \
43 addNamedToMemberFunctionSelectionTable \
64 inline scalar getPorosity(
const dictionary&
dict)
66 return 1 - limits01.clip(
dict.getOrDefault<scalar>(
"porosity", 0));
70 inline vector getPorosities(
const dictionary&
dict)
74 if (
dict.readIfPresent(
"porosities", blockage))
76 for (scalar& val : blockage)
78 val = 1 - limits01.clip(val);
96 { vector::components::X,
"x" },
98 { vector::components::Z,
"z" },
115 { inletDirnType::_X,
"-x" },
116 { inletDirnType::_Y,
"-y" },
117 { inletDirnType::_Z,
"-z" },
118 { inletDirnType::_X,
"_x" },
119 { inletDirnType::_Y,
"_y" },
120 { inletDirnType::_Z,
"_z" },
121 { inletDirnType::X,
"+x" },
123 { inletDirnType::Z,
"+z" },
124 { inletDirnType::X,
"x" },
126 { inletDirnType::Z,
"z" },
134 addObstacleReader(cylinder, cyl);
135 addObstacleReader(cylinder, cylinder);
140 const dictionary&
dict
143 obs.PDRobstacle::readProperties(
dict);
144 obs.typeId = enumTypeId;
147 obs.xbkge = obs.ybkge = obs.zbkge = obs.vbkge = 1;
151 dict.readEntry(
"point", obs.pt);
152 dict.readEntry(
"length", obs.len());
153 dict.readEntry(
"diameter", obs.dia());
155 obs.orient = vectorComponentsNames.get(
"direction",
dict);
161 obs.sortBias = obs.len();
165 obs.sortBias = 0.5*obs.dia();
173 addObstacleReader(diagbeam,
diag);
174 addObstacleReader(diagbeam, diagbeam);
179 const dictionary&
dict
182 obs.PDRobstacle::readProperties(
dict);
183 obs.typeId = enumTypeId;
186 obs.xbkge = obs.ybkge = obs.zbkge = obs.vbkge = 1;
190 dict.readEntry(
"point", obs.pt);
191 dict.readEntry(
"length", obs.len());
195 obs.orient = vectorComponentsNames.get(
"direction",
dict);
198 scalar angle =
dict.get<scalar>(
"angle");
200 while (angle > 180) angle -= 180;
201 while (angle < 0) angle += 180;
204 dict.readEntry(
"width", dims);
216 obs.wa = dims.first();
217 obs.wb = dims.second();
219 const scalar ctheta =
cos(obs.theta());
220 const scalar stheta =
sin(obs.theta());
226 obs.sortBias = obs.len();
230 obs.sortBias = 0.5*(obs.wa * stheta + obs.wb * ctheta);
234 obs.sortBias = 0.5*(obs.wa * ctheta + obs.wb * stheta);
242 Info<<
"... changed diag-beam to box" <<
nl;
247 obs.span =
vector(obs.len(), obs.wa, obs.wb);
251 obs.span =
vector(obs.wb, obs.len(), obs.wa);
255 obs.span =
vector(obs.wa, obs.wb, obs.len());
260 vector adjustPt = -0.5*obs.span;
261 adjustPt[obs.orient] = 0;
267 obs.xbkge = obs.ybkge = obs.zbkge = obs.vbkge = 1.0;
268 obs.blowoff_type = 0;
275 addObstacleReader(
cuboid, box);
280 const dictionary&
dict
283 obs.PDRobstacle::readProperties(
dict);
284 obs.typeId = enumTypeId;
287 obs.xbkge = obs.ybkge = obs.zbkge = obs.vbkge = 1;
290 dict.readEntry(
"point", obs.pt);
291 dict.readEntry(
"size", obs.span);
294 obs.vbkge = getPorosity(
dict);
298 obs.xbkge = blockages.x();
299 obs.ybkge = blockages.y();
300 obs.zbkge = blockages.z();
306 addObstacleReader(wallbeam, wallbeam);
311 const dictionary&
dict
315 obs.typeId = enumTypeId;
318 obs.xbkge = obs.ybkge = obs.zbkge = obs.vbkge = 1;
328 addObstacleReader(grating, grating);
329 addObstacleReader(grating, grate);
334 const dictionary&
dict
337 obs.PDRobstacle::readProperties(
dict);
338 obs.typeId = enumTypeId;
341 obs.xbkge = obs.ybkge = obs.zbkge = obs.vbkge = 1;
343 dict.readEntry(
"point", obs.pt);
344 dict.readEntry(
"size", obs.span);
353 obs.vbkge = getPorosity(
dict);
356 obs.xbkge = blockages.x();
357 obs.ybkge = blockages.y();
358 obs.zbkge = blockages.z();
364 obs.slat_width =
dict.getOrDefault<scalar>(
"slats",
Zero);
367 if (
equal(obs.span.x(), 0))
371 else if (
equal(obs.span.y(), 0))
384 addObstacleReader(louver, louver);
385 addObstacleReader(louver, louvre);
390 const dictionary&
dict
393 obs.PDRobstacle::readProperties(
dict);
394 obs.typeId = enumTypeId;
397 obs.xbkge = obs.ybkge = obs.zbkge = obs.vbkge = 1;
399 dict.readEntry(
"point", obs.pt);
400 dict.readEntry(
"size", obs.span);
409 obs.vbkge = getPorosity(
dict);
412 obs.xbkge = blockages.x();
413 obs.ybkge = blockages.y();
414 obs.zbkge = blockages.z();
420 const scalar blowoffPress =
dict.get<scalar>(
"pressure");
422 obs.blowoff_press =
barToPa(blowoffPress);
423 obs.blowoff_time =
dict.getOrDefault<scalar>(
"time", 0);
424 obs.blowoff_type =
dict.getOrDefault<label>(
"type", 2);
426 if (obs.blowoff_type == 1)
428 Info<<
"Louver : blowoff-type 1 not yet implemented." <<
nl;
431 if (obs.blowoff_time != 0)
433 Info<<
"Louver : has blowoff time set,"
434 <<
" not set to blow off cell-by-cell" <<
nl;
442 (obs.blowoff_type == 1 || obs.blowoff_type == 2)
443 && (blowoffPress > 0)
446 if (blowoffPress > maxBlowoffPressure)
448 Info<<
"Blowoff pressure (" << blowoffPress
449 <<
") too high for blowoff type "
450 << obs.blowoff_type <<
nl;
456 Info<<
"Problem with blowoff parameters" <<
nl;
458 Info<<
"Pressure[bar] " << blowoffPress
459 <<
" Blowoff type " << obs.blowoff_type
460 <<
", blowoff pressure " << obs.blowoff_press <<
nl;
473 const dictionary&
dict
476 obs.PDRobstacle::readProperties(
dict);
477 obs.typeId = enumTypeId;
479 const auto nameLen = obs.identifier.length();
483 if (patchName.empty())
486 <<
"RECT_PATCH without a patch name"
489 else if (patchName.length() != nameLen)
492 <<
"RECT_PATCH stripped invalid characters from patch name: "
496 obs.identifier = std::move(patchName);
500 obs.xbkge = obs.ybkge = obs.zbkge = obs.vbkge = 1;
502 dict.readEntry(
"point", obs.pt);
503 dict.readEntry(
"size", obs.span);
504 obs.inlet_dirn = inletDirnNames.get(
"direction",
dict);
510 #undef addObstacleReader