htgop

Optical properties of a gas mixture
git clone git://git.meso-star.fr/htgop.git
Log | Files | Refs | README | LICENSE

commit bd9eede00ca75468ec090c10b77f1491ae5c9a8d
parent 940e2f9a8fbbacdadacc178a5961070b17082e32
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Tue, 30 Jan 2018 11:39:51 +0100

Add and implement the getters of the loaded data.

Diffstat:
Mcmake/CMakeLists.txt | 1+
Msrc/htgop.c | 279++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------
Msrc/htgop.h | 134+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/htgop_c.h | 16++--------------
Asrc/htgop_reader.h | 72++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5 files changed, 435 insertions(+), 67 deletions(-)

diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt @@ -46,6 +46,7 @@ set(SSOL_FILES_INC htgop_c.h htgop_layer.h htgop_parse_layers_spectral_intervals_data.h + htgop_reader.h htgop_spectral_intervals.h) set(SSOL_FILES_INC_API htgop.h) diff --git a/src/htgop.c b/src/htgop.c @@ -15,62 +15,11 @@ #include "htgop.h" #include "htgop_c.h" +#include "htgop_reader.h" #include <rsys/cstr.h> #include <rsys/logger.h> #include <rsys/mem_allocator.h> -#include <rsys/stretchy_array.h> - -#include <string.h> - -/******************************************************************************* - * Reader - ******************************************************************************/ -struct reader { - FILE* stream; - const char* name; - size_t iline; - char* line; -}; - -static void -reader_init(struct reader* rdr, FILE* stream, const char* name) -{ - ASSERT(rdr && stream && name); - memset(rdr, 0, sizeof(struct reader)); - rdr->stream = stream; - rdr->name = name; - rdr->iline = 0; - rdr->line = sa_add(rdr->line, 128); - ASSERT(rdr->line); -} - -static void -reader_release(struct reader* rdr) -{ - ASSERT(rdr); - sa_release(rdr->line); -} - -/* Read a non empty line */ -static char* -read_line(struct reader* rdr) -{ - const int chunk = 32; - - do { - if(!fgets(rdr->line, (int)sa_size(rdr->line), rdr->stream)) return NULL; - ++rdr->iline; - - /* Ensure that the whole line is read */ - while(!strrchr(rdr->line, '\n') && !feof(rdr->stream)) { - CHK(fgets(sa_add(rdr->line, (size_t)chunk), chunk, rdr->stream)); - } - - rdr->line[strcspn(rdr->line, "#\n\r")] = '\0'; /* Rm new line & comments */ - } while(strspn(rdr->line, " \t") == strlen(rdr->line)); /* Empty line */ - return rdr->line; -} /******************************************************************************* * Helper functions @@ -181,6 +130,7 @@ parse_layers_spectral_intervals(struct htgop* htgop, struct reader* rdr) res_T res = RES_OK; ASSERT(htgop && rdr); + layers = darray_layer_data_get(&htgop->layers); nlays = darray_layer_size_get(&htgop->layers); ASSERT(nlays > 0); lw_nspecints = darray_double_size_get(&htgop->lw_specints.wave_numbers) - 1; @@ -213,7 +163,7 @@ static res_T load_stream(struct htgop* htgop, FILE* stream, const char* stream_name) { struct reader rdr; - struct level* levels = NULL; + struct htgop_level* levels = NULL; struct layer* layers = NULL; unsigned long nlvls, nlays, tab_len, nspecints_lw, nspecints_sw; unsigned long ilvl, ilay, itab; @@ -411,6 +361,229 @@ htgop_load_stream(struct htgop* htgop, FILE* stream) return load_stream(htgop, stream, "<stream>"); } +res_T +htgop_get_ground(const struct htgop* htgop, struct htgop_ground* ground) +{ + if(!htgop || !ground) return RES_BAD_ARG; + *ground = htgop->ground; + return RES_OK; +} + +res_T +htgop_get_layers_count(const struct htgop* htgop, size_t* nlayers) +{ + if(!htgop || !nlayers) return RES_BAD_ARG; + *nlayers = darray_layer_size_get(&htgop->layers); + return RES_OK; +} + +res_T +htgop_get_levels_count(const struct htgop* htgop, size_t* nlevels) +{ + if(!htgop || !nlevels) return RES_BAD_ARG; + *nlevels = darray_level_size_get(&htgop->levels); + return RES_OK; +} + +res_T +htgop_get_level + (const struct htgop* htgop, const size_t ilvl, struct htgop_level* lvl) +{ + size_t n; + if(!htgop || !lvl) return RES_BAD_ARG; + HTGOP(get_levels_count(htgop, &n)); + if(ilvl >= n) { + log_err(htgop, "%s: invalid level `%lu'.\n", FUNC_NAME, ilvl); + return RES_BAD_ARG; + } + *lvl = darray_level_cdata_get(&htgop->levels)[ilvl]; + return RES_OK; +} + +res_T +htgop_get_layer + (const struct htgop* htgop, + const size_t ilayer, + struct htgop_layer* layer) +{ + const struct layer* l; + size_t n; + if(!htgop || !layer) return RES_BAD_ARG; + HTGOP(get_layers_count(htgop, &n)); + if(ilayer >= n) { + log_err(htgop, "%s: invalid layer `%lu'.\n", FUNC_NAME, ilayer); + return RES_BAD_ARG; + } + l = darray_layer_cdata_get(&htgop->layers) + ilayer; + layer->x_h2o_nominal = l->x_h2o_nominal; + layer->x_h2o_tab = darray_double_cdata_get(&l->x_h2o_tab); + layer->tab_length = darray_double_size_get(&l->x_h2o_tab); + layer->lw_spectral_intervals_count = + darray_lay_lw_specint_size_get(&l->lw_specints); + layer->sw_spectral_intervals_count = + darray_lay_sw_specint_size_get(&l->sw_specints); + layer->data__ = l; + return RES_OK; +} + +res_T +htgop_layer_get_lw_spectral_interval + (const struct htgop_layer* layer, + const size_t ispecint, + struct htgop_layer_lw_spectral_interval* specint) +{ + const struct layer* l; + const struct layer_lw_spectral_interval* lspecint; + if(!layer || !specint) return RES_BAD_ARG; + if(ispecint >= layer->lw_spectral_intervals_count) return RES_BAD_ARG; + l = layer->data__; + lspecint = darray_lay_lw_specint_cdata_get(&l->lw_specints) + ispecint; + specint->ka_nominal = darray_double_cdata_get(&lspecint->ka_nominal); + specint->quadrature_length = darray_double_size_get(&lspecint->ka_nominal); + specint->data__ = lspecint; + return RES_OK; +} + +res_T +htgop_layer_get_sw_spectral_interval + (const struct htgop_layer* layer, + const size_t ispecint, + struct htgop_layer_sw_spectral_interval* specint) +{ + const struct layer* l; + const struct layer_sw_spectral_interval* lspecint; + if(!layer || !specint) return RES_BAD_ARG; + if(ispecint >= layer->sw_spectral_intervals_count) return RES_BAD_ARG; + l = layer->data__; + lspecint = darray_lay_sw_specint_cdata_get(&l->sw_specints) + ispecint; + specint->ka_nominal = darray_double_cdata_get(&lspecint->ka_nominal); + specint->ks_nominal = darray_double_cdata_get(&lspecint->ks_nominal); + specint->quadrature_length = darray_double_size_get(&lspecint->ka_nominal); + specint->data__ = lspecint; + return RES_OK; +} + +res_T +htgop_layer_lw_spectral_interval_get_tab + (const struct htgop_layer_lw_spectral_interval* specint, + const size_t iquad, + struct htgop_layer_lw_spectral_interval_tab* tab) +{ + const struct layer_lw_spectral_interval* lspecint; + const struct darray_double* t; + if(!specint || !tab) return RES_BAD_ARG; + if(iquad >= specint->quadrature_length) return RES_BAD_ARG; + lspecint = specint->data__; + t = darray_dbllst_cdata_get(&lspecint->ka_tab) + iquad; + tab->ka_tab = darray_double_cdata_get(t); + tab->tab_length = darray_double_size_get(t); + return RES_OK; +} + +res_T +htgop_layer_sw_spectral_interval_get_tab + (const struct htgop_layer_sw_spectral_interval* specint, + const size_t iquad, + struct htgop_layer_sw_spectral_interval_tab* tab) +{ + const struct layer_sw_spectral_interval* lspecint; + const struct darray_double* ka_tab; + const struct darray_double* ks_tab; + if(!specint || !tab) return RES_BAD_ARG; + if(iquad >= specint->quadrature_length) return RES_BAD_ARG; + lspecint = specint->data__; + ka_tab = darray_dbllst_cdata_get(&lspecint->ka_tab) + iquad; + ks_tab = darray_dbllst_cdata_get(&lspecint->ks_tab) + iquad; + tab->ka_tab = darray_double_cdata_get(ka_tab); + tab->ks_tab = darray_double_cdata_get(ks_tab); + tab->tab_length = darray_double_size_get(ka_tab); + return RES_OK; +} + +res_T +htgop_get_lw_spectral_intervals_count(const struct htgop* htgop, size_t* nspecints) +{ + if(!htgop || !nspecints) return RES_BAD_ARG; + *nspecints = darray_dbllst_size_get(&htgop->lw_specints.quadratures); + return RES_OK; +} + +res_T +htgop_get_sw_spectral_intervals_count(const struct htgop* htgop, size_t* nspecints) +{ + if(!htgop || !nspecints) return RES_BAD_ARG; + *nspecints = darray_dbllst_size_get(&htgop->sw_specints.quadratures); + return RES_OK; +} + +res_T +htgop_get_lw_spectral_intervals_wave_numbers + (const struct htgop* htgop, const double* wave_numbers[]) +{ + if(!htgop || !wave_numbers) return RES_BAD_ARG; + *wave_numbers = darray_double_cdata_get(&htgop->lw_specints.wave_numbers); + return RES_OK; +} + +res_T +htgop_get_sw_spectral_intervals_wave_numbers + (const struct htgop* htgop, const double* wave_numbers[]) +{ + if(!htgop || !wave_numbers) return RES_BAD_ARG; + *wave_numbers = darray_double_cdata_get(&htgop->sw_specints.wave_numbers); + return RES_OK; +} + +res_T +htgop_get_lw_spectral_interval + (const struct htgop* htgop, + const size_t ispecint, + struct htgop_spectral_interval* interval) +{ + const double* wave_numbers; + const struct darray_double* quadratures; + size_t n; + if(!htgop || !interval) return RES_BAD_ARG; + HTGOP(get_lw_spectral_intervals_count(htgop, &n)); + if(ispecint >= n) { + log_err(htgop, "%s: invalid long wave spectral interval `%lu'.\n", + FUNC_NAME, (unsigned long)ispecint); + return RES_BAD_ARG; + } + wave_numbers = darray_double_cdata_get(&htgop->lw_specints.wave_numbers); + quadratures = darray_dbllst_cdata_get(&htgop->lw_specints.quadratures); + interval->wave_numbers[0] = wave_numbers[ispecint+0]; + interval->wave_numbers[1] = wave_numbers[ispecint+1]; + interval->quadrature = darray_double_cdata_get(&quadratures[ispecint]); + interval->quadrature_length = darray_double_size_get(&quadratures[ispecint]); + return RES_OK; +} + +res_T +htgop_get_sw_spectral_interval + (const struct htgop* htgop, + const size_t ispecint, + struct htgop_spectral_interval* interval) +{ + const double* wave_numbers; + const struct darray_double* quadratures; + size_t n; + if(!htgop || !interval) return RES_BAD_ARG; + HTGOP(get_sw_spectral_intervals_count(htgop, &n)); + if(ispecint >= n) { + log_err(htgop, "%s: invalid long wave spectral interval `%lu'.\n", + FUNC_NAME, (unsigned long)ispecint); + return RES_BAD_ARG; + } + wave_numbers = darray_double_cdata_get(&htgop->sw_specints.wave_numbers); + quadratures = darray_dbllst_cdata_get(&htgop->sw_specints.quadratures); + interval->wave_numbers[0] = wave_numbers[ispecint+0]; + interval->wave_numbers[1] = wave_numbers[ispecint+1]; + interval->quadrature = darray_double_cdata_get(&quadratures[ispecint]); + interval->quadrature_length = darray_double_size_get(&quadratures[ispecint]); + return RES_OK; +} + /******************************************************************************* * Local functions ******************************************************************************/ diff --git a/src/htgop.h b/src/htgop.h @@ -43,6 +43,57 @@ struct mem_allocator; /* Forward declaration of opaque data types */ struct htgop; +struct htgop_ground { + double temperature; /* In Kelvin */ + double lw_emissivity; /* Long wave emissivity */ + double sw_emissivity; /* Short wave emissivity */ +}; + +struct htgop_spectral_interval { + double wave_numbers[2]; /* Lower/Upper wave number of the interval */ + const double* quadrature; /* Weights of the spectral interval quadrature */ + size_t quadrature_length; /* #quadrature points of the interval */ +}; + +struct htgop_level { + double pressure; /* In Pascal */ + double temperature; /* In Kelvin */ + double height; /* In meter */ +}; + +struct htgop_layer { + double x_h2o_nominal; /* Nominal molar fraction of water vapor */ + const double* x_h2o_tab; /* Tabulated xH2O */ + size_t tab_length; /* Length of the tabulated xH2O */ + size_t lw_spectral_intervals_count; + size_t sw_spectral_intervals_count; + const void* data__; /* Internal data */ +}; + +struct htgop_layer_lw_spectral_interval { + const double* ka_nominal; /* Per quadrature point absorption coef */ + size_t quadrature_length; + const void* data__; /* Internal data */ +}; + +struct htgop_layer_lw_spectral_interval_tab { + const double* ka_tab; /* Tabulated absorption coef */ + size_t tab_length; +}; + +struct htgop_layer_sw_spectral_interval { + const double* ka_nominal; /* Per quadrature point absorption coef */ + const double* ks_nominal; /* Per quadrature point scatteriing coef */ + size_t quadrature_length; + const void* data__; /* Internal data */ +}; + +struct htgop_layer_sw_spectral_interval_tab { + const double* ka_tab; /* Tabulated absorption coef */ + const double* ks_tab; /* Tabulated scatteriing coef */ + size_t tab_length; +}; + BEGIN_DECLS /******************************************************************************* @@ -73,6 +124,89 @@ htgop_load_stream (struct htgop* htgop, FILE* stream); +HTGOP_API res_T +htgop_get_ground + (const struct htgop* htgop, + struct htgop_ground* ground); + +HTGOP_API res_T +htgop_get_layers_count + (const struct htgop* htgop, + size_t* nlayers); + +HTGOP_API res_T +htgop_get_levels_count + (const struct htgop* htgop, + size_t* nlevels); + +HTGOP_API res_T +htgop_get_level + (const struct htgop* htgop, + const size_t ilevel, + struct htgop_level* level); + +HTGOP_API res_T +htgop_get_layer + (const struct htgop* htgop, + const size_t ilayer, + struct htgop_layer* layer); + +HTGOP_API res_T +htgop_get_lw_spectral_intervals_count + (const struct htgop* htgop, + size_t* nspecints); + +HTGOP_API res_T +htgop_get_sw_spectral_intervals_count + (const struct htgop* htgop, + size_t* nspecints); + +HTGOP_API res_T +htgop_get_lw_spectral_intervals_wave_numbers + (const struct htgop* htgop, + const double* wave_numbers[]); + +HTGOP_API res_T +htgop_get_sw_spectral_intervals_wave_numbers + (const struct htgop* htgop, + const double* wave_numbers[]); + +HTGOP_API res_T +htgop_get_lw_spectral_interval + (const struct htgop* htgop, + const size_t ispectral_interval, + struct htgop_spectral_interval* interval); + +HTGOP_API res_T +htgop_get_sw_spectral_interval + (const struct htgop* htgop, + const size_t ispectral_interval, + struct htgop_spectral_interval* interval); + +HTGOP_API res_T +htgop_layer_get_lw_spectral_interval + (const struct htgop_layer* layer, + const size_t ispectral_interval, + struct htgop_layer_lw_spectral_interval* spectral_interval); + +HTGOP_API res_T +htgop_layer_get_sw_spectral_interval + (const struct htgop_layer* layer, + const size_t ispectral_interval, + struct htgop_layer_sw_spectral_interval* spectral_interval); + +HTGOP_API res_T +htgop_layer_lw_spectral_interval_get_tab + (const struct htgop_layer_lw_spectral_interval* spectral_interval, + const size_t iquadrature_point, + struct htgop_layer_lw_spectral_interval_tab* tab); + +HTGOP_API res_T +htgop_layer_sw_spectral_interval_get_tab + (const struct htgop_layer_sw_spectral_interval* spectral_interval, + const size_t iquadrature_point, + struct htgop_layer_sw_spectral_interval_tab* tab); + END_DECLS #endif /* HTGOP */ diff --git a/src/htgop_c.h b/src/htgop_c.h @@ -22,25 +22,13 @@ #include <rsys/dynamic_array.h> #include <rsys/ref_count.h> -struct ground { - double temperature; /* In Kelvin */ - double lw_emissivity; /* Long wave emissivity */ - double sw_emissivity; /* Short wave emissivity */ -}; - -struct level { - double pressure; /* In Pascal */ - double temperature; /* In Kelvin */ - double height; /* In meter */ -}; - /* Generate the dynamic array of level */ #define DARRAY_NAME level -#define DARRAY_DATA struct level +#define DARRAY_DATA struct htgop_level #include <rsys/dynamic_array.h> struct htgop { - struct ground ground; + struct htgop_ground ground; /* Description of the spectral intervals for the short/long wave domain */ struct spectral_intervals lw_specints; diff --git a/src/htgop_reader.h b/src/htgop_reader.h @@ -0,0 +1,72 @@ +/* Copyright (C) |Meso|Star> 2018 (contact@meso-star.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#ifndef HTGOP_READER_H +#define HTGOP_READER_H + +#include <rsys/rsys.h> +#include <rsys/stretchy_array.h> +#include <string.h> + +struct reader { + FILE* stream; + const char* name; + size_t iline; + char* line; +}; + +static INLINE void +reader_init(struct reader* rdr, FILE* stream, const char* name) +{ + ASSERT(rdr && stream && name); + memset(rdr, 0, sizeof(struct reader)); + rdr->stream = stream; + rdr->name = name; + rdr->iline = 0; + rdr->line = sa_add(rdr->line, 128); + ASSERT(rdr->line); +} + +static INLINE void +reader_release(struct reader* rdr) +{ + ASSERT(rdr); + sa_release(rdr->line); +} + +/* Read a non empty line */ +static INLINE char* +read_line(struct reader* rdr) +{ + const int chunk = 32; + + do { + if(!fgets(rdr->line, (int)sa_size(rdr->line), rdr->stream)) return NULL; + ++rdr->iline; + + /* Ensure that the whole line is read */ + while(!strrchr(rdr->line, '\n') && !feof(rdr->stream)) { + CHK(fgets(sa_add(rdr->line, (size_t)chunk), chunk, rdr->stream)); + } + + rdr->line[strcspn(rdr->line, "#\n\r")] = '\0'; /* Rm new line & comments */ + } while(strspn(rdr->line, " \t") == strlen(rdr->line)); /* Empty line */ + return rdr->line; +} + + + +#endif /* HTGOP_READER_H */ +