"""Плоское периодическое приближение кольцевого зазора."""
exec(open('common.py').read())
source=json.load(open('ring-source.json'))['records'];ref={r['id']:r for r in source}
AI=ref['Кольцо-Угол-90']['inner_amp_MApm2'];AO=ref['Кольцо-Угол-90']['outer_amp_MApm2']
seen_nodes={};seen_lines={}
def xy_node(x,y):
    key=(round(x,9),round(y,9))
    if key not in seen_nodes:mi_addnode(x,y);seen_nodes[key]=True
def xy_line(x1,y1,x2,y2,boundary='<None>'):
    key=tuple(sorted([(round(x1,9),round(y1,9)),(round(x2,9),round(y2,9))]))
    if key in seen_lines:return
    seen_lines[key]=True;xy_node(x1,y1);xy_node(x2,y2);mi_addsegment(x1,y1,x2,y2)
    mi_selectsegment((x1+x2)/2,(y1+y2)/2);mi_setsegmentprop(boundary,0,1,0,0);mi_clearselected()
def xy_label(x,y,name,mesh):
    mi_addblocklabel(x,y);mi_selectlabel(x,y);mi_setblockprop(name,0,mesh,'<None>',0,0,1);mi_clearselected()
def rectangle(x1,x2,y1,y2):
    xy_line(x1,y1,x2,y1);xy_line(x2,y1,x2,y2);xy_line(x2,y2,x1,y2);xy_line(x1,y2,x1,y1)
def case(gap=10,count=32,mesh=.6):
    global seen_nodes,seen_lines
    seen_nodes={};seen_lines={};setup();mi_smartmesh(0);radius=100-gap/2;period=2*math.pi*radius/3
    xs=[0,.3,.7,gap-.7,gap-.3,gap]
    for k in range(5):
        prop='Периодическая пара '+str(k+1);mi_addboundprop(prop,0,0,0,0,0,0,0,0,4)
        xy_line(xs[k],0,xs[k+1],0,prop);xy_line(xs[k],period,xs[k+1],period,prop)
    xy_line(0,0,0,period);xy_line(gap,0,gap,period)
    xy_label(.15,period*.51,'Воздух',.15);xy_label(gap/2,period*.51,'Воздух',mesh);xy_label(gap-.15,period*.51,'Воздух',.15)
    for side,x1,x2,amp,phase in [('Внутренний',.3,.7,AI,90),('Внешний',gap-.7,gap-.3,AO,0)]:
        for k in range(count):
            y1=period*k/count;y2=period*(k+1)/count;j=amp*math.cos(2*math.pi*(k+.5)/count-math.radians(phase))
            prop=side+' токовый участок '+str(k+1);material(prop,j=j);rectangle(x1,x2,y1,y2);xy_label((x1+x2)/2,(y1+y2)/2,prop,.18)
    mi_addpointprop('Опорный потенциал',0,0);mi_selectnode(0,0);mi_setnodeprop('Опорный потенциал',0);mi_clearselected()
    name='Плоский-зазор-'+str(gap)+'-Участки-'+str(count)
    r=solve(name,{'family':'planar-ring','gap_mm':gap,'radius_mean_mm':radius,'period_mm':period,'segments_per_period':count,'conditions':'Плоский периодический зазор:толщина'+str(gap)+'мм,период'+str(period)+'мм,длина100мм;третья гармоника кругового эквивалента. Токи и радиальные толщины слоев совпадают с кольцевым опытом;боковые границы периодические,наповерхностях естественные условияНеймана.'})
    opendocument(name+'.fem');mi_loadsolution();mo_smooth('off');value=0;profile=[]
    for k in range(512):
        y=period*(k+.5)/512;v=mo_getpointvalues(gap/2,y);bx=scalar(v[1]);by=scalar(v[2]);value+=bx*by;profile.append([y,bx,by])
    r['profile']=profile;r['T_equivalent_Nm']=2*math.pi*(radius*.001)**2*.1*value/512/MU0;close();save_result()
for gap in [10,8]:
    case(gap,32,.6);case(gap,64,.35)
print('PLANAR_RING_COMPLETE',len(records))
