"""Изолированный магнит в воздухе: два направления и проверка полярности.

Встроенный Python FEMM 5. Запускайте из отдельной рабочей папки.
Проверенные оригиналы курса не открываются и не изменяются.
"""
import json
from math import pi

# Координаты в миллиметрах, глубина 20 мм, линейная линия возврата.
rows=[]
for angle in [90,270]:
    newdocument(0)
    mi_probdef(0,"millimeters","planar",1e-9,20,30)
    mi_addmaterial("Воздух",1,1)
    mi_addmaterial("Учебный магнит",1.05,1.05,1.2/(4*pi*1e-7*1.05))
    mi_addboundprop("Внешняя граница",0,0,0,0,0,0,0,0,0)
    mi_drawrectangle(-80,-80,80,80)
    mi_drawrectangle(-5,-10,5,10)
    for x,y in [(0,-80),(80,0),(0,80),(-80,0)]:
        mi_selectsegment(x,y)
        mi_setsegmentprop("Внешняя граница",0,1,0,0)
        mi_clearselected()
    # Направление источника меняется у метки магнита, Hc остаётся положительным.
    for x,y,name,mesh,group in [(0,0,"Учебный магнит",.5,1),(40,40,"Воздух",5,0)]:
        mi_addblocklabel(x,y)
        mi_selectlabel(x,y)
        mi_setblockprop(name,0,mesh,"<None>",angle if group else 0,group,0)
        mi_clearselected()
    filename="Магнит-в-воздухе-"+str(angle)+".fem"
    mi_saveas(filename)
    mi_close()
    opendocument(filename)
    mi_analyze(1)
    mi_loadsolution()
    v=mo_getpointvalues(0,0)
    rows.append({"angle_deg":angle,"model":filename,"Bx_T":v[1],"By_T":v[2],"elements":mo_numelements()})
    mo_close()
    mi_close()
assert rows[0]["By_T"]>.01 and rows[1]["By_T"]<-.01
assert abs(rows[0]["By_T"]+rows[1]["By_T"])<1e-6
with open("magnet-air-results.json","w") as stream:
    json.dump({"passed":True,"models":rows},stream)
