stardis-green

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

commit 588ccdb4993a859e9fc48238c2cf028e56ba6fc6
parent ed683d34c04acd7e9ad564a7ed8ca09bfc7df9be
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Wed, 23 Sep 2020 10:46:12 +0200

Allow unsteady green computations

Diffstat:
Msrc/green-compute.c | 111+++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------
Msrc/green-output.c | 95++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------
Msrc/green-types.h | 36+++++++++++++++++++++++-------------
3 files changed, 163 insertions(+), 79 deletions(-)

diff --git a/src/green-compute.c b/src/green-compute.c @@ -38,17 +38,17 @@ check_green_table_variables_use ASSERT(green); ASSERT(!green->references_checked); /* Fix double call in caller */ - /* Clear previous data */ - FOR_EACH(i, 0, 1 + green->counts.desc_count) { - green->table[i].end_weight = 0; - green->table[i].other_weight = 0; - } FOR_EACH(i, 0, green->counts.ok_count) { const struct sample* sample = green->samples + i; unsigned id = sample->header.end_id; - ASSERT(!DESC_IS_SF(green->descriptions[id].type)); - ASSERT(id <= green->counts.desc_count); /* Ambient ID is desc_count */ - green->table[id].end_weight++; + /* Ambient ID is desc_count */ + ASSERT(id <= green->counts.desc_count); + ASSERT(id == green->counts.desc_count + || DESC_HOLDS_T(green->descriptions[id].type)); + if(sample->header.at_initial) + green->table[id].initial_T_weight++; + else + green->table[id].imposed_T_weight++; FOR_EACH(j, 0, sample->header.pw_count) { const double w = sample->pw_weights[j]; @@ -115,22 +115,25 @@ build_green_table init_table_elt(green->allocator, green->table + i); check_green_table_variables_use(green); + FOR_EACH(i, 0, green->counts.desc_count) { desc = green->descriptions + i; name = get_description_name(desc); if(DESC_IS_T(desc->type)) { MK_VAR("%s.T"); - 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); + ERR(str_set(&green->table[i].imposed_T_name, buf)); + ASSERT(desc->d.t_boundary.imposed_temperature >= 0); + green->table[i].imposed_T_value = desc->d.t_boundary.imposed_temperature; + green->table[i].imposed_T_defined = 1; + INSERT(i, imposed_T); } else if(DESC_IS_H(desc->type)) { MK_VAR("%s.T"); - 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); + ERR(str_set(&green->table[i].imposed_T_name, buf)); + ASSERT(desc->d.h_boundary.imposed_temperature >= 0); + green->table[i].imposed_T_value = desc->d.h_boundary.imposed_temperature; + green->table[i].imposed_T_defined = 1; + INSERT(i, imposed_T); } else if(DESC_IS_F(desc->type)) { MK_VAR("%s.F"); @@ -142,11 +145,19 @@ build_green_table else if(DESC_IS_MEDIUM(desc->type)) { if(desc->type == DESC_MAT_SOLID) { MK_VAR("%s.T"); - 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); + ERR(str_set(&green->table[i].imposed_T_name, buf)); + green->table[i].imposed_T_value = desc->d.solid.imposed_temperature; + green->table[i].imposed_T_defined = 1; + if(green->table[i].imposed_T_value < 0) + green->table[i].imposed_T_unknown = 1; + INSERT(i, imposed_T); + MK_VAR("%s.Tinit"); + ERR(str_set(&green->table[i].initial_T_name, buf)); + green->table[i].initial_T_value = desc->d.solid.tinit; + green->table[i].initial_T_defined = 1; + if(green->table[i].initial_T_value < 0) + green->table[i].initial_T_unknown = 1; + INSERT(i, initial_T); MK_VAR("%s.VP"); ERR(str_set(&green->table[i].other_name, buf)); green->table[i].other_value = desc->d.solid.vpower; @@ -154,11 +165,19 @@ build_green_table INSERT(i, other); } else { MK_VAR("%s.T"); - 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; - INSERT(i, end); + ERR(str_set(&green->table[i].imposed_T_name, buf)); + green->table[i].imposed_T_value = desc->d.fluid.imposed_temperature; + green->table[i].imposed_T_defined = 1; + if(green->table[i].imposed_T_value < 0) + green->table[i].imposed_T_unknown = 1; + INSERT(i, imposed_T); + MK_VAR("%s.Tinit"); + ERR(str_set(&green->table[i].initial_T_name, buf)); + green->table[i].initial_T_value = desc->d.fluid.tinit; + green->table[i].initial_T_defined = 1; + if(green->table[i].initial_T_value < 0) + green->table[i].initial_T_unknown = 1; + INSERT(i, initial_T); } } else if(desc->type == DESC_SOLID_FLUID_CONNECT) { @@ -169,10 +188,10 @@ build_green_table /* Ambient ID is desc_count */ ambient_id = green->counts.desc_count; desc = green->descriptions + ambient_id; - 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); + ERR(str_set(&green->table[ambient_id].imposed_T_name, "AMBIENT")); + green->table[ambient_id].imposed_T_value = green->ambient_temp; + green->table[ambient_id].imposed_T_defined = 1; + INSERT(ambient_id, imposed_T); end: MEM_RM(green->allocator, buf); @@ -190,7 +209,8 @@ applied_settings_set_defaults { unsigned i; FOR_EACH(i, 0, 1 + green->counts.desc_count) { - settings[i].end_value = green->table[i].end_value; + settings[i].imposed_T_value = green->table[i].imposed_T_value; + settings[i].initial_T_value = green->table[i].initial_T_value; settings[i].other_value = green->table[i].other_value; } } @@ -216,8 +236,15 @@ green_compute_1 || DESC_IS_T(green->descriptions[id].type) || DESC_IS_H(green->descriptions[id].type) || DESC_IS_MEDIUM(green->descriptions[id].type)); - ASSERT(green->table[id].end_defined && !green->table[id].end_unknown); - Ti = settings[id].end_value; + if(sample->header.at_initial) { + ASSERT(green->table[id].initial_T_defined + && !green->table[id].initial_T_unknown); + Ti = settings[id].initial_T_value; + } else { + ASSERT(green->table[id].imposed_T_defined + && !green->table[id].imposed_T_unknown); + Ti = settings[id].imposed_T_value; + } FOR_EACH(j, 0, sample->header.pw_count) { const double w = sample->pw_weights[j]; @@ -257,6 +284,7 @@ parse_line char* tok_ctx = NULL; const struct str* keep_line = darray_str_cdata_get(&green->settings) + idx; struct str line; + int unused = 0, same = 0; ASSERT(file_name && green); @@ -268,6 +296,7 @@ parse_line /* At least one name=value, no name without value */ for(;;) { struct variable_data* vd; + double prev; tk = strtok_r(name_count ? NULL : str_get(&line), "=", &tok_ctx); if(tk) { char* c; @@ -302,13 +331,23 @@ parse_line goto error; } logger_print(green->logger, LOG_WARNING, - "In file '%s': attempt to change unused variable '%s':\n", - file_name, str_cget(&name)); - logger_print(green->logger, LOG_WARNING, "%s\n", str_cget(keep_line)); + "Attempt to change unused variable '%s'.\n", str_cget(&name)); + unused = 1; } + prev = ((double*)settings)[vd->idx]; ERR(cstr_to_double(tk, ((double*)settings) + vd->idx)); + if(prev == ((double*)settings)[vd->idx]) { + logger_print(green->logger, LOG_WARNING, + "Change variable '%s' to its default value %g.\n", + str_cget(&name), prev); + same = 1; + } name_count++; } + if(unused || same) + logger_print(green->logger, LOG_WARNING, + "In file '%s':\n\t%s\n", + file_name, str_cget(keep_line)); end: str_release(&line); diff --git a/src/green-output.c b/src/green-output.c @@ -73,19 +73,21 @@ short_help name); fprintf(stream, "\n -a <FILE>\n"); - fprintf(stream, " Apply a Green function using the variable settings read from file.\n"); + fprintf(stream, " Apply a Green function using the variable settings " + "read from a file.\n"); fprintf(stream, "\n -e\n"); fprintf(stream, " Use extended format to output Monte-Carlo results.\n"); fprintf(stream, "\n -g <FILE>\n"); - fprintf(stream, " Read a Green function from file.\n"); + fprintf(stream, " Read a Green function from a file.\n"); fprintf(stream, "\n -h\n"); fprintf(stream, " Print this help and exit.\n"); fprintf(stream, "\n -s <FILE>\n"); - fprintf(stream, " Create a summary of a Green function and write it to file.\n"); + fprintf(stream, " Create a summary of a Green function and write it to " + "a file.\n"); fprintf(stream, "\n -t NUM_OF_THREADS\n"); fprintf(stream, " Hint on the number of threads.\n"); @@ -165,10 +167,15 @@ dump_green_info fst = 1; FOR_EACH(i, 0, green->counts.desc_count + 1) { struct table_elt* elt = green->table + i; - if(elt->end_defined && elt->end_weight) { + if(elt->imposed_T_defined && elt->imposed_T_weight > 0) { if(!fst) fprintf(stream, ", "); fst = 0; - fprintf(stream, "%s", str_cget(&elt->end_name)); + fprintf(stream, "%s", str_cget(&elt->imposed_T_name)); + } + if(elt->initial_T_defined && elt->initial_T_weight > 0) { + if(!fst) fprintf(stream, ", "); + fst = 0; + fprintf(stream, "%s", str_cget(&elt->initial_T_name)); } if(elt->other_defined && elt->other_weight) { if(!fst) fprintf(stream, ", "); @@ -190,11 +197,17 @@ dump_green_info fst = 1; FOR_EACH(i, 0, green->counts.desc_count + 1) { struct table_elt* elt = green->table + i; - if(elt->end_defined - && !elt->end_unknown && !elt->end_weight) { + if(elt->imposed_T_defined + && !elt->imposed_T_unknown && elt->imposed_T_weight == 0) { if(!fst) fprintf(stream, ", "); fst = 0; - fprintf(stream, "%s", str_cget(&elt->end_name)); + fprintf(stream, "%s", str_cget(&elt->imposed_T_name)); + } + if(elt->initial_T_defined + && !elt->initial_T_unknown && elt->initial_T_weight == 0) { + if(!fst) fprintf(stream, ", "); + fst = 0; + fprintf(stream, "%s", str_cget(&elt->initial_T_name)); } if(elt->other_defined && !elt->other_unknown && !elt->other_weight) { @@ -218,10 +231,15 @@ dump_green_info fst = 1; FOR_EACH(i, 0, green->counts.desc_count + 1) { struct table_elt* elt = green->table + i; - if(elt->end_unknown) { + if(elt->imposed_T_unknown) { + if(!fst) fprintf(stream, ", "); + fst = 0; + fprintf(stream, "%s", str_cget(&elt->imposed_T_name)); + } + if(elt->initial_T_unknown) { if(!fst) fprintf(stream, ", "); fst = 0; - fprintf(stream, "%s", str_cget(&elt->end_name)); + fprintf(stream, "%s", str_cget(&elt->initial_T_name)); } if(elt->other_defined && !elt->other_weight) { if(!fst) fprintf(stream, ", "); @@ -239,17 +257,31 @@ dump_green_info /* Print result */ fst = 1; FOR_EACH(i, 0, 1 + green->counts.desc_count) { - if(green->table[i].end_weight) { + if(green->table[i].imposed_T_weight > 0) { double k; - CHK(green->table[i].end_defined); + CHK(green->table[i].imposed_T_defined + && green->table[i].imposed_T_value >= 0); if(fst) fprintf(stream, "<p>E[T] = "); else fprintf(stream, " + "); fst = 0; - k = (double)green->table[i].end_weight + k = (double)green->table[i].imposed_T_weight / (double)green->counts.ok_count; - t += k * green->table[i].end_value; + t += k * green->table[i].imposed_T_value; fprintf(stream, "%g * <b>%s</b>", - k, str_cget(&green->table[i].end_name)); + k, str_cget(&green->table[i].imposed_T_name)); + } + if(green->table[i].initial_T_weight > 0) { + double k; + CHK(green->table[i].initial_T_defined + && green->table[i].initial_T_value >= 0); + if(fst) fprintf(stream, "<p>E[T] = "); + else fprintf(stream, " + "); + fst = 0; + k = (double)green->table[i].initial_T_weight + / (double)green->counts.ok_count; + t += k * green->table[i].initial_T_value; + fprintf(stream, "%g * <b>%s</b>", + k, str_cget(&green->table[i].initial_T_name)); } } ASSERT(!fst); @@ -305,7 +337,8 @@ dump_green_info fprintf(stream, " <th>Rho</th>\n"); fprintf(stream, " <th>Cp</th>\n"); fprintf(stream, " <th>Volumic Power</th>\n"); - fprintf(stream, " <th>Temperature</th>\n"); + fprintf(stream, " <th>Imposed temperature</th>\n"); + fprintf(stream, " <th>Initial temperature</th>\n"); fprintf(stream, "</tr>\n"); } sl = &desc->d.solid; @@ -315,7 +348,8 @@ dump_green_info CELL(g, sl->rho); CELL(g, sl->cp); VAR_CELL(i, other); - VAR_CELL(i, end); + VAR_CELL(i, imposed_T); + VAR_CELL(i, initial_T); fprintf(stream, "</tr>\n"); local_count++; } @@ -334,7 +368,8 @@ dump_green_info fprintf(stream, " <th>Name</th>\n"); fprintf(stream, " <th>Rho</th>\n"); fprintf(stream, " <th>Cp</th>\n"); - fprintf(stream, " <th>Temperature</th>\n"); + fprintf(stream, " <th>Imposed temperature</th>\n"); + fprintf(stream, " <th>Initial temperature</th>\n"); fprintf(stream, "</tr>\n"); } fl = &desc->d.fluid; @@ -342,7 +377,8 @@ dump_green_info CELL(s, str_cget(&fl->name)); CELL(g, fl->rho); CELL(g, fl->cp); - VAR_CELL(i, end); + VAR_CELL(i, imposed_T); + VAR_CELL(i, initial_T); fprintf(stream, "</tr>\n"); local_count++; } @@ -365,8 +401,8 @@ dump_green_info bd = &desc->d.t_boundary; fprintf(stream, "<tr>\n"); CELL(s, str_cget(&bd->name)); - ASSERT(green->table[i].end_defined); - VAR_CELL(i, end); + ASSERT(green->table[i].imposed_T_defined); + VAR_CELL(i, imposed_T); fprintf(stream, "</tr>\n"); local_count++; } @@ -391,8 +427,8 @@ dump_green_info bd = &desc->d.t_boundary; fprintf(stream, "<tr>\n"); CELL(s, str_cget(&bd->name)); - ASSERT(green->table[i].end_defined); - VAR_CELL(i, end); + ASSERT(green->table[i].imposed_T_defined); + VAR_CELL(i, imposed_T); CELL(g, bd->emissivity); CELL(g, bd->specular_fraction); CELL(g, bd->hc); @@ -424,8 +460,8 @@ dump_green_info CELL(g, bd->emissivity); CELL(g, bd->specular_fraction); CELL(g, bd->hc); - ASSERT(green->table[i].end_defined); - VAR_CELL(i, end); + ASSERT(green->table[i].imposed_T_defined); + VAR_CELL(i, imposed_T); fprintf(stream, "</tr>\n"); local_count++; } @@ -453,9 +489,8 @@ dump_green_info CELL(g, bd->emissivity); CELL(g, bd->specular_fraction); CELL(g, bd->hc); - ASSERT(green->table[i].end_defined); - ASSERT(green->table[i].end_defined); - VAR_CELL(i, end); + ASSERT(green->table[i].imposed_T_defined); + VAR_CELL(i, imposed_T); fprintf(stream, "</tr>\n"); local_count++; } @@ -494,8 +529,8 @@ dump_green_info fprintf(stream, "</tr>\n"); fprintf(stream, "<tr>\n"); CELL(s, "Ambient"); - ASSERT(green->table[green->counts.desc_count].end_defined); - VAR_CELL(green->counts.desc_count, end); + ASSERT(green->table[green->counts.desc_count].imposed_T_defined); + VAR_CELL(green->counts.desc_count, imposed_T); fprintf(stream, "</tr>\n"); fprintf(stream, "<tr>\n"); CELL(s, "Linearization"); diff --git a/src/green-types.h b/src/green-types.h @@ -122,8 +122,8 @@ enum green_mode { */ struct sample_header { unsigned end_id; - unsigned pw_count; - unsigned fx_count; + unsigned pw_count, fx_count; + char at_initial; }; struct sample { @@ -184,15 +184,17 @@ release_sample */ struct applied_settings_elt { - double end_value; + double imposed_T_value, initial_T_value; double other_value; }; +/* other is used both for power and flux, as no description can have both */ struct table_elt { - struct str end_name, other_name; - double end_value, other_value; - int end_defined, other_defined, end_unknown, other_unknown; - unsigned end_weight; + struct str imposed_T_name, initial_T_name, other_name; + double imposed_T_value, initial_T_value, other_value; + int imposed_T_defined, initial_T_defined, other_defined; + int imposed_T_unknown, initial_T_unknown, other_unknown; + unsigned imposed_T_weight, initial_T_weight; double other_weight; }; @@ -202,15 +204,20 @@ init_table_elt struct table_elt* elt) { ASSERT(alloc && elt); - str_init(alloc, &elt->end_name); + str_init(alloc, &elt->imposed_T_name); + str_init(alloc, &elt->initial_T_name); str_init(alloc, &elt->other_name); - elt->end_value = 0; + elt->imposed_T_value = 0; + elt->initial_T_value = 0; elt->other_value = 0; - elt->end_defined = 0; + elt->imposed_T_defined = 0; + elt->initial_T_defined = 0; elt->other_defined = 0; - elt->end_unknown = 0; + elt->imposed_T_unknown = 0; + elt->initial_T_unknown = 0; elt->other_unknown = 0; - elt->end_weight = 0; + elt->imposed_T_weight = 0; + elt->initial_T_weight = 0; elt->other_weight = 0; } @@ -219,7 +226,8 @@ release_table_elt (struct table_elt* elt) { ASSERT(elt); - str_release(&elt->end_name); + str_release(&elt->imposed_T_name); + str_release(&elt->initial_T_name); str_release(&elt->other_name); } @@ -350,6 +358,8 @@ enum description_type { ((D) == DESC_BOUND_F_FOR_SOLID) #define DESC_IS_SF(D) \ ((D) == DESC_SOLID_FLUID_CONNECT) +#define DESC_HOLDS_T(D) \ + (DESC_IS_MEDIUM(D) || DESC_IS_H(D) || DESC_IS_T(D)) struct mat_fluid { struct str name;