Select Git revision
compute_stokes.c 3.73 KiB
#include "iteration_functions.h"
void compute_stokes(double ene, double* k_lab, double* polvect_cart, stokes_parameters* ptr_stokes, double* array_ubounds, int flag)
{
int FlagFound;
int ii, jj;
double Qs;
double Us;
double cos_theta;
static double Qp_cart[3];
static double Qm_cart[3];
static double Up_cart[3];
static double Um_cart[3];
cos_theta = k_lab[2];
/* =====================================================================# */
/* Loop on energies */
/* =====================================================================# */
FlagFound = FALSE;
if (flag == 0)
{
for (ii = 0; ii < POLAR_NBOUNDS - 1; ii++)
{
if ((ene >= ene_bound[ii]) && (ene <= ene_bound[ii + 1]))
{
/* =====================================================================# */
/* Loop on u array, the cosine of the polar angle. Indeed, k[2]=u */
/* =====================================================================# */
for (jj = 0; jj < nstepangles; jj++)
{
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");
exit(1);
}
if (isnan(Us))
{
printf("Error: Us is Nan\n");
exit(1);
}
ptr_stokes[ii].array_Is[jj] = ptr_stokes[ii].array_Is[jj] + 1;
ptr_stokes[ii].array_Qs[jj] = ptr_stokes[ii].array_Qs[jj] + Qs;
ptr_stokes[ii].array_Us[jj] = ptr_stokes[ii].array_Us[jj] + Us;
ptr_stokes[ii].counter[jj]++;
FlagFound = TRUE;
break;
}
}
}
}
if (FlagFound == FALSE)
{
double zio = 1;
// printf("Warning: no correspondence for Ene=%5.4f k_z=%5.4f\n", ene, k_lab[2]);
// exit(1);
}
}
else
{
double u_center;
double Qtot;
double Utot;
double Itot_u1;
double Itot;
int Itot_allbands = 0;
double* Pdeg = (double*)malloc(nstepangles * sizeof(double));
dat_integral_polar = fopen(integral, "w");
for (jj = 0; jj < nstepangles; jj++)
{
u_center = (array_ubounds[jj] + array_ubounds[jj + 1]) / 2;
Qtot = 0;
Utot = 0;
Itot = 0;
for (ii = 0; ii < POLAR_NBOUNDS - 1; ii++)
{
Itot_allbands = Itot_allbands + ptr_stokes[ii].array_Is[jj];
Qtot = Qtot + ptr_stokes[ii].array_Qs[jj];
Utot = Utot + ptr_stokes[ii].array_Us[jj];
Itot = Itot + ptr_stokes[ii].array_Is[jj];
if (isnan(Qtot))
{
printf("Qtot is Nan at jj=%d ii=%d\n", jj, ii);
exit(1);
}
if (isnan(Utot))
{
printf("Utot is Nan at jj=%d ii=%d\n", jj, ii);
exit(1);
}
if (isnan((double)Itot))
{
printf("Itot is Nan at jj=%d ii=%d\n", jj, ii);
exit(1);
}
}
Pdeg[jj] = sqrt(Qtot * Qtot + Utot * Utot) / Itot;
if (jj == 0)
{
Itot_u1 = Itot;
}
fprintf(dat_integral_polar, "%lf %lf %lf %lf %5.4f\n", u_center, Pdeg[jj], Qtot / Itot,
Utot / Itot, 1 / u_center * (Itot / Itot_u1));
}
fclose(dat_integral_polar);
printf("Total counts all bands %d\n", Itot_allbands);
}
}