gctl_toolkits/archive/xyz2shc/cal_c_kernel.cpp

77 lines
3.1 KiB
C++
Raw Normal View History

2024-09-10 20:25:18 +08:00
#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;
}