"""MicroPython FEMM5. Многослойная 2D-оценка по фактической кривой ХХ.
Срезы независимы; это постобработка, а не трёхмерное полевое решение.
"""
import math,json,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)))

with open('spm-open-compact.json') as f:data=json.load(f)
rows=data['rows'];N=len(rows);step=data['step_mechanical_deg'];values=[r[1] for r in rows]
shift=round(7.5/step);assert abs(shift*step-7.5)<1e-10
skew=[.5*(values[(k-shift)%N]+values[(k+shift)%N]) for k in range(N)]
def rms(v):
 mean=sum(v)/len(v);return math.sqrt(sum((x-mean)**2 for x in v)/len(v))
result={'source':data['source'],'scope':'Линейное объединение независимых двумерных срезов по исходной полевой угловой кривой; новые поля и осевые потоки не рассчитываются. Исходная кривая ХХ, поэтому о снижении среднего нагрузочного момента по ней судить нельзя.','N':N,'offsets_mechanical_deg':[-7.5,7.5],'weights':[.5,.5],'base_cogging_pp_Nm':max(values)-min(values),'skew_cogging_pp_Nm':max(skew)-min(skew),'base_ripple_rms_Nm':rms(values),'skew_ripple_rms_Nm':rms(skew),'ideal_fundamental_EMF_ratio_two_slices':math.cos(2*math.radians(7.5)),'ideal_continuous_30deg_EMF_ratio':math.sin(math.pi/6)/(math.pi/6),'rows':[[rows[k][0],values[k],skew[k]] for k in range(N)]}
with open('skew-result.json','w') as f:json.dump(result,f)
print('Skew pp',result['base_cogging_pp_Nm'],result['skew_cogging_pp_Nm'])
