Skip to content

Commit f361fcf

Browse files
committed
WIP: isotropic eikonal solver
1 parent a08cfbb commit f361fcf

File tree

5 files changed

+295
-123
lines changed

5 files changed

+295
-123
lines changed

src/config/config_common.h

+17-17
Original file line numberDiff line numberDiff line change
@@ -46,24 +46,24 @@ void init_config_functions(struct config *config, char *default_lib, char *confi
4646
do { \
4747
if((s) == NULL) { \
4848
log_info(tag " no configuration.\n"); \
49-
return; \
49+
} else { \
50+
log_info(tag " configuration:\n"); \
51+
log_info(tag " library = %s\n", (s)->library_file_path); \
52+
log_info(tag " main function = %s\n", (s)->main_function_name); \
53+
\
54+
if((s)->init_function_name) { \
55+
log_info(tag " init function = %s\n", (s)->init_function_name); \
56+
} \
57+
\
58+
if((s)->end_function_name) { \
59+
log_info(tag " end function = %s\n", (s)->end_function_name); \
60+
} \
61+
\
62+
for(int __i = 0; __i < arrlen((s)->extra_function_names); __i++) { \
63+
log_info(tag " extra function %d = %s\n", __i+1, (s)->extra_function_names[__i]); \
64+
} \
65+
STRING_HASH_PRINT_KEY_VALUE_LOG(tag, (s)->config_data); \
5066
} \
51-
log_info(tag " configuration:\n"); \
52-
log_info(tag " library = %s\n", (s)->library_file_path); \
53-
log_info(tag " main function = %s\n", (s)->main_function_name); \
54-
\
55-
if((s)->init_function_name) { \
56-
log_info(tag " init function = %s\n", (s)->init_function_name); \
57-
} \
58-
\
59-
if((s)->end_function_name) { \
60-
log_info(tag " end function = %s\n", (s)->end_function_name); \
61-
} \
62-
\
63-
for(int __i = 0; __i < arrlen((s)->extra_function_names); __i++) { \
64-
log_info(tag " extra function %d = %s\n", __i+1, (s)->extra_function_names[__i]); \
65-
} \
66-
STRING_HASH_PRINT_KEY_VALUE_LOG(tag, (s)->config_data); \
6767
} while(0)
6868

6969
#define CALL_EXTRA_FUNCTIONS(fn, ...) \

src/config/config_parser.c

+108-2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212
static const char *batch_opt_string = "c:h?";
1313
static const struct option long_batch_options[] = {{"config_file", required_argument, NULL, 'c'}};
1414

15+
#define eikonal_opt_string batch_opt_string
16+
#define long_eikonal_options long_batch_options
17+
1518
static const char *conversion_opt_string = "i:o:c:h?";
1619
static const struct option long_conversion_options[] = {{"input", required_argument, NULL, 'i'},
1720
{"output", required_argument, NULL, 'o'},
@@ -134,6 +137,15 @@ void display_batch_usage(char **argv) {
134137
exit(EXIT_FAILURE);
135138
}
136139

140+
void display_eikonal_usage(char **argv) {
141+
142+
printf("Usage: %s [options]\n\n", argv[0]);
143+
printf("Options:\n");
144+
printf("--config_file | -c [configuration_file_path]. Eikonal solver configuration file. Default NULL.\n");
145+
printf("--help | -h. Shows this help and exit \n");
146+
exit(EXIT_FAILURE);
147+
}
148+
137149
void display_conversion_usage(char **argv) {
138150

139151
printf("Usage: %s [options]\n\n", argv[0]);
@@ -168,7 +180,7 @@ void display_visualization_usage(char **argv) {
168180
exit(EXIT_FAILURE);
169181
}
170182

171-
void maybe_issue_overwrite_warning(const char *var, const char *section, const char *old_value, const char *new_value, const char *config_file) {
183+
static void maybe_issue_overwrite_warning(const char *var, const char *section, const char *old_value, const char *new_value, const char *config_file) {
172184
if(strcmp(old_value, new_value) != 0) {
173185
fprintf(stderr,
174186
"WARNING: option %s in %s was set in the file %s to %s and is being overwritten "
@@ -177,6 +189,26 @@ void maybe_issue_overwrite_warning(const char *var, const char *section, const c
177189
}
178190
}
179191

192+
struct eikonal_options *new_eikonal_options() {
193+
struct eikonal_options *user_args = (struct eikonal_options *)calloc(1, sizeof(struct eikonal_options));
194+
195+
user_args->stim_configs = NULL;
196+
sh_new_arena(user_args->stim_configs);
197+
shdefault(user_args->stim_configs, NULL);
198+
199+
user_args->domain_config = NULL;
200+
user_args->save_mesh_config = NULL;
201+
202+
return user_args;
203+
}
204+
205+
void free_eikonal_options(struct eikonal_options *options) {
206+
shfree(options->stim_configs);
207+
free_config_data(options->domain_config);
208+
free_config_data(options->save_mesh_config);
209+
free(options);
210+
}
211+
180212
struct batch_options *new_batch_options() {
181213
struct batch_options *user_args = (struct batch_options *)calloc(1, sizeof(struct batch_options));
182214
sh_new_arena(user_args->config_to_change);
@@ -1022,7 +1054,7 @@ void parse_batch_options(int argc, char **argv, struct batch_options *user_args)
10221054
while(opt != -1) {
10231055
switch(opt) {
10241056
case 'c':
1025-
user_args->batch_config_file = strdup(optarg);
1057+
user_args->config_file = strdup(optarg);
10261058
break;
10271059
case 'h': /* fall-through is intentional */
10281060
case '?':
@@ -1037,6 +1069,31 @@ void parse_batch_options(int argc, char **argv, struct batch_options *user_args)
10371069
}
10381070
}
10391071

1072+
void parse_eikonal_options(int argc, char **argv, struct eikonal_options *user_args) {
1073+
1074+
int opt = 0;
1075+
int option_index;
1076+
1077+
opt = getopt_long_only(argc, argv, eikonal_opt_string, long_eikonal_options, &option_index);
1078+
1079+
while(opt != -1) {
1080+
switch(opt) {
1081+
case 'c':
1082+
user_args->config_file = strdup(optarg);
1083+
break;
1084+
case 'h': /* fall-through is intentional */
1085+
case '?':
1086+
display_eikonal_usage(argv);
1087+
break;
1088+
default:
1089+
/* You won't actually get here. */
1090+
break;
1091+
}
1092+
1093+
opt = getopt_long(argc, argv, eikonal_opt_string, long_eikonal_options, &option_index);
1094+
}
1095+
}
1096+
10401097
void parse_conversion_options(int argc, char **argv, struct conversion_options *user_args) {
10411098

10421099
int opt = 0;
@@ -1799,6 +1856,53 @@ int parse_config_file(void *user, const char *section, const char *name, const c
17991856
return 1;
18001857
}
18011858

1859+
int parse_eikonal_config_file(void *options, const char *section, const char *name, const char *value) {
1860+
1861+
struct eikonal_options *pconfig = (struct eikonal_options *)options;
1862+
1863+
if(SECTION_STARTS_WITH(STIM_SECTION)) {
1864+
1865+
struct config *tmp = (struct config *)shget(pconfig->stim_configs, section);
1866+
1867+
if(tmp == NULL) {
1868+
tmp = alloc_and_init_config_data();
1869+
shput(pconfig->stim_configs, section, tmp);
1870+
}
1871+
1872+
if(MATCH_NAME("name")) {
1873+
fprintf(stderr,
1874+
"name is a reserved word and should not be used inside a stimulus config section. Found in %s. "
1875+
"Exiting!\n",
1876+
section);
1877+
exit(EXIT_FAILURE);
1878+
} else {
1879+
set_common_data(tmp, name, value);
1880+
}
1881+
1882+
} else if(MATCH_SECTION(DOMAIN_SECTION)) {
1883+
1884+
if(pconfig->domain_config == NULL) {
1885+
pconfig->domain_config = alloc_and_init_config_data();
1886+
}
1887+
1888+
set_common_data(pconfig->domain_config, name, value);
1889+
} else if(MATCH_SECTION(SAVE_RESULT_SECTION)) {
1890+
1891+
if(pconfig->save_mesh_config == NULL) {
1892+
pconfig->save_mesh_config = alloc_and_init_config_data();
1893+
}
1894+
1895+
set_common_data(pconfig->save_mesh_config, name, value);
1896+
1897+
} else {
1898+
1899+
fprintf(stderr, "\033[33;5;7mInvalid name %s in section %s on the config file!\033[0m\n", name, section);
1900+
return 0;
1901+
}
1902+
1903+
return 1;
1904+
}
1905+
18021906
int parse_preprocessor_config(void *user, const char *section, const char *name, const char *value) {
18031907

18041908
static int function_counter = 0;
@@ -1832,6 +1936,8 @@ int parse_preprocessor_config(void *user, const char *section, const char *name,
18321936
return 1;
18331937
}
18341938

1939+
1940+
18351941
#define WRITE_INI_SECTION(SECTION) fprintf(ini_file, "[%s]\n", SECTION)
18361942

18371943
#define WRITE_NAME_VALUE_WITHOUT_CHECK(NAME, VALUE, SPECIFIER) fprintf(ini_file, "%s = %" SPECIFIER "\n", NAME, VALUE)

src/config/config_parser.h

+14-4
Original file line numberDiff line numberDiff line change
@@ -163,14 +163,20 @@ struct user_options {
163163
};
164164

165165
struct batch_options {
166-
char *batch_config_file;
166+
char *config_file;
167167
char *output_folder;
168168
char *initial_config;
169169
int num_simulations;
170170
bool skip_existing_run;
171171
struct string_hash_entry *config_to_change;
172172
};
173-
173+
struct eikonal_options {
174+
char *config_file;
175+
char *output_folder;
176+
struct string_voidp_hash_entry *stim_configs;
177+
struct config *domain_config;
178+
struct config *save_mesh_config;
179+
};
174180
struct visualization_options {
175181
char *input;
176182
char *files_prefix;
@@ -198,26 +204,31 @@ struct fibers_conversion_options {
198204
char *output_file;
199205
};
200206

201-
void display_usage( char** argv );
207+
void display_usage(char **argv);
202208
void display_batch_usage(char **argv);
209+
void display_eikonal_usage(char **argv);
203210
void display_conversion_usage(char **argv);
204211
void display_fibers_conversion_usage(char **argv);
212+
void display_visualization_usage(char **argv);
205213

206214
struct user_options * new_user_options();
207215
struct batch_options * new_batch_options();
216+
struct eikonal_options * new_eikonal_options();
208217
struct visualization_options * new_visualization_options();
209218
struct conversion_options * new_conversion_options();
210219
struct fibers_conversion_options * new_fibers_conversion_options();
211220

212221
void parse_options(int argc, char**argv, struct user_options *user_args);
213222
void parse_batch_options(int argc, char**argv, struct batch_options *user_args);
223+
void parse_eikonal_options(int argc, char**argv, struct eikonal_options *user_args);
214224
void parse_visualization_options(int argc, char**argv, struct visualization_options *user_args);
215225
void parse_conversion_options(int argc, char **argv, struct conversion_options *user_args);
216226
void parse_fibers_conversion_options(int argc, char **argv, struct fibers_conversion_options *user_args);
217227
void get_config_file(int argc, char**argv, struct user_options *user_args);
218228

219229
int parse_config_file(void* user, const char* section, const char* name, const char* value);
220230
int parse_batch_config_file(void *user, const char *section, const char *name, const char *value);
231+
int parse_eikonal_config_file(void *user, const char *section, const char *name, const char *value);
221232
int parse_preprocessor_config(void* user, const char* section, const char* name, const char* value);
222233
int parse_converter_config_file(void *user, const char *section, const char *name, const char *value);
223234

@@ -231,7 +242,6 @@ void free_visualization_options(struct visualization_options * options);
231242
void free_conversion_options(struct conversion_options *options);
232243
void free_fibers_conversion_options(struct fibers_conversion_options *options);
233244

234-
void maybe_issue_overwrite_warning(const char *var, const char *section, const char *old_value, const char *new_value, const char *config_file);
235245
void set_or_overwrite_common_data(struct config* config, const char *key, const char *value, const char *section, const char *config_file);
236246

237247

src/main_batch.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ int main(int argc, char **argv) {
3535

3636
parse_batch_options(argc, argv, batch_options);
3737

38-
if (ini_parse(batch_options->batch_config_file, parse_batch_config_file, batch_options) < 0) {
39-
fprintf(stderr, "Error: Can't load the config file %s\n", batch_options->batch_config_file);
38+
if (ini_parse(batch_options->config_file, parse_batch_config_file, batch_options) < 0) {
39+
fprintf(stderr, "Error: Can't load the config file %s\n", batch_options->config_file);
4040
MPI_Abort(MPI_COMM_WORLD, EXIT_FAILURE);
4141
}
4242

0 commit comments

Comments
 (0)