/*Génère des électrons dans un espace délimité par un double cône surmonté d'un lobe qui émettent des photons par effet synchrotron (de façon ordonnée boostée ou isotrope). * Les photons sont ensuite détectés par des détecteurs placés à différents angles d'observations et qui enregistrent l'intensité reçue, le degré et la direction de polarisation sur chaque pixel. * On peut aussi choisir si l'ont prend en compte les effets faradays qui s'appliquent à la polarisation dans le milieu intergalactique. */ #include "functions.h" #include "synchrotron.h" #include #include #include #include #include #include #include using namespace std; bool const ordonne = true; //si "true" l'émission par le jet est ordonnée, si "false" l'émission est isotrope bool const farad = true; //si "true" on prend en compte la rotation et la dépolarisation par effet Faraday double const B_f = 1.*1e-9; //intensité du champ magnétique intergalactique pour les effets Faraday double const proportion=0.20; //proportion de photons dans les lobes par rapport au nombre total de photons émis double const e = 1.602e-19, me = 9.109e-31, eps0 = 1e-9/(36.*M_PI), mu0 = 4.*M_PI*1e-7, n0 = 1.1e2, c = 299792458; //n0 est la densité d'électrons (en m^-3) double const h_planck = 6.626e-34; double const I = 1., Q = 0.1, U = 0.1, V = 0.2; //valeurs par défaut des paramètres de Stokes double const z = 0.77, D_l = 3407.27e6*3.0857e16; //redshift et distance lumière de 3C175 double const B_j = 1e-4, y_p_j = pow(10,4.5), p_j = 3.15, y_bulk_j = 4., nu_j = 5e9, theta_j = 10., R_j = 412.01e3*3.0857e16; //initialisation des paramètres physiques : intensité du champ magnétique, énergie maximale des particules, pente spectrale, facteur de lorentz du jet, fréquence etudiée, demi-angle d'ouverture du jet, taille du jet (pour 3C175) double const R_l = 0.25*R_j; //rayon du lobe double const ep_l = 0.20*R_l, theta_l_max = 3./4.*M_PI; //épaisseur et ouverture du lobe int const pas_theta = 10, pas_phi = 10; //pas d'observations selon les angles theta et phi int const n_theta = (int)(180./pas_theta)+1, n_phi = (int)360./pas_phi; double const theta_det[10] = {0.,10.,20.,30.,40.,50.,60.,70.,80.,90.}, phi_det = 0.; //angles de positionnnement des capteurs double const x_max = 1.4*R_j, y_max = 1.4*R_j, pas_x = 5.782e3*3.0857e16, pas_y = 5.782e3*3.0857e16; //Dimensions et résolution des capteurs int const n_theta_det = 10, n_x = (int)(2*x_max/pas_x), n_y = (int)(2*y_max/pas_y); int const n_photons = 1e9; class photon { public: bool jet; //"true" si le photon est émis par le jet, "false" s'il est émis par le lobe double r_e; //coordonnées sphériques de l'électron à l'instant de l'émission où le centre de la galaxie est l'origine du repère, le plan galactique est contenu dans le plan xOy et les jets s'étendent le long de l'axe Oz (on suppose le champ magnétique confondu avec Oz) double theta_e; double phi_e; double theta_p; //angle entre la direction d'émission du photon et Oz double phi_p; //angle entre la direction d'émission du photon et Ox double E; //énergie du photon (fréquence) double I; //paramètres de Stokes de l'émission associée au photon }; /* * Pour l'initialisation et la sortie des données des détecteurs */ void init(double tab[n_theta][n_phi]){ for(int i=0;i>> *tab, int n_det, int n_x, int n_y){ (*tab).resize(n_det); for(int k=0;k> tab, int n_x, int n_y, string name, int nbr){ string filename = "data/detect_"+name+"_"+to_string(nbr)+".res"; fstream data(filename.c_str(),ios::out); for(int j=0;j distrib[(int)(theta/pas_theta)]); if((*p).r_e < 0) (*p).theta_p = 180.-theta; else (*p).theta_p = theta; (*p).phi_p = drand48()*360.; } else{ //Si le photon est émis depuis le lobe, émission isotrope (*p).theta_p = drand48()*180.; (*p).phi_p = drand48()*360.; } } void proj_plane(double theta, double phi, photon p, double* pos){ //projection du photon sur le plan du capteur où il a été détecté double theta_e = p.theta_e, phi_e = p.phi_e, r_e = p.r_e; pos[0] = -r_e*sin(theta_e)*sin(phi-phi_e); pos[1] = r_e*(sin(theta)*cos(theta_e)-cos(theta)*sin(theta_e)*cos(phi-phi_e)); } double dist(double D, double theta_d, double phi_d, photon p, double* pos){ //calcul de la distance-luminosité parcourue par le photon jusqu'au capteur double r = p.r_e, theta_e = p.theta_e, phi_e = p.phi_e, xp = pos[0], yp = pos[1]; double ps1 = -D*(sin(theta_e)*sin(theta_d)*cos(phi_e-phi_d)+cos(theta_e)*cos(theta_d)); double ps2 = -xp*sin(theta_e)*sin(phi_e-phi_d)+yp*(sin(theta_e)*sin(theta_d)*cos(phi_e-phi_d)-cos(theta_e)*sin(theta_d)); return sqrt(D*D+r*r+(xp*xp+yp*yp)+2.*r*(ps1+ps2)); } double Faraday_rot(double B, double nu, double d){ //calcul de la rotation faraday de la polarisation par le champ magnétique intergalactique double coeff = 0.812;//(e*e*e)/(2.*M_PI*me*me*c*c*c*c); double ne = pow(1.+z,3)*1.1e-7;//*n0; return coeff*ne*B*1e9*d/3.0857e16*c*c/(nu*nu); } double Faraday_dep(double B, double nu, double d, double p0){ //calcul de la dépolarisation faraday par le champ magnétique intergalactique double RM = angle_princ(Faraday_rot(B,nu,d)); return p0*fabs(sinc(RM)); } /* * Appel des fonctions */ int main(){ time_t start = time(nullptr); srand48(time(NULL)); system("mkdir data"); fstream data("data/photons.res",ios::out); //création-ouverture des fichiers pour l'affichage 3D des positions des électrons dans l'espace et de la direction des photons émis-reçus par chaque capteur fstream data2[n_theta_det]; for(int k=0;k>> D_I_proj; //Détecteurs en intensité pour les plans de ciel vector>>> D_pola_p; //Détecteurs du degré de polarisation pour les plans de ciel vector>>> D_pola_theta; double distrib_theta[n_theta]; //valeurs pour la distribution du flux en fonction de l'angle d'observation distrib(distrib_theta,nu_j,B_j,y_p_j,p_j,y_bulk_j); double M = max_distrib(distrib_theta); //init(D_I); D_pola_p.resize(2); D_pola_theta.resize(2); init_proj(&D_I_proj,n_theta_det,n_x,n_y); init_proj(&D_pola_p[0],n_theta_det,n_x,n_y); init_proj(&D_pola_theta[0],n_theta_det,n_x,n_y); init_proj(&D_pola_p[1],n_theta_det,n_x,n_y); init_proj(&D_pola_theta[1],n_theta_det,n_x,n_y); //initialisation à 0 des differents capteurs photon newphoton; int ind[19] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //indice pour le comptage d'électrons à sauter pour ne pas surcharger l'affichage 3D int i=0,j=0, x, y; double gam=0,para=0,orth=0,p=0,angle=0; for(i=0;i1e6){ //limitation du nombre de photons enregistrés pour la représentation 3D j++; if(j>1000){ j=0; data << newphoton.r_e*sin(newphoton.theta_e)*sin(newphoton.phi_e) << " " << newphoton.r_e*sin(newphoton.theta_e)*cos(newphoton.phi_e) << " " << newphoton.r_e*cos(newphoton.theta_e) << " " << newphoton.theta_p << " " << newphoton.phi_p << endl; } } else data << newphoton.r_e*sin(newphoton.theta_e)*sin(newphoton.phi_e) << " " << newphoton.r_e*sin(newphoton.theta_e)*cos(newphoton.phi_e) << " " << newphoton.r_e*cos(newphoton.theta_e) << " " << newphoton.theta_p << " " << newphoton.phi_p << endl; for(int k=0;k100){ ind[k]=0; data2[k] << newphoton.r_e*sin(newphoton.theta_e)*sin(newphoton.phi_e) << " " << newphoton.r_e*sin(newphoton.theta_e)*cos(newphoton.phi_e) << " " << newphoton.r_e*cos(newphoton.theta_e) << " " << newphoton.theta_p << " " << phi_det << endl;//newphoton.phi_p << endl; } } } } double px=0, py=0; for(int k=0;k 0){ D_pola_p[0][k][i][j] = D_pola_p[0][k][i][j]/D_I_proj[k][i][j]; //moyennage de la polarisation sur la ligne de visée correspondant au pixel D_pola_p[1][k][i][j] = D_pola_p[1][k][i][j]/D_I_proj[k][i][j]; //moyennage de la depolarisation sur la ligne de visée correspondant au pixel px = x_max-pas_x*(n_x-1-i); py = y_max-pas_y*(n_y-1-j); //D_pola_theta[0][k][i][j] = D_pola_theta[0][k][i][j]/D_I_proj[k][i][j]; //moyennage de l'angle de polarisation sur la ligne de visée correspondant au pixel D_pola_theta[1][k][i][j] = D_pola_theta[1][k][i][j]/D_I_proj[k][i][j]; //moyennage de la rotation faraday sur la ligne de visée correspondant au pixel D_pola_theta[0][k][i][j] = angle_princ(atan(px/py)+D_pola_theta[0][k][i][j]); //l'angle de polarisation est calculé en fonction de l'angle projeté entre la direction du champ magnétique et la position de l'électron D_pola_theta[1][k][i][j] = angle_princ(atan(px/py)+D_pola_theta[1][k][i][j]); } data.close(); for(int k=0;k