static int xmi_write_xrmc_spectrumfile(char *xrmc_spectrumfile, struct xmi_input *input) { FILE *filePtr; int i, j, k; if ((filePtr = fopen(xrmc_spectrumfile, "w")) == NULL) { fprintf(stderr, "Could not write to %s\n", xrmc_spectrumfile); return 0; } fprintf(filePtr, "Newdevice spectrum\n"); fprintf(filePtr, "Spectrum\n"); fprintf(filePtr, "PolarizedFlag 1\n"); fprintf(filePtr, "LoopFlag 1\n"); fprintf(filePtr, "ContinuousPhotonNum 1\n"); fprintf(filePtr, "LinePhotonNum 1\n"); fprintf(filePtr, "RandomEneFlag 1\n"); if (input->excitation->n_discrete > 0) { fprintf(filePtr, "Lines\n%i\n", input->excitation->n_discrete); for (i = 0 ; i < input->excitation->n_discrete ; i++) { double blb = 1.0; for (j = 0 ; j < input->absorbers->n_exc_layers ; j++) { double mu = 0.0; for (k = 0 ; k < input->absorbers->exc_layers[j].n_elements ; k++) { mu += CS_Total_Kissel(input->absorbers->exc_layers[j].Z[k], input->excitation->discrete[i].energy)*input->absorbers->exc_layers[j].weight[k]; } blb *= exp(-1.0*mu*input->absorbers->exc_layers[j].density*input->absorbers->exc_layers[j].thickness); } fprintf(filePtr, "%g %g %g %g\n", input->excitation->discrete[i].energy, (input->excitation->discrete[i].distribution_type == XMI_DISCRETE_GAUSSIAN) ? input->excitation->discrete[i].scale_parameter : 0.0, blb*input->excitation->discrete[i].horizontal_intensity, blb*input->excitation->discrete[i].vertical_intensity); } } if (input->excitation->n_continuous > 0) { fprintf(filePtr, "ContinuousSpectrum\n%i\n", input->excitation->n_continuous); for (i = 0 ; i < input->excitation->n_continuous ; i++) { double blb = 1.0; for (j = 0 ; j < input->absorbers->n_exc_layers ; j++) { double mu = 0.0; for (k = 0 ; k < input->absorbers->exc_layers[j].n_elements ; k++) { mu += CS_Total_Kissel(input->absorbers->exc_layers[j].Z[k], input->excitation->continuous[i].energy)*input->absorbers->exc_layers[j].weight[k]; } blb *= exp(-1.0*mu*input->absorbers->exc_layers[j].density*input->absorbers->exc_layers[j].thickness); } fprintf(filePtr, "%g %g %g\n", input->excitation->continuous[i].energy, blb*input->excitation->continuous[i].horizontal_intensity, blb*input->excitation->continuous[i].vertical_intensity); } fprintf(filePtr, "Resample 0\n"); } fprintf(filePtr, "End\n"); fclose(filePtr); return 1; }
double CSb_Total_Kissel(int Z, double E, xrl_error **error) { double cs = CS_Total_Kissel(Z, E, error); if (cs == 0.0) return 0.0; return cs * AtomicWeight_arr[Z] / AVOGNUM; }
int getAtomicXRayCS_Kissel (int shellID) { int i, Z; float energy_keV; Z = SymbolToAtomicNumber ( targetFormula ); edgeEnergy = 0.0; fluorYield = 1.0; jumpFactor = 1.0; levelWidth = 0.0; electronConfig = Z; if (verbose > 3) { fprintf(stdout, "getAtomicXRayCS: Z = %d\n", Z); fprintf(stdout, "getAtomicXRayCS_Kissel: shellID = %d\n", shellID); if (verbose>2) { fprintf(stdout, "Index PhotonEnergy TotalCS PhotoCS coherentCS incohrentCS \n"); } } if (shellID <= 30 && shellID >= 0) { edgeEnergy = 1000.0 * EdgeEnergy(Z, shellID); fluorYield = FluorYield(Z, shellID); jumpFactor = JumpFactor(Z, shellID); electronConfig = ElectronConfig(Z, shellID); levelWidth = AtomicLevelWidth(Z, shellID); for ( i = 0; i < npts; i++ ) { energy_keV = 0.001 * energy[i]; if ( energy[i] > edgeEnergy ) { photo[i] = CS_Photo_Partial (Z, shellID, energy_keV); } else { photo[i] = 0.0; } total[i] = 0.0; rayleigh[i] = 0.0; compton[i] = 0.0; if (verbose>2) { fprintf(stdout, "%4d %12.1f %12.4g %12.4g %12.4g %12.4g \n", i, energy[i], total[i], photo[i], rayleigh[i], compton[i]); } } } else if (shellID > 99) { for ( i = 0; i < npts; i++ ) { energy_keV = 0.001 * energy[i]; total[i] = CS_Total_Kissel ( Z, energy_keV ); photo[i] = CS_Photo_Total ( Z, energy_keV ); rayleigh[i] = CS_Rayl ( Z, energy_keV ); compton[i] = CS_Compt ( Z, energy_keV ); if (verbose>2) { fprintf(stdout, "%4d %12.1f %12.4g %12.4g %12.4g %12.4g \n", i, energy[i], total[i], photo[i], rayleigh[i], compton[i]); } } } else { for ( i = 0; i < npts; i++ ) { energy_keV = 0.001 * energy[i]; photo[i] = CS_Photo ( Z, energy_keV ); total[i] = CS_Total ( Z, energy_keV ); rayleigh[i] = CS_Rayl ( Z, energy_keV ); compton[i] = CS_Compt ( Z, energy_keV ); if (verbose>2) { fprintf(stdout, "%4d %12.1f %12.4g %12.4g %12.4g %12.4g \n", i, energy[i], total[i], photo[i], rayleigh[i], compton[i]); } } } if (verbose > 1) { fprintf(stdout, "edgeEnergy = %f, fluorYield = %f, jumpFactor = %f,", edgeEnergy, fluorYield, jumpFactor); fprintf(stdout, " electronConfig = %f, levelWidth = %f \n", electronConfig, levelWidth); } return 0; }