⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rjfuncs.cpp

📁 常用气动函数C++类代码,适用于航空工程计算
💻 CPP
字号:
// RJFuncs.cpp: implementation of the RJFuncs class.
//
//////////////////////////////////////////////////////////////////////
#include "stdio.h"
#include "math.h"
#include "RJFuncs.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

RJFuncs::RJFuncs()
{
}

RJFuncs::~RJFuncs()
{
}

double RJFuncs::PI(double LM,double K)
//PI函数,表示流体静压与总压的关系,
//是速度系数LM和比热比K的函数
{
    double PI_O;
    PI_O=pow(1.0-(K-1.0)*LM*LM/(K+1.0),K/(K-1.0));
    return (PI_O);
}

double RJFuncs::TOR(double LM,double K)
//TOR函数,表达静温与总温的关系,
//是速度系数LM与比热比K的函数
{
    double TOR_O;
    TOR_O=1.0-(K-1.0)*LM*LM/(K+1.0);
    return (TOR_O);
}

double RJFuncs::APS(double LM,double K)
//APS函数,表达与的关系,
//是速度系数LM与比热比K的函数
{
    double APS_O;
    APS_O=pow(1.0-(K-1.0)*LM*LM/(K+1.0),1.0/(K-1.0));
    return (APS_O);
}

double RJFuncs::QL( double LM,double K)
{
    double QL_O;
    QL_O=LM*pow((K+1.0)/2.0,1.0/(K-1.0))*APS(LM,K);
    return (QL_O);
}

double RJFuncs::YL(double LM,double K)
{
    double YL_O;
    YL_O=LM*pow((K+1.0)/2.0,1.0/(K-1))/(1.0-(K-1.0)*LM*LM/(K+1.0));
    return (YL_O);
}

double RJFuncs::FL(double LM,double K)
{
   double FL_O;
   FL_O=(1+LM*LM)*pow(1.0-(K-1.0)*LM*LM/(K+1.0),1.0/(K-1.0));
   return (FL_O);
}

double RJFuncs::RL(double LM,double K)
{
    double RL_O;
    RL_O=(1.0-(K-1.0)*LM*LM/(K+1.0))/(1+LM*LM);
    return (RL_O);
}

double RJFuncs::ZL(double LM)
{
	double ZL_O;
	ZL_O=LM+1.0/LM;
	return (ZL_O);
}

double RJFuncs::Ma_To_LM(double Ma,double K)
{
 double LM,Tmp_V;
 Tmp_V=Ma*Ma*(K+1.0)/(2.0+(K-1)*Ma*Ma);
 LM=sqrt(Tmp_V);
 return (LM);
}

double RJFuncs::QL_To_LM(double QL_O,double K,int N)
{
	double LM,A,B,C;
	if ((1-QL_O)<0.001)
	{
		LM=1.0;
	    return(LM);
	}
	else
    {
      if (N==0)
	  {A=1.0;B=0.0;}
	  else  {A=sqrt((K+1.0)/(K-1.0))-0.001;B=1.0;}
	  do
	  {
       C=B-(QL(B,K)-QL_O)*(B-A)/(QL(B,K)-QL(A,K));
       A=B;
	   B=C;
	  }
	  while(fabs(QL(C,K)-QL_O)>0.0001);
	  LM=C;
	  return(LM);
	}
}

double RJFuncs::BZ(double R,double K)
{
 double BZ_O;
 BZ_O=sqrt(2.0*R*(K+1.0)/K);
 return (BZ_O);
}

double RJFuncs::QM(double R,double K)
{
 double QM_O;
 QM_O=sqrt(pow(2.0/(K+1.0),(K+1.0)/(K-1.0))*K/R);
 return (QM_O);
}

double RJFuncs::PI_To_LM(double PI_O,double K)
{
 double LM;
 LM=sqrt((1-pow(PI_O,(K-1.0)/K))*(K+1.0)/(K-1.0));
 return (LM);
}

