Quadriga-Lib
C++/MEX/Python Utility library for radio channel modelling and simulations
Python API Documentation for Quadriga-Lib v0.12.2


Notes

Overview
Array antenna functions

calc_beamwidthCalculate the beamwidth and pointing angles of array antenna elements in degrees
calc_directivityCalculates the directivity in dBi of array antenna elements
combine_patternCombine element patterns, positions, and coupling weights into effective radiation patterns
concatConcatenate two array antennas into a single one
copy_elementCreate copies of array antenna elements
export_obj_fileExport antenna pattern geometry to a Wavefront OBJ file for 3D visualization
generateGenerates predefined array antenna models
generate_speakerGenerate a parametric frequency-dependent loudspeaker directivity model
interpolateInterpolate polarimetric array antenna field patterns (single- and multi-frequency)
qdant_readReads array antenna data from QDANT files
qdant_writeWrites array antenna data to QDANT files
rotate_patternRotate antenna radiation patterns around the principal axes using Euler rotations

Channel functions

baseband_freq_responseCompute the baseband frequency response of a MIMO channel
channel_export_obj_fileExport propagation paths to a Wavefront OBJ file for 3D visualization
hdf5_create_fileCreate a new HDF5 channel file with a custom storage layout
hdf5_read_channelReads channel data from HDF5 files
hdf5_read_dsetRead a single unstructured dataset from an HDF5 file
hdf5_read_dset_namesRead the names of unstructured datasets from an HDF5 file
hdf5_read_layoutRead the storage layout of channel data inside an HDF5 file
hdf5_reshape_layoutReshapes the storage layout inside an existing HDF5 file
hdf5_write_channelWrite one or more channel objects to an HDF5 file
hdf5_write_dsetWrite a single unstructured dataset to an HDF5 file
qrt_file_parseRead metadata from a QRT file
qrt_file_readRead ray-tracing CIR data from a QRT file
quantize_delaysMap path delays to a fixed tap grid using two-tap power-weighted interpolation

Channel generation functions

get_channels_multifreqCompute channel coefficients for spherical waves across multiple frequencies
get_channels_planarCalculate MIMO channel coefficients for planar wave paths
get_channels_sphericalCalculate MIMO channel coefficients and delays for spherical wave propagation
get_ieee_indoorGenerate indoor MIMO channel realizations for IEEE TGn/TGac/TGax/TGah models

Channel statistics

acdfCalculate the empirical averaged cumulative distribution function (CDF)
calc_angular_spreadCalculate azimuth and elevation angular spreads with spherical wrapping
calc_cross_polarization_ratioCalculate the cross-polarization ratio (XPR) for linear and circular polarization bases
calc_delay_spreadCalculates RMS delay spread from per-CIR delays and linear-scale powers
calc_rician_k_factorCalculate the Rician K-Factor from channel impulse response data

Math functions

cart2geoConvert elementwise Cartesian coordinates to azimuth/elevation angles and vector length
geo2cartConvert elementwise azimuth/elevation angles to Cartesian coordinates

Miscellaneous / Tools

componentsReturns the version numbers of all quadriga-lib sub-components
versionReturns the quadriga-lib version number
write_pngWrite data to a PNG file

Site-specific simulation tools

calc_diffraction_gainCalculate diffraction gain for multiple TX-RX pairs using a 3D triangular mesh
cubeConstruct a triangulated cube mesh
icosphereConstruct a geodesic polyhedron from recursive icosahedron subdivision
mitsuba_xml_file_writeWrite a triangular mesh to a Mitsuba 3 XML scene file
obj_file_readRead a Wavefront `.obj` file and extract geometry, visual materials, and EM/acoustic materials
obj_file_writeWrite a Wavefront .obj file
planeConstruct a triangulated plane mesh
point_cloud_aabbCompute the axis-aligned bounding boxes (AABB) of a 3D point cloud
point_cloud_segmentationReorganize a point cloud into spatial sub-clouds for efficient processing
point_inside_meshTest whether 3D points are inside a triangle mesh using raycasting
ray_point_intersectCalculate intersections of ray beams with points in 3D space
ray_triangle_intersectCompute ray-triangle intersections in 3D using the Möller–Trumbore algorithm
triangle_mesh_aabbCalculate the axis-aligned bounding box (AABB) of a triangle mesh and its sub-meshes
triangle_mesh_segmentationReorganize a 3D triangular mesh into spatially clustered sub-meshes for faster processing




Array antenna functions



calc_beamwidth

