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