stardis-green

Post-processing of green functions
git clone git://git.meso-star.fr/stardis-green.git
Log | Files | Refs | README | LICENSE

commit afe7ab461f39b3be4609690866d2bccb40f4d922
parent fb07d7b9647fa30361039fea0260c373c57237e3
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Thu,  4 Jun 2020 18:39:36 +0200

Remove a hack and add missing return codes checks

Diffstat:
Msrc/green-compute.c | 48+++++++++++++++++++++++-------------------------
Msrc/green-input.c | 63++++++++++-----------------------------------------------------
Msrc/green-output.c | 6+++---
Msrc/green-types.h | 53++++-------------------------------------------------
4 files changed, 40 insertions(+), 130 deletions(-)

diff --git a/src/green-compute.c b/src/green-compute.c @@ -120,21 +120,21 @@ build_green_table name = get_description_name(desc); if(DESC_IS_T(desc->type)) { MK_VAR("%s.T"); - str_set(&green->table[i].end_name, buf); + ERR(str_set(&green->table[i].end_name, buf)); green->table[i].end_value = desc->d.t_boundary.imposed_temperature; green->table[i].end_defined = 1; INSERT(i, end); } else if(DESC_IS_H(desc->type)) { MK_VAR("%s.T"); - str_set(&green->table[i].end_name, buf); + ERR(str_set(&green->table[i].end_name, buf)); green->table[i].end_value = desc->d.h_boundary.imposed_temperature; green->table[i].end_defined = 1; INSERT(i, end); } else if(DESC_IS_F(desc->type)) { MK_VAR("%s.F"); - str_set(&green->table[i].other_name, buf); + ERR(str_set(&green->table[i].other_name, buf)); green->table[i].other_value = desc->d.f_boundary.imposed_flux; green->table[i].other_defined = 1; INSERT(i, other); @@ -142,19 +142,19 @@ build_green_table else if(DESC_IS_MEDIUM(desc->type)) { if(desc->type == DESC_MAT_SOLID) { MK_VAR("%s.T"); - str_set(&green->table[i].end_name, buf); + ERR(str_set(&green->table[i].end_name, buf)); green->table[i].end_value = desc->d.solid.imposed_temperature; green->table[i].end_defined = 1; if(green->table[i].end_value < 0) green->table[i].end_unknown = 1; INSERT(i, end); MK_VAR("%s.VP"); - str_set(&green->table[i].other_name, buf); + ERR(str_set(&green->table[i].other_name, buf)); green->table[i].other_value = desc->d.solid.vpower; green->table[i].other_defined = 1; INSERT(i, other); } else { MK_VAR("%s.T"); - str_set(&green->table[i].end_name, buf); + ERR(str_set(&green->table[i].end_name, buf)); green->table[i].end_value = desc->d.fluid.imposed_temperature; green->table[i].end_defined = 1; if(green->table[i].end_value < 0) green->table[i].end_unknown = 1; @@ -169,7 +169,7 @@ build_green_table /* Ambient ID is desc_count */ ambient_id = green->counts.desc_count; desc = green->descriptions + ambient_id; - str_set(&green->table[ambient_id].end_name, "AMBIENT"); + ERR(str_set(&green->table[ambient_id].end_name, "AMBIENT")); green->table[ambient_id].end_value = green->ambient_temp; green->table[ambient_id].end_defined = 1; INSERT(ambient_id, end); @@ -246,27 +246,29 @@ green_compute_1 static res_T parse_line (const char* file_name, - char* line, + const int64_t idx, struct green* green, struct applied_settings_elt* settings) { res_T res = RES_OK; - struct str keep; int name_count = 0; struct str name; - char* tk = NULL, * tok_ctx = NULL; + char* tk = NULL; + char* tok_ctx = NULL; + const struct str* keep_line = darray_str_cdata_get(&green->settings) + idx; + struct str line; - ASSERT(file_name && line && green); + ASSERT(file_name && green); - str_init(green->allocator, &keep); + str_init(green->allocator, &line); str_init(green->allocator, &name); - ERR(str_set(&keep, line)); + ERR(str_set(&line, str_cget(keep_line))); /* At least one name=value, no name without value */ for(;;) { struct variable_data* vd; - tk = strtok_r(name_count ? NULL : line, "=", &tok_ctx); + tk = strtok_r(name_count ? NULL : str_get(&line), "=", &tok_ctx); if(tk) { char* c; c = tk + strlen(tk) - 1; @@ -287,14 +289,14 @@ parse_line } else break; } - str_set(&name, tk); + ERR(str_set(&name, tk)); CHK_TOK(strtok_r(NULL, " \t", &tok_ctx), "value"); vd = htable_variable_ptr_find(&green->variable_ptrs, &name); if(!vd || !vd->used) { /* Name should exist */ if(!vd) { logger_print(green->logger, LOG_ERROR, - "Invalid data (unknown name: '%s')", + "Invalid variable name: '%s'\n", str_cget(&name)); res = RES_BAD_ARG; goto error; @@ -302,20 +304,20 @@ parse_line logger_print(green->logger, LOG_WARNING, "Attempt to change unused variable '%s'\n", str_cget(&name)); logger_print(green->logger, LOG_WARNING, "In file '%s':\n", file_name); - logger_print(green->logger, LOG_WARNING, "%s\n", str_cget(&keep)); + logger_print(green->logger, LOG_WARNING, "%s\n", str_cget(keep_line)); } ERR(cstr_to_double(tk, ((double*)settings) + vd->idx)); name_count++; } end: - str_release(&keep); + str_release(&line); str_release(&name); return res; error: logger_print(green->logger, LOG_ERROR, "Invalid line in file '%s':\n", file_name); - logger_print(green->logger, LOG_ERROR, "%s\n", str_cget(&keep)); + logger_print(green->logger, LOG_ERROR, "%s\n", str_cget(keep_line)); goto end; } @@ -330,7 +332,7 @@ green_compute struct applied_settings_elt** settings = NULL; ASSERT(green && in_name); - sz = darray_line_size_get(&green->settings); + sz = darray_str_size_get(&green->settings); ASSERT(sz < INT64_MAX); settings = MEM_CALLOC(green->allocator, green->nthreads, sizeof(*settings)); @@ -342,7 +344,6 @@ green_compute omp_set_num_threads((int)green->nthreads); #pragma omp parallel for schedule(static) for(i = 0; i < (int64_t)sz; i++) { - char* line = darray_char_data_get(darray_line_data_get(&green->settings) + i); struct result* result = darray_result_data_get(&green->results) + i; res_T tmp_res = RES_OK; int t = omp_get_thread_num(); @@ -361,12 +362,9 @@ green_compute /* Apply settings */ applied_settings_set_defaults(green, settings[t]); - tmp_res = parse_line(in_name, line, green, settings[t]); + tmp_res = parse_line(in_name, i, green, settings[t]); if(tmp_res != RES_OK) { res = tmp_res; - logger_print(green->logger, LOG_ERROR, - "Cannot parse settings line: %s\n", - str_cget(&result->keep)); continue; } /* Compute */ diff --git a/src/green-input.c b/src/green-input.c @@ -127,48 +127,6 @@ error: goto end; } - -/* BEGIN HACK */ - -#include <rsys/ref_count.h> -struct txtrdr { - FILE* stream; /* Stream of the text to read */ - struct str name; /* Stream name */ - size_t nlines; /* # read lines */ - struct darray_char line; /* Buffer storing the read line */ - - /* String of chars from which the remaining line chars are skipped */ - char reject[4]; - - /* Boolean defining if the stream is internally managed or not, i.e. if it - * has to be closed on text_reader release or not */ - int manage_stream; - - struct mem_allocator* allocator; - ref_T ref; -}; - -static INLINE res_T -txtrdr_copy_line_and_release - (struct txtrdr* txtrdr, - struct darray_char* line) -{ - res_T res = RES_OK; - ASSERT(txtrdr && line); - ERR(darray_char_copy_and_release(line, &txtrdr->line)); - ERR(darray_char_resize(&txtrdr->line, 32)); -exit: - return res; -error: - goto exit; -} - - -/* END HACK */ - - - - res_T green_read_settings (struct green* green, @@ -181,7 +139,7 @@ green_read_settings ASSERT(green && in_name); stream = fopen(in_name, "r"); - if (!stream) { + if(!stream) { logger_print(green->logger, LOG_ERROR, "Cannot open model file '%s'\n", in_name); @@ -189,25 +147,24 @@ green_read_settings goto error; } txtrdr_stream(green->allocator, stream, in_name, '#', &txtrdr); - for (;;) { + for(;;) { char* line; size_t sz; ERR(txtrdr_read_line(txtrdr)); line = txtrdr_get_line(txtrdr); - if (!line) break; - sz = darray_line_size_get(&green->settings); - ERR(darray_line_resize(&green->settings, 1 + sz)); - ERR(darray_result_resize(&green->results, 1 + sz)); - ERR(txtrdr_copy_line_and_release(txtrdr, - darray_line_data_get(&green->settings) + sz)); - str_set(&darray_result_data_get(&green->results)[sz].keep, line); + if(!line) break; + sz = darray_str_size_get(&green->settings); + ERR(darray_str_resize(&green->settings, 1 + sz)); + ERR(str_set(darray_str_data_get(&green->settings) + sz, line)); } + ERR(darray_result_resize(&green->results, + darray_str_size_get(&green->settings))); txtrdr_ref_put(txtrdr); txtrdr = NULL; exit: - if (stream) fclose(stream); - if (txtrdr) txtrdr_ref_put(txtrdr); + if(stream) fclose(stream); + if(txtrdr) txtrdr_ref_put(txtrdr); return res; error: goto exit; diff --git a/src/green-output.c b/src/green-output.c @@ -106,13 +106,13 @@ green_print_result size_t i, sz; ASSERT(green && out_stream); - sz = darray_line_size_get(&green->settings); + sz = darray_str_size_get(&green->settings); for (i = 0; i < sz; i++) { struct result* result = darray_result_data_get(&green->results) + i; + const char* line = str_cget(darray_str_data_get(&green->settings) + i); if (mode & MODE_EXTENTED_RESULTS) - fprintf(out_stream, "%g +/- %g ; %s\n", result->E, result->STD, - str_cget(&result->keep)); + fprintf(out_stream, "%g +/- %g ; %s\n", result->E, result->STD, line); else fprintf(out_stream, "%g %g\n", result->E, result->STD); } } diff --git a/src/green-types.h b/src/green-types.h @@ -21,6 +21,7 @@ #include <rsys/hash_table.h> #include <rsys/dynamic_array.h> #include <rsys/dynamic_array_char.h> +#include <rsys/dynamic_array_str.h> #include <string.h> #include <omp.h> @@ -239,57 +240,12 @@ struct variable_data { #define HTABLE_KEY_FUNCTOR_COPY_AND_RELEASE str_copy_and_release #include <rsys/hash_table.h> -#define DARRAY_NAME line -#define DARRAY_DATA struct darray_char -#define DARRAY_FUNCTOR_INIT darray_char_init -#define DARRAY_FUNCTOR_RELEASE darray_char_release -#define DARRAY_FUNCTOR_COPY darray_char_copy -#define DARRAY_FUNCTOR_COPY_AND_RELEASE darray_char_copy_and_release -#include <rsys/dynamic_array.h> - struct result { double E, STD; - struct str keep; }; -static FINLINE void -result_init(struct mem_allocator* alloc, struct result* data) -{ - ASSERT(alloc && data); - str_init(alloc, &data->keep); -} - -static FINLINE void -result_release(struct result* data) -{ - ASSERT(data); - str_release(&data->keep); -} - -static FINLINE res_T -result_copy(struct result* dst, struct result const* src) -{ - ASSERT(dst && src); - dst->E = src->E; - dst->STD = src->STD; - return str_copy(&dst->keep, &src->keep); -} - -static FINLINE res_T -result_copy_and_release(struct result* dst, struct result* src) -{ - ASSERT(dst && src); - dst->E = src->E; - dst->STD = src->STD; - return str_copy_and_release(&dst->keep, &src->keep); -} - #define DARRAY_NAME result #define DARRAY_DATA struct result -#define DARRAY_FUNCTOR_INIT result_init -#define DARRAY_FUNCTOR_RELEASE result_release -#define DARRAY_FUNCTOR_COPY result_copy -#define DARRAY_FUNCTOR_COPY_AND_RELEASE result_copy_and_release #include <rsys/dynamic_array.h> /* @@ -307,7 +263,7 @@ struct green { int references_checked, unused_variables, unknown_variables; unsigned nthreads; struct htable_variable_ptr variable_ptrs; - struct darray_line settings; + struct darray_str settings; struct darray_result results; }; @@ -333,7 +289,7 @@ green_init green->unknown_variables = 0; green->nthreads = MMIN(nthreads, (unsigned)omp_get_num_procs()); htable_variable_ptr_init(alloc, &green->variable_ptrs); - darray_line_init(alloc, &green->settings); + darray_str_init(alloc, &green->settings); darray_result_init(alloc, &green->results); } @@ -354,7 +310,7 @@ green_release MEM_RM(green->allocator, green->samples); green->allocator = NULL; htable_variable_ptr_release(&green->variable_ptrs); - darray_line_release(&green->settings); + darray_str_release(&green->settings); darray_result_release(&green->results); } @@ -368,7 +324,6 @@ green_read_settings (struct green* green, const char* in_name); - /* * Different types of descriptions read from the binary file */