-- 1. Создадим новую документ магнитостатики
newdocument(0)
mi_probdef(0, "millimeters", "planar", 1e-8, 0, 30)
-- 2. Нарисуем простую геометрию: сердечник и область воздуха
mi_addnode(0, 0)
mi_addnode(0, 50)
mi_addnode(50, 50)
mi_addnode(50, 0)
mi_addsegment(0,0, 0,50)
mi_addsegment(0,50, 50,50)
-- ... и т.д., рисуем прямоугольник
mi_addblockprop("Air", 0, 0, 0, 0, 0, 0) -- Назначим область воздухом
mi_addblockprop("Ferrite", 0, 0, 0, 0, 0, 0) -- Назначим область ферритом
-- 3. Создадим цепь и назначим ее группе сегментов (катушке)
mi_addcircprop("MyCoil", 1, 1) -- Создаем цепь "MyCoil", ток 1А, последовательно
-- ... (код, назначающий эту цепь сегментам катушки)
-- 4. Запустим расчет
mi_analyze(1) -- Аргумент (1) означает "закрыть окно по завершении"
mi_loadsolution() -- Переходим в постпроцессор
-- 5. Получим результат (индуктивность через энергию)
W = mo_blockintegral(2) -- Вычисляем энергию
I = 1 -- Наш заданный ток
L = 2 * W / (I * I) -- Рассчитываем индуктивность
-- 6. Выведем результат в сообщение
showconsole() -- Показываем консоль
print("Индуктивность катушки: " .. L .. " Гн")
"C:\Program Files\FEMM42\femm.exe" -lua-script="C:\path\to\your\script.lua"
import subprocess
path_to_femm = "C:\\Program Files\\FEMM42\\femm.exe"
path_to_lua_script = "C:\\my_models\\simulate.lua"
# Запускаем FEMM со скриптом и ждем завершения
result = subprocess.run([path_to_femm, "-lua-script=" + path_to_lua_script], capture_output=True, text=True)
print(result.stdout) # В stdout будет все, что напечатало скрипт через print()
-- ... (код расчета)
-- Вместо print открываем файл и записываем туда данные
local output_file = io.open("C:\\results\\simulation_result.txt", "w")
output_file:write("L_sigma_energy, L_sigma_flux, Total_Energy\n") -- Заголовок CSV
output_file:write(string.format("%.6e, %.6e, %.6e\n", L_sigma_energy, L_sigma_flux, W_total))
output_file:close()
-- Можно записать и более сложные данные, например, поле вдоль линии
local data_file = io.open("C:\\results\\field_data.txt", "w")
for x = 0, 100, 1 do -- Проходим по линии от x=0 до x=100
values = mo_getpointvalues(x, 0) -- Получаем Bx, By, Hx, Hy в точке (x,0)
data_file:write(string.format("%f %f %f\n", x, values.Bx, values.By))
end
data_file:close()
# Python код-генератор
template = """
open("my_model.fem")
mi_setcurrent("Coil", {current})
mi_readdxf("frame_{frame_number:03d}.dxf")
mi_analyze(1)
mi_loadsolution()
W = mo_blockintegral(2)
-- ... запись в файл results_{frame_number:03d}.txt
"""
for frame_number in frames:
current = initial_currents[frame_number] # Ток из предыдущей итерации
script_content = template.format(frame_number=frame_number, current=current)
with open(f"script_{frame_number:03d}.lua", "w") as f:
f.write(script_content)
for frame_number in frames:
lua_script_path = f"script_{frame_number:03d}.lua"
subprocess.run([femm_path, "-lua-script=" + lua_script_path])