Solvers
Defined in DisortSolver.hpp and FluxSolver.hpp.
DisortSolver
The general-purpose discrete ordinates radiative transfer solver. Supports full intensity calculations, user-specified output angles, BRDF surfaces, thermal emission, and intensity corrections.
Defined in DisortSolver.hpp.
class DisortSolver {
public:
DisortSolver();
DisortResult solve(DisortConfig& config);
};
Constructor
- DisortSolver()
Default constructor. The solver is lightweight and allocates memory only during
solve().
solve
- DisortResult solve(DisortConfig& config)
Solve the radiative transfer problem.
- Parameters:
config – Input configuration. Note: the solver may modify the configuration to set automatic dimensions (e.g.,
num_phase_func_momentswhen using a named phase function).- Returns:
DisortResultcontaining fluxes, mean intensities, and (optionally) angular intensities.- Throws std::invalid_argument:
if the configuration is invalid.
- Throws std::runtime_error:
if a numerical problem occurs.
The solver internally performs:
Configuration validation and optional Delta-M(+) scaling.
Eigenvalue/eigenvector computation for each layer.
Boundary condition assembly and linear system solve.
Flux and (optionally) intensity computation at all output levels.
The solver object can be reused for multiple calls. Internal temporaries are re-allocated as needed.
DisortFluxSolver<NStr>
A performance-optimised flux-only solver with compile-time stream count.
Uses fixed-size Eigen matrices for the eigenvalue problem, yielding
30–50 % faster execution compared to DisortSolver in flux-only mode.
Defined in FluxSolver.hpp.
template<int NStr>
class DisortFluxSolver {
public:
static constexpr int NN = NStr / 2;
DisortFluxSolver();
FluxResult solve(const DisortFluxConfig& config);
};
Template parameter
NStr – the number of streams. Must be even and >= 4. The following
instantiations are provided:
DisortFluxSolver<4>DisortFluxSolver<6>DisortFluxSolver<8>DisortFluxSolver<10>DisortFluxSolver<12>DisortFluxSolver<14>DisortFluxSolver<16>DisortFluxSolver<32>DisortFluxSolver<64>
Constructor
- DisortFluxSolver()
Default constructor. Lightweight; no allocation until
solve()is called.
solve
- FluxResult solve(const DisortFluxConfig& config)
Solve for fluxes and mean intensities.
- Parameters:
config – Input configuration. Must have
config.num_streams == NStr. The configuration is not modified (taken by const reference).- Returns:
FluxResultwith fluxes at allnum_layers + 1level boundaries.- Throws std::invalid_argument:
if validation fails.
Limitations
Compared to DisortSolver, the flux solver does not support:
Angular intensity output.
User-specified output optical depths (output is always at all layer boundaries).
BRDF surface models (Lambertian only).
Intensity corrections (Nakajima-Tanaka, Buras-Emde).
Special boundary condition mode.
Usage example
#include "DisortFluxConfig.hpp"
#include "FluxSolver.hpp"
using namespace disortpp;
DisortFluxConfig cfg(6, 16);
cfg.direct_beam_flux = 3.14159;
cfg.direct_beam_mu = 0.5;
cfg.surface_albedo = 0.1;
cfg.allocate();
cfg.delta_tau = {0.1, 0.2, 0.5, 1.0, 2.0, 5.0};
cfg.single_scat_albedo = {0.9, 0.9, 0.9, 0.9, 0.9, 0.9};
cfg.setHenyeyGreenstein(0.8);
DisortFluxSolver<16> solver;
FluxResult result = solver.solve(cfg);
double flux_up_toa = result.flux_up[0];