43 #include <boost/core/ignore_unused.hpp>
114 c = pow(v[3], (
Omega-1.0));
115 dcdg = (
Omega - 1.0) * pow(v[3], (
Omega - 2.0));
126 dv[2] = - v[2] * (cp + v[0]) / c;
128 dv[4] = - v[4] * (cp +
m_Pr * v[0]) / c -
143 boost::ignore_unused(x);
153 for (
int i = 0; i < n ; i++)
155 yt[i] = y[i] + hh * dydx[i];
160 for (
int i = 0; i < n; i++)
162 yt[i] = y[i] + hh * dyt[i];
167 for (
int i = 0; i < n; i++)
169 yt[i] = y[i] + h * dym[i];
170 dym[i] = dyt[i] + dym[i];
175 for (
int i = 0; i < n; i++)
177 yout[i] = y[i] + h6 * (dydx[i] + dyt[i] + 2 * dym[i]);
198 for (
int i = 0; i < nvar; i++)
211 RK4 (v, dv, nvar, x, h, v);
215 cout <<
"bug" << endl;
221 for (
int i = 0; i < nvar; i++)
263 z[i] = z[i-1] + 0.5 * (xx[i] - xx[i-1]) * (ff[3][i] + ff[3][i-1]);
264 dm = ff[3][i-1] - ff[1][i-1];
265 dd = ff[3][i] - ff[1][i];
266 sumd = sumd + 0.5 * (xx[i] - xx[i-1]) * (dd + dm);
272 file3.open(
"physical_data.dat");
278 for (
int k = 0; k < 5; k++)
285 rho[i] = (1.0 / ff[3][i]);
288 velocity[i] = ff[0][i] ;
293 for (
int i = 0; i < nQuadraturePts; i++)
297 cout <<
"i" <<
" " << i <<
"/" << nQuadraturePts << endl;
300 xcher = x_QuadraturePts[i];
301 ycher = y_QuadraturePts[i];
305 rex = 0.5 * pow(((
m_Re) / scale), 2) + (
m_Re) * xin;
306 delsx =
sqrt(2.0 / rex) * scale * (xin)*
m_Pr;
307 scale = scale / delsx;
309 scale2 = ycher * (scale * delta) /
sqrt(
etamax) ;
310 coeff = 0.5 *
sqrt( 2 / (xcher*
m_Re)) ;
314 u_QuadraturePts[i] = 1;
315 rho_QuadraturePts[i] = 1;
316 T_QuadraturePts[i] = 1.0 / rho_QuadraturePts[i];
317 v_QuadraturePts[i] = coeff * (z[
m_xpoints-3] -
320 file3 << xcher <<
" "
331 if ((z[j] <= scale2) && (z[j+1] > scale2))
339 ASSERTL0(
false,
"Could not determine index in CompressibleBL");
342 u_QuadraturePts[i] = u[index];
343 rho_QuadraturePts[i] = rho[index];
344 T_QuadraturePts[i] = 1.0/rho_QuadraturePts[i];
345 v_QuadraturePts[i] = coeff * (u[index]*scale2 - velocity[index]);
355 int main(
int argc,
char *argv[])
363 int i, j, k, numModes;
369 for (i = 0; i < nmax; i++)
385 = LibUtilities::SessionReader::CreateInstance(argc, argv);
389 = SpatialDomains::MeshGraph::Read(vSession);
391 int expdim = graphShPt->GetMeshDimension();
393 int nElements, nQuadraturePts = 0;
401 vSession->GetVariable(0));
404 nElements = Domain->GetExpSize();
405 std::cout <<
"Number of elements = "
406 << nElements << std::endl;
409 nQuadraturePts = Domain->GetTotPoints();
410 std::cout <<
"Number of quadrature points = "
411 << nQuadraturePts << std::endl;
417 Domain->GetCoords(x_QuadraturePts, y_QuadraturePts, z_QuadraturePts);
421 ASSERTL0(
false,
"Routine available for 2D and 3D problem only.")
425 vSession->LoadParameter(
"Re",
m_Re, 1.0);
426 vSession->LoadParameter(
"Mach",
m_Mach, 1.0);
427 vSession->LoadParameter(
"TInf",
m_Tinf, 1.0);
428 vSession->LoadParameter(
"Twall",
m_Twall, 1.0);
429 vSession->LoadParameter(
"Gamma",
m_Gamma, 1.0);
430 vSession->LoadParameter(
"Pr",
m_Pr, 1.0);
431 vSession->LoadParameter(
"L",
m_long, 1.0);
432 vSession->LoadParameter(
"rhoInf",
m_rhoInf, 1.0);
433 vSession->LoadParameter(
"uInf",
m_uInf, 1.0);
434 vSession->LoadParameter(
"GasConstant",
m_R, 1.0);
435 vSession->LoadParameter(
"vInf",
m_vInf, 1.0);
436 vSession->LoadParameter(
"mu",
m_mu, 1.0);
443 cout <<
"Number of points" <<
" " <<
m_xpoints << endl;
459 v[0] = 0.47 * pow(v[1], 0.21);
463 v[1] = 0.062 * pow(
m_Mach, 2) - 0.1 * (
m_Tw - 1.0) *
465 v[0] = 0.45 - 0.01 *
m_Mach + (
m_Tw - 1.0) * 0.06;
494 for (k = 0; k < maxit; k++)
513 cout <<
"err" << scientific << setprecision(9) <<
" " << err << endl;
519 cout <<
"Calculating" << endl;
521 y_QuadraturePts, u_QuadraturePts, v_QuadraturePts,
522 rho_QuadraturePts, T_QuadraturePts);
529 vstart[2] = v[0] + dv[0];
550 vstart[3] = v[1] + dv[1];
555 vstart[4] = v[1] + dv[1];
563 al11 = (f1[0] - f[0]) / dv[0];
564 al21 = (f1[1] - f[1]) / dv[0];
565 al12 = (f2[0] - f[0]) / dv[1];
566 al22 = (f2[1] - f[1]) / dv[1];
567 det = al11 * al22 - al21 * al12;
569 dv[0] = ( - al22 * f[0] + al12 * f[1]) / det;
570 dv[1] = (al21 * f[0] - al11 * f[1]) / det;
575 else if (expdim == 3)
580 cout <<
"Calculating" << endl;
582 z_QuadraturePts, u_QuadraturePts, v_QuadraturePts,
583 rho_QuadraturePts, T_QuadraturePts);
590 vstart[2] = v[0] + dv[0];
611 vstart[3] = v[1] + dv[1];
616 vstart[4] = v[1] + dv[1];
624 al11 = (f1[0] - f[0]) / dv[0];
625 al21 = (f1[1] - f[1]) / dv[0];
626 al12 = (f2[0] - f[0]) / dv[1];
627 al22 = (f2[1] - f[1]) / dv[1];
628 det = al11 * al22 - al21 * al12;
630 dv[0] = ( - al22 * f[0] + al12 * f[1]) / det;
631 dv[1] = (al21 * f[0] - al11 * f[1]) / det;
641 verif.open(
"similarity_solution.dat");
642 for (i=0; i< nQuadraturePts; i++)
644 verif << scientific << setprecision(9) << x_QuadraturePts[i]
645 <<
" \t " << y_QuadraturePts[i] <<
" \t " ;
646 verif << scientific << setprecision(9) << u_QuadraturePts[i]
647 <<
" \t " << v_QuadraturePts[i] <<
" \t " ;
648 verif << scientific << setprecision(9) << rho_QuadraturePts[i]
649 <<
" \t " << T_QuadraturePts[i] << endl;
654 for (i = 0; i < nQuadraturePts; i++)
656 rho_QuadraturePts[i] = rho_QuadraturePts[i] *
m_rhoInf;
657 u_QuadraturePts[i] = u_QuadraturePts[i] *
m_uInf;
658 v_QuadraturePts[i] = v_QuadraturePts[i] *
m_uInf;
659 T_QuadraturePts[i] = T_QuadraturePts[i] *
m_Tinf;
661 T_QuadraturePts[i] = T_QuadraturePts[i] * rho_QuadraturePts[i] *
m_R;
662 T_QuadraturePts[i] = T_QuadraturePts[i] / (
m_Gamma-1);
663 T_QuadraturePts[i] = T_QuadraturePts[i] + 0.5 * rho_QuadraturePts[i] * (
664 pow(u_QuadraturePts[i], 2.0) + pow(v_QuadraturePts[i], 2.0));
666 u_QuadraturePts[i] = u_QuadraturePts[i] * rho_QuadraturePts[i];
667 v_QuadraturePts[i] = v_QuadraturePts[i] * rho_QuadraturePts[i];
696 Basis = Domain->GetExp(0)->GetBasis(0);
699 std::cout <<
"Number of modes = " << numModes << std::endl;
704 Exp2D_uk->UpdatePhys(), 1);
706 Exp2D_vk->UpdatePhys(), 1);
708 Exp2D_rhok->UpdatePhys(), 1);
710 Exp2D_Tk->UpdatePhys(), 1);
719 Exp[0]->FwdTrans(Exp2D_rhok->GetPhys(), Exp[0]->UpdateCoeffs());
720 Exp[1]->FwdTrans(Exp2D_uk->GetPhys(), Exp[1]->UpdateCoeffs());
721 Exp[2]->FwdTrans(Exp2D_vk->GetPhys(), Exp[2]->UpdateCoeffs());
722 Exp[3]->FwdTrans(Exp2D_Tk->GetPhys(), Exp[3]->UpdateCoeffs());
725 cout << argv[1] << endl;
726 string tmp = argv[1];
727 int len = tmp.size();
728 for (i = 0; i < len-4; ++i)
730 file_name += argv[1][i];
732 file_name = file_name+
".rst";
735 std::vector<LibUtilities::FieldDefinitionsSharedPtr>
736 FieldDef = Exp[0]->GetFieldDefinitions();
737 std::vector<std::vector<NekDouble> > FieldData(FieldDef.size());
739 for (j = 0; j < 4; j++)
741 for (i = 0; i < FieldDef.size(); i++)
745 FieldDef[i]->m_fields.push_back(
"rho");
749 FieldDef[i]->m_fields.push_back(
"rhou");
753 FieldDef[i]->m_fields.push_back(
"rhov");
757 FieldDef[i]->m_fields.push_back(
"E");
759 Exp[j]->AppendFieldData(FieldDef[i], FieldData[i]);
765 else if (expdim == 3)
798 Basis = Domain->GetExp(0)->GetBasis(0);
801 std::cout<<
"Number of modes = " << numModes << std::endl;
806 Exp3D_rhok->UpdatePhys(), 1);
808 Exp3D_uk->UpdatePhys(), 1);
810 Exp3D_vk->UpdatePhys(), 1);
812 Exp3D_wk->UpdatePhys(), 1);
814 Exp3D_Tk->UpdatePhys(), 1);
824 Exp[0]->FwdTrans(Exp3D_rhok->GetPhys(), Exp[0]->UpdateCoeffs());
825 Exp[1]->FwdTrans(Exp3D_uk->GetPhys(), Exp[1]->UpdateCoeffs());
826 Exp[2]->FwdTrans(Exp3D_vk->GetPhys(), Exp[2]->UpdateCoeffs());
827 Exp[3]->FwdTrans(Exp3D_wk->GetPhys(), Exp[3]->UpdateCoeffs());
828 Exp[4]->FwdTrans(Exp3D_Tk->GetPhys(), Exp[4]->UpdateCoeffs());
831 cout << argv[1] << endl;
832 string tmp = argv[1];
833 int len = tmp.size();
834 for (i = 0; i < len-4; ++i)
836 file_name += argv[1][i];
838 file_name = file_name+
".rst";
841 std::vector<LibUtilities::FieldDefinitionsSharedPtr>
842 FieldDef = Exp[0]->GetFieldDefinitions();
843 std::vector<std::vector<NekDouble> > FieldData(FieldDef.size());
845 for (j = 0; j < 5; j++)
847 for (i = 0; i < FieldDef.size(); i++)
851 FieldDef[i]->m_fields.push_back(
"rho");
855 FieldDef[i]->m_fields.push_back(
"rhou");
859 FieldDef[i]->m_fields.push_back(
"rhov");
863 FieldDef[i]->m_fields.push_back(
"rhow");
867 FieldDef[i]->m_fields.push_back(
"E");
869 Exp[j]->AppendFieldData(FieldDef[i], FieldData[i]);
876 std::cout <<
"----------------------------------------------------\n";
877 std::cout <<
"\n=================================================\n";
878 std::cout <<
"Similarity solution \n";
879 std::cout <<
"===================================================\n";
880 std::cout <<
"***************************************************\n";
881 std::cout <<
"DATA FROM THE SESSION FILE:\n";
882 std::cout <<
"Reynolds number = " <<
m_Re
883 <<
"\t[-]" << std::endl;
884 std::cout <<
"Mach number = " <<
m_Mach
885 <<
"\t[-]" << std::endl;
886 std::cout <<
"Characteristic length = " <<
m_long
887 <<
"\t[m]" << std::endl;
888 std::cout <<
"U_infinity = " <<
m_uInf
889 <<
"\t[m/s]" << std::endl;
890 std::cout <<
"***************************************************\n";
891 std::cout <<
"---------------------------------------------------\n";
892 std::cout <<
"MESH and EXPANSION DATA:\n";
893 std::cout <<
"Done." << std::endl;
int main(int argc, char *argv[])
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 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 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...
std::shared_ptr< Basis > BasisSharedPtr
std::shared_ptr< SessionReader > SessionReaderSharedPtr
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< 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)