標籤:

碼農的日誌

intersection裡面會有負數開平方的問題,因為兩個點離得太近了。

一個trivial的解決辦法:

算r3的時候:

pp = cos(z_2 - z_1);

if (std::fabs(pp - 1.00) < 1e-5) r3 = std::fabs(r1 - r2);

else r3 = sqrt(r1*r1 + r2*r2 - 2 * r1*r2*pp);

算xd_3的時候:

if (std::fabs(pp - 1.00) < 1e-5) x_d[3] = 0.5*z_1 + 0.5*z_2;

else ...

博後師兄寫raytrace裡面定義的一堆常數有個命名成了d1正好和defpar重了,改成constd1了,還好後面也只用了一次,沒弄混。

raytrace最後一步算cosem的時候用新的代碼正好和原來差了個負號

redshift_KRZ(spin,d1,xem[1], const1, gfactor);

// /*Non Kerr PRD 90, 064002 (2014) Eq. 34*/

// cosem = carter*gfactor/sqrt(xem[1]*xem[1]);

long double g[4][4];

metric_KRZ(spin, d1, xem[1], Pi / 2.0, g);

cosem = -gfactor*sqrt(g[2][2])*kth;

VS里用不了庫函數的max於是隨手寫了也不知道會不會慢,懷念起了高中時光

long double mymax(long double a, long double b) {

if (a > b) return a;

else return b;

}

看著上角那蜜汁凸起,舊代碼不用數值算metric的時候也有一模一樣的凸起。。。

要算精確的話又要算這一坨東西的求導了。。。

visual studio的麻煩真的好多。。。

sprintf(filename_o,"photon/photons4trf_a%.05Le.i%.02Le.e_%.02Le.a13_%.02Le.a22_%.02Le.a52_%.02Le.dat",spin,iobs_deg,epsi3,a13,a22,a52);

注意在visual studio這裡改成

sprintf(filename_o,"photons4trf_a%.05Le.i%.02Le.e_%.02Le.a13_%.02Le.a22_%.02Le.a52_%.02Le.dat",spin,iobs_deg,epsi3,a13,a22,a52);

2018-4-8發現有一個求導少乘了個2。。。。

2018-4-12

新代碼還是有和以前一樣的問題,raytrace會在度規不可逆的地方死循環,加這麼幾句吧。。

long double gg;

long double myg[4][4];

metric(r, th, myg);

gg = myg[0][0] * myg[3][3] - myg[0][3] * myg[3][0];

if (std::fabs(gg) < 1e-9) stop_integration = 4;

2018-4-13

大概case<20的時候會波動很大。。。不過估計沒什麼事吧,畢竟半徑那麼大的地方肯定已經幾乎沒反射譜的貢獻了吧

推薦閱讀:

TAG:失敗體驗 |