4 const lmmc_real_t values[] = {t, dim > 0 ? y[0] : 0.0};
12 if (out_result == NULL) {
31 if (!lmmc_is_finite(&cfg->
abs_tol) || !lmmc_is_finite(&cfg->
rel_tol)) {
return 0; }
40 if (!lmmc_is_finite(&cfg->
max_step)) {
62 if (!lmmc_is_finite(&t_start) || !lmmc_is_finite(&t_end) || !(t_end > t_start)) {
return ode_invalid_config(out_result,
LMMC_ODE_FAILURE_INVALID_STEP); }
85 size_t* io_eval_count,
86 int* out_callback_failed
90 if (rhs == NULL || y == NULL || y_prime == NULL || io_eval_count == NULL || out_callback_failed == NULL) {
94 *out_callback_failed = 0;
96 st = rhs(t, y, y_prime, dim, user_data);
98 *out_callback_failed = 1;
105 if (y == NULL || dim == 0) {
121 size_t* out_work_bytes
125 if (rhs == NULL || y == NULL || out_result == NULL || out_cfg == NULL || out_work_bytes == NULL) {
137 if (!lmmc_safe_mul_size(dim,
sizeof(
lmmc_real_t), out_work_bytes)) {
156 if (error == NULL || y_old == NULL || y_new == NULL || out_norm == NULL || dim == 0) {
159 for (i = 0; i < dim; ++i) {
160 lmmc_real_t scale = abs_tol + rel_tol * fmax(fabs(y_old[i]), fabs(y_new[i]));
162 if (!isfinite(scale) || scale <= 0.0 || !isfinite(error[i])) {
165 ratio = error[i] / scale;
166 sum += ratio * ratio;
167 if (!isfinite(sum)) {
181 if (error_norm > 0.0 && isfinite(error_norm)) {
184 factor = lmmc_clamp(factor, 0.2, 5.0);
193 return lmmc_real_range_is_finite(values, count)
double lmmc_real_t
Public and internal LMMC real type.
void lmmc_diagnostic_emit(const lmmc_diagnostic_sink_t *sink, const lmmc_diagnostic_t *diagnostic)
通过调用方持有的接收器发送一个诊断事件;空接收器直接完成.
lmmc_status_t lmmc_ode_default_config(lmmc_real_t t_start, lmmc_real_t t_end, size_t problem_dim, lmmc_ode_config_t *out_cfg)
根据积分区间与维度生成合理的默认求解配置。
lmmc_status_t(*) lmmc_ode_rhs_t(lmmc_real_t t, const lmmc_real_t *y, lmmc_real_t *y_prime, size_t dim, void *user_data)
ODE 右端函数签名 。
lmmc_diagnostic_sink_t diagnostics
lmmc_ode_failure_t
ODE 求解失败原因。
@ LMMC_ODE_FAILURE_NUMERICAL_ISSUE
@ LMMC_ODE_FAILURE_INVALID_STEP
@ LMMC_ODE_FAILURE_TOLERANCE_INCONSISTENT
@ LMMC_ODE_FAILURE_INVALID_DIMENSION
lmmc_ode_failure_t failure_reason
lmmc_real_t adaptive_step_beta
lmmc_status_t lmmc_ode_rhs_eval(lmmc_ode_rhs_t rhs, lmmc_real_t t, const lmmc_real_t *y, lmmc_real_t *y_prime, size_t dim, void *user_data, size_t *io_eval_count, int *out_callback_failed)
lmmc_real_t lmmc_ode_next_step(lmmc_real_t h, lmmc_real_t error_norm, const lmmc_ode_config_t *cfg)
lmmc_status_t lmmc_ode_values_are_finite(const lmmc_real_t *values, size_t count)
lmmc_status_t validate_and_init_ode_config(lmmc_ode_rhs_t rhs, size_t dim, lmmc_real_t t_start, lmmc_real_t t_end, const lmmc_real_t *y, const lmmc_ode_config_t *cfg, lmmc_ode_config_t *out_cfg, lmmc_ode_result_t *out_result, size_t *out_work_bytes)
void lmmc_ode_reset_result(lmmc_ode_result_t *out_result, lmmc_real_t t_start)
int lmmc_ode_state_is_finite(const lmmc_real_t *y, size_t dim)
lmmc_status_t lmmc_ode_load_and_validate_config(size_t dim, lmmc_real_t t_start, lmmc_real_t t_end, const lmmc_ode_config_t *cfg, lmmc_ode_config_t *out_cfg, lmmc_ode_result_t *out_result)
void lmmc_ode_do_log(const lmmc_ode_config_t *cfg, size_t step, lmmc_real_t t, const lmmc_real_t *y, size_t dim)
lmmc_status_t lmmc_ode_weighted_rms(const lmmc_real_t *error, const lmmc_real_t *y_old, const lmmc_real_t *y_new, size_t dim, lmmc_real_t abs_tol, lmmc_real_t rel_tol, lmmc_real_t *out_norm)
lmmc_status_t
LMMC 库统一返回的状态码.
@ LMMC_STATUS_NUMERICAL_FAILURE
@ LMMC_STATUS_INVALID_ARGUMENT