star-line

Structure for accelerating line importance sampling
git clone git://git.meso-star.fr/star-line.git
Log | Files | Refs | README | LICENSE

commit d2b8e200ce1dbac663adab7bb9cbe46a90da157b
parent 91ae69195f56c69d1dcd20143e3767b470dcbbd5
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Mon, 23 May 2022 15:14:24 +0200

Manage the line profile parameter

Diffstat:
Msrc/sln_line.c | 27+++++++++++++++++++--------
Msrc/sln_line.h | 3+++
Msrc/sln_tree_build.c | 9++++++---
Msrc/sln_tree_c.h | 2+-
4 files changed, 29 insertions(+), 12 deletions(-)

diff --git a/src/sln_line.c b/src/sln_line.c @@ -237,6 +237,7 @@ eval_mesh (const struct sln_mixture* mixture, const size_t iline, const struct darray_double* wavenumbers, + const enum sln_line_profile line_profile, struct darray_double* values) { const struct shtr_line* shtr_line = NULL; @@ -270,7 +271,8 @@ eval_mesh const double nu = darray_double_cdata_get(wavenumbers)[ivertex]; if(nu < range[0]) continue; if(nu > range[1]) break; - darray_double_data_get(values)[ivertex] = line_value(mixture, iline, nu); + darray_double_data_get(values)[ivertex] = + line_value(mixture, iline, line_profile, nu); } exit: @@ -327,7 +329,8 @@ save_line_mesh if(line->wavenumber - mol_params->cutoff <= spectral_range[0]) { struct sln_vertex* vtx = darray_vertex_data_get(&tree->vertices) + i; vtx->wavenumber = (float)spectral_range[0]; - vtx->ka = (float)line_value(tree->mixture, iline, vtx->wavenumber); + vtx->ka = (float)line_value + (tree->mixture, iline, tree->line_profile, vtx->wavenumber); ++i; } @@ -370,7 +373,8 @@ save_line_mesh if(line->wavenumber + mol_params->cutoff >= spectral_range[1]) { struct sln_vertex* vtx = darray_vertex_data_get(&tree->vertices) + i; vtx->wavenumber = (float)spectral_range[1]; - vtx->ka = (float)line_value(tree->mixture, iline, vtx->wavenumber); + vtx->ka = (float)line_value + (tree->mixture, iline, tree->line_profile, vtx->wavenumber); ++i; } @@ -437,11 +441,13 @@ double line_value (const struct sln_mixture* mixture, const size_t iline, + const enum sln_line_profile line_profile, const double wavenumber) { const struct line* line = NULL; const struct shtr_line* shtr_line = NULL; const struct molecule_params* mol_params = NULL; + double profile = 0; ASSERT(mixture && iline < darray_line_size_get(&mixture->lines)); /* Retrieve the molecular parameters of the line to be mesh */ @@ -453,11 +459,16 @@ line_value if(wavenumber < line->wavenumber - mol_params->cutoff || wavenumber > line->wavenumber + mol_params->cutoff) { return 0; - } else { - const double profile = sln_compute_voigt_profile - (wavenumber, line->wavenumber, line->gamma_d, line->gamma_l); - return line->profile_factor * profile; } + + switch(line_profile) { + case SLN_LINE_PROFILE_VOIGT: + profile = sln_compute_voigt_profile + (wavenumber, line->wavenumber, line->gamma_d, line->gamma_l); + break; + default: FATAL("Unreachable code.\n"); break; + } + return line->profile_factor * profile; } res_T @@ -500,7 +511,7 @@ line_mesh /* Evaluate the mesh vertices, i.e. define the line value for the list of * wavenumbers */ - eval_mesh(tree->mixture, iline, &wavenumbers, &values); + eval_mesh(tree->mixture, iline, &wavenumbers, tree->line_profile, &values); res = save_line_mesh(tree, iline, mol_params, tree->mixture->wavenumber_range, &wavenumbers, &values, vertices_range); diff --git a/src/sln_line.h b/src/sln_line.h @@ -19,6 +19,8 @@ #ifndef SLN_LINE_H #define SLN_LINE_H +#include "sln.h" + #include <star/shtr.h> #include <rsys/rsys.h> #include <math.h> @@ -53,6 +55,7 @@ extern LOCAL_SYM double line_value (const struct sln_mixture* mixture, const size_t iline, + const enum sln_line_profile profile, const double wavenumber); extern LOCAL_SYM res_T diff --git a/src/sln_tree_build.c b/src/sln_tree_build.c @@ -85,6 +85,7 @@ static INLINE double compute_ka (const struct sln_mixture* mixture, const double wavenumber, + const enum sln_line_profile line_profile, const size_t line_range[2]) { double ka = 0; @@ -93,7 +94,7 @@ compute_ka ASSERT(line_range[0] <= line_range[1]); FOR_EACH(iline, line_range[0], line_range[1]+1) { - ka += line_value(mixture, iline, wavenumber); + ka += line_value(mixture, iline, line_profile, wavenumber); } return ka; } @@ -139,12 +140,14 @@ merge_node_polylines if(nu0 < nu1) { /* The vertex comes from the node0 */ nu = vertices[ivtx0].wavenumber; - ka = (float)(vertices[ivtx0].ka + compute_ka(tree->mixture, nu, node1->range)); + ka = (float)(vertices[ivtx0].ka + + compute_ka(tree->mixture, nu, tree->line_profile, node1->range)); ++ivtx0; } else if(nu0 > nu1) { /* The vertex comes from the node1 */ nu = vertices[ivtx1].wavenumber; - ka = (float)(vertices[ivtx1].ka + compute_ka(tree->mixture, nu, node0->range)); + ka = (float)(vertices[ivtx1].ka + + compute_ka(tree->mixture, nu, tree->line_profile, node0->range)); ++ivtx1; } else { /* The vertex is shared by node0 and node1 */ diff --git a/src/sln_tree_c.h b/src/sln_tree_c.h @@ -26,7 +26,7 @@ #include <rsys/ref_count.h> /* Current version of the serialized tree data. One should increment it and - * perform a version management onto serialized data when these data are + * perform a version management onto serialized tree when these data are * updated. */ static const int SLN_TREE_VERSION = 0;