stardis

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

commit dea48b5c6cda963dca5b4709b68315d39829f909
parent f1a2e903680a1feb3818f21a670b4165cfebe590
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Wed, 19 Aug 2020 15:28:16 +0200

Add 'dump as C chunks' feature

Diffstat:
Msrc/stardis-app.c | 6+++++-
Msrc/stardis-app.h | 1+
Msrc/stardis-main.c | 7++++++-
Msrc/stardis-output.c | 76+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
Msrc/stardis-output.h | 5+++++
Msrc/stardis-parsing.c | 21+++++++++++++++++++--
Msrc/stardis-parsing.h | 35+++++++++++++++++++----------------
7 files changed, 128 insertions(+), 23 deletions(-)

diff --git a/src/stardis-app.c b/src/stardis-app.c @@ -348,6 +348,7 @@ stardis_init str_init(stardis->allocator, &stardis->solve_name); str_init(stardis->allocator, &stardis->paths_filename); str_init(stardis->allocator, &stardis->bin_green_filename); + str_init(stardis->allocator, &stardis->chunks_prefix); darray_size_t_init(stardis->allocator, &stardis->compute_surface.primitives); darray_sides_init(stardis->allocator, &stardis->compute_surface.sides); darray_uint_init(stardis->allocator, &stardis->compute_surface.err_triangles); @@ -382,6 +383,9 @@ stardis_init else if(args->mode & SURFACE_COMPUTE_MODES) { ERR(str_set(&stardis->solve_name, args->solve_filename)); } + else if(args->mode & MODE_DUMP_C_CHUNKS) { + ERR(str_set(&stardis->chunks_prefix, args->chunks_prefix)); + } ERR(read_model(&args->model_files, stardis, &dummies)); ERR(sdis_device_create(stardis->logger, stardis->allocator, stardis->nthreads, @@ -393,7 +397,6 @@ stardis_init ERR(sg3d_geometry_get_unique_vertices_count(stardis->geometry.sg3d, &vcount)); ERR(sg3d_geometry_get_unique_triangles_count(stardis->geometry.sg3d, &tcount)); - ERR(sg3d_geometry_validate_properties(stardis->geometry.sg3d, validate_properties, stardis)); ERR(sg3d_geometry_get_unique_triangles_with_properties_conflict_count( @@ -526,6 +529,7 @@ stardis_release str_release(&stardis->solve_name); str_release(&stardis->paths_filename); str_release(&stardis->bin_green_filename); + str_release(&stardis->chunks_prefix); darray_descriptions_release(&stardis->descriptions); release_geometry(&stardis->geometry); darray_size_t_release(&stardis->compute_surface.primitives); diff --git a/src/stardis-app.h b/src/stardis-app.h @@ -850,6 +850,7 @@ struct stardis { or MAP_COMPUTE */ struct str paths_filename; struct str bin_green_filename; + struct str chunks_prefix; int mode; size_t samples; unsigned nthreads; diff --git a/src/stardis-main.c b/src/stardis-main.c @@ -89,7 +89,12 @@ main } ERR(dump_enclosure_related_stuff_at_the_end_of_vtk(&stardis, stdout)); - /* If dump flag set exit after dump done */ + /* If dump, exit after dump done */ + goto exit; + } + else if(mode & MODE_DUMP_C_CHUNKS) { + ERR(dump_model_as_c_chunks(&stardis, stdout)); + /* If dump, exit after dump done */ goto exit; } diff --git a/src/stardis-output.c b/src/stardis-output.c @@ -924,7 +924,7 @@ dump_enclosure_related_stuff_at_the_end_of_vtk { unsigned prim = darray_uint_cdata_get(&stardis->compute_surface.err_triangles)[j]; - if (prim == tid) { + if(prim == tid) { is_err_cs = 1; break; } @@ -1389,4 +1389,75 @@ exit: return res; error: goto exit; -} -\ No newline at end of file +} + +res_T +dump_model_as_c_chunks + (struct stardis* stardis, + FILE* stream) +{ + res_T res = RES_OK; + const char* prefix; + unsigned n, vcount, tcount; + + ASSERT(stardis && stream); + + prefix = str_cget(&stardis->chunks_prefix); + ERR(sg3d_geometry_get_unique_vertices_count(stardis->geometry.sg3d, &vcount)); + ERR(sg3d_geometry_get_unique_triangles_count(stardis->geometry.sg3d, &tcount)); + + fprintf(stream, "#define %s_UNSPECIFIED_PROPERTY %u\n\n", + prefix, SG3D_UNSPECIFIED_PROPERTY); + + fprintf(stream, "static const unsigned\n"); + fprintf(stream, "%s_vertices_count = %u;\n\n", prefix, vcount); + + fprintf(stream, "static const unsigned\n"); + fprintf(stream, "%s_triangles_count = %u;\n\n", prefix, tcount); + + fprintf(stream, "static const double\n"); + fprintf(stream, "%s_vertices[%u][3] = {\n", prefix, vcount); + for(n = 0; n < vcount; n++) { + double vertex[3]; + ERR(sg3d_geometry_get_unique_vertex(stardis->geometry.sg3d, n, + vertex)); + fprintf(stream, " { %g, %g, %g }%c\n", + SPLIT3(vertex), (n == vcount - 1 ? ' ' : ',')); + } + fprintf(stream, "};\n\n"); + + fprintf(stream, "static const unsigned\n"); + fprintf(stream, "%s_triangles[%u][3] = {\n", prefix, tcount); + for(n = 0; n < tcount; n++) { + unsigned triangle[3]; + ERR(sg3d_geometry_get_unique_triangle_vertices(stardis->geometry.sg3d, n, + triangle)); + fprintf(stream, " { %u, %u, %u }%c\n", + SPLIT3(triangle), (n == tcount - 1 ? ' ' : ',')); + } + fprintf(stream, "};\n\n"); + + fprintf(stream, "static const unsigned\n"); + fprintf(stream, "%s_properties[%u][3] = {\n", prefix, tcount); + for(n = 0; n < tcount; n++) { + unsigned properties[SG3D_PROP_TYPES_COUNT__]; + ERR(sg3d_geometry_get_unique_triangle_properties(stardis->geometry.sg3d, n, + properties)); + if(properties[0] == SG3D_UNSPECIFIED_PROPERTY) + fprintf(stream, " { %s_UNSPECIFIED_PROPERTY, ", prefix); + else fprintf(stream, " { %u, ", properties[0]); + if(properties[1] == SG3D_UNSPECIFIED_PROPERTY) + fprintf(stream, "%s_UNSPECIFIED_PROPERTY, ", prefix); + else fprintf(stream, "%u, ", properties[1]); + if(properties[2] == SG3D_UNSPECIFIED_PROPERTY) + fprintf(stream, "%s_UNSPECIFIED_PROPERTY }", prefix); + else fprintf(stream, "%u }", properties[2]); + if(n == tcount - 1) fprintf(stream, "\n"); else fprintf(stream, ",\n"); + } + fprintf(stream, "};\n\n"); + +exit: + return res; +error: + goto exit; +} diff --git a/src/stardis-output.h b/src/stardis-output.h @@ -91,4 +91,9 @@ dump_compute_region_at_the_end_of_vtk (struct stardis* stardis, FILE* stream); +extern res_T +dump_model_as_c_chunks + (struct stardis* stardis, + FILE* stream); + #endif diff --git a/src/stardis-parsing.c b/src/stardis-parsing.c @@ -371,6 +371,7 @@ mode_option { int found = 0; char res = '?'; + if(m & MODE_DUMP_C_CHUNKS) { found++; res = 'c'; } if(m & MODE_DUMP_VTK) { found++; res = 'd'; } if(m & MODE_DUMP_PATHS) { found++; res = 'D'; } if(m & MODE_EXTENDED_RESULTS) { found++; res = 'e'; } @@ -471,7 +472,10 @@ short_help fprintf(stream, "-------------------\n"); fprintf(stream, "\n -a AMBIENT_TEMP\n"); - fprintf(stream, " Set the ambient radiative temperature .\n"); + fprintf(stream, " Set the ambient radiative temperature.\n"); + + fprintf(stream, "\n -c NAMES_PREFIX\n"); + fprintf(stream, " Dump the geometry and property ids to stdout as C chunks.\n"); fprintf(stream, "\n -d\n"); fprintf(stream, " Dump the geometry to stdout in VTK format along with various properties.\n"); @@ -515,7 +519,7 @@ parse_args { int opt = 0, n_used = 0; size_t len = 0; - const char option_list[] = "a:dD:eF:gG:hm:M:n:p:P:r:R:s:S:t:vV:"; + const char option_list[] = "a:c:dD:eF:gG:hm:M:n:p:P:r:R:s:S:t:vV:"; char buf[128]; res_T res = RES_OK; @@ -552,6 +556,19 @@ parse_args } break; + case 'c': + if(args->mode & USE_STDOUT_MODES) { + res = RES_BAD_ARG; + print_multiple_modes(buf, sizeof(buf), USE_STDOUT_MODES, MODE_DUMP_C_CHUNKS); + logger_print(args->logger, LOG_ERROR, + "Option -%c cannot be used in conjunction with other dump options (%s).\n", + (char)opt, buf); + goto error; + } + args->chunks_prefix = optarg; + args->mode |= MODE_DUMP_C_CHUNKS; + break; + case 'd': if(args->mode & USE_STDOUT_MODES) { res = RES_BAD_ARG; diff --git a/src/stardis-parsing.h b/src/stardis-parsing.h @@ -44,21 +44,22 @@ struct dummies; enum stardis_mode { /* Ordered so that print_multiple_modes() prints in alphabetical order */ UNDEF_MODE = 0, - MODE_DUMP_PATHS = BIT(0), /* -D */ - MODE_DUMP_VTK = BIT(1), /* -d */ - MODE_EXTENDED_RESULTS = BIT(2), /* -e */ - MODE_FLUX_BOUNDARY_COMPUTE = BIT(3), /* -F */ - MODE_BIN_GREEN = BIT(4), /* -G */ - MODE_GREEN = BIT(5), /* -g */ - MODE_DUMP_HELP = BIT(6), /* -h */ - MODE_MEDIUM_COMPUTE = BIT(7), /* -m */ - MODE_PROBE_COMPUTE_ON_INTERFACE = BIT(8), /* -P */ - MODE_PROBE_COMPUTE = BIT(9), /* -p */ - MODE_IR_COMPUTE = BIT(10), /* -R */ - MODE_MAP_COMPUTE = BIT(11), /* -S */ - MODE_BOUNDARY_COMPUTE = BIT(12), /* -s */ - MODE_VERBOSITY = BIT(13), /* -V */ - MODE_DUMP_VERSION = BIT(14), /* -v */ + MODE_DUMP_C_CHUNKS = BIT(0), /* -c */ + MODE_DUMP_PATHS = BIT(1), /* -D */ + MODE_DUMP_VTK = BIT(2), /* -d */ + MODE_EXTENDED_RESULTS = BIT(3), /* -e */ + MODE_FLUX_BOUNDARY_COMPUTE = BIT(4), /* -F */ + MODE_BIN_GREEN = BIT(5), /* -G */ + MODE_GREEN = BIT(6), /* -g */ + MODE_DUMP_HELP = BIT(7), /* -h */ + MODE_MEDIUM_COMPUTE = BIT(8), /* -m */ + MODE_PROBE_COMPUTE_ON_INTERFACE = BIT(9), /* -P */ + MODE_PROBE_COMPUTE = BIT(10), /* -p */ + MODE_IR_COMPUTE = BIT(11), /* -R */ + MODE_MAP_COMPUTE = BIT(12), /* -S */ + MODE_BOUNDARY_COMPUTE = BIT(13), /* -s */ + MODE_VERBOSITY = BIT(14), /* -V */ + MODE_DUMP_VERSION = BIT(15), /* -v */ GREEN_COMPATIBLE_MODES = MODE_PROBE_COMPUTE | MODE_PROBE_COMPUTE_ON_INTERFACE | MODE_MEDIUM_COMPUTE @@ -78,7 +79,8 @@ enum stardis_mode { SHORT_EXIT_MODES = MODE_DUMP_HELP | MODE_DUMP_VERSION, USE_STDOUT_MODES - = MODE_DUMP_VTK | MODE_DUMP_HELP | MODE_DUMP_VERSION | MODE_IR_COMPUTE | MODE_GREEN + = MODE_DUMP_C_CHUNKS | MODE_DUMP_VTK | MODE_DUMP_HELP | MODE_DUMP_VERSION + | MODE_IR_COMPUTE | MODE_GREEN }; STATIC_ASSERT(GREEN_COMPATIBLE_MODES == (COMPUTE_MODES & GREEN_COMPATIBLE_MODES), @@ -99,6 +101,7 @@ struct args { char* solve_filename; char* bin_green_filename; char* paths_filename; + char* chunks_prefix; size_t samples; unsigned nthreads; double probe[4];