Models

Contents

Models#

Module containing the different joint atmospheric models.

Base class#

Module containing the abstract base class for atmospheric models.

class xvamp.models.model.Model[source]#

Abstract base class for final models.

static rel_permittivity_to_refraction(relative_permittivity)[source]#

Compute the index of refraction from the complex relative permittivity.

Parameters:

relative_permittivity (Quantity | float | ndarray[floating]) – Complex relative permittivity [-]

Return type:

Quantity | float | ndarray[floating]

Returns:

Index of refraction [-]

static tpd_below_0km(venus_gas_constant, add_3K=False)[source]#

Use the barometric formula to extend the near-surface temperature, pressure, and density profiles from Seiff et al. [1985] to negative altitudes.

Parameters:
  • venus_gas_constant (Quantity) – Assumed Venus standard atmospheric gas constant (= R/M) [J/kg K]

  • add_3K (bool, default: False) – This refers to the 3 K addition done in the Duan et al. [2010] model when combining the Seiff et al. [1985] and Zasova et al. [2006] profiles.

Return type:

tuple[Quantity, Quantity, Quantity, Quantity]

Returns:

  • alt_neg – Altitudes of the profile

  • temp_neg – Temperature

  • press_neg – Pressure

  • dens_neg – Mass density

get_absorption(altitude)[source]#

Return the absorption at specific altitudes. At altitudes below the defined dataset, this function will return NaN, and 0 above.

Parameters:

altitude (Quantity | float | ndarray[floating]) – Height in [km], if not a Quantity.

Return type:

Quantity

Returns:

Absorption [dB/km]

get_delay_attenuation(height_terrain, height_platform, look_angle)[source]#

Calculate the range delay (defined as the difference between the apparent and geometric range) and two-way attenuation through the atmosphere. Convenience wrapper around get_range_attenuation_angles() and geometry_from_central_angle().

Parameters:
Return type:

tuple[Quantity, Quantity]

Returns:

  • delay – Range delay [m]

  • attenuation – Two-way signal attenuation [dB]

get_interpolated_attribute(attribute, unit, altitude, left, right)[source]#

Retrieve an attribute profile and interpolate it.

Parameters:
  • attribute (str) – Name of the attribute

  • unit (Unit) – Unit to be used for the interpolation

  • altitude (Quantity | float | ndarray[floating]) – Height in [km], if not a Quantity

  • left (float) – Value to use below the available data of the profile

  • right (float) – Value to use above the available data of the profile

Return type:

Quantity

Returns:

Interpolated attribute profile

get_range_attenuation_angles(look_angle, height_terrain, height_platform)[source]#

Calculate the apparent range, two-way attenuation through the atmosphere, the central angle, and the apparent incidence angle for a range of look angles, terrain heights, and platform heights.

Parameters:
Return type:

tuple[Quantity, Quantity, Quantity, Quantity]

Returns:

  • apparent_range – Apparent range from the platform to the surface [km]

  • attenuation – Two-way signal attenuation [dB] (note that the power absorption is twice this value)

  • central_angle – Central angle [rad]

  • apparent_incidence_angle – Apparent incidence angle [rad]

get_refraction(altitude)[source]#

Return the index of refraction at specific altitudes. At altitudes below the defined dataset, this function will return NaN, and 1 above.

Parameters:

altitude (Quantity | float | ndarray[floating]) – Height in [km], if not a Quantity

Return type:

Quantity

Returns:

Refractive index [-]

get_temperature(altitude)[source]#

Return the temperature at specific altitudes. At altitudes below the defined dataset, this function will return NaN, and 0 above.

Parameters:

altitude (Quantity | float | ndarray[floating]) – Height in [km], if not a Quantity.

Return type:

Quantity

Returns:

Temperature [K]

absorption: Annotated[Quantity, PhysicalType('wavenumber')]#

Absorption of the model

absorptions: QTable#

Table with species absorptions

altitude: Annotated[Quantity, PhysicalType('length')]#

Altitude levels of the model

cloud_concentration: Annotated[Quantity, PhysicalType('dimensionless')]#

H2SO4 concentration by weight of the cloud droplets

cloud_mass_density: Annotated[Quantity, PhysicalType('mass density')]#

Mass density of the clouds

cloud_mass_mixing_ratio: Annotated[Quantity, PhysicalType('dimensionless')]#

Mass mixing ratio of the clouds

electron_density: Annotated[Quantity, PhysicalType('number density')]#

Electron density of the model

eps_prime_r_atmo: Annotated[Quantity, PhysicalType('dimensionless')]#

Real part of the relative permittivity of the atmosphere

eps_prime_r_iono: Annotated[Quantity, PhysicalType('dimensionless')]#

Real part of the relative permittivity of the ionosphere

mass_densities: QTable#

Table with species mass densities

mass_density: Annotated[Quantity, PhysicalType('mass density')]#

Mass density of the model

molar_densities: QTable#

Table with species molar densities

molar_density: Annotated[Quantity, PhysicalType('molar concentration')]#

