htrdr

Solving radiative transfer in heterogeneous media
git clone git://git.meso-star.fr/htrdr.git
Log | Files | Refs | README | LICENSE

commit 07834d535efbf4c9a0f4d70e16438167f16711d4
parent 38078e74ccc1bf4d221d3a5e3b4279edf4237a69
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Mon,  9 Oct 2023 18:19:09 +0200

Rewrite the README file

Addition of section on project requirements. Complete rewrite of the
installation procedure concerning the use of POSIX make instead of CMake
as the first build system.

Diffstat:
MREADME.md | 433++++++++++++++++++++++++++++++++++++++++---------------------------------------
1 file changed, 221 insertions(+), 212 deletions(-)

diff --git a/README.md b/README.md @@ -1,120 +1,118 @@ # `htrdr` -`htrdr` evaluates the intensity at any position (probe) of the scene, in any -direction, in the presence of *surfaces* and an *absorbing and diffusing -semi-transparent medium*, for both *internal* (longwave) or *external* -(shortwave) *radiation sources*. The intensity is calculated using the -*Monte-Carlo* method: a number of optical paths are simulated backward, from the -probe position and into the medium. Various algorithms are used, depending on -the specificities of the nature and shape of the radiation source. - -Applications are theoretically possible to any configuration. However, it all -eventually comes down to the possibility of using the physical data of -interest, in their most common formats, in each scientific community. `htrdr` is -currently suitable for three main application fields: - -1. *Atmospheric radiative transfer:* a clear-sky atmosphere is vertically - stratified, neglecting Earth sphericity, and described in terms of - absorption coefficients as a function of height and spectral quadrature - point as per a correlated-k model. Cloud physical properties are provided on - a 3D rectangular grid. Surface geometrical and optical properties can be - provided for an arbitrary number of geometries. Internal radiation and solar - radiation are taken into account. - -2. *Combustion* processes: thermodynamic data is provided at the nodes of an - unstructured tetrahedral mesh, while surface properties can still be - provided for various materials. The radiation source is only external: a - monochromatic laser sheet illuminates the inside of the combustion chamber - for diagnostic purposes. - -3. *Planetology*: takes into account the geometry of a "ground" of arbitrary - shape, described by a triangular mesh, with the possibility of using an - arbitrary number of materials. The radiative properties of a gas mixture - must be provided on a tetrahedral mesh, using the k-distribution spectral - model. The radiative properties of an arbitrary number of aerosol and - hydrometeores can also be provided on their individual tetrahedral mesh. - Calculations can be made for both internal and external radiation sources. - In the case of an external source, a sphere of arbitrary size and position - is used. This sphere can radiate as a Planck source at a specified - brightness temperature, or be associated with a high-resolution radiance - spectrum. - -Since any radiative transfer observable is expressed as an integral of the -intensity, and since there is a strict equivalence between the integral to be -solved and the underlying Monte-Carlo algorithm (each integral results in the -sampling of a random variable), the algorithms that calculate the radiance are -used for computing various quantities: +`htrdr` evaluates the intensity at any position (probe) of the scene, in +any direction, in the presence of *surfaces* and an *absorbing and +diffusing semi-transparent medium*, for both *internal* (longwave) or +*external* (shortwave) *radiation sources*. The intensity is calculated +using the *Monte Carlo* method: a number of optical paths are simulated +backward, from the probe position and into the medium. Various +algorithms are used, depending on the specificities of the nature and +shape of the radiation source. + +Applications are theoretically possible to any configuration. However, +it all eventually comes down to the possibility of using the physical +data of interest, in their most common formats, in each scientific +community. `htrdr` is currently suitable for three main application +fields: + +1. *Atmospheric radiative transfer:* a clear-sky atmosphere is + vertically stratified, neglecting Earth sphericity, and described in + terms of absorption coefficients as a function of height and spectral + quadrature point as per a correlated-k model. Cloud physical + properties are provided on a 3D rectangular grid. Surface geometrical + and optical properties can be provided for an arbitrary number of + geometries. Internal radiation and solar radiation are taken into + account. + +2. *Combustion* processes: thermodynamic data is provided at the nodes + of an unstructured tetrahedral mesh, while surface properties can + still be provided for various materials. The radiation source is only + external: a monochromatic laser sheet illuminates the inside of the + combustion chamber for diagnostic purposes. + +3. *Planetology*: takes into account the geometry of a "ground" of + arbitrary shape, described by a triangular mesh, with the possibility + of using an arbitrary number of materials. The radiative properties + of a gas mixture must be provided on a tetrahedral mesh, using the + k-distribution spectral model. The radiative properties of an + arbitrary number of aerosol and hydrometeores can also be provided on + their individual tetrahedral mesh. Calculations can be made for both + internal and external radiation sources. In the case of an external + source, a sphere of arbitrary size and position is used. This sphere + can radiate as a Planck source at a specified brightness temperature, + or be associated with a high-resolution radiance spectrum. + +Since any radiative transfer observable is expressed as an integral of +the intensity, and since there is a strict equivalence between the +integral to be solved and the underlying Monte Carlo algorithm (each +integral results in the sampling of a random variable), the algorithms +that calculate the radiance are used for computing various quantities: - *Images* on a camera sensor, in a given field of view. For combustion applications, only monochromatic images are supported. In atmospheres, - spectral integration is also possible, both for solar and thermal images: CIE - colorimetry is used for solar images, while thermal images are in fact - brightness temperature maps, obtained from the incoming radiative flux over a - specified spectral interval. + spectral integration is also possible, both for solar and thermal + images: CIE colorimetry is used for solar images, while thermal images + are in fact brightness temperature maps, obtained from the incoming + radiative flux over a specified spectral interval. - *Flux density maps*, on a sensor grid, integrated over an entire - hemisphere. In the case of combustion chambers, only monochromatic flux maps - can be calculated, while spectrally integrated flux density maps (both on the - visible part of the spectrum and on the infrared) are possible for - atmospheric applications. - -## How to build - -This program is compatible GNU/Linux 64-bits. It relies on the -[CMake](http://www.cmake.org) and the -[RCMake](https://gitlab.com/vaplv/rcmake/) packages to build. It also depends -on the -[AW](https://gitlab.com/vaplv/loader_aw/#tab-readme), -[MruMtl](https://gitlab.com/meso-star/mrumtl/), -[RSys](https://gitlab.com/vaplv/rsys/), -[Star-3D](https://gitlab.com/meso-star/star-3d/), -[Star-Camera](https://gitlab.com/meso-star/star-camera), -[Star-SF](https://gitlab.com/meso-star/star-sf/), -[Star-SP](https://gitlab.com/meso-star/stat-sp/) and -[Star-VX](https://gitlab.com/meso-star/star-vx/) libraries and on -[OpenMP](http://www.openmp.org) 1.2 and the -[MPI](https://www.mpi-forum.org/) 2 specification to parallelize its -computations. It optionally depends on [scdoc](https://sr.ht/~sircmpwn/scdoc/) -which, if available, is used to generate the man pages. - -`htrdr` finally depends on the [HTSky](https://gitlab.com/meso-star/htsky/) -library if the `HTRDR_BUILD_ATMOSPHERE` option is set, on -[AtrSTM](https://gitlab.com/meso-star/atrstm/) when `HTRDR_BUILD_COMBUSTION` is -set, and on [RNAtm](https://gitlab.com/meso-star/rnatm/), -[RNGrd](https://gitlab.com/meso-star/rngrd/) and -[Star-Buffer](https://gitlab.com/meso-star/star-buffer/) if -`HTRDR_BUILD_PLANETO` is enabled. These compilation options enable/disable the -build of the atmospheric, combustion, and planetology parts of `htrdr`. By -default, all options are enabled. - -To build `htrdr`, first ensure that CMake is installed on your system. Then -install the RCMake package as well as the aforementioned prerequisites. Finally -generate the project from the `cmake/CMakeLists.txt` file by appending to the -`CMAKE_PREFIX_PATH` variable the install directories of its dependencies. The -resulting project can be edited, built, tested and installed as any CMake -project. Refer to the [CMake](https://cmake.org/documentation) for further -informations on CMake. + hemisphere. In the case of combustion chambers, only monochromatic + flux maps can be calculated, while spectrally integrated flux density + maps (both on the visible part of the spectrum and on the infrared) + are possible for atmospheric applications. + +## Requirements + +- C compiler with OpenMP support +- POSIX make +- pkg-config +- Message Passing Interface (MPI) +- [mandoc](https://mandoc.bsd.lv) +- [AW](https://gitlab.com/vaplv/loader_aw) +- [Astoria: Semi-Transparent Medium](https://gitlab.com/meso-star/atrstm) + (optional; required by COMBUSTION) +- [High-Tune: Sky](https://gitlab.com/meso-star/htsky) + (optional; required by ATMOSHPERE) +- [ModRadUrb: MaTeriaL](https://gitlab.com/meso-star/mrumtl) +- [Rad-Net ATMopshere](https://gitlab.com/meso-star/rnatm) + (optional; required by PLANETO) +- [Rad-Net GRounD](https://gitlab.com/meso-star/rngrd) + (optional; required by PLANETO) +- [RSys](https://gitlab.com/vaplv/rsys) +- [Star 3D](https://gitlab.com/meso-star/star-3d) +- [Star Buffer](https://gitlab.com/meso-star/star-buffer) + (optional; required by PLANETO) +- [Star Camera](https://gitlab.com/meso-star/star-camera) +- [Star Scattering Functions](https://gitlab.com/meso-star/star-sf) +- [Star SamPling](https://gitlab.com/meso-star/star-sp) +- [Star VoXel](https://gitlab.com/meso-star/star-vx) + +## Installation + +Edit config.mk as needed, then run: + + make clean install ## Release notes ### Version 0.9.2 -- Update the `rnatm` library to version 0.0.1. This versions fixes several - bugs when different atmospheric components do not have the same volumetric - meshes. +- Update the `rnatm` library to version 0.0.1. This versions fixes + several bugs when different atmospheric components do not have the + same volumetric meshes. - Display an error message when parsing unknown arguments to the `htrdr-planeto` command. -- Fix `htrdr-planeto` man page: there was an error in the `csplit` command - provided as an example to extract octrees from the output of `htrdr-planeto` - when the -d option is used. +- Fix `htrdr-planeto` man page: there was an error in the `csplit` + command provided as an example to extract octrees from the output of + `htrdr-planeto` when the -d option is used. ### Version 0.9.1 - Fix invalid read/write memory access when ray tracing the ground in `htrdr-atmopshere`. - Fix compilation warning detected by GCC 12. -- Fix `htrdr-planeto` man page (-S option): the unit of the - radius and the distance from the source is not the meter but the kilometer. +- Fix `htrdr-planeto` man page (-S option): the unit of the radius and + the distance from the source is not the meter but the kilometer. - Fix `htrdr` man page: replaced long options with short options. - Reference and install the rnrl fileformat man page. - Proofreading the README and man pages: correcting typos, spelling and @@ -124,26 +122,28 @@ informations on CMake. #### Adds radiative transfer simulation in 3D planetary atmospheres -The new `htrdr-planeto` command simulates radiative transfer in planetology -context, i.e. in the 3D atmosphere of a telluric planet. Both infrared and -visible computations are supported. `htrdr-planeto` is actually a renderer that -calculates an image for a given observation position. Its internal rendering -algorithm is based on Monte-Carlo integration, which consists for each pixel in -simulating a given number of optical paths from the sensor, taking into account -the phenomena of light absorption and scattering. +The new `htrdr-planeto` command simulates radiative transfer in +planetology context, i.e. in the 3D atmosphere of a telluric planet. +Both infrared and visible computations are supported. `htrdr-planeto` is +actually a renderer that calculates an image for a given observation +position. Its internal rendering algorithm is based on Monte Carlo +integration, which consists for each pixel in simulating a given number +of optical paths from the sensor, taking into account the phenomena of +light absorption and scattering. -The planet's ground can be any set of triangles with BRDFs and temperatures -defined per triangle. The atmosphere is composed of a gas mixture and a -potentially empty set of aerosols. Both can have arbitrary tetrahedral meshes -with per-node radiative properties. +The planet's ground can be any set of triangles with BRDFs and +temperatures defined per triangle. The atmosphere is composed of a gas +mixture and a potentially empty set of aerosols. Both can have arbitrary +tetrahedral meshes with per-node radiative properties. #### Miscellaneous - Use scdoc rather than asciidoc as file format for man sources. - Update all dependencies. More notably, use - [MruMtl 0.1](https://gitlab.com/meso-star/mrumtl/-/tree/0.1) which introduces - API breaks. -- Add the discrete wavelength distribution currently used in `htrdr-planeto` only. + [MruMtl 0.1](https://gitlab.com/meso-star/mrumtl/-/tree/0.1) + which introduces API breaks. +- Add the discrete wavelength distribution currently used in + `htrdr-planeto` only. ### Version 0.8.1 @@ -152,125 +152,133 @@ compilation errors with gcc 11 but introduces API breaks. ### Version 0.8 -- Adds support for a thin lens camera model and an orthographic camera model - for combustion and atmosphere modes. -- Updates the size of a tile from 32x32 pixels to 8x8 pixels. A tile is a - block of pixels rendered by a thread. However, a size of 32x32 pixels could - be too large when rendering on several dozen threads: the image definition - could be insufficient to give tiles to all threads. -- Fixes the calculation of shortwave radiance by `htrdr-combustion` and the - calculation of longwave radiance by `htrdr-atmosphere`. At each scattering - position, the range of the traced ray could be incorrect. +- Adds support for a thin lens camera model and an orthographic camera + model for combustion and atmosphere modes. +- Updates the size of a tile from 32x32 pixels to 8x8 pixels. A tile is + a block of pixels rendered by a thread. However, a size of 32x32 + pixels could be too large when rendering on several dozen threads: the + image definition could be insufficient to give tiles to all threads. +- Fixes the calculation of shortwave radiance by `htrdr-combustion` and + the calculation of longwave radiance by `htrdr-atmosphere`. At each + scattering position, the range of the traced ray could be incorrect. ### Version 0.7 #### Adds the simulation of radiative transfer in combustion media -The new `htrdr-combustion` command performs radiative transfer computations in -a scene representing a semi-transparent medium enlightened by a laser sheet. It -uses Monte-Carlo to calculate a monochromatic image of the medium or the -radiative flux density. Both computations are performed in the visible at a -given frequency. +The new `htrdr-combustion` command performs radiative transfer +computations in a scene representing a semi-transparent medium +enlightened by a laser sheet. It uses Monte Carlo to calculate a +monochromatic image of the medium or the radiative flux density. Both +computations are performed in the visible at a given frequency. -The medium data are defined on the vertices of an unstructured tetrahedral mesh -that may be surrounded by a triangular surface mesh representing the inner -limits of the combustion chamber. +The medium data are defined on the vertices of an unstructured +tetrahedral mesh that may be surrounded by a triangular surface mesh +representing the inner limits of the combustion chamber. #### Updates the `htrdr` command -The previous `htrdr` command is renamed to `htrdr-atmosphere`. `htrdr` becomes -a proxy for the `htrdr-atmosphere` command or the `htrdr-combustion` command: -calling `htrdr` with the `<atmosphere|combustion>` options is equivalent to -directly calling the `htrdr-<atmosphere|combustion>` commands. +The previous `htrdr` command is renamed to `htrdr-atmosphere`. `htrdr` +becomes a proxy for the `htrdr-atmosphere` command or the +`htrdr-combustion` command: calling `htrdr` with the +`<atmosphere|combustion>` options is equivalent to directly calling the +`htrdr-<atmosphere|combustion>` commands. #### Miscellaneous -- Major update of the entire codebase to add multiple applications to `htrdr`: - It was originally designed to handle atmospheric applications only. -- Always displays the number of processes and the number of threads: previously - they were only printed on multi-node executions. +- Major update of the entire codebase to add multiple applications to + `htrdr`: It was originally designed to handle atmospheric applications + only. +- Always displays the number of processes and the number of threads: + previously they were only printed on multi-node executions. - Fixed auto intersection issue on surfaces not facing the sun. - Fixed writing of pixel data: assumed pixel layout could be wrong. ### Version 0.6.1 -- Fix the self-intersection issue in shortwave computations introduced by - the 0.6 version. +- Fix the self-intersection issue in shortwave computations introduced + by the 0.6 version. ### Version 0.6 #### New features -- Add support of flux map computation for both shortwave and longwave. The flux - is computed for the part of the flux map lying outside any geometry. The new - command line option `-p` defines the rectangle in the scene onto which the - flux is going to be integrated. The flux map resolution and the realisations - count per pixel is controlled by the `-i` option. -- Add support of thin materials, i.e. materials without geometric thickness as - for instance the leaves of the trees. +- Add support of flux map computation for both shortwave and longwave. + The flux is computed for the part of the flux map lying outside any + geometry. The new command line option `-p` defines the rectangle in + the scene onto which the flux is going to be integrated. The flux map + resolution and the realisations count per pixel is controlled by the + `-i` option. +- Add support of thin materials, i.e. materials without geometric + thickness as for instance the leaves of the trees. - Add the temperature property to the materials and used it as the limit - condition during longwave computations. Previously, the surface temperatures - were fetched from the atmosphere at the given surface position. -- Add the `-n` option to fix the name of the material defining the atmosphere. + condition during longwave computations. Previously, the surface + temperatures were fetched from the atmosphere at the given surface + position. +- Add the `-n` option to fix the name of the material defining the + atmosphere. #### Fix -- In shortwave, fix how direct contribution is handled for purely specular - BRDF. +- In shortwave, fix how direct contribution is handled for purely + specular BRDF. ### Version 0.5.1 -- Fix the `undefined strtok_r symbol` issue exhibited by some GCC versions that - leads to memory corruption and segmentation fault when parsing the ground - interfaces. +- Fix the `undefined strtok_r symbol` issue exhibited by some GCC + versions that leads to memory corruption and segmentation fault when + parsing the ground interfaces. - Fix typos in the man pages. ### Version 0.5 #### New feature -Add support of shortwave integration with respect to the Planck function for a -reference temperature whose default value is the blackbody temperature of the -sun. Actually this is the counterpart of the longwave integration introduced by -the "infrared rendering" in the 0.4 version. The main difference is that the -source of radiation is the sun rather than the medium and its boundaries. +Add support of shortwave integration with respect to the Planck function +for a reference temperature whose default value is the blackbody +temperature of the sun. Actually this is the counterpart of the longwave +integration introduced by the "infrared rendering" in the 0.4 version. +The main difference is that the source of radiation is the sun rather +than the medium and its boundaries. -The option `-l` that enabled the infrared rendering is now replaced by the new -`-s` option that controls the spectral integration that can be CIE XYZ (i.e. -regular image rendering), longwave or shortwave. +The option `-l` that enabled the infrared rendering is now replaced by +the new `-s` option that controls the spectral integration that can be +CIE XYZ (i.e. regular image rendering), longwave or shortwave. #### Fixes - Fix the returned sun radiance: the precomputed per spectral band solar - incoming flux is removed and the sun radiance is now retrieved by directly - evaluating the monochromatic Planck for the blackbody temperature of the sun. -- Fix CIE XYZ spectral integration: the pdf used to sample the CIE tristimulus - values was not correctly handled in the Monte-Carlo weight. -- Fix the longwave spectral integration: the Monte-Carlo weight was wrong - leading to overestimated temperatures. + incoming flux is removed and the sun radiance is now retrieved by + directly evaluating the monochromatic Planck for the blackbody + temperature of the sun. +- Fix CIE XYZ spectral integration: the pdf used to sample the CIE + tristimulus values was not correctly handled in the Monte Carlo + weight. +- Fix the longwave spectral integration: the Monte Carlo weight was + wrong leading to overestimated temperatures. ### Version 0.4 #### New features -- Add support of infrared rendering: when defined, the new `-l` option setups - the range of longwave into which the rendering is performed. In infrared - rendering, each pixel stores the radiance per pixel and its associated - brightness temperature. Spectral integration is done with respect to the - Planck function for a reference temperature of 290 K. -- The ground geometry can now have several materials whose data vary over the - spectrum. These materials are listed in a new +- Add support of infrared rendering: when defined, the new `-l` option + setups the range of longwave into which the rendering is performed. In + infrared rendering, each pixel stores the radiance per pixel and its + associated brightness temperature. Spectral integration is done with + respect to the Planck function for a reference temperature of 290 K. +- The ground geometry can now have several materials whose data vary + over the spectrum. These materials are listed in a new [htrdr-materials](https://gitlab.com/meso-star/htrdr/-/blob/master/doc/htrdr-materials.5.txt) - file where each materials is defined by a name and a file storing its spectral - data with respect to the + file where each materials is defined by a name and a file storing its + spectral data with respect to the [MruMtl](https://gitlab.com/meso-star/mrumtl/-/blob/master/doc/mrumtl.5.txt) - fileformat. A material is mapped to a part of the OBJ geometry by using the - `usemtl` directive of the + fileformat. A material is mapped to a part of the OBJ geometry by + using the `usemtl` directive of the [OBJ fileformat](https://gitlab.com/meso-star/htrdr/-/blob/master/doc/htrdr-obj.5.txt). - Improve the sampling of the spectral dimension: the per wavelength - realisation is now precisely sampled rather than arbitrarly fixed to the - center of the sampled spectral band. Consequently, high - resolution data defined per wavelength (e.g. Mie's properties and the + realisation is now precisely sampled rather than arbitrarly fixed to + the center of the sampled spectral band. Consequently, high resolution + data defined per wavelength (e.g. Mie's properties and the reflectivity of the materials) are now fully taken into account. #### Fixes @@ -280,49 +288,50 @@ regular image rendering), longwave or shortwave. ### Version 0.3 -- Add the `-O` option that defines the file where the sky data are cached. If - the file does not exist, the sky data structures are built from scratch and - serialized into this new file. If this file exists, these data structures are - directly read from it, leading to a huge speed up of the `htrdr` - pre-processing step. Note that if the provided file exists but is filled with - data that do not match the submitted HTGOP, HTCP and HTMie files, an error is - detected and the program stops. -- Rely on the HTSky library to manage the sky data. This library handles the - code previously defined into the `htrdr_sky.<c|h>` files. The HTCP, HTGOP, - HTMie libraries are thus no more dependencies of `htrdr` since only the - `htrdr_sky` files used them. +- Add the `-O` option that defines the file where the sky data are + cached. If the file does not exist, the sky data structures are built + from scratch and serialized into this new file. If this file exists, + these data structures are directly read from it, leading to a huge + speed up of the `htrdr` pre-processing step. Note that if the provided + file exists but is filled with data that do not match the submitted + HTGOP, HTCP and HTMie files, an error is detected and the program + stops. +- Rely on the HTSky library to manage the sky data. This library handles + the code previously defined into the `htrdr_sky.<c|h>` files. The + HTCP, HTGOP, HTMie libraries are thus no more dependencies of `htrdr` + since only the `htrdr_sky` files used them. ### Version 0.2 - Add the `-b` option that controls the BRDF of the ground geometry. - Make optional the use of a ground geometry (option `-g`). -- Make optional the definition of the optical properties of water droplets - (option `-m`) when no cloud field is used. +- Make optional the definition of the optical properties of water + droplets (option `-m`) when no cloud field is used. ### Version 0.1 -- Add the `-V` option that fixes the maximum definition of the octrees used to - partitioned the radiative properties of the clouds. +- Add the `-V` option that fixes the maximum definition of the octrees + used to partitioned the radiative properties of the clouds. - Add a per pixel estimation of the per radiative path computation time. ### Version 0.0.4 -- Fix the computation of the surface scattering: there was a bug in how Russian - roulette was implemented at surface scattering leading to an underestimation - of the surface reflection. -- Update the thread allocation policy: by default, the number of threads is now - defined as the maximum between the number of processors detected by OpenMP - and the number of threads defined by the `OMP_NUM_THREADS` environment - variable. This variable can be used to counteract the number of processors - detected by OpenMP that can be lower than the real number of processors of - the system. +- Fix the computation of the surface scattering: there was a bug in how + Russian roulette was implemented at surface scattering leading to an + underestimation of the surface reflection. +- Update the thread allocation policy: by default, the number of threads + is now defined as the maximum between the number of processors + detected by OpenMP and the number of threads defined by the + `OMP_NUM_THREADS` environment variable. This variable can be used to + counteract the number of processors detected by OpenMP that can be + lower than the real number of processors of the system. ### Version 0.0.3 -- Fix compilation on systems with a GNU C Library whose version is less than - 2.19. -- Fix a possible invalid memory access to cloud data leading to segmentation - faults. +- Fix compilation on systems with a GNU C Library whose version is less + than 2.19. +- Fix a possible invalid memory access to cloud data leading to + segmentation faults. ## Copyright notice @@ -338,7 +347,7 @@ Copyright © 2018-2019, 2022-2023 Université Paul Sabatier ## License -`htrdr` is free software released under the GPL v3+ license: GNU GPL version 3 or -later. You are welcome to redistribute it under certain conditions; refer to -the COPYING file for details. +`htrdr` is free software released under the GPL v3+ license: GNU GPL +version 3 or later. You are welcome to redistribute it under certain +conditions; refer to the COPYING file for details.