void RJFuncs::Air(double HE,double &TH,double &PH,double &RU,double &AV,double &GH)
{
  double HG,TS,PS,RUS,GHS;//T,P,Ru,g of heignt 0;
  double W;  //coefficient
  HG=HE/(1.0+HE/6356766.0);
  TS=288.15;
  PS=101325.0;
  RUS=1.225;
  GHS=9.80665;
  if(HG<11019.1)
  {
   W=1.0-HG/44330.8;
   TH=TS*W;
   PH=PS*pow(W,5.2559);
   RU=RUS*pow(W,4.25559);
  }
  else
  {
    if(HG<20063.1)
	{
		W=exp((14964.7-HG)/6341.6);
		TH=216.65;
        PH=PS*0.11953*W;
        RU=RUS*0.15898*W;
	}
	else
	{
		W=1.0+(HG-24902.1)/221552.0;
		TH=221.552*W;
        PH=PS*0.025158*pow(W,-34.1629);
        RU=RUS*0.032722*pow(W,-35.1629);
	}
  }
  AV=20.0468*sqrt(TH);
  GH=GHS/pow(1.0+HG/6356766,2.0);
}


 double RJFuncs::CAZ1(double x[],double y[],int n,double t)
 { int i,j,k,m;
    double z,s;
    z=0.0;
    if (n<1) return(z);
    if (n==1) { z=y[0]; return(z);}
    if (n==2)
      { z=(y[0]*(t-x[1])-y[1]*(t-x[0]))/(x[0]-x[1]);
        return(z);
      }
    if (t<=x[1]) { k=0; m=2;}
    else if (t>=x[n-2]) { k=n-3; m=n-1;}
    else
      { k=1; m=n;
        while (m-k!=1)
          { i=(k+m)/2;
            if (t<x[i-1]) m=i;
            else k=i;
          }
        k=k-1; m=m-1;
        if (fabs(t-x[k])<fabs(t-x[m])) k=k-1;
        else m=m+1;
      }
    z=0.0;
    for (i=k;i<=m;i++)
      { s=1.0;
        for (j=k;j<=m;j++)
          if (j!=i) s=s*(t-x[j])/(x[i]-x[j]);
        z=z+s*y[i];
      }
    return(z);
 }


 double RJFuncs::CAZ2(double x[],double y[],double z[],int n,int m,double u,double v)
 { int nn,mm,ip,iq,i,j,k,l;
    double b[3],h,w;
    nn=3;
    if (n<=3) { ip=0;  nn=n;}
    else if (u<=x[1]) ip=0;
    else if (u>=x[n-2]) ip=n-3;
    else
      { i=1; j=n;
        while (((i-j)!=1)&&((i-j)!=-1))
          { l=(i+j)/2;
            if (u<x[l-1]) j=l;
            else i=l;
          }
        if (fabs(u-x[i-1])<fabs(u-x[j-1])) ip=i-2;
        else ip=i-1;
      }
    mm=3;
    if (m<=3) { iq=0; mm=m;}
    else if (v<=y[1]) iq=0;
    else if (v>=y[m-2]) iq=m-3;
    else
      { i=1; j=m;
        while (((i-j)!=1)&&((i-j)!=-1))
          { l=(i+j)/2;
            if (v<y[l-1]) j=l;
            else i=l;
          }
        if (fabs(v-y[i-1])<fabs(v-y[j-1])) iq=i-2;
        else iq=i-1;
      }
    for (i=0;i<=nn-1;i++)
      { b[i]=0.0;
        for (j=0;j<=mm-1;j++)
          { k=m*(ip+i)+(iq+j);
            h=z[k];
            for (k=0;k<=mm-1;k++)
              if (k!=j)
                h=h*(v-y[iq+k])/(y[iq+j]-y[iq+k]);
            b[i]=b[i]+h;
          }
      }
    w=0.0;
    for (i=0;i<=nn-1;i++)
      { h=b[i];
        for (j=0;j<=nn-1;j++)
          if (j!=i)
            h=h*(u-x[ip+j])/(x[ip+i]-x[ip+j]);
        w=w+h;
      }
    return(w);
 }

