"""Согласованное возбуждение A и радиальная многослойная линеаризация."""
exec(open('common.py').read())
TARGET=.5;FREQ=50;ORDER=2
def amp_at(rows):
    a,b=spatial(rows,ORDER);return max(abs((a+1j*b)/2),abs((a-1j*b)/2))

# Нелинейное DCсмещение: азимутально усредненная секущая проницаемость.
opendocument('background.fem');mi_loadsolution();mo_smooth('off');profiles={}
for count in [3,6]:
    values=[]
    for k in range(count):
        radius=60*(k+.5)/count;bs=0;hs=0
        for j in range(72):
            x,y=polar(radius,360*(j+.5)/72);v=mo_getpointvalues(x,y)
            bs+=math.sqrt(scalar(v[1])**2+scalar(v[2])**2);hs+=math.sqrt(scalar(v[5])**2+scalar(v[6])**2)
        values.append({'r_mid_mm':radius,'Bmean_T':bs/72,'Hmean_Apm':hs/72,'mu_sec_r':bs/(MU0*hs)})
    profiles[str(count)]=values
close()
with open('background-profile.json','w')as f:json.dump(profiles,f)

def case(name,layers=None,mu=500,excitation='current',count=96,amplitude=1,mesh=.3):
    setup(FREQ);mi_smartmesh(0)
    if layers is None:layers=[mu]
    for k,mur in enumerate(layers):
        material('Слой стали '+str(k+1),mur,2)
        circle(60*(k+1)/len(layers),1,.6)
        label(60*(k+.5)/len(layers),2,'Слой стали '+str(k+1),mesh,1)
    label(62,1,'Воздух',.35)
    if excitation=='current':
        label(67,1,'Воздух',1);outer(80)
        for k in range(count):
            a=360*k/count;b=360*(k+1)/count;c=math.radians((a+b)/2)
            sinc=math.sin(ORDER*math.pi/count)/(ORDER*math.pi/count)
            prop='Токовый слой '+str(k+1);material(prop,j=amplitude*complex(math.cos(ORDER*c),math.sin(ORDER*c))/sinc)
            sector(64,65,a,b,10,1);label(64.5,(a+b)/2,prop,.35,10)
    else:
        for k in range(count):
            a=360*k/count;b=360*(k+1)/count;c=(a+b)/2
            prop='Потенциал участка '+str(k+1);mi_addboundprop(prop,amplitude,0,0,ORDER*c,0,0,0,0,0)
            arc(64,a,b,10,360/count,prop)
    r=solve(name,{'family':'massive-extension','layers_mu_r':layers,'excitation':excitation,'source_segments':count,'amplitude':amplitude,'frequency_Hz':FREQ,'spatial_order':ORDER,'conditions':'Массивный цилиндрR60мм,L100мм,σ2МСм/м; вращающаяся гармоникаp2,f50Гц. '+('Токовый слой64..65мм.' if excitation=='current'else 'Заданный комплексный Az наокружностиR64мм; кусочно-постоянная фазовая аппроксимация.')+' Проницаемости слоев заданы явно; сравнениеприодинаковойBr1наR60.'},60.001,1,body_groups=[1])
    r['Br_surface_T']=amp_at(r['ring']);r['Pbody_W']=r['bodies']['1']['P_W'];r['T_power_Nm']=-ORDER*r['Pbody_W']/(2*math.pi*FREQ)
    save_result();return r

for labelname,source,count in [('Токовый-слой','current',96),('Потенциал-96','A',96),('Потенциал-192','A',192),('Потенциал-384','A',384)]:
    calibration=case('Возбуждение-'+labelname+'-Калибровка',excitation=source,count=count)
    case('Возбуждение-'+labelname,excitation=source,count=count,amplitude=TARGET/calibration['Br_surface_T'])
for title,layers in [('Однородная-1560',[1560.8338483418977]),('Три-слоя',[v['mu_sec_r']for v in profiles['3']]),('Шесть-слоев',[v['mu_sec_r']for v in profiles['6']])]:
    calibration=case('Слои-'+title+'-Калибровка',layers=layers)
    case('Слои-'+title,layers=layers,amplitude=TARGET/calibration['Br_surface_T'])
print('MASSIVE_EXTENSIONS_COMPLETE',len(records))
