diff --git a/compute_stokes.c b/compute_stokes.c index 7dbc1984b878614f6c50dec7bb19f40e550f7529..061a6e634d2850bc23b66d2fa2d598b2343d36b3 100644 --- a/compute_stokes.c +++ b/compute_stokes.c @@ -36,17 +36,13 @@ void compute_stokes(double ene, double* k_lab, double* polvect_cart, stokes_para { if ((cos_theta <= array_ubounds[jj]) && (cos_theta >= array_ubounds[jj + 1])) { - /* if (jj==nstepangles-1) - { - printf("Angles [%5.4f - %5.4f]\n", array_ubounds[jj], array_ubounds[jj+1]); - } - */ detector_axis(k_lab, Qp_cart, Qm_cart, Up_cart, Um_cart); Qs = pow(dot_prod(Qp_cart, polvect_cart), 2) - pow(dot_prod(Qm_cart, polvect_cart), 2); Us = pow(dot_prod(Up_cart, polvect_cart), 2) - pow(dot_prod(Um_cart, polvect_cart), 2); + if (isnan(Qs)) { printf("Error: Qs is Nan\n"); @@ -75,7 +71,7 @@ void compute_stokes(double ene, double* k_lab, double* polvect_cart, stokes_para if (FlagFound == FALSE) { double zio = 1; - // printf("Warning: no correspondence for Ene=%5.4f k_z=%5.4f\n", ene, k_lab[2]); + printf("Warning: no correspondence for Ene=%5.4f k_z=%5.4f\n", ene, k_lab[2]); // exit(1); } } diff --git a/iteration_functions.h b/iteration_functions.h deleted file mode 100644 index a6ea2c8aedf50e1cd8dfcc607756699e057bfcec..0000000000000000000000000000000000000000 --- a/iteration_functions.h +++ /dev/null @@ -1,242 +0,0 @@ -#include "local_header.h" -#include "globals.h" -#include "common_header.h" -#include "gsl/gsl_odeiv2.h" -#include "define_values.h" - - -#ifndef ITERATION_FUNCIONS_H_ -#define ITERATION_FUNCIONS_H_ - -#define SEED_CENTER 1 -#define SEED_UNIFORM 2 -#define SEED_BASE 3 -#define SEED_DELTA 4 -#define SEED_EXP 5 - -#define RTE 1 -#define MC_SLAB 2 - -#define U_POSITIVE 1 -#define U_NEGATIVE -1 - -extern FILE* dat_spectrum; -extern FILE* dat_diffusion; -extern FILE* dat_integral_polar; -extern FILE* dat_energy_polar; - -extern int seed_location; -extern int Nstep_mu; -extern int Nstep_tau; - -extern double tau0; -extern double tau_c; - -extern gsl_spline2d *Spline_I2d_l; -extern gsl_spline2d *Spline_I2d_r; - - -extern gsl_interp_accel* xacc_2d; -extern gsl_interp_accel* yacc_2d; - -extern gsl_spline* Spline_sample_Iu; -extern gsl_spline* Spline_eval_limbdark; -extern gsl_spline* Spline_eval_pdeg; -extern gsl_spline *Spline_tau_Ak; -extern gsl_spline *Spline_tau_Bk; -extern gsl_spline *Spline_tau_Ck; - -extern gsl_interp_accel* xacc_1d; -extern gsl_interp_accel* yacc_1d; - -extern char* polarization_file; -extern char* diffusion_file; -extern char* integral; -extern char* polarinput; - -typedef struct { - - double* array_mu; - double* array_tau; - double** matrix; - - - -} Ikl_intensity; - -typedef struct { - - double* array_mu; - double* array_tau; - double** matrix; - -} Ikr_intensity; - - -typedef struct { - - int idx_tau; - double * weights_u; - double u; - double* array_u; - double* array_tau; - double** Il_matrix_upstream; - double** Ir_matrix_upstream; - - double** Il_matrix_downstream; - double** Ir_matrix_downstream; - - gsl_spline2d *Spline_I2d_l_upstream; - gsl_spline2d *Spline_I2d_l_downstream; - gsl_spline2d *Spline_I2d_r_upstream; - gsl_spline2d *Spline_I2d_r_downstream; - - -} Iklr_intensity; - - -typedef struct { - - int k; - int seed_location; - double tau_s; - double tau0; - double tau; - double* array_mu; - double* array_tau; - double** matrix; - -} AngularFunctionParams; - - -typedef struct { - - int nlines; - double u_min; - double u_max; - double* u; - double* pdeg; - double* Q; - double* U; - double* limbdark; - gsl_spline* Spline; - gsl_interp_accel* acc; - - -} radiation_field_t; - -typedef struct { - double *array_rand; - double *array_u; - double *array_integ; - double total_integral; - int nlines; - gsl_spline *spline; - gsl_interp_accel *acc1; - } cumulative_angdist_t; - - - -/*========================================================================*/ -/*Functions prototypes*/ -/*========================================================================*/ - - -double f_interp(double u, double tau); -double I0_center(double tau0, double tau, double u); -double I0_delta(double tau, double tau_s, double mu); -double I0_uniform(double tau0, double tau, double mu); -double I0_base(double tau0, double tau, double mu, int sign_mu); -double I0_exp(double tau, double tau0, double mu); - -double theta_funct(double tau, double tau_c); -void make_linarray(double a, double b, int nstep, double* my_array); -double** dmatrix(long nrl, long nrh, long ncl, long nch); - -double Ak_integral (double x, void * params); -double Bk_integral (double x, void * params); -double Ck_integral (double x, void * params); - -double Il_integral (double x, void * params); -double Ir_integral (double x, void * params); - -void Compute_Ak_array(AngularFunctionParams* ptr_data, - double** Il_funct, double* za, double*array_tau, double*array_mu, int k, - gsl_integration_workspace * w, double* Ak_array); - -void Compute_Bk_array(AngularFunctionParams* ptr_data, - double** Il_funct, double* za, double*array_tau, double*array_mu, int k, - gsl_integration_workspace * w, double* Bk_array); - -void Compute_Ck_array(AngularFunctionParams* ptr_data, - double** Ir_funct, double* za, double*array_tau, double*array_mu, int k, - gsl_integration_workspace * w, double* Ck_array); - -double round_to_digits(double value, int digits); - -void slab_polarization(int kiter, int seed_location); - -void read_resultsfile(char* filename, radiation_field_t* radiation_field, int Flag); -void compute_cumulative_angdist(radiation_field_t* radiation_field, cumulative_angdist_t* cumulative_angdist); - -void check_results(gsl_spline* Spline_sample_Iu, gsl_spline* Spline_eval_pdeg, gsl_spline* Spline_eval_limbdark); - -/* ========================================================================= */ -/* Functions used to integrate the system of two ODE */ -/* ========================================================================= */ - - -extern gsl_spline* Spline_I2d_l_upstream; -extern gsl_spline* Spline_I2d_l_downstream; -extern gsl_spline* Spline_I2d_r_upstream; -extern gsl_spline* Spline_I2d_l_downstream; - -double legendre_integration_A(gsl_spline2d *Spline_I2d, double tau, double u, double* u_prime, double* weights_u); -double legendre_integration_B(gsl_spline2d *Spline_I2d, double tau, double u, double* u_prime, double* weights_u); -double legendre_integration_C(gsl_spline2d *Spline_I2d, double tau, double u, double* u_prime, double* weights_u); -double legendre_integration_D(gsl_spline2d *Spline_I2d, double tau, double u, double* u_prime, double* weights_u); - - -double scattering_matrix (int row, int col, double u, double u_prime); - -int solve_rte(int k_iter, int seed_distribution, int Nstep_tau); -int RTE_Equations(double s, const double y[], double f[], void* params); - - -void compute_results(int method, - int k_iter, - int Nstep_tau, - int Nstep_mu, - double* array_mu, - double* weights_u, - Iklr_intensity* ptr_Iklr, - Ikl_intensity* ptr_Ikl, - Ikr_intensity* ptr_Ikr); - - - - -//============================================================== -//Routines related to local MC -//============================================================== - -int slab_mc(int nphot, int seed); -void compute_stokes(double ene, double* k_lab, double* polvect_cart, - stokes_parameters* ptr_stokes, double* array_ubounds, int flag); - - -void collect_photons(double ene, - double* k, - double* array_ene, - double** array_counts, - int flag); - -void setup_gsl_objects(radiation_field_t* radiation_field, int Flag); -void electricfield_fromfile (double* k_phot, double* elect_field_lab, double* mag_field_lab, double *Pdeg); - -double subrel_maxwellian (double kte); - -void optimize_taustep(int k_iter, int seed_distribution); - - -#endif diff --git a/mc_slab.c b/mc_slab.c index 99291417d3a22b459c7a07609c102e167ad0e306..a4936af9b6cc1130237880d0c50ae08320f6d564 100644 --- a/mc_slab.c +++ b/mc_slab.c @@ -12,12 +12,12 @@ void comptonization(double E_lab, double* k_lab, double* Efield_lab, double* Magfield_lab, - int* PolarFlag, double* E_new_lab, double* k_new_lab, double* Efield_lab_new, double* Magfield_lab_new); + double distance_bottom(double z0, double kz); double distance_top(double z0, double kz, double H); @@ -57,14 +57,15 @@ int slab_mc(int nphot, int seed) { int ii; int jj; - int PolarFlag; - int FlagLocation; int n_sc; + int n_zero_sc; int nph_esc; int Fval_max; - int nsc_max; + int FlagLocation; int photon_diffusion[NSC_MAX]; int status; + + double E_lab; double E_new_lab; double k_lab[3]; @@ -74,8 +75,6 @@ int slab_mc(int nphot, int seed) double Magfield_lab[3]; double Magfield_lab_new[3]; double pos[3]; - double Pdeg; - double cos_theta; double sin_theta; double phi; @@ -87,6 +86,7 @@ int slab_mc(int nphot, int seed) double eps; double l_int; double csi; + double Pdeg; T_disk = gsl_root_fsolver_bisection; s_disk = gsl_root_fsolver_alloc(T_disk); @@ -145,7 +145,8 @@ int slab_mc(int nphot, int seed) setup_gsl_objects(radiation_field, MC_SLAB); } - Pdeg = 0; + + Pdeg=0; nph_esc = 0; cos_theta = 0; @@ -165,6 +166,7 @@ int slab_mc(int nphot, int seed) stokes_parameters struct_stokes_average[POLAR_NBOUNDS - 1]; allocate_stokes_pointer(struct_stokes_average); + n_zero_sc=0; /*=============================================================*/ /*Here starts loop over photon */ /*=============================================================*/ @@ -182,7 +184,6 @@ int slab_mc(int nphot, int seed) } n_sc = 0; - E_lab = bb_spec(ktbb); E_new_lab = 0; @@ -229,27 +230,14 @@ int slab_mc(int nphot, int seed) k_lab[1] = sin_theta * sin(phi); k_lab[2] = cos_theta; + if (DiskPolarizationFlag == FROMFILE) { electricfield_fromfile(k_lab, Efield_lab, Magfield_lab, &Pdeg); - - if (Pdeg < 0) - Pdeg = -Pdeg; - - if (clock_random() < Pdeg) - { - PolarFlag = 1; - } - else - { - PolarFlag = 0; - } } - else { unpolarized_seedphot(k_lab, Efield_lab, Magfield_lab); - PolarFlag = 0; } /*====================================================================*/ @@ -277,31 +265,28 @@ int slab_mc(int nphot, int seed) if (tau > eps) { l_int = eps / (NeDisk * SIGMA_T * r_units); - // printf("Photon %d will interact at dist %5.4f\n", ii, l_int); pos[0] = pos[0] + k_lab[0] * l_int; pos[1] = pos[1] + k_lab[1] * l_int; pos[2] = pos[2] + k_lab[2] * l_int; - comptonization(E_lab, k_lab, Efield_lab, Magfield_lab, &PolarFlag, &E_new_lab, k_new_lab, - Efield_lab_new, Magfield_lab_new); + //printf("Photon %d before scattering %d Pdeg = %5.4f\n", ii, n_sc, Pdeg); - n_sc++; + comptonization(E_lab, k_lab, Efield_lab, Magfield_lab, &E_new_lab, k_new_lab, + Efield_lab_new, Magfield_lab_new); - k_lab[0] = k_new_lab[0]; - k_lab[1] = k_new_lab[1]; - k_lab[2] = k_new_lab[2]; + //printf("After scattering Pdeg = %5.4f\n\n", Pdeg); + n_sc++; E_lab = E_new_lab; - Efield_lab[0] = Efield_lab_new[0]; - Efield_lab[1] = Efield_lab_new[1]; - Efield_lab[2] = Efield_lab_new[2]; + for (jj=0; jj<3; jj++) + { + k_lab[jj] = k_new_lab[jj]; + Efield_lab[jj] = Efield_lab_new[jj]; + Magfield_lab[jj] = Magfield_lab_new[jj]; + } - Magfield_lab[0] = Magfield_lab_new[0]; - Magfield_lab[1] = Magfield_lab_new[1]; - Magfield_lab[2] = Magfield_lab_new[2]; - } else @@ -311,6 +296,8 @@ int slab_mc(int nphot, int seed) { // printf("Photon %d escaping after %d scattering\n", ii, n_sc); + if (n_sc==0) n_zero_sc++; + compute_stokes(E_lab, k_lab, Efield_lab, struct_stokes, array_ubounds, 0); photon_diffusion[n_sc]++; collect_photons(E_new_lab, k_lab, array_ene, array_counts, 0); @@ -340,7 +327,6 @@ int slab_mc(int nphot, int seed) pos[2] = 0; unpolarized_seedphot(k_lab, Efield_lab, Magfield_lab); - PolarFlag = 0; E_lab = bb_spec(ktbb); } @@ -348,6 +334,7 @@ int slab_mc(int nphot, int seed) else { FlagLocation = 0; + break; } } // Close the else with condition k_lab[2] < 0 @@ -381,20 +368,26 @@ int slab_mc(int nphot, int seed) } } + // Get the number of processes + + MPI_Comm_size(MPI_COMM_WORLD, &nproc); + + /*==================================================================*/ if (rank == 0) { compute_stokes(1, k_lab, Efield_lab, struct_stokes_average, array_ubounds, 1); - printf("Percentage of escaping photons %4.3f\n", 1. * nph_esc / nphot); - + printf("Percentage of escaping photons from the top layer %4.3f\n", 1. * nph_esc / nphot); + printf("Percentage of escaping non scattered photons from the top layer %4.3f\n", (double) n_zero_sc/ nphot); /*============================================================*/ dat_diffusion = fopen(diffusion, "w"); fprintf(dat_diffusion, "!Percentage of escaping photons %4.3f\n", 1. * nph_esc / nphot); Fval_max=-10; + for (ii = 0; ii < 300; ii++) { if (photon_diffusion[ii] > Fval_max) @@ -426,19 +419,22 @@ int slab_mc(int nphot, int seed) } // End of function + void comptonization(double E_lab, double* k_lab, double* Efield_lab, double* Magfield_lab, - int* PolarFlag, double* E_new_lab, double* k_new_lab, double* Efield_lab_new, double* Magfield_lab_new) { + int jj; int status; + int PolarFlag; + double Pdeg; double phik; double E_erf; double E_new_erf; @@ -450,12 +446,14 @@ void comptonization(double E_lab, double k_erf[3]; double k_new_erf[3]; double el_vel_vect[3]; - double ElectField_new_erf[3]; double ElectField_old_erf[3]; - double MagField_Erf[3]; + + PolarFlag=0; + Pdeg=0; + //================================================================== */ // Find the K' components in the ERF */ // If also polarization is computed, transform also the electric */ @@ -466,15 +464,10 @@ void comptonization(double E_lab, versor_boost(k_lab, el_vel_vect, k_erf, 1); - double beta_new = subrel_maxwellian(kte); - - // printf("pluto %lf %lf\n", beta_el, beta_new); - elmag_lorentztransform(Efield_lab, Magfield_lab, el_vel_vect, ElectField_old_erf, MagField_Erf, 1); E_erf = energy_lorentz_boost(E_lab, el_vel_vect, k_lab, 1); - // printf("beta %lf %lf \n", beta_el, E_erf); csi = clock_random(); @@ -489,14 +482,8 @@ void comptonization(double E_lab, E_new_erf = new_energy_erf(E_erf, costheta_erf); - if (*PolarFlag == 1) - { - phik = sample_azim_angle(E_erf, E_new_erf, costheta_erf); - } - else - { - phik = 2 * PI * clock_random(); - } + + phik = sample_azim_angle(E_erf, E_new_erf, costheta_erf, 1); //================================================================== */ /*Find the components of the photon versor after scattering*/ @@ -515,15 +502,16 @@ void comptonization(double E_lab, // and compute the new electric field vector //================================================================== */ - status = depolarization_probability(E_erf, E_new_erf, costheta_erf, phik, PolarFlag); + PolarFlag=1; + status = depolarization_probability(E_erf, E_new_erf, costheta_erf, phik, &Pdeg, &PolarFlag); - + if (status == 1) { exit(1); } - electfield_as_new(k_new_erf, ElectField_old_erf, ElectField_new_erf, *PolarFlag); + electfield_as_new(k_new_erf, ElectField_old_erf, ElectField_new_erf, PolarFlag); vect_prod(k_new_erf, ElectField_new_erf, MagField_Erf); diff --git a/solve_rte.c b/solve_rte.c index 9d7ee65aec981b62b8edfe33168fb844997ac5b1..20dd9df6b35fd7e89b7baec30b9e1846ee4f1766 100644 --- a/solve_rte.c +++ b/solve_rte.c @@ -405,7 +405,7 @@ double I0_center_updown(double tau, double u) { double value; - if (tau >= tau0) + if (tau > tau0) { value = 1 / 2. * 1 / u * exp(-(tau - tau0) / u); }