double RJFuncs::AQL2( double QL_O,double K)
{   //求QL(LM)之大于1.0之LM
	double a=1.0;
	double b=sqrt((K+1.0)/(K-1.0))-0.001;
	double f1,f2,f3;	
	double LM;
	if(fabs(QL_O-1.0)<0.001){LM=1.0;}
	else
	{
	do
	{
          f1=QL_O-QL(a,K);
	  f2=QL_O-QL(b,K);
	  f3=QL_O-QL((a+b)/2.0,K);
          if (f1*f3<0) b=(a+b)/2.0;
	  else a=(a+b)/2.0;
	  if (fabs(f3)<1e-10){LM=(a+b)/2.0;break;}
	}while(1);
	}
        return (LM);
}

 double RJFuncs::CAZ22(double x[],double y[],double z[],int n,int m,double u,double v)
 {
   int n1,n2,m1,m2,i;
   double z11,z12,z21,z22;
   if(x[1]>x[0])
   {
    if(u<=x[0])  
    {
	 n1=0;n2=1;
    }
    else
    {
 	 if(u>=x[n-1])
	 {
	  n1=n-2;
	  n2=n-1;
	 }
	 else
	 {
      for(i=1;i<n;i++)
      {
		 if(u<x[i]) {n1=i-1;n2=i;break;}
      }
	 }
	}
   }
   else
   {
     if(u>=x[0])  
    {
	 n1=0;n2=1;
    }
    else
    {
 	 if(u<=x[n-1])
	 {
	  n1=n-2;
	  n2=n-1;
	 }
	 else
	 {
      for(i=1;i<n;i++)
      {
		 if(u>x[i]) {n1=i-1;n2=i;break;}
      }
	 }
	}
   }
   
   if(y[1]>y[0])
   {
     if(v<=y[0])  
     {
	  m1=0;m2=1;
     }
     else
     {
	  if(v>=y[m-1])
	  {
	   m1=m-2;
	   m2=m-1;
	  }
	  else
	  {
       for(i=1;i<m;i++)
       {
		 if(v<y[i]) {m1=i-1;m2=i;break;}
       }
	  }
	 }
   }
   else
   {
    if(v>=y[0])  
     {
	  m1=0;m2=1;
     }
     else
     {
	  if(v<=y[m-1])
	  {
	   m1=m-2;
	   m2=m-1;
	  }
	  else
	  {
       for(i=1;i<m;i++)
       {
		 if(v>y[i]) {m1=i-1;m2=i;break;}
       }
	  }
	 }
   }
   z11=z[n1*m+m1];
   z12=z[n1*m+m2];
   z21=z[n2*m+m1];
   z22=z[n2*m+m2];
   ////////////////
   //      Znm
   //     n1 n2
   // m1 z11,z21  z1
   // m2 z12,z22  z2
   //////////////

   double z1,z2,z3;
   z1=z11+(z21-z11)*(u-x[n1])/(x[n2]-x[n1]);
   z2=z12+(z22-z12)*(u-x[n1])/(x[n2]-x[n1]);
   z3=z1+(z2-z1)*(v-y[m1])/(y[m2]-y[m1]);
   return(z3);
 }

 double RJFuncs::CAZ11(double x[],double y[],int n,double t)
 {
   int n1,n2,i;
   double z;
   if(x[1]>x[0])
   {
    if(t<=x[0])  
    {
	 n1=0;n2=1;
    }
    else
    {
 	 if(t>=x[n-1])
	 {
	  n1=n-2;
	  n2=n-1;
	 }
	 else
	 {
      for(i=1;i<n;i++)
      {
		 if(t<x[i]) {n1=i-1;n2=i;break;}
      }
	 }
	}
   }
   else
   {
     if(t>=x[0])  
    {
	 n1=0;n2=1;
    }
    else
    {
 	 if(t<=x[n-1])
	 {
	  n1=n-2;
	  n2=n-1;
	 }
	 else
	 {
      for(i=1;i<n;i++)
      {
		 if(t>x[i]) {n1=i-1;n2=i;break;}
      }
	 }
	}
   }
   z=y[n1]+(y[n2]-y[n1])*(t-x[n1])/(x[n2]-x[n1]);
   return (z);
 }

double RJFuncs::LM_To_Ma(double LM,double K)
{
  double M;
  M=sqrt(2.0/(K+1.0))*LM*pow(1.0-(K-1.0)*LM*LM/(K+1.0),-0.5);
  return (M);
}


double RJFuncs::ShockAngleOfMDA(double Ma,double k)
//某马赫数最大气流偏转角对应激波角
{
   double sin_em;
   sin_em=1.0/(k*Ma*Ma)*((k+1.0)*Ma*Ma/4.0-1.0+sqrt((k+1.0)*(1+(k-1.0)*Ma*Ma/2.0+(k+1)*pow(Ma,4)/16.0)));
   double ShockAngle=asin(sqrt(sin_em))*RAD;
   return (ShockAngle);
}

