initial upload
This commit is contained in:
77
archive/xyz2shc/cal_c_kernel.cpp
Normal file
77
archive/xyz2shc/cal_c_kernel.cpp
Normal file
@@ -0,0 +1,77 @@
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user