77 lines
3.1 KiB
C++
77 lines
3.1 KiB
C++
#include "xyz2shc.h"
|
|
|
|
void XYZ2SHC::CalCKernel(){
|
|
int i,k,n;
|
|
int start_index,former_index,flow_index;
|
|
//初始化c_kernel_;
|
|
c_kernel_.resize(obs_num_);
|
|
for (int i = 0; i < obs_num_; i++){
|
|
c_kernel_[i].resize(shc_num_,0.0);
|
|
}
|
|
|
|
//先计算对角线上的伴随勒让德系数 对角线上第一个值
|
|
#pragma omp parallel for private(i) schedule(guided)
|
|
for (int i = 0; i < obs_num_; i++){
|
|
c_kernel_[i][0] = 1.0;
|
|
c_kernel_[i][half_shc_num_] = 1.0;
|
|
}
|
|
|
|
//对角线上第二个值
|
|
start_index = shc_order_ + 1;
|
|
#pragma omp parallel for private(i) schedule(guided)
|
|
for (int i = 0; i < obs_num_; i++){
|
|
c_kernel_[i][start_index] = sqrt(3.0)*sin(obs_point_[i].theta*Pi/180.0);
|
|
c_kernel_[i][start_index + half_shc_num_] = sqrt(3.0)*sin(obs_point_[i].theta*Pi/180.0);
|
|
}
|
|
|
|
//对角线上的其他值
|
|
for (k = 2; k < shc_order_+1; k++){
|
|
former_index = int(0.5*(k-1)*(2*shc_order_+4-k));
|
|
start_index = int(0.5*k*(2*shc_order_+3-k));
|
|
#pragma omp parallel for private(i) shared(k,start_index,former_index) schedule(guided)
|
|
for (int i = 0; i < obs_num_; i++){
|
|
c_kernel_[i][start_index] = sin(obs_point_[i].theta*Pi/180.0)*sqrt(0.5*(2.0*k+1)/k)*c_kernel_[i][former_index];
|
|
c_kernel_[i][start_index + half_shc_num_] = sin(obs_point_[i].theta*Pi/180.0)*sqrt(0.5*(2.0*k+1)/k)*c_kernel_[i][former_index + half_shc_num_];
|
|
}
|
|
}
|
|
|
|
//计算副对角线上的值
|
|
for (k = 0; k < shc_order_; k++){
|
|
start_index = int(0.5*k*(2*shc_order_+3-k));
|
|
#pragma omp parallel for private(i) shared(k,start_index) schedule(guided)
|
|
for (int i = 0; i < obs_num_; i++){
|
|
c_kernel_[i][start_index + 1] = cos(obs_point_[i].theta*Pi/180.0)*sqrt(2.0*k+3)*c_kernel_[i][start_index];
|
|
c_kernel_[i][start_index + half_shc_num_ + 1] = cos(obs_point_[i].theta*Pi/180.0)*sqrt(2.0*k+3)*c_kernel_[i][start_index + half_shc_num_];
|
|
}
|
|
}
|
|
|
|
//计算其他位置上的值
|
|
for (n = 0; n < shc_order_; n++){
|
|
start_index = int(0.5*n*(2*shc_order_+3-n));
|
|
for (k = n+2; k < shc_order_+1; k++){
|
|
former_index = k - n;
|
|
#pragma omp parallel for private(i) shared(start_index,former_index,n,k) schedule(guided)
|
|
for (int i = 0; i < obs_num_; i++){
|
|
c_kernel_[i][start_index + former_index] = Anm_[k][n]*cos(obs_point_[i].theta*Pi/180.0)*c_kernel_[i][start_index+flow_index-1] - Bnm_[k][n]*c_kernel_[i][start_index+flow_index-2];
|
|
c_kernel_[i][start_index + former_index + half_shc_num_] = Anm_[k][n]*cos(obs_point_[i].theta*Pi/180.0)*c_kernel_[i][start_index+flow_index-1+half_shc_num_] - Bnm_[k][n]*c_kernel_[i][start_index+flow_index-2+half_shc_num_];
|
|
}
|
|
}
|
|
}
|
|
|
|
//添加经度位置信息
|
|
ProgressBar *bar = new ProgressBar(shc_order_+1,"Calculating Ckernel");
|
|
for (n = 0; n < shc_order_+1; n++){
|
|
bar->Progressed(i);
|
|
|
|
start_index = int(0.5*n*(2*shc_order_+3-n));
|
|
for (k = n; k < shc_order_+1; k++){
|
|
former_index = k - n;
|
|
#pragma omp parallel for private(i) shared(start_index,former_index,n) schedule(guided)
|
|
for (int i = 0; i < obs_num_; i++){
|
|
c_kernel_[i][start_index + former_index] *= cos(n*obs_point_[i].phi*Pi/180.0);;
|
|
c_kernel_[i][start_index + former_index + half_shc_num_] *= sin(n*obs_point_[i].phi*Pi/180.0);
|
|
}
|
|
}
|
|
}
|
|
return;
|
|
} |