"""Асинхронная машина: частота скольжения, напряжение и годографы."""
exec(open('common.py').read())
PHASES=['Фаза A','Фаза B','Фаза C']
RS=3.5;LEND=.003;F1=50;W1=2*math.pi*F1;P=2
TARGET=400/math.sqrt(3)*math.sqrt(2)

def phase_currents(peak):
    return [peak,peak*complex(-.5,-math.sqrt(3)/2),peak*complex(-.5,math.sqrt(3)/2)]

def build(peak,slip,mesh=.1,angle=None):
    opendocument('induction-seed.fem');mi_probdef(0 if angle is not None else slip*F1,'millimeters','planar',1e-8,98,30);mi_smartmesh(0)
    currents=phase_currents(peak)
    if angle is not None:
        z=complex(math.cos(math.radians(angle)),math.sin(math.radians(angle)));currents=[(i*z).real for i in currents]
    for k,name in enumerate(PHASES):mi_modifycircprop(name,1,currents[k])
    for x,y in [(41.88,2.2),(41.62,2.89)]:
        mi_selectlabel(x,y);mi_setblockprop('Воздух',0,mesh,'<None>',0,0,1);mi_clearselected()
    for x,y,g in [(-3.2,59.4,1),(6,21,2)]:
        mi_selectlabel(x,y);mi_setblockprop('Сталь M-43',0,2,'<None>',0,g,1);mi_clearselected()
    for x,y in [(-8.7,35.7),(.3,35),(9.4,35.4),(16.9,32.3),(24,27.2),(30.5,20),(33.4,11.8),(34.9,3.4),(36.3,-4.7),(35.1,-13.1),(31.1,-21.4),(24,-27.8),(15.9,-32.6),(8.4,-33.9),(0,-37.4),(-8.9,-35.1),(-17.1,-32.4),(-24.1,-27.6),(-30.5,-20.4),(-33.7,-12.5),(-37.1,-4.5),(-36.5,5.1),(-34.2,13.3),(-29.8,20.8),(-24.5,27.9),(-16.6,31.8)]:
        mi_selectlabel(x,y);mi_setblockprop('Алюминий 1100',0,1,'Короткозамкнутая клетка',0,2,1);mi_clearselected()
    return currents

def native(name,peak,slip,mesh=.1,angle=None):
    currents=build(peak,slip,mesh,angle)
    r=solve(name,{'family':'induction','slip':slip,'f1_Hz':50,'frequency_Hz':0 if angle is not None else slip*50,'current_peak_A':peak,'time_phase_deg':angle,'mesh_gap_mm':mesh,'core_mu_r':None,'conditions':'Асинхронная машина: 36 пазов статора,26 стержней ротора, p2, глубина98мм,282витка/фазу. Rф3.5Ом и Lлоб3мГн учитываются внешней схемой; потери стали, лобовые поля и скос исключены; идеальное замыкание стержней. '+('Статический срез вращающегося поля без индуцированных токов, B(H) M-43.' if angle is not None else 'Нелинейная гармоническая модель B(H)M-43; частота расчета равна частоте токов ротора s·50Гц, амплитудные фазоры токов.')},41.85,2)
    opendocument(name+'.fem');mi_loadsolution();props=[mo_getcircuitproperties(n) for n in PHASES]
    flux=[complex(x[2]) for x in props]
    r['flux_abc_peak_Wbturn']=[pair(x) for x in flux]
    if angle is None:
        voltage=[RS*currents[k]+1j*W1*(flux[k]+LEND*currents[k]) for k in range(3)]
        vrms=math.sqrt(sum(abs(z)**2 for z in voltage)/3)/math.sqrt(2)
        pin=sum((voltage[k]*complex(currents[k]).conjugate()).real*.5 for k in range(3))
        pcu=1.5*RS*peak*peak;pr=r['P_rotor_W'];pg=pr/slip
        r.update({'voltage_abc_peak_V':[pair(z) for z in voltage],'voltage_phase_RMS_V':vrms,'voltage_relative_error':vrms/(400/math.sqrt(3))-1,'Pin_W':pin,'Pstator_cu_W':pcu,'Pgap_W':pg,'Pconverted_W':(1-slip)*pg,'T_power_Nm':pg/(W1/P),'power_balance_relative_error':(pin-pcu-pg)/max(abs(pin),1),'T_stress_Nm':ring_torque(r['ring'],41.85,98,True),'T_weighted_along_field_Nm':-r['T_weighted_Nm'][0]})
    else:
        points=[('Зубец',(45,5)),('Спинка',(60,0)),('Зубец-сдвиг',(45,15)),('Спинка-сдвиг',(60,10))]
        r['probes']={}
        for key,(rad,deg) in points:
            x,y=polar(rad,deg);v=mo_getpointvalues(x,y);r['probes'][key]={'x_mm':x,'y_mm':y,'Bx_T':scalar(v[1]),'By_T':scalar(v[2]),'mu_x':scalar(v[9]),'mu_y':scalar(v[10])}
    close();save_result();return r



for peak in [math.sqrt(2)*2.3,math.sqrt(2)*4.6]:
    for k in range(24):native('Годограф-I'+str(round(peak,4))+'-Угол'+str(15*k),peak,0,angle=15*k)
print('HODOGRAPHS_COMPLETE',len(records))