Molar density of the model

molar_fractions: QTable#

Table with species molar fractions

number_density: Annotated[Quantity, PhysicalType('number density')]#

Number density of the model

polarization: Annotated[Quantity, PhysicalType('dimensionless')]#

Polarization of the model

polarization_parameters: dict[str, HarveyLemmon2005Parameters | Pitzer1983Parameters]#

Dictionary that containes the parameter objects for each species

polarizations: QTable#

Table with species polarizations

pressure: Quantity, PhysicalType({'energy density', 'pressure', 'stress'})]#

Pressure levels of the model

refraction: Annotated[Quantity, PhysicalType('dimensionless')]#

Index of refraction of the model

relative_permittivity: Annotated[Quantity, PhysicalType('dimensionless')]#

Complex relative model permittivity

temperature: Annotated[Quantity, PhysicalType('temperature')]#

Temperature levels of the model

Duan et al. (2010)#

Model class that loads all the reference data, maybe adds its own, and returns permittivity.

class xvamp.models.duan_et_al_2010.Duan2010(profile_TPD='duan', profile_CO2=zahnmoroz1985.co2_molar_fraction, profile_N2=zahnmoroz1985.n2_molar_fraction, profile_H2O=duan2010figures.h2o_molar_fraction, profile_SO2=duan2010figures.so2_molar_fraction, profile_CO=duan2010figures.co_molar_fraction, profile_H2SO4=duan2010figures.h2so4_molar_fraction, profile_OCS=duan2010figures.ocs_molar_fraction, profile_Ar=None, use_clouds_from='cimino', ocs_abspol_from='duan', use_eps_prime_r_inf=True, load_polarization_parameters=True, use_compressible_gas=True, use_keating_temp_press_above100km=False, use_virial_approximation=True, cutoff_so2_frequency=None, use_cimino_fitted_lookup=False)[source]#

Initialize the Duan et al. [2010] model. All parameters are set such that they correspond to the Matlab config.atm_recipe = 'all_standard' setting.

