File indexing completed on 2024-05-12 03:47:44

0001 #include "constants.h"
0002 
0003 #include <gsl/gsl_const_mksa.h>
0004 #include <gsl/gsl_const_num.h>
0005 #include <gsl/gsl_math.h>
0006 
0007 #include <KLocalizedString>
0008 
0009 QString constantGroupsToString(ConstantGroups group) {
0010     switch (group) {
0011     case ConstantGroups::MathematicalConstants:
0012         return i18n("Mathematical constants");
0013     case ConstantGroups::FundamentalConstants:
0014         return i18n("Fundamental constants");
0015     case ConstantGroups::AstronomyAndAstrophysics:
0016         return i18n("Astronomy and Astrophysics");
0017     case ConstantGroups::AtomicAndNuclearPhysics:
0018         return i18n("Atomic and Nuclear Physics");
0019     case ConstantGroups::MeasurementOfTime:
0020         return i18n("Measurement of Time");
0021     case ConstantGroups::ImperialUnits:
0022         return i18n("Imperial Units");
0023     case ConstantGroups::SpeedAndNauticalUnits:
0024         return i18n("Speed and Nautical Units");
0025     case ConstantGroups::PrintersUnits:
0026         return i18n("Printers Units");
0027     case ConstantGroups::VolumeAreaAndLength:
0028         return i18n("Volume, Area and Length");
0029     case ConstantGroups::MassAndWeight:
0030         return i18n("Mass and Weight");
0031     case ConstantGroups::ThermalEnergyAndPower:
0032         return i18n("Thermal Energy and Power");
0033     case ConstantGroups::Pressure:
0034         return i18n("Pressure");
0035     case ConstantGroups::Viscosity:
0036         return i18n("Viscosity");
0037     case ConstantGroups::LightAndIllumination:
0038         return i18n("Light and Illumination");
0039     case ConstantGroups::Radioactivity:
0040         return i18n("Radioactivity");
0041     case ConstantGroups::ForceAndEnergy:
0042         return i18n("Force and Energy");
0043     case ConstantGroups::END:
0044         break;
0045     }
0046     return i18n("Unknown Constant");
0047 }
0048 
0049 // clang-format off
0050 
0051 /* sync with ExpressionParser.cpp */
0052 struct cons _constants[] = {
0053     /* Physical constants: https://www.gnu.org/software/gsl/doc/html/const.html */
0054     /* Physical constants in MKSA system */
0055 
0056     // MathematicalConstants = addConstantsGroup(i18n("Mathematical constants"));
0057     {[]() { return i18n("Base of exponentials");}, "e", M_E, "", ConstantGroups::MathematicalConstants},
0058     {[]() { return i18n("Pi");}, "pi", M_PI, "", ConstantGroups::MathematicalConstants},
0059     {[]() { return i18n("Euler's constant");}, "euler", M_EULER, "", ConstantGroups::MathematicalConstants},
0060     {[]() { return i18n("Not a number");}, "nan", std::nan("0"), "", ConstantGroups::MathematicalConstants},
0061 
0062     // FundamentalConstants = addConstantsGroup(i18n("Fundamental constants"));
0063     {[]() { return i18n("Speed of light");}, "cL", GSL_CONST_MKSA_SPEED_OF_LIGHT, "m / s", ConstantGroups::FundamentalConstants},
0064     {[]() { return i18n("Vacuum permeability");}, "mu0", GSL_CONST_MKSA_VACUUM_PERMEABILITY, "kg m / A^2 s^2", ConstantGroups::FundamentalConstants},
0065     {[]() { return i18n("Vacuum permittivity");}, "e0", GSL_CONST_MKSA_VACUUM_PERMITTIVITY, "A^2 s^4 / kg m^3", ConstantGroups::FundamentalConstants},
0066     {[]() { return i18n("Planck constant");}, "hPlanck", GSL_CONST_MKSA_PLANCKS_CONSTANT_H, "kg m^2 / s", ConstantGroups::FundamentalConstants},
0067     {[]() { return i18n("Reduced Planck constant");}, "hbar", GSL_CONST_MKSA_PLANCKS_CONSTANT_HBAR, "kg m^2 / s", ConstantGroups::FundamentalConstants},
0068     {[]() { return i18n("Avogadro constant");}, "NA", GSL_CONST_NUM_AVOGADRO, "1 / mol", ConstantGroups::FundamentalConstants},
0069     {[]() { return i18n("Faraday");}, "Faraday", GSL_CONST_MKSA_FARADAY, "A s / mol", ConstantGroups::FundamentalConstants},
0070     {[]() { return i18n("Boltzmann constant");}, "kB", GSL_CONST_MKSA_BOLTZMANN, "kg m^2 / K s^2", ConstantGroups::FundamentalConstants},
0071     {[]() { return i18n("Molar gas");}, "r0", GSL_CONST_MKSA_MOLAR_GAS, "kg m^2 / K mol s^2", ConstantGroups::FundamentalConstants},
0072     {[]() { return i18n("Standard gas volume");}, "v0", GSL_CONST_MKSA_STANDARD_GAS_VOLUME, "m^3 / mol", ConstantGroups::FundamentalConstants},
0073     {[]() { return i18n("Stefan-Boltzmann constant");}, "sigma", GSL_CONST_MKSA_STEFAN_BOLTZMANN_CONSTANT, "kg / K^4 s^3", ConstantGroups::FundamentalConstants},
0074     {[]() { return i18n("Gauss");}, "Gauss", GSL_CONST_MKSA_GAUSS, "kg / A s^2", ConstantGroups::FundamentalConstants},
0075 
0076     // AstronomyAndAstrophysics = addConstantsGroup(i18n("Astronomy and Astrophysics"));
0077     {[]() { return i18n("Astronomical unit");}, "au", GSL_CONST_MKSA_ASTRONOMICAL_UNIT, "m", ConstantGroups::AstronomyAndAstrophysics},
0078     {[]() { return i18n("Gravitational constant");}, "G", GSL_CONST_MKSA_GRAVITATIONAL_CONSTANT, "m^3 / kg s^2", ConstantGroups::AstronomyAndAstrophysics},
0079     {[]() { return i18n("Light year");}, "ly", GSL_CONST_MKSA_LIGHT_YEAR, "m", ConstantGroups::AstronomyAndAstrophysics},
0080     {[]() { return i18n("Parsec");}, "pc", GSL_CONST_MKSA_PARSEC, "m", ConstantGroups::AstronomyAndAstrophysics},
0081     {[]() { return i18n("Gravitational acceleration");}, "gg", GSL_CONST_MKSA_GRAV_ACCEL, "m / s^2", ConstantGroups::AstronomyAndAstrophysics},
0082     {[]() { return i18n("Solar mass");}, "ms", GSL_CONST_MKSA_SOLAR_MASS, "kg", ConstantGroups::AstronomyAndAstrophysics},
0083 
0084     // AtomicAndNuclearPhysics = addConstantsGroup(i18n("Atomic and Nuclear Physics"));
0085     {[]() { return i18n("Charge of the electron");}, "ee", GSL_CONST_MKSA_ELECTRON_CHARGE, "A s", ConstantGroups::AtomicAndNuclearPhysics},
0086     {[]() { return i18n("Energy of 1 electron volt");}, "ev", GSL_CONST_MKSA_ELECTRON_VOLT, "kg m^2 / s^2", ConstantGroups::AtomicAndNuclearPhysics},
0087     {[]() { return i18n("Unified atomic mass");}, "amu", GSL_CONST_MKSA_UNIFIED_ATOMIC_MASS, "kg", ConstantGroups::AtomicAndNuclearPhysics},
0088     {[]() { return i18n("Mass of the electron");}, "me", GSL_CONST_MKSA_MASS_ELECTRON, "kg", ConstantGroups::AtomicAndNuclearPhysics},
0089     {[]() { return i18n("Mass of the muon");}, "mmu", GSL_CONST_MKSA_MASS_MUON, "kg", ConstantGroups::AtomicAndNuclearPhysics},
0090     {[]() { return i18n("Mass of the proton");}, "mp", GSL_CONST_MKSA_MASS_PROTON, "kg", ConstantGroups::AtomicAndNuclearPhysics},
0091     {[]() { return i18n("Mass of the neutron");}, "mn", GSL_CONST_MKSA_MASS_NEUTRON, "kg", ConstantGroups::AtomicAndNuclearPhysics},
0092     {[]() { return i18n("Electromagnetic fine structure constant");}, "alpha", GSL_CONST_NUM_FINE_STRUCTURE, "", ConstantGroups::AtomicAndNuclearPhysics},
0093     {[]() { return i18n("Rydberg constant");}, "Ry", GSL_CONST_MKSA_RYDBERG, "kg m^2 / s^2", ConstantGroups::AtomicAndNuclearPhysics},
0094     {[]() { return i18n("Bohr radius");}, "aB", GSL_CONST_MKSA_BOHR_RADIUS, "m", ConstantGroups::AtomicAndNuclearPhysics},
0095     {[]() { return i18n("Length of 1 angstrom");}, "ao", GSL_CONST_MKSA_ANGSTROM, "m", ConstantGroups::AtomicAndNuclearPhysics},
0096     {[]() { return i18n("Area of 1 barn");}, "barn", GSL_CONST_MKSA_BARN, "m^2", ConstantGroups::AtomicAndNuclearPhysics},
0097     {[]() { return i18n("Bohr Magneton");}, "muB", GSL_CONST_MKSA_BOHR_MAGNETON, "A m^2", ConstantGroups::AtomicAndNuclearPhysics},
0098     {[]() { return i18n("Nuclear Magneton");}, "mun", GSL_CONST_MKSA_NUCLEAR_MAGNETON, "A m^2", ConstantGroups::AtomicAndNuclearPhysics},
0099     {[]() { return i18n("Magnetic moment of the electron [absolute value]");}, "mue", GSL_CONST_MKSA_ELECTRON_MAGNETIC_MOMENT, "A m^2", ConstantGroups::AtomicAndNuclearPhysics},
0100     {[]() { return i18n("Magnetic moment of the proton");}, "mup", GSL_CONST_MKSA_PROTON_MAGNETIC_MOMENT, "A m^2", ConstantGroups::AtomicAndNuclearPhysics},
0101     {[]() { return i18n("Thomson cross section");}, "sigmaT", GSL_CONST_MKSA_THOMSON_CROSS_SECTION, "m^2", ConstantGroups::AtomicAndNuclearPhysics},
0102     {[]() { return i18n("Electric dipole moment of 1 Debye");}, "pD", GSL_CONST_MKSA_DEBYE, "A s^2 / m^2", ConstantGroups::AtomicAndNuclearPhysics},
0103 
0104     // MeasurementOfTime = addConstantsGroup(i18n("Measurement of Time"));
0105     {[]() { return i18n("Number of seconds in 1 minute");}, "minute", GSL_CONST_MKSA_MINUTE, "s", ConstantGroups::MeasurementOfTime},
0106     {[]() { return i18n("Number of seconds in 1 hour");}, "hour", GSL_CONST_MKSA_HOUR, "s", ConstantGroups::MeasurementOfTime},
0107     {[]() { return i18n("Number of seconds in 1 day");}, "day", GSL_CONST_MKSA_DAY, "s", ConstantGroups::MeasurementOfTime},
0108     {[]() { return i18n("Number of seconds in 1 week");}, "week", GSL_CONST_MKSA_WEEK, "s", ConstantGroups::MeasurementOfTime},
0109 
0110     // ImperialUnits = addConstantsGroup(i18n("Imperial Units"));
0111     {[]() { return i18n("Length of 1 inch");}, "in", GSL_CONST_MKSA_INCH, "m", ConstantGroups::ImperialUnits},
0112     {[]() { return i18n("Length of 1 foot");}, "ft", GSL_CONST_MKSA_FOOT, "m", ConstantGroups::ImperialUnits},
0113     {[]() { return i18n("Length of 1 yard");}, "yard", GSL_CONST_MKSA_YARD, "m", ConstantGroups::ImperialUnits},
0114     {[]() { return i18n("Length of 1 mile");}, "mile", GSL_CONST_MKSA_MILE, "m", ConstantGroups::ImperialUnits},
0115     {[]() { return i18n("Length of 1/1000th of an inch");}, "mil", GSL_CONST_MKSA_MIL, "m", ConstantGroups::ImperialUnits},
0116 
0117     // SpeedAndNauticalUnits = addConstantsGroup(i18n("Speed and Nautical Units"));
0118     {[]() { return i18n("Speed of 1 kilometer per hour");}, "v_km_per_h", GSL_CONST_MKSA_KILOMETERS_PER_HOUR, "m / s", ConstantGroups::SpeedAndNauticalUnits},
0119     {[]() { return i18n("Speed of 1 mile per hour");}, "v_mile_per_h", GSL_CONST_MKSA_MILES_PER_HOUR, "m / s", ConstantGroups::SpeedAndNauticalUnits},
0120     {[]() { return i18n("Length of 1 nautical mile");}, "nmile", GSL_CONST_MKSA_NAUTICAL_MILE, "m", ConstantGroups::SpeedAndNauticalUnits},
0121     {[]() { return i18n("Length of 1 fathom");}, "fathom", GSL_CONST_MKSA_FATHOM, "m", ConstantGroups::SpeedAndNauticalUnits},
0122     {[]() { return i18n("Speed of 1 knot");}, "knot", GSL_CONST_MKSA_KNOT, "m / s", ConstantGroups::SpeedAndNauticalUnits},
0123 
0124     // PrintersUnits = addConstantsGroup(i18n("Printers Units"));
0125     {[]() { return i18n("length of 1 printer's point [1/72 inch]");}, "pt", GSL_CONST_MKSA_POINT, "m", ConstantGroups::PrintersUnits},
0126     {[]() { return i18n("length of 1 TeX point [1/72.27 inch]");}, "texpt", GSL_CONST_MKSA_TEXPOINT, "m", ConstantGroups::PrintersUnits},
0127 
0128     // VolumeAreaAndLength = addConstantsGroup(i18n("Volume, Area and Length"));
0129     {[]() { return i18n("Length of 1 micron");}, "micron", GSL_CONST_MKSA_MICRON, "m", ConstantGroups::VolumeAreaAndLength},
0130     {[]() { return i18n("Area of 1 hectare");}, "hectare", GSL_CONST_MKSA_HECTARE, "m^2", ConstantGroups::VolumeAreaAndLength},
0131     {[]() { return i18n("Area of 1 acre");}, "acre", GSL_CONST_MKSA_ACRE, "m^2", ConstantGroups::VolumeAreaAndLength},
0132     {[]() { return i18n("Volume of 1 liter");}, "liter", GSL_CONST_MKSA_LITER, "m^3", ConstantGroups::VolumeAreaAndLength},
0133     {[]() { return i18n("Volume of 1 US gallon");}, "us_gallon", GSL_CONST_MKSA_US_GALLON, "m^3", ConstantGroups::VolumeAreaAndLength},
0134     {[]() { return i18n("Volume of 1 Canadian gallon");}, "can_gallon", GSL_CONST_MKSA_CANADIAN_GALLON, "m^3", ConstantGroups::VolumeAreaAndLength},
0135     {[]() { return i18n("Volume of 1 UK gallon");}, "uk_gallon", GSL_CONST_MKSA_UK_GALLON, "m^3", ConstantGroups::VolumeAreaAndLength},
0136     {[]() { return i18n("Volume of 1 quart");}, "quart", GSL_CONST_MKSA_QUART, "m^3", ConstantGroups::VolumeAreaAndLength},
0137     {[]() { return i18n("Volume of 1 pint");}, "pint", GSL_CONST_MKSA_PINT, "m^3", ConstantGroups::VolumeAreaAndLength},
0138 
0139     // MassAndWeight = addConstantsGroup(i18n("Mass and Weight"));
0140     {[]() { return i18n("Mass of 1 pound");}, "pound", GSL_CONST_MKSA_POUND_MASS, "kg", ConstantGroups::MassAndWeight},
0141     {[]() { return i18n("Mass of 1 ounce");}, "ounce", GSL_CONST_MKSA_OUNCE_MASS, "kg", ConstantGroups::MassAndWeight},
0142     {[]() { return i18n("Mass of 1 ton");}, "ton", GSL_CONST_MKSA_TON, "kg", ConstantGroups::MassAndWeight},
0143     {[]() { return i18n("Mass of 1 metric ton [1000 kg]");}, "mton", GSL_CONST_MKSA_METRIC_TON, "kg", ConstantGroups::MassAndWeight},
0144     {[]() { return i18n("Mass of 1 UK ton");}, "uk_ton", GSL_CONST_MKSA_UK_TON, "kg", ConstantGroups::MassAndWeight},
0145     {[]() { return i18n("Mass of 1 troy ounce");}, "troy_ounce", GSL_CONST_MKSA_TROY_OUNCE, "kg", ConstantGroups::MassAndWeight},
0146     {[]() { return i18n("Mass of 1 carat");}, "carat", GSL_CONST_MKSA_CARAT, "kg", ConstantGroups::MassAndWeight},
0147     {[]() { return i18n("Force of 1 gram weight");}, "gram_force", GSL_CONST_MKSA_GRAM_FORCE, "kg m / s^2", ConstantGroups::MassAndWeight},
0148     {[]() { return i18n("Force of 1 pound weight");}, "pound_force", GSL_CONST_MKSA_POUND_FORCE, "kg m / s^2", ConstantGroups::MassAndWeight},
0149     {[]() { return i18n("Force of 1 kilopound weight");}, "kilepound_force", GSL_CONST_MKSA_KILOPOUND_FORCE, "kg m / s^2", ConstantGroups::MassAndWeight},
0150     {[]() { return i18n("Force of 1 poundal");}, "poundal", GSL_CONST_MKSA_POUNDAL, "kg m / s^2", ConstantGroups::MassAndWeight},
0151 
0152     // ThermalEnergyAndPower = addConstantsGroup(i18n("Thermal Energy and Power"));
0153     {[]() { return i18n("Energy of 1 calorie");}, "cal", GSL_CONST_MKSA_CALORIE, "kg m^2 / s^2", ConstantGroups::ThermalEnergyAndPower},
0154     {[]() { return i18n("Energy of 1 British Thermal Unit");}, "btu", GSL_CONST_MKSA_BTU, "kg m^2 / s^2", ConstantGroups::ThermalEnergyAndPower},
0155     {[]() { return i18n("Energy of 1 Therm");}, "therm", GSL_CONST_MKSA_THERM, "kg m^2 / s^2", ConstantGroups::ThermalEnergyAndPower},
0156     {[]() { return i18n("Power of 1 horsepower");}, "hp", GSL_CONST_MKSA_HORSEPOWER, "kg m^2 / s^3", ConstantGroups::ThermalEnergyAndPower},
0157 
0158     // Pressure = addConstantsGroup(i18n("Pressure"));
0159     {[]() { return i18n("Pressure of 1 bar");}, "bar", GSL_CONST_MKSA_BAR, "kg / m s^2", ConstantGroups::Pressure},
0160     {[]() { return i18n("Pressure of 1 standard atmosphere");}, "atm", GSL_CONST_MKSA_STD_ATMOSPHERE, "kg / m s^2", ConstantGroups::Pressure},
0161     {[]() { return i18n("Pressure of 1 torr");}, "torr", GSL_CONST_MKSA_TORR, "kg / m s^2", ConstantGroups::Pressure},
0162     {[]() { return i18n("Pressure of 1 meter of mercury");}, "mhg", GSL_CONST_MKSA_METER_OF_MERCURY, "kg / m s^2", ConstantGroups::Pressure},
0163     {[]() { return i18n("Pressure of 1 inch of mercury");}, "inhg", GSL_CONST_MKSA_INCH_OF_MERCURY, "kg / m s^2", ConstantGroups::Pressure},
0164     {[]() { return i18n("Pressure of 1 inch of water");}, "inh2o", GSL_CONST_MKSA_INCH_OF_WATER, "kg / m s^2", ConstantGroups::Pressure},
0165     {[]() { return i18n("Pressure of 1 pound per square inch");}, "psi", GSL_CONST_MKSA_PSI, "kg / m s^2", ConstantGroups::Pressure},
0166 
0167     // Viscosity = addConstantsGroup(i18n("Viscosity"));
0168     {[]() { return i18n("Dynamic viscosity of 1 poise");}, "poise", GSL_CONST_MKSA_POISE, "kg / m s", ConstantGroups::Viscosity},
0169     {[]() { return i18n("Kinematic viscosity of 1 stokes");}, "stokes", GSL_CONST_MKSA_STOKES, "m^2 / s", ConstantGroups::Viscosity},
0170 
0171     // LightAndIllumination = addConstantsGroup(i18n("Light and Illumination"));
0172     {[]() { return i18n("Luminance of 1 stilb");}, "stilb", GSL_CONST_MKSA_STILB, "cd / m^2", ConstantGroups::LightAndIllumination},
0173     {[]() { return i18n("Luminous flux of 1 lumen");}, "lumen", GSL_CONST_MKSA_LUMEN, "cd sr", ConstantGroups::LightAndIllumination},
0174     {[]() { return i18n("Illuminance of 1 lux");}, "lux", GSL_CONST_MKSA_LUX, "cd sr / m^2", ConstantGroups::LightAndIllumination},
0175     {[]() { return i18n("Illuminance of 1 phot");}, "phot", GSL_CONST_MKSA_PHOT, "cd sr / m^2", ConstantGroups::LightAndIllumination},
0176     {[]() { return i18n("Illuminance of 1 footcandle");}, "ftcandle", GSL_CONST_MKSA_FOOTCANDLE, "cd sr / m^2", ConstantGroups::LightAndIllumination},
0177     {[]() { return i18n("Luminance of 1 lambert");}, "lambert", GSL_CONST_MKSA_LAMBERT, "cd sr / m^2", ConstantGroups::LightAndIllumination},
0178     {[]() { return i18n("Luminance of 1 footlambert");}, "ftlambert", GSL_CONST_MKSA_FOOTLAMBERT, "cd sr / m^2", ConstantGroups::LightAndIllumination},
0179 
0180     // Radioactivity = addConstantsGroup(i18n("Radioactivity"));
0181     {[]() { return i18n("Activity of 1 curie");}, "Curie", GSL_CONST_MKSA_CURIE, "1 / s", ConstantGroups::Radioactivity},
0182     {[]() { return i18n("Exposure of 1 roentgen");}, "Roentgen", GSL_CONST_MKSA_ROENTGEN, "A s / kg", ConstantGroups::Radioactivity},
0183     {[]() { return i18n("Absorbed dose of 1 rad");}, "rad", GSL_CONST_MKSA_RAD, "m^2 / s^2", ConstantGroups::Radioactivity},
0184 
0185     // ForceAndEnergy = addConstantsGroup(i18n("Force and Energy"));
0186     {[]() { return i18n("SI unit of force");}, "Newton", GSL_CONST_MKSA_NEWTON, "kg m / s^2", ConstantGroups::ForceAndEnergy},
0187     {[]() { return i18n("Force of 1 Dyne");}, "dyne", GSL_CONST_MKSA_DYNE, "kg m / s^2", ConstantGroups::ForceAndEnergy},
0188     {[]() { return i18n("SI unit of energy");}, "Joule", GSL_CONST_MKSA_JOULE, "kg m^2 / s^2", ConstantGroups::ForceAndEnergy},
0189     {[]() { return i18n("Energy 1 erg");}, "erg", GSL_CONST_MKSA_ERG, "kg m^2 / s^2", ConstantGroups::ForceAndEnergy},
0190 };
0191 
0192 // clang-format on
0193 
0194 const int _number_constants = sizeof(_constants) / sizeof(cons);