htgop

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

commit ffd610cfc8126c75137534d536127ddc167f202a
parent bd9eede00ca75468ec090c10b77f1491ae5c9a8d
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Tue, 30 Jan 2018 11:45:54 +0100

Test the load and getters functions

Diffstat:
A.gitattributes | 1+
Mcmake/CMakeLists.txt | 15++++++++++-----
Aetc.tgz | 2++
Asrc/test_htgop_load.c | 299+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 312 insertions(+), 5 deletions(-)

diff --git a/.gitattributes b/.gitattributes @@ -0,0 +1 @@ +etc.tgz filter=wad diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt @@ -80,16 +80,21 @@ if(NOT NO_TEST) target_link_libraries(${_name} htgop RSys) endfunction() - function(register_test _name) - add_test(${_name} ${ARGN}) - endfunction() - function(new_test _name) build_test(${_name}) - register_test(${_name} ${_name}) + add_test(${_name} ${_name}) endfunction() + get_filename_component(_etc_src "${PROJECT_SOURCE_DIR}/../etc.tgz" ABSOLUTE) + set(_etc_dst ${CMAKE_CURRENT_BINARY_DIR}/etc/) + if(NOT EXISTS ${_etc_dst}) + message(STATUS "Extract ${_etc_src}") + execute_process(COMMAND ${CMAKE_COMMAND} -E tar xzf ${_etc_src}) + endif() + new_test(test_htgop) + build_test(test_htgop_load) + add_test(test_htgop_load test_htgop_load ${_etc_dst}/ecrad_opt_prop.txt) endif() ################################################################################ diff --git a/etc.tgz b/etc.tgz @@ -0,0 +1 @@ +#$# git-wad 7f30f1e0f6e38b0a6d0655bc8c289173c3e8625cc459fdaaf76b5f2afe34f407 12098732 +\ No newline at end of file diff --git a/src/test_htgop_load.c b/src/test_htgop_load.c @@ -0,0 +1,299 @@ +/* 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/>. */ + +#include "htgop.h" +#include "htgop_reader.h" + +#include "test_htgop_utils.h" + +#include <rsys/cstr.h> + +int +main(int argc, char** argv) +{ + struct mem_allocator allocator; + struct reader rdr; + struct htgop* htgop; + struct htgop_ground ground; + struct htgop_layer lay; + struct htgop_level lvl; + struct htgop_spectral_interval specint; + struct htgop_layer_lw_spectral_interval lw_specint; + struct htgop_layer_lw_spectral_interval_tab lw_tab; + struct htgop_layer_sw_spectral_interval sw_specint; + struct htgop_layer_sw_spectral_interval_tab sw_tab; + size_t nlays, nlvls, nspecints_lw, nspecints_sw; + size_t ilay, ilvl, itab, iquad, ispecint; + size_t tab_len; + const double* wnums; + FILE* fp; + unsigned long ul; + double dbl; + + if(argc < 2) { + fprintf(stderr, "Usage: %s FILENAME\n", argv[0]); + return 1; + } + + CHK(mem_init_proxy_allocator(&allocator, &mem_default_allocator) == RES_OK); + + CHK((fp = fopen(argv[1], "r")) != NULL); + reader_init(&rdr, fp, argv[1]); + + CHK(htgop_create(NULL, &allocator, 1, &htgop) == RES_OK); + CHK(htgop_load(NULL, NULL) == RES_BAD_ARG); + CHK(htgop_load(htgop, NULL) == RES_BAD_ARG); + CHK(htgop_load(NULL, argv[1]) == RES_BAD_ARG); + CHK(htgop_load(htgop, argv[1]) == RES_OK); + + /* #levels */ + CHK(htgop_get_levels_count(NULL, NULL) == RES_BAD_ARG); + CHK(htgop_get_levels_count(htgop, NULL) == RES_BAD_ARG); + CHK(htgop_get_levels_count(NULL, &nlvls) == RES_BAD_ARG); + CHK(htgop_get_levels_count(htgop, &nlvls) == RES_OK); + CHK(cstr_to_ulong(read_line(&rdr), &ul) == RES_OK); + CHK(nlvls == ul); + + /* #layers */ + CHK(htgop_get_layers_count(NULL, NULL) == RES_BAD_ARG); + CHK(htgop_get_layers_count(htgop, NULL) == RES_BAD_ARG); + CHK(htgop_get_layers_count(NULL, &nlays) == RES_BAD_ARG); + CHK(htgop_get_layers_count(htgop, &nlays) == RES_OK); + CHK(cstr_to_ulong(read_line(&rdr), &ul) == RES_OK); + CHK(nlays == ul); + + /* Ground temperature */ + CHK(htgop_get_ground(NULL, NULL) == RES_BAD_ARG); + CHK(htgop_get_ground(htgop, NULL) == RES_BAD_ARG); + CHK(htgop_get_ground(NULL, &ground) == RES_BAD_ARG); + CHK(htgop_get_ground(htgop, &ground) == RES_OK); + CHK(cstr_to_double(read_line(&rdr), &dbl) == RES_OK); + CHK(ground.temperature == dbl); + + /* Per level pressure */ + CHK(htgop_get_level(NULL, nlvls, NULL) == RES_BAD_ARG); + CHK(htgop_get_level(htgop, nlvls, NULL) == RES_BAD_ARG); + CHK(htgop_get_level(NULL, 0, NULL) == RES_BAD_ARG); + CHK(htgop_get_level(htgop, 0, NULL) == RES_BAD_ARG); + CHK(htgop_get_level(NULL, nlvls, &lvl) == RES_BAD_ARG); + CHK(htgop_get_level(htgop, nlvls, &lvl) == RES_BAD_ARG); + CHK(htgop_get_level(NULL, 0, &lvl) == RES_BAD_ARG); + FOR_EACH(ilvl, 0, nlvls) { + CHK(htgop_get_level(htgop, ilvl, &lvl) == RES_OK); + CHK(cstr_to_double(read_line(&rdr), &dbl) == RES_OK); + CHK(dbl == lvl.pressure); + } + /* Per level temperature */ + FOR_EACH(ilvl, 0, nlvls) { + CHK(htgop_get_level(htgop, ilvl, &lvl) == RES_OK); + CHK(cstr_to_double(read_line(&rdr), &dbl) == RES_OK); + CHK(dbl == lvl.temperature); + } + /* Per level height */ + FOR_EACH(ilvl, 0, nlvls) { + CHK(htgop_get_level(htgop, ilvl, &lvl) == RES_OK); + CHK(cstr_to_double(read_line(&rdr), &dbl) == RES_OK); + CHK(dbl == lvl.height); + } + + /* Per layer nominal xH2O */ + CHK(htgop_get_layer(NULL, nlays, NULL) == RES_BAD_ARG); + CHK(htgop_get_layer(htgop, nlays, NULL) == RES_BAD_ARG); + CHK(htgop_get_layer(NULL, 0, NULL) == RES_BAD_ARG); + CHK(htgop_get_layer(htgop, 0, NULL) == RES_BAD_ARG); + CHK(htgop_get_layer(NULL, nlays, &lay) == RES_BAD_ARG); + CHK(htgop_get_layer(htgop, nlays, &lay) == RES_BAD_ARG); + CHK(htgop_get_layer(NULL, 0, &lay) == RES_BAD_ARG); + FOR_EACH(ilay, 0, nlays) { + CHK(htgop_get_layer(htgop, ilay, &lay) == RES_OK); + CHK(cstr_to_double(read_line(&rdr), &dbl) == RES_OK); + CHK(dbl == lay.x_h2o_nominal); + } + + /* # tabulated xH2O for each layer */ + tab_len = lay.tab_length; + CHK(cstr_to_ulong(read_line(&rdr), &ul) == RES_OK); + CHK(tab_len == ul); + FOR_EACH(itab, 0, tab_len) { + FOR_EACH(ilay, 0, nlays) { + CHK(htgop_get_layer(htgop, ilay, &lay) == RES_OK); + CHK(cstr_to_double(read_line(&rdr), &dbl) == RES_OK); + CHK(dbl == lay.x_h2o_tab[itab]); + } + } + + /* Ground emissivity */ + CHK(cstr_to_double(read_line(&rdr), &dbl) == RES_OK); + CHK(dbl == ground.lw_emissivity); + CHK(cstr_to_double(read_line(&rdr), &dbl) == RES_OK); + CHK(dbl == ground.sw_emissivity); + + /* #long wave spectral intervals */ + CHK(htgop_get_lw_spectral_intervals_count(NULL, NULL) == RES_BAD_ARG); + CHK(htgop_get_lw_spectral_intervals_count(htgop, NULL) == RES_BAD_ARG); + CHK(htgop_get_lw_spectral_intervals_count(NULL, &nspecints_lw) == RES_BAD_ARG); + CHK(htgop_get_lw_spectral_intervals_count(htgop, &nspecints_lw) == RES_OK); + CHK(cstr_to_ulong(read_line(&rdr), &ul) == RES_OK); + CHK(ul == nspecints_lw); + + /* #short wave spectral intervals */ + CHK(htgop_get_sw_spectral_intervals_count(NULL, NULL) == RES_BAD_ARG); + CHK(htgop_get_sw_spectral_intervals_count(htgop, NULL) == RES_BAD_ARG); + CHK(htgop_get_sw_spectral_intervals_count(NULL, &nspecints_sw) == RES_BAD_ARG); + CHK(htgop_get_sw_spectral_intervals_count(htgop, &nspecints_sw) == RES_OK); + CHK(cstr_to_ulong(read_line(&rdr), &ul) == RES_OK); + CHK(ul == nspecints_sw); + + /* Per LW spectral interval data */ + CHK(htgop_get_lw_spectral_intervals_wave_numbers(NULL, NULL) == RES_BAD_ARG); + CHK(htgop_get_lw_spectral_intervals_wave_numbers(htgop, NULL) == RES_BAD_ARG); + CHK(htgop_get_lw_spectral_intervals_wave_numbers(NULL, &wnums) == RES_BAD_ARG); + CHK(htgop_get_lw_spectral_intervals_wave_numbers(htgop, &wnums) == RES_OK); + CHK(htgop_get_lw_spectral_interval(NULL, nspecints_lw, NULL) == RES_BAD_ARG); + CHK(htgop_get_lw_spectral_interval(htgop, nspecints_lw, NULL) == RES_BAD_ARG); + CHK(htgop_get_lw_spectral_interval(NULL, 0, NULL) == RES_BAD_ARG); + CHK(htgop_get_lw_spectral_interval(htgop, 0, NULL) == RES_BAD_ARG); + CHK(htgop_get_lw_spectral_interval(NULL, nspecints_lw, &specint) == RES_BAD_ARG); + CHK(htgop_get_lw_spectral_interval(htgop, nspecints_lw, &specint) == RES_BAD_ARG); + CHK(htgop_get_lw_spectral_interval(NULL, 0, &specint) == RES_BAD_ARG); + FOR_EACH(ispecint, 0, nspecints_lw) { + CHK(htgop_get_lw_spectral_interval(htgop, ispecint, &specint) == RES_OK); + CHK(specint.wave_numbers[0] == wnums[ispecint+0]); + CHK(specint.wave_numbers[1] == wnums[ispecint+1]); + + CHK(cstr_to_double(read_line(&rdr), &dbl) == RES_OK); + CHK(specint.wave_numbers[0] == dbl); + CHK(cstr_to_double(read_line(&rdr), &dbl) == RES_OK); + CHK(specint.wave_numbers[1] == dbl); + CHK(cstr_to_ulong(read_line(&rdr), &ul) == RES_OK); + CHK(specint.quadrature_length == ul); + + FOR_EACH(iquad, 0, specint.quadrature_length) { + CHK(cstr_to_double(read_line(&rdr), &dbl) == RES_OK); + CHK(specint.quadrature[iquad] == dbl); + } + } + + /* Per SW spectral interval data */ + CHK(htgop_get_sw_spectral_intervals_wave_numbers(NULL, NULL) == RES_BAD_ARG); + CHK(htgop_get_sw_spectral_intervals_wave_numbers(htgop, NULL) == RES_BAD_ARG); + CHK(htgop_get_sw_spectral_intervals_wave_numbers(NULL, &wnums) == RES_BAD_ARG); + CHK(htgop_get_sw_spectral_intervals_wave_numbers(htgop, &wnums) == RES_OK); + CHK(htgop_get_sw_spectral_interval(NULL, nspecints_sw, NULL) == RES_BAD_ARG); + CHK(htgop_get_sw_spectral_interval(htgop, nspecints_sw, NULL) == RES_BAD_ARG); + CHK(htgop_get_sw_spectral_interval(NULL, 0, NULL) == RES_BAD_ARG); + CHK(htgop_get_sw_spectral_interval(htgop, 0, NULL) == RES_BAD_ARG); + CHK(htgop_get_sw_spectral_interval(NULL, nspecints_sw, &specint) == RES_BAD_ARG); + CHK(htgop_get_sw_spectral_interval(htgop, nspecints_sw, &specint) == RES_BAD_ARG); + CHK(htgop_get_sw_spectral_interval(NULL, 0, &specint) == RES_BAD_ARG); + FOR_EACH(ispecint, 0, nspecints_sw) { + CHK(htgop_get_sw_spectral_interval(htgop, ispecint, &specint) == RES_OK); + CHK(specint.wave_numbers[0] == wnums[ispecint+0]); + CHK(specint.wave_numbers[1] == wnums[ispecint+1]); + + CHK(cstr_to_double(read_line(&rdr), &dbl) == RES_OK); + CHK(specint.wave_numbers[0] == dbl); + CHK(cstr_to_double(read_line(&rdr), &dbl) == RES_OK); + CHK(specint.wave_numbers[1] == dbl); + CHK(cstr_to_ulong(read_line(&rdr), &ul) == RES_OK); + CHK(specint.quadrature_length == ul); + + FOR_EACH(iquad, 0, specint.quadrature_length) { + CHK(cstr_to_double(read_line(&rdr), &dbl) == RES_OK); + CHK(specint.quadrature[iquad] == dbl); + } + } + + /* Per layer LW ka data */ + FOR_EACH(ispecint, 0, nspecints_lw) { + CHK(htgop_get_lw_spectral_interval(htgop, ispecint, &specint) == RES_OK); + FOR_EACH(iquad, 0, specint.quadrature_length) { + FOR_EACH(ilay, 0, nlays) { + CHK(htgop_get_layer(htgop, ilay, &lay) == RES_OK); + CHK(htgop_layer_get_lw_spectral_interval(&lay, ispecint, &lw_specint) == RES_OK); + CHK(lw_specint.quadrature_length == specint.quadrature_length); + CHK(cstr_to_double(read_line(&rdr), &dbl) == RES_OK); + CHK(lw_specint.ka_nominal[iquad] == dbl); + } + FOR_EACH(itab, 0, tab_len) { + FOR_EACH(ilay, 0, nlays) { + CHK(htgop_get_layer(htgop, ilay, &lay) == RES_OK); + CHK(htgop_layer_get_lw_spectral_interval(&lay, ispecint, &lw_specint) == RES_OK); + CHK(htgop_layer_lw_spectral_interval_get_tab(&lw_specint, iquad, &lw_tab) == RES_OK); + CHK(lw_tab.tab_length == tab_len); + CHK(cstr_to_double(read_line(&rdr), &dbl) == RES_OK); + CHK(lw_tab.ka_tab[itab] == dbl); + } + } + } + } + + /* Per layer SW ka data */ + FOR_EACH(ispecint, 0, nspecints_sw) { + CHK(htgop_get_sw_spectral_interval(htgop, ispecint, &specint) == RES_OK); + FOR_EACH(iquad, 0, specint.quadrature_length) { + FOR_EACH(ilay, 0, nlays) { + CHK(htgop_get_layer(htgop, ilay, &lay) == RES_OK); + CHK(htgop_layer_get_sw_spectral_interval(&lay, ispecint, &sw_specint) == RES_OK); + CHK(sw_specint.quadrature_length == specint.quadrature_length); + CHK(cstr_to_double(read_line(&rdr), &dbl) == RES_OK); + CHK(sw_specint.ka_nominal[iquad] == dbl); + } + FOR_EACH(itab, 0, tab_len) { + FOR_EACH(ilay, 0, nlays) { + CHK(htgop_get_layer(htgop, ilay, &lay) == RES_OK); + CHK(htgop_layer_get_sw_spectral_interval(&lay, ispecint, &sw_specint) == RES_OK); + CHK(htgop_layer_sw_spectral_interval_get_tab(&sw_specint, iquad, &sw_tab) == RES_OK); + CHK(sw_tab.tab_length == tab_len); + CHK(cstr_to_double(read_line(&rdr), &dbl) == RES_OK); + CHK(sw_tab.ka_tab[itab] == dbl); + } + } + } + } + + /* Per layer SW ks data */ + FOR_EACH(ispecint, 0, nspecints_sw) { + CHK(htgop_get_sw_spectral_interval(htgop, ispecint, &specint) == RES_OK); + FOR_EACH(iquad, 0, specint.quadrature_length) { + FOR_EACH(ilay, 0, nlays) { + CHK(htgop_get_layer(htgop, ilay, &lay) == RES_OK); + CHK(htgop_layer_get_sw_spectral_interval(&lay, ispecint, &sw_specint) == RES_OK); + CHK(sw_specint.quadrature_length == specint.quadrature_length); + CHK(cstr_to_double(read_line(&rdr), &dbl) == RES_OK); + CHK(sw_specint.ks_nominal[iquad] == dbl); + } + FOR_EACH(itab, 0, tab_len) { + FOR_EACH(ilay, 0, nlays) { + CHK(htgop_get_layer(htgop, ilay, &lay) == RES_OK); + CHK(htgop_layer_get_sw_spectral_interval(&lay, ispecint, &sw_specint) == RES_OK); + CHK(htgop_layer_sw_spectral_interval_get_tab(&sw_specint, iquad, &sw_tab) == RES_OK); + CHK(sw_tab.tab_length == tab_len); + CHK(cstr_to_double(read_line(&rdr), &dbl) == RES_OK); + CHK(sw_tab.ks_tab[itab] == dbl); + } + } + } + } + + CHK(fclose(fp) == 0); + reader_release(&rdr); + CHK(htgop_ref_put(htgop) == RES_OK); + check_memory_allocator(&allocator); + mem_shutdown_proxy_allocator(&allocator); + CHK(mem_allocated_size() == 0); + return 0; +} +