304 lines
7.3 KiB
C++
304 lines
7.3 KiB
C++
#include"function.h"
|
||
|
||
int K = 0; //initialization //双原子,r=1.4,K=(4-2r)/(r-1)=3
|
||
double Gamma = 2.0 / (K + 2) + 1.0; //initialization
|
||
|
||
double T_inf = 285; //the real temperature, 20 Celcius degree
|
||
double R_gas = 8.31441 / (28.959e-3); //initialization //the gas constant for real ideal air
|
||
double Mu = -1.0; // mu = rho*u*L/Re
|
||
double Nu = -1.0; // Nu = u*L/Re
|
||
TAU_TYPE tau_type=Euler; //无粘还是粘性问题
|
||
//tau_type, euler==0,ns==1,sutherland==2, Power_law==3
|
||
|
||
void Copy_Array(double* target, double* origin, int dim)
|
||
{
|
||
for (int i = 0; i < dim; i++)
|
||
{
|
||
target[i] = origin[i];
|
||
}
|
||
}
|
||
void Array_zero(double* target, int dim)
|
||
{
|
||
for (int i = 0; i < dim; i++)
|
||
{
|
||
target[i] = 0.0;
|
||
}
|
||
}
|
||
void Array_subtract(double* target, double* subtractor, int dim)
|
||
{
|
||
for (int i = 0; i < dim; i++)
|
||
{
|
||
target[i] -= subtractor[i];
|
||
}
|
||
}
|
||
|
||
void Array_scale(double* target, int dim, double value)
|
||
{
|
||
for (int i = 0; i < dim; i++)
|
||
{
|
||
target[i] *= value;
|
||
}
|
||
}
|
||
|
||
//从守恒变量计算原始变量
|
||
void Convar_to_primvar_1D(double* primvar, double convar[3])
|
||
{
|
||
primvar[0] = convar[0];
|
||
primvar[1] = U(convar[0], convar[1]);
|
||
primvar[2] = Pressure(convar[0], convar[1], convar[2]);
|
||
|
||
}
|
||
double Pressure(double density, double densityu, double densityE)
|
||
{
|
||
return (Gamma - 1) * (densityE - 0.5 * densityu * densityu / density);
|
||
}
|
||
double Temperature(double density, double pressure)
|
||
{
|
||
return pressure / R_gas / density;
|
||
}
|
||
double entropy(double density, double pressure)
|
||
{
|
||
return log(pressure / pow(density, Gamma));
|
||
}
|
||
double Soundspeed(double density, double pressure)
|
||
{
|
||
return sqrt(Gamma * pressure / density);
|
||
}
|
||
void Primvar_to_convar_1D(double* convar, double primvar[3])
|
||
{
|
||
convar[0] = primvar[0];
|
||
convar[1] = DensityU(primvar[0], primvar[1]);
|
||
convar[2] = DensityE(primvar[0], primvar[1], primvar[2]);
|
||
}
|
||
double DensityU(double density, double u)
|
||
{
|
||
return density * u;
|
||
}
|
||
double DensityE(double density, double u, double pressure)
|
||
{
|
||
return density * (pressure / density / (Gamma - 1) + 0.5 * (u * u));
|
||
}
|
||
void Convar_to_char1D(double* character, double primvar[3], double convar[3])
|
||
{
|
||
double c = sqrt(Gamma * primvar[2] / primvar[0]);
|
||
double alfa = (Gamma - 1.0) / (2.0 * c * c);
|
||
double u = primvar[1];
|
||
double s[3][3];
|
||
s[0][0] = alfa * (0.5 * u * u + u * c / (Gamma - 1.0));
|
||
s[0][1] = alfa * (-u - c / (Gamma - 1.0));
|
||
s[0][2] = alfa;
|
||
s[1][0] = alfa * (-u * u + 2.0 * c * c / (Gamma - 1.0));
|
||
s[1][1] = alfa * 2.0 * u;
|
||
s[1][2] = -2.0 * alfa;
|
||
s[2][0] = alfa * (0.5 * u * u - u * c / (Gamma - 1.0));
|
||
s[2][1] = alfa * (-u + c / (Gamma - 1.0));
|
||
s[2][2] = alfa;
|
||
|
||
for (int i = 0; i < 3; i++)
|
||
{
|
||
character[i] = 0;
|
||
}
|
||
for (int i = 0; i < 3; i++)
|
||
{
|
||
for (int j = 0; j < 3; j++)
|
||
{
|
||
character[i] = character[i] + s[i][j] * convar[j];
|
||
}
|
||
}
|
||
}
|
||
void Char_to_convar1D(double* convar, double primvar[3], double charvar[3])
|
||
{
|
||
double c = sqrt(Gamma * primvar[2] / primvar[0]);
|
||
double u = primvar[1];
|
||
double h = 0.5 * u * u + c * c / (Gamma - 1.0);
|
||
double s[3][3];
|
||
s[0][0] = 1.0;
|
||
s[0][1] = 1.0;
|
||
s[0][2] = 1.0;
|
||
s[1][0] = u - c;
|
||
s[1][1] = u;
|
||
s[1][2] = u + c;
|
||
s[2][0] = h - u * c;
|
||
s[2][1] = u * u / 2.0;
|
||
s[2][2] = h + u * c;
|
||
|
||
for (int i = 0; i < 3; i++)
|
||
{
|
||
convar[i] = 0;
|
||
for (int j = 0; j < 3; j++)
|
||
{
|
||
convar[i] = convar[i] + s[i][j] * charvar[j];
|
||
}
|
||
}
|
||
}
|
||
|
||
double U(double density, double q_densityu)
|
||
{
|
||
return q_densityu / density;
|
||
}
|
||
double V(double density, double q_densityv)
|
||
{
|
||
return q_densityv / density;
|
||
}
|
||
double Pressure(double density, double q_densityu, double q_densityv, double q_densityE)
|
||
{
|
||
return (Gamma - 1.0)*(q_densityE - 0.5*q_densityu*q_densityu / density - 0.5*q_densityv*q_densityv / density);
|
||
}
|
||
|
||
|
||
|
||
|
||
//从原始变量计算守恒变量
|
||
double Q_densityu(double density, double u)
|
||
{
|
||
double q_densityu = density*u;
|
||
return q_densityu;
|
||
}
|
||
double Q_densityv(double density, double v)
|
||
{
|
||
double q_densityv = density*v;
|
||
return q_densityv;
|
||
}
|
||
double Q_densityE(double density, double u, double v, double pressure)
|
||
{
|
||
double q_densityE = density*(pressure / density / (Gamma - 1) + 0.5*(u*u + v*v));
|
||
return q_densityE;
|
||
}
|
||
|
||
|
||
|
||
void Primvar_to_convar_2D(double *convar, double primvar[4])//2d version
|
||
{
|
||
convar[0] = primvar[0];
|
||
convar[1] = Q_densityu(primvar[0],primvar[1]);
|
||
convar[2] = Q_densityv(primvar[0],primvar[2]);
|
||
convar[3] = Q_densityE(primvar[0], primvar[1], primvar[2], primvar[3]);
|
||
}
|
||
void Convar_to_primvar_2D(double *primvar, double convar[4])//2d version //density, U, V, pressure
|
||
{
|
||
primvar[0] = convar[0];
|
||
primvar[1] = U(convar[0], convar[1]);
|
||
primvar[2] = V(convar[0], convar[2]);
|
||
primvar[3] = Pressure(convar[0], convar[1], convar[2], convar[3]);
|
||
}
|
||
|
||
void Convar_to_char(double *character, double *primvar, double convar[4])
|
||
{
|
||
double c = sqrt(Gamma *primvar[3] / primvar[0]);
|
||
double overc = 1.0 / c;
|
||
double alfa = (Gamma - 1.0)*0.5*overc*overc;
|
||
double u = primvar[1];
|
||
double v = primvar[2];
|
||
double s[4][4];
|
||
s[0][0] = 1.0 - alfa*(u*u + v*v);
|
||
s[0][1] = 2.0*alfa*u;
|
||
s[0][2] = 2.0*alfa*v;
|
||
s[0][3] = -2.0*alfa;
|
||
s[1][0] = -v;
|
||
s[1][1] = 0.;
|
||
s[1][2] = 1.;
|
||
s[1][3] = 0.;
|
||
s[2][0] = 0.5*(-u *overc + alfa*(u*u + v*v));
|
||
s[2][1] = 0.5 *overc - alfa*u;
|
||
s[2][2] = -alfa*v;
|
||
s[2][3] = alfa;
|
||
s[3][0] = 0.5*(u *overc + alfa*(u*u + v*v));
|
||
s[3][1] = -0.5 *overc - alfa*u;
|
||
s[3][2] = -alfa*v;
|
||
s[3][3] = alfa;
|
||
for (int i = 0; i < 4; i++)
|
||
{
|
||
character[i] = 0;
|
||
}
|
||
for (int i = 0; i < 4; i++)
|
||
{
|
||
for (int j = 0; j < 4; j++)
|
||
{
|
||
character[i] = character[i] + s[i][j] * convar[j];
|
||
}
|
||
}
|
||
}
|
||
void Char_to_convar(double *convar, double *primvar, double character[4])
|
||
{
|
||
double c = sqrt(Gamma *primvar[3] / primvar[0]);
|
||
double alfa = (Gamma - 1.0) / (2.0*c*c);
|
||
double u = primvar[1];
|
||
double v = primvar[2];
|
||
double s[4][4];
|
||
s[0][0] = 1.;
|
||
s[0][1] = 0.0;
|
||
s[0][2] = 1.0;
|
||
s[0][3] = 1.0;
|
||
s[1][0] = u;
|
||
s[1][1] = 0.;
|
||
s[1][2] = u + c;
|
||
s[1][3] = u - c;
|
||
s[2][0] = v;
|
||
s[2][1] = 1.;
|
||
s[2][2] = v;
|
||
s[2][3] = v;
|
||
s[3][0] = 0.5*(u*u + v*v);
|
||
s[3][1] = v;
|
||
s[3][2] = 0.5*(u*u + v*v) + c*u + c*c / (Gamma - 1.0);
|
||
s[3][3] = 0.5*(u*u + v*v) - c*u + c*c / (Gamma - 1.0);
|
||
|
||
for (int i = 0; i < 4; i++)
|
||
{
|
||
convar[i] = 0;
|
||
for (int j = 0; j < 4; j++)
|
||
{
|
||
convar[i] = convar[i] + s[i][j] * character[j];
|
||
}
|
||
}
|
||
}
|
||
|
||
void Global_to_Local(double* change, double *normal)
|
||
{
|
||
double temp[2];
|
||
temp[0] = change[1];
|
||
temp[1] = change[2];
|
||
change[1] = temp[0] * normal[0] + temp[1] * normal[1];
|
||
change[2] = -temp[0] * normal[1] + temp[1] * normal[0];
|
||
}
|
||
|
||
void Global_to_Local(double* change, double* origin, double* normal)
|
||
{
|
||
change[0] = origin[0];
|
||
change[1] = origin[1] * normal[0] + origin[2] * normal[1];
|
||
change[2] = -origin[1] * normal[1] + origin[2] * normal[0];
|
||
change[3] = origin[3];
|
||
}
|
||
|
||
void Local_to_Global(double *change,double *normal)
|
||
{
|
||
double temp[2];
|
||
temp[0] = change[1];
|
||
temp[1] = change[2];
|
||
change[1] = temp[0] * normal[0] - temp[1] * normal[1];
|
||
change[2] = temp[0] * normal[1] + temp[1] * normal[0];
|
||
}
|
||
|
||
void Local_to_Global(double* change, double* origin, double *normal)
|
||
{
|
||
change[0] = origin[0];
|
||
change[1] = origin[1] * normal[0] - origin[2] * normal[1];
|
||
change[2] = origin[1] * normal[1] + origin[2] * normal[0];
|
||
change[3] = origin[3];
|
||
}
|
||
|
||
double Dtx(double dtx, double dx, double CFL, double density, double u,double v, double pressure)
|
||
{
|
||
double tmp;
|
||
tmp = sqrt(u*u+v*v) + sqrt(Gamma *pressure / density);
|
||
if (tmp>CFL*dx / dtx)
|
||
{
|
||
dtx = CFL*dx / tmp;
|
||
}
|
||
if (dtx > 0.25*CFL*dx*dx / Mu&&tau_type == NS&&Mu>0)
|
||
{
|
||
dtx = 0.25*CFL*dx*dx / Mu;
|
||
}
|
||
return dtx;
|
||
}
|
||
|