"""FEMM5 MicroPython. Одинаковая ДПТ при Iветви=0 и3А, Iвозб=2А.
Это два статических состояния, без решения коллекторной коммутации и сети.
"""
import math,json,os,sys
assert sys.implementation.name=='micropython'

# FEMM CLI и команда запуска сохранённого файла передают его путь в sys.argv[0].
# Локальные модели/таблицы ищутся возле программы, а не в случайной рабочей папке.
import os
_saved_file=globals().get('__file__') or (sys.argv[0] if sys.argv else '')
if not _saved_file or not os.path.isfile(_saved_file):
 raise RuntimeError('Запустите сохранённый файл из полного распакованного комплекта командой FEMM Run Script; не вставляйте его частями в консоль.')
os.chdir(os.path.dirname(os.path.abspath(_saved_file)))

try:os.mkdir('dc-output')
except OSError:pass
results=[]
for current in [0.,3.]:
 opendocument('dc-course-reference.fem');mi_modifycircprop('Field',1,2.);mi_modifycircprop('Armature',1,current)
 name='dc-output/dc-'+str(current);mi_saveas(name+'.fem');mi_analyze(1);mi_loadsolution();mo_smooth('off')
 mo_clearblock();mo_groupselectblock(2);T=float(mo_blockintegral(22));mo_clearblock();field=[];phi=0;N=720
 for k in range(N):
  a=-math.pi+2*math.pi*(k+.5)/N;x=59*math.cos(a);y=59*math.sin(a);v=mo_getpointvalues(x,y);br=float(v[1])*math.cos(a)+float(v[2])*math.sin(a);field.append([a*180/math.pi,br])
  if -math.pi/2<a<math.pi/2:phi+=br*.059*.08*2*math.pi/N
 results.append({'branch_current_A':current,'terminal_current_A_assuming_2_paths':2*current,'field_current_A':2.,'T_WST_Nm':T,'pole_flux_Wb':phi,'gap_Br_theta':field,'elements':mo_numelements(),'model':name+'.fem'})
 mo_close();mi_close()
out={'scope':'Собственная прежняя учебная геометрия курса, а не восстановленный двигатель Valladolid110В. Статор/ротор — линейная сталь; 12 пазов по50 проводников, всего Z=600; при двух параллельных ветвях заданный Armature — ток ветви, Ia=2Iветви. Условия ХХ: Ia=0 и неизменное возбуждение, механические потери не учтены. Нагрузка: заданное токовое состояние, напряжение и частота вращения не согласовываются автоматически.','cases':results}
with open('dc-result.json','w') as f:json.dump(out,f)
print('DC two states',[(r['branch_current_A'],r['T_WST_Nm'],r['pole_flux_Wb']) for r in results])
