stardis-solver

Solve coupled heat transfers
git clone git://git.meso-star.fr/stardis-solver.git
Log | Files | Refs | README | LICENSE

commit 7137c82aa0180fcad900ecd5dc80b4c22f4d5668
parent a0cdd303a8fe82568466e567bd57eaecfab468db
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Mon, 28 Feb 2022 10:40:11 +0100

Test the rng_<state|type> variables of the sdis_solve_probe function

Diffstat:
Msrc/test_sdis_solve_probe2.c | 46+++++++++++++++++++++++++++++++++++++++++++++-
Msrc/test_sdis_utils.h | 11+++++++++++
2 files changed, 56 insertions(+), 1 deletion(-)

diff --git a/src/test_sdis_solve_probe2.c b/src/test_sdis_solve_probe2.c @@ -148,6 +148,7 @@ int main(int argc, char** argv) { struct sdis_mc T = SDIS_MC_NULL; + struct sdis_mc T2 = SDIS_MC_NULL; struct sdis_mc time = SDIS_MC_NULL; struct sdis_device* dev = NULL; struct sdis_data* data = NULL; @@ -166,10 +167,13 @@ main(int argc, char** argv) struct sdis_interface_shader interface_shader = DUMMY_INTERFACE_SHADER; struct sdis_interface* interfaces[12]; struct sdis_solve_probe_args solve_args = SDIS_SOLVE_PROBE_ARGS_DEFAULT; + struct ssp_rng* rng = NULL; struct context ctx; struct interf* interface_param = NULL; + FILE* fp = NULL; double ref; const size_t N = 10000; + const char* filename = "rng_state.txt"; size_t nreals; size_t nfails; int is_master_process; @@ -254,6 +258,8 @@ main(int argc, char** argv) solve_args.time_range[1] = INF; OK(sdis_solve_probe(scn, &solve_args, &estimator)); + + ref = 350 * solve_args.position[2] + (1-solve_args.position[2]) * 300; if(!is_master_process) { CHK(estimator == NULL); } else { @@ -263,7 +269,6 @@ main(int argc, char** argv) OK(sdis_estimator_get_realisation_time(estimator, &time)); /* Print the estimation results */ - ref = 350 * solve_args.position[2] + (1-solve_args.position[2]) * 300; printf("Temperature at (%g, %g, %g) = %g ~ %g +/- %g\n", SPLIT3(solve_args.position), ref, T.E, T.SE); printf("Time per realisation (in usec) = %g +/- %g\n", time.E, time.SE); @@ -273,8 +278,47 @@ main(int argc, char** argv) CHK(nfails + nreals == N); CHK(nfails < N/1000); CHK(eq_eps(T.E, ref, 3*T.SE)); + + /* Fetch the rng state */ + OK(sdis_estimator_get_rng_state(estimator, &rng)); + CHK(fp = fopen(filename, "w")); + OK(ssp_rng_write(rng, fp)); + CHK(fclose(fp) == 0); + } + + barrier(); + CHK(fp = fopen(filename, "r")); + OK(ssp_rng_create(NULL, SDIS_SOLVE_PROBE_ARGS_DEFAULT.rng_type, &rng)); + OK(ssp_rng_read(rng, fp)); + CHK(fclose(fp) == 0); + + /* Check RNG type */ + solve_args.rng_state = NULL; + solve_args.rng_type = SSP_RNG_TYPE_NULL; + BA(sdis_solve_probe(scn, &solve_args, &estimator2)); + solve_args.rng_type = + SDIS_SOLVE_PROBE_ARGS_DEFAULT.rng_type == SSP_RNG_THREEFRY + ? SSP_RNG_MT19937_64 : SSP_RNG_THREEFRY; + OK(sdis_solve_probe(scn, &solve_args, &estimator2)); + if(is_master_process) { + OK(sdis_estimator_get_temperature(estimator2, &T2)); + CHK(eq_eps(T2.E, ref, 3*T2.SE)); + CHK(T2.E != T.E); + OK(sdis_estimator_ref_put(estimator2)); } + solve_args.rng_state = rng; + solve_args.rng_type = SSP_RNG_TYPE_NULL; + OK(sdis_solve_probe(scn, &solve_args, &estimator2)); + if(is_master_process) { + OK(sdis_estimator_get_temperature(estimator2, &T2)); + CHK(eq_eps(T2.E, ref, 3*T2.SE)); + CHK(T2.E != T.E); + OK(sdis_estimator_ref_put(estimator2)); + } + + OK(ssp_rng_ref_put(rng)); + /* Check green */ OK(sdis_solve_probe_green_function(scn, &solve_args, &green)); if(!is_master_process) { diff --git a/src/test_sdis_utils.h b/src/test_sdis_utils.h @@ -263,6 +263,17 @@ free_default_device(struct sdis_device* dev) } /******************************************************************************* + * Synchronisation + ******************************************************************************/ +static INLINE void +barrier(void) +{ +#ifdef SDIS_ENABLE_MPI + CHK(MPI_Barrier(MPI_COMM_WORLD) == MPI_SUCCESS); +#endif +} + +/******************************************************************************* * Miscellaneous ******************************************************************************/ static INLINE void