stardis

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

commit 24e08b336e5bd03513834799ea6a5d28829c11d6
parent 25148f771757ead6edb1b3da6815c2ba30b8acd8
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Tue, 16 Jun 2020 10:12:49 +0200

Fix model dump with some ill-formed models

Diffstat:
Msrc/stardis-app.c | 19++++++++++++-------
Msrc/stardis-app.h | 10++++++++++
Msrc/stardis-main.c | 6+-----
Msrc/stardis-output.c | 29+++++++++++++++--------------
4 files changed, 38 insertions(+), 26 deletions(-)

diff --git a/src/stardis-app.c b/src/stardis-app.c @@ -613,7 +613,7 @@ stardis_init /* Create enclosures */ tmp_res = init_enclosures(stardis); - if(res != RES_OK && is_for_compute) { + if(tmp_res != RES_OK && is_for_compute) { res = tmp_res; goto error; } @@ -630,14 +630,17 @@ stardis_init /* Create media and property holders for those found in descriptions */ for(i = 0; i < darray_descriptions_size_get(&stardis->descriptions); i++) { - ERR(create_holder(stardis, &dummies, i, - stardis->mode & (MODE_BIN_GREEN | MODE_GREEN))); + tmp_res = create_holder(stardis, &dummies, i, + stardis->mode & (MODE_BIN_GREEN | MODE_GREEN)); + if(tmp_res != RES_OK && is_for_compute) { + res = tmp_res; + goto error; + } str_clear(&str); ERR(str_printf(&str, "Description %d: ", i)); ERR(str_print_description(&str, darray_descriptions_cdata_get(&stardis->descriptions) + i)); - ERR(str_printf(&str, "\n")); - logger_print(stardis->logger, LOG_OUTPUT, "%s", str_cget(&str)); + logger_print(stardis->logger, LOG_OUTPUT, "%s\n", str_cget(&str)); } if(is_for_compute) { @@ -708,8 +711,10 @@ stardis_release darray_size_t_release(&stardis->compute_surface.primitives); darray_sides_release(&stardis->compute_surface.sides); darray_uint_release(&stardis->compute_surface.err_triangles); - FOR_EACH(i, 0, darray_media_ptr_size_get(&stardis->media)) - SDIS(medium_ref_put(darray_media_ptr_data_get(&stardis->media)[i])); + FOR_EACH(i, 0, darray_media_ptr_size_get(&stardis->media)) { + if(darray_media_ptr_data_get(&stardis->media)[i]) + SDIS(medium_ref_put(darray_media_ptr_data_get(&stardis->media)[i])); + } darray_media_ptr_release(&stardis->media); } diff --git a/src/stardis-app.h b/src/stardis-app.h @@ -78,8 +78,18 @@ struct dummies { NULL, UINT_MAX, NULL, UINT_MAX\ } +static FINLINE void +init_media_ptr + (struct mem_allocator* alloc, + struct sdis_medium** data) +{ + ASSERT(data); (void)alloc; + *data = NULL; +} + #define DARRAY_NAME media_ptr #define DARRAY_DATA struct sdis_medium* +#define DARRAY_FUNCTOR_INIT init_media_ptr #include <rsys/dynamic_array.h> struct geometry { diff --git a/src/stardis-main.c b/src/stardis-main.c @@ -84,11 +84,7 @@ main if(mode & REGION_COMPUTE_MODES) { ERR(dump_compute_region_at_the_end_of_vtk(&stardis, stdout)); } - /* Dump enclosures and related information - * If enclosures creation failed, just skip it */ - if(stardis.senc3d_scn) { - ERR(dump_enclosure_related_stuff_at_the_end_of_vtk(&stardis, stdout)); - } + ERR(dump_enclosure_related_stuff_at_the_end_of_vtk(&stardis, stdout)); /* If dump flag set exit after dump done */ goto exit; diff --git a/src/stardis-output.c b/src/stardis-output.c @@ -833,6 +833,21 @@ dump_enclosure_related_stuff_at_the_end_of_vtk goto error; } + /* If enclosure where not extracted, dump only errors */ + ERR(senc3d_scene_get_overlapping_triangles_count(stardis->senc3d_scn, &ocount)); + if(ocount) { + FOR_EACH(t, 0, tsz) trgs[t] = 0; + FOR_EACH(t, 0, ocount) { + unsigned trid; + ERR(senc3d_scene_get_overlapping_triangle(stardis->senc3d_scn, t, &trid)); + trgs[trid] = 1; + } + fprintf(stream, "SCALARS Overlapping_triangles unsigned_int 1\n"); + fprintf(stream, "LOOKUP_TABLE default\n"); + FOR_EACH(t, 0, tsz) fprintf(stream, "%u\n", trgs[t]); + goto exit; + } + /* Keep the segments involved in holes (not the vertices) */ ERR(senc3d_scene_get_frontier_segments_count(stardis->senc3d_scn, &scount)); if(scount) { @@ -848,20 +863,6 @@ dump_enclosure_related_stuff_at_the_end_of_vtk FOR_EACH(t, 0, tsz) fprintf(stream, "%u\n", trgs[t]); } - /* Dump overlapping triangles information */ - ERR(senc3d_scene_get_overlapping_triangles_count(stardis->senc3d_scn, &ocount)); - if(ocount) { - FOR_EACH(t, 0, tsz) trgs[t] = 0; - FOR_EACH(t, 0, ocount) { - unsigned trid; - ERR(senc3d_scene_get_overlapping_triangle(stardis->senc3d_scn, t, &trid)); - trgs[trid] = 1; - } - fprintf(stream, "SCALARS Overlapping_triangles unsigned_int 1\n"); - fprintf(stream, "LOOKUP_TABLE default\n"); - FOR_EACH(t, 0, tsz) fprintf(stream, "%u\n", trgs[t]); - } - /* Dump enclosure information */ ERR(senc3d_scene_get_enclosure_count(stardis->senc3d_scn, &ecount)); enc_status = MEM_CALLOC(stardis->allocator, ecount, sizeof(*enc_status));