"""Обмоточные коэффициенты и момент кольцевого зазора. FEMM 5 / Python."""
exec(open('common.py').read())
def winding(kind,mesh=.5):
    setup();circle(90);circle(100);gauge(100);label(0,0,'<No Mesh>')
    label(95,3,'Воздух',mesh)
    # Двенадцать последовательных катушек фазы; Q36,p2,q3.
    upper=[]
    for j in range(36):
        belt=(j//3)%6;upper.append(1 if belt==0 else -1 if belt==3 else 0)
    if kind=='сосредоточенная':weights=[6 if j in [0,18] else -6 if j in [9,27] else 0 for j in range(36)]
    else:
        pitch=9 if kind=='полный-шаг' else 8
        weights=[upper[j]-upper[(j-pitch)%36] for j in range(36)]
    for j in range(36):
        a=10*j;sector(98.8,99.6,a-2,a+2,10,.5)
        name='Паз '+str(j+1);material(name,j=weights[j])
        label(99.2,a,name,.08,10)
    r=solve('Обмотка-'+kind,{'family':'winding','kind':kind,'weights':weights,'Q':36,'p':2,'phase_turns':12,'conditions':'Линейный кольцевой зазор r90..100мм; глубина100мм; Q36,p2,q3; одна фаза, одинаковые полные ампер-витки; J на стороне с одним проводником1МА/м².'},95)
    r['harmonics']={str(h):real_spatial_amp(r['ring'],2*h) for h in [1,3,5,7,9]};save_result()
def ring_case(name,phase_deg=0,inner_amp=0,outer_amp=0,count=96,gap=10,mesh=.6):
    ro=100;ri=100-gap;setup();circle(ri);circle(ro);gauge(ro);label(0,0,'<No Mesh>');label((ri+ro)/2,1,'Воздух',mesh)
    label(ri+.15,1,'Воздух',.15);label(99.85,1,'Воздух',.15)
    for side,r1,r2,amp,phase in [('Внутренний',ri+.3,ri+.7,inner_amp,phase_deg),('Внешний',99.3,99.7,outer_amp,0)]:
        for k in range(count):
            a=360*k/count;b=360*(k+1)/count;center=(a+b)/2
            # Материалы имеют J в МА/м²; угол сдвига электрический.
            current=amp*math.cos(math.radians(3*center-phase))
            prop=side+' токовый слой '+str(k+1);material(prop,j=current)
            sector(r1,r2,a,b,20 if side=='Внутренний' else 10,.5)
            label((r1+r2)/2,center,prop,.18,20 if side=='Внутренний' else 10)
    r=solve(name,{'family':'ring-torque','inner_amp_MApm2':inner_amp,'outer_amp_MApm2':outer_amp,'phase_electrical_deg':phase_deg,'segments':count,'gap_mm':gap,'conditions':'Кольцевой зазор: rнаруж100мм, глубина100мм, третья пространственная гармоника, заданные токовые слои, линейный воздух; естественные нулевые условия Неймана на поверхностях сердечников.'},(ri+ro)/2)
    r['T_stress_Nm']=ring_torque(r['ring'],(ri+ro)/2,100)
    r['B3_T']=real_spatial_amp(r['ring'],3);save_result();return r

for kind in ['сосредоточенная','полный-шаг','укороченный-шаг']:winding(kind,mesh=.25)
print('WINDING_PRECISION_COMPLETE',len(records))
