Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 16 additions & 14 deletions pygrt/C_extension/src/integral/dcm.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@
#include "grt/integral/k_integ.h"

/** DCM 的校正项,其中积分定义与 grt_int_Pk() 函数保持一致 */
static void _correct_Wm(real_t coefs[GRT_MORDER_MAX+1], bool keep_nearfield, cplxChnlGrid QWV_kmax, real_t coef, cplxIntegGrid SUM)
static void _correct_Wm(
real_t coefs[GRT_MORDER_MAX+1], real_t coefs_near[GRT_MORDER_MAX+1],
bool keep_nearfield, cplxChnlGrid QWV_kmax, real_t coef, cplxIntegGrid SUM)
{
for(int i = 0; i < GRT_SRC_M_NUM; ++i){
int modr = GRT_SRC_M_ORDERS[i]; // 对应m阶数
Expand All @@ -20,10 +22,9 @@ static void _correct_Wm(real_t coefs[GRT_MORDER_MAX+1], bool keep_nearfield, cpl
SUM[i][2] += coef * QWV_kmax[i][1] * coefs[0]; // w0*J0*k
}
else{
// 近场项这里沿用coefs是公式恰好巧合
SUM[i][0] += coef * QWV_kmax[i][0] * coefs[modr-1]; // qm*Jm-1*k
if(keep_nearfield) {
SUM[i][1] += - modr * coef * (QWV_kmax[i][0] + QWV_kmax[i][2]) * coefs[modr]; // - m*(qm+vm)*Jm*k/kr
SUM[i][1] += - modr * coef * (QWV_kmax[i][0] + QWV_kmax[i][2]) * coefs_near[modr]; // - m*(qm+vm)*Jm*k/kr
}
SUM[i][2] += coef * QWV_kmax[i][1] * coefs[modr]; // wm*Jm*k
SUM[i][3] += - coef * QWV_kmax[i][2] * coefs[modr-1]; // -vm*Jm-1*k
Expand All @@ -38,22 +39,23 @@ void grt_dcm_correction(size_t nr, real_t *rs, real_t kcut, K_INTEG *Kint, bool
if(GRT_IS_SMALLE_DISTANCE(r)) continue;

real_t rinv = 1.0 / r;
real_t cc;
real_t c2, c3;
c2 = rinv * rinv; // 1 / r^2
c3 = c2 * rinv; // 1 / r^3

// 1 / r^2
cc = rinv * rinv;
real_t coefs[] = {0.0, cc, 2.0*cc};
real_t coefs[] = {0.0, c2, 2.0*c2};
real_t coefs_near[] = {0.0, c2, c2};

// 1 / r^3
cc = cc * rinv;
real_t coefs_r[] = {0.0, - 2.0*cc, - 4.0*cc};
real_t coefs_r[] = {0.0, -2.0*c3, -4.0*c3};
real_t coefs_r_near[] = {0.0, -2.0*c3, -2.0*c3};

real_t coefs_z[] = {-1.0*cc, 0.0, 3.0*cc};
real_t coefs_z[] = {-1.0*c3, 0.0, 3.0*c3};
real_t coefs_z_near[] = {0.0, c3, 2.0*c3};

_correct_Wm(coefs, keep_nearfield, Kint->QWV_kmax, 1.0, Kint->sumJ[ir]);
_correct_Wm(coefs, coefs_near, keep_nearfield, Kint->QWV_kmax, 1.0, Kint->sumJ[ir]);
if(Kint->calc_upar){
_correct_Wm(coefs_z, keep_nearfield, Kint->QWVz_kmax, 1.0 / kcut, Kint->sumJz[ir]);
_correct_Wm(coefs_r, keep_nearfield, Kint->QWV_kmax, 1.0, Kint->sumJr[ir]);
_correct_Wm(coefs_z, coefs_z_near, keep_nearfield, Kint->QWVz_kmax, 1.0 / kcut, Kint->sumJz[ir]);
_correct_Wm(coefs_r, coefs_r_near, keep_nearfield, Kint->QWV_kmax, 1.0, Kint->sumJr[ir]);
}
}
}
Loading