radiative_transfer block
Top-level configuration for the RT solver — quadrature, polarization, truncation, and the projection-cap knobs introduced in v0.7. The full file at src/CoreRT/DefaultParameters.yaml shows a representative config; use this page to look up what each field does, what the defaults are, and which legacy aliases still work.
Required fields
spec_bands—Vector{String}. Each string is a Julia range expression in cm⁻¹, e.g."(1e7/777):0.015:(1e7/757)". Multiple bands run as a band-batched solve.surface—Vector{String}. One BRDF constructor per spectral band. SeeSchema/surface.mdfor the surface vocabulary (LambertianSurfaceScalar,CoxMunkSurface,rpvSurfaceScalar, etc.).polarization_type—String. One of"Stokes_I()","Stokes_IQ()","Stokes_IQU()","Stokes_IQUV()". Sets the Stokes vector dimension (1/2/3/4 channels respectively).Δ_angle—Real, optional (default0.0). Forward-peak exclusion angle in degrees, consumed byδBGEtruncation. Ignored whentruncation: NoTruncation()or whentruncation: autoresolves toNoTruncation(). Legacy YAMLs commonly set2.0to reproduce VLIDORT'sDO_DELTAM_SCALINGdefault — set explicitly when matching a benchmark that pins this value.depol—Real. Rayleigh depolarization factor (0 = no depolarization, the Natraj-2009 idealization).float_type—String."Float64"or"Float32". Float32 is fine for most retrievals and gives a ~2× speedup on large spectral windows; Float64 is required for reproducing published benchmarks at full precision.architecture—String."Architectures.CPU()","Architectures.GPU()", or"Architectures.MetalGPU()". The CUDA GPU path is loaded via thevSmartMOMCUDAExtweak-dependency extension (using CUDAactivates it).
Resolution knobs (Phase D — v0.7)
Pick one of the schemas below. The new nstreams knob is the recommended path; legacy max_m + l_trunc configs keep working.
New schema (recommended)
nstreams— optional, default8. Weighted streams per hemisphere, the primary user-facing resolution knob. Public contract:stream_l_cap = 2·nstreams - 1regardless ofquadrature_type. For VLIDORT users: this is the Julia equivalent of VLIDORT'sNSTREAMS.m_max— optional, defaultnull. Explicit Fourier loop bound (order). When set, clamps the trait-aggregator output belowstream_l_cap. Useful when you want to truncate the loop more aggressively than the per-component traits would.truncation— optional, defaultauto. Controls how the aerosol phase function is treated relative to the projection cap:"auto"(default): VLIDORT-DO_DELTAM_SCALING-style. With no aerosols, resolves toNoTruncation(). With aerosols, picksδBGE(stream_l_cap, Δ_angle)and the per-band Mie loop applies it only whenlength(greek.β) > stream_l_cap— short phase functions automatically fall back toNoTruncation()so the truncation step can never crash on a fits-the-cap series. Logs the choice via@info."NoTruncation()"ornull: exactly no transform. Coefficients abovestream_l_capare silently dropped from the Fourier projection (per Phase C trait clamps)."δBGE(L, Δ)": explicit δ-BGE-fit truncation (Sanghavi & Stephens 2015). Used for benchmark reproducibility when you want exact parity with a published numerical convention.
Legacy schema (still supported, deprecated v0.7)
max_m—Integer. Number of Fourier moments (count, loop runsm = 0:max_m-1). Triggers legacy parsing —nstreamswill be left unset and the oldmin(ceil((l_max+1)/2), max_m)aggregator semantics apply.l_trunc—Integer. Legendre cutoff. Plays the role ofstream_l_capunder the legacy schema.
Setting both nstreams and l_trunc produces a @warn — the legacy l_trunc is ignored and nstreams wins.
Other optional fields
quadrature_type— optional, default"GaussLegQuad()". The recommended default."RadauQuad()"is supported but documented as expert/legacy: it includes the SZA as a quadrature node (handy for DNI-on-node configurations) at the cost of being 5–50× less accurate per stream than Gauss-Legendre on Rayleigh-only setups (see the Natraj-2009 commitf9403eband the v0.7 release notes). Sanghavi's guidance: keep Radau as an option, but reach for Gauss by default.numerics— optional. Sub-block with rarely-touched solver knobs:dτ_max_threshold(default0.001) — doubling-step cap. Setsdτ_max = threshold · μ_minwhere μ_min is the smallest TRUE quadrature stream. Smaller → finer initial layers / more doublings; raising to ~0.01 reduces doublings.dτ_min_floor(default1024·eps(FT)) — absolute floor ondτ_max. ~1.2e-4for Float32 /2.3e-13for Float64. Prevents grazing-VZA configs from collapsing dτ below FT precision.blas_threads(defaultnull) — per-model BLAS thread cap.nullleavesBLAS.get_num_threads()alone; an integer pins it for the duration ofrt_run. See commit37390d2.verbose(defaultfalse) — whentrue,rt_runprints theTimerOutputstiming tree at the end of each call (useful for profiling, noisy in batched loops).
Example — minimal new schema
A new-schema config can omit nstreams (default 8), quadrature_type (default GaussLegQuad), and truncation (default auto). The leanest valid radiative_transfer block is:
radiative_transfer:
spec_bands:
- "[18867.92 18868.92]"
surface:
- LambertianSurfaceScalar(0.0)
polarization_type: Stokes_IQU()
Δ_angle: 2.0
depol: 0.0
float_type: Float64
architecture: Architectures.CPU()This expands to: nstreams = 8 (so stream_l_cap = 15), quadrature_type = GaussLegQuad(), truncation = auto. For a Rayleigh-only Lambertian scene this resolves to NoTruncation() and the Fourier loop runs m = 0:2 (Phase C trait dispatch).
Example — Cox-Munk ocean retrieval
radiative_transfer:
spec_bands: ["[18867 18870]"]
surface: ["CoxMunkSurface(wind_speed=5.0)"]
polarization_type: Stokes_IQU()
nstreams: 16 # 16 weighted streams ⇒ stream_l_cap = 31
truncation: auto # auto → δBGE(31, 2.0) once Mie aerosol is added
Δ_angle: 2.0
depol: 0.0
float_type: Float64
architecture: Architectures.CPU()See also
Schema/surface.md— BRDF vocabularySchema/aerosols.md— Mie size distribution + refractive indexSchema/sources.md—SolarBeam,SurfaceSIF,BlackbodySourcedocs/src/pages/conventions.md§6 —NstreamsvsNquaddistinctiondocs/dev_notes/fourier_stream_resolution_plan.md— design memo for the v0.7 schema migration