98 forAll(fvSourceSubDict.toc(), idxI)
102 word pointName = fvSourceSubDict.toc()[idxI];
105 dictionary pointSubDict = fvSourceSubDict.subDict(pointName);
107 word smoothFunction = pointSubDict.get<word>(
"smoothFunction");
109 if (smoothFunction ==
"hyperbolic")
113 actuatorPointPars[pointName][0],
114 actuatorPointPars[pointName][1],
115 actuatorPointPars[pointName][2]};
117 actuatorPointPars[pointName][3],
118 actuatorPointPars[pointName][4],
119 actuatorPointPars[pointName][5]};
121 actuatorPointPars[pointName][6],
122 actuatorPointPars[pointName][7],
123 actuatorPointPars[pointName][8]};
124 scalar period = actuatorPointPars[pointName][10];
125 scalar eps = actuatorPointPars[pointName][12];
126 scalar scale = actuatorPointPars[pointName][9];
127 label thrustDirIdx = pointSubDict.get<label>(
"thrustDirIdx");
128 scalar phase = actuatorPointPars[pointName][11];
130 scalar t =
mesh_.time().timeOutputValue();
131 center += amp * sin(constant::mathematical::twoPi * t / period + phase);
133 scalar xTerm, yTerm, zTerm, s;
134 scalar thrustTotal = 0.0;
137 const vector& meshC =
mesh_.C()[cellI];
138 xTerm = (tanh(eps * (meshC[0] + 0.5 * size[0] - center[0])) - tanh(eps * (meshC[0] - 0.5 * size[0] - center[0])));
139 yTerm = (tanh(eps * (meshC[1] + 0.5 * size[1] - center[1])) - tanh(eps * (meshC[1] - 0.5 * size[1] - center[1])));
140 zTerm = (tanh(eps * (meshC[2] + 0.5 * size[2] - center[2])) - tanh(eps * (meshC[2] - 0.5 * size[2] - center[2])));
142 s = xTerm * yTerm * zTerm;
144 fvSource[cellI][thrustDirIdx] += s * scale;
146 thrustTotal += s * scale *
mesh_.V()[cellI];
148 reduce(thrustTotal, sumOp<scalar>());
153 Info <<
"Actuator point source: " << pointName << endl;
154 Info <<
"Total thrust source: " << thrustTotal << endl;
158 else if (smoothFunction ==
"gaussian")
162 actuatorPointPars[pointName][0],
163 actuatorPointPars[pointName][1],
164 actuatorPointPars[pointName][2]};
168 actuatorPointPars[pointName][3],
169 actuatorPointPars[pointName][4],
170 actuatorPointPars[pointName][5]};
172 actuatorPointPars[pointName][6],
173 actuatorPointPars[pointName][7],
174 actuatorPointPars[pointName][8]};
175 scalar period = actuatorPointPars[pointName][10];
176 scalar eps = actuatorPointPars[pointName][12];
177 scalar scale = actuatorPointPars[pointName][9];
178 label thrustDirIdx = pointSubDict.get<label>(
"thrustDirIdx");
179 scalar phase = actuatorPointPars[pointName][11];
181 scalar t =
mesh_.time().timeOutputValue();
182 center += amp * sin(constant::mathematical::twoPi * t / period + phase);
184 scalar thrustTotal = 0.0;
185 scalar coeff = 1.0 / constant::mathematical::twoPi / eps / eps;
188 const vector& meshC =
mesh_.C()[cellI];
189 scalar d = mag(meshC - center);
190 scalar s = coeff * exp(-d * d / 2.0 / eps / eps);
192 fvSource[cellI][thrustDirIdx] += s * scale;
193 thrustTotal += s * scale *
mesh_.V()[cellI];
195 reduce(thrustTotal, sumOp<scalar>());
200 Info <<
"Actuator point source: " << pointName << endl;
201 Info <<
"Total thrust source: " << thrustTotal << endl;
207 FatalErrorIn(
"") <<
"smoothFunction should be either hyperbolic or gaussian" << abort(FatalError);
211 fvSource.correctBoundaryConditions();
225 forAll(fvSourceSubDict.toc(), idxI)
227 word pointName = fvSourceSubDict.toc()[idxI];
229 dictionary pointSubDict = fvSourceSubDict.subDict(pointName);
230 word type = pointSubDict.getWord(
"type");
232 if (type ==
"actuatorPoint")
236 scalarList centerList;
237 pointSubDict.readEntry<scalarList>(
"center", centerList);
240 word smoothFunction = pointSubDict.getWord(
"smoothFunction");
242 if (smoothFunction ==
"hyperbolic")
244 pointSubDict.readEntry<scalarList>(
"size", sizeList);
246 else if (smoothFunction ==
"gaussian")
248 sizeList = {0.0, 0.0, 0.0};
252 pointSubDict.readEntry<scalarList>(
"amplitude", ampList);
255 scalarList dvList(13);
256 dvList[0] = centerList[0];
257 dvList[1] = centerList[1];
258 dvList[2] = centerList[2];
259 dvList[3] = sizeList[0];
260 dvList[4] = sizeList[1];
261 dvList[5] = sizeList[2];
262 dvList[6] = ampList[0];
263 dvList[7] = ampList[1];
264 dvList[8] = ampList[2];
265 dvList[9] = pointSubDict.getScalar(
"scale");
266 dvList[10] = pointSubDict.getScalar(
"periodicity");
267 dvList[11] = pointSubDict.getScalar(
"phase");
268 dvList[12] = pointSubDict.getScalar(
"eps");