15 #define radiuses { 1.0, 2.0, 3.0, 4.0, 5.0 } 19 #define scales { 1.0 } 22 if (currentStep % 10 == 0)
28 std::vector<double> scale =
scales;
31 std::string circFileName = getPassport().dir +
"circ";
36 std::ofstream circFile(circFileName.c_str());
40 std::stringstream ssCirc;
41 ssCirc <<
"step time scale";
47 circFile << std::endl;
52 for (
int c = 0; c < scale.size(); ++c)
54 std::vector<double> circRad(rad.size(), 0.0);
65 for (
size_t i = 0; i < rad.size(); ++i)
70 #pragma omp parallel for default(none) private(L,gam,epsAst) shared(R,nPts,dist,c,scale) reduction(+:curCirc) schedule(dynamic,100) 71 for (
int j = 0; j < (int)
wake->vtx.size(); ++j)
73 L =
wake->vtx[j].r().length();
74 gam =
wake->vtx[j].g();
75 epsAst = scale[c] * velocity->wakeVortexesParams.epsastWake[j];
77 if (R - L > dist * epsAst)
79 else if (R - L > -dist * epsAst)
81 auto func = [R, L, epsAst, gam](
double phi) ->
double 83 return IDPI * exp(-
sqr(L / epsAst)) -
IDPI * exp(-(L * L - 2.0 * L * R * cos(phi) + R * R) /
sqr(epsAst)) + exp(-
sqr(L * sin(phi) / epsAst)) * L * cos(phi) * (erf(L * cos(phi) / epsAst) + erf((R - L * cos(phi)) / epsAst)) / (2.0 * sqrt(
PI) * epsAst);
86 double cft = dist * epsAst / (nPts * R);
88 for (
int s = 0; s < nPts; ++s)
89 curCirc += gam * 2.0 * cft * func((s + 0.5) * cft);
97 std::ofstream circFile(circFileName.c_str(), std::ios::app);
99 circFile << currentStep <<
" " << getPassport().physicalProperties.getCurrTime() <<
" " << scale[c];
101 for (
auto gamma : circRad)
102 circFile <<
" " << gamma;
103 circFile << std::endl;
void PrintHeaderToTextFile(std::ofstream &str, const std::string &header)
Формирование подзаголовка в текстовом файле вывода программы VM2D/VM3D.
T sqr(T x)
Возведение числа в квадрат
void PrintLogoToTextFile(std::ofstream &str, const std::string &fileName, const std::string &descr)
Формирование заголовка файла программы VM2D/VM3D.
R dist(const numvector< T, n > &x, const numvector< P, n > &y)
Вычисление расстояния между двумя точками