38 const Foam::scalar Foam::layerParameters::defaultConcaveAngle = 90;
43 Foam::scalar Foam::layerParameters::layerExpansionRatio
46 const scalar totalOverFirst
54 const label maxIters = 20;
55 const scalar tol = 1
e-8;
57 if (
mag(
n-totalOverFirst) < tol)
66 if (totalOverFirst <
n)
69 maxR =
pow(totalOverFirst/
n, 1/(
n-1));
73 minR =
pow(totalOverFirst/
n, 1/(
n-1));
74 maxR = totalOverFirst/(
n - 1);
78 scalar r = 0.5*(minR + maxR);
80 for (label i = 0; i < maxIters; ++i)
82 const scalar prevr = r;
84 const scalar fx =
pow(r,
n) - totalOverFirst*r - (1 - totalOverFirst);
85 const scalar dfx =
n*
pow(r,
n - 1) - totalOverFirst;
88 if (
mag(r - prevr) < tol)
99 Foam::layerParameters::layerParameters
108 relativeSizes_(meshRefinement::get<bool>(
dict,
"relativeSizes", dryRun)),
119 meshRefinement::get<scalar>(
dict,
"minThickness", dryRun)
121 featureAngle_(meshRefinement::get<scalar>(
dict,
"featureAngle", dryRun)),
122 mergePatchFacesAngle_
126 "mergePatchFacesAngle",
134 nGrow_(meshRefinement::get<label>(
dict,
"nGrow", dryRun)),
135 maxFaceThicknessRatio_
137 meshRefinement::get<scalar>(
dict,
"maxFaceThicknessRatio", dryRun)
139 nBufferCellsNoExtrude_
141 meshRefinement::get<label>(
dict,
"nBufferCellsNoExtrude", dryRun)
143 nLayerIter_(meshRefinement::get<label>(
dict,
"nLayerIter", dryRun)),
150 medialAxisMeshMover::typeName
158 bool haveFirst =
dict.
found(
"firstLayerThickness");
164 dict.
get<scalar>(
"firstLayerThickness")
168 bool haveFinal =
dict.
found(
"finalLayerThickness");
174 dict.
get<scalar>(
"finalLayerThickness")
178 bool haveTotal =
dict.
found(
"thickness");
188 bool haveExp =
dict.
found(
"expansionRatio");
194 dict.
get<scalar>(
"expansionRatio")
200 if (haveFirst && haveTotal)
202 layerSpec_ = FIRST_AND_TOTAL;
203 Info<<
"Layer thickness specified as first layer and overall thickness."
206 else if (haveFirst && haveExp)
208 layerSpec_ = FIRST_AND_EXPANSION;
209 Info<<
"Layer thickness specified as first layer and expansion ratio."
212 else if (haveFinal && haveTotal)
214 layerSpec_ = FINAL_AND_TOTAL;
215 Info<<
"Layer thickness specified as final layer and overall thickness."
218 else if (haveFinal && haveExp)
220 layerSpec_ = FINAL_AND_EXPANSION;
221 Info<<
"Layer thickness specified as final layer and expansion ratio."
224 else if (haveTotal && haveExp)
226 layerSpec_ = TOTAL_AND_EXPANSION;
227 Info<<
"Layer thickness specified as overall thickness"
228 <<
" and expansion ratio." <<
endl;
232 if (layerSpec_ == ILLEGAL || nSpec != 2)
235 <<
"Over- or underspecified layer thickness."
236 <<
" Please specify" <<
nl
237 <<
" first layer thickness ('firstLayerThickness')"
238 <<
" and overall thickness ('thickness') or" <<
nl
239 <<
" first layer thickness ('firstLayerThickness')"
240 <<
" and expansion ratio ('expansionRatio') or" <<
nl
241 <<
" final layer thickness ('finalLayerThickness')"
242 <<
" and expansion ratio ('expansionRatio') or" <<
nl
243 <<
" final layer thickness ('finalLayerThickness')"
244 <<
" and overall thickness ('thickness') or" <<
nl
245 <<
" overall thickness ('thickness')"
246 <<
" and expansion ratio ('expansionRatio'"
253 if (nLayerIter_ < 0 || nRelaxedIter_ < 0)
256 <<
"Layer iterations should be >= 0." <<
nl
257 <<
"nLayerIter:" << nLayerIter_
258 <<
" nRelaxedIter:" << nRelaxedIter_
270 for (
const entry& dEntry : layersDict)
274 const keyType& key = dEntry.keyword();
282 if (patchIDs.size() == 0)
285 <<
"Layer specification for " << key
286 <<
" does not match any patch." <<
endl
291 for (
const label patchi : patchIDs)
294 layerDict.
get<label>(
"nSurfaceLayers");
298 case FIRST_AND_TOTAL:
301 "firstLayerThickness",
302 firstLayerThickness_[patchi]
311 case FIRST_AND_EXPANSION:
314 "firstLayerThickness",
315 firstLayerThickness_[patchi]
320 expansionRatio_[patchi]
324 case FINAL_AND_TOTAL:
327 "finalLayerThickness",
328 finalLayerThickness_[patchi]
337 case FINAL_AND_EXPANSION:
340 "finalLayerThickness",
341 finalLayerThickness_[patchi]
346 expansionRatio_[patchi]
350 case TOTAL_AND_EXPANSION:
359 expansionRatio_[patchi]
372 minThickness_[patchi]
386 const scalar firstLayerThickess,
387 const scalar finalLayerThickess,
388 const scalar totalThickness,
389 const scalar expansionRatio
394 case FIRST_AND_TOTAL:
395 case FINAL_AND_TOTAL:
396 case TOTAL_AND_EXPANSION:
398 return totalThickness;
402 case FIRST_AND_EXPANSION:
404 if (
mag(expansionRatio-1) < SMALL)
406 return firstLayerThickess * nLayers;
410 return firstLayerThickess
411 *(1.0 -
pow(expansionRatio, nLayers))
412 /(1.0 - expansionRatio);
417 case FINAL_AND_EXPANSION:
419 if (
mag(expansionRatio-1) < SMALL)
421 return finalLayerThickess * nLayers;
425 scalar invExpansion = 1.0 / expansionRatio;
426 return finalLayerThickess
427 *(1.0 -
pow(invExpansion, nLayers))
428 /(1.0 - invExpansion);
443 Foam::scalar Foam::layerParameters::layerExpansionRatio
446 const scalar firstLayerThickess,
447 const scalar finalLayerThickess,
448 const scalar totalThickness,
449 const scalar expansionRatio
454 case FIRST_AND_EXPANSION:
455 case FINAL_AND_EXPANSION:
456 case TOTAL_AND_EXPANSION:
458 return expansionRatio;
462 case FIRST_AND_TOTAL:
464 return layerExpansionRatio
467 totalThickness/firstLayerThickess
472 case FINAL_AND_TOTAL:
479 totalThickness/finalLayerThickess
497 const scalar firstLayerThickess,
498 const scalar finalLayerThickess,
499 const scalar totalThickness,
500 const scalar expansionRatio
505 case FIRST_AND_EXPANSION:
506 case FIRST_AND_TOTAL:
508 return firstLayerThickess;
511 case FINAL_AND_EXPANSION:
513 return finalLayerThickess*
pow(1.0/expansionRatio, nLayers-1);
517 case FINAL_AND_TOTAL:
519 scalar r = layerExpansionRatio
527 return finalLayerThickess/
pow(r, nLayers-1);
531 case TOTAL_AND_EXPANSION:
533 scalar r = finalLayerThicknessRatio
538 scalar finalThickness = r*totalThickness;
539 return finalThickness/
pow(expansionRatio, nLayers-1);
556 const scalar expansionRatio
561 if (
mag(expansionRatio-1) < SMALL)
568 pow(expansionRatio, nLayers - 1)
569 *(1.0 - expansionRatio)
570 /(1.0 -
pow(expansionRatio, nLayers));