Parameters:
  • profile_TPD (MultiProfile | str, default: "duan") –

    Which temperature, pressure, and density profile to use:

    • "duan": A combination of Seiff et al. [1985] and Zasova et al. [2006] as described in the paper, Section 3.1 (i.e., including the 3 K offset).

    • "seiff:x": A specific profile of Seiff et al. [1985] for a given latitude x (valid values: 30, 45, 60, 75, 85) in degrees.

    Note that these preconfigured profiles are all downward-continued to negative altitudes, and are influenced by the the parameters use_compressible_gas and use_keating_temp_press_above100km. Alternatively, a xvamp.profile.MultiProfile with the data columns "temperature", "pressure", and optionally "mass_density" (and the index being the altitude).

  • profile_CO2 (Profile | None, default: zahnmoroz1985.co2_molar_fraction) – CO2 molar fraction profile.

  • profile_N2 (Profile | None, default: zahnmoroz1985.n2_molar_fraction) – N2 molar fraction profile.

  • profile_H2O (Profile | None, default: duan2010figures.h2o_molar_fraction) – H2O molar fraction profile.

  • profile_SO2 (Profile | None, default: duan2010figures.so2_molar_fraction) – SO2 molar fraction profile.

  • profile_CO (Profile | None, default: duan2010figures.co_molar_fraction) – CO molar fraction profile.

  • profile_H2SO4 (Profile | None, default: duan2010figures.h2so4_molar_fraction) –

    H2SO4 molar fraction profile. Preconfigured options are:

    • h2so4_molar_fraction or h2so4_3212_molar_fraction from Duan et al. [2010] and the reference code.

    • h2so4_mr_mean (mean) or h2so4_mr_3212 (where 3212, 3213 and 3214 are individual orbits) from Kolodner and Steffes [1998], Figs. 7-9. This option adds about a tenth of a dB attenuation and removes about 4 mm of delay.

    • h2so4_molar_fraction_0ppm_so2 (where 0, 50, 100, 150, 200 are assumptions about the SO2 content) from Jenkins et al. [2002]. This changes the attenuation by about a tenth of a dB and the delay by some millimeters.

    • h2so4_mr_x_3212 (where 3212, 3213 and 3214 are individual orbits) from Jenkins [1996]. This changes the attenuation by about a dB and the delay of some millimeters.

  • profile_OCS (Profile | None, default: duan2010figures.ocs_molar_fraction) –

    OCS molar fraction profile. Preconfigured options are:

    This has a range delay effect on the sub-millimeter scale, and an effect on the two-way attenuation on the millidecibel scale.

  • profile_Ar (Profile | None, default: None) – Argon molar fraction profile. The default is not to add Argon to the mixture, but a preconfigured (constant) profile is ar_molar_fraction. This has a range delay effect on the sub-micrometer scale, and an effect on the two-way attenuation on the tens of microdecibel scale.

  • use_clouds_from (str, default: "cimino") –

    Define which cloud polarization and absorption model to use:

    • "cimino": Cimino [1982], eq. (10) and (16)

    • "duan": Duan et al. [2010], sections 2.1.5 and 2.2.5

    • "none": Ignore all cloud effects

    See the notes on the importance of this parameter at Cloud polarization and absorption.

  • use_compressible_gas (bool, default: True) – Whether to use the gas compressibility factor when deriving the mass density for the 0-100 km altitude range, or assume the ideal gas law. This only affects the attenuation of the cloud layer, since all other species quantities are derived from the pressure profile, which is directly loaded from Seiff et al. [1985] and Zasova et al. [2006]. The attenuation difference is about 2 millidecibels. If a xvamp.profile.MultiProfile is passed as the profile_TPD parameter and contains a mass density, use_compressible_gas is ignored.

  • ocs_abspol_from (str, default: "duan") –

    Define which model to use to compute the absorption and polarization profiles of OCS.

    • "duan": Using a Ben-Reuven line shape derived from SO2 (default)

    • "kolbe": Using a Lorentzian line shape as described in the paper and following Kolbe et al. [1977]

    • "bbld": Using a Ben-Reuven line shape with parameters derived approximately from Bouanich and Blanquet [1988] and Lavrentieva and Dudaryonok [2020].

    Since OCS is such a minor constituent, the different options have a sub-millimeter effect on the delay and a milli-decibel effect on the attenuation. If changing the default, then also set load_polarization_parameters=False, as the setting affects the polarization parameters.

  • use_eps_prime_r_inf (bool, default: True) – If True, when computing the real part of the relative permittivity of SO2 and OCS, a value of the real relative permittivity at infinite frequency is set to an assumed value (rather than using the theoretical value of unity). This only has an effect if load_polarization_parameters=False, because the polarization parameters resulting from the real part of the relative permittivity are stored. This option has a centimeter-level effect on the delay and changes the attenuation by micro-decibels.

  • load_polarization_parameters (bool | str | Path, default: True) – By default, the polarization parameters are loaded from a prepackaged configuration file (in "data/default_polarization_parameters.toml"). If set to False, they are recomputed with the current settings. If set to a filename, the parameters are loaded from there.

  • use_keating_temp_press_above100km (bool, default: False) – Only used if profile_TPD is not a xvamp.profile.MultiProfile. Whether to use the temperature profile from Keating et al. [1985] above 100 km, and get its matching pressure profile from the ideal gas law. This option has no effect on the model, since the transition between atmosphere- and ionosphere-dominated permittivity profiles is at 100 km, and the ionosphere is modeled differently. It is only useful if one wants to load these quantities for later plotting.

  • use_virial_approximation (bool, default: True) – Whether to use the leading terms of the virial approximation to calculate the total polarization of the polar species [Harvey and Lemmon, 2005], or to use the polarization relationship by Pitzer [1983]. These two approaches are numerically fully equivalent.

  • cutoff_so2_frequency (Quantity | None, default: None) – When computing the absorption coefficient of SO2, include all spectral lines up to this frequency. If None, use all available ones. This option is only kept for development purposes.

  • use_cimino_fitted_lookup (bool, default: False) – Whether to estimate the complex permittivity of gaseous H2SO4 from lookup tables and then pre-fitted analytical extrapolation functions, or to numerically inter- and extrapolate. This option is only kept for development purposes, since the pre-fitted model is flawed. Regardless, this options only has a range delay effect on the sub-micrometer scale, and an effect on the two-way attenuation on the millidecibel scale.

static A_epsilon_from_eq8(Pnu, A_mu, rho, T)[source]#

Compute the leading non-polar term in the dielectric virial expansion (as described by Harvey and Lemmon [2005], eq. 5) using the polarization per molar volume and the dipolar term, and assuming no temperature dependence.

Parameters:
Return type:

float | ndarray[floating]

Returns:

Leading non-polar term in the virial expansion [cm^3/mol]

static absorption_ben_reuven(T, P_minor, P_major, spectral_lines, nu, ls_params)[source]#

Calculates the absorption by summing contributions from a spectral line catalog and using Ben-Reuven line broadening coefficients as described in eqs. (27-32) on pp. 10f.

Parameters:
  • T (Quantity) – Temperature [K]

  • P_minor (Quantity) – Partial pressure of the minor species [torr]

  • P_major (Quantity) – Partial pressure of the major species [torr]

  • spectral_lines (QTable) – Spectral line catalog for the minor species containing line frequencies nu [MHz], line center intensities I [nm^2 MHz], and lower state energies El [1/cm]

  • nu (Quantity) – Target frequency of the absorption [Hz]

  • ls_params (LineShapeParameters) – Line shape parameters for the Ben-Reuven expression

Return type:

Quantity

Returns:

Total absorption [1/cm]

static absorption_lorentz(T, P, spectral_lines, nu, ls_params)[source]#

Calculates the absorption by summing contributions from a spectral line catalog as described in eqs. (27-32) on pp. 10f but using Lorentzian line broadening coefficients.

