#ifndef NATIVE_RUNTIME_H #define NATIVE_RUNTIME_H #include "model.h" #include #include #include #ifndef NFRICTIONS #define NFRICTIONS 0 #endif #ifndef NCONTACTS #define NCONTACTS 0 #endif #define NATIVE_JACOBIAN_STATS_COUNT 3 typedef struct { double start, stop, sample_step, max_step, rtol, timeout; int bdf, record_samples; const char *cancel_path; } NativeOptions; typedef struct { int seen; double first_time, first_temperature, extreme_time, extreme_temperature; } NativePropertyWarning; typedef struct { NativeOptions options; double *times, *states; size_t count, capacity, sample_index; /* Result history is a bounded buffer, independent of integrator memory. */ size_t buffered, committed, output_count; FILE *sample_file, *output_file; const char *sample_path, *output_blocks_path; int storage_control, storage_failed; double final_time, final_state[NSTATES]; double wall_start, cpu_start, solve_seconds, solve_cpu_seconds, last_progress; double max_accepted_step; unsigned long nfev, accepted, rejected, events, starts, njev, nlu; /* Structure coloring is automatic; verification is diagnostic only. */ int jacobian_verify, jacobian_colored; unsigned long jacobian_rhs, jacobian_colored_evals, jacobian_fallbacks; unsigned long jacobian_checks, jacobian_mismatches, cvode_rhs, linear_rhs; unsigned long jacobian_gas_evaluations, jacobian_gas_reuses; /* PH, density, pipe. Keep runtime-only harnesses independent of kernels.h. */ unsigned long jacobian_scalar_evaluations[NATIVE_JACOBIAN_STATS_COUNT], jacobian_scalar_reuses[NATIVE_JACOBIAN_STATS_COUNT]; unsigned long same_time_returns, same_time_streak, max_same_time_streak; int stagnating, cvode_flag; double cvode_return_time, cvode_internal_time, cvode_last_step, cvode_next_step; const char *failure_reason, *failure_operation; char message_buffer[384]; int status; /* 0 completed, 1 cancelled, 2 failed */ const char *message; /* Accepted-event latch only; never used by RHS or output force replay. */ #if NCONTACTS double contact_last[2*NCONTACTS]; int contact_direction[2*NCONTACTS], contact_pending[2*NCONTACTS]; #endif unsigned long contact_checks, contact_dense, contact_roots; unsigned long contact_transitions, contact_clipping; NativePropertyWarning property_warnings[6]; } NativeRun; typedef int (*NativeDense)(void *context, double t, double *state); double native_wall_time(void); double native_cpu_time(void); int native_poll(NativeRun *run, double time); void native_property_warnings_json(NativeRun *run, FILE *file); int native_fail(NativeRun *run, const char *reason, const char *operation, const char *message); int native_rhs(NativeRun *run, double t, const double *y, double *dy); int native_jacobian_rhs(NativeRun *run, double t, const double *y, double *dy); int native_append(NativeRun *run, double t, const double *y); int native_time_boundary_samples(NativeRun *run, double boundary, const double *state); int native_accept(NativeRun *run, double t, double next, const double *old, const double *trial, NativeDense dense, void *context, double *accepted_time, double *accepted_state); int native_rk45(NativeRun *run); int native_bdf(NativeRun *run); int native_solve(NativeRun *run); void native_run_free(NativeRun *run); int native_samples_append(NativeRun *run, double t, const double *state); int native_samples_flush(NativeRun *run); int native_samples_outputs(NativeRun *run); int native_samples_json(NativeRun *run, FILE *file, size_t column); int64_t native_file_tell(FILE *file); #endif