commit a63a3641bf9dd955d6bc999e6f3b5acf3da5c5cf
parent 15e12609d3fd0952da3365b174e1d188296aa26c
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date: Thu, 9 Apr 2020 10:11:09 +0200
Add name duplicate detection in input data
Diffstat:
3 files changed, 83 insertions(+), 6 deletions(-)
diff --git a/doc/stardis-input.5.txt b/doc/stardis-input.5.txt
@@ -165,12 +165,8 @@ NAMES
Names, either file names, medium names or boundary names, are a sequence of
one or ore ASCII characters, including numbers and special characters like
*.* *_* *-* as one may consider using in standard file names, *without any
-spacing* either escaped or not.
-
-Two different description lines can use the same name. However, computing
-mean temperature in a given medium (*-m* option of *stardis*) has an undefined
-behaviour when the medium name has been used more than once in the system
-description.
+spacing* either escaped or not. Two different description lines cannot use
+the same name.
EXAMPLES
--------
diff --git a/src/stardis-app.h b/src/stardis-app.h
@@ -574,6 +574,31 @@ error:
goto end;
}
+static INLINE struct str*
+get_description_name
+ (struct description* desc)
+{
+ ASSERT(desc);
+ switch (desc->type) {
+ case DESC_MAT_SOLID:
+ return &desc->d.solid.name;
+ case DESC_MAT_FLUID:
+ return &desc->d.fluid.name;
+ case DESC_BOUND_T_FOR_SOLID:
+ case DESC_BOUND_T_FOR_FLUID:
+ return &desc->d.t_boundary.name;
+ case DESC_BOUND_H_FOR_SOLID:
+ case DESC_BOUND_H_FOR_FLUID:
+ return &desc->d.h_boundary.name;
+ case DESC_BOUND_F_FOR_SOLID:
+ return &desc->d.f_boundary.name;
+ case DESC_SOLID_FLUID_CONNECT:
+ return &desc->d.sf_connect.name;
+ default:
+ FATAL("error:" STR(__FILE__) ":" STR(__LINE__)": Invalid type.\n");
+ }
+}
+
static FINLINE res_T
cp_description
(struct description* dst,
diff --git a/src/stardis-parsing.c b/src/stardis-parsing.c
@@ -909,6 +909,26 @@ error:
goto end;
}
+static struct description*
+find_description_by_name
+ (struct stardis* stardis,
+ const struct str* name,
+ size_t* out_id)
+{
+ size_t i;
+ ASSERT(stardis && name);
+
+ FOR_EACH(i, 0, darray_descriptions_size_get(&stardis->descriptions)) {
+ struct description* desc
+ = darray_descriptions_data_get(&stardis->descriptions) + i;
+ if (str_eq(name, get_description_name(desc))) {
+ if (out_id) *out_id = i;
+ return desc;
+ }
+ }
+ return NULL;
+}
+
/* H_BOUNDARY_FOR_SOLID Name emissivity specular_fraction hc T_env STL_filenames
* H_BOUNDARY_FOR_FLUID Name emissivity specular_fraction hc T_env STL_filenames */
static res_T
@@ -935,6 +955,12 @@ process_h
CHK_TOK(strtok_r(NULL, " ", tok_ctx), "h boundary name");
ERR(str_set(&desc->d.h_boundary.name, tk));
+ if (find_description_by_name(stardis, &desc->d.h_boundary.name, NULL)) {
+ logger_print(stardis->logger, LOG_ERROR,
+ "Name already used: %s\n", tk);
+ if (res == RES_OK) res = RES_BAD_ARG;
+ goto end;
+ }
CHK_TOK(strtok_r(NULL, " ", tok_ctx), "emissivity");
res = cstr_to_double(tk, &desc->d.h_boundary.emissivity);
@@ -1010,6 +1036,12 @@ process_t
CHK_TOK(strtok_r(NULL, " ", tok_ctx), "temperature boundary name");
ERR(str_set(&desc->d.t_boundary.name, tk));
+ if (find_description_by_name(stardis, &desc->d.t_boundary.name, NULL)) {
+ logger_print(stardis->logger, LOG_ERROR,
+ "Name already used: %s\n", tk);
+ if (res == RES_OK) res = RES_BAD_ARG;
+ goto end;
+ }
CHK_TOK(strtok_r(NULL, " ", tok_ctx), "temperature");
res = cstr_to_double(tk, &desc->d.t_boundary.imposed_temperature);
@@ -1085,6 +1117,12 @@ process_flx
CHK_TOK(strtok_r(NULL, " ", tok_ctx), "flux boundary name");
ERR(str_set(&desc->d.f_boundary.name, tk));
+ if (find_description_by_name(stardis, &desc->d.f_boundary.name, NULL)) {
+ logger_print(stardis->logger, LOG_ERROR,
+ "Name already used: %s\n", tk);
+ if (res == RES_OK) res = RES_BAD_ARG;
+ goto end;
+ }
CHK_TOK(strtok_r(NULL, " ", tok_ctx), "flux");
res = cstr_to_double(tk, &desc->d.f_boundary.imposed_flux);
@@ -1127,6 +1165,12 @@ process_sfc
CHK_TOK(strtok_r(NULL, " ", tok_ctx), "connection name");
ERR(str_set(&desc->d.sf_connect.name, tk));
+ if (find_description_by_name(stardis, &desc->d.sf_connect.name, NULL)) {
+ logger_print(stardis->logger, LOG_ERROR,
+ "Name already used: %s\n", tk);
+ if (res == RES_OK) res = RES_BAD_ARG;
+ goto end;
+ }
CHK_TOK(strtok_r(NULL, " ", tok_ctx), "emissivity");
res = cstr_to_double(tk, &desc->d.sf_connect.emissivity);
@@ -1191,6 +1235,12 @@ process_solid
CHK_TOK(strtok_r(NULL, " ", tok_ctx), "solid name");
ERR(str_set(&desc->d.solid.name, tk));
+ if (find_description_by_name(stardis, &desc->d.solid.name, NULL)) {
+ logger_print(stardis->logger, LOG_ERROR,
+ "Name already used: %s\n", tk);
+ if (res == RES_OK) res = RES_BAD_ARG;
+ goto end;
+ }
CHK_TOK(strtok_r(NULL, " ", tok_ctx), "lambda");
res = cstr_to_double(tk, &desc->d.solid.lambda);
@@ -1277,6 +1327,12 @@ process_fluid
CHK_TOK(strtok_r(NULL, " ", tok_ctx), "fluid name");
ERR(str_set(&desc->d.fluid.name, tk));
+ if (find_description_by_name(stardis, &desc->d.fluid.name, NULL)) {
+ logger_print(stardis->logger, LOG_ERROR,
+ "Name already used: %s\n", tk);
+ if (res == RES_OK) res = RES_BAD_ARG;
+ goto end;
+ }
CHK_TOK(strtok_r(NULL, " ", tok_ctx), "rho");
res = cstr_to_double(tk, &desc->d.fluid.rho);