Parameters:
  • T (Quantity) – Temperature [K]

  • P (Quantity) – Partial pressure [torr]

  • spectral_lines (QTable) – Spectral line catalog for the species containing line frequencies nu [MHz], line center intensities I [nm^2 MHz], and lower state energies El [1/cm]

  • nu (Quantity) – Target frequency of the absorption [Hz]

  • ls_params (LineShapeParameters) – Line shape parameters; only gamma_min_min is used as the line width

Return type:

Quantity

Returns:

Total absorption [1/cm]

static alpha_T_from_eq14(rho, T, Pnu, mu, g=1.0)[source]#

Calculate the molecular polarizability as described in eq. (14) on p. 5, assuming we know the total polarization at given conditions and the molecular dipole moment.

Parameters:
  • rho (Quantity) – Molar density [mol/m^3]

  • T (Quantity) – Temperature [K]

  • Pnu (Quantity) – Polarization per molar volume [-]

  • mu (Quantity) – Molecular dipole moment [esu cm = 1e18 D]

  • g (float, default: 1.0) – Kirkwood correlation factor

Return type:

Quantity

Returns:

Molecular polarizability [cm^3]

static compute_polarization_parameters(ocs_abspol_from='duan', use_eps_prime_r_inf=True, use_virial_approximation=True)[source]#

Get the polarization parameters of the different species. Follows Section 2.1.

Parameters:
  • ocs_abspol_from (str, default: "duan") –

    Define which model to use to compute the absorption and polarization profiles of OCS.

    • "duan": Using a Ben-Reuven line shape derived from SO2 (default)

    • "kolbe": Using a Lorentzian line shape as described in the paper and following Kolbe et al. [1977]

    • "bbld": Using a Ben-Reuven line shape with parameters derived approximately from Bouanich and Blanquet [1988] and Lavrentieva and Dudaryonok [2020].

  • use_eps_prime_r_inf (bool, default: True) – If True, when computing the real part of the relative permittivity of SO2 and OCS, a value of the real relative permittivity at infinite frequency is set to an assumed value (rather than using the theoretical value of unity).

  • use_virial_approximation (bool, default: True) – Whether to use the leading terms of the virial approximation to calculate the total polarization of the polar species (from Harvey & Lemmon, 2005), or to use the polarization relationship by Pitzer [1983].

Return type:

dict[str, HarveyLemmon2005Parameters | Pitzer1983Parameters]

Returns:

Dictionary that containes the parameter objects for each species

static eps_dprime_r_from_eq25(eps_prime_r, alpha, lambda_0=VISAR_WAVELENGTH)[source]#

Converts the total absorption and relative dielectric constant to the imaginary part of the permittivity using eq. (25) on p. 9.

Parameters:
  • eps_prime_r (Quantity) – Dielectric constant (real part of the relative permittivity) [-]

  • alpha (Quantity) – Power absorption coefficient [1/m]

  • lambda_0 (Quantity, default: VISAR_WAVELENGTH) – Wavelength [m]

Return type:

Quantity

Returns:

Imaginary part of the permittivity [-]

static eps_prime_r_from_eq3(Pnu)[source]#

Given the polarization per molar volume, calculate the (positive) solution of eq. (3) for the dielectric constant.

Parameters:

Pnu (Quantity) – Polarization per molar volume [-]

Return type:

Quantity

Returns:

Relative dielectric constant [-]

static eps_prime_r_from_spectral_lines(T, P, spectral_lines, ls_params, nu, freqstep=Quantity(0.1, 'GHz'), freqmin=None, freqmax=None, use_ben_reuven=True, eps_prime_r_inf=1.0)[source]#

Computes the real part of the relative permittivity by integrating through the spectral lines and assuming an infinite convergence value

Parameters:
  • T (Quantity) – Temperature [K]

  • P (Quantity) – Pressure [bar]

  • spectral_lines (QTable) – Spectral line catalog for the minor species containing line frequencies nu [MHz], line center intensities I [nm^2 MHz], and lower state energies El [1/cm]

  • ls_params (LineShapeParameters) – Parameters for the Ben-Reuven line expression

  • nu (Quantity) – Target frequency of the absorption [Hz]

  • freqstep (Quantity, default: Quantity(0.1, "GHz")) – Frequency step of the integration domain

  • freqmin (Quantity | None, default: None) – Minimum frequency of the integration domain (defaults to minimum frequency of spectral_lines). Below that, five log-spaced samples at lower orders of magnitude are added for numerical stability

  • freqmax (Quantity | None, default: None) – Maximum frequency of the densely-sampled integration domain (defaults to maximum frequency of spectral_lines). Above that, five log-spaced samples at higher orders of magnitude are added for numerical stability.

  • use_ben_reuven (bool, default: True) – If True, use the Ben-Reuven line expression, else use a Lorentzian line shape for the computation of the absorption.

  • eps_prime_r_inf (float, default: 1.0) – Real part of the relative permittivity at infinite frequency, theoretically 1.

Returns:

Real part of the relative permittivity

static eq14(rho, T, pp, g=1.0)[source]#

