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

📄 main.cpp

📁 用于快速的估计任意形状的物体的运动情况受力分子
💻 CPP
📖 第 1 页 / 共 3 页
字号:
						M[1] =M[1] + dM_y[num];
						M[2] =M[2] + dM_z[num];

						Cd_cont = F[0] / (0.5 * *rho * vmo * vmo * ref_A);
						Cl_cont = F[1] / (0.5 * *rho * vmo * vmo * ref_A);
						Cz_cont = F[2] / (0.5 * *rho * vmo * vmo * ref_A);

						CMx_cont = M[0] / (0.5 * *rho * vmo * vmo * ref_A * L);
						CMy_cont = M[1] / (0.5 * *rho * vmo * vmo * ref_A * L);
						CMz_cont = M[2] / (0.5 * *rho * vmo * vmo * ref_A * L);
				}

//--------------------------------------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------------------------
	        env_calc_h(lamda_fm,&h_fm);                      //调用反算高度函数

            env_calc_atmos(h_fm, rho, p, T, lamda, Me);     //计算大气参数 
		    // 来流马赫数
            R = 8.31 * 1000 / *Me;
            Ma = vmo/sqrt(gama * R * *T);
		
			Ma_face[num] = V1mo/sqrt(gama * R * *T);  //当地马赫数
			S_face[num] = V1mo/sqrt(2 * R * *T);      //当地速度比

			p_face[num] = *rho * (V1mo * V1mo) / 2 / pow(S_face[num],2) * (((2-xigema1)/sqrt(PI)*S_face[num]*sin_face[num]+xigema1/2*sqrt(Tw / *T))*exp(-pow(S_face[num]*sin_face[num],2)) + ((2-xigema1)*(0.5+pow(S_face[num]*sin_face[num],2))+xigema1/2*sqrt(PI*Tw / *T)*S_face[num]*sin_face[num])*(1+erf(S_face[num]*sin_face[num])));
			tao_face[num] = -xigema * *rho * (V1mo * V1mo) * cos_face[num] / 2 / sqrt(PI) / S_face[num] * (exp(-pow(S_face[num]*sin_face[num],2)) + sqrt(PI)*S_face[num]*sin_face[num]*(1+erf(S_face[num]*sin_face[num])));

			Cp_facefm[num] = p_face[num]/A_face[num];
			Ctao_facefm[num] = tao_face[num]/A_face[num];
			
			dF_x[num] = (-p_face[num] * normal_x[num] - tao_face[num] * parallel_x[num])*A_face[num];
			dF_y[num] = (-p_face[num] * normal_y[num] - tao_face[num] * parallel_y[num])*A_face[num];
			dF_z[num] = (-p_face[num] * normal_z[num] - tao_face[num] * parallel_z[num])*A_face[num];

			F[0] = F[0] + dF_x[num]; 
			F[1] = F[1] + dF_y[num]; 
			F[2] = F[2] + dF_z[num];

			dM_x[num] = (r0z * dF_y[num] - r0y * dF_z[num]);
			dM_y[num] = (r0z * dF_x[num] - r0x * dF_z[num]);
			dM_z[num] = (r0x * dF_y[num] - r0y * dF_x[num]);
			
			M[0] =M[0] + dM_x[num];
			M[1] =M[1] + dM_y[num];
			M[2] =M[2] + dM_z[num];

			Cd_fm = F[0] / (0.5 * *rho * vmo * vmo * ref_A);
			Cl_fm = F[1] / (0.5 * *rho * vmo * vmo * ref_A);
			Cz_fm = F[2] / (0.5 * *rho * vmo * vmo * ref_A);

			CMx_fm = M[0] / (0.5 * *rho * vmo * vmo * ref_A * L);
			CMy_fm = M[1] / (0.5 * *rho * vmo * vmo * ref_A * L);
			CMz_fm = M[2] / (0.5 * *rho * vmo * vmo * ref_A * L);

			Cp_face[num] = Pb * Cp_facefm[num] + (1-Pb) * Cp_facecont[num];
			Ctao_face[num] = Pb * Ctao_facefm[num] + (1-Pb) * Ctao_facecont[num];
           }
	double Pb;
    Pb = sin(PI * ( 0.375 + 0.125 * log10(Kn) ));

	  Cl = Pb * Cl_fm + (1-Pb) * Cl_cont;
      Cd = Pb * Cd_fm + (1-Pb) * Cd_cont;
	  Cz = Pb * Cz_fm + (1-Pb) * Cz_cont;

	  CMx = Pb * CMx_fm + (1-Pb) * CMx_cont;
	  CMy = Pb * CMy_fm + (1-Pb) * CMy_cont; 
	  CMz = Pb * CMz_fm + (1-Pb) * CMz_cont; 

	}
    
	printf("%.4e %.4e %.4e %.4e %.4e %.4e\n", F[0], F[1], F[2], M[0], M[1], M[2]);
    printf("%.4e %.4e %.4e %.4e %.4e %.4e\n", Cd, Cl, Cz, CMx, CMy, CMz);

	return 0;
}



 //===============================================================================================//