Calculate the beamwidth and pointing angles of array antenna elements in degrees Usage:
bw_az, bw_el, az_pt, el_pt = quadriga_lib.arrayant.calc_beamwidth( arrayant )
bw_az, bw_el, az_pt, el_pt = quadriga_lib.arrayant.calc_beamwidth( arrayant, element, threshold_dB )
Inputs:
Outputs:
See also:


calc_directivity

Calculates the directivity in dBi of array antenna elements Usage:
directivity = quadriga_lib.arrayant.calc_directivity( arrayant )
directivity = quadriga_lib.arrayant.calc_directivity( arrayant, element )
Inputs:
Outputs:
See also:


combine_pattern

Combine element patterns, positions, and coupling weights into effective radiation patterns Usage:
# Single frequency
arrayant_out = quadriga_lib.arrayant.combine_pattern( arrayant )
arrayant_out = quadriga_lib.arrayant.combine_pattern( arrayant, freq, azimuth_grid, elevation_grid )

# Multiple frequencies (freq as a 1D array, or a frequency-dependent input antenna)
arrayant_out = quadriga_lib.arrayant.combine_pattern( arrayant, freq, azimuth_grid, elevation_grid )
Inputs:
Outputs:
See also:


concat

Concatenate two array antennas into a single one Usage:
arrayant_out = quadriga_lib.arrayant.concat( arrayant1, arrayant2 )
Inputs:
Outputs:


copy_element

Create copies of array antenna elements Usage:
# Copy element 0 to position 1
arrayant_out = quadriga_lib.arrayant.copy_element( arrayant, 0, 1 )

# Copy element 0 to several positions
arrayant_out = quadriga_lib.arrayant.copy_element( arrayant, 0, [2, 3] )

# Pairwise copy — source_element and dest_element must have equal length
arrayant_out = quadriga_lib.arrayant.copy_element( arrayant, [0, 1], [2, 3] )
Inputs:
Outputs:


export_obj_file

Export antenna pattern geometry to a Wavefront OBJ file for 3D visualization Usage:
quadriga_lib.arrayant.export_obj_file( fn, arrayant, directivity_range, colormap, object_radius, \
    icosphere_n_div, element, freq_ind )
Inputs:


generate

Generates predefined array antenna models Usage:
# Simple antennas (v-pol)
ant = quadriga_lib.arrayant.generate('omni')
ant = quadriga_lib.arrayant.generate('dipole')
ant = quadriga_lib.arrayant.generate('half-wave-dipole')

# Cross-polarized isotropic
ant = quadriga_lib.arrayant.generate('xpol')

# Custom 3dB beamwidth
ant = quadriga_lib.arrayant.generate('custom', az_3dB=90.0, el_3dB=90.0, rear_gain_lin=0.0)

# Uniform linear array
ant = quadriga_lib.arrayant.generate('ula', N=4, freq=2.4e9, spacing=0.7, pol=1)

# 3GPP-NR array (default 3GPP element pattern)
ant = quadriga_lib.arrayant.generate('3gpp', M=2, N=2, freq=3.7e9, pol=1, spacing=0.7)

# 3GPP-NR array with custom per-element pattern dict
ant = quadriga_lib.arrayant.generate('3gpp', M=2, N=2, freq=3.7e9, pol=1, pattern=my_pattern)

# Multi-beam M×N array
ant = quadriga_lib.arrayant.generate('multibeam', M=6, N=6, freq=3.7e9, pol=1, \
    beam_az=[-30.0, 30.0], beam_el=[0.0, 0.0], separate_beams=False)
Inputs (common):
Inputs (custom, 3gpp, multibeam):
Inputs (ula, 3gpp, multibeam):
Inputs (3gpp only):
Inputs (ula, 3gpp):
Inputs (multibeam only):
Outputs:


generate_speaker

Generate a parametric frequency-dependent loudspeaker directivity model Usage:
# Default piston driver (4-inch, 80 Hz – 12 kHz)
speaker = quadriga_lib.arrayant.generate_speaker()

# Horn tweeter with custom coverage
speaker = quadriga_lib.arrayant.generate_speaker(driver_type='horn', radius=0.025, \
    lower_cutoff=1500.0, upper_cutoff=20000.0, hor_coverage=90.0, ver_coverage=60.0)

# Omnidirectional subwoofer with steep rolloff
speaker = quadriga_lib.arrayant.generate_speaker(driver_type='omni', radius=0.165, \
    lower_cutoff=30.0, upper_cutoff=300.0, lower_rolloff_slope=24.0, upper_rolloff_slope=24.0, \
    sensitivity=90.0, radiation_type='monopole')