Calculate the total polarization as described in eq. (14), assuming we know the molecular polarizability and molecular dipole moment.

Parameters:
Return type:

Quantity

Returns:

Polarization [-]

static eq2(eps_prime_r)[source]#

Calculate the polarization per molar volume of a non-polar material from the relative dielectric constant using eq. (2) on page 3.

Parameters:

eps_prime_r (float | ndarray[floating] | Quantity) – Relative dielectric constant [-]

Return type:

float | ndarray[floating] | Quantity

Returns:

Polarization per molar volume [-]

static eq22_mod(el_density, frequency=VISAR_FREQUENCY)[source]#

Calculate the relative permittivity due to the polarization of the ionosphere, i.e., the parenthesis in eq. (22).

Parameters:
  • el_density (Quantity) – Electron density [1/m^3]

  • frequency (Quantity, default: VISAR_FREQUENCY) – Frequency at which to calculate the permittivity [Hz]

Return type:

Quantity

Returns:

Relative permittivity [-]

static eq25(eps_prime_r, eps_dprime_r, lambda_0=VISAR_WAVELENGTH)[source]#

Converts the real and imaginary parts of the relative permittivity to the absorption coefficient using eq. (25) on p. 9.

Parameters:
Return type:

Quantity

Returns:

Power absorption coefficient [1/m]

static eq26(P, T, f_CO2, f_N2, f_Ar, f_H2O, lambda_0=VISAR_WAVELENGTH)[source]#

Calculate the total absorption of a mixture of CO2, N2, Ar, and H2O following eq. (26) on p. 9.

Parameters:
  • P (Quantity) – Pressure [bar]

  • T (Quantity) – Temperature [K]

  • f_CO2 (Quantity) – Molar fractions [-]

  • f_N2 (Quantity) – Molar fractions [-]

  • f_Ar (Quantity | None) – Molar fractions [-]

  • f_H2O (Quantity) – Molar fractions [-]

  • lamda_0 – Wavelength [m]

Return type:

Quantity

Returns:

Total absorption [1/cm]

static eq3(eps_prime_r)[source]#

Calculate the polarization per molar volume of a polar material from the relative dielectric constant using eq. (3) on page 3.

Parameters:

eps_prime_r (float | ndarray[floating] | Quantity) – Relative dielectric constant [-]

Return type:

float | ndarray[floating] | Quantity

Returns:

Polarization per molar volume [-]

static eq33(q, p, f, T)[source]#

Calculate the total absorption of H2SO4 given eq. (33) on p. 11 in Duan et al. [2010], which in turn is eq. (18) in Kolodner and Steffes [1998].

Parameters:
Return type:

Quantity

Returns:

Total absorption due to H2SO4 [1/m]

static eq8(rho, T, fluid)[source]#

Calculate the total polarization using the dielectric virial expansion as described in eq. (8) from Duan et al. [2010].

Parameters:
Return type:

Quantity

Returns:

Polarization [-]

static get_h2so4_rel_permittivity(concentration, temperature, frequency)[source]#

Calculate the complex relative permittivity of gaseous H2SO4.

Parameters:
  • concentration (Quantity) – Concentration of H2SO4 [%]

  • temperature (Quantity) – Temperature of the medium [K]

  • frequency (Quantity) – Wavelength for which to compute the permittivity values [Hz]

Return type:

tuple[Quantity, Quantity]

Returns:

  • eps_prime_r – Real part of the relative permittivity

  • eps_dprime_r – Imaginary part of the relative permittivity

Note

Here, the imaginary part of the relative atmospheric permittivity has the opposite sign as in Duan et al. [2010].

static get_tpd(profile_TPD='duan', use_compressible_gas=True, use_keating_temp_press_above100km=False)[source]#

Build the temperature, pressure, and mass density profiles.

Parameters:
  • profile_TPD (str, default: "duan") –

    Which temperature, pressure, and density profile to use:

    • "duan": A combination of Seiff et al. [1985] and Zasova et al. [2006] as described in the paper, Section 3.1 (i.e., including the 3 K offset).

    • "seiff:x": A specific profile of Seiff et al. [1985] for a given latitude x (valid values: 30, 45, 60, 75, 85) in degrees.

    Note that these preconfigured profiles are all downward-continued to negative altitudes.

  • use_compressible_gas (bool, default: True) – Whether to use the gas compressibility factor when deriving the mass density for the 0-100 km altitude range, or assume the ideal gas law. Gas compressibility is always assumed below 0 km, and never above 100 km.

  • use_keating_temp_press_above100km (bool, default: False) – Whether to use the temperature profile from Keating et al. [1985] above 100 km, and get its matching pressure profile from the ideal gas law.

Return type:

MultiProfile

Returns:

MultiProfile with altitude as the index and temperature and pressure as data columns. If use_compressible_gas=True, also has the mass density as a data column.

static kirkwood_correlation_cgs(d, T, p0=2.68, p1=6.69, p2=565.0, e=0.3)[source]#