//      计算大气密度、压力、温度                                                                 ////-----------------------------------------------------------------------------------------------////      输入:                                                                                   ////              h       高度(km)                                                                ////      输出:                                                                                   ////              Dens    大气密度(kg / cu m)                                                    ////              Pres    大气压力(Pa)                                                           ////              Temp    大气温度(K)//              lamda   平均自由程(m)//	            M       相对分子质量(kg/kmol)//===============================================================================================//int env_calc_atmos(double h, double *Dens, double *Pres, double *Temp, double *lamda, double *M){	
	// 大气数据文件中的离散网格点和相应的大气状态
	double hh[146];
	double rr[146];
	double pp[146];
	double TT[146];
	double ll[146];
	double mm[146];
    FILE *atmosphere;
    int i;
	double env_interp(double*,double*,int,double);

 //	String AppPath, filename;
  //       AppPath = ExtractFileDir(Application->ExeName);
  //       filename = AppPath + "\\resources\\atmosphere.txt";
  //	atmosphere = fopen(filename.c_str(), "rt");

        atmosphere = fopen("atmosphere.txt", "rt");

	if (atmosphere == NULL)
		return -1;

	// 读入大气数据
	for(i=0;i<146;i++)
	{
		fscanf(atmosphere, "%lf %lf %lf %lf %lf %lf\n", &hh[i], &rr[i], &pp[i], &TT[i], &ll[i], &mm[i]);
	}
	fclose(atmosphere);

	// 线性插值获得大气状态数据
	*Dens = env_interp(hh, rr, 146, h);
    *Pres = env_interp(hh, pp, 146, h);
	*Temp = env_interp(hh, TT, 146, h);
    *lamda = env_interp(hh, ll, 146, h);
    *M = env_interp(hh, mm, 146, h);


    return 0;}

//--------------------------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------------
//输入平均自由程,输出对应的高度
		       int env_calc_h(double lamda,  double *h)
			   {
               	double hh[146];
				double ll[146];
                FILE *atmosphere_1;
				int i;
				double env_interp(double*,double*,int,double);
				atmosphere_1 = fopen("atmosphere_1.txt", "rt");
				
				if (atmosphere_1 == NULL)
					return -1;

				// 读入大气数据
				for(i=0;i<146;i++)
				{
					fscanf(atmosphere_1, "%lf %lf\n", &ll[i], &hh[i]);
				}
				fclose(atmosphere_1);

                *h = env_interp(ll, hh, 146, lamda);
				return 0;
			   }
//----------------------------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------------------------


//===============================================================================================//
//      插值							                                                         //
//-----------------------------------------------------------------------------------------------//
//      输入:                                                                                   //
//				x				    x数组														 //
//				y					y数组														 //
//				x1					插值点自变量值												 //
//      输出:                                                                                   //
//              y1                  插值点函数值		                                         //
//===============================================================================================//double env_interp(double *x,double *y,int num,double x1){	double x0,x2;	double y0,y2;	double y1;	int i;	x0=*(x+0);	x2=*(x+num-1);	y0=*(y+0);	y2=*(y+num-1);	for(i=0;i<num-1;i++)	{		if(x1>=*(x+i)&&x1<*(x+i+1))		{			x0=*(x+i);			y0=*(y+i);			x2=*(x+i+1);			y2=*(y+i+1);			y1=y0+(x1-x0)/(x2-x0)*(y2-y0);		}	}		if(x1==*(x+num-1))		y1=*(y+num-1);	return y1;}

