hwoutils.conversions
====================

.. py:module:: hwoutils.conversions

.. autoapi-nested-parse::

   Unit conversion functions using centralized constants.

   Pure JAX implementations — no astropy dependency. Functions are intentionally
   NOT JIT-compiled so JAX can fuse them into larger computation graphs.



Attributes
----------

.. autoapisummary::

   hwoutils.conversions.SPHERICAL_TO_GEOMETRIC_ALBEDO_LAMBERTIAN


Functions
---------

.. autoapisummary::

   hwoutils.conversions.jy_to_photons_per_nm_per_m2
   hwoutils.conversions.photons_per_nm_per_m2_to_jy
   hwoutils.conversions.mag_per_arcsec2_to_jy_per_arcsec2
   hwoutils.conversions.nm_to_um
   hwoutils.conversions.um_to_nm
   hwoutils.conversions.nm_to_wavenumber_cm
   hwoutils.conversions.wavenumber_cm_to_nm
   hwoutils.conversions.au_to_m
   hwoutils.conversions.m_to_au
   hwoutils.conversions.Rearth_to_m
   hwoutils.conversions.au_per_yr_to_m_per_s
   hwoutils.conversions.arcsec_to_rad
   hwoutils.conversions.rad_to_arcsec
   hwoutils.conversions.mas_to_arcsec
   hwoutils.conversions.arcsec_to_mas
   hwoutils.conversions.arcsec_to_lambda_d
   hwoutils.conversions.lambda_d_to_arcsec
   hwoutils.conversions.Msun_to_kg
   hwoutils.conversions.Mearth_to_kg
   hwoutils.conversions.au_to_arcsec
   hwoutils.conversions.arcsec_to_au
   hwoutils.conversions.years_to_days
   hwoutils.conversions.days_to_years
   hwoutils.conversions.is_leap_year
   hwoutils.conversions.days_in_year
   hwoutils.conversions.gregorian_to_jd
   hwoutils.conversions.jd_to_decimal_year
   hwoutils.conversions.decimal_year_to_jd
   hwoutils.conversions.spherical_to_geometric_albedo
   hwoutils.conversions.geometric_to_spherical_albedo


Module Contents
---------------

.. py:function:: jy_to_photons_per_nm_per_m2(flux_jy, wavelength_nm)

   Convert flux density from Janskys to photons/s/nm/m².

   Args:
       flux_jy: Flux density in Janskys.
       wavelength_nm: Wavelength in nanometers.

   Returns:
       Flux density in photons/s/nm/m².


.. py:function:: photons_per_nm_per_m2_to_jy(flux_phot, wavelength_nm)

   Convert flux density from photons/s/nm/m² to Janskys.

   Args:
       flux_phot: Flux density in photons/s/nm/m².
       wavelength_nm: Wavelength in nanometers.

   Returns:
       Flux density in Janskys.


.. py:function:: mag_per_arcsec2_to_jy_per_arcsec2(mag_per_arcsec2)

   Convert surface brightness from mag/arcsec² to Jy/arcsec² (AB).

   Args:
       mag_per_arcsec2: Surface brightness in magnitudes per arcsec².

   Returns:
       Surface brightness in Jy/arcsec².


.. py:function:: nm_to_um(length_nm)

   Convert nanometers to micrometers.


.. py:function:: um_to_nm(length_um)

   Convert micrometers to nanometers.


.. py:function:: nm_to_wavenumber_cm(wavelength_nm)

   Convert wavelength [nm] to wavenumber [cm^-1] (nu = 1 / lambda).

   Args:
       wavelength_nm: Wavelength in nanometers.

   Returns:
       Wavenumber in inverse centimeters.


.. py:function:: wavenumber_cm_to_nm(wavenumber_cm)

   Convert wavenumber [cm^-1] to wavelength [nm].

   Args:
       wavenumber_cm: Wavenumber in inverse centimeters.

   Returns:
       Wavelength in nanometers.


.. py:function:: au_to_m(length_au)

   Convert AU to meters.


.. py:function:: m_to_au(length_m)

   Convert meters to AU.


.. py:function:: Rearth_to_m(length_Rearth)

   Convert Earth radii to meters.


