commit 62d10a9cfeb40c2ea6484b0ec19807a807355f33
parent 1ad54ad0656369b371f26136e4f40423149597d5
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date: Tue, 30 Nov 2021 15:33:56 +0100
Add an option to set Picard order
Diffstat:
8 files changed, 77 insertions(+), 15 deletions(-)
diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt
@@ -38,6 +38,7 @@ set_property(CACHE STARDIS_DOC PROPERTY STRINGS
set(STARDIS_ARGS_DEFAULT_TRAD "300")
set(STARDIS_ARGS_DEFAULT_TRAD_REFERENCE "300")
set(STARDIS_ARGS_DEFAULT_COMPUTE_TIME "INF")
+set(STARDIS_ARGS_DEFAULT_PICARD_ORDER "1")
set(STARDIS_ARGS_DEFAULT_RENDERING_FOV "70") # degrees
set(STARDIS_ARGS_DEFAULT_RENDERING_IMG_HEIGHT "480")
set(STARDIS_ARGS_DEFAULT_RENDERING_IMG_WIDTH "640")
diff --git a/src/stardis-app.c b/src/stardis-app.c
@@ -83,7 +83,9 @@ read_model
stardis->t_range[0] = MMIN(stardis->t_range[0], stardis->trad_ref);
stardis->t_range[1] = MMAX(stardis->t_range[1], stardis->trad_ref);
logger_print(stardis->logger, LOG_OUTPUT,
- "System Tref range is [%g %g]\n", SPLIT2(stardis->t_range));
+ "System T range is [%g %g]\n", SPLIT2(stardis->t_range));
+ logger_print(stardis->logger, LOG_OUTPUT,
+ "Picard order is %u\n", stardis->picard_order);
ASSERT(!f && !txtrdr);
exit:
@@ -239,6 +241,7 @@ stardis_init
stardis->compute_surface.area = 0;
stardis->samples = args->samples;
stardis->nthreads = args->nthreads;
+ stardis->picard_order = args->picard_order;
stardis->scale_factor = -1; /* invalid value */
stardis->trad = STARDIS_DEFAULT_TRAD;
stardis->trad_ref = STARDIS_DEFAULT_TRAD_REFERENCE;
diff --git a/src/stardis-app.h b/src/stardis-app.h
@@ -793,16 +793,17 @@ struct stardis {
struct str rndgen_state_in_filename;
struct str rndgen_state_out_filename;
struct str chunks_prefix;
- int mode;
- int trad_def;
+ struct mem_allocator* allocator;
+ struct logger* logger;
+ struct sdis_device* dev;
size_t samples;
- unsigned nthreads;
double scale_factor;
double trad, trad_ref;
double t_range[2];
- struct mem_allocator* allocator;
- struct logger* logger;
- struct sdis_device* dev;
+ int mode;
+ int trad_def;
+ unsigned nthreads;
+ unsigned picard_order;
unsigned next_medium_id;
unsigned undefined_medium_behind_boundary_id;
int dump_paths;
diff --git a/src/stardis-args.c b/src/stardis-args.c
@@ -181,9 +181,10 @@ init_args
args->logger = logger;
args->allocator = allocator;
darray_str_init(allocator, &args->model_files);
- /* Set default values */
+ /* Set non-zero default values */
args->samples = STARDIS_DEFAULT_SAMPLES_COUNT;
args->nthreads = SDIS_NTHREADS_DEFAULT;
+ args->picard_order = STARDIS_DEFAULT_PICARD_ORDER;
d2(args->pos_and_time+3,
STARDIS_DEFAULT_COMPUTE_TIME, STARDIS_DEFAULT_COMPUTE_TIME);
args->verbose = STARDIS_DEFAULT_VERBOSE_LEVEL;
@@ -228,13 +229,13 @@ short_help
print_version(stream);
fprintf(stream, "\nMandatory options\n");
- fprintf(stream, "-------------------\n");
+ fprintf(stream, "-----------------\n");
fprintf(stream, "\n -M <FILE>\n");
fprintf(stream, " Read a text file that contains (partial) description of the model.\n");
fprintf(stream, "\nExclusive options\n");
- fprintf(stream, "-------------------\n");
+ fprintf(stream, "-----------------\n");
fprintf(stream, "\n -F STL_FILE[,TIME-RANGE]\n");
fprintf(stream, " Compute the mean flux on a given 2D region at a given time.\n");
@@ -258,7 +259,7 @@ short_help
fprintf(stream, " Compute the by-triangle mean temperature on a given 2D region.\n");
fprintf(stream, "\nOther options\n");
- fprintf(stream, "-------------------\n");
+ fprintf(stream, "-------------\n");
fprintf(stream, "\n -c NAMES_PREFIX\n");
fprintf(stream, " Dump the geometry and property ids to stdout as C chunks.\n");
@@ -284,6 +285,9 @@ short_help
fprintf(stream, "\n -n SAMPLE_COUNT\n");
fprintf(stream, " Set the number of Monte-Carlo samples.\n");
+ fprintf(stream, "\n -o\n");
+ fprintf(stream, " Set the order for the Picard linearization of radiative transfer.\n");
+
fprintf(stream, "\n -t NUM_OF_THREADS\n");
fprintf(stream, " Hint on the number of threads.\n");
@@ -359,9 +363,9 @@ parse_args
struct args* args,
struct mem_allocator* allocator)
{
- int opt = 0, n_used = 0;
+ int opt = 0, n_used = 0, o_used = 0;
size_t len = 0;
- const char option_list[] = "c:dD:eF:gG:hm:M:n:p:P:R:s:S:t:vV:x:X:";
+ const char option_list[] = "c:dD:eF:gG:hm:M:n:o:p:P:R:s:S:t:vV:x:X:";
char buf[128];
struct str keep;
char** line = NULL;
@@ -536,6 +540,23 @@ parse_args
break;
}
+ case 'o': {
+ int order;
+ res = cstr_to_int(optarg, &order);
+ if(res != RES_OK
+ || order <= 0)
+ {
+ if(res == RES_OK) res = RES_BAD_ARG;
+ logger_print(args->logger, LOG_ERROR,
+ "Invalid argument for option -%c: %s\n",
+ opt, optarg);
+ goto error;
+ }
+ args->picard_order = (unsigned)order;
+ o_used = 1;
+ break;
+ }
+
case 'p':
if(args->mode & EXCLUSIVE_MODES) {
res = RES_BAD_ARG;
@@ -728,6 +749,17 @@ parse_args
goto error;
}
+ if(args->mode & (MODE_BIN_GREEN | MODE_GREEN)
+ && o_used && args->picard_order > 1)
+ {
+ logger_print(args->logger, LOG_ERROR,
+ "Option -%c cannot be used if Picard order is not 1 (here order is %u)\n",
+ mode_option(args->mode & (MODE_BIN_GREEN | MODE_GREEN)),
+ args->picard_order);
+ res = RES_BAD_ARG;
+ goto error;
+ }
+
if(args->mode & MODE_IR_COMPUTE && n_used) {
logger_print(args->logger, LOG_ERROR,
"The -n option has no effect in rendering mode;"
diff --git a/src/stardis-args.h b/src/stardis-args.h
@@ -96,11 +96,12 @@ struct args {
char* rndgen_state_in_filename;
char* rndgen_state_out_filename;
char* chunks_prefix;
+ char* camera;
size_t samples;
- unsigned nthreads;
double pos_and_time[5];
+ unsigned nthreads;
+ unsigned picard_order;
enum stardis_mode mode;
- char* camera;
enum dump_path_type dump_paths;
int verbose;
};
diff --git a/src/stardis-compute.c b/src/stardis-compute.c
@@ -469,6 +469,7 @@ compute_probe(struct stardis* stardis, struct time* start)
}
} else {
args.register_paths = stardis->dump_paths;
+ args.picard_order = stardis->picard_order;
time_current(&compute_start);
ERR(sdis_solve_probe(stardis->sdis_scn, &args, &estimator));
time_current(&compute_end);
@@ -703,6 +704,7 @@ compute_probe_on_interface(struct stardis* stardis, struct time* start)
}
} else {
args.register_paths = stardis->dump_paths;
+ args.picard_order = stardis->picard_order;
time_current(&compute_start);
ERR(sdis_solve_probe_boundary(stardis->sdis_scn, &args, &estimator));
time_current(&compute_end);
@@ -851,6 +853,7 @@ compute_camera(struct stardis* stardis, struct time* start)
args.image_resolution[1] = height;
args.spp = (size_t)stardis->camera.spp;
args.register_paths = stardis->dump_paths;
+ args.picard_order = stardis->picard_order;
/* Launch the simulation */
time_current(&compute_start);
@@ -963,6 +966,7 @@ compute_medium(struct stardis* stardis, struct time* start)
}
} else {
args.register_paths = stardis->dump_paths;
+ args.picard_order = stardis->picard_order;
time_current(&compute_start);
ERR(sdis_solve_medium(stardis->sdis_scn, &args, &estimator));
time_current(&compute_end);
@@ -1094,6 +1098,7 @@ compute_boundary(struct stardis* stardis, struct time* start)
}
} else {
args.register_paths = stardis->dump_paths;
+ args.picard_order = stardis->picard_order;
time_current(&compute_start);
ERR(sdis_solve_boundary(stardis->sdis_scn, &args, &estimator));
time_current(&compute_end);
@@ -1138,6 +1143,7 @@ compute_flux_boundary(struct stardis* stardis, struct time* start)
= darray_size_t_cdata_get(&stardis->compute_surface.primitives);
args.nprimitives
= darray_size_t_size_get(&stardis->compute_surface.primitives);
+ args.picard_order = stardis->picard_order;
d2_set(args.time_range, stardis->time_range);
/* Input random state? */
@@ -1199,6 +1205,7 @@ compute_map(struct stardis* stardis, struct time* start)
= darray_size_t_size_get(&stardis->compute_surface.primitives);
d2_set(args.time_range, stardis->time_range);
args.register_paths = stardis->dump_paths;
+ args.picard_order = stardis->picard_order;
ERR(sdis_solve_boundary(stardis->sdis_scn, &args,
darray_estimators_data_get(&estimators) + p));
diff --git a/src/stardis-default.h.in b/src/stardis-default.h.in
@@ -20,6 +20,7 @@
#define STARDIS_DEFAULT_TRAD @STARDIS_ARGS_DEFAULT_TRAD@
#define STARDIS_DEFAULT_TRAD_REFERENCE @STARDIS_ARGS_DEFAULT_TRAD_REFERENCE@
#define STARDIS_DEFAULT_COMPUTE_TIME @STARDIS_ARGS_DEFAULT_COMPUTE_TIME@
+#define STARDIS_DEFAULT_PICARD_ORDER @STARDIS_ARGS_DEFAULT_PICARD_ORDER@
#define STARDIS_DEFAULT_RENDERING_FOV @STARDIS_ARGS_DEFAULT_RENDERING_FOV@
#define STARDIS_DEFAULT_RENDERING_IMG_HEIGHT @STARDIS_ARGS_DEFAULT_RENDERING_IMG_HEIGHT@
#define STARDIS_DEFAULT_RENDERING_IMG_WIDTH @STARDIS_ARGS_DEFAULT_RENDERING_IMG_WIDTH@
diff --git a/src/stardis-parsing.c b/src/stardis-parsing.c
@@ -523,6 +523,14 @@ process_flx
logger_print(stardis->logger, LOG_ERROR, "Invalid flux: %s\n", tk);
goto end;
}
+ if(f_boundary->imposed_flux != 0 && stardis->picard_order > 1) {
+ logger_print(stardis->logger, LOG_ERROR,
+ "Cannot have a flux defined at a boundary (here %f) if Picard order "
+ "is not 1 (here order is %u)\n",
+ f_boundary->imposed_flux, stardis->picard_order);
+ res = RES_BAD_ARG;
+ goto end;
+ }
ASSERT(sz <= UINT_MAX);
ERR(read_sides_and_files(stardis, 1, (unsigned)sz, tok_ctx));
@@ -859,6 +867,14 @@ process_solid
logger_print(stardis->logger, LOG_ERROR, "Invalid volumic power: %s\n", tk);
goto end;
}
+ if(solid->vpower != 0 && stardis->picard_order > 1) {
+ logger_print(stardis->logger, LOG_ERROR,
+ "Cannot have volumic power (here %f) if Picard order is not 1 "
+ "(here order is %u)\n",
+ solid->vpower, stardis->picard_order);
+ res = RES_BAD_ARG;
+ goto end;
+ }
/* Actual solid creation is defered until geometry is read to allow
* enclosure shape VS delta analysis (and auto delta computation) */