//===============================================================================================//
//      计算误差函数					                                                         //
//-----------------------------------------------------------------------------------------------//
//      输入:                                                                                   //
//				x				    自变量														 //
//      输出:                                                                                   //
//              y                   函数值				                                         //
//===============================================================================================//double erf(double x){	static const double tiny = 1e-300,		half= 5.00000000000000000000e-01, /* 0x3FE00000, 0x00000000 */		one = 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */		two = 2.00000000000000000000e+00, /* 0x40000000, 0x00000000 */		/* c = (float)0.84506291151 */		erx = 8.45062911510467529297e-01, /* 0x3FEB0AC1, 0x60000000 */		/* Coefficients for approximation to erf on [0,0.84375]*/		efx = 1.28379167095512586316e-01, /* 0x3FC06EBA, 0x8214DB69 */		efx8= 1.02703333676410069053e+00, /* 0x3FF06EBA, 0x8214DB69 */		pp0 = 1.28379167095512558561e-01, /* 0x3FC06EBA, 0x8214DB68 */		pp1 = -3.25042107247001499370e-01, /* 0xBFD4CD7D, 0x691CB913 */		pp2 = -2.84817495755985104766e-02, /* 0xBF9D2A51, 0xDBD7194F */		pp3 = -5.77027029648944159157e-03, /* 0xBF77A291, 0x236668E4 */		pp4 = -2.37630166566501626084e-05, /* 0xBEF8EAD6, 0x120016AC */		qq1 = 3.97917223959155352819e-01, /* 0x3FD97779, 0xCDDADC09 */		qq2 = 6.50222499887672944485e-02, /* 0x3FB0A54C, 0x5536CEBA */		qq3 = 5.08130628187576562776e-03, /* 0x3F74D022, 0xC4D36B0F */		qq4 = 1.32494738004321644526e-04, /* 0x3F215DC9, 0x221C1A10 */		qq5 = -3.96022827877536812320e-06, /* 0xBED09C43, 0x42A26120 */	    /** Coefficients for approximation to erf in [0.84375,1.25]*/		pa0 = -2.36211856075265944077e-03, /* 0xBF6359B8, 0xBEF77538 */		pa1 = 4.14856118683748331666e-01, /* 0x3FDA8D00, 0xAD92B34D */		pa2 = -3.72207876035701323847e-01, /* 0xBFD7D240, 0xFBB8C3F1 */		pa3 = 3.18346619901461753674e-01, /* 0x3FD45FCA, 0x805120E4 */		pa4 = -1.10894694282396677476e-01, /* 0xBFBC6398, 0x3D3E28EC */		pa5 = 3.54783043256182359371e-02, /* 0x3FA22A36, 0x599795EB */		pa6 = -2.16637559486879084300e-03, /* 0xBF61BF38, 0x0A96073F */		qa1 = 1.06420880400844228286e-01, /* 0x3FBB3E66, 0x18EEE323 */		qa2 = 5.40397917702171048937e-01, /* 0x3FE14AF0, 0x92EB6F33 */		qa3 = 7.18286544141962662868e-02, /* 0x3FB2635C, 0xD99FE9A7 */		qa4 = 1.26171219808761642112e-01, /* 0x3FC02660, 0xE763351F */		qa5 = 1.36370839120290507362e-02, /* 0x3F8BEDC2, 0x6B51DD1C */		qa6 = 1.19844998467991074170e-02, /* 0x3F888B54, 0x5735151D */        /** Coefficients for approximation to erfc in [1.25,1/0.35]*/		ra0 = -9.86494403484714822705e-03, /* 0xBF843412, 0x600D6435 */		ra1 = -6.93858572707181764372e-01, /* 0xBFE63416, 0xE4BA7360 */		ra2 = -1.05586262253232909814e+01, /* 0xC0251E04, 0x41B0E726 */		ra3 = -6.23753324503260060396e+01, /* 0xC04F300A, 0xE4CBA38D */		ra4 = -1.62396669462573470355e+02, /* 0xC0644CB1, 0x84282266 */		ra5 = -1.84605092906711035994e+02, /* 0xC067135C, 0xEBCCABB2 */		ra6 = -8.12874355063065934246e+01, /* 0xC0545265, 0x57E4D2F2 */		ra7 = -9.81432934416914548592e+00, /* 0xC023A0EF, 0xC69AC25C */		sa1 = 1.96512716674392571292e+01, /* 0x4033A6B9, 0xBD707687 */		sa2 = 1.37657754143519042600e+02, /* 0x4061350C, 0x526AE721 */		sa3 = 4.34565877475229228821e+02, /* 0x407B290D, 0xD58A1A71 */		sa4 = 6.45387271733267880336e+02, /* 0x40842B19, 0x21EC2868 */		sa5 = 4.29008140027567833386e+02, /* 0x407AD021, 0x57700314 */		sa6 = 1.08635005541779435134e+02, /* 0x405B28A3, 0xEE48AE2C */		sa7 = 6.57024977031928170135e+00, /* 0x401A47EF, 0x8E484A93 */		sa8 = -6.04244152148580987438e-02, /* 0xBFAEEFF2, 0xEE749A62 */		/** Coefficients for approximation to erfc in [1/.35,28]*/		rb0 = -9.86494292470009928597e-03, /* 0xBF843412, 0x39E86F4A */		rb1 = -7.99283237680523006574e-01, /* 0xBFE993BA, 0x70C285DE */		rb2 = -1.77579549177547519889e+01, /* 0xC031C209, 0x555F995A */		rb3 = -1.60636384855821916062e+02, /* 0xC064145D, 0x43C5ED98 */		rb4 = -6.37566443368389627722e+02, /* 0xC083EC88, 0x1375F228 */		rb5 = -1.02509513161107724954e+03, /* 0xC0900461, 0x6A2E5992 */		rb6 = -4.83519191608651397019e+02, /* 0xC07E384E, 0x9BDC383F */		sb1 = 3.03380607434824582924e+01, /* 0x403E568B, 0x261D5190 */		sb2 = 3.25792512996573918826e+02, /* 0x40745CAE, 0x221B9F0A */		sb3 = 1.53672958608443695994e+03, /* 0x409802EB, 0x189D5118 */		sb4 = 3.19985821950859553908e+03, /* 0x40A8FFB7, 0x688C246A */		sb5 = 2.55305040643316442583e+03, /* 0x40A3F219, 0xCEDF3BE6 */		sb6 = 4.74528541206955367215e+02, /* 0x407DA874, 0xE79FE763 */		sb7 = -2.24409524465858183362e+01; /* 0xC03670E2, 0x42712D62 */	int n0,hx,ix,i;	double R,S,P,Q,s,y,z,r;	n0 = ((*(int*)&one)>>29)^1;	hx = *(n0+(int*)&x);	ix = hx&0x7fffffff;	if(ix>=0x7ff00000)	{ /* erf(nan)=nan */		i = ((unsigned)hx>>31)<<1;		return (double)(1-i)+one/x; /* erf(+-inf)=+-1 */	}		if(ix < 0x3feb0000) 	{ /* |x|<0.84375 */		if(ix < 0x3e300000) 		{ /* |x|<2**-28 */			if (ix < 0x00800000)				return 0.125*(8.0*x+efx8*x); /*avoid underflow */			return x + efx*x;		}		z = x*x;		r = pp0+z*(pp1+z*(pp2+z*(pp3+z*pp4)));		s = one+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*qq5))));		y = r/s;		return x + x*y;	}		if(ix < 0x3ff40000) 	{ /* 0.84375 <= |x| < 1.25 */		s = fabs(x)-one;		P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*pa6))))); 		Q = one+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*qa6))))); 		if(hx>=0) return erx + P/Q; else return -erx - P/Q;	}		if (ix >= 0x40180000) 	{ /* inf>|x|>=6 */		if(hx>=0) return one-tiny; else return tiny-one;	}	x = fabs(x);	s = one/(x*x);	if(ix< 0x4006DB6E) 	{ /* |x| < 1/0.35 */		R=ra0+s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*(ra5+s*(ra6+s*ra7))))));		S=one+s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*(sa5+s*(sa6+s*(sa7+s*sa8)))))));	} 	else 	{ /* |x| >= 1/0.35 */		R=rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*(rb5+s*rb6)))));		S=one+s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*(sb5+s*(sb6+s*sb7))))));	}	z = x;	*(1-n0+(int*)&z) = 0;	r = exp(-z*z-0.5625)*exp((z-x)*(z+x)+R/S);	if(hx>=0) 		return one-r/x; 	else 		return r/x-one;}





⌨️ 快捷键说明

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