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:
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 */
+