feat: electromagnetism.h updated to IEC80000-6-2022

This commit is contained in:
Mateusz Pusz
2025-02-11 16:53:40 +01:00
parent fa482c9246
commit 9fb08e3c95
2 changed files with 117 additions and 97 deletions

View File

@ -38,32 +38,32 @@ MP_UNITS_EXPORT
namespace mp_units::isq {
QUANTITY_SPEC(electric_charge, electric_current* time);
QUANTITY_SPEC(elementary_charge, electric_charge);
QUANTITY_SPEC(electric_charge_density, electric_charge / volume);
inline constexpr auto volume_electric_charge = electric_charge_density;
inline constexpr auto volumic_charge = electric_charge_density;
QUANTITY_SPEC(surface_density_of_electric_charge, electric_charge / area);
inline constexpr auto areic_electric_charge = surface_density_of_electric_charge;
inline constexpr auto areic_charge = surface_density_of_electric_charge;
QUANTITY_SPEC(linear_density_of_electric_charge, electric_charge / length);
inline constexpr auto lineic_electric_charge = linear_density_of_electric_charge;
QUANTITY_SPEC(electric_dipole_moment, electric_charge* displacement); // vector
QUANTITY_SPEC(electric_polarization, electric_dipole_moment / volume); // vector
QUANTITY_SPEC(electric_current_density, electric_charge_density* velocity); // vector
inline constexpr auto areic_electric_current = electric_current_density;
inline constexpr auto lineic_charge = linear_density_of_electric_charge;
QUANTITY_SPEC(electric_dipole_moment, electric_charge* displacement); // vector
QUANTITY_SPEC(electric_polarization, electric_dipole_moment / volume); // vector
QUANTITY_SPEC(electric_current_density, electric_charge_density* velocity); // vector
QUANTITY_SPEC(linear_electric_current_density, surface_density_of_electric_charge* velocity); // vector
inline constexpr auto lineic_electric_current = linear_electric_current_density;
QUANTITY_SPEC(electric_field_strength, force / electric_charge); // vector
QUANTITY_SPEC(electric_field_strength, force / electric_charge); // vector
QUANTITY_SPEC(electric_potential, electric_field_strength* length,
quantity_character::scalar); // TODO what is a correct equation here?
QUANTITY_SPEC(electric_potential_difference, electric_potential, quantity_character::scalar);
QUANTITY_SPEC(voltage, electric_potential);
inline constexpr auto electric_tension = voltage;
QUANTITY_SPEC(induced_voltage, voltage); // TODO what is a correct equation here?
QUANTITY_SPEC(electric_flux_density, electric_polarization); // vector
inline constexpr auto electric_displacement = electric_flux_density;
QUANTITY_SPEC(capacitance, electric_charge / voltage);
// TODO how to calculate an argument of a vector product?
QUANTITY_SPEC(magnetic_flux_density, force / (electric_charge * velocity), quantity_character::vector);
QUANTITY_SPEC(magnetic_vector_potential,
magnetic_flux_density* length); // vector // TODO what is a correct equation here?
QUANTITY_SPEC(linked_flux, magnetic_vector_potential* displacement, quantity_character::scalar);
QUANTITY_SPEC(magnetic_flux_density, force / (electric_charge * velocity),
quantity_character::vector); // TODO how to calculate an argument of a vector product?
QUANTITY_SPEC(magnetic_constant,
electric_potential* time / (electric_current * length)); // TODO what is a correct equation here?
inline constexpr auto permeability_of_vacuum = magnetic_constant;
@ -83,6 +83,11 @@ QUANTITY_SPEC(displacement_current, electric_current, displacement_current_densi
QUANTITY_SPEC(total_current, electric_current);
QUANTITY_SPEC(total_current_density, electric_current_density); // vector
QUANTITY_SPEC(magnetic_flux, magnetic_flux_density* area, quantity_character::scalar);
QUANTITY_SPEC(magnetic_vector_potential,
magnetic_flux_density* length); // vector // TODO what is a correct equation here?
QUANTITY_SPEC(protoflux, magnetic_vector_potential* displacement, quantity_character::scalar);
QUANTITY_SPEC(linked_magnetic_flux, magnetic_flux);
QUANTITY_SPEC(total_magnetic_flux, magnetic_flux);
QUANTITY_SPEC(magnetic_moment, electric_current* area, quantity_character::vector);
inline constexpr auto magnetic_area_moment = magnetic_moment;
QUANTITY_SPEC(magnetization, magnetic_moment / volume); // vector
@ -95,50 +100,56 @@ QUANTITY_SPEC(magnetic_susceptibility, dimensionless, magnetization / magnetic_f
QUANTITY_SPEC(magnetic_polarization, magnetic_constant* magnetization); // vector
QUANTITY_SPEC(magnetic_dipole_moment, magnetic_constant* magnetic_moment); // vector
QUANTITY_SPEC(coercivity, magnetic_field_strength, quantity_character::scalar);
inline constexpr auto coercive_field_strength = coercivity;
QUANTITY_SPEC(electromagnetic_energy_density, electric_field_strength* electric_flux_density,
quantity_character::scalar);
inline constexpr auto volumic_electromagnetic_energy = electromagnetic_energy_density;
QUANTITY_SPEC(Poynting_vector, electric_field_strength* magnetic_field_strength); // vector
QUANTITY_SPEC(source_voltage, voltage);
inline constexpr auto source_tension = source_voltage;
QUANTITY_SPEC(scalar_magnetic_potential, electric_current, magnetic_field_strength* length,
quantity_character::scalar); // TODO what is a correct equation here?
QUANTITY_SPEC(magnetic_potential, electric_current); // TODO what is a correct equation here?
QUANTITY_SPEC(magnetic_tension, electric_current, magnetic_field_strength* position_vector, quantity_character::scalar);
QUANTITY_SPEC(magnetomotive_force, electric_current, magnetic_field_strength* position_vector,
quantity_character::scalar);
QUANTITY_SPEC(current_linkage, electric_current);
QUANTITY_SPEC(number_of_turns_in_a_winding, dimensionless);
QUANTITY_SPEC(reluctance, magnetic_tension / magnetic_flux);
QUANTITY_SPEC(permeance, inverse(reluctance));
QUANTITY_SPEC(inductance, linked_flux / electric_current);
QUANTITY_SPEC(inductance, protoflux / electric_current);
inline constexpr auto self_inductance = inductance;
QUANTITY_SPEC(mutual_inductance, linked_flux / electric_current);
QUANTITY_SPEC(mutual_inductance, protoflux / electric_current);
QUANTITY_SPEC(coupling_factor, dimensionless, mutual_inductance / pow<1, 2>(pow<2>(self_inductance)));
QUANTITY_SPEC(leakage_factor, dimensionless, pow<2>(coupling_factor));
QUANTITY_SPEC(conductivity, electric_current_density / electric_field_strength, quantity_character::scalar);
QUANTITY_SPEC(resistivity, inverse(conductivity));
QUANTITY_SPEC(electromagnetism_power, power, voltage* electric_current);
QUANTITY_SPEC(electromagnetism_power, power, voltage* electric_current); // different name than in ISQ
inline constexpr auto instantaneous_power = electromagnetism_power;
QUANTITY_SPEC(resistance, voltage / electric_current);
QUANTITY_SPEC(conductance, inverse(resistance));
QUANTITY_SPEC(phase_difference, phase_angle);
QUANTITY_SPEC(electric_current_phasor, electric_current, quantity_character::complex);
QUANTITY_SPEC(voltage_phasor, voltage, quantity_character::complex);
QUANTITY_SPEC(impedance, voltage_phasor / electric_current_phasor);
inline constexpr auto complex_impedance = impedance;
QUANTITY_SPEC(resistance_to_alternating_current, impedance);
QUANTITY_SPEC(reactance, impedance);
QUANTITY_SPEC(modulus_of_impedance, impedance);
QUANTITY_SPEC(admittance, inverse(impedance));
inline constexpr auto complex_admittance = admittance;
QUANTITY_SPEC(conductance_for_alternating_current, admittance);
inline constexpr auto electric_tension_phasor = voltage_phasor;
QUANTITY_SPEC(impedance, voltage_phasor / electric_current_phasor); // complex
inline constexpr auto complex_impedance = impedance; // complex
QUANTITY_SPEC(impedance_of_vacuum, impedance); // complex
inline constexpr auto wave_impedance_in_vacuum = impedance_of_vacuum; // complex
QUANTITY_SPEC(
resistance_to_alternating_current, impedance,
quantity_character::scalar); // called resistance in the latest ISQ (we use the old name to avoid ambiguity)
QUANTITY_SPEC(reactance, impedance, quantity_character::scalar);
QUANTITY_SPEC(apparent_impedance, impedance, quantity_character::scalar);
QUANTITY_SPEC(admittance, inverse(impedance)); // complex
inline constexpr auto complex_admittance = admittance; // complex
QUANTITY_SPEC(admittance_of_vacuum, admittance, inverse(impedance_of_vacuum)); // complex
QUANTITY_SPEC(
conductance_for_alternating_current, conductance,
quantity_character::scalar); // called resistance in the latest ISQ (we use the old name to avoid ambiguity)
QUANTITY_SPEC(susceptance, admittance);
QUANTITY_SPEC(modulus_of_admittance, admittance);
QUANTITY_SPEC(apparent_admittance, admittance, quantity_character::scalar);
QUANTITY_SPEC(quality_factor, dimensionless, reactance / resistance);
QUANTITY_SPEC(loss_factor, dimensionless, inverse(quality_factor));
QUANTITY_SPEC(loss_angle, angular_measure);
QUANTITY_SPEC(active_power, isq::power, inverse(period) * (instantaneous_power * time));
QUANTITY_SPEC(complex_power, voltage_phasor* electric_current_phasor); // separate kind
QUANTITY_SPEC(complex_power, voltage_phasor* electric_current_phasor); // complex // separate kind
QUANTITY_SPEC(apparent_power, complex_power, quantity_character::scalar);
QUANTITY_SPEC(power_factor, dimensionless, active_power / apparent_power);
QUANTITY_SPEC(reactive_power, isq::mass* pow<2>(isq::length) / pow<3>(isq::time)); // separate kind

View File

@ -228,103 +228,112 @@ static_assert(verify(isq::dew_point_temperature, scalar, K));
// electromagnetism
static_assert(verify(isq::electric_current, scalar, A));
static_assert(verify(isq::electric_charge, scalar, C));
static_assert(verify(isq::electric_charge_density, scalar, C / m3));
static_assert(verify(isq::volume_electric_charge, scalar, C / m3));
static_assert(verify(isq::surface_density_of_electric_charge, scalar, C / m2));
static_assert(verify(isq::areic_electric_charge, scalar, C / m2));
static_assert(verify(isq::linear_density_of_electric_charge, scalar, C / m));
static_assert(verify(isq::lineic_electric_charge, scalar, C / m));
static_assert(verify(isq::electric_dipole_moment, vector, C* m));
static_assert(verify(isq::electric_polarization, vector, C / m2));
static_assert(verify(isq::electric_charge, scalar, C, A* s));
static_assert(verify(isq::elementary_charge, scalar, C, A* s));
static_assert(verify(isq::electric_charge_density, scalar, C / m3, s* A / m3));
static_assert(verify(isq::volume_electric_charge, scalar, C / m3, s* A / m3));
static_assert(verify(isq::volumic_charge, scalar, C / m3, s* A / m3));
static_assert(verify(isq::surface_density_of_electric_charge, scalar, C / m2, s* A / m2));
static_assert(verify(isq::areic_electric_charge, scalar, C / m2, s* A / m2));
static_assert(verify(isq::areic_charge, scalar, C / m2, s* A / m2));
static_assert(verify(isq::linear_density_of_electric_charge, scalar, C / m, s* A / m));
static_assert(verify(isq::lineic_electric_charge, scalar, C / m, s* A / m));
static_assert(verify(isq::lineic_charge, scalar, C / m, s* A / m));
static_assert(verify(isq::electric_dipole_moment, vector, C* m, m* s* A));
static_assert(verify(isq::electric_polarization, vector, C / m2, s* A / m2));
static_assert(verify(isq::electric_current_density, vector, A / m2));
static_assert(verify(isq::areic_electric_current, vector, A / m2));
static_assert(verify(isq::linear_electric_current_density, vector, A / m));
static_assert(verify(isq::lineic_electric_current, vector, A / m));
static_assert(verify(isq::electric_field_strength, vector, V / m, N / C));
static_assert(verify(isq::electric_potential, scalar, V));
static_assert(verify(isq::electric_potential_difference, scalar, V));
static_assert(verify(isq::voltage, scalar, V));
static_assert(verify(isq::electric_tension, scalar, V));
static_assert(verify(isq::electric_flux_density, vector, C / m2));
static_assert(verify(isq::electric_displacement, vector, C / m2));
static_assert(verify(isq::capacitance, scalar, F));
static_assert(verify(isq::electric_constant, scalar, F / m, C / (V * m)));
static_assert(verify(isq::permittivity_of_vacuum, scalar, F / m, C / (V * m)));
static_assert(verify(isq::permittivity, scalar, F / m, C / (V * m)));
static_assert(verify(isq::electric_field_strength, vector, V / m, kg* m / (s3 * A)));
static_assert(verify(isq::electric_potential, scalar, V, kg* m2 / (s3 * A)));
static_assert(verify(isq::electric_potential_difference, scalar, V, kg* m2 / (s3 * A)));
static_assert(verify(isq::voltage, scalar, V, kg* m2 / (s3 * A)));
static_assert(verify(isq::electric_tension, scalar, V, kg* m2 / (s3 * A)));
static_assert(verify(isq::induced_voltage, scalar, V, kg* m2 / (s3 * A)));
static_assert(verify(isq::electric_flux_density, vector, C / m2, s* A / m2));
static_assert(verify(isq::electric_displacement, vector, C / m2, s* A / m2));
static_assert(verify(isq::capacitance, scalar, F, pow<4>(s) * square(A) / (kg * m2)));
static_assert(verify(isq::electric_constant, scalar, F / m, pow<4>(s) * square(A) / (kg * m3)));
static_assert(verify(isq::permittivity_of_vacuum, scalar, F / m, pow<4>(s) * square(A) / (kg * m3)));
static_assert(verify(isq::permittivity, scalar, F / m, pow<4>(s) * square(A) / (kg * m3)));
static_assert(verify(isq::relative_permittivity, scalar, one));
static_assert(verify(isq::electric_susceptibility, scalar, one));
static_assert(verify(isq::electric_flux, scalar, C));
static_assert(verify(isq::electric_flux, scalar, C, s* A));
static_assert(verify(isq::displacement_current_density, vector, A / m2));
static_assert(verify(isq::displacement_current, scalar, A));
static_assert(verify(isq::total_current, scalar, A));
static_assert(verify(isq::total_current_density, vector, A / m2));
static_assert(verify(isq::magnetic_flux_density, vector, T, N / (A * m), Wb / m2));
static_assert(verify(isq::magnetic_flux, scalar, Wb));
static_assert(verify(isq::linked_flux, scalar, Wb));
static_assert(verify(isq::magnetic_flux_density, vector, T, kg / (s2 * A)));
static_assert(verify(isq::magnetic_flux, scalar, Wb, kg* m2 / (s2 * A)));
static_assert(verify(isq::protoflux, scalar, Wb, kg* m2 / (s2 * A)));
static_assert(verify(isq::linked_magnetic_flux, scalar, Wb, kg* m2 / (s2 * A)));
static_assert(verify(isq::total_magnetic_flux, scalar, Wb, kg* m2 / (s2 * A)));
static_assert(verify(isq::magnetic_moment, vector, A* m2));
static_assert(verify(isq::magnetic_area_moment, vector, A* m2));
static_assert(verify(isq::magnetization, vector, A / m));
static_assert(verify(isq::magnetic_field_strength, vector, A / m));
static_assert(verify(isq::magnetizing_field, vector, A / m));
static_assert(verify(isq::magnetic_constant, scalar, H / m, V* s / (A * m)));
static_assert(verify(isq::permeability_of_vacuum, scalar, H / m, V* s / (A * m)));
static_assert(verify(isq::permeability, scalar, H / m, V* s / (A * m)));
static_assert(verify(isq::magnetic_constant, scalar, H / m, kg* m / (s2 * square(A))));
static_assert(verify(isq::permeability_of_vacuum, scalar, H / m, kg* m / (s2 * square(A))));
static_assert(verify(isq::permeability, scalar, H / m, kg* m / (s2 * square(A))));
static_assert(verify(isq::relative_permeability, scalar, one));
static_assert(verify(isq::magnetic_susceptibility, scalar, one));
static_assert(verify(isq::magnetic_polarization, vector, T));
static_assert(verify(isq::magnetic_dipole_moment, vector, Wb* m));
static_assert(verify(isq::magnetic_polarization, vector, T, Wb / m2, kg / (s2 * A)));
static_assert(verify(isq::magnetic_dipole_moment, vector, Wb* m, kg* m3 / (s2 * A)));
static_assert(verify(isq::coercivity, scalar, A / m));
static_assert(verify(isq::magnetic_vector_potential, vector, Wb / m));
static_assert(verify(isq::electromagnetic_energy_density, scalar, J / m3));
static_assert(verify(isq::volumic_electromagnetic_energy, scalar, J / m3));
static_assert(verify(isq::Poynting_vector, vector, W / m2));
static_assert(verify(isq::coercive_field_strength, scalar, A / m));
static_assert(verify(isq::magnetic_vector_potential, vector, J / (A * m), kg* m / (s2 * A)));
static_assert(verify(isq::electromagnetic_energy_density, scalar, J / m3, kg / (m * s2)));
static_assert(verify(isq::Poynting_vector, vector, W / m2, kg / s3));
static_assert(verify(isq::phase_speed_of_electromagnetic_waves, scalar, m / s));
static_assert(verify(isq::speed_of_light_in_vacuum, scalar, m / s));
static_assert(verify(isq::light_speed_in_vacuum, scalar, m / s));
static_assert(verify(isq::source_voltage, scalar, V));
static_assert(verify(isq::source_tension, scalar, V));
static_assert(verify(isq::scalar_magnetic_potential, scalar, A));
static_assert(verify(isq::luminal_speed, scalar, m / s));
static_assert(verify(isq::source_voltage, scalar, V, kg* m2 / (s3 * A)));
static_assert(verify(isq::source_tension, scalar, V, kg* m2 / (s3 * A)));
static_assert(verify(isq::magnetic_potential, scalar, A));
static_assert(verify(isq::magnetic_tension, scalar, A));
static_assert(verify(isq::magnetomotive_force, scalar, A));
static_assert(verify(isq::current_linkage, scalar, A));
static_assert(verify(isq::number_of_turns_in_a_winding, scalar, one));
static_assert(verify(isq::reluctance, scalar, one / H));
static_assert(verify(isq::permeance, scalar, H));
static_assert(verify(isq::inductance, scalar, H));
static_assert(verify(isq::self_inductance, scalar, H));
static_assert(verify(isq::mutual_inductance, scalar, H));
static_assert(verify(isq::reluctance, scalar, one / H, s2* square(A) / (kg * m2)));
static_assert(verify(isq::permeance, scalar, H, kg* m2 / (s2 * square(A))));
static_assert(verify(isq::inductance, scalar, H, kg* m2 / (s2 * square(A))));
static_assert(verify(isq::self_inductance, scalar, H, kg* m2 / (s2 * square(A))));
static_assert(verify(isq::mutual_inductance, scalar, H, kg* m2 / (s2 * square(A))));
static_assert(verify(isq::coupling_factor, scalar, one));
static_assert(verify(isq::leakage_factor, scalar, one));
static_assert(verify(isq::conductivity, scalar, S / m));
static_assert(verify(isq::resistivity, scalar, Ω* m));
static_assert(verify(isq::electromagnetism_power, scalar, W));
static_assert(verify(isq::instantaneous_power, scalar, W));
static_assert(verify(isq::resistance, scalar, Ω));
static_assert(verify(isq::conductance, scalar, S));
static_assert(verify(isq::phase_difference, scalar, rad));
static_assert(verify(isq::conductivity, scalar, S / m, s3* square(A) / (kg * m3)));
static_assert(verify(isq::resistivity, scalar, Ω* m, kg* m3 / (s3 * square(A))));
static_assert(verify(isq::electromagnetism_power, scalar, W, kg* m2 / s3));
static_assert(verify(isq::instantaneous_power, scalar, W, kg* m2 / s3));
static_assert(verify(isq::resistance, scalar, Ω, kg* m2 / (s3 * square(A))));
static_assert(verify(isq::conductance, scalar, S, s3* square(A) / (kg * m2)));
static_assert(verify(isq::phase_difference, scalar, rad, one));
static_assert(verify(isq::electric_current_phasor, complex, A));
static_assert(verify(isq::voltage_phasor, complex, V));
static_assert(verify(isq::impedance, scalar, Ω));
static_assert(verify(isq::complex_impedance, scalar, Ω));
static_assert(verify(isq::resistance_to_alternating_current, scalar, Ω));
static_assert(verify(isq::reactance, scalar, Ω));
static_assert(verify(isq::modulus_of_impedance, scalar, Ω));
static_assert(verify(isq::admittance, scalar, S));
static_assert(verify(isq::complex_admittance, scalar, S));
static_assert(verify(isq::conductance_for_alternating_current, scalar, S));
static_assert(verify(isq::susceptance, scalar, S));
static_assert(verify(isq::modulus_of_admittance, scalar, S));
static_assert(verify(isq::voltage_phasor, complex, V, kg* m2 / (s3 * A)));
static_assert(verify(isq::electric_tension_phasor, complex, V, kg* m2 / (s3 * A)));
static_assert(verify(isq::impedance, scalar, Ω, kg* m2 / (s3 * square(A))));
static_assert(verify(isq::complex_impedance, scalar, Ω, kg* m2 / (s3 * square(A))));
static_assert(verify(isq::impedance_of_vacuum, scalar, V / A, kg* m2 / (s3 * square(A))));
static_assert(verify(isq::wave_impedance_in_vacuum, scalar, V / A, kg* m2 / (s3 * square(A))));
static_assert(verify(isq::resistance_to_alternating_current, scalar, Ω, kg* m2 / (s3 * square(A))));
static_assert(verify(isq::reactance, scalar, Ω, kg* m2 / (s3 * square(A))));
static_assert(verify(isq::apparent_impedance, scalar, Ω, kg* m2 / (s3 * square(A))));
static_assert(verify(isq::admittance, scalar, S, s3* square(A) / (kg * m2)));
static_assert(verify(isq::complex_admittance, scalar, S, s3* square(A) / (kg * m2)));
static_assert(verify(isq::admittance_of_vacuum, scalar, A / V, s3* square(A) / (kg * m2)));
static_assert(verify(isq::conductance_for_alternating_current, scalar, S, s3* square(A) / (kg * m2)));
static_assert(verify(isq::susceptance, scalar, S, s3* square(A) / (kg * m2)));
static_assert(verify(isq::apparent_admittance, scalar, S, s3* square(A) / (kg * m2)));
static_assert(verify(isq::quality_factor, scalar, one));
static_assert(verify(isq::loss_factor, scalar, one));
static_assert(verify(isq::loss_angle, scalar, rad));
static_assert(verify(isq::active_power, scalar, W));
static_assert(verify(isq::apparent_power, scalar, V* A));
static_assert(verify(isq::loss_angle, scalar, rad, one));
static_assert(verify(isq::active_power, scalar, W, kg* m2 / s3));
static_assert(verify(isq::apparent_power, scalar, V* A, kg* m2 / s3));
static_assert(verify(isq::power_factor, scalar, one));
static_assert(verify(isq::complex_power, complex, V* A));
static_assert(verify(isq::reactive_power, scalar, V* A));
static_assert(verify(isq::non_active_power, scalar, V* A));
static_assert(verify(isq::active_energy, scalar, J, W* h));
static_assert(verify(isq::complex_power, complex, V* A, kg* m2 / s3));
static_assert(verify(isq::reactive_power, scalar, var, V* A, kg* m2 / s3));
static_assert(verify(isq::non_active_power, scalar, V* A, kg* m2 / s3));
static_assert(verify(isq::active_energy, scalar, J, W* s, kg* m2 / s2));
// light and radiation
static_assert(verify(isq::speed_of_light_in_a_medium, scalar, m / s));