stardis

Perform coupled heat transfer calculations
git clone git://git.meso-star.fr/stardis.git
Log | Files | Refs | README | LICENSE

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:
Msrc/stardis-app.c | 51++++++++++++++++++++++++++++++---------------------
Msrc/stardis-app.h | 13+++++++++++++
Msrc/stardis-fluid.c | 13++++++-------
Msrc/stardis-fluid.h | 2+-
Msrc/stardis-solid.c | 16++++++----------
Msrc/stardis-solid.h | 2+-
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