From b2be2b8066d50ef3df7f8ad9f7525cf318b909cf Mon Sep 17 00:00:00 2001 From: Ali Hamdan Date: Fri, 29 Nov 2024 16:49:42 +0100 Subject: [PATCH] Add more vector groups and more transformers to the catalogue (#289) - Change the `type` parameter of `TransformerParameters` to `vg` to allow vector groups for single-phase and center-tapped transformers - Add 15kV transformers to the catalogue (SE and FT) - Add single-phase transformers to the catalogue (Schneider Imprego) - Add step-up transformers to the catalogue (Cahors "Serie Jaune") - Modify the names of the transformers in the catalogue to add voltage levels and vector groups - Use the correct LV side no-load voltage as defined in the datasheets (some 400V became 410V) --- doc/Changelog.md | 15 + ...3_03_30_Fiche_Technique_France_Transfo.pdf | Bin ..._31_Fiche_Technique_Schneider_Electric.pdf | Bin ...3_18_Minera-EcoDesign2021-20kV_ZZ6921.pdf} | Bin ...3_18_Trihal-EcoDesign2021-20kV_ZZ6925.pdf} | Bin ...3_18_Vegeta-EcoDesign2021-20kV_ZZ6924.pdf} | Bin ...25_FRAED215018FR-Distribution-HTA-2023.pdf | Bin 0 -> 133 bytes ...25_Schneider Electric_BC-Imprego_84408.pdf | Bin 0 -> 131 bytes ...25_Schneider Electric_BC-Imprego_84410.pdf | Bin 0 -> 131 bytes ...apitre_transformateurs_prives_0-cahors.pdf | Bin 0 -> 133 bytes ...triphase-schneider-imprego-84243-bt-bt.jpg | Bin 0 -> 84653 bytes doc/advanced/Potential_Reference.md | 6 +- .../Transformer/Center_Tapped_Transformer.md | 68 +- .../Transformer/Single_Phase_Transformer.md | 6 +- .../Transformer/Three_Phase_Transformer.md | 8 +- doc/models/Transformer/index.md | 91 +-- doc/usage/Catalogues.md | 393 ++++++----- doc/usage/Flexible_Loads.md | 6 +- pyproject.toml | 1 - .../data/networks/LVFeeder00939_Summer.json | 6 +- .../data/networks/LVFeeder00939_Winter.json | 6 +- .../data/networks/LVFeeder02639_Summer.json | 6 +- .../data/networks/LVFeeder02639_Winter.json | 6 +- .../data/networks/LVFeeder04790_Summer.json | 6 +- .../data/networks/LVFeeder04790_Winter.json | 6 +- .../data/networks/LVFeeder06713_Summer.json | 6 +- .../data/networks/LVFeeder06713_Winter.json | 6 +- .../data/networks/LVFeeder06926_Summer.json | 6 +- .../data/networks/LVFeeder06926_Winter.json | 6 +- .../data/networks/LVFeeder06975_Summer.json | 6 +- .../data/networks/LVFeeder06975_Winter.json | 6 +- .../data/networks/LVFeeder18498_Summer.json | 6 +- .../data/networks/LVFeeder18498_Winter.json | 6 +- .../data/networks/LVFeeder18769_Summer.json | 6 +- .../data/networks/LVFeeder18769_Winter.json | 6 +- .../data/networks/LVFeeder19558_Summer.json | 6 +- .../data/networks/LVFeeder19558_Winter.json | 6 +- .../data/networks/LVFeeder20256_Summer.json | 6 +- .../data/networks/LVFeeder20256_Winter.json | 6 +- .../data/networks/LVFeeder23832_Summer.json | 6 +- .../data/networks/LVFeeder23832_Winter.json | 6 +- .../data/networks/LVFeeder24400_Summer.json | 6 +- .../data/networks/LVFeeder24400_Winter.json | 6 +- .../data/networks/LVFeeder27429_Summer.json | 6 +- .../data/networks/LVFeeder27429_Winter.json | 6 +- .../data/networks/LVFeeder27681_Summer.json | 6 +- .../data/networks/LVFeeder27681_Winter.json | 6 +- .../data/networks/LVFeeder30216_Summer.json | 6 +- .../data/networks/LVFeeder30216_Winter.json | 6 +- .../data/networks/LVFeeder31441_Summer.json | 6 +- .../data/networks/LVFeeder31441_Winter.json | 6 +- .../data/networks/LVFeeder36284_Summer.json | 6 +- .../data/networks/LVFeeder36284_Winter.json | 6 +- .../data/networks/LVFeeder36360_Summer.json | 6 +- .../data/networks/LVFeeder36360_Winter.json | 6 +- .../data/networks/LVFeeder37263_Summer.json | 6 +- .../data/networks/LVFeeder37263_Winter.json | 6 +- .../data/networks/LVFeeder38211_Summer.json | 6 +- .../data/networks/LVFeeder38211_Winter.json | 6 +- .../load_flow/data/transformers/Catalogue.csv | 473 ++++++++----- roseau/load_flow/exceptions.py | 4 +- roseau/load_flow/io/dgs/transformers.py | 10 +- roseau/load_flow/io/dict.py | 24 +- roseau/load_flow/io/tests/test_dict.py | 128 ++-- roseau/load_flow/models/lines/lines.py | 3 +- roseau/load_flow/models/tests/test_buses.py | 4 +- .../models/tests/test_line_parameters.py | 34 +- roseau/load_flow/models/tests/test_lines.py | 72 +- roseau/load_flow/models/tests/test_phases.py | 6 +- .../tests/test_transformer_parameters.py | 324 +++++---- .../models/tests/test_transformers.py | 35 +- .../models/transformers/parameters.py | 646 +++++++++++------- .../models/transformers/transformers.py | 85 +-- roseau/load_flow/network.py | 2 +- .../data/networks/all_element_network.json | 6 +- .../tests/test_electrical_network.py | 8 +- roseau/load_flow/utils/_doc_utils.py | 72 ++ roseau/load_flow/utils/_versions.py | 1 - roseau/load_flow/utils/mixins.py | 2 +- roseau/load_flow/utils/tests/test_versions.py | 2 +- scripts/generate_test_networks.py | 2 +- ...nerate_transformer_parameters_catalogue.py | 8 +- uv.lock | 71 -- 83 files changed, 1618 insertions(+), 1238 deletions(-) rename doc/_static/Transformer/{ => References}/2023_03_30_Fiche_Technique_France_Transfo.pdf (100%) rename doc/_static/Transformer/{ => References}/2023_03_31_Fiche_Technique_Schneider_Electric.pdf (100%) rename doc/_static/Transformer/{Minera-EcoDesign2021-20kV_ZZ6921.pdf => References/2024_03_18_Minera-EcoDesign2021-20kV_ZZ6921.pdf} (100%) rename doc/_static/Transformer/{Trihal-EcoDesign2021-20kV_ZZ6925.pdf => References/2024_03_18_Trihal-EcoDesign2021-20kV_ZZ6925.pdf} (100%) rename doc/_static/Transformer/{Vegeta-EcoDesign2021-20kV_ZZ6924.pdf => References/2024_03_18_Vegeta-EcoDesign2021-20kV_ZZ6924.pdf} (100%) create mode 100644 doc/_static/Transformer/References/2024_11_25_FRAED215018FR-Distribution-HTA-2023.pdf create mode 100644 doc/_static/Transformer/References/2024_11_25_Schneider Electric_BC-Imprego_84408.pdf create mode 100644 doc/_static/Transformer/References/2024_11_25_Schneider Electric_BC-Imprego_84410.pdf create mode 100644 doc/_static/Transformer/References/2024_11_25_chapitre_transformateurs_prives_0-cahors.pdf create mode 100644 doc/_static/Transformer/References/2024_11_25_transformateur-triphase-schneider-imprego-84243-bt-bt.jpg create mode 100644 roseau/load_flow/utils/_doc_utils.py diff --git a/doc/Changelog.md b/doc/Changelog.md index 1b2efc37..c7cc6a40 100644 --- a/doc/Changelog.md +++ b/doc/Changelog.md @@ -19,6 +19,21 @@ og:description: See what's new in the latest release of Roseau Load Flow ! ## Unreleased +- {gh-pr}`289` Improve the `TransformerParameters` class and the transformers catalogue + + - Add 15kV transformers to the catalogue (SE and FT) + - Add single-phase transformers to the catalogue (Schneider Imprego) + - Add step-up transformers to the catalogue (Cahors "Serie Jaune") + - Use the correct LV side no-load voltage as defined in the datasheets (some 400V became 410V) + - Revert {gh-pr}`282` to keep the IEC 600076 names `uhv` and `ulv` for the transformer voltages. + + **BREAKING CHANGES**: + + - Replace the `type` parameter of `TransformerParameters` constructors by `vg` for vector group. + - `TransformerParameters.type` now returns `three-phase`, `single-phase` or `center-tapped`. Use + `TransformerParameters.vg` to get vector group. + - Modify the names of the transformers in the catalogue to add voltage levels and vector groups + - {gh-pr}`285` {gh-issue}`279` **BREAKING CHANGE**: Add limits on assets. It is now possible to define a maximum loading for lines and transformers. It generates some indirect consequences: diff --git a/doc/_static/Transformer/2023_03_30_Fiche_Technique_France_Transfo.pdf b/doc/_static/Transformer/References/2023_03_30_Fiche_Technique_France_Transfo.pdf similarity index 100% rename from doc/_static/Transformer/2023_03_30_Fiche_Technique_France_Transfo.pdf rename to doc/_static/Transformer/References/2023_03_30_Fiche_Technique_France_Transfo.pdf diff --git a/doc/_static/Transformer/2023_03_31_Fiche_Technique_Schneider_Electric.pdf b/doc/_static/Transformer/References/2023_03_31_Fiche_Technique_Schneider_Electric.pdf similarity index 100% rename from doc/_static/Transformer/2023_03_31_Fiche_Technique_Schneider_Electric.pdf rename to doc/_static/Transformer/References/2023_03_31_Fiche_Technique_Schneider_Electric.pdf diff --git a/doc/_static/Transformer/Minera-EcoDesign2021-20kV_ZZ6921.pdf b/doc/_static/Transformer/References/2024_03_18_Minera-EcoDesign2021-20kV_ZZ6921.pdf similarity index 100% rename from doc/_static/Transformer/Minera-EcoDesign2021-20kV_ZZ6921.pdf rename to doc/_static/Transformer/References/2024_03_18_Minera-EcoDesign2021-20kV_ZZ6921.pdf diff --git a/doc/_static/Transformer/Trihal-EcoDesign2021-20kV_ZZ6925.pdf b/doc/_static/Transformer/References/2024_03_18_Trihal-EcoDesign2021-20kV_ZZ6925.pdf similarity index 100% rename from doc/_static/Transformer/Trihal-EcoDesign2021-20kV_ZZ6925.pdf rename to doc/_static/Transformer/References/2024_03_18_Trihal-EcoDesign2021-20kV_ZZ6925.pdf diff --git a/doc/_static/Transformer/Vegeta-EcoDesign2021-20kV_ZZ6924.pdf b/doc/_static/Transformer/References/2024_03_18_Vegeta-EcoDesign2021-20kV_ZZ6924.pdf similarity index 100% rename from doc/_static/Transformer/Vegeta-EcoDesign2021-20kV_ZZ6924.pdf rename to doc/_static/Transformer/References/2024_03_18_Vegeta-EcoDesign2021-20kV_ZZ6924.pdf diff --git a/doc/_static/Transformer/References/2024_11_25_FRAED215018FR-Distribution-HTA-2023.pdf b/doc/_static/Transformer/References/2024_11_25_FRAED215018FR-Distribution-HTA-2023.pdf new file mode 100644 index 0000000000000000000000000000000000000000..fe7adc7248653b216c053f24b2948dc3af797520 GIT binary patch literal 133 zcmWN?%MrpL5CG6SRnUN8m)}CVA+QKDDjC5XtX|*cUHqPXykuMJoV!x@zHW~?xBu;P zY!5CFhCuiyiQVV#iQuna<#O3J|;e7*LiFM9KsFWJ{R`B3UU*6q=F``I1LV~frvZ#1i7_T5=Cn@A-TLa4JHJ{P`xbx$povb$6Ol5 NR0WSON#j9VD}Dx4Cy4+6 literal 0 HcmV?d00001 diff --git a/doc/_static/Transformer/References/2024_11_25_Schneider Electric_BC-Imprego_84410.pdf b/doc/_static/Transformer/References/2024_11_25_Schneider Electric_BC-Imprego_84410.pdf new file mode 100644 index 0000000000000000000000000000000000000000..89c66f5155c239761c3257e88d415903db1c04c9 GIT binary patch literal 131 zcmWN{OA>=13;@tQr{Dq=f&@ReNdi=6+Tt|oqNlH`w|Q6jYU>}n9mlS#bI*1>UR8(N z?c_oF+v#4!U0{04RyPWm)-2>h7)1mlOdc~8_6P*y6f;tsc}YChC6n+35g-K28{qLW$ z)%jF>QdO4`bD-p&?H&#)n6lNT7_y@Xp zdh$t%%Seh#DF6V(0OEYAe`xqf2$KHwJms%2Lc3a_I&|~*_f?jV@P>*zI{Q3z5qI+O zl7Kn-N=S)IN&r+rFkeR}4;O#Fr!KBwZ#Dk?mUezVu(KM!rJSLpp|6&U8(1&c&&530 z=%G`vhm(>sKS-TV6{ZaH^7V4@cjSY4d3r;YVQT#U2v;VY|Gh22&-V|BzlR$CV?z@@ zEgwG@K3Q>DaY-=(^ykw21Q~wL&y>yX>HMn%!j&5TznU5t7$_bnBktqpDj}t$q$D9J zEg>x}MxYRb26_8C!o<9x0{>N<9lE)7jGy*uNuFiq$EGze{?a{;@$5v=|XVq-tB3jyk1SZe%I{1OCzN&KtB{+|B3 z|JC{ayZyHZ{@Vlp?ScRHz<+z-zdi8(KM(vz1n1&S2-^Y)@!8cJKnp-ZO#JspXrzQ6 z86_DRDJj`C3JP*cnrk#P)Yqt~Y3Ug0Y3Uf~sHy2$=^2=qSy)(TfNbon%^aT3{@u~4CNnQh7bpRMBiBd@TNQn3W#0*3v3`AGm0A50v zOh)ui`a7|1=NKQdXb&Z-pP)`paCL$prCMEfcna~?X=m(H8kTKqn(j;dxb)?{j zFiS_KexMY%TieNEHii+DdFmHMb&ZvcorCk{Euq`OcVy+{6%>_}weD%_=<4Ykm_K}E zVfpxpm6Nl}GgmjTJJdhmc_1t(IQm6QY~0KEgtYY6Z!+FyzRUVpP*_x4Qd(C2`Ac2> z*M`QX=5JlyJ-vPX1B2relT*_(KYz`xpwO$o*VZ>Sx3GT>4v&scaHnT~aS;JX{sk7{ z|GyynpKvh{a1oP|l8{pT#YIFM_!l?>DcKDvaz;&43P%VNzjP!e^WD@BwVhM~GG-W- zr+#DCSOsNQZessJ`v=+o8L+7TPssiq*ni-f1<;TX5gr~10{{d#%XC%E=2=dloAM4f z3q}_`obpMEN&Hf}>Pw{RS`U%-Q1Fv-g5G`_H2Yh3(?WmaiHWXJ$kW#jNsS$6Gr8P$ zo1MS_6`tQkPM6@ghfPAf;P=%RM?To%H+=!M8=ZgjM8l+mCoEM4P9yeO+HB5H$ldyo z^vL6Q?1nQ4Z7}lJWlO|6F5n5mg0X;R7bUYyT4ceSV4pnp4Xw|GwC)evetXf;2oct-LCJKp8 z44!yhL&}txydvmqnRz{mA{@kJcG`_7*~}89C`oPDr!NZAzMiSuNRMrR8~nivFE2ar zOv*+p^{@g3CYgj3uK*VCSLE*+*=B>hf9=~jt(6V%xy~@7ObAcCSCLyd;gVyEB46vx z9`m!*$rL|5ZrtWkwfOvp=P7g{P6=+#Lbv1;(M2RpTPkD04FV-Y)9FLWppZ4y6p!zp zi%v~Dx3pD)qtqW=lsyhq)B5q~0b4iR4y5cpugy2h>pLvX4zY8v)zy$XEP&1G5ZOO4 zb!gh$meu9cOAL1A-MoLCX#*A1#gme&*Z=OpNCG;Jix|nbkY{6#xw$j+0x<_B3J$}d zqT9_ce}_&9G>QXPJ-)yAb!Otsz8v`Ro0{t4Jv!A@QN@)$-1ub`Z>H>+@b)B)<=cI9 z{@K|C^>T{ttyeThpt{bPp%*}VDY!Dvp9KwC{)S>b6td=rpVX;|^LC1)+h^_(vvX&5 z-nN%aqioF7pB$4HwR5|EkRw0+P(AGXkU!8@v-XN^yW%kqm($RL zE5MAVozXKsr_?<+CdBO;o1^5fvoWV7Nfb_vP6tIEjauj-!^N0b+8_}lT_1d_v5z#nEvqCu+UoeLp?GHA$ZX z&>RtVu$XgPdOcd%o21O8@1R;hI)&;2{Bb!ub^0yeX|nZsKr_Od-*)~AP-zA~TT0TK znf@b1EgQrwz3jR@6h!HJj_#P;Rf!r2^m#${I-4mfRMpgc$)vFsJs2uR=lL&)i}vw(LPnP{LBcDcdy zX4xrAiM}ay+qiTVLp#*s9Kcux8cx}gul<}JKuPg|4tP{8bnr8IQ-3`@A+%H}`H6B- zzHj)9x3Te2Iq)Fg-6DZbLhL6UWc>sF88XM4l6`+)@0pr1gYF$R6*Y&g3{kqd{%dsM zu8)K;Be-!|i|@R0ziW7pri}k65d_EcR`O--Y3Pq5iy7I2H1Cxo6}uEzv{6UTss>LJe8XFX(_jS#_NOpf{CMv#{G+u> zDUK~+(iaFtg3Nch8H*z0z7W5j5VEAW-#wDJ>Ian8Ltb6^KmFjG2T)<9)!mYcIM8LV zh31c7K5T4WdMY2uWiq~1;^O9Pc(~aL3{Qh^s#aav?vveD@GdidctHo*QkghOAsSXO`%InFcX7+2fJopC6rpF2E#i@?HvzuAA&|HXIb3VB zy(Hqbg896kP`mw^VfG5}&Cy%)2P1tLWuZO0W;_4FWv8Q!W#+u=hoXfIBR7^`b3nE^ za-p5-JYz|xQ*-!=M56E&;NBhG1%4a20XlV<>f(!m;1*;$qFEV>W;um=Ll7G2)th>% zw(O+WRih`Q{VzpQN!OLm%o`XIO#~`^*veLaMTI@c0bys2arb9@`6q!sGK4qJrX=(3 z*?4r;HRT@cOW``JgXn{x_RAz7>f(=>4u#elG;gp;PH}%auN@Jz7NHD5q4L)jfW>P< zyhXRMLH%=JcAodia^LqxxHkmXQ?pG(xV2!7Uufov)qWlos*9v2YH^}#M&y2Y4-EU= z24)|R1d|7l^o*1De~s7JO@mj;;;IbikeQuor=aO3WHvo4U&`^QKtovz)kI0;wL(gV zJUCj*3^f%teffbm@(RGY-sM1dTKt8}0kW+V;qTOAo{BG~SNq$;)WaABf-u36K-`R4 zde1F%o{yC*!x%4%4J)56rTrcm`gG!YcY{hMicf!o4G<A08C8|pZyqa||)GakaIvEoqB)A&Rl7zBn0ppn_>`qLZtlijJ{PYh=T0JuO z)@P9d$GJ7g_c}GrFIBAX?g)0Q==W0L?cX?Am?cUuz2dN4*=SDLaBtXET7m6_exW^i z4Llp8@B7`{%J!{IdP3EugnCyTJ<>35c~kF>?o*(ay>zG&Hjm(jFQ^Gs%_40di3N|6 zSHbO*kxlSxCveJH7_@Vi^u+2R_EyGeqj=g|&Az9`4F;$WwnN(jKRQrb(|Wn#a%{91K!F(>tsN&TmP607?3B#8r(J zHyJ0YD;aacWbRLrWoL-LmAI~{AWBCbgid~YRO$YdO{}1)N=T}>w8=E1^z6RYbpDM0 zcaOQy%qjs!K5sf&HyIjVSoJ%k8W!(E2Xi%wr6sq{tVA&kKm^}2sdo#rENsEK^X-Xx zP-5yo4By?8@RC_6P*m$U=Czq9iBFb54hgTx-lT5wYTCKpMc2AX$5z6!EOM@Ezqoln zuo&kT63M;*6=3?UJChi>IX?qg&P!BweRW8kq#yrTzJoA7Ze$0HKzcm543#)1`c}47 zgn1HqPp4huRkgfUa`?ARTAqq68}2*|SdTnKAp^qIJ(MTE@B(oz)s-KHH#xO3NE!jb z&)2?+sf%ugD`LEB6@K>3?%sHoXVkpvOSO&AN@bJ7_Fq7?-=E(TDa zKjIEhAbPRxEXx?f#T>RJ-=P-nQxe{k(npg{&yJ)K>hy(8Ija|lD?mpc`wlX&VgZc# zWegT;-jfg@zD_~GzG?Tex{*=jH}9`2fax!ElJ@H5Px-xJ%FP3@K&FepX}L-(RM)rW zJMPp(r)!N*iMVADQX{Rd#>}t7)*NGgn13v>-TJk+(y7RCD9aIaTrGrQ>xJX=14JqX z9(~65Pdkq6>EE>HhGe03;b4zBTlce>hZ86U4Q?ma^M)_c5mZ9#M~aoX;#4-f8BTEt zhOHw73N&=e<9mH9tM=E_Mco%wrmA<2XysMpBDFq!aL@@R23Ff#dQ6YC2BVt6Lk}%= z12{*k>0qA1(CmX`1GS)@ThJ_TUr2hkMQm4u;DP25MZ1BwA4Pa?M9|2lMoN|5E^gcz z%^fnHLFz;p1MYMKhod4=g3ruY=k!V_nhGEzrK(RO7;1j)>Sv=*O*GWb&dlhfvH&&* zy}DK47(Zj1Yi4@G#=%BGfRjxPibWySYreg}@X6u0`B5s8GEPG(j#^Y}0F7(qX^ zJ5?eGHS&-%vods3pMm$zNpW;U&{}4kw*cQ!p{UAQdRf2X5wj~F+`y7SC_LNDH9Md< zxn-bFHa{Y$7{DG_B1}S2DT#sR-sWN&*c^Wo5$x*+v@%>=P?-p1RNT~ot!GaVY0-f- z1=`#0NK%d{l@Mzxao}GAmi=@Txv>W8>}s0{KW)|%sJ@#uS#mY166OSia@I4zM(|i; zu3Bl6KpguJb?)J)kuvtMKoFtLMzriS$LyMTHlaHh1TuKOlZ|~qX0d5RL$zv7`8$Y& z3t|9C3=ljsBkC&QOE3v{f99*JRAgoxnrC1^bUJvl7CErKZOD~}EfQR%hu@K7$M&jS z0Ssgg;8xlWRI(%)y9pnX1({OQl+8OiMnF0D=*TI48&M-llHDU3TQ&LCWidZJPfAbd zG|1noVmBW-G~J@&P&$!~ST^$>JgV|O`No>ZfR_usg^4W-EVFjY8ZHat-U0_6JQ=vt zSG@2b`bYem8Xj525%>46pe0HIZQ%3B4mGk6g$tGK70ZiD*u)ipnpXD;kZgJdpgY4o zx&nagWC;^@7vUN`rP}pb6`VYDX8!t(di@R@vtJ!!e{h60z7Un;#jD*Xu$=$H68`Tj zlTaEgGFFJ^wZC`$P9A2zoxpJNZw$H@D*G$;7niu1f7kj$ghv^uHL+>TE<}=bbOpc# zE`6)L0!W0*{hJY!K%CJ3at})Lhd4}Q=uVRmNo(-Q|031|w44XO)_2kRpEXgW?C&So z1fb=%+yB}HC)j2GFF*)(9jv(iSGy=uqH}-s)hjZjMn~GU5RhKto)Daq`;T2_1m{e` zyV}E9;Unuwa7^uFJMM_9BZxueB}Iu9P}JDx_y0A|KOXtdnk9L(vz^-1$~1aKX5cGJ z?bM+4gWh)B<1PD(;B-9q38oq!e&KNih>0z@0`!%xF|6iLZE4>CM1-7KR$T%9Cli7c zc1_RuaY8G+9UvB5OIPsQM6vo-DY4bB8F1#M9})FG^!$>9ElwXNGU!V7GDHC?^Jw9H zTdP+9s)1e)=Jhp_gkP9mvSVpzL-fNQDBLo!?VT^>;0|aIIiK4qG9kyZ;3RnkaKH}Awu42+rXYS zhKW$y619vHZ*jiil>?SL3oivel%+L)R{GTI_o7KbJsi6f8A?>Tal%=Z{K;z8NHbLc z;XAlqweaG%al@t!=!K7*1x7bsv@*-0R@*YbyyLW~@2IaRL^kgWMcj|oqNzW9d5zBI zmm;G`In22MrY(Eg!r~Pd?MauP4VpC1>VSu}a6L$1%_-winfkNWVH~TVFKzV&x6+|t z(b3Mb`1{HRolj=C7;;;;mUd~?--oQQ7k$a%uo9_B9If%>F5ydEY!(YV_Q8Dp^!%WU zyC+iUrr7E!bcdZY3%zWV5GwEQC^i~B#Pm+JvoS?#6OkKLcPz(jBU{_j_0)oU z8ZfTza8jL8RZ`<7SakJHf=pA>?snG7VLK5n2G6p^%KOXjvg&^3S^^{BxoKi<*e9nR zykrZ8l(mf>GihG&QeJE_pH(pT)t|`8ql%_BE?l|dThl33v#ih`T0rIJ%jjZg!us?2 z%G&j*-|40a-h)35jbmnIx-fnHOh^tln9;+|OS) z@{z8YEVRVS8M8^D&#y;(>bzI|jM%4-+c94{gR2uhPOR4CPM`he^gSN;Oo|Oc*PhW> zK3TZ}ys!esiB<8}MSdTSRT2tZxIyYa;%?G4;I?z;F~`k8R8I5!>G`+m2F|!|`z*Qu z@f&GEzMs-GgcL7`l#Z))aMw}0taF{Q!)wQjNczUnEw2W zZanOoOet*LDz>M)8ba2e6xj>SW;mS=>=KcYZwYadcv*~@nxOww2e0tVE*s!VIFtEy z1)vO7TM6^oo%Q$A^~;Z-iHV@0>;=|?y4xu(WKbUKEy#&c+xEpQR;i2=#pS%OM|AF4QIpqB2vO?MCy|_lK&F?H&P>8t9Ea z-RXkJCR9%NE+kh0|5Uq7sB_{hI~u;GcRd{n5Y4qQQ{ObG-vI6lRG<}PhSw1e`sc;a7U_}(81)G_2i?- zj0gI+DC9Q#41vXoX7w+Ich)(I0Dv$zfD}(``W0a6;bWpdi6$C7H0q9#ef2j$w@GAa zfE*`<6bPv-t&{d^R440208&3Xfb0*NkdqRIWXQJR5okE#`sBK*Ib=F-JNFJ%W_fxd zDuQ_+8=yNL1F1Q%S9A{-pGvb&!rm(ICwrlH410Ir^FHYMi7QA#K=o-I=-JXstBeoJ zEptHng&{e71|t;Wx3hOVUXq1){0DLX#8EO=#iqNq%a+sm(aH{&&(nMSmUyAAhNWvo zSF_E#bH+@j*l+r|%Rf(+*@@w_(XG}0wi1$T)ru+Tgu>7(#W~gXu21 zM(NMW(a}H2DAKjZY)U4+E&I{QZ0qJ0;F{$A-1>y2?pBWLu#Vpgn0qJgd9+eeRqG?7 zC5REZ0#wX5j*uRW7zMF-^nQjxyYO5slXakk*|I6Gw?7&*D=$9{LB?n_{;)3x(_K7! zmHsU3sViVS=sV(Ln?3FWYDnv01J3Mhx;AL#Q)eKnb?tE&;>d9vMc(Xml zraE16w>;1h%Vs(yL0Ufc1oZOWcM;&qZQ#&E5$(Ka$lL=;4%sNvQ3jl4)Y9TMoHhKW z$C=pIrjQRf*RD0iTbv%5B`rCzdJ>a&b_IAAPp{`PV|?O~3~2V*k#5W2h8WkRo}t`Y z6+=}kltWy)QZ#0q6X23mFey9H_Kv>iVIil`b$yNjL)GDwHx%6gn(g6 zm)Jb|t=KJTfB-wsV&OZns``;=IK3>b^12OjCRDiE$P=Axnm&{}h~~W|sQS4U&E2Hd z=<@8?dKg~vE=`jt7|{_HUe&AuDnkC27;G;aa$ET8=VWT2)84< zt?J5=PbP#=VvYt~I_anBEB4&(;~mb42xK2I&=+7jWa0j!H;Q%^K-c4|{KO2cJKEkI-e_D@o9huyY$2@u`#%N=*zg z$79(`9JpHqa>>{Q*Bfjm9us$%rGX><=nEw<6J`4eBj2c(v`TB$!W26SEzlP|q^{9R zS>}?Yt{id)SAcF>qpb-PU4E!}xyPA8><+EsVC*`BJwLdLlagxvNoh*v7)kI_ z2qKQ#ZKbWPUhDIYY-Dr~6fZwjFp88Zwd=q6i}_xj5K*6JA~x6KgV^S%#k1C;o=R|_ zJd~zS)rCEny~+Y$K@ z!8}EI-yrJfQL-xPm9Sjobl*-^Yn^har5SmBh{njtXARGDJV&(;;)h@eG(!1l;}bk3 z%(gmrhbd?rZs2kvVLdGySaX_=Z4dt=uUKz zD=c}XEfQ6h7N%=#9Y5*CNa3$|sG>K5)*nl^V0j?-#DjIZL1~E{R$@M(N(ByBzu7v! zcKcaV;%~==lWZphGFLHq!)HLa;xQgJHYL2 z@Ro=1(>U`7PnTs#`bY#6H+L;pFuz}ORy3zs#~?GLn1<3bO#9h4d%+<*iNow*ztT3u zd3H&XxVLQW$|M^j@$3t!7FQmJ*&UWL{2?=cqJC6)qH$QUa9!u?s3-sDFY#Wx zAKCTZenc38q1!z^%;PHgS%?D75#~?5mdyDPblS2k1E+3+?^TLUbazv6=nhsrQ_BLaBnbX z<4eY0u@o=-t*_hDgMsT^Ufj(ut6sbM8|6Es$wben^@L1l=OWFm$mSABwBuXUZE#sCWX+ z_}x`GipqJ|AUi!bT42*gts%xA&U&GbSu0w$zvliNV(reqZ$2eH{`jd#BV+kZr;P1y zkuybMp40v7smUeo?z5s!d{Dy5+6G1>r1kzXJPD~45Kw669?m!;uD&RKxPjah6H=tB ziq0uS=M}3gH@3IpRIg$;c#EWfLWJs1 zd508tYgx;e4%I8b9TTY|*$C5#G7?!v3ZvI7L$Vhor67Y^#N3GL_=!V`8hZOqLd6 z(m8mPzaan{9^>+eYz6~z8AMcJn^WJ# zb&R+%IqXY!@DZZ&E85foF)YkCpP~1MgWV}`C}S1)nl8-aXXR)g=bqOOz;~xgQlep{ z5|IFsBGLvwjRjz(<}woAWp+W`cS&{xx|CU*{6z{)v{X_^tgDXW=6EUuX&@i+B~o~MggJ9$yj*169tQ((Dqm1Pjg6=1`8x*d}; z4L@a!P>=uLlk$>+Hk|%f%20ZO(B%Iop#gvOhyK<752@}y`U%EUbOO)Vj|j%g5sc3V zesrtOXneoOi9dWq z9ixdsTDh^}I+yuRx`=@Tx?Z3Blie8 zfJ=|Y=dI)iLtK2}$CYf{$vV=j=x9B?j%r2LD*&Uu(7AC}=HWT%72qQHLko!Bb6Li? z3g^Da!r_{3oO$O`KaV(NylK<(RbqCSApkOZ?a%ECE!1X#U#=B9MS94Pwv9d)+C;WLVp$e6S>a~es z<_ZPlt<>axnVigrk9D4*GF`EY8%%h{D*%w9k?bRNv6M8?fCxVI01};gKPM^~I-@|7 z8?-(BCYvr(shX#u9hnNMsxBjIgzqTFLi!5O9lD^K}oP_OSShy zBfYiqIasv)q>sh)4C-y%dW%y`6t_HuUl?)xfGkwTOO(a&V?R8f65|e*pU6a)3-MUQDd+CvJ(#xyo zV?*;cC7*q4&c~2UCyi<%J@u8w-8|fGZ_ROKg_|Ri3v9D>EwB@!#MF06T*npX$t+tL z8DCGBLLJ7QHsnDPEG8<62co0v-YIp;o>tHaA@?{qlnSMZsg8Cx?Zk=~VaZPjPuc-j z;sl$yw$GMYIH!(z;Vlxk&cSh5euk*8*py##L*iOWtTe{!i1lT^Yuih~oCmxM8n+Gm zMMK`bb^t&hNYnmOYpUiQyMZ-+xkI-17JHXgXEZH0tSZ%m-#LJTq8c|X$Rpa^I%)O| znAjY8k~Z+WkO6$`@`@<}Fk&+X`FT>D0*%fhiIB>|+~;Mnb8mia6;R!4O||dr6;B!* zmipZBC(R#N*%5c3`FJI5&wkIGhaOqi>^pnIFC;_u$h>_zbiMe~AY*^&=+s@q1ENm$ zYK9u*bp8Dh{T;k$Pay4lG3CuyMql{#0fHZw{W^#t)0MA`nVQ-k;c^2X!}~@#Z9n`` zw_Q@;3Pm2wBAzxGJ4#1U4$1Zd6a}{JWS-70e)!P#g`x*u2R7iyI`ZF^VvN}e^y=tw zwemQzJkwq)^T7r^o7k1~7D5d6S12jkE(vj*6leP7?u^p}a4^R{+Rk3Kd#a#so{UmNaoNQI@@= z14F_=GENg|AD#S?GuBx1G6#GG=-q&m;#wSpP~;!4vky${oL&L?A6AK*kJIm|@@R{r z)Iv8EQINdhqWY$7!PGw~ea>BZYn)dtzxKK(_vT658^u0-z6VFI;Z)$dM zq#f_F7Mho5ZmZ!BZ2GuctK8P=CX&^n$W$PuJiUE+%UIW$n$m}qW{=*!g)r=<^If1`rZ$H~W?BOO_csC^RW%Ja;vOQx8#f2!h zJw++&*Srh&SFbYqisK(53bqZnjUjdhp;DE_AHRxW1dINfPW9j@f>u9Uz(6d8Z7k(OWExAuau}%+NHcqsmZyqa2i)rb?Psr+{EDHghjRAk zs$p5#oxRVM^ZL6|&3I#*=NOHXRdrx}OAUl&7ujolMW^|GV69jXjK^c>`bu$4Z8mPZ z+jH^bV+#Cu#T5WB^l4*>DO5Xual2u5=rt?rTa!!V2Y**Ei9>lc@9o`-QsIK>@5_l! zi|NBA&@5~ss&<$HI>gMLfj7v9nRZEboXIr+vn6oSfd zx&j!dCSR6l%Byh~+azxrG106mvaI=F+AbfWdl!Yd+tH^Kpp(5uO1V60+xw;Ep~l!7 z=cHn)6(>K+$I51Zyy%GoVE?RVk-r%!Ak8OA6DCDZLhNp=(6Sj}dvnAVlhOMu^F7SP z!YtKULb_ZlZwhD>`4S3Na7Z;2FTIUh7Q9=6Wu#QQeHA~J%4+x`?&ojfwuu?Atc{X! zm;%WRfYZK?Bt3;NC|ZA0cAF7D%)mAz^c>YU+YDBJ>MyTtVKHxE-zqsQ7cPQ5HwJE5 zjbW=3$Pih7dSLsXepFuX_1)67IqX$leOkUU7*Y{r?12Lzxl@CyX%PusQRqry>QffOS6664!$RcCV8yy^IU0}Nz0sNSRR$Um z_lp67{7%zBtPw z>)C9Av=IqUS3Sw-QM7XOi1*=ivo?n~faRbn$q|!oJ|UN*T_;mg{D#rSwlDm1?_4|77!mGSO5LU++dnqTEo7r@Z-=RnnJ*URJL1?oW-Z186=j8rSIY z3Y>}t4uV>MnvU~hoGlclr3!~=j}kt({YySp{WmK)x0^TVQ`A{st+~T~Y@!#7Z>SM8O+# z`vKGV`^MGO9&x-9w=ke&GU3rObkmTJ##L}UJ+{PwD0>-xR`&e2AGw=qc6P$uKK1U2 zQ43^yt}#en-8dk5BuB?su@c;dwLh8 zHTzcdXy(^Hpt(KX;o`l$L)ogd6WKmz5|Trrs@HyMA|l->?<-l)_*!0l+m4)E<@9_m z70#_Egt3diB|YRq1v=@dsx%jv8AtjMvcK-{V!&@!hB3$Qs`^5FylV~OKhD>XLOQ9U zdzCF8s7t%;=-Gn0Nl7N%-r8Si-}t$oKy<`?2T@r(yOqH>yD--W_2KL4xkF)b7TsB; zf@hOYQN(}8(m}G}Pi?LMSQf544*wtI_+G344V*3>LQps=_-?fUPghfivqs}~>gHfV z_qPiz5dij&gNdIyhDQM%n-Begbr)*W^+U!MUp{}C)JdsyqD%E!om;HZRN}&829yjm@uloomfO zHEVi7=o>XU#@K5oOE{~H8!rhdGrap%-dXezVZRNo?CF*PF0lKjD#K;6#8HuB!M9Lq zmbQ3Q4(Et|%#rP`tn{2c*x0KSJlL@ZzG)-)YGU6N@n$qs9s`WOg|kW1nDsZ;cY<&u z@0SEA7_0{;4z;Mkf9>OD$|ZWJ^_5|+J)|LEMu+fcMfM4!>v(NA^C|{}diWFXFWI6R zKF%#<64!a0%RRa$yU+B~=C1cIQJ#feQ=MA}_HLv+y5{K#9hmm0BM+jL^93u)*cjGY z@dvEd;>#&|i%){28halv=SoT{Ted0mu~`mAs1OQ~qmxB} zA2I3(ohrvkbc0dcW)nsYjkYS?!Bagk2b6Prq67SGA;i>)2OV;?t}DCnp4@8~*I2&M z;z=>lg2tA%DAY zJLH{W2-~(d2Ax#Dn@`k-`7GZmD%uXVZfh@mUDv54q9>3cT~)#rmF*nRdG;vz)mdnk zeIk-O2z+C_(t^4>2tCeuDnP39=z+W9zzE3d@DZ-?M+f}dbyPNdCXq02yH8l75?^q^ zBzlDK^JqdOQO5us{ynAMRe@9J_Vli|m7kKRl#uX}edj1um++n{g0_QEDuoi&l)fSs z@;F+naU%b{p+_FG-J{=#EGMm=TgKR&l<2w$kO?Z<9&7Q`GI&fgC!;( z?&J#-yujJ1#ov_lRT|7L4s&8t(|}nRu4rI_J*RcI3}N@YJ3j|{FZAYyZ%eN9PoZMM zXAVVkd1N>Q3O@=y9`W+cm2J&Z+NU+FqFpfs~&$ zOr&!9(t;{-EW6sIYC!aLu!82PBeCauz0+#imB`Fog%_t)&o4ea3cssMqF%o%hUI;@ zKtRa*63+0Cf;>!3y-pYW8%1^UbNK?$Dd#IG8*B(KnMW?$81m6dl5Q8Hy_<42!=m-i zjT3PTc?<1S3ti2FY|%))b#ImFXCI2TXWzzLI669(Y-JVa$iHQstJE@JZD@1^X z+1Xdn3h}fa*8voqcX|C`eA9+g?X3bo$ptC9&~QPI^}m{<=kV%Ygbzdd>!xw9P^`3h zMDEMahlcX60JC-7E*pvbm-$GY0=(5mMsoD7NM&$LAH5VweUNKZMZkhNs;vaYt*eoz zUGv@mF{D1GY9`Y>XpMhT+tC&NW-BeRS0`xq?xgG6P%MnICCpTO? z5Ch?Ui{#gCvfDuCrjae^>A1^=6%V)G^pNrjh18K8rO4d*D#)GQj(DkT7B$UJAWUtj zUPm$kC)e2(z|D#f`z7J|U|B|O#BDz3F9})G;B}33-Irl;eI{1#TlbF@v#2UBa#SmUqIPh zZ@92u2kx3LXh*~odNxJHtF+ZT6TgR=kZn~zw}0FHWpjo$jLXvO^U&=aJy=bTUWd0i z2|G{yJZ`RQQRVaGQHU)|ef$OJxJ4-or2fQqviqAu5>l@#e7?M9*Y+~zxVm`c=1@r& zyXW4`;nN%K^}6sf({$W)8g8P;sU*T#fNTA61I4L{LRkwYZNjn+2QSd7HiXER*Ye8k zbugwjzFCS2qOJ=NLIhP!X^;pN1!cjud$vzPiP7`hCh!!(BclqwP5fBW)@*7h%k0Y6Ri3ik266yA|vi zj*{s;IPY0$xAx|d6`EF}=4F@zpZeuHgf0~k>%E|FuQLl)h)v!Mu=|`TjEF+QduEN} zW%ClI+is23y$pD7ypvIrCM;p`>kV?@lr%aua&xiXvKOz&2k!y8Bhfh!P~js5?stnG z@CzU1-KIkG z^So;JrrP?ZRH4TBZqae%FrD7hZ0B0`3-{zMdm`8?LoDx$o&CDvFJCZ&TSWEbZ#X1q zcJ2l_aCb$gH$Lxqj_z)ge@3Tzy*Nslsml3~uwu?~8*7X}=wUK4N~)FT;D6M}Y*xYr zLlv+*MOZst!UpX;uL;i&bqmgaZr>mJ+;+tGRXSlVR!0VLB$0q;-nL3k{#{?ELl`?` ztQ+G@rjj!YJZtt&iT4H=pQp(Kb^H zcml+amiUPW!4uS}U|l_Dc`uO~5|xMNo8sdh)KA3H^oi%vSG`^hKXTtEmOo3cYesmwI6t&Iz~zOcW8;2DtL|WrMumoU7s@Hk)$_?B_P+8BfKt9EMOsqP{z{f=P8T z3sGz-l8R`SrYpd;?>(tF<4*kbru*E+Iujqw%QU{o-r9VfC$74ylmrtJSnJcYO{?xU zqYD7i2_Le`yRO#?!20GsG{Iu+L?cNt ze0ZzWLXB-j@fQZ&MUpGqVoykHXI!&W`zs_UHo+fZfe&i*Ll3`vO_(=Kq_`Ft7_KvAh1(fv+RMBS*CYxQq~ z0&lfavQi|SOjZydiRs?JGSo=WYrPV1C;PaFl&9_+WOSWBg0fRo`Zm!PbeMvf9-^1@ zCHHkJ^Z>H24``(*?V%_=v*8HAAbOFjJb$MW%(+0jvOCEmtznyx4@ZES6N<|I}?R9|(CblwH+#{C-2|K_`T8Y|Xeoug1v7x9qZWBqzN zkH?vKNnlxQD-0e!h^Q14ZbLt1r2e=p>dJ-A8}bSlfVEh;RnJZpdc1NIFjTy|B`D#$ z+}P#&oNq)GF6aBj?F_Vobyd;inUrh3?Makug?T0MN?oEgK~c=Ba;>?UfgE1@ofG^A z*(jxsK1hj-@16G=(Xz`~;f4~n{3>~<7m1qM4#|9M?tZBENq|g6fBAD&@JVq_&ogIQ z-G|c`E`)`OhHXdI+!XpHSN*`#1mjSKsFLZgY+YIByr=BsVHNxpAi6ve6k%#jIaq%@ ztEZ#v&|kmlUf|a8v9q?XIyPV@8y6p;xaq{kTO@HIpu9YC@z5{t+%KBIQPnq5QwZr4 zGmtT=LC9__x_VX_$l66*-P$;S; z(+g!T&_8`#UYhTm_P~ZtWZl|JrAHYaeIeoM1FZ%Jhu&IK>11Z36}9A0e=?itm#M^l zDw93qBOiw{v^sd))Y?3qtA|v%t|0*COWHHgtIUk-#WSOGjmIO@>}c6cn-RiKv4-=t zdLPEpsPD2fbW#kiC#2w9ACmB5(wB&~k3)>{GImt{ZOT6M8{_(6l}{vodM4%lsw{q| z5c5Acy6U(l->*FcMM5S>*N_mTk!}!a0RahV0ZD1;7$F@aq)P;(ySqE3yG95IY~+Bk z@B94TKllSa?Ae}s&wcLeT-SBZdGs+sC)v|+(r|S3nsLSQ<7qv1M;y-@?5leF5n{$D+9g?GKF7mLqgYCfWS?C zAVp-8x-hjvu&$*hfBJi#TT8GbLqYaw{EzcLagVmHfFcXQ`}V8SnrHPceLbxu$2+k~ z7Bd7I7(SH^@Z2OGQsH-JZVLd6;bcpRqzAJNOjt4Qzj{jc{v2hb1R>>=5a_$)$wGUm zg^Q^0Yy2NJqZTwwT3)OjK3cso>DbZ+=Tnp?;qa=!H0YSUn!K2MFOy!mTrzftmXgDg zS(DKvB=lozYkgx&Fy5;u(W2ofAv3CBoGc;~DB};SWEcDSf1s!U%EflM;?>3&gQY%e zf!A)dzl3A=6InQmiu>(fqHB@{__#D=JYq>NOB<=PI~lV>epdDH$c}DE&B?um^g8ZFv0AxpWgPJ48{jE3g9(dhI6+M_M7HTz{Pz=4l)b1C71bh*I+Op4`4`{JpM zb-vpytQdHHa#`YA5JZ;6oqih^|^t4aO0YE|%t09M~a;Px;D;8E|b|+eA zRsGJq*89F&Jk2HOZZW~$gbpd(H}>q!!F!v3SGgo(E=5zn@jl*ixV-dgyh}TmHRI)1 z@{sx;F~|?OpjmLqvOa-6*bSwuDuwsE*gV_u|8O+ZJ6loQZod8GjrtQ@&BY`WwH?zC z;bYuc5V;cc62_i=aC>%~cF8!!Rc(Te1j^!J3^Lz4!I zr{dGkYJwkQ&ZMp$?_Cv!CtpWLRE$?L!6uyBmM%4OimJ%I9b{!}x65yjWt;AhhZGaP zuAOx_rNmr*f73Z&nk0el{5&b$Ho>a^j;P$558z(<`^IQp-u#5)sj^VF=)Nq_ z{(1qUw9Nnq*V|_s>dXmxecfK6tSs^Pr^>4X!h564tOwM5ME8nWC4GTnN91+E?pUDs#3I5L2FMOPYsL-^RF8g`w?H()w!tW6 zmN|FPZ>Fzb8Adc1Hm=2ee2qOZGV)n|qA0YyUG^c`-M3iI^P1m}TFv0Z;=Fx|hh@AO z*X2;Zb+b?HW5AT^*1dD8PpN+2lR4)oBc+%nbD8d*gSg}bD56PwT0+COs{a(FL)C54tyeTE ztHK#+9c6>zu181@fQb+FwAKV8!Uh}|v<2rXIHNguK`9d7r?yS<3%qjG7Ro~>fYa$^ za^9EZ_l}8GkE!$@QTmv-^JpWk>q-M=#8UDKqhDLha-I~V5Hx)wGI>q>l)We!NPVVM zO;O#Uvqa^Cp}fzfg0F}@b1?q`CY?yIA0m|1(f6f&#(2j1f0Acd=7nkX4aF3r8qDjiOS z-73`nxYSEy&>+1gsmJ3^a%}l`o?VkiHKg8<-+@TzfELbhF)LySa&IiGtWn0KaWwK@D9P-G(rS4rZj(1%|2=iTzpNMXF)~ogx2YSUX}9Z%iP?Qr za6$|A>0juwS{>^mG1ahz;#{}JG|s3NA8}rou24oyB|eOqxhf59u~lD6c0#aFzK(m- zm)-sWBLEHa!l-G0hrm`$v2T;u*x*o?cTK)%@{rl%FMjn~SsbEY9n=8FT*(SI$_t?I zD$9A2DUAuV>yLwV^Gj?HP8TFJwJmk`Cj=|Uy4n|*WZP#VxS`wN={|Sz=h(S-`wf3~ zJ+6KxzLk;iETj`b+r9zY>D<=HfE5l`8()tt#&srB;t&sr2tAQGlp$z)lAD;{z!-=n z`S9A+Wft+1JgAA;67!Ak8hzM@TU9~mgRS+58|x(FgKKv@F6j)>KjM)htf21w;>WZx z^lGoxmwRr0R*GpQ4R3*cK-xpIg|tb3{Y!rClK4757GgN+;RtQ3OO)qR-uWCL1~`Zg7y>wqgx3+K zQR<55+W|lTvIP$q{+5M3_WBtz`#=s^ylE&Z@j6hPb*yyI*=_4+j2UC8DEBQOKy6vx zS!YbnV%Tkx^cyzv={7ik)5QD4Y%cidMKafAId{sRS8170tMS?IRK z`X&7nB#%@hf)L}TXYm+K9UrsQ?)h}df?eq2>l?bMLfgXHWYE^!k|Dio0OQ6rf+r%{ zW8C9^Qdla6oc`xBkWf(ci{2Q1{twhp_9q7io7sYFd=s_#ZdOoP;Pw=j3rS%)-%6O_ z`VZtRUYh*=K4FgjQr}Z_7D=GV%!`0T;9W^u(Ly(mOi>yQ3gY2`S36)=2Po>wvv8;9 zD=f9r*LtC@s$Kc_p-*h`_nDoe3zsnFw*$d&H(Kn#H=-i6e?Hr}5u@ejySoweZD;8Y zxR`|!iXEY5b;TgT96;?cwOz#g2hy{86&UErh8yp;kihLw;7sz)N)jZ>O8SpNqz6f1 z%DRUjs`lQ^jFyF=V^sney}n-}$g6UF%VcxWvBtH^gk{NJzD&L;ViGjenCEh5$^L2X zmrkhBqI4UG8*@d;lpvENQE4k7zf%>7A)bGQ=$K6STv)M{W1m?}n=8an`Y1nX-d}vN zMqWe*l;eLq9KgFAYca6#sK&l5qMXO6NO@*vZ|6ehdu{Nr?4XRKy(=U*fcABaouX80 z2jC;7`zb6*ISSg7iC79>AOF5(_mN!d=WO} zLw@(Jt_9#i-uNfHQ1-3Gt?0Y47)gZ^9AH}wGc&EUO!11v-)k|Td#Pq6$uSi;Hi-Ne{>~!45uUZK;+buAWSBe@9 zhWJGFLrajkeQIrrE%};KfZApUPSPSinDm9krsvD!0p^0ox3WxR7p=yABE}x7ufK_x z*}rt*`gN43!LwYDA+YuroSqd(X&I-qlb$ae+%8L+YmRU%aLibD;&QP3F?bVCzS_Yr zH2p-DA>LWhATw6sK=b#&P8BX{Y#>!AfHqvWW}e5QHB4uYg!}`O4nv9dx_ut7v5yC% zh$M(1bbRHC|07?99j>6^O=8+c!r!^`)2miBg6DsaX|TsmHMFm{eRLPEneYLJOVOer z{ZhasO^HUn(AK2dRJ|`@x2W7QTrEE0duw4gxP{z|nSvlf27u7E1I3qp|MN9~;<#0+rR-INMfFUj)D&|qb6cVK$KaBztW?k=enUVQ!O(jV z40Te}EILSt#Ty!jeTlPjSQCFeNqJ*n`PW`L*3WX{!i#YUd{0;fv_2|d?J(@GJNmGx zwnZnTI*g@XNuw*rY<7j!o(1b|>e_yX;(?s=th!)sP&42lDFR#=c*XrV40t8ypmkM@ zgmn{ZPovBooh1~RVTw|du+P1HQUB0&4fyC!$biMdXX;^a*#^B? zpaId(r|+Q;KK5^oqo%#OhB!BQLcU$(Y_38dew9Oe_2B=uyu>wnPTjjOe~fN=>7I=B zNfURzv~6{7U0IeF3>kVv$bQRI;t_efkJau#m8%>|xIk)lc#wib5MHjs*Zg|M zvU?Pit9OePzh6*QvPf~DJ~hy^>CB&KENfDK`d+qIV&0?Y;cU3eN}uf8-zi>==twT? z-#dN07R>Q2u;dM0;W@$c=9Pj20sQgfH(e;-8fs;MS^(_NQg>n@aRYHwzJeR^Um#H^O%<`xfifld7==l$Xo0PC!0VKkpeBhyQL5Xkuv%nB% zv&QBA)dWHtL#y>GKhK@hT%=M^%tgr&VHIK2Yu`K3!5?*@6Kow z+9V<=(jI{soLzrr#aI`S8hJ<-`^h3ka53z3%=i9{JQ#KuO23l=JD1p24zu|SxZ|=O zp!XHUyUw|KR2BN=Pp*!Wn5IEvA*ITkbqm;df63mnf;e1B_17$@vV2==qnnJWpv&Wz zT;C01zdPSL9SkuCk&1hpy}bRAlaF(!>FTZF10il_mtpER(2#2S14Vw^M1AUf0f@xC z$_3b2(4k9Hw2oIjy>ReB&kgl_SI9T2(DoD3CgSzC*Cmu6-iP)&9?7gWi859knh4Y* zSvo_UetGez`I~B1i^bHemof|0JXykX{$686Yv!B5Elyu2-G7EJB!lEmIEFRJ1EE0= zhLSdDN028yB>(n0>pA~aJ~KhwDqis6oIhSEjfjALz6=hbvc+H_*ygUFcuNMyuKe=k z>6CFgKdLyldmp-`%$0DQ#rHFJoFXzP!Zv$_s=We6ckT@nm&QnX^Bl~76tDI3Xc>ZB zvLGtlkMohz`q;TNC}v*D`*KALtauldSxOJxmO^O3DC1 zT`KG2CL+?-5_U=O0c-Ld2ZnT{Rl*;`V)r>L;H8%UL>B905o7W?7Ri3Y(A01Gl;^&& z9}bjNbFAp~wwh6r>!QK8yItEVoz%1QahzMG1*#a*a^3J~Sfr=F^!68&cJAr2WdNk> zCtAJrKhUr2?HFiH5ey@3vXld<#W7zY&S{p_iY1z}zQGIm8yx*4JUlnDDTEb6o*JH- zWo8RR*Au%Tq;!nl05!{LaYALPf)JNw4!TeY= zVSuXkRo6oQxlE@VRAE?-StD+6sMt$E!I(W6;7&MiNkpFn5jq|mm z@}$p}n^9_95Z`LTBxP*>J-(bZEe-B(c{bb-MUgEmn6{kInp@KG$CpY>Xxsb>HmQ0x z<`+Q|AXfGI!eLxW0p4zl7%d*UI+gA#iVzi130iI0p=YXSI%#|vkxL1yGLscKPi(n2 zoHe|C9InqkeSN(3Q4!D+#j*NdrDZtmUAo%tD1G{#FixkOP!l8MG6k~Cc_>SrKdow) z$4PnPlFF8DZHGEi`%iET+JO6rR$7O%-Bd-v-@JuTjJta(>!jh@A}#2&xAzB%%y<>ffjBS zNprvoE#N;L=@!%))bUE54%2$_RCKt^Bzr(VZCTG1X#|K|t@B|GUJFi^8UE`tYa{$l z{IF!XR~zBt0oPu*c>|sy`(J&usjwitQ$8Rh3re)a$or3at0kY(Z;tezZ*H4LXF1wb zH2li~-z;%@V@H*EBdC5SA4F{`M=pBnrwHpfTPd6`Rq}QkJQl%a$&72ckqcB})_Pt5 z$0iN_hs2Y5V!SEGzFwI^+9#c0PoliLGV)qR<&jGuQ2WY~c3Gwe!LFW#T0N6ihKlCA z-U_@;Ub~1Na4EKXr|>7}JdWnrZb4R;$@W$@=}&5P-l3>~g7eZzpT- z!Xx6%mo2f`5WDJ?xAD;E%i?&i6FrE-v|EgewJ?w~6uD$$wy@5kWV$o9bo{(SqEB$l z5K;p|(w7cwrt}UBM`F)eXL=o_&jmU1m_5s74j60v4D(qdC8UdO9d`uUgOvzQo;A59 zWYH7x&$LwW49SM0)dZx`pj04})uvt@;u^Xh4CD357Bj_2tHA5{(2~}0UpJsbbL?*z zU1&jo(M|Q}=?w!R_waSG`Z7)e(8a2cC*0sBWH8gob9VkDasfwH>_9o5x43QBYOR000F;gEUO&&~z*+*WSwkO#=W51(#9wys;ei~j>z zt*Kdd(i^Kgd@w5A-^+OSdG8-b{pT$7@~%Zx-L^(pC+AF;uP1jV-C%ZpXY%ic7K?q_ z;9BK`^N0Rh1)q!)q9nKi3v`=l7Pol@fW)xrZ&lQfq<0Et6`QW*fIIUbSc139Axu=O z9-~Y(8XIRFPcLmrtn1rhLZ{EUm|n*l%%I7fBwb15y2fG2Zc# z|Lbe`kfeZ&XTq>Y^YkeJXUtsJQV!n;>p;rSyJsw3fWNZAlld%!M>bH>wk@@0!1-Ce z*8rdfeXm_3+Op*U7WFkzEc^-NT&TMfuB?F(l^+p5@2ffaFus*{K-LSj@apD+AX4Ry zVgGbB4{o+oMi*aJD#EsI}jT53DU zg;TWnhd6p!w5afFlbPLdT%R5qrL-Udj~C@D8*C@qN1nIF$WeOd@OtnjLDZ^;f zX=DI(W0ifrp}~5Oz4h;Wg~lc!dpFt;GaVNF7%~w2$iBlzr zg0(9%=Q^qUBmed_X4b%R>RHBTw@E>FK0g}-#tNS(>6=6rVbZ?hh0kIk2OB7uBLo>9 zWZF;9H0wUbWqzRCRU2mb&DRSaFD9xbOH?lX{UZbsjY=v;cHBVvu4%LZf7f5~@O*MQ z4Hb!LbuU4{xEq5?#evXnZe22t&H})H2HMNB^Oo1osrbohz=$n?;eqeXN7QBdx#a6# zvTIjWV)P`)M{s)4d66vu+86)|rMxyQR6+(d6?^p_y4X+zG-N4quK63(LstS+opB2j z!YjNF5tZ$h%&1MBp`zszY19M*;&(^$!C-48*ohH%*Ou|? z8*(nfkae+8L$gJwutk?zyr4zszA>|yr}ybjn596Ah1 za5bl#=6fJkQx!}{;Zn_sizY=9n3>zUb$M$^D!iEdCWhP z%J5s$t89^7vnFhm7-J?pgoPGVArXRUj*N-x`{|X--+yuUxC-4vwoi^|HDUyJ zT>b+|zJ%PXWch);vmliATRF`c#K6;Xi1n9z)go3~Jc4pWR8VZRWl-Mx4}t|AluKcM zg!`pAy6WLRAM;$b*A1|wLL>MA+73vfkgc9%34f2-J(wz3Gw|;F1P@$LPi{((P7%#p zkounweyyHpj{AfmG)oQ>t#iOaE?S-f2lnpb2XP|5x@ypr$U&g*VrFi56K)vNG$LIC zf<)m;2hWWlFz%F6EJ$Ly$PNfvp10<&+MBGbm^-~3Kev`Jp3u%$>r4u{=6j8&oUDb?@L3@2tS~*`7XVdjKzA zpFOKM2qcwnv)?c)sYpMcUBqZ$Fz|@Bz>Z8&J7~a=BmvEJIiNz#^_rI2>(;PRlD%~8 z5q}7*$On+P_lL1pvb$@aXt3t0B=dDkmKLXC)2RCoh!{CBn4RL%u{HnGA7%)d$;yw} zDZ?8SoecP~mj?3Lz1MWEF?-RRg|LAa53*Oc&@|KDkXE^tC5;S-=e;ls^q$~W20Ct3 zIx2`=sNLIP2X-TK)Hvb>3e6P@@x56qfj8=i0jaVT2uEPC1fp%4{~7Mm?rJ4u#UMXo zHt|4bM)w)AB{Isd-f^sjk-kbRH`b0Jyv$EI?!oBD9C>WHy#b@17gA?;Nq5MewSW8d z&^xdrejrL36qS{$p_2Dd<`l=x$ohbMdo1+b#ht*P*?_)a=?|yO0pe%8f|#!9^#crz zF^qxE>Hv(AX4T>GNPD0)CW8%Ae;U>xNP2N%60}{@q#Od;jT_o%- zMCJcw!N!Wxp8N!P>9h^JSA@b1?&XnOMMS5)UsGRM>F_;=jv%re~J z?_k(b=NjQAM4gK->nJ9i>Ymq;J!_fwW}vkYMZbQsA6K*;+HT0_%j#$X6t|S$mrBGEE!qVZ%0G#m~Q`iz_4-!>i@&Ar>h5q0kWo3UBXpy0YEib77LBnQ^gTmNa%)$9e?WVQ8SFyla5u zAIGaq2Z`mUg^81QG<`UgnqQu}H35#*t;-WFrc|$X_1`zpeo|TUpi{g*TaOq%Rx=;m z=S!=U6d51ijqASogjP08JA-?3#rOz7I&>I>_-Ao~R_Zf*#IhGd+f_+tx-%*p_8sy2 zhwy8k&bu{nH7K|RjYx8Yb)uNcSC2hwKbgu2MU?-ZeeY>gM`ln#ES)R4 zXY_U#W%UShE&L&&zz}w*RTV1nnTeNPG+jaL8T%@l5*Ckj%pJYHMZ=XkS>(5; zP-@(2Wrq$>K+v*Yby{P=gI#$I64?jb%P!V0J0uY2vVRIs|yG7($LbW#Wo8N_S77=Qb*P9bk#p zIo7&4cY7)fvuWW%I{w=F;MbEn>gP{I&%KXCs3c&T*$s%sHs&wkFv0g&Nf?-&5DdBw z6+39RMrd91uS9RkmMGe~yA)G#4{Nv^o1Vo9p)x zANBLynMY%b#J+fsYXpUM&kWCTb zhx!lz!08Hyk18V12J}UE3YUfW79S5?R(<-UqsVMF|J)mivMr(ON3Hft^^J$a(4j^{ zkpjDj!HNRg8;mHDR!^)TmaO`Mab=uuE&_FgI~R5Bk<6kd-zVrAKDu|G+bB-P?TvFVXQ%yYj^*WsnB0Y$-% zdLiCT=~%Q9S5b?-O~FMH(O8!oc>Q5BAWtpqdB3}m%QbQ=^ z9VSJk`K&$e;F3p+(VaB0ZgSPLUma6=IcU5;e<$T>$l!TxSbYDp=4uKak8hwDylODR z)$r8Mct_L84S$0EzCd@Sk4d@>9-<#_puaZe6A9ONL2T>T^el6l;I*zxJ?V(}$DHh^ zm4j#U^Qqg{g$3=`GaC&*QWgg1300&$bbM-t1jDyCLq|UEG$NVCrDol}a_u#Jxz&0} zYggKikd;f?bRoq`Tv)(!DFPB*yznTc_BbkC`F0xfPx_pOlbfk-wBWoGV^=hH@-XW_ zCz~1chza(PQe6)YoyxOK$uLT-@G&^2I_05zltB3SJzvn&4JmX}v6ExLB3Vn23KA<$ zvfK*^<)*+WRK3W8;>}I{&zGP$ut~6q;_1E%t1Cj4^_$u@*r-G{JozS?Od8Dhcd%n= zvO{^&e!R;jB~Ige4#NoMsS@ORL(H<`eN|+tK`4;IN)Q*wmD*8%$wqeED_;BeMCMwm z4CB#qu1-8BZRz7%fXr*DIFLsR9gn@gPs2Ow*8LeHs zcB&OpAfNLvl5kaI9--lN_)~5Xo>0>uOw?hxN)~ViaB3$X4D9%p^_9hq6-jmT$Cclk z=#K}5eRO>rD9JA~da;c1SieLSAj8_Z&*;d-H7ir%ajBjK4(;LNP5SuEw@E+yOYt?K zE5^OKGK1LJVRsRhR+GHm9JtOm=}lRT+x;zeMa2C}+_=C@f7l$At}+Af?ntvG8*@+) z%!EU}6Rb*~@9p-aZV%5PV2t`9@r}m`{x9`O(kIw^xP-Ejub1#E@=%8VswX$Z=A|aY zDdF*`$lf-hpLA;pxeNJSf7)4oud6wD!edo7cK9P1GyAzKiNu3%PuVLL{~@0p*76^d z3|Dtw&*a68C`b_F^dQr)ppnM-yHVRyGu-sU8z;O%_nK_Ji4svDaH8SNKe-c99X?&oZHj4zId;sQ-`gT^GS5Gep?xPkIpAcPw^+3wssor z35nQl?TIxJY~TY$g^9priX_OMdJl=O7E(MyLvhOilO%@W0Fy5aLF;h%QO~BIul(-H z)i}w7VYoZ+m_L9da^|iRaOE=0B@R2E*>+u$ET%!1tl+umfaFd>Tal^NtM$!m%9g{! zo8xKpK<`D2=6RLwOm?CFuKwD; zc@cNH{U&BFd?wyF2LN68igL^VqofZ9tl{?Sz#kIWl`sT0fZW98ZY6csv7mu@SM~Ny zv7}5PKf~FHtXPh_8^Zpr{&Mmaui}GzWfyAC&GcC()nUeFcwuu}%REc!Nt5%bSmE%k zMN0yynaE#K{A=+N?J-u-Zoxr6dNV(^-Q5?(n>hdzJ+wPl{^=>|<@PDTGv&0qqeWA+ zE8tki*XXkYpI$vufbMeu!q^bUG`Y@@rea1Z7PG&kZDieupAKTRH-Kzf@R`9W0sL7O zSR4S3GrJ_DFM{qTA2>$CBP7^zi5$_Itl8N(U}Zr_~ZLC!ag) z9la36elWlzS&aBxduVIWtUq1k5>Q!<@g5%B!3FBWW&@^tzFK?;QSV3`QtQZ>*-_Pf zCd3>%!s=Ed&C39JA3$1Q69oZ(gW>qeEH;R%NsS^;{+*mSY8~9G@816UV%1~HAKa!S z4J-5kp&;8CS%~`YP z@Ui*E;I|}_M>2`yM}$Z>gVr5z9bexk0qh<}FlrgmCyVInll1&J>u^xl)evd&dgj_y zC%X8rQ5+`wc=P=zRu3fB+v$XIjI{@dl5Afwd$_>REjF_zJ}J&s?xs>diCJzFz52E} zDn}C0bb=tfuOtQZzsjJ!RNG~-DyLlHy{Tfcg#}|yk}F59MQ8jM-?dq%s)>^lCS@i$ z40k{Ps^8o$Ff)VNOadxWm1kvR-}bS-owkNksd1mR;Hs%$BH2?b#}<*bkGYwSF1e$L zbF=Tf_p^Wb2__WXJ4EZhSs$^b$n|#in@IFFMESAtB-7Mn>1K73qdt+YWWBj%G!~>f zZ8A18e_r4?vL39k-955jK6NjC*hKw1+x=CcKcj(!)-BP;Att7}bG~jXi+IU06X_6} zT07VOKn|vORl#L7`orv$Sz;&sStJFW%9Nz#Bh&l)(-`9AJ}2fA2U0yzwkgTsEvXqp zRyJXmlx@H%dFF@4;fysSBfqrOgzTlM@fOfcfz$G=T*mpN_bDJK z2pu{wu76FPkT>sk?c&*BB8cNVG{Dkv6PHZ6l^F)8I zo?<`E0x!9qYnRTFEdra$qIC0yIGWUKt6NWT62MgpI@py|;GdLq>7?Ymz&?1Vu zdM;t_MOBbRlWG;}EoWhUpke0nPTM-Il*@-qFuHy_8MfZdv`}Gl$MaqAxF8OKwcPh? zzHEJ2!%ak1z;3i99`xSq3?eEc`%CUA&rMxQQj#U|;2F8euS3*6`E6)FTM9fu0ILT2ZbqY;%@- z_axW^s}kterdfDQow~A{xC0akYa71pvB)NFVyqr?#*_XQbC9)=eb)EDz0<2IvSldp zD*4q9LpBY*B-ry`VIfDt(rRrl1RQsc3-OdCm&l4_3p$xfWZg%zU! z#>ToJE(blmG-j6=_CSh2G54yXZ!C~ykEOn6AtGcK);;fO=)Qz2%yWak!ZOJ&8{_f> z+5(=6c%TYD>HM~_DIu%M21*3nX`Ua^}elDo(7<12TTU@;J^dX&2HQGvE=f%aXl(hfT z?*CJDM~&iM>Ir+D21Ul`J^mowr)ot>ELyV*qkskkRHJL*(zmPjq1aHx#MX(`dpS^H zrAt)8(adFbrFO2qmmrr;X`*d_nw_z6ZKOc#RN~t>I?iVLagI;+O_zS9x;{~8LX_z@wzgwN8k)#m$17-` zS{OM5X&N4A`q(%IF`hw>!{cv{6;cFoL#m2fASTj&aPqsV3qqT0+r@EA}j+ zo?}U6NB`9y)e`z6YmEDtjp-A2T_jPuXKBRm`s(^PVw&cp1O2E2I`HH_-^&{~bUVDa z4TgW@Y;2;)&=M?4TqJBb(8q7tIGv9jgYJ)adAsP+LG}msABgbQdE%y>Q?hHDN)9+| z?Fj}ppE#n0^97HpLQkKju#F0bGnsZV{&w4^&#Xh~&HO2a(+#+Eku58R@T3JkN?R=| zh=LZ<0I42&qMNX|$4T z%71xD{Wdl+->>m@ra}7Fg&h74Gon}bznecScdJq zl+GrPe8K6Gx>6PIB@4ONuzjuVlg6->Rj{Dhg>cr|;e{MEwVHdm{LJeBCn3YW%8%xXB5OGCAfE4vnrb;0}AhpGt9OK%K= zGTqgjlK@{f<0=Wx;1&^IJdw+xwwLQ>zZ9EliNINe@C$i+*XvrbL)~r9q78hHb1X^u zPpG0TNxgo0`np`1<~X1{CJFCfC1j6ka8Y{^>qn00F8<$63NJa#bLf-93{{atFGhO5 zG63MSu(~zv^v}}p4~4XwCgjp>JeL$WHpMU|ps98e)&1Q30S@KEz2<+QTD?3cN(Q&H z42x!oZ`Wlt>023qlr4zre1&q|LUrC&{%&ZCF!E1Xd&7QfZG$Crt|5y1vvNfm8JRLr74K9*a3A^c8`Q5O+>JPquvtaq>Ra4Z8Z)W6Y z{?fNt3G{p|l;lj!B8=rlz3U2_TXRx`!KZ>b@6N58IhFJ`w9X&HS@&4vIi9tVc0yht z`QM5CPKKKja}sd89g&W&Eaz2XQ1E>Yr9Rf^^ZyX%XT1adnesnj>L|Pq97Z8cbeEO~? z()7ifP*y9UxaJ|B)1>X3-?$TS4Psu&&e`WcSD|lv&RtYbnZo{nneU8Ae5PrL5;--8DH;Me*$({mzU`3G$9=icvk z;HeZ30X>dEv~C~2dlkjBlR@*1Z1`4CRsAoW1ldlkHlexe$*wZDUZR>4-|PV|DmLT= zDj`h#h!xGg+27j<4HLlyoPAR1U}LEYx`DwYH?kj*WUKvSq_FJbU9%UL64Rfy?&zEH zjy(fdV$m8q(fak0Q=E&`Avh_5oaKi>iCAwX?e%&yj5b)>qC~kRoPNs-DA;g2Hayaj zhgZ&c&^~uwD&~Y*txEDaz+qagDWYEstLI2QDU;*}D#t*dK=y|u?b{I^Av+GQw}6Vw zf2ZXqdFPs36&?~rfpkkr!Jxm*v>Cy1VyAs-4agJN_tbt9)+EiACf`K8kN!2K=fb|Z zvJZCQgPY;63(wA($8=te8#%qoVSc9z)XeLPRBXH|QXJ;rh*US6gXs84O{Y z{CxPu6myBVMmhuzhBB$DvsI@Odj3U2Q2eP!CU$RG*Sc%vUWzr1%iIvl>gDv_46+ls0RSw7W zf?)@WXa<6&Y>Q8lBbe!UsKN33QdyiRmt>bIQUdJ+CoIJ#=@p;O|4|jaz))mBJ%7Rg z-Q_Az^rcfU#jv;5iCs!WX)*?lfTG^c?LoJ(zW)ar*U%TGgllEOfL3FjSkaUY8u~qS zSHQ7{Dm@w>#@#sH6zKG+8I+aeWqYRn0fkR?SaJ*;J4@z-7E!UVid@r^|6Q^t~h-f~J^;|{LR10fsx>(tE9Ru|MIN03 z8`-1+6w8oNi08^;5Ere+4Mpv_0E}?^GY9F=<%}C`-21mzN`OeBIOfhChaEKSe(GvJ zf4ZxuFf@??mja6c=3MrZ?q|iDS>U_-jNn*##N*$tPVQEsXQf8}yOkN$txOTJ^eRE^ zQ+LB0>2nr$Wj2Qvk@B%zg@g939-#9r6}f z$$frM8+W=#hf-)M-{{i;Gajx)4`S$1l}WO#)r)={rAIaL<(U;iwkJh3YPx%?6Vat* zPBcMqT)I0Q?R%+J8F$mVV+wpnCx@zvregOdFAzaOLRTJLv()^C7j}<}7mo_Cbzu!t z?(SSC{i_~NQWQpdcejY1yz%*Xsx7hQ70F#NTVDRH!|vFiL)q${<5-Vak@o5Tk#yBz zQM7Ltq`SLIq@_V(0i{GhK{}OgVd+}w?vh*(lNuW)8h*YS(X#QFO4g!}xYLtTik!%xPvWVxinh1j`b%w!*SL{}AmP0SN ze*KQu$q5;5^oz*(x|w8Z@}T&u8(!-1^xD4$C=MVyWf-lR+bC=2L|e&07gYsr`a}+% zgMRePVQBP=@rVPy^VeI+@leN3P9T3Y&X3+_Sz@?A^hGJDBzAXcmF~*$!mV$%k-UW; z$M;`1uoCu9`Gl?bLWHN!et0>pB(_IWU3u$ypgiDNF~^CV?77ey6rsjRuR{8!b{k9<=W*X29g5#boA z88MZHG7U}D8b&*%&nz3CpogG;c9@I;$Ee@WUf7mT6 zOf6novvFf-fj&&wE%|G}CwARBXeTO4qEB}P?-X9xOwoT*VfUQ)qW&O#r2aETmA}|~ z$1V?Zx&6BxyE0bNrITPj&8gr=5zVj78P@xkrVG{qN;d|In?c0vwKU{mM;FOS%o4C+ z`|R37-U~-p~pxB+-Atl#Y>4nbD0X_K}u`Rk(XY5^%YDqXz zZ=66++r&_T9oyL1j1P}c=}Vs6Ni+*i&V>9yU(q5>f))d_i7%3g{HsqCwo?k`t6VMJb5-0y!{3zm7|6v!Z`X$a%5TcktYh?(R!W` zt$+S-NCi^SL)!WhP&&&p9@^1ZI0*I}yKn-eDN_~tIwCMYd8`pWS?gEq^AoL9o;QIK z?g`EKwK|49v?*xX?>Q>+u9&_G!^bmh6H12o>~ac|`Z!xS&6fKkQl?#WtWeN`5!?`) za_LcGMNy&GKkHq#sMHEyd#pE(Qg8fKU#o;O%JC+&%FhyP5(gL=s7_%`2?#m~||pv^HK zQ2$gFlc1LNB{9fjS6`Ny^kD%<&vCLPD%zZs(5bedh16V=qwe!9PR|;r8wb4|NI%Kq z{(1q4CNZs!m!`cD>c<$(+LoCevee9y^~Nu{x-O^Pi1L^sXlwux&SsHQ8k zDCuu%PUAwi6(T#dH;?K^=4jkN%VC3RJ5H1jdMdihLwEzRl<}GkBBcGCa$`M=l9FiG zMQhPCpQ=s_!x}q(87`#k83*m*h}@At;ld$DL)^p5*SF~^83r?GL$a4;XTMK9R3mu1=rmwfF{_?!BF+2YHl|ek!fn;11+?IAd5F z_){%9lFqCe{#osyvUB%P-Lqp~P72e%A<4l+L$opGmXI7(m!3qqu#Z;Qxncj|iL9Vb zRPDjKeGDjjGv|?}Xnl?uTc-cQ!txLM70P2_r4Kif;rwHh-tW3z{FEOR`Udkl!IDXn zq@qLm_+Gt|&l?XAG+$zh6cS&9F}kvN*D%KA%DE(yUx#trdL4R`M@wxGdq?QPtG?Zb z7gyWqE|embH4@Whzxv#9{?Qc}_|~E7u_7k9z7*w%Eb( zym*Up#wj}4LIv%uYTp+^aI*K*Lhd=?nqJTHHVSBG%n`CdpsN~3G1*98j^4#QqkA}b z;A7nz;&f=l2zhr~<+kzQ_AtEQrJJ>$?Mg9}$zo7g`#CoF&C$b|k2x6HSL&V7Pdglm zG$}MWYF_kJFSH|~Z`S=?xSOt3;#G;Oi4vx7m+?8wyX zuu{NN175ClWXqzpiON8Ga9iAX;^=;C`kwLboaJ3pr?cP@;B%2Q`D8ULZC&sG+QBuT z$Yf>7Bp`lYC6l#vseSA-HbFc>dU}4q$7*;$G=AfKroRq;sg-Aw5OqV}-cNRvNVMEx zPI_P3LV-a)eW(1)4t)j_%cKPvuFU*5PE}UMdnnF?K1iP2Mg-F~AA^U)R$d>_K0dw1 zlb90;bd8exGLZg9Q~EL`B`GT(`V6V&Kw02Q_2)<1e12zh-r7EQQ=bo7DL(n%l}RP6 zMpZB6a?_LMbl>z8D}ksqrjG^E0VVAiX|h)a;x4X1sha%#_0pj%GM>;PiI+czR<(^vKU{ zKWRthj1A|hChnJ>tt4B{O(~Z?OcY8^z|?>Oc+PwrEo4+(QKc2dn#uh~KrP7e62W{J_y}tsN}ERzT4Rh6j`FJW2r@YvqizIGM3J9_$l~J5B?= z_h|F zgoRrhFrId{ZMBLe#jdSveRH;c^N`B}wr*!--=6GE|K=Xb~}Znxs{N5-&l7$6W++ZP==I(0qblC#n)9qe$aF`s7>ZLAQx;*Y9Q$ z$V~fjjp=OnoDAjaT68#FCMLy$uFGNIt#2;;ywE|t4{Ju{nSgmy#}aSchHnUU;*$vy zwRw&a6Kc}_#aeicS*}z{WZl6(e+!&jT#cez`M1}I4pF$_|KzAO@oJ3C)GFC3wUuFb zgvt(I}Bw;QH>T2>9!MOe*spNQbC*<)52vCI> zo7Tf+X9o=9D))bst**aK#Pdty{>o1-85n{J&auFX^`fcPZ?fHvlVe7CiSko@GQc0p zQFY>`4Cn9vA3$XtrCCaOc5$u21KQvc(F3>&Ct>74ljWym|>7lF!?8^5wXf^Zv z0J$)H2z2xy4k=H$<=}Xw(l4MJ-(&wx)qd0|IXl_uu%J~LLAgm|#Iu#y4f_GKBtWq6 z@2DZ0YS!p@$GHeCK-hu>j{`jZ3kQXnXW3Kf691U?gzRU~SD4i}wDXpq*wT4Fh`tw&k->D-Ryy^l=nQZYQcuKqLg1T; zkLUlP$Qwa{ty*Y;QDubjD$my@WTjDx!XmX5PLSi8{$N_3H5T}jD>>!x|EHv*(XzVeP@34la|0wNocrVJ@MArGG?IagJ=n4@Lw8Z8i^CZaay3uD<8qbX>4d(~!s^rqg_w!w!Mc$Cj zIZLn;exv{Rr!cV*k!cC4vFxZ>U=GpAo#6^^{W89XLxEn%i-TS((IchgFe^>#tgoD~P zVz2*0QHifm2^m5nbrH73%rV&)AUO46t(>a-)U;kaVy*VvWh;LK)IEp213b@vK7*KL zj&*}r&U)ECLku^0fz2u-E4+~SqmhZMYWn_OmBnfd3Crqm?w^sXgG#R%fp0}NG=F0k z^OpSCqG#Vg-vk(5?7T}eFr*vV3>cdI5CqZf0lVv_dz zcMZ+QEdzN@{z4R+ea7!)n&*XmzW)0>Ylb{NjLIrKdI4MXLz-j7OcLC}bMe9-`DL*W zGknuC0>pDU2E$etqt){3TbDs)7xGQGxht1SxuGg zJjj6Wl5YNhTReW5xayx-!DAM*tk^l6W8I#o^}C~5Bq&SQ;N3v&u&zJZ(;*s#*54c7 zX=fN)uwE;eI$=DqE;qL7OanKKBTIRNIo=zMoWi0cdmG?LVS}Xsp9I|s3NN*FbTt(?siP^$+ag!7AoXdnKw`FqyISaNy9~VzgwL zYRp-Hstck7%0_BDG3~%?iiDEqpGQK@hRE|#l}$SUL~t^TKFd$% zDM&~EM9xk?Kiq={;oN%4lU(Wgj7OhCV^$d;YOObt&^&&(IMMyA5C;gnP<{_?cRc}y zU(j}?1wq_G;-Lr8*bIqOIm7{FO+UlcUwx6JQvt@zq-~ptv zn%tXqfExSvW5TxUtw%d5>@och5MY13a3CX?vYf)!{Xy~T9;iGFqE?joY{%|!Txp%8|Sm1{jK9w+1sBIJ<5q?8Ww=?^;&)>khqqOB9rfM;}V3=f}cG*Se?Fz5{~IHPC>bDfP_m({jDsO=1(M zKI%By6)JwOtJ_(Gh!&tf#Cot^Jc!?a38_agaWmZ=O|3CJ=sCc*Li4bvM}`6ii8OC9 zKAbzoP(>pJc|5b+@At8Q9-=PIIPz`XB3*CW48+-R?6(mOBZ*aGBuXB{+cmd1$FnML zQT3cWk?Yl7eLC9Hr$1BG$c8GgVQt=y-1*w|FLkD6QkCy|)NAx#U|5Ix-CL#!-$yuR zD}jKw-=$MqZ+oT$&o$z zKQTz-Lw2t9hS?!5h!2mVq{S;@m$)##u~6;Bxp{V_;+M+;QS`frU|wH548R&(N*J@v z(yAFrWp`Dpc`mvDq)IaR+Hq@Oyr<6wMoE!+oKs4jTT#43c$r}VgH4)ePhSGnm8YaJ zlc7QnBQ}!D0Dm_=sG1D;57Psh-q{=wQXNfhv4{Fx1Zdsh05^xk#ClW7u032hNio!| zu>bzNSN26Kz54@Sx9oo?$3U$X3Nb!hXK$1CY-$Fo43=|~4^~GT3yC$1sp}!qkl`+d z1=fWQE|znSt;x~`GIS=cm+B(}fnVd@B#%sjy&VkQsm~P=OxJw?@{ZHdjI7KCyzUZg zarPur9c~FHCPjqbfw2EZ6fh~mOcy*Ab&a1C&jP%(J3uzen?~i&no%C40fo)ffI3QN zAz5tK0vKyj78{>hL7NkSWLb`Kgp%67W{h%~TD<+(4G-VA1wwnT20%#XHrTNWAls@t zsP3dhOO++;6`nVdeT;~_H)f@AQF2Z5iV;Q;R!)C`4x!U!psDN>0bgg5s(@XRk3E5>aPvov8fC@ z9P;&FIJnpIt}7dU@-D&>>cabmn(JpEecNL8^t=#)B{AeNVGLPW1dX*dr76j=)?Tk+ zGJILSTcmpLL$oijC`TE(hQ>(MXa?PD1XhAkz7Q6S{Z4Ou6-NAR9JAAT-abW|kF6O4z>$zU?=n?}6jX;UD|94r?O5sSTgV!TDMw zXyeNuXKa9*m%_v#jhrM=UdDlu4-kv_I++-{G`=lh^638tN1<2J_&x20A!s~h_N=dv z4^ozL^jP@smyE@S5-@tP`UObUZeXfQylcUu5FV~!3FamujqB5AmdjuIMSGF9Nk&@< zQ4w_UP;sos+1GQ*Sm&4%qIlimsyw5lqVT(|q{2^6@x$R-*hkCN{H=wry;=CG@ILu2 zJpcRf){JKYJ)HWo*__yCC7!!EW>3f%$)7?qaZfb47Um2Mr4?DH?3x`L5U93Dv!2s> zSx=dmJS+o=p`Oy<_NC;Qdm^i!foefWfAP+x3CB5GYxP)`uxe;X5!z0#^xYpX#W*>i zPI=(|O5a!!_Q_V6^o#<}v~E3s48-!_YLLu#+5+E71~6?0Y;gL1EP@y&@&(y zeAI(uF4wp@m$r;)b%gB?Hbzq#Ly(!{G?tQMhYWv`SEp4t_ijSE zriQD*eZXY=0_(&3jE}!7{&2ufYnz?E zAJWEM8oVxBQ}x=5>WI9K8b6hxW3+jlG~qD3Nk;-ewO1L%04f1CavN{79#2M$WW)-? z&|b>Exll<`8LLex8v3LDqBG|^5Bi$|d$D+Pe^3ot)HTbgs9GN6f`b_mPz>vZYN2(B zs{Mme%21l&UtAb{&#>7TCT*V&i%6rH7k%E*9xlH5-$0NeCZba{qK#wyNyzU1EBuRv z3&p_qGa}=o=%{k`U^962)iu3(NlG4M+vXpV<09%`lgiK5!dm(G&r`{&_m1C!9VX+a zl^uGBeX#yjGGr4EEzxG~tISaGzwf^Q5s6%c1{7)ovvGcm04kQWna3Y5-THED)H`dq zf__!^KM?mnvT37$p)fVTnSVIug=7|!W@(XU%a zCpLMAK-hi7C1>iN zA=eY&i)uhGKh)Zh80#ht2=BOmNG~p-?eEc*BjsDe{b$!N^@4ZJPH*<8an|l$k4yvsQbo=D-#{?gYKP^e9Lezh1Oj%S?OX^+*CC!n@L%~(K}xSayN;tc;oW0 zDmbaUc4WjTh*0|kAOU)BuL0q=78$C%@1*1nfMpm}rm0!>ksA_bh6`+L;d*VSH}#o- zVw2y0vm)O|FcucexJl(4m>SecnC4GlPpH0L+Wyq%#e{V0SlQVKb-Dr~&Acv^JxWwY z`MTz^p6tl7BZs+vDMQ}g{1w&Fl%&{$Hhe7Gz;7h}0+uO3n|u8J>N}Yi+j%J#a5nuy zLat&(zOFzDNndBM*jUg^hu2U-^Y(4O2ZQ)AXZ530^z}fi+}CjW_*6p0pH7hhimo?i zWEK3PCK{95Gsiu4?TQogzoR}WjL|4<9!R3QGYonNaMuh0F%+h(2qUL$1}Uwk^c&lQ zjybXqm(%8jRnsv+u_YhTN@OmxG6@)L5g}W9$rDEU^=m%BN$gD0B%ZAdBk>X{HP$7k zE9aL@v=(0Gr?0&@-6LAu#|Zr1u`dv`Y^lJ|tW~wa<2jGgG)k*|a$96RT)l?2ULVne zZBySIzhl~(?xz%UIvd$^_cqT49TOvlhB_r_ghHHq@aNUIVof z#@6>LH`PMtdcAa-I-g~&4@zs{>)}nv!i+%hS~|A=7j=P5PQsl>5jA|0AvR5e0-cJ(xbgG zPgeQa;*i~o?wAW^2`Hq#{%czA#X3q>!kl8Nx0w)DYkP5=(H1LkbJAW~#B40}=5S)j zVzSRQe(oEcEJZ#1Hnw6Psy63A7x_7{?@W{@hmx9;sbkkol0qO#n#2M#&bx2tgYlaU zKdqLY&HqrEH4$c8cK$3jrGp|L6q>0nR+SPHKeAc4057q4i#}4Ylx)su6bJ*&vZc}7 zd}nI*Ra&|zT~@(EI_qAGCG>tc@E4ePxfDf(88 z^4`0ouTkN$TCd{gF2sof*He?ZF0y&C?9qMrrUwT?=rP%fI~B%}GWL`C?Jmw#1%z@; zak@YBbgSHj%)iK6@aB>OCEcL&89-LvqHqa4L-GB8oWehoVhgcvI3H{}Ge?Umu*a4RQQgSbmpXzh!YZ?Ax7t>jb(wyiQDo>`V{p^MtLjnyHg_WRhl-ugg}C ze4A4JTjk#S>2`npsRU1tSNL{mLo~9QbV0~PzVz?Dt1K3F!U0U~LKdgR zOueimmR!}kQ>|?hY}>{1M{ryGXzHF^`Y8=-025UtVridZ4ptk#^hFq9-8SyUsLzJQ zaFkpHhW;^Sb_8Z5urs#QMF8ct|Fj5$k1`{B&iV2r(bMy`kQWE&w0PB@F?54l$06np z{VCfHvG)PVgaFq-6mh*U>96T7{J3J|Pc-@J7=JvkQ)=2oDlq^9#jUtMYu`;;+negC z)2SP=1|-E9juL277|l#~ zxCsa)56h!%C%J-dKcH9(teTS8Wc}C>;$Ws|K z%{;nGWC+|02t3Lj>&aUEJ)jOhZ+pG@u!;sW#3;+84&2QEL>1oh?r{sD#n;#5MJ)4z zZ(a52;aq@Smv$dQ;PXy3l z510|d*IWo9%MNZ_MC#FL4ApEn2bO_F&70KsvY%8IadOVchrACWJ17sf&BB7_ujSj8 zZ~6IEJ_S*|jz^sW$(ziXVoCHacm#LKJviuqNQ|8jQCp78EQOsIQ*dNbo@|TgQbm63 zLGh;#pE?O`5o|dShhyXw$T^YZjzk?Oy%r?>0b#!~;s6h+ z|Gn-pBzzU}(PG9?Put;~m?~Z@Q*xBv^&S`9iU?Id*l21l>iTK6 z^9@;s8zqLe_b=y_G{O9rQL-TI9%uRDAz3lC&$oN zm3^zG3eTh08tn#tsEpkCPqs`k&J!bq?fA-u`Q{Whm05ji4ZmOfzO(%!`A{fvP+D5q zMZ6+kq6WU%iueQA25*(Q^A)Wuax7@j=xt~QnME2Nh5ME((Mvmu=-zh+E8YZ-Q4Jxz-Z(=dLzzk95;- z^?Xwo;OZgd$@cXnuCa059S8B=72{HWv5b%J)3fg52E@hqA`BW0=4!C%>-II|u%HE1 z30iRT_LO&G88FKxS8A~em4`wOq5PzaWMcgI;UAyvp}2+JG4{upH1AT>_t{@)X0mZj zZRQsnCu)i;gs>)`^itluH<4}M>lJQLWzQNorWw}R*C98}ZOHv>A z*&maQ8B%d3WFL0WI~O6>5^4;wTf;tBYNMWYPZp|mmPbR?2@KhY&I0w8cj{2RU*P}V zyg)EeCp&JtCS4aSYK(%ZP_pYfNEucVwHS<}957DeA>?ve4GJr+B`cg%5M0y&F%L!nC&N(nVjJ$NPESJNE zR3v)=(|!O^pwyxi9NOa>FdV^eP}EKE_`|nFUBLq#FA8PL*c0u8NlX$-{1ovKfs$YOscA#NpUQiSrwAq{a-u4Xg@3W6jGK>l z@3QAfN`K7gCcT0Q9jm{(pL$UH8 zJ#?&SX4kj#u_|t}6EqTsAjzen$b{0gKqXGulhcTRH&{hZ#t;5VZnU!{DMl2&4CsBdVhmS znu9PKet)ya@3QNjw}K;jHN*1Uoyp@{{8QQ)7i&q+70lH2d_EJ2^`(YaOU2nqk2H+u zsSEVi^=@82SG}6TU-~!FN;LL9N2}w87v{n%Jc?J~h{;??n2$Tfgx$arMrL0Q5Dtsd zz#PE06XdaA#z5W#;KNvQ-KJx?I*&g$cb;y*!iXd*!E(+57Gd- zZxQu;yg0M}P%!@`HRJ*hQOcVk#f6&u3(w3*0xrYx9T!z zCq%flD*bPy9CiG-6YqkNRegN-cIJ~u=uASBa;P=G;EgMy)E4@t@-e-R` z1bjsfPg%by-`v63g;a1Rkyr0!xE`rT`-qQ!LP@&S{7FABvIVe<*XG|9w>9LJ0Znu+B3lqGCR8A@+rR z14!WyCB)&mh}+zW@4TyOK}ya17GgvIlbcHZx29oU2}8EtA8EAEhPPmXgDU==th;z0 zgP`COv=YYPTE4pb??F-9+E{i3hWGYsJiNKETR5?G+Rn1c_+(lzz?9^cYKcCMiClB+z;oAAaQ*ErJyAYY`~ zt_x*$uRh#>_G;`s6+p6t4RdxQ8!9xZ58IT(SsFYO-lsV`Z#SZfat+NKpvIf!_Pr=ljirn~FR*?M;;+70UO6eNZLyw@aQ0f5hzPIBPl!Mu$O zV#jJtohgq(9_ovivCK)q@l4Z1V-?vMM12edl2o)!zyK29!O{TWk$eGJ%Xpa}Xnp>l zK*XdAPMBol#2(8(me2VFvY7<^ZM%G=`%trJeewBsHA^P!Y0>%e_<}rHW<}$a^y6iY zo6NEP?`6(D1`JJs(qzc-|JY3~AO!9wQi@f?4PrY^2iLilN)|jy5QYxbBgyjZp15n0 zk9Xd-)#xM^LC%Geb<&jSg778S8Rz~odMorR!-tA}tZpLt3xe{*A1u3hEaIzA6c~p~ zybF-^ga1-WQKDWq7?SN8vN%FeFPSJ)>{C?k5i28`3}Elv47kwmn2e zZ?YwheJOhz81aJ*wXp^LUaQ(o&aC)(usFZZ^~nT!o?b{p{tJ0Ed`4X#wySOvqsO+_{#b zvdx*3SP&OW^V$G3*+~y?ono4)l~(*j*jQ|A&@h4Rnjj?B&ozY}$oliO^r#2kT2dxb zd7DAHPk?hF5`dIKZBLl$D={R+!jX$CtXrbzK4dfP?bJg1K8#=6~vHBxZ0 zowQNDz4$BL6d$JOYdbBY6|IUlX!Z@!!UGn0e!G4;M_q)5qjUpVKYj`B;8G!!(@U^S zdo>qbtFniZU)z0Ok*-sraN+B+t-+CXvw%+u!_-Naw03%F3k}5nQraKz965t-(mo-@ z;pycbn~xkTgRd&oZ#*8CBfoUG)5PWpu4Y~9C3qA7$@P7$-4V_26L9}HC9R^27#h2< zOA$i2&3{d3ZsqP*(mQ~+E1i1N~(i}+`?!|04^ zs%&Im^L;EXrOoxe;~n~ZV7;8(rwH3N!oD785?p_b-p6@U`}V6CHahV~IN<%Wcz1bT zBI1P7aV{Ro`!0qz?j{M>=M&AxGg*UU6W3sHRxRD~yM-WWzq0mq%nOB8#Y-4Fqjc9x zdHVST5`XE4fe!-E>NVazj)Y&zI+OH*?D&Klm{P6=Kt7C=42%0-%z*fxI#qPbk^JO` zIxh>hzcvg)-}5aK*X@#f>0@@*G*pT#Xq%TUc4Nu@L*cy)YH{=4)s{A1SSP3_GxP2q zAY!43$9}GxteyC*1Sehtc4djgtg0YmxoH1g(os#xKcbEZvnH zPqg*4OkaxcDXMLGwkboe2I}67#8SfGYGS=1%~<<8Y^*I4dfQ?tHdXRJ43G18=GGO; zZz4IZqJ`YP7}QR4v0wGvFH}bKI-#j%{%k%MT@`*7W=Tb2r4Y`v);sxB%*jmKwt*+j zDdIrBT$|3 z)T@MogGPQ(!pBTYS?-0tdU7;a21+ajN95_tF)v0*3WDOkzc|ZwNA_)fkE3itc#&z} zUWKx65_$$>Jq%p$r(bSWhX^!cyF8y~v9m~4{<8R?uEiS54ojLKAK!dO`ceVQ@^!`W zE5cZQ;uBN0_B@(5eCSkO?CJbexPd2b{Sutjm7cZ!VvX5^%S}yg5|gD8zy?`wyvs-c zPx~?7Fl-$2EBJ#DnHLk^ex_y<9%J5D3yMP$?Zis6{4o##?^2xy zpCvRv7odD%3ZEzfBBzk=M8Qy#|9w#Dx|2Y(3mG^8w$q*#ATqnjv6^|#sj#IfjWg&@ zFD`@&*30zv&FaqLR(KBTb6`e;McMzb#tRVMRr85hksS5G$Nv!+D=5MtZ^vUT;1s$f z2X#pLX?_9Lwk*6+XV%G4s8%a)>n1S$!@8oouahQ&;AS7iJfvim{$E{thNY4E1(gA; z82+VjODQ7fv_qzK&KZQ*V@0w}E9*PEZivt3JO=unsjLkNy(3AA+*W|jLOgdr(bZ1-nv-~K~6yt zOg)ntoIaz{bD_5?*HfhH-9Va24COO0-Bj{pknEU*yt6T_0eDiWv14y)#I)h z)VH67BxTKH7*6x;;ord6g^lTqyh1ajhtc+jh~(U4+Uu_tq;A2>+LwY{QZXfvJl>|>rs^E0 zoI(w56E~$aEV-%~-T`-L%x4GiicEJ9%DC5oXhVW)_^)uObnDfXZ1#9JpZyYE7dw}& z2_wC>nx>%Ltfh~mtY;T@@B6WUNT)shzuVR5&K-*8`+qD?Kd(E}bB>1Jb$u>8FJD&Q z2o(uXQd_YQGD#J@3+IVgF4`?YC&u*IuCHjALbV$qU7s(E6?#<~yt!E(LA~>HlW3D$ zH|Ps=NR}w*PMZi+w|v%X(6v{b<#RcTdLM3V#kQa$ZHHcUAGf(6uowb z2`2g}FBa6Sy!6b2)$>ChXH$;W%gt=p(K_26-b_>FP|4b)eJMKY{WSZSbTv%j4n;4d zoa{5SMpu5>n~DLRjV(cwiFk|U_T3>5y>q@&X;1uJ%pQ;96l>3D170Wc z3?P|_8C#q|Z@()X^wNHbMb;+&-2+}Yzdk2DQGVUKX9yeMb*YyI*QL!&CatSaubsfe94G9IwcaG zpfrsXv?#T`@#5#V@QX~={op5v#!U!F%sOooF!b~A)?hMSOD~!38LaJ|UcrYlY$(c3 zDDCJ4%U%c*wP9j$E>{5#t`Yb&=z^}6>1GWw6eKcQ1P@EpzFdn;w%>jh80hZ@X2JT^e0u8L4sWcwbMC&f ziv8^#UO&?Brt5f_4#;ktCRS%T_6qPg=IW~Nuh7%1S(`gp{I-~Ia^)+o+m-xIQovF& z%e6M#s4@ZMx=daeXZuH1v2{cZ48G)LtP#Yx^r8I{0 zPYGC(2g;>tk8xkVo3G_!QFEmGVk8p`&%F4n|K7>nqRjRhsP9&AIe}#O=SaafIS&#> z;SJ}f1GFFD9Yus$$ODw%85Zc6%b4HN4EbXEI)V7H{lmPYGmK6rTiZ|d!`m)IA3CSk z=Yo2~=T0j17|q}8bs=g{&DvR(RrZEB@@LpPcIZz1Zr+kr@4WrCyqWJ9X%D*3xaGH| z!tSV>;Tz){?o2yc;-yDsE9r`E`~}S5fv<}!pDKW$r$;5FEQ;8p^auSG8d=AsCupvP zKzJZkUC0fDkQl2%q#GUy$hCN#{3VY7E5l?s+bm|aEg9=R+3@Y)7e=0GXXNYc3GojJ z+Ot1qPcaWGoGtjj11cUq96}-2o{^rDg)&GV2fVd=Z>7I5Pu3eUlqbyuZ_jXWAz~^V zOuC~*Idq?(T<9OV_5Hi@X>g**vrAWwr}o={r{CET%)~P5M}0Y}E6sI3?xiN;bs+Tt z$Qpir@Bqkt<5Z;S-~(t+G5LObfWm|J*&yq0eto$lLWpBlaTxi+hD*h`Cyk7#|zyKvtI0mj_AL<;?92p4|gpj zPbMsgF#HAaE>>(&HE%6rkhU(E{z99LU0;9G#;D6p?|nl+xWW5b18%2uT?^YTx(#-ap4@JDl^JC+_>YuKT*< z)pTUI&luSP4G4p1j)%i8OhHz>ch;)cQ=JEl5*F18rNO$9^PI6+i1Dt&;LM$ zeG*t7UNmh!Q< z#&9^&eRql=V&7<|2SEm6tUtawy!;Nl4|D8uCB_)&-wyV3`E1Bewyyr@SZ{Rivx!4N ztL9L3SL%U$6N^Joz$~Pn&1lv9p2O<1Upm`FufoDc12AjxNOnf7^*84>Ma1QI-21Zi z)GZZ1-y-g_c?zX$X1INWbXv>vX$fe za`=v(`(v?V-%aH2GN%mNo_j*Rx)#6u+sDfKpzVZT?5owrP7KM|1v>(9eW80?=o%Bk zipFtg5+)m41EB1HYeKd|<4Cb%9(&}j1OOpQo?$ynSRn@^o=MP68X&sun_eM({l0_M z&#rVOf43L6l77oyvauFJigy=NlA`E5l{{I4>_3#Y8~s{Eb}9E9U}tDvy26@WAt87^H6S1S1=^F^!G`tp2XI54XdpSz8N$&4I&{(qO)$~0 z5#*Aj3HT#x5dgDw7TLJlRzPkd{|64z*0Fu5=p?_DhQllk$#Q3hakQPsRSMFBru5x9 z0e8SmAR!l^;nlG1MfmFT-Z_BT%_G1W+2b41#}NSxg9%#or=kQ7 zj@ZzR0VEeOm77U#Co0}OdzjiW`bA&vfxDqI##PfK!lq(}2>_6_fhVI<0WRjeJ^Wt5 zmP_ORAFPr@ek8AIQnY?-WF12Jds24d;C)V-Mx(xlq6WIs0s&|K2t)T8I{_ofk&ukz z%&WyN<*(I#4Ky`#gAcBnWyvmftw)@k(^f@$kst5(Mlely;p8B-ypSTuadn$qxB7)p zjQJJt>ME=-zB-Cthpqs;B!RfgOvMT9#!K9Nt4zg>rbD+b?Gt>Qfm5*U_z1d5YVqQ{ zLHD>Ad3@PB*k;!N(XA=Lz7s?+cwvwiE)6e`+K*jvk0LNIT{8Eg{k&w;#~<$a>8w0) z56B7JAoH`}&f7pyNsYQt#ji=kWdi^TDO6%bGjO9AOc*&8pISNg`!zYpv3)-!B&h69(TqX^Wr@R z>Pj$PeN%FE$4A-a{TWS46O{^f^zzC#tXynRADJpBj{Z|2(8o0xrW8H{{huk4k>??y zpKc#mk#Yfj2lLm!e|bowR;L%{%E%se&m^2X48Qb#K`5xJ3UsUAs)E2iYg0)!=M=%o zzVWJtk5zPYH-ym5**r`A&i(ws)pSbl7x@S38_&lL&&989|N5?5Y|a65xaZIGpr8U< zW!Mo1Fe?Y^sjy|G>0#@4w!EurfL-*ADarHPH0zxy$;tWs)wcCpotZB{JJ#$`u*U_k zq#ULw``Vq7uc*%f_vheFV2yo8*DCTgv9kN+rMR29AgHA-Toh=^K(KaC7hpd~|I6wW@XAF-W{j5MV!Lf9gaccSz~*mX3zyuJ4T7Nt zz)Hj^z{F57g!Uxld(=)zM_hgUZ0J3zc+YBEo-r=;D3&@zx}|a4w(Nyw0@_3n0+PQx}Vu^8Js#T zvRvpF`8Mrx%8veYD-VQR1kB~%>R_I=Afwu7DvXS>9NYB=Y#MnquDa!Y+3|Lms z53mfxD7)6a*WkH8i&x!sxh}Rcl-oLG#jC2rIH^+evcEk7f4+d4k=8TsDzJ(h-uefD|WMs{LIHtYSb zA9ir}RPl-5VaO8iLW5vnhqt$gK&b!yQm~2VY|GB<`J+fKtjjxHRZj}&*<&k*#WYaTi>gGai)cSrzq6}WJt~wZkQ3`W*`7bkcv_PCd14)pj!M4Eb{=r zMnfM6M%$DOGx7%z@c~Vut!$`d=0z3DdVce)^IgYpLpS(lDb2}OlFiRzDWI6^*QjsS zVgI|vwj7}B>+ghKQHRRCwqo2XP^$YrDuuQ?ryEJ8+bgJ!c8$4f{9hdnr#>aULoXDg zZSIYxS%P5}LA%d?9CbkwW!~qTe+>;ZkW_eI7D{rwnvYNs0>ol$dDza^91yHpz2LQf zCQuJ%MCjFN11C$Jt8N#W9~b3dy}z9`z?`ChwbkRA``@}}1J2e+g$ZyT-N_e zYU(Hs{^I%>E!+{Fi(h%NK_Mo0{#7s>4a=OeZuGgzVaxyamuXMzB*p-GoU|8Dynho8 z#y!uY+FE;X>t4Cb&Oc}L`#{ycKq;r(&Qi@dxlW0D`Nd$@x&_>_B1i+9?+Jv?$ZVTm zaa9$zKdmo9GmJ;0c^y*USd9x5%hKO&mvZ6a4vJsLb89 zfklwR{?LTfhxDX}s{es%=W=dsF}90sQiR%ts~pZx$6Z=t2_YS?7m|w%O~0AP7HHgh zuWx!&6jhUeQ*j0HM^=-S7n@HbI`Nw-KPoE(ZV=8>gv_h5YvTTTU7u~Y(O~lgRu4qpSj8c;yiBtZ#-%`M|v-?l?^+~uxY_qam!&mnUyX1xmU0hEsRKoZf zY@Hy!y|EFkOBxC`!ao>erc2?t%j66m*H5Ng5OBE>e0F_6S5y}RqkW<&=PNBE#dunA@xFWL^G%kT?IZ>Rz{= zwnQYO3cujjv!&1#Xd=iWC%H&e9JawS)ktt5;6`~T0ol-0khP%r_e&)gv4?~fIoR@s z=`5wEuV#b}DKSr705jtg^zr}}#c_NW;awYKu{{CfVVjR?GWAcJ=CJ3N{D5y_;G=Dyg5?25m4-r;{msq;->vbGDa zBc|vfDQ;ZhtY7+9*MFce{nDXbWDz+Q{tArnTZ1l^|Fv2Vks6g&2%BxGhVb1uk>%a> z=EQH2EcS-l=LxJ)|7;M;G03^)OqL@%{<+Pv^l1mzQXil=YbGw1^4t$F8FPI#wKG>) zaTX_HnfxZ_D%|VkR->0y?pbbLz*W8a()C1nn>H!WjK3ihV8A2-=l=S`@+p6iF-nAT zMZ0KaiD#7gQJPQFpI`oyv`M0GMgM?!Wp4NC*N|TXJ0=rKjF+354LKi-{>i5}kZ)Kf zi-L-n9IICscjTAJ3a&CVedI08UQSIy0D`l$!-+Iq5-n~gkKdC^>$%NPsN%inUwmbQ z2~h0=wN-YR>N<@L3==M?WY9`~zMy>7*EK+-LA-({SR0K22#sO^mfFRE-)a*;pIy)n~n9y;n396#HnH-7*i0BM?J_`QZV%h9OdWayHxf&QFrENJh5NDvbUChC+}eYOc@v(gBy95D)KtNx&B#L4Y*npg=6e1|4_~ka-ONiWBd

L0y;c7eI)3PxL^4ebYz_|%n2zV( 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 literal 0 HcmV?d00001 diff --git a/doc/advanced/Potential_Reference.md b/doc/advanced/Potential_Reference.md index 094d59b3..6230a0d9 100644 --- a/doc/advanced/Potential_Reference.md +++ b/doc/advanced/Potential_Reference.md @@ -165,7 +165,7 @@ lv_bus = rlf.Bus("LVBus", phases="abcn") rlf.VoltageSource("MVSource", bus=mv_bus, voltages=20e3) # Create a delta-wye transformer connecting the MV and LV buses -tp = rlf.TransformerParameters.from_catalogue("SE_Minera_AA0Ak_160kVA") +tp = rlf.TransformerParameters.from_catalogue("SE Minera AA0Ak 160kVA 20kV 410V Dyn11") rlf.Transformer("MV/LV Transformer", bus1=mv_bus, bus2=lv_bus, parameters=tp) # Define the potential references for the MV and LV sides @@ -199,7 +199,7 @@ lv_bus2 = rlf.Bus("LVBus2", phases="abcn") rlf.VoltageSource("Source", bus=mv_bus1, voltages=20_000) # Create a delta-wye transformer connecting the MV and LV buses -tp = rlf.TransformerParameters.from_catalogue("SE_Minera_AA0Ak_160kVA") +tp = rlf.TransformerParameters.from_catalogue("SE Minera AA0Ak 160kVA 20kV 410V Dyn11") rlf.Transformer("MV/LV Transformer", bus1=mv_bus1, bus2=lv_bus1, parameters=tp) # Create a common ground for the MV and LV sides @@ -241,7 +241,7 @@ lv_bus2 = rlf.Bus("LVBus2", phases="abcn") rlf.VoltageSource("Source", bus=mv_bus1, voltages=20_000) # Create a delta-wye transformer connecting the MV and LV buses -tp = rlf.TransformerParameters.from_catalogue("SE_Minera_AA0Ak_160kVA") +tp = rlf.TransformerParameters.from_catalogue("SE Minera AA0Ak 160kVA 20kV 410V Dyn11") rlf.Transformer("MV/LV Transformer", bus1=mv_bus1, bus2=lv_bus1, parameters=tp) # Create separate grounds for the MV and LV sides diff --git a/doc/models/Transformer/Center_Tapped_Transformer.md b/doc/models/Transformer/Center_Tapped_Transformer.md index 0d244382..09cef4e9 100644 --- a/doc/models/Transformer/Center_Tapped_Transformer.md +++ b/doc/models/Transformer/Center_Tapped_Transformer.md @@ -82,23 +82,20 @@ import functools as ft import numpy as np import roseau.load_flow as rlf -# Create a ground and set it as the reference potential +# Create a ground and set it as the reference of potentials ground = rlf.Ground("ground") pref = rlf.PotentialRef("pref", ground) # Create a source bus and voltage source (MV) -source_bus = rlf.Bus("source_bus", phases="abcn") -ground.connect(source_bus) -vs = rlf.VoltageSource(id="vs", bus=source_bus, voltages=20e3 / np.sqrt(3)) +source_bus = rlf.Bus("source_bus", phases="abc") +vs = rlf.VoltageSource(id="vs", bus=source_bus, voltages=20e3) # Create a load bus and a load (MV) load_bus = rlf.Bus(id="load_bus", phases="abc") mv_load = rlf.PowerLoad("mv_load", load_bus, powers=[10000, 10000, 10000]) -# Connect the two MV buses with a line -lp = rlf.LineParameters.from_catalogue( - name="U_AL_150", model="iec" -) # Underground, ALuminium, 150mm² +# Connect the two MV buses with an Underground ALuminium line of 150mm² +lp = rlf.LineParameters.from_catalogue(name="U_AL_150") line = rlf.Line("line", source_bus, load_bus, parameters=lp, length=1.0, ground=ground) # Create a low-voltage bus and a load @@ -109,10 +106,10 @@ lv_load = rlf.PowerLoad("lv_load", lv_bus, powers=[-2000, 0]) # Create a transformer tp = rlf.TransformerParameters.from_open_and_short_circuit_tests( "t", - "center", # <--- Center-tapped transformer + vg="Iii0", # <--- Center-tapped transformer sn=630e3, - up=20000.0, - us=230.0, + uhv=20000.0, + ulv=230.0, i0=0.018, p0=1300.0, psc=6500.0, @@ -126,11 +123,12 @@ en.solve_load_flow() # The current flowing into the line from the source side en.res_lines[["current1"]].dropna().transform([np.abs, ft.partial(np.angle, deg=True)]) -# | | ('current1', 'absolute') | ('current1', 'angle') | -# |:-----------------|---------------------------:|------------------------:| -# | ('line', 'a') | 1.58451 | 45.1554 | -# | ('line', 'b') | 1.28415 | -55.5618 | -# | ('line', 'c') | 1.84471 | -178 | +# | | ('current1', 'absolute') | ('current1', 'angle') | +# |:--------------|---------------------------:|------------------------:| +# | ('line', 'a') | 1.1229 | -35.6881 | +# | ('line', 'b') | 0.559322 | -157.84 | +# | ('line', 'c') | 0.95146 | 114.464 | + # The current flowing into the transformer from the source side en.res_transformers[["current1"]].dropna().transform( @@ -138,24 +136,26 @@ en.res_transformers[["current1"]].dropna().transform( ) # | | ('current1', 'absolute') | ('current1', 'angle') | # |:-----------------|---------------------------:|------------------------:| -# | ('transfo', 'a') | 0.564366 | -63.5557 | -# | ('transfo', 'b') | 0.564366 | 116.444 | +# | ('transfo', 'a') | 0.564362 | -93.5552 | +# | ('transfo', 'b') | 0.564362 | 86.4448 | + # The current flowing into the line from the load side en.res_lines[["current2"]].transform([np.abs, ft.partial(np.angle, deg=True)]) -# | | ('current2', 'absolute') | ('current2', 'angle') | -# |:-----------------|---------------------------:|------------------------:| -# | ('line', 'a') | 1.22632 | 155.665 | -# | ('line', 'b') | 0.726784 | 19.6741 | -# | ('line', 'c') | 0.866034 | -60.0009 | +# | | ('current2', 'absolute') | ('current2', 'angle') | +# |:--------------|---------------------------:|------------------------:| +# | ('line', 'a') | 1.22632 | 125.666 | +# | ('line', 'b') | 0.726787 | -10.3247 | +# | ('line', 'c') | 0.866039 | -90.0003 | + # The current flowing into the transformer from the load side en.res_transformers[["current2"]].transform([np.abs, ft.partial(np.angle, deg=True)]) # | | ('current2', 'absolute') | ('current2', 'angle') | # |:-----------------|---------------------------:|------------------------:| -# | ('transfo', 'a') | 17.3904 | 30.0135 | -# | ('transfo', 'b') | 0 | 0 | -# | ('transfo', 'n') | 17.3904 | -149.987 | +# | ('transfo', 'a') | 17.3905 | 0.0141285 | +# | ('transfo', 'b') | 0 | 0 | +# | ('transfo', 'n') | 17.3905 | -179.986 | # We can see the secondary phase "b" of the transformer does not carry any current as # the load has 0VA on this phase. @@ -163,12 +163,12 @@ en.res_transformers[["current2"]].transform([np.abs, ft.partial(np.angle, deg=Tr en.res_buses_voltages[["voltage"]].transform([np.abs, ft.partial(np.angle, deg=True)]) # | | ('voltage', 'absolute') | ('voltage', 'angle') | # |:---------------------|--------------------------:|-----------------------:| -# | ('source_bus', 'an') | 11547 | 9.20565e-25 | -# | ('source_bus', 'bn') | 11547 | -120 | -# | ('source_bus', 'cn') | 11547 | 120 | -# | ('load_bus', 'ab') | 19999.8 | 29.9994 | -# | ('load_bus', 'bc') | 19999.9 | -90.0009 | -# | ('load_bus', 'ca') | 19999.7 | 149.999 | -# | ('lv_bus', 'an') | 115.006 | 30.0135 | -# | ('lv_bus', 'bn') | 114.999 | -150.001 | +# | ('source_bus', 'ab') | 20000 | 0 | +# | ('source_bus', 'bc') | 20000 | -120 | +# | ('source_bus', 'ca') | 20000 | 120 | +# | ('load_bus', 'ab') | 19999.6 | 6.9969e-05 | +# | ('load_bus', 'bc') | 19999.8 | -120 | +# | ('load_bus', 'ca') | 19999.6 | 119.999 | +# | ('lv_bus', 'an') | 115.005 | 0.0141285 | +# | ('lv_bus', 'bn') | 114.998 | -180 | ``` diff --git a/doc/models/Transformer/Single_Phase_Transformer.md b/doc/models/Transformer/Single_Phase_Transformer.md index 809c3d02..718a76b5 100644 --- a/doc/models/Transformer/Single_Phase_Transformer.md +++ b/doc/models/Transformer/Single_Phase_Transformer.md @@ -86,10 +86,10 @@ load = rlf.PowerLoad(id="load", bus=bus2, powers=[100], phases="an") # Create the transformer tp = rlf.TransformerParameters.from_open_and_short_circuit_tests( id="Example_TP", - type="single", # <--- Single-phase transformer + vg="Ii0", # <--- Single-phase transformer sn=800, - up=400, - us=400, + uhv=400, + ulv=400, i0=0.022, p0=17, psc=25, diff --git a/doc/models/Transformer/Three_Phase_Transformer.md b/doc/models/Transformer/Three_Phase_Transformer.md index bc01d29d..cb3362a3 100644 --- a/doc/models/Transformer/Three_Phase_Transformer.md +++ b/doc/models/Transformer/Three_Phase_Transformer.md @@ -625,11 +625,11 @@ vs = rlf.VoltageSource(id="vs", bus=bus_mv, voltages=20e3) # Create a MV/LV transformer tp = rlf.TransformerParameters.from_open_and_short_circuit_tests( - id="SE_Minera_A0Ak_100_kVA", - type="Dyn11", + id="SE Minera A0Ak 100kVA", + vg="Dyn11", sn=100.0 * 1e3, - up=20e3, - us=400.0, + uhv=20e3, + ulv=400.0, i0=0.5 / 100, p0=145.0, psc=1250.0, diff --git a/doc/models/Transformer/index.md b/doc/models/Transformer/index.md index 7c75d5a1..69ca37a7 100644 --- a/doc/models/Transformer/index.md +++ b/doc/models/Transformer/index.md @@ -114,36 +114,35 @@ method. To define the parameters of the transformers, use the `TransformerParameters` class. It takes as arguments the elements described in the previous section and converts them into the series -impedance and the magnetizing admittance. The `type` argument of the constructor can take the +impedance and the magnetizing admittance. The `vg` argument of the constructor can take the following values: -- `"single"` to model a single-phase transformer -- `"center"` to model a center-tapped transformer -- Any windings (`"Dd0"`, `"Dz6"`, etc.) to model a three-phase transformer. +- `"Ii0"` or `"Ii6"` to model a single-phase transformer, in-phase or 180° phase shift respectively +- `"Iii0"` or `"Iii6"` to model a center-tapped transformer, in-phase or 180° phase shift respectively +- `"Dd0"`, `"Dyn11"`, etc. to model a three-phase transformer with different winding configurations ```python import roseau.load_flow as rlf # The transformer parameters for a single-phase transformer -single_phase_transformer_parameters = ( - rlf.TransformerParameters.from_open_and_short_circuit_tests( - id="single_phase_transformer_parameters", - type="single", # <--- single-phase transformer - up=rlf.Q_(20, "kV"), - us=rlf.Q_(400, "V"), - sn=rlf.Q_(160, "kVA"), - p0=rlf.Q_(300, "W"), - i0=rlf.Q_(1.4, "%"), - psc=rlf.Q_(2000, "W"), - vsc=rlf.Q_(4, "%"), - ) +transformer_params_1ph = rlf.TransformerParameters.from_open_and_short_circuit_tests( + id="transformer_params_1ph", + vg="Ii0", # <--- single-phase transformer + uhv=rlf.Q_(20, "kV"), + ulv=rlf.Q_(400, "V"), + sn=rlf.Q_(160, "kVA"), + p0=rlf.Q_(300, "W"), + i0=rlf.Q_(1.4, "%"), + psc=rlf.Q_(2000, "W"), + vsc=rlf.Q_(4, "%"), ) +assert transformer_params_1ph.type == "single-phase" # Alternatively, if you have z2 and ym already: -# single_phase_transformer_parameters = rlf.TransformerParameters( -# id="single_phase_transformer_parameters", -# type="single", -# up=rlf.Q_(20, "kV"), -# us=rlf.Q_(400, "V"), +# transformer_params_1ph = rlf.TransformerParameters( +# id="transformer_params_1ph", +# vg="Ii0", +# uhv=rlf.Q_(20, "kV"), +# ulv=rlf.Q_(400, "V"), # sn=rlf.Q_(160, "kVA"), # z2=rlf.Q_(0.0125+0.038j, "ohm"), # ym=rlf.Q_(7.5e-7-5.5e-6j, "S"), @@ -151,34 +150,36 @@ single_phase_transformer_parameters = ( # The transformer parameters for a three-phase transformer -three_phase_transformer_parameters = ( - rlf.TransformerParameters.from_open_and_short_circuit_tests( - id="three_phase_transformer_parameters", - type="Dyn11", # <--- three-phase transformer with delta primary and wye secondary - up=rlf.Q_(20, "kV"), - us=rlf.Q_(400, "V"), - sn=rlf.Q_(160, "kVA"), - p0=rlf.Q_(300, "W"), - i0=rlf.Q_(1.4, "%"), - psc=rlf.Q_(2000, "W"), - vsc=rlf.Q_(4, "%"), - ) +transformer_params_3ph = rlf.TransformerParameters.from_open_and_short_circuit_tests( + id="transformer_params_3ph", + vg="Dyn11", # <--- three-phase transformer with delta primary and wye secondary + uhv=rlf.Q_(20, "kV"), + ulv=rlf.Q_(400, "V"), + sn=rlf.Q_(160, "kVA"), + p0=rlf.Q_(300, "W"), + i0=rlf.Q_(1.4, "%"), + psc=rlf.Q_(2000, "W"), + vsc=rlf.Q_(4, "%"), ) +assert transformer_params_3ph.type == "three-phase" # The transformer parameters for a center-tapped transformer -center_tapped_transformer_parameters = ( - rlf.TransformerParameters.from_open_and_short_circuit_tests( - id="center_tapped_transformer_parameters", - type="center", # <--- center-tapped transformer - up=rlf.Q_(20, "kV"), - us=rlf.Q_(400, "V"), - sn=rlf.Q_(160, "kVA"), - p0=rlf.Q_(300, "W"), - i0=rlf.Q_(1.4, "%"), - psc=rlf.Q_(2000, "W"), - vsc=rlf.Q_(4, "%"), - ) +transformer_params_ct = rlf.TransformerParameters.from_open_and_short_circuit_tests( + id="transformer_params_ct", + vg="Iii0", # <--- center-tapped transformer + uhv=rlf.Q_(20, "kV"), + ulv=rlf.Q_(400, "V"), + sn=rlf.Q_(160, "kVA"), + p0=rlf.Q_(300, "W"), + i0=rlf.Q_(1.4, "%"), + psc=rlf.Q_(2000, "W"), + vsc=rlf.Q_(4, "%"), ) +assert transformer_params_ct.type == "center-tapped" + +# Available vector groups: +print(rlf.TransformerParameters.allowed_vector_groups) +# "Dd0", "Dd6", ..., "Ii0", "Ii6", "Iii0", "Iii6", ``` A catalogue of transformer parameters is available. More details [here](catalogues-transformers). diff --git a/doc/usage/Catalogues.md b/doc/usage/Catalogues.md index 7f0dfa1e..5861c737 100644 --- a/doc/usage/Catalogues.md +++ b/doc/usage/Catalogues.md @@ -45,46 +45,46 @@ This catalogue can be retrieved in the form of a dataframe using: | Name | Nb buses | Nb lines | Nb transformers | Nb switches | Nb loads | Nb sources | Nb grounds | Nb potential refs | Available load points | | :-------------------------------------------------------------------------------- | -------: | -------: | --------------: | ----------: | -------: | ---------: | ---------: | ----------------: | :-------------------- | -| LVFeeder00939 | 8 | 6 | 1 | 0 | 12 | 1 | 1 | 2 | ['Winter', 'Summer'] | -| LVFeeder02639 | 7 | 5 | 1 | 0 | 10 | 1 | 1 | 2 | ['Winter', 'Summer'] | -| LVFeeder04790 | 4 | 2 | 1 | 0 | 4 | 1 | 1 | 2 | ['Winter', 'Summer'] | -| LVFeeder06713 | 3 | 1 | 1 | 0 | 2 | 1 | 1 | 2 | ['Summer', 'Winter'] | -| LVFeeder06926 | 3 | 1 | 1 | 0 | 2 | 1 | 1 | 2 | ['Winter', 'Summer'] | -| LVFeeder06975 | 6 | 4 | 1 | 0 | 8 | 1 | 1 | 2 | ['Winter', 'Summer'] | -| LVFeeder18498 | 18 | 16 | 1 | 0 | 32 | 1 | 1 | 2 | ['Winter', 'Summer'] | -| LVFeeder18769 | 7 | 5 | 1 | 0 | 10 | 1 | 1 | 2 | ['Winter', 'Summer'] | -| LVFeeder19558 | 3 | 1 | 1 | 0 | 2 | 1 | 1 | 2 | ['Winter', 'Summer'] | -| LVFeeder20256 | 9 | 7 | 1 | 0 | 14 | 1 | 1 | 2 | ['Winter', 'Summer'] | -| LVFeeder23832 | 3 | 1 | 1 | 0 | 2 | 1 | 1 | 2 | ['Winter', 'Summer'] | -| LVFeeder24400 | 4 | 2 | 1 | 0 | 4 | 1 | 1 | 2 | ['Summer', 'Winter'] | -| LVFeeder27429 | 11 | 9 | 1 | 0 | 18 | 1 | 1 | 2 | ['Winter', 'Summer'] | -| LVFeeder27681 | 3 | 1 | 1 | 0 | 2 | 1 | 1 | 2 | ['Winter', 'Summer'] | -| LVFeeder30216 | 9 | 7 | 1 | 0 | 14 | 1 | 1 | 2 | ['Summer', 'Winter'] | -| LVFeeder31441 | 4 | 2 | 1 | 0 | 4 | 1 | 1 | 2 | ['Summer', 'Winter'] | -| LVFeeder36284 | 5 | 3 | 1 | 0 | 6 | 1 | 1 | 2 | ['Winter', 'Summer'] | -| LVFeeder36360 | 9 | 7 | 1 | 0 | 14 | 1 | 1 | 2 | ['Summer', 'Winter'] | -| LVFeeder37263 | 3 | 1 | 1 | 0 | 2 | 1 | 1 | 2 | ['Summer', 'Winter'] | -| LVFeeder38211 | 6 | 4 | 1 | 0 | 8 | 1 | 1 | 2 | ['Winter', 'Summer'] | -| MVFeeder004 | 17 | 15 | 0 | 1 | 10 | 1 | 1 | 1 | ['Summer', 'Winter'] | -| MVFeeder011 | 50 | 48 | 0 | 1 | 68 | 1 | 1 | 1 | ['Summer', 'Winter'] | -| MVFeeder015 | 30 | 28 | 0 | 1 | 20 | 1 | 1 | 1 | ['Winter', 'Summer'] | -| MVFeeder032 | 53 | 51 | 0 | 1 | 40 | 1 | 1 | 1 | ['Summer', 'Winter'] | -| MVFeeder041 | 88 | 86 | 0 | 1 | 62 | 1 | 1 | 1 | ['Winter', 'Summer'] | -| MVFeeder063 | 39 | 37 | 0 | 1 | 38 | 1 | 1 | 1 | ['Summer', 'Winter'] | -| MVFeeder078 | 69 | 67 | 0 | 1 | 46 | 1 | 1 | 1 | ['Summer', 'Winter'] | -| MVFeeder115 | 4 | 2 | 0 | 1 | 4 | 1 | 1 | 1 | ['Summer', 'Winter'] | -| MVFeeder128 | 49 | 47 | 0 | 1 | 32 | 1 | 1 | 1 | ['Winter', 'Summer'] | -| MVFeeder151 | 59 | 57 | 0 | 1 | 44 | 1 | 1 | 1 | ['Summer', 'Winter'] | -| MVFeeder159 | 8 | 6 | 0 | 1 | 0 | 1 | 1 | 1 | ['Summer', 'Winter'] | -| MVFeeder176 | 33 | 31 | 0 | 1 | 20 | 1 | 1 | 1 | ['Summer', 'Winter'] | -| MVFeeder210 | 128 | 126 | 0 | 1 | 82 | 1 | 1 | 1 | ['Winter', 'Summer'] | -| MVFeeder217 | 44 | 42 | 0 | 1 | 44 | 1 | 1 | 1 | ['Winter', 'Summer'] | -| MVFeeder232 | 66 | 64 | 0 | 1 | 38 | 1 | 1 | 1 | ['Summer', 'Winter'] | -| MVFeeder251 | 125 | 123 | 0 | 1 | 106 | 1 | 1 | 1 | ['Winter', 'Summer'] | -| MVFeeder290 | 12 | 10 | 0 | 1 | 16 | 1 | 1 | 1 | ['Winter', 'Summer'] | -| MVFeeder312 | 11 | 9 | 0 | 1 | 8 | 1 | 1 | 1 | ['Winter', 'Summer'] | -| MVFeeder320 | 20 | 18 | 0 | 1 | 12 | 1 | 1 | 1 | ['Winter', 'Summer'] | -| MVFeeder339 | 33 | 31 | 0 | 1 | 28 | 1 | 1 | 1 | ['Summer', 'Winter'] | +| LVFeeder00939 | 8 | 6 | 1 | 0 | 12 | 1 | 1 | 2 | \['Winter', 'Summer'] | +| LVFeeder02639 | 7 | 5 | 1 | 0 | 10 | 1 | 1 | 2 | \['Winter', 'Summer'] | +| LVFeeder04790 | 4 | 2 | 1 | 0 | 4 | 1 | 1 | 2 | \['Winter', 'Summer'] | +| LVFeeder06713 | 3 | 1 | 1 | 0 | 2 | 1 | 1 | 2 | \['Summer', 'Winter'] | +| LVFeeder06926 | 3 | 1 | 1 | 0 | 2 | 1 | 1 | 2 | \['Winter', 'Summer'] | +| LVFeeder06975 | 6 | 4 | 1 | 0 | 8 | 1 | 1 | 2 | \['Winter', 'Summer'] | +| LVFeeder18498 | 18 | 16 | 1 | 0 | 32 | 1 | 1 | 2 | \['Winter', 'Summer'] | +| LVFeeder18769 | 7 | 5 | 1 | 0 | 10 | 1 | 1 | 2 | \['Winter', 'Summer'] | +| LVFeeder19558 | 3 | 1 | 1 | 0 | 2 | 1 | 1 | 2 | \['Winter', 'Summer'] | +| LVFeeder20256 | 9 | 7 | 1 | 0 | 14 | 1 | 1 | 2 | \['Winter', 'Summer'] | +| LVFeeder23832 | 3 | 1 | 1 | 0 | 2 | 1 | 1 | 2 | \['Winter', 'Summer'] | +| LVFeeder24400 | 4 | 2 | 1 | 0 | 4 | 1 | 1 | 2 | \['Summer', 'Winter'] | +| LVFeeder27429 | 11 | 9 | 1 | 0 | 18 | 1 | 1 | 2 | \['Winter', 'Summer'] | +| LVFeeder27681 | 3 | 1 | 1 | 0 | 2 | 1 | 1 | 2 | \['Winter', 'Summer'] | +| LVFeeder30216 | 9 | 7 | 1 | 0 | 14 | 1 | 1 | 2 | \['Summer', 'Winter'] | +| LVFeeder31441 | 4 | 2 | 1 | 0 | 4 | 1 | 1 | 2 | \['Summer', 'Winter'] | +| LVFeeder36284 | 5 | 3 | 1 | 0 | 6 | 1 | 1 | 2 | \['Winter', 'Summer'] | +| LVFeeder36360 | 9 | 7 | 1 | 0 | 14 | 1 | 1 | 2 | \['Summer', 'Winter'] | +| LVFeeder37263 | 3 | 1 | 1 | 0 | 2 | 1 | 1 | 2 | \['Summer', 'Winter'] | +| LVFeeder38211 | 6 | 4 | 1 | 0 | 8 | 1 | 1 | 2 | \['Winter', 'Summer'] | +| MVFeeder004 | 17 | 15 | 0 | 1 | 10 | 1 | 1 | 1 | \['Summer', 'Winter'] | +| MVFeeder011 | 50 | 48 | 0 | 1 | 68 | 1 | 1 | 1 | \['Summer', 'Winter'] | +| MVFeeder015 | 30 | 28 | 0 | 1 | 20 | 1 | 1 | 1 | \['Winter', 'Summer'] | +| MVFeeder032 | 53 | 51 | 0 | 1 | 40 | 1 | 1 | 1 | \['Summer', 'Winter'] | +| MVFeeder041 | 88 | 86 | 0 | 1 | 62 | 1 | 1 | 1 | \['Winter', 'Summer'] | +| MVFeeder063 | 39 | 37 | 0 | 1 | 38 | 1 | 1 | 1 | \['Summer', 'Winter'] | +| MVFeeder078 | 69 | 67 | 0 | 1 | 46 | 1 | 1 | 1 | \['Summer', 'Winter'] | +| MVFeeder115 | 4 | 2 | 0 | 1 | 4 | 1 | 1 | 1 | \['Summer', 'Winter'] | +| MVFeeder128 | 49 | 47 | 0 | 1 | 32 | 1 | 1 | 1 | \['Winter', 'Summer'] | +| MVFeeder151 | 59 | 57 | 0 | 1 | 44 | 1 | 1 | 1 | \['Summer', 'Winter'] | +| MVFeeder159 | 8 | 6 | 0 | 1 | 0 | 1 | 1 | 1 | \['Summer', 'Winter'] | +| MVFeeder176 | 33 | 31 | 0 | 1 | 20 | 1 | 1 | 1 | \['Summer', 'Winter'] | +| MVFeeder210 | 128 | 126 | 0 | 1 | 82 | 1 | 1 | 1 | \['Winter', 'Summer'] | +| MVFeeder217 | 44 | 42 | 0 | 1 | 44 | 1 | 1 | 1 | \['Winter', 'Summer'] | +| MVFeeder232 | 66 | 64 | 0 | 1 | 38 | 1 | 1 | 1 | \['Summer', 'Winter'] | +| MVFeeder251 | 125 | 123 | 0 | 1 | 106 | 1 | 1 | 1 | \['Winter', 'Summer'] | +| MVFeeder290 | 12 | 10 | 0 | 1 | 16 | 1 | 1 | 1 | \['Winter', 'Summer'] | +| MVFeeder312 | 11 | 9 | 0 | 1 | 8 | 1 | 1 | 1 | \['Winter', 'Summer'] | +| MVFeeder320 | 20 | 18 | 0 | 1 | 12 | 1 | 1 | 1 | \['Winter', 'Summer'] | +| MVFeeder339 | 33 | 31 | 0 | 1 | 28 | 1 | 1 | 1 | \['Summer', 'Winter'] | There are MV networks whose names start with "MVFeeder" and LV networks whose names with "LVFeeder". For each network, there are two available load points: @@ -101,26 +101,26 @@ only, you can call: | Name | Nb buses | Nb lines | Nb transformers | Nb switches | Nb loads | Nb sources | Nb grounds | Nb potential refs | Available load points | | :------------ | -------: | -------: | --------------: | ----------: | -------: | ---------: | ---------: | ----------------: | :-------------------- | -| LVFeeder00939 | 8 | 6 | 1 | 0 | 12 | 1 | 1 | 2 | ['Winter', 'Summer'] | -| LVFeeder02639 | 7 | 5 | 1 | 0 | 10 | 1 | 1 | 2 | ['Winter', 'Summer'] | -| LVFeeder04790 | 4 | 2 | 1 | 0 | 4 | 1 | 1 | 2 | ['Winter', 'Summer'] | -| LVFeeder06713 | 3 | 1 | 1 | 0 | 2 | 1 | 1 | 2 | ['Summer', 'Winter'] | -| LVFeeder06926 | 3 | 1 | 1 | 0 | 2 | 1 | 1 | 2 | ['Winter', 'Summer'] | -| LVFeeder06975 | 6 | 4 | 1 | 0 | 8 | 1 | 1 | 2 | ['Winter', 'Summer'] | -| LVFeeder18498 | 18 | 16 | 1 | 0 | 32 | 1 | 1 | 2 | ['Winter', 'Summer'] | -| LVFeeder18769 | 7 | 5 | 1 | 0 | 10 | 1 | 1 | 2 | ['Winter', 'Summer'] | -| LVFeeder19558 | 3 | 1 | 1 | 0 | 2 | 1 | 1 | 2 | ['Winter', 'Summer'] | -| LVFeeder20256 | 9 | 7 | 1 | 0 | 14 | 1 | 1 | 2 | ['Winter', 'Summer'] | -| LVFeeder23832 | 3 | 1 | 1 | 0 | 2 | 1 | 1 | 2 | ['Winter', 'Summer'] | -| LVFeeder24400 | 4 | 2 | 1 | 0 | 4 | 1 | 1 | 2 | ['Summer', 'Winter'] | -| LVFeeder27429 | 11 | 9 | 1 | 0 | 18 | 1 | 1 | 2 | ['Winter', 'Summer'] | -| LVFeeder27681 | 3 | 1 | 1 | 0 | 2 | 1 | 1 | 2 | ['Winter', 'Summer'] | -| LVFeeder30216 | 9 | 7 | 1 | 0 | 14 | 1 | 1 | 2 | ['Summer', 'Winter'] | -| LVFeeder31441 | 4 | 2 | 1 | 0 | 4 | 1 | 1 | 2 | ['Summer', 'Winter'] | -| LVFeeder36284 | 5 | 3 | 1 | 0 | 6 | 1 | 1 | 2 | ['Winter', 'Summer'] | -| LVFeeder36360 | 9 | 7 | 1 | 0 | 14 | 1 | 1 | 2 | ['Summer', 'Winter'] | -| LVFeeder37263 | 3 | 1 | 1 | 0 | 2 | 1 | 1 | 2 | ['Summer', 'Winter'] | -| LVFeeder38211 | 6 | 4 | 1 | 0 | 8 | 1 | 1 | 2 | ['Winter', 'Summer'] | +| LVFeeder00939 | 8 | 6 | 1 | 0 | 12 | 1 | 1 | 2 | \['Winter', 'Summer'] | +| LVFeeder02639 | 7 | 5 | 1 | 0 | 10 | 1 | 1 | 2 | \['Winter', 'Summer'] | +| LVFeeder04790 | 4 | 2 | 1 | 0 | 4 | 1 | 1 | 2 | \['Winter', 'Summer'] | +| LVFeeder06713 | 3 | 1 | 1 | 0 | 2 | 1 | 1 | 2 | \['Summer', 'Winter'] | +| LVFeeder06926 | 3 | 1 | 1 | 0 | 2 | 1 | 1 | 2 | \['Winter', 'Summer'] | +| LVFeeder06975 | 6 | 4 | 1 | 0 | 8 | 1 | 1 | 2 | \['Winter', 'Summer'] | +| LVFeeder18498 | 18 | 16 | 1 | 0 | 32 | 1 | 1 | 2 | \['Winter', 'Summer'] | +| LVFeeder18769 | 7 | 5 | 1 | 0 | 10 | 1 | 1 | 2 | \['Winter', 'Summer'] | +| LVFeeder19558 | 3 | 1 | 1 | 0 | 2 | 1 | 1 | 2 | \['Winter', 'Summer'] | +| LVFeeder20256 | 9 | 7 | 1 | 0 | 14 | 1 | 1 | 2 | \['Winter', 'Summer'] | +| LVFeeder23832 | 3 | 1 | 1 | 0 | 2 | 1 | 1 | 2 | \['Winter', 'Summer'] | +| LVFeeder24400 | 4 | 2 | 1 | 0 | 4 | 1 | 1 | 2 | \['Summer', 'Winter'] | +| LVFeeder27429 | 11 | 9 | 1 | 0 | 18 | 1 | 1 | 2 | \['Winter', 'Summer'] | +| LVFeeder27681 | 3 | 1 | 1 | 0 | 2 | 1 | 1 | 2 | \['Winter', 'Summer'] | +| LVFeeder30216 | 9 | 7 | 1 | 0 | 14 | 1 | 1 | 2 | \['Summer', 'Winter'] | +| LVFeeder31441 | 4 | 2 | 1 | 0 | 4 | 1 | 1 | 2 | \['Summer', 'Winter'] | +| LVFeeder36284 | 5 | 3 | 1 | 0 | 6 | 1 | 1 | 2 | \['Winter', 'Summer'] | +| LVFeeder36360 | 9 | 7 | 1 | 0 | 14 | 1 | 1 | 2 | \['Summer', 'Winter'] | +| LVFeeder37263 | 3 | 1 | 1 | 0 | 2 | 1 | 1 | 2 | \['Summer', 'Winter'] | +| LVFeeder38211 | 6 | 4 | 1 | 0 | 8 | 1 | 1 | 2 | \['Winter', 'Summer'] | A regular expression can also be used: @@ -130,7 +130,7 @@ A regular expression can also be used: | Name | Nb buses | Nb lines | Nb transformers | Nb switches | Nb loads | Nb sources | Nb grounds | Nb potential refs | Available load points | | :------------ | -------: | -------: | --------------: | ----------: | -------: | ---------: | ---------: | ----------------: | :-------------------- | -| LVFeeder38211 | 6 | 4 | 1 | 0 | 8 | 1 | 1 | 2 | ['Winter', 'Summer'] | +| LVFeeder38211 | 6 | 4 | 1 | 0 | 8 | 1 | 1 | 2 | \['Winter', 'Summer'] | ### Getting an instance @@ -154,26 +154,24 @@ have been found. Please look at the catalogue using the `get_catalogue` class me ## Transformers -_Roseau Load Flow_ is provided with a catalogue of transformer parameters. These parameters are available -through the class `TransformerParameters`. - -```{note} -Currently, only three phase MV/LV transformers are in the catalogue. -``` +_Roseau Load Flow_ ships with a catalogue of `TransformerParameters` obtained from data sheets of +real transformers. ### Source of data The available transformers data come from the following data sheets: -- For Schneider-Electric EcoDesign products (_AA0Ak_ efficiency class): - [Minera](../_static/Transformer/Minera-EcoDesign2021-20kV_ZZ6921.pdf), - [Vegeta](../_static/Transformer/Vegeta-EcoDesign2021-20kV_ZZ6924.pdf), - [Trihal](../_static/Transformer/Trihal-EcoDesign2021-20kV_ZZ6925.pdf) -- For other Schneider-Electric products: See [this document](../_static/Transformer/2023_03_31_Fiche_Technique_Schneider_Electric.pdf) - on pages 19, 21 and 22. -- For France Transfo: See [this document](../_static/Transformer/2023_03_30_Fiche_Technique_France_Transfo.pdf). +- For _Schneider-Electric EcoDesign_ products (**AA0Ak** efficiency class): + [Minera](../_static/Transformer/References/2024_03_18_Minera-EcoDesign2021-20kV_ZZ6921.pdf), + [Vegeta](../_static/Transformer/References/2024_03_18_Vegeta-EcoDesign2021-20kV_ZZ6924.pdf), + [Trihal](../_static/Transformer/References/2024_03_18_Trihal-EcoDesign2021-20kV_ZZ6925.pdf) +- For _France Transfo_: See + [this document](../_static/Transformer/References/2023_03_30_Fiche_Technique_France_Transfo.pdf). -Pull requests to add some other sources are welcome! +All data sheets can be found in the data sheets folder +[on GitHub](https://github.com/RoseauTechnologies/Roseau_Load_Flow/tree/main/doc/_static/Transformer/References) + +Pull requests to add other common sources are welcome! ### Inspecting the catalogue @@ -184,72 +182,69 @@ This catalogue can be retrieved in the form of a dataframe using: >>> rlf.TransformerParameters.get_catalogue() ``` + + _Truncated output_ -| Name | Manufacturer | Product range | Efficiency | Nominal power (kVA) | Type | Primary voltage (kV) | Secondary voltage (kV) | -| :--------------------------- | :----------- | :------------ | :--------- | ------------------: | :---- | -------------------: | ---------------------: | -| FT_Standard_Standard_100kVA | FT | Standard | Standard | 100 | Dyn11 | 20 | 0.4 | -| FT_Standard_Standard_160kVA | FT | Standard | Standard | 160 | Dyn11 | 20 | 0.4 | -| FT_Standard_Standard_250kVA | FT | Standard | Standard | 250 | Dyn11 | 20 | 0.4 | -| FT_Standard_Standard_315kVA | FT | Standard | Standard | 315 | Dyn11 | 20 | 0.4 | -| FT_Standard_Standard_400kVA | FT | Standard | Standard | 400 | Dyn11 | 20 | 0.4 | -| FT_Standard_Standard_500kVA | FT | Standard | Standard | 500 | Dyn11 | 20 | 0.4 | -| FT_Standard_Standard_630kVA | FT | Standard | Standard | 630 | Dyn11 | 20 | 0.4 | -| FT_Standard_Standard_800kVA | FT | Standard | Standard | 800 | Dyn11 | 20 | 0.4 | -| FT_Standard_Standard_1000kVA | FT | Standard | Standard | 1000 | Dyn11 | 20 | 0.4 | -| FT_Standard_Standard_1250kVA | FT | Standard | Standard | 1250 | Dyn11 | 20 | 0.4 | -| FT_Standard_Standard_1600kVA | FT | Standard | Standard | 1600 | Dyn11 | 20 | 0.4 | -| FT_Standard_Standard_2000kVA | FT | Standard | Standard | 2000 | Dyn11 | 20 | 0.4 | -| FT_Standard_Standard_2500kVA | FT | Standard | Standard | 2500 | Dyn11 | 20 | 0.4 | -| FT_Standard_Standard_3150kVA | FT | Standard | Standard | 3150 | Dyn11 | 20 | 0.4 | -| SE_Minera_AA0Ak_160kVA | SE | Minera | AA0Ak | 160 | Dyn11 | 20 | 0.4 | -| SE_Minera_AA0Ak_250kVA | SE | Minera | AA0Ak | 250 | Dyn11 | 20 | 0.4 | -| SE_Minera_AA0Ak_400kVA | SE | Minera | AA0Ak | 400 | Dyn11 | 20 | 0.4 | -| SE_Minera_AA0Ak_630kVA | SE | Minera | AA0Ak | 630 | Dyn11 | 20 | 0.4 | -| SE_Minera_AA0Ak_800kVA | SE | Minera | AA0Ak | 800 | Dyn11 | 20 | 0.4 | -| SE_Minera_AA0Ak_1000kVA | SE | Minera | AA0Ak | 1000 | Dyn11 | 20 | 0.4 | -| SE_Minera_AA0Ak_1250kVA | SE | Minera | AA0Ak | 1250 | Dyn11 | 20 | 0.4 | -| SE_Minera_AA0Ak_1600kVA | SE | Minera | AA0Ak | 1600 | Dyn11 | 20 | 0.4 | -| SE_Minera_AA0Ak_2000kVA | SE | Minera | AA0Ak | 2000 | Dyn11 | 20 | 0.4 | -| SE_Minera_AA0Ak_2500kVA | SE | Minera | AA0Ak | 2500 | Dyn11 | 20 | 0.4 | -| SE_Minera_AA0Ak_3150kVA | SE | Minera | AA0Ak | 3150 | Dyn11 | 20 | 0.4 | -| SE_Minera_A0Ak_50kVA | SE | Minera | A0Ak | 50 | Yzn11 | 20 | 0.4 | -| SE_Minera_A0Ak_100kVA | SE | Minera | A0Ak | 100 | Dyn11 | 20 | 0.4 | -| SE_Minera_A0Ak_160kVA | SE | Minera | A0Ak | 160 | Dyn11 | 20 | 0.4 | -| SE_Minera_A0Ak_250kVA | SE | Minera | A0Ak | 250 | Dyn11 | 20 | 0.4 | -| SE_Minera_A0Ak_315kVA | SE | Minera | A0Ak | 315 | Dyn11 | 20 | 0.4 | -| SE_Minera_A0Ak_400kVA | SE | Minera | A0Ak | 400 | Dyn11 | 20 | 0.4 | -| SE_Minera_A0Ak_500kVA | SE | Minera | A0Ak | 500 | Dyn11 | 20 | 0.4 | -| SE_Minera_A0Ak_630kVA | SE | Minera | A0Ak | 630 | Dyn11 | 20 | 0.4 | -| SE_Minera_A0Ak_800kVA | SE | Minera | A0Ak | 800 | Dyn11 | 20 | 0.4 | -| SE_Minera_A0Ak_1000kVA | SE | Minera | A0Ak | 1000 | Dyn11 | 20 | 0.4 | -| SE_Minera_A0Ak_1250kVA | SE | Minera | A0Ak | 1250 | Dyn11 | 20 | 0.4 | -| SE_Minera_A0Ak_1600kVA | SE | Minera | A0Ak | 1600 | Dyn11 | 20 | 0.4 | -| SE_Minera_A0Ak_2000kVA | SE | Minera | A0Ak | 2000 | Dyn11 | 20 | 0.4 | -| SE_Minera_A0Ak_2500kVA | SE | Minera | A0Ak | 2500 | Dyn11 | 20 | 0.4 | -| SE_Minera_B0Bk_50kVA | SE | Minera | B0Bk | 50 | Yzn11 | 20 | 0.4 | -| SE_Minera_B0Bk_100kVA | SE | Minera | B0Bk | 100 | Dyn11 | 20 | 0.4 | -| SE_Minera_B0Bk_160kVA | SE | Minera | B0Bk | 160 | Dyn11 | 20 | 0.4 | -| SE_Minera_B0Bk_250kVA | SE | Minera | B0Bk | 250 | Dyn11 | 20 | 0.4 | -| SE_Minera_B0Bk_315kVA | SE | Minera | B0Bk | 315 | Dyn11 | 20 | 0.4 | -| SE_Minera_B0Bk_400kVA | SE | Minera | B0Bk | 400 | Dyn11 | 20 | 0.4 | -| SE_Minera_B0Bk_500kVA | SE | Minera | B0Bk | 500 | Dyn11 | 20 | 0.4 | -| SE_Minera_B0Bk_630kVA | SE | Minera | B0Bk | 630 | Dyn11 | 20 | 0.4 | -| SE_Minera_B0Bk_800kVA | SE | Minera | B0Bk | 800 | Dyn11 | 20 | 0.4 | -| SE_Minera_B0Bk_1000kVA | SE | Minera | B0Bk | 1000 | Dyn11 | 20 | 0.4 | -| SE_Minera_B0Bk_1250kVA | SE | Minera | B0Bk | 1250 | Dyn11 | 20 | 0.4 | +| Name | Manufacturer | Product range | Efficiency | Type | Oil | Nominal power (kVA) | Vector group | High voltage (kV) | Low voltage (kV) | +| :---------------------------------------------------------------- | :----------- | :------------ | :----------------- | :------------ | :------ | ------------------: | :----------- | ----------------: | ---------------: | +| SE Vegeta C0Bk 100kVA 15/20kV(15) 410V Dyn11 | SE | Vegeta | C0Bk | three-phase | ester | 100 | Dyn11 | 15 | 0.41 | +| SE Vegeta Standard 400kVA 15/20kV(20) 410V Dyn11 | SE | Vegeta | Standard | three-phase | ester | 400 | Dyn11 | 20 | 0.41 | +| SE Vegeta AA0Ak 630kVA 20kV 410V Dyn11 | SE | Vegeta | AA0Ak | three-phase | ester | 630 | Dyn11 | 20 | 0.41 | +| SE Minera B0Bk 250kVA 15/20kV(20) 410V Dyn11 | SE | Minera | B0Bk | three-phase | mineral | 250 | Dyn11 | 20 | 0.41 | +| SE Minera Standard 160kVA 15/20kV(15) 410V Dyn11 | SE | Minera | Standard | three-phase | mineral | 160 | Dyn11 | 15 | 0.41 | +| SE Imprego 10kVA 230V 230V Ii0 | SE | Imprego | | single-phase | dry | 10 | Ii0 | 0.23 | 0.23 | +| CA Yellow A0Ak 1250kVA 15.75/21kV(21) 400V Dyn11 | CA | Yellow | A0Ak | three-phase | | 1250 | Dyn11 | 21 | 0.4 | +| SE Trihal AA0Ak 800kVA 15/20kV(15) 410V Dyn11 | SE | Trihal | AA0Ak | three-phase | dry | 800 | Dyn11 | 15 | 0.41 | +| SE Vegeta C0Bk 100kVA 15/20kV(20) 410V Dyn11 | SE | Vegeta | C0Bk | three-phase | ester | 100 | Dyn11 | 20 | 0.41 | +| SE Trihal AA0Ak 1000kVA 15/20kV(15) 410V Dyn11 | SE | Trihal | AA0Ak | three-phase | dry | 1000 | Dyn11 | 15 | 0.41 | +| SE Trihal AA0Ak 800kVA 15/20kV(20) 410V Dyn11 | SE | Trihal | AA0Ak | three-phase | dry | 800 | Dyn11 | 20 | 0.41 | +| SE Minera C0Bk 1600kVA 15/20kV(15) 410V Dyn11 | SE | Minera | C0Bk | three-phase | mineral | 1600 | Dyn11 | 15 | 0.41 | +| SE Trihal ExtraReducedLosses 1250kVA 20kV 410V Dyn11 | SE | Trihal | ExtraReducedLosses | three-phase | dry | 1250 | Dyn11 | 20 | 0.41 | +| SE Minera B0Bk 500kVA 15/20kV(20) 410V Dyn11 | SE | Minera | B0Bk | three-phase | mineral | 500 | Dyn11 | 20 | 0.41 | +| SE Imprego 10kVA 230V 230V Iii0 | SE | Imprego | | center-tapped | dry | 10 | Iii0 | 0.23 | 0.23 | +| SE Vegeta C0Bk 400kVA 15/20kV(20) 410V Dyn11 | SE | Vegeta | C0Bk | three-phase | ester | 400 | Dyn11 | 20 | 0.41 | +| CA Yellow A0Ak 800kVA 15.75/21kV(15.75) 400V Dyn11 | CA | Yellow | A0Ak | three-phase | | 800 | Dyn11 | 15.75 | 0.4 | +| SE Trihal AA0Ak 2000kVA 15/20kV(20) 410V Dyn11 | SE | Trihal | AA0Ak | three-phase | dry | 2000 | Dyn11 | 20 | 0.41 | +| SE Vegeta C0Bk 1000kVA 15/20kV(20) 410V Dyn11 | SE | Vegeta | C0Bk | three-phase | ester | 1000 | Dyn11 | 20 | 0.41 | +| FT 400kVA 15/20kV(15) 400V Dyn11 | FT | | | three-phase | mineral | 400 | Dyn11 | 15 | 0.4 | +| CA Yellow A0Ak 3150kVA 15.75/21kV(15.75) 400V Dyn11 | CA | Yellow | A0Ak | three-phase | | 3150 | Dyn11 | 15.75 | 0.4 | +| FT 2000kVA 15/20kV(20) 400V Dyn11 | FT | | | three-phase | mineral | 2000 | Dyn11 | 20 | 0.4 | +| CA Yellow A0Ak 400kVA 15.75/21kV(15.75) 400V Dyn11 | CA | Yellow | A0Ak | three-phase | | 400 | Dyn11 | 15.75 | 0.4 | +| SE Vegeta Standard 800kVA 15/20kV(15) 410V Dyn11 | SE | Vegeta | Standard | three-phase | ester | 800 | Dyn11 | 15 | 0.41 | +| SE Minera B0Bk 315kVA 15/20kV(15) 410V Dyn11 | SE | Minera | B0Bk | three-phase | mineral | 315 | Dyn11 | 15 | 0.41 | +| SE Minera C0Bk 50kVA 15/20kV(20) 410V Yzn11 | SE | Minera | C0Bk | three-phase | mineral | 50 | Yzn11 | 20 | 0.41 | +| SE Minera C0Bk 630kVA 15/20kV(20) 410V Dyn11 | SE | Minera | C0Bk | three-phase | mineral | 630 | Dyn11 | 20 | 0.41 | +| SE Minera C0Bk 1250kVA 15/20kV(15) 410V Dyn11 | SE | Minera | C0Bk | three-phase | mineral | 1250 | Dyn11 | 15 | 0.41 | +| SE Trihal AA0Ak 800kVA 20kV 410V Dyn11 | SE | Trihal | AA0Ak | three-phase | dry | 800 | Dyn11 | 20 | 0.41 | +| SE Minera B0Bk 2500kVA 15/20kV(20) 410V Dyn11 | SE | Minera | B0Bk | three-phase | mineral | 2500 | Dyn11 | 20 | 0.41 | The following data are available in this table: -- the **name**: a unique name of the transformer in the catalogue. -- the **manufacturer**: two manufacturers are available. `"SE"` stands for "Schneider-Electric" and `"FT"` stands for - "France Transfo". +- the **name**: a unique name of the transformer in the catalogue. This is usually a concatenation + of the manufacturer, the product range, the efficiency class, the nominal power, the high voltage, + the low voltage, and the vector group. +- the **manufacturer**: these manufacturers are currently available: + - `"SE"` stands for "Schneider-Electric" + - `"FT"` stands for "France Transfo" + - `"CA"` stands for "Cahors" - the product **range** which depends on the manufacturer -- the **efficiency** class of the transformer -- the **type** of the transformer. +- the **efficiency** class of the transformer. The efficiency class used in the catalogue follows the + `Eco-Design` requirements as defined by the `EN 50629` standard. +- the **type** of the transfomer. It can be `three-phase`, `single-phase`, or `center-tapped`. +- the oil type of the transformer, noted **oil**: + - `dry`: dry-type transformer + - `mineral`: mineral oil immersed transformer + - `ester`: vegetable oil (natural ester) immersed transformer +- the vector group of the transformer, noted **vg** (e.g., `Dyn11`, `Yzn11`, `Ii0`, etc.) - the nominal power, noted **sn**. -- the primary side phase-to-phase voltage, noted **up**. -- the secondary side phase-to-phase voltage, noted **us**. +- the phase-to-phase high voltage, noted **uhv**. +- the no-load phase-to-phase low voltage, noted **ulv**. The `get_catalogue` method accepts arguments (in bold above) that can be used to filter the returned table. The following command only retrieves transformer parameters of transformers with an efficiency of "A0Ak": @@ -258,45 +253,69 @@ following command only retrieves transformer parameters of transformers with an >>> rlf.TransformerParameters.get_catalogue(efficiency="A0Ak") ``` -| Name | Manufacturer | Product range | Efficiency | Type | Nominal power (kVA) | Primary voltage (kV) | Secondary voltage (kV) | -| :--------------------- | :----------- | :------------ | :--------- | :---- | ------------------: | -------------------: | ---------------------: | -| SE_Minera_A0Ak_50kVA | SE | Minera | A0Ak | Yzn11 | 50.0 | 20.0 | 0.4 | -| SE_Minera_A0Ak_100kVA | SE | Minera | A0Ak | Dyn11 | 100.0 | 20.0 | 0.4 | -| SE_Minera_A0Ak_160kVA | SE | Minera | A0Ak | Dyn11 | 160.0 | 20.0 | 0.4 | -| SE_Minera_A0Ak_250kVA | SE | Minera | A0Ak | Dyn11 | 250.0 | 20.0 | 0.4 | -| SE_Minera_A0Ak_315kVA | SE | Minera | A0Ak | Dyn11 | 315.0 | 20.0 | 0.4 | -| SE_Minera_A0Ak_400kVA | SE | Minera | A0Ak | Dyn11 | 400.0 | 20.0 | 0.4 | -| SE_Minera_A0Ak_500kVA | SE | Minera | A0Ak | Dyn11 | 500.0 | 20.0 | 0.4 | -| SE_Minera_A0Ak_630kVA | SE | Minera | A0Ak | Dyn11 | 630.0 | 20.0 | 0.4 | -| SE_Minera_A0Ak_800kVA | SE | Minera | A0Ak | Dyn11 | 800.0 | 20.0 | 0.4 | -| SE_Minera_A0Ak_1000kVA | SE | Minera | A0Ak | Dyn11 | 1000.0 | 20.0 | 0.4 | -| SE_Minera_A0Ak_1250kVA | SE | Minera | A0Ak | Dyn11 | 1250.0 | 20.0 | 0.4 | -| SE_Minera_A0Ak_1600kVA | SE | Minera | A0Ak | Dyn11 | 1600.0 | 20.0 | 0.4 | -| SE_Minera_A0Ak_2000kVA | SE | Minera | A0Ak | Dyn11 | 2000.0 | 20.0 | 0.4 | -| SE_Minera_A0Ak_2500kVA | SE | Minera | A0Ak | Dyn11 | 2500.0 | 20.0 | 0.4 | - -or only transformers with a wye winding on the primary side (using a regular expression) + + +_Truncated output_ + +| Name | Manufacturer | Product range | Efficiency | Type | Oil | Nominal power (kVA) | Vector group | High voltage (kV) | Low voltage (kV) | +| :--------------------------------------------------------- | :----------- | :------------ | :--------- | :---------- | :------ | ------------------: | :----------- | ----------------: | ---------------: | +| SE Minera A0Ak 50kVA 15/20kV(20) 410V Yzn11 | SE | Minera | A0Ak | three-phase | mineral | 50 | Yzn11 | 20 | 0.41 | +| SE Minera A0Ak 100kVA 15/20kV(20) 410V Dyn11 | SE | Minera | A0Ak | three-phase | mineral | 100 | Dyn11 | 20 | 0.41 | +| SE Minera A0Ak 160kVA 15/20kV(20) 410V Dyn11 | SE | Minera | A0Ak | three-phase | mineral | 160 | Dyn11 | 20 | 0.41 | +| SE Minera A0Ak 250kVA 15/20kV(20) 410V Dyn11 | SE | Minera | A0Ak | three-phase | mineral | 250 | Dyn11 | 20 | 0.41 | +| SE Minera A0Ak 315kVA 15/20kV(20) 410V Dyn11 | SE | Minera | A0Ak | three-phase | mineral | 315 | Dyn11 | 20 | 0.41 | +| SE Minera A0Ak 400kVA 15/20kV(20) 410V Dyn11 | SE | Minera | A0Ak | three-phase | mineral | 400 | Dyn11 | 20 | 0.41 | +| SE Minera A0Ak 500kVA 15/20kV(20) 410V Dyn11 | SE | Minera | A0Ak | three-phase | mineral | 500 | Dyn11 | 20 | 0.41 | +| SE Minera A0Ak 630kVA 15/20kV(20) 410V Dyn11 | SE | Minera | A0Ak | three-phase | mineral | 630 | Dyn11 | 20 | 0.41 | +| SE Minera A0Ak 800kVA 15/20kV(20) 410V Dyn11 | SE | Minera | A0Ak | three-phase | mineral | 800 | Dyn11 | 20 | 0.41 | +| SE Minera A0Ak 1000kVA 15/20kV(20) 410V Dyn11 | SE | Minera | A0Ak | three-phase | mineral | 1000 | Dyn11 | 20 | 0.41 | + +or only transformers with a wye winding on the high voltage side (using a regular expression) ```pycon ->>> rlf.TransformerParameters.get_catalogue(type=r"y.*") +>>> rlf.TransformerParameters.get_catalogue(vg=r"Y.*") ``` -| Name | Manufacturer | Product range | Efficiency | Type | Nominal power (kVA) | Primary voltage (kV) | Secondary voltage (kV) | -| :----------------------- | :----------- | :------------ | :--------- | :---- | ------------------: | -------------------: | ---------------------: | -| SE_Minera_A0Ak_50kVA | SE | Minera | A0Ak | Yzn11 | 50.0 | 20.0 | 0.4 | -| SE_Minera_B0Bk_50kVA | SE | Minera | B0Bk | Yzn11 | 50.0 | 20.0 | 0.4 | -| SE_Minera_C0Bk_50kVA | SE | Minera | C0Bk | Yzn11 | 50.0 | 20.0 | 0.4 | -| SE_Minera_Standard_50kVA | SE | Minera | Standard | Yzn11 | 50.0 | 20.0 | 0.4 | + + +| Name | Manufacturer | Product range | Efficiency | Type | Oil | Nominal power (kVA) | Vector group | High voltage (kV) | Low voltage (kV) | +| :----------------------------------------------------------- | :----------- | :------------ | :--------- | :---------- | :------ | ------------------: | :----------- | ----------------: | ---------------: | +| SE Minera A0Ak 50kVA 15/20kV(20) 410V Yzn11 | SE | Minera | A0Ak | three-phase | mineral | 50 | Yzn11 | 20 | 0.41 | +| SE Minera A0Ak 50kVA 15/20kV(15) 410V Yzn11 | SE | Minera | A0Ak | three-phase | mineral | 50 | Yzn11 | 15 | 0.41 | +| SE Minera B0Bk 50kVA 15/20kV(20) 410V Yzn11 | SE | Minera | B0Bk | three-phase | mineral | 50 | Yzn11 | 20 | 0.41 | +| SE Minera B0Bk 50kVA 15/20kV(15) 410V Yzn11 | SE | Minera | B0Bk | three-phase | mineral | 50 | Yzn11 | 15 | 0.41 | +| SE Minera C0Bk 50kVA 15/20kV(20) 410V Yzn11 | SE | Minera | C0Bk | three-phase | mineral | 50 | Yzn11 | 20 | 0.41 | +| SE Minera C0Bk 50kVA 15/20kV(15) 410V Yzn11 | SE | Minera | C0Bk | three-phase | mineral | 50 | Yzn11 | 15 | 0.41 | +| SE Minera Standard 50kVA 15/20kV(20) 410V Yzn11 | SE | Minera | Standard | three-phase | mineral | 50 | Yzn11 | 20 | 0.41 | +| SE Minera Standard 50kVA 15/20kV(15) 410V Yzn11 | SE | Minera | Standard | three-phase | mineral | 50 | Yzn11 | 15 | 0.41 | or only transformers meeting both criteria ```pycon ->>> rlf.TransformerParameters.get_catalogue(efficiency="A0Ak", type=r"y.*") +>>> rlf.TransformerParameters.get_catalogue(efficiency="A0Ak", vg=r"Y.*") ``` -| Name | Manufacturer | Product range | Efficiency | Type | Nominal power (kVA) | Primary voltage (kV) | Secondary voltage (kV) | -| :------------------- | :----------- | :------------ | :--------- | :---- | ------------------: | -------------------: | ---------------------: | -| SE_Minera_A0Ak_50kVA | SE | Minera | A0Ak | Yzn11 | 50.0 | 20.0 | 0.4 | + + +| Name | Manufacturer | Product range | Efficiency | Type | Oil | Nominal power (kVA) | Vector group | High voltage (kV) | Low voltage (kV) | +| :------------------------------------------------------- | :----------- | :------------ | :--------- | :---------- | :------ | ------------------: | :----------- | ----------------: | ---------------: | +| SE Minera A0Ak 50kVA 15/20kV(20) 410V Yzn11 | SE | Minera | A0Ak | three-phase | mineral | 50 | Yzn11 | 20 | 0.41 | +| SE Minera A0Ak 50kVA 15/20kV(15) 410V Yzn11 | SE | Minera | A0Ak | three-phase | mineral | 50 | Yzn11 | 15 | 0.41 | Among all the possible filters, the nominal power and voltages are expected in their default unit (VA and V). You can also use the [Pint](https://pint.readthedocs.io/en/stable/) library to express @@ -310,11 +329,25 @@ nominal power of 3150 kVA, the following two commands return the same table: >>> rlf.TransformerParameters.get_catalogue(sn=rlf.Q_(3150, "kVA")) ``` -| Name | Manufacturer | Product range | Efficiency | Type | Nominal power (kVA) | Primary voltage (kV) | Secondary voltage (kV) | -| :--------------------------- | :----------- | :------------ | :--------- | :---- | ------------------: | -------------------: | ---------------------: | -| FT_Standard_Standard_3150kVA | FT | Standard | Standard | Dyn11 | 3150.0 | 20.0 | 0.4 | -| SE_Vegeta_C0Bk_3150kVA | SE | Vegeta | C0Bk | Dyn11 | 3150.0 | 20.0 | 0.4 | -| SE_Vegeta_Standard_3150kVA | SE | Vegeta | Standard | Dyn11 | 3150.0 | 20.0 | 0.4 | + + +| Name | Manufacturer | Product range | Efficiency | Type | Oil | Nominal power (kVA) | Vector group | High voltage (kV) | Low voltage (kV) | +| :------------------------------------------------------------- | :----------- | :------------ | :--------- | :---------- | :------ | ------------------: | :----------- | ----------------: | ---------------: | +| FT 3150kVA 15/20kV(20) 400V Dyn11 | FT | | | three-phase | mineral | 3150 | Dyn11 | 20 | 0.4 | +| FT 3150kVA 15/20kV(15) 400V Dyn11 | FT | | | three-phase | mineral | 3150 | Dyn11 | 15 | 0.4 | +| SE Minera AA0Ak 3150kVA 20kV 410V Dyn11 | SE | Minera | AA0Ak | three-phase | mineral | 3150 | Dyn11 | 20 | 0.41 | +| SE Trihal AA0Ak 3150kVA 15/20kV(20) 410V Dyn11 | SE | Trihal | AA0Ak | three-phase | dry | 3150 | Dyn11 | 20 | 0.41 | +| SE Trihal AA0Ak 3150kVA 15/20kV(15) 410V Dyn11 | SE | Trihal | AA0Ak | three-phase | dry | 3150 | Dyn11 | 15 | 0.41 | +| SE Trihal AA0Ak 3150kVA 20kV 410V Dyn11 | SE | Trihal | AA0Ak | three-phase | dry | 3150 | Dyn11 | 20 | 0.41 | +| SE Vegeta AA0Ak 3150kVA 20kV 410V Dyn11 | SE | Vegeta | AA0Ak | three-phase | ester | 3150 | Dyn11 | 20 | 0.41 | +| SE Vegeta C0Bk 3150kVA 15/20kV(20) 410V Dyn11 | SE | Vegeta | C0Bk | three-phase | ester | 3150 | Dyn11 | 20 | 0.41 | +| SE Vegeta C0Bk 3150kVA 15/20kV(15) 410V Dyn11 | SE | Vegeta | C0Bk | three-phase | ester | 3150 | Dyn11 | 15 | 0.41 | +| SE Vegeta Standard 3150kVA 15/20kV(20) 410V Dyn11 | SE | Vegeta | Standard | three-phase | ester | 3150 | Dyn11 | 20 | 0.41 | ### Getting an instance @@ -325,15 +358,19 @@ the method `get_catalogue` to narrow down the result to a single transformer in For instance, these parameters filter the catalogue down to a single transformer parameters: ```pycon ->>> rlf.TransformerParameters.from_catalogue(efficiency="A0Ak", type=r"^y.*$") -TransformerParameters(id='SE_Minera_A0Ak_50kVA') +>>> rlf.TransformerParameters.from_catalogue(efficiency="A0Ak", vg=r"Y.*", uhv=15000) + ``` The `name` filter can be directly used: ```pycon ->>> rlf.TransformerParameters.from_catalogue(name="SE_Minera_A0Ak_50kVA") -TransformerParameters(id='SE_Minera_A0Ak_50kVA') +>>> rlf.TransformerParameters.from_catalogue( +... name="SE Minera A0Ak 50kVA 15/20kV(15) 410V Yzn11" +... ) + ``` In case no or several results match the parameters, an error is raised: @@ -341,11 +378,11 @@ In case no or several results match the parameters, an error is raised: ```pycon >>> rlf.TransformerParameters.from_catalogue(manufacturer="ft") RoseauLoadFlowException: Several transformers matching the query (manufacturer='ft') have been found: -'FT_Standard_Standard_100kVA', 'FT_Standard_Standard_160kVA', 'FT_Standard_Standard_250kVA', -'FT_Standard_Standard_315kVA', 'FT_Standard_Standard_400kVA', 'FT_Standard_Standard_500kVA', -'FT_Standard_Standard_630kVA', 'FT_Standard_Standard_800kVA', 'FT_Standard_Standard_1000kVA', -'FT_Standard_Standard_1250kVA', 'FT_Standard_Standard_1600kVA', 'FT_Standard_Standard_2000kVA', -'FT_Standard_Standard_2500kVA', 'FT_Standard_Standard_3150kVA'. [catalogue_several_found] +'FT 100kVA 15/20kV(20) 400V Dyn11', 'FT 160kVA 15/20kV(20) 400V Dyn11', 'FT 250kVA 15/20kV(20) 400V Dyn11', +'FT 315kVA 15/20kV(20) 400V Dyn11', 'FT 400kVA 15/20kV(20) 400V Dyn11', 'FT 500kVA 15/20kV(20) 400V Dyn11', +'FT 630kVA 15/20kV(20) 400V Dyn11', 'FT 800kVA 15/20kV(20) 400V Dyn11', 'FT 1000kVA 15/20kV(20) 400V Dyn11', +'FT 1250kVA 15/20kV(20) 400V Dyn11', 'FT 1600kVA 15/20kV(20) 400V Dyn11', 'FT 2000kVA 15/20kV(20) 400V Dyn11', +'FT 2500kVA 15/20kV(20) 400V Dyn11', 'FT 3150kVA [...]. [catalogue_several_found] ``` or if no results: @@ -353,7 +390,7 @@ or if no results: ```pycon >>> rlf.TransformerParameters.from_catalogue(manufacturer="unknown") RoseauLoadFlowException: No manufacturer matching 'unknown' has been found. Available manufacturers -are 'FT', 'SE'. [catalogue_not_found] +are 'FT', 'SE', 'CA'. [catalogue_not_found] ``` (catalogues-lines)= diff --git a/doc/usage/Flexible_Loads.md b/doc/usage/Flexible_Loads.md index ea30a638..97861eb7 100644 --- a/doc/usage/Flexible_Loads.md +++ b/doc/usage/Flexible_Loads.md @@ -47,10 +47,10 @@ a Delta-Wye transformer and a small LV network. >>> # Add a MV/LV transformer ... tp = rlf.TransformerParameters.from_open_and_short_circuit_tests( ... "160_kVA", -... "Dyn11", +... vg="Dyn11", ... sn=160.0 * 1e3, -... up=20e3, -... us=400.0, +... uhv=20e3, +... ulv=400.0, ... i0=2.3 / 100, ... p0=460.0, ... psc=2350.0, diff --git a/pyproject.toml b/pyproject.toml index f17d5b43..5dc48d6e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,7 +33,6 @@ dependencies = [ "pandas>=1.4.0", "geopandas>=1.0.0", "shapely>=2.0.0", - "regex>=2022.1.18", "pint>=0.21.0", "typing-extensions>=4.6.2", "pyproj>=3.3.0", diff --git a/roseau/load_flow/data/networks/LVFeeder00939_Summer.json b/roseau/load_flow/data/networks/LVFeeder00939_Summer.json index 0a392cf9..2357bedd 100644 --- a/roseau/load_flow/data/networks/LVFeeder00939_Summer.json +++ b/roseau/load_flow/data/networks/LVFeeder00939_Summer.json @@ -446,9 +446,9 @@ { "id": "Dyn11_160kVA", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, - "type": "Dyn11", + "uhv": 20000.0, + "ulv": 400.0, + "vg": "Dyn11", "z2": [0.014687500000000001, 0.037205877811845804], "ym": [3.8333333333333335e-7, -3.0426140077242796e-6], "i0": 0.023, diff --git a/roseau/load_flow/data/networks/LVFeeder00939_Winter.json b/roseau/load_flow/data/networks/LVFeeder00939_Winter.json index 8889453e..3e0a6199 100644 --- a/roseau/load_flow/data/networks/LVFeeder00939_Winter.json +++ b/roseau/load_flow/data/networks/LVFeeder00939_Winter.json @@ -446,9 +446,9 @@ { "id": "Dyn11_160kVA", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, - "type": "Dyn11", + "uhv": 20000.0, + "ulv": 400.0, + "vg": "Dyn11", "z2": [0.014687500000000001, 0.037205877811845804], "ym": [3.8333333333333335e-7, -3.0426140077242796e-6], "i0": 0.023, diff --git a/roseau/load_flow/data/networks/LVFeeder02639_Summer.json b/roseau/load_flow/data/networks/LVFeeder02639_Summer.json index 64f9c9d3..8742fcbe 100644 --- a/roseau/load_flow/data/networks/LVFeeder02639_Summer.json +++ b/roseau/load_flow/data/networks/LVFeeder02639_Summer.json @@ -372,9 +372,9 @@ { "id": "Dyn11_160kVA", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, - "type": "Dyn11", + "uhv": 20000.0, + "ulv": 400.0, + "vg": "Dyn11", "z2": [0.014687500000000001, 0.037205877811845804], "ym": [3.8333333333333335e-7, -3.0426140077242796e-6], "i0": 0.023, diff --git a/roseau/load_flow/data/networks/LVFeeder02639_Winter.json b/roseau/load_flow/data/networks/LVFeeder02639_Winter.json index 65b5df62..9c5a96d9 100644 --- a/roseau/load_flow/data/networks/LVFeeder02639_Winter.json +++ b/roseau/load_flow/data/networks/LVFeeder02639_Winter.json @@ -372,9 +372,9 @@ { "id": "Dyn11_160kVA", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, - "type": "Dyn11", + "uhv": 20000.0, + "ulv": 400.0, + "vg": "Dyn11", "z2": [0.014687500000000001, 0.037205877811845804], "ym": [3.8333333333333335e-7, -3.0426140077242796e-6], "i0": 0.023, diff --git a/roseau/load_flow/data/networks/LVFeeder04790_Summer.json b/roseau/load_flow/data/networks/LVFeeder04790_Summer.json index 680d8de8..cfd24e62 100644 --- a/roseau/load_flow/data/networks/LVFeeder04790_Summer.json +++ b/roseau/load_flow/data/networks/LVFeeder04790_Summer.json @@ -247,9 +247,9 @@ { "id": "Dyn11_160kVA", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, - "type": "Dyn11", + "uhv": 20000.0, + "ulv": 400.0, + "vg": "Dyn11", "z2": [0.014687500000000001, 0.037205877811845804], "ym": [3.8333333333333335e-7, -3.0426140077242796e-6], "i0": 0.023, diff --git a/roseau/load_flow/data/networks/LVFeeder04790_Winter.json b/roseau/load_flow/data/networks/LVFeeder04790_Winter.json index 2ddc9206..5ac4ee28 100644 --- a/roseau/load_flow/data/networks/LVFeeder04790_Winter.json +++ b/roseau/load_flow/data/networks/LVFeeder04790_Winter.json @@ -247,9 +247,9 @@ { "id": "Dyn11_160kVA", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, - "type": "Dyn11", + "uhv": 20000.0, + "ulv": 400.0, + "vg": "Dyn11", "z2": [0.014687500000000001, 0.037205877811845804], "ym": [3.8333333333333335e-7, -3.0426140077242796e-6], "i0": 0.023, diff --git a/roseau/load_flow/data/networks/LVFeeder06713_Summer.json b/roseau/load_flow/data/networks/LVFeeder06713_Summer.json index 13ba6d68..9c28e61e 100644 --- a/roseau/load_flow/data/networks/LVFeeder06713_Summer.json +++ b/roseau/load_flow/data/networks/LVFeeder06713_Summer.json @@ -168,9 +168,9 @@ { "id": "Dyn11_160kVA", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, - "type": "Dyn11", + "uhv": 20000.0, + "ulv": 400.0, + "vg": "Dyn11", "z2": [0.014687500000000001, 0.037205877811845804], "ym": [3.8333333333333335e-7, -3.0426140077242796e-6], "i0": 0.023, diff --git a/roseau/load_flow/data/networks/LVFeeder06713_Winter.json b/roseau/load_flow/data/networks/LVFeeder06713_Winter.json index a4b875dd..0a61dfdb 100644 --- a/roseau/load_flow/data/networks/LVFeeder06713_Winter.json +++ b/roseau/load_flow/data/networks/LVFeeder06713_Winter.json @@ -168,9 +168,9 @@ { "id": "Dyn11_160kVA", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, - "type": "Dyn11", + "uhv": 20000.0, + "ulv": 400.0, + "vg": "Dyn11", "z2": [0.014687500000000001, 0.037205877811845804], "ym": [3.8333333333333335e-7, -3.0426140077242796e-6], "i0": 0.023, diff --git a/roseau/load_flow/data/networks/LVFeeder06926_Summer.json b/roseau/load_flow/data/networks/LVFeeder06926_Summer.json index ecb64bb8..5c7fcd1f 100644 --- a/roseau/load_flow/data/networks/LVFeeder06926_Summer.json +++ b/roseau/load_flow/data/networks/LVFeeder06926_Summer.json @@ -169,9 +169,9 @@ { "id": "Dyn11_160kVA", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, - "type": "Dyn11", + "uhv": 20000.0, + "ulv": 400.0, + "vg": "Dyn11", "z2": [0.014687500000000001, 0.037205877811845804], "ym": [3.8333333333333335e-7, -3.0426140077242796e-6], "i0": 0.023, diff --git a/roseau/load_flow/data/networks/LVFeeder06926_Winter.json b/roseau/load_flow/data/networks/LVFeeder06926_Winter.json index 84776d91..d23573e4 100644 --- a/roseau/load_flow/data/networks/LVFeeder06926_Winter.json +++ b/roseau/load_flow/data/networks/LVFeeder06926_Winter.json @@ -169,9 +169,9 @@ { "id": "Dyn11_160kVA", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, - "type": "Dyn11", + "uhv": 20000.0, + "ulv": 400.0, + "vg": "Dyn11", "z2": [0.014687500000000001, 0.037205877811845804], "ym": [3.8333333333333335e-7, -3.0426140077242796e-6], "i0": 0.023, diff --git a/roseau/load_flow/data/networks/LVFeeder06975_Summer.json b/roseau/load_flow/data/networks/LVFeeder06975_Summer.json index 2cd4768a..fd58897b 100644 --- a/roseau/load_flow/data/networks/LVFeeder06975_Summer.json +++ b/roseau/load_flow/data/networks/LVFeeder06975_Summer.json @@ -323,9 +323,9 @@ { "id": "Dyn11_160kVA", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, - "type": "Dyn11", + "uhv": 20000.0, + "ulv": 400.0, + "vg": "Dyn11", "z2": [0.014687500000000001, 0.037205877811845804], "ym": [3.8333333333333335e-7, -3.0426140077242796e-6], "i0": 0.023, diff --git a/roseau/load_flow/data/networks/LVFeeder06975_Winter.json b/roseau/load_flow/data/networks/LVFeeder06975_Winter.json index 54122f45..7f56fb37 100644 --- a/roseau/load_flow/data/networks/LVFeeder06975_Winter.json +++ b/roseau/load_flow/data/networks/LVFeeder06975_Winter.json @@ -323,9 +323,9 @@ { "id": "Dyn11_160kVA", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, - "type": "Dyn11", + "uhv": 20000.0, + "ulv": 400.0, + "vg": "Dyn11", "z2": [0.014687500000000001, 0.037205877811845804], "ym": [3.8333333333333335e-7, -3.0426140077242796e-6], "i0": 0.023, diff --git a/roseau/load_flow/data/networks/LVFeeder18498_Summer.json b/roseau/load_flow/data/networks/LVFeeder18498_Summer.json index 671807e3..fd809ffe 100644 --- a/roseau/load_flow/data/networks/LVFeeder18498_Summer.json +++ b/roseau/load_flow/data/networks/LVFeeder18498_Summer.json @@ -996,9 +996,9 @@ { "id": "Dyn11_160kVA", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, - "type": "Dyn11", + "uhv": 20000.0, + "ulv": 400.0, + "vg": "Dyn11", "z2": [0.014687500000000001, 0.037205877811845804], "ym": [3.8333333333333335e-7, -3.0426140077242796e-6], "i0": 0.023, diff --git a/roseau/load_flow/data/networks/LVFeeder18498_Winter.json b/roseau/load_flow/data/networks/LVFeeder18498_Winter.json index 2c2a5680..4fac30ec 100644 --- a/roseau/load_flow/data/networks/LVFeeder18498_Winter.json +++ b/roseau/load_flow/data/networks/LVFeeder18498_Winter.json @@ -996,9 +996,9 @@ { "id": "Dyn11_160kVA", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, - "type": "Dyn11", + "uhv": 20000.0, + "ulv": 400.0, + "vg": "Dyn11", "z2": [0.014687500000000001, 0.037205877811845804], "ym": [3.8333333333333335e-7, -3.0426140077242796e-6], "i0": 0.023, diff --git a/roseau/load_flow/data/networks/LVFeeder18769_Summer.json b/roseau/load_flow/data/networks/LVFeeder18769_Summer.json index 4290ee07..0559faeb 100644 --- a/roseau/load_flow/data/networks/LVFeeder18769_Summer.json +++ b/roseau/load_flow/data/networks/LVFeeder18769_Summer.json @@ -392,9 +392,9 @@ { "id": "Dyn11_160kVA", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, - "type": "Dyn11", + "uhv": 20000.0, + "ulv": 400.0, + "vg": "Dyn11", "z2": [0.014687500000000001, 0.037205877811845804], "ym": [3.8333333333333335e-7, -3.0426140077242796e-6], "i0": 0.023, diff --git a/roseau/load_flow/data/networks/LVFeeder18769_Winter.json b/roseau/load_flow/data/networks/LVFeeder18769_Winter.json index ffe709ee..fdfc624e 100644 --- a/roseau/load_flow/data/networks/LVFeeder18769_Winter.json +++ b/roseau/load_flow/data/networks/LVFeeder18769_Winter.json @@ -392,9 +392,9 @@ { "id": "Dyn11_160kVA", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, - "type": "Dyn11", + "uhv": 20000.0, + "ulv": 400.0, + "vg": "Dyn11", "z2": [0.014687500000000001, 0.037205877811845804], "ym": [3.8333333333333335e-7, -3.0426140077242796e-6], "i0": 0.023, diff --git a/roseau/load_flow/data/networks/LVFeeder19558_Summer.json b/roseau/load_flow/data/networks/LVFeeder19558_Summer.json index d77fbf9f..ddd906e7 100644 --- a/roseau/load_flow/data/networks/LVFeeder19558_Summer.json +++ b/roseau/load_flow/data/networks/LVFeeder19558_Summer.json @@ -173,9 +173,9 @@ { "id": "Dyn11_160kVA", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, - "type": "Dyn11", + "uhv": 20000.0, + "ulv": 400.0, + "vg": "Dyn11", "z2": [0.014687500000000001, 0.037205877811845804], "ym": [3.8333333333333335e-7, -3.0426140077242796e-6], "i0": 0.023, diff --git a/roseau/load_flow/data/networks/LVFeeder19558_Winter.json b/roseau/load_flow/data/networks/LVFeeder19558_Winter.json index 2cc14a9e..e7a39e95 100644 --- a/roseau/load_flow/data/networks/LVFeeder19558_Winter.json +++ b/roseau/load_flow/data/networks/LVFeeder19558_Winter.json @@ -173,9 +173,9 @@ { "id": "Dyn11_160kVA", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, - "type": "Dyn11", + "uhv": 20000.0, + "ulv": 400.0, + "vg": "Dyn11", "z2": [0.014687500000000001, 0.037205877811845804], "ym": [3.8333333333333335e-7, -3.0426140077242796e-6], "i0": 0.023, diff --git a/roseau/load_flow/data/networks/LVFeeder20256_Summer.json b/roseau/load_flow/data/networks/LVFeeder20256_Summer.json index 640a9ea2..723e8e47 100644 --- a/roseau/load_flow/data/networks/LVFeeder20256_Summer.json +++ b/roseau/load_flow/data/networks/LVFeeder20256_Summer.json @@ -447,9 +447,9 @@ { "id": "Dyn11_160kVA", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, - "type": "Dyn11", + "uhv": 20000.0, + "ulv": 400.0, + "vg": "Dyn11", "z2": [0.014687500000000001, 0.037205877811845804], "ym": [3.8333333333333335e-7, -3.0426140077242796e-6], "i0": 0.023, diff --git a/roseau/load_flow/data/networks/LVFeeder20256_Winter.json b/roseau/load_flow/data/networks/LVFeeder20256_Winter.json index b93ce2df..4585853f 100644 --- a/roseau/load_flow/data/networks/LVFeeder20256_Winter.json +++ b/roseau/load_flow/data/networks/LVFeeder20256_Winter.json @@ -447,9 +447,9 @@ { "id": "Dyn11_160kVA", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, - "type": "Dyn11", + "uhv": 20000.0, + "ulv": 400.0, + "vg": "Dyn11", "z2": [0.014687500000000001, 0.037205877811845804], "ym": [3.8333333333333335e-7, -3.0426140077242796e-6], "i0": 0.023, diff --git a/roseau/load_flow/data/networks/LVFeeder23832_Summer.json b/roseau/load_flow/data/networks/LVFeeder23832_Summer.json index f85cf159..5a3640f1 100644 --- a/roseau/load_flow/data/networks/LVFeeder23832_Summer.json +++ b/roseau/load_flow/data/networks/LVFeeder23832_Summer.json @@ -172,9 +172,9 @@ { "id": "Dyn11_160kVA", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, - "type": "Dyn11", + "uhv": 20000.0, + "ulv": 400.0, + "vg": "Dyn11", "z2": [0.014687500000000001, 0.037205877811845804], "ym": [3.8333333333333335e-7, -3.0426140077242796e-6], "i0": 0.023, diff --git a/roseau/load_flow/data/networks/LVFeeder23832_Winter.json b/roseau/load_flow/data/networks/LVFeeder23832_Winter.json index 7584b6f1..b8eb51af 100644 --- a/roseau/load_flow/data/networks/LVFeeder23832_Winter.json +++ b/roseau/load_flow/data/networks/LVFeeder23832_Winter.json @@ -172,9 +172,9 @@ { "id": "Dyn11_160kVA", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, - "type": "Dyn11", + "uhv": 20000.0, + "ulv": 400.0, + "vg": "Dyn11", "z2": [0.014687500000000001, 0.037205877811845804], "ym": [3.8333333333333335e-7, -3.0426140077242796e-6], "i0": 0.023, diff --git a/roseau/load_flow/data/networks/LVFeeder24400_Summer.json b/roseau/load_flow/data/networks/LVFeeder24400_Summer.json index 2ec1fb44..ac2a64c2 100644 --- a/roseau/load_flow/data/networks/LVFeeder24400_Summer.json +++ b/roseau/load_flow/data/networks/LVFeeder24400_Summer.json @@ -215,9 +215,9 @@ { "id": "Dyn11_160kVA", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, - "type": "Dyn11", + "uhv": 20000.0, + "ulv": 400.0, + "vg": "Dyn11", "z2": [0.014687500000000001, 0.037205877811845804], "ym": [3.8333333333333335e-7, -3.0426140077242796e-6], "i0": 0.023, diff --git a/roseau/load_flow/data/networks/LVFeeder24400_Winter.json b/roseau/load_flow/data/networks/LVFeeder24400_Winter.json index 2b6dc2c4..237c51c9 100644 --- a/roseau/load_flow/data/networks/LVFeeder24400_Winter.json +++ b/roseau/load_flow/data/networks/LVFeeder24400_Winter.json @@ -215,9 +215,9 @@ { "id": "Dyn11_160kVA", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, - "type": "Dyn11", + "uhv": 20000.0, + "ulv": 400.0, + "vg": "Dyn11", "z2": [0.014687500000000001, 0.037205877811845804], "ym": [3.8333333333333335e-7, -3.0426140077242796e-6], "i0": 0.023, diff --git a/roseau/load_flow/data/networks/LVFeeder27429_Summer.json b/roseau/load_flow/data/networks/LVFeeder27429_Summer.json index 2de498e5..bf8a213a 100644 --- a/roseau/load_flow/data/networks/LVFeeder27429_Summer.json +++ b/roseau/load_flow/data/networks/LVFeeder27429_Summer.json @@ -612,9 +612,9 @@ { "id": "Dyn11_160kVA", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, - "type": "Dyn11", + "uhv": 20000.0, + "ulv": 400.0, + "vg": "Dyn11", "z2": [0.014687500000000001, 0.037205877811845804], "ym": [3.8333333333333335e-7, -3.0426140077242796e-6], "i0": 0.023, diff --git a/roseau/load_flow/data/networks/LVFeeder27429_Winter.json b/roseau/load_flow/data/networks/LVFeeder27429_Winter.json index 9b1c051c..16256fa8 100644 --- a/roseau/load_flow/data/networks/LVFeeder27429_Winter.json +++ b/roseau/load_flow/data/networks/LVFeeder27429_Winter.json @@ -612,9 +612,9 @@ { "id": "Dyn11_160kVA", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, - "type": "Dyn11", + "uhv": 20000.0, + "ulv": 400.0, + "vg": "Dyn11", "z2": [0.014687500000000001, 0.037205877811845804], "ym": [3.8333333333333335e-7, -3.0426140077242796e-6], "i0": 0.023, diff --git a/roseau/load_flow/data/networks/LVFeeder27681_Summer.json b/roseau/load_flow/data/networks/LVFeeder27681_Summer.json index 1cffd0fe..bf509333 100644 --- a/roseau/load_flow/data/networks/LVFeeder27681_Summer.json +++ b/roseau/load_flow/data/networks/LVFeeder27681_Summer.json @@ -169,9 +169,9 @@ { "id": "Dyn11_160kVA", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, - "type": "Dyn11", + "uhv": 20000.0, + "ulv": 400.0, + "vg": "Dyn11", "z2": [0.014687500000000001, 0.037205877811845804], "ym": [3.8333333333333335e-7, -3.0426140077242796e-6], "i0": 0.023, diff --git a/roseau/load_flow/data/networks/LVFeeder27681_Winter.json b/roseau/load_flow/data/networks/LVFeeder27681_Winter.json index e4b92934..11978580 100644 --- a/roseau/load_flow/data/networks/LVFeeder27681_Winter.json +++ b/roseau/load_flow/data/networks/LVFeeder27681_Winter.json @@ -169,9 +169,9 @@ { "id": "Dyn11_160kVA", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, - "type": "Dyn11", + "uhv": 20000.0, + "ulv": 400.0, + "vg": "Dyn11", "z2": [0.014687500000000001, 0.037205877811845804], "ym": [3.8333333333333335e-7, -3.0426140077242796e-6], "i0": 0.023, diff --git a/roseau/load_flow/data/networks/LVFeeder30216_Summer.json b/roseau/load_flow/data/networks/LVFeeder30216_Summer.json index b56c3f99..2331612b 100644 --- a/roseau/load_flow/data/networks/LVFeeder30216_Summer.json +++ b/roseau/load_flow/data/networks/LVFeeder30216_Summer.json @@ -485,9 +485,9 @@ { "id": "Dyn11_160kVA", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, - "type": "Dyn11", + "uhv": 20000.0, + "ulv": 400.0, + "vg": "Dyn11", "z2": [0.014687500000000001, 0.037205877811845804], "ym": [3.8333333333333335e-7, -3.0426140077242796e-6], "i0": 0.023, diff --git a/roseau/load_flow/data/networks/LVFeeder30216_Winter.json b/roseau/load_flow/data/networks/LVFeeder30216_Winter.json index 16f9870a..ad10cfcf 100644 --- a/roseau/load_flow/data/networks/LVFeeder30216_Winter.json +++ b/roseau/load_flow/data/networks/LVFeeder30216_Winter.json @@ -485,9 +485,9 @@ { "id": "Dyn11_160kVA", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, - "type": "Dyn11", + "uhv": 20000.0, + "ulv": 400.0, + "vg": "Dyn11", "z2": [0.014687500000000001, 0.037205877811845804], "ym": [3.8333333333333335e-7, -3.0426140077242796e-6], "i0": 0.023, diff --git a/roseau/load_flow/data/networks/LVFeeder31441_Summer.json b/roseau/load_flow/data/networks/LVFeeder31441_Summer.json index e3d450d9..1bae42c8 100644 --- a/roseau/load_flow/data/networks/LVFeeder31441_Summer.json +++ b/roseau/load_flow/data/networks/LVFeeder31441_Summer.json @@ -228,9 +228,9 @@ { "id": "Dyn11_160kVA", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, - "type": "Dyn11", + "uhv": 20000.0, + "ulv": 400.0, + "vg": "Dyn11", "z2": [0.014687500000000001, 0.037205877811845804], "ym": [3.8333333333333335e-7, -3.0426140077242796e-6], "i0": 0.023, diff --git a/roseau/load_flow/data/networks/LVFeeder31441_Winter.json b/roseau/load_flow/data/networks/LVFeeder31441_Winter.json index e86bef21..c902d882 100644 --- a/roseau/load_flow/data/networks/LVFeeder31441_Winter.json +++ b/roseau/load_flow/data/networks/LVFeeder31441_Winter.json @@ -228,9 +228,9 @@ { "id": "Dyn11_160kVA", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, - "type": "Dyn11", + "uhv": 20000.0, + "ulv": 400.0, + "vg": "Dyn11", "z2": [0.014687500000000001, 0.037205877811845804], "ym": [3.8333333333333335e-7, -3.0426140077242796e-6], "i0": 0.023, diff --git a/roseau/load_flow/data/networks/LVFeeder36284_Summer.json b/roseau/load_flow/data/networks/LVFeeder36284_Summer.json index 499df04b..97515631 100644 --- a/roseau/load_flow/data/networks/LVFeeder36284_Summer.json +++ b/roseau/load_flow/data/networks/LVFeeder36284_Summer.json @@ -265,9 +265,9 @@ { "id": "Dyn11_160kVA", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, - "type": "Dyn11", + "uhv": 20000.0, + "ulv": 400.0, + "vg": "Dyn11", "z2": [0.014687500000000001, 0.037205877811845804], "ym": [3.8333333333333335e-7, -3.0426140077242796e-6], "i0": 0.023, diff --git a/roseau/load_flow/data/networks/LVFeeder36284_Winter.json b/roseau/load_flow/data/networks/LVFeeder36284_Winter.json index 6cedc9e7..8c5bb6b7 100644 --- a/roseau/load_flow/data/networks/LVFeeder36284_Winter.json +++ b/roseau/load_flow/data/networks/LVFeeder36284_Winter.json @@ -265,9 +265,9 @@ { "id": "Dyn11_160kVA", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, - "type": "Dyn11", + "uhv": 20000.0, + "ulv": 400.0, + "vg": "Dyn11", "z2": [0.014687500000000001, 0.037205877811845804], "ym": [3.8333333333333335e-7, -3.0426140077242796e-6], "i0": 0.023, diff --git a/roseau/load_flow/data/networks/LVFeeder36360_Summer.json b/roseau/load_flow/data/networks/LVFeeder36360_Summer.json index 295ca055..86b0255e 100644 --- a/roseau/load_flow/data/networks/LVFeeder36360_Summer.json +++ b/roseau/load_flow/data/networks/LVFeeder36360_Summer.json @@ -494,9 +494,9 @@ { "id": "Dyn11_160kVA", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, - "type": "Dyn11", + "uhv": 20000.0, + "ulv": 400.0, + "vg": "Dyn11", "z2": [0.014687500000000001, 0.037205877811845804], "ym": [3.8333333333333335e-7, -3.0426140077242796e-6], "i0": 0.023, diff --git a/roseau/load_flow/data/networks/LVFeeder36360_Winter.json b/roseau/load_flow/data/networks/LVFeeder36360_Winter.json index 72377cfa..7f7c302f 100644 --- a/roseau/load_flow/data/networks/LVFeeder36360_Winter.json +++ b/roseau/load_flow/data/networks/LVFeeder36360_Winter.json @@ -494,9 +494,9 @@ { "id": "Dyn11_160kVA", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, - "type": "Dyn11", + "uhv": 20000.0, + "ulv": 400.0, + "vg": "Dyn11", "z2": [0.014687500000000001, 0.037205877811845804], "ym": [3.8333333333333335e-7, -3.0426140077242796e-6], "i0": 0.023, diff --git a/roseau/load_flow/data/networks/LVFeeder37263_Summer.json b/roseau/load_flow/data/networks/LVFeeder37263_Summer.json index cd2a84b6..c07d77ad 100644 --- a/roseau/load_flow/data/networks/LVFeeder37263_Summer.json +++ b/roseau/load_flow/data/networks/LVFeeder37263_Summer.json @@ -175,9 +175,9 @@ { "id": "Dyn11_160kVA", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, - "type": "Dyn11", + "uhv": 20000.0, + "ulv": 400.0, + "vg": "Dyn11", "z2": [0.014687500000000001, 0.037205877811845804], "ym": [3.8333333333333335e-7, -3.0426140077242796e-6], "i0": 0.023, diff --git a/roseau/load_flow/data/networks/LVFeeder37263_Winter.json b/roseau/load_flow/data/networks/LVFeeder37263_Winter.json index 82d42ec3..5e1f12fc 100644 --- a/roseau/load_flow/data/networks/LVFeeder37263_Winter.json +++ b/roseau/load_flow/data/networks/LVFeeder37263_Winter.json @@ -175,9 +175,9 @@ { "id": "Dyn11_160kVA", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, - "type": "Dyn11", + "uhv": 20000.0, + "ulv": 400.0, + "vg": "Dyn11", "z2": [0.014687500000000001, 0.037205877811845804], "ym": [3.8333333333333335e-7, -3.0426140077242796e-6], "i0": 0.023, diff --git a/roseau/load_flow/data/networks/LVFeeder38211_Summer.json b/roseau/load_flow/data/networks/LVFeeder38211_Summer.json index 6efa6707..1e89f68b 100644 --- a/roseau/load_flow/data/networks/LVFeeder38211_Summer.json +++ b/roseau/load_flow/data/networks/LVFeeder38211_Summer.json @@ -310,9 +310,9 @@ { "id": "Dyn11_160kVA", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, - "type": "Dyn11", + "uhv": 20000.0, + "ulv": 400.0, + "vg": "Dyn11", "z2": [0.014687500000000001, 0.037205877811845804], "ym": [3.8333333333333335e-7, -3.0426140077242796e-6], "i0": 0.023, diff --git a/roseau/load_flow/data/networks/LVFeeder38211_Winter.json b/roseau/load_flow/data/networks/LVFeeder38211_Winter.json index 5dbdb4d5..e67fbb16 100644 --- a/roseau/load_flow/data/networks/LVFeeder38211_Winter.json +++ b/roseau/load_flow/data/networks/LVFeeder38211_Winter.json @@ -310,9 +310,9 @@ { "id": "Dyn11_160kVA", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, - "type": "Dyn11", + "uhv": 20000.0, + "ulv": 400.0, + "vg": "Dyn11", "z2": [0.014687500000000001, 0.037205877811845804], "ym": [3.8333333333333335e-7, -3.0426140077242796e-6], "i0": 0.023, diff --git a/roseau/load_flow/data/transformers/Catalogue.csv b/roseau/load_flow/data/transformers/Catalogue.csv index a08805bc..5a35117e 100644 --- a/roseau/load_flow/data/transformers/Catalogue.csv +++ b/roseau/load_flow/data/transformers/Catalogue.csv @@ -1,163 +1,310 @@ -name,manufacturer,range,efficiency,sn,vsc,psc,i0,p0,type,up,us,du1,du0.8,eff1 100%,eff0.8 100%,eff1 75%,eff0.8 75% -FT_Standard_Standard_100kVA,FT,Standard,Standard,100000,0.04,2150,0.025,210,Dyn11,20000,400,2.21,3.75,97.69,97.13,98.14,97.69 -FT_Standard_Standard_160kVA,FT,Standard,Standard,160000,0.04,2350,0.023,460,Dyn11,20000,400,1.54,3.43,98.27,97.85,98.54,98.18 -FT_Standard_Standard_250kVA,FT,Standard,Standard,250000,0.04,3250,0.021,650,Dyn11,20000,400,1.37,3.33,98.46,98.09,98.7,98.37 -FT_Standard_Standard_315kVA,FT,Standard,Standard,315000,0.04,3900,0.02,800,Dyn11,20000,400,1.31,3.3,98.53,98.17,98.75,98.44 -FT_Standard_Standard_400kVA,FT,Standard,Standard,400000,0.04,4600,0.019,930,Dyn11,20000,400,1.22,3.25,98.64,98.3,98.84,98.56 -FT_Standard_Standard_500kVA,FT,Standard,Standard,500000,0.04,5500,0.019,1100,Dyn11,20000,400,1.17,3.22,98.7,98.387,98.89,98.62 -FT_Standard_Standard_630kVA,FT,Standard,Standard,630000,0.04,6500,0.018,1300,Dyn11,20000,400,1.11,3.17,98.78,98.48,98.96,98.71 -FT_Standard_Standard_800kVA,FT,Standard,Standard,800000,0.06,10700,0.025,1220,Dyn11,20000,400,1.51,4.65,98.53,98.17,98.81,98.51 -FT_Standard_Standard_1000kVA,FT,Standard,Standard,1000000,0.06,13000,0.024,1470,Dyn11,20000,400,1.47,4.63,98.57,98.22,98.84,98.56 -FT_Standard_Standard_1250kVA,FT,Standard,Standard,1250000,0.06,16000,0.022,1800,Dyn11,20000,400,1.45,4.62,98.6,98.25,98.86,98.58 -FT_Standard_Standard_1600kVA,FT,Standard,Standard,1600000,0.06,20000,0.02,2300,Dyn11,20000,400,1.42,4.6,98.63,98.29,98.88,98.61 -FT_Standard_Standard_2000kVA,FT,Standard,Standard,2000000,0.06,25500,0.019,2750,Dyn11,20000,400,1.45,4.61,98.61,98.27,98.87,98.6 -FT_Standard_Standard_2500kVA,FT,Standard,Standard,2500000,0.06,32000,0.018,3350,Dyn11,20000,400,1.45,4.62,98.61,98.26,98.87,98.6 -FT_Standard_Standard_3150kVA,FT,Standard,Standard,3150000,0.07,33000,0.017,4380,Dyn11,20000,400,1.29,5.11,98.83,98.54,99.04,98.8 -SE_Minera_AA0Ak_160kVA,SE,Minera,AA0Ak,160000,0.04,1750,0.15,189,Dyn11,20000,400,,,98.803,98.508,99.032,98.792 -SE_Minera_AA0Ak_250kVA,SE,Minera,AA0Ak,250000,0.04,2350,0.14,270,Dyn11,20000,400,,,98.963,98.707,99.158,98.95 -SE_Minera_AA0Ak_400kVA,SE,Minera,AA0Ak,400000,0.04,3250,0.16,387,Dyn11,20000,400,,,99.099,98.876,99.267,99.085 -SE_Minera_AA0Ak_630kVA,SE,Minera,AA0Ak,630000,0.04,4600,0.15,540,Dyn11,20000,400,,,99.191,98.99,99.342,99.179 -SE_Minera_AA0Ak_800kVA,SE,Minera,AA0Ak,800000,0.04,6000,0.12,585,Dyn11,20000,400,,,99.184,98.982,99.344,99.192 -SE_Minera_AA0Ak_1000kVA,SE,Minera,AA0Ak,1000000,0.04,7600,0.12,693,Dyn11,20000,400,,,99.178,98.974,99.342,99.179 -SE_Minera_AA0Ak_1250kVA,SE,Minera,AA0Ak,1250000,0.04,9500,0.12,855,Dyn11,20000,400,,,99.178,98.975,99.343,99.18 -SE_Minera_AA0Ak_1600kVA,SE,Minera,AA0Ak,1600000,0.04,12000,0.28,1080,Dyn11,20000,400,,,99.189,99.988,99.352,99.191 -SE_Minera_AA0Ak_2000kVA,SE,Minera,AA0Ak,2000000,0.04,15000,0.28,1305,Dyn11,20000,400,,,99.191,98.991,99.355,99.195 -SE_Minera_AA0Ak_2500kVA,SE,Minera,AA0Ak,2500000,0.04,18500,0.28,1575,Dyn11,20000,400,,,99.203,99.006,99.365,99.208 -SE_Minera_AA0Ak_3150kVA,SE,Minera,AA0Ak,3150000,0.04,23000,0.28,1980,Dyn11,20000,400,,,99.213,99.018,99.373,99.217 -SE_Minera_A0Ak_50kVA,SE,Minera,A0Ak,50000,0.04,750,0.005,90,Yzn11,20000,400,1.57,3.45,98.35,97.94,98.65,98.32 -SE_Minera_A0Ak_100kVA,SE,Minera,A0Ak,100000,0.04,1250,0.005,145,Dyn11,20000,400,1.32,3.31,98.62,98.29,98.88,98.61 -SE_Minera_A0Ak_160kVA,SE,Minera,A0Ak,160000,0.04,1700,0.005,210,Dyn11,20000,400,1.14,3.19,98.82,98.53,99.04,98.8 -SE_Minera_A0Ak_250kVA,SE,Minera,A0Ak,250000,0.04,2350,0.005,300,Dyn11,20000,400,1.02,3.12,98.95,98.69,99.14,98.93 -SE_Minera_A0Ak_315kVA,SE,Minera,A0Ak,315000,0.04,2800,0.005,360,Dyn11,20000,400,0.96,3.08,99.01,98.76,99.19,98.99 -SE_Minera_A0Ak_400kVA,SE,Minera,A0Ak,400000,0.04,3250,0.005,430,Dyn11,20000,400,0.89,3.03,99.09,98.86,99.25,99.07 -SE_Minera_A0Ak_500kVA,SE,Minera,A0Ak,500000,0.04,3900,0.005,510,Dyn11,20000,400,0.86,3.01,99.13,98.91,99.28,99.11 -SE_Minera_A0Ak_630kVA,SE,Minera,A0Ak,630000,0.04,4600,0.005,600,Dyn11,20000,400,0.81,2.98,99.18,98.98,99.33,99.16 -SE_Minera_A0Ak_800kVA,SE,Minera,A0Ak,800000,0.06,6000,0.005,650,Dyn11,20000,400,0.93,4.26,99.18,98.97,99.33,99.17 -SE_Minera_A0Ak_1000kVA,SE,Minera,A0Ak,1000000,0.06,7600,0.005,770,Dyn11,20000,400,0.94,4.27,99.17,98.96,99.33,99.17 -SE_Minera_A0Ak_1250kVA,SE,Minera,A0Ak,1250000,0.06,9500,0.005,950,Dyn11,20000,400,0.94,4.27,99.17,98.97,99.33,99.17 -SE_Minera_A0Ak_1600kVA,SE,Minera,A0Ak,1600000,0.06,12000,0.005,1200,Dyn11,20000,400,0.93,4.26,99.18,98.98,99.34,99.18 -SE_Minera_A0Ak_2000kVA,SE,Minera,A0Ak,2000000,0.06,15000,0.005,1450,Dyn11,20000,400,0.93,4.26,99.18,98.98,99.35,99.18 -SE_Minera_A0Ak_2500kVA,SE,Minera,A0Ak,2500000,0.06,18500,0.005,1750,Dyn11,20000,400,0.92,4.26,99.2,99.0,99.36,99.2 -SE_Minera_B0Bk_50kVA,SE,Minera,B0Bk,50000,0.04,875,0.01,110,Yzn11,20000,400,1.81,3.57,98.07,97.6,98.42,98.03 -SE_Minera_B0Bk_100kVA,SE,Minera,B0Bk,100000,0.04,1475,0.01,180,Dyn11,20000,400,1.54,3.43,98.37,97.97,98.67,98.35 -SE_Minera_B0Bk_160kVA,SE,Minera,B0Bk,160000,0.04,2000,0.008,260,Dyn11,20000,400,1.32,3.31,98.61,98.27,98.86,98.58 -SE_Minera_B0Bk_250kVA,SE,Minera,B0Bk,250000,0.04,2750,0.008,360,Dyn11,20000,400,1.17,3.22,98.77,98.47,98.99,98.74 -SE_Minera_B0Bk_315kVA,SE,Minera,B0Bk,315000,0.04,3250,0.008,440,Dyn11,20000,400,1.11,3.17,98.84,98.56,99.05,98.81 -SE_Minera_B0Bk_400kVA,SE,Minera,B0Bk,400000,0.04,3850,0.008,520,Dyn11,20000,400,1.04,3.13,98.92,98.65,99.11,98.89 -SE_Minera_B0Bk_500kVA,SE,Minera,B0Bk,500000,0.04,4600,0.008,610,Dyn11,20000,400,1.0,3.1,98.97,98.71,99.15,98.95 -SE_Minera_B0Bk_630kVA,SE,Minera,B0Bk,630000,0.04,5400,0.007,730,Dyn11,20000,400,0.93,3.06,99.04,98.8,99.21,99.01 -SE_Minera_B0Bk_800kVA,SE,Minera,B0Bk,800000,0.06,7000,0.007,800,Dyn11,20000,400,1.05,4.35,99.03,98.8,99.22,99.02 -SE_Minera_B0Bk_1000kVA,SE,Minera,B0Bk,1000000,0.06,9000,0.007,940,Dyn11,20000,400,1.08,4.37,99.02,98.77,99.21,99.01 -SE_Minera_B0Bk_1250kVA,SE,Minera,B0Bk,1250000,0.06,11000,0.007,1150,Dyn11,20000,400,1.06,4.35,99.04,98.81,99.23,99.04 -SE_Minera_B0Bk_1600kVA,SE,Minera,B0Bk,1600000,0.06,14000,0.007,1450,Dyn11,20000,400,1.05,4.35,99.04,98.81,99.23,99.04 -SE_Minera_B0Bk_2000kVA,SE,Minera,B0Bk,2000000,0.06,18000,0.007,1800,Dyn11,20000,400,1.08,4.37,99.02,98.78,99.21,99.02 -SE_Minera_B0Bk_2500kVA,SE,Minera,B0Bk,2500000,0.06,22000,0.007,2150,Dyn11,20000,400,1.06,4.35,99.04,98.81,99.23,99.04 -SE_Minera_C0Bk_50kVA,SE,Minera,C0Bk,50000,0.04,875,0.015,125,Yzn11,20000,400,1.81,3.57,98.04,97.56,98.38,97.98 -SE_Minera_C0Bk_100kVA,SE,Minera,C0Bk,100000,0.04,1475,0.015,210,Dyn11,20000,400,1.54,3.43,98.34,97.94,98.63,98.3 -SE_Minera_C0Bk_160kVA,SE,Minera,C0Bk,160000,0.04,2000,0.014,300,Dyn11,20000,400,1.32,3.31,98.58,98.23,98.83,98.54 -SE_Minera_C0Bk_250kVA,SE,Minera,C0Bk,250000,0.04,2750,0.013,425,Dyn11,20000,400,1.17,3.22,98.75,98.44,98.96,98.7 -SE_Minera_C0Bk_315kVA,SE,Minera,C0Bk,315000,0.04,3250,0.013,520,Dyn11,20000,400,1.11,3.17,98.82,98.53,99.02,98.77 -SE_Minera_C0Bk_400kVA,SE,Minera,C0Bk,400000,0.04,3850,0.012,610,Dyn11,20000,400,1.04,3.13,98.9,98.63,99.08,98.86 -SE_Minera_C0Bk_500kVA,SE,Minera,C0Bk,500000,0.04,4600,0.012,720,Dyn11,20000,400,1.0,3.1,98.95,98.69,99.13,98.91 -SE_Minera_C0Bk_630kVA,SE,Minera,C0Bk,630000,0.04,5400,0.011,860,Dyn11,20000,400,0.93,3.06,99.02,98.77,99.18,98.98 -SE_Minera_C0Bk_800kVA,SE,Minera,C0Bk,800000,0.06,7000,0.011,930,Dyn11,20000,400,1.05,4.35,99.02,98.78,99.2,99.0 -SE_Minera_C0Bk_1000kVA,SE,Minera,C0Bk,1000000,0.06,9000,0.01,1100,Dyn11,20000,400,1.08,4.37,99.0,98.75,99.19,98.98 -SE_Minera_C0Bk_1250kVA,SE,Minera,C0Bk,1250000,0.06,11000,0.01,1350,Dyn11,20000,400,1.06,4.35,99.02,98.78,99.2,99.0 -SE_Minera_C0Bk_1600kVA,SE,Minera,C0Bk,1600000,0.06,14000,0.01,1700,Dyn11,20000,400,1.05,4.35,99.03,98.79,99.21,99.01 -SE_Minera_C0Bk_2000kVA,SE,Minera,C0Bk,2000000,0.06,18000,0.01,2100,Dyn11,20000,400,1.08,4.37,99.0,98.76,99.19,98.99 -SE_Minera_C0Bk_2500kVA,SE,Minera,C0Bk,2500000,0.06,22000,0.01,2500,Dyn11,20000,400,1.06,4.35,99.03,98.76,99.21,99.02 -SE_Minera_Standard_50kVA,SE,Minera,Standard,50000,0.04,1350,0.01,125,Yzn11,20000,400,2.74,3.93,97.13,96.44,97.7,97.14 -SE_Minera_Standard_100kVA,SE,Minera,Standard,100000,0.04,2150,0.01,210,Dyn11,20000,400,2.21,3.75,97.69,97.13,98.14,97.69 -SE_Minera_Standard_160kVA,SE,Minera,Standard,160000,0.04,3100,0.015,375,Dyn11,20000,400,2.0,3.66,97.87,97.36,98.27,97.84 -SE_Minera_Standard_250kVA,SE,Minera,Standard,250000,0.04,3250,0.026,650,Dyn11,20000,400,1.37,3.33,98.46,98.09,98.7,98.37 -SE_Minera_Standard_315kVA,SE,Minera,Standard,315000,0.04,3900,0.025,770,Dyn11,20000,400,1.31,3.3,98.54,98.18,98.76,98.46 -SE_Minera_Standard_400kVA,SE,Minera,Standard,400000,0.04,4600,0.023,930,Dyn11,20000,400,1.22,3.25,98.64,98.3,98.84,98.56 -SE_Minera_Standard_500kVA,SE,Minera,Standard,500000,0.04,5500,0.022,1100,Dyn11,20000,400,1.17,3.22,98.7,98.38,98.89,98.62 -SE_Minera_Standard_630kVA,SE,Minera,Standard,630000,0.04,6500,0.02,1300,Dyn11,20000,400,1.11,3.17,98.78,98.48,98.96,98.71 -SE_Minera_Standard_800kVA,SE,Minera,Standard,800000,0.06,10500,0.016,1150,Dyn11,20000,400,1.48,4.64,98.56,98.21,98.84,98.55 -SE_Minera_Standard_1000kVA,SE,Minera,Standard,1000000,0.06,13000,0.015,1400,Dyn11,20000,400,1.47,4.63,98.58,98.23,98.85,98.57 -SE_Minera_Standard_1250kVA,SE,Minera,Standard,1250000,0.06,16000,0.013,1750,Dyn11,20000,400,1.45,4.62,98.6,98.26,98.87,98.59 -SE_Minera_Standard_1600kVA,SE,Minera,Standard,1600000,0.06,20000,0.011,2200,Dyn11,20000,400,1.42,4.6,98.63,98.3,98.89,98.62 -SE_Minera_Standard_2000kVA,SE,Minera,Standard,2000000,0.06,26000,0.011,2700,Dyn11,20000,400,1.47,4.63,98.59,98.24,98.86,98.58 -SE_Minera_Standard_2500kVA,SE,Minera,Standard,2500000,0.06,32000,0.01,3200,Dyn11,20000,400,1.45,4.62,98.61,98.27,98.88,98.61 -SE_Trihal_AA0Ak_250kVA,SE,Trihal,AA0Ak,250000,0.06,3400,0.48,468,Dyn11,20000,400,,,98.476,98.103,98.746,98.438 -SE_Trihal_AA0Ak_400kVA,SE,Trihal,AA0Ak,400000,0.06,4500,0.42,675,Dyn11,20000,400,,,98.723,98.409,98.943,98.682 -SE_Trihal_AA0Ak_630kVA,SE,Trihal,AA0Ak,630000,0.06,7100,0.37,990,Dyn11,20000,400,,,98.732,98.420,98.956,98.699 -SE_Trihal_AA0Ak_800kVA,SE,Trihal,AA0Ak,800000,0.06,8000,0.34,1170,Dyn11,20000,400,,,98.867,98.587,99.064,98.833 -SE_Trihal_AA0Ak_1000kVA,SE,Trihal,AA0Ak,1000000,0.06,9000,0.33,1395,Dyn11,20000,400,,,98.971,98.717,99.146,98.935 -SE_Trihal_AA0Ak_1250kVA,SE,Trihal,AA0Ak,1250000,0.06,11000,0.29,1620,Dyn11,20000,400,,,99.000,98.754,99.174,98.970 -SE_Trihal_AA0Ak_1600kVA,SE,Trihal,AA0Ak,1600000,0.06,13000,0.27,1980,Dyn11,20000,400,,,99.072,98.843,99.232,99.041 -SE_Trihal_AA0Ak_2000kVA,SE,Trihal,AA0Ak,2000000,0.06,16000,0.27,2340,Dyn11,20000,400,,,99.091,98.867,99.250,99.064 -SE_Trihal_AA0Ak_2500kVA,SE,Trihal,AA0Ak,2500000,0.06,19000,0.24,2790,Dyn11,20000,400,,,99.136,98.922,99.286,99.110 -SE_Trihal_AA0Ak_3150kVA,SE,Trihal,AA0Ak,3150000,0.07,22000,0.21,3420,Dyn11,20000,400,,,99.199,99.001,99.336,99.171 -SE_Trihal_Extra_Reduced_Losses_160kVA,SE,Trihal,Extra_Reduced_Losses,160000,0.06,2340,0.023,400,Dyn11,20000,400,,,,,, -SE_Trihal_Extra_Reduced_Losses_250kVA,SE,Trihal,Extra_Reduced_Losses,250000,0.06,3060,0.02,520,Dyn11,20000,400,,,,,, -SE_Trihal_Extra_Reduced_Losses_400kVA,SE,Trihal,Extra_Reduced_Losses,400000,0.06,4050,0.015,750,Dyn11,20000,400,,,,,, -SE_Trihal_Extra_Reduced_Losses_630kVA,SE,Trihal,Extra_Reduced_Losses,630000,0.06,6390,0.013,1100,Dyn11,20000,400,,,,,, -SE_Trihal_Extra_Reduced_Losses_800kVA,SE,Trihal,Extra_Reduced_Losses,800000,0.06,7200,0.013,1300,Dyn11,20000,400,,,,,, -SE_Trihal_Extra_Reduced_Losses_1000kVA,SE,Trihal,Extra_Reduced_Losses,1000000,0.06,8100,0.012,1550,Dyn11,20000,400,,,,,, -SE_Trihal_Extra_Reduced_Losses_1250kVA,SE,Trihal,Extra_Reduced_Losses,1250000,0.06,9900,0.012,1800,Dyn11,20000,400,,,,,, -SE_Trihal_Extra_Reduced_Losses_1600kVA,SE,Trihal,Extra_Reduced_Losses,1600000,0.06,11700,0.012,2200,Dyn11,20000,400,,,,,, -SE_Trihal_Extra_Reduced_Losses_2000kVA,SE,Trihal,Extra_Reduced_Losses,2000000,0.06,14400,0.011,2600,Dyn11,20000,400,,,,,, -SE_Trihal_Extra_Reduced_Losses_2500kVA,SE,Trihal,Extra_Reduced_Losses,2500000,0.06,17100,0.01,3100,Dyn11,20000,400,,,,,, -SE_Trihal_Reduced_Losses_160kVA,SE,Trihal,Reduced_Losses,160000,0.06,2350,0.023,480,Dyn11,20000,400,,,,,, -SE_Trihal_Reduced_Losses_250kVA,SE,Trihal,Reduced_Losses,250000,0.06,3300,0.02,650,Dyn11,20000,400,,,,,, -SE_Trihal_Reduced_Losses_400kVA,SE,Trihal,Reduced_Losses,400000,0.06,4800,0.015,940,Dyn11,20000,400,,,,,, -SE_Trihal_Reduced_Losses_630kVA,SE,Trihal,Reduced_Losses,630000,0.06,6800,0.013,1250,Dyn11,20000,400,,,,,, -SE_Trihal_Reduced_Losses_800kVA,SE,Trihal,Reduced_Losses,800000,0.06,8200,0.013,1500,Dyn11,20000,400,,,,,, -SE_Trihal_Reduced_Losses_1000kVA,SE,Trihal,Reduced_Losses,1000000,0.06,9600,0.012,1800,Dyn11,20000,400,,,,,, -SE_Trihal_Reduced_Losses_1250kVA,SE,Trihal,Reduced_Losses,1250000,0.06,11400,0.012,2100,Dyn11,20000,400,,,,,, -SE_Trihal_Reduced_Losses_1600kVA,SE,Trihal,Reduced_Losses,1600000,0.06,14000,0.012,2400,Dyn11,20000,400,,,,,, -SE_Trihal_Reduced_Losses_2000kVA,SE,Trihal,Reduced_Losses,2000000,0.06,17400,0.011,3000,Dyn11,20000,400,,,,,, -SE_Trihal_Reduced_Losses_2500kVA,SE,Trihal,Reduced_Losses,2500000,0.06,20000,0.01,3600,Dyn11,20000,400,,,,,, -SE_Trihal_Standard_160kVA,SE,Trihal,Standard,160000,0.06,2350,0.023,650,Dyn11,20000,400,,,,,, -SE_Trihal_Standard_250kVA,SE,Trihal,Standard,250000,0.06,3300,0.02,880,Dyn11,20000,400,,,,,, -SE_Trihal_Standard_400kVA,SE,Trihal,Standard,400000,0.06,4800,0.015,1200,Dyn11,20000,400,,,,,, -SE_Trihal_Standard_630kVA,SE,Trihal,Standard,630000,0.06,6800,0.013,1650,Dyn11,20000,400,,,,,, -SE_Trihal_Standard_800kVA,SE,Trihal,Standard,800000,0.06,8200,0.013,2000,Dyn11,20000,400,,,,,, -SE_Trihal_Standard_1000kVA,SE,Trihal,Standard,1000000,0.06,9600,0.012,2300,Dyn11,20000,400,,,,,, -SE_Trihal_Standard_1250kVA,SE,Trihal,Standard,1250000,0.06,11400,0.012,2800,Dyn11,20000,400,,,,,, -SE_Trihal_Standard_1600kVA,SE,Trihal,Standard,1600000,0.06,14000,0.012,3100,Dyn11,20000,400,,,,,, -SE_Trihal_Standard_2000kVA,SE,Trihal,Standard,2000000,0.06,17400,0.011,4000,Dyn11,20000,400,,,,,, -SE_Trihal_Standard_2500kVA,SE,Trihal,Standard,2500000,0.06,20000,0.01,5000,Dyn11,20000,400,,,,,, -SE_Vegeta_AA0Ak_160kVA,SE,Vegeta,AA0Ak,160000,0.04,1750,0.15,189,Dyn11,20000,400,,,98.803,98.508,99.032,98.792 -SE_Vegeta_AA0Ak_250kVA,SE,Vegeta,AA0Ak,250000,0.04,2350,0.14,270,Dyn11,20000,400,,,98.963,98.707,99.158,98.95 -SE_Vegeta_AA0Ak_400kVA,SE,Vegeta,AA0Ak,400000,0.04,3250,0.16,387,Dyn11,20000,400,,,99.099,98.876,99.267,99.085 -SE_Vegeta_AA0Ak_630kVA,SE,Vegeta,AA0Ak,630000,0.04,4600,0.15,540,Dyn11,20000,400,,,99.191,98.99,99.342,99.179 -SE_Vegeta_AA0Ak_800kVA,SE,Vegeta,AA0Ak,800000,0.06,6000,0.12,585,Dyn11,20000,400,,,99.184,98.982,99.344,99.192 -SE_Vegeta_AA0Ak_1000kVA,SE,Vegeta,AA0Ak,1000000,0.06,7600,0.12,693,Dyn11,20000,400,,,99.178,98.974,99.342,99.179 -SE_Vegeta_AA0Ak_1250kVA,SE,Vegeta,AA0Ak,1250000,0.06,9500,0.12,855,Dyn11,20000,400,,,99.178,98.975,99.343,99.18 -SE_Vegeta_AA0Ak_1600kVA,SE,Vegeta,AA0Ak,1600000,0.06,12000,0.28,1080,Dyn11,20000,400,,,99.189,99.988,99.352,99.191 -SE_Vegeta_AA0Ak_2000kVA,SE,Vegeta,AA0Ak,2000000,0.06,15000,0.28,1305,Dyn11,20000,400,,,99.191,98.991,99.355,99.195 -SE_Vegeta_AA0Ak_2500kVA,SE,Vegeta,AA0Ak,2500000,0.06,18500,0.28,1575,Dyn11,20000,400,,,99.203,99.006,99.365,99.208 -SE_Vegeta_AA0Ak_3150kVA,SE,Vegeta,AA0Ak,3150000,0.07,23000,0.28,1980,Dyn11,20000,400,,,99.213,99.018,99.373,99.217 -SE_Vegeta_C0Bk_50kVA,SE,Vegeta,C0Bk,50000,0.04,875,0.029,125,Dyn11,20000,400,,,,,, -SE_Vegeta_C0Bk_100kVA,SE,Vegeta,C0Bk,100000,0.04,1475,0.025,210,Dyn11,20000,400,,,,,, -SE_Vegeta_C0Bk_160kVA,SE,Vegeta,C0Bk,160000,0.04,2000,0.023,300,Dyn11,20000,400,,,,,, -SE_Vegeta_C0Bk_250kVA,SE,Vegeta,C0Bk,250000,0.04,2750,0.021,425,Dyn11,20000,400,,,,,, -SE_Vegeta_C0Bk_315kVA,SE,Vegeta,C0Bk,315000,0.04,3250,0.02,520,Dyn11,20000,400,,,,,, -SE_Vegeta_C0Bk_400kVA,SE,Vegeta,C0Bk,400000,0.04,3850,0.019,610,Dyn11,20000,400,,,,,, -SE_Vegeta_C0Bk_500kVA,SE,Vegeta,C0Bk,500000,0.04,4600,0.019,720,Dyn11,20000,400,,,,,, -SE_Vegeta_C0Bk_630kVA,SE,Vegeta,C0Bk,630000,0.04,5400,0.018,860,Dyn11,20000,400,,,,,, -SE_Vegeta_C0Bk_800kVA,SE,Vegeta,C0Bk,800000,0.06,7000,0.025,930,Dyn11,20000,400,,,,,, -SE_Vegeta_C0Bk_1000kVA,SE,Vegeta,C0Bk,1000000,0.06,9000,0.024,1100,Dyn11,20000,400,,,,,, -SE_Vegeta_C0Bk_1250kVA,SE,Vegeta,C0Bk,1250000,0.06,11000,0.022,1350,Dyn11,20000,400,,,,,, -SE_Vegeta_C0Bk_1600kVA,SE,Vegeta,C0Bk,1600000,0.06,14000,0.02,1700,Dyn11,20000,400,,,,,, -SE_Vegeta_C0Bk_2000kVA,SE,Vegeta,C0Bk,2000000,0.06,18000,0.019,2100,Dyn11,20000,400,,,,,, -SE_Vegeta_C0Bk_2500kVA,SE,Vegeta,C0Bk,2500000,0.06,22000,0.018,2500,Dyn11,20000,400,,,,,, -SE_Vegeta_C0Bk_3150kVA,SE,Vegeta,C0Bk,3150000,0.07,26500,0.018,3000,Dyn11,20000,400,,,,,, -SE_Vegeta_Standard_50kVA,SE,Vegeta,Standard,50000,0.04,1350,0.029,145,Dyn11,20000,400,2.74,3.93,97.09,96.39,97.64,97.07 -SE_Vegeta_Standard_100kVA,SE,Vegeta,Standard,100000,0.04,2150,0.025,210,Dyn11,20000,400,2.21,3.75,97.69,97.13,98.14,97.69 -SE_Vegeta_Standard_160kVA,SE,Vegeta,Standard,160000,0.04,2350,0.023,460,Dyn11,20000,400,1.54,3.43,98.27,97.85,98.54,98.18 -SE_Vegeta_Standard_250kVA,SE,Vegeta,Standard,250000,0.04,3250,0.021,650,Dyn11,20000,400,1.37,3.33,98.46,98.09,98.7,98.37 -SE_Vegeta_Standard_315kVA,SE,Vegeta,Standard,315000,0.04,3900,0.02,800,Dyn11,20000,400,1.31,3.3,98.53,98.17,98.75,98.44 -SE_Vegeta_Standard_400kVA,SE,Vegeta,Standard,400000,0.04,4600,0.019,930,Dyn11,20000,400,1.22,3.25,98.64,98.3,98.84,98.56 -SE_Vegeta_Standard_500kVA,SE,Vegeta,Standard,500000,0.04,5500,0.019,1100,Dyn11,20000,400,1.17,3.22,98.7,98.38,98.89,98.62 -SE_Vegeta_Standard_630kVA,SE,Vegeta,Standard,630000,0.04,6500,0.018,1300,Dyn11,20000,400,1.11,3.17,98.78,98.48,98.96,98.71 -SE_Vegeta_Standard_800kVA,SE,Vegeta,Standard,800000,0.06,10700,0.025,1220,Dyn11,20000,400,1.51,4.65,98.53,98.71,98.81,98.51 -SE_Vegeta_Standard_1000kVA,SE,Vegeta,Standard,1000000,0.06,13000,0.024,1470,Dyn11,20000,400,1.47,4.63,98.57,98.22,98.84,98.56 -SE_Vegeta_Standard_1250kVA,SE,Vegeta,Standard,1250000,0.06,16000,0.022,1800,Dyn11,20000,400,1.45,4.62,98.6,98.25,98.86,98.58 -SE_Vegeta_Standard_1600kVA,SE,Vegeta,Standard,1600000,0.06,20000,0.02,2300,Dyn11,20000,400,1.42,4.6,98.63,98.29,98.88,98.61 -SE_Vegeta_Standard_2000kVA,SE,Vegeta,Standard,2000000,0.06,25500,0.019,2750,Dyn11,20000,400,1.45,4.61,98.61,98.27,98.87,98.6 -SE_Vegeta_Standard_2500kVA,SE,Vegeta,Standard,2500000,0.06,32000,0.018,3350,Dyn11,20000,400,1.45,4.62,98.61,98.26,98.87,98.6 -SE_Vegeta_Standard_3150kVA,SE,Vegeta,Standard,3150000,0.07,33000,0.018,4200,Dyn11,20000,400,1.29,5.11,98.83,98.55,99.05,98.81 +name,manufacturer,range,efficiency,type,oil,sn,vsc,psc,i0,p0,vg,uhv,ulv,du1,du0.8,eff1 100%,eff0.8 100%,eff1 75%,eff0.8 75% +FT 100kVA 15/20kV(20) 400V Dyn11,FT,,,three-phase,mineral,100000,0.04,2150,0.025,210,Dyn11,20000,400,2.21,3.75,97.69,97.13,98.14,97.69 +FT 160kVA 15/20kV(20) 400V Dyn11,FT,,,three-phase,mineral,160000,0.04,2350,0.023,460,Dyn11,20000,400,1.54,3.43,98.27,97.85,98.54,98.18 +FT 250kVA 15/20kV(20) 400V Dyn11,FT,,,three-phase,mineral,250000,0.04,3250,0.021,650,Dyn11,20000,400,1.37,3.33,98.46,98.09,98.7,98.37 +FT 315kVA 15/20kV(20) 400V Dyn11,FT,,,three-phase,mineral,315000,0.04,3900,0.02,800,Dyn11,20000,400,1.31,3.3,98.53,98.17,98.75,98.44 +FT 400kVA 15/20kV(20) 400V Dyn11,FT,,,three-phase,mineral,400000,0.04,4600,0.019,930,Dyn11,20000,400,1.22,3.25,98.64,98.3,98.84,98.56 +FT 500kVA 15/20kV(20) 400V Dyn11,FT,,,three-phase,mineral,500000,0.04,5500,0.019,1100,Dyn11,20000,400,1.17,3.22,98.7,98.387,98.89,98.62 +FT 630kVA 15/20kV(20) 400V Dyn11,FT,,,three-phase,mineral,630000,0.04,6500,0.018,1300,Dyn11,20000,400,1.11,3.17,98.78,98.48,98.96,98.71 +FT 800kVA 15/20kV(20) 400V Dyn11,FT,,,three-phase,mineral,800000,0.06,10700,0.025,1220,Dyn11,20000,400,1.51,4.65,98.53,98.17,98.81,98.51 +FT 1000kVA 15/20kV(20) 400V Dyn11,FT,,,three-phase,mineral,1000000,0.06,13000,0.024,1470,Dyn11,20000,400,1.47,4.63,98.57,98.22,98.84,98.56 +FT 1250kVA 15/20kV(20) 400V Dyn11,FT,,,three-phase,mineral,1250000,0.06,16000,0.022,1800,Dyn11,20000,400,1.45,4.62,98.6,98.25,98.86,98.58 +FT 1600kVA 15/20kV(20) 400V Dyn11,FT,,,three-phase,mineral,1600000,0.06,20000,0.02,2300,Dyn11,20000,400,1.42,4.6,98.63,98.29,98.88,98.61 +FT 2000kVA 15/20kV(20) 400V Dyn11,FT,,,three-phase,mineral,2000000,0.06,25500,0.019,2750,Dyn11,20000,400,1.45,4.61,98.61,98.27,98.87,98.6 +FT 2500kVA 15/20kV(20) 400V Dyn11,FT,,,three-phase,mineral,2500000,0.06,32000,0.018,3350,Dyn11,20000,400,1.45,4.62,98.61,98.26,98.87,98.6 +FT 3150kVA 15/20kV(20) 400V Dyn11,FT,,,three-phase,mineral,3150000,0.07,33000,0.017,4380,Dyn11,20000,400,1.29,5.11,98.83,98.54,99.04,98.8 +FT 100kVA 15/20kV(15) 400V Dyn11,FT,,,three-phase,mineral,100000,0.04,2150,0.025,210,Dyn11,15000,400,2.21,3.75,97.69,97.13,98.14,97.69 +FT 160kVA 15/20kV(15) 400V Dyn11,FT,,,three-phase,mineral,160000,0.04,2350,0.023,460,Dyn11,15000,400,1.54,3.43,98.27,97.85,98.54,98.18 +FT 250kVA 15/20kV(15) 400V Dyn11,FT,,,three-phase,mineral,250000,0.04,3250,0.021,650,Dyn11,15000,400,1.37,3.33,98.46,98.09,98.7,98.37 +FT 315kVA 15/20kV(15) 400V Dyn11,FT,,,three-phase,mineral,315000,0.04,3900,0.02,800,Dyn11,15000,400,1.31,3.3,98.53,98.17,98.75,98.44 +FT 400kVA 15/20kV(15) 400V Dyn11,FT,,,three-phase,mineral,400000,0.04,4600,0.019,930,Dyn11,15000,400,1.22,3.25,98.64,98.3,98.84,98.56 +FT 500kVA 15/20kV(15) 400V Dyn11,FT,,,three-phase,mineral,500000,0.04,5500,0.019,1100,Dyn11,15000,400,1.17,3.22,98.7,98.387,98.89,98.62 +FT 630kVA 15/20kV(15) 400V Dyn11,FT,,,three-phase,mineral,630000,0.04,6500,0.018,1300,Dyn11,15000,400,1.11,3.17,98.78,98.48,98.96,98.71 +FT 800kVA 15/20kV(15) 400V Dyn11,FT,,,three-phase,mineral,800000,0.06,10700,0.025,1220,Dyn11,15000,400,1.51,4.65,98.53,98.17,98.81,98.51 +FT 1000kVA 15/20kV(15) 400V Dyn11,FT,,,three-phase,mineral,1000000,0.06,13000,0.024,1470,Dyn11,15000,400,1.47,4.63,98.57,98.22,98.84,98.56 +FT 1250kVA 15/20kV(15) 400V Dyn11,FT,,,three-phase,mineral,1250000,0.06,16000,0.022,1800,Dyn11,15000,400,1.45,4.62,98.6,98.25,98.86,98.58 +FT 1600kVA 15/20kV(15) 400V Dyn11,FT,,,three-phase,mineral,1600000,0.06,20000,0.02,2300,Dyn11,15000,400,1.42,4.6,98.63,98.29,98.88,98.61 +FT 2000kVA 15/20kV(15) 400V Dyn11,FT,,,three-phase,mineral,2000000,0.06,25500,0.019,2750,Dyn11,15000,400,1.45,4.61,98.61,98.27,98.87,98.6 +FT 2500kVA 15/20kV(15) 400V Dyn11,FT,,,three-phase,mineral,2500000,0.06,32000,0.018,3350,Dyn11,15000,400,1.45,4.62,98.61,98.26,98.87,98.6 +FT 3150kVA 15/20kV(15) 400V Dyn11,FT,,,three-phase,mineral,3150000,0.07,33000,0.017,4380,Dyn11,15000,400,1.29,5.11,98.83,98.54,99.04,98.8 +SE Minera AA0Ak 160kVA 20kV 410V Dyn11,SE,Minera,AA0Ak,three-phase,mineral,160000,0.04,1750,0.15,189,Dyn11,20000,410,,,98.803,98.508,99.032,98.792 +SE Minera AA0Ak 250kVA 20kV 410V Dyn11,SE,Minera,AA0Ak,three-phase,mineral,250000,0.04,2350,0.14,270,Dyn11,20000,410,,,98.963,98.707,99.158,98.95 +SE Minera AA0Ak 400kVA 20kV 410V Dyn11,SE,Minera,AA0Ak,three-phase,mineral,400000,0.04,3250,0.16,387,Dyn11,20000,410,,,99.099,98.876,99.267,99.085 +SE Minera AA0Ak 630kVA 20kV 410V Dyn11,SE,Minera,AA0Ak,three-phase,mineral,630000,0.04,4600,0.15,540,Dyn11,20000,410,,,99.191,98.99,99.342,99.179 +SE Minera AA0Ak 800kVA 20kV 410V Dyn11,SE,Minera,AA0Ak,three-phase,mineral,800000,0.04,6000,0.12,585,Dyn11,20000,410,,,99.184,98.982,99.344,99.192 +SE Minera AA0Ak 1000kVA 20kV 410V Dyn11,SE,Minera,AA0Ak,three-phase,mineral,1000000,0.04,7600,0.12,693,Dyn11,20000,410,,,99.178,98.974,99.342,99.179 +SE Minera AA0Ak 1250kVA 20kV 410V Dyn11,SE,Minera,AA0Ak,three-phase,mineral,1250000,0.04,9500,0.12,855,Dyn11,20000,410,,,99.178,98.975,99.343,99.18 +SE Minera AA0Ak 1600kVA 20kV 410V Dyn11,SE,Minera,AA0Ak,three-phase,mineral,1600000,0.04,12000,0.28,1080,Dyn11,20000,410,,,99.189,99.988,99.352,99.191 +SE Minera AA0Ak 2000kVA 20kV 410V Dyn11,SE,Minera,AA0Ak,three-phase,mineral,2000000,0.04,15000,0.28,1305,Dyn11,20000,410,,,99.191,98.991,99.355,99.195 +SE Minera AA0Ak 2500kVA 20kV 410V Dyn11,SE,Minera,AA0Ak,three-phase,mineral,2500000,0.04,18500,0.28,1575,Dyn11,20000,410,,,99.203,99.006,99.365,99.208 +SE Minera AA0Ak 3150kVA 20kV 410V Dyn11,SE,Minera,AA0Ak,three-phase,mineral,3150000,0.04,23000,0.28,1980,Dyn11,20000,410,,,99.213,99.018,99.373,99.217 +SE Minera A0Ak 50kVA 15/20kV(20) 410V Yzn11,SE,Minera,A0Ak,three-phase,mineral,50000,0.04,750,0.005,90,Yzn11,20000,410,1.57,3.45,98.35,97.94,98.65,98.32 +SE Minera A0Ak 100kVA 15/20kV(20) 410V Dyn11,SE,Minera,A0Ak,three-phase,mineral,100000,0.04,1250,0.005,145,Dyn11,20000,410,1.32,3.31,98.62,98.29,98.88,98.61 +SE Minera A0Ak 160kVA 15/20kV(20) 410V Dyn11,SE,Minera,A0Ak,three-phase,mineral,160000,0.04,1700,0.005,210,Dyn11,20000,410,1.14,3.19,98.82,98.53,99.04,98.8 +SE Minera A0Ak 250kVA 15/20kV(20) 410V Dyn11,SE,Minera,A0Ak,three-phase,mineral,250000,0.04,2350,0.005,300,Dyn11,20000,410,1.02,3.12,98.95,98.69,99.14,98.93 +SE Minera A0Ak 315kVA 15/20kV(20) 410V Dyn11,SE,Minera,A0Ak,three-phase,mineral,315000,0.04,2800,0.005,360,Dyn11,20000,410,0.96,3.08,99.01,98.76,99.19,98.99 +SE Minera A0Ak 400kVA 15/20kV(20) 410V Dyn11,SE,Minera,A0Ak,three-phase,mineral,400000,0.04,3250,0.005,430,Dyn11,20000,410,0.89,3.03,99.09,98.86,99.25,99.07 +SE Minera A0Ak 500kVA 15/20kV(20) 410V Dyn11,SE,Minera,A0Ak,three-phase,mineral,500000,0.04,3900,0.005,510,Dyn11,20000,410,0.86,3.01,99.13,98.91,99.28,99.11 +SE Minera A0Ak 630kVA 15/20kV(20) 410V Dyn11,SE,Minera,A0Ak,three-phase,mineral,630000,0.04,4600,0.005,600,Dyn11,20000,410,0.81,2.98,99.18,98.98,99.33,99.16 +SE Minera A0Ak 800kVA 15/20kV(20) 410V Dyn11,SE,Minera,A0Ak,three-phase,mineral,800000,0.06,6000,0.005,650,Dyn11,20000,410,0.93,4.26,99.18,98.97,99.33,99.17 +SE Minera A0Ak 1000kVA 15/20kV(20) 410V Dyn11,SE,Minera,A0Ak,three-phase,mineral,1000000,0.06,7600,0.005,770,Dyn11,20000,410,0.94,4.27,99.17,98.96,99.33,99.17 +SE Minera A0Ak 1250kVA 15/20kV(20) 410V Dyn11,SE,Minera,A0Ak,three-phase,mineral,1250000,0.06,9500,0.005,950,Dyn11,20000,410,0.94,4.27,99.17,98.97,99.33,99.17 +SE Minera A0Ak 1600kVA 15/20kV(20) 410V Dyn11,SE,Minera,A0Ak,three-phase,mineral,1600000,0.06,12000,0.005,1200,Dyn11,20000,410,0.93,4.26,99.18,98.98,99.34,99.18 +SE Minera A0Ak 2000kVA 15/20kV(20) 410V Dyn11,SE,Minera,A0Ak,three-phase,mineral,2000000,0.06,15000,0.005,1450,Dyn11,20000,410,0.93,4.26,99.18,98.98,99.35,99.18 +SE Minera A0Ak 2500kVA 15/20kV(20) 410V Dyn11,SE,Minera,A0Ak,three-phase,mineral,2500000,0.06,18500,0.005,1750,Dyn11,20000,410,0.92,4.26,99.2,99.0,99.36,99.2 +SE Minera A0Ak 50kVA 15/20kV(15) 410V Yzn11,SE,Minera,A0Ak,three-phase,mineral,50000,0.04,750,0.005,90,Yzn11,15000,410,1.57,3.45,98.35,97.94,98.65,98.32 +SE Minera A0Ak 100kVA 15/20kV(15) 410V Dyn11,SE,Minera,A0Ak,three-phase,mineral,100000,0.04,1250,0.005,145,Dyn11,15000,410,1.32,3.31,98.62,98.29,98.88,98.61 +SE Minera A0Ak 160kVA 15/20kV(15) 410V Dyn11,SE,Minera,A0Ak,three-phase,mineral,160000,0.04,1700,0.005,210,Dyn11,15000,410,1.14,3.19,98.82,98.53,99.04,98.8 +SE Minera A0Ak 250kVA 15/20kV(15) 410V Dyn11,SE,Minera,A0Ak,three-phase,mineral,250000,0.04,2350,0.005,300,Dyn11,15000,410,1.02,3.12,98.95,98.69,99.14,98.93 +SE Minera A0Ak 315kVA 15/20kV(15) 410V Dyn11,SE,Minera,A0Ak,three-phase,mineral,315000,0.04,2800,0.005,360,Dyn11,15000,410,0.96,3.08,99.01,98.76,99.19,98.99 +SE Minera A0Ak 400kVA 15/20kV(15) 410V Dyn11,SE,Minera,A0Ak,three-phase,mineral,400000,0.04,3250,0.005,430,Dyn11,15000,410,0.89,3.03,99.09,98.86,99.25,99.07 +SE Minera A0Ak 500kVA 15/20kV(15) 410V Dyn11,SE,Minera,A0Ak,three-phase,mineral,500000,0.04,3900,0.005,510,Dyn11,15000,410,0.86,3.01,99.13,98.91,99.28,99.11 +SE Minera A0Ak 630kVA 15/20kV(15) 410V Dyn11,SE,Minera,A0Ak,three-phase,mineral,630000,0.04,4600,0.005,600,Dyn11,15000,410,0.81,2.98,99.18,98.98,99.33,99.16 +SE Minera A0Ak 800kVA 15/20kV(15) 410V Dyn11,SE,Minera,A0Ak,three-phase,mineral,800000,0.06,6000,0.005,650,Dyn11,15000,410,0.93,4.26,99.18,98.97,99.33,99.17 +SE Minera A0Ak 1000kVA 15/20kV(15) 410V Dyn11,SE,Minera,A0Ak,three-phase,mineral,1000000,0.06,7600,0.005,770,Dyn11,15000,410,0.94,4.27,99.17,98.96,99.33,99.17 +SE Minera A0Ak 1250kVA 15/20kV(15) 410V Dyn11,SE,Minera,A0Ak,three-phase,mineral,1250000,0.06,9500,0.005,950,Dyn11,15000,410,0.94,4.27,99.17,98.97,99.33,99.17 +SE Minera A0Ak 1600kVA 15/20kV(15) 410V Dyn11,SE,Minera,A0Ak,three-phase,mineral,1600000,0.06,12000,0.005,1200,Dyn11,15000,410,0.93,4.26,99.18,98.98,99.34,99.18 +SE Minera A0Ak 2000kVA 15/20kV(15) 410V Dyn11,SE,Minera,A0Ak,three-phase,mineral,2000000,0.06,15000,0.005,1450,Dyn11,15000,410,0.93,4.26,99.18,98.98,99.35,99.18 +SE Minera A0Ak 2500kVA 15/20kV(15) 410V Dyn11,SE,Minera,A0Ak,three-phase,mineral,2500000,0.06,18500,0.005,1750,Dyn11,15000,410,0.92,4.26,99.2,99.0,99.36,99.2 +SE Minera B0Bk 50kVA 15/20kV(20) 410V Yzn11,SE,Minera,B0Bk,three-phase,mineral,50000,0.04,875,0.01,110,Yzn11,20000,410,1.81,3.57,98.07,97.6,98.42,98.03 +SE Minera B0Bk 100kVA 15/20kV(20) 410V Dyn11,SE,Minera,B0Bk,three-phase,mineral,100000,0.04,1475,0.01,180,Dyn11,20000,410,1.54,3.43,98.37,97.97,98.67,98.35 +SE Minera B0Bk 160kVA 15/20kV(20) 410V Dyn11,SE,Minera,B0Bk,three-phase,mineral,160000,0.04,2000,0.008,260,Dyn11,20000,410,1.32,3.31,98.61,98.27,98.86,98.58 +SE Minera B0Bk 250kVA 15/20kV(20) 410V Dyn11,SE,Minera,B0Bk,three-phase,mineral,250000,0.04,2750,0.008,360,Dyn11,20000,410,1.17,3.22,98.77,98.47,98.99,98.74 +SE Minera B0Bk 315kVA 15/20kV(20) 410V Dyn11,SE,Minera,B0Bk,three-phase,mineral,315000,0.04,3250,0.008,440,Dyn11,20000,410,1.11,3.17,98.84,98.56,99.05,98.81 +SE Minera B0Bk 400kVA 15/20kV(20) 410V Dyn11,SE,Minera,B0Bk,three-phase,mineral,400000,0.04,3850,0.008,520,Dyn11,20000,410,1.04,3.13,98.92,98.65,99.11,98.89 +SE Minera B0Bk 500kVA 15/20kV(20) 410V Dyn11,SE,Minera,B0Bk,three-phase,mineral,500000,0.04,4600,0.008,610,Dyn11,20000,410,1.0,3.1,98.97,98.71,99.15,98.95 +SE Minera B0Bk 630kVA 15/20kV(20) 410V Dyn11,SE,Minera,B0Bk,three-phase,mineral,630000,0.04,5400,0.007,730,Dyn11,20000,410,0.93,3.06,99.04,98.8,99.21,99.01 +SE Minera B0Bk 800kVA 15/20kV(20) 410V Dyn11,SE,Minera,B0Bk,three-phase,mineral,800000,0.06,7000,0.007,800,Dyn11,20000,410,1.05,4.35,99.03,98.8,99.22,99.02 +SE Minera B0Bk 1000kVA 15/20kV(20) 410V Dyn11,SE,Minera,B0Bk,three-phase,mineral,1000000,0.06,9000,0.007,940,Dyn11,20000,410,1.08,4.37,99.02,98.77,99.21,99.01 +SE Minera B0Bk 1250kVA 15/20kV(20) 410V Dyn11,SE,Minera,B0Bk,three-phase,mineral,1250000,0.06,11000,0.007,1150,Dyn11,20000,410,1.06,4.35,99.04,98.81,99.23,99.04 +SE Minera B0Bk 1600kVA 15/20kV(20) 410V Dyn11,SE,Minera,B0Bk,three-phase,mineral,1600000,0.06,14000,0.007,1450,Dyn11,20000,410,1.05,4.35,99.04,98.81,99.23,99.04 +SE Minera B0Bk 2000kVA 15/20kV(20) 410V Dyn11,SE,Minera,B0Bk,three-phase,mineral,2000000,0.06,18000,0.007,1800,Dyn11,20000,410,1.08,4.37,99.02,98.78,99.21,99.02 +SE Minera B0Bk 2500kVA 15/20kV(20) 410V Dyn11,SE,Minera,B0Bk,three-phase,mineral,2500000,0.06,22000,0.007,2150,Dyn11,20000,410,1.06,4.35,99.04,98.81,99.23,99.04 +SE Minera B0Bk 50kVA 15/20kV(15) 410V Yzn11,SE,Minera,B0Bk,three-phase,mineral,50000,0.04,875,0.01,110,Yzn11,15000,410,1.81,3.57,98.07,97.6,98.42,98.03 +SE Minera B0Bk 100kVA 15/20kV(15) 410V Dyn11,SE,Minera,B0Bk,three-phase,mineral,100000,0.04,1475,0.01,180,Dyn11,15000,410,1.54,3.43,98.37,97.97,98.67,98.35 +SE Minera B0Bk 160kVA 15/20kV(15) 410V Dyn11,SE,Minera,B0Bk,three-phase,mineral,160000,0.04,2000,0.008,260,Dyn11,15000,410,1.32,3.31,98.61,98.27,98.86,98.58 +SE Minera B0Bk 250kVA 15/20kV(15) 410V Dyn11,SE,Minera,B0Bk,three-phase,mineral,250000,0.04,2750,0.008,360,Dyn11,15000,410,1.17,3.22,98.77,98.47,98.99,98.74 +SE Minera B0Bk 315kVA 15/20kV(15) 410V Dyn11,SE,Minera,B0Bk,three-phase,mineral,315000,0.04,3250,0.008,440,Dyn11,15000,410,1.11,3.17,98.84,98.56,99.05,98.81 +SE Minera B0Bk 400kVA 15/20kV(15) 410V Dyn11,SE,Minera,B0Bk,three-phase,mineral,400000,0.04,3850,0.008,520,Dyn11,15000,410,1.04,3.13,98.92,98.65,99.11,98.89 +SE Minera B0Bk 500kVA 15/20kV(15) 410V Dyn11,SE,Minera,B0Bk,three-phase,mineral,500000,0.04,4600,0.008,610,Dyn11,15000,410,1.0,3.1,98.97,98.71,99.15,98.95 +SE Minera B0Bk 630kVA 15/20kV(15) 410V Dyn11,SE,Minera,B0Bk,three-phase,mineral,630000,0.04,5400,0.007,730,Dyn11,15000,410,0.93,3.06,99.04,98.8,99.21,99.01 +SE Minera B0Bk 800kVA 15/20kV(15) 410V Dyn11,SE,Minera,B0Bk,three-phase,mineral,800000,0.06,7000,0.007,800,Dyn11,15000,410,1.05,4.35,99.03,98.8,99.22,99.02 +SE Minera B0Bk 1000kVA 15/20kV(15) 410V Dyn11,SE,Minera,B0Bk,three-phase,mineral,1000000,0.06,9000,0.007,940,Dyn11,15000,410,1.08,4.37,99.02,98.77,99.21,99.01 +SE Minera B0Bk 1250kVA 15/20kV(15) 410V Dyn11,SE,Minera,B0Bk,three-phase,mineral,1250000,0.06,11000,0.007,1150,Dyn11,15000,410,1.06,4.35,99.04,98.81,99.23,99.04 +SE Minera B0Bk 1600kVA 15/20kV(15) 410V Dyn11,SE,Minera,B0Bk,three-phase,mineral,1600000,0.06,14000,0.007,1450,Dyn11,15000,410,1.05,4.35,99.04,98.81,99.23,99.04 +SE Minera B0Bk 2000kVA 15/20kV(15) 410V Dyn11,SE,Minera,B0Bk,three-phase,mineral,2000000,0.06,18000,0.007,1800,Dyn11,15000,410,1.08,4.37,99.02,98.78,99.21,99.02 +SE Minera B0Bk 2500kVA 15/20kV(15) 410V Dyn11,SE,Minera,B0Bk,three-phase,mineral,2500000,0.06,22000,0.007,2150,Dyn11,15000,410,1.06,4.35,99.04,98.81,99.23,99.04 +SE Minera C0Bk 50kVA 15/20kV(20) 410V Yzn11,SE,Minera,C0Bk,three-phase,mineral,50000,0.04,875,0.015,125,Yzn11,20000,410,1.81,3.57,98.04,97.56,98.38,97.98 +SE Minera C0Bk 100kVA 15/20kV(20) 410V Dyn11,SE,Minera,C0Bk,three-phase,mineral,100000,0.04,1475,0.015,210,Dyn11,20000,410,1.54,3.43,98.34,97.94,98.63,98.3 +SE Minera C0Bk 160kVA 15/20kV(20) 410V Dyn11,SE,Minera,C0Bk,three-phase,mineral,160000,0.04,2000,0.014,300,Dyn11,20000,410,1.32,3.31,98.58,98.23,98.83,98.54 +SE Minera C0Bk 250kVA 15/20kV(20) 410V Dyn11,SE,Minera,C0Bk,three-phase,mineral,250000,0.04,2750,0.013,425,Dyn11,20000,410,1.17,3.22,98.75,98.44,98.96,98.7 +SE Minera C0Bk 315kVA 15/20kV(20) 410V Dyn11,SE,Minera,C0Bk,three-phase,mineral,315000,0.04,3250,0.013,520,Dyn11,20000,410,1.11,3.17,98.82,98.53,99.02,98.77 +SE Minera C0Bk 400kVA 15/20kV(20) 410V Dyn11,SE,Minera,C0Bk,three-phase,mineral,400000,0.04,3850,0.012,610,Dyn11,20000,410,1.04,3.13,98.9,98.63,99.08,98.86 +SE Minera C0Bk 500kVA 15/20kV(20) 410V Dyn11,SE,Minera,C0Bk,three-phase,mineral,500000,0.04,4600,0.012,720,Dyn11,20000,410,1.0,3.1,98.95,98.69,99.13,98.91 +SE Minera C0Bk 630kVA 15/20kV(20) 410V Dyn11,SE,Minera,C0Bk,three-phase,mineral,630000,0.04,5400,0.011,860,Dyn11,20000,410,0.93,3.06,99.02,98.77,99.18,98.98 +SE Minera C0Bk 800kVA 15/20kV(20) 410V Dyn11,SE,Minera,C0Bk,three-phase,mineral,800000,0.06,7000,0.011,930,Dyn11,20000,410,1.05,4.35,99.02,98.78,99.2,99.0 +SE Minera C0Bk 1000kVA 15/20kV(20) 410V Dyn11,SE,Minera,C0Bk,three-phase,mineral,1000000,0.06,9000,0.01,1100,Dyn11,20000,410,1.08,4.37,99.0,98.75,99.19,98.98 +SE Minera C0Bk 1250kVA 15/20kV(20) 410V Dyn11,SE,Minera,C0Bk,three-phase,mineral,1250000,0.06,11000,0.01,1350,Dyn11,20000,410,1.06,4.35,99.02,98.78,99.2,99.0 +SE Minera C0Bk 1600kVA 15/20kV(20) 410V Dyn11,SE,Minera,C0Bk,three-phase,mineral,1600000,0.06,14000,0.01,1700,Dyn11,20000,410,1.05,4.35,99.03,98.79,99.21,99.01 +SE Minera C0Bk 2000kVA 15/20kV(20) 410V Dyn11,SE,Minera,C0Bk,three-phase,mineral,2000000,0.06,18000,0.01,2100,Dyn11,20000,410,1.08,4.37,99.0,98.76,99.19,98.99 +SE Minera C0Bk 2500kVA 15/20kV(20) 410V Dyn11,SE,Minera,C0Bk,three-phase,mineral,2500000,0.06,22000,0.01,2500,Dyn11,20000,410,1.06,4.35,99.03,98.76,99.21,99.02 +SE Minera C0Bk 50kVA 15/20kV(15) 410V Yzn11,SE,Minera,C0Bk,three-phase,mineral,50000,0.04,875,0.015,125,Yzn11,15000,410,1.81,3.57,98.04,97.56,98.38,97.98 +SE Minera C0Bk 100kVA 15/20kV(15) 410V Dyn11,SE,Minera,C0Bk,three-phase,mineral,100000,0.04,1475,0.015,210,Dyn11,15000,410,1.54,3.43,98.34,97.94,98.63,98.3 +SE Minera C0Bk 160kVA 15/20kV(15) 410V Dyn11,SE,Minera,C0Bk,three-phase,mineral,160000,0.04,2000,0.014,300,Dyn11,15000,410,1.32,3.31,98.58,98.23,98.83,98.54 +SE Minera C0Bk 250kVA 15/20kV(15) 410V Dyn11,SE,Minera,C0Bk,three-phase,mineral,250000,0.04,2750,0.013,425,Dyn11,15000,410,1.17,3.22,98.75,98.44,98.96,98.7 +SE Minera C0Bk 315kVA 15/20kV(15) 410V Dyn11,SE,Minera,C0Bk,three-phase,mineral,315000,0.04,3250,0.013,520,Dyn11,15000,410,1.11,3.17,98.82,98.53,99.02,98.77 +SE Minera C0Bk 400kVA 15/20kV(15) 410V Dyn11,SE,Minera,C0Bk,three-phase,mineral,400000,0.04,3850,0.012,610,Dyn11,15000,410,1.04,3.13,98.9,98.63,99.08,98.86 +SE Minera C0Bk 500kVA 15/20kV(15) 410V Dyn11,SE,Minera,C0Bk,three-phase,mineral,500000,0.04,4600,0.012,720,Dyn11,15000,410,1.0,3.1,98.95,98.69,99.13,98.91 +SE Minera C0Bk 630kVA 15/20kV(15) 410V Dyn11,SE,Minera,C0Bk,three-phase,mineral,630000,0.04,5400,0.011,860,Dyn11,15000,410,0.93,3.06,99.02,98.77,99.18,98.98 +SE Minera C0Bk 800kVA 15/20kV(15) 410V Dyn11,SE,Minera,C0Bk,three-phase,mineral,800000,0.06,7000,0.011,930,Dyn11,15000,410,1.05,4.35,99.02,98.78,99.2,99.0 +SE Minera C0Bk 1000kVA 15/20kV(15) 410V Dyn11,SE,Minera,C0Bk,three-phase,mineral,1000000,0.06,9000,0.01,1100,Dyn11,15000,410,1.08,4.37,99.0,98.75,99.19,98.98 +SE Minera C0Bk 1250kVA 15/20kV(15) 410V Dyn11,SE,Minera,C0Bk,three-phase,mineral,1250000,0.06,11000,0.01,1350,Dyn11,15000,410,1.06,4.35,99.02,98.78,99.2,99.0 +SE Minera C0Bk 1600kVA 15/20kV(15) 410V Dyn11,SE,Minera,C0Bk,three-phase,mineral,1600000,0.06,14000,0.01,1700,Dyn11,15000,410,1.05,4.35,99.03,98.79,99.21,99.01 +SE Minera C0Bk 2000kVA 15/20kV(15) 410V Dyn11,SE,Minera,C0Bk,three-phase,mineral,2000000,0.06,18000,0.01,2100,Dyn11,15000,410,1.08,4.37,99.0,98.76,99.19,98.99 +SE Minera C0Bk 2500kVA 15/20kV(15) 410V Dyn11,SE,Minera,C0Bk,three-phase,mineral,2500000,0.06,22000,0.01,2500,Dyn11,15000,410,1.06,4.35,99.03,98.76,99.21,99.02 +SE Minera Standard 50kVA 15/20kV(20) 410V Yzn11,SE,Minera,Standard,three-phase,mineral,50000,0.04,1350,0.01,125,Yzn11,20000,410,2.74,3.93,97.13,96.44,97.7,97.14 +SE Minera Standard 100kVA 15/20kV(20) 410V Dyn11,SE,Minera,Standard,three-phase,mineral,100000,0.04,2150,0.01,210,Dyn11,20000,410,2.21,3.75,97.69,97.13,98.14,97.69 +SE Minera Standard 160kVA 15/20kV(20) 410V Dyn11,SE,Minera,Standard,three-phase,mineral,160000,0.04,3100,0.015,375,Dyn11,20000,410,2.0,3.66,97.87,97.36,98.27,97.84 +SE Minera Standard 250kVA 15/20kV(20) 410V Dyn11,SE,Minera,Standard,three-phase,mineral,250000,0.04,3250,0.026,650,Dyn11,20000,410,1.37,3.33,98.46,98.09,98.7,98.37 +SE Minera Standard 315kVA 15/20kV(20) 410V Dyn11,SE,Minera,Standard,three-phase,mineral,315000,0.04,3900,0.025,770,Dyn11,20000,410,1.31,3.3,98.54,98.18,98.76,98.46 +SE Minera Standard 400kVA 15/20kV(20) 410V Dyn11,SE,Minera,Standard,three-phase,mineral,400000,0.04,4600,0.023,930,Dyn11,20000,410,1.22,3.25,98.64,98.3,98.84,98.56 +SE Minera Standard 500kVA 15/20kV(20) 410V Dyn11,SE,Minera,Standard,three-phase,mineral,500000,0.04,5500,0.022,1100,Dyn11,20000,410,1.17,3.22,98.7,98.38,98.89,98.62 +SE Minera Standard 630kVA 15/20kV(20) 410V Dyn11,SE,Minera,Standard,three-phase,mineral,630000,0.04,6500,0.02,1300,Dyn11,20000,410,1.11,3.17,98.78,98.48,98.96,98.71 +SE Minera Standard 800kVA 15/20kV(20) 410V Dyn11,SE,Minera,Standard,three-phase,mineral,800000,0.06,10500,0.016,1150,Dyn11,20000,410,1.48,4.64,98.56,98.21,98.84,98.55 +SE Minera Standard 1000kVA 15/20kV(20) 410V Dyn11,SE,Minera,Standard,three-phase,mineral,1000000,0.06,13000,0.015,1400,Dyn11,20000,410,1.47,4.63,98.58,98.23,98.85,98.57 +SE Minera Standard 1250kVA 15/20kV(20) 410V Dyn11,SE,Minera,Standard,three-phase,mineral,1250000,0.06,16000,0.013,1750,Dyn11,20000,410,1.45,4.62,98.6,98.26,98.87,98.59 +SE Minera Standard 1600kVA 15/20kV(20) 410V Dyn11,SE,Minera,Standard,three-phase,mineral,1600000,0.06,20000,0.011,2200,Dyn11,20000,410,1.42,4.6,98.63,98.3,98.89,98.62 +SE Minera Standard 2000kVA 15/20kV(20) 410V Dyn11,SE,Minera,Standard,three-phase,mineral,2000000,0.06,26000,0.011,2700,Dyn11,20000,410,1.47,4.63,98.59,98.24,98.86,98.58 +SE Minera Standard 2500kVA 15/20kV(20) 410V Dyn11,SE,Minera,Standard,three-phase,mineral,2500000,0.06,32000,0.01,3200,Dyn11,20000,410,1.45,4.62,98.61,98.27,98.88,98.61 +SE Minera Standard 50kVA 15/20kV(15) 410V Yzn11,SE,Minera,Standard,three-phase,mineral,50000,0.04,1350,0.01,125,Yzn11,15000,410,2.74,3.93,97.13,96.44,97.7,97.14 +SE Minera Standard 100kVA 15/20kV(15) 410V Dyn11,SE,Minera,Standard,three-phase,mineral,100000,0.04,2150,0.01,210,Dyn11,15000,410,2.21,3.75,97.69,97.13,98.14,97.69 +SE Minera Standard 160kVA 15/20kV(15) 410V Dyn11,SE,Minera,Standard,three-phase,mineral,160000,0.04,3100,0.015,375,Dyn11,15000,410,2.0,3.66,97.87,97.36,98.27,97.84 +SE Minera Standard 250kVA 15/20kV(15) 410V Dyn11,SE,Minera,Standard,three-phase,mineral,250000,0.04,3250,0.026,650,Dyn11,15000,410,1.37,3.33,98.46,98.09,98.7,98.37 +SE Minera Standard 315kVA 15/20kV(15) 410V Dyn11,SE,Minera,Standard,three-phase,mineral,315000,0.04,3900,0.025,770,Dyn11,15000,410,1.31,3.3,98.54,98.18,98.76,98.46 +SE Minera Standard 400kVA 15/20kV(15) 410V Dyn11,SE,Minera,Standard,three-phase,mineral,400000,0.04,4600,0.023,930,Dyn11,15000,410,1.22,3.25,98.64,98.3,98.84,98.56 +SE Minera Standard 500kVA 15/20kV(15) 410V Dyn11,SE,Minera,Standard,three-phase,mineral,500000,0.04,5500,0.022,1100,Dyn11,15000,410,1.17,3.22,98.7,98.38,98.89,98.62 +SE Minera Standard 630kVA 15/20kV(15) 410V Dyn11,SE,Minera,Standard,three-phase,mineral,630000,0.04,6500,0.02,1300,Dyn11,15000,410,1.11,3.17,98.78,98.48,98.96,98.71 +SE Minera Standard 800kVA 15/20kV(15) 410V Dyn11,SE,Minera,Standard,three-phase,mineral,800000,0.06,10500,0.016,1150,Dyn11,15000,410,1.48,4.64,98.56,98.21,98.84,98.55 +SE Minera Standard 1000kVA 15/20kV(15) 410V Dyn11,SE,Minera,Standard,three-phase,mineral,1000000,0.06,13000,0.015,1400,Dyn11,15000,410,1.47,4.63,98.58,98.23,98.85,98.57 +SE Minera Standard 1250kVA 15/20kV(15) 410V Dyn11,SE,Minera,Standard,three-phase,mineral,1250000,0.06,16000,0.013,1750,Dyn11,15000,410,1.45,4.62,98.6,98.26,98.87,98.59 +SE Minera Standard 1600kVA 15/20kV(15) 410V Dyn11,SE,Minera,Standard,three-phase,mineral,1600000,0.06,20000,0.011,2200,Dyn11,15000,410,1.42,4.6,98.63,98.3,98.89,98.62 +SE Minera Standard 2000kVA 15/20kV(15) 410V Dyn11,SE,Minera,Standard,three-phase,mineral,2000000,0.06,26000,0.011,2700,Dyn11,15000,410,1.47,4.63,98.59,98.24,98.86,98.58 +SE Minera Standard 2500kVA 15/20kV(15) 410V Dyn11,SE,Minera,Standard,three-phase,mineral,2500000,0.06,32000,0.01,3200,Dyn11,15000,410,1.45,4.62,98.61,98.27,98.88,98.61 +SE Trihal AA0Ak 250kVA 15/20kV(20) 410V Dyn11,SE,Trihal,AA0Ak,three-phase,dry,250000,0.06,3740,0.48,538,Dyn11,20000,410,,,98.318,97.906,98.611,98.269 +SE Trihal AA0Ak 400kVA 15/20kV(20) 410V Dyn11,SE,Trihal,AA0Ak,three-phase,dry,400000,0.06,4950,0.41,776,Dyn11,20000,410,,,98.589,98.242,98.827,98.538 +SE Trihal AA0Ak 630kVA 15/20kV(20) 410V Dyn11,SE,Trihal,AA0Ak,three-phase,dry,630000,0.06,7810,0.22,1138,Dyn11,20000,410,,,98.600,98.256,98.843,98.558 +SE Trihal AA0Ak 800kVA 15/20kV(20) 410V Dyn11,SE,Trihal,AA0Ak,three-phase,dry,800000,0.06,8800,0.18,1345,Dyn11,20000,410,,,98.748,98.440,98.962,98.706 +SE Trihal AA0Ak 1000kVA 15/20kV(20) 410V Dyn11,SE,Trihal,AA0Ak,three-phase,dry,1000000,0.06,9900,0.17,1604,Dyn11,20000,410,,,98.863,98.582,99.053,98.819 +SE Trihal AA0Ak 1250kVA 15/20kV(20) 410V Dyn11,SE,Trihal,AA0Ak,three-phase,dry,1250000,0.06,12100,0.16,1863,Dyn11,20000,410,,,98.895,98.623,99.084,98.857 +SE Trihal AA0Ak 1600kVA 15/20kV(20) 410V Dyn11,SE,Trihal,AA0Ak,three-phase,dry,1600000,0.06,14300,0.15,2277,Dyn11,20000,410,,,98.975,98.721,99.147,98.936 +SE Trihal AA0Ak 2000kVA 15/20kV(20) 410V Dyn11,SE,Trihal,AA0Ak,three-phase,dry,2000000,0.06,17600,0.28,2691,Dyn11,20000,410,,,98.996,98.748,99.168,98.962 +SE Trihal AA0Ak 2500kVA 15/20kV(20) 410V Dyn11,SE,Trihal,AA0Ak,three-phase,dry,2500000,0.06,20900,0.21,3208,Dyn11,20000,410,,,99.045,98.809,99.208,99.012 +SE Trihal AA0Ak 3150kVA 15/20kV(20) 410V Dyn11,SE,Trihal,AA0Ak,three-phase,dry,3150000,0.06,24200,0.30,3933,Dyn11,20000,410,,,99.115,98.896,99.263,99.080 +SE Trihal AA0Ak 250kVA 15/20kV(15) 410V Dyn11,SE,Trihal,AA0Ak,three-phase,dry,250000,0.06,3740,0.48,538,Dyn11,15000,410,,,98.318,97.906,98.611,98.269 +SE Trihal AA0Ak 400kVA 15/20kV(15) 410V Dyn11,SE,Trihal,AA0Ak,three-phase,dry,400000,0.06,4950,0.41,776,Dyn11,15000,410,,,98.589,98.242,98.827,98.538 +SE Trihal AA0Ak 630kVA 15/20kV(15) 410V Dyn11,SE,Trihal,AA0Ak,three-phase,dry,630000,0.06,7810,0.22,1138,Dyn11,15000,410,,,98.600,98.256,98.843,98.558 +SE Trihal AA0Ak 800kVA 15/20kV(15) 410V Dyn11,SE,Trihal,AA0Ak,three-phase,dry,800000,0.06,8800,0.18,1345,Dyn11,15000,410,,,98.748,98.440,98.962,98.706 +SE Trihal AA0Ak 1000kVA 15/20kV(15) 410V Dyn11,SE,Trihal,AA0Ak,three-phase,dry,1000000,0.06,9900,0.17,1604,Dyn11,15000,410,,,98.863,98.582,99.053,98.819 +SE Trihal AA0Ak 1250kVA 15/20kV(15) 410V Dyn11,SE,Trihal,AA0Ak,three-phase,dry,1250000,0.06,12100,0.16,1863,Dyn11,15000,410,,,98.895,98.623,99.084,98.857 +SE Trihal AA0Ak 1600kVA 15/20kV(15) 410V Dyn11,SE,Trihal,AA0Ak,three-phase,dry,1600000,0.06,14300,0.15,2277,Dyn11,15000,410,,,98.975,98.721,99.147,98.936 +SE Trihal AA0Ak 2000kVA 15/20kV(15) 410V Dyn11,SE,Trihal,AA0Ak,three-phase,dry,2000000,0.06,17600,0.28,2691,Dyn11,15000,410,,,98.996,98.748,99.168,98.962 +SE Trihal AA0Ak 2500kVA 15/20kV(15) 410V Dyn11,SE,Trihal,AA0Ak,three-phase,dry,2500000,0.06,20900,0.21,3208,Dyn11,15000,410,,,99.045,98.809,99.208,99.012 +SE Trihal AA0Ak 3150kVA 15/20kV(15) 410V Dyn11,SE,Trihal,AA0Ak,three-phase,dry,3150000,0.06,24200,0.30,3933,Dyn11,15000,410,,,99.115,98.896,99.263,99.080 +SE Trihal AA0Ak 250kVA 20kV 410V Dyn11,SE,Trihal,AA0Ak,three-phase,dry,250000,0.06,3400,0.48,468,Dyn11,20000,410,,,98.476,98.103,98.746,98.438 +SE Trihal AA0Ak 400kVA 20kV 410V Dyn11,SE,Trihal,AA0Ak,three-phase,dry,400000,0.06,4500,0.42,675,Dyn11,20000,410,,,98.723,98.409,98.943,98.682 +SE Trihal AA0Ak 630kVA 20kV 410V Dyn11,SE,Trihal,AA0Ak,three-phase,dry,630000,0.06,7100,0.37,990,Dyn11,20000,410,,,98.732,98.420,98.956,98.699 +SE Trihal AA0Ak 800kVA 20kV 410V Dyn11,SE,Trihal,AA0Ak,three-phase,dry,800000,0.06,8000,0.34,1170,Dyn11,20000,410,,,98.867,98.587,99.064,98.833 +SE Trihal AA0Ak 1000kVA 20kV 410V Dyn11,SE,Trihal,AA0Ak,three-phase,dry,1000000,0.06,9000,0.33,1395,Dyn11,20000,410,,,98.971,98.717,99.146,98.935 +SE Trihal AA0Ak 1250kVA 20kV 410V Dyn11,SE,Trihal,AA0Ak,three-phase,dry,1250000,0.06,11000,0.29,1620,Dyn11,20000,410,,,99.000,98.754,99.174,98.970 +SE Trihal AA0Ak 1600kVA 20kV 410V Dyn11,SE,Trihal,AA0Ak,three-phase,dry,1600000,0.06,13000,0.27,1980,Dyn11,20000,410,,,99.072,98.843,99.232,99.041 +SE Trihal AA0Ak 2000kVA 20kV 410V Dyn11,SE,Trihal,AA0Ak,three-phase,dry,2000000,0.06,16000,0.27,2340,Dyn11,20000,410,,,99.091,98.867,99.250,99.064 +SE Trihal AA0Ak 2500kVA 20kV 410V Dyn11,SE,Trihal,AA0Ak,three-phase,dry,2500000,0.06,19000,0.24,2790,Dyn11,20000,410,,,99.136,98.922,99.286,99.110 +SE Trihal AA0Ak 3150kVA 20kV 410V Dyn11,SE,Trihal,AA0Ak,three-phase,dry,3150000,0.06,22000,0.21,3420,Dyn11,20000,410,,,99.199,99.001,99.336,99.171 +SE Trihal ExtraReducedLosses 160kVA 20kV 410V Dyn11,SE,Trihal,ExtraReducedLosses,three-phase,dry,160000,0.06,2340,0.023,400,Dyn11,20000,410,,,,,, +SE Trihal ExtraReducedLosses 250kVA 20kV 410V Dyn11,SE,Trihal,ExtraReducedLosses,three-phase,dry,250000,0.06,3060,0.02,520,Dyn11,20000,410,,,,,, +SE Trihal ExtraReducedLosses 400kVA 20kV 410V Dyn11,SE,Trihal,ExtraReducedLosses,three-phase,dry,400000,0.06,4050,0.015,750,Dyn11,20000,410,,,,,, +SE Trihal ExtraReducedLosses 630kVA 20kV 410V Dyn11,SE,Trihal,ExtraReducedLosses,three-phase,dry,630000,0.06,6390,0.013,1100,Dyn11,20000,410,,,,,, +SE Trihal ExtraReducedLosses 800kVA 20kV 410V Dyn11,SE,Trihal,ExtraReducedLosses,three-phase,dry,800000,0.06,7200,0.013,1300,Dyn11,20000,410,,,,,, +SE Trihal ExtraReducedLosses 1000kVA 20kV 410V Dyn11,SE,Trihal,ExtraReducedLosses,three-phase,dry,1000000,0.06,8100,0.012,1550,Dyn11,20000,410,,,,,, +SE Trihal ExtraReducedLosses 1250kVA 20kV 410V Dyn11,SE,Trihal,ExtraReducedLosses,three-phase,dry,1250000,0.06,9900,0.012,1800,Dyn11,20000,410,,,,,, +SE Trihal ExtraReducedLosses 1600kVA 20kV 410V Dyn11,SE,Trihal,ExtraReducedLosses,three-phase,dry,1600000,0.06,11700,0.012,2200,Dyn11,20000,410,,,,,, +SE Trihal ExtraReducedLosses 2000kVA 20kV 410V Dyn11,SE,Trihal,ExtraReducedLosses,three-phase,dry,2000000,0.06,14400,0.011,2600,Dyn11,20000,410,,,,,, +SE Trihal ExtraReducedLosses 2500kVA 20kV 410V Dyn11,SE,Trihal,ExtraReducedLosses,three-phase,dry,2500000,0.06,17100,0.01,3100,Dyn11,20000,410,,,,,, +SE Trihal ReducedLosses 160kVA 20kV 410V Dyn11,SE,Trihal,ReducedLosses,three-phase,dry,160000,0.06,2350,0.023,480,Dyn11,20000,410,,,,,, +SE Trihal ReducedLosses 250kVA 20kV 410V Dyn11,SE,Trihal,ReducedLosses,three-phase,dry,250000,0.06,3300,0.02,650,Dyn11,20000,410,,,,,, +SE Trihal ReducedLosses 400kVA 20kV 410V Dyn11,SE,Trihal,ReducedLosses,three-phase,dry,400000,0.06,4800,0.015,940,Dyn11,20000,410,,,,,, +SE Trihal ReducedLosses 630kVA 20kV 410V Dyn11,SE,Trihal,ReducedLosses,three-phase,dry,630000,0.06,6800,0.013,1250,Dyn11,20000,410,,,,,, +SE Trihal ReducedLosses 800kVA 20kV 410V Dyn11,SE,Trihal,ReducedLosses,three-phase,dry,800000,0.06,8200,0.013,1500,Dyn11,20000,410,,,,,, +SE Trihal ReducedLosses 1000kVA 20kV 410V Dyn11,SE,Trihal,ReducedLosses,three-phase,dry,1000000,0.06,9600,0.012,1800,Dyn11,20000,410,,,,,, +SE Trihal ReducedLosses 1250kVA 20kV 410V Dyn11,SE,Trihal,ReducedLosses,three-phase,dry,1250000,0.06,11400,0.012,2100,Dyn11,20000,410,,,,,, +SE Trihal ReducedLosses 1600kVA 20kV 410V Dyn11,SE,Trihal,ReducedLosses,three-phase,dry,1600000,0.06,14000,0.012,2400,Dyn11,20000,410,,,,,, +SE Trihal ReducedLosses 2000kVA 20kV 410V Dyn11,SE,Trihal,ReducedLosses,three-phase,dry,2000000,0.06,17400,0.011,3000,Dyn11,20000,410,,,,,, +SE Trihal ReducedLosses 2500kVA 20kV 410V Dyn11,SE,Trihal,ReducedLosses,three-phase,dry,2500000,0.06,20000,0.01,3600,Dyn11,20000,410,,,,,, +SE Trihal Standard 160kVA 20kV 410V Dyn11,SE,Trihal,Standard,three-phase,dry,160000,0.06,2350,0.023,650,Dyn11,20000,410,,,,,, +SE Trihal Standard 250kVA 20kV 410V Dyn11,SE,Trihal,Standard,three-phase,dry,250000,0.06,3300,0.02,880,Dyn11,20000,410,,,,,, +SE Trihal Standard 400kVA 20kV 410V Dyn11,SE,Trihal,Standard,three-phase,dry,400000,0.06,4800,0.015,1200,Dyn11,20000,410,,,,,, +SE Trihal Standard 630kVA 20kV 410V Dyn11,SE,Trihal,Standard,three-phase,dry,630000,0.06,6800,0.013,1650,Dyn11,20000,410,,,,,, +SE Trihal Standard 800kVA 20kV 410V Dyn11,SE,Trihal,Standard,three-phase,dry,800000,0.06,8200,0.013,2000,Dyn11,20000,410,,,,,, +SE Trihal Standard 1000kVA 20kV 410V Dyn11,SE,Trihal,Standard,three-phase,dry,1000000,0.06,9600,0.012,2300,Dyn11,20000,410,,,,,, +SE Trihal Standard 1250kVA 20kV 410V Dyn11,SE,Trihal,Standard,three-phase,dry,1250000,0.06,11400,0.012,2800,Dyn11,20000,410,,,,,, +SE Trihal Standard 1600kVA 20kV 410V Dyn11,SE,Trihal,Standard,three-phase,dry,1600000,0.06,14000,0.012,3100,Dyn11,20000,410,,,,,, +SE Trihal Standard 2000kVA 20kV 410V Dyn11,SE,Trihal,Standard,three-phase,dry,2000000,0.06,17400,0.011,4000,Dyn11,20000,410,,,,,, +SE Trihal Standard 2500kVA 20kV 410V Dyn11,SE,Trihal,Standard,three-phase,dry,2500000,0.06,20000,0.01,5000,Dyn11,20000,410,,,,,, +SE Vegeta AA0Ak 160kVA 20kV 410V Dyn11,SE,Vegeta,AA0Ak,three-phase,ester,160000,0.04,1750,0.15,189,Dyn11,20000,410,,,98.803,98.508,99.032,98.792 +SE Vegeta AA0Ak 250kVA 20kV 410V Dyn11,SE,Vegeta,AA0Ak,three-phase,ester,250000,0.04,2350,0.14,270,Dyn11,20000,410,,,98.963,98.707,99.158,98.95 +SE Vegeta AA0Ak 400kVA 20kV 410V Dyn11,SE,Vegeta,AA0Ak,three-phase,ester,400000,0.04,3250,0.16,387,Dyn11,20000,410,,,99.099,98.876,99.267,99.085 +SE Vegeta AA0Ak 630kVA 20kV 410V Dyn11,SE,Vegeta,AA0Ak,three-phase,ester,630000,0.04,4600,0.15,540,Dyn11,20000,410,,,99.191,98.99,99.342,99.179 +SE Vegeta AA0Ak 800kVA 20kV 410V Dyn11,SE,Vegeta,AA0Ak,three-phase,ester,800000,0.06,6000,0.12,585,Dyn11,20000,410,,,99.184,98.982,99.344,99.192 +SE Vegeta AA0Ak 1000kVA 20kV 410V Dyn11,SE,Vegeta,AA0Ak,three-phase,ester,1000000,0.06,7600,0.12,693,Dyn11,20000,410,,,99.178,98.974,99.342,99.179 +SE Vegeta AA0Ak 1250kVA 20kV 410V Dyn11,SE,Vegeta,AA0Ak,three-phase,ester,1250000,0.06,9500,0.12,855,Dyn11,20000,410,,,99.178,98.975,99.343,99.18 +SE Vegeta AA0Ak 1600kVA 20kV 410V Dyn11,SE,Vegeta,AA0Ak,three-phase,ester,1600000,0.06,12000,0.28,1080,Dyn11,20000,410,,,99.189,99.988,99.352,99.191 +SE Vegeta AA0Ak 2000kVA 20kV 410V Dyn11,SE,Vegeta,AA0Ak,three-phase,ester,2000000,0.06,15000,0.28,1305,Dyn11,20000,410,,,99.191,98.991,99.355,99.195 +SE Vegeta AA0Ak 2500kVA 20kV 410V Dyn11,SE,Vegeta,AA0Ak,three-phase,ester,2500000,0.06,18500,0.28,1575,Dyn11,20000,410,,,99.203,99.006,99.365,99.208 +SE Vegeta AA0Ak 3150kVA 20kV 410V Dyn11,SE,Vegeta,AA0Ak,three-phase,ester,3150000,0.06,23000,0.28,1980,Dyn11,20000,410,,,99.213,99.018,99.373,99.217 +SE Vegeta C0Bk 50kVA 15/20kV(20) 410V Dyn11,SE,Vegeta,C0Bk,three-phase,ester,50000,0.04,875,0.029,125,Dyn11,20000,410,,,,,, +SE Vegeta C0Bk 100kVA 15/20kV(20) 410V Dyn11,SE,Vegeta,C0Bk,three-phase,ester,100000,0.04,1475,0.025,210,Dyn11,20000,410,,,,,, +SE Vegeta C0Bk 160kVA 15/20kV(20) 410V Dyn11,SE,Vegeta,C0Bk,three-phase,ester,160000,0.04,2000,0.023,300,Dyn11,20000,410,,,,,, +SE Vegeta C0Bk 250kVA 15/20kV(20) 410V Dyn11,SE,Vegeta,C0Bk,three-phase,ester,250000,0.04,2750,0.021,425,Dyn11,20000,410,,,,,, +SE Vegeta C0Bk 315kVA 15/20kV(20) 410V Dyn11,SE,Vegeta,C0Bk,three-phase,ester,315000,0.04,3250,0.02,520,Dyn11,20000,410,,,,,, +SE Vegeta C0Bk 400kVA 15/20kV(20) 410V Dyn11,SE,Vegeta,C0Bk,three-phase,ester,400000,0.04,3850,0.019,610,Dyn11,20000,410,,,,,, +SE Vegeta C0Bk 500kVA 15/20kV(20) 410V Dyn11,SE,Vegeta,C0Bk,three-phase,ester,500000,0.04,4600,0.019,720,Dyn11,20000,410,,,,,, +SE Vegeta C0Bk 630kVA 15/20kV(20) 410V Dyn11,SE,Vegeta,C0Bk,three-phase,ester,630000,0.04,5400,0.018,860,Dyn11,20000,410,,,,,, +SE Vegeta C0Bk 800kVA 15/20kV(20) 410V Dyn11,SE,Vegeta,C0Bk,three-phase,ester,800000,0.06,7000,0.025,930,Dyn11,20000,410,,,,,, +SE Vegeta C0Bk 1000kVA 15/20kV(20) 410V Dyn11,SE,Vegeta,C0Bk,three-phase,ester,1000000,0.06,9000,0.024,1100,Dyn11,20000,410,,,,,, +SE Vegeta C0Bk 1250kVA 15/20kV(20) 410V Dyn11,SE,Vegeta,C0Bk,three-phase,ester,1250000,0.06,11000,0.022,1350,Dyn11,20000,410,,,,,, +SE Vegeta C0Bk 1600kVA 15/20kV(20) 410V Dyn11,SE,Vegeta,C0Bk,three-phase,ester,1600000,0.06,14000,0.02,1700,Dyn11,20000,410,,,,,, +SE Vegeta C0Bk 2000kVA 15/20kV(20) 410V Dyn11,SE,Vegeta,C0Bk,three-phase,ester,2000000,0.06,18000,0.019,2100,Dyn11,20000,410,,,,,, +SE Vegeta C0Bk 2500kVA 15/20kV(20) 410V Dyn11,SE,Vegeta,C0Bk,three-phase,ester,2500000,0.06,22000,0.018,2500,Dyn11,20000,410,,,,,, +SE Vegeta C0Bk 3150kVA 15/20kV(20) 410V Dyn11,SE,Vegeta,C0Bk,three-phase,ester,3150000,0.07,26500,0.018,3000,Dyn11,20000,410,,,,,, +SE Vegeta C0Bk 50kVA 15/20kV(15) 410V Dyn11,SE,Vegeta,C0Bk,three-phase,ester,50000,0.04,875,0.029,125,Dyn11,15000,410,,,,,, +SE Vegeta C0Bk 100kVA 15/20kV(15) 410V Dyn11,SE,Vegeta,C0Bk,three-phase,ester,100000,0.04,1475,0.025,210,Dyn11,15000,410,,,,,, +SE Vegeta C0Bk 160kVA 15/20kV(15) 410V Dyn11,SE,Vegeta,C0Bk,three-phase,ester,160000,0.04,2000,0.023,300,Dyn11,15000,410,,,,,, +SE Vegeta C0Bk 250kVA 15/20kV(15) 410V Dyn11,SE,Vegeta,C0Bk,three-phase,ester,250000,0.04,2750,0.021,425,Dyn11,15000,410,,,,,, +SE Vegeta C0Bk 315kVA 15/20kV(15) 410V Dyn11,SE,Vegeta,C0Bk,three-phase,ester,315000,0.04,3250,0.02,520,Dyn11,15000,410,,,,,, +SE Vegeta C0Bk 400kVA 15/20kV(15) 410V Dyn11,SE,Vegeta,C0Bk,three-phase,ester,400000,0.04,3850,0.019,610,Dyn11,15000,410,,,,,, +SE Vegeta C0Bk 500kVA 15/20kV(15) 410V Dyn11,SE,Vegeta,C0Bk,three-phase,ester,500000,0.04,4600,0.019,720,Dyn11,15000,410,,,,,, +SE Vegeta C0Bk 630kVA 15/20kV(15) 410V Dyn11,SE,Vegeta,C0Bk,three-phase,ester,630000,0.04,5400,0.018,860,Dyn11,15000,410,,,,,, +SE Vegeta C0Bk 800kVA 15/20kV(15) 410V Dyn11,SE,Vegeta,C0Bk,three-phase,ester,800000,0.06,7000,0.025,930,Dyn11,15000,410,,,,,, +SE Vegeta C0Bk 1000kVA 15/20kV(15) 410V Dyn11,SE,Vegeta,C0Bk,three-phase,ester,1000000,0.06,9000,0.024,1100,Dyn11,15000,410,,,,,, +SE Vegeta C0Bk 1250kVA 15/20kV(15) 410V Dyn11,SE,Vegeta,C0Bk,three-phase,ester,1250000,0.06,11000,0.022,1350,Dyn11,15000,410,,,,,, +SE Vegeta C0Bk 1600kVA 15/20kV(15) 410V Dyn11,SE,Vegeta,C0Bk,three-phase,ester,1600000,0.06,14000,0.02,1700,Dyn11,15000,410,,,,,, +SE Vegeta C0Bk 2000kVA 15/20kV(15) 410V Dyn11,SE,Vegeta,C0Bk,three-phase,ester,2000000,0.06,18000,0.019,2100,Dyn11,15000,410,,,,,, +SE Vegeta C0Bk 2500kVA 15/20kV(15) 410V Dyn11,SE,Vegeta,C0Bk,three-phase,ester,2500000,0.06,22000,0.018,2500,Dyn11,15000,410,,,,,, +SE Vegeta C0Bk 3150kVA 15/20kV(15) 410V Dyn11,SE,Vegeta,C0Bk,three-phase,ester,3150000,0.07,26500,0.018,3000,Dyn11,15000,410,,,,,, +SE Vegeta Standard 50kVA 15/20kV(20) 410V Dyn11,SE,Vegeta,Standard,three-phase,ester,50000,0.04,1350,0.029,145,Dyn11,20000,410,2.74,3.93,97.09,96.39,97.64,97.07 +SE Vegeta Standard 100kVA 15/20kV(20) 410V Dyn11,SE,Vegeta,Standard,three-phase,ester,100000,0.04,2150,0.025,210,Dyn11,20000,410,2.21,3.75,97.69,97.13,98.14,97.69 +SE Vegeta Standard 160kVA 15/20kV(20) 410V Dyn11,SE,Vegeta,Standard,three-phase,ester,160000,0.04,2350,0.023,460,Dyn11,20000,410,1.54,3.43,98.27,97.85,98.54,98.18 +SE Vegeta Standard 250kVA 15/20kV(20) 410V Dyn11,SE,Vegeta,Standard,three-phase,ester,250000,0.04,3250,0.021,650,Dyn11,20000,410,1.37,3.33,98.46,98.09,98.7,98.37 +SE Vegeta Standard 315kVA 15/20kV(20) 410V Dyn11,SE,Vegeta,Standard,three-phase,ester,315000,0.04,3900,0.02,800,Dyn11,20000,410,1.31,3.3,98.53,98.17,98.75,98.44 +SE Vegeta Standard 400kVA 15/20kV(20) 410V Dyn11,SE,Vegeta,Standard,three-phase,ester,400000,0.04,4600,0.019,930,Dyn11,20000,410,1.22,3.25,98.64,98.3,98.84,98.56 +SE Vegeta Standard 500kVA 15/20kV(20) 410V Dyn11,SE,Vegeta,Standard,three-phase,ester,500000,0.04,5500,0.019,1100,Dyn11,20000,410,1.17,3.22,98.7,98.38,98.89,98.62 +SE Vegeta Standard 630kVA 15/20kV(20) 410V Dyn11,SE,Vegeta,Standard,three-phase,ester,630000,0.04,6500,0.018,1300,Dyn11,20000,410,1.11,3.17,98.78,98.48,98.96,98.71 +SE Vegeta Standard 800kVA 15/20kV(20) 410V Dyn11,SE,Vegeta,Standard,three-phase,ester,800000,0.06,10700,0.025,1220,Dyn11,20000,410,1.51,4.65,98.53,98.71,98.81,98.51 +SE Vegeta Standard 1000kVA 15/20kV(20) 410V Dyn11,SE,Vegeta,Standard,three-phase,ester,1000000,0.06,13000,0.024,1470,Dyn11,20000,410,1.47,4.63,98.57,98.22,98.84,98.56 +SE Vegeta Standard 1250kVA 15/20kV(20) 410V Dyn11,SE,Vegeta,Standard,three-phase,ester,1250000,0.06,16000,0.022,1800,Dyn11,20000,410,1.45,4.62,98.6,98.25,98.86,98.58 +SE Vegeta Standard 1600kVA 15/20kV(20) 410V Dyn11,SE,Vegeta,Standard,three-phase,ester,1600000,0.06,20000,0.02,2300,Dyn11,20000,410,1.42,4.6,98.63,98.29,98.88,98.61 +SE Vegeta Standard 2000kVA 15/20kV(20) 410V Dyn11,SE,Vegeta,Standard,three-phase,ester,2000000,0.06,25500,0.019,2750,Dyn11,20000,410,1.45,4.61,98.61,98.27,98.87,98.6 +SE Vegeta Standard 2500kVA 15/20kV(20) 410V Dyn11,SE,Vegeta,Standard,three-phase,ester,2500000,0.06,32000,0.018,3350,Dyn11,20000,410,1.45,4.62,98.61,98.26,98.87,98.6 +SE Vegeta Standard 3150kVA 15/20kV(20) 410V Dyn11,SE,Vegeta,Standard,three-phase,ester,3150000,0.07,33000,0.018,4200,Dyn11,20000,410,1.29,5.11,98.83,98.55,99.05,98.81 +SE Vegeta Standard 50kVA 15/20kV(15) 410V Dyn11,SE,Vegeta,Standard,three-phase,ester,50000,0.04,1350,0.029,145,Dyn11,15000,410,2.74,3.93,97.09,96.39,97.64,97.07 +SE Vegeta Standard 100kVA 15/20kV(15) 410V Dyn11,SE,Vegeta,Standard,three-phase,ester,100000,0.04,2150,0.025,210,Dyn11,15000,410,2.21,3.75,97.69,97.13,98.14,97.69 +SE Vegeta Standard 160kVA 15/20kV(15) 410V Dyn11,SE,Vegeta,Standard,three-phase,ester,160000,0.04,2350,0.023,460,Dyn11,15000,410,1.54,3.43,98.27,97.85,98.54,98.18 +SE Vegeta Standard 250kVA 15/20kV(15) 410V Dyn11,SE,Vegeta,Standard,three-phase,ester,250000,0.04,3250,0.021,650,Dyn11,15000,410,1.37,3.33,98.46,98.09,98.7,98.37 +SE Vegeta Standard 315kVA 15/20kV(15) 410V Dyn11,SE,Vegeta,Standard,three-phase,ester,315000,0.04,3900,0.02,800,Dyn11,15000,410,1.31,3.3,98.53,98.17,98.75,98.44 +SE Vegeta Standard 400kVA 15/20kV(15) 410V Dyn11,SE,Vegeta,Standard,three-phase,ester,400000,0.04,4600,0.019,930,Dyn11,15000,410,1.22,3.25,98.64,98.3,98.84,98.56 +SE Vegeta Standard 500kVA 15/20kV(15) 410V Dyn11,SE,Vegeta,Standard,three-phase,ester,500000,0.04,5500,0.019,1100,Dyn11,15000,410,1.17,3.22,98.7,98.38,98.89,98.62 +SE Vegeta Standard 630kVA 15/20kV(15) 410V Dyn11,SE,Vegeta,Standard,three-phase,ester,630000,0.04,6500,0.018,1300,Dyn11,15000,410,1.11,3.17,98.78,98.48,98.96,98.71 +SE Vegeta Standard 800kVA 15/20kV(15) 410V Dyn11,SE,Vegeta,Standard,three-phase,ester,800000,0.06,10700,0.025,1220,Dyn11,15000,410,1.51,4.65,98.53,98.71,98.81,98.51 +SE Vegeta Standard 1000kVA 15/20kV(15) 410V Dyn11,SE,Vegeta,Standard,three-phase,ester,1000000,0.06,13000,0.024,1470,Dyn11,15000,410,1.47,4.63,98.57,98.22,98.84,98.56 +SE Vegeta Standard 1250kVA 15/20kV(15) 410V Dyn11,SE,Vegeta,Standard,three-phase,ester,1250000,0.06,16000,0.022,1800,Dyn11,15000,410,1.45,4.62,98.6,98.25,98.86,98.58 +SE Vegeta Standard 1600kVA 15/20kV(15) 410V Dyn11,SE,Vegeta,Standard,three-phase,ester,1600000,0.06,20000,0.02,2300,Dyn11,15000,410,1.42,4.6,98.63,98.29,98.88,98.61 +SE Vegeta Standard 2000kVA 15/20kV(15) 410V Dyn11,SE,Vegeta,Standard,three-phase,ester,2000000,0.06,25500,0.019,2750,Dyn11,15000,410,1.45,4.61,98.61,98.27,98.87,98.6 +SE Vegeta Standard 2500kVA 15/20kV(15) 410V Dyn11,SE,Vegeta,Standard,three-phase,ester,2500000,0.06,32000,0.018,3350,Dyn11,15000,410,1.45,4.62,98.61,98.26,98.87,98.6 +SE Vegeta Standard 3150kVA 15/20kV(15) 410V Dyn11,SE,Vegeta,Standard,three-phase,ester,3150000,0.07,33000,0.018,4200,Dyn11,15000,410,1.29,5.11,98.83,98.55,99.05,98.81 +SE Imprego 63kVA 400V 400V Dyn11,SE,Imprego,,three-phase,dry,63000,0.0447,2006,,416,Dyn11,400,400,,,,,, +SE Imprego 10kVA 230V 230V Ii0,SE,Imprego,,single-phase,dry,10000,0.028,280,,90,Ii0,230,230,,,,,, +SE Imprego 10kVA 230V 230V Iii0,SE,Imprego,,center-tapped,dry,10000,0.028,280,,90,Iii0,230,230,,,,,, +SE Imprego 6.3kVA 230V 230V Ii0,SE,Imprego,,single-phase,dry,6300,0.027,170,,60,Ii0,230,230,,,,,, +SE Imprego 6.3kVA 230V 230V Iii0,SE,Imprego,,center-tapped,dry,6300,0.027,170,,60,Iii0,230,230,,,,,, +CA Yellow A0Ak 250kVA 15.75/21kV(21) 400V Dyn11,CA,Yellow,A0Ak,three-phase,,250000,0.04,2350,,300,Dyn11,21000,400,1.02,3.12,98.95,98.69,99.14,98.93 +CA Yellow A0Ak 400kVA 15.75/21kV(21) 400V Dyn11,CA,Yellow,A0Ak,three-phase,,400000,0.04,3250,,430,Dyn11,21000,400,0.89,3.03,99.09,98.86,99.25,99.07 +CA Yellow A0Ak 500kVA 15.75/21kV(21) 400V Dyn11,CA,Yellow,A0Ak,three-phase,,500000,0.04,3900,,510,Dyn11,21000,400,0.86,3.01,99.13,98.91,99.28,99.11 +CA Yellow A0Ak 630kVA 15.75/21kV(21) 400V Dyn11,CA,Yellow,A0Ak,three-phase,,630000,0.04,4600,,600,Dyn11,21000,400,0.81,2.98,99.18,98.98,99.33,99.16 +CA Yellow A0Ak 800kVA 15.75/21kV(21) 400V Dyn11,CA,Yellow,A0Ak,three-phase,,800000,0.06,6000,,650,Dyn11,21000,400,0.93,4.26,99.18,98.97,99.33,99.17 +CA Yellow A0Ak 1000kVA 15.75/21kV(21) 400V Dyn11,CA,Yellow,A0Ak,three-phase,,1000000,0.06,7600,,770,Dyn11,21000,400,0.94,4.27,99.17,98.96,99.33,99.17 +CA Yellow A0Ak 1250kVA 15.75/21kV(21) 400V Dyn11,CA,Yellow,A0Ak,three-phase,,1250000,0.06,9500,,950,Dyn11,21000,400,0.94,4.27,99.17,98.97,99.33,99.17 +CA Yellow A0Ak 1600kVA 15.75/21kV(21) 400V Dyn11,CA,Yellow,A0Ak,three-phase,,1600000,0.06,12000,,1200,Dyn11,21000,400,0.93,4.26,99.18,98.98,99.34,99.18 +CA Yellow A0Ak 2000kVA 15.75/21kV(21) 400V Dyn11,CA,Yellow,A0Ak,three-phase,,2000000,0.06,15000,,1450,Dyn11,21000,400,0.93,4.26,99.18,98.98,99.35,99.18 +CA Yellow A0Ak 2500kVA 15.75/21kV(21) 400V Dyn11,CA,Yellow,A0Ak,three-phase,,2500000,0.06,18500,,1750,Dyn11,21000,400,0.92,4.26,99.20,99.00,99.36,99.20 +CA Yellow A0Ak 3150kVA 15.75/21kV(21) 400V Dyn11,CA,Yellow,A0Ak,three-phase,,3150000,0.06,23000,,2200,Dyn11,21000,400,0.91,4.25,99.21,99.01,99.36,99.21 +CA Yellow A0Ak 250kVA 15.75/21kV(15.75) 400V Dyn11,CA,Yellow,A0Ak,three-phase,,250000,0.04,2350,,300,Dyn11,15750,400,1.02,3.12,98.95,98.69,99.14,98.93 +CA Yellow A0Ak 400kVA 15.75/21kV(15.75) 400V Dyn11,CA,Yellow,A0Ak,three-phase,,400000,0.04,3250,,430,Dyn11,15750,400,0.89,3.03,99.09,98.86,99.25,99.07 +CA Yellow A0Ak 500kVA 15.75/21kV(15.75) 400V Dyn11,CA,Yellow,A0Ak,three-phase,,500000,0.04,3900,,510,Dyn11,15750,400,0.86,3.01,99.13,98.91,99.28,99.11 +CA Yellow A0Ak 630kVA 15.75/21kV(15.75) 400V Dyn11,CA,Yellow,A0Ak,three-phase,,630000,0.04,4600,,600,Dyn11,15750,400,0.81,2.98,99.18,98.98,99.33,99.16 +CA Yellow A0Ak 800kVA 15.75/21kV(15.75) 400V Dyn11,CA,Yellow,A0Ak,three-phase,,800000,0.06,6000,,650,Dyn11,15750,400,0.93,4.26,99.18,98.97,99.33,99.17 +CA Yellow A0Ak 1000kVA 15.75/21kV(15.75) 400V Dyn11,CA,Yellow,A0Ak,three-phase,,1000000,0.06,7600,,770,Dyn11,15750,400,0.94,4.27,99.17,98.96,99.33,99.17 +CA Yellow A0Ak 1250kVA 15.75/21kV(15.75) 400V Dyn11,CA,Yellow,A0Ak,three-phase,,1250000,0.06,9500,,950,Dyn11,15750,400,0.94,4.27,99.17,98.97,99.33,99.17 +CA Yellow A0Ak 1600kVA 15.75/21kV(15.75) 400V Dyn11,CA,Yellow,A0Ak,three-phase,,1600000,0.06,12000,,1200,Dyn11,15750,400,0.93,4.26,99.18,98.98,99.34,99.18 +CA Yellow A0Ak 2000kVA 15.75/21kV(15.75) 400V Dyn11,CA,Yellow,A0Ak,three-phase,,2000000,0.06,15000,,1450,Dyn11,15750,400,0.93,4.26,99.18,98.98,99.35,99.18 +CA Yellow A0Ak 2500kVA 15.75/21kV(15.75) 400V Dyn11,CA,Yellow,A0Ak,three-phase,,2500000,0.06,18500,,1750,Dyn11,15750,400,0.92,4.26,99.20,99.00,99.36,99.20 +CA Yellow A0Ak 3150kVA 15.75/21kV(15.75) 400V Dyn11,CA,Yellow,A0Ak,three-phase,,3150000,0.06,23000,,2200,Dyn11,15750,400,0.91,4.25,99.21,99.01,99.36,99.21 diff --git a/roseau/load_flow/exceptions.py b/roseau/load_flow/exceptions.py index 0a8e50cd..1b71cfdf 100644 --- a/roseau/load_flow/exceptions.py +++ b/roseau/load_flow/exceptions.py @@ -52,8 +52,10 @@ class RoseauLoadFlowExceptionCode(StrEnum): # Transformer BAD_TRANSFORMER_ID = auto() - BAD_TRANSFORMER_WINDINGS = auto() BAD_TRANSFORMER_TYPE = auto() + BAD_TRANSFORMER_VECTOR_GROUP = auto() + BAD_TRANSFORMER_WINDINGS = BAD_TRANSFORMER_VECTOR_GROUP + BAD_TRANSFORMER_VOLTAGES = auto() BAD_TRANSFORMER_IMPEDANCE = auto() BAD_TRANSFORMER_PARAMETERS = auto() diff --git a/roseau/load_flow/io/dgs/transformers.py b/roseau/load_flow/io/dgs/transformers.py index b589b797..79187424 100644 --- a/roseau/load_flow/io/dgs/transformers.py +++ b/roseau/load_flow/io/dgs/transformers.py @@ -31,18 +31,18 @@ def generate_typ_tr( # Extract data name = typ_tr.at[idx, "loc_name"] sn = Q_(typ_tr.at[idx, "strn"], "MVA") # The nominal voltages of the transformer (MVA) - up = Q_(typ_tr.at[idx, "utrn_h"], "kV") # Phase-to-phase nominal voltages of the primary side (kV) - us = Q_(typ_tr.at[idx, "utrn_l"], "kV") # Phase-to-phase nominal voltages of the secondary side (kV) + uhv = Q_(typ_tr.at[idx, "utrn_h"], "kV") # Phase-to-phase nominal voltage of the HV side (kV) + ulv = Q_(typ_tr.at[idx, "utrn_l"], "kV") # Phase-to-phase nominal voltage of the LV side (kV) i0 = Q_(typ_tr.at[idx, "curmg"] / 3, "percent") # Current during off-load test (%) p0 = Q_(typ_tr.at[idx, "pfe"] / 3, "kW") # Losses during off-load test (kW) psc = Q_(typ_tr.at[idx, "pcutr"], "kW") # Losses during short-circuit test (kW) vsc = Q_(typ_tr.at[idx, "uktr"], "percent") # Voltages on LV side during short-circuit test (%) - # Windings of the transformer - windings = f"{typ_tr.at[idx, 'tr2cn_h']}{typ_tr.at[idx, 'tr2cn_l']}{typ_tr.at[idx, 'nt2ag']}" + # Vector group of the transformer + vg = f"{typ_tr.at[idx, 'tr2cn_h']}{typ_tr.at[idx, 'tr2cn_l']}{typ_tr.at[idx, 'nt2ag']}" # Generate transformer parameters transformers_params[idx] = TransformerParameters.from_open_and_short_circuit_tests( - id=name, type=windings, up=up, us=us, sn=sn, p0=p0, i0=i0, psc=psc, vsc=vsc + id=name, vg=vg, uhv=uhv, ulv=ulv, sn=sn, p0=p0, i0=i0, psc=psc, vsc=vsc ) transformers_tap[idx] = typ_tr.at[idx, "dutap"] diff --git a/roseau/load_flow/io/dict.py b/roseau/load_flow/io/dict.py index c7c9ffd9..112022df 100644 --- a/roseau/load_flow/io/dict.py +++ b/roseau/load_flow/io/dict.py @@ -427,15 +427,24 @@ def v0_to_v1_converter(data: JsonDict) -> JsonDict: # noqa: C901 for transformer_type in data["transformer_types"]: tp = { "sn": transformer_type["sn"], - "up": transformer_type["up"], - "us": transformer_type["us"], + "uhv": transformer_type["uhv"], + "ulv": transformer_type["ulv"], "i0": transformer_type["i0"], "p0": transformer_type["p0"], "psc": transformer_type["psc"], "vsc": transformer_type["vsc"], "type": transformer_type["type"], } - z2, ym = TransformerParameters._compute_zy(**tp) + z2, ym = TransformerParameters._compute_zy( + vg=tp["type"], + uhv=tp["uhv"], + ulv=tp["ulv"], + sn=tp["sn"], + p0=tp["p0"], + i0=tp["i0"], + psc=tp["psc"], + vsc=tp["vsc"], + ) tp["id"] = transformer_type["name"] tp["z2"] = [z2.real, z2.imag] tp["ym"] = [ym.real, ym.imag] @@ -620,7 +629,7 @@ def v1_to_v2_converter(data: JsonDict) -> JsonDict: return results -def v2_to_v3_converter(data: JsonDict) -> JsonDict: # noqa: C901 +def v2_to_v3_converter(data: JsonDict) -> JsonDict: """Convert a v2 network dict to a v3 network dict. Args: @@ -648,16 +657,13 @@ def v2_to_v3_converter(data: JsonDict) -> JsonDict: # noqa: C901 bus_warning_emitted = True buses.append(bus_data) - # Rename `uhv` in `up` and `ulv` in `us` # Remove `max_power` + # Rename `type` to `vg` old_transformers_params = data.get("transformers_params", []) transformers_params = [] transformers_params_max_loading = {} for transformer_param_data in old_transformers_params: - if (up := transformer_param_data.pop("uhv", None)) is not None: - transformer_param_data["up"] = up - if (us := transformer_param_data.pop("ulv", None)) is not None: - transformer_param_data["us"] = us + transformer_param_data["vg"] = transformer_param_data.pop("type") if (max_power := transformer_param_data.pop("max_power", None)) is not None: transformers_params_max_loading[transformer_param_data["id"]] = max_power / transformer_param_data["sn"] transformers_params.append(transformer_param_data) diff --git a/roseau/load_flow/io/tests/test_dict.py b/roseau/load_flow/io/tests/test_dict.py index 9f607aa2..b5849622 100644 --- a/roseau/load_flow/io/tests/test_dict.py +++ b/roseau/load_flow/io/tests/test_dict.py @@ -133,10 +133,10 @@ def test_to_dict(): # Same id, different transformer parameters -> fail tp1 = TransformerParameters.from_open_and_short_circuit_tests( - id="t", type="Dyn11", up=20000, us=400, sn=160 * 1e3, p0=460, i0=2.3 / 100, psc=2350, vsc=4 / 100 + id="t", vg="Dyn11", uhv=20000, ulv=400, sn=160 * 1e3, p0=460, i0=2.3 / 100, psc=2350, vsc=4 / 100 ) tp2 = TransformerParameters.from_open_and_short_circuit_tests( - id="t", type="Dyn11", up=20000, us=400, sn=200 * 1e3, p0=460, i0=2.3 / 100, psc=2350, vsc=4 / 100 + id="t", vg="Dyn11", uhv=20000, ulv=400, sn=200 * 1e3, p0=460, i0=2.3 / 100, psc=2350, vsc=4 / 100 ) transformer1 = Transformer(id="Transformer1", bus1=source_bus, bus2=load_bus, parameters=tp1, geometry=geom) transformer2 = Transformer(id="Transformer2", bus1=source_bus, bus2=load_bus, parameters=tp2, geometry=geom) @@ -159,7 +159,7 @@ def test_to_dict(): # Same id, same transformer parameters -> ok tp2 = TransformerParameters.from_open_and_short_circuit_tests( - id="t", type="Dyn11", up=20000, us=400, sn=160 * 1e3, p0=460, i0=2.3 / 100, psc=2350, vsc=4 / 100 + id="t", vg="Dyn11", uhv=20000, ulv=400, sn=160 * 1e3, p0=460, i0=2.3 / 100, psc=2350, vsc=4 / 100 ) transformer2.parameters = tp2 en.to_dict(include_results=False) @@ -497,8 +497,8 @@ def test_v0_to_v3_converter(): { "name": "160kVA_Dd0", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, + "uhv": 20000.0, + "ulv": 400.0, "i0": 0.023, "p0": 460.0, "psc": 2350.0, @@ -508,8 +508,8 @@ def test_v0_to_v3_converter(): { "name": "160kVA_Dd6", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, + "uhv": 20000.0, + "ulv": 400.0, "i0": 0.023, "p0": 460.0, "psc": 2350.0, @@ -519,8 +519,8 @@ def test_v0_to_v3_converter(): { "name": "160kVA_Dyn11", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, + "uhv": 20000.0, + "ulv": 400.0, "i0": 0.023, "p0": 460.0, "psc": 2350.0, @@ -530,8 +530,8 @@ def test_v0_to_v3_converter(): { "name": "160kVA_Dyn5", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, + "uhv": 20000.0, + "ulv": 400.0, "i0": 0.023, "p0": 460.0, "psc": 2350.0, @@ -541,8 +541,8 @@ def test_v0_to_v3_converter(): { "name": "160kVA_Dzn0", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, + "uhv": 20000.0, + "ulv": 400.0, "i0": 0.023, "p0": 460.0, "psc": 2350.0, @@ -552,8 +552,8 @@ def test_v0_to_v3_converter(): { "name": "160kVA_Dzn6", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, + "uhv": 20000.0, + "ulv": 400.0, "i0": 0.023, "p0": 460.0, "psc": 2350.0, @@ -563,8 +563,8 @@ def test_v0_to_v3_converter(): { "name": "160kVA_Yd11", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, + "uhv": 20000.0, + "ulv": 400.0, "i0": 0.023, "p0": 460.0, "psc": 2350.0, @@ -574,8 +574,8 @@ def test_v0_to_v3_converter(): { "name": "160kVA_Yd5", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, + "uhv": 20000.0, + "ulv": 400.0, "i0": 0.023, "p0": 460.0, "psc": 2350.0, @@ -585,8 +585,8 @@ def test_v0_to_v3_converter(): { "name": "160kVA_Yyn0", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, + "uhv": 20000.0, + "ulv": 400.0, "i0": 0.023, "p0": 460.0, "psc": 2350.0, @@ -596,8 +596,8 @@ def test_v0_to_v3_converter(): { "name": "160kVA_Yyn6", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, + "uhv": 20000.0, + "ulv": 400.0, "i0": 0.023, "p0": 460.0, "psc": 2350.0, @@ -607,8 +607,8 @@ def test_v0_to_v3_converter(): { "name": "160kVA_Yzn11", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, + "uhv": 20000.0, + "ulv": 400.0, "i0": 0.023, "p0": 460.0, "psc": 2350.0, @@ -618,8 +618,8 @@ def test_v0_to_v3_converter(): { "name": "160kVA_Yzn5", "sn": 160000.0, - "up": 20000.0, - "us": 400.0, + "uhv": 20000.0, + "ulv": 400.0, "i0": 0.023, "p0": 460.0, "psc": 2350.0, @@ -796,10 +796,10 @@ def test_v0_to_v3_converter(): tp = { "160kVA_Dd0": TransformerParameters.from_open_and_short_circuit_tests( id="160kVA_Dd0", - type="dd0", + vg="dd0", sn=160000.0, - up=20000.0, - us=400.0, + uhv=20000.0, + ulv=400.0, i0=0.023, p0=460.0, psc=2350.0, @@ -807,10 +807,10 @@ def test_v0_to_v3_converter(): ), "160kVA_Dd6": TransformerParameters.from_open_and_short_circuit_tests( id="160kVA_Dd6", - type="dd6", + vg="dd6", sn=160000.0, - up=20000.0, - us=400.0, + uhv=20000.0, + ulv=400.0, i0=0.023, p0=460.0, psc=2350.0, @@ -818,10 +818,10 @@ def test_v0_to_v3_converter(): ), "160kVA_Dyn11": TransformerParameters.from_open_and_short_circuit_tests( id="160kVA_Dyn11", - type="dyn11", + vg="dyn11", sn=160000.0, - up=20000.0, - us=400.0, + uhv=20000.0, + ulv=400.0, i0=0.023, p0=460.0, psc=2350.0, @@ -829,10 +829,10 @@ def test_v0_to_v3_converter(): ), "160kVA_Dyn5": TransformerParameters.from_open_and_short_circuit_tests( id="160kVA_Dyn5", - type="dyn5", + vg="dyn5", sn=160000.0, - up=20000.0, - us=400.0, + uhv=20000.0, + ulv=400.0, i0=0.023, p0=460.0, psc=2350.0, @@ -840,10 +840,10 @@ def test_v0_to_v3_converter(): ), "160kVA_Dzn0": TransformerParameters.from_open_and_short_circuit_tests( id="160kVA_Dzn0", - type="dzn0", + vg="dzn0", sn=160000.0, - up=20000.0, - us=400.0, + uhv=20000.0, + ulv=400.0, i0=0.023, p0=460.0, psc=2350.0, @@ -851,10 +851,10 @@ def test_v0_to_v3_converter(): ), "160kVA_Dzn6": TransformerParameters.from_open_and_short_circuit_tests( id="160kVA_Dzn6", - type="dzn6", + vg="dzn6", sn=160000.0, - up=20000.0, - us=400.0, + uhv=20000.0, + ulv=400.0, i0=0.023, p0=460.0, psc=2350.0, @@ -862,10 +862,10 @@ def test_v0_to_v3_converter(): ), "160kVA_Yd11": TransformerParameters.from_open_and_short_circuit_tests( id="160kVA_Yd11", - type="yd11", + vg="yd11", sn=160000.0, - up=20000.0, - us=400.0, + uhv=20000.0, + ulv=400.0, i0=0.023, p0=460.0, psc=2350.0, @@ -873,10 +873,10 @@ def test_v0_to_v3_converter(): ), "160kVA_Yd5": TransformerParameters.from_open_and_short_circuit_tests( id="160kVA_Yd5", - type="yd5", + vg="yd5", sn=160000.0, - up=20000.0, - us=400.0, + uhv=20000.0, + ulv=400.0, i0=0.023, p0=460.0, psc=2350.0, @@ -884,10 +884,10 @@ def test_v0_to_v3_converter(): ), "160kVA_Yyn0": TransformerParameters.from_open_and_short_circuit_tests( id="160kVA_Yyn0", - type="yyn0", + vg="yyn0", sn=160000.0, - up=20000.0, - us=400.0, + uhv=20000.0, + ulv=400.0, i0=0.023, p0=460.0, psc=2350.0, @@ -895,10 +895,10 @@ def test_v0_to_v3_converter(): ), "160kVA_Yyn6": TransformerParameters.from_open_and_short_circuit_tests( id="160kVA_Yyn6", - type="yyn6", + vg="yyn6", sn=160000.0, - up=20000.0, - us=400.0, + uhv=20000.0, + ulv=400.0, i0=0.023, p0=460.0, psc=2350.0, @@ -906,10 +906,10 @@ def test_v0_to_v3_converter(): ), "160kVA_Yzn11": TransformerParameters.from_open_and_short_circuit_tests( id="160kVA_Yzn11", - type="yzn11", + vg="yzn11", sn=160000.0, - up=20000.0, - us=400.0, + uhv=20000.0, + ulv=400.0, i0=0.023, p0=460.0, psc=2350.0, @@ -917,10 +917,10 @@ def test_v0_to_v3_converter(): ), "160kVA_Yzn5": TransformerParameters.from_open_and_short_circuit_tests( id="160kVA_Yzn5", - type="yzn5", + vg="yzn5", sn=160000.0, - up=20000.0, - us=400.0, + uhv=20000.0, + ulv=400.0, i0=0.023, p0=460.0, psc=2350.0, @@ -1566,7 +1566,7 @@ def test_v2_to_v3_converter_max_loading(): # "ulv": rlf.Q_(400, "V"), # V # "uhv": rlf.Q_(20, "kV"), # V # "sn": rlf.Q_(50, "kVA"), # VA - # "type": "yzn11", + # "vg": "yzn11", # "max_power": rlf.Q_(60, "kVA"), # } # tp = rlf.TransformerParameters(**data) diff --git a/roseau/load_flow/models/lines/lines.py b/roseau/load_flow/models/lines/lines.py index 12ca0cb4..5523bb91 100644 --- a/roseau/load_flow/models/lines/lines.py +++ b/roseau/load_flow/models/lines/lines.py @@ -262,8 +262,7 @@ def ampacities(self) -> Q_[FloatArray] | None: @property def max_currents(self) -> Q_[FloatArray] | None: - """The maximum current of the line (in A). It takes into account the `max_loading` of the line and the - `ampacities` of the parameters.""" + """The maximum current of the line defined as `max_loading * parameters.ampacities` (in A).""" # Do not add a setter. Only `max_loading` can be altered by the user amp = self._parameters._ampacities return None if amp is None else Q_(amp * self._max_loading, "A") diff --git a/roseau/load_flow/models/tests/test_buses.py b/roseau/load_flow/models/tests/test_buses.py index 973993fe..189861a2 100644 --- a/roseau/load_flow/models/tests/test_buses.py +++ b/roseau/load_flow/models/tests/test_buses.py @@ -287,7 +287,7 @@ def test_propagate_limits(): # noqa: C901 lp_mv = LineParameters(id="lp_mv", z_line=np.eye(3), y_shunt=0.1 * np.eye(3)) lp_lv = LineParameters(id="lp_lv", z_line=np.eye(4)) - tp = TransformerParameters.from_catalogue(name="SE_Minera_A0Ak_100kVA", manufacturer="SE") + tp = TransformerParameters.from_catalogue(name="SE Minera A0Ak 100kVA 15/20kV(20) 410V Dyn11") Line(id="l1_mv", bus1=b1_mv, bus2=b2_mv, length=1.5, parameters=lp_mv, ground=g) Line(id="l2_mv", bus1=b2_mv, bus2=b3_mv, length=2, parameters=lp_mv, ground=g) @@ -447,7 +447,7 @@ def test_get_connected_buses(): lp_mv = LineParameters(id="lp_mv", z_line=np.eye(3), y_shunt=0.1 * np.eye(3)) lp_lv = LineParameters(id="lp_lv", z_line=np.eye(4)) - tp = TransformerParameters.from_catalogue(name="SE_Minera_A0Ak_100kVA", manufacturer="SE") + tp = TransformerParameters.from_catalogue(name="SE Minera A0Ak 100kVA 15/20kV(20) 410V Dyn11") Line(id="l1_mv", bus1=b1_mv, bus2=b2_mv, length=1.5, parameters=lp_mv, ground=g) Line(id="l2_mv", bus1=b2_mv, bus2=b3_mv, length=2, parameters=lp_mv, ground=g) diff --git a/roseau/load_flow/models/tests/test_line_parameters.py b/roseau/load_flow/models/tests/test_line_parameters.py index 784a31c3..5791109b 100644 --- a/roseau/load_flow/models/tests/test_line_parameters.py +++ b/roseau/load_flow/models/tests/test_line_parameters.py @@ -364,9 +364,10 @@ def test_sym(): # With the bad model of PwF # line_data = {"id": "NKBA NOR 25.00 kV", "un": 25000.0, "in": 277.0000100135803} - z_line, y_shunt = LineParameters._sym_to_zy( - id="NKBA NOR 25.00 kV", z0=0.0j, z1=1.0 + 1.0j, zn=0.0j, zpn=0.0j, y0=0.0j, y1=1e-06j, bn=0.0, bpn=0.0 - ) + with pytest.warns(UserWarning, match=r"does not have neutral elements"): + z_line, y_shunt = LineParameters._sym_to_zy( + id="NKBA NOR 25.00 kV", z0=0.0j, z1=1.0 + 1.0j, zn=0.0j, zpn=0.0j, y0=0.0j, y1=1e-06j, bn=0.0, bpn=0.0 + ) z_line_expected = (1 + 1j) * np.eye(3) npt.assert_allclose(z_line, z_line_expected) y_shunt_expected = 1e-6j * np.eye(3) @@ -374,17 +375,18 @@ def test_sym(): # line_data = {"id": "NKBA 4x150 1.00 kV", "un": 1000.0, "in": 361.0000014305115} # Downgraded model because of PwF bad data - z_line, y_shunt = LineParameters._sym_to_zy( - id="NKBA 4x150 1.00 kV", - z0=0.5 + 0.3050000071525574j, - z1=0.125 + 0.0860000029206276j, - zn=0.0j, - zpn=0.0j, - y0=0.0j, - y1=0.0j, - bn=0.0, - bpn=0.0, - ) + with pytest.warns(UserWarning, match=r"does not have neutral elements"): + z_line, y_shunt = LineParameters._sym_to_zy( + id="NKBA 4x150 1.00 kV", + z0=0.5 + 0.3050000071525574j, + z1=0.125 + 0.0860000029206276j, + zn=0.0j, + zpn=0.0j, + y0=0.0j, + y1=0.0j, + bn=0.0, + bpn=0.0, + ) z_line_expected = np.array( [ [0.25 + 0.159j, 0.125 + 0.073j, 0.125 + 0.073j], @@ -1000,8 +1002,8 @@ def test_equality(): other_data = { "id": lp.id + " other", - "z_line": lp.z_line.m + 1, - "y_shunt": lp.y_shunt.m + 1, + "z_line": lp.z_line.m + 0.1j, + "y_shunt": lp.y_shunt.m + 0.1j, "ampacities": lp.ampacities.m + 1, "line_type": LineType.OVERHEAD, "materials": Material.CU, diff --git a/roseau/load_flow/models/tests/test_lines.py b/roseau/load_flow/models/tests/test_lines.py index ea1e0dd5..2ebfc450 100644 --- a/roseau/load_flow/models/tests/test_lines.py +++ b/roseau/load_flow/models/tests/test_lines.py @@ -5,6 +5,7 @@ from roseau.load_flow.exceptions import RoseauLoadFlowException, RoseauLoadFlowExceptionCode from roseau.load_flow.models import Bus, Ground, Line, LineParameters from roseau.load_flow.units import Q_ +from roseau.load_flow.utils import PositiveSequence as PosSeq def test_lines_length(): @@ -150,11 +151,10 @@ def test_res_violated(): bus2 = Bus(id="bus2", phases="abc") lp = LineParameters(id="lp", z_line=np.eye(3, dtype=complex)) line = Line(id="line", bus1=bus1, bus2=bus2, parameters=lp, length=Q_(50, "m")) - direct_seq = np.exp([0, -2 / 3 * np.pi * 1j, 2 / 3 * np.pi * 1j]) - bus1._res_potentials = 230 * direct_seq - bus2._res_potentials = 225 * direct_seq - line._res_currents = 10 * direct_seq, -10 * direct_seq + bus1._res_potentials = 230 * PosSeq + bus2._res_potentials = 225 * PosSeq + line._res_currents = 10 * PosSeq, -10 * PosSeq # No limits assert line.max_loading == Q_(1, "") @@ -163,67 +163,67 @@ def test_res_violated(): # No constraint violated lp.ampacities = 11 assert line.res_violated is False - assert np.allclose(line.res_loading, 10 / 11) + np.testing.assert_allclose(line.res_loading.m, 10 / 11) # Reduced max_loading line.max_loading = Q_(50, "%") assert line.max_loading.m == 0.5 assert line.res_violated is True - assert np.allclose(line.res_loading, 10 / (11 * 0.5)) + np.testing.assert_allclose(line.res_loading.m, 10 / (11 * 0.5)) # Two violations lp.ampacities = 9 line.max_loading = 1 assert line.res_violated is True - assert np.allclose(line.res_loading, 10 / 9) + np.testing.assert_allclose(line.res_loading.m, 10 / 9) # Side 1 violation lp.ampacities = 11 - line._res_currents = 12 * direct_seq, -10 * direct_seq + line._res_currents = 12 * PosSeq, -10 * PosSeq assert line.res_violated is True - assert np.allclose(line.res_loading, 12 / 11) + np.testing.assert_allclose(line.res_loading.m, 12 / 11) # Side 2 violation lp.ampacities = 11 - line._res_currents = 10 * direct_seq, -12 * direct_seq + line._res_currents = 10 * PosSeq, -12 * PosSeq assert line.res_violated is True - assert np.allclose(line.res_loading, 12 / 11) + np.testing.assert_allclose(line.res_loading.m, 12 / 11) # A single phase violation lp.ampacities = 11 - line._res_currents = 10 * direct_seq, -10 * direct_seq - line._res_currents[0][0] = 12 * direct_seq[0] - line._res_currents[1][0] = -12 * direct_seq[0] + line._res_currents = 10 * PosSeq, -10 * PosSeq + line._res_currents[0][0] = 12 * PosSeq[0] + line._res_currents[1][0] = -12 * PosSeq[0] assert line.res_violated is True - assert np.allclose(line.res_loading, [12 / 11, 10 / 11, 10 / 11]) + np.testing.assert_allclose(line.res_loading.m, [12 / 11, 10 / 11, 10 / 11]) # # The same with arrays # - line._res_currents = 10 * direct_seq, -10 * direct_seq + line._res_currents = 10 * PosSeq, -10 * PosSeq # No constraint violated lp.ampacities = [11, 12, 13] line.max_loading = 1 assert line.res_violated is False - assert np.allclose(line.res_loading, [10 / 11, 10 / 12, 10 / 13]) + np.testing.assert_allclose(line.res_loading.m, [10 / 11, 10 / 12, 10 / 13]) # Two violations lp.ampacities = [9, 9, 12] assert line.res_violated is True - assert np.allclose(line.res_loading, [10 / 9, 10 / 9, 10 / 12]) + np.testing.assert_allclose(line.res_loading.m, [10 / 9, 10 / 9, 10 / 12]) # Side 1 violation lp.ampacities = [11, 10, 9] - line._res_currents = 12 * direct_seq, -10 * direct_seq + line._res_currents = 12 * PosSeq, -10 * PosSeq assert line.res_violated is True - assert np.allclose(line.res_loading, [12 / 11, 12 / 10, 12 / 9]) + np.testing.assert_allclose(line.res_loading.m, [12 / 11, 12 / 10, 12 / 9]) # Side 2 violation lp.ampacities = [11, 11, 13] - line._res_currents = 10 * direct_seq, -12 * direct_seq + line._res_currents = 10 * PosSeq, -12 * PosSeq assert line.res_violated is True - assert np.allclose(line.res_loading, [12 / 11, 12 / 11, 12 / 13]) + np.testing.assert_allclose(line.res_loading.m, [12 / 11, 12 / 11, 12 / 13]) @pytest.mark.parametrize( @@ -425,26 +425,26 @@ def test_lines_results(phases, z_line, y_shunt, len_line, bus_pot, line_cur, gro bus2._res_potentials = np.array(bus_pot[1], dtype=complex) line._res_currents = np.array(line_cur[0], dtype=complex), np.array(line_cur[1], dtype=complex) ground._res_potential = ground_pot - res_powers1, res_powers2 = line.res_powers - series_losses = line.res_series_power_losses - shunt_losses = line.res_shunt_power_losses - line_losses = line.res_power_losses + res_powers1, res_powers2 = (x.m for x in line.res_powers) + series_losses = line.res_series_power_losses.m + shunt_losses = line.res_shunt_power_losses.m + line_losses = line.res_power_losses.m exp_p1, exp_p2, exp_pl_series = expected_pow - assert np.allclose(res_powers1.m_as("VA"), exp_p1) - assert np.allclose(res_powers2.m_as("VA"), exp_p2) - assert np.allclose(series_losses.m_as("VA"), exp_pl_series) + np.testing.assert_allclose(res_powers1, exp_p1) + np.testing.assert_allclose(res_powers2, exp_p2) + np.testing.assert_allclose(series_losses, exp_pl_series) if y_shunt is None: assert np.allclose(shunt_losses, 0) else: assert not np.allclose(shunt_losses, 0) - assert np.allclose(line_losses, series_losses + shunt_losses) + np.testing.assert_allclose(line_losses, series_losses + shunt_losses) # Sanity check: the total power lost is equal to the sum of the powers flowing through - assert np.allclose(res_powers1 + res_powers2, line_losses) + np.testing.assert_allclose(res_powers1 + res_powers2, line_losses, rtol=1e-6) # Check currents (Kirchhoff's law at each end of the line) - i1_line, i2_line = line.res_currents - i_series = line.res_series_currents - i1_shunt, i2_shunt = line.res_shunt_currents - assert np.allclose(i1_line, i_series + i1_shunt) - assert np.allclose(i2_line + i_series, i2_shunt, atol=1.0e-4) + i1_line, i2_line = (x.m for x in line.res_currents) + i_series = line.res_series_currents.m + i1_shunt, i2_shunt = (x.m for x in line.res_shunt_currents) + np.testing.assert_allclose(i1_line, i_series + i1_shunt, rtol=1e-6) + np.testing.assert_allclose(i2_line + i_series, i2_shunt, atol=1e-4) diff --git a/roseau/load_flow/models/tests/test_phases.py b/roseau/load_flow/models/tests/test_phases.py index e142d516..81d3cff3 100644 --- a/roseau/load_flow/models/tests/test_phases.py +++ b/roseau/load_flow/models/tests/test_phases.py @@ -337,7 +337,7 @@ def test_transformer_three_phases(): # Not allowed tp = TransformerParameters.from_open_and_short_circuit_tests( - id="H61_50kVA", type="Dyn11", up=20000, us=400, sn=50 * 1e3, p0=145, i0=1.8 / 100, psc=1350, vsc=4 / 100 + id="H61_50kVA", vg="Dyn11", uhv=20000, ulv=400, sn=50 * 1e3, p0=145, i0=1.8 / 100, psc=1350, vsc=4 / 100 ) for ph in ("ba", "nc", "anb", "nabc", "acb"): with pytest.raises(RoseauLoadFlowException) as e: @@ -384,7 +384,7 @@ def test_transformer_single_phases(): # Not allowed tp = TransformerParameters.from_open_and_short_circuit_tests( - id="160kVA", type="single", up=20000, us=400, sn=160 * 1e3, p0=460, i0=2.3 / 100, psc=2350, vsc=4 / 100 + id="160kVA", vg="Ii0", uhv=20000, ulv=400, sn=160 * 1e3, p0=460, i0=2.3 / 100, psc=2350, vsc=4 / 100 ) for ph in ("ba", "nc", "anb", "nabc", "acb"): with pytest.raises(RoseauLoadFlowException) as e: @@ -450,7 +450,7 @@ def test_transformer_center_phases(): # Not allowed tp = TransformerParameters.from_open_and_short_circuit_tests( - id="160kVA", type="center", up=20000, us=400, sn=160 * 1e3, p0=460, i0=2.3 / 100, psc=2350, vsc=4 / 100 + id="160kVA", vg="Iii0", uhv=20000, ulv=400, sn=160 * 1e3, p0=460, i0=2.3 / 100, psc=2350, vsc=4 / 100 ) for ph in ("ba", "nc", "anb", "nabc", "acb"): with pytest.raises(RoseauLoadFlowException) as e: diff --git a/roseau/load_flow/models/tests/test_transformer_parameters.py b/roseau/load_flow/models/tests/test_transformer_parameters.py index fff13a2a..952c76be 100644 --- a/roseau/load_flow/models/tests/test_transformer_parameters.py +++ b/roseau/load_flow/models/tests/test_transformer_parameters.py @@ -18,11 +18,11 @@ def test_transformer_parameters(): "psc": 1350.0, # W "p0": 145.0, # W "i0": 1.8 / 100, # % - "us": 400, # V - "up": 20000, # V + "ulv": 400, # V + "uhv": 20000, # V "sn": 50 * 1e3, # VA "vsc": 4 / 100, # % - "type": "yzn11", + "vg": "yzn11", } tp = TransformerParameters.from_dict(data) @@ -48,11 +48,11 @@ def test_transformer_parameters(): "psc": 2150.0, # W "p0": 210.0, # W "i0": 3.5 / 100, # % - "us": 400, # V - "up": 20000, # V + "ulv": 400, # V + "uhv": 20000, # V "sn": 100 * 1e3, # VA "vsc": 4 / 100, # % - "type": "dyn11", + "vg": "dyn11", } tp = TransformerParameters.from_dict(data) r_iron = 3 * 20e3**2 / 210 # Ohm @@ -77,11 +77,11 @@ def test_transformer_parameters(): "psc": 2350.0, # W "p0": 460.0, # W "i0": 5.6 / 100, # % - "us": 400, # V - "up": 20000, # V + "ulv": 400, # V + "uhv": 20000, # V "sn": 160 * 1e3, # VA "vsc": 4 / 100, # % - "type": "dyn5", + "vg": "dyn5", } tp = TransformerParameters.from_dict(data) r_iron = 3 * 20e3**2 / 460 # Ohm @@ -106,28 +106,62 @@ def test_transformer_parameters(): "psc": 2350.0, # W "p0": 460.0, # W "i0": 5.6 / 100, # % - "us": 400, # V - "up": 20000, # V + "ulv": 400, # V + "uhv": 20000, # V "sn": 160 * 1e3, # VA "vsc": 4 / 100, # % - "type": "dtotoyn11", + "vg": "dtotoyn11", } with pytest.raises(RoseauLoadFlowException) as e: TransformerParameters.from_dict(data) - assert "Transformer windings cannot be extracted from the string" in e.value.msg + assert e.value.msg.startswith("Invalid vector group: 'dtotoyn11'. Expected one of ['Dd0'") assert e.value.code == RoseauLoadFlowExceptionCode.BAD_TRANSFORMER_WINDINGS + # UHV == ULV... + data = { + "id": "test", + "psc": 2350.0, # W + "p0": 460.0, # W + "i0": 5.6 / 100, # % + "ulv": 400, # V + "uhv": 400, # V + "sn": 160 * 1e3, # VA + "vsc": 4 / 100, # % + "vg": "dyn11", + } + TransformerParameters.from_dict(data) + + # UHV < ULV... + data = { + "id": "test", + "psc": 2350.0, # W + "p0": 460.0, # W + "i0": 5.6 / 100, # % + "ulv": 400.0045, # V + "uhv": np.int64(350), # V + "sn": 160 * 1e3, # VA + "vsc": 4 / 100, # % + "vg": "dyn11", + } + with pytest.raises(RoseauLoadFlowException) as e: + TransformerParameters.from_dict(data) + assert e.value.msg == ( + "Transformer parameters 'test' has the low voltage higher than the high voltage: " + "uhv=350 V and ulv=400.0045 V." + ) + assert e.value.code == RoseauLoadFlowExceptionCode.BAD_TRANSFORMER_VOLTAGES + # Bad i0 data = { "id": "test", "psc": 2350.0, # W "p0": 460.0, # W "i0": 5.6, # % - "us": 400, # V - "up": 20000, # V + "ulv": 400, # V + "uhv": 20000, # V "sn": 160 * 1e3, # VA "vsc": 4 / 100, # % - "type": "dyn11", + "vg": "dyn11", } with pytest.raises(RoseauLoadFlowException) as e: TransformerParameters.from_dict(data) @@ -140,11 +174,11 @@ def test_transformer_parameters(): "psc": 2350.0, # W "p0": 460.0, # W "i0": 5.6 / 100, # % - "us": 400, # V - "up": 20000, # V + "ulv": 400, # V + "uhv": 20000, # V "sn": 160 * 1e3, # VA "vsc": 4, # % - "type": "dyn11", + "vg": "dyn11", } with pytest.raises(RoseauLoadFlowException) as e: TransformerParameters.from_dict(data) @@ -154,10 +188,10 @@ def test_transformer_parameters(): # Bad l2_omega data = { "id": "test", - "type": "Dyn11", + "vg": "Dyn11", "sn": 50000.0, - "up": 20000.0, - "us": 400.0, + "uhv": 20000.0, + "ulv": 400.0, "i0": 0.027, "p0": 210.0, "psc": 2150.0, @@ -176,24 +210,24 @@ def test_transformers_parameters_units(): "id": "Yzn11 - 50kVA", "z2": Q_(8.64 + 9.444j, "centiohm"), # Ohm "ym": Q_(0.3625 - 2.2206j, "uS"), # S - "us": Q_(400, "V"), # V - "up": Q_(20, "kV"), # V + "ulv": Q_(400, "V"), # V + "uhv": Q_(20, "kV"), # V "sn": Q_(50, "kVA"), # VA - "type": "yzn11", + "vg": "yzn11", } tp = TransformerParameters(**data) assert np.isclose(tp._z2, (0.0864 + 0.0944406692j)) assert np.isclose(tp._ym, (3.625e-07 - 2.2206e-06j)) - assert np.isclose(tp._us, 400) - assert np.isclose(tp._up, 20000) + assert np.isclose(tp._ulv, 400) + assert np.isclose(tp._uhv, 20000) assert np.isclose(tp._sn, 50e3) # Bad unit for each of them for param, fake_quantity in ( ("z2", Q_(1350.0, "A")), ("ym", Q_(145.0, "A")), - ("us", Q_(400, "A")), - ("up", Q_(20, "A")), + ("ulv", Q_(400, "A")), + ("uhv", Q_(20, "A")), ("sn", Q_(50, "A")), ): copy_data = data.copy() @@ -212,18 +246,18 @@ def test_transformers_parameters_units_from_tests(): "psc": Q_(1350.0, "W"), # W "p0": Q_(145.0, "W"), # W "i0": Q_(1.8, "percent"), # % - "us": Q_(400, "V"), # V - "up": Q_(20, "kV"), # V + "ulv": Q_(400, "V"), # V + "uhv": Q_(20, "kV"), # V "sn": Q_(50, "kVA"), # VA "vsc": Q_(4, "percent"), # % - "type": "yzn11", + "vg": "yzn11", } tp = TransformerParameters.from_open_and_short_circuit_tests(**data) assert np.isclose(tp._psc, 1350.0) assert np.isclose(tp._p0, 145.0) assert np.isclose(tp._i0, 1.8e-2) - assert np.isclose(tp._us, 400) - assert np.isclose(tp._up, 20000) + assert np.isclose(tp._ulv, 400) + assert np.isclose(tp._uhv, 20000) assert np.isclose(tp._sn, 50e3) assert np.isclose(tp._vsc, 4e-2) @@ -232,8 +266,8 @@ def test_transformers_parameters_units_from_tests(): ("psc", Q_(1350.0, "A")), ("p0", Q_(145.0, "A")), ("i0", Q_(1.8 / 100, "A")), - ("us", Q_(400, "A")), - ("up", Q_(20, "A")), + ("ulv", Q_(400, "A")), + ("uhv", Q_(20, "A")), ("sn", Q_(50, "A")), ("vsc", Q_(4 / 100, "A")), ): @@ -246,9 +280,28 @@ def test_transformers_parameters_units_from_tests(): def test_transformer_type(): - valid_windings = ("y", "yn", "z", "zn", "d") + valid_windings1 = ("y", "yn", "d", "i") + valid_windings2 = ("y", "yn", "z", "zn", "d", "i", "ii") valid_phase_displacements = (0, 5, 6, 11) - valid_types = {"dd", "yy", "yny", "yyn", "ynyn", "dz", "dzn", "dy", "dyn", "yd", "ynd", "yz", "ynz", "yzn", "ynzn"} + valid_types = { + "dd", + "yy", + "yny", + "yyn", + "ynyn", + "dz", + "dzn", + "dy", + "dyn", + "yd", + "ynd", + "yz", + "ynz", + "yzn", + "ynzn", + "ii", + "iii", + } valid_full_types = { "dd0", "dd6", @@ -280,31 +333,35 @@ def test_transformer_type(): "yzn11", "ynzn5", "ynzn11", + "ii0", + "ii6", + "iii0", + "iii6", } - for winding1 in valid_windings: - for winding2 in valid_windings: - t = f"{winding1}{winding2}" - if t in valid_types: + for winding1 in valid_windings1: + for winding2 in valid_windings2: + vg = f"{winding1}{winding2}" + if vg in valid_types: with pytest.raises(RoseauLoadFlowException) as e: - TransformerParameters.extract_windings(t) - assert "Transformer windings cannot be extracted from the string" in e.value.msg + TransformerParameters.extract_windings(vg) + assert e.value.msg.startswith(f"Invalid vector group: '{vg}'. Expected one of ['Dd0'") assert e.value.code == RoseauLoadFlowExceptionCode.BAD_TRANSFORMER_WINDINGS for phase_displacement in valid_phase_displacements: - t = f"{winding1}{winding2}{phase_displacement}" - if t in valid_full_types: - w1, w2, p = TransformerParameters.extract_windings(t) + vg = f"{winding1}{winding2}{phase_displacement}" + if vg in valid_full_types: + w1, w2, p = TransformerParameters.extract_windings(vg) assert w1 == winding1.upper() assert w2 == winding2 assert p == phase_displacement else: with pytest.raises(RoseauLoadFlowException) as e: - TransformerParameters.extract_windings(t) + TransformerParameters.extract_windings(vg) assert e.value.code == RoseauLoadFlowExceptionCode.BAD_TRANSFORMER_WINDINGS else: with pytest.raises(RoseauLoadFlowException) as e: - TransformerParameters.extract_windings(t) - assert "Transformer windings cannot be extracted from the string" in e.value.msg + TransformerParameters.extract_windings(vg) + assert e.value.msg.startswith(f"Invalid vector group: '{vg}'. Expected one of ['Dd0'") assert e.value.code == RoseauLoadFlowExceptionCode.BAD_TRANSFORMER_WINDINGS @@ -334,12 +391,15 @@ def test_catalogue_data(): assert tp.id in catalogue_data.index, error_message # Check the values are the same - assert tp.type == catalogue_data.at[tp.id, "type"] - assert np.isclose(tp.up.m, catalogue_data.at[tp.id, "up"]) - assert np.isclose(tp.us.m, catalogue_data.at[tp.id, "us"]) + assert tp.vg == catalogue_data.at[tp.id, "vg"] + assert np.isclose(tp.uhv.m, catalogue_data.at[tp.id, "uhv"]) + assert np.isclose(tp.ulv.m, catalogue_data.at[tp.id, "ulv"]) assert np.isclose(tp.sn.m, catalogue_data.at[tp.id, "sn"]) assert np.isclose(tp.p0.m, catalogue_data.at[tp.id, "p0"]) - assert np.isclose(tp.i0.m, catalogue_data.at[tp.id, "i0"]) + if pd.isna(tp.i0.m): + assert pd.isna(catalogue_data.at[tp.id, "i0"]) + else: + assert np.isclose(tp.i0.m, catalogue_data.at[tp.id, "i0"]) assert np.isclose(tp.psc.m, catalogue_data.at[tp.id, "psc"]) assert np.isclose(tp.vsc.m, catalogue_data.at[tp.id, "vsc"]) assert tp.manufacturer == catalogue_data.at[tp.id, "manufacturer"] @@ -355,24 +415,30 @@ def test_catalogue_data(): def test_from_catalogue(): # Unknown strings - for field_name in ("name", "manufacturer", "range", "efficiency", "type"): + for field_name, display_name in ( + ("name", "name"), + ("manufacturer", "manufacturer"), + ("range", "range"), + ("efficiency", "efficiency"), + ("vg", "vector group"), + ): # String with pytest.raises(RoseauLoadFlowException) as e: TransformerParameters.from_catalogue(**{field_name: "unknown"}) - assert e.value.msg.startswith(f"No {field_name} matching 'unknown' has been found. Available ") + assert e.value.msg.startswith(f"No {display_name} matching 'unknown' has been found. Available ") assert e.value.code == RoseauLoadFlowExceptionCode.CATALOGUE_NOT_FOUND # Regexp with pytest.raises(RoseauLoadFlowException) as e: TransformerParameters.from_catalogue(**{field_name: r"unknown[a-z]+"}) - assert e.value.msg.startswith(f"No {field_name} matching 'unknown[a-z]+' has been found. Available ") + assert e.value.msg.startswith(f"No {display_name} matching 'unknown[a-z]+' has been found. Available ") assert e.value.code == RoseauLoadFlowExceptionCode.CATALOGUE_NOT_FOUND # Unknown floats for field_name, display_name, display_unit in ( ("sn", "nominal power", "kVA"), - ("up", "primary side voltage", "kV"), - ("us", "secondary side voltage", "kV"), + ("uhv", "high voltage", "kV"), + ("ulv", "low voltage", "kV"), ): # Without unit with pytest.raises(RoseauLoadFlowException) as e: @@ -388,18 +454,17 @@ def test_from_catalogue(): # Several transformers with pytest.raises(RoseauLoadFlowException) as e: - TransformerParameters.from_catalogue(type=r"yzn.*", sn=50e3) + TransformerParameters.from_catalogue(vg=r"yzn.*", efficiency="A0Ak", sn=50e3) assert e.value.msg == ( - "Several transformers matching the query (type='yzn.*', nominal power=50.0 kVA) have been " - "found: 'SE_Minera_A0Ak_50kVA', 'SE_Minera_B0Bk_50kVA', 'SE_Minera_C0Bk_50kVA', " - "'SE_Minera_Standard_50kVA'." + "Several transformers matching the query (efficiency='A0Ak', vg='yzn.*', sn=50.0 kVA) have been found: " + "'SE Minera A0Ak 50kVA 15/20kV(20) 410V Yzn11', 'SE Minera A0Ak 50kVA 15/20kV(15) 410V Yzn11'." ) assert e.value.code == RoseauLoadFlowExceptionCode.CATALOGUE_SEVERAL_FOUND # Success - tp = TransformerParameters.from_catalogue(name="SE_Minera_AA0Ak_160kVA") - assert tp.id == "SE_Minera_AA0Ak_160kVA" - tp = TransformerParameters.from_catalogue(name="SE_Minera_AA0Ak_160kVA", id="tp-test1") + tp = TransformerParameters.from_catalogue(name="SE Minera AA0Ak 160kVA 20kV 410V Dyn11") + assert tp.id == "SE Minera AA0Ak 160kVA 20kV 410V Dyn11" + tp = TransformerParameters.from_catalogue(name="SE Minera AA0Ak 160kVA 20kV 410V Dyn11", id="tp-test1") assert tp.id == "tp-test1" @@ -407,52 +472,52 @@ def test_get_catalogue(): # Get the entire catalogue catalogue = TransformerParameters.get_catalogue() assert isinstance(catalogue, pd.DataFrame) - assert catalogue.shape == (162, 7) + assert catalogue.shape == (309, 9) # Filter on a single attribute - for field_name, value, expected_size in ( - ("name", "SE_Minera_A0Ak_50kVA", 1), - ("manufacturer", "SE", 148), - ("range", r"min.*", 67), - ("efficiency", r"c0.*", 29), - ("type", r"dy.*", 158), - ("sn", Q_(160, "kVA"), 12), - ("up", Q_(20, "kV"), 162), - ("us", 400, 162), - ): + for field_name, value, expected_size in [ + ("name", "SE Minera A0Ak 50kVA 15/20kV(20) 410V Yzn11", 1), + ("manufacturer", "SE", 259), + ("range", r"min.*", 123), + ("efficiency", r"c0.*", 58), + ("vg", r"dy.*", 297), + ("sn", Q_(160, "kVA"), 19), + ("uhv", Q_(20, "kV"), 172), + ("ulv", 400, 51), + ]: filtered_catalogue = TransformerParameters.get_catalogue(**{field_name: value}) - assert filtered_catalogue.shape == (expected_size, 7), f"{field_name}={value!r}" + assert filtered_catalogue.shape == (expected_size, 9), f"{field_name}={value!r}" # Filter on two attributes - for field_name, value, expected_size in ( - ("name", "SE_Minera_A0Ak_50kVA", 1), - ("range", "minera", 67), - ("efficiency", r"c0.*", 29), - ("type", r"^d.*11$", 144), - ("sn", Q_(160, "kVA"), 11), - ("up", Q_(20, "kV"), 148), - ("us", 400, 148), - ): + for field_name, value, expected_size in [ + ("name", "SE Minera A0Ak 50kVA 15/20kV(20) 410V Yzn11", 1), + ("range", "minera", 123), + ("efficiency", r"c0.*", 58), + ("vg", r"^d.*11$", 247), + ("sn", Q_(160, "kVA"), 17), + ("uhv", Q_(20, "kV"), 158), + ("ulv", 400, 1), + ]: filtered_catalogue = TransformerParameters.get_catalogue(**{field_name: value}, manufacturer="se") - assert filtered_catalogue.shape == (expected_size, 7), f"{field_name}={value!r}" + assert filtered_catalogue.shape == (expected_size, 9), f"{field_name}={value!r}" # Filter on three attributes - for field_name, value, expected_size in ( - ("name", "se_VEGETA_C0BK_3150kva", 1), - ("efficiency", r"c0[abc]k", 15), - ("type", r"dyn\d+", 41), - ("sn", Q_(160, "kVA"), 3), - ("up", Q_(20, "kV"), 41), - ("us", 400, 41), - ): + for field_name, value, expected_size in [ + ("name", "se VEGETA C0BK 3150kva 15/20Kv(20) 410v dyn11", 1), + ("efficiency", r"c0[abc]k", 30), + ("vg", r"dyn\d+", 71), + ("sn", Q_(160, "kVA"), 5), + ("uhv", Q_(20, "kV"), 41), + ("ulv", 400, 0), + ]: filtered_catalogue = TransformerParameters.get_catalogue( **{field_name: value}, manufacturer="se", range=r"^vegeta$" ) - assert filtered_catalogue.shape == (expected_size, 7), f"{field_name}={value!r}" + assert filtered_catalogue.shape == (expected_size, 9), f"{field_name}={value!r}" # No results - empty_catalogue = TransformerParameters.get_catalogue(us=250) - assert empty_catalogue.shape == (0, 7) + empty_catalogue = TransformerParameters.get_catalogue(ulv=250) + assert empty_catalogue.shape == (0, 9) def test_from_open_dss(): @@ -483,17 +548,14 @@ def test_from_open_dss(): ~ wdg=1 bus=MVbusname kV=33 kVA=1800 conn=delta ~ Wdg=2 bus=LVBusname.1.2.3.4 kV=0.405 kVA=1800 conn=wye ~ %Loadloss=0.902 %imag=0.3 %noload=.136 LeadLag=Euro - - // Neutral reactor - New Reactor.5-ohm phases=1 bus=LVBusname.4 R=0 X=5 """ sn = Q_(1800, "kVA") tp_rlf = TransformerParameters.from_open_and_short_circuit_tests( id="tp-test", # Electrical parameters - type="Dyn11", - up=Q_(33, "kV"), - us=Q_(0.405, "kV"), + vg="Dyn11", + uhv=Q_(33, "kV"), + ulv=Q_(0.405, "kV"), sn=sn, p0=Q_(0.136, "percent") * sn, i0=Q_(0.3, "percent"), @@ -523,8 +585,9 @@ def test_from_open_dss(): ) # Electrical parameters - assert tp_rlf.up == tp_dss.up - assert tp_rlf.us == tp_dss.us + assert tp_rlf.vg == tp_dss.vg + assert tp_rlf.uhv == tp_dss.uhv + assert tp_rlf.ulv == tp_dss.ulv assert tp_rlf.sn == tp_dss.sn assert tp_rlf.k == tp_dss.k assert tp_rlf.orientation == tp_dss.orientation @@ -561,9 +624,9 @@ def test_from_power_factory(): tp_rlf = TransformerParameters.from_open_and_short_circuit_tests( id="Transformer 100 kVA Dyn11", # Electrical parameters - type="Dyn11", - up=Q_(20, "kV"), - us=Q_(0.4, "kV"), + vg="Dyn11", + uhv=Q_(20, "kV"), + ulv=Q_(0.4, "kV"), sn=Q_(0.1, "MVA"), p0=Q_(0.21, "kW"), i0=Q_(2.5, "percent"), @@ -576,8 +639,8 @@ def test_from_power_factory(): ) # Electrical parameters - assert tp_pwf.up == tp_rlf.up - assert tp_pwf.us == tp_rlf.us + assert tp_pwf.uhv == tp_rlf.uhv + assert tp_pwf.ulv == tp_rlf.ulv assert tp_pwf.sn == tp_rlf.sn assert tp_pwf.k == tp_rlf.k assert tp_pwf.orientation == tp_rlf.orientation @@ -609,7 +672,8 @@ def test_from_power_factory(): range="Tech+", efficiency="Wonderful", ) - assert tp_pwf.type == "single" + assert tp_pwf.type == "single-phase" + assert tp_pwf.vg == "Ii0" # Bad technology with pytest.raises(RoseauLoadFlowException) as e: @@ -641,7 +705,7 @@ def test_from_power_factory(): def test_to_dict(): # No results to export - tp = TransformerParameters.from_catalogue(name="SE_Minera_A0Ak_100kVA", manufacturer="SE") + tp = TransformerParameters.from_catalogue(name="SE Minera A0Ak 100kVA 15/20kV(20) 410V Dyn11") with pytest.raises(RoseauLoadFlowException) as e: tp.results_to_dict() assert e.value.msg == "The TransformerParameters has no results to export." @@ -650,9 +714,9 @@ def test_to_dict(): # All the options for to_dict: no short-circuit data but Optional data tp2 = TransformerParameters( id=tp.id, - type=tp.type, - up=tp.up, - us=tp.us, + vg=tp.vg, + uhv=tp.uhv, + ulv=tp.ulv, sn=tp.sn, z2=tp.z2, ym=tp.ym, @@ -663,9 +727,9 @@ def test_to_dict(): d = tp2.to_dict() assert d.pop("id") == tp2.id assert d.pop("sn") == tp2.sn.m - assert d.pop("up") == tp2.up.m - assert d.pop("us") == tp2.us.m - assert d.pop("type") == tp2.type + assert d.pop("uhv") == tp2.uhv.m + assert d.pop("ulv") == tp2.ulv.m + assert d.pop("vg") == tp2.vg assert d.pop("z2") == [tp2.z2.m.real, tp2.z2.m.imag] assert d.pop("ym") == [tp2.ym.m.real, tp2.ym.m.imag] assert d.pop("manufacturer") == tp2.manufacturer @@ -683,10 +747,10 @@ def test_equality(): "id": "Yzn11 - 50kVA", "z2": Q_(8.64 + 9.444j, "centiohm"), # Ohm "ym": Q_(0.3625 - 2.2206j, "uS"), # S - "us": Q_(400, "V"), # V - "up": Q_(20, "kV"), # V + "ulv": Q_(400, "V"), # V + "uhv": Q_(20, "kV"), # V "sn": Q_(50, "kVA"), # VA - "type": "yzn11", + "vg": "yzn11", "manufacturer": "Roseau", "range": "Tech+", "efficiency": "Extraordinary", @@ -701,10 +765,10 @@ def test_equality(): "id": "Dyn11 - 49kVA", "z2": Q_(8.63 + 9.444j, "centiohm"), # Ohm "ym": Q_(0.48 - 2.2206j, "uS"), # S - "us": Q_(399, "V"), # V - "up": Q_(19, "kV"), # V + "ulv": Q_(399, "V"), # V + "uhv": Q_(19, "kV"), # V "sn": Q_(49, "kVA"), # VA - "type": "dyn11", + "vg": "dyn11", "manufacturer": "Roso", "range": "Tech-", "efficiency": "Less extraordinary", @@ -719,7 +783,7 @@ def test_equality(): @pytest.mark.no_patch_engine def test_compute_open_short_circuit_parameters(): - tp = TransformerParameters.from_catalogue(name="SE_Minera_A0Ak_100kVA", manufacturer="SE") + tp = TransformerParameters.from_catalogue(name="SE Minera A0Ak 100kVA 15/20kV(20) 410V Dyn11") p0, i0 = tp._compute_open_circuit_parameters() assert np.isclose(p0.m, tp.p0.m) assert np.isclose(i0.m, tp.i0.m) @@ -732,10 +796,10 @@ def test_compute_open_short_circuit_parameters(): def test_ideal_transformer(): # Ideal transformer not yet supported with pytest.raises(RoseauLoadFlowException) as e: - TransformerParameters(id="test", type="Dyn11", sn=50e3, up=20e3, us=400, z2=0.0, ym=0.0) + TransformerParameters(id="test", vg="Dyn11", sn=50e3, uhv=20e3, ulv=400, z2=0.0, ym=0.0) assert e.value.msg == ( - "Transformer type 'test' has a null series impedance z2. Ideal transformers are not supported." + "Transformer parameters 'test' has a null series impedance z2. Ideal transformers are not supported yet." ) assert e.value.code == RoseauLoadFlowExceptionCode.BAD_TRANSFORMER_IMPEDANCE # OK - TransformerParameters(id="test", type="Dyn11", sn=50e3, up=20e3, us=400, z2=0.0000001, ym=0.0) + TransformerParameters(id="test", vg="Dyn11", sn=50e3, uhv=20e3, ulv=400, z2=0.0000001, ym=0.0) diff --git a/roseau/load_flow/models/tests/test_transformers.py b/roseau/load_flow/models/tests/test_transformers.py index 005d5506..70b4ed49 100644 --- a/roseau/load_flow/models/tests/test_transformers.py +++ b/roseau/load_flow/models/tests/test_transformers.py @@ -2,11 +2,12 @@ import pytest from roseau.load_flow import Q_, RoseauLoadFlowException, RoseauLoadFlowExceptionCode +from roseau.load_flow import PositiveSequence as PosSeq from roseau.load_flow.models import Bus, Transformer, TransformerParameters def test_max_power(): - tp = TransformerParameters.from_catalogue(name="FT_Standard_Standard_100kVA") + tp = TransformerParameters.from_catalogue(name="FT 100kVA 15/20kV(20) 400V Dyn11") assert tp.sn == Q_(100, "kVA") bus1 = Bus(id="bus1", phases="abc") @@ -24,7 +25,7 @@ def test_max_loading(): bus1 = Bus(id="bus1", phases="abc") bus2 = Bus(id="bus2", phases="abc") tp = TransformerParameters.from_open_and_short_circuit_tests( - id="tp", psc=1350.0, p0=145.0, i0=1.8 / 100, us=400, up=20000, sn=50 * 1e3, vsc=4 / 100, type="yzn11" + id="tp", psc=1350.0, p0=145.0, i0=1.8 / 100, ulv=400, uhv=20000, sn=50 * 1e3, vsc=4 / 100, vg="yzn11" ) transformer = Transformer(id="transformer", bus1=bus1, bus2=bus2, parameters=tp) @@ -44,15 +45,13 @@ def test_res_violated(): bus1 = Bus(id="bus1", phases="abc") bus2 = Bus(id="bus2", phases="abcn") tp = TransformerParameters.from_open_and_short_circuit_tests( - id="tp", psc=1350.0, p0=145.0, i0=1.8 / 100, us=400, up=20000, sn=50 * 1e3, vsc=4 / 100, type="yzn11" + id="tp", psc=1350.0, p0=145.0, i0=1.8 / 100, ulv=400, uhv=20000, sn=50 * 1e3, vsc=4 / 100, vg="yzn11" ) transformer = Transformer(id="transformer", bus1=bus1, bus2=bus2, parameters=tp) - direct_seq = np.exp([0, -2 / 3 * np.pi * 1j, 2 / 3 * np.pi * 1j]) - direct_seq_neutral = np.concatenate([direct_seq, [0]]) - bus1._res_potentials = 20_000 * direct_seq - bus2._res_potentials = 230 * direct_seq_neutral - transformer._res_currents = 0.8 * direct_seq, -65 * direct_seq_neutral + bus1._res_potentials = 20_000 * PosSeq + bus2._res_potentials = np.concatenate([230 * PosSeq, [0]]) + transformer._res_currents = 0.8 * PosSeq, np.concatenate([-65 * PosSeq, [0]]) # Default value assert transformer.max_loading == Q_(1, "") @@ -61,38 +60,36 @@ def test_res_violated(): # No constraint violated transformer.max_loading = 1 assert transformer.res_violated is False - assert np.allclose(transformer.res_loading, 0.8 * 20 * 3 / 50) + np.testing.assert_allclose(transformer.res_loading.m, 0.8 * 20 * 3 / 50) # Two violations transformer.max_loading = 4 / 5 assert transformer.res_violated is True - assert np.allclose(transformer.res_loading, 0.8 * 20 * 3 / 40) + np.testing.assert_allclose(transformer.res_loading.m, 0.8 * 20 * 3 / 40) # Primary side violation transformer.max_loading = Q_(45, "%") assert transformer.res_violated is True - assert np.allclose(transformer.res_loading, 0.8 * 20 * 3 / (50 * 0.45)) + np.testing.assert_allclose(transformer.res_loading.m, 0.8 * 20 * 3 / (50 * 0.45)) # Secondary side violation transformer.max_loading = 1 - transformer._res_currents = 0.8 * direct_seq, -80 * direct_seq_neutral + transformer._res_currents = 0.8 * PosSeq, np.concatenate([-80 * PosSeq, [0]]) assert transformer.res_violated is True - assert np.allclose(transformer.res_loading, 80 * 230 * 3 / 50_000) + np.testing.assert_allclose(transformer.res_loading.m, 80 * 230 * 3 / 50_000) def test_transformer_results(): bus1 = Bus(id="bus1", phases="abc") bus2 = Bus(id="bus2", phases="abcn") tp = TransformerParameters.from_open_and_short_circuit_tests( - id="tp", psc=1350, p0=145, i0=0.018, us=400, up=20e3, sn=50e3, vsc=0.04, type="yzn11" + id="tp", psc=1350, p0=145, i0=0.018, ulv=400, uhv=20e3, sn=50e3, vsc=0.04, vg="yzn11" ) transformer = Transformer(id="transformer", bus1=bus1, bus2=bus2, parameters=tp) - direct_seq = np.exp([0, -2 / 3 * np.pi * 1j, 2 / 3 * np.pi * 1j]) - direct_seq_neutral = np.concatenate([direct_seq, [0]]) - bus1._res_potentials = 20_000 * direct_seq - bus2._res_potentials = 230 * direct_seq_neutral - transformer._res_currents = 0.8 * direct_seq, -65 * direct_seq_neutral + bus1._res_potentials = 20_000 * PosSeq + bus2._res_potentials = np.concatenate([230 * PosSeq, [0]]) + transformer._res_currents = 0.8 * PosSeq, np.concatenate([-65 * PosSeq, [0]]) res_p1, res_p2 = (p.m for p in transformer.res_powers) diff --git a/roseau/load_flow/models/transformers/parameters.py b/roseau/load_flow/models/transformers/parameters.py index 77fb1517..3ea5e35c 100644 --- a/roseau/load_flow/models/transformers/parameters.py +++ b/roseau/load_flow/models/transformers/parameters.py @@ -2,18 +2,16 @@ import re from importlib import resources from pathlib import Path -from typing import Literal, NoReturn +from typing import Final, Literal, NoReturn import numpy as np import pandas as pd -import regex -from typing_extensions import Self, deprecated +from typing_extensions import Self from roseau.load_flow.exceptions import RoseauLoadFlowException, RoseauLoadFlowExceptionCode from roseau.load_flow.typing import FloatArrayLike1D, Id, JsonDict from roseau.load_flow.units import Q_, ureg_wraps from roseau.load_flow.utils import CatalogueMixin, Identifiable, JsonMixin -from roseau.load_flow.utils.constants import PositiveSequence logger = logging.getLogger(__name__) @@ -21,27 +19,31 @@ class TransformerParameters(Identifiable, JsonMixin, CatalogueMixin[pd.DataFrame]): """Parameters that define electrical models of transformers.""" - _EXTRACT_WINDINGS_RE = regex.compile( - "(?(DEFINE)(?Pyn?)(?Pd)(?Pzn?)(?P[06])" - "(?P5|11))" - "" - "(?|(?P(?&y_winding))(?P(?&y_winding))(?P

(?&p_set_1))" # yy - "|(?P(?&y_winding))(?P(?&d_winding))(?P

(?&p_set_2))" # yd - "|(?P(?&y_winding))(?P(?&z_winding))(?P

(?&p_set_2))" # yz - "|(?P(?&d_winding))(?P(?&z_winding))(?P

(?&p_set_1))" # dz - "|(?P(?&d_winding))(?P(?&y_winding))(?P

(?&p_set_2))" # dy - "|(?P(?&d_winding))(?P(?&d_winding))(?P

(?&p_set_1)))", # dd - regex.IGNORECASE, - ) - """The pattern to extract the winding of the primary and of the secondary of the transformer.""" + # fmt: off + allowed_vector_groups: Final = { + # Three-phase + "Dd0", "Dd6", # Delta-delta + "Yy0", "Yy6", "Yyn0", "Yyn6", "Yny0", "Yny6", "Ynyn0", "Ynyn6", # Wye-wye + "Dy5", "Dy11", "Dyn5", "Dyn11", # Delta-wye + "Dz0", "Dz6", "Dzn0", "Dzn6", # Delta-zigzag + "Yd5", "Yd11", "Ynd5", "Ynd11", # Wye-delta + "Yz5", "Yz11", "Yzn5", "Yzn11", "Ynz5", "Ynz11", "Ynzn5", "Ynzn11", # Wye-zigzag + # Single-phase + "Ii0", "Ii6", + # Center-tapped + "Iii0", "Iii6", + } + """Allowed vector groups for transformers.""" + # fmt: on @ureg_wraps(None, (None, None, None, "V", "V", "VA", "ohm", "S", None, None, None)) def __init__( self, id: Id, - type: str, - up: float | Q_[float], - us: float | Q_[float], + *, + vg: str, + uhv: float | Q_[float], + ulv: float | Q_[float], sn: float | Q_[float], z2: complex | Q_[complex], ym: complex | Q_[complex], @@ -55,16 +57,23 @@ def __init__( id: A unique ID of the transformer parameters, typically its canonical name. - type: - The type of transformer parameters. It can be "single" for single-phase transformers, "center" for - center-tapped transformers, or the name of the windings such as "Dyn11" for three-phase transformers. - Allowed windings are "D" for delta, "Y" for wye (star), and "Z" for zigzag. + vg: + The vector group of the transformer. + + For three-phase transformers, ``Dyn11`` denotes a delta-wye connection with -30° phase + displacement. Allowed windings are ``D`` for delta, ``Y`` for wye, ``Z`` for zigzag. - up: - Phase-to-phase nominal voltages of the primary side (V) + For single-phase transformers, ``Ii0`` denotes a normal in-phase connection and + ``Ii6`` denotes an inverted connection. - us: - Phase-to-phase nominal voltages of the secondary side (V) + For center-tapped transformers, ``Iii0`` denotes a normal in-phase connection and + ``Iii6`` denotes an inverted connection. + + uhv: + Rated phase-to-phase voltage of the HV side (V) + + ulv: + Rated no-load phase-to-phase voltage of the LV side (V) sn: The nominal power of the transformer (VA) @@ -76,55 +85,74 @@ def __init__( The magnetizing admittance located at the primary side of the transformer. manufacturer: - The name of the manufacturer for the transformer. Informative only, it has no impact on the load flow. + The name of the manufacturer for the transformer. Informative only, it has no impact + on the load flow. It is filled automatically when the parameters when imported from + the catalogue. range: - The name of the product range for the transformer. Informative only, it has no impact on the load flow. + The product range for the transformer as defined by the manufacturer. Informative + only, it has no impact on the load flow. It is filled automatically when the + parameters when imported from the catalogue. efficiency: - The efficiency class of the transformer. Informative only, it has no impact on the load flow. + The efficiency class of the transformer. Informative only, it has no impact on the + load flow. It is filled automatically when the parameters when imported from the + catalogue. The efficiency class used in the catalogue follows the `Eco-Design` + requirements as defined by the `EN 50629` standard. """ super().__init__(id) # Check + if uhv < ulv: + msg = ( + f"Transformer parameters {id!r} has the low voltage higher than the high voltage: " + f"uhv={uhv!s} V and ulv={ulv!s} V." + ) + logger.error(msg) + raise RoseauLoadFlowException(msg=msg, code=RoseauLoadFlowExceptionCode.BAD_TRANSFORMER_VOLTAGES) if np.isclose(z2, 0.0): - msg = f"Transformer type {id!r} has a null series impedance z2. Ideal transformers are not supported." + msg = ( + f"Transformer parameters {id!r} has a null series impedance z2. Ideal transformers " + f"are not supported yet." + ) logger.error(msg) raise RoseauLoadFlowException(msg=msg, code=RoseauLoadFlowExceptionCode.BAD_TRANSFORMER_IMPEDANCE) + # Extract the windings of the primary and the secondary of the transformer + winding1, winding2, phase_displacement = self.extract_windings(vg=vg) + w1, w2 = winding1[0], winding2[0] + + self._vg: str = vg self._sn: float = sn - self._up: float = up - self._us: float = us + self._uhv: float = uhv + self._ulv: float = ulv self._z2: complex = z2 self._ym: complex = ym - self._manufacturer: str = manufacturer - self._range: str = range - self._efficiency: str = efficiency - - if type in ("single", "center"): - winding1 = winding2 = phase_displacement = None - else: - # Extract the windings of the primary and the secondary of the transformer - winding1, winding2, phase_displacement = self.extract_windings(string=type) - - assert phase_displacement in {0, 5, 6, 11}, phase_displacement - # Change the voltages if the reference voltages is phase-to-neutral - w1, w2 = winding1[0].upper(), winding2[0].lower() - if w1 == "Y": - up /= np.sqrt(3.0) - elif w1 == "Z": - up /= 3.0 - if w2 == "y": - us /= np.sqrt(3.0) - elif w2 == "z": - us /= 3.0 - - self._k: float = us / up + self._manufacturer: str | None = manufacturer + self._range: str | None = range + self._efficiency: str | None = efficiency + + # Change the voltages if the reference voltages is phase-to-neutral + if w1 == "Y": + uhv /= np.sqrt(3.0) + elif w1 == "Z": + uhv /= 3.0 + if w2 == "y": + ulv /= np.sqrt(3.0) + elif w2 == "z": + ulv /= 3.0 + + n_of_winding = {"y": 4, "z": 4, "d": 3, "i": 2, "ii": 3} + n1 = n_of_winding[w1.lower()] + n2 = n_of_winding[w2.lower()] + + self._k: float = ulv / uhv self._orientation: float = -1.0 if phase_displacement in {5, 6} else 1.0 - self.winding1: str | None = winding1 - self.winding2: str | None = winding2 - self.phase_displacement: Literal[0, 5, 6, 11] | None = phase_displacement - self.type = type + self._n1: int = n1 + self._n2: int = n2 + self._winding1: str = winding1 + self._winding2: str = winding2 + self._phase_displacement: int = phase_displacement # Filled using alternative constructor `from_open_and_short_circuit_tests` self._p0: float | None = None @@ -133,10 +161,7 @@ def __init__( self._vsc: float | None = None def __repr__(self) -> str: - s = ( - f"<{type(self).__name__}: id={self.id!r}, type={self.type!r}, sn={self._sn}, up={self._up}, " - f"us={self._us}" - ) + s = f"<{type(self).__name__}: id={self.id!r}, vg={self._vg!r}, sn={self._sn}, uhv={self._uhv}, ulv={self._ulv}" for attr, val, tp in ( ("p0", self._p0, float), ("i0", self._i0, float), @@ -155,12 +180,12 @@ def __eq__(self, other: object) -> bool: if not isinstance(other, TransformerParameters): return NotImplemented else: - return ( + return bool( self.id == other.id - and self.type == other.type + and self._vg == other._vg and np.isclose(self._sn, other._sn) - and np.isclose(self._up, other._up) - and np.isclose(self._us, other._us) + and np.isclose(self._uhv, other._uhv) + and np.isclose(self._ulv, other._ulv) and np.isclose(self._z2, other._z2) and np.isclose(self._ym, other._ym) and self._manufacturer == other._manufacturer @@ -168,17 +193,75 @@ def __eq__(self, other: object) -> bool: and self._efficiency == other._efficiency ) + @property + def type(self) -> Literal["three-phase", "single-phase", "center-tapped"]: + """The type of transformer parameters. + + It can be ``three-phase``, ``single-phase`` or ``center-tapped``. + """ + if self._vg in ("Ii0", "Ii6"): + return "single-phase" + elif self._vg in ("Iii0", "Iii6"): + return "center-tapped" + else: + return "three-phase" + + @property + def vg(self) -> str: + """The vector group of the transformer. + + For three-phase transformers, ``Dyn11`` denotes a delta-wye connection with 30° lead phase + displacement. Allowed windings are ``D`` for delta, ``Y`` for wye, ``Z`` for zigzag. + + For single-phase transformers, ``Ii0`` denotes a normal in-phase connection and ``Ii6`` + denotes an inverted connection. + + For center-tapped transformers, ``Iii0`` denotes a normal in-phase connection and ``Iii6`` + denotes an inverted connection. + """ + return self._vg + + @property + def winding1(self) -> str: + """The primary winding of the transformer. + + The following values are used: + - ``D``: a Delta connection + - ``Y`` or ``Yn``: a Wye connection + - ``Z`` or ``Zn``: a Zigzag connection + - ``I``: single-phase + """ + return self._winding1 + + @property + def winding2(self) -> str: + """The secondary winding of the transformer. + + The following values are used: + - ``d``: a Delta connection + - ``y`` or ``yn``: a Wye connection + - ``z`` or ``zn``: a Zigzag connection + - ``i``: single-phase + - ``ii`` split-phase (i.e center-tapped) + """ + return self._winding2 + + @property + def phase_displacement(self) -> int: + """The phase rotation as indicated by the vector group.""" + return self._phase_displacement + @property @ureg_wraps("V", (None,)) - def up(self) -> Q_[float]: - """Phase-to-phase nominal voltages of the primary side (V).""" - return self._up + def uhv(self) -> Q_[float]: + """Rated phase-to-phase voltage of the HV side (V).""" + return self._uhv @property @ureg_wraps("V", (None,)) - def us(self) -> Q_[float]: - """Phase-to-phase nominal voltages of the secondary side (V).""" - return self._us + def ulv(self) -> Q_[float]: + """Rated no-load phase-to-phase voltage of the LV side (V).""" + return self._ulv @property @ureg_wraps("VA", (None,)) @@ -231,73 +314,62 @@ def vsc(self) -> Q_[float] | None: @property def manufacturer(self) -> str | None: - """The name of the manufacturer for the transformer. Informative only, it has no impact on the load flow.""" + """The name of the manufacturer for the transformer. + + Informative only, it has no impact on the load flow. It is filled automatically when the + parameters are imported from the catalogue. + """ return self._manufacturer @property def range(self) -> str | None: - """The name of the product range for the transformer. Informative only, it has no impact on the load flow.""" + """The product range for the transformer as defined by the manufacturer. + + Informative only, it has no impact on the load flow. It is filled automatically when the + parameters are imported from the catalogue. + """ return self._range @property def efficiency(self) -> str | None: - """The efficiency class of the transformer. Informative only, it has no impact on the load flow.""" - return self._efficiency - - @deprecated( - "The to_zyk method of TransformerParameters is deprecated. The parameters" - "`z2`, `ym`, `k`, and `orientation` are now accessible on the object directly", - category=FutureWarning, - ) - @ureg_wraps(("ohm", "S", "", None), (None,)) - def to_zyk(self) -> tuple[Q_[complex], Q_[complex], Q_[float], float]: - """Get the transformer parameters ``z2``, ``ym``, ``k`` and ``orientation`` mandatory for some models. - - Where: - * ``z2``: The series impedance of the transformer (Ohms). - * ``ym``: The magnetizing admittance of the transformer (Siemens). - * ``k``: The transformation ratio. - * ``orientation``: 1 for direct winding, -1 for reverse winding. + """The efficiency class of the transformer. - Returns: - The parameters (``z2``, ``ym``, ``k``, ``orientation``). + Informative only, it has no impact on the load flow. It is filled automatically when the + parameters imported from the catalogue. The efficiency class used in the catalogue follows + the `Eco-Design` requirements as defined by the `EN 50629` standard. """ - return self._z2, self._ym, self._k, self._orientation + return self._efficiency @classmethod def _compute_zy( - cls, type: str, up: float, us: float, sn: float, p0: float, i0: float, psc: float, vsc: float + cls, vg: str, uhv: float, ulv: float, sn: float, p0: float, i0: float, psc: float, vsc: float ) -> tuple[complex, complex]: - if type in ("single", "center"): - winding1, winding2 = None, None - else: - winding1, winding2, _ = cls.extract_windings(string=type) - winding1, winding2 = winding1[0].upper(), winding2[0].lower() + w1, w2, _ = cls.extract_windings(vg=vg) # Off-load test # Iron losses resistance (Ohm) if p0 > 0: - r_iron = up**2 / p0 + r_iron = uhv**2 / p0 y_iron = 1 / r_iron else: # no iron losses y_iron = 0 # Magnetizing inductance (Henry) * omega (rad/s) s0 = i0 * sn if s0 > p0: - lm_omega = up**2 / np.sqrt(s0**2 - p0**2) + lm_omega = uhv**2 / np.sqrt(s0**2 - p0**2) y_lm = 1 / (1j * lm_omega) else: # no magnetizing reactance y_lm = 0j ym = y_iron + y_lm # Short-circuit test - r2 = psc * (us / sn) ** 2 - l2_omega = np.sqrt((vsc * us**2 / sn) ** 2 - r2**2) + r2 = psc * (ulv / sn) ** 2 + l2_omega = np.sqrt((vsc * ulv**2 / sn) ** 2 - r2**2) z2 = r2 + 1j * l2_omega - if winding1 == "D": + if w1[0] == "D": ym /= 3 - if winding2 == "d": + if w2[0] == "d": z2 *= 3 return z2, ym @@ -361,11 +433,11 @@ def from_power_factory( uhv: PwF parameter `utrn_h` (Rated Voltage HV-Side). The rated phase-to-phase voltage of - the transformer on the primary side. + the transformer on the HV side. ulv: PwF parameter `utrn_l` (Rated Voltage LV-Side). The rated phase-to-phase voltage of - the transformer on the secondary side. + the transformer on the LV side. vg_hv: PwF parameter `tr2cn_h` (Vector Group HV-Side). The vector group of the high voltage @@ -398,13 +470,16 @@ def from_power_factory( impedance i.e. the power losses in (kW) obtained from the no-load test. manufacturer: - The name of the manufacturer for the transformer. Informative only, it has no impact on the load flow. + The name of the manufacturer for the transformer. Informative only, it has no impact + on the load flow. range: - The name of the product range for the transformer. Informative only, it has no impact on the load flow. + The name of the product range for the transformer. Informative only, it has no impact + on the load flow. efficiency: - The efficiency class of the transformer. Informative only, it has no impact on the load flow. + The efficiency class of the transformer. Informative only, it has no impact on the + load flow. Returns: The corresponding transformer parameters object. @@ -412,9 +487,9 @@ def from_power_factory( # Type: from vector group data and technology tech_norm = str(tech).upper().replace(" ", "-") if tech_norm.startswith("SINGLE-PHASE") or tech_norm == "2": - type = "single" + vg = "Ii0" # TODO do we have vector group data for single-phase transformers? elif tech_norm.startswith("THREE-PHASE") or tech_norm == "3": - type = f"{vg_hv.upper()}{vg_lv.lower()}{phase_shift}" + vg = f"{vg_hv.upper()}{vg_lv.lower()}{phase_shift}" else: msg = f"Expected tech='single-phase' or 'three-phase', got {tech!r} for transformer parameters {id!r}." logger.error(msg) @@ -428,13 +503,13 @@ def from_power_factory( i0 = curmg / 100 vsc = uk / 100 - z2, ym = cls._compute_zy(type=type, up=uhv, us=ulv, sn=sn, p0=p0, i0=i0, psc=psc, vsc=vsc) + z2, ym = cls._compute_zy(vg=vg, uhv=uhv, ulv=ulv, sn=sn, p0=p0, i0=i0, psc=psc, vsc=vsc) - obj = cls( + return cls( id=id, - type=type, - up=uhv, - us=ulv, + vg=vg, + uhv=uhv, + ulv=ulv, sn=sn, z2=z2, ym=ym, @@ -442,7 +517,6 @@ def from_power_factory( range=range, efficiency=efficiency, ) - return obj @classmethod @ureg_wraps( @@ -530,20 +604,23 @@ def from_open_dss( `%rs=[0.1, 0.1]` is equivalent to `%loadloss=0.2`. manufacturer: - The name of the manufacturer for the transformer. Informative only, it has no impact on the load flow. + The name of the manufacturer for the transformer. Informative only, it has no impact + on the load flow. range: - The name of the product range for the transformer. Informative only, it has no impact on the load flow. + The name of the product range for the transformer. Informative only, it has no impact + on the load flow. efficiency: - The efficiency class of the transformer. Informative only, it has no impact on the load flow. + The efficiency class of the transformer. Informative only, it has no impact on the + load flow. Returns: The corresponding transformer parameters object. Example usage:: - # DSS command: `DSSText.Command = "New transformer.LVTR Buses=[sourcebus, A.1.2.3] Conns=[delta wye] KVs=[11, 0.4] KVAs=[250 250] %Rs=0.00 xhl=2.5 %loadloss=0 "` + # DSS command: `New transformer.LVTR Buses=[sourcebus, A.1.2.3] Conns=[delta wye] KVs=[11, 0.4] KVAs=[250 250] %Rs=0.00 xhl=2.5 %loadloss=0` tp = rlf.TransformerParameters.from_open_dss( id="dss-tp", conns=("delta", "wye"), @@ -594,11 +671,11 @@ def from_open_dss( else: phase_displacement = 0 # TODO is leadlag used with Dd or Yy transformers? - # Type: from winding and lead-lag parameters - type = f"{w1}{w2}{phase_displacement}" + # Vector Group: from winding and lead-lag parameters + vg = f"{w1}{w2}{phase_displacement}" # High and low rated voltages - up, us = (u * 1000 for u in kvs) # in Volts + uhv, ulv = (u * 1000 for u in kvs) # in Volts # Nominal power sn: float # in Watts @@ -633,13 +710,13 @@ def from_open_dss( i0 = imag / 100 psc = (loadloss / 100) * sn vsc = xhl / 100 - z2, ym = cls._compute_zy(type=type, up=up, us=us, sn=sn, p0=p0, i0=i0, psc=psc, vsc=vsc) + z2, ym = cls._compute_zy(vg=vg, uhv=uhv, ulv=ulv, sn=sn, p0=p0, i0=i0, psc=psc, vsc=vsc) - obj = cls( + return cls( id=id, - type=type, - up=up, - us=us, + vg=vg, + uhv=uhv, + ulv=ulv, sn=sn, z2=z2, ym=ym, @@ -647,7 +724,6 @@ def from_open_dss( range=range, efficiency=efficiency, ) - return obj # # Open and short circuit tests @@ -657,9 +733,10 @@ def from_open_dss( def from_open_and_short_circuit_tests( cls, id: Id, - type: str, - up: float | Q_[float], - us: float | Q_[float], + *, + vg: str, + uhv: float | Q_[float], + ulv: float | Q_[float], sn: float | Q_[float], p0: float | Q_[float], i0: float | Q_[float], @@ -675,40 +752,54 @@ def from_open_and_short_circuit_tests( id: A unique ID of the transformer parameters, typically its canonical name. - type: - The type of transformer parameters. It can be "single" for single-phase transformers, "center" for - center-tapped transformers, or the name of the windings such as "Dyn11" for three-phase transformers. - Allowed windings are "D" for delta, "Y" for wye (star), and "Z" for zigzag. + vg: + The vector group of the transformer. - up: - Phase-to-phase nominal voltages of the primary side (V) + For three-phase transformers, ``Dyn11`` denotes a delta-wye connection with -30° phase + displacement. Allowed windings are ``D`` for delta, ``Y`` for wye, ``Z`` for zigzag. - us: - Phase-to-phase nominal voltages of the secondary side (V) + For single-phase transformers, ``Ii0`` denotes a normal in-phase connection and + ``Ii6`` denotes an inverted connection. + + For center-tapped transformers, ``Iii0`` denotes a normal in-phase connection and + ``Iii6`` denotes an inverted connection. + + uhv: + Rated phase-to-phase voltage of the HV side (V). + + ulv: + Rated no-load phase-to-phase voltage of the LV side (V). sn: - The nominal power of the transformer (VA) + The nominal power of the transformer (VA). p0: - Losses during open-circuit test (W) + Losses during open-circuit test (W). i0: - Current during open-circuit test (%) + Current during open-circuit test (%). psc: - Losses during short-circuit test (W) + Losses during short-circuit test (W). vsc: - Voltages on LV side during short-circuit test (%) + Voltages on LV side during short-circuit test (%). manufacturer: - The name of the manufacturer for the transformer. Informative only, it has no impact on the load flow. + The name of the manufacturer for the transformer. Informative only, it has no impact + on the load flow. It is filled automatically when the parameters when imported from + the catalogue. range: - The name of the product range for the transformer. Informative only, it has no impact on the load flow. + The product range for the transformer as defined by the manufacturer. Informative + only, it has no impact on the load flow. It is filled automatically when the + parameters when imported from the catalogue. efficiency: - The efficiency class of the transformer. Informative only, it has no impact on the load flow. + The efficiency class of the transformer. Informative only, it has no impact on the + load flow. It is filled automatically when the parameters when imported from the + catalogue. The efficiency class used in the catalogue follows the `Eco-Design` + requirements as defined by the `EN 50629` standard. """ # Check if i0 > 1.0 or i0 < 0.0: @@ -728,7 +819,7 @@ def from_open_and_short_circuit_tests( if psc / sn > vsc: msg = ( f"Invalid short-circuit results for transformer parameters {id!r}. The following " - f"inequality must be respected: psc/sn <= vsc" + f"inequality must be respected: psc/sn <= vsc, got {psc/sn=:f} and {vsc=:f}." ) logger.error(msg) raise RoseauLoadFlowException(msg=msg, code=RoseauLoadFlowExceptionCode.BAD_TRANSFORMER_PARAMETERS) @@ -738,13 +829,13 @@ def from_open_and_short_circuit_tests( f"i0 * sn > p0. The magnetizing admittance imaginary part will be null." ) - z2, ym = cls._compute_zy(type=type, up=up, us=us, sn=sn, p0=p0, i0=i0, psc=psc, vsc=vsc) + z2, ym = cls._compute_zy(vg=vg, uhv=uhv, ulv=ulv, sn=sn, p0=p0, i0=i0, psc=psc, vsc=vsc) instance = cls( id=id, - type=type, - up=up, - us=us, + vg=vg, + uhv=uhv, + ulv=ulv, sn=sn, z2=z2, ym=ym, @@ -770,54 +861,52 @@ def _compute_open_circuit_parameters(self, solve_kwargs: JsonDict | None = None) Returns: The values ``p0``, the losses (in W), and ``i0``, the current (in %) during open-circuit test. """ - from roseau.load_flow.converters import _calculate_voltages from roseau.load_flow.models import Bus, PotentialRef, Transformer, VoltageSource from roseau.load_flow.network import ElectricalNetwork if solve_kwargs is None: solve_kwargs = {} - if self.type == "single": + voltage = self._uhv + if self.type == "single-phase": phases_hv = "ab" phases_lv = "ab" - voltages = [self._up] - elif self.type == "center": + elif self.type == "center-tapped": phases_hv = "ab" phases_lv = "abn" - voltages = [self._up] else: # Three-phase transformer - phases_hv = "abc" if self.winding1.lower().startswith("d") else "abcn" - phases_lv = "abc" if self.winding2.lower().startswith("d") else "abcn" + phases_hv = "abc" if self.winding1[0] == "D" else "abcn" + phases_lv = "abc" if self.winding2[0] == "d" else "abcn" if "n" in phases_hv: - voltages = self._up / np.sqrt(3) * PositiveSequence - else: - voltages = _calculate_voltages(potentials=self._up / np.sqrt(3) * PositiveSequence, phases="abc") + voltage /= np.sqrt(3) bus_hv = Bus(id="BusHV", phases=phases_hv) bus_lv = Bus(id="BusLV", phases=phases_lv) PotentialRef(id="PRefHV", element=bus_hv) PotentialRef(id="PRefLV", element=bus_lv) - VoltageSource(id="VS", bus=bus_hv, voltages=voltages) + VoltageSource(id="VS", bus=bus_hv, voltages=voltage) transformer = Transformer(id="Transformer", bus1=bus_hv, bus2=bus_lv, parameters=self) en = ElectricalNetwork.from_element(bus_hv) en.solve_load_flow(**solve_kwargs) p_primary = transformer.res_powers[0].m.sum().real i_primary = abs(transformer.res_currents[0].m[0]) - in_ = self._sn / self._up if self.type in ("single", "center") else self._sn / (np.sqrt(3) * self._up) + i_nom = self._sn / self._uhv + if self.type == "three-phase": + i_nom /= np.sqrt(3) # Additional checks - u_secondary = abs(_calculate_voltages(potentials=bus_lv.res_potentials.m, phases=phases_lv)) - if self.type == "single": - expected_u_secondary = self._us - elif self.type == "center": - expected_u_secondary = self._us / 2 + u_secondary = abs(bus_lv.res_voltages.m) + if self.type == "single-phase": + expected_u_secondary = self._ulv + elif self.type == "center-tapped": + expected_u_secondary = self._ulv / 2 else: - expected_u_secondary = self._us / np.sqrt(3) + expected_u_secondary = self._ulv / np.sqrt(3) np.testing.assert_allclose(u_secondary, expected_u_secondary) - return p_primary, i_primary / in_ + return p_primary, i_primary / i_nom @ureg_wraps(("W", ""), (None, None)) def _compute_short_circuit_parameters(self, solve_kwargs: JsonDict | None = None) -> tuple[Q_[float], Q_[float]]: @@ -825,48 +914,39 @@ def _compute_short_circuit_parameters(self, solve_kwargs: JsonDict | None = None Args: solve_kwargs: - The keywords arguments used by the :meth:`ElectricalNetwork.solve_load_flow` method. By default, the - default arguments of the method are used. + The keywords arguments used by the :meth:`ElectricalNetwork.solve_load_flow` method. + By default, the default arguments of the method are used. Returns: The values ``psc``, the losses (in W), and ``vsc``, the voltages on LV side (in %) during short-circuit test. """ - from roseau.load_flow.converters import _calculate_voltages from roseau.load_flow.models import Bus, PotentialRef, Transformer, VoltageSource from roseau.load_flow.network import ElectricalNetwork if solve_kwargs is None: solve_kwargs = {} - potentials_hv = None - potentials_lv = None - vsc = abs(self._z2) * self._sn / self._us**2 - if self.type == "single": + vsc = abs(self._z2) * self._sn / self._ulv**2 + voltage = vsc * self._uhv + if self.type == "single-phase": phases_hv = "ab" phases_lv = "ab" - voltages = [vsc * self._up] - elif self.type == "center": + elif self.type == "center-tapped": phases_hv = "ab" phases_lv = "abn" - voltages = [vsc * self._up] - # TODO: The initialization of potentials seems very bad in the case of such short-circuit... - potentials_hv = [vsc * self._up, -vsc * self._up] - potentials_lv = [0, 0, 0] else: # Three-phase transformer - phases_hv = "abc" if self.winding1.lower().startswith("d") else "abcn" - phases_lv = "abc" if self.winding2.lower().startswith("d") else "abcn" + phases_hv = "abc" if self.winding1[0] == "D" else "abcn" + phases_lv = "abc" if self.winding2[0] == "d" else "abcn" if "n" in phases_hv: - voltages = vsc * self._up / np.sqrt(3) * PositiveSequence - else: - voltages = _calculate_voltages(potentials=vsc * self._up / np.sqrt(3) * PositiveSequence, phases="abc") + voltage /= np.sqrt(3) - bus_hv = Bus(id="BusHV", phases=phases_hv, potentials=potentials_hv) - bus_lv = Bus(id="BusLV", phases=phases_lv, potentials=potentials_lv) + bus_hv = Bus(id="BusHV", phases=phases_hv) + bus_lv = Bus(id="BusLV", phases=phases_lv) PotentialRef(id="PRefHV", element=bus_hv) PotentialRef(id="PRefLV", element=bus_lv) - VoltageSource(id="VS", bus=bus_hv, voltages=voltages) + VoltageSource(id="VS", bus=bus_hv, voltages=voltage) transformer = Transformer(id="Transformer", bus1=bus_hv, bus2=bus_lv, parameters=self) bus_lv.add_short_circuit(*phases_lv) en = ElectricalNetwork.from_element(bus_hv) @@ -874,9 +954,11 @@ def _compute_short_circuit_parameters(self, solve_kwargs: JsonDict | None = None p_primary = transformer.res_powers[0].m.sum().real # Additional check - in_ = self._sn / self._us if self.type in ("single", "center") else self._sn / (np.sqrt(3) * self._us) + i_nom = self._sn / self._ulv + if self.type == "three-phase": + i_nom /= np.sqrt(3) # I = S3ph / (sqrt(3) * U) i_secondary = abs(transformer.res_currents[1].m[0]) - np.testing.assert_allclose(i_secondary, in_) + np.testing.assert_allclose(i_secondary, i_nom) return p_primary, vsc @@ -889,9 +971,9 @@ def from_dict(cls, data: JsonDict, *, include_results: bool = True) -> Self: # TODO should we validate z2 and ym if they exist? return cls.from_open_and_short_circuit_tests( id=data["id"], - type=data["type"], # Type of the transformer - up=data["up"], # Phase-to-phase nominal voltages of the primary side (V) - us=data["us"], # Phase-to-phase nominal voltages of the secondary side (V) + vg=data["vg"], # Vector Group (e.g. Dyn11) + uhv=data["uhv"], # Rated phase-to-phase voltage of the HV side (V) + ulv=data["ulv"], # Rated no-load phase-to-phase voltage of the LV side (V) sn=data["sn"], # Nominal power p0=data["p0"], # Losses during open-circuit test (W) i0=data["i0"], # Current during open-circuit test (%) @@ -906,9 +988,9 @@ def from_dict(cls, data: JsonDict, *, include_results: bool = True) -> Self: ym = complex(*data["ym"]) return cls( id=data["id"], - type=data["type"], # Type of the transformer - up=data["up"], # Phase-to-phase nominal voltages of the primary side (V) - us=data["us"], # Phase-to-phase nominal voltages of the secondary side (V) + vg=data["vg"], # Vector Group (e.g. Dyn11) + uhv=data["uhv"], # Rated phase-to-phase voltages of the HV side (V) + ulv=data["ulv"], # Rated no-load phase-to-phase voltages of the LV side (V) sn=data["sn"], # Nominal power z2=z2, # Series impedance (ohm) ym=ym, # Magnetizing admittance (S) @@ -923,10 +1005,10 @@ def _to_dict(self, include_results: bool) -> JsonDict: ym = complex(self._ym) res = { "id": self.id, + "vg": self._vg, "sn": self._sn, - "up": self._up, - "us": self._us, - "type": self.type, + "uhv": self._uhv, + "ulv": self._ulv, "z2": [z2.real, z2.imag], "ym": [ym.real, ym.imag], } @@ -961,7 +1043,32 @@ def catalogue_path(cls) -> Path: @classmethod def catalogue_data(cls) -> pd.DataFrame: file = cls.catalogue_path() / "Catalogue.csv" - return pd.read_csv(file, parse_dates=False) + return pd.read_csv( + file, + parse_dates=False, + dtype={ + "name": str, + "manufacturer": str, + "range": str, + "efficiency": str, + "type": str, + "oil": str, + "sn": int, + "vsc": float, + "psc": float, + "i0": float, + "p0": float, + "vg": str, + "uhv": int, + "ulv": int, + "du1": float, + "du0.8": float, + "eff1 100%": float, + "eff0.8 100%": float, + "eff1 75%": float, + "eff0.8 75%": float, + }, + ).fillna({"manufacturer": "", "efficiency": "", "range": "", "oil": ""}) @classmethod def _get_catalogue( @@ -970,10 +1077,10 @@ def _get_catalogue( manufacturer: str | re.Pattern[str] | None, range: str | re.Pattern[str] | None, efficiency: str | re.Pattern[str] | None, - type: str | re.Pattern[str] | None, + vg: str | re.Pattern[str] | None, sn: float | None, - up: float | None, - us: float | None, + uhv: float | None, + ulv: float | None, raise_if_not_found: bool, ) -> tuple[pd.DataFrame, str]: # Get the catalogue data @@ -988,7 +1095,7 @@ def _get_catalogue( (manufacturer, "manufacturer", "manufacturer", "manufacturers"), (range, "range", "range", "ranges"), (efficiency, "efficiency", "efficiency", "efficiencies"), - (type, "type", "type", "types"), + (vg, "vg", "vector group", "vector groups"), ): if pd.isna(value): continue @@ -1003,13 +1110,13 @@ def _get_catalogue( query_msg_list=query_msg_list, ) catalogue_data = catalogue_data.loc[mask, :] - query_msg_list.append(f"{display_name}={value!r}") + query_msg_list.append(f"{column_name}={value!r}") # Filter on float for value, column_name, display_name, display_name_plural, display_unit in ( (sn, "sn", "nominal power", "nominal powers", "kVA"), - (up, "up", "primary side voltage", "primary side voltages", "kV"), - (us, "us", "secondary side voltage", "secondary side voltages", "kV"), + (uhv, "uhv", "high voltage", "high voltages", "kV"), + (ulv, "ulv", "low voltage", "low voltages", "kV"), ): if pd.isna(value): continue @@ -1024,7 +1131,7 @@ def _get_catalogue( query_msg_list=query_msg_list, ) catalogue_data = catalogue_data.loc[mask, :] - query_msg_list.append(f"{display_name}={value/1000:.1f} {display_unit}") + query_msg_list.append(f"{column_name}={value/1000:.1f} {display_unit}") return catalogue_data, ", ".join(query_msg_list) @@ -1033,13 +1140,14 @@ def _get_catalogue( def from_catalogue( cls, name: str | re.Pattern[str] | None = None, + *, manufacturer: str | re.Pattern[str] | None = None, range: str | re.Pattern[str] | None = None, efficiency: str | re.Pattern[str] | None = None, - type: str | re.Pattern[str] | None = None, + vg: str | re.Pattern[str] | None = None, sn: float | Q_[float] | None = None, - up: float | Q_[float] | None = None, - us: float | Q_[float] | None = None, + uhv: float | Q_[float] | None = None, + ulv: float | Q_[float] | None = None, id: Id | None = None, ) -> Self: """Build a transformer parameters from one in the catalogue. @@ -1047,6 +1155,8 @@ def from_catalogue( Args: name: The name of the transformer to get from the catalogue. It can be a regular expression. + The name is subject to change when the catalogue is updated. Prefer using the other + filters. manufacturer: The name of the manufacturer to get. It can be a regular expression. @@ -1057,17 +1167,17 @@ def from_catalogue( efficiency: The efficiency of the transformer get. It can be a regular expression. - type: - The type of the transformer to get. It can be a regular expression. + vg: + The vector group of the transformer to get. It can be a regular expression. sn: The nominal power of the transformer to get. - up: - The primary side voltage of the transformer to get. + uhv: + The rated phase-to-phase voltage of the HV side of the transformer to get. - us: - The secondary side voltage of the transformer to get. + ulv: + The rated no-load phase-to-phase voltage of the LV side of the transformer to get. id: A unique ID for the created line parameters object (optional). If ``None`` @@ -1084,10 +1194,10 @@ def from_catalogue( manufacturer=manufacturer, range=range, efficiency=efficiency, - type=type, + vg=vg, sn=sn, - up=up, - us=us, + uhv=uhv, + ulv=ulv, raise_if_not_found=True, ) @@ -1106,9 +1216,9 @@ def from_catalogue( id = catalogue_data.at[idx, "name"] return cls.from_open_and_short_circuit_tests( id=id, - type=catalogue_data.at[idx, "type"], - up=catalogue_data.at[idx, "up"], - us=catalogue_data.at[idx, "us"], + vg=catalogue_data.at[idx, "vg"], + uhv=catalogue_data.at[idx, "uhv"], + ulv=catalogue_data.at[idx, "ulv"], sn=catalogue_data.at[idx, "sn"], p0=catalogue_data.at[idx, "p0"], i0=catalogue_data.at[idx, "i0"], @@ -1124,13 +1234,14 @@ def from_catalogue( def get_catalogue( cls, name: str | re.Pattern[str] | None = None, + *, manufacturer: str | re.Pattern[str] | None = None, range: str | re.Pattern[str] | None = None, efficiency: str | re.Pattern[str] | None = None, - type: str | re.Pattern[str] | None = None, + vg: str | re.Pattern[str] | None = None, sn: float | Q_[float] | None = None, - up: float | Q_[float] | None = None, - us: float | Q_[float] | None = None, + uhv: float | Q_[float] | None = None, + ulv: float | Q_[float] | None = None, ) -> pd.DataFrame: """Get the catalogue of available transformers. @@ -1150,17 +1261,17 @@ def get_catalogue( efficiency: An optional efficiency to filter the output. It can be a regular expression. - type: - An optional type of the transformer. It can be a regular expression. + vg: + An optional vector group of the transformer. It can be a regular expression. sn: An optional nominal power of the transformer to filter the output. - up: - An optional primary side voltage to filter the output. + uhv: + An optional rated high voltage to filter the output. - us: - An optional secondary side voltage to filter the output. + ulv: + An optional rated no-load low voltage to filter the output. Returns: The catalogue data as a dataframe. @@ -1170,15 +1281,15 @@ def get_catalogue( manufacturer=manufacturer, range=range, efficiency=efficiency, - type=type, + vg=vg, sn=sn, - up=up, - us=us, + uhv=uhv, + ulv=ulv, raise_if_not_found=False, ) catalogue_data["sn"] /= 1000 # kVA - catalogue_data["up"] /= 1000 # kV - catalogue_data["us"] /= 1000 # kV + catalogue_data["uhv"] /= 1000 # kV + catalogue_data["ulv"] /= 1000 # kV return ( catalogue_data.drop(columns=["i0", "p0", "psc", "vsc"]) .rename( @@ -1187,10 +1298,12 @@ def get_catalogue( "manufacturer": "Manufacturer", "range": "Product range", "efficiency": "Efficiency", - "type": "Type", + "vg": "Vector group", "sn": "Nominal power (kVA)", - "up": "Primary voltage (kV)", - "us": "Secondary voltage (kV)", + "uhv": "High voltage (kV)", + "ulv": "Low voltage (kV)", + "type": "Type", + "oil": "Oil", # # If we ever want to display these columns # "i0": "No-load current (%)", # "p0": "No-load losses (W)", @@ -1205,22 +1318,31 @@ def get_catalogue( # Utils # @classmethod - def extract_windings(cls, string: str) -> tuple[str, str, int]: - """Extract the windings and phase displacement from a given string + def extract_windings(cls, vg: str) -> tuple[str, str, int]: + """Extract the windings and phase displacement from a given vector group Args: - string: - The string to parse. + vg: + The vector group of the transformer. + + For three-phase transformers, ``Dyn11`` denotes a delta-wye connection with -30° phase + displacement. Allowed windings are ``D`` for delta, ``Y`` for wye, ``Z`` for zigzag. + + For single-phase transformers, ``Ii0`` denotes a normal in-phase connection and + ``Ii6`` denotes an inverted connection. + + For center-tapped transformers, ``Iii0`` denotes a normal in-phase connection and + ``Iii6`` denotes an inverted connection. Returns: - The first winding, the second winding, and the phase displacement + The first winding, the second winding, and the phase displacement. """ - match = cls._EXTRACT_WINDINGS_RE.fullmatch(string=string) - if match: + match = re.fullmatch(r"^(?P(D|Yn?|Zn?|I))(?P(d|yn?|zn?|i|ii))(?P

(0|1|5|6|11))$", vg, flags=re.I) + if match and vg.capitalize() in cls.allowed_vector_groups: groups = match.groupdict() - winding1, winding2, phase_displacement = groups["w1"], groups["w2"], groups["p"] - return winding1.upper(), winding2.lower(), int(phase_displacement) + winding1, winding2, phase_displacement = groups["w1"].upper(), groups["w2"].lower(), int(groups["p"]) + return winding1, winding2, phase_displacement else: - msg = f"Transformer windings cannot be extracted from the string {string!r}." + msg = f"Invalid vector group: {vg!r}. Expected one of {sorted(cls.allowed_vector_groups)}." logger.error(msg) - raise RoseauLoadFlowException(msg=msg, code=RoseauLoadFlowExceptionCode.BAD_TRANSFORMER_WINDINGS) + raise RoseauLoadFlowException(msg=msg, code=RoseauLoadFlowExceptionCode.BAD_TRANSFORMER_VECTOR_GROUP) diff --git a/roseau/load_flow/models/transformers/transformers.py b/roseau/load_flow/models/transformers/transformers.py index f2932ffd..13fd97e3 100644 --- a/roseau/load_flow/models/transformers/transformers.py +++ b/roseau/load_flow/models/transformers/transformers.py @@ -9,7 +9,12 @@ from roseau.load_flow.models.transformers.parameters import TransformerParameters from roseau.load_flow.typing import Id, JsonDict from roseau.load_flow.units import Q_, ureg_wraps -from roseau.load_flow_engine.cy_engine import CyCenterTransformer, CySingleTransformer, CyThreePhaseTransformer +from roseau.load_flow_engine.cy_engine import ( + CyCenterTransformer, + CySingleTransformer, + CyThreePhaseTransformer, + CyTransformer, +) logger = logging.getLogger(__name__) @@ -76,17 +81,17 @@ def __init__( max_loading: The maximum loading of the transformer (unitless). It is used with the `sn` of the :class:`TransformerParameters` to compute the :meth:`~roseau.load_flow.Transformer.max_power`, - :meth:`~roseau.load_flow.Transformer.res_loading` and - :meth:`~roseau.load_flow.Transformer.res_violated` of the transformer. + :meth:`~roseau.load_flow.Transformer.res_loading` and + :meth:`~roseau.load_flow.Transformer.res_violated` of the transformer. geometry: The geometry of the transformer. """ - if parameters.type == "single": + if parameters.type == "single-phase": phases1, phases2 = self._compute_phases_single( id=id, bus1=bus1, bus2=bus2, phases1=phases1, phases2=phases2 ) - elif parameters.type == "center": + elif parameters.type == "center-tapped": phases1, phases2 = self._compute_phases_center( id=id, bus1=bus1, bus2=bus2, phases1=phases1, phases2=phases2 ) @@ -101,51 +106,30 @@ def __init__( self.max_loading = max_loading z2, ym, k, orientation = parameters._z2, parameters._ym, parameters._k, parameters._orientation - if parameters.type == "single": - self._cy_element = CySingleTransformer(z2=z2, ym=ym, k=k * tap) - elif parameters.type == "center": - self._cy_element = CyCenterTransformer(z2=z2, ym=ym, k=k * tap) + self._cy_element: CyTransformer + if parameters.type == "single-phase": + self._cy_element = CySingleTransformer(z2=z2, ym=ym, k=k * orientation * tap) + elif parameters.type == "center-tapped": + self._cy_element = CyCenterTransformer(z2=z2, ym=ym, k=k * orientation * tap) else: - if "Y" in parameters.winding1 and "y" in parameters.winding2: - self._cy_element = CyThreePhaseTransformer( - n1=4, n2=4, prim="Y", sec="y", z2=z2, ym=ym, k=k * tap, orientation=orientation - ) - elif "D" in parameters.winding1 and "y" in parameters.winding2: - self._cy_element = CyThreePhaseTransformer( - n1=3, n2=4, prim="D", sec="y", z2=z2, ym=ym, k=k * tap, orientation=orientation - ) - elif "D" in parameters.winding1 and "d" in parameters.winding2: - self._cy_element = CyThreePhaseTransformer( - n1=3, n2=3, prim="D", sec="d", z2=z2, ym=ym, k=k * tap, orientation=orientation - ) - elif "Y" in parameters.winding1 and "d" in parameters.winding2: - self._cy_element = CyThreePhaseTransformer( - n1=4, n2=3, prim="Y", sec="d", z2=z2, ym=ym, k=k * tap, orientation=orientation - ) - elif "Y" in parameters.winding1 and "z" in parameters.winding2: - self._cy_element = CyThreePhaseTransformer( - n1=4, n2=4, prim="Y", sec="z", z2=z2, ym=ym, k=k * tap, orientation=orientation - ) - elif "D" in parameters.winding1 and "z" in parameters.winding2: - self._cy_element = CyThreePhaseTransformer( - n1=3, n2=4, prim="D", sec="z", z2=z2, ym=ym, k=k * tap, orientation=orientation - ) - else: - msg = f"Transformer {parameters.type} is not implemented yet..." - logger.error(msg) - raise RoseauLoadFlowException(msg=msg, code=RoseauLoadFlowExceptionCode.BAD_TRANSFORMER_WINDINGS) + self._cy_element = CyThreePhaseTransformer( + n1=parameters._n1, + n2=parameters._n2, + prim=parameters.winding1[0], + sec=parameters.winding2[0], + z2=z2, + ym=ym, + k=k * tap, + orientation=orientation, + ) self._cy_connect() def __repr__(self) -> str: - s = ( + return ( f"<{type(self).__name__}: id={self.id!r}, bus1={self.bus1.id!r}, bus2={self.bus2.id!r}, " - f"phases1={self.phases1!r}, phases2={self.phases2!r}" + f"phases1={self.phases1!r}, phases2={self.phases2!r}, tap={self.tap:f}, " + f"max_loading={self._max_loading:f}>" ) - for attr, val, tp in (("tap", self._tap, float), ("max_loading", self._max_loading, float)): - if val is not None: - s += f", {attr}={tp(val)!r}" - s += ">" - return s @property def tap(self) -> float: @@ -171,16 +155,21 @@ def parameters(self) -> TransformerParameters: @parameters.setter def parameters(self, value: TransformerParameters) -> None: - type1 = self._parameters.type - type2 = value.type - if type1 != type2: - msg = f"The updated type changed for transformer {self.id!r}: {type1} to {type2}." + vg1 = self._parameters.vg + vg2 = value.vg + if vg1 != vg2: + msg = ( + f"Cannot update the parameters of transformer {self.id!r} to a different vector " + f"group: old={vg1!r}, new={vg2!r}." + ) logger.error(msg) raise RoseauLoadFlowException(msg=msg, code=RoseauLoadFlowExceptionCode.BAD_TRANSFORMER_TYPE) self._parameters = value self._invalidate_network_results() if self._cy_element is not None: z2, ym, k = value._z2, value._ym, value._k + if value.type in ("single-phase", "center-tapped"): + k *= value._orientation self._cy_element.update_transformer_parameters(z2, ym, k * self.tap) @property diff --git a/roseau/load_flow/network.py b/roseau/load_flow/network.py index fa28d2c0..b6e1a6b0 100644 --- a/roseau/load_flow/network.py +++ b/roseau/load_flow/network.py @@ -1320,7 +1320,7 @@ def _propagate_potentials(self) -> None: for e in element._connected_elements: if e not in visited: if isinstance(element, Transformer): - k = element.parameters._us / element.parameters._up + k = element.parameters._ulv / element.parameters._uhv phase_displacement = element.parameters.phase_displacement if phase_displacement is None: phase_displacement = 0 diff --git a/roseau/load_flow/tests/data/networks/all_element_network.json b/roseau/load_flow/tests/data/networks/all_element_network.json index a9071aff..8b694296 100644 --- a/roseau/load_flow/tests/data/networks/all_element_network.json +++ b/roseau/load_flow/tests/data/networks/all_element_network.json @@ -613,9 +613,9 @@ { "id": "tp0", "sn": 100000, - "up": 20000, - "us": 400, - "type": "Dyn11", + "uhv": 20000, + "ulv": 400, + "vg": "Dyn11", "z2": [0.02, 0.060794736614282655], "ym": [1.2083333333333332e-7, -3.987611022487859e-7], "i0": 0.005, diff --git a/roseau/load_flow/tests/test_electrical_network.py b/roseau/load_flow/tests/test_electrical_network.py index ecf00f45..37a782c2 100644 --- a/roseau/load_flow/tests/test_electrical_network.py +++ b/roseau/load_flow/tests/test_electrical_network.py @@ -91,7 +91,7 @@ def test_connect_and_disconnect(): load_bus2 = Bus(id="load_bus2", phases="abcn") ground2 = Ground("ground2") ground2.connect(bus=load_bus2) - tp = TransformerParameters.from_catalogue(name="SE_Minera_A0Ak_50kVA") + tp = TransformerParameters.from_catalogue(name="SE Minera A0Ak 50kVA 15/20kV(20) 410V Yzn11") Transformer(id="transfo", bus1=load_bus, bus2=load_bus2, parameters=tp) with pytest.raises(RoseauLoadFlowException) as e: en._check_validity(constructed=False) @@ -343,7 +343,7 @@ def test_bad_networks(): # No potential reference bus3 = Bus(id="bus3", phases="abcn") tp = TransformerParameters.from_open_and_short_circuit_tests( - id="t", type="Dyn11", up=20000, us=400, sn=160 * 1e3, p0=460, i0=2.3 / 100, psc=2350, vsc=4 / 100 + id="t", vg="Dyn11", uhv=20000, ulv=400, sn=160 * 1e3, p0=460, i0=2.3 / 100, psc=2350, vsc=4 / 100 ) t = Transformer(id="transfo", bus1=bus2, bus2=bus3, parameters=tp) with pytest.raises(RoseauLoadFlowException) as e: @@ -2218,9 +2218,9 @@ def test_propagate_potentials_center_transformers(): # Source is located at the primary side of the transformer bus1 = Bus(id="bus1", phases="ab") PotentialRef(id="pref", element=bus1) - VoltageSource(id="vs", bus=bus1, voltages=[20000]) + VoltageSource(id="vs", bus=bus1, voltages=20000) tp = TransformerParameters.from_open_and_short_circuit_tests( - id="test", type="center", sn=160000, up=20000.0, us=400.0, i0=0.023, p0=460.0, psc=2350.0, vsc=0.04 + id="test", vg="Iii0", sn=160000, uhv=20000.0, ulv=400.0, i0=0.023, p0=460.0, psc=2350.0, vsc=0.04 ) bus2 = Bus(id="bus2", phases="abn") PotentialRef(id="pref2", element=bus2) diff --git a/roseau/load_flow/utils/_doc_utils.py b/roseau/load_flow/utils/_doc_utils.py new file mode 100644 index 00000000..2a9a5271 --- /dev/null +++ b/roseau/load_flow/utils/_doc_utils.py @@ -0,0 +1,72 @@ +import pandas as pd + + +def to_markdown(df: pd.DataFrame, *, floatfmt: str = "g", index: bool = True, no_wrap_index: bool = False) -> str: + """Format a dataframe as markdown for use in the docs. + + Features: + - Pretty format complex numbers with the same format spec as floats. + - Right-align numerical columns and left-align other columns. + - Optionally wrap index in ```` tags to prevent line breaks. + + Args: + df: + The dataframe to format. + + floatfmt: + Format specification used for columns which contain numeric data with a decimal point. + It is also used for real and imaginary parts of complex numbers. + + index: + Whether to include the index in the markdown table. + + no_wrap_index: + Whether to wrap the index in ```` tags. + + Returns: + A string representing the dataframe formatted as a markdown table. + + Examples: + + Print a results dataframe. Reset the multi-index for better display: + + >>> print(tomarkdown(en.res_buses_voltages.reset_index(), index=False)) + | bus_id | phase | voltage | violated | voltage_level | ... + |:----------------|:--------|-----------------:|:-----------|----------------:| ... + | MVLV03045 | ab | 17320.5+10000 | False | 1 | ... + | MVLV03045 | bc | 0-20000 | False | 1 | ... + | MVLV03045 | ca | -17320.5+10000 | False | 1 | ... + + Print catalogue of transformer parameters. Avoid line breaks in the index: + + >>> tr_catalogue = rlf.TransformerParameters.get_catalogue().sample(30, random_state=1) + >>> print(to_markdown(tr_catalogue, no_wrap_index=True)) + | Name | Manufacturer | Product range | ... + |:-----------------------------------------------|:---------------|:----------------| ... + | FT 100kVA 15/20kV(20) 400V Dyn11 | FT | | ... + | FT 160kVA 15/20kV(20) 400V Dyn11 | FT | | ... + + """ + if df.empty: + return df.to_markdown(index=index) + + df = df.copy() + if index and no_wrap_index and pd.api.types.is_string_dtype(df.index): + df.index = "" + df.index + "" + + colalign = [] + if index: + colalign.append("left") + for c in df.columns: + if ( + (is_complex_dtype := pd.api.types.is_complex_dtype(df[c])) + or pd.api.types.is_float_dtype(df[c]) + or pd.api.types.is_integer_dtype(df[c]) + ): + colalign.append("right") + if is_complex_dtype: + df[c] = df[c].apply(lambda x: f"{x.real:{floatfmt}}{x.imag:+{floatfmt}}") + else: + colalign.append("left") + + return df.to_markdown(index=index, floatfmt=floatfmt, colalign=colalign) diff --git a/roseau/load_flow/utils/_versions.py b/roseau/load_flow/utils/_versions.py index 6cd671e8..82e61c3f 100644 --- a/roseau/load_flow/utils/_versions.py +++ b/roseau/load_flow/utils/_versions.py @@ -25,7 +25,6 @@ def _get_dependency_info() -> JsonDict: "numpy", "geopandas", "shapely", - "regex", "pint", "platformdirs", "certifi", diff --git a/roseau/load_flow/utils/mixins.py b/roseau/load_flow/utils/mixins.py index d52461ee..a9dd3c33 100644 --- a/roseau/load_flow/utils/mixins.py +++ b/roseau/load_flow/utils/mixins.py @@ -295,7 +295,7 @@ def _filter_catalogue_str( else: try: pattern = re.compile(pattern=value, flags=re.IGNORECASE) - result = vector.str.fullmatch(pattern) + result = vector.str.fullmatch(pattern) | (vector.str.lower() == value.lower()) except re.error: # fallback to string comparison result = vector.str.lower() == value.lower() diff --git a/roseau/load_flow/utils/tests/test_versions.py b/roseau/load_flow/utils/tests/test_versions.py index 605aeb20..646d5e24 100644 --- a/roseau/load_flow/utils/tests/test_versions.py +++ b/roseau/load_flow/utils/tests/test_versions.py @@ -18,4 +18,4 @@ def test_versions(capsys): assert lines[9] == "----------------------" for i, (key, value) in enumerate(_get_dependency_info().items()): assert re.fullmatch(pattern=rf"{key}\s+{value}", string=lines[10 + i]) - assert lines[20] == "" + assert lines[19] == "" diff --git a/scripts/generate_test_networks.py b/scripts/generate_test_networks.py index 9a94c92c..0a74cfc4 100644 --- a/scripts/generate_test_networks.py +++ b/scripts/generate_test_networks.py @@ -107,7 +107,7 @@ def generate_all_element_network() -> None: line0 = rlf.Line(id="line0", bus1=bus0, bus2=bus1, parameters=lp0, length=rlf.Q_(1.5, "km"), ground=ground) # Transformer between bus1 and bus2 - tp0 = rlf.TransformerParameters.from_catalogue(name="SE_Minera_A0Ak_100kVA", id="tp0") + tp0 = rlf.TransformerParameters.from_catalogue(name="SE Minera A0Ak 100kVA 15/20kV(20) 410V Dyn11", id="tp0") transformer0 = rlf.Transformer(id="transformer0", bus1=bus1, bus2=bus2, parameters=tp0, tap=1.0) ground.connect(bus=bus2, phase="n") diff --git a/scripts/generate_transformer_parameters_catalogue.py b/scripts/generate_transformer_parameters_catalogue.py index e60413e3..844589ef 100644 --- a/scripts/generate_transformer_parameters_catalogue.py +++ b/scripts/generate_transformer_parameters_catalogue.py @@ -23,14 +23,14 @@ destination_path.mkdir(exist_ok=True, parents=True) # Get parameters - up = Q_(df.at[idx, "up"], "V") # Phase-to-phase nominal voltages of the primary side - us = Q_(df.at[idx, "us"], "V") # Phase-to-phase nominal voltages of the secondary side + uhv = Q_(df.at[idx, "uhv"], "V") # Phase-to-phase nominal voltages of the primary side + ulv = Q_(df.at[idx, "ulv"], "V") # Phase-to-phase nominal voltages of the secondary side sn = Q_(df.at[idx, "sn"], "VA") # Nominal power i0 = Q_(np.round(df.at[idx, "i0"], decimals=3), "") # Current during open-circuit test p0 = Q_(df.at[idx, "p0"], "W") # Losses during open-circuit test psc = Q_(df.at[idx, "psc"], "W") # Losses during short-circuit test vsc = Q_(df.at[idx, "vsc"], "") # Voltages on LV side during short-circuit test - type = df.at[idx, "type"] + vg = df.at[idx, "vg"] # Check the canonical name sn_kva = int(sn.m_as("kVA")) @@ -38,7 +38,7 @@ # Generate transformer parameters tp = TransformerParameters.from_open_and_short_circuit_tests( - id=id, type=type, up=up, us=us, sn=sn, p0=p0, i0=i0, psc=psc, vsc=vsc + id=id, vg=vg, uhv=uhv, ulv=ulv, sn=sn, p0=p0, i0=i0, psc=psc, vsc=vsc ) assert tp.z2 is not None, id assert tp.ym is not None, id diff --git a/uv.lock b/uv.lock index 6d0db56e..e723bfd8 100644 --- a/uv.lock +++ b/uv.lock @@ -1142,75 +1142,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, ] -[[package]] -name = "regex" -version = "2024.11.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8e/5f/bd69653fbfb76cf8604468d3b4ec4c403197144c7bfe0e6a5fc9e02a07cb/regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519", size = 399494 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/95/3c/4651f6b130c6842a8f3df82461a8950f923925db8b6961063e82744bddcc/regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91", size = 482674 }, - { url = "https://files.pythonhosted.org/packages/15/51/9f35d12da8434b489c7b7bffc205c474a0a9432a889457026e9bc06a297a/regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0", size = 287684 }, - { url = "https://files.pythonhosted.org/packages/bd/18/b731f5510d1b8fb63c6b6d3484bfa9a59b84cc578ac8b5172970e05ae07c/regex-2024.11.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:164d8b7b3b4bcb2068b97428060b2a53be050085ef94eca7f240e7947f1b080e", size = 284589 }, - { url = "https://files.pythonhosted.org/packages/78/a2/6dd36e16341ab95e4c6073426561b9bfdeb1a9c9b63ab1b579c2e96cb105/regex-2024.11.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3660c82f209655a06b587d55e723f0b813d3a7db2e32e5e7dc64ac2a9e86fde", size = 782511 }, - { url = "https://files.pythonhosted.org/packages/1b/2b/323e72d5d2fd8de0d9baa443e1ed70363ed7e7b2fb526f5950c5cb99c364/regex-2024.11.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d22326fcdef5e08c154280b71163ced384b428343ae16a5ab2b3354aed12436e", size = 821149 }, - { url = "https://files.pythonhosted.org/packages/90/30/63373b9ea468fbef8a907fd273e5c329b8c9535fee36fc8dba5fecac475d/regex-2024.11.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1ac758ef6aebfc8943560194e9fd0fa18bcb34d89fd8bd2af18183afd8da3a2", size = 809707 }, - { url = "https://files.pythonhosted.org/packages/f2/98/26d3830875b53071f1f0ae6d547f1d98e964dd29ad35cbf94439120bb67a/regex-2024.11.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:997d6a487ff00807ba810e0f8332c18b4eb8d29463cfb7c820dc4b6e7562d0cf", size = 781702 }, - { url = "https://files.pythonhosted.org/packages/87/55/eb2a068334274db86208ab9d5599ffa63631b9f0f67ed70ea7c82a69bbc8/regex-2024.11.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:02a02d2bb04fec86ad61f3ea7f49c015a0681bf76abb9857f945d26159d2968c", size = 771976 }, - { url = "https://files.pythonhosted.org/packages/74/c0/be707bcfe98254d8f9d2cff55d216e946f4ea48ad2fd8cf1428f8c5332ba/regex-2024.11.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f02f93b92358ee3f78660e43b4b0091229260c5d5c408d17d60bf26b6c900e86", size = 697397 }, - { url = "https://files.pythonhosted.org/packages/49/dc/bb45572ceb49e0f6509f7596e4ba7031f6819ecb26bc7610979af5a77f45/regex-2024.11.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:06eb1be98df10e81ebaded73fcd51989dcf534e3c753466e4b60c4697a003b67", size = 768726 }, - { url = "https://files.pythonhosted.org/packages/5a/db/f43fd75dc4c0c2d96d0881967897926942e935d700863666f3c844a72ce6/regex-2024.11.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:040df6fe1a5504eb0f04f048e6d09cd7c7110fef851d7c567a6b6e09942feb7d", size = 775098 }, - { url = "https://files.pythonhosted.org/packages/99/d7/f94154db29ab5a89d69ff893159b19ada89e76b915c1293e98603d39838c/regex-2024.11.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabbfc59f2c6edba2a6622c647b716e34e8e3867e0ab975412c5c2f79b82da2", size = 839325 }, - { url = "https://files.pythonhosted.org/packages/f7/17/3cbfab1f23356fbbf07708220ab438a7efa1e0f34195bf857433f79f1788/regex-2024.11.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8447d2d39b5abe381419319f942de20b7ecd60ce86f16a23b0698f22e1b70008", size = 843277 }, - { url = "https://files.pythonhosted.org/packages/7e/f2/48b393b51900456155de3ad001900f94298965e1cad1c772b87f9cfea011/regex-2024.11.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:da8f5fc57d1933de22a9e23eec290a0d8a5927a5370d24bda9a6abe50683fe62", size = 773197 }, - { url = "https://files.pythonhosted.org/packages/45/3f/ef9589aba93e084cd3f8471fded352826dcae8489b650d0b9b27bc5bba8a/regex-2024.11.6-cp310-cp310-win32.whl", hash = "sha256:b489578720afb782f6ccf2840920f3a32e31ba28a4b162e13900c3e6bd3f930e", size = 261714 }, - { url = "https://files.pythonhosted.org/packages/42/7e/5f1b92c8468290c465fd50c5318da64319133231415a8aa6ea5ab995a815/regex-2024.11.6-cp310-cp310-win_amd64.whl", hash = "sha256:5071b2093e793357c9d8b2929dfc13ac5f0a6c650559503bb81189d0a3814519", size = 274042 }, - { url = "https://files.pythonhosted.org/packages/58/58/7e4d9493a66c88a7da6d205768119f51af0f684fe7be7bac8328e217a52c/regex-2024.11.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5478c6962ad548b54a591778e93cd7c456a7a29f8eca9c49e4f9a806dcc5d638", size = 482669 }, - { url = "https://files.pythonhosted.org/packages/34/4c/8f8e631fcdc2ff978609eaeef1d6994bf2f028b59d9ac67640ed051f1218/regex-2024.11.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c89a8cc122b25ce6945f0423dc1352cb9593c68abd19223eebbd4e56612c5b7", size = 287684 }, - { url = "https://files.pythonhosted.org/packages/c5/1b/f0e4d13e6adf866ce9b069e191f303a30ab1277e037037a365c3aad5cc9c/regex-2024.11.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94d87b689cdd831934fa3ce16cc15cd65748e6d689f5d2b8f4f4df2065c9fa20", size = 284589 }, - { url = "https://files.pythonhosted.org/packages/25/4d/ab21047f446693887f25510887e6820b93f791992994f6498b0318904d4a/regex-2024.11.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1062b39a0a2b75a9c694f7a08e7183a80c63c0d62b301418ffd9c35f55aaa114", size = 792121 }, - { url = "https://files.pythonhosted.org/packages/45/ee/c867e15cd894985cb32b731d89576c41a4642a57850c162490ea34b78c3b/regex-2024.11.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:167ed4852351d8a750da48712c3930b031f6efdaa0f22fa1933716bfcd6bf4a3", size = 831275 }, - { url = "https://files.pythonhosted.org/packages/b3/12/b0f480726cf1c60f6536fa5e1c95275a77624f3ac8fdccf79e6727499e28/regex-2024.11.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d548dafee61f06ebdb584080621f3e0c23fff312f0de1afc776e2a2ba99a74f", size = 818257 }, - { url = "https://files.pythonhosted.org/packages/bf/ce/0d0e61429f603bac433910d99ef1a02ce45a8967ffbe3cbee48599e62d88/regex-2024.11.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a19f302cd1ce5dd01a9099aaa19cae6173306d1302a43b627f62e21cf18ac0", size = 792727 }, - { url = "https://files.pythonhosted.org/packages/e4/c1/243c83c53d4a419c1556f43777ccb552bccdf79d08fda3980e4e77dd9137/regex-2024.11.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bec9931dfb61ddd8ef2ebc05646293812cb6b16b60cf7c9511a832b6f1854b55", size = 780667 }, - { url = "https://files.pythonhosted.org/packages/c5/f4/75eb0dd4ce4b37f04928987f1d22547ddaf6c4bae697623c1b05da67a8aa/regex-2024.11.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9714398225f299aa85267fd222f7142fcb5c769e73d7733344efc46f2ef5cf89", size = 776963 }, - { url = "https://files.pythonhosted.org/packages/16/5d/95c568574e630e141a69ff8a254c2f188b4398e813c40d49228c9bbd9875/regex-2024.11.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:202eb32e89f60fc147a41e55cb086db2a3f8cb82f9a9a88440dcfc5d37faae8d", size = 784700 }, - { url = "https://files.pythonhosted.org/packages/8e/b5/f8495c7917f15cc6fee1e7f395e324ec3e00ab3c665a7dc9d27562fd5290/regex-2024.11.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4181b814e56078e9b00427ca358ec44333765f5ca1b45597ec7446d3a1ef6e34", size = 848592 }, - { url = "https://files.pythonhosted.org/packages/1c/80/6dd7118e8cb212c3c60b191b932dc57db93fb2e36fb9e0e92f72a5909af9/regex-2024.11.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:068376da5a7e4da51968ce4c122a7cd31afaaec4fccc7856c92f63876e57b51d", size = 852929 }, - { url = "https://files.pythonhosted.org/packages/11/9b/5a05d2040297d2d254baf95eeeb6df83554e5e1df03bc1a6687fc4ba1f66/regex-2024.11.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f2c4184420d881a3475fb2c6f4d95d53a8d50209a2500723d831036f7c45", size = 781213 }, - { url = "https://files.pythonhosted.org/packages/26/b7/b14e2440156ab39e0177506c08c18accaf2b8932e39fb092074de733d868/regex-2024.11.6-cp311-cp311-win32.whl", hash = "sha256:c36f9b6f5f8649bb251a5f3f66564438977b7ef8386a52460ae77e6070d309d9", size = 261734 }, - { url = "https://files.pythonhosted.org/packages/80/32/763a6cc01d21fb3819227a1cc3f60fd251c13c37c27a73b8ff4315433a8e/regex-2024.11.6-cp311-cp311-win_amd64.whl", hash = "sha256:02e28184be537f0e75c1f9b2f8847dc51e08e6e171c6bde130b2687e0c33cf60", size = 274052 }, - { url = "https://files.pythonhosted.org/packages/ba/30/9a87ce8336b172cc232a0db89a3af97929d06c11ceaa19d97d84fa90a8f8/regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a", size = 483781 }, - { url = "https://files.pythonhosted.org/packages/01/e8/00008ad4ff4be8b1844786ba6636035f7ef926db5686e4c0f98093612add/regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9", size = 288455 }, - { url = "https://files.pythonhosted.org/packages/60/85/cebcc0aff603ea0a201667b203f13ba75d9fc8668fab917ac5b2de3967bc/regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2", size = 284759 }, - { url = "https://files.pythonhosted.org/packages/94/2b/701a4b0585cb05472a4da28ee28fdfe155f3638f5e1ec92306d924e5faf0/regex-2024.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4", size = 794976 }, - { url = "https://files.pythonhosted.org/packages/4b/bf/fa87e563bf5fee75db8915f7352e1887b1249126a1be4813837f5dbec965/regex-2024.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577", size = 833077 }, - { url = "https://files.pythonhosted.org/packages/a1/56/7295e6bad94b047f4d0834e4779491b81216583c00c288252ef625c01d23/regex-2024.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3", size = 823160 }, - { url = "https://files.pythonhosted.org/packages/fb/13/e3b075031a738c9598c51cfbc4c7879e26729c53aa9cca59211c44235314/regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e", size = 796896 }, - { url = "https://files.pythonhosted.org/packages/24/56/0b3f1b66d592be6efec23a795b37732682520b47c53da5a32c33ed7d84e3/regex-2024.11.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe", size = 783997 }, - { url = "https://files.pythonhosted.org/packages/f9/a1/eb378dada8b91c0e4c5f08ffb56f25fcae47bf52ad18f9b2f33b83e6d498/regex-2024.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e", size = 781725 }, - { url = "https://files.pythonhosted.org/packages/83/f2/033e7dec0cfd6dda93390089864732a3409246ffe8b042e9554afa9bff4e/regex-2024.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29", size = 789481 }, - { url = "https://files.pythonhosted.org/packages/83/23/15d4552ea28990a74e7696780c438aadd73a20318c47e527b47a4a5a596d/regex-2024.11.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39", size = 852896 }, - { url = "https://files.pythonhosted.org/packages/e3/39/ed4416bc90deedbfdada2568b2cb0bc1fdb98efe11f5378d9892b2a88f8f/regex-2024.11.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51", size = 860138 }, - { url = "https://files.pythonhosted.org/packages/93/2d/dd56bb76bd8e95bbce684326302f287455b56242a4f9c61f1bc76e28360e/regex-2024.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad", size = 787692 }, - { url = "https://files.pythonhosted.org/packages/0b/55/31877a249ab7a5156758246b9c59539abbeba22461b7d8adc9e8475ff73e/regex-2024.11.6-cp312-cp312-win32.whl", hash = "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54", size = 262135 }, - { url = "https://files.pythonhosted.org/packages/38/ec/ad2d7de49a600cdb8dd78434a1aeffe28b9d6fc42eb36afab4a27ad23384/regex-2024.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b", size = 273567 }, - { url = "https://files.pythonhosted.org/packages/90/73/bcb0e36614601016552fa9344544a3a2ae1809dc1401b100eab02e772e1f/regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84", size = 483525 }, - { url = "https://files.pythonhosted.org/packages/0f/3f/f1a082a46b31e25291d830b369b6b0c5576a6f7fb89d3053a354c24b8a83/regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4", size = 288324 }, - { url = "https://files.pythonhosted.org/packages/09/c9/4e68181a4a652fb3ef5099e077faf4fd2a694ea6e0f806a7737aff9e758a/regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0", size = 284617 }, - { url = "https://files.pythonhosted.org/packages/fc/fd/37868b75eaf63843165f1d2122ca6cb94bfc0271e4428cf58c0616786dce/regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0", size = 795023 }, - { url = "https://files.pythonhosted.org/packages/c4/7c/d4cd9c528502a3dedb5c13c146e7a7a539a3853dc20209c8e75d9ba9d1b2/regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7", size = 833072 }, - { url = "https://files.pythonhosted.org/packages/4f/db/46f563a08f969159c5a0f0e722260568425363bea43bb7ae370becb66a67/regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7", size = 823130 }, - { url = "https://files.pythonhosted.org/packages/db/60/1eeca2074f5b87df394fccaa432ae3fc06c9c9bfa97c5051aed70e6e00c2/regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c", size = 796857 }, - { url = "https://files.pythonhosted.org/packages/10/db/ac718a08fcee981554d2f7bb8402f1faa7e868c1345c16ab1ebec54b0d7b/regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3", size = 784006 }, - { url = "https://files.pythonhosted.org/packages/c2/41/7da3fe70216cea93144bf12da2b87367590bcf07db97604edeea55dac9ad/regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07", size = 781650 }, - { url = "https://files.pythonhosted.org/packages/a7/d5/880921ee4eec393a4752e6ab9f0fe28009435417c3102fc413f3fe81c4e5/regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e", size = 789545 }, - { url = "https://files.pythonhosted.org/packages/dc/96/53770115e507081122beca8899ab7f5ae28ae790bfcc82b5e38976df6a77/regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6", size = 853045 }, - { url = "https://files.pythonhosted.org/packages/31/d3/1372add5251cc2d44b451bd94f43b2ec78e15a6e82bff6a290ef9fd8f00a/regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4", size = 860182 }, - { url = "https://files.pythonhosted.org/packages/ed/e3/c446a64984ea9f69982ba1a69d4658d5014bc7a0ea468a07e1a1265db6e2/regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d", size = 787733 }, - { url = "https://files.pythonhosted.org/packages/2b/f1/e40c8373e3480e4f29f2692bd21b3e05f296d3afebc7e5dcf21b9756ca1c/regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff", size = 262122 }, - { url = "https://files.pythonhosted.org/packages/45/94/bc295babb3062a731f52621cdc992d123111282e291abaf23faa413443ea/regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a", size = 273545 }, -] - [[package]] name = "requests" version = "2.32.3" @@ -1238,7 +1169,6 @@ dependencies = [ { name = "pint" }, { name = "platformdirs" }, { name = "pyproj" }, - { name = "regex" }, { name = "roseau-load-flow-engine" }, { name = "shapely" }, { name = "typing-extensions" }, @@ -1285,7 +1215,6 @@ requires-dist = [ { name = "pint", specifier = ">=0.21.0" }, { name = "platformdirs", specifier = ">=4.0.0" }, { name = "pyproj", specifier = ">=3.3.0" }, - { name = "regex", specifier = ">=2022.1.18" }, { name = "roseau-load-flow-engine", specifier = ">=0.16.0a0" }, { name = "shapely", specifier = ">=2.0.0" }, { name = "typing-extensions", specifier = ">=4.6.2" },