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:
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;