/* ファイル名はkinema.c */
#include <stdio.h>
#include <math.h>
double calcE(double M, double p);
double calcP(double M, double E);
kinema() /* <--- main文の名前をかえる */
{
double M1, M2, M3, M4; /* 粒子の質量 */
double p1, p2, p3, p4; /* 粒子の実験室系での運動量 */
double E1, E2, E3, E4; /* 粒子の実験室系でのエネルギー */
double theta; /* 実験室系での散乱角 */
double p3_parl; /* 粒子3の実験室系での運動量の
重心系の速度に射影した成分*/
double p_cm1, p_cm2, p_cm3, p_cm4; /* 粒子の重心系での運動量 */
double E_cm1, E_cm2, E_cm3, E_cm4; /* 粒子の重心系でのエネルギー */
double theta_cm; /* 重心系での散乱角 */
double beta_cm, gamma_cm; /* 重心系の速度 */
double E_cm;
/* input */
M1 = 938.2;
M2 = 11177.0;
M3 = 938.2;
M4 = 11177.0;
p1 = calcP(M1, M1+12.0); /* 運動エネルギー12MeV */
p2 = 0.0;
E1 = calcE(M1, p1); /* 質量と運動量からエネルギーを求める関数 */
E2 = calcE(M2, p2);
/* output fileを開く */
FILE *fp;
fp = fopen("output.txt","w");
/* まずbeta, gammaを求める */
beta_cm = (p1+p2)/(E1+E2);
gamma_cm = 1.0/sqrt(1.0-beta_cm*beta_cm);
/* 重心系のエネルギーを求める */
E_cm = sqrt((E1+E2)*(E1+E2)-(p1+p2)*(p1+p2));
/* 散乱粒子の重心系でのエネルギーを求める */
E_cm3 = (E_cm + (M3*M3 - M4*M4)/E_cm)/2.0;
E_cm4 = (E_cm - (M3*M3 - M4*M4)/E_cm)/2.0;
p_cm3 = p_cm4 = calcP(M3, E_cm3); /* 質量とエネルギーから運動量を求める関数 */
for (theta_cm=0.0; theta_cm<=180.0; theta_cm+=1.0) {
/* 重心系でのエネルギー、運動量に戻そう */
p3 = sqrt(pow(gamma_cm*beta_cm*E_cm3+gamma_cm*p_cm3*cos(theta_cm*3.14/180.0),2.0) +
pow(p_cm3*sin(theta_cm*3.14/180.0), 2.0));
p3_parl = gamma_cm*beta_cm*E_cm3+gamma_cm*p_cm3*cos(theta_cm*3.14/180.0);
if (p3_parl >= 0)
theta = asin((p_cm3/p3)*sin(theta_cm*3.14/180.0))*180.0/3.14;
else
theta = 180.0 - asin((p_cm3/p3)*sin(theta_cm*3.14/180.0))*180.0/3.14;
printf("%f %f\n", theta, calcE(M3, p3)-M3); /* <--- 実験室系の角度と運動エネルギーを表示 */
/* output fileに書き出す */
fprintf(fp, "%f %f\n", theta, calcE(M3, p3)-M3);
}
/* output fileをとじる */
fclose(fp);
}
double calcE(double M, double p)
{
return sqrt(M*M + p*p);
}
double calcP(double M, double E)
{
return sqrt(E*E -M*M);
}