# Piston driver at specific frequencies
speaker = quadriga_lib.arrayant.generate_speaker( frequencies=np.array([100.0, 500.0, 1000.0, 5000.0, 10000.0]), \
    angular_resolution=5.0)
Inputs:
Outputs:


interpolate

Interpolate polarimetric array antenna field patterns (single- and multi-frequency) Usage:
# Single-frequency, separate real / imaginary parts
vr, vi, hr, hi = quadriga_lib.arrayant.interpolate( arrayant, azimuth, elevation )

# Complex-valued output
v, h = quadriga_lib.arrayant.interpolate( arrayant, azimuth, elevation, complex=True )

# Projected distance / local angles (single-frequency only)
vr, vi, hr, hi, dist = quadriga_lib.arrayant.interpolate( arrayant, azimuth, elevation, dist=True )
vr, vi, hr, hi, azimuth_loc, elevation_loc, gamma = quadriga_lib.arrayant.interpolate( arrayant, azimuth, \
    elevation, orientation=ori, local_angles=True )

# Element selection, orientation, element positions
vr, vi, hr, hi = quadriga_lib.arrayant.interpolate( arrayant, azimuth, elevation, element, orientation, element_pos )

# Multi-frequency interpolation — output gains a frequency axis
vr, vi, hr, hi = quadriga_lib.arrayant.interpolate( arrayant, azimuth, elevation, frequency=freqs )
Inputs:
Outputs:
Returned as a tuple; its length depends on complex, dist, and local_angles. See also:


qdant_read

Reads array antenna data from QDANT files Usage:
# Read a single entry (default: the first entry)
data = quadriga_lib.arrayant.qdant_read( fn )
data = quadriga_lib.arrayant.qdant_read( fn, id )

# Read every entry as a frequency-dependent arrayant
data = quadriga_lib.arrayant.qdant_read( fn, id=0 )
Inputs:
Outputs:
See also:


qdant_write

Writes array antenna data to QDANT files Usage:
# Single-frequency write
id_in_file = quadriga_lib.arrayant.qdant_write( fn, arrayant )
id_in_file = quadriga_lib.arrayant.qdant_write( fn, arrayant, id )

# Frequency-dependent write (4D patterns) — all entries written sequentially
arrayant.quadriga_lib.qdant_write( fn, arrayant )
Inputs:
Outputs:
See also:


rotate_pattern

Rotate antenna radiation patterns around the principal axes using Euler rotations Usage:
# Rotate all elements by 45 deg bank
arrayant_out = quadriga_lib.arrayant.rotate_pattern( arrayant, x_deg=45.0 )

# Rotate only elements 0 and 1 by 90 deg heading
arrayant_out = quadriga_lib.arrayant.rotate_pattern( arrayant, z_deg=90.0, element=[0, 1] )

# Frequency-dependent input (4D patterns) — same interface
arrayant_out = quadriga_lib.arrayant.rotate_pattern( arrayant, y_deg=10.0 )
Inputs:
Outputs:



Channel functions



baseband_freq_response

Compute the baseband frequency response of a MIMO channel Usage:
# Single-freq, bandwidth + evenly spaced carriers
hmat = quadriga_lib.channel.baseband_freq_response( coeff=coeff, delay=delay, bandwidth=100e6, carriers=128 )

# Single-freq, absolute frequencies
hmat = quadriga_lib.channel.baseband_freq_response( coeff=coeff, delay=delay, freq_in=freq_in, freq_out=freq_out )

# Multi-freq, split real / imaginary parts
hmat = quadriga_lib.channel.baseband_freq_response( coeff_re=cre, coeff_im=cim, delay=delay, freq_in=freq_in, freq_out=freq_out )
Inputs:
Outputs:
See also:


channel_export_obj_file

Export propagation paths to a Wavefront OBJ file for 3D visualization Usage:
quadriga_lib.channel.channel_export_obj_file( fn, max_no_paths, gain_max, gain_min, colormap, radius_max, radius_min, \
    n_edges, rx_pos, tx_pos, no_interact, interact_coord, center_freq, coeff, coeff_re, coeff_im, i_snap )
Inputs:
Outputs:


hdf5_create_file

Create a new HDF5 channel file with a custom storage layout Usage:
storage_space = quadriga_lib.channel.hdf5_create_file( fn, nx, ny, nz, nw )
Inputs:
Outputs:
See also:


