コード例 #1
0
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;
}
コード例 #2
0
ファイル: kissel_pe.c プロジェクト: zalt50/xraylib
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;
}
コード例 #3
0
ファイル: sddsxra.c プロジェクト: epicsdeb/elegant
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;
}