Forward Models#

Choosing a BRDF Model#

You can import specific BRDF models directly::

from pydirectional import RPVBRDF model = RPVBRDF(*args, **kwargs)

Or you can access them via the BRDF model factory class:

from pydirectional import BRDFModelFactory
model = BRDFModelFactory('RPV', *args, **kwargs)

Instantiating a BRDF Model#

When you instantiate a BRDF model using either of the methods outlined in Choosing a BRDF Model, the required arguments are:

  • vza

  • sza

  • vaa and saa OR raa

The angle inputs must all have the same shape, for example if you want to return quantities for multiple viewing angles and the same solar angle, use sza = sza_value * np.ones_like(vza) to create a sza array of the same shape as the vza.

If you want to calculate HCRF or other values that require the direct to diffuse ratio, then direct_to_diffuse_irr must be set to a value.

Models are instantiated using the geometry of the scenario:

model = RTLSBRDF(vza = 20,
                 sza = 30
                 vaa = 210,
                 saa = 50,
                 direct_to_diffuse_irr = 0.5)

Models can be instantiated for arrays of angles, but these must be the same size:

vza_array = np.linspace(0, 10, 9)
raa_array = np.linspace(0, 360, 18)
vza_mesh, raa_mesh = np.meshgrid(vza_array, raa_array)
model = RTLSBRDF(vza = vza_mesh,
                 sza = 30 * np.ones_like(vza_mesh),
                 raa = raa_mesh)

Note

The default angle unit is set as “degrees”, if your inputs are in radians, set angle_unit = "radians".

Finetuning Models#

Some models take further parameters that can be used to finetune the model. For example the \(HB\) and \(BR\) parameters in the RTLS model. More information can be found in the class documentation of each model. Functionality also exists to use different kernel types, for example Li-Dense and Ross-Thin, similarly information can be found in the class documentation.

Calculating Quantities#

All the quantities defined in the Theory section can be calulated for each BRDF model.

The quantities and corresponding functions are:

  • BRF - model.return_BRF(*args)

  • HCRF - model.return_HCRF(*args)

  • Black-Sky Albedo (or DHR) - model.return_black_sky_albedo(*args)

  • White-Sky Albedo (or BHR) - model.return_white_sky_albedo(*args)

  • Blue-Sky Albedo - model.return_blue_sky_albedo(*args)

Note

BRDF cannot be directly calculated, if this is required calculate BRF then use the equation from the Theory section (\(BRDF = \frac{BRF}{\pi}\)).

Note

To calculate HDRF, use return_HCRF. This is valid if HDRF if constant over the sensor’s field of view (FOV), hence this assumption is also valid for small sensor FOV.

The arguments for all of the functions used to calculate quantities are the parameters for the chosen BRDF model. If the parameter names are not known they can be retrieved using model.get_coefficient_names().

The following example uses the RPV model to calculate BRF and HCRF:

model = RPVBRDF(vza = 20,
                 sza = 30
                 vaa = 210,
                 saa = 50,
                 direct_to_diffuse_irr = 0.5)

BRF = model.return_BRF(rho_0 = 0.3,
                       k = 0.4
                       theta = 0.8
                       rho_c = 0.2)

HCRF = model.return_HCRF(rho_0 = 0.3,
                         k = 0.4
                         theta = 0.8
                         rho_c = 0.2)

All quantities except BRF are calculated by integrating over the viewing and/or solar hemispheres. To speed up this process look-up tables (LUTs) of the results of these integrations have been created; the default processing within the return_QUANTITY functions is to use these LUTs with the use_fast keyword argument set to True. Manual integrations can be performed by setting use_fast = False however note this will increase processing time. HCRF and black-sky albedo LUTs are accurate to within 1% of manual integration, while white-sky and blue-sky albedo LUTs (where multiple integrations take place) are accurate to within 1.5%.

Averaging Quantities#

Averages of BRF or HCRF over a given sensor field of view (up to the whole hemisphere) can be calculated.

The average BRF over the whole viewing or solar hemispheres is caluclated using model.average_BRF_hemispherical. The average BRF or HCRF over a given sensor field of view is calculated using model.average_BRF_FOV and model.average_HCRF_FOV, respectively.

The hemisphere over which the integrations are performed is set using the integrating_hemisphere function input, this must be 'solar' or 'viewing' and the angular grid step is set in degrees using grid_step:

average_solar_BRF = model.average_BRF_hemispherical(rho_0 = 0.3,
                                     k = 0.4
                                     theta = 0.8
                                     rho_c = 0.2,
                                     integrating_hemisphere = "solar"
                                     )

For the FOV functions, the zenith and azimuthal ranges are set using min_vza, max_vza, min_raa, and max_raa regardless of integrating hemisphere. The angular response function can also be set by providing a Python function (with vza and raa as inputs in degrees) as the angular_response input:

def angular_response_function(vza, raa):
    return np.abs(np.cos(np.radians(vza))*np.sin(np.radians(raa)))

averaged_BRF = model.average_BRF_FOV(rho_0 = 0.3,
                                     k = 0.4
                                     theta = 0.8
                                     rho_c = 0.2
                                     min_vza = 0,
                                     max_vza = 10,
                                     grid_step = 1,
                                     angular_response = angular_response_function
                                     )

Note

Any angular response function must return positive values.