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

📄 atmostrans.cpp

📁 计算大气光谱透射率和平均透射率
💻 CPP
📖 第 1 页 / 共 4 页
字号:
			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::GetWOrDistanceFromLine(int line)
{
	double wOrdistance;
	switch(line)
	{
	  case 0:  wOrdistance = 0;
		       break;
	  case 1:  wOrdistance = 0.1;
		       break;
	  case 2:  wOrdistance = 0.2;
		       break;
	  case 3:  wOrdistance = 0.5;
		       break;
	  case 4:  wOrdistance = 1;
		       break;
	  case 5:  wOrdistance = 2;
		       break;
	  case 6:  wOrdistance = 5;
		       break;
	  case 7:  wOrdistance = 10;
		       break;
	  case 8:  wOrdistance = 20;
		       break;
	  case 9:  wOrdistance = 50;
		       break;
	  case 10: wOrdistance = 100;
		       break;
	  case 11: wOrdistance = 200;
		       break;
	  case 12: wOrdistance = 500;
		       break;
	  case 13: wOrdistance = 1000;
		       break;
	  default: break;
	}
	return wOrdistance;
};

double AtmosTrans::GetVaporSpectrumTransInTable1(double wavelength, double w)
{
	int row, line1, line2;
	FindOrderInTable1(row, line1, line2, wavelength, w);
    if(line1==line2)                        //如果line1等于line2,
		return m_dVapor_Table1[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_Table1[row][line1];
		y2 = m_dVapor_Table1[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::GetCO2SpectrumTransInTable1(double wavelength, double distance)
{
	int row, line1, line2;
	FindOrderInTable1(row, line1, line2, wavelength, distance);
	if(line1==line2)                      //如果line1等于line2,
		return m_dCO2_Table1[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_Table1[row][line1];
		y2 = m_dCO2_Table1[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::GetVaporSpectrumTransOfHorizonInAnyHeightFrom3To5(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 = GetVaporSpectrumTransInTable1(wavelength, w); //根据波长和全路程上的可凝结水毫米数
	                                                                   //查3-5um的海平面上水平路程水蒸气的光谱透射率表
	return vaporspectrumtrans;
};

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

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

double AtmosTrans::GetVaporSpectrumTransOfInclineInAnyHeightFrom3To5(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 = GetVaporSpectrumTransInTable1(wavelength, w); //根据波长和倾斜路程上的可凝结水毫米数
	                                                                   //查3-5um的海平面上水平路程水蒸气的光谱透射率表
	return vaporspectrumtrans;
};

double AtmosTrans::GetCO2SpectrumTransOfInclineInAnyHeightFrom3To5(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 = GetCO2SpectrumTransInTable1(wavelength, sealeveldistance);//根据波长和海平面的有效距离
	                                                                             //查3-5um的海平面上水平路程二氧化碳的光谱透射率表

	return co2spectrumtrans;
};




void AtmosTrans::FindOrderInTable2(int &row, int &line1, int &line2, 
								   double wavelength, double wOrdistance)
{ 
	if(wavelength < 8.0)               //波长小于8um按8um处理
		row = 0;
	if(wavelength > 13.9)              //波长大于14um按14um处理
		row = 59;
	if(8.0 <= wavelength && wavelength <= 13.9)   //波长间隔为0.1um,通过波长算出数组行标(row)
	{
		row = (int)(wavelength*10+0.5)-80;
/*		if(wavelength==8.0)
			row = 0;
	    if(wavelength==8.1)
			row = 1;
	    if(wavelength==8.2)
			row = 2;
		if(wavelength==8.3)
			row = 3;
		if(wavelength==8.4)
			row = 4;
		if(wavelength==8.5)
			row = 5;
		if(wavelength==8.6)
			row = 6;
		if(wavelength==8.7)
			row = 7;
		if(wavelength==8.8)
			row = 8;
		if(wavelength==8.9)
			row = 9;

		if(wavelength==9.0)
			row = 10;
		if(wavelength==9.1)
			row = 11;
		if(wavelength==9.2)
			row = 12;
		if(wavelength==9.3)
			row = 13;
		if(wavelength==9.4)
			row = 14;
		if(wavelength==9.5)
			row = 15;
		if(wavelength==9.6)
			row = 16;
		if(wavelength==9.7)
			row = 17;
		if(wavelength==9.8)
			row = 18;
		if(wavelength==9.9)
			row = 19;

		if(wavelength==10.0)
			row = 20;
		if(wavelength==10.1)
			row = 21;
		if(wavelength==10.2)
			row = 22;
		if(wavelength==10.3)
			row = 23;
		if(wavelength==10.4)
			row = 24;
		if(wavelength==10.5)
			row = 25;
		if(wavelength==10.6)
			row = 26;
		if(wavelength==10.7)
			row = 27;
		if(wavelength==10.8)
			row = 28;
		if(wavelength==10.9)
			row = 29;

		if(wavelength==11.0)
			row = 30;
		if(wavelength==11.1)
			row = 31;
		if(wavelength==11.2)
			row = 32;
		if(wavelength==11.3)
			row = 33;
		if(wavelength==11.4)
			row = 34;
		if(wavelength==11.5)
			row = 35;
		if(wavelength==11.6)
			row = 36;
		if(wavelength==11.7)
			row = 37;
		if(wavelength==11.8)
			row = 38;
		if(wavelength==11.9)
			row = 39;

		if(wavelength==12.0)
			row = 40;

⌨️ 快捷键说明

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