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:
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;
+}
+