// C ABI for the current-flow solver (csolv): opaque doc, pipeline, mesh accessors, progress callback. #pragma once #include #ifdef __cplusplus extern "C" { #endif typedef struct FemmCurrDoc FemmCurrDoc; // pct in 0..100, or -1 for label-only updates. label may be NULL. typedef void (*FemmCurrProgressFn)(int pct, const char* label, void* user); // lifetime FemmCurrDoc* femm_curr_doc_new(void); void femm_curr_doc_free(FemmCurrDoc* doc); // progress reporting routed to the host (Rust/Iced). void femm_curr_doc_set_progress(FemmCurrDoc* doc, FemmCurrProgressFn fn, void* user); // pipeline. each returns 1 on success, 0 on failure. int femm_curr_doc_load_fec (FemmCurrDoc* doc, const char* path); int femm_curr_doc_load_mesh (FemmCurrDoc* doc); int femm_curr_doc_renumber (FemmCurrDoc* doc); int femm_curr_doc_solve (FemmCurrDoc* doc); int femm_curr_doc_write_results(FemmCurrDoc* doc, const char* out_path); // problem attributes after load_fec. double femm_curr_doc_frequency (const FemmCurrDoc* doc); int femm_curr_doc_axisymmetric (const FemmCurrDoc* doc); double femm_curr_doc_depth (const FemmCurrDoc* doc); double femm_curr_doc_precision (const FemmCurrDoc* doc); // mesh, valid after load_mesh + renumber. int femm_curr_doc_num_nodes (const FemmCurrDoc* doc); void femm_curr_doc_node (const FemmCurrDoc* doc, int i, double* x, double* y); int femm_curr_doc_num_elements (const FemmCurrDoc* doc); void femm_curr_doc_element (const FemmCurrDoc* doc, int i, int* p0, int* p1, int* p2); // property table sizes. int femm_curr_doc_num_materials (const FemmCurrDoc* doc); int femm_curr_doc_num_boundaries (const FemmCurrDoc* doc); int femm_curr_doc_num_conductors (const FemmCurrDoc* doc); // field-point sampling after solve. component selects which scalar to fetch. typedef enum { FEMM_CURR_FIELD_V_RE = 0, FEMM_CURR_FIELD_V_IM = 1, FEMM_CURR_FIELD_EX_RE = 2, FEMM_CURR_FIELD_EX_IM = 3, FEMM_CURR_FIELD_EY_RE = 4, FEMM_CURR_FIELD_EY_IM = 5, FEMM_CURR_FIELD_E_MAG_RE = 6, FEMM_CURR_FIELD_E_MAG_IM = 7, FEMM_CURR_FIELD_JX_RE = 8, FEMM_CURR_FIELD_JX_IM = 9, FEMM_CURR_FIELD_JY_RE = 10, FEMM_CURR_FIELD_JY_IM = 11, FEMM_CURR_FIELD_J_MAG_RE = 12, FEMM_CURR_FIELD_J_MAG_IM = 13, } FemmCurrField; double femm_curr_doc_field_at(const FemmCurrDoc* doc, double x, double y, FemmCurrField component); #ifdef __cplusplus } #endif