hdf5_read_channel

Reads channel data from HDF5 files Usage:
chan, par = quadriga_lib.channel.hdf5_read_channel( fn, ix, iy, iz, iw, snap, stack )
Inputs:
Outputs:
See also:


hdf5_read_dset

Read a single unstructured dataset from an HDF5 file Usage:
dset = quadriga_lib.channel.hdf5_read_dset( fn, ix, iy, iz, iw, name )
Inputs:
Outputs:
See also:


hdf5_read_dset_names

Read the names of unstructured datasets from an HDF5 file Usage:
names = quadriga_lib.channel.hdf5_read_dset_names( fn, ix, iy, iz, iw )
Inputs:
Outputs:
See also:


hdf5_read_layout

Read the storage layout of channel data inside an HDF5 file Usage:
storage_dims, has_data = quadriga_lib.channel.hdf5_read_layout( fn )
Inputs:
Outputs:
See also:


hdf5_reshape_layout

Reshapes the storage layout inside an existing HDF5 file Usage:
quadriga_lib.channel.hdf5_reshape_layout( fn, nx, ny, nz, nw )
Inputs:


hdf5_write_channel

Write one or more channel objects to an HDF5 file Usage:
storage_dims = quadriga_lib.channel.hdf5_write_channel( fn, chan, par, ix, iy, iz, iw )
Inputs:
Outputs:
See also:


hdf5_write_dset

Write a single unstructured dataset to an HDF5 file Usage:
quadriga_lib.channel.hdf5_write_dset( fn, ix, iy, iz, iw, name, data )
Input Arguments:
See also:


qrt_file_parse

Read metadata from a QRT file Usage:
no_cir, no_orig, no_dest, no_freq, cir_offset, orig_names, dest_names, version, center_freq, \
    cir_pos, cir_orientation, orig_pos, orig_orientation = quadriga_lib.channel.qrt_file_parse( fn )
Inputs:
Outputs:


qrt_file_read

Read ray-tracing CIR data from a QRT file Usage:
center_freq, tx_pos, tx_orientation, rx_pos, rx_orientation, fbs_pos, lbs_pos, path_gain, path_length, M, aod, eod, aoa, eoa, \
    path_coord, no_int, coord, interact_type = quadriga_lib.channel.qrt_file_read( fn, cir, orig, downlink, normalize_M )
Inputs:
Outputs:
See also:


quantize_delays

Map path delays to a fixed tap grid using two-tap power-weighted interpolation Usage:
# Split real / imaginary output
coeff_re_q, coeff_im_q, delay_q = quadriga_lib.channel.quantize_delays( coeff_re, coeff_im, delay )

# Complex input and / or output (keyword)
coeff_q, delay_q = quadriga_lib.channel.quantize_delays( coeff=coeff, delay=delay, complex=True )
Inputs:
Outputs:



Channel generation functions



get_channels_multifreq

Compute channel coefficients for spherical waves across multiple frequencies Usage:
coeff_re, coeff_im, delay = quadriga_lib.arrayant.get_channels_multifreq( ant_tx, ant_rx, fbs_pos, \
    lbs_pos, path_gain, path_length, M, tx_pos, tx_orientation, rx_pos, rx_orientation, freq_in, \
    freq_out, use_absolute_delays, add_fake_los_path, propagation_speed )

coeff, delay = quadriga_lib.arrayant.get_channels_multifreq( ..., complex=True )
Inputs:
Outputs:
See also:


get_channels_planar

Calculate MIMO channel coefficients for planar wave paths Usage:
coeff_re, coeff_im, delays, rx_Doppler = quadriga_lib.arrayant.get_channels_planar( ant_tx, ant_rx, \
    aod, eod, aoa, eoa, path_gain, path_length, M, tx_pos, tx_orientation, rx_pos, rx_orientation, \
    center_freq, use_absolute_delays, add_fake_los_path )

coeff, delays, rx_Doppler = quadriga_lib.arrayant.get_channels_planar( ..., complex=True )

coeff_re, coeff_im, delays, rx_Doppler = quadriga_lib.arrayant.get_channels_planar( ..., freq=1 )
Inputs:
Outputs:
See also:


get_channels_spherical

Calculate MIMO channel coefficients and delays for spherical wave propagation Batch mode:
Usage:
coeff_re, coeff_im, delays = quadriga_lib.arrayant.get_channels_spherical( ant_tx, ant_rx, \
    fbs_pos, lbs_pos, path_gain, path_length, M, tx_pos, tx_orientation, rx_pos, rx_orientation, \
    center_freq, use_absolute_delays, add_fake_los_path )

