示例#1
0
文件: cs_line.c 项目: zalt50/xraylib
double CS_FluorLine(int Z, int line, double E, xrl_error **error)
{
  double JumpK;
  double cs_line, Factor = 1.0;

  if (Z < 1 || Z > ZMAX) {
    xrl_set_error_literal(error, XRL_ERROR_INVALID_ARGUMENT, Z_OUT_OF_RANGE);
    return 0.0;
  }

  if (E <= 0.0) {
    xrl_set_error_literal(error, XRL_ERROR_INVALID_ARGUMENT, NEGATIVE_ENERGY);
    return 0.0;
  }

  if (line >= KN5_LINE && line <= KB_LINE) {
    double edgeK = EdgeEnergy(Z, K_SHELL, error);
    double cs, rr;
    if (E > edgeK && edgeK > 0.0) {
      double yield;
      JumpK = JumpFactor(Z, K_SHELL, error);
      if (JumpK == 0.0) {
	return 0.0;
      }
      yield = FluorYield(Z, K_SHELL, error);
      if (yield == 0.0) {
	return 0.0;
      }
      Factor = ((JumpK - 1)/JumpK) * yield;
    }
    else if (edgeK == 0.0) {
      return 0.0;
    }
    else {
      xrl_set_error_literal(error, XRL_ERROR_INVALID_ARGUMENT, TOO_LOW_EXCITATION_ENERGY);
      return 0.0;
    }

    cs = CS_Photo(Z, E, error);
    if (cs == 0.0) {
      return 0.0;
    }

    rr = RadRate(Z, line, error);
    if (rr == 0.0) {
      return 0.0;
    }

    cs_line = cs * Factor * rr;
  }
  else if ((line <= L1L2_LINE && line >= L3Q1_LINE) || line == LA_LINE) {
    double cs, rr;
    cs = CS_Photo(Z, E, error);
    if (cs == 0.0) {
      return 0.0;
    }

    rr = RadRate(Z, line, error);
    if (rr == 0.0) {
      return 0.0;
    }

    if (line >= L1P5_LINE && line <= L1L2_LINE) {
      Factor = Jump_from_L1(Z, E, error);
    }
    else if (line >= L2Q1_LINE && line <= L2L3_LINE)  {
      Factor = Jump_from_L2(Z, E, error);
    }
    /*
     * it's safe to use LA_LINE since it's only composed of 2 L3-lines
     */
    else if ((line >= L3Q1_LINE && line <= L3M1_LINE) || line == LA_LINE) {
      Factor = Jump_from_L3(Z, E, error);
    }
    if (Factor == 0.0) {
      return 0.0;
    }
    cs_line = cs * Factor * rr;
  }
  else if (line == LB_LINE) {
    /*
     * b1->b17
     */
    double cs;
    cs_line = Jump_from_L2(Z, E, NULL) * (RadRate(Z, L2M4_LINE, NULL) + RadRate(Z, L2M3_LINE, NULL)) +
      Jump_from_L3(Z, E, NULL) * (RadRate(Z, L3N5_LINE, NULL) + RadRate(Z, L3O4_LINE, NULL) + RadRate(Z, L3O5_LINE, NULL) + RadRate(Z, L3O45_LINE, NULL) + RadRate(Z, L3N1_LINE, NULL) + RadRate(Z, L3O1_LINE, NULL) + RadRate(Z, L3N6_LINE, NULL) + RadRate(Z, L3N7_LINE, NULL) + RadRate(Z, L3N4_LINE, NULL)) +
      Jump_from_L1(Z, E, NULL) * (RadRate(Z, L1M3_LINE, NULL) + RadRate(Z, L1M2_LINE, NULL) + RadRate(Z, L1M5_LINE, NULL) + RadRate(Z, L1M4_LINE, NULL));

    if (cs_line == 0.0) {
      xrl_set_error_literal(error, XRL_ERROR_INVALID_ARGUMENT, TOO_LOW_EXCITATION_ENERGY);
      return 0.0;
    }
    cs = CS_Photo(Z, E, error);
    if (cs == 0.0) {
      return 0.0;
    }
    cs_line *= cs;
  }
  else {
    xrl_set_error_literal(error, XRL_ERROR_INVALID_ARGUMENT, INVALID_LINE);
    return 0.0;
  }
  
  
  return cs_line;
}            
示例#2
0
float CS_FluorLine(int Z, int line, float E)
{
  float JumpK;
  float cs_line, Factor = 1.;

  if (Z<1 || Z>ZMAX) {
    ErrorExit("Z out of range in function CS_FluorLine");
    return 0;
  }

  if (E <= 0.) {
    ErrorExit("Energy <=0 in function CS_FluorLine");
    return 0;
  }

  if (line>=KN5_LINE && line<=KB_LINE) {
    if (E > EdgeEnergy(Z, K_SHELL)) {
      JumpK = JumpFactor(Z, K_SHELL);
      if (JumpK <= 0.)
	return 0.;
      Factor = ((JumpK-1)/JumpK) * FluorYield(Z, K_SHELL);
    }
    else
      return 0.;                               
    cs_line = CS_Photo(Z, E) * Factor * RadRate(Z, line) ;
  }

  else if (line>=L1P5_LINE && line<=L1L2_LINE) {
	Factor=Jump_from_L1(Z,E);
	cs_line = CS_Photo(Z, E) * Factor * RadRate(Z, line) ;
  }
  
  else if (line>=L2Q1_LINE && line<=L2L3_LINE)  {
	Factor=Jump_from_L2(Z,E);
	cs_line = CS_Photo(Z, E) * Factor * RadRate(Z, line) ;
  }
  /*
   * it's safe to use LA_LINE since it's only composed of 2 L3-lines
   */
  else if ((line>=L3Q1_LINE && line<=L3M1_LINE) || line==LA_LINE) {
	Factor=Jump_from_L3(Z,E);
	cs_line = CS_Photo(Z, E) * Factor * RadRate(Z, line) ;
  }
  else if (line==LB_LINE) {
   	/*
	 * b1->b17
	 */
   	cs_line=Jump_from_L2(Z,E)*(RadRate(Z,L2M4_LINE)+RadRate(Z,L2M3_LINE))+
		   Jump_from_L3(Z,E)*(RadRate(Z,L3N5_LINE)+RadRate(Z,L3O4_LINE)+RadRate(Z,L3O5_LINE)+RadRate(Z,L3O45_LINE)+RadRate(Z,L3N1_LINE)+RadRate(Z,L3O1_LINE)+RadRate(Z,L3N6_LINE)+RadRate(Z,L3N7_LINE)+RadRate(Z,L3N4_LINE)) +
		   Jump_from_L1(Z,E)*(RadRate(Z,L1M3_LINE)+RadRate(Z,L1M2_LINE)+RadRate(Z,L1M5_LINE)+RadRate(Z,L1M4_LINE));
   	cs_line*=CS_Photo(Z, E);
  }

  else {
    ErrorExit("Line not allowed in function CS_FluorLine");
    return 0;
  }
  
  
  return (cs_line);
}