/* ファイル名は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); }