coeff, delays = quadriga_lib.arrayant.get_channels_spherical( ..., complex=True )

coeff_re, coeff_im, delays, aod, eod, aoa, eoa = quadriga_lib.arrayant.get_channels_spherical( ..., angles=True )

coeff_re, coeff_im, delays = quadriga_lib.arrayant.get_channels_spherical( ..., freq=1 )
Inputs:
Outputs:
See also:


get_ieee_indoor

Generate indoor MIMO channel realizations for IEEE TGn/TGac/TGax/TGah models Usage:
chan = quadriga_lib.channel.get_ieee_indoor( ap_array, sta_array, ChannelType, CarrierFreq_Hz, \
   tap_spacing_s, n_users, observation_time, update_rate, speed_station_kmh, speed_env_kmh, \
   Dist_m, n_floors, uplink, offset_angles, n_subpath, Doppler_effect, seed, \
   KF_linear, XPR_NLOS_linear, SF_std_dB_LOS, SF_std_dB_NLOS, dBP_m, n_walls, wall_loss, stack )
Inputs:
Output:
See also:


Channel statistics



acdf

Calculate the empirical averaged cumulative distribution function (CDF) Usage:
cdf_per_set, bins_out, cdf_avg, mu, sig = quadriga_lib.tools.acdf( data, bins, n_bins )
Inputs:
Outputs:


calc_angular_spread

Calculate azimuth and elevation angular spreads with spherical wrapping Usage:
azimuth_spread, elevation_spread, orientation, phi, theta = \
    quadriga_lib.tools.calc_angular_spread( az, el, powers, wrapping, calc_bank_angle, quantize )
Inputs:
Outputs:


calc_cross_polarization_ratio

Calculate the cross-polarization ratio (XPR) for linear and circular polarization bases Usage:
xpr, pg = quadriga_lib.tools.calc_cross_polarization_ratio( powers, M, path_length, tx_pos, rx_pos, \
    include_los, window_size )
Inputs:
Outputs:


calc_delay_spread

Calculates RMS delay spread from per-CIR delays and linear-scale powers Usage:
ds, mean_delay = quadriga_lib.tools.calc_delay_spread( delays, powers, threshold, granularity )
Inputs:
Outputs:


calc_rician_k_factor

Calculate the Rician K-Factor from channel impulse response data Usage:
kf, pg = quadriga_lib.tools.calc_rician_k_factor( powers, path_length, tx_pos, rx_pos, window_size )
Inputs:
Outputs:



Math functions



cart2geo

Convert elementwise Cartesian coordinates to azimuth/elevation angles and vector length Usage:
geo_coords     = quadriga_lib.tools.cart2geo( cart, y, z, combine, use_kernel )
az, el, length = quadriga_lib.tools.cart2geo( cart, y, z, combine=False )
Inputs:
Outputs:


geo2cart

Convert elementwise azimuth/elevation angles to Cartesian coordinates Usage:
cart    = quadriga_lib.tools.geo2cart( az, el, len, combine, use_kernel )
x, y, z = quadriga_lib.tools.geo2cart( az, el, len, combine=False )
Inputs:
Outputs:



Miscellaneous / Tools



components

Returns the version numbers of all quadriga-lib sub-components

Usage:
components = quadriga_lib.components()


version

Returns the quadriga-lib version number

Usage:
version = quadriga_lib.version();
Caveat:


write_png

Write data to a PNG file

Description:
Declaration:
import quadriga_lib

quadriga_lib.tools.write_png( fn, data, colormap, min_val, max_val, log_transform )
Arguments:



Site-specific simulation tools



calc_diffraction_gain

Calculate diffraction gain for multiple TX-RX pairs using a 3D triangular mesh Usage:
# Output as tuple
data = quadriga_lib.RTtools.calc_diffraction_gain( orig, dest, mesh, mtl_ind, mtl_prop, \
    center_frequency, lod, verbose, sub_mesh_index, use_kernel, gpu_id, scalar_mode, thin_slab_threshold )

# Unpacked outputs
gain, xprmat, coord = quadriga_lib.RTtools.calc_diffraction_gain( orig, dest, mesh, mtl_ind, mtl_prop, \
    center_frequency, lod, verbose, sub_mesh_index, use_kernel, gpu_id, scalar_mode, thin_slab_threshold )
Inputs:
Outputs:
See also:


