76 std::vector<real> values;
79 values.push_back(value);
86 std::vector<std::vector<real>>
lists;
88 size_t start =
text.find(
'[');
89 while (start != std::string::npos) {
90 const size_t end =
text.find(
']', start);
92 start =
text.find(
'[', end);
106std::vector<real> computeBladeRadii(
const real diameter,
const uint numberOfPointsPerBlade)
108 std::vector<real> bladeRadii(numberOfPointsPerBlade);
109 const real spacing = c1o2 * diameter /
static_cast<real>(numberOfPointsPerBlade);
111 for (
uint i = 0;
i < numberOfPointsPerBlade; ++
i)
112 bladeRadii[
i] = spacing * (
static_cast<real>(
i) + c1o2);
125 const std::string& key,
136 if (!config.
contains(
"VELOCITY_BOUNDARY_CONDITION"))
137 return BoundaryConditionFactory::VelocityBC::VelocityInterpolatedCompressible;
139 const auto velocityBoundaryCondition = config.
getValue<std::string>(
"VELOCITY_BOUNDARY_CONDITION");
140 if (velocityBoundaryCondition ==
"VelocityBounceBack")
141 return BoundaryConditionFactory::VelocityBC::VelocityBounceBack;
142 if (velocityBoundaryCondition ==
"VelocityInterpolatedIncompressible")
143 return BoundaryConditionFactory::VelocityBC::VelocityInterpolatedIncompressible;
144 if (velocityBoundaryCondition ==
"VelocityInterpolatedCompressible")
145 return BoundaryConditionFactory::VelocityBC::VelocityInterpolatedCompressible;
146 if (velocityBoundaryCondition ==
"VelocityWithPressureInterpolatedCompressible")
147 return BoundaryConditionFactory::VelocityBC::VelocityWithPressureInterpolatedCompressible;
149 throw std::runtime_error(
150 "VELOCITY_BOUNDARY_CONDITION must be one of: VelocityBounceBack, "
151 "VelocityInterpolatedIncompressible, VelocityInterpolatedCompressible, "
152 "VelocityWithPressureInterpolatedCompressible.");
157 return c1o4 * diameter /
static_cast<real>(numberOfPointsPerBlade);
162 const uint numberOfBlades,
163 const uint numberOfPointsPerBlade)
165 const auto bladeRadii = computeBladeRadii(diameter, numberOfPointsPerBlade);
168 const real pi = std::acos(-c1o1);
169 for (
uint i = 0;
i < numberOfPointsPerBlade; ++
i) {
172 : c1o2 * (bladeRadii[
i] + bladeRadii[
i - 1]);
175 : c1o2 * (bladeRadii[
i] + bladeRadii[
i + 1]);
177 static_cast<real>(numberOfBlades);
185 const uint numberOfBlades,
186 const uint numberOfPointsPerBlade,
189 const auto bladeRadii = computeBladeRadii(diameter, numberOfPointsPerBlade);
193 std::vector<real> bladeNormalCoefficients(numberOfPointsPerBlade);
194 for (
uint i = 0;
i < numberOfPointsPerBlade; ++
i) {
196 const real nextRadius = (
i + 1 == numberOfPointsPerBlade) ? c1o2 * diameter : bladeRadii[
i + 1];
198 const real chordArgument = c1o1 - std::pow(c4o1 * bladeRadii[
i] / diameter - c1o1, c2o1);
203 return bladeNormalCoefficients;
206struct DiskActuatorConfig
209 real hubDragCoefficient;
210 real hubSkinFrictionCoefficient;
211 std::vector<real> bladeNormalCoefficients;
216 const uint numberOfBlades,
217 const uint numberOfPointsPerBlade,
242 const uint numberOfPointsPerBlade = config.
getValue<
uint>(
"NUMBER_ALM_NODES_PER_SPAN");
249 const bool printFiles = config.
getValue<
bool>(
"FLAG_PRINT_FILES");
267 throw std::runtime_error(
"POSITION_DOMAIN must be [x_min,x_max],[y_min,y_max],[z_min,z_max].");
271 throw std::runtime_error(
"POSITION_DISK_CENTER must be [x],[y],[z].");
287 const real deltaT =
machNumber * deltaX / (std::sqrt(c3o1) * velocityInlet);
304 auto gridBuilder = std::make_shared<MultipleGridBuilder>();
306 gridBuilder->setPeriodicBoundaryCondition(
false,
false,
false);
307 gridBuilder->buildGrids(
false);
309 auto para = std::make_shared<Parameter>(&config);
310 para->worldLength =
xcp -
xcm;
311 para->setOutputPath(config.
getValue<std::string>(
"Path"));
312 para->setOutputPrefix(
"fields/disk");
313 para->setPrintFiles(printFiles);
317 para->setViscosityRatio(deltaX * deltaX / deltaT);
318 para->setDensityRatio(c1o1);
319 para->setOutflowPressureCorrectionFactor(c0o1);
320 para->configureMainKernel(vf::collision_kernel::compressible::K17CompressibleNavierStokes);
330 para->setIsBodyForce(
true);
333 gridBuilder->setVelocityBoundaryCondition(SideType::MX,
velocityLB, c0o1, c0o1);
334 gridBuilder->setPressureBoundaryCondition(SideType::PX, c1o1);
335 gridBuilder->setVelocityBoundaryCondition(SideType::MY,
velocityLB, c0o1, c0o1);
336 gridBuilder->setVelocityBoundaryCondition(SideType::PY,
velocityLB, c0o1, c0o1);
337 gridBuilder->setVelocityBoundaryCondition(SideType::MZ,
velocityLB, c0o1, c0o1);
338 gridBuilder->setVelocityBoundaryCondition(SideType::PZ,
velocityLB, c0o1, c0o1);
345 auto tmFactory = std::make_shared<TurbulenceModelFactory>(para);
346 tmFactory->readConfigFile(config);
351 auto cudaMemoryManager = std::make_shared<CudaMemoryManager>(para);
359 const std::vector<real> rotorSpeeds { c0o1 };
360 auto actuatorFarm = std::make_shared<ActuatorFarmStandalone>(
364 numberOfPointsPerBlade,
384 throw std::runtime_error(
"POSITION_PROBE_PLANE_Z must be [x_range],[y_range],[z_positions].");
404 auto probe = std::make_shared<Probe>(
407 para->getOutputPath(),
416 probe->addAllAvailableStatistics();
417 para->addSampler(
probe);
427 if (!config.
contains(
"VELOCITY_BOUNDARY_CONDITION"))
428 VF_LOG_INFO(
"Using default inlet velocity BC: VelocityInterpolatedCompressible");
441 }
catch (
const std::exception& e) {
#define VF_LOG_WARNING(...)
A base class for main simulation loop.
bool contains(const std::string &key) const
check if value associated with given key exists
T getValue(const std::string &key) const
get value with key
void setPressureBoundaryCondition(BoundaryConditionFactory::PressureBC boundaryConditionType)
VelocityBC
An enumeration for selecting a velocity boundary condition.
void setSlipBoundaryCondition(BoundaryConditionFactory::SlipBC boundaryConditionType)
void setVelocityBoundaryCondition(BoundaryConditionFactory::VelocityBC boundaryConditionType)
void setScalingFactory(const GridScalingFactory::GridScaling gridScalingType, const GridScalingFactory::GridScalingAdvectionDiffusion gridScalingTypeAdvectionDiffusion=GridScalingAdvectionDiffusion::NotSpecified)
static void initializeLogger()
int main(int argc, char *argv[])
const std::string defaultConfigFile
void run(string configname)
std::shared_ptr< T > SPtr
ConfigurationFile loadConfig(int argc, char *argv[], std::string configPath)