"""Разностное поле зубчатого статора и оценка потерь его гармоник."""
exec(open('common.py').read())

def harmonic(rows,n):
    a,b=spatial(rows,n);return a+1j*b
def stator_geometry(slotted):
    if not slotted:circle(63,3,.6)
    else:
        for k in range(36):
            c=5+10*k;arc(63,c-8.8,c-1.2,3,.6)
            line(63,c-1.2,66,c-1.2,3);line(66,c-1.2,69,c-2.5,3);line(69,c-2.5,78,c-2.5,3);arc(78,c-2.5,c+2.5,3)
            line(78,c+2.5,69,c+2.5,3);line(69,c+2.5,66,c+1.2,3);line(66,c+1.2,63,c+1.2,3)
    circle(90,3);label(83,0,'Статор линейный',1,3)
def source_field(name,slotted=False,amplitude=1):
    setup();mi_smartmesh(0);material('Массивная сталь',500,2);material('Статор линейный',10000)
    circle(60,1,.6);label(0,0,'Массивная сталь',1,1);stator_geometry(slotted);outer(100)
    label(60.15,1,'Воздух',.12);label(61.5,1,'Воздух',.3)
    for k in range(192):
        a=360*k/192;b=360*(k+1)/192;t=math.radians((a+b)/2)
        prop='МДС ротора '+str(k+1);material(prop,j=amplitude*math.cos(2*t));sector(60.3,60.7,a,b,10,.8);label(60.5,(a+b)/2,prop,.15,10)
    r=solve(name,{'family':'difference-field','slotted':slotted,'source_amplitude_MApm2':amplitude,'conditions':'Четырехполюсная МДС ротора;массивный цилиндрR60мм,μr500;статорR63..90мм,μr10000;глубина100мм,статика. '+('36пазов,раскрытие2.4градуса.' if slotted else 'Гладкая расточка.')+' При сравнении токи и все материалы одинаковы.'},60.001)
    r['B2_T']=abs(harmonic(r['ring'],2));save_result();return r
cal=source_field('Разность-Калибровка');amp=.8/cal['B2_T']
smooth=source_field('Разность-Гладкий',False,amp);slotted=source_field('Разность-Пазовый',True,amp)
delta=[]
for a,b in zip(slotted['ring'],smooth['ring']):delta.append([[a[0][0]-b[0][0],0],[a[1][0]-b[1][0],0]])
targets={str(n):pair(harmonic(delta,n))for n in[2,34,38]}
with open('difference-spectrum.json','w')as f:json.dump({'slots':36,'p':2,'speed_rpm':1500,'r_sample_mm':60.001,'delta_Br_T':delta,'harmonics_peak_T':targets,'frequency_pair_Hz':900},f)

def loss_case(name,frequency,components,skinmesh=.075):
    setup(frequency);mi_smartmesh(0);material('Массивная сталь',500,2)
    circle(58,1,.6);circle(60,1,.4);label(0,0,'Массивная сталь',1.5,1);label(59,1,'Массивная сталь',skinmesh,1)
    label(62,1,'Воздух',.3);label(67,1,'Воздух',1);outer(80)
    for k in range(384):
        a=360*k/384;b=360*(k+1)/384;t=math.radians((a+b)/2);j=0j
        for order,coefficient in components:
            sinc=math.sin(order*math.pi/384)/(order*math.pi/384);z=coefficient*complex(math.cos(order*t),math.sin(order*t))/sinc
            j+=z.real if frequency==0 else z
        prop='Гармонический слой '+str(k+1);material(prop,j=j);sector(64,65,a,b,10,.6);label(64.5,(a+b)/2,prop,.3,10)
    r=solve(name,{'family':'difference-loss','frequency_Hz':frequency,'components':[[h,pair(c)]for h,c in components],'skin_mesh_mm':skinmesh,'conditions':'Оценочная цилиндрическая модельR60мм,L100мм,μr500,σ2МСм/м. Амплитуды эквивалентной МДС найдены по DCразностному полю пазового/гладкого статора;наACони сохраняются. '+('Статическая калибровка.' if frequency==0 else 'Относительная частота900Гц,сопряженныепорядки34и38;торцевыеэффектыисключены.')},60.001,1,body_groups=[1])
    r['harmonic_Br_T']={str(h):pair(harmonic(r['ring'],h))for h,c in components};r['Pbody_W']=r['bodies']['1']['P_W'];save_result();return r
coeff=[]
for order in[34,38]:
    r=loss_case('Разность-Калибровка-'+str(order),0,[(order,1)])
    c=complex(*targets[str(order)])/complex(*r['harmonic_Br_T'][str(order)]);coeff.append((order,c))
    loss_case('Разность-Потери-'+str(order),900,[(order,c)])
loss_case('Разность-Потери-вместе',900,coeff)
loss_case('Разность-Потери-сетка',900,coeff,.05)
print('DIFFERENCE_LOSSES_COMPLETE',len(records))
