Table of Contents
femm-qt — Changes since the previous test build
| Previous test build | This build | Commits |
|---|---|---|
110b141 (26 Sep 2026) | bd03d0b (6 Oct 2026) | 17 commits |
Commit hashes are given in parentheses for reference.
The headline is the material libraries. All four have been rebuilt so that every entry traces to a documented source, and the documents that say where each number came from now ship with FEMM. Some long-standing entries were renamed along the way, so a script that loads a material by name may need updating – the renames are listed below.
On macOS, FEMM now runs on macOS 13.3 (Ventura) and later. Every earlier macOS build quietly required macOS 26.
MATERIAL LIBRARIES
- Reworked for provenance. The magnetic, electrostatic, heat-flow and current-flow libraries have been rebuilt from standard reference works, manufacturers' datasheets and national-laboratory reports, and every entry is documented. Many entries are new: the libraries now hold 282 magnetic, 95 electrostatic, 136 heat-flow and 258 current-flow materials. Magnetization curves are fit to physics-based models to yield curves that are defined far into saturation. (
a5dedfc, fb2330d, 280ab27) - The sources ship with FEMM. Fifteen provenance papers, one per family of materials, are installed in
docs/materials, with aREADME.mdsaying which paper covers which library. The papers are licensed CC BY 4.0; the libraries themselves are MIT. (3e2e6ec, f67cdd5) - Your own edited library is offered the new one. If you have changed a library in the material dialog, FEMM keeps your copy and asks, the first time you open that library, whether to replace it with the new release. Saying No keeps your copy and is not asked again for this version. If your copy is an older library you never changed, the question says so: replacing it loses nothing. (
17e7ffd)
OPENING FILES
- Drop a file on the window to open it, on every platform:
.fem,.fee,.fehand.fecmodels and their solution files. Several at once work. A.pyscript is never run by being dropped. (3ed906b) - On macOS, double-clicking a FEMM file in Finder, or dropping one on the Dock icon, opens it. Before, FEMM started and the file was ignored. (
3ed906b)
macOS
- Runs on macOS 13.3 (Ventura) and later. Every previous build required macOS 26, without saying so, and simply failed to start on anything older. The minimum is now declared, so an older Mac reports it plainly. (
0985885) - Apple Silicon only, and smaller. Built against the official Qt rather than Homebrew's, and stripped of Intel code that could never run: the DMG is 32 MB, down from 39. (
0985885, bd03d0b) - The file-format references and the provenance papers are copied into
~/FEMM/docswith the other documents; before, the format references were only inside the application bundle. (f67cdd5)
DOCUMENTATION
- The four file-format references (the on-disk layout of
.fem,.fee,.fehand.fec) move into their owndocs/formatsfolder, beside the newdocs/materials. On Linux and FreeBSD both folders are copied to~/Documents/FEMM/docs. (f67cdd5) - The manual and the pyFEMM and OctaveFEMM references list the two CCA wire types. (
02e3f33)
femm-qt — Changes since the previous test build
| Previous test build | This build | Commits |
|---|---|---|
a861f48 (19 Sep 2026) | 110b141 (26 Sep 2026) | 7 commits |
If you use FEMM on a Mac, replace your build with this one. For Windows, Linux, and FreeBSD, there is no functional change.
macOS: TOOLBAR BUTTONS STUCK PRESSED
On macOS, right-button-double-click pop-up dialogs were be spawned in a way that would lock out the subsequent right-button-release events, breaking the UI. The bug is fixed in this build. This bug does not affect other platforms.
| Previous test build | This build | Commits |
|---|---|---|
2c24b4b (13 Sep 2026) | a861f48 (19 Sep 2026) | 12 commits |
Commit hashes are given in parentheses for reference.
This is a small build with one important fix in it. The 13 September build could, occasionally and without any warning, give a script a wrong number. That is fixed, and the fix is the reason to replace that build rather than wait for the next feature release.
The rest is repair work on the user interface, most of it found by testers. On macOS, one menu had been invisible since July, which quietly made the problem definition – frequency, depth, units, solver type – unreachable.
GARBAGE COLLECTION FIX
- The script interpreter's memory manager could reclaim a value that a list was still using. The slot in the list kept pointing at it, the freed space was handed to the next thing the script allocated, and reading the list back returned whatever had landed there. In practice this showed up as one wrong entry – usually the last – in a list a script had built up a value at a time. There was no error and no warning; the number was simply wrong. (
a861f48) - Which builds are affected. Only the 13 September build. The memory manager this defect lives in was introduced on 25 August, two days after the 23 August build, so the 23 August build and everything before it cannot be affected. Anyone building from source is affected if they built between 25 August and this commit.
- What to do. Replace the 13 September build with this one. The defect is in the memory manager rather than in any particular command, so it is not tied to one kind of script; if you have results from the 13 September build that matter to you, the safe course is to re-run them. One case is definitely not affected: values that came back from the bulk getters as whole arrays, because those arrays hold plain numbers and there is nothing in them to lose.
macOS
- Problem Definition was unreachable. The Problem entry on the menu bar had been changed from a menu to a single command, which Windows and Linux draw but macOS does not: the system menu bar accepts only menus at the top level, so the entry rendered as nothing at all. With no toolbar button and no keyboard shortcut, the whole problem definition dialog was unreachable on a Mac – problem type, length units, precision, minimum angle, SmartMesh, the model depth, and for magnetics the solution frequency and the AC solver. Broken from 18 July until this build. (
22c3949)
THE DRAWING EDITOR
- Backspace deletes the selection. Delete already did, but on a Mac laptop keyboard there is no forward-delete key – the key marked “delete” is Backspace – so there was no way to delete from the keyboard at all. Backspace only acts when the drawing has focus, so it still edits text normally in the script console. (
b520098) - Snap to grid now starts switched off, as it does in FEMM 4.2. It had been starting on, so every new installation and every new user account had to turn it off by hand. If you have already set it, your setting is untouched. (
7a73ac4)
STARTING FEMM FROM ANOTHER PROGRAM
- FEMM could fail to start, with no message, when launched from Octave or from a conda environment. Both set a variable that tells Qt where to find its plug-ins, pointing at their own copy of Qt; FEMM inherited it and tried to load plug-ins built against a different version of Qt. Octave's own launcher sets it unconditionally, and conda's Qt packages do the same, so any pyFEMM script started from such an environment could spawn a FEMM that died silently before drawing a window. FEMM now ignores that variable and uses the Qt it ships with. (
23fa091) - OctaveFEMM already worked around this on its own side; that workaround stays, for older copies of FEMM. (
23fa091)
SCRIPTING
- pandas now works in FEMM scripts. Like matplotlib and xlsxwriter, it runs in a real Python alongside FEMM rather than inside it, and
import pandas as pdfinds it automatically. Single values come back as ordinary numbers; a whole column stays on the far side until you ask for it withpybridge.fetch(), which is much faster than reading it a row at a time. (888bf72) - When a module is missing, the error now names the Python interpreter FEMM is actually using and gives the
pip installline for it, instead of leaving you to guess which of several Pythons it meant. (888bf72)
MATHEMATICA
- Loading
mathfemm.mprinted three error messages about usage strings, then suppressed anything further. Three of the gap-integral commands had quotation marks inside their own help text, which ended the string early. The commands themselves worked; the noise did not. All 658 usage strings were checked, not just the three that were reported. (dde4fd0)
DOCUMENTATION
- The binding setup guide is finished and is now a page on this wiki: BindingSetup. (
ac2354d) - The pyFEMM sections link to the MicroPython page that defines Python modules what a FEMM script can import, and the luaFEMM notes point at the hosted scripting guide. (
77c124d, 0d77c05)
| Previous test build | This build | Commits |
|---|---|---|
9cefef7 (23 Aug 2026) | 2c24b4b (13 Sep 2026) | 167 commits |
Commit hashes are given in parentheses for reference.
Three things dominate this build. Scripts no longer run against a fixed-size heap, so a script that handles a whole mesh at once is now an ordinary thing to write rather than something that runs out of memory. The magnetics solver no longer gives up on deeply saturated models. And the post-processor learned to hand back an entire mesh in a single call, which turns the usual loss-and-force scripts from thousands of round trips into one.
Underneath those, every language binding was put on a test bench for the first time, and it found a long list of commands that had never worked in any version of FEMM. Those are listed below by language.
Windows installers can now be code-signed, and the macOS build produces a signed and notarised disk image.
MEMORY, AND LARGE SCRIPTS
- The script interpreter's memory manager has been replaced. MicroPython's own allocator worked from a heap fixed at start-up, so a script that built a large array – a whole-mesh field extraction, a long time series – could exhaust it no matter how much RAM the machine had. FEMM now uses the Boehm-Demers-Weiser collector, which grows on demand. (
9440326) - Memory is handed back to the operating system when a script calls
gc.collect(), and once automatically at the end of every script, so a long batch run does not accumulate. (74a98cc, 83e6356, 7e14c02) - Scripts receive their command-line arguments as
sys.argv, so one script can be driven over a parameter sweep from a batch file. (711f8b8) - A per-user directory is now on the module search path, so your own
.pymodules can be imported from a FEMM script without copying them next to the program. Its location is in the manual. (3cd5164, 1ffcc3e)
SOLVERS
- Deeply saturated nonlinear magnetics problems could fail to solve. The incomplete-LDL preconditioner can break down on such a matrix – pivots that should be positive arrive negative or infinite – and the previous code tried to repair them in place, which did not work. The factorisation is now retried under a diagonal shift, which is the standard cure, and the models that used to stall now converge. (
f3fcb7e)
GETTING DATA OUT OF A SOLUTION
- The bulk getters return arrays. Nineteen commands across the four physics – the node, element and field getters – now return the whole mesh in one call instead of one value per call. A core-loss script over 180 rotor positions goes from about two million round trips to a few hundred. Measured on the shipped SPM example: 7.5 seconds per rotor position the old way, 0.47 with the bulk getters. (
887ddbf, 0a81aa0, 86a9c04) - Three physics gained field getters they never had. (
0a81aa0) - MathFEMM never exported its bulk getters at all, so they could not be called from Mathematica. (
1fd0942) - Both manuals now document them. (
8209bb7, e979e8c) - Numbers come back from the engine in the shortest form that still reads back exactly. Previously every value was written with seventeen digits, so a round number arrived looking like 0.10000000000000001. (
6a7097d)
CHANGES THAT MOVE NUMBERS
- Fillets are now tangent to the curves they join.
*_createradiushad been rewritten rather than ported, and the result touched the curves without matching their slope; line-to-line, line-to-arc and arc-to-arc are all correct now, and the arc a fillet lands on keeps the circle it was on. (e5f0fdf) - NumPy integer arrays are a real arithmetic type. int32 arrays could be stored but not calculated with, so ordinary array arithmetic silently promoted or failed; and
np.deletecould read past the end of its buffer. (a251e91, 45ac517, ac98f1e, 33626ee) np.array(…, dtype=int32)returned a complex array. (33626ee)- Twenty-six NumPy functions that work on real arrays now work on complex ones as well. (
cfcadcb)
DRIVING FEMM FROM OTHER PROGRAMS
The six bindings – MATLAB/Octave, Python, Mathematica, Scilab, Julia and Lua 4 – were tested command-by-command against the engine for the first time. Twenty-six defects were found. Twenty-one of them are inherited from FEMM 4.2 and have never worked in any version.
SciFEMM (Scilab)
- SciFEMM could not start FEMM on any platform except Windows. The launch command was assembled incorrectly, and on macOS and Linux it either failed or hung forever waiting for a process that had already started. Scilab scripts now run on Linux and macOS. (
3d2b37d, 216d87b) *_getviewcould never have run, on any platform. (3c93c7a)
LuaFEMM (legacy Lua 4 scripts)
- Fifty-six commands that FEMM 4.2 documents were missing and have now been added. (
e2148bf) - Arguments past the tenth were silently dropped, which affected
mi_addmaterialandmi_addboundpropamong others. (f46e67a) - `arg' works both as the script's argument table and as the complex phase function, as it does in FEMM 4.2. (
3ef8a1d) femm-luatakes -p PORT, so two Lua runs can go at once. (91a84ad)- The
femm-lualauncher was missing from the macOS distribution entirely. (e0d0f33)
pyFEMM
- pyFEMM's example scripts now ship, in their own folder beside
femm.py–{app}\pyfemm\exampleson Windows,bindings/pyfemm/exampleselsewhere. They are kept separate from the shared examples folder because both contain.pyfiles and they are for different interpreters: the shared ones run inside FEMM's own console, these run under CPython. (60c6e7a) - If you have FEMM 4.2 on the same machine, read the “Alongside FEMM 4.2” section of
pyfemm.mdbefore installing. Both provide a module named femm, so installing this one takes over `import femm` for that interpreter. The section gives three ways to keep them apart. (b572379, 780f728)
USER INTERFACE
- The About box and the headless banner say which build you are running – “Version 5.0 13Sep2026” – so a bug report can name a build.
femm_headlessalso accepts–versionand–help, and refuses an unknown switch instead of ignoring it. (a2af868, a5caee7) - New application icons. (
34e4ceb)
INSTALLING
- Material libraries are now per-user on every platform. The copy FEMM reads and writes lives in your own profile, and the installed one is a read-only seed, so your edits are no longer at risk from an upgrade and no administrator rights are needed to edit them. An upgrade from a build that kept the library in the program folder will offer to keep your edited copy. (
2fbf257, ec81730) - The Windows installer is now code-signed, so it no longer arrives as an unidentified program. (
cf08b42) - macOS builds produce a signed and notarised disk image that opens without Gatekeeper warnings. (
896a5bf)
DOCUMENTATION
- The file-format references now ship, one per physics: the on-disk layout of
.fem,.fee,.fehand.fec, every keyword in the order written. They are in{app}\docson Windows anddocs/elsewhere. They existed but had never been built or distributed. (5885e0d) - The manual says where your own Python modules and your material libraries live. (
1ffcc3e)
EXAMPLES
- The SPM core-loss script now ships in four forms: the original MATLAB/Octave script and its Python translation, each with a bulk-getter twin. The pair is the point – the difference between them is the worked example of the bulk getters. (
50723d1, 68530a0)
PLATFORMS
- Windows, Linux, FreeBSD and macOS all build and run this build, and all four pass the regression suite. The bindings were exercised on all platforms.
- On macOS one accuracy suite, FQReference, reports a difference. This is expected and is not a defect: the arm64 compiler fuses multiply-add operations, which changes the mesh slightly, so the comparison against a stored reference moves by about a part in a thousand. Every comparison against Original FEMM's own results stays within tolerance.
| Previous test build | ed250e7 — 3 Aug 2026 |
|
| This build | 9cefef7 — 23 Aug 2026 |
|
225 commits. Commit hashes are given in parentheses for reference.
There are three headlines for this build. Scripting stopped being a command dispatcher and became a language: more than two dozen standard-library modules now run inside FEMM, and real matplotlib plotting is available by leveraging any Python 3 on the machine. The solvers were substantially reworked and further speed increases were realized. And femm-qt can now be installed rather than only built on non-Windows machines. Linux and FreeBSD have an install and uninstall step; macOS has a disk image that hands over everything needed; and the language bindings find FEMM by themselves rather than having to mess with defining a FEMM_DIR environment variable.
Python scripting: a standard library
- Scripts previously had the FEMM commands and little else. These modules now run in MicroPython:
datetime, csv, glob, textwrap, logging, re, itertools, operator, shutil, tempfile, string, functools, contextlib, copy, fnmatch, pathlib, pprint, os, traceback, stat, bisect, heapq, base64, types, abc, inspect, argparse, pickle, numpy, scipy, json, re, time, random, binascii, hashlib and errno (commits f4d1dcb, fdf3cbb, 684125e, 017ccf7, 605d6d5, 45e20d6, b3fd8c3)
- Two libraries are forwarded to a Python 3 installation rather than reimplemented, so a pasted example from their documentation runs unchanged:
xlsxwriter, for writing.xlsxworkbooks with formats and charts. (5b871bd)zipfile, which needs DEFLATE to be useful. (c552a48)
numpygained some pieces that were missing:fftandifftaccept any length, not only powers of two, via Bluestein's algorithm; they take n= and norm=; and fft of a 2-D array now transforms whatnumpytransforms rather than silently doing something else. (a153521,8be3625,3bd22a2,385fbf1)matrix_rank,eigvals,lstsq,roots, and the single-argument form of where. (ab6f326)
Plotting with matplotlib
import matplotlib.pyplot as pltnow works from a FEMM script. FEMM does not ship or linkmatplotlib; it finds a Python 3 on the machine and proxies object access to it, so plots are realmatplotlibfigures with the full API. (e53f226,b6dc3f2,2e3bbce,bcdd169)
- Arrays cross the boundary in bulk — 8 MB in well under a tenth of a second — so plotting a whole mesh is practical. Complex numbers are first-class. (
55fda59)
- The Python that FEMM finds is discovered by scanning the machine rather than guessing names, so a
matplotlibinstalled against a non-default interpreter is still found. (8b3ec69,386fbab,2e3d8e2,d8240f0)
- An interpreter without
matplotlibis still useful — forxlsxwriter,scipyor anything else — and is no longer refused outright. (f856a13)
numpyandscipyare NOT proxied: they are provided in-process, and shadowing them would trade fast local numerics for round trips. A 32-bit integer type was added because a 16-bit one cannot index a mesh. (f4a9a7c,8633f55)
Solvers
- A threshold-fill incomplete
LDL^Tpreconditioner replaces the block-SSOR one, reducing solution times to 1/3 to 1/2 of the block-SSOR times on the problems tested. (7304166,88ee64b,64c2223,13e6a76,956b65d)
- The nonlinear iteration only reassembles the elements that changed, uses inexact inner solves for the early passes, and requires the terminating pass to meet full precision. (
0a6e5ed,43338a6,b8d9c76,229d0df,40cffd0)
- Several O(n) sweeps in matrix assembly were removed. (
d847fc5,b480c6f,a2226b5)
- Reading and writing solution files is substantially faster. (
27d19d5,ad2d47c)
- The iterative solvers now bail on a non-finite residual and guard against a stalled iteration rather than running to the iteration limit. (
876c0e9)
- A zero right-hand side clears the solution instead of returning the warm-start guess. (
6113cc2)
Changes that move numbers
- The sliding-band air-gap interpolation is now C2 quintic by default (instead of the previous C1 cubic version). The higher-order interpolation reduces artificial mesh-related torque and normal normal force ripple. Air-gap quantities — torque ripple in particular — will differ slightly from earlier builds. (
a2b6218)
- The incremental-permeability Jp term was read from the wrong field, and in the wrong units. Incremental force and torque results that involve it change. Original FEMM has the same defect; this build deliberately diverges. (
02380c3)
Post-processor
- Current density is available on X-Y contour plots at DC as well as AC. (
38d5de1)
- Exported CSV uses the same precision as the display, and
*_makeplotwrites exactly what the Export… button writes. (d1e81ec,3eb78dc)
User interface
- A permanent magnet's magnetization direction now follows the geometry when a label is rotated, copy-rotated or mirrored. (
20204ea)
- Cartesian and polar coordinate entry are back: the mode selector, the status bar readout, TAB entry, and all four
*_setgridscript commands. (7d76b2b,b05db1c)
- The logarithmic B-H plot is usable again, and the heat-flow T-k curve editor was restored. (
313f503,3aa5e8c)
- Smoothing is back on the post-processor View menu, and three menu items that did nothing now do something. (
5853ff3,4d92be5)
- The line-integral points preference has an effect. (
5988b3f)
- A failed analysis is reported once rather than twice. (
9e30bfd)
- Set Grid Size has its own accelerator. (
2965440)
- The hysteresis lag angle is labelled phi, matching everything else. (
66c8bc3)
- Zoom-to-fit framed the model about 9% smaller in the editor than in the post-processor, so a window switch appeared to change the zoom. (
3b3cdb4)
- The material library editor says so when it cannot write the library, instead of appearing to save and doing nothing. (
dff0218)
- The Python console, the solver log, the material-property panes and the output dialog use a fixed-width font on macOS and Linux. They had asked for a Windows font, which does not exist there, and Qt was quietly substituting a proportional one — in windows whose whole purpose is columns of numbers that line up. (
9cefef7)
- On Linux the application shows its own icon in the dock and the task switcher rather than a generic placeholder, and on macOS the application bundle has an icon at all. (
463aa6a,f69adf8)
- Meshing and analysis check whether saving the document succeeded, rather than proceeding as though it had. (
dae3314)
- Degenerate input to the mesher — an empty document, or one with a single point — is reported as a mesh failure instead of crashing. (
5cd58aa)
Manual
The manual had drifted from the program in a lot of places. This build is the result of a chapter-by-chapter pass over all of it.
- Every one of the 35 dialog screenshots and all 11 toolbar strips were recaptured from the running program, at one consistent scale. (
946a51a,23ea2f0,dbb8ddf,e96cd98,2fbedde,849d56d,17ec080)
- Prose reconciled with the dialogs it describes throughout — problem definition, material properties, boundary conditions, the property manager, nodal/circuit/conductor properties, air-gap boundaries. (
878b32b,9c91442,57a3679,f9dd61f,2ebd3ad,2802f6c)
- Corrections to the line-integral and block-integral sections, the force and torque sections, the electrostatics post-processor sections, the mouse-button table, the mesh-sizing keys, and seven commands that were documented only for their siblings. (
fe64494,ffc0cbb,bf35f01,68326d4,5b282e9,2f5a1a5)
- Commands that do not exist were removed, and a filename rule that no longer applies was dropped. (
5b8421d,56e65f0)
- The scripting chapter documents the predefined constants and units, and how to write a table of results. (
6dbe212,5044655)
Installing
Until this build, “installing” femm-qt on platforms other than Windows meant running it out of the directory it was built in. That is still supported and still needs nothing. What is new is that there is now a way to put it somewhere permanent on every platform, and that the pieces a user actually opens — the examples, the manual, the guides for driving FEMM from other programs — end up where they can be found.
Linux and FreeBSD
- An install step:
./linux_build.sh install [prefix] [--modify-path] ./freebsd_build.sh install [prefix] [--modify-path]
It installs what is already built — it does not rebuild — into ~/.local/opt/femm-qt, links the commands into ~/.local/bin, and adds a menu entry and icon. It goes into your home directory rather than /usr/local because the material libraries and the examples have to stay writable. (1fb1461)
- And an uninstall:
./linux_build.sh uninstall [prefix] [-y]
It works from a manifest the install leaves behind rather than a list of paths worked out afresh, so it removes exactly what was put there and nothing else. A program directory with no manifest is refused rather than guessed at, and a command in ~/.local/bin that does not point into the program directory is left alone — names like fkn and lua4 could belong to something else. Your own copies of the examples are never removed. (2621970)
- The four solvers and the Lua 4 interpreter are linked as commands too, not just the GUI and the headless server:
fkn modelsolvesmodel.femand writesmodel.ans, which is what you want from a Makefile or a batch queue. (d065850)
- The examples and the documents are copied to
~/Documents/FEMM, because the program directory lives under ~/.local, which Ubuntu's file manager hides outright. The shipped examples there are refreshed by every install so that a corrected example reaches people who already installed; anything else you keep in that directory is left alone. (24d59d8,d065850,8c63f42)
- PATH: the installer checks and tells you, and does NOT edit your shell startup files unless you pass
–modify-path. If the directory is already on PATH it says nothing. On Debian and Ubuntu, whose stock~/.profileadds~/.local/binonce it exists, it says so and adds nothing rather than duplicating what the distribution does. Otherwise it prints the exact line and the exact file. (35d7312,e31a12c)
- Which file that is, and whether a new terminal is enough, depends on your shell:
~/.profileis read at login, so bash and sh users must log out and back in;~/.zshrcand fish'sconfig.fishare read by every interactive shell, so there a new terminal suffices. Under csh or tcsh nothing is written at all — they read neither and use different syntax — and the “set path” line for~/.cshrcis printed instead. (9e510ae,afa043c,01e4ee4)
- The manual is copied into
build/bin, so Help > Manual works from a build tree. (88614ca)
macOS
packaging/macos_dmg.shbuilds a disk image. It opens to four things: the application, an alias to/Applications, a FEMM folder and a Read Me. Installing is two drags — the app onto Applications, and FEMM onto your home folder, which gives you (1836770,f1193a3,5854448)
~/FEMM/examples models and scripts, for every language ~/FEMM/docs the manual and the per-binding guides ~/FEMM/bindings the client files for other programs
- The home folder rather than Documents, deliberately. macOS protects Documents, Desktop and Downloads: a file you pick in an open panel is fine, but a path a program reaches for on its own — Octave's addpath, open() inside a script,
femm_headless -run— needs permission first. An application with a window can ask for it; a process without one simply fails with “Operation not permitted”, and an application that fails that way never appears in the System Settings pane where you would grant it. The home folder is not protected, so none of that arises. (209ceb0)
- The examples ship twice: read-only masters inside the application, and the writable folder you drag out. They cannot be used in place — an example script opens a model and then saves it under another name, and an analysis writes the model back before solving. (
c28933d,7c12740)
- The material libraries are kept in
~/Library/Application Support/FEMM, so your additions survive replacing FEMM with a newer version. A signed application bundle is read-only and cannot hold them. (1effc98,bb33316,e8e425f)
- lua4 ships inside the bundle, because it is the only binary among the client-side files and has to be covered by the application's signature. The loose copies of everything that goes into the bundle are removed, so there is one copy of each program and one place it runs from. (
d801ffc,aee14a9)
- The image is not signed or notarized yet. Handed over on a USB stick or a file share it opens with no fuss; downloaded through a browser it is quarantined, and macOS will refuse it once until you allow it in System Settings > Privacy & Security.
Windows
- The installer now carries pyFEMM, the one binding of six it did not ship, and the OctaveFEMM usage guide. (
4c785d6)
- The Python examples that directly run inside femm-qt are shipped. Previously, none of these examples had been included in the installer. (
6efca5c)
bin/pythonships — the in-process Python standard library was not reaching an installed FEMM at all. (70971e6)
Driving FEMM from other programs
FEMM_DIRis no longer required. All six bindings — OctaveFEMM, MathFEMM, SciFEMM, JuliaFEMM, pyFEMM and luaFEMM — look for the executables inFEMM_DIR, then beside their own directory, then every directory on PATH, and finally in/Applicationsand~/Applications. An install puts the executables on PATH; a macOS bundle dragged to/Applicationsis found there. Verified withFEMM_DIRunset on all six. (8fbf021,62c4a3d,8302faa)
FEMM_DIRstill works and still takes precedence, which is how you choose between several copies of FEMM. The Windows installer continues to set it.
- Each language still has to be told where its own binding file lives. That is a different thing from finding FEMM and cannot be done from an installer, so the install prints the exact line — addpath, include, exec, Get — for each of the six. (
39a46e9)
- The per-binding guides now ship: how to drive femm-qt from Python, Octave and Lua, including multi-instance use, headless mode and connecting to an instance that is already running. They had been sitting in the source directories, where nobody who installed would find them. (
df5ecfc)
- How to install pyFEMM, which was written down nowhere, and how to install OctaveFEMM including the directory rename that trips it up. (
675d4b8,48e0ea3)
Examples
- Two could not run once they left the maintainer's machine:
coilgun.pyopened a model that was never shipped, andopen1.pywrote to an absolute path. (535945e)
- New: the SPM core-loss script in Python with the model it runs, the MATLAB originals behind it, and a script that rebuilds the Kelvin transformation example referenced in the user manual. (
f25a7e6,4b00839,234c652,bb6318c)
Platforms
- This build has been run on Windows, Ubuntu 24.04, macOS 26.5.1 on Apple silicon, and GhostBSD. The full regression suite is green on all four. (
616e881,a92ae41,6bca468)
- The regression suite itself is portable now, and derives every path from its own location. (
616e881)
- Note for macOS: clang contracts floating-point operations on Apple silicon, which changes what the mesher produces — a different mesh, solved correctly, giving small differences from an x86 build. Every comparison against FEMM 4.2 stays within tolerance.
- The install and the disk image have now been exercised on the machines they target, not just built: the Linux install and uninstall on Ubuntu, the shell handling on GhostBSD, and on an M1 Mac the disk image, the two drags, and Octave driving FEMM with no
FEMM_DIRand no permission dialogs. Most of the fixes above exist because doing that turned up problems that building never would have.
- The four build guides ship as PDFs, so a source recipient can read the build instructions without first installing a TeX distribution. (
e114651,9347436)
Packaging and licensing
- Every directory holding third-party code carries the notice its license requires, and the installer ships those notices. (
12a1220,2a7fb52,4b99eb9)
- All platforms now stage the examples, the bindings and the documents from one shared script reading one manifest, so they cannot drift apart. (
0c860e0)
- What a distribution package or an AppImage would need is written down in
docs/relocatable-installs.md. Neither is started; the note exists so the reasoning does not have to be rediscovered. (28f7913)