Kirkwood correlation factor as described on p. 5. Inconsistent units so no Quantity inputs.

Parameters:
  • d (float | ndarray[floating]) – Mass density [g/cm^3]

  • T (float | ndarray[floating]) – Temperature [K]

  • p0 (float, default: 2.68) – Factors used in the formula

  • p1 (float, default: 6.69) – Factors used in the formula

  • p2 (float, default: 565.0) – Factors used in the formula

  • e (float, default: 0.3) – Factors used in the formula

Return type:

float | ndarray[floating]

Returns:

Kirkwood correlation factor [-]

evaluate_absorptions(cutoff_so2_frequency=None, ocs_abspol_from='duan')[source]#

Evaluate the absorption models given the model’s atmospheric quantities.

Parameters:
  • cutoff_so2_frequency (Quantity | None, default: None) – When computing the absorption coefficient of SO2, include all spectral lines up to this frequency. If None, use all available ones. This option is only kept for development purposes.

  • ocs_abspol_from (str, default: "duan") –

    Define which model to use to compute the absorption and polarization profiles of OCS.

    • "duan": Using a Ben-Reuven line shape derived from SO2 (default)

    • "kolbe": Using a Lorentzian line shape as described in the paper and following Kolbe et al. [1977]

    • "bbld": Using a Ben-Reuven line shape with parameters derived approximately from Bouanich and Blanquet [1988] and Lavrentieva and Dudaryonok [2020].

Return type:

QTable

Returns:

Table with evaluated absorptions

evaluate_cloud_permittivity(use_clouds_from='cimino', use_cimino_fitted_lookup=False)[source]#

Evaluate the cloud polarization and absorption given the model’s atmospheric quantities. Follows Sections 2.1.5 and 2.2.5, and/or Cimino [1982].

Parameters:
  • use_clouds_from (str, default: "cimino") –

    Define which cloud polarization and absorption model to use:

    • "cimino": Cimino [1982], eq. (10) and (16)

    • "duan": Duan et al. [2010], sections 2.1.5 and 2.2.5

    • "none": Ignore all cloud effects

    See the notes on the importance of this parameter at Cloud polarization and absorption.

  • use_cimino_fitted_lookup (bool, default: False) – Whether to estimate the complex permittivity of gaseous H2SO4 from lookup tables and then pre-fitted analytical extrapolation functions, or to numerically inter- and extrapolate. This option is only kept for development purposes, since the pre-fitted model is flawed. Regardless, this options only has a range delay effect on the sub-micrometer scale, and an effect on the two-way attenuation on the millidecibel scale.

Return type:

tuple[Quantity, Quantity]

Returns:

  • cloud_pol – Polarization of the cloud (accounting for its volume fraction)

  • cloud_absorp – Absorption of the cloud (accounting for its volume fraction)

evaluate_polarization_parameters()[source]#

Evaluate the model’s polarization parameters given its atmospheric quantities.

Return type:

QTable

Returns:

Table with evaluated polarizations

sum_absorptions()[source]#

Sum the absorptions already present in the model.

Return type:

Quantity

Returns:

Total absorption of the atmospheric profile

sum_polarizations()[source]#

Sum the polarizations already present in the model. These have all already been scaled by their volume fraction.

Return type:

Quantity

Returns:

Total polarization of the atmospheric profile

update_densities()[source]#

Compute the total and specific mass, number, and molar densities from the total pressure and temperature, and the molar fractions. Also computes the cloud mass density from the atmospheric profile and the cloud concentration and mass mixing ratio. If the mass density has not been set yet, it is derived from the ideal gas law.

Notes

Reads: pressure, temperature, molar_fractions, and cloud_mass_mixing_ratio

Writes: number_density, mass_densities, molar_density, molar_densities, cloud_mass_density and (if not already present) mass_density

update_ionosphere()[source]#

Converts the model’s electron density to the corresponding real part of the relative permittivity.

Notes

Reads: electron_density.

Writes: eps_prime_r_iono.

update_pol_absorp_atmosphere(cutoff_so2_frequency=None, ocs_abspol_from='duan', use_clouds_from='cimino', use_cimino_fitted_lookup=False)[source]#

Update the individual and total polarization and absorption of the atmosphere’s species and clouds given the polarization and absorption parameters. Then, sum up the contributions and compute the resulting real part of the relative permittivity.

