diff --git a/src/systems/include/mp-units/systems/isq/electromagnetism.h b/src/systems/include/mp-units/systems/isq/electromagnetism.h index 3f030b73..25c4cf74 100644 --- a/src/systems/include/mp-units/systems/isq/electromagnetism.h +++ b/src/systems/include/mp-units/systems/isq/electromagnetism.h @@ -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 diff --git a/test/static/isq_test.cpp b/test/static/isq_test.cpp index 7d7fef84..383d4a04 100644 --- a/test/static/isq_test.cpp +++ b/test/static/isq_test.cpp @@ -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));