/** * set the parameters of the FCS solver based on a parameter string */ FCSResult fcs_set_parameters(FCS handle, const char *parameters, fcs_bool continue_on_errors) { const char *fnc_name = "fcs_set_parameters"; CHECK_HANDLE_RETURN_RESULT(handle, fnc_name); FCSResult result = FCS_RESULT_SUCCESS; char *cur; char *params, *param; fcs_int params_strlen, matched; params_strlen = strlen(parameters) + 1; params = malloc(params_strlen * sizeof(char)); strncpy(params, parameters, params_strlen); cur = params; while (cur) { param = cur; cur = strchr(cur, ','); if (cur) { *cur = 0; ++cur; } /* printf("param: %s\n", param); printf("cur: %s\n", cur);*/ FCS_PARSE_IF_PARAM_THEN_FUNC1_GOTO_NEXT("box_a", set_box_a, FCS_PARSE_SEQ(fcs_float, 3)); FCS_PARSE_IF_PARAM_THEN_FUNC1_GOTO_NEXT("box_b", set_box_b, FCS_PARSE_SEQ(fcs_float, 3)); FCS_PARSE_IF_PARAM_THEN_FUNC1_GOTO_NEXT("box_c", set_box_c, FCS_PARSE_SEQ(fcs_float, 3)); FCS_PARSE_IF_PARAM_THEN_FUNC1_GOTO_NEXT("offset", set_box_origin, FCS_PARSE_SEQ(fcs_float, 3)); FCS_PARSE_IF_PARAM_THEN_FUNC1_GOTO_NEXT("periodicity", set_periodicity, FCS_PARSE_SEQ(fcs_int, 3)); FCS_PARSE_IF_PARAM_THEN_FUNC1_GOTO_NEXT("near_field_flag", set_near_field_flag, FCS_PARSE_VAL(fcs_int)); FCS_PARSE_IF_PARAM_THEN_FUNC1_GOTO_NEXT("total_particles", set_total_particles, FCS_PARSE_VAL(fcs_int)); FCS_PARSE_IF_PARAM_THEN_FUNC1_GOTO_NEXT("r_cut", set_r_cut, FCS_PARSE_VAL(fcs_float)); FCS_PARSE_IF_PARAM_THEN_FUNC1_GOTO_NEXT("require_virial", set_compute_virial, FCS_PARSE_VAL(fcs_int)); FCS_PARSE_IF_PARAM_THEN_FUNC2_GOTO_NEXT("", set_tolerance, FCS_PARSE_VAL(fcs_int), FCS_PARSE_VAL(fcs_float)); FCS_PARSE_IF_PARAM_THEN_FUNC2_GOTO_NEXT("tolerance_energy", set_tolerance, FCS_PARSE_CONST(fcs_int, FCS_TOLERANCE_TYPE_ENERGY), FCS_PARSE_VAL(fcs_float)); FCS_PARSE_IF_PARAM_THEN_FUNC2_GOTO_NEXT("tolerance_energy_rel", set_tolerance, FCS_PARSE_CONST(fcs_int, FCS_TOLERANCE_TYPE_ENERGY_REL), FCS_PARSE_VAL(fcs_float)); FCS_PARSE_IF_PARAM_THEN_FUNC2_GOTO_NEXT("tolerance_potential", set_tolerance, FCS_PARSE_CONST(fcs_int, FCS_TOLERANCE_TYPE_POTENTIAL), FCS_PARSE_VAL(fcs_float)); FCS_PARSE_IF_PARAM_THEN_FUNC2_GOTO_NEXT("tolerance_potential_rel", set_tolerance, FCS_PARSE_CONST(fcs_int, FCS_TOLERANCE_TYPE_POTENTIAL_REL), FCS_PARSE_VAL(fcs_float)); FCS_PARSE_IF_PARAM_THEN_FUNC2_GOTO_NEXT("tolerance_field", set_tolerance, FCS_PARSE_CONST(fcs_int, FCS_TOLERANCE_TYPE_FIELD), FCS_PARSE_VAL(fcs_float)); FCS_PARSE_IF_PARAM_THEN_FUNC2_GOTO_NEXT("tolerance_field_rel", set_tolerance, FCS_PARSE_CONST(fcs_int, FCS_TOLERANCE_TYPE_FIELD_REL), FCS_PARSE_VAL(fcs_float)); if (handle->set_parameter) { result = handle->set_parameter(handle, continue_on_errors, ¶m, &cur, &matched); if (matched) goto next_param; } result = fcs_common_set_parameter(handle, continue_on_errors, ¶m, &cur, &matched); if (matched) goto next_param; if (result == FCS_RESULT_SUCCESS) result = fcs_result_create(FCS_ERROR_WRONG_ARGUMENT, fnc_name, "interface (parser): error in parameter string at '%s'!", param); if (FCS_IS_FALSE(continue_on_errors)) break; next_param: ; } free(params); return result; }
FCSResult fcs_fmm_set_parameter(FCS handle, fcs_bool continue_on_errors, char **current, char **next, fcs_int *matched) { char *param = *current; char *cur = *next; *matched = 0; FCS_PARSE_IF_PARAM_THEN_FUNC1_GOTO_NEXT("fmm_absrel", fmm_set_absrel, FCS_PARSE_VAL(fcs_int)); FCS_PARSE_IF_PARAM_THEN_FUNC1_GOTO_NEXT("fmm_tolerance_energy", fmm_set_tolerance_energy, FCS_PARSE_VAL(fcs_float)); FCS_PARSE_IF_PARAM_THEN_FUNC1_GOTO_NEXT("fmm_dipole_correction", fmm_set_dipole_correction, FCS_PARSE_VAL(fcs_int)); FCS_PARSE_IF_PARAM_THEN_FUNC1_GOTO_NEXT("fmm_potential", fmm_set_potential, FCS_PARSE_VAL(fcs_int)); FCS_PARSE_IF_PARAM_THEN_FUNC1_GOTO_NEXT("fmm_cusp_radius", fmm_set_cusp_radius, FCS_PARSE_VAL(fcs_float)); FCS_PARSE_IF_PARAM_THEN_FUNC1_GOTO_NEXT("fmm_internal_tuning", fmm_set_internal_tuning, FCS_PARSE_VAL(fcs_int)); FCS_PARSE_IF_PARAM_THEN_FUNC1_GOTO_NEXT("fmm_maxdepth", fmm_set_maxdepth, FCS_PARSE_VAL(fcs_int)); FCS_PARSE_IF_PARAM_THEN_FUNC1_GOTO_NEXT("fmm_unroll_limit", fmm_set_unroll_limit, FCS_PARSE_VAL(fcs_int)); FCS_PARSE_IF_PARAM_THEN_FUNC1_GOTO_NEXT("fmm_balanceload", fmm_set_balanceload, FCS_PARSE_VAL(fcs_int)); return FCS_RESULT_SUCCESS; next_param: *current = param; *next = cur; *matched = 1; return FCS_RESULT_SUCCESS; }
FCSResult fcs_mmm2d_set_parameter(FCS handle, fcs_bool continue_on_errors, char **current, char **next, fcs_int *matched) { char *param = *current; char *cur = *next; *matched = 0; FCS_PARSE_IF_PARAM_THEN_FUNC1_GOTO_NEXT("mmm2d_maxPWerror", mmm2d_set_maxPWerror, FCS_PARSE_VAL(fcs_float)); FCS_PARSE_IF_PARAM_THEN_FUNC1_GOTO_NEXT("mmm2d_far_cutoff", mmm2d_set_far_cutoff, FCS_PARSE_VAL(fcs_float)); FCS_PARSE_IF_PARAM_THEN_FUNC2_GOTO_NEXT("mmm2d_dielectric_contrasts", mmm2d_set_dielectric_contrasts, FCS_PARSE_VAL(fcs_float), FCS_PARSE_VAL(fcs_float)); FCS_PARSE_IF_PARAM_THEN_FUNC1_GOTO_NEXT("mmm2d_layers_per_node", mmm2d_set_layers_per_node, FCS_PARSE_VAL(fcs_int)); FCS_PARSE_IF_PARAM_THEN_FUNC1_GOTO_NEXT("mmm2d_skin", mmm2d_set_skin, FCS_PARSE_VAL(fcs_float)); FCS_PARSE_IF_PARAM_THEN_FUNC1_GOTO_NEXT("", mmm2d_require_total_energy, FCS_PARSE_VAL(fcs_int)); return FCS_RESULT_SUCCESS; next_param: *current = param; *next = cur; *matched = 1; return FCS_RESULT_SUCCESS; }
FCSResult fcs_pepc_set_parameter(FCS handle, fcs_bool continue_on_errors, char **current, char **next, fcs_int *matched) { char *param = *current; char *cur = *next; *matched = 0; FCS_PARSE_IF_PARAM_THEN_FUNC1_GOTO_NEXT("pepc_epsilon", pepc_set_epsilon, FCS_PARSE_VAL(fcs_float)); FCS_PARSE_IF_PARAM_THEN_FUNC1_GOTO_NEXT("pepc_theta", pepc_set_theta, FCS_PARSE_VAL(fcs_float)); FCS_PARSE_IF_PARAM_THEN_FUNC1_GOTO_NEXT("pepc_num_walk_threads", pepc_set_num_walk_threads, FCS_PARSE_VAL(fcs_int)); FCS_PARSE_IF_PARAM_THEN_FUNC1_GOTO_NEXT("pepc_dipole_correction", pepc_set_dipole_correction, FCS_PARSE_VAL(fcs_int)); FCS_PARSE_IF_PARAM_THEN_FUNC1_GOTO_NEXT("pepc_load_balancing", pepc_set_load_balancing, FCS_PARSE_VAL(fcs_int)); FCS_PARSE_IF_PARAM_THEN_FUNC1_GOTO_NEXT("pepc_npm", pepc_set_npm, FCS_PARSE_VAL(fcs_float)); FCS_PARSE_IF_PARAM_THEN_FUNC1_GOTO_NEXT("pepc_debug_level", pepc_set_debug_level, FCS_PARSE_VAL(fcs_int)); return FCS_RESULT_SUCCESS; next_param: *current = param; *next = cur; *matched = 1; return FCS_RESULT_SUCCESS; }