"""Прочитать уже сохранённое магнитное решение без нового анализа.

Нужны solenoid.fem и соответствующий solenoid.ans: по умолчанию в текущей
папке, либо передайте путь .fem первым аргументом. Координаты, материалы,
частота и глубина наследуются из модели. Выход: ток [А], напряжение [В],
потокосцепление [Вб·виток] цепи Coil и число элементов. Сохранённое решение
должно соответствовать входной модели; существование .ans само по себе
не доказывает их согласованности или физической точности.
"""

import os
import sys
import femm

# 1. Формируем абсолютные пути к входу и результату с одинаковым основанием.
model_path = os.path.abspath(sys.argv[1] if len(sys.argv) > 1 else 'solenoid.fem')
solution_path = os.path.splitext(model_path)[0] + '.ans'

# Проверка наличия результата даёт понятный отказ до команд постпроцессора.
if not os.path.isfile(solution_path):
    raise OSError('Нужно сохранённое решение: ' + solution_path)

# 2. Открываем вход и загружаем его решение; mi_analyze здесь не вызывается.
femm.opendocument(model_path)
femm.mi_loadsolution()

# 3. Команды mo доступны после загрузки магнитного результата.
try:
    # Порядок тройки API: ток, напряжение, потокосцепление.
    current_a, voltage_v, linkage_wb = femm.mo_getcircuitproperties('Coil')
    print('Ток, А:', current_a, sep=' ')
    print('Напряжение, В:', voltage_v, sep=' ')
    print('Потокосцепление, Вб:', linkage_wb, sep=' ')
    print('Число элементов:', femm.mo_numelements(), sep=' ')
    assert femm.mo_numelements() > 0
    assert abs(current_a) > 0

# 4. Закрываем результат и вход также при ошибке чтения или проверки.
finally:
    femm.mo_close()
    femm.mi_close()