Parameters:
  • cutoff_so2_frequency (Quantity | None, default: None) – When computing the absorption coefficient of SO2, include all spectral lines up to this frequency. If None, use all available ones. This option is only kept for development purposes.

  • ocs_abspol_from (str, default: "duan") –

    Define which model to use to compute the absorption and polarization profiles of OCS.

    • "duan": Using a Ben-Reuven line shape derived from SO2 (default)

    • "kolbe": Using a Lorentzian line shape as described in the paper and following Kolbe et al. [1977]

    • "bbld": Using a Ben-Reuven line shape with parameters derived approximately from Bouanich and Blanquet [1988] and Lavrentieva and Dudaryonok [2020].

  • use_clouds_from (str, default: "cimino") –

    Define which cloud polarization and absorption model to use:

    • "cimino": Cimino [1982], eq. (10) and (16)

    • "duan": Duan et al. [2010], sections 2.1.5 and 2.2.5

    • "none": Ignore all cloud effects

    See the notes on the importance of this parameter at Cloud polarization and absorption.

  • use_cimino_fitted_lookup (bool, default: False) – Whether to estimate the complex permittivity of gaseous H2SO4 from lookup tables and then pre-fitted analytical extrapolation functions, or to numerically inter- and extrapolate. This option is only kept for development purposes, since the pre-fitted model is flawed. Regardless, this options only has a range delay effect on the sub-micrometer scale, and an effect on the two-way attenuation on the millidecibel scale.

Notes

Reads: polarization_parameters, temperature, pressure, molar_fractions, molar_densities, mass_densities, cloud_concentration, and cloud_mass_density.

Writes: polarizations, polarization, absorptions, absorption, and eps_prime_r_atmo.

update_rel_perm_refraction()[source]#

Update the complex relative permittivity from the real parts of the atmos- and ionosphere, as well as the total absorption profile.

Notes

Reads: altitude, eps_prime_r_atmo, eps_prime_r_iono, and absorption.

Writes: relative_permittivity and refraction.

BR_OCS_CO2 = LineShapeParameters(T_0=<Quantity 300. K>, gamma_min_min=<Quantity 5.9 MHz / Torr>, gamma_min_maj=<Quantity 4.3 MHz / Torr>, zeta_min_min=<Quantity 0. MHz / Torr>, zeta_min_maj=<Quantity 0. MHz / Torr>, delta_min=<Quantity 0. MHz / Torr>, m=0.7, n=0.7)#

Ben-Reuven line parameters for OCS in CO2 based on visual inspection of Bouanich and Blanquet [1988] and Lavrentieva and Dudaryonok [2020]

BR_SO2_AS_OCS_CO2 = LineShapeParameters(T_0=<Quantity 300. K>, gamma_min_min=<Quantity 16. MHz / Torr>, gamma_min_maj=<Quantity 7.2 MHz / Torr>, zeta_min_min=<Quantity 0. MHz / Torr>, zeta_min_maj=<Quantity 0. MHz / Torr>, delta_min=<Quantity 0. MHz / Torr>, m=0.85, n=0.85)#

Ben-Reuven line parameters for OCS in CO2 derived from the SO2 in CO2 parameters but setting zeta and delta to zero

BR_SO2_CO2 = LineShapeParameters(T_0=<Quantity 300. K>, gamma_min_min=<Quantity 16. MHz / Torr>, gamma_min_maj=<Quantity 7.2 MHz / Torr>, zeta_min_min=<Quantity 1.6 MHz / Torr>, zeta_min_maj=<Quantity 1.3 MHz / Torr>, delta_min=<Quantity 2.9 MHz / Torr>, m=0.85, n=0.85)#

Ben-Reuven line parameters for SO2 in CO2

EPS_DPRIME_R_H2SO4#

Imaginary part of the relative permittivity for H2SO4 at 2650 MHz for concentrations between 0% and 100% [-]

EPS_PRIME_R_CO = <Quantity 1.000634>#

X-band estimated dielectric constant of CO at 1 atm and 0 °C

EPS_PRIME_R_H2SO4#

Real part of the relative permittivity for H2SO4 at 2650 MHz for concentrations between 0% and 100% [-]

EPS_PRIME_R_INF_OCS = <Quantity 1.00586264>#

Estimated dielectric constant of OCS at infinite frequency

EPS_PRIME_R_INF_SO2 = <Quantity 1.00586264>#

Estimated dielectric constant of SO2 at infinite frequency

EXT_PRESSURE_COEFFS = [11.201473859081256, 0.006260686643162, -9.240397971368619, 0.010200118486472]#

Coefficients fit to a douple exponential function to extrapolate pressure [log10(atm)] from altitude [km], taken from the reference code

HLP_AR = HarveyLemmon2005Parameters(a0=4.1414, a1=0.0, b0=1.597, b1=0.262, c0=-117.9, c1=0.0, D=2.1, T0=273.16, A_mu=0)#

Mixture parameters for Ar in cgs units

HLP_CO2 = HarveyLemmon2005Parameters(a0=7.3455, a1=0.00335, b0=83.93, b1=145.1, c0=-578.8, c1=-1012.0, D=1.55, T0=273.16, A_mu=0)#

Mixture parameters for CO2 in cgs units

HLP_N2 = HarveyLemmon2005Parameters(a0=4.3872, a1=0.00226, b0=2.206, b1=1.135, c0=-169.0, c1=-35.83, D=2.1, T0=273.16, A_mu=0)#

Mixture parameters for N2 in cgs units

