import type { MathNode } from 'mathjs'; import { parse } from './parser.js'; const pairs: ReadonlyArray<{ find: string; mathjs: MathNode; mira: string }> = ( [ [ 'subset', `subset(subset(subset(subset(zeros(6, 6), index([1, 2, 3], [1, 2, 3]), $yp * diag(ones(3))), index([4, 5, 6], [4, 5, 6]), $ys * diag(ones(3))), index([4, 5, 6], [1, 2, 3]), $yc * diag(ones(3))), index([1, 2, 3], [4, 5, 6]), $yc * diag(ones(3)))`, ` let d0 = matrix.diagonal([$yp, $yp, $yp, $ys, $ys, $ys]); let d1 = matrix.diagonal([$yc, $yc, $yc], -3); let d2 = matrix.diagonal([$yc, $yc, $yc], +3); d0::matrix.add(d1)::matrix.add(d2)`, ], ['$.context.p12', '$.context.p12 ? $.context.p12 > 0 : false', '$.context.p12 is > 0'], ['$.context.p12', '$.context.p12 ? $.context.p12 < 0 : false', '$.context.p12 is < 0'], // 长导线校正移到后台处理 [ 'sinh(gamma', `rpl = $R1pu * $Vbase * $Vbase / $Sbase; xpl = $X1pu * $Vbase * $Vbase / $Sbase;bpl = $B1pu / $Vbase / $Vbase * $Sbase; zp = rpl + i * xpl; yp = i * bpl; gamma = sqrt(zp * yp); z = $Length * zp * (gamma == 0 ? 1 : (sinh(gamma * $Length)/(gamma * $Length))); re(z)`, '$R1pu * $Vbase * $Vbase / $Sbase * $Length', ], [ 'sinh(gamma', `rpl = $R1pu * $Vbase * $Vbase / $Sbase; xpl = $X1pu * $Vbase * $Vbase / $Sbase;bpl = $B1pu / $Vbase / $Vbase * $Sbase; zp = rpl + i * xpl; yp = i * bpl; gamma = sqrt(zp * yp); z = $Length * zp * (gamma == 0 ? 1 : (sinh(gamma * $Length)/(gamma * $Length))); im(z)`, '$X1pu * $Vbase * $Vbase / $Sbase * $Length', ], [ 'tanh(gamma', `rpl = $R1pu * $Vbase * $Vbase / $Sbase; xpl = $X1pu * $Vbase * $Vbase / $Sbase;bpl = $B1pu / $Vbase / $Vbase * $Sbase; zp = rpl + i * xpl; yp = i * bpl; gamma = sqrt(zp * yp); y = $Length * yp * (gamma == 0 ? 1 : (tanh(gamma * $Length / 2) / (gamma * $Length / 2))); im(y)`, '$B1pu / $Vbase / $Vbase * $Sbase * $Length', ], [ 'sinh(gamma', `rpl = $R1; xpl = $Xl1; bpl = 1e-6 / $Xc1; zp = rpl + i * xpl; yp = i * bpl; gamma = sqrt(zp * yp); z = $Length * zp * (gamma == 0 ? 1 : (sinh(gamma * $Length)/(gamma * $Length))); re(z)`, '$R1 * $Length', ], [ 'sinh(gamma', `rpl = $R1; xpl = $Xl1; bpl = 1e-6 / $Xc1; zp = rpl + i * xpl; yp = i * bpl; gamma = sqrt(zp * yp); z = $Length * zp * (gamma == 0 ? 1 : (sinh(gamma * $Length)/(gamma * $Length))); im(z)`, '$Xl1 * $Length', ], [ 'tanh(gamma', `rpl = $R1; xpl = $Xl1; bpl = 1e-6 / $Xc1; zp = rpl + i * xpl; yp = i * bpl; gamma = sqrt(zp * yp); y = $Length * yp * (gamma == 0 ? 1 : (tanh(gamma * $Length / 2) / (gamma * $Length / 2))); im(y)`, '1e-6 / $Xc1 * $Length', ], // LCC 模型 [ '$ValveDirection', 'Udc_N=$UdcNMode==0?$Udc_sN*2:$Udc_sN\nIdc_N=$S_N/Udc_N\nUdi0_N=$Uacv_N*3*sqrt(2)/pi\nUdi0=$Uac_N*$Vbus_acpf/$Uact_N*$Uacv_N*3*sqrt(2)/pi\nUdc=abs(Udc_N*$Vbus_dcpf)\nIdc=abs($Pbus_dcpf/Udc)\nIdc=Idc>Idc_N*$IOmax_Ictrl?Idc_N*$IOmax_Ictrl:Idc\nIdc=$VDCL_Eab?(Udc/Udc_N>$Umax_VDCOL?Idc:(Udc/Udc_N>$Umin_VDCOL?((Idc/Idc_N-$Imin_VDCOL)/($Umax_VDCOL-$Umin_VDCOL)*(Udc/Udc_N-$Umin_VDCOL)+$Imin_VDCOL)*Idc_N:$Imin_VDCOL*Idc_N)):Idc\nArec=acos(min(1,(Udc/$Nbridge+$Ut+$Xt_pu/2*Idc/Idc_N*Udi0_N)/Udi0))/pi*180\nBrec=acos(min(1,cos(Arec/180*pi)-$Xt_pu*Idc/Idc_N*Udi0_N/Udi0))/pi*180\nGinv=acos(min(1,(Udc/$Nbridge-$Ut+$Xt_pu/2*Idc/Idc_N*Udi0_N)/Udi0))/pi*180\nBinv=acos(min(1,cos(Ginv/180*pi)-$Xt_pu*Idc/Idc_N*Udi0_N/Udi0))/pi*180\nalpha=$ValveDirection*$OperateMode==1?Arec:180-Binv\nmiu=$ValveDirection*$OperateMode==1?Brec-Arec:Binv-Ginv\ngamma=$ValveDirection*$OperateMode==1?180-Brec:Ginv\n$Nbridge*($ValveDirection*$OperateMode==1?-Udi0*Idc*cos((alpha+0.5*miu)/180*pi)*cos(0.5*miu/180*pi):Udi0*Idc*cos((gamma+0.5*miu)/180*pi)*cos(0.5*miu/180*pi))', `let Udc_N = if $UdcNMode =~ 0 { $Udc_sN * 2 } else { $Udc_sN }; let Idc_N = $S_N / Udc_N; let Udi0_N = $Uacv_N * 3 * sqrt(2) / PI; let Udi0 = $Uac_N * $Vbus_acpf / $Uact_N * $Uacv_N * 3 * sqrt(2) / PI; let Udc = abs(Udc_N * $Vbus_dcpf); let mut Idc = abs($Pbus_dcpf / Udc); Idc = if Idc > Idc_N * $IOmax_Ictrl { Idc_N * $IOmax_Ictrl } else { Idc }; Idc = if $VDCL_Eab=~1 { if Udc / Udc_N > $Umax_VDCOL { Idc } else if Udc / Udc_N > $Umin_VDCOL { ((Idc / Idc_N - $Imin_VDCOL) / ($Umax_VDCOL - $Umin_VDCOL) * (Udc / Udc_N - $Umin_VDCOL) + $Imin_VDCOL) * Idc_N } else { $Imin_VDCOL * Idc_N } } else { Idc }; let Arec = acos(min(1, (Udc / $Nbridge + $Ut + $Xt_pu / 2 * Idc / Idc_N * Udi0_N) / Udi0)) / PI * 180; let Brec = acos(min(1, cos(Arec / 180 * PI) - $Xt_pu * Idc / Idc_N * Udi0_N / Udi0)) / PI * 180; let Ginv = acos(min(1, (Udc / $Nbridge - $Ut + $Xt_pu / 2 * Idc / Idc_N * Udi0_N) / Udi0)) / PI * 180; let Binv = acos(min(1, cos(Ginv / 180 * PI) - $Xt_pu * Idc / Idc_N * Udi0_N / Udi0)) / PI * 180; let alpha = if $ValveDirection * $OperateMode =~ 1 { Arec } else { 180 - Binv }; let miu = if $ValveDirection * $OperateMode =~ 1 { Brec - Arec } else { Binv - Ginv }; let gamma = if $ValveDirection * $OperateMode =~ 1 { 180 - Brec } else { Ginv }; let Pconv=$Nbridge * (if $ValveDirection * $OperateMode =~ 1 { -Udi0 * Idc * cos((alpha + 0.5 * miu) / 180 * PI) * cos(0.5 * miu / 180 * PI) } else { Udi0 * Idc * cos((gamma + 0.5 * miu) / 180 * PI) * cos(0.5 * miu / 180 * PI) }); return Pconv; `, ], [ '$ValveDirection', 'Udc_N=$UdcNMode==0?$Udc_sN*2:$Udc_sN\nIdc_N=$S_N/Udc_N\nUdi0_N=$Uacv_N*3*sqrt(2)/pi\nUdi0=$Uac_N*$Vbus_acpf/$Uact_N*$Uacv_N*3*sqrt(2)/pi\nUdc=abs(Udc_N*$Vbus_dcpf)\nIdc=abs($Pbus_dcpf/Udc)\nIdc=Idc>Idc_N*$IOmax_Ictrl?Idc_N*$IOmax_Ictrl:Idc\nIdc=$VDCL_Eab?(Udc/Udc_N>$Umax_VDCOL?Idc:(Udc/Udc_N>$Umin_VDCOL?((Idc/Idc_N-$Imin_VDCOL)/($Umax_VDCOL-$Umin_VDCOL)*(Udc/Udc_N-$Umin_VDCOL)+$Imin_VDCOL)*Idc_N:$Imin_VDCOL*Idc_N)):Idc\nArec=acos(min(1,(Udc/$Nbridge+$Ut+$Xt_pu/2*Idc/Idc_N*Udi0_N)/Udi0))/pi*180\nBrec=acos(min(1,cos(Arec/180*pi)-$Xt_pu*Idc/Idc_N*Udi0_N/Udi0))/pi*180\nGinv=acos(min(1,(Udc/$Nbridge-$Ut+$Xt_pu/2*Idc/Idc_N*Udi0_N)/Udi0))/pi*180\nBinv=acos(min(1,cos(Ginv/180*pi)-$Xt_pu*Idc/Idc_N*Udi0_N/Udi0))/pi*180\nalpha=$ValveDirection*$OperateMode==1?Arec:180-Binv\nmiu=$ValveDirection*$OperateMode==1?Brec-Arec:Binv-Ginv\ngamma=$ValveDirection*$OperateMode==1?180-Brec:Ginv\n$Nbridge*($ValveDirection*$OperateMode==1?-Udi0*Idc*(2*miu/180*pi+sin(2*alpha/180*pi)-sin((2*alpha+2*miu)/180*pi))/4/(cos(alpha/180*pi)-cos((alpha+miu)/180*pi)):-Udi0*Idc*(2*miu/180*pi+sin(2*gamma/180*pi)-sin((2*gamma+2*miu)/180*pi))/4/(cos(gamma/180*pi)-cos((gamma+miu)/180*pi)))', `let Udc_N = if $UdcNMode =~ 0 { $Udc_sN * 2 } else { $Udc_sN }; let Idc_N = $S_N / Udc_N; let Udi0_N = $Uacv_N * 3 * sqrt(2) / PI; let Udi0 = $Uac_N * $Vbus_acpf / $Uact_N * $Uacv_N * 3 * sqrt(2) / PI; let Udc = abs(Udc_N * $Vbus_dcpf); let mut Idc = abs($Pbus_dcpf / Udc); Idc = if Idc > Idc_N * $IOmax_Ictrl { Idc_N * $IOmax_Ictrl } else { Idc }; Idc = if $VDCL_Eab=~1 { if Udc / Udc_N > $Umax_VDCOL { Idc } else if Udc / Udc_N > $Umin_VDCOL { ((Idc / Idc_N - $Imin_VDCOL) / ($Umax_VDCOL - $Umin_VDCOL) * (Udc / Udc_N - $Umin_VDCOL) + $Imin_VDCOL) * Idc_N } else { $Imin_VDCOL * Idc_N } } else { Idc }; let Arec = acos(min(1, (Udc / $Nbridge + $Ut + $Xt_pu / 2 * Idc / Idc_N * Udi0_N) / Udi0)) / PI * 180; let Brec = acos(min(1, cos(Arec / 180 * PI) - $Xt_pu * Idc / Idc_N * Udi0_N / Udi0)) / PI * 180; let Ginv = acos(min(1, (Udc / $Nbridge - $Ut + $Xt_pu / 2 * Idc / Idc_N * Udi0_N) / Udi0)) / PI * 180; let Binv = acos(min(1, cos(Ginv / 180 * PI) - $Xt_pu * Idc / Idc_N * Udi0_N / Udi0)) / PI * 180; let alpha = if $ValveDirection * $OperateMode =~ 1 { Arec } else { 180 - Binv }; let miu = if $ValveDirection * $OperateMode =~ 1 { Brec - Arec } else { Binv - Ginv }; let gamma = if $ValveDirection * $OperateMode =~ 1 { 180 - Brec } else { Ginv }; let Qconv=$Nbridge * (if $ValveDirection * $OperateMode =~ 1 { -Udi0 * Idc * (2 * miu / 180 * PI + sin(2 * alpha / 180 * PI) - sin((2 * alpha + 2 * miu) / 180 * PI)) / 4 / (cos(alpha / 180 * PI) - cos((alpha + miu) / 180 * PI)) } else { -Udi0 * Idc * (2 * miu / 180 * PI + sin(2 * gamma / 180 * PI) - sin((2 * gamma + 2 * miu) / 180 * PI)) / 4 / (cos(gamma / 180 * PI) - cos((gamma + miu) / 180 * PI)) }); return Qconv; `, ], [ '$ValveDirection', 'abs(-$Pbus_acpf/(1+$Nbridge*($ValveDirection * $OperateMode)*$Ut/($UdcNMode =~ 0?($Udc_sN * 2):$Udc_sN)/$Vbus_dcpf)/$S_N/$Vbus_dcpf)', `abs(-$Pbus_acpf/(1+$Nbridge*($ValveDirection * $OperateMode)*$Ut/(if $UdcNMode =~ 0 { $Udc_sN * 2 } else { $Udc_sN })/$Vbus_dcpf)/$S_N/$Vbus_dcpf)`, ], [ '$ValveDirection', '-$Pbus_acpf/(1+$Nbridge*($ValveDirection * $OperateMode)*$Ut/($UdcNMode =~ 0?($Udc_sN * 2):$Udc_sN)/$Vbus_dcpf)/$S_N', `-$Pbus_acpf/(1+$Nbridge*($ValveDirection * $OperateMode)*$Ut/(if $UdcNMode =~ 0 { $Udc_sN * 2 } else { $Udc_sN })/$Vbus_dcpf)/$S_N`, ], ] satisfies ReadonlyArray<[find: string, mathjs: string, mira: string]> ).map(([find, mathjs, mira]) => ({ find, mathjs: parse(mathjs), mira: mira.trimStart().replaceAll(/^\s+/gm, ''), })); /** 特殊转换逻辑 */ export function specialMigrate(expression: string, node: MathNode): string | undefined { for (const pair of pairs) { if (expression.includes(pair.find) && pair.mathjs.equals(node)) { return pair.mira; } } return undefined; }