Energy Unit Conversions (energy)¶
Module: utils_energy
Overview¶
Provides functions to convert between different energy and wavelength units used in X-ray spectroscopy. Uses CODATA 2018 physical constants for high precision.
Key Features¶
Convert between 7 different units: keV, eV, Rydberg, Joules, Hz, Angstroms, nanometers
High precision calculations using double precision arithmetic
Handles edge cases (e.g., very small wavelengths)
Based on CODATA 2018 physical constants
Supported Units¶
Unit Code |
Full Name |
Description |
|---|---|---|
|
Kiloelectron volts |
Standard X-ray energy unit |
|
Electron volts |
1/1000 of keV |
|
Rydberg |
Atomic energy unit |
|
Joules |
SI energy unit |
|
Hertz |
Frequency unit |
|
Angstroms |
Wavelength unit (10⁻¹⁰ m) |
|
Nanometers |
Wavelength unit (10⁻⁹ m) |
API Reference¶
Constants¶
Conversion Factors
Constant |
Value |
Description |
|---|---|---|
|
2.41798924208492e17_dp |
keV to Hz (e/h, CODATA 2018) |
|
12.39841984332_dp |
keV to Angstroms (hc/e, CODATA 2018) |
|
0.013605693122994_dp |
Rydberg to keV |
|
8.61733326214518e-8_dp |
Kelvin to keV |
Functions¶
calc_energy
- calc_energy(x1, x2, unit1, unit2)¶
Convert energy/wavelength between different units
- Parameters:
x1 – Input value (real(dp))
x2 – Output value (real(dp))
unit1 – Input unit (character*3)
unit2 – Output unit (character*3)
- Returns:
x2 contains converted value
Converts from unit1 to unit2 through keV as intermediate representation.
Usage Examples¶
Basic Energy Conversion
use utils_energy
use utils_cspex, only: dp
real(dp) :: energy_kev, wavelength_ang, frequency_hz
! Convert 1 keV to Angstroms
call calc_energy(1.0_dp, wavelength_ang, 'kev', 'ang')
write(*,*) '1 keV = ', wavelength_ang, ' Angstroms'
! Convert 1 keV to Hz
call calc_energy(1.0_dp, frequency_hz, 'kev', 'hz')
write(*,*) '1 keV = ', frequency_hz, ' Hz'
Wavelength to Energy
use utils_energy
use utils_cspex, only: dp
real(dp) :: energy_kev, wavelength_nm
! Convert 10 nm to keV
wavelength_nm = 10.0_dp
call calc_energy(wavelength_nm, energy_kev, 'nm', 'kev')
write(*,*) wavelength_nm, ' nm = ', energy_kev, ' keV'
Unit Round-Trip
use utils_energy
use utils_cspex, only: dp
real(dp) :: original_kev, converted_kev, temp_ang
original_kev = 6.4_dp ! Fe K-alpha line
! Convert keV to Angstroms and back
call calc_energy(original_kev, temp_ang, 'kev', 'ang')
call calc_energy(temp_ang, converted_kev, 'ang', 'kev')
write(*,*) 'Original: ', original_kev, ' keV'
write(*,*) 'Round-trip: ', converted_kev, ' keV'
write(*,*) 'Difference: ', abs(original_kev - converted_kev)
Common X-ray Lines
use utils_energy
use utils_cspex, only: dp
real(dp) :: energy_kev, wavelength_ang
! Fe K-alpha line (6.4 keV)
call calc_energy(6.4_dp, wavelength_ang, 'kev', 'ang')
write(*,*) 'Fe K-alpha: 6.4 keV = ', wavelength_ang, ' Angstroms'
! O K-alpha line (0.525 keV)
call calc_energy(0.525_dp, wavelength_ang, 'kev', 'ang')
write(*,*) 'O K-alpha: 0.525 keV = ', wavelength_ang, ' Angstroms'
Notes¶
Precision Considerations
All calculations use double precision (dp) for maximum accuracy
Uses
tiny(x)to avoid division by zero for very small wavelengthsCODATA 2018 constants ensure scientific accuracy
Performance
Simple arithmetic operations - very fast
No memory allocation - suitable for tight loops
Minimal branching - good for modern CPUs
Error Handling
No explicit error checking for invalid unit codes
Invalid units may produce incorrect results
Consider adding validation for production code
Best Practices
Always use
_dpsuffix for literal valuesCheck that output values are reasonable
For critical applications, validate unit codes
Use intermediate variables for complex conversions
See Also¶
Mathematical Constants (cspex) - Mathematical constants used in calculations
File Operations (files) - File operations for saving/loading energy data
../core/messages - Error handling for invalid conversions