star-line

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

commit 6c80a19de3a7e0b5659cd723e098c759d4b99440
parent dd9d93b6ae889c5ba752d7ce86b8a02bbb7d856f
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Wed,  4 May 2022 12:02:28 +0200

Eval the line for at its vertices (i.e. wavenumbers)

Diffstat:
Msrc/sln_line.c | 49++++++++++++++++++++++++++++++++++++++++++-------
1 file changed, 42 insertions(+), 7 deletions(-)

diff --git a/src/sln_line.c b/src/sln_line.c @@ -209,6 +209,36 @@ error: goto exit; } +static res_T +eval_mesh + (struct sln_tree* tree, + const size_t iline, + const struct darray_double* wavenumbers, + struct darray_double* values) +{ + size_t ivertex, nvertices; + res_T res = RES_OK; + ASSERT(tree && wavenumbers && values); + + nvertices = darray_double_size_get(wavenumbers); + ASSERT(nvertices); + + res = darray_double_resize(values, nvertices); + if(res != RES_OK) goto error; + + FOR_EACH(ivertex, 0, nvertices) { + const double nu = darray_double_cdata_get(wavenumbers)[ivertex]; + darray_double_data_get(values)[ivertex] = line_value(tree, iline, nu); + } + +exit: + return res; +error: + log_err(tree->sln, "Error evaluating the line mesh -- %s.\n", + res_to_cstr(res)); + goto exit; +} + /******************************************************************************* * Local function ******************************************************************************/ @@ -265,6 +295,7 @@ line_mesh const size_t iline, const size_t nvertices_hint) { + struct darray_double values; /* List of evaluated values */ struct darray_double wavenumbers; /* List of considered wavenumbers */ const struct shtr_line* shtr_line = NULL; const struct molecule_params* mol_params = NULL; @@ -276,12 +307,13 @@ line_mesh size_t i; res_T res = RES_OK; - ASSERT(tree && line && nvertices_hint); + ASSERT(tree && nvertices_hint); ASSERT(iline < darray_line_size_get(&tree->lines)); line = darray_line_cdata_get(&tree->lines) + iline; SHTR(lines_view_get_line(tree->lines_view, iline, &shtr_line)); + darray_double_init(tree->sln->allocator, &values); darray_double_init(tree->sln->allocator, &wavenumbers); /* Adjust the hint on the number of vertices. This is not actually the real @@ -301,6 +333,8 @@ line_mesh (tree, line, mol_params, line->gamma_l, nvertices_adjusted, &wavenumbers); if(res != RES_OK) goto error; + eval_mesh(tree, iline, &wavenumbers, &values); + line_nvertices = darray_double_size_get(&wavenumbers); res = darray_vertex_resize (&tree->vertices, tree_nvertices + line_nvertices*2 - 1); @@ -310,24 +344,25 @@ line_mesh goto error; } - /* TODO compute the line value for each vertex */ - /* Copy the first half of the line vertices */ i = tree_nvertices; FOR_EACH_REVERSE(ivertex, line_nvertices-1, 0) { - darray_vertex_data_get(&tree->vertices)[i].wavenumber = - (float)darray_double_cdata_get(&wavenumbers)[ivertex]; + struct vertex* vtx = darray_vertex_data_get(&tree->vertices) + i; + vtx->wavenumber = (float)darray_double_cdata_get(&wavenumbers)[ivertex]; + vtx->ka = (float)darray_double_cdata_get(&values)[ivertex]; ++i; } /* Copy the vertex of the line center and the second half of the line * vertices */ FOR_EACH(ivertex, 0, line_nvertices) { - darray_vertex_data_get(&tree->vertices)[i].wavenumber = - (float)darray_double_cdata_get(&wavenumbers)[ivertex]; + struct vertex* vtx = darray_vertex_data_get(&tree->vertices) + i; + vtx->wavenumber = (float)darray_double_cdata_get(&wavenumbers)[ivertex]; + vtx->ka = (float)darray_double_cdata_get(&values)[ivertex]; ++i; } exit: + darray_double_release(&values); darray_double_release(&wavenumbers); return res; error: