commit 3dcb5bfc1e471c40dd1051f36d088da3d62beac5
parent ffed93d776b02f6c7338beca3df096c67f8c2d7d
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Fri, 5 Apr 2024 16:22:26 +0200
Add WoS support as an alternative to the delta sphere
It is therefore possible to switch from one conduction algorithm to the
other. To do this, we analyze the new -a option to choose between the
two. And we use the analyzed data to define the value of the new input
argument to the resolution functions, which controls which algorithm to
use.
Diffstat:
6 files changed, 50 insertions(+), 6 deletions(-)
diff --git a/src/stardis-app.c b/src/stardis-app.c
@@ -280,6 +280,7 @@ stardis_init
stardis->dump_paths |= SDIS_HEAT_PATH_FAILURE;
if(args->dump_paths & DUMP_SUCCESS)
stardis->dump_paths |= SDIS_HEAT_PATH_SUCCESS;
+ stardis->diff_algo = args->diff_algo;
stardis->next_medium_id = 0;
stardis->undefined_medium_behind_boundary_id = SENC3D_UNSPECIFIED_MEDIUM;
stardis->verbose = args->verbose;
diff --git a/src/stardis-app.h b/src/stardis-app.h
@@ -235,6 +235,7 @@ struct stardis {
unsigned picard_order;
unsigned next_medium_id;
unsigned undefined_medium_behind_boundary_id;
+ enum sdis_diffusion_algorithm diff_algo;
int dump_paths;
int verbose;
int geometry_initialized;
diff --git a/src/stardis-args.c b/src/stardis-args.c
@@ -155,6 +155,34 @@ print_multiple_modes
}
static res_T
+parse_diff_algo
+ (const char* str,
+ struct logger* logger,
+ enum sdis_diffusion_algorithm* out_diff_algo)
+{
+ enum sdis_diffusion_algorithm diff_algo = SDIS_DIFFUSION_NONE;
+ res_T res = RES_OK;
+ ASSERT(str && out_diff_algo);
+
+ if(!strcmp(str, "dsphere")) {
+ diff_algo = SDIS_DIFFUSION_DELTA_SPHERE;
+ } else if(!strcmp(str, "wos")) {
+ diff_algo = SDIS_DIFFUSION_WOS;
+ } else {
+ logger_print(logger, LOG_ERROR,
+ "Invalid diffusion algorithm `%s'\n", str);
+ res = RES_BAD_ARG;
+ goto error;
+ }
+
+exit:
+ *out_diff_algo = diff_algo;
+ return res;
+error:
+ goto exit;
+}
+
+static res_T
parse_position_and_time(const char* str, double pos[3], double time[2])
{
char buf[128];
@@ -401,6 +429,7 @@ init_args
args->samples = STARDIS_DEFAULT_SAMPLES_COUNT;
args->nthreads = SDIS_NTHREADS_DEFAULT;
args->picard_order = STARDIS_DEFAULT_PICARD_ORDER;
+ args->diff_algo = SDIS_DIFFUSION_DELTA_SPHERE;
d2(args->pos_and_time+3,
STARDIS_DEFAULT_COMPUTE_TIME, STARDIS_DEFAULT_COMPUTE_TIME);
args->verbose = STARDIS_DEFAULT_VERBOSE_LEVEL;
@@ -428,11 +457,11 @@ void
usage(FILE* stream)
{
#define PRINT(Msg) fprintf(stream, Msg)
- PRINT("stardis [-eghiv] [-D path_type,files_name_prefix] [-d file_base_name]\n");
- PRINT(" [-F surface[,time[,time]]] [-G green_bin[,green_ascii]]\n");
- PRINT(" [-L interface_probes] [-m medium_name[,time[,time]]]\n");
- PRINT(" [-n samples_count] [-o picard_order]\n");
- PRINT(" [-P x,y,z[,time[,time]][:side_indicator]]\n");
+ PRINT("stardis [-eghiv] [-a diff_algo] [-D path_type,files_name_prefix]\n");
+ PRINT(" [-d file_base_name] [-F surface[,time[,time]]]\n");
+ PRINT(" [-G green_bin[,green_ascii]] [-L interface_probes]\n");
+ PRINT(" [-m medium_name[,time[,time]]] [-n samples_count]\n");
+ PRINT(" [-o picard_order] [-P x,y,z[,time[,time]][:side_indicator]]\n");
PRINT(" [-p x,y,z[,time[,time]]] [-R rendering_opt[:rendering_opt ...]]\n");
PRINT(" [-S surface[,time[,time]]] [-s surface[,time[,time]]]\n");
PRINT(" [-t threads_count] [-V verbosity_level] [-X output_rng]\n");
@@ -495,7 +524,7 @@ parse_args
{
int opt = 0, n_used = 0, o_used = 0;
size_t len = 0;
- const char option_list[] = "c:d:D:eF:gG:hiL:m:M:n:o:p:P:R:s:S:t:vV:x:X:";
+ const char option_list[] = "a:c:d:D:eF:gG:hiL:m:M:n:o:p:P:R:s:S:t:vV:x:X:";
char buf[128];
struct str keep;
char** line = NULL;
@@ -522,6 +551,11 @@ parse_args
goto error;
}
+ case 'a':
+ res = parse_diff_algo(optarg, args->logger, &args->diff_algo);
+ if(res != RES_OK) goto error;
+ break;
+
case 'c':
if(args->mode & USE_STDOUT_MODES) {
res = RES_BAD_ARG;
diff --git a/src/stardis-args.h.in b/src/stardis-args.h.in
@@ -141,6 +141,7 @@ struct args {
unsigned picard_order;
int mode;
enum dump_path_type dump_paths;
+ enum sdis_diffusion_algorithm diff_algo;
int verbose;
int disable_intrad; /* Disable internal radiative exchanges */
diff --git a/src/stardis-compute-probe-boundary.c b/src/stardis-compute-probe-boundary.c
@@ -863,6 +863,7 @@ setup_solve_probe_boundary_args
args->picard_order = stardis->picard_order;
args->side = probe_side;
args->register_paths = stardis->dump_paths;
+ args->diff_algo = stardis->diff_algo;
/* The solver does not accept that the side of the interface on which the
* probe is placed is invalid. Below, the side is arbitrarily defined because
diff --git a/src/stardis-compute.c b/src/stardis-compute.c
@@ -400,6 +400,7 @@ compute_probe(struct stardis* stardis, struct time* start)
args.nrealisations = stardis->samples;
d3_set(args.position, stardis->probe);
d2_set(args.time_range, stardis->time_range);
+ args.diff_algo = stardis->diff_algo;
/* Input random state? */
READ_RANDOM_STATE(&stardis->rndgen_state_in_filename);
@@ -613,6 +614,7 @@ compute_camera(struct stardis* stardis, struct time* start)
args.spp = (size_t)stardis->camera.spp;
args.register_paths = stardis->dump_paths;
args.picard_order = stardis->picard_order;
+ args.diff_algo = stardis->diff_algo;
/* Launch the simulation */
if(stardis->mpi_initialized && stardis->mpi_rank != 0) {
@@ -696,6 +698,7 @@ compute_medium(struct stardis* stardis, struct time* start)
args.nrealisations = stardis->samples;
args.medium = medium;
d2_set(args.time_range, stardis->time_range);
+ args.diff_algo = stardis->diff_algo;
/* Input random state? */
READ_RANDOM_STATE(&stardis->rndgen_state_in_filename);
@@ -857,6 +860,7 @@ compute_boundary(struct stardis* stardis, struct time* start)
args.nprimitives
= darray_size_t_size_get(&stardis->compute_surface.primitives);
d2_set(args.time_range, stardis->time_range);
+ args.diff_algo = stardis->diff_algo;
/* Input random state? */
READ_RANDOM_STATE(&stardis->rndgen_state_in_filename);
@@ -967,6 +971,7 @@ compute_flux_boundary(struct stardis* stardis, struct time* start)
= darray_size_t_size_get(&stardis->compute_surface.primitives);
args.picard_order = stardis->picard_order;
d2_set(args.time_range, stardis->time_range);
+ args.diff_algo = stardis->diff_algo;
/* Input random state? */
READ_RANDOM_STATE(&stardis->rndgen_state_in_filename);
@@ -1037,6 +1042,7 @@ compute_map(struct stardis* stardis, struct time* start)
d2_set(args.time_range, stardis->time_range);
args.register_paths = stardis->dump_paths;
args.picard_order = stardis->picard_order;
+ args.diff_algo = stardis->diff_algo;
ERR(sdis_solve_boundary(stardis->sdis_scn, &args,
darray_estimators_data_get(&estimators) + p));