from __future__ import annotations
from sasktran2._core_rust import (
EmissionSource,
FluxType,
InputValidationMode,
LogLevel,
MultipleScatterSource,
OccultationSource,
PyConfig,
SingleScatterSource,
SpectralGridMode,
StokesBasis,
ThreadingLib,
ThreadingModel,
)
[docs]
class Config:
_config: PyConfig
[docs]
def __init__(self):
"""
Object which stores all of the configuration settings for the radiative transfer calculation.
"""
self._config = PyConfig()
def _into_rust_object(self):
"""
Returns the rust object which contains all of the configuration settings for the radiative transfer calculation.
"""
return self._config
@property
def num_threads(self) -> int:
"""
Controls the number of threads used in the calculation. For maximum performance it is
recommended to set this to the number of physical cores on your machine. Defaults to
1
"""
return self._config.num_threads
@num_threads.setter
def num_threads(self, value: int):
"""
Controls the number of threads used in the calculation. For maximum performance it is
recommended to set this to the number of physical cores on your machine. Defaults to
1
"""
self._config.num_threads = value
@property
def threading_model(self) -> ThreadingModel:
"""
Sets the multi-threading mode to use in the calculation.
`sasktran2.ThreadingModel.Wavelength` (Default)
Calculation is multi-threaded over the wavelength (batch) dimension only. This method
works very well when this dimension is large, but may increase memory usage. It also
is not very effective for a small number of wavelengths.
`sasktran2.ThreadingModel.Source`
Calculation is multi-threaded individually by each source function for each wavelength.
This method is recommended when memory is a concern, or when the number of wavelengths
is small.
"""
return self._config.threading_model
@threading_model.setter
def threading_model(self, value: ThreadingModel):
"""
Sets the multi-threading mode to use in the calculation.
`sasktran2.ThreadingModel.Wavelength` (Default)
Calculation is multi-threaded over the wavelength (batch) dimension only. This method
works very well when this dimension is large, but may increase memory usage. It also
is not very effective for a small number of wavelengths.
`sasktran2.ThreadingModel.Source`
Calculation is multi-threaded individually by each source function for each wavelength.
This method is recommended when memory is a concern, or when the number of wavelengths
is small.
"""
self._config.threading_model = value
@property
def input_validation_mode(self) -> InputValidationMode:
"""
Sets the input validation mode to use in the calculation.
`sasktran2.InputValidationMode.Strict` (Default)
All input validation checks are performed. This is the recommended mode for most users.
`sasktran2.InputValidationMode.Standard`
Only the most important input validation checks are performed. This mode is recommended
for advanced users who are confident in the input data.
`sasktran2.InputValidationMode.Disabled`
No input validation checks are performed. This mode is recommended for advanced users who
are confident in the input data and want to maximize performance.
"""
return self._config.input_validation_mode
@input_validation_mode.setter
def input_validation_mode(self, value: InputValidationMode):
"""
Sets the input validation mode to use in the calculation.
`sasktran2.InputValidationMode.Strict` (Default)
All input validation checks are performed. This is the recommended mode for most users.
`sasktran2.InputValidationMode.Standard`
Only the most important input validation checks are performed. This mode is recommended
for advanced users who are confident in the input data.
`sasktran2.InputValidationMode.Disabled`
No input validation checks are performed. This mode is recommended for advanced users who
are confident in the input data and want to maximize performance.
"""
self._config.input_validation_mode = value
@property
def num_stokes(self) -> int:
"""
Sets the number of Stokes parameters used in the calculation. 1 is equivalent to the scalar approximation.
Currently the only supported values are 1, and 3.
"""
return self._config.num_stokes
@num_stokes.setter
def num_stokes(self, value: int):
"""
Sets the number of Stokes parameters used in the calculation. 1 is equivalent to the scalar approximation.
Currently the only supported values are 1, and 3.
"""
self._config.num_stokes = value
@property
def single_scatter_source(self) -> SingleScatterSource:
"""
Sets which (if any) single scatter source is to be used inside the calculation.
`sasktran2.SingleScatterSource.Exact` (Default)
A single scatter source where exact ray tracing is performed at each quadrature
point along the observer lines of sight towards the sun
`sasktran2.SingleScatterSource.Table`
A single scatter source where a pre-computed table is used to calculate solar
transmission to quadrature points along the line of sight.
`sasktran2.SingleScatterSource.DiscreteOrdinates`
Lets the discrete ordinates source function calculate the single scatter source. Only
has an effect if the geometry mode is set to PlaneParallel or PseudoSpherical, and
if the DiscreteOrdinates source function is also used for multiple scatter.
`sasktran2.SingleScatterSource.NoSource`
Disables the single scatter source
"""
return self._config.single_scatter_source
@single_scatter_source.setter
def single_scatter_source(self, value: SingleScatterSource):
"""
Sets which (if any) single scatter source is to be used inside the calculation.
`sasktran2.SingleScatterSource.Exact` (Default)
A single scatter source where exact ray tracing is performed at each quadrature
point along the observer lines of sight towards the sun
`sasktran2.SingleScatterSource.Table`
A single scatter source where a pre-computed table is used to calculate solar
transmission to quadrature points along the line of sight.
`sasktran2.SingleScatterSource.DiscreteOrdinates`
Lets the discrete ordinates source function calculate the single scatter source. Only
has an effect if the geometry mode is set to PlaneParallel or PseudoSpherical, and
if the DiscreteOrdinates source function is also used for multiple scatter.
`sasktran2.SingleScatterSource.NoSource`
Disables the single scatter source
"""
self._config.single_scatter_source = value
@property
def occultation_source(self) -> OccultationSource:
"""
Sets which (if any) occultation source is to be used inside the calculation.
`sasktran2.OccultationSource.NoSource` (Default)
No occultation source included
`sasktran2.OccultationSource.Standard`
A constant source of 1 is placed at the end of every individual line of sight.
"""
return self._config.occultation_source
@occultation_source.setter
def occultation_source(self, value: OccultationSource):
"""
Sets which (if any) occultation source is to be used inside the calculation.
`sasktran2.OccultationSource.NoSource` (Default)
No occultation source included
`sasktran2.OccultationSource.Standard`
A constant source of 1 is placed at the end of every individual line of sight.
"""
self._config.occultation_source = value
@property
def emission_source(self) -> EmissionSource:
"""
Sets which (if any) emission source is to be used inside the calculation.
`sasktran2.EmissionSource.NoSource` (Default)
No emission source included
`sasktran2.EmissionSource.Standard`
An emission source defined on the atmosphere grid is enabled.
"""
return self._config.emission_source
@emission_source.setter
def emission_source(self, value: EmissionSource):
"""
Sets which (if any) emission source is to be used inside the calculation.
`sasktran2.EmissionSource.NoSource` (Default)
No emission source included
`sasktran2.EmissionSource.Standard`
An emission source defined on the atmosphere grid is enabled.
"""
self._config.emission_source = value
@property
def multiple_scatter_source(self) -> MultipleScatterSource:
"""
Sets which (if any) multiple scatter source is to be used inside the calculation.
`sasktran2.MultipleScatterSource.NoSource` (Default)
Multiple scattering is disabled
`sasktran2.MultipleScatterSource.DiscreteOrdinates`
The discrete ordinates technique is used to estimate the multiple scatter signal
`sasktran2.MultipleScatterSource.SuccessiveOrders`
The successive orders of scattering method is used to estimate the multiple scatter
signal
"""
return self._config.multiple_scatter_source
@multiple_scatter_source.setter
def multiple_scatter_source(self, value: MultipleScatterSource):
"""
Sets which (if any) multiple scatter source is to be used inside the calculation.
`sasktran2.MultipleScatterSource.NoSource` (Default)
Multiple scattering is disabled
`sasktran2.MultipleScatterSource.DiscreteOrdinates`
The discrete ordinates technique is used to estimate the multiple scatter signal
`sasktran2.MultipleScatterSource.SuccessiveOrders`
The successive orders of scattering method is used to estimate the multiple scatter
signal
"""
self._config.multiple_scatter_source = value
@property
def stokes_basis(self) -> StokesBasis:
""" """
return self._config.stokes_basis
@stokes_basis.setter
def stokes_basis(self, value: StokesBasis):
""" """
self._config.stokes_basis = value
@property
def delta_m_scaling(self) -> bool:
"""
Controls whether the delta-M scaling is applied to the calculation. Defaults to False.
"""
return self._config.delta_m_scaling
@delta_m_scaling.setter
def delta_m_scaling(self, value: bool):
"""
Controls whether the delta-M scaling is applied to the calculation. Defaults to False.
"""
self._config.delta_m_scaling = value
@property
def los_refraction(self) -> bool:
"""
Controls whether or not refraction is enabled for the observer line of sight rays. Requires
the refractive index to be set in the Geometry object for refraction to work. Defaults to False.
"""
return self._config.los_refraction
@los_refraction.setter
def los_refraction(self, value: bool):
"""
Controls whether or not refraction is enabled for the observer line of sight rays. Requires
the refractive index to be set in the Geometry object for refraction to work. Defaults to False.
"""
self._config.los_refraction = value
@property
def solar_refraction(self) -> bool:
"""
Controls whether or not refraction is enabled for the solar rays. Requires
the refractive index to be set in the Geometry object for refraction to work. Defaults to False.
"""
return self._config.solar_refraction
@solar_refraction.setter
def solar_refraction(self, value: bool):
"""
Controls whether or not refraction is enabled for the solar rays. Requires
the refractive index to be set in the Geometry object for refraction to work. Defaults to False.
"""
self._config.solar_refraction = value
@property
def output_los_optical_depth(self) -> bool:
"""
If True, then the output from a calculate_radiance call will also contain an "optical_depth" variable
with dimensions ["los", "wavelength"] that is the optical depth for each line of sight.
"""
return self._config.output_los_optical_depth
@output_los_optical_depth.setter
def output_los_optical_depth(self, value: bool):
"""
If True, then the output from a calculate_radiance call will also contain an "optical_depth" variable
with dimensions ["los", "wavelength"] that is the optical depth for each line of sight.
"""
self._config.output_los_optical_depth = value
@property
def multiple_scatter_refraction(self) -> bool:
"""
Controls whether or not refraction is enabled for the solar line of sight rays. Requires
the refractive index to be set in the Geometry object for refraction to work. Only has an effect
when the single scatter source term is set to Table. Defaults to False.
"""
return self._config.multiple_scatter_refraction
@multiple_scatter_refraction.setter
def multiple_scatter_refraction(self, value: bool):
"""
Controls whether or not refraction is enabled for the solar line of sight rays. Requires
the refractive index to be set in the Geometry object for refraction to work. Only has an effect
when the single scatter source term is set to Table. Defaults to False.
"""
self._config.multiple_scatter_refraction = value
@property
def num_sza(self) -> int:
"""
The number of solar zenith angle discretizations to use when calculating the multiple scatter source.
For the discrete ordinates source, this determines the number of independent discrete ordinates calculations to perform.
In the successive orders of scattering source, this is directly the number of discretizations.
Defaults to 1, indicating that the multiple scatter source is estimated only at the reference point.
"""
return self._config.num_sza
@num_sza.setter
def num_sza(self, value: int):
"""
The number of solar zenith angle discretizations to use when calculating the multiple scatter source.
For the discrete ordinates source, this determines the number of independent discrete ordinates calculations to perform.
In the successive orders of scattering source, this is directly the number of discretizations.
Defaults to 1, indicating that the multiple scatter source is estimated only at the reference point.
"""
self._config.num_sza = value
@property
def num_successive_orders_iterations(self) -> int:
"""
The number of iterations to perform when using the successive orders of scattering multiple scatter
source.
"""
return self._config.num_successive_orders_iterations
@num_successive_orders_iterations.setter
def num_successive_orders_iterations(self, value: int):
"""
The number of iterations to perform when using the successive orders of scattering multiple scatter
source.
"""
self._config.num_successive_orders_iterations = value
@property
def init_successive_orders_with_discrete_ordinates(self) -> bool:
"""
If set to true, when using the successive orders source, it will be initialized with a source calculated with
the discrete ordinates source instead of a single scattering source. This greatly reduces the number
of iterations required for the method, as well as provides a better weighting function approximation.
"""
return self._config.init_successive_orders_with_discrete_ordinates
@init_successive_orders_with_discrete_ordinates.setter
def init_successive_orders_with_discrete_ordinates(self, value: bool):
"""
If set to true, when using the successive orders source, it will be initialized with a source calculated with
the discrete ordinates source instead of a single scattering source. This greatly reduces the number
of iterations required for the method, as well as provides a better weighting function approximation.
"""
self._config.init_successive_orders_with_discrete_ordinates = value
@property
def num_streams(self) -> int:
"""
The number of streams to use in the discrete ordinates method. This is the number of streams
in full space, i.e. each hemisphere has num_streams / 2 angular discretizations. Must
be an even number. Default to 16.
"""
return self._config.num_streams
@num_streams.setter
def num_streams(self, value: int):
"""
The number of streams to use in the discrete ordinates method. This is the number of streams
in full space, i.e. each hemisphere has num_streams / 2 angular discretizations. Must
be an even number. Default to 16.
"""
self._config.num_streams = value
@property
def num_forced_azimuth(self) -> int:
"""
If set to a value greater than 0, the discrete ordinates method will use this number of azimuth terms independent of convergence.
Defaults to -1, which means to use the number of azimuth terms required for convergence.
"""
return self._config.num_forced_azimuth
@num_forced_azimuth.setter
def num_forced_azimuth(self, value: int):
"""
If set to a value greater than 0, the discrete ordinates method will use this number of azimuth terms independent of convergence.
Defaults to -1, which means to use the number of azimuth terms required for convergence.
"""
self._config.num_forced_azimuth = value
@property
def do_backprop(self) -> bool:
"""
Enables backpropagation for the weighting functions when using the DO source in plane parallel or pseudo-spherical geometry.
Can greatly improve the computation speed of the calculation when the number of lines of sight is small. Default to True
"""
return self._config.do_backprop
@do_backprop.setter
def do_backprop(self, value: bool):
"""
Enables backpropagation for the weighting functions when using the DO source in plane parallel or pseudo-spherical geometry.
Can greatly improve the computation speed of the calculation when the number of lines of sight is small. Default to True
"""
self._config.do_backprop = value
@property
def num_successive_order_points(self) -> int:
"""
The number of incoming points to use in the successive orders calculation for each solar
zenith angle. Must be equal to or less than the number of atmosphere altitude grid points.
Default is -1 which means to use every altitude grid point.
"""
return self._config.num_successive_order_points
@num_successive_order_points.setter
def num_successive_order_points(self, value: int):
"""
The number of incoming points to use in the successive orders calculation for each solar
zenith angle. Must be equal to or less than the number of atmosphere altitude grid points.
Default is -1 which means to use every altitude grid point.
"""
self._config.num_successive_order_points = value
@property
def num_singlescatter_moments(self) -> int:
"""
The number of Legendre expansion moments to use in the single scatter calculation.
Must be greater or equal to num_streams. Default to 16.
"""
return self._config.num_singlescatter_moments
@num_singlescatter_moments.setter
def num_singlescatter_moments(self, value: int):
"""
The number of Legendre expansion moments to use in the single scatter calculation.
Must be greater or equal to num_streams. Default to 16.
"""
self._config.num_singlescatter_moments = value
@property
def num_successive_orders_incoming(self) -> int:
"""
The number of integration nodes to use in the successive orders algorithm when calculating the incoming
radiance at each grid point. Must be one of [6, 14, 26, 38, 50, 74, 86, 110, 146, 170, 194, 230, 266, 302, 350,
434, 590, 770, 974, 1202, 1454, 1730, 2030, 2354, 2702, 3074, 3470, 3890]. Default is 110.
"""
return self._config.num_successive_orders_incoming
@num_successive_orders_incoming.setter
def num_successive_orders_incoming(self, value: int):
"""
The number of integration nodes to use in the successive orders algorithm when calculating the incoming
radiance at each grid point. Must be one of [6, 14, 26, 38, 50, 74, 86, 110, 146, 170, 194, 230, 266, 302, 350,
434, 590, 770, 974, 1202, 1454, 1730, 2030, 2354, 2702, 3074, 3470, 3890]. Default is 110.
"""
self._config.num_successive_orders_incoming = value
@property
def num_successive_orders_outgoing(self) -> int:
"""
The number of sample points to use in the successive orders algorithm to calculate the outgoing source function on
radiance at each grid point. Must be one of [6, 14, 26, 38, 50, 74, 86, 110, 146, 170, 194, 230, 266, 302, 350,
434, 590, 770, 974, 1202, 1454, 1730, 2030, 2354, 2702, 3074, 3470, 3890]. Default is 110.
"""
return self._config.num_successive_orders_outgoing
@num_successive_orders_outgoing.setter
def num_successive_orders_outgoing(self, value: int):
"""
The number of sample points to use in the successive orders algorithm to calculate the outgoing source function on
radiance at each grid point. Must be one of [6, 14, 26, 38, 50, 74, 86, 110, 146, 170, 194, 230, 266, 302, 350,
434, 590, 770, 974, 1202, 1454, 1730, 2030, 2354, 2702, 3074, 3470, 3890]. Default is 110.
"""
self._config.num_successive_orders_outgoing = value
@property
def threading_lib(self) -> ThreadingLib:
"""
Sets the threading library to use in the calculation. Default is ThreadingLib.Rayon.
"""
return self._config.threading_lib
@threading_lib.setter
def threading_lib(self, value: ThreadingLib):
"""
Sets the threading library to use in the calculation. Default is ThreadingLib.Rayon.
"""
self._config.threading_lib = value
@property
def log_level(self) -> LogLevel:
"""
Controls the level of logging output from the spdlog library.
`sasktran2.LogLevel.Trace`
Most verbose logging level, includes all messages
`sasktran2.LogLevel.Debug`
Debug information for development
`sasktran2.LogLevel.Info`
General informational messages
`sasktran2.LogLevel.Warn` (Default)
Warning messages only
`sasktran2.LogLevel.Error`
Error messages only
`sasktran2.LogLevel.Critical`
Only critical errors
`sasktran2.LogLevel.Off`
Disables all logging output
"""
return self._config.log_level
@log_level.setter
def log_level(self, value: LogLevel):
"""
Controls the level of logging output from the spdlog library.
`sasktran2.LogLevel.Trace`
Most verbose logging level, includes all messages
`sasktran2.LogLevel.Debug`
Debug information for development
`sasktran2.LogLevel.Info`
General informational messages
`sasktran2.LogLevel.Warn` (Default)
Warning messages only
`sasktran2.LogLevel.Error`
Error messages only
`sasktran2.LogLevel.Critical`
Only critical errors
`sasktran2.LogLevel.Off`
Disables all logging output
"""
self._config.log_level = value
@property
def spectral_grid_mode(self) -> SpectralGridMode:
"""
Sets the spectral grid mode to use in the calculation.
`sasktran2.SpectralGridMode.Monochromatic` (Default)
Each wavelength grid point represents a delta function sampling of the spectrum.
`sasktran2.SpectralGridMode.AtmosphereIntegratedLineShape`
Each wavelength grid point represents an integrated line shape over the atmosphere.
`sasktran2.SpectralGridMode.EngineIntegratedLineShape`
Each wavelength grid point represents an integrated line shape over the radiative transfer engine.
"""
return self._config.spectral_grid_mode
@spectral_grid_mode.setter
def spectral_grid_mode(self, mode: SpectralGridMode):
"""
Sets the spectral grid mode to use in the calculation.
`sasktran2.SpectralGridMode.Monochromatic` (Default)
Each wavelength grid point represents a delta function sampling of the spectrum.
`sasktran2.SpectralGridMode.AtmosphereIntegratedLineShape`
Each wavelength grid point represents an integrated line shape over the atmosphere.
`sasktran2.SpectralGridMode.EngineIntegratedLineShape`
Each wavelength grid point represents an integrated line shape over the radiative transfer engine.
"""
self._config.spectral_grid_mode = mode
@property
def flux_types(self):
return self._config.flux_types
@flux_types.setter
def flux_types(self, flux_types: list[FluxType]):
"""
Sets the flux types to calculate. By default, Upwelling and Downwelling fluxes are calculated.
`sasktran2.FluxType.Upwelling`
Calculate the upwelling flux at each grid point
`sasktran2.FluxType.Downwelling`
Calculate the downwelling flux at each grid point
`sasktran2.FluxType.Actinic`
Calculate the actinic flux at each grid point
`sasktran2.FluxType.Divergence`
Calculate the flux divergence at each grid point
"""
self._config.flux_types = flux_types