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