double RJFuncs::MaxDeflectAngle(double Ma,double k)
//对应某马赫数的最大气流偏转角
{
   double ShockAngle=ShockAngleOfMDA(Ma,k)/RAD;
   double DeflectAngle=RAD*atan(1.0/(((k+1)*Ma*Ma/(2*Ma*Ma*pow(sin(ShockAngle),2)-2.0)-1.0)*tan(ShockAngle)));
   return (DeflectAngle);
  }
  
  double RJFuncs::ShockAngleFunc(double Ma,double DeflectAngle,double ShockAngle,double k)
  //激波角与马赫数,气流偏转角的函数关系
  {
	  double erro;
	  erro=tan(DeflectAngle/RAD)-(pow(Ma,2.0)*pow(sin(ShockAngle/RAD),2.0)-1.0)/((pow(Ma,2.0)*((k+1.0)/2.0-pow(sin(ShockAngle/RAD),2.0))+1.0)*tan(ShockAngle/RAD));
	  return (erro);
  }

  double RJFuncs::WeakShockAngle(double Ma,double DeflectAngle,double k)
  {
   double s_angle1,s_angle2,s_angle;
   double erro1,erro2,erro;
   //二分法求激波角
   s_angle1=1e-6;
   s_angle2=ShockAngleOfMDA(Ma,k);
   Begin:
   erro1=ShockAngleFunc(Ma,DeflectAngle,s_angle1,k);
   erro2=ShockAngleFunc(Ma,DeflectAngle,s_angle2,k);
   s_angle=(s_angle1+s_angle2)/2.0;
   erro=ShockAngleFunc(Ma,DeflectAngle,s_angle,k);
   if(fabs(erro)<1e-10) return(s_angle);
   else
   {
	   if(erro*erro1<0) s_angle2=s_angle;
	   else s_angle1=s_angle;
       goto Begin;
   }
  }

  double RJFuncs::StrongShockAngle(double Ma,double DeflectAngle,double k)
  {
   double s_angle1,s_angle2,s_angle;
   double erro1,erro2,erro;
   //二分法求激波角
   s_angle1=ShockAngleOfMDA(Ma,k);
   s_angle2=90;
   for(;;)
   {
    erro1=ShockAngleFunc(Ma,DeflectAngle,s_angle1,k);
    erro2=ShockAngleFunc(Ma,DeflectAngle,s_angle2,k);
    s_angle=(s_angle1+s_angle2)/2.0;
    erro=ShockAngleFunc(Ma,DeflectAngle,s_angle,k);
    if(fabs(erro)<1e-10) break;
    else
    {
	   if(erro*erro1<0) s_angle2=s_angle;
	   else s_angle1=s_angle;
    }
   }
   return(s_angle);
  }

  double RJFuncs::MachAfterShock(double Ma,double ShockAngle,double k)
  //激波后马赫数
  {
   double msin;
   msin=pow(Ma,2)*pow(sin(ShockAngle/RAD),2);
   double Ma2;
   Ma2=sqrt((Ma*Ma+2.0/(k-1))/(2*k*msin/(k-1.0)-1.0)+(Ma*Ma-msin)/((k-1)*msin*0.5+1.0));
   return (Ma2);
  }

  double RJFuncs::PresRatioAfterShock(double Ma,double ShockAngle,double k)
  //激波后压强关系
  {
   double P2_P1;
   P2_P1=2.0*k*Ma*Ma*sin(ShockAngle/RAD)*sin(ShockAngle/RAD)/(k+1.0)-(k-1.0)/(k+1.0);
   return(P2_P1);
  }

  double RJFuncs::DensRatioAfterShock(double Ma,double ShockAngle,double k)
  //激波后密度关系
  {
   double msin;
   msin=pow(Ma,2)*pow(sin(ShockAngle/RAD),2);
   return((k+1.0)*msin/(2+(k-1.0)*msin));
  }

  double RJFuncs::PresRecoverCoef(double Ma,double ShockAngle,double k)
  //激波后总压恢复系数
  {
   double RatioPres=PresRatioAfterShock(Ma,ShockAngle,k);
   double RatioDens=DensRatioAfterShock(Ma,ShockAngle,k);
   return(pow(RatioDens,k/(k-1.0))*pow(1.0/RatioPres,1.0/(k-1.0)));
  }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -