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");