stardis

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

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:
Msrc/stardis-compute.c | 104++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------
Msrc/stardis-parsing.c | 16++++++++++++++++
Msrc/stardis-parsing.h | 6+++++-
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),