cube

Construct a triangulated cube mesh Usage:
mesh = quadriga_lib.RTtools.cube( scale, rotation, location, n_div )
Inputs:
Outputs:


icosphere

Construct a geodesic polyhedron from recursive icosahedron subdivision Usage:
# Output as tuple
data = quadriga_lib.RTtools.icosphere( no_div, radius, direction_xyz )

# Unpacked outputs
center, length, vert, direction = quadriga_lib.RTtools.icosphere( no_div, radius, direction_xyz )
Inputs:
Outputs:


mitsuba_xml_file_write

Write a triangular mesh to a Mitsuba 3 XML scene file Usage:
quadriga_lib.RTtools.mitsuba_xml_file_write( fn, vert_list, face_ind, obj_ind, mtl_ind, obj_names, mtl_names, bsdf, map_to_itu )
Input Arguments:
See also:


obj_file_read

Read a Wavefront `.obj` file and extract geometry, visual materials, and EM/acoustic materials Usage:
mesh, vert_list, face_ind, obj_ind, obj_names, mtl_ind, mtl_names, bsdf, csv_ind, csv_names, csv_prop = \
    quadriga_lib.RTtools.obj_file_read( fn, fn_csv, csv_strict )
Inputs:
Outputs:
See also:


obj_file_write

Write a Wavefront .obj file Usage:
vert_list_out, face_ind_out = quadriga_lib.RTtools.obj_file_write( fn, mesh, obj_ind, mtl_ind, obj_names, \
    mtl_names, vert_list, face_ind, bsdf, threshold, csv_ind, csv_names, csv_prop, csv_write_defaults, \
    split_loose_parts )
Inputs:
Outputs:
See also:


plane

Construct a triangulated plane mesh Usage:
mesh = quadriga_lib.RTtools.plane( scale, rotation, location, n_div )
Inputs:
Outputs:


point_cloud_aabb

Compute the axis-aligned bounding boxes (AABB) of a 3D point cloud Usage:
aabb = quadriga_lib.RTtools.point_cloud_aabb( points, sub_cloud_ind, vec_size )
Input Arguments:
Output Argument:
See also:


point_cloud_segmentation

Reorganize a point cloud into spatial sub-clouds for efficient processing Usage:
# Output as tuple
data = quadriga_lib.RTtools.point_cloud_segmentation( points, target_size, vec_size )

# Unpacked outputs
points_out, sub_cloud_ind, forward_ind, reverse_ind = \
    quadriga_lib.RTtools.point_cloud_segmentation( points, target_size, vec_size )
Inputs:
Outputs:


point_inside_mesh

Test whether 3D points are inside a triangle mesh using raycasting Usage:
result = quadriga_lib.RTtools.point_inside_mesh( points, mesh, obj_ind, distance )
Input Arguments:
Output Arguments:
See also:

ray_point_intersect

Calculate intersections of ray beams with points in 3D space Usage:
hit_count, hit_index, hit_offset = quadriga_lib.RTtools.ray_point_intersect( orig, trivec, tridir,
    points, sub_cloud_ind, use_kernel, gpu_id )
Inputs:
Outputs:
See also:


ray_triangle_intersect

Compute ray-triangle intersections in 3D using the Möller–Trumbore algorithm Usage:
# Output as tuple
data = RTtools.ray_triangle_intersect( orig, dest, mesh, sub_mesh_index, aabb, use_kernel, gpu_id )

# Unpacked outputs
fbs, sbs, no_interact, fbs_ind, sbs_ind = RTtools.ray_triangle_intersect( orig, dest, mesh, sub_mesh_index, aabb, use_kernel, gpu_id )
Inputs:
Outputs:
See also:


triangle_mesh_aabb

Calculate the axis-aligned bounding box (AABB) of a triangle mesh and its sub-meshes Usage:
aabb = quadriga_lib.RTtools.triangle_mesh_aabb( triangles, sub_mesh_index, vec_size )
Inputs:
Output:
See also:


triangle_mesh_segmentation

Reorganize a 3D triangular mesh into spatially clustered sub-meshes for faster processing Usage:
# Output as tuple
data = quadriga_lib.RTtools.triangle_mesh_segmentation( triangles, target_size, vec_size, mtl_ind )

# Unpacked outputs
triangles_out, sub_mesh_index, mesh_index, mtl_ind_out = \
    quadriga_lib.RTtools.triangle_mesh_segmentation( triangles, target_size, vec_size, mtl_ind )
Inputs:
Outputs: