📄 atmostrans.cpp
字号:
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 + -