L_OCS = LineShapeParameters(T_0=<Quantity 300. K>, gamma_min_min=<Quantity 6.4 MHz / Torr>, gamma_min_maj=<Quantity 0. MHz / Torr>, zeta_min_min=<Quantity 0. MHz / Torr>, zeta_min_maj=<Quantity 0. MHz / Torr>, delta_min=<Quantity 0. MHz / Torr>, m=0.0, n=0.0)#

Lorentzian line parameters for OCS from Kolbe et al. [1977]

MIN_ALTITUDE_SPACING = <Quantity 1. km>#

Minimum height spacing between altitude nodes. Only becomes relevant if the loaded profiles of the physical and chemical quantities are not dense enough to ensure an accurate numerical integration.

MU_CO = <Quantity 1.12e-19 Fr cm>#

Permanent dipole moment of CO [esu cm]

MU_OCS = <Quantity 7.1521e-19 Fr cm>#

Permanent dipole moment of OCS [esu cm]

MU_SO2 = <Quantity 1.633e-18 Fr cm>#

Permanent dipole moment of SO2 [esu cm]

PP_water_vapor = Pitzer1983Parameters(mu=<Quantity 1.84e-18 Fr cm>, alpha_T=<Quantity 1.444e-24 cm3>)#

Polarization parameters for water vapor

P_CO = <Quantity 101325. Pa>#

Pressure at which the dielectric constant for CO was calculated

P_OCS = <Quantity 101325. Pa>#

Pressure at which the dielectric constant for OCS was calculated

P_SO2 = <Quantity 101325. Pa>#

Pressure at which the dielectric constant for SO2 was calculated

RHO_CO = <Quantity 40.89461871 mol / m3>#

Molar density from P_CO and T_CO

RHO_OCS = <Quantity 44.61013388 mol / m3>#

Molar density from P_OCS and T_OCS

RHO_SO2 = <Quantity 44.61503341 mol / m3>#

Molar density from P_SO2 and T_SO2

TRANSITION_ATMO_IONO = <Quantity 100. km>#

Altitude at which the computation of the real part of the relative permittivity switches from the individual components in the atmosphere to the overall effect of the ionosphere

T_CO = <Quantity 298. K>#

Temperature at which the dielectric constant for CO was calculated

T_OCS = <Quantity 273.18 K>#

Temperature at which the dielectric constant for OCS was calculated

T_SO2 = <Quantity 273.15 K>#

Temperature at which the dielectric constant for SO2 was calculated

VENUS_GAS_CONSTANT = <Quantity 191.4 J / (K kg)>#

Venus standard atmospheric gas constant (= R/M) [J/kg K]

VENUS_MOLAR_MASS = <Quantity 0.04344964 kg / mol>#

Venus standard atmospheric molar mass [kg/mol]

class xvamp.models.duan_et_al_2010.Duan2010Verification(profile_TPD='seiff:75', profile_CO2=zahnmoroz1985.co2_molar_fraction, profile_N2=zahnmoroz1985.n2_molar_fraction, profile_H2O=duan2010figures.h2o_old_molar_fraction, profile_SO2=duan2010figures.so2_old_molar_fraction, profile_CO=duan2010figures.co_old_molar_fraction, profile_H2SO4=kolodnersteffes1998.h2so4_mr_3212, profile_OCS=duan2010figures.ocs_old_molar_fraction, profile_Ar=None, use_clouds_from='none', ocs_abspol_from='duan', use_eps_prime_r_inf=True, load_polarization_parameters=True, use_compressible_gas=True, use_keating_temp_press_above100km=False, use_virial_approximation=True, cutoff_so2_frequency=None, use_cimino_fitted_lookup=False)[source]#

The same as Duan2010 except that the defaults follow the Matlab config.atm_recipe = 'model_verification' setting.

Onboard model#

Module with the onboard atmospheric model.

class xvamp.models.onboard.OnboardPolynomial[source]#

Onboard method to compute the atmoshperically-derived range error and attenuation.

get_apparent_range(h_t, r_o, rho, iter=2)[source]#

Compute the geomtric range from the apparent range.

Parameters:
Return type:

float | ndarray[floating]

Returns:

Apparent range [m]

get_geometric_range(h_t, r_o, rho_tilde)[source]#

Compute the geomtric range from the apparent range.

Parameters:
Return type:

float | ndarray[floating]

Returns:

Geometric range [m]

platfhref = 220000.0#

Altitude reference value [m] to be used for the range radiometric correction

platfrref = np.float64(6271800.0)#

Radius reference value [m] to be used for the range radiometric correction

ppRngGeoAppInpt = Polynomial([ 9.80061143e+00, -4.94896297e-04,  5.37523416e-09,  9.38617483e-14], domain=[-1.,  1.], window=[-1.,  1.], symbol='x')#

Polynomial for fitting the intercept of geometric range vs. apparent range as a function of terrain height

ppRngGeoAppSlope = Polynomial([ 9.98767936e-01,  7.13862691e-08, -1.60203186e-12,  1.45073790e-17], domain=[-1.,  1.], window=[-1.,  1.], symbol='x')#

Polynomial for fitting the slope of geometric range vs. apparent range as a function of terrain height