commit 472c6ce26d2f6dfa4d84018fd6b7a97f95a489c5
parent ca91294a00837991d382c14845b5d184c13291c3
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date: Thu, 14 May 2020 20:32:25 +0200
BugFix: medium creation mechanism was broken
A way to prealloc IDs was required
Diffstat:
6 files changed, 57 insertions(+), 40 deletions(-)
diff --git a/src/stardis-app.c b/src/stardis-app.c
@@ -300,9 +300,10 @@ create_holder
case DESC_BOUND_H_FOR_SOLID:
stardis->counts.hbound_count++;
/* Create an external fluid with imposed temperature */
+ allocate_stardis_medium_id(stardis, &description->d.h_boundary.mat_id);
ERR(create_stardis_fluid(stardis, NULL, 1, 1, is_green, 1, -1,
description->d.h_boundary.imposed_temperature,
- &description->d.h_boundary.mat_id));
+ description->d.h_boundary.mat_id));
logger_print(stardis->logger, LOG_OUTPUT,
"External fluid (id=%u): rho=1 cp=1 T=%g\n",
description->d.h_boundary.mat_id,
@@ -316,10 +317,11 @@ create_holder
} else {
/* Create dummy solid */
size_t sz = darray_media_ptr_size_get(&stardis->media);
+ allocate_stardis_medium_id(stardis, &description->d.h_boundary.mat_id);
ERR(create_stardis_solid(stardis, NULL, 1, 1, 1, 1, is_green, 1, -1,
- -1, 0, &description->d.t_boundary.mat_id));
+ -1, 0, description->d.h_boundary.mat_id));
dummies->dummy_solid = darray_media_ptr_data_get(&stardis->media)[sz];
- dummies->dummy_solid_id = description->d.t_boundary.mat_id;
+ dummies->dummy_solid_id = description->d.h_boundary.mat_id;
logger_print(stardis->logger, LOG_OUTPUT,
"Dummy solid (id=%u): lambda=1 rho=1 cp=1\n",
dummies->dummy_solid_id);
@@ -333,8 +335,9 @@ create_holder
} else {
/* Create dummy fluid */
size_t sz = darray_media_ptr_size_get(&stardis->media);
+ allocate_stardis_medium_id(stardis, &description->d.t_boundary.mat_id);
ERR(create_stardis_fluid(stardis, NULL, 1, 1, is_green, 1, -1,
- -1, &description->d.t_boundary.mat_id));
+ -1, description->d.t_boundary.mat_id));
dummies->dummy_fluid = darray_media_ptr_data_get(&stardis->media)[sz];
dummies->dummy_fluid_id = description->d.t_boundary.mat_id;
logger_print(stardis->logger, LOG_OUTPUT,
@@ -349,8 +352,9 @@ create_holder
} else {
/* Create dummy solid */
size_t sz = darray_media_ptr_size_get(&stardis->media);
+ allocate_stardis_medium_id(stardis, &description->d.t_boundary.mat_id);
ERR(create_stardis_solid(stardis, NULL, 1, 1, 1, 1, is_green, 1, -1,
- -1, 0, &description->d.t_boundary.mat_id));
+ -1, 0, description->d.t_boundary.mat_id));
dummies->dummy_solid = darray_media_ptr_data_get(&stardis->media)[sz];
dummies->dummy_solid_id = description->d.t_boundary.mat_id;
logger_print(stardis->logger, LOG_OUTPUT,
@@ -366,8 +370,9 @@ create_holder
} else {
/* Create dummy fluid */
size_t sz = darray_media_ptr_size_get(&stardis->media);
+ allocate_stardis_medium_id(stardis, &description->d.f_boundary.mat_id);
ERR(create_stardis_fluid(stardis, NULL, 1, 1, is_green, 1, -1, -1,
- &description->d.f_boundary.mat_id));
+ description->d.f_boundary.mat_id));
dummies->dummy_fluid = darray_media_ptr_data_get(&stardis->media)[sz];
dummies->dummy_fluid_id = description->d.f_boundary.mat_id;
logger_print(stardis->logger, LOG_OUTPUT,
@@ -388,18 +393,7 @@ create_holder
struct senc3d_enclosure_header header;
/* Create solid to have ID informed */
stardis->counts.smed_count++;
- ERR(create_stardis_solid(stardis,
- &description->d.solid.name,
- description->d.solid.lambda,
- description->d.solid.rho,
- description->d.solid.cp,
- description->d.solid.delta,
- is_green,
- 0,
- description->d.solid.tinit,
- description->d.solid.imposed_temperature,
- description->d.solid.vpower,
- &description->d.solid.solid_id));
+ allocate_stardis_medium_id(stardis, &description->d.solid.solid_id);
/* Check if delta can fit possible multiple enclosures */
ERR(senc3d_scene_get_enclosure_count_by_medium(stardis->senc3d_scn,
description->d.solid.solid_id, &ecount));
@@ -415,6 +409,7 @@ create_holder
external = 1;
} else {
double d = header.volume / (header.area * 6);
+ ASSERT(d >= 0);
delta_range[0] = MMIN(delta_range[0], d);
delta_range[1] = MMAX(delta_range[1], d);
}
@@ -429,8 +424,8 @@ create_holder
"Solid %s is used in %u different enclosures that have different "
"delta requirements.\n",
str_cget(&description->d.solid.name), ecount);
- /* Delta was AUTO and need to be computed */
- if(description->d.solid.delta == -1) {
+ /* Delta needs to be substituted with actual value */
+ if(description->d.solid.delta == DELTA_AUTO) {
description->d.solid.delta = delta_range[0];
logger_print(stardis->logger, LOG_OUTPUT,
"Auto delta for solid %s set to %g\n",
@@ -450,10 +445,23 @@ create_holder
}
}
}
+ ERR(create_stardis_solid(stardis,
+ &description->d.solid.name,
+ description->d.solid.lambda,
+ description->d.solid.rho,
+ description->d.solid.cp,
+ description->d.solid.delta,
+ is_green,
+ 0,
+ description->d.solid.tinit,
+ description->d.solid.imposed_temperature,
+ description->d.solid.vpower,
+ description->d.solid.solid_id));
break;
}
case DESC_MAT_FLUID:
stardis->counts.fmed_count++;
+ allocate_stardis_medium_id(stardis, &description->d.fluid.fluid_id);
ERR(create_stardis_fluid(stardis,
&description->d.fluid.name,
description->d.fluid.rho,
@@ -462,7 +470,7 @@ create_holder
0,
description->d.fluid.tinit,
description->d.fluid.imposed_temperature,
- &description->d.fluid.fluid_id));
+ description->d.fluid.fluid_id));
break;
default:
FATAL("error:" STR(__FILE__) ":" STR(__LINE__)": Invalid type.\n");
@@ -528,6 +536,7 @@ stardis_init
stardis->dump_paths |= SDIS_HEAT_PATH_FAILURE;
if(args->dump_paths & DUMP_SUCCESS)
stardis->dump_paths |= SDIS_HEAT_PATH_SUCCESS;
+ stardis->next_medium_id = 0;
stardis->verbose = args->verbose;
darray_media_ptr_init(stardis->allocator, &stardis->media);
diff --git a/src/stardis-app.h b/src/stardis-app.h
@@ -42,6 +42,9 @@ struct sdis_medium;
/* Utility macros */
#define ERR(Expr) if((res = (Expr)) != RES_OK) goto error; else (void)0
+#define DELTA_AUTO INF /* Placeholder until actual value is substituted */
+#define UNKNOWN_MEDIUM_TEMPERATURE -1 /* Unknown for stadis solver is -1 */
+
/* Different types of descriptions */
enum description_type {
DESC_MAT_SOLID,
@@ -775,10 +778,20 @@ struct stardis {
struct mem_allocator* allocator;
struct logger* logger;
struct sdis_device* dev;
+ unsigned next_medium_id;
int dump_paths;
int verbose;
};
+static INLINE void
+allocate_stardis_medium_id
+ (struct stardis* stardis,
+ unsigned* id)
+{
+ ASSERT(stardis && id);
+ *id = stardis->next_medium_id++;
+}
+
extern LOCAL_SYM res_T
stardis_init
(const struct args* args,
diff --git a/src/stardis-fluid.c b/src/stardis-fluid.c
@@ -83,7 +83,7 @@ create_stardis_fluid
const int is_outside,
const double tinit,
const double imposed_temperature,
- unsigned* out_id)
+ const unsigned id)
{
res_T res = RES_OK;
struct sdis_fluid_shader fluid_shader = SDIS_FLUID_SHADER_NULL;
@@ -91,7 +91,7 @@ create_stardis_fluid
struct fluid* fluid_props;
size_t sz;
- ASSERT(stardis && rho >= 0 && cp >= 0 && out_id);
+ ASSERT(stardis && rho >= 0 && cp >= 0);
fluid_shader.calorific_capacity = fluid_get_calorific_capacity;
fluid_shader.volumic_mass = fluid_get_volumic_mass;
fluid_shader.temperature = fluid_get_temperature;
@@ -110,12 +110,11 @@ create_stardis_fluid
fluid_props->imposed_temperature = imposed_temperature;
fluid_props->is_green = is_green;
fluid_props->is_outside = is_outside;
- fluid_props->id = (unsigned)sz;
-
- ERR(darray_media_ptr_resize(&stardis->media, sz+1));
+ fluid_props->id = id;
+ ASSERT(id >= darray_media_ptr_size_get(&stardis->media));
+ ERR(darray_media_ptr_resize(&stardis->media, id + 1));
ERR(sdis_fluid_create(stardis->dev, &fluid_shader, data,
- darray_media_ptr_data_get(&stardis->media) + sz));
- *out_id = fluid_props->id;
+ darray_media_ptr_data_get(&stardis->media) + id));
end:
if(data) SDIS(data_ref_put(data));
diff --git a/src/stardis-fluid.h b/src/stardis-fluid.h
@@ -49,6 +49,6 @@ create_stardis_fluid
const int is_outside,
const double tinit,
const double imposed_temperature,
- unsigned* out_id);
+ const unsigned out_id);
#endif
diff --git a/src/stardis-solid.c b/src/stardis-solid.c
@@ -129,17 +129,15 @@ create_stardis_solid
const double tinit,
const double imposed_temperature,
const double vpower,
- unsigned* out_id)
+ const unsigned id)
{
res_T res = RES_OK;
struct sdis_solid_shader solid_shader = SDIS_SOLID_SHADER_NULL;
struct sdis_data* data = NULL;
struct solid* solid_props;
- size_t sz;
/* Could be less restrictive if green output included positions/dates */
- ASSERT(stardis && lambda >= 0 && rho >= 0 && cp >= 0 && delta > 0
- && out_id);
+ ASSERT(stardis && lambda > 0 && rho > 0 && cp > 0 && delta > 0);
solid_shader.calorific_capacity = solid_get_calorific_capacity;
solid_shader.thermal_conductivity = solid_get_thermal_conductivity;
solid_shader.volumic_mass = solid_get_volumic_mass;
@@ -151,8 +149,6 @@ create_stardis_solid
ERR(sdis_data_create(stardis->dev, sizeof(struct solid), ALIGNOF(struct solid),
NULL, &data));
- sz = darray_media_ptr_size_get(&stardis->media);
- ASSERT(sz < INT_MAX);
solid_props = sdis_data_get(data); /* Fetch the allocated memory space */
str_init(stardis->allocator, &solid_props->name);
if(name) str_copy(&solid_props->name, name);
@@ -166,12 +162,12 @@ create_stardis_solid
solid_props->vpower = vpower;
solid_props->is_green = is_green;
solid_props->is_outside = is_outside;
- solid_props->id = (unsigned)sz;
+ solid_props->id = id;
if(vpower != 0) solid_shader.volumic_power = solid_get_power;
- ERR(darray_media_ptr_resize(&stardis->media, sz + 1));
+ ASSERT(id >= darray_media_ptr_size_get(&stardis->media));
+ ERR(darray_media_ptr_resize(&stardis->media, id + 1));
ERR(sdis_solid_create(stardis->dev, &solid_shader, data,
- darray_media_ptr_data_get(&stardis->media) + sz));
- *out_id = solid_props->id;
+ darray_media_ptr_data_get(&stardis->media) + id));
end:
if(data) SDIS(data_ref_put(data));
diff --git a/src/stardis-solid.h b/src/stardis-solid.h
@@ -53,6 +53,6 @@ create_stardis_solid
const double tinit,
const double imposed_temperature,
const double vpower,
- unsigned* out_id);
+ const unsigned id);
#endif