"""Серия трёх независимых магнитостатических решений катушки.

Вход: solenoid.fem с цепью Coil, токи 0, 1, 2 А; единицы геометрии и
осесимметричная постановка наследуются из учебной модели. Выход: новые
модели, решения и results.json с токами [А], потокосцеплениями [Вб·виток]
и числом элементов. Создаётся новый каталог: для повтора измените folder.
Каждый режим начинается с исходной модели; она не перезаписывается.
Проверка фактического тока подтверждает возбуждение, но не сходимость сетки.
"""

import os
import sys
import json
import femm

# 1. Приводим пути к абсолютному виду и создаём отдельный каталог серии.
model_path = os.path.abspath(sys.argv[1] if len(sys.argv) > 1 else 'solenoid.fem')
folder = os.path.abspath('micro-reference-sweep')
os.mkdir(folder)
rows = []

# 2. Перебираем три тока; номер режима формирует уникальное имя копии.
for index, requested_a in enumerate([0.0, 1.0, 2.0]):
    # Снова читаем исходную модель, сохраняя одинаковые исходные параметры.
    femm.opendocument(model_path)
    work_path = os.path.join(folder, 'coil-' + str(index) + '.fem')
    solution_open = False
    try:
        # Сохраняем рабочую копию до изменения тока; свойство цепи 1 — ток, А.
        femm.mi_saveas(work_path)
        femm.mi_modifycircprop('Coil', 1, requested_a)
        femm.mi_saveas(work_path)
        # Решаем копию и загружаем соответствующий результат для команд mo.
        femm.mi_analyze(1)
        femm.mi_loadsolution()
        solution_open = True
        # Читаем фактическое возбуждение вместе с откликом; не подменяем его заданием.
        measured_a, voltage_v, linkage_wb = femm.mo_getcircuitproperties('Coil')
        assert abs(measured_a - requested_a) < 1e-09
        rows.append({
            'current_a': measured_a,
            'linkage_wb': linkage_wb,
            'elements': femm.mo_numelements(),
            'model': work_path,
        })
    # Закрываем только открытый результат; вход закрывается в любом случае.
    finally:
        if solution_open:
            femm.mo_close()
        femm.mi_close()
    # 3. Промежуточная запись сохраняет уже завершённые режимы серии.
    with open(os.path.join(folder, 'results.json'), 'w') as stream:
        json.dump(rows, stream)

# 4. Проверяем, что серия дошла до всех трёх режимов.
assert len(rows) == 3
print('Результаты трёх статических расчётов:', rows, sep=' ')
