stardis

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

commit 1517edf74d7110b7ae1edbe1dd300a447e5b9fa7
parent 1e4c84c8fadfbdab40eeb45065a06831e8e0666e
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Sun, 19 Apr 2020 17:25:14 +0200

Fix property conflict dump in geomety dumps

Diffstat:
Msrc/main.c | 2+-
Msrc/stardis-app.c | 114+++++++++++++++++++++++++++----------------------------------------------------
Msrc/stardis-intface.c | 24++++++++++++++++--------
3 files changed, 56 insertions(+), 84 deletions(-)

diff --git a/src/main.c b/src/main.c @@ -86,7 +86,7 @@ main * enclosure IDs too */ ERR(dump_enclosure_related_stuff_at_the_end_of_vtk(&stardis, stdout)); - /* If dump flag set, then dump and exit */ + /* If dump flag set exit after dump done */ goto exit; } diff --git a/src/stardis-app.c b/src/stardis-app.c @@ -36,7 +36,7 @@ static const struct counts COUNTS_NULL = COUNTS_NULL__; * These values are used in dumps ******************************************************************************/ enum properties_conflict_t { - NO_CONFLICT, + NO_PROPERTY_CONFLICT, BOUND_H_FOR_FLUID_BETWEEN_2_DEFS, BOUND_H_FOR_FLUID_BETWEEN_2_UNDEFS, BOUND_H_FOR_FLUID_ENCLOSING_SOLID, @@ -55,13 +55,21 @@ enum properties_conflict_t { SFCONNECT_BETWEEN_2_SOLIDS, SFCONNECT_BETWEEN_2_FLUIDS, SFCONNECT_USED_AS_BOUNDARY, - NO_BOUND_BETWEEN_FLUIDS, - TRG_WITH_NO_PROPERTY, + SFCONNECT_BETWEEN_2_UNDEFS, + NO_CONNECTION_BETWEEN_2_FLUIDS, + NO_CONNECTION_BETWEEN_SOLID_AND_FLUID, NO_BOUND_BETWEEN_FLUID_AND_UNDEF, NO_BOUND_BETWEEN_SOLID_AND_UNDEF, + TRG_WITH_NO_PROPERTY, PROPERTIES_CONFLICT_COUNT__ }; +enum enclosure_errors_t { + NO_ENCLOSURE_ERROR, + INTERNAL_ENCLOSURE_WITH_N_MEDIA, + ENCLOSURE_ERRORS_COUNT__ +}; + /******************************************************************************* * Local Functions ******************************************************************************/ @@ -122,41 +130,6 @@ error: else fluid_count++;\ }\ } - -#define PRT_INCOHERENT_TRG() {\ - struct str str;\ - str_init(stardis->allocator, &str);\ - ERR(logger_print(stardis->logger, LOG_WARNING,\ - "Incoherent triangle description (%u)\n", itri));\ - if(!front_defined)\ - ERR(logger_print(stardis->logger, LOG_OUTPUT, "Front: undefined\n"));\ - else {\ - ERR(str_printf(&str, "Front: "));\ - ERR(print_description(&str, descs + properties[SG3D_FRONT]));\ - ERR(str_printf(&str, "\n"));\ - ERR(logger_print(stardis->logger, LOG_OUTPUT, "%s", str_cget(&str))); \ - }\ - str_clear(&str);\ - if(!back_defined)\ - ERR(logger_print(stardis->logger, LOG_OUTPUT, "Back: undefined\n"));\ - else {\ - ERR(str_printf(&str, "Back: "));\ - ERR(print_description(&str, descs + properties[SG3D_BACK]));\ - ERR(str_printf(&str, "\n"));\ - ERR(logger_print(stardis->logger, LOG_OUTPUT, "%s", str_cget(&str))); \ - }\ - str_clear(&str);\ - if(!connect_defined)\ - ERR(logger_print(stardis->logger, LOG_OUTPUT, "Connection: undefined\n"));\ - else {\ - ERR(str_printf(&str, "Connection: "));\ - ERR(print_description(&str, descs + properties[SG3D_INTFACE]));\ - ERR(str_printf(&str, "\n"));\ - ERR(logger_print(stardis->logger, LOG_OUTPUT, "%s", str_cget(&str))); \ - }\ - str_release(&str);\ -} - static res_T validate_properties (const unsigned itri, @@ -194,10 +167,7 @@ validate_properties switch (intface->type) { case DESC_BOUND_H_FOR_FLUID: if(!(solid_count == 0 && fluid_count == 1)) { - PRT_INCOHERENT_TRG(); - logger_print(stardis->logger, LOG_ERROR, - "Can only define a DESC_BOUND_H_FOR_FLUID boundary for a fluid region\n"); - if(solid_count + fluid_count == 2) + if(solid_count + fluid_count == 2) *properties_conflict_status = BOUND_H_FOR_FLUID_BETWEEN_2_DEFS; else if(solid_count + fluid_count == 0) *properties_conflict_status = BOUND_H_FOR_FLUID_BETWEEN_2_UNDEFS; @@ -209,9 +179,6 @@ validate_properties break; case DESC_BOUND_H_FOR_SOLID: if(!(solid_count == 1 && fluid_count == 0)) { - PRT_INCOHERENT_TRG(); - logger_print(stardis->logger, LOG_ERROR, - "Can only define a DESC_BOUND_H_FOR_SOLID boundary for a solid region\n"); if(solid_count + fluid_count == 2) *properties_conflict_status = BOUND_H_FOR_SOLID_BETWEEN_2_DEFS; else if(solid_count + fluid_count == 0) @@ -224,10 +191,7 @@ validate_properties break; case DESC_BOUND_T_FOR_FLUID: if(!(solid_count == 0 && fluid_count == 1)) { - PRT_INCOHERENT_TRG(); - logger_print(stardis->logger, LOG_ERROR, - "Can only define a DESC_BOUND_T_FOR_FLUID boundary for a fluid region\n"); - if(solid_count + fluid_count == 2) + if(solid_count + fluid_count == 2) *properties_conflict_status = BOUND_T_FOR_FLUID_BETWEEN_2_DEFS; else if(solid_count + fluid_count == 0) *properties_conflict_status = BOUND_T_FOR_FLUID_BETWEEN_2_UNDEFS; @@ -239,10 +203,7 @@ validate_properties break; case DESC_BOUND_T_FOR_SOLID: if(!(solid_count == 1 && fluid_count == 0)) { - PRT_INCOHERENT_TRG(); - logger_print(stardis->logger, LOG_ERROR, - "Can only define a DESC_BOUND_T_FOR_SOLID boundary for a solid region\n"); - if(solid_count + fluid_count == 2) + if(solid_count + fluid_count == 2) *properties_conflict_status = BOUND_T_FOR_SOLID_BETWEEN_2_DEFS; else if(solid_count + fluid_count == 0) *properties_conflict_status = BOUND_T_FOR_SOLID_BETWEEN_2_UNDEFS; @@ -254,9 +215,6 @@ validate_properties break; case DESC_BOUND_F_FOR_SOLID: if(!(solid_count == 1 && fluid_count == 0)) { - PRT_INCOHERENT_TRG(); - logger_print(stardis->logger, LOG_ERROR, - "Can only define a DESC_BOUND_F_FOR_SOLID boundary for a solid region\n"); if(solid_count + fluid_count == 2) *properties_conflict_status = BOUND_F_FOR_SOLID_BETWEEN_2_DEFS; else if(solid_count + fluid_count == 0) @@ -269,15 +227,14 @@ validate_properties break; case DESC_SOLID_FLUID_CONNECT: if(solid_count != 1 || fluid_count != 1) { - PRT_INCOHERENT_TRG(); - logger_print(stardis->logger, LOG_ERROR, - "Can only define a DESC_SOLID_FLUID_CONNECT between a fluid and a solid\n"); if(solid_count == 2) *properties_conflict_status = SFCONNECT_BETWEEN_2_SOLIDS; else if(fluid_count == 2) *properties_conflict_status = SFCONNECT_BETWEEN_2_FLUIDS; - else if(solid_count + fluid_count < 2) + else if(solid_count + fluid_count == 1) *properties_conflict_status = SFCONNECT_USED_AS_BOUNDARY; + else if (solid_count + fluid_count == 0) + *properties_conflict_status = SFCONNECT_BETWEEN_2_UNDEFS; else FATAL("error:" STR(__FILE__) ":" STR(__LINE__)"\n"); goto end; } @@ -288,14 +245,14 @@ validate_properties } else { /* No interface defined */ ASSERT(intface_count == 0 && undef_count >= 1); - if(fluid_count == 2) { - *properties_conflict_status = NO_BOUND_BETWEEN_FLUIDS; - goto end; - } if(undef_count == 3) { *properties_conflict_status = TRG_WITH_NO_PROPERTY; goto end; } + if(fluid_count == 2) { + *properties_conflict_status = NO_CONNECTION_BETWEEN_2_FLUIDS; + goto end; + } if(undef_count == 2) { ASSERT(fluid_count + solid_count == 1); if(fluid_count) @@ -303,18 +260,19 @@ validate_properties else *properties_conflict_status = NO_BOUND_BETWEEN_SOLID_AND_UNDEF; goto end; } + if(undef_count == 1 && solid_count == 1 && fluid_count == 1) { + *properties_conflict_status = NO_CONNECTION_BETWEEN_SOLID_AND_FLUID; + goto end; + } /* Undef interface between solids is OK */ - if(undef_count == 1) CHK(solid_count == 2); + CHK(solid_count == 2); } end: return res; -error: - goto end; } #undef COUNT_SIDE -#undef PRT_INCOHERENT_TRG static struct sdis_interface* geometry_get_interface @@ -513,8 +471,10 @@ stardis_init stardis->dump_paths |= SDIS_HEAT_PATH_SUCCESS; stardis->verbose = args->verbose; darray_media_ptr_init(stardis->allocator, &stardis->media); - - is_for_compute = (stardis->mode & COMPUTE_MODES); + + /* If a dump is expected, we won't process any computation */ + is_for_compute = + (stardis->mode & COMPUTE_MODES) && !(stardis->mode & DUMP_VTK); ERR(init_geometry(stardis->logger, stardis->allocator, stardis->verbose, &stardis->geometry)); @@ -564,12 +524,15 @@ stardis_init } } - for(i = 0; i < tcount; ++i) { - ERR(create_intface(stardis, i, &htable_interfaces)); + if(is_for_compute) { + for(i = 0; i < tcount; ++i) { + ERR(create_intface(stardis, i, &htable_interfaces)); + } } /* If computation is on a compute surface, read it */ if(args->mode & SURFACE_COMPUTE_MODES) { + unsigned save_count = count; ASSERT(!str_is_empty(&stardis->solve_name)); ERR(read_compute_surface(stardis)); /* Check compute surface */ @@ -577,13 +540,14 @@ stardis_init validate_properties, stardis)); ERR(sg3d_geometry_get_unique_triangles_with_properties_conflict_count( stardis->geometry.sg3d, &count)); - if(count) { + ASSERT(count >= save_count); + if(save_count != count) { logger_print(stardis->logger, (is_for_compute ? LOG_ERROR : LOG_WARNING), "Invalid compute region defined by file '%s'.\n", str_cget(&stardis->solve_name)); logger_print(stardis->logger, (is_for_compute ? LOG_ERROR : LOG_WARNING), - "The file contains %u triangles not in the model.\n", count); - if(is_for_compute) { + "The file contains %u triangles not in the model.\n", count - save_count); + if(is_for_compute) { res = RES_BAD_ARG; goto error; } diff --git a/src/stardis-intface.c b/src/stardis-intface.c @@ -173,12 +173,12 @@ create_intface struct sdis_medium* def_medium = NULL; unsigned ext_id; if(connect->type == DESC_SOLID_FLUID_CONNECT) { + if(solid_count != 1 || fluid_count != 1) { res = RES_BAD_ARG; goto error; } ASSERT(front_defined && back_defined); fluid_side_shader = (descriptions[fd].type == DESC_MAT_SOLID) ? &interface_shader.back : &interface_shader.front; - if(solid_count != 1 || fluid_count != 1) goto error; } else { - if(front_defined == back_defined) goto error; + if(front_defined == back_defined) { res = RES_BAD_ARG; goto error; } def_medium = front_defined ? front_med : back_med; if(front_defined) { ASSERT(descriptions[fd].type == DESC_MAT_SOLID @@ -197,7 +197,7 @@ create_intface } switch(connect->type) { case DESC_BOUND_H_FOR_FLUID: - if(sdis_medium_get_type(def_medium) != SDIS_FLUID) goto error; + if(sdis_medium_get_type(def_medium) != SDIS_FLUID) { res = RES_BAD_ARG; goto error; } type_checked = 1; ASSERT(connect->d.h_boundary.imposed_temperature >= 0); interface_props->imposed_temperature @@ -206,7 +206,10 @@ create_intface /* fall through */ case DESC_BOUND_H_FOR_SOLID: if(!type_checked - && sdis_medium_get_type(def_medium) != SDIS_SOLID) goto error; + && sdis_medium_get_type(def_medium) != SDIS_SOLID) + { + res = RES_BAD_ARG; goto error; + } ext_id = connect->d.h_boundary.mat_id; /* External material id */ ASSERT(ext_id < darray_media_ptr_size_get(&stardis->media)); ASSERT(sdis_medium_get_type(media[ext_id]) == @@ -229,7 +232,7 @@ create_intface } break; case DESC_BOUND_T_FOR_FLUID: - if(sdis_medium_get_type(def_medium) != SDIS_FLUID) goto error; + if(sdis_medium_get_type(def_medium) != SDIS_FLUID) { res = RES_BAD_ARG; goto error; } type_checked = 1; interface_shader.convection_coef_upper_bound = connect->d.t_boundary.hc; interface_props->hc = connect->d.t_boundary.hc; @@ -247,7 +250,10 @@ create_intface /* fall through */ case DESC_BOUND_T_FOR_SOLID: if(!type_checked - && sdis_medium_get_type(def_medium) != SDIS_SOLID) goto error; + && sdis_medium_get_type(def_medium) != SDIS_SOLID) + { + res = RES_BAD_ARG; goto error; + } ext_id = connect->d.t_boundary.mat_id; /* External material id */ ASSERT(ext_id < darray_media_ptr_size_get(&stardis->media)); ASSERT(sdis_medium_get_type(media[ext_id]) @@ -268,7 +274,7 @@ create_intface = connect->d.t_boundary.imposed_temperature; break; case DESC_BOUND_F_FOR_SOLID: - if(sdis_medium_get_type(def_medium) != SDIS_SOLID) goto error; + if(sdis_medium_get_type(def_medium) != SDIS_SOLID) { res = RES_BAD_ARG; goto error; } connection_count++; boundary_count++; if(front_defined) { @@ -309,7 +315,9 @@ create_intface || (boundary_count ? (fluid_count + solid_count != 1) : (fluid_count + solid_count != 2)) || (solid_fluid_connection_count && (fluid_count != 1 || solid_count != 1))) - goto error; + { + res = RES_BAD_ARG; goto error; + } ERR(sdis_interface_create(stardis->dev, front_med, back_med, &interface_shader, data, &intface));