commit b4250069275b380c04dabb9e3f7b074a2cd70fe9
parent 6dcea2f629d27beb01ed11ccb88f562fb841d6b9
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date: Thu, 24 Jun 2021 15:53:59 +0200
Enable random states R/W for most computations
Diffstat:
3 files changed, 92 insertions(+), 34 deletions(-)
diff --git a/src/stardis-compute.c b/src/stardis-compute.c
@@ -374,6 +374,43 @@ error:
goto end;
}
+#define READ_RANDOM_STATE(Name) \
+ if(!str_is_empty(Name)) { \
+ const char* name = str_cget(Name); \
+ stream = fopen(name, "r"); \
+ if(!stream) { \
+ res = RES_IO_ERR; \
+ logger_print(stardis->logger, LOG_ERROR, \
+ "Could not open generator's state file ('%s').\n", \
+ name); \
+ goto error; \
+ } \
+ ERR(ssp_rng_create(stardis->allocator, &ssp_rng_mt19937_64, &args.rng_state)); \
+ res = read_random_generator_state(args.rng_state, stream); \
+ if(res != RES_OK) { \
+ logger_print(stardis->logger, LOG_ERROR, \
+ "Could not read random generator's state ('%s').\n", \
+ name); \
+ goto error; \
+ } \
+ fclose(stream); stream = NULL; \
+ }
+
+#define WRITE_RANDOM_STATE(Name) \
+ if(!str_is_empty(Name)) { \
+ const char* name = str_cget(Name); \
+ stream = fopen(name, "wb"); \
+ if(!stream) { \
+ res = RES_IO_ERR; \
+ logger_print(stardis->logger, LOG_ERROR, \
+ "Could not write random generator's state ('%s').\n", \
+ name); \
+ goto error; \
+ } \
+ ERR(write_random_generator_state(estimator, stream)); \
+ fclose(stream); stream = NULL; \
+ }
+
static res_T
compute_probe(struct stardis* stardis, struct time* start)
{
@@ -396,26 +433,7 @@ compute_probe(struct stardis* stardis, struct time* start)
d2_set(args.time_range, stardis->time_range);
/* Input random state? */
- if(!str_is_empty(&stardis->rndgen_state_in_filename)) {
- const char* name = str_cget(&stardis->rndgen_state_in_filename);
- stream = fopen(name, "r");
- if(!stream) {
- res = RES_IO_ERR;
- logger_print(stardis->logger, LOG_ERROR,
- "Could not open generator's state file ('%s').\n",
- name);
- goto error;
- }
- ERR(ssp_rng_create(stardis->allocator, &ssp_rng_mt19937_64, &args.rng_state));
- res = read_random_generator_state(args.rng_state, stream);
- if(res != RES_OK) {
- logger_print(stardis->logger, LOG_ERROR,
- "Could not read random generator's state ('%s').\n",
- name);
- goto error;
- }
- fclose(stream); stream = NULL;
- }
+ READ_RANDOM_STATE(&stardis->rndgen_state_in_filename);
if(stardis->mode & (MODE_BIN_GREEN | MODE_GREEN)) {
time_current(&compute_start);
@@ -465,19 +483,7 @@ compute_probe(struct stardis* stardis, struct time* start)
}
/* Output random state? */
- if(!str_is_empty(&stardis->rndgen_state_out_filename)) {
- const char* name = str_cget(&stardis->rndgen_state_out_filename);
- stream = fopen(name, "wb");
- if(!stream) {
- res = RES_IO_ERR;
- logger_print(stardis->logger, LOG_ERROR,
- "Could not write random generator's state ('%s').\n",
- name);
- goto error;
- }
- ERR(write_random_generator_state(estimator, stream));
- fclose(stream); stream = NULL;
- }
+ WRITE_RANDOM_STATE(&stardis->rndgen_state_out_filename);
end:
if(stream) fclose(stream);
@@ -661,6 +667,9 @@ compute_probe_on_interface(struct stardis* stardis, struct time* start)
args.side = compute_side;
d2_set(args.time_range, stardis->time_range);
+ /* Input random state? */
+ READ_RANDOM_STATE(&stardis->rndgen_state_in_filename);
+
if(stardis->mode & (MODE_BIN_GREEN | MODE_GREEN)) {
time_current(&compute_start);
ERR(sdis_solve_probe_boundary_green_function(stardis->sdis_scn, &args,
@@ -709,10 +718,14 @@ compute_probe_on_interface(struct stardis* stardis, struct time* start)
ERR(sdis_estimator_for_each_path(estimator, dump_path, &dump_ctx));
}
+ /* Output random state? */
+ WRITE_RANDOM_STATE(&stardis->rndgen_state_out_filename);
+
end:
if(stream) fclose(stream);
if(estimator) SDIS(estimator_ref_put(estimator));
if(green) SDIS(green_function_ref_put(green));
+ if(args.rng_state) SSP(rng_ref_put(args.rng_state));
return res;
error:
goto end;
@@ -915,6 +928,9 @@ compute_medium(struct stardis* stardis, struct time* start)
args.medium = medium;
d2_set(args.time_range, stardis->time_range);
+ /* Input random state? */
+ READ_RANDOM_STATE(&stardis->rndgen_state_in_filename);
+
if(stardis->mode & (MODE_BIN_GREEN | MODE_GREEN)) {
time_current(&compute_start);
ERR(sdis_solve_medium_green_function(stardis->sdis_scn, &args, &green));
@@ -961,10 +977,14 @@ compute_medium(struct stardis* stardis, struct time* start)
ERR(sdis_estimator_for_each_path(estimator, dump_path, &dump_ctx));
}
+ /* Output random state? */
+ WRITE_RANDOM_STATE(&stardis->rndgen_state_out_filename);
+
end:
if(stream) fclose(stream);
if(estimator) SDIS(estimator_ref_put(estimator));
if(green) SDIS(green_function_ref_put(green));
+ if(args.rng_state) SSP(rng_ref_put(args.rng_state));
return res;
error:
goto end;
@@ -1039,6 +1059,9 @@ compute_boundary(struct stardis* stardis, struct time* start)
= darray_size_t_size_get(&stardis->compute_surface.primitives);
d2_set(args.time_range, stardis->time_range);
+ /* Input random state? */
+ READ_RANDOM_STATE(&stardis->rndgen_state_in_filename);
+
if(stardis->mode & (MODE_BIN_GREEN | MODE_GREEN)) {
time_current(&compute_start);
ERR(sdis_solve_boundary_green_function(stardis->sdis_scn, &args, &green));
@@ -1085,10 +1108,14 @@ compute_boundary(struct stardis* stardis, struct time* start)
ERR(sdis_estimator_for_each_path(estimator, dump_path, &dump_ctx));
}
+ /* Output random state? */
+ WRITE_RANDOM_STATE(&stardis->rndgen_state_out_filename);
+
end:
if(stream) fclose(stream);
if(estimator) SDIS(estimator_ref_put(estimator));
if(green) SDIS(green_function_ref_put(green));
+ if(args.rng_state) SSP(rng_ref_put(args.rng_state));
return res;
error:
goto end;
@@ -1103,6 +1130,7 @@ compute_flux_boundary(struct stardis* stardis, struct time* start)
struct sdis_solve_boundary_flux_args args
= SDIS_SOLVE_BOUNDARY_FLUX_ARGS_DEFAULT;
struct dump_path_context dump_ctx;
+ FILE* stream = NULL;
struct time compute_start, compute_end;
ASSERT(stardis && start && (stardis->mode & MODE_FLUX_BOUNDARY_COMPUTE));
@@ -1114,6 +1142,9 @@ compute_flux_boundary(struct stardis* stardis, struct time* start)
= darray_size_t_size_get(&stardis->compute_surface.primitives);
d2_set(args.time_range, stardis->time_range);
+ /* Input random state? */
+ READ_RANDOM_STATE(&stardis->rndgen_state_in_filename);
+
time_current(&compute_start);
ERR(sdis_solve_boundary_flux(stardis->sdis_scn, &args, &estimator));
time_current(&compute_end);
@@ -1126,9 +1157,13 @@ compute_flux_boundary(struct stardis* stardis, struct time* start)
dump_ctx.rank = 0;
ERR(sdis_estimator_for_each_path(estimator, dump_path, &dump_ctx));
+ /* Output random state? */
+ WRITE_RANDOM_STATE(&stardis->rndgen_state_out_filename);
+
end:
if(estimator) SDIS(estimator_ref_put(estimator));
if(green) SDIS(green_function_ref_put(green));
+ if(args.rng_state) SSP(rng_ref_put(args.rng_state));
return res;
error:
goto end;
@@ -1186,6 +1221,9 @@ error:
goto end;
}
+#undef READ_RANDOM_STATE
+#undef WRITE_RANDOM_STATE
+
/*******************************************************************************
* Public Functions
******************************************************************************/
diff --git a/src/stardis-parsing.c b/src/stardis-parsing.c
@@ -893,10 +893,26 @@ parse_args
break;
case 'x':
+ if(!(args->mode & RANDOM_RW_MODES)) {
+ res = RES_BAD_ARG;
+ print_multiple_modes(buf, sizeof(buf), RANDOM_RW_MODES, 0);
+ logger_print(args->logger, LOG_ERROR,
+ "Option -%c can only be used in conjunction with one of the following options: %s.\n",
+ (char)opt, buf);
+ goto error;
+ }
args->rndgen_state_in_filename = optarg;
break;
case 'X':
+ if(!(args->mode & RANDOM_RW_MODES)) {
+ res = RES_BAD_ARG;
+ print_multiple_modes(buf, sizeof(buf), RANDOM_RW_MODES, 0);
+ logger_print(args->logger, LOG_ERROR,
+ "Option -%c can only be used in conjunction with one of the following options: %s.\n",
+ (char)opt, buf);
+ goto error;
+ }
args->rndgen_state_out_filename = optarg;
break;
}
diff --git a/src/stardis-parsing.h b/src/stardis-parsing.h
@@ -81,7 +81,11 @@ enum stardis_mode {
USE_STDOUT_MODES
= MODE_DUMP_C_CHUNKS | MODE_DUMP_VTK | MODE_DUMP_HELP | MODE_DUMP_VERSION
- | MODE_IR_COMPUTE | MODE_GREEN
+ | MODE_IR_COMPUTE | MODE_GREEN,
+
+ RANDOM_RW_MODES
+ = MODE_PROBE_COMPUTE | MODE_PROBE_COMPUTE_ON_INTERFACE | MODE_MEDIUM_COMPUTE
+ | MODE_BOUNDARY_COMPUTE | MODE_FLUX_BOUNDARY_COMPUTE
};
STATIC_ASSERT(GREEN_COMPATIBLE_MODES == (COMPUTE_MODES & GREEN_COMPATIBLE_MODES),