33 dictionary fvSourceSubDict =
allOptions.subDict(
"fvSource");
35 forAll(fvSourceSubDict.toc(), idxI)
37 word sourceName = fvSourceSubDict.toc()[idxI];
38 dictionary sourceSubDict = fvSourceSubDict.subDict(sourceName);
39 word sourceType = sourceSubDict.getWord(
"source");
41 if (sourceType ==
"cylinderToCell")
44 sourceSubDict.readEntry<scalarList>(
"p1", p1List);
47 sourceSubDict.readEntry<scalarList>(
"p2", p2List);
51 power_.set(sourceName, sourceSubDict.getScalar(
"power"));
58 autoPtr<topoSet> currentSet(
78 tmpDict.set(
"p1",
p1);
79 tmpDict.set(
"p2",
p2);
83 autoPtr<topoSetSource> sourceSet(
84 topoSetSource::New(
"cylinderToCell",
mesh_, tmpDict));
87 sourceSet().applyToSet(topoSetSource::NEW, currentSet());
90 for (
const label i : currentSet())
100 else if (sourceType ==
"cylinderSmooth")
104 HashTable<List<scalar>>& heatSourcePars = globalVar.
heatSourcePars;
108 cylinderEps_.set(sourceName, sourceSubDict.getScalar(
"eps"));
110 snapCenter2Cell_.set(sourceName, sourceSubDict.lookupOrDefault<label>(
"snapCenter2Cell", 0));
113 point centerPoint = {heatSourcePars[sourceName][0], heatSourcePars[sourceName][1], heatSourcePars[sourceName][2]};
119 label foundCellI = 0;
125 reduce(foundCellI, sumOp<label>());
128 FatalErrorIn(
" ") <<
"There should be only one cell found globally while "
129 << foundCellI <<
" was returned."
130 <<
" Please adjust center such that it is located completely"
131 <<
" within a cell in the mesh domain. The center should not "
132 <<
" be outside of the mesh domain or on a mesh face "
133 << abort(FatalError);
136 vector snappedCenter = vector::zero;
138 Info <<
"heat source " << sourceName <<
" snap to center " << snappedCenter << endl;
143 FatalErrorIn(
"DAFvSourceHeatSource") <<
"source: " << sourceType <<
" not supported!"
144 <<
"Options are: cylinderAnnulusToCell and cylinderSmooth!"
145 << abort(FatalError);
192 dictionary fvSourceSubDict =
allOptions.subDict(
"fvSource");
194 forAll(fvSourceSubDict.toc(), idxI)
196 word sourceName = fvSourceSubDict.toc()[idxI];
197 dictionary sourceSubDict = fvSourceSubDict.subDict(sourceName);
198 word sourceType = sourceSubDict.getWord(
"source");
201 if (sourceType ==
"cylinderToCell")
204 scalar power =
power_[sourceName];
212 scalar cellV =
mesh_.V()[cellI];
215 reduce(totalV, sumOp<scalar>());
218 scalar sourceTotal = 0.0;
228 reduce(sourceTotal, sumOp<scalar>());
233 Info <<
"Total volume for " << sourceName <<
": " << totalV <<
" m^3" << endl;
234 Info <<
"Total heat source for " << sourceName <<
": " << sourceTotal <<
" W." << endl;
238 else if (sourceType ==
"cylinderSmooth")
242 HashTable<List<scalar>>& heatSourcePars = globalVar.
heatSourcePars;
244 vector cylinderCenter =
245 {heatSourcePars[sourceName][0], heatSourcePars[sourceName][1], heatSourcePars[sourceName][2]};
252 {heatSourcePars[sourceName][3], heatSourcePars[sourceName][4], heatSourcePars[sourceName][5]};
253 scalar radius = heatSourcePars[sourceName][6];
254 scalar cylinderLen = heatSourcePars[sourceName][7];
255 scalar power = heatSourcePars[sourceName][8];
256 vector cylinderDirNorm = cylinderDir / mag(cylinderDir);
260 scalar volumeTotal = 0.0;
264 vector cellC =
mesh_.C()[cellI];
266 vector cellC2AVec = cellC - cylinderCenter;
268 tensor cellC2AVecE(tensor::zero);
269 cellC2AVecE.xx() = cellC2AVec.x();
270 cellC2AVecE.yy() = cellC2AVec.y();
271 cellC2AVecE.zz() = cellC2AVec.z();
275 vector cellC2AVecA = cellC2AVecE & cylinderDirNorm;
277 vector cellC2AVecR = cellC2AVec - cellC2AVecA;
280 scalar cellC2AVecRLen = mag(cellC2AVecR);
282 scalar cellC2AVecALen = mag(cellC2AVecA);
284 scalar axialSmoothC = 1.0;
285 scalar radialSmoothC = 1.0;
287 scalar halfL = cylinderLen / 2.0;
289 if (cellC2AVecALen > halfL)
291 scalar d2 = (cellC2AVecALen - halfL) * (cellC2AVecALen - halfL);
292 axialSmoothC = exp(-d2 / eps / eps);
295 if (cellC2AVecRLen > radius)
297 scalar d2 = (cellC2AVecRLen - radius) * (cellC2AVecRLen - radius);
298 radialSmoothC = exp(-d2 / eps / eps);
300 volumeTotal += axialSmoothC * radialSmoothC *
mesh_.V()[cellI];
302 reduce(volumeTotal, sumOp<scalar>());
305 scalar sourceTotal = 0.0;
309 vector cellC =
mesh_.C()[cellI];
311 vector cellC2AVec = cellC - cylinderCenter;
313 tensor cellC2AVecE(tensor::zero);
314 cellC2AVecE.xx() = cellC2AVec.x();
315 cellC2AVecE.yy() = cellC2AVec.y();
316 cellC2AVecE.zz() = cellC2AVec.z();
320 vector cellC2AVecA = cellC2AVecE & cylinderDirNorm;
322 vector cellC2AVecR = cellC2AVec - cellC2AVecA;
325 scalar cellC2AVecRLen = mag(cellC2AVecR);
327 scalar cellC2AVecALen = mag(cellC2AVecA);
329 scalar axialSmoothC = 1.0;
330 scalar radialSmoothC = 1.0;
332 scalar halfL = cylinderLen / 2.0;
334 if (cellC2AVecALen > halfL)
336 scalar d2 = (cellC2AVecALen - halfL) * (cellC2AVecALen - halfL);
337 axialSmoothC = exp(-d2 / eps / eps);
340 if (cellC2AVecRLen > radius)
342 scalar d2 = (cellC2AVecRLen - radius) * (cellC2AVecRLen - radius);
343 radialSmoothC = exp(-d2 / eps / eps);
346 fvSource[cellI] += power / volumeTotal * axialSmoothC * radialSmoothC;
347 sourceTotal += power / volumeTotal * axialSmoothC * radialSmoothC *
mesh_.V()[cellI];
350 reduce(sourceTotal, sumOp<scalar>());
355 Info <<
"Total volume for " << sourceName <<
": " << volumeTotal <<
" m^3" << endl;
356 Info <<
"Total heat source for " << sourceName <<
": " << sourceTotal <<
" W." << endl;
362 FatalErrorIn(
"DAFvSourceHeatSource") <<
"source: " << sourceType <<
" not supported!"
363 <<
"Options are: cylinderAnnulusToCell and cylinderSmooth!"
364 << abort(FatalError);
368 fvSource.correctBoundaryConditions();
382 forAll(fvSourceSubDict.toc(), idxI)
384 word diskName = fvSourceSubDict.toc()[idxI];
386 dictionary diskSubDict = fvSourceSubDict.subDict(diskName);
387 word type = diskSubDict.getWord(
"type");
388 word
source = diskSubDict.getWord(
"source");
390 if (type ==
"heatSource" &&
source ==
"cylinderSmooth")
393 scalarList centerList;
394 diskSubDict.readEntry<scalarList>(
"center", centerList);
397 diskSubDict.readEntry<scalarList>(
"axis", axisList);
400 scalarList dvList(9);
401 dvList[0] = centerList[0];
402 dvList[1] = centerList[1];
403 dvList[2] = centerList[2];
404 dvList[3] = axisList[0];
405 dvList[4] = axisList[1];
406 dvList[5] = axisList[2];
407 dvList[6] = diskSubDict.getScalar(
"radius");
408 dvList[7] = diskSubDict.getScalar(
"length");
409 dvList[8] = diskSubDict.getScalar(
"power");