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:
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];