stardis

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

commit 885cb132148f7cabb20aff93a20b03b3c6eac45d
parent 00d2beb76cddda9de76e30dbc5aac8cc4ff8a2f6
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Fri, 26 Nov 2021 15:06:23 +0100

Some refactoring

Diffstat:
Msrc/stardis-app.c | 24++++++++++++------------
Msrc/stardis-compute.c | 68+++++++++++++++++++++++++++-----------------------------------------
Msrc/stardis-fluid.c | 2+-
Msrc/stardis-parsing.c | 208+++++++++++++++++++++++++++++++++++++++++++-------------------------------------
Msrc/stardis-solid.c | 2+-
5 files changed, 153 insertions(+), 151 deletions(-)

diff --git a/src/stardis-app.c b/src/stardis-app.c @@ -114,6 +114,7 @@ check_delta_and_create_solid double ratio, delta_range[2] = { DBL_MAX, -DBL_MAX }; const double acceptance_ratio = 3; struct senc3d_enclosure_header header; + struct solid* solid = description->d.solid; ASSERT(stardis && description && description->type == DESC_MAT_SOLID); @@ -122,7 +123,7 @@ check_delta_and_create_solid if(stardis->senc3d_scn) { /* Due to previous errors, senc3d_scn can be unavailable */ unsigned e, ecount = 0; - const unsigned desc_id = description->d.solid->desc_id; + const unsigned desc_id = solid->desc_id; /* The enclosures where created using description ids */ ERR(senc3d_scene_get_enclosure_count_by_medium(stardis->senc3d_scn, @@ -157,31 +158,31 @@ check_delta_and_create_solid logger_print(stardis->logger, LOG_WARNING, "Solid '%s' is used in %u different enclosures that have different " "delta requirements.\n", - str_cget(&description->d.solid->name), ecount); + str_cget(&solid->name), ecount); /* Delta needs to be substituted with actual value */ - if(description->d.solid->delta == DELTA_AUTO) { - description->d.solid->delta = delta_range[0]; + if(solid->delta == DELTA_AUTO) { + solid->delta = delta_range[0]; logger_print(stardis->logger, LOG_OUTPUT, "Auto delta for solid '%s' set to %g\n", - str_cget(&description->d.solid->name), description->d.solid->delta); + str_cget(&solid->name), solid->delta); } else { int too_small - = (delta_range[0] > description->d.solid->delta * acceptance_ratio); + = (delta_range[0] > solid->delta * acceptance_ratio); int too_big - = (delta_range[0] * acceptance_ratio < description->d.solid->delta); + = (delta_range[0] * acceptance_ratio < solid->delta); /* Check if user delta is OK */ if(too_small || too_big) { logger_print(stardis->logger, LOG_WARNING, "User delta for solid '%s' seems too %s: %g; " "auto delta would have set it to %g.\n", - str_cget(&description->d.solid->name), (too_big ? "big" : "small"), - description->d.solid->delta, delta_range[0]); + str_cget(&solid->name), (too_big ? "big" : "small"), + solid->delta, delta_range[0]); } } } } } - ERR(create_solver_solid(stardis, description->d.solid)); + ERR(create_solver_solid(stardis, solid)); end: if(enc) SENC3D(enclosure_ref_put(enc)); @@ -490,8 +491,7 @@ error: if(properties[(Rank)] == SG3D_UNSPECIFIED_PROPERTY) undef_count++;\ else {\ ASSERT(properties[(Rank)] < darray_descriptions_size_get(&stardis->descriptions));\ - ASSERT(descs[properties[(Rank)]].type == DESC_MAT_SOLID\ - || descs[properties[(Rank)]].type == DESC_MAT_FLUID);\ + ASSERT(DESC_IS_MEDIUM(descs[properties[(Rank)]].type));\ if(descs[properties[(Rank)]].type == DESC_MAT_SOLID) solid_count++;\ else fluid_count++;\ }\ diff --git a/src/stardis-compute.c b/src/stardis-compute.c @@ -246,30 +246,30 @@ check_probe_conform_to_type "Could not determine the medium probe is in.\n"); } else { if(filter_ctx.desc->type == DESC_MAT_SOLID) { - double delta = filter_ctx.desc->d.solid->delta; - ASSERT(delta < INF); + struct solid* solid = filter_ctx.desc->d.solid; + ASSERT(solid->delta < INF); logger_print(stardis->logger, LOG_OUTPUT, "Probe was in solid '%s'.\n", str_cget(&filter_ctx.desc->d.solid->name)); - if(filter_ctx.dist > 2 * delta) { + if(filter_ctx.dist > 2 * solid->delta) { logger_print(stardis->logger, LOG_ERROR, "Probe moved to (%g, %g, %g), primitive %u, uv = (%g, %g).\n", SPLIT3(filter_ctx.pos), hit.prim.prim_id, SPLIT2(hit.uv)); logger_print(stardis->logger, LOG_ERROR, "Move is %g delta long. Use -p instead of -P.\n", - filter_ctx.dist / delta); + filter_ctx.dist / solid->delta); res = RES_BAD_ARG; goto error; } - if(filter_ctx.dist > 0.5 * delta) { + if(filter_ctx.dist > 0.5 * solid->delta) { logger_print(stardis->logger, LOG_WARNING, "Probe was %g delta from closest boundary. " "Consider using -p instead of -P.\n", - filter_ctx.dist / delta); + filter_ctx.dist / solid->delta); } else { if(filter_ctx.dist != 0) logger_print(stardis->logger, LOG_OUTPUT, "Probe was %g delta from closest boundary.\n", - filter_ctx.dist / delta); + filter_ctx.dist / solid->delta); } } else { /* TODO: check move length wrt local geometry? */ @@ -331,26 +331,26 @@ check_probe_conform_to_type logger_print(stardis->logger, LOG_OUTPUT, "Probe is in solid '%s'.\n", str_cget(&filter_ctx.desc->d.solid->name)); if(filter_ctx.desc->type == DESC_MAT_SOLID) { - double delta = filter_ctx.desc->d.solid->delta; - if(filter_ctx.dist < 0.25 * delta) { + struct solid* solid = filter_ctx.desc->d.solid; + if(filter_ctx.dist < 0.25 * solid->delta) { logger_print(stardis->logger, LOG_ERROR, "Probe is %g delta from closest boundary. Use -P instead of -p.\n", - filter_ctx.dist / delta); + filter_ctx.dist / solid->delta); logger_print(stardis->logger, LOG_ERROR, "Closest geometry is primitive %u, uv = (%g, %g).\n", hit.prim.prim_id, SPLIT2(hit.uv)); res = RES_BAD_ARG; goto error; } - if(filter_ctx.dist < 0.5 * delta) { + if(filter_ctx.dist < 0.5 * solid->delta) { logger_print(stardis->logger, LOG_WARNING, "Probe is %g delta from closest boundary. " "Consider using -P instead of -p.\n", - filter_ctx.dist / delta); + filter_ctx.dist / solid->delta); } else { logger_print(stardis->logger, LOG_OUTPUT, "Probe is %g delta from closest boundary.\n", - filter_ctx.dist / delta); + filter_ctx.dist / solid->delta); } } else { logger_print(stardis->logger, LOG_WARNING, @@ -544,7 +544,7 @@ compute_probe_on_interface(struct stardis* stardis, struct time* start) const struct description* d; ASSERT(prop[SG3D_FRONT] < dcount); d = descriptions + prop[SG3D_FRONT]; - ASSERT(d->type == DESC_MAT_SOLID || d->type == DESC_MAT_FLUID); + ASSERT(DESC_IS_MEDIUM(d->type)); medium_name = str_cget(get_description_name(d)); compute_side = SDIS_FRONT; compute_side_name = "FRONT"; @@ -553,7 +553,7 @@ compute_probe_on_interface(struct stardis* stardis, struct time* start) const struct description* d; ASSERT(prop[SG3D_BACK] < dcount); d = descriptions + prop[SG3D_BACK]; - ASSERT(d->type == DESC_MAT_SOLID || d->type == DESC_MAT_FLUID); + ASSERT(DESC_IS_MEDIUM(d->type)); medium_name = str_cget(get_description_name(d)); compute_side = SDIS_BACK; compute_side_name = "BACK"; @@ -573,12 +573,10 @@ compute_probe_on_interface(struct stardis* stardis, struct time* start) fd = descriptions + prop[SG3D_FRONT]; bd = descriptions + prop[SG3D_BACK]; - ASSERT(fd->type == DESC_MAT_SOLID || fd->type == DESC_MAT_FLUID); - fmat_id = (fd->type == DESC_MAT_SOLID) - ? fd->d.solid->solid_id : fd->d.fluid->fluid_id; - ASSERT(bd->type == DESC_MAT_SOLID || bd->type == DESC_MAT_FLUID); - bmat_id = (bd->type == DESC_MAT_SOLID) - ? bd->d.solid->solid_id : bd->d.fluid->fluid_id; + ASSERT(DESC_IS_MEDIUM(fd->type)); + ASSERT(DESC_IS_MEDIUM(bd->type)); + description_get_medium_id(fd, &fmat_id); + description_get_medium_id(bd, &bmat_id); if(med_id != fmat_id && med_id != bmat_id) { /* Not here */ logger_print(stardis->logger, LOG_ERROR, @@ -1240,26 +1238,14 @@ find_medium_by_name ASSERT(stardis && name); FOR_EACH(i, 0, darray_descriptions_size_get(&stardis->descriptions)) { - struct description* - desc = darray_descriptions_data_get(&stardis->descriptions) + i; - if(desc->type == DESC_MAT_SOLID) { - if(str_eq(name, &desc->d.solid->name)) { - unsigned id = desc->d.solid->solid_id; - ASSERT(darray_media_ptr_size_get(&stardis->media) > id); - medium = darray_media_ptr_data_get(&stardis->media)[id]; - if(out_id) *out_id = id; - break; - } - } - else if(desc->type == DESC_MAT_FLUID) { - if(str_eq(name, &desc->d.fluid->name)) { - unsigned id = desc->d.fluid->fluid_id; - ASSERT(darray_media_ptr_size_get(&stardis->media) > id); - medium = darray_media_ptr_data_get(&stardis->media)[id]; - if(out_id) *out_id = id; - break; - } - } + unsigned id; + struct description* desc = + darray_descriptions_data_get(&stardis->descriptions) + i; + description_get_medium_id(desc, &id); + ASSERT(darray_media_ptr_size_get(&stardis->media) > id); + medium = darray_media_ptr_data_get(&stardis->media)[id]; + if(out_id) *out_id = id; + break; } return medium; } diff --git a/src/stardis-fluid.c b/src/stardis-fluid.c @@ -97,7 +97,7 @@ create_solver_fluid if(fluid_props->fluid_id >= darray_media_ptr_size_get(&stardis->media)) { ERR(darray_media_ptr_resize(&stardis->media, fluid_props->fluid_id + 1)); } - ASSERT(darray_media_ptr_data_get(&stardis->media)[fluid_props->fluid_id] == NULL); + ASSERT(!darray_media_ptr_data_get(&stardis->media)[fluid_props->fluid_id]); ERR(sdis_fluid_create(stardis->dev, &fluid_shader, data, darray_media_ptr_data_get(&stardis->media) + fluid_props->fluid_id)); diff --git a/src/stardis-parsing.c b/src/stardis-parsing.c @@ -1181,6 +1181,7 @@ process_h char* tk = NULL; struct description* desc; size_t sz; + struct h_boundary* h_boundary; res_T res = RES_OK; ASSERT(stardis && tok_ctx); @@ -1190,12 +1191,13 @@ process_h sz = darray_descriptions_size_get(&stardis->descriptions); ERR(darray_descriptions_resize(&stardis->descriptions, sz+1)); desc = darray_descriptions_data_get(&stardis->descriptions) + sz; - ERR(init_h(stardis->allocator, &desc->d.h_boundary)); + h_boundary = desc->d.h_boundary; + ERR(init_h(stardis->allocator, &h_boundary)); desc->type = type; CHK_TOK(strtok_r(NULL, " \t", tok_ctx), "h boundary name"); - ERR(description_set_name(stardis, &desc->d.h_boundary->name, tk)); - if(find_description_by_name(stardis, &desc->d.h_boundary->name, NULL) + ERR(description_set_name(stardis, &h_boundary->name, tk)); + if(find_description_by_name(stardis, &h_boundary->name, NULL) != desc) { logger_print(stardis->logger, LOG_ERROR, @@ -1205,31 +1207,31 @@ process_h } CHK_TOK(strtok_r(NULL, " \t", tok_ctx), "ref_temperature"); - res = cstr_to_double(tk, &desc->d.h_boundary->ref_temperature); + res = cstr_to_double(tk, &h_boundary->ref_temperature); if(res != RES_OK - || desc->d.h_boundary->ref_temperature < 0) + || h_boundary->ref_temperature < 0) { logger_print(stardis->logger, LOG_ERROR, "Invalid reference temperature: %s\n", tk); if(res == RES_OK) res = RES_BAD_ARG; goto end; } - stardis->t_range[0] = MMIN(stardis->t_range[0], desc->d.h_boundary->ref_temperature); - stardis->t_range[1] = MMAX(stardis->t_range[1], desc->d.h_boundary->ref_temperature); + stardis->t_range[0] = MMIN(stardis->t_range[0], h_boundary->ref_temperature); + stardis->t_range[1] = MMAX(stardis->t_range[1], h_boundary->ref_temperature); CHK_TOK(strtok_r(NULL, " \t", tok_ctx), "emissivity"); - res = cstr_to_double(tk, &desc->d.h_boundary->emissivity); + res = cstr_to_double(tk, &h_boundary->emissivity); if(res != RES_OK - || desc->d.h_boundary->emissivity < 0 - || desc->d.h_boundary->emissivity > 1) + || h_boundary->emissivity < 0 + || h_boundary->emissivity > 1) { logger_print(stardis->logger, LOG_ERROR, "Invalid emissivity: %s\n", tk); if(res == RES_OK) res = RES_BAD_ARG; goto end; } CHK_TOK(strtok_r(NULL, " \t", tok_ctx), "specular fraction"); - res = cstr_to_double(tk, &desc->d.h_boundary->specular_fraction); + res = cstr_to_double(tk, &h_boundary->specular_fraction); if(res != RES_OK - || desc->d.h_boundary->specular_fraction < 0 - || desc->d.h_boundary->specular_fraction > 1) + || h_boundary->specular_fraction < 0 + || h_boundary->specular_fraction > 1) { logger_print(stardis->logger, LOG_ERROR, "Invalid specular fraction: %s\n", tk); @@ -1237,18 +1239,18 @@ process_h goto end; } CHK_TOK(strtok_r(NULL, " \t", tok_ctx), "hc"); - res = cstr_to_double(tk, &desc->d.h_boundary->hc); + res = cstr_to_double(tk, &h_boundary->hc); if(res != RES_OK - || desc->d.h_boundary->hc < 0) + || h_boundary->hc < 0) { logger_print(stardis->logger, LOG_ERROR, "Invalid hc: %s\n", tk); if(res == RES_OK) res = RES_BAD_ARG; goto end; } CHK_TOK(strtok_r(NULL, " \t", tok_ctx), "temperature"); - res = cstr_to_double(tk, &desc->d.h_boundary->imposed_temperature); + res = cstr_to_double(tk, &h_boundary->imposed_temperature); if(res != RES_OK - || desc->d.h_boundary->imposed_temperature < 0) + || h_boundary->imposed_temperature < 0) { logger_print(stardis->logger, LOG_ERROR, "Invalid temperature: %s\n", tk); if(res == RES_OK) res = RES_BAD_ARG; @@ -1256,17 +1258,17 @@ process_h } if(type == DESC_BOUND_H_FOR_FLUID) - ERR(get_dummy_solid_id(stardis, &desc->d.h_boundary->mat_id)); + ERR(get_dummy_solid_id(stardis, &h_boundary->mat_id)); else { struct fluid* fluid = NULL; ERR(init_fluid(stardis->allocator, &fluid)); fluid->fluid_id = allocate_stardis_medium_id(stardis); - desc->d.h_boundary->mat_id = fluid->fluid_id; - desc->d.h_boundary->possible_external_fluid = fluid; + h_boundary->mat_id = fluid->fluid_id; + h_boundary->possible_external_fluid = fluid; ASSERT(sz <= UINT_MAX); fluid->desc_id = (unsigned)sz; fluid->imposed_temperature - = desc->d.h_boundary->imposed_temperature; + = h_boundary->imposed_temperature; fluid->is_outside = 1; fluid->is_green = stardis->mode & (MODE_BIN_GREEN | MODE_GREEN); ERR(create_solver_fluid(stardis, fluid)); @@ -1294,6 +1296,7 @@ process_t char* tk = NULL; struct description* desc; size_t sz; + struct t_boundary* t_boundary; res_T res = RES_OK; ASSERT(stardis && tok_ctx); @@ -1303,14 +1306,15 @@ process_t sz = darray_descriptions_size_get(&stardis->descriptions); ERR(darray_descriptions_resize(&stardis->descriptions, sz + 1)); desc = darray_descriptions_data_get(&stardis->descriptions) + sz; - ERR(init_t(stardis->allocator, &desc->d.t_boundary)); + t_boundary = desc->d.t_boundary; + ERR(init_t(stardis->allocator, &t_boundary)); desc->type = DESC_BOUND_T_FOR_SOLID; - ERR(get_dummy_fluid_id(stardis, &desc->d.t_boundary->mat_id)); + ERR(get_dummy_fluid_id(stardis, &t_boundary->mat_id)); CHK_TOK(strtok_r(NULL, " \t", tok_ctx), "temperature boundary name"); - ERR(description_set_name(stardis, &desc->d.t_boundary->name, tk)); - if(find_description_by_name(stardis, &desc->d.t_boundary->name, NULL) + ERR(description_set_name(stardis, &t_boundary->name, tk)); + if(find_description_by_name(stardis, &t_boundary->name, NULL) != desc) { logger_print(stardis->logger, LOG_ERROR, @@ -1320,9 +1324,9 @@ process_t } CHK_TOK(strtok_r(NULL, " \t", tok_ctx), "temperature"); - res = cstr_to_double(tk, &desc->d.t_boundary->imposed_temperature); + res = cstr_to_double(tk, &t_boundary->imposed_temperature); if(res != RES_OK - || desc->d.t_boundary->imposed_temperature < 0) + || t_boundary->imposed_temperature < 0) { logger_print(stardis->logger, LOG_ERROR, "Invalid temperature: %s\n", tk); if(res == RES_OK) res = RES_BAD_ARG; @@ -1347,6 +1351,7 @@ process_flx char* tk = NULL; struct description* desc; size_t sz; + struct f_boundary* f_boundary; res_T res = RES_OK; ASSERT(stardis && tok_ctx); @@ -1356,14 +1361,15 @@ process_flx sz = darray_descriptions_size_get(&stardis->descriptions); ERR(darray_descriptions_resize(&stardis->descriptions, sz + 1)); desc = darray_descriptions_data_get(&stardis->descriptions) + sz; - ERR(init_f(stardis->allocator, &desc->d.f_boundary)); + f_boundary = desc->d.f_boundary; + ERR(init_f(stardis->allocator, &f_boundary)); desc->type = DESC_BOUND_F_FOR_SOLID; - ERR(get_dummy_fluid_id(stardis, &desc->d.f_boundary->mat_id)); + ERR(get_dummy_fluid_id(stardis, &f_boundary->mat_id)); CHK_TOK(strtok_r(NULL, " \t", tok_ctx), "flux boundary name"); - ERR(description_set_name(stardis, &desc->d.f_boundary->name, tk)); - if(find_description_by_name(stardis, &desc->d.f_boundary->name, NULL) + ERR(description_set_name(stardis, &f_boundary->name, tk)); + if(find_description_by_name(stardis, &f_boundary->name, NULL) != desc) { logger_print(stardis->logger, LOG_ERROR, @@ -1373,9 +1379,9 @@ process_flx } CHK_TOK(strtok_r(NULL, " \t", tok_ctx), "flux"); - res = cstr_to_double(tk, &desc->d.f_boundary->imposed_flux); + res = cstr_to_double(tk, &f_boundary->imposed_flux); if(res != RES_OK - || desc->d.f_boundary->imposed_flux == SDIS_FLUX_NONE) { + || f_boundary->imposed_flux == SDIS_FLUX_NONE) { /* Flux can be < 0 but not undefined */ if(res == RES_OK) res = RES_BAD_ARG; logger_print(stardis->logger, LOG_ERROR, "Invalid flux: %s\n", tk); @@ -1400,6 +1406,7 @@ process_sfc char* tk = NULL; struct description* desc; size_t sz; + struct solid_fluid_connect* sf_connect; res_T res = RES_OK; ASSERT(stardis && tok_ctx); @@ -1409,17 +1416,18 @@ process_sfc sz = darray_descriptions_size_get(&stardis->descriptions); ERR(darray_descriptions_resize(&stardis->descriptions, sz + 1)); desc = darray_descriptions_data_get(&stardis->descriptions) + sz; - ERR(init_sf(stardis->allocator, &desc->d.sf_connect)); + sf_connect = desc->d.sf_connect; + ERR(init_sf(stardis->allocator, &sf_connect)); desc->type = DESC_SOLID_FLUID_CONNECT; /* Use a medium ID even if there is no medium here * As other cases use media IDs as unique IDs for read_sides_and_files calls * we continue the trend to ensure connection ID is OK */ - desc->d.sf_connect->connection_id = allocate_stardis_medium_id(stardis); + sf_connect->connection_id = allocate_stardis_medium_id(stardis); CHK_TOK(strtok_r(NULL, " \t", tok_ctx), "solid fluid connection name"); - ERR(description_set_name(stardis, &desc->d.sf_connect->name, tk)); - if(find_description_by_name(stardis, &desc->d.sf_connect->name, NULL) + ERR(description_set_name(stardis, &sf_connect->name, tk)); + if(find_description_by_name(stardis, &sf_connect->name, NULL) != desc) { logger_print(stardis->logger, LOG_ERROR, @@ -1429,31 +1437,31 @@ process_sfc } CHK_TOK(strtok_r(NULL, " \t", tok_ctx), "ref_temperature"); - res = cstr_to_double(tk, &desc->d.sf_connect->ref_temperature); + res = cstr_to_double(tk, &sf_connect->ref_temperature); if(res != RES_OK - || desc->d.sf_connect->ref_temperature < 0) + || sf_connect->ref_temperature < 0) { logger_print(stardis->logger, LOG_ERROR, "Invalid reference temperature: %s\n", tk); if(res == RES_OK) res = RES_BAD_ARG; goto end; } - stardis->t_range[0] = MMIN(stardis->t_range[0], desc->d.sf_connect->ref_temperature); - stardis->t_range[1] = MMAX(stardis->t_range[1], desc->d.sf_connect->ref_temperature); + stardis->t_range[0] = MMIN(stardis->t_range[0], sf_connect->ref_temperature); + stardis->t_range[1] = MMAX(stardis->t_range[1], sf_connect->ref_temperature); CHK_TOK(strtok_r(NULL, " \t", tok_ctx), "emissivity"); - res = cstr_to_double(tk, &desc->d.sf_connect->emissivity); + res = cstr_to_double(tk, &sf_connect->emissivity); if(res != RES_OK - || desc->d.sf_connect->emissivity < 0 - || desc->d.sf_connect->emissivity > 1) + || sf_connect->emissivity < 0 + || sf_connect->emissivity > 1) { logger_print(stardis->logger, LOG_ERROR, "Invalid emissivity: %s\n", tk); if(res == RES_OK) res = RES_BAD_ARG; goto end; } CHK_TOK(strtok_r(NULL, " \t", tok_ctx), "specular fraction"); - res = cstr_to_double(tk, &desc->d.sf_connect->specular_fraction); + res = cstr_to_double(tk, &sf_connect->specular_fraction); if(res != RES_OK - || desc->d.sf_connect->specular_fraction < 0 - || desc->d.sf_connect->specular_fraction > 1) + || sf_connect->specular_fraction < 0 + || sf_connect->specular_fraction > 1) { logger_print(stardis->logger, LOG_ERROR, "Invalid specular fraction: %s\n", tk); @@ -1461,9 +1469,9 @@ process_sfc goto end; } CHK_TOK(strtok_r(NULL, " \t", tok_ctx), "hc"); - res = cstr_to_double(tk, &desc->d.sf_connect->hc); + res = cstr_to_double(tk, &sf_connect->hc); if(res != RES_OK - || desc->d.sf_connect->hc < 0) + || sf_connect->hc < 0) { logger_print(stardis->logger, LOG_ERROR, "Invalid hc: %s\n", tk); if(res == RES_OK) res = RES_BAD_ARG; @@ -1488,6 +1496,7 @@ process_ssc char* tk = NULL; struct description* desc; size_t sz; + struct solid_solid_connect* ss_connect; res_T res = RES_OK; ASSERT(stardis && tok_ctx); @@ -1497,17 +1506,18 @@ process_ssc sz = darray_descriptions_size_get(&stardis->descriptions); ERR(darray_descriptions_resize(&stardis->descriptions, sz + 1)); desc = darray_descriptions_data_get(&stardis->descriptions) + sz; - ERR(init_ss(stardis->allocator, &desc->d.ss_connect)); + ss_connect = desc->d.ss_connect; + ERR(init_ss(stardis->allocator, &ss_connect)); desc->type = DESC_SOLID_SOLID_CONNECT; /* Use a medium ID even if there is no medium here * As other cases use media IDs as unique IDs for read_sides_and_files calls * we continue the trend to ensure connection ID is OK */ - desc->d.ss_connect->connection_id = allocate_stardis_medium_id(stardis); + ss_connect->connection_id = allocate_stardis_medium_id(stardis); CHK_TOK(strtok_r(NULL, " \t", tok_ctx), "solid solid connection name"); - ERR(description_set_name(stardis, &desc->d.ss_connect->name, tk)); - if(find_description_by_name(stardis, &desc->d.ss_connect->name, NULL) + ERR(description_set_name(stardis, &ss_connect->name, tk)); + if(find_description_by_name(stardis, &ss_connect->name, NULL) != desc) { logger_print(stardis->logger, LOG_ERROR, @@ -1517,19 +1527,19 @@ process_ssc } CHK_TOK(strtok_r(NULL, " \t", tok_ctx), "contact resistance"); - res = cstr_to_double(tk, &desc->d.ss_connect->tcr); + res = cstr_to_double(tk, &ss_connect->tcr); if(res != RES_OK - || desc->d.ss_connect->tcr < 0) + || ss_connect->tcr < 0) { logger_print(stardis->logger, LOG_ERROR, "Invalid contact resistance: %s\n", tk); if(res == RES_OK) res = RES_BAD_ARG; goto end; } - else if(desc->d.ss_connect->tcr == 0) { + else if(ss_connect->tcr == 0) { logger_print(stardis->logger, LOG_WARNING, "Solid-solid connection %s: defining a contact resistance to 0 has " - "no effect\n", str_cget(&desc->d.ss_connect->name)); + "no effect\n", str_cget(&ss_connect->name)); } ASSERT(sz <= UINT_MAX); @@ -1627,6 +1637,7 @@ process_solid char* tk = NULL; struct description* desc; size_t sz; + struct solid* solid; res_T res = RES_OK; ASSERT(stardis && tok_ctx); @@ -1636,18 +1647,19 @@ process_solid sz = darray_descriptions_size_get(&stardis->descriptions); ERR(darray_descriptions_resize(&stardis->descriptions, sz + 1)); desc = darray_descriptions_data_get(&stardis->descriptions) + sz; - ERR(init_solid(stardis->allocator, &desc->d.solid)); + solid = desc->d.solid; + ERR(init_solid(stardis->allocator, &solid)); desc->type = DESC_MAT_SOLID; - desc->d.solid->solid_id = allocate_stardis_medium_id(stardis); - desc->d.solid->is_green = stardis->mode & (MODE_BIN_GREEN | MODE_GREEN); - desc->d.solid->is_outside = 0; + solid->solid_id = allocate_stardis_medium_id(stardis); + solid->is_green = stardis->mode & (MODE_BIN_GREEN | MODE_GREEN); + solid->is_outside = 0; ASSERT(sz <= UINT_MAX); - desc->d.solid->desc_id = (unsigned)sz; + solid->desc_id = (unsigned)sz; CHK_TOK(strtok_r(NULL, " \t", tok_ctx), "solid name"); - ERR(description_set_name(stardis, &desc->d.solid->name, tk)); - if(find_description_by_name(stardis, &desc->d.solid->name, NULL) + ERR(description_set_name(stardis, &solid->name, tk)); + if(find_description_by_name(stardis, &solid->name, NULL) != desc) { logger_print(stardis->logger, LOG_ERROR, @@ -1657,55 +1669,56 @@ process_solid } CHK_TOK(strtok_r(NULL, " \t", tok_ctx), "lambda"); - res = cstr_to_double(tk, &desc->d.solid->lambda); + res = cstr_to_double(tk, &solid->lambda); if(res != RES_OK - || desc->d.solid->lambda <= 0) + || solid->lambda <= 0) { logger_print(stardis->logger, LOG_ERROR, "Invalid lambda: %s\n", tk); if(res == RES_OK) res = RES_BAD_ARG; goto end; } CHK_TOK(strtok_r(NULL, " \t", tok_ctx), "rho"); - res = cstr_to_double(tk, &desc->d.solid->rho); + res = cstr_to_double(tk, &solid->rho); if(res != RES_OK - || desc->d.solid->rho <= 0) + || solid->rho <= 0) { logger_print(stardis->logger, LOG_ERROR, "Invalid rho: %s\n", tk); if(res == RES_OK) res = RES_BAD_ARG; goto end; } CHK_TOK(strtok_r(NULL, " \t", tok_ctx), "cp"); - res = cstr_to_double(tk, &desc->d.solid->cp); + res = cstr_to_double(tk, &solid->cp); if(res != RES_OK - || desc->d.solid->cp <= 0) + || solid->cp <= 0) { logger_print(stardis->logger, LOG_ERROR, "Invalid cp: %s\n", tk); if(res == RES_OK) res = RES_BAD_ARG; goto end; } - ERR(read_delta(stardis, &desc->d.solid->delta, tok_ctx)); + ERR(read_delta(stardis, &solid->delta, tok_ctx)); CHK_TOK(strtok_r(NULL, " \t", tok_ctx), "Tinit"); - res = cstr_to_double(tk, &desc->d.solid->tinit); + res = cstr_to_double(tk, &solid->tinit); if(res != RES_OK - || desc->d.solid->tinit < 0) + || solid->tinit < 0) { logger_print(stardis->logger, LOG_ERROR, "Invalid Tinit: %s\n", tk); if(res == RES_OK) res = RES_BAD_ARG; goto end; } - ERR(read_imposed_temperature(stardis, &desc->d.solid->imposed_temperature, + ERR(read_imposed_temperature(stardis, &solid->imposed_temperature, tok_ctx)); - if(desc->d.solid->imposed_temperature >= 0 - && desc->d.solid->imposed_temperature != desc->d.solid->tinit) + if(solid->imposed_temperature >= 0 + && solid->imposed_temperature != solid->tinit) { logger_print(stardis->logger, LOG_ERROR, "Imposed temperature, if defined, must match initial temperature " "(initial: %g; imposed: %g)\n", - desc->d.solid->tinit, desc->d.solid->imposed_temperature); res = RES_BAD_ARG; + solid->tinit, solid->imposed_temperature); + res = RES_BAD_ARG; goto end; } CHK_TOK(strtok_r(NULL, " \t", tok_ctx), "volumic power"); - res = cstr_to_double(tk, &desc->d.solid->vpower); + res = cstr_to_double(tk, &solid->vpower); if(res != RES_OK) { /* VPower can be < 0 */ logger_print(stardis->logger, LOG_ERROR, "Invalid volumic power: %s\n", tk); @@ -1733,6 +1746,7 @@ process_fluid char* tk = NULL; struct description* desc; size_t sz; + struct fluid* fluid; res_T res = RES_OK; ASSERT(stardis && tok_ctx); @@ -1742,18 +1756,19 @@ process_fluid sz = darray_descriptions_size_get(&stardis->descriptions); ERR(darray_descriptions_resize(&stardis->descriptions, sz + 1)); desc = darray_descriptions_data_get(&stardis->descriptions) + sz; - ERR(init_fluid(stardis->allocator, &desc->d.fluid)); + fluid = desc->d.fluid; + ERR(init_fluid(stardis->allocator, &fluid)); desc->type = DESC_MAT_FLUID; - desc->d.fluid->fluid_id = allocate_stardis_medium_id(stardis); - desc->d.fluid->is_outside = 0; - desc->d.fluid->is_green = stardis->mode & (MODE_BIN_GREEN | MODE_GREEN); + fluid->fluid_id = allocate_stardis_medium_id(stardis); + fluid->is_outside = 0; + fluid->is_green = stardis->mode & (MODE_BIN_GREEN | MODE_GREEN); ASSERT(sz <= UINT_MAX); - desc->d.fluid->desc_id = (unsigned)sz; + fluid->desc_id = (unsigned)sz; CHK_TOK(strtok_r(NULL, " \t", tok_ctx), "fluid name"); - ERR(description_set_name(stardis, &desc->d.fluid->name, tk)); - if(find_description_by_name(stardis, &desc->d.fluid->name, NULL) + ERR(description_set_name(stardis, &fluid->name, tk)); + if(find_description_by_name(stardis, &fluid->name, NULL) != desc) { logger_print(stardis->logger, LOG_ERROR, @@ -1763,46 +1778,47 @@ process_fluid } CHK_TOK(strtok_r(NULL, " \t", tok_ctx), "rho"); - res = cstr_to_double(tk, &desc->d.fluid->rho); + res = cstr_to_double(tk, &fluid->rho); if(res != RES_OK - || desc->d.fluid->rho <= 0) + || fluid->rho <= 0) { logger_print(stardis->logger, LOG_ERROR, "Invalid rho: %s\n", tk); if(res == RES_OK) res = RES_BAD_ARG; goto end; } CHK_TOK(strtok_r(NULL, " \t", tok_ctx), "cp"); - res = cstr_to_double(tk, &desc->d.fluid->cp); + res = cstr_to_double(tk, &fluid->cp); if(res != RES_OK - || desc->d.fluid->cp <= 0) + || fluid->cp <= 0) { logger_print(stardis->logger, LOG_ERROR, "Invalid cp: %s\n", tk); if(res == RES_OK) res = RES_BAD_ARG; goto end; } CHK_TOK(strtok_r(NULL, " \t", tok_ctx), "Tinit"); - res = cstr_to_double(tk, &desc->d.fluid->tinit); + res = cstr_to_double(tk, &fluid->tinit); if(res != RES_OK - || desc->d.fluid->tinit < 0) + || fluid->tinit < 0) { logger_print(stardis->logger, LOG_ERROR, "Invalid Tinit: %s\n", tk); if(res == RES_OK) res = RES_BAD_ARG; goto end; } - ERR(read_imposed_temperature(stardis, &desc->d.fluid->imposed_temperature, + ERR(read_imposed_temperature(stardis, &fluid->imposed_temperature, tok_ctx)); - if(desc->d.fluid->imposed_temperature >= 0 - && desc->d.fluid->imposed_temperature != desc->d.fluid->tinit) + if(fluid->imposed_temperature >= 0 + && fluid->imposed_temperature != fluid->tinit) { logger_print(stardis->logger, LOG_ERROR, "Imposed temperature, if defined, must match initial temperature " "(initial: %g; imposed: %g)\n", - desc->d.fluid->tinit, desc->d.fluid->imposed_temperature); res = RES_BAD_ARG; + fluid->tinit, fluid->imposed_temperature); + res = RES_BAD_ARG; goto end; } - ERR(create_solver_fluid(stardis, desc->d.fluid)); + ERR(create_solver_fluid(stardis, fluid)); ASSERT(sz <= UINT_MAX); ERR(read_sides_and_files(stardis, 0, (unsigned)sz, tok_ctx)); diff --git a/src/stardis-solid.c b/src/stardis-solid.c @@ -145,7 +145,7 @@ create_solver_solid if(solid_props->solid_id >= darray_media_ptr_size_get(&stardis->media)) { ERR(darray_media_ptr_resize(&stardis->media, solid_props->solid_id + 1)); } - ASSERT(darray_media_ptr_data_get(&stardis->media)[solid_props->solid_id] == NULL); + ASSERT(!darray_media_ptr_data_get(&stardis->media)[solid_props->solid_id]); ERR(sdis_solid_create(stardis->dev, &solid_shader, data, darray_media_ptr_data_get(&stardis->media) + solid_props->solid_id));