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)
72 vector blockage(vector::one);
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))
369 obs.orient = vector::X;
371 else if (
equal(obs.span.y(), 0))
377 obs.orient = vector::Z;
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 Different types of constants.
static word validate(const std::string &s, const bool prefix=false)
Construct validated word (no invalid characters).
static void read(PDRobstacle &obs, const dictionary &dict)
constexpr scalar barToPa(const scalar bar) noexcept
Conversion from bar to Pa.
MinMax< scalar > scalarMinMax
A scalar min/max range.
errorManipArg< error, int > exit(error &err, const int errNo=1)
error FatalError
Error stream (stdout output on all processes), with additional 'FOAM FATAL ERROR' header text and sta...
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
static void read(PDRobstacle &obs, const dictionary &dict)
Unit conversion functions.
constexpr char nl
The newline '\n' character (0x0a)
static void read(PDRobstacle &obs, const dictionary &dict)
static void read(PDRobstacle &obs, const dictionary &dict)
static constexpr int enumTypeId
static MinMax< scalar > zero_one()
A 0-1 range corresponding to the pTraits zero, one.
void diag(pointPatchField< vector > &, const pointPatchField< tensor > &)
dimensionedScalar cos(const dimensionedScalar &ds)
static void read(PDRobstacle &obs, const dictionary &dict)
static void read(PDRobstacle &obs, const dictionary &dict)
dimensionedScalar sin(const dimensionedScalar &ds)
Pair< label > labelPair
A pair of labels.
static void read(PDRobstacle &obs, const dictionary &dict)
bool equal(const T &s1, const T &s2)
Compare two values for equality.
#define WarningInFunction
Report a warning using Foam::Warning.
Enum is a wrapper around a list of names/values that represent particular enumeration (or int) values...
PtrList< volScalarField > & Y
const std::string patch
OpenFOAM patch number as a std::string.
Macros for easy insertion into member function selection tables.
messageStream Info
Information stream (stdout output on master, null elsewhere)
constexpr scalar degToRad(const scalar deg) noexcept
Conversion from degrees to radians.
static constexpr const zero Zero
Global zero (0)