"""Одна воздушная катушка: A=0, IABC и осесимметричное преобразование Кельвина.
Катушка r=9..11 мм,z=-5..5 мм,N=100,I=1 А. Одни материалы и ближняя сетка.
У Кельвина центр внешней полусферы задан по геометрии, а не скопирован
из старого примера с несовпадающими координатами. Энергия берётся через L I²/2.
"""

# Каталог сценария определяется явно: запуск не зависит от чужого CWD.
import os
import sys

os.chdir(os.path.dirname(os.path.abspath(sys.argv[0])))
exec(open("common.py").read())
folder = result_folder("results-open-boundaries")
rows = []
for method, radius in [
    ("A0", 30),
    ("A0", 60),
    ("A0", 120),
    ("IABC", 30),
    ("Kelvin", 30),
    ("Kelvin", 60),
]:
    newdocument(0)
    mi_probdef(0, "millimeters", "axi", 1e-10, 1, 30)
    material("Air")
    mi_addcircprop("Coil", 1, 1)
    mi_drawrectangle(9, -5, 11, 5)
    label(10, 0, "Air", 0.25, "Coil", 100, 1)
    label(5, 0, "Air", 0.7)
    if method == "A0":
        a0_circle(radius, True)
    elif method == "IABC":
        mi_makeABC(7, radius, 0, 0, 0)
    else:
        half_disk(radius)
        ext_radius = radius / 2
        center = radius + 2 * ext_radius
        half_disk(ext_radius, center)
        mi_addboundprop("Periodic", 0, 0, 0, 0, 0, 0, 0, 0, 4)
        mi_selectarcsegment(radius, 0)
        mi_selectarcsegment(ext_radius, center)
        mi_setarcsegmentprop(1, "Periodic", 0, 0)
        mi_clearselected()
        mi_defineouterspace(center, ext_radius, radius)
        label(ext_radius / 2, center, "Air", 0.7)
        mi_selectlabel(ext_radius / 2, center)
        mi_attachouterspace()
        mi_clearselected()
    solve(folder, "%s-R%d" % (method, radius))
    current, voltage, linkage = mo_getcircuitproperties("Coil")
    rows.append(
        {
            "method": method,
            "radius_mm": radius,
            "B0_T": mo_getpointvalues(0, 0)[2],
            "linkage_Wb": linkage,
            "energy_from_circuit_J": 0.5 * current * linkage,
            "elements": mo_numelements(),
        }
    )
    close_magnetic()
    save_json(folder, rows)
assert all(row["B0_T"] > 0 for row in rows)
print(rows)
