star-hitran

Load line-by-line data from the HITRAN database
git clone git://git.meso-star.fr/star-hitran.git
Log | Files | Refs | README | LICENSE

commit 2177967ab1027df692bc2c76d6a5c1c44474cab9
parent 4867179150e9c9208de8c14acb7e62466c54eb59
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Mon, 14 Feb 2022 16:32:31 +0100

Add and test getters on the loaded transitions

Diffstat:
Msrc/shitran.h | 10++++++++++
Msrc/shitran_transitions.c | 20++++++++++++++++++++
Msrc/test_shitran_transitions.c | 56++++++++++++++++++++++++++++++++++++++++++++------------
3 files changed, 74 insertions(+), 12 deletions(-)

diff --git a/src/shitran.h b/src/shitran.h @@ -186,6 +186,16 @@ SHITRAN_API res_T shitran_transitions_ref_put (struct shitran_transitions* transitions); +SHITRAN_API res_T +shitran_transitions_get_count + (const struct shitran_transitions* transitions, + size_t* ntransitions); + +SHITRAN_API res_T +shitran_transitions_get + (const struct shitran_transitions* transitions, + const struct shitran_transition* transitions_list[]); + END_DECLS #endif /* SHITRAN_H */ diff --git a/src/shitran_transitions.c b/src/shitran_transitions.c @@ -285,4 +285,24 @@ shitran_transitions_ref_put(struct shitran_transitions* transitions) return RES_OK; } +res_T +shitran_transitions_get_count + (const struct shitran_transitions* transitions, + size_t* ntransitions) +{ + if(!transitions || !ntransitions) return RES_BAD_ARG; + *ntransitions = darray_transition_size_get(&transitions->transitions); + return RES_OK; +} + +res_T +shitran_transitions_get + (const struct shitran_transitions* transitions, + const struct shitran_transition* transitions_list[]) +{ + if(!transitions || !transitions_list) return RES_BAD_ARG; + *transitions_list = darray_transition_cdata_get(&transitions->transitions); + return RES_OK; +} + #endif /* SHITRAN_TRANSITIONS_H */ diff --git a/src/test_shitran_transitions.c b/src/test_shitran_transitions.c @@ -23,16 +23,6 @@ #include <string.h> -static const struct shitran_transition g_transitions[] = { - {0.000134, 2.672E-38, 0.0533, 0.410, 608.4727, 0.79, 0.000060, 1, 4}, - {0.000379, 1.055E-39, 0.0418, 0.329,1747.9686, 0.79, 0.000110, 1, 5}, - {0.000448, 5.560E-38, 0.0490, 0.364,1093.0269, 0.79, 0.000060, 1, 4}, - {0.000686, 1.633E-36, 0.0578, 0.394, 701.1162, 0.79, 0.000180, 1, 4}, - {0.000726, 6.613E-33, 0.0695, 0.428, 402.3295, 0.79, 0.000240, 1, 3} -}; -static const size_t g_ntransitions = - sizeof(g_transitions) / sizeof(struct shitran_transition); - static void print_transitions (FILE* fp, @@ -59,7 +49,7 @@ print_transitions transitions[i].isotope_id_local == 9 ? 0 : transitions[i].isotope_id_local+1, transitions[i].wavenumber, transitions[i].intensity, - (int)(transitions[i].gamma_air*10000), + (int)(transitions[i].gamma_air*10000+0.5/*round*/), transitions[i].gamma_self, transitions[i].lower_state_energy, transitions[i].n_air, @@ -67,15 +57,44 @@ print_transitions } } +static int +transition_eq + (const struct shitran_transition* tr0, + const struct shitran_transition* tr1) +{ + CHK(tr0 && tr1); + return tr0->wavenumber == tr1->wavenumber + && tr0->intensity == tr1->intensity + && tr0->gamma_air == tr1->gamma_air + && tr0->gamma_self == tr1->gamma_self + && tr0->lower_state_energy == tr1->lower_state_energy + && tr0->n_air == tr1->n_air + && tr0->delta_air == tr1->delta_air + && tr0->molecule_id == tr1->molecule_id + && tr0->isotope_id_local == tr1->isotope_id_local; +} + static void test_load(struct shitran* shitran) { + const struct shitran_transition transitions[] = { + {0.000134, 2.672E-38, 0.0533, 0.410, 608.4727, 0.79, 0.000060, 1, 4}, + {0.000379, 1.055E-39, 0.0418, 0.329,1747.9686, 0.79, 0.000110, 1, 5}, + {0.000448, 5.560E-38, 0.0490, 0.364,1093.0269, 0.79, 0.000060, 1, 4}, + {0.000686, 1.633E-36, 0.0578, 0.394, 701.1162, 0.79, 0.000180, 1, 4}, + {0.000726, 6.613E-33, 0.0695, 0.428, 402.3295, 0.79, 0.000240, 1, 3} + }; + const size_t ntransitions = + sizeof(transitions) / sizeof(struct shitran_transition); + struct shitran_transitions* trs = NULL; + const struct shitran_transition* trs_list = NULL; const char* filename = "test_transitions.txt"; FILE* fp = NULL; + size_t i, n; CHK(fp = fopen(filename, "w+")); - print_transitions(fp, g_transitions, g_ntransitions); + print_transitions(fp, transitions, ntransitions); rewind(fp); CHK(shitran_transitions_load_stream(NULL, fp, NULL, &trs) == RES_BAD_ARG); @@ -83,6 +102,19 @@ test_load(struct shitran* shitran) CHK(shitran_transitions_load_stream(shitran, fp, NULL, NULL) == RES_BAD_ARG); CHK(shitran_transitions_load_stream(shitran, fp, NULL, &trs) == RES_OK); + CHK(shitran_transitions_get_count(NULL, &n) == RES_BAD_ARG); + CHK(shitran_transitions_get_count(trs, NULL) == RES_BAD_ARG); + CHK(shitran_transitions_get_count(trs, &n) == RES_OK); + CHK(n == ntransitions); + + CHK(shitran_transitions_get(NULL, &trs_list) == RES_BAD_ARG); + CHK(shitran_transitions_get(trs, NULL) == RES_BAD_ARG); + CHK(shitran_transitions_get(trs, &trs_list) == RES_OK); + + FOR_EACH(i, 0, n) { + CHK(transition_eq(trs_list+i, transitions+i)); + } + CHK(shitran_transitions_ref_get(NULL) == RES_BAD_ARG); CHK(shitran_transitions_ref_get(trs) == RES_OK); CHK(shitran_transitions_ref_put(NULL) == RES_BAD_ARG);