// C ABI for the magnetostatic solver (fkn): opaque doc, pipeline, mesh accessors, progress callback. #pragma once #include #ifdef __cplusplus extern "C" { #endif typedef struct FemmMagDoc FemmMagDoc; // pct in 0..100, or -1 for label-only updates. label may be NULL. typedef void (*FemmMagProgressFn)(int pct, const char* label, void* user); // lifetime FemmMagDoc* femm_mag_doc_new(void); void femm_mag_doc_free(FemmMagDoc* doc); // progress reporting routed to the host (Rust/Iced). void femm_mag_doc_set_progress(FemmMagDoc* doc, FemmMagProgressFn fn, void* user); // pipeline. each returns 1 on success, 0 on failure. int femm_mag_doc_load_fem (FemmMagDoc* doc, const char* path); int femm_mag_doc_load_mesh (FemmMagDoc* doc); int femm_mag_doc_renumber (FemmMagDoc* doc); int femm_mag_doc_solve (FemmMagDoc* doc); int femm_mag_doc_write_results (FemmMagDoc* doc, const char* out_path); // problem attributes after load_fem. double femm_mag_doc_frequency (const FemmMagDoc* doc); int femm_mag_doc_axisymmetric (const FemmMagDoc* doc); double femm_mag_doc_depth (const FemmMagDoc* doc); double femm_mag_doc_precision (const FemmMagDoc* doc); // mesh, valid after load_mesh + renumber. int femm_mag_doc_num_nodes (const FemmMagDoc* doc); void femm_mag_doc_node (const FemmMagDoc* doc, int i, double* x, double* y); int femm_mag_doc_num_elements (const FemmMagDoc* doc); void femm_mag_doc_element (const FemmMagDoc* doc, int i, int* p0, int* p1, int* p2); // property table sizes. names live in the .fem parser / material library, not the solver runtime; // per-block properties (mu_x, BdryFormat, etc.) get their own accessors when the GUI needs them. int femm_mag_doc_num_materials (const FemmMagDoc* doc); int femm_mag_doc_num_boundaries (const FemmMagDoc* doc); int femm_mag_doc_num_circuits (const FemmMagDoc* doc); // field-point sampling after solve. component selects which scalar to fetch. typedef enum { FEMM_MAG_FIELD_A_RE = 0, FEMM_MAG_FIELD_A_IM = 1, FEMM_MAG_FIELD_BX_RE = 2, FEMM_MAG_FIELD_BX_IM = 3, FEMM_MAG_FIELD_BY_RE = 4, FEMM_MAG_FIELD_BY_IM = 5, FEMM_MAG_FIELD_B_MAG_RE = 6, FEMM_MAG_FIELD_B_MAG_IM = 7, } FemmMagField; double femm_mag_doc_field_at (const FemmMagDoc* doc, double x, double y, FemmMagField component); #ifdef __cplusplus } #endif