.. py:function:: au_per_yr_to_m_per_s(velocity_au_per_yr)

   Convert AU/yr to m/s.


.. py:function:: arcsec_to_rad(angle_arcsec)

   Convert arcseconds to radians.


.. py:function:: rad_to_arcsec(angle_rad)

   Convert radians to arcseconds.


.. py:function:: mas_to_arcsec(angle_mas)

   Convert milliarcseconds to arcseconds.


.. py:function:: arcsec_to_mas(angle_arcsec)

   Convert arcseconds to milliarcseconds.


.. py:function:: arcsec_to_lambda_d(angle_arcsec, wavelength_nm, diameter_m)

   Convert angular separation to lambda/D units.

   Args:
       angle_arcsec: Angular separation in arcseconds.
       wavelength_nm: Wavelength in nanometers.
       diameter_m: Telescope diameter in meters.

   Returns:
       Angular separation in lambda/D.


.. py:function:: lambda_d_to_arcsec(angle_lambda_d, wavelength_nm, diameter_m)

   Convert lambda/D units to angular separation in arcseconds.

   Args:
       angle_lambda_d: Angular separation in lambda/D.
       wavelength_nm: Wavelength in nanometers.
       diameter_m: Telescope diameter in meters.

   Returns:
       Angular separation in arcseconds.


.. py:function:: Msun_to_kg(mass_solar)

   Convert solar masses to kilograms.


.. py:function:: Mearth_to_kg(mass_earth)

   Convert Earth masses to kilograms.


.. py:function:: au_to_arcsec(distance_au, distance_pc)

   Convert physical distance in AU to angular separation.

   Args:
       distance_au: Physical distance in AU.
       distance_pc: Distance to system in parsecs.

   Returns:
       Angular separation in arcseconds.


.. py:function:: arcsec_to_au(angle_arcsec, distance_pc)

   Convert angular separation to physical distance.

   Args:
       angle_arcsec: Angular separation in arcseconds.
       distance_pc: Distance to system in parsecs.

   Returns:
       Physical distance in AU.


.. py:function:: years_to_days(time_years)

   Convert years to days.


.. py:function:: days_to_years(time_days)

   Convert days to years.


.. py:function:: is_leap_year(year)

   Determine if a year is a leap year.

   Args:
       year: The year to check.

   Returns:
       True if the year is a leap year.


.. py:function:: days_in_year(year)

   Return the number of days in a year (365 or 366).

   Args:
       year: The year to check.

   Returns:
       Number of days.


.. py:function:: gregorian_to_jd(year, month, day)

   Convert a Gregorian date to a Julian day.

   Args:
       year: The year.
       month: The month.
       day: The day.

   Returns:
       The Julian day.


.. py:function:: jd_to_decimal_year(jd)

   Convert a Julian day to a decimal year.

   Args:
       jd: The Julian day.

   Returns:
       The decimal year.


.. py:function:: decimal_year_to_jd(decimal_year)

   Convert a decimal year to a Julian day.

   Args:
       decimal_year: The decimal year.

   Returns:
       The Julian day.


.. py:data:: SPHERICAL_TO_GEOMETRIC_ALBEDO_LAMBERTIAN
   :type:  float
   :value: 0.6666666666666666


.. py:function:: spherical_to_geometric_albedo(A_S)

   Convert spherical albedo to geometric albedo (Lambertian sphere).

   Args:
       A_S: Spherical (Bond) albedo, dimensionless.

   Returns:
       Geometric albedo A_g, dimensionless.

   Notes:
       Exact for a uniformly Lambertian-reflecting sphere
       (Seager 2010, eq 3.36): A_g = (2/3) * A_S. For atmospheres
       with anisotropic scattering (Mie clouds, etc.) the actual
       A_g / A_S ratio depends on the scattering phase function;
       this is the leading-order approximation that the ExoJaxPhysicalModel
       uses to convert its 2-stream plane-parallel reflectivity to a
       disk-integrated geometric albedo.


.. py:function:: geometric_to_spherical_albedo(A_g)

   Convert geometric albedo to spherical albedo (Lambertian sphere).

   Inverse of :func:`spherical_to_geometric_albedo`:
   A_S = (3/2) * A_g.


