stardis

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

commit 9c0d4f50a31ee739d9aa72c38b4f96cfd869f235
parent 9a5052f9134043e62f9711c1172211150f2d029e
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Tue, 15 Jun 2021 10:22:22 +0200

Add the read/write of random state feature

Scope limited to probe computations, more later

Diffstat:
Mcmake/CMakeLists.txt | 8+++++---
Msrc/stardis-app.c | 10++++++++++
Msrc/stardis-app.h | 2++
Msrc/stardis-compute.c | 23+++++++++++++++++++++++
Msrc/stardis-output.c | 21+++++++++++++++++++++
Msrc/stardis-output.h | 11+++++++++++
Msrc/stardis-parsing.c | 36+++++++++++++++++++++++++++++++++++-
Msrc/stardis-parsing.h | 2++
8 files changed, 109 insertions(+), 4 deletions(-)

diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt @@ -75,6 +75,7 @@ find_package(Star3D 0.7.3 REQUIRED) find_package(StarEnc3D 0.4.2 REQUIRED) find_package(Stardis 0.11 REQUIRED) find_package(StarSTL 0.3 REQUIRED) +find_package(StarSP 0.8.1 REQUIRED) if(MSVC) find_package(MuslGetopt REQUIRED) endif() @@ -86,6 +87,7 @@ include_directories( ${StarEnc3D_INCLUDE_DIR} ${Stardis_INCLUDE_DIR} ${StarSTL_INCLUDE_DIR} + ${StarSP_INCLUDE_DIR} ${CMAKE_CURRENT_BINARY_DIR}) if(MSVC) include_directories(${MuslGetopt_INCLUDE_DIR}) @@ -97,11 +99,11 @@ include(rcmake_runtime) if(CMAKE_COMPILER_IS_GNUCC) rcmake_append_runtime_dirs(_runtime_dirs - RSys Stardis Star3D StarGeom3D StarEnc3D StarSTL) + RSys Stardis Star3D StarGeom3D StarEnc3D StarSTL StarSP) endif() if(MSVC) rcmake_append_runtime_dirs(_runtime_dirs - RSys MuslGetopt Stardis Star3D StarGeom3D StarEnc3D StarSTL) + RSys MuslGetopt Stardis Star3D StarGeom3D StarEnc3D StarSTL StarSP) endif() ############################################################################### @@ -156,7 +158,7 @@ set_target_properties(stardis PROPERTIES VERSION ${SDIS_VERSION}) target_link_libraries(stardis - Stardis Star3D StarGeom3D StarEnc3D StarSTL RSys ${GETOPT_LIB} ${MATH_LIB}) + Stardis Star3D StarGeom3D StarEnc3D StarSTL StarSP RSys ${GETOPT_LIB} ${MATH_LIB}) ############################################################################### # Define output & install directories diff --git a/src/stardis-app.c b/src/stardis-app.c @@ -225,6 +225,8 @@ stardis_init str_init(stardis->allocator, &stardis->paths_filename); str_init(stardis->allocator, &stardis->bin_green_filename); str_init(stardis->allocator, &stardis->end_paths_filename); + str_init(stardis->allocator, &stardis->rndgen_state_in_filename); + str_init(stardis->allocator, &stardis->rndgen_state_out_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); @@ -362,6 +364,14 @@ stardis_init if(args->end_paths_filename) { ERR(str_set(&stardis->end_paths_filename, args->end_paths_filename)); } + if(args->rndgen_state_in_filename) { + ERR(str_set(&stardis->rndgen_state_in_filename, + args->rndgen_state_in_filename)); + } + if(args->rndgen_state_out_filename) { + ERR(str_set(&stardis->rndgen_state_out_filename, + args->rndgen_state_out_filename)); + } } /* If computation is on a volume, check medium is known */ diff --git a/src/stardis-app.h b/src/stardis-app.h @@ -814,6 +814,8 @@ struct stardis { struct str paths_filename; struct str bin_green_filename; struct str end_paths_filename; + struct str rndgen_state_in_filename; + struct str rndgen_state_out_filename; struct str chunks_prefix; int mode; size_t samples; diff --git a/src/stardis-compute.c b/src/stardis-compute.c @@ -24,6 +24,7 @@ #include <star/s3d.h> #include <star/sg3d_sXd_helper.h> +#include <star/ssp.h> #include <rsys/double3.h> #include <rsys/double2.h> @@ -428,6 +429,17 @@ compute_probe(struct stardis* stardis, struct time* start) ERR(dump_green_ascii(green, stardis, stdout)); } } else { + /* Input random state? */ + if(!str_is_empty(&stardis->rndgen_state_in_filename)) { + stream = fopen(str_cget(&stardis->rndgen_state_in_filename), "r"); + if(!stream) { + res = RES_IO_ERR; + goto error; + } + ERR(ssp_rng_create(stardis->allocator, &ssp_rng_mt19937_64, &args.rng_state)); + ERR(read_random_generator_state(args.rng_state, stream)); + fclose(stream); stream = NULL; + } args.register_paths = stardis->dump_paths; time_current(&compute_start); ERR(sdis_solve_probe(stardis->sdis_scn, &args, &estimator)); @@ -440,6 +452,17 @@ compute_probe(struct stardis* stardis, struct time* start) dump_ctx.stardis = stardis; dump_ctx.rank = 0; ERR(sdis_estimator_for_each_path(estimator, dump_path, &dump_ctx)); + + /* Output random state? */ + if(!str_is_empty(&stardis->rndgen_state_out_filename)) { + stream = fopen(str_cget(&stardis->rndgen_state_out_filename), "wb"); + if(!stream) { + res = RES_IO_ERR; + goto error; + } + ERR(write_random_generator_state(estimator, stream)); + fclose(stream); stream = NULL; + } } end: diff --git a/src/stardis-output.c b/src/stardis-output.c @@ -25,6 +25,7 @@ #include<star/senc3d.h> #include<star/sg3d.h> +#include<star/ssp.h> #include <rsys/math.h> #include <rsys/mem_allocator.h> @@ -1823,3 +1824,23 @@ exit: error: goto exit; } + +res_T +write_random_generator_state + (struct sdis_estimator* estimator, + FILE* stream) +{ + res_T res; + struct ssp_rng* state; + res = sdis_estimator_get_rng_state(estimator, &state); + if(res != RES_OK) return res; + return ssp_rng_write(state, stream); +} + +res_T +read_random_generator_state + (struct ssp_rng* state, + FILE* stream) +{ + return ssp_rng_read(state, stream); +} diff --git a/src/stardis-output.h b/src/stardis-output.h @@ -32,6 +32,7 @@ struct geometry; struct vertex; struct darray_estimators; struct time; +struct ssp_rng; struct dump_path_context { unsigned long rank; @@ -117,4 +118,14 @@ dump_model_as_c_chunks (struct stardis* stardis, FILE* stream); +extern res_T +write_random_generator_state + (struct sdis_estimator* estimator, + FILE* stream); + +extern res_T +read_random_generator_state + (struct ssp_rng* state, + FILE* stream); + #endif diff --git a/src/stardis-parsing.c b/src/stardis-parsing.c @@ -502,6 +502,12 @@ short_help fprintf(stream, "\n -V LEVEL\n"); fprintf(stream, " Set the verbosity level.\n"); + + fprintf(stream, "\n -x <FILE>\n"); + fprintf(stream, " Use a random generator's state read from a file.\n"); + + fprintf(stream, "\n -X <FILE>\n"); + fprintf(stream, " Save the final random generator's state in a file.\n"); } #define FREE_AARRAY(ARRAY) \ @@ -559,7 +565,7 @@ parse_args { int opt = 0, n_used = 0; size_t len = 0; - const char option_list[] = "a:c: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:x:X:"; char buf[128]; struct str keep; char** line = NULL; @@ -885,6 +891,14 @@ parse_args goto error; } break; + + case 'x': + args->rndgen_state_in_filename = optarg; + break; + + case 'X': + args->rndgen_state_out_filename = optarg; + break; } } @@ -973,6 +987,26 @@ parse_args } } + if(args->rndgen_state_in_filename && !(args->mode & COMPUTE_MODES)) { + res = RES_BAD_ARG; + print_multiple_modes(buf, sizeof(buf), COMPUTE_MODES, 0); + logger_print(args->logger, LOG_ERROR, + "Option -x can only be used in conjunction with an option" + " that launch a MC computation (%s).\n", + buf); + goto error; + } + + if(args->rndgen_state_out_filename && !(args->mode & COMPUTE_MODES)) { + res = RES_BAD_ARG; + print_multiple_modes(buf, sizeof(buf), COMPUTE_MODES, 0); + logger_print(args->logger, LOG_ERROR, + "Option -X can only be used in conjunction with an option" + " that launch a MC computation (%s).\n", + buf); + goto error; + } + end: FREE_AARRAY(line); str_release(&keep); diff --git a/src/stardis-parsing.h b/src/stardis-parsing.h @@ -103,6 +103,8 @@ struct args { char* bin_green_filename; char* end_paths_filename; char* paths_filename; + char* rndgen_state_in_filename; + char* rndgen_state_out_filename; char* chunks_prefix; size_t samples; unsigned nthreads;