"""Занятия 1–4: паспортная арифметика и контроль нормировки, без полевого решателя.

Задайте TVV_ROOT (абсолютный каталог этого комплекта) во встроенном Python FEMM.
Результаты печатаются в консоли; это не рассчитанные характеристики машины.
"""
import sys, json, math
ROOT=globals().get('TVV_ROOT','')
if not ROOT:raise ValueError('Задайте TVV_ROOT')
if ROOT not in sys.path:sys.path.insert(0,ROOT)
from physics import abc_to_dq0, dq0_to_abc, power_dq0, winding_factor
from numerics import solve_linear, rk4
with open(ROOT+'/machine.json') as file:machine=json.loads(file.read())
with open(ROOT+'/winding.json') as file:winding=json.loads(file.read())['rows']
nameplate=machine['nameplate'];u=1000*nameplate['U_kV'];s=1e6*nameplate['S_MVA']
omega=2*math.pi*machine['meta']['frequency_Hz'];base_current=s/(math.sqrt(3)*u)
phase=[math.sqrt(2)*base_current,-base_current/math.sqrt(2),-base_current/math.sqrt(2)]
dq=abc_to_dq0(phase,0);back=dq0_to_abc(dq,0)
result={'label':'Расчёт из паспортных величин; не FEMM-характеристика',
    'phase_voltage_rms_V':u/math.sqrt(3),'current_base_rms_A':base_current,
    'angular_speed_rad_s':omega,'impedance_base_ohm':u*u/s,
    'inductance_base_H':u*u/s/omega,'power_equivalent_torque_Nm':1e6*nameplate['P_MW']/omega,
    'coil_pitch_electrical_deg':360*22/54,'slots_per_pole_phase':54/(2*3),
    'winding_factors':winding_factor(winding,54,22),'phase_current_instant_A':phase,'dq0_current_A':dq,
    'park_roundtrip_error_A':max(abs(phase[k]-back[k]) for k in range(3)),
    'linear_solver_check':solve_linear([[2,1],[1,3]],[4,7]),
    'integration_software_check':rk4(lambda t,y:[-y[0]],0,[1],.1)}
assert result['park_roundtrip_error_A']<1e-8
assert abs(result['linear_solver_check'][0]-1)<1e-12
assert abs(result['linear_solver_check'][1]-2)<1e-12
print(json.dumps(result))
