Main.
Get the total number of quadrature points (depends on n. modes)
INFLOW SECTION: X = 0; Y > 0.
SINGULARITY POINT: X = 0; Y = 0.
Definition of the 2D expansion using the mesh data specified on the session file –
Filling the 2D expansion using a recursive algorithm based on the mesh ordering ---------—
Generation .FLD file with one field only (at the moment) --------------------------------— Definition of the name of the .fld file
38 int i, j, numModes, nFields;
41 if ((argc != 2) && (argc != 3))
44 "Usage: ./FldAddFalknerSkanBL sessionFile [SysSolnType]\n");
50 LibUtilities::SessionReader::CreateInstance(argc, argv);
61 string stability_solver;
64 BL_type = vSession->GetSolverInfo(
"BL_type");
65 txt_file = vSession->GetSolverInfo(
"txt_file");
66 stability_solver = vSession->GetSolverInfo(
"stability_solver");
68 if (stability_solver !=
"velocity_correction_scheme" &&
69 stability_solver !=
"coupled_scheme")
71 fprintf(stderr,
"Error: You must specify the stability solver in the "
72 "session file properly.\n");
73 fprintf(stderr,
"Options: 'velocity_correction_scheme' [output ===> "
74 "(u,v,p)]; 'coupled_scheme' [output ===>(u,v)]\n");
78 vSession->LoadParameter(
"Re", Re, 1.0);
79 vSession->LoadParameter(
"L",
L, 1.0);
80 vSession->LoadParameter(
"U_inf", U_inf, 1.0);
81 vSession->LoadParameter(
"x", x, 1.0);
82 vSession->LoadParameter(
"x_0", x_0, 1.0);
83 vSession->LoadParameter(
"NumberLines_txt", numLines, 1.0);
89 "Error: x must be positive ===> CHECK the session file\n");
95 fprintf(stderr,
"Error: x_0 must be positive or at least equal to 0 "
96 "===> CHECK the session file\n");
99 std::cout <<
"\n==========================================================="
101 std::cout <<
"Falkner-Skan Boundary Layer Generation (version of July 12th "
103 std::cout <<
"============================================================="
105 std::cout <<
"*************************************************************"
107 std::cout <<
"DATA FROM THE SESSION FILE:\n";
108 std::cout <<
"Reynolds number = " << Re <<
"\t[-]"
110 std::cout <<
"Characteristic length = " <<
L <<
"\t\t[m]"
112 std::cout <<
"U_infinity = " << U_inf
113 <<
"\t[m/s]" << std::endl;
114 std::cout <<
"Position x (parallel case only) = " << x <<
"\t\t[m]"
116 std::cout <<
"Position x_0 to start the BL [m] = " << x_0
117 <<
"\t\t[m]" << std::endl;
118 std::cout <<
"Number of lines of the .txt file = " << numLines
119 <<
"\t[-]" << std::endl;
120 std::cout <<
"BL type = " << BL_type
122 std::cout <<
".txt file read = " << txt_file
124 std::cout <<
"Stability solver = "
125 << stability_solver << std::endl;
126 std::cout <<
"*************************************************************"
128 std::cout <<
"-------------------------------------------------------------"
130 std::cout <<
"MESH and EXPANSION DATA:\n";
137 graphShPt = SpatialDomains::MeshGraph::Read(vSession);
142 vSession, graphShPt, vSession->GetVariable(0));
146 nElements = Domain->GetExpSize();
147 std::cout <<
"Number of elements = " << nElements
152 nQuadraturePts = Domain->GetTotPoints();
153 std::cout <<
"Number of quadrature points = " << nQuadraturePts
163 Domain->GetCoords(x_QuadraturePts, y_QuadraturePts, z_QuadraturePts);
167 const char *txt_file_char;
169 txt_file_char = txt_file.c_str();
172 ifstream pFile(txt_file_char);
175 cout <<
"Errro: Unable to open the .txt file with the BL data\n";
179 numLines = numLines / 3;
181 std::vector<std::vector<NekDouble>> GlobalArray(3);
183 for (j = 0; j <= 2; j++)
185 GlobalArray[j].resize(numLines);
186 for (i = 0; i <= numLines - 1; i++)
189 GlobalArray[j][i] = d;
204 for (i = 0; i < numLines; i++)
206 eta[i] = GlobalArray[0][i];
207 f[i] = GlobalArray[1][i];
208 df[i] = GlobalArray[2][i];
235 if (BL_type ==
"Parallel")
237 for (i = 0; i < nQuadraturePts; i++)
239 eta_QuadraturePts[i] =
240 y_QuadraturePts[i] *
sqrt(U_inf / (2 * x * nu));
241 for (j = 0; j < numLines - 1; j++)
243 if (eta_QuadraturePts[i] >= eta[j] &&
244 eta_QuadraturePts[i] <= eta[j + 1])
246 f_QuadraturePts[i] = (eta_QuadraturePts[i] - eta[j]) *
248 (eta[j + 1] - eta[j]) +
250 df_QuadraturePts[i] = (eta_QuadraturePts[i] - eta[j]) *
251 (df[j + 1] - df[j]) /
252 (eta[j + 1] - eta[j]) +
256 else if (eta_QuadraturePts[i] == 1000000)
258 f_QuadraturePts[i] = f[numLines - 1];
259 df_QuadraturePts[i] = df[numLines - 1];
262 else if (eta_QuadraturePts[i] > eta[numLines - 1])
267 (eta_QuadraturePts[i] - eta[numLines - 1]);
268 df_QuadraturePts[i] = df[numLines - 1];
272 u_QuadraturePts[i] = U_inf * df_QuadraturePts[i];
274 nu *
sqrt(U_inf / (2.0 * nu * x)) *
275 (y_QuadraturePts[i] *
sqrt(U_inf / (2.0 * nu * x)) *
276 df_QuadraturePts[i] -
278 p_QuadraturePts[i] = 0.0;
285 if (BL_type ==
"nonParallel")
287 for (i = 0; i < nQuadraturePts; i++)
289 eta_QuadraturePts[i] =
291 sqrt(U_inf / (2 * (x_QuadraturePts[i] + x_0) * nu));
293 if ((x_QuadraturePts[i] + x_0) == 0)
295 eta_QuadraturePts[i] = 1000000;
298 for (j = 0; j < numLines - 1; j++)
300 if (eta_QuadraturePts[i] >= eta[j] &&
301 eta_QuadraturePts[i] <= eta[j + 1])
303 f_QuadraturePts[i] = (eta_QuadraturePts[i] - eta[j]) *
305 (eta[j + 1] - eta[j]) +
307 df_QuadraturePts[i] = (eta_QuadraturePts[i] - eta[j]) *
308 (df[j + 1] - df[j]) /
309 (eta[j + 1] - eta[j]) +
313 else if (eta_QuadraturePts[i] == 1000000)
315 f_QuadraturePts[i] = f[numLines - 1];
316 df_QuadraturePts[i] = df[numLines - 1];
319 else if (eta_QuadraturePts[i] > eta[numLines - 1])
324 (eta_QuadraturePts[i] - eta[numLines - 1]);
325 df_QuadraturePts[i] = df[numLines - 1];
329 u_QuadraturePts[i] = U_inf * df_QuadraturePts[i];
331 nu *
sqrt(U_inf / (2.0 * nu * (x_QuadraturePts[i] + x_0))) *
332 (y_QuadraturePts[i] *
333 sqrt(U_inf / (2.0 * nu * (x_QuadraturePts[i] + x_0))) *
334 df_QuadraturePts[i] -
338 if ((x_QuadraturePts[i] + x_0) == 0)
340 u_QuadraturePts[i] = U_inf;
341 v_QuadraturePts[i] = 0.0;
345 if ((x_QuadraturePts[i] + x_0) == 0 && y_QuadraturePts[i] == 0)
347 u_QuadraturePts[i] = 0.0;
348 v_QuadraturePts[i] = 0.0;
351 p_QuadraturePts[i] = 0.0;
359 etaOriginal = fopen(
"eta.txt",
"w+");
360 for (i = 0; i < numLines; i++)
362 fprintf(etaOriginal,
"%f %f %f \n", eta[i], f[i], df[i]);
367 yQ = fopen(
"yQ.txt",
"w+");
368 for (i = 0; i < nQuadraturePts; i++)
370 fprintf(yQ,
"%f %f %f %f %f %f %f\n", x_QuadraturePts[i],
371 y_QuadraturePts[i], u_QuadraturePts[i], v_QuadraturePts[i],
372 eta_QuadraturePts[i], f_QuadraturePts[i], df_QuadraturePts[i]);
381 vSession, graphShPt);
385 vSession, graphShPt);
389 vSession, graphShPt);
395 Basis = Domain->GetExp(0)->GetBasis(0);
398 std::cout <<
"Number of modes = " << numModes
402 Vmath::Vcopy(nQuadraturePts, u_QuadraturePts, 1, Exp2D_uk->UpdatePhys(), 1);
403 Vmath::Vcopy(nQuadraturePts, v_QuadraturePts, 1, Exp2D_vk->UpdatePhys(), 1);
404 Vmath::Vcopy(nQuadraturePts, p_QuadraturePts, 1, Exp2D_pk->UpdatePhys(), 1);
411 if (stability_solver ==
"velocity_correction_scheme")
415 Exp[0]->FwdTrans(Exp2D_uk->GetPhys(), Exp[0]->UpdateCoeffs());
416 Exp[1]->FwdTrans(Exp2D_vk->GetPhys(), Exp[1]->UpdateCoeffs());
418 if (stability_solver ==
"velocity_correction_scheme")
419 Exp[2]->FwdTrans(Exp2D_pk->GetPhys(), Exp[2]->UpdateCoeffs());
425 string FalknerSkan =
"FalknerSkan.fld";
428 if (stability_solver ==
"coupled_scheme")
431 if (stability_solver ==
"velocity_correction_scheme")
435 std::vector<LibUtilities::FieldDefinitionsSharedPtr> FieldDef =
436 Exp[0]->GetFieldDefinitions();
437 std::vector<std::vector<NekDouble>> FieldData(FieldDef.size());
439 for (j = 0; j < nFields; ++j)
441 for (i = 0; i < FieldDef.size(); ++i)
445 FieldDef[i]->m_fields.push_back(
"u");
449 FieldDef[i]->m_fields.push_back(
"v");
451 else if (j == 2 && stability_solver ==
"velocity_correction_scheme")
453 FieldDef[i]->m_fields.push_back(
"p");
455 Exp[j]->AppendFieldData(FieldDef[i], FieldData[i]);
461 std::cout <<
"-------------------------------------------------------------"
Represents a basis of a given type.
int GetNumModes() const
Return order of basis from the basis specification.
General purpose memory allocation routines with the ability to allocate from thread specific memory p...
void Write(const std::string &outFile, std::vector< FieldDefinitionsSharedPtr > &fielddefs, std::vector< std::vector< NekDouble >> &fielddata, const FieldMetaDataMap &fieldinfomap, const bool backup)
This function allows for data to be written to an FLD file when a session and/or communicator is not ...
std::shared_ptr< Basis > BasisSharedPtr
std::shared_ptr< SessionReader > SessionReaderSharedPtr
std::shared_ptr< ExpList > ExpListSharedPtr
Shared pointer to an ExpList object.
std::shared_ptr< ContField > ContFieldSharedPtr
std::shared_ptr< MeshGraph > MeshGraphSharedPtr
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
scalarT< T > sqrt(scalarT< T > in)