43 #include <boost/core/ignore_unused.hpp>
112 c = pow(v[3], (
Omega - 1.0));
113 dcdg = (
Omega - 1.0) * pow(v[3], (
Omega - 2.0));
124 dv[2] = -v[2] * (cp + v[0]) / c;
126 dv[4] = -v[4] * (cp +
m_Pr * v[0]) / c -
136 boost::ignore_unused(x);
146 for (
int i = 0; i < n; i++)
148 yt[i] = y[i] + hh * dydx[i];
153 for (
int i = 0; i < n; i++)
155 yt[i] = y[i] + hh * dyt[i];
160 for (
int i = 0; i < n; i++)
162 yt[i] = y[i] + h * dym[i];
163 dym[i] = dyt[i] + dym[i];
168 for (
int i = 0; i < n; i++)
170 yout[i] = y[i] + h6 * (dydx[i] + dyt[i] + 2 * dym[i]);
186 for (
int i = 0; i < nvar; i++)
199 RK4(v, dv, nvar, x, h, v);
203 cout <<
"bug" << endl;
209 for (
int i = 0; i < nvar; i++)
248 z[i] = z[i - 1] + 0.5 * (xx[i] - xx[i - 1]) * (ff[3][i] + ff[3][i - 1]);
249 dm = ff[3][i - 1] - ff[1][i - 1];
250 dd = ff[3][i] - ff[1][i];
251 sumd = sumd + 0.5 * (xx[i] - xx[i - 1]) * (dd + dm);
257 file3.open(
"physical_data.dat");
263 for (
int k = 0; k < 5; k++)
270 rho[i] = (1.0 / ff[3][i]);
273 velocity[i] = ff[0][i];
278 for (
int i = 0; i < nQuadraturePts; i++)
283 <<
" " << i <<
"/" << nQuadraturePts << endl;
286 xcher = x_QuadraturePts[i];
287 ycher = y_QuadraturePts[i];
291 rex = 0.5 * pow(((
m_Re) / scale), 2) + (
m_Re)*xin;
292 delsx =
sqrt(2.0 / rex) * scale * (xin)*
m_Pr;
293 scale = scale / delsx;
295 scale2 = ycher * (scale * delta) /
sqrt(
etamax);
296 coeff = 0.5 *
sqrt(2 / (xcher *
m_Re));
300 u_QuadraturePts[i] = 1;
301 rho_QuadraturePts[i] = 1;
302 T_QuadraturePts[i] = 1.0 / rho_QuadraturePts[i];
306 file3 << xcher <<
" " << ycher <<
" "
314 if ((z[j] <= scale2) && (z[j + 1] > scale2))
322 ASSERTL0(
false,
"Could not determine index in CompressibleBL");
325 u_QuadraturePts[i] = u[index];
326 rho_QuadraturePts[i] = rho[index];
327 T_QuadraturePts[i] = 1.0 / rho_QuadraturePts[i];
328 v_QuadraturePts[i] = coeff * (u[index] * scale2 - velocity[index]);
337 int main(
int argc,
char *argv[])
345 int i, j, k, numModes;
351 for (i = 0; i < nmax; i++)
367 LibUtilities::SessionReader::CreateInstance(argc, argv);
371 SpatialDomains::MeshGraph::Read(vSession);
373 int expdim = graphShPt->GetMeshDimension();
375 int nElements, nQuadraturePts = 0;
382 vSession, graphShPt, vSession->GetVariable(0));
385 nElements = Domain->GetExpSize();
386 std::cout <<
"Number of elements = " << nElements
390 nQuadraturePts = Domain->GetTotPoints();
391 std::cout <<
"Number of quadrature points = " << nQuadraturePts
398 Domain->GetCoords(x_QuadraturePts, y_QuadraturePts, z_QuadraturePts);
402 ASSERTL0(
false,
"Routine available for 2D and 3D problem only.")
406 vSession->LoadParameter(
"Re",
m_Re, 1.0);
407 vSession->LoadParameter(
"Mach",
m_Mach, 1.0);
408 vSession->LoadParameter(
"TInf",
m_Tinf, 1.0);
409 vSession->LoadParameter(
"Twall",
m_Twall, 1.0);
410 vSession->LoadParameter(
"Gamma",
m_Gamma, 1.0);
411 vSession->LoadParameter(
"Pr",
m_Pr, 1.0);
412 vSession->LoadParameter(
"L",
m_long, 1.0);
413 vSession->LoadParameter(
"rhoInf",
m_rhoInf, 1.0);
414 vSession->LoadParameter(
"uInf",
m_uInf, 1.0);
415 vSession->LoadParameter(
"GasConstant",
m_R, 1.0);
416 vSession->LoadParameter(
"vInf",
m_vInf, 1.0);
417 vSession->LoadParameter(
"mu",
m_mu, 1.0);
424 cout <<
"Number of points"
441 v[0] = 0.47 * pow(v[1], 0.21);
445 v[1] = 0.062 * pow(
m_Mach, 2) -
447 v[0] = 0.45 - 0.01 *
m_Mach + (
m_Tw - 1.0) * 0.06;
476 for (k = 0; k < maxit; k++)
494 cout <<
"err" << scientific << setprecision(9) <<
" " << err << endl;
500 cout <<
"Calculating" << endl;
502 y_QuadraturePts, u_QuadraturePts, v_QuadraturePts,
503 rho_QuadraturePts, T_QuadraturePts);
510 vstart[2] = v[0] + dv[0];
531 vstart[3] = v[1] + dv[1];
536 vstart[4] = v[1] + dv[1];
544 al11 = (f1[0] - f[0]) / dv[0];
545 al21 = (f1[1] - f[1]) / dv[0];
546 al12 = (f2[0] - f[0]) / dv[1];
547 al22 = (f2[1] - f[1]) / dv[1];
548 det = al11 * al22 - al21 * al12;
550 dv[0] = (-al22 * f[0] + al12 * f[1]) / det;
551 dv[1] = (al21 * f[0] - al11 * f[1]) / det;
556 else if (expdim == 3)
561 cout <<
"Calculating" << endl;
563 z_QuadraturePts, u_QuadraturePts, v_QuadraturePts,
564 rho_QuadraturePts, T_QuadraturePts);
571 vstart[2] = v[0] + dv[0];
592 vstart[3] = v[1] + dv[1];
597 vstart[4] = v[1] + dv[1];
605 al11 = (f1[0] - f[0]) / dv[0];
606 al21 = (f1[1] - f[1]) / dv[0];
607 al12 = (f2[0] - f[0]) / dv[1];
608 al22 = (f2[1] - f[1]) / dv[1];
609 det = al11 * al22 - al21 * al12;
611 dv[0] = (-al22 * f[0] + al12 * f[1]) / det;
612 dv[1] = (al21 * f[0] - al11 * f[1]) / det;
622 verif.open(
"similarity_solution.dat");
623 for (i = 0; i < nQuadraturePts; i++)
625 verif << scientific << setprecision(9) << x_QuadraturePts[i] <<
" \t "
626 << y_QuadraturePts[i] <<
" \t ";
627 verif << scientific << setprecision(9) << u_QuadraturePts[i] <<
" \t "
628 << v_QuadraturePts[i] <<
" \t ";
629 verif << scientific << setprecision(9) << rho_QuadraturePts[i]
630 <<
" \t " << T_QuadraturePts[i] << endl;
635 for (i = 0; i < nQuadraturePts; i++)
637 rho_QuadraturePts[i] = rho_QuadraturePts[i] *
m_rhoInf;
638 u_QuadraturePts[i] = u_QuadraturePts[i] *
m_uInf;
639 v_QuadraturePts[i] = v_QuadraturePts[i] *
m_uInf;
640 T_QuadraturePts[i] = T_QuadraturePts[i] *
m_Tinf;
642 T_QuadraturePts[i] = T_QuadraturePts[i] * rho_QuadraturePts[i] *
m_R;
643 T_QuadraturePts[i] = T_QuadraturePts[i] / (
m_Gamma - 1);
646 0.5 * rho_QuadraturePts[i] *
647 (pow(u_QuadraturePts[i], 2.0) + pow(v_QuadraturePts[i], 2.0));
649 u_QuadraturePts[i] = u_QuadraturePts[i] * rho_QuadraturePts[i];
650 v_QuadraturePts[i] = v_QuadraturePts[i] * rho_QuadraturePts[i];
657 vSession, graphShPt, vSession->GetVariable(0));
662 vSession, graphShPt);
666 vSession, graphShPt);
670 vSession, graphShPt);
674 vSession, graphShPt);
679 Basis = Domain->GetExp(0)->GetBasis(0);
682 std::cout <<
"Number of modes = " << numModes << std::endl;
686 Vmath::Vcopy(nQuadraturePts, u_QuadraturePts, 1, Exp2D_uk->UpdatePhys(),
688 Vmath::Vcopy(nQuadraturePts, v_QuadraturePts, 1, Exp2D_vk->UpdatePhys(),
691 Exp2D_rhok->UpdatePhys(), 1);
692 Vmath::Vcopy(nQuadraturePts, T_QuadraturePts, 1, Exp2D_Tk->UpdatePhys(),
702 Exp[0]->FwdTrans(Exp2D_rhok->GetPhys(), Exp[0]->UpdateCoeffs());
703 Exp[1]->FwdTrans(Exp2D_uk->GetPhys(), Exp[1]->UpdateCoeffs());
704 Exp[2]->FwdTrans(Exp2D_vk->GetPhys(), Exp[2]->UpdateCoeffs());
705 Exp[3]->FwdTrans(Exp2D_Tk->GetPhys(), Exp[3]->UpdateCoeffs());
708 cout << argv[1] << endl;
709 string tmp = argv[1];
710 int len = tmp.size();
711 for (i = 0; i < len - 4; ++i)
713 file_name += argv[1][i];
715 file_name = file_name +
".rst";
718 std::vector<LibUtilities::FieldDefinitionsSharedPtr> FieldDef =
719 Exp[0]->GetFieldDefinitions();
720 std::vector<std::vector<NekDouble>> FieldData(FieldDef.size());
722 for (j = 0; j < 4; j++)
724 for (i = 0; i < FieldDef.size(); i++)
728 FieldDef[i]->m_fields.push_back(
"rho");
732 FieldDef[i]->m_fields.push_back(
"rhou");
736 FieldDef[i]->m_fields.push_back(
"rhov");
740 FieldDef[i]->m_fields.push_back(
"E");
742 Exp[j]->AppendFieldData(FieldDef[i], FieldData[i]);
748 else if (expdim == 3)
752 vSession, graphShPt, vSession->GetVariable(0));
760 vSession, graphShPt);
764 vSession, graphShPt);
768 vSession, graphShPt);
772 vSession, graphShPt);
776 vSession, graphShPt);
781 Basis = Domain->GetExp(0)->GetBasis(0);
784 std::cout <<
"Number of modes = " << numModes << std::endl;
789 Exp3D_rhok->UpdatePhys(), 1);
790 Vmath::Vcopy(nQuadraturePts, u_QuadraturePts, 1, Exp3D_uk->UpdatePhys(),
792 Vmath::Vcopy(nQuadraturePts, w_QuadraturePts, 1, Exp3D_vk->UpdatePhys(),
794 Vmath::Vcopy(nQuadraturePts, v_QuadraturePts, 1, Exp3D_wk->UpdatePhys(),
796 Vmath::Vcopy(nQuadraturePts, T_QuadraturePts, 1, Exp3D_Tk->UpdatePhys(),
807 Exp[0]->FwdTrans(Exp3D_rhok->GetPhys(), Exp[0]->UpdateCoeffs());
808 Exp[1]->FwdTrans(Exp3D_uk->GetPhys(), Exp[1]->UpdateCoeffs());
809 Exp[2]->FwdTrans(Exp3D_vk->GetPhys(), Exp[2]->UpdateCoeffs());
810 Exp[3]->FwdTrans(Exp3D_wk->GetPhys(), Exp[3]->UpdateCoeffs());
811 Exp[4]->FwdTrans(Exp3D_Tk->GetPhys(), Exp[4]->UpdateCoeffs());
814 cout << argv[1] << endl;
815 string tmp = argv[1];
816 int len = tmp.size();
817 for (i = 0; i < len - 4; ++i)
819 file_name += argv[1][i];
821 file_name = file_name +
".rst";
824 std::vector<LibUtilities::FieldDefinitionsSharedPtr> FieldDef =
825 Exp[0]->GetFieldDefinitions();
826 std::vector<std::vector<NekDouble>> FieldData(FieldDef.size());
828 for (j = 0; j < 5; j++)
830 for (i = 0; i < FieldDef.size(); i++)
834 FieldDef[i]->m_fields.push_back(
"rho");
838 FieldDef[i]->m_fields.push_back(
"rhou");
842 FieldDef[i]->m_fields.push_back(
"rhov");
846 FieldDef[i]->m_fields.push_back(
"rhow");
850 FieldDef[i]->m_fields.push_back(
"E");
852 Exp[j]->AppendFieldData(FieldDef[i], FieldData[i]);
859 std::cout <<
"----------------------------------------------------\n";
860 std::cout <<
"\n=================================================\n";
861 std::cout <<
"Similarity solution \n";
862 std::cout <<
"===================================================\n";
863 std::cout <<
"***************************************************\n";
864 std::cout <<
"DATA FROM THE SESSION FILE:\n";
865 std::cout <<
"Reynolds number = " <<
m_Re <<
"\t[-]"
867 std::cout <<
"Mach number = " <<
m_Mach <<
"\t[-]"
869 std::cout <<
"Characteristic length = " <<
m_long <<
"\t[m]"
871 std::cout <<
"U_infinity = " <<
m_uInf <<
"\t[m/s]"
873 std::cout <<
"***************************************************\n";
874 std::cout <<
"---------------------------------------------------\n";
875 std::cout <<
"MESH and EXPANSION DATA:\n";
876 std::cout <<
"Done." << std::endl;
int main(int argc, char *argv[])
void RKDUMB(Array< OneD, NekDouble > vstart, int nvar, NekDouble x1, NekDouble x2, int m_xpoints, Array< OneD, NekDouble > xx, Array< OneD, Array< OneD, NekDouble >> y)
void COMPBL(Array< OneD, NekDouble > v, Array< OneD, NekDouble > dv)
void OUTPUT(int m_xpoints, Array< OneD, NekDouble > xx, Array< OneD, Array< OneD, NekDouble >> ff, int nQuadraturePts, Array< OneD, NekDouble > x_QuadraturePts, Array< OneD, NekDouble > y_QuadraturePts, Array< OneD, NekDouble > u_QuadraturePts, Array< OneD, NekDouble > v_QuadraturePts, Array< OneD, NekDouble > rho_QuadraturePts, Array< OneD, NekDouble > T_QuadraturePts)
void RK4(Array< OneD, NekDouble > y, Array< OneD, NekDouble > dydx, int n, NekDouble x, NekDouble h, Array< OneD, NekDouble > yout)
#define ASSERTL0(condition, msg)
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
The above copyright notice and this permission notice shall be included.
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
scalarT< T > sqrt(scalarT< T > in)