对流层的概念(维基百科)
对流层(英语:Troposphere)是地球大气层中最靠近地面的一层,也是地球大气层里密度最高的一层。它蕴含了整个大气层约75%的质量,以及几乎所有的水蒸气及气溶胶。
对流层从地球表面开始向高空伸展,直至对流层顶,即平流层的起点为止。对流层的上界随地球纬度、季节的不同发生变化。就纬度而言,对流层上界在低纬度地区平均为16-18 km,在中纬度的地区则为9-12 km,而在高纬度地区只有7-8 km。在高纬度的地区,因为地表的摩擦力会影响气流,形成了一个平均厚2公里的行星边界层。这一层的形成主要依靠地形而有所不同,而且亦会被逆流层的分隔而与对流层的其他部份分开。
对流层是地球大气层中天气变化最复杂的一层,人类在航空中遇到的几乎所有天气变化都出现在这一层。它在气象学上的主要特点有:气温随高度升高而降低;风向和风速经常变化;空气上下对流剧烈;有云、雨、雾、雪等天气现象。
对流层顶
顾名思义,对流层顶即是对流层的上限,处在对流层和平流层交界地带。维基百科的解释是:
对流层与其之上的平流层的边界,约离地面11公里附近的位置,称为对流层顶。但这个边界的高度会随季节及纬度而有所变化。一般来说,在赤道地区附近高17公里,而在极地附近则约高9公里,而平均高度则大概离地11公里左右。长途客机大多会在这个边界飞行。
要计算在对流层的气温因高度而转变,就需要认识平流层,因平流层界定了对流层的位置。在对流层,气温随高度而下降,反之在平流层,气温会随高度而上升。当气温递减率由正数(对流层)转到负数(平流层)的现象出现时,那正好表示了那里是对流层顶的区域了。
对流层顶可能不孤立存在,按照高空业务规范,需要找出第一对流层顶和第二对流层顶。
第一对流层顶
在150hpa~500hpa之间选取,温度垂直递减率小于等于/km,则此最低高度应选为第一对流层顶。第一对流层顶只能有一个,如有几个气层都符合第一对流层顶条件,则选取高度最低的一个。
第二对流层顶
在40hpa~150hpa之前选取,有两种情况
情况一:如果不存在第一对流层顶:
温度垂直递减率小于等于/km的最低高度,若此高度以上2km及其以内的任何高度与此高度间的平均温度垂直递减率也都 小于等于/km,则此最低高度应选为第二对流层顶。
情况二:如果存在第一对流层顶:
在第一对流层顶以上存在一个厚度至少达1km、平均温度垂直递减率大于3摄氏度/km的气层,在该气层以上又出现温度垂直递减率小于等于2摄氏度/km的最低高度,假如此高度以上2km及其以内的任何高度与此高度间的平均温度垂直递减率也都小于等于2摄氏度/km,则此最低高度也应选为第二对流层顶。
第二对流层顶也只能有一个,如有几个气层都符合对流层顶条件,则选高度最低的一个。
计算对流层顶的时间、海拔高度、气压、温度、相对湿度、露点温度、温度露点差、风向、风速和空间定位警卫偏差数据等。
第一对流层顶
vector<float> SegmentPointDetection::first_derivative(vector<float> data,vector<int> timestamp){
float temp;
vector<float> data_1;
data_1.push_back(0);
for(int i=1;i<data.size();i++){
try{
temp = (data[i]-data[i-1])/(timestamp[i]-timestamp[i-1]);
data_1.push_back(temp);
}
catch(exception& e){
cerr<<e.what()<<endl;
continue;
}
}
for(size_t i=0;i<data_1.size()-30;i++){
if(data_1[i]<0 && data_1[i+10] > 0){
data_1[i] = 1;
}
}
return data_1;
}
第二对流层顶
float TropopauseLayer::SecondTropopauseLayer(){
assert(M==N);
assert(N==U);
Index indexP,indexH;
float first_tropause,low_h,rate,second_tropause;
int flag;
indexP = where(pressure,M,150,40);
assert(indexP.begin>-1);
assert(indexP.end>-1);
first_tropause = this->FirstTropopauseLayer();
second_tropause = -1;
if (first_tropause == -1){
for (int i=indexP.begin;i<indexP.end;i++)
{
low_h = *(altitude+i);
rate = this->t_rate(*(tem+i-1),*(tem+i),*(altitude+i-1),low_h);
if (rate<=2)
{
indexH = whereH(altitude,U,low_h,low_h+2000);
assert(indexP.begin>-1);
assert(indexP.end>-1);
flag = this->check_2km(low_h,indexH,*(tem+i));
if (flag){
second_tropause = low_h;
return second_tropause;
}
}
else{
continue;
}
}
}
else{
for (int i=indexP.begin;i<indexP.end;i++)
{
low_h = *(altitude+i);
rate = this->t_rate(*(tem+i-1),*(tem+i),*(altitude+i-1),low_h);
if (rate>3)
{
indexH = whereH(altitude,U,low_h,low_h+1000);
assert(indexP.begin>-1);
assert(indexP.end>-1);
flag = this->check_1km(low_h,indexH,*(tem+i));
if (flag){
second_tropause = low_h;
return second_tropause;
}
}
else{
continue;
}
}
}
//cout<<indexP.begin<<' '<<indexP.end<<endl;
return second_tropause;
}