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

📄 atmostrans.cpp

📁 计算大气光谱透射率和平均透射率
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		if(wavelength==12.1)
			row = 41;
		if(wavelength==12.2)
			row = 42;
		if(wavelength==12.3)
			row = 43;
		if(wavelength==12.4)
			row = 44;
		if(wavelength==12.5)
			row = 45;
		if(wavelength==12.6)
			row = 46;
		if(wavelength==12.7)
			row = 47;
		if(wavelength==12.8)
			row = 48;
		if(wavelength==12.9)
			row = 49;

		if(wavelength==13.0)
			row = 50;
		if(wavelength==13.1)
			row = 51;
		if(wavelength==13.2)
			row = 52;
		if(wavelength==13.3)
			row = 53;
		if(wavelength==13.4)
			row = 54;
		if(wavelength==13.5)
			row = 55;
		if(wavelength==13.6)
			row = 56;
		if(wavelength==13.7)
			row = 57;
		if(wavelength==13.8)
			row = 58;
		if(wavelength==13.9)
			row = 59;
*/	}

	if(wOrdistance < 0.0)             //可凝结水毫米数(或路程)小于0按0处理
		line1 = line2 = 0;
	if(wOrdistance > 1000.0){          //可凝结水毫米数(或路程)大于1000的处理
		line1 = 12; line2 = 13;
	}
	if(0.0 <= wOrdistance && wOrdistance <= 1000.0) //通过可凝结水毫米数(或路程)算出数组列标(line1,line2)
	{
		if(wOrdistance == 0.0)
			line1 = line2 = 0;
		else if(0.0 < wOrdistance && wOrdistance < 0.1){
				line1 = 0; line2 = 1;
		}
		else if(wOrdistance == 0.1)
			    line1 = line2 = 1;
		else if(0.1 < wOrdistance && wOrdistance <0.2){
				line1 = 1; line2 = 2;
		}
		else if(wOrdistance == 0.2)
				line1 =line2 =2;
		else if(0.2 < wOrdistance && wOrdistance < 0.5){
				line1 = 2; line2 = 3;
		}
		else if(wOrdistance == 0.5)
			  line1 = line2 = 3;
		else if(0.5 < wOrdistance && wOrdistance < 1.0){
			  line1 = 3; line2 = 4;
		}
		else if(wOrdistance == 1.0)
				line1 = line2 = 4;
		else if(1.0< wOrdistance && wOrdistance <2.0){
				line1 = 4; line2 = 5;
		}
		else if(wOrdistance == 2.0)
				line1 = line2 = 5;
		else if(2.0 < wOrdistance && wOrdistance < 5.0){
				line1 = 5; line2 = 6;
		}
		else if(wOrdistance == 5.0)
				line1 = line2 =6;
		else if(5.0 < wOrdistance && wOrdistance < 10.0){
				line1 = 6; line2 = 7;
		}
		else if(wOrdistance == 10.0)
				line1 = line2 =7;
		else if(10.0 < wOrdistance && wOrdistance <20.0){
				line1 = 7; line2 = 8;
		}
		else if(wOrdistance == 20.0)
				line1 = line2 = 8;
		else if(20.0 < wOrdistance && wOrdistance <50.0){
				line1 = 8; line2 = 9;
		}
		else if(wOrdistance == 50.0)
				line1 = line2 = 9;
		else if(50.0 < wOrdistance && wOrdistance < 100.0){
				line1 = 9; line2 =10;
		}
		else if(wOrdistance == 100.0)
				line1 = line2 = 10;
		else if(100.0 < wOrdistance && wOrdistance < 200.0){
				line1 = 10; line2 = 11;
		}
		else if(wOrdistance == 200.0)
		        line1 = line2 = 11;
		else if(200.0 < wOrdistance && wOrdistance < 500.0){
		        line1 = 11; line2 = 12;
		}
		else if(wOrdistance == 500.0)
				line1 = line2 = 12;
	    else if(500.0 < wOrdistance && wOrdistance < 1000.0){
				line1 = 12; line2 =13;
		}
		else
				line1 = line2 = 13;
	}
};

double AtmosTrans::GetVaporSpectrumTransInTable2(double wavelength, double w)
{
	int row , line1, line2;
	FindOrderInTable2(row, line1, line2, wavelength, w);
	if(line1==line2)                        //如果line1等于line2,
		return m_dVapor_Table2[row][line1]; //则所提供的可凝结水数w在表中有确切的光谱透过率值对应。

	else{                                   //如果line1不等于line2,则根据所提供的可凝结水数w所处的区间,
		double x1, x2, x3, y1, y2, y3;      //利用该区间前后端点可凝结水数所对应的光谱透射率线性插值得到。
		x1 = GetWOrDistanceFromLine(line1);
		x2 = GetWOrDistanceFromLine(line2);
		x3 = w;
		y1 = m_dVapor_Table2[row][line1];
		y2 = m_dVapor_Table2[row][line2];
		y3 = ((x2-x3)/(x2-x1))*(y1-y2)+y2;

		if(y3 < 0)                          //当可凝结水数w大于1000时,线性插值得到的光谱透射率可能小于0,
			return 0;                       //所以线性插值得到光谱透射率小于0时,返回0。
		else 
			return y3;
	}
};

double AtmosTrans::GetCO2SpectrumTransInTable2(double wavelength, double distance)
{
	int row, line1, line2;
	FindOrderInTable2(row, line1, line2, wavelength, distance);
	if(line1==line2)                      //如果line1等于line2,
		return m_dCO2_Table2[row][line1]; //则所提供的距离distance在表中有确切的光谱透过率值对应。

	else{                                 //如果line1不等于line2,则根据所提供的距离distance所处的区间,
		double x1, x2, x3, y1, y2, y3;    //利用该区间前后端点距离数所对应的光谱透射率线性插值得到。
		x1 = GetWOrDistanceFromLine(line1);
		x2 = GetWOrDistanceFromLine(line2);
		x3 = distance;
		y1 = m_dCO2_Table2[row][line1];
		y2 = m_dCO2_Table2[row][line2];
		y3 = ((x2-x3)/(x2-x1))*(y1-y2)+y2;

		if(y3 < 0)                       //当距离distance大于1000时,线性插值得到的光谱透射率可能小于0,
			return 0;                    //所以线性插值得到的光谱透射率小于0时,返回0。
		else
			return y3;
	}
};

double AtmosTrans::GetVaporSpectrumTransOfHorizonInAnyHeightFrom8To14(double wavelength, int temperature,
														   double Hr, double height, double distance)
{
	double w0, w, sealeveldistance, seahr, vaporspectrumtrans;

	sealeveldistance = exp((-0.5154)*height)*distance;//根据海拔高度,将传输距离(所在海拔高度上的)
	                                                  //转换为海平面的有效距离。

	seahr = Hr*exp((0.45*height));                    //将(所在海拔高度上的)的相对湿度转换为
		                                              //海平面上的相对湿度
	
	w0 = GetW0(temperature);                          //根据大气温度(所在海拔高度上的)
                                                      //求出空气相对湿度100%的每公里的可凝结水毫米数
	
	w = w0*seahr*sealeveldistance;                    //根据以上三个量求出全路程上的可凝结水毫米数
	                                                  
	vaporspectrumtrans = GetVaporSpectrumTransInTable2(wavelength, w); //根据波长和全路程上的可凝结水毫米数
	                                                                   //查8-14um的海平面上水平路程水蒸气的光谱透射率表
	return vaporspectrumtrans;
};

double AtmosTrans::GetCO2SpectrumTransOfHorizonInAnyHeightFrom8To14(double wavelength, double height,
																	double distance)
{
	double sealeveldistance, co2spectrumtrans;

	sealeveldistance = exp((-0.313)*height)*distance;//根据海拔高度,将传输距离(所在海拔高度上的)
	                                                 //转换为海平面的有效距离
	co2spectrumtrans = GetCO2SpectrumTransInTable2(wavelength, sealeveldistance);//根据波长和海平面的有效距离
	                                                                             //查8-14um的海平面上水平路程二氧化碳的光谱透射率表
	return co2spectrumtrans;
};

double AtmosTrans::GetVaporSpectrumTransOfInclineInAnyHeightFrom8To14(double wavelength, int temperature,
							double Hr, double height, double height1, double height2, double r)
{
	double w0, w, H1, H2, seahr, vaporspectrumtrans;

	seahr = Hr*exp(0.45*height);                      //将(所在海拔高度上的)的相对湿度转换为
		                                              //海平面上的相对湿度

	H1 = height + height1;                             //将相对高度转换为海拔高度
	H2 = height + height2;

	w0 = GetW0(temperature);                           //根据大气温度(所在海拔高度上的)
                                                       //求出空气相对湿度100%的每公里的可凝结水毫米数

	w = w0*seahr*((exp((-0.5154)*H1)-exp((-0.5154)*H2))/(0.5154*cos(r*PI/180))); //求出倾斜路程上的可凝结水毫米数

	vaporspectrumtrans = GetVaporSpectrumTransInTable2(wavelength, w); //根据波长和倾斜路程上的可凝结水毫米数
	                                                                   //查3-5um的海平面上水平路程水蒸气的光谱透射率表
	return vaporspectrumtrans;
};

double AtmosTrans::GetCO2SpectrumTransOfInclineInAnyHeightFrom8To14(double wavelength, double height,
													double height1, double height2, double r)
{
	double H1, H2, sealeveldistance, co2spectrumtrans;

	H1 = height + height1;                             //将相对高度转换为海拔高度
	H2 = height + height2;

	sealeveldistance = (exp((-0.313)*H1)-exp((-0.313)*H2))/(0.313*cos(r*PI/180));//将倾斜路径转换为海平面的有效距离

	co2spectrumtrans = GetCO2SpectrumTransInTable2(wavelength, sealeveldistance);//根据波长和海平面的有效距离
	                                                                             //查3-5um的海平面上水平路程二氧化碳的光谱透射率表

	return co2spectrumtrans;
};

double AtmosTrans::GetDispersionSpectrumTrans(double wavelength, double Dv, double distance)
{
	double q, dispersionspectrumtrans;
	if(Dv > 50)
		q = 1.6;
	else if(6 <= Dv && Dv <= 50)
		q = 1.3;
	else
		q = 0.585*pow(Dv, 1.0/3.0);

	dispersionspectrumtrans = exp(-(3.91/Dv)*pow(0.61/wavelength, q)*distance);//根据经验公式算出散射的光谱透射率

	return dispersionspectrumtrans;
};

double AtmosTrans::GetRainSpectrumTrans(double Jrain, double distance)
{
	double arain, rainspectrumtrans;
	
	arain = 0.66*pow(Jrain, 0.66);                   //计算雨的衰减系数

	rainspectrumtrans = exp((-arain)*distance);      //计算雨的光谱透射率

	return rainspectrumtrans;
};

double AtmosTrans::GetSnowSpectrumTrans(double Jsnow, double distance)
{
	double asnow, snowspectrumtrans;

	asnow = 6.5*pow(Jsnow, 0.7);                    //计算雪的衰减系数

	snowspectrumtrans = exp((-asnow)*distance);     //计算雪的光谱透射率

	return snowspectrumtrans;
};



double AtmosTrans::GetVaporAveTransOfHorizonInAnyHeightFrom3To5(double wavelength1, double wavelength2,
											int temperature, double Hr, double height, double distance)
{
	double wavelengthbegin, wavelengthend, wavelength, sum1, sum2, vaporavetrans;
	int n;                                          //循环计数变量                                
	
	if(wavelength1 < wavelength2){                  //确定波长wavelength1,wavelength2的大小
		wavelengthbegin = wavelength1;              //小的赋值给wavelengthbegin
		wavelengthend = wavelength2;                //大的赋值给wavelengthend
	}
	else{
		wavelengthbegin = wavelength2;
		wavelengthend = wavelength1;
	}

	sum1 = (GetVaporSpectrumTransOfHorizonInAnyHeightFrom3To5(wavelengthbegin, temperature, Hr, height, distance)
		+ GetVaporSpectrumTransOfHorizonInAnyHeightFrom3To5(wavelengthend, temperature, Hr, height, distance)
		)*0.5;
	
	n = (int)(wavelengthend*10+0.5) - (int)(wavelengthbegin*10+0.5);
	sum2 = 0;
	if(n > 1){
		wavelength = wavelengthbegin;
		for(int i = 1; i <=  (n - 1); i++){
			wavelength = wavelength*10 + 1;
			wavelength = wavelength / 10;
			sum2 += GetVaporSpectrumTransOfHorizonInAnyHeightFrom3To5(wavelength, temperature, Hr, 
				                                                     height, distance);
		}
	}
	else{}

	vaporavetrans = (sum1 + sum2)*0.1/(wavelengthend - wavelengthbegin);
	return vaporavetrans;
};

double AtmosTrans::GetVaporAveTransOfInclineInAnyHeightFrom3To5(double wavelength1, double wavelength2,
				int temperature, double Hr, double height, double height1, double height2, double r)
{
	double wavelengthbegin, wavelengthend, wavelength, sum1, sum2, vaporavetrans;
	int n;                                          //循环计数变量                                
	
	if(wavelength1 < wavelength2){                  //确定波长wavelength1,wavelength2的大小
		wavelengthbegin = wavelength1;              //小的赋值给wavelengthbegin
		wavelengthend = wavelength2;                //大的赋值给wavelengthend
	}
	else{
		wavelengthbegin = wavelength2;
		wavelengthend = wavelength1;

⌨️ 快捷键说明

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