From 37817ce07049997b10a73f69d8e6c876d757ea3c Mon Sep 17 00:00:00 2001 From: Angela Zhao Date: Thu, 6 Mar 2025 14:13:35 -0500 Subject: [PATCH 01/21] export to json func --- pygridsim/__pycache__/core.cpython-312.pyc | Bin 7125 -> 7211 bytes pygridsim/__pycache__/results.cpython-312.pyc | Bin 1462 -> 1789 bytes pygridsim/core.py | 6 ++++-- pygridsim/results.py | 6 +++++- .../__pycache__/test_circuit.cpython-312.pyc | Bin 10371 -> 10855 bytes tests/test_circuit.py | 8 ++++++++ 6 files changed, 17 insertions(+), 3 deletions(-) diff --git a/pygridsim/__pycache__/core.cpython-312.pyc b/pygridsim/__pycache__/core.cpython-312.pyc index 8705a4ef3802f47c4d1a4d5a6e93a430cb92db9f..13f963dd346f7db6c9949d23a6d69b64d9604e6b 100644 GIT binary patch delta 1148 zcmY*YO>7fK6rS0&*AN`r>-YyJDLCQBI8bPyKnMX;1e7*lXn;s;RYjI}8&-I2^Ja~R z;s_2LdMHw(K>~54>Y<7R2j39lf`n96JycM&8iCv%fNKSZ9?N^{(83(Pee=Da`QFUi z-*zvJ#eVMX?P0j~-2Z9z^S;H{YJPjM@a0Ed+=_E%Gux;pJkv4*J5o)0eO6y!uc)TH zw3YTUR>sR(*~L3qzIyS|wINN#E;JpOn-TSD(|7AN6>}~%>fq0SBbrrTNSmMK_v8b9 z$29HORc@Jf{3^4ObBSWIJ+D31H?2cCMO}rVT$^=Wx!heD5Ft^vL|4@ylAZB zd3nq5`EWZPd7*vL&4i7V(o4`!d66Iw3Pfxn*ha7kK}AKq2^D9iR<|7iBS?t|LcY5o zFOT$G#^R59+I$NYFBLT~@e2b8%Z1gdO1)NdD%7li?c^=UAEE`6_Di&a*`vJ{AA6gf zB>x~~hr6;q4iX4<5$r|~VT3>eDtH(Jtg$P;UHdfXi>?B60#d4U;REca?E%_`&R;Bp zGRlpHQ?uU+jJP%1tzd&iiW`x4%@Lk&EAx~#w2v4{FY4W*230W*mW6YE8o9Nyl-huu z_$gE&U#9+zuE7Ao5%MVRReFyxjCMtrqnXsyNi=UTmo4Zmeu#aQU~D1eQ*5wWp`~TJ zrME&8$bFj(v6co=pZW1Nlb{xZy`y7^t<=H4fI;g6MxD_dc>eLXwR^B+)XaI^HV!TZ2_ zjc&^ga49EqAFiZ!OGU1jT*wuwLlmAyP~oE|&YU_7n~6vf5jlNk>fmRk!!SxzUqBt3 zo;gO;7*XQ{M+r&%ksvu@`x`p} zFPy1(V{R5)Te#lVs$0WXr-40M<%xmx1yUEN4tnXHS0?U14Qj=N zSGSv0XFr@n2R)>qS^rz-oIhu|4x9X)O?KGk4*R6TCZ4ek&)AL*8~>G!|H+d7gidOF K@D(ErYQ6zHg9cat delta 1065 zcmY*YOH5Ni6rFkfJgB8VNq>WtRK?!y^x0Xwa#me#1dVw zAO;q77P@ldiV%%SHzsb}m>5k=)UfbHBE*EaaA9EK)_Y&U=q%2=bMBlw=g!Pq>s#-& zy>Do+5E$#P-_HJYRct=`q!PV0LWx8qbJm`7BprGzW}P`#(xu0B*~XkZ>CQDJn{u9{ zhmv|CkT{X*7l~w96R;d1NpI!dij!)#TP2yzuqshG(t{0_ZJU-D1%x!tx%l1|AE z=$d!LoYji(+0bzaq%nhLVku=-W>%OnA5v!43Lni}NU>B-Wo>-f+(v`^g}F$>)rhz) zjMtPbf|3RVKk7tX$J&uNg3yf+1<s5YVY+P>YP6#pw`EjdQnCOf#nn1zC~y4T>2> z%A}#e4qO-GZ=9VpSpDUk5W<7Vpgd-%6*XfO^KeR)=ca*c<&rxBojh=Z3%=#`b5GN@ z^&l)#DL@De)_M9bg&|H00Qzks zvdc)y0)OUtddyh6ZxLTlMpiYE$!aNER5g?So>bfePl*K~V3T~s8=&oc)q7antase+ zX5s3V_bv^!U{*ghyfppn*?$d`{Q+9xkNrnY*hYeX@JF*DTSa*i2S!|2$rO|_sO3_0>kb=--a@mTrZ4)-xIJ+?}MAAbk z6_h9*%sR{3L91ba|>F8 zlW(*acF8vmeY63=hbJ%xE;ic)p$I75hb>x!CK_xtz~-%5YhVy9*SJ;l3>q+}Zq))- zaUF@gQLRfZCM>sMdv3t$Yu<+-t}e}YW!rLlH^kv?liOk zKEh2r^@Z=h+Rb%WZnOuT_)dI(y8Ghf&9#=lqmamSayz+uSCbQanLIs>6kUypLsh zu%9OLE%x~Ml>FrQ_#$SY=|y5dVkJY7IEXC@ByMroNwx!O=G0kn_wD;KDWb|XL z=%$N!CqD44p{AmHL_m@Sdje-&r764>?vvUZ& zP9MxFhnyF{kx;KR`Qm6(Qyh`l63@bvF@`T(3owt@tldhY%gG1m7)uf<;xLgW`iOBt z!n~{i=9g8A zlMmHmsEuhTyNGN4MR=g3d)7f$q{>A+6)3|pHUd+zC>3JFFmZ;k5naT2qCk`gMqDCX z1kI3j67emjai;eG#Ff=v0pPhhuzXL0dZWbV%ysPlH!&)D3^h7IC^#efpoaIvaa}97 nhQHPRWwk~Bi#&$@;0_@L5QX~_pS|G^-tY$3+HTC_x!~@<(j2p= delta 514 zcmZ9|O-NKx6bEq6Q=efv`7!wFrEf-OaJ-5Q)vgajQIOQflSXG$92qr7oz%J$q(TJh z#-*K2gqFCg7A3b;tCnGITm^$mK?HZY*ZUuE|I|MQH*0WU@qMhWjTwzDogECdzB$d_@^(-N1;m9>F=dNSKQ)BYsBorsP*cMlqb=t-CAqMg?mh z8ez1^K@bORUQ*@ z7!lM?E_CD#a4u5W(^?H!#1%1E; zeqe(!Fac)3Ja`T6fErK@yepHkjjz=@t0;CB9!pES2z0^YrU+5i9m diff --git a/tests/test_circuit.py b/tests/test_circuit.py index b7d88eb..d1a1861 100644 --- a/tests/test_circuit.py +++ b/tests/test_circuit.py @@ -97,6 +97,14 @@ def test_006_multi_source_bad(self): #circuit.add_lines([("source", "load0")], LineType.HV_LINE) #circuit.solve() # TODO: can add assert to make sure it's in reasonable range? + + def test_007_export(self): + circuit = PyGridSim() + circuit.add_source_nodes() + circuit.add_load_nodes() + circuit.add_lines([("source", "load0")]) + circuit.solve() + print(circuit.results(["Voltages", "Losses"], export_path="sim.json")) class TestCustomizedCircuit(unittest.TestCase): From 61e9232029de0d5a34d0c89566f0a09ea0c41cf6 Mon Sep 17 00:00:00 2001 From: Angela Zhao Date: Wed, 12 Mar 2025 17:24:17 -0400 Subject: [PATCH 02/21] refactoring w setattr --- .../__pycache__/__init__.cpython-312.pyc | Bin 363 -> 363 bytes pygridsim/__pycache__/core.cpython-312.pyc | Bin 7211 -> 7127 bytes .../__pycache__/defaults.cpython-312.pyc | Bin 2146 -> 2191 bytes pygridsim/__pycache__/enums.cpython-312.pyc | Bin 1524 -> 1524 bytes .../__pycache__/parameters.cpython-312.pyc | Bin 4885 -> 4442 bytes pygridsim/__pycache__/results.cpython-312.pyc | Bin 1789 -> 1789 bytes pygridsim/core.py | 18 ++++---- pygridsim/defaults.py | 5 ++- pygridsim/enums.py | 7 +-- pygridsim/parameters.py | 20 ++++----- sim.json | 10 +++++ .../__pycache__/test_circuit.cpython-312.pyc | Bin 10855 -> 11465 bytes tests/test_circuit.py | 40 +++++++++--------- 13 files changed, 55 insertions(+), 45 deletions(-) create mode 100644 sim.json diff --git a/pygridsim/__pycache__/__init__.cpython-312.pyc b/pygridsim/__pycache__/__init__.cpython-312.pyc index 79ee4720ccbfb528ecb5ba6e59cedbc32ecebc5f..0f3dbcedac31b9c95bd440867346bf4f592b3402 100644 GIT binary patch delta 20 acmaFO^qPtLG%qg~0}$|4p4rHqzz6_5gat(a delta 20 acmaFO^qPtLG%qg~0}!0%owSiVfe`>c1qECH diff --git a/pygridsim/__pycache__/core.cpython-312.pyc b/pygridsim/__pycache__/core.cpython-312.pyc index 13f963dd346f7db6c9949d23a6d69b64d9604e6b..365b302f48d5e10e053340ead647c590028b3351 100644 GIT binary patch delta 1342 zcmY*YO>7%Q6rNefe``CA9Vbp)XeLRMX4^C=zfGZ(5-Eg8A(XhOq8u8nJmau!ylc&F z(xyamD*1%UX%6AQfg`jBf_&lU07Bx#C8dX|D}+=bA-FjhE}VGJjtd!SzxU?-%=_lO z+51zE&UOBnNazICtA9LL`zQTH=hsvZ;2u`vd-W5|SBe@BiZEcP8eEAU>fvg~iY{W; z`&yy@M~m=CF~FlD201$9BrH;-JXWPEoolGYK}+&Pm8^8}PQVmT^CZ~PybE^STPdU4 zk6zxIl@`xiCH1k^OV?FRn~ZzmcAe`Hbtl=ak^!BDRW5KV7WAX`Mrn23F}b=I*iD{+ z$Q@FTkWA0ciRwgcxg)NP4S~@J_(5sfYeL3hC;QP9lE*>#p|UB>k}HSR-Ow-{P> zv`_sKdb2W!?wIRr$bwk)w#uT=?h!ah2Yk41|lYb`xb3~Hufqer7} zaPBgbl}yWKo6fptt_jvUoLNO?d5k;4wNH9X+_GG6oTVM_Jt1#eu3&;&o(m!BY~-On zCPm5F6x?7c5Iv|+nSfeGpm`fP3c5TE;37B1m>dA z*dc%Ah@Sgs^pn#MqZ9kugv4eP4sQi&Ye9_)X<#RI$rd%V+mmq5e6wK;8^$b`IksR< zk-=-*P=sg4l)6h@rKZH%ViGHs>yr^VPC*Q^+>$+<&y6`Z9;kDadp& z{SJ|XwV(AG9Up?-0vwMQk~k$J+!}eT;Mle(c$QaVfeqs3v{qHn^>V! z?d&xAk70JOMf8Pc0>VoOF9Wzi0BAN+SC2a-oH3t#UZW$blIojy4Z|)1_#HPkP3ecs za#`5C%_eNw+$soHj$xdken_371GRc8uMJ*63#P+(ah@^+;D@G7SKPRYBUd~#0<=HK zKuPr^+pl_iev3Z~K`uT=WE1H<4{WA;yC^-b^4S+d_#Whv`Y@XZ`;+YZls$tM{3V)A zYTi{IIb*wjE{5}8FsM(AjN0!XsW6Q10q}!wy|a{`k*Cm*K|}b;(&F^o!i>b0pGfNmykJ9C4XuWZK$3hCq}0)Q8CM$angqON$RKEgq1BHo5mo14aFKKns1EYY-51U45RL ef#&_4dz?F3)Q?;!IecSXT$Dxi`?1$Mkj}qEhd96h delta 1281 zcmZ8g&2Jl35P$pDyN>O(>u<--my@PRoQ4FVLeq#gQrnakN|47|<8}J% zP!dwvNERnl1wBx>a6m|?ReC52r@{e=3m=!Hf~Kr`-~tCu4*dt1@du*J;rC{L^YLcp z&F&xHp7Q4rkKtwWok`XbeZm@D0)9D zdBU7onRS?M@Nxogs*H;0-BG#}GyWbqL50{U5i`G5&>-S zc%G&61w(447x$=7S{L8Yi3F22NJehoT6VRyCAYA{-L&iyVfo!o)pl8{h0JnMXC>Q% zYN@!&4O48%Td@}*rb_A^Bpj&@*2W)4qSe7)XmIDGL!%>y!I+Y5h3i(%zD%4ht;;L1)HEcU?W!~1y#x>sTiw{8p4!HC_;towlg%{z))SR~A8-8s#zu~_5C_9gkYKnv_Qd1g4Beit z>QCg*=DAN_yHnnunAw|{`C<82`RZfYxi5zvg5}1Z-1$fj)fJ*e>nd?acWH#~=0ic>qq{1<>l$_83LWGL3S+XqEURT8G6IZ5Uqiea(;tcK*;7 zrKxsw5bfOZ`a3$e zRefc}v{<_uXWn9Y1IC*|zfoZXMy2G=?LeCLpF{@3Q!>ZJ;VOWwp4Lm|^#$Pi1Pvd7 zvPZ&jrKrT>;_L9AS}!=2aF>!$&6klAP|fcVza;gEgXl3e2?o9(j>gi!S7Pr;$sS~I zzZ*kp^va*fk%(XL;H2kLl1)+}Va1PB`q4iEU@Pa}m`~60qez62a9*Cjbo#>FEPny1 zP=mU-khzG|6jIX&=Mm-*E+H%+TmiUC8n4>eEgnM_0k^e;zfFz&Oh)Oifnb+JjJhx KkGp0ZX!!@Y8z)8p diff --git a/pygridsim/__pycache__/defaults.cpython-312.pyc b/pygridsim/__pycache__/defaults.cpython-312.pyc index 67412c23afdea4d5db65167c438bab0cc38583c8..e94931a55661550067a70e056365a951119eec90 100644 GIT binary patch delta 322 zcmaDP&@ae)nwOW00SGF8UrbM#$ScYCW1@O{eTrC=04GBVUkYnFQ5g-;#Wy;b4=|%-n;y`f&R51`QN|KWyogqbP5o44Tkd_A0(m+}UNXt~p zYRV@Xk>zr~VW zmRNL)tso<@IJH=leR2Y;sOBxEAOj#ayu}m&q$3P9nQyV>q~@iUWZYto@bJ0C>YSgK zSL~-LJGqbbG#96*Z-A?dqo1?u#!&ogaw_`_)*C!R4V;tz WvWM||UtkcvrC@cDLAJ;oC=USF#!v$Q delta 296 zcmeAdd?dhonwOW00SKzLpGdcy$ScYCWukg}Jtsp7UkYnFQt34gf&s4r88k%8eQ6Og6Ja*HWD42Z*Tv1ErO7Tsbi$Ve9$SCM&U=XXKsyiRA_( J%jDCnngF#|5E%df diff --git a/pygridsim/__pycache__/parameters.cpython-312.pyc b/pygridsim/__pycache__/parameters.cpython-312.pyc index ebc049c5ed9bb78a92cfd6ed02b8ce6961a89c7a..9922eb40c2c14fd81a2de0ec0b5f1e55d38a2008 100644 GIT binary patch delta 943 zcmZWnTSydP6rSr|X0J2Jrsc}CSnf!nrbJ?*`4MrW+O=*r9}2_s4LV9*!$)>n>UlazMY z>^DUxbxLFRd_WkWf*isVM=XEe>XccqfbT^X%soIXi(~grQcP(o&i=`=%8MM*0Hjb1UuWu6%N4Va$@qe%f<&_qn{=uLMKq8yRLwUIjkbhq-_QZE0Ju#B^+>))PlJ-LMIOn0hBvKq6jUy51}cy{jxO_s4Ar}ok#?%0sB_M z|KrAffExn1afmN)bj|a#mTyjLGOyhbHCW;*KQ=0fnydnlc{M$z49dLuqn&9P|aaB{%sv{2#dZXx}FN7ZXL!3YvM0+`Cg+X+K?XEy?{Q~g4>2JVKp%OL} zI0@%8oQ+Mb(a8DchNw~oSfEe~8}yzrQ)GO2RHeW}ciBQV0?q|cbs3f^Y$t%;u=W1e z=T==C^=+B@wrpj4Hm?J@xTB?;zLIIuWZCwZoVzkVxj49TcB7^#Q`3|UHm^HcfLwog o%Z539NZ@$X%JtgJf1*Ut5*NfTq0d~kCm;83R~6u#atJbi0lDbbC;$Ke delta 1300 zcmaizO>7%Q6o7ZVyYbK3yH0RvQV1HkRT8UdH^0u0thUhf50Sda!Ig;AW!5{1U9We{ z?ApPVrB^^`>P$Uh6I7A{?We8j@%am{bR8$6@*OmyNluBP`n$e z7TLJkm8(VSMrXw#`gQc(X)?r|yGj!}4MfsRC!EBbnvisr64X@Mr4*5C)n_QqRm)w{keAdj(T_PLGDrXss32sk#`qY zJI60~wEV4=+ZPTvO^)0-ez*Cc{pixu{Nw!2`Q2QhW2|+O@3GiRKhr;B6R+}Q`tolt z5PDC!Nifo74GW}9LEz0z{Ivi?CbWfeoZYY9qpSKMYc0LwAosjpRpILs4kG?S) zoC|_I@KRZ2R@N|_muNWg8(oZ~=mqT@{Uwqb@Nk2a5dABXy~(TNHfmFhIO)pYliK4C(uXhK61SZc0J=w$6qNFPF!jEW$YT3gDqpm%5J~~G{2OcE;07T z;@sj)X==fqU0ASYrYsv;b8y;1$bgQ|a7OW;!qrkOe+-=Mvdz4i`JL4%)S4rjUNHk)n< zdujSYKXd3|?)&)8`m@z*yQ|kaXUyGMvy=LOP9hWDvOq>0rrCopO0tJdw+9+A&YL~B>|w(!SroH}ZP|9d(?VNB<4yYO zJ>NO~zTf$s@B2=F?Z0)z^u5WXSCJ?3cOrn#n|@=2Yk%Hmjb>t!83JX;`9qQq&9W$;n*BlKj|HPL z3qHZ=C9Y3blHg00co)86-G%G4CKBX|%N`%lK4cgN_V8t$rSMyAXIPdcSui7rjLHBw zn9%hP^tB!Ewj(!~v|!@)cMlwDN9AD9&^29yBb~4&7tit4&I*{Q1lSBvMIcS-4}RPN zl;&#g)wCpPS{8xb9(>JGiLV;<_|u%e6vG_-NoJ}B9Bc*H2H+sjAux&|ihSep8(}mi zAq4zU0|6m-9eLCUQ)|T0b{MYFMmu0g$%3jIG1gEOe>c4UY|7-+;t!3dnb$U;I+@cM z9GChhBGOA#Oe$XnUjvmdV=AdV&bJnLvMC8%@`!Un#NkMkcto|pxgMaJfDDIK1`o23 zH>DaM%&W$Yc>$x4unO~|i&kOD+J-;RL&+>-`f;PV9zS&H@j30JM&tr4zNs(8A-f)1 z@>>}#{#j$gqxof1Ixm8)EyGEtPeEXj6XI~8uut4U_w z==P_wXTzf~k|^oyskNM}oFJBI)lU`&u05;!kSyU$hNe|*-7fL9?htmRADkGLox|}Q&^CauL95Lo7R-$h;mjuU8LP8 zd6Pn!*5|2*aD1jfs1;_{iIc?_cIb*qa&)Ajp?M_LG{(%NMFbe1^aaNb6iHhYZE97;Wk$z6~!Jt@;b0JGr%Y`K^dH8~jD#0|OjGD)sUCq7q9x zjI(xu7mD^U0sL=KQHJ*0@i`}FT&Ou4zLVQ^m-iBn!?vBhv``@LQ2~G*U<*Jqz;1vR zfHr^*fc*dm0X6{?0zjo8=*&ouf3bC#b=65Z%N;g&rP0>^(2oDHSJX_B`4y`1(%?Q*=^Yv~-c%k%&@E%zvze8YJ^@LXyIJ5fFWpQTT z|9!cp1y*L`9S=t?Pj1r1W;`(;i`8CkPVAf5XFgK@9BD&L(j zy64#ibwYS`(db?>w#U!94eT&DT>g(dNndo6bR)rw#3-cN-xyh?oJT~WXUS_3S%QYp7z8B-_2ae~|JpN#d!*Ct^ykMz6+EO}o z1J?HgK;!WeX`a8Ib+qBiLjYfsj|_kI&Zr)-EXP0AvRvJYp5;tQ_OM1UDY=n}01Aq7 zaIDTBMiOGw_?%EUs3Ef%|2A|mgeIf#vGHIOE)a$9C%DfiOUb@S^`g&Qgwna delta 2614 zcmai0Z%kWN6z?s4?d#gEr7NX{(m#NOCmqninAsc~o1NfTVXUx>{i&tz$-0#m?`yMx zi;x(jCVrXsi)JRvq94Gh!8Ar)miXt})DJXSf_d)4_Gz-XL}mKXdCx7QEra&}GwaX#R_TepDMPsYpf?ym%Y=xnd8plkaWL zoKI7Y>>4UoEHP1x%IPeQOVLzXlw@+4Yd~g_=InMWY|zCMIG#;pWHo33HCMPHoj1>W zZ}IhHmvaZXTFsFbt%<6Bpm*kmwD%Emk-faP-vj5h{b^a2WWj>L9`*rfVL=xe9y-t$ z4&izb=|IHw4h$a);RX(kMt?fdfE z_bmd${UoWMMfThS{S*qez@hB`tpF|xhXkY;GB}o!UrFN$31i@lgA|0VSVLy)j@`fv zcL1#M!ksW>Y|Jp)jMB2<-Hj==k}r)xO6#8S4K%X>t!aIKA|*wpCZ*jhSS&mx+zc!{ zB}>KFvS>1<8}Ji2%q~@*r0Sy?sviefDBHn}W(qRI-3uSyMn_6hMv^np_Vx}EblXUS z85;w6Tj1;3MO)yOEkv%FaUrG92=RG>(m-}$rvDYnuj*+5{k~kK+ z$N?I*X=mqAcA=1m*alDoAOP$F*bT53AOz3{a2OyA-~@o^u*}5<7#YYT=OGK?+$$C> zH-HMuhTL$?epG9M4O;<9yClqQWTDn;kYQK_U?;!U)_WZ=WJcES2b$AvvQSgi(VCHB z_=WU^)I};=fnu6f-QkVQaM`UvTVc0mrG+yJ6(VZLtjEub`f(&~5w&E&^VW>=0-Yh_nO1&WI$NU*&iVrB+<}^E|Xk?zp^oJ zY+Ts!T}M9f;-azfma#W?zrmnB0}7WP(XXJ3xysy0d`N}DYD+jzcPaYN#ke$?Nu*P( zbtzj$V#%x&!Z?i!Esizya{I^pN6-i4nt#v&_U9rCJLX)Jjsr{pV1O)u z6QEe35tss`$aSH~)`$MGn7J@osn>El3)>>(Z{f~U3-ym@YYkt4o?@ZS{7<1eBlJn@ zkKu9YVBuezwVJ&FijD&S$uJGs(;Z#s&jmPn0jfGjuD8_GF;77#n3S!PQ{y-x%87~A zcp6JIrT%QG8iD>$@{02?g;uNZ*;FC}`K<83_Fznw3Js0Lj2S97uJF%Kq{VDf>c+2= hQ-MJBNrVQ_`)8NjZFzUwLlv7oyrd>q1AYw<`wzU2M4|uy diff --git a/tests/test_circuit.py b/tests/test_circuit.py index d1a1861..f6cfa37 100644 --- a/tests/test_circuit.py +++ b/tests/test_circuit.py @@ -30,7 +30,7 @@ def tearDown(self): def test_000_basic(self): circuit = PyGridSim() - circuit.add_source_nodes() + circuit.update_source() circuit.add_load_nodes() circuit.add_lines([("source", "load0")]) circuit.solve() @@ -39,7 +39,7 @@ def test_000_basic(self): def test_001_one_source_one_load(self): circuit = PyGridSim() - circuit.add_source_nodes(source_type=SourceType.TURBINE) + circuit.update_source(source_type=SourceType.TURBINE) circuit.add_load_nodes(num=1, load_type=LoadType.HOUSE) circuit.add_lines([("source", "load0")], LineType.MV_LINE) #circuit.add_transformers([("source", "load0")], params={"Conns": [Connection.wye, Connection.delta]}) @@ -52,7 +52,7 @@ def test_001_one_source_one_load(self): def test_002_one_source_one_load_no_transformer(self): # doesn't throw error, but should have stranger output VMag circuit = PyGridSim() - circuit.add_source_nodes(source_type=SourceType.TURBINE) + circuit.update_source(source_type=SourceType.TURBINE) circuit.add_load_nodes(num=1, load_type=LoadType.HOUSE) circuit.add_lines([("source", "load0")], LineType.MV_LINE, transformer=False) circuit.solve() @@ -64,7 +64,7 @@ def test_003_one_source_one_load_exhaustive(self): for source_type in SourceType: for load_type in LoadType: circuit = PyGridSim() - circuit.add_source_nodes(source_type=source_type) + circuit.update_source(source_type=source_type) circuit.add_load_nodes(num=1, load_type=load_type) circuit.add_lines([("source", "load0")], line_type) circuit.solve() @@ -75,7 +75,7 @@ def test_003_one_source_one_load_exhaustive(self): def test_004_one_source_multi_load(self): circuit = PyGridSim() - circuit.add_source_nodes(num_in_batch=10, source_type=SourceType.SOLAR_PANEL) + circuit.update_source(source_type=SourceType.SOLAR_PANEL) circuit.add_load_nodes(num=4, load_type=LoadType.HOUSE) circuit.add_lines([("source", "load0"), ("source", "load3")], LineType.HV_LINE) circuit.solve() @@ -84,23 +84,25 @@ def test_004_one_source_multi_load(self): def test_005_bad_query(self): circuit = PyGridSim() - circuit.add_source_nodes() + circuit.update_source() circuit.add_load_nodes() circuit.add_lines([("source", "load0")]) circuit.solve() print(circuit.results(["BadQuery"])) - def test_006_multi_source_bad(self): + def test_006_update_multiple_source(self): circuit = PyGridSim() - #circuit.add_source_nodes(num_in_batch=10, num=2, source_type=SourceType.SOLAR_PANEL) - #circuit.add_load_nodes(num=1, load_type=LoadType.HOUSE) - #circuit.add_lines([("source", "load0")], LineType.HV_LINE) - #circuit.solve() + circuit.update_source(source_type=SourceType.SOLAR_PANEL) + circuit.add_load_nodes(num=1, load_type=LoadType.HOUSE) + circuit.update_source(source_type=SourceType.SOLAR_PANEL) + circuit.add_lines([("source", "load0")], LineType.HV_LINE) + circuit.solve() + print(circuit.results(["Voltages"])) # TODO: can add assert to make sure it's in reasonable range? def test_007_export(self): circuit = PyGridSim() - circuit.add_source_nodes() + circuit.update_source() circuit.add_load_nodes() circuit.add_lines([("source", "load0")]) circuit.solve() @@ -123,8 +125,8 @@ def tearDown(self): def test_100_one_source_one_load(self): circuit = PyGridSim() - circuit.add_source_nodes(params={"kV": 100}) - circuit.add_load_nodes(num=1, params={"kV": 10, "kW": 20, "kVar":1}) + circuit.update_source(params={"kV": 100, "R0": 0.1, "R1": 0.2, "X0": 0.3, "X1": 0.4}) + circuit.add_load_nodes(num=1, params={"kV": 10, "kW": 20, "kvar":1}) circuit.add_lines([("source", "load0")], params={"length": 20}) circuit.solve() print(circuit.results(["Voltages", "Losses"])) @@ -135,8 +137,8 @@ def test_100_one_source_multi_load(self): Creates 10 loads, some of which are connected to source. all loads and lines here have the same params """ circuit = PyGridSim() - circuit.add_source_nodes(params={"kV": 100}) - circuit.add_load_nodes(num=10, params={"kV": 10, "kW": 20, "kVar":1}) + circuit.update_source(params={"kV": 100}) + circuit.add_load_nodes(num=10, params={"kV": 10, "kW": 20, "kvar":1}) circuit.add_lines([("source", "load0"), ("source", "load4"), ("source", "load6")], params={"length": 20}) circuit.solve() print(circuit.results(["Voltages", "Losses"])) @@ -148,7 +150,7 @@ def test_101_bad_parameter(self): """ circuit = PyGridSim() with self.assertRaises(KeyError): - circuit.add_source_nodes(params={"kV": 50, "badParam": 100}) + circuit.update_source(params={"kV": 50, "badParam": 100}) def test_102_negative_inputs(self): """ @@ -161,7 +163,7 @@ def test_102_negative_inputs(self): circuit.add_load_nodes(params={"kV": -1}) with self.assertRaises(ValueError): - circuit.add_source_nodes(params={"kV": -1}) + circuit.update_source(params={"kV": -1}) # properly add load and source, then create invalid line with self.assertRaises(ValueError): @@ -170,7 +172,7 @@ def test_102_negative_inputs(self): def test_103_invalid_nodes_in_line(self): circuit = PyGridSim() circuit.add_load_nodes() - circuit.add_source_nodes() + circuit.update_source() with self.assertRaises(ValueError): # only has source, load0 for now but tries to add another one circuit.add_lines([("source", "load5")]) From c5654d37a6741be6ffbb2a8ac1eee33248a7c8f6 Mon Sep 17 00:00:00 2001 From: Angela Zhao Date: Wed, 12 Mar 2025 17:44:30 -0400 Subject: [PATCH 03/21] pv system --- pygridsim/__pycache__/core.cpython-312.pyc | Bin 7127 -> 8141 bytes .../__pycache__/defaults.cpython-312.pyc | Bin 2191 -> 2191 bytes .../__pycache__/parameters.cpython-312.pyc | Bin 4442 -> 5376 bytes pygridsim/core.py | 31 ++++++++++++++++-- pygridsim/defaults.py | 4 +-- pygridsim/parameters.py | 20 +++++++++-- sim.json | 8 ++--- .../__pycache__/test_circuit.cpython-312.pyc | Bin 11465 -> 12091 bytes tests/test_circuit.py | 9 +++++ 9 files changed, 61 insertions(+), 11 deletions(-) diff --git a/pygridsim/__pycache__/core.cpython-312.pyc b/pygridsim/__pycache__/core.cpython-312.pyc index 365b302f48d5e10e053340ead647c590028b3351..4d7345b5a7a8cb4c2fa5ebbe7e7e64b06f66c19a 100644 GIT binary patch delta 2408 zcmb_dU2GIp6ux(6e>&UkZnxd;b{Ej0OJSEvn}#Y{kOBfKV5t-qT%vW@nQo`unO*Np z!7U|QOat*j1G)b2WPH(R-~m&O4<^RMH;sgf3K>Jn3qJT%#l$C#=ghKgdDOVcesk}+ z=X`Vi?wOlgz8eUA+td^w@N4*czOW{CG1N{!ytv`uF{3HhM2SjNZ!u(qb77-7*X-_n z#fZ_8YjM~9Vyh9&Mcs8nvCW9(Vn#d{H`;UUlt@G%PZL#|C2HWZfUh7Vm$>+iPDS2F zJ0!<%C==R9`6SQM)ASnuo+{M>(TOUIimHE><^nnyrD_AL8nxhfvc|9yL01CZfEFAT z)W%tFF63GS!6IBh+a_2wtD#wvi>P717PVDv23e~bfnBuHl8HLfP~~Z+tHZjHr~E@9 zN~ic2LQhhq(_}=fzs;8FtMLGLqN@d4;!*Kc>f>*S=?2GVP8t}I<`KZv_-iT?9jU)y?N?Y!7}ZtJ3#gcFNC5@?y}VJUuHN>!EMgRSBgOS3g* z$)hC(-BHj?jVU&)?>7uQuv&SY~4FssHB^=j%C_muo!uFcLb!Fb zaD>+D)P(g|O376G!9pz^?88c--C4p?b5nsi`Up18An>-pldS^C_-j+BF<&xGXfM5F zS`16f()@+s2AD@@gDINj9|Q+r9^DP*=;L*cR@7RJ9NwCrTU|4RClO$*5X%dI4TkgT zRH&Dp;2(!}0MoCbHsNK~2d9q5R1D1#CbIB9>Ubuy3d=}r15)6eWFmqeHATy2Y&UNA z;MOy7QemtYmh~w7x~b}U&8qc(7tcpFLIiI{dT43x%ScLCi+$@dWW*XTUIE9qOR=1>X1wuHxr%J4m5}XINoOt9vR-l9zj7H z3jBwU9NP8l;2ze4qDK)PN5B{y|AFkt0X!T)(N2Wt5QY(sBB0~!C4?;q_+odOuy$M_ zG!YUe)+JcYlHUbM=va*L)yd86WPSQ-$5*}gNLXlD>>#Pmdqfg^i|zb)a!=6ZLF>Ux zl3z(46Ih7TRq-d9krh99PPkktz^B{NjqajuLea6Qo!GL}hA*xK^TU8S!dm(BtJ-Xg z$&K30Ma{(r-F6zb86|bHsBLFOP{w*&n3F}3QhJvp7RdgaWd8!`S|I!8$-V`$?KbJW ZO*Su({&~`WhqV0Z(FMBtcY^3<;~zf0XRrVO delta 1427 zcmZWoUrZcD7@yg_e|y~j@j)_g`e5RV8Xxi1nE2oeu}Kq?CYv<)U`&iJP5WRp(fECPMNl`{-^~2x`+oEN znfd<8-HF&iG#V!GUHs+F`X8yiSeAaecjo#HN*H1OYSfAuF)MDwy>+0Pu#!g7n+K~Y zD{Z8`d8pcHWsHo~Wpr8HMmHrIQOF!&T8psomkP=gVr2JjSEwQ<>7XppTl8CbNX=d5 z=fSeVf-RpB<{cZ^w(Uu*5Ed${OyeD37jF5DXoZw1>u6CUwvMw1%;GHCB1VG60Fx}m z;=rX?0#@l}Qct_uVslPZ*iywR(G%jT1`8GbhgJE5G8$R2DiX=;R~WGUKDLoO-XsPVLie|c7}$R`wolJv+6y3`gi+)G^k6&Tj*?xg@lvB=*Bmj1yQk$; z;tZtzdZI`#$@dahAocGO2Aw?8NTF3PYWUmXj(cthPa!-F;P?TcFkWd^Q)6^qzMq-_ zrGr#PVXm)gn}9Xb;;yo}0{<(nZ*#>Ix+aED1A8K{xB`3Ys!l_QOSrs@OW)?UDcpcr zuk#u^$|P8+u}XdHS!`xT>B|1cnW8cywAw zL*U}ij!{caWFcI6v$sd?Wq%&dgQ=)!c&CAQh00iOxFQ!K<=)!c&CAQh00fo4FQ%s~7%g5Z-66|2F=M;`SHfXK2VC^qfpM9QMA@>K=>ZjUVGc`JlXqxdHDr?4 z4MN$Xtw|4nVYKfnw|5MDA;XX1CGRL#C+&gAc;XaS6C7qa%yHn%>v-EySi#u+2*HwNeHrd4oCLghmeKK9y}fWy0|awi+Rq8*RaO3{J%yhUom^Uie6AFgqrqK|46O8i)EEj znN%T;&^f3I`e0#J(Xpb#3#pVs$;ECI-2dl^NsYZP2o_OE5@((>E?WiH_Wv z{CfKS2j8xKvw9Rg3$}|-f`d1=?vT67kA{yIRvHT{M-$n{mo7IZE*}LyuBSiEFup-E zG5gEtoQp~J_tD{+bJ#GL+w1DAu(Q{T+?L_M3uLcw;Nk7R2>)5lAQhFKV_C5Ay)n-L z{NY9j{poTc@o%qy5>JKoV`04^tp6sw{;LpbiDC3+3;WPeD<+~eY6XX5DB5~^1jU}8 K385>?Rw3Bq>5J62e~YJkE>9p(30ns08KU3L#C{%gp7L?3ysM z5n`i)Tpy;eP#f_dkZUY0w6d~MSP>g5D~(#&II|HPn9qE9@A3VGU1_=RD{8XTK^?%yv8c2O4b(fIFnMO&@3`%jDNawVsiet>4-Ue;< z>%#Fi3=?3p7xLR&j@w820EfM?OWc4I**&EWdG=g6f>X>gW%f$Hc&;cswcYDGd+j~`9=a6MC`obXh9M!g=&Ialf+Mx% zdj6DDSfmpplM>6xr8^I7ij!R%;d zA#1E|ohdm&ibcqZKtn(zlQo8{YHpRwNWXD&x82&gb+t{_*<-8P*b-IQ3&vF8>VJMV z&ZnaZ>Ep!)E%w!Vt>yWYlV#3{)%%e>o(_nIs27|?_`sd`Atg25CmDe_I$kH0m^Spg3=eM^HJ)2mTI4*%v>>HeO|02 V;q=^A;0nys1<3wv7Qv2v{{jO}lc4|r diff --git a/pygridsim/core.py b/pygridsim/core.py index 3e1a27b..fd54b2e 100644 --- a/pygridsim/core.py +++ b/pygridsim/core.py @@ -2,7 +2,7 @@ from altdss import altdss from altdss import AltDSS, Transformer, Vsource, Load, LoadModel, LoadShape from dss.enums import LineUnits, SolveModes -from pygridsim.parameters import make_load_node, make_source_node +from pygridsim.parameters import make_load_node, make_source_node, make_pv from pygridsim.results import query_solution, export_results from pygridsim.lines import make_line from pygridsim.transformers import make_transformer @@ -18,6 +18,7 @@ def __init__(self): self.num_loads = 0 self.num_lines = 0 self.num_transformers = 0 + self.num_pv = 0 altdss.ClearAll() altdss('new circuit.MyCircuit') @@ -53,10 +54,34 @@ def update_source(self, params = {}, source_type: SourceType = SourceType.TURBIN """ return make_source_node(params, source_type) - def add_power_source(self, source_type: SourceType): + def add_PVSystem(self, load_nodes = [], params = {}, num_panels = 1): """ - Source type is one of Generator, PvSystem + Specify a list of load nodes to add a PVsystem ("solar panel") to. + + Args: + load_nodes: which load nodes to add PVsystem to + params: specify anything else about the PVsystem. otherwise defaults to typical solar panel + num_panels: representing how many solar panels (to represent scale) + Return: + list of PVSystem objects + """ + PV_nodes = [] + for load in load_nodes: + PV_nodes.append(make_pv(load, params, num_panels, self.num_pv)) + self.num_pv += 1 + return PV_nodes + + def add_generator(self, params = {}): """ + Specify parameters for a generator to add to the circuit + + Args: + params: specify anything else about the PVsystem. otherwise defaults to typical solar panel + num: representing how many solar panels (to represent scale) + Return: + list of PVSystem objects + """ + def add_lines(self, connections, line_type: LineType = LineType.LV_LINE, params = {}, transformer = True): """ diff --git a/pygridsim/defaults.py b/pygridsim/defaults.py index afef58f..6c3426d 100644 --- a/pygridsim/defaults.py +++ b/pygridsim/defaults.py @@ -46,14 +46,14 @@ INDUSTRIAL_KVAR = [20, 25] """ -Source Nodes -TODO also fuel cells, other less common forms of energy later +Source Nodes (including other form of sources, like PVSystem) """ TURBINE_BASE_KV = [3000,4000] SOLAR_PANEL_BASE_KV = [0.2, 0.4] # per solar panel IMPEDANCE = 0.0001 + """ Units: KM LV = Low Voltage, MV = Medium Voltage diff --git a/pygridsim/parameters.py b/pygridsim/parameters.py index 659ce2b..74f15b1 100644 --- a/pygridsim/parameters.py +++ b/pygridsim/parameters.py @@ -2,7 +2,7 @@ Helper functions to parse the parameters used for loads and sources """ from altdss import altdss -from altdss import AltDSS, Transformer, Vsource, Load, LoadModel, LoadShape +from altdss import AltDSS, Transformer, Vsource, Load, LoadModel, LoadShape, PVSystem import pygridsim.defaults as defaults import random @@ -88,4 +88,20 @@ def make_source_node(source_params, source_type): if (source.BasekV) < 0: raise ValueError("Cannot have negative voltage in source") - return source \ No newline at end of file + return source + +def make_pv(load_node, params, num_panels, count): + """ + Make a PV at the load node given, scaling kV by the number of solar panels + + Args: + load_node: which load to add PVsystem to + params: any customized parameters + num_panels: representation of how many solar panels this PVsystem includes + count: how many pv already made, to not run into duplicates + """ + pv : PVSystem = altdss.PVSystem.new('pv' + str(count)) + pv.Bus1 = load_node + pv.Phases = get_param(params, "phases", defaults.PHASES) + pv.kV = get_param(params, "kV", random_param(defaults.SOLAR_PANEL_BASE_KV) * num_panels) + # todo: inverter capacity? \ No newline at end of file diff --git a/sim.json b/sim.json index 5f86f5f..8f47fb7 100644 --- a/sim.json +++ b/sim.json @@ -1,10 +1,10 @@ { "Voltages": { - "source": 3661799.375697402, - "load0": 274.3263413306505 + "source": 3939392.445246486, + "load0": 801.6009509982497 }, "Losses": { - "Active Power Loss": 769141628339.1614, - "Reactive Power Loss": 1598841291844.7805 + "Active Power Loss": 1549277840399.3896, + "Reactive Power Loss": 3221430546551.8247 } } \ No newline at end of file diff --git a/tests/__pycache__/test_circuit.cpython-312.pyc b/tests/__pycache__/test_circuit.cpython-312.pyc index a569bf3af0fe8a6fd8bb64a62ace43711eb1bf49..84a030cb20c34887de3c81098057aea1b698f370 100644 GIT binary patch delta 841 zcmaKqUr1AN6vub2?e5o|Tbgrox_{T1^RkgjkRcHf1WB+YO;N+SxN~Nk%R41zlKBVf z(KM z+uzu1l8LW@y?pYEXWf1lU;sOzuT(9aGxe6`Y>M4*;hNc{zlC)dinUGy>hBPvsj$MzBBvM(ehWtK46B(ISLi+$g z<}ga*sv2wW>d0ls5^1fL^dP}bs3YK-v)oZWmdK99nwm~2Q22}eWq*YXH)k^# za8*XOng0Vjw8MOP=38vuV!my5q$qgu%=6f_7TRiPeLlLyJlm`d?>Xx6tIVwL*>SCs z_lPRxc-uV;9r)QT!#QNtr>)-{qWJ=RFSD3i^l0@Az%9(z48yE`(z6T@!%yByNZ?QJ zjChA`F-y15ANXXUE=Eu2C#Zx$LXr?63=yv3$3O^D2=WBX>yz>#xTru8G%7aOmAKj- z*WzhS#bd!KSkU$086iZu!Y{sxjidX6PI2+-0v8p_{-DRvQ$GjG`ci!X#BrY0ZsL4H z1~%?1!|k0EUm|o7x(O8oHz7?JCEOrP5~c`M1e%m~n9%bFIowoQp-2CrI00Vr0iDP0 zaCO@&%3mhzPgm6bf9^l+r>TtA`)~A0<=6F T+VM5!eT};&igqvJqe%ESz6#jG delta 523 zcmZ|LO(;ZB6bEqU4bLPqKF7mMj~dLp=6SQQLlRlx4do+@VVKE$m`ryJjRlgjRcE7E zSSTqA)5}82!cJCfWOkM;q}W+-&nru}?yq~#x%YqTUWe|c?DsZXSrH%U?}sIH=IsLj z(>Mk*Vy;}V6(oGINX8@NC5x_9;+r#p4z&VfE<5z&x~o_GtQAWFVBETP0J6B{}6oHxf)`f6nB+SAo7R1xmEkMK5)+czV_xi(!8LTrWMMXIABVJTW znS}}|-1qLnq2W+oK}=C4gL!Ww%D!o4AAoe8tA7uYmk-7cq#Y(^L7lHbQ8vp Date: Wed, 12 Mar 2025 18:18:53 -0400 Subject: [PATCH 04/21] added generator functionality, added tests and modified pv system --- pygridsim/__pycache__/core.cpython-312.pyc | Bin 8141 -> 8617 bytes .../__pycache__/defaults.cpython-312.pyc | Bin 2191 -> 2512 bytes pygridsim/__pycache__/enums.cpython-312.pyc | Bin 1524 -> 2030 bytes pygridsim/__pycache__/lines.cpython-312.pyc | Bin 2437 -> 2645 bytes .../__pycache__/parameters.cpython-312.pyc | Bin 5376 -> 6735 bytes pygridsim/core.py | 25 +++++++++++------ pygridsim/defaults.py | 13 ++++++++- pygridsim/enums.py | 7 ++++- pygridsim/lines.py | 6 +++- pygridsim/parameters.py | 26 ++++++++++++++++-- sim.json | 8 +++--- .../__pycache__/test_circuit.cpython-312.pyc | Bin 12091 -> 13444 bytes tests/test_circuit.py | 19 ++++++++++++- 13 files changed, 86 insertions(+), 18 deletions(-) diff --git a/pygridsim/__pycache__/core.cpython-312.pyc b/pygridsim/__pycache__/core.cpython-312.pyc index 4d7345b5a7a8cb4c2fa5ebbe7e7e64b06f66c19a..119a5941c4f71809c835b472200911239bfab75f 100644 GIT binary patch delta 1928 zcmb7ETWl0n7(QoacDFlwzjk}0Q>egfYXNNnt`*wS(w3GMDJ^xiti#Uiy6w(xJu^!v zSwce^V~kPAG4b{QAyGjzF|H)M;3YBf!DuKnwwXZi!9){Z3Vkpp#(2(bx5YO-$$ayl zZ@%-N^Izutu5o;-4}Q$UwGa9jY_#R9$hGIk#rr zsweI-ZClo>`r(BKp&9p^FZdWF?16E;?);^%y7_v zQJjQ5ki%D?u+?z&DLDm6dLA8}ol%lyX&KqI$?9+TK9u|!ATudOw#~yhp8<+vDuM+j zbhb)y5Y|3#iMtf{)TT!rlx?z(PqDH?aTA@B=)4(_g0hSF@ujKdCYE3J%!7D9_7V)r zLD@&RknAV3@N7T~8TP}oeJCT3X4E8nWD6El0YJ~W`YK*zp21($xt+SBBA9aG2DSk@ z@YC!mXv1HyJH3WGS5On_O3WJmg`I^R_&C>GwH&FLYhGkRrE?t5_zkxzO)H6PUXl~J zysV%ajIB|az+YNpu(tH4^+QH5yrxFW7f@0$RU(T7vO5wfwBgU~dteLx-QGU&F(KXt zMW{LS_4CW{+M0b1rokDm2z$WfUI5NmiriEs`D9&X=$49Av=o^lTLe>9JjshYtQCIa zEix@A~VWI@jhN={c07963@(OFGbRKlTV;!5NU zeq72HlwO4L$goN?GfGZ2Y-Z3iCs94sSjz#o5F3fO-8t46Bc^tQz#MoG27K_YJ#Z`7 zb;sU)i|t-^dGNc=t|p_3lpvwgj^l{3GDtDY)x3#U?#N!b~FQ8nE`p#xF{a-r@`4dx0QrE~w5gL|c zzL3+`s)e?Zcu_lnwdP%SiW&%6DOHrJ%m$^EGI**Anm2%kS_z}k6bWSDM)!{KLzJN~ z2Ufzs>z|9>b$HJQ-iXaf%dBgO4KA?3w~k*raHao7&r-+8LdVEr=@sUxV#BxD z@H`he9tN@OQ%L(rf->%!_*nV{kc1RSaf&oIJ-2ZhBloqP?7y8oGl13dly4 zEJ-~Yq|+ff<)%+c$V{AQGxsuVq&}IXq9NMX2F&37p=0n=>HW|a#(I#h8^qsMBlu=% zcO(tr#nQ!^Z4kQfceS07B>8;Ww|-rb?u{4W8F>YFb`5oJ=Eb}>s#P;9B9}L ztMOn%^lXssW$7Oo8|_7pQ%QglwxeT5x(9}P(Jo3oMIl6a%jlu5p&_)75`Ie9hQ<>^ zRCs_={S?M1JWnA(fgTN|2wVkd3$>dlRIfn*kQ)PN9}t)a4;h}>yb{5GH?%jm?Ytqa z0w3dF*$TEtzn)y`oml9dcmO<1@UzKP`dVqm1Dg)osHb5ug5TRTTx^;AzFIFv++?Of1YLrX{H3xM43q_pFNLrjS>DN tA?bChJ%P_R2Djb?o9}~;d*HEq;K}=7;0_r08TkL;5CiKU0*Yn^{sI5f#j^ka delta 1272 zcmZ9LO>7%g5Xa~3uI>19?e)fX95->knm8#bg;WWFrfK6SC20d9q(NIjGKLH(dMzT)xu^*UoCFx zxmwWnt<7zk%{3L5t!&+47fG6kY=*jksIp4aVdv_gLz|QdT3^|Xver^Tzz%FPZUFKBuupZ=ESPyYe zEh{Ot=6aTt&c?1{r@y#^OzHtr{gZ=KDBpuZO*L@*O{XCEoX%gc@h-cUz?g=u?`aNS)A8}zH z@^DwGkTkqG1#s6_eHPgp7~P1QyuG-Zl2vyQVH4@T;G^(86qXAfNZnbHn!DgX(DTh&UB4&`$PeDCWeA zc@46%KyFrVDPNGDFe(X-l%sjri}n`8CBzi#Qm4sUbyZyvc<;ZCbYI1hpjaGranwYs zL}?n`S#+h_cQTY-;AYBYpICDlMcv5eENXXPghyB;xv#|_wv|to@PZdUb5+nF8J{`*y zw@u4_ll^Lny=ay=&TjO?<_g@$dAG0u4UrJ?D|FOh;b&N=!$=+Gk72$JFFk^RNAP?d UCXZqA7f}9^41pw00BJw{A7XqKN&o-= diff --git a/pygridsim/__pycache__/defaults.cpython-312.pyc b/pygridsim/__pycache__/defaults.cpython-312.pyc index 4a12178fab101c029bc4d1a7aa2de55a3c19757f..a3ab44b3a8db7c3fb3e11b56eb87579fe52f6847 100644 GIT binary patch delta 542 zcmZXOO-lk{5XYb0b~W>LeO)#4HAoNw>ktv>h9XO9=9@pIMzQm{y<8Q1@<100a z;?5C0NspM06O^*Y26Pq|{dVFm!nO{Ji-cYP delta 243 zcmca0+%L#?nwOW00SLnXUrdkSn8+u=^n+odMsGb|3Trx3lwb;Lia3xKN)bqlq4rZIzx)oBE~2wAT14~rGc~zkd~>G)s#!D zXJ%mF3QjFiNX)BLNJ-sX#wftT`*HzLYo-n(1H(%uhRF+AW!VIP0!6};kFc6B`)SHf z7Gt|M*^AwdQEGB0d&y)q4u5V-paP(JhT>lglN&hZGO|sM<&5UI$RJx}4ip6dLbx&f diff --git a/pygridsim/__pycache__/enums.cpython-312.pyc b/pygridsim/__pycache__/enums.cpython-312.pyc index cf0d1afa81857668a16e8d2d5d1055b793733ff5..1046d695e0f4af10ba1999fe3c515f987c6f6d69 100644 GIT binary patch delta 519 zcmeyu{f?jSG%qg~0}xzbyp(>7c_N<#W64DIcqt|ZcZL+s7KRkARL0fJAO#EzQS6mW zn%o<^Zm@_aLqs4XRGQ)QqREQPmRu=}bC{yoQkk>(CQo1%l@&l%3Som)Z~|3`fK=3r z;ZVT?w2t`}uX}1NGku*?wkqnUV)8s8;198|v1P6%V1QNG+f_)u* zeB#|*{o=jDPVayIxIi^v-Yr2-KbO$pkRVS-xLFuN;YFGt zYxzI~KZpSNwn!UB2m=|#Es1R@@{23L@%2^L`qh3gVV z7bT2#Xk51nxd=ppp^aV;8$gC@a!gKPHPHaugKGCJ4x8Nkl+v73yCO57LPn4S>?iML c)sy_fz|2^{_=Ss^F^qA7%U2*Tj1g=i0E?e@i2wiq delta 74 zcmaFI|Am|HG%qg~0}y2WzL aRK^Iz#fFoYv+HqxWngA3U@YPXiU0r(CK4j!{m3&l8iQ!Ias0C1ZrUi;^KnMli0Z!V;`_{b!0Tv-;q|FZ#UC!h4Mvdz3bAZ z7o|0t-ZqeqO`$vY2%C1##_R+ zM{kTiAbio(^}4CYMN^LpQl1^$J^Yi8ahNj-PX5PXDFd>1B}0)BkSa0&61O;Pa`RJ4 Tb5iY!%qItPYH_GCN`qwq;}KQL delta 172 zcmcaA(kje*nwOW00SH#?I+4yXk@qW84fAFe#(PYY-!Rv))UakbPJYKC&&au%kF|`E zNmFri9~&d%3yw>_A*>yIG%ui&5*2xa{=0iFFH-FN$kj7dN~pZn(v4yY)uv z9mN-oov$0aT{L#PAm-lS-Qqua8mBpO-vg{6yCwR>s+Tm{O$9b zZ|2Rs@4Z=S{J!1!ZE2~4!eie4c(Ts3=Bxs6t)VRpC>5x5f=lwF{DJKlb*RiTHCn8) z7)w+;#!{8T=u~-(F4cjtOfAMJWNE2n?e1m3u05^ya?z1kRyVX{p1+`_G^iM9xX}q_ zihvuf+rAP696!%bYKAo*_xO}HJ|oX5iMVPpby$N` zrUQ63?l6DYKoz>qw}Kk<8UOMbAK8zbh$283=h%ix_dTAm3j z@kAB|QN5$JNhA|A;phxDMKYin-I-KoG&zx0R5_JaHQ0{caXiG4+lt?_v2~b>clgoS z&(;vL9yPd5_$6YJgTO`tO$10}cnYbmpwNuXJl{JQjf6u(=OeHM-Esw+I*8X6PtNKz zwvOVLnep{>299gi3Bu@i*JiT^v&IRvFznc{;op-fKvB0S1EVz-0D7~y2bHjO$R-4k z!g>KfbF9=t%Vr4>mO<`njs>9FjLO14qo`m_SD`hm&HF-CsI=f)pr`!>`{=9EGk6s& zHmVCgmHGJKG}l0umFyc|3Rggxl|0OWB*?skR{841i8K_WBf42OLy`+xX~pw-*GOof zH!Md-AvXCRtK;R^S|4Mz{6T3JN8pcb9A_MZPxH{zi5f~&(S};gVo;M}F zYHD18U3o_;lf>ng(h@p6Lx?>Xj#r1>RA+V$_T$MhLRi7DL_PIVOy%m_-M4mY&*o~+ z?$DikUO)QIb4gr|{Kh$MFe}WeaP93qXVsQ3yzPu^aglu+#d)9y-C=y-CK@chyivk( zpliW49l%>28;3crEleEGvEoHv3lnI}-PkdyrDP*Jt96M4#q@-TJytu4C-tO~NHmKH z1x{+sVmzg0bOXkfgoJW#pW~3Iqd(m(LENkd3n5WYDzZ{|0^62|Em%Zx@sMSe?T}RV zjE)tSju#?Bk>Sv#i$s$nIeD_v|I10*=b)X4^^Atl)Qy{5Jh-nV+aO`JVK}ax)!Bz< zg;C6zCA^O?UGqVz08MQi@EYsOTEiOdzIq7iu+Zcbbfm7;koU~^Gm%uwD;$-z`OJw=UU}&x3Bx| zcRXl+6xf{lCiO*X>-9HsJ)_$%UD>X?`U5wH>p`gAXDQx&qhzJzHh66JndQ>A?d;#; z`boL?A$bKPcit|`YIp zSUd5B36MfIQvu6~MFLn4A@@o$t!5HhH;iE)>1REJVc!M-_^YT0(EqR$@c&Bn?NWWe XP-xd%BmCVVfFAJVc>xRnbEkg+RAZGN delta 899 zcmZ9K&rcIk5Xax!A8mKH?b3Gn(WX!KX++;yCq^E z;htU9h~Z};LQ4kzdn{%tG{gLu-M z>6R)w(QT5Vw}dXN(Z|9jZl)QrE#+s#XXeeBrP7LSEg1DohotG0IEc0FhvF9=C+WJ> zhtu?>G=x+1t8`3Du*xF5sG6QQqAyshq=O!n`+C|~K+s*6I3malGvarN+WL}NvS9eq zGE7ef=xzBGbm&%|@qu>8g$nPZg+Q9gPTHz=q`H|*G4wE;U|^leDLSRL$4-Luq|2k@ z`H}Nu7xUyaeW14YoMm2q!LB$0sKfpZet)N2B{ODyf;|1CzJ_%?ZAiuuM(7c8;YHmR zIl3z*ut?QdBM#DRESqHId~=lpwT2DO4bwMDwpS>H4!r-wd6!M>n;Sk*iyGCH1kHql znKkYXEb2L553LEMKgHqdqJEXWXqu(><9kE(6+zlqE=*WDVLuu<&X8j`+*T+1{A*=& zKasrI0nVK0Nrx9`29GB%S8X`@vS~S_pS`;T`2Ti6e|MD?Qh?wzOJLYQ-!;^Dgl=lr zgnN0S(Mqz9BQo7ew#@n?L?NkuF#m}DWe1oq&%kPtCI*ec|4BmU?6Og{%waMHKDY^T mh5_GrjPWkVVc|yr;nZg|`4LU-ph?=A$|!q-5j>6kBEJA2e8txQ diff --git a/pygridsim/core.py b/pygridsim/core.py index fd54b2e..3877c6f 100644 --- a/pygridsim/core.py +++ b/pygridsim/core.py @@ -2,11 +2,11 @@ from altdss import altdss from altdss import AltDSS, Transformer, Vsource, Load, LoadModel, LoadShape from dss.enums import LineUnits, SolveModes -from pygridsim.parameters import make_load_node, make_source_node, make_pv +from pygridsim.parameters import * from pygridsim.results import query_solution, export_results from pygridsim.lines import make_line from pygridsim.transformers import make_transformer -from pygridsim.enums import LineType, SourceType, LoadType +from pygridsim.enums import LineType, SourceType, LoadType, GeneratorType """Main module.""" @@ -19,6 +19,7 @@ def __init__(self): self.num_lines = 0 self.num_transformers = 0 self.num_pv = 0 + self.num_generators = 0 altdss.ClearAll() altdss('new circuit.MyCircuit') @@ -34,7 +35,7 @@ def add_load_nodes(self, params = {}, load_type: LoadType = LoadType.HOUSE, num List of load_nodes """ load_nodes = [] - for i in range(num): + for _ in range(num): make_load_node(params, load_type, self.num_loads) self.num_loads += 1 return load_nodes @@ -54,7 +55,7 @@ def update_source(self, params = {}, source_type: SourceType = SourceType.TURBIN """ return make_source_node(params, source_type) - def add_PVSystem(self, load_nodes = [], params = {}, num_panels = 1): + def add_PVSystem(self, load_nodes, params = {}, num_panels = 1): """ Specify a list of load nodes to add a PVsystem ("solar panel") to. @@ -65,22 +66,30 @@ def add_PVSystem(self, load_nodes = [], params = {}, num_panels = 1): Return: list of PVSystem objects """ + if not load_nodes: + raise ValueError("Need to enter load nodes to add PVSystem to") PV_nodes = [] for load in load_nodes: PV_nodes.append(make_pv(load, params, num_panels, self.num_pv)) self.num_pv += 1 return PV_nodes - def add_generator(self, params = {}): + def add_generator(self, num, params = {}, gen_type: GeneratorType = GeneratorType.SMALL): """ Specify parameters for a generator to add to the circuit Args: - params: specify anything else about the PVsystem. otherwise defaults to typical solar panel - num: representing how many solar panels (to represent scale) + num: number of generators + gen_type: specify the generator type (small, large, industrial) + params: specify anything else about the generator. Return: - list of PVSystem objects + list of generator objects """ + generators = [] + for _ in range(num): + generators.append(make_generator(params, gen_type, count=self.num_generators)) + self.num_generators += 1 + return generators def add_lines(self, connections, line_type: LineType = LineType.LV_LINE, params = {}, transformer = True): diff --git a/pygridsim/defaults.py b/pygridsim/defaults.py index 6c3426d..7198174 100644 --- a/pygridsim/defaults.py +++ b/pygridsim/defaults.py @@ -53,6 +53,15 @@ SOLAR_PANEL_BASE_KV = [0.2, 0.4] # per solar panel IMPEDANCE = 0.0001 +""" +Generator default values (small, large, industrial) +""" +SMALL_GEN_KV = [0.2, 0.6] +LARGE_GEN_KV = [1, 35] +INDUSTRIAL_GEN_KV = [35, 100] +SMALL_GEN_KW = [2,5] +LARGE_GEN_KW = [5,10] +INDUSTRIAL_GEN_KW = [10,20] """ Units: KM @@ -75,4 +84,6 @@ """ VALID_LOAD_PARAMS = ["kV", "kW", "kvar", "phases"] VALID_SOURCE_PARAMS = ["kV", "phases", "frequency", "R0", "R1", "X0", "X1"] -VALID_LINE_TRANSFORMER_PARAMS = ["length", "XHL", "Conns"] \ No newline at end of file +VALID_LINE_TRANSFORMER_PARAMS = ["length", "XHL", "Conns"] +VALID_PV_PARAMS = ["kV", "phases"] +VALID_GENERATOR_PARAMS = ["kV", "kW", "phases"] \ No newline at end of file diff --git a/pygridsim/enums.py b/pygridsim/enums.py index 23978f7..b4a1820 100644 --- a/pygridsim/enums.py +++ b/pygridsim/enums.py @@ -14,4 +14,9 @@ class LineType(Enum): class LoadType(Enum): HOUSE = {"kV": defaults.HOUSE_KV, "kW": defaults.HOUSE_KW, "kvar": defaults.HOUSE_KVAR} COMMERCIAL = {"kV": defaults.COMMERCIAL_KV, "kW": defaults.COMMERCIAL_KW, "kvar": defaults.COMMERCIAL_KVAR} - INDUSTRIAL = {"kV": defaults.INDUSTRIAL_KV, "kW": defaults.INDUSTRIAL_KW, "kvar": defaults.INDUSTRIAL_KVAR} \ No newline at end of file + INDUSTRIAL = {"kV": defaults.INDUSTRIAL_KV, "kW": defaults.INDUSTRIAL_KW, "kvar": defaults.INDUSTRIAL_KVAR} + +class GeneratorType(Enum): + SMALL = {"kV": defaults.SMALL_GEN_KV, "kW": defaults.SMALL_GEN_KW} + LARGE = {"kV": defaults.LARGE_GEN_KV, "kW": defaults.LARGE_GEN_KW} + INDUSTRIAL = {"kV": defaults.INDUSTRIAL_GEN_KV, "kW": defaults.INDUSTRIAL_GEN_KW} \ No newline at end of file diff --git a/pygridsim/lines.py b/pygridsim/lines.py index bbaab91..5e715af 100644 --- a/pygridsim/lines.py +++ b/pygridsim/lines.py @@ -36,5 +36,9 @@ def make_line(src, dst, line_type, count, params = {}, transformer = True): transformer.XHL = get_param(params, "XHL", defaults.XHL) transformer.Buses = [src, dst] transformer.Conns = get_param(params, "Conns", [defaults.PRIMARY_CONN, defaults.SECONDARY_CONN]) - transformer.kVs = [altdss.Vsource[src].BasekV, altdss.Load[dst].kV] + # TOOD: edit this for clarity + if src == "source": + transformer.kVs = [altdss.Vsource[src].BasekV, altdss.Load[dst].kV] + else: + transformer.kVs = [altdss.Generator[src].kV, altdss.Load[dst].kV] transformer.end_edit() diff --git a/pygridsim/parameters.py b/pygridsim/parameters.py index 74f15b1..4c67c54 100644 --- a/pygridsim/parameters.py +++ b/pygridsim/parameters.py @@ -2,7 +2,7 @@ Helper functions to parse the parameters used for loads and sources """ from altdss import altdss -from altdss import AltDSS, Transformer, Vsource, Load, LoadModel, LoadShape, PVSystem +from altdss import AltDSS, Transformer, Vsource, Load, PVSystem, Generator import pygridsim.defaults as defaults import random @@ -100,8 +100,30 @@ def make_pv(load_node, params, num_panels, count): num_panels: representation of how many solar panels this PVsystem includes count: how many pv already made, to not run into duplicates """ + check_valid_params(params, defaults.VALID_PV_PARAMS) pv : PVSystem = altdss.PVSystem.new('pv' + str(count)) pv.Bus1 = load_node pv.Phases = get_param(params, "phases", defaults.PHASES) pv.kV = get_param(params, "kV", random_param(defaults.SOLAR_PANEL_BASE_KV) * num_panels) - # todo: inverter capacity? \ No newline at end of file + # todo: inverter capacity? + if (pv.kV) < 0: + raise ValueError("Cannot have negative voltage for PVsystem") + +def make_generator(params, gen_type, count): + """ + Make a PV at the load node given, scaling kV by the number of solar panels + + Args: + params: any customized parameters + gen_type: type of generator (small, large, industrial) + count: how many generators already made, to not run into duplicates + """ + check_valid_params(params, defaults.VALID_GENERATOR_PARAMS) + generator : Generator = altdss.Generator.new('generator' + str(count)) + generator.Bus1 = 'generator' + str(count) + generator.Phases = get_param(params, "phases", defaults.PHASES) + for attr in ["kV", "kW"]: + setattr(generator, attr, get_param(params, attr, random_param(gen_type.value[attr]))) + + if (generator.kV) < 0: + raise ValueError("Cannot have negative voltage in generatorsource") diff --git a/sim.json b/sim.json index 8f47fb7..4f0a4e0 100644 --- a/sim.json +++ b/sim.json @@ -1,10 +1,10 @@ { "Voltages": { - "source": 3939392.445246486, - "load0": 801.6009509982497 + "source": 3623991.955061431, + "load0": 783.9555181687916 }, "Losses": { - "Active Power Loss": 1549277840399.3896, - "Reactive Power Loss": 3221430546551.8247 + "Active Power Loss": 1164785189852.638, + "Reactive Power Loss": 2421893689046.014 } } \ No newline at end of file diff --git a/tests/__pycache__/test_circuit.cpython-312.pyc b/tests/__pycache__/test_circuit.cpython-312.pyc index 84a030cb20c34887de3c81098057aea1b698f370..470fda5b2ad41c9555c147672cfee4200aed736e 100644 GIT binary patch delta 3436 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 Un+a diff --git a/tests/test_circuit.py b/tests/test_circuit.py index 09c8693..1b12466 100644 --- a/tests/test_circuit.py +++ b/tests/test_circuit.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- from pygridsim.core import PyGridSim -from pygridsim.enums import LineType, SourceType, LoadType +from pygridsim.enums import * from altdss import altdss from altdss import Connection @@ -117,6 +117,15 @@ def test_008_PVsystem(self): circuit.solve() print(circuit.results(["Voltages", "Losses"])) + def test_009_generator(self): + circuit = PyGridSim() + circuit.update_source() + circuit.add_load_nodes() + circuit.add_generator(num=1, gen_type=GeneratorType.SMALL) + circuit.add_lines([("source", "load0"), ("generator0", "load0")]) + circuit.solve() + print(circuit.results(["Voltages", "Losses"])) + class TestCustomizedCircuit(unittest.TestCase): """ @@ -160,6 +169,14 @@ def test_101_bad_parameter(self): circuit = PyGridSim() with self.assertRaises(KeyError): circuit.update_source(params={"kV": 50, "badParam": 100}) + with self.assertRaises(KeyError): + circuit.add_load_nodes(num=4, params={"badParam": 100}) + # add load nodes so we can test pv system erroring + circuit.add_load_nodes(num=2, params={"kV": 10, "kW": 20, "kvar":1}) + with self.assertRaises(KeyError): + circuit.add_generator(num=4, params={"badParam": 100}) + with self.assertRaises(KeyError): + circuit.add_PVSystem(load_nodes=["load0"], params={"badParam": 100}, num_panels=4) def test_102_negative_inputs(self): """ From 88fbb11583a8b4de10fe4a4f0372ce9a56be1fb8 Mon Sep 17 00:00:00 2001 From: Angela Zhao Date: Sun, 16 Mar 2025 14:27:53 -0400 Subject: [PATCH 05/21] remove adding transformers separately --- pygridsim/__init__.py | 2 +- .../__pycache__/__init__.cpython-312.pyc | Bin 363 -> 360 bytes pygridsim/__pycache__/core.cpython-312.pyc | Bin 8617 -> 9002 bytes .../__pycache__/parameters.cpython-312.pyc | Bin 6735 -> 6735 bytes pygridsim/core.py | 13 -------- pygridsim/transformers.py | 28 ------------------ sim.json | 8 ++--- 7 files changed, 5 insertions(+), 46 deletions(-) delete mode 100644 pygridsim/transformers.py diff --git a/pygridsim/__init__.py b/pygridsim/__init__.py index 6b8f757..d712b60 100644 --- a/pygridsim/__init__.py +++ b/pygridsim/__init__.py @@ -4,6 +4,6 @@ __author__ = 'Angela Zhao' __email__ = 'amzhao@mit.edu' -__version__ = '0.1.0.dev0' +__version__ = '0.1.0.0' from pygridsim.core import PyGridSim \ No newline at end of file diff --git a/pygridsim/__pycache__/__init__.cpython-312.pyc b/pygridsim/__pycache__/__init__.cpython-312.pyc index 0f3dbcedac31b9c95bd440867346bf4f592b3402..d3ebbc9cffe9c46c583cb66c309eb7ab0b69c378 100644 GIT binary patch delta 44 wcmaFO^n!`^G%qg~0}xyhyPm#nB5yrAyMdmeo`K%PX{Wfw8@Qh_s1$+Z0VZ$^8~^|S delta 47 zcmaFC^qPtHG%qg~0}$|4o=M+1k++_U%RtXi&p00~3boKbP`JPVuU*>>QOIO$V~&l;ipr=7ORP8TU2Q10dQOKK zqSQzNn5ZKsW+c9B$)=+5PvpfH-}d642gqW^?!z7z9~Y+CeDnJ*t0Ugz{LVSw`TpJS ze&=qS{Cc$hH=oZf!E+;YyD%7Ds}GYe)_Ol~%e$7O=@6ApOL_N_l=pl?QAv`f!5DBCXI1G*6c5-XjZSQc`I;XBj<)9p-iz4-Nu81EW>C zYMUd>Lt(W5E*8jj@(EeBt|xvdh@nl*{V|>fVRZK0M*7?aNUMz1#lbSg*TMr zECvhH^zlc|%)rGs6;XZjiU>fj#TGY_@0=E7|OP z;N?rFSusCZoK4nb&4S4pfTFw_M3BnuLhQ z+!GWce(LQC^n%Lch^!yhtWVtZ#v$B&uS!Nl)OQ}j&H3&UUjj8{b_kV@3e6uJe0rZP z#@kEgB&)OZ zSF*X5Qy-*m)6g~z{Xrwp4VPOQ2#Jept^F}{!%Bep#wSjg&M%fK{Clz6Is_$3#oi@~ zii%bp@M~G+X8Y3-zqYlIpT)hl1mqiRPc7n)gJBY;{mjJF%fBw(M`@HuD){jar zDk`i3eodCmxgqzejpL!_`EOuNt76#MGtwl;2968R~ygFiC{ zn8ZIA`^0a8)@=I74%eYkF_esu%Fks>(qbx?O)eBtnPk3@$wCc9O(5g1WLio=YEgxH zK4=NE5YJhn%*$_C23S~oXDNyva)Cl(E#;wHj4K*pGkk zA{6tVo!HWad_J2l&KL43#3`!q%g#m|cf%QGN&eE=jWzaFO|$mB8ngrOQ4OPB1A6r| zLLZ?Yp&Ai;)7){jvK-%X#Z6&U(<1LNRcX=cpNzHhh{xNlFMu8jXyaf;lniPSV3>{x zI+o>@Q=l(tZ*cQ`J~N-rsu1BTo+!@y&=X^4wfCN|XgW@L!`$ZcGMP8{>M@$|wXz%h zyf4ne{E6?E{Qz22hM;vl_xoyZlTd}g=d}xl@++}RvA3f8wdj5$)&LF8zgVhyAh3fq zUBNa}2qj4Kv0yd3$7h3`df^)Faqu*ggA~(mM7!3P1^;#Il6~wEpO&MTbybdCs3jY9 zFByl%CMWtKN`jLF^NGpv-eaTv&`Qz~f{S$H#7Ivf0o^22l3-3uB@<*EAZds&Nthud z32DMCVqMU01o|D^f?yT^DOB)y=z*Q?svk!c5C0K*dXPd;Am|}VDp@)g3z;(u*)CYd XBP~)r#6Q<6j-4_Png6Rm)cwB!Rn6X) diff --git a/pygridsim/__pycache__/parameters.cpython-312.pyc b/pygridsim/__pycache__/parameters.cpython-312.pyc index 9002865fcd35fd0597bc32c03b1636dfd920d2d6..9f6b33db155865b6746d4a49cb20af3268ed28f9 100644 GIT binary patch delta 19 ZcmX?aa^8gNG%qg~0}y1s-pJ)D1pqt^1#SQU delta 19 ZcmX?aa^8gNG%qg~0}xcPZ{%{70suGv1e*W= diff --git a/pygridsim/core.py b/pygridsim/core.py index 3877c6f..f2d571b 100644 --- a/pygridsim/core.py +++ b/pygridsim/core.py @@ -104,19 +104,6 @@ def add_lines(self, connections, line_type: LineType = LineType.LV_LINE, params make_line(src, dst, line_type, self.num_lines, params, transformer) self.num_lines += 1 - def add_transformers(self, connections, params = {}): - """ - Specify all transformers that the user wants to add, same input style as lines. - - Args: - connections: a list of new transformers to add (where to add them), with these params - TODO: remove - """ - for src, dst in connections: - make_transformer(src, dst, self.num_transformers, params) - self.num_transformers += 1 - - def view_load_nodes(self, indices = []): """ View load nodes (what their parameters are) at the given indices. diff --git a/pygridsim/transformers.py b/pygridsim/transformers.py deleted file mode 100644 index 2adc45e..0000000 --- a/pygridsim/transformers.py +++ /dev/null @@ -1,28 +0,0 @@ -from altdss import altdss -from altdss import Transformer, Connection -import pygridsim.defaults as defaults -from pygridsim.parameters import get_param, random_param - -def make_transformer(src, dst, count, params): - """ - Add a Transformer between src and dst - - Args: - src: where line starts (source node) - dst: where line end (load node) - count: number of transformers so far - params (optional): any non-default parameters to use. - Returns: - Transformer object that was created - - TODO: - - used some of this logic in the line code, if we keep it there then delete this file - """ - transformer: Transformer = altdss.Transformer.new('transformer' + str(count)) - transformer.Phases = defaults.PHASES - transformer.Windings = defaults.NUM_WINDINGS - transformer.XHL = get_param(params, "XHL", defaults.XHL) - transformer.Buses = [src, dst] - transformer.Conns = get_param(params, "Conns", [defaults.PRIMARY_CONN, defaults.SECONDARY_CONN]) - transformer.kVs = [altdss.Vsource[src].BasekV, altdss.Load[dst].kV] - transformer.end_edit() \ No newline at end of file diff --git a/sim.json b/sim.json index 4f0a4e0..5f9659c 100644 --- a/sim.json +++ b/sim.json @@ -1,10 +1,10 @@ { "Voltages": { - "source": 3623991.955061431, - "load0": 783.9555181687916 + "source": 3879100.6152280653, + "load0": 866.8975433444583 }, "Losses": { - "Active Power Loss": 1164785189852.638, - "Reactive Power Loss": 2421893689046.014 + "Active Power Loss": 1210574022465.718, + "Reactive Power Loss": 2517043226922.8716 } } \ No newline at end of file From 3511973ba7b3cec510a393a50a9e033dd8f6bcbd Mon Sep 17 00:00:00 2001 From: Angela Zhao Date: Sun, 16 Mar 2025 17:07:41 -0400 Subject: [PATCH 06/21] change source enum, add config file for cleaner code and string inputs --- pygridsim/__pycache__/configs.cpython-312.pyc | Bin 0 -> 1771 bytes pygridsim/__pycache__/core.cpython-312.pyc | Bin 9002 -> 7989 bytes .../__pycache__/defaults.cpython-312.pyc | Bin 2512 -> 1899 bytes pygridsim/__pycache__/enums.cpython-312.pyc | Bin 2030 -> 1281 bytes pygridsim/__pycache__/lines.cpython-312.pyc | Bin 2645 -> 2846 bytes .../__pycache__/parameters.cpython-312.pyc | Bin 6735 -> 7531 bytes pygridsim/configs.py | 68 +++++++++++++++++ pygridsim/core.py | 12 +-- pygridsim/defaults.py | 28 ++----- pygridsim/enums.py | 26 ++++--- pygridsim/lines.py | 7 +- pygridsim/parameters.py | 27 ++++++- sim.json | 8 +- .../__pycache__/test_circuit.cpython-312.pyc | Bin 13444 -> 14562 bytes tests/test_circuit.py | 70 +++++++++++++----- 15 files changed, 181 insertions(+), 65 deletions(-) create mode 100644 pygridsim/__pycache__/configs.cpython-312.pyc create mode 100644 pygridsim/configs.py diff --git a/pygridsim/__pycache__/configs.cpython-312.pyc b/pygridsim/__pycache__/configs.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..974acdbc277e73055c1b923b048bbae0a34202ed GIT binary patch literal 1771 zcmbW1&u`jD6vxNLc32u4HYAYJ&}7?gv~;_$>Y>v9szef(pgJb9AxOC(6i=xsKOz&h zqPIPDk9*rouY1_T{v~@Ur=U^QOHaK~_106L2M>d@RkW&Qc;EN^%skH<5B#gDF$5R> z<-GNmjL;iDVV4?+_pb$n{zMLPgbw;g6lO~B6&BkH8_pw^u#6Q)d=UYzai1w1#b4l9 zz*EfS5iesEYd&`)$8nr!-{6cXCxTa80oXQkcm%de*=_DI1uR8bo;f@MTc_+U_m~2f zq3j-Wcm%fL3a)aT#n;>SxzCg%;VqbZy}iR69)aDU>;d-*l>@Q%vOjO3l_u zl!nH`qq(Y+81sr2iS1Sn4s>g`Tr`NvwLc-0)=4}>{i$VhuVz;*I+bfWbuophi|G+e zO&XQrUSqdnJ}8%JRFSrNHEXAA>LebB#!k`J{nA$sD|Ov!92!Nl zO0g3CX7aP?0k5wn@fOL4v73;#H{zmWp-@=C<3$+3E z28Cv?g*(k>kDL9%UjJm+#l5pZ;c!%fV{g0N!u-4!PWrt^ZflS~9g*nI-M%yI;QQWB zPzwG&(cme3Pa}dLyh7PmXltqb15~JQj_TN@BL{+ysG$50W&j}GQQaZGt114v9tl^OYJ7Oo1f!m z$5NJ7xCIrql<8N=tFV%_=^fg`>R4KxL=%7H0j6nrXzc%(@z|`P43byaR%9kx=A9gY ceTZJ-(w4N%iM9!2p{1m{A&$|y_XE6uk6Ez3tpET3 literal 0 HcmV?d00001 diff --git a/pygridsim/__pycache__/core.cpython-312.pyc b/pygridsim/__pycache__/core.cpython-312.pyc index 1a399072b12acf07df74d1e07290dc04289cafab..b678161d569c18726978f76b7e9f887b582d2208 100644 GIT binary patch delta 1479 zcmY+EUuauZ9LLYOY5xCd^S5czWT#30?3$%vZo;g!+hkbh+76r(&5)Aio@BAfO?U3i zqz|)m1{4ILJHn<2iXcwMbQpv^2<}nz!ObFrJUCJCL0{Tc7zm=j-)$@QK78&u-}C!- zf4_V0r%!%475L8Y_Yk?CwUW7;1!z;YOqwp~OuTGEFpBn`rK9 z3YrsAj4pXp@5&GF$Yr`$K4Xh6e+cSj!by>8q^M}LO^UV}(G<;Av1vWLr=n=~w!LTv z%>iqtrMN(GfMNs1-KIrnjd0gXAuGiWz`2LJfL`$MXg=`qL)?HBr57~STO}2$^+6Dy z7KG$}Ed&f`F)a*QuNHw_-%?cV@0{#uQ2C-VA-}Pws9*kOKjPcKWL^82X3OBR;P{*x z@}A?p$!1BLH%CZo-Z=b3EMTbXeK~*-#Qp zwu%?%BUE`Hkb}y#fJ!IiTY*zF)A>E{6MeyILXQ|jqelQ+eW-Gsi;~$CV(@>V9le^!Rr1A^fIK(TN^y+gqqot3k}=Ui4}l=?aOaqxYbmD8csyTI|N&du?8%S~P9WwX}Q z4e@dLnF*NFa7(oMK6ORTf#^i;?G4 z+9hgGUScE5LufmP$Ri#`OdznfuKmR9;h7n62!*E*ClRL*^N2E{0{DbjH4BD9Y#TmU z7;gaD+Cw|QzAFA8zcz#wPBJSxjC>-{7T`*K6!p9AKic8R_6Az zY(tq{D2HxOBIx`h%qG2Ck;9cSbuF+6L;@V?E^0U_zck}v7M{=q8|YK02=oH1_u@y#eM902MlB%WZJS!~c+@<=MY0c|GOj+(+ zQIz#!#uP#YeNC%W9G;mYX8OmRH0(?opnEwzOsMW5mgonfo}RlY`J ztEM_@-*R2JhX$Kg48>I80@O7}+LXQNHJbK-g?AQ@ zb63YRRLD+?jJk$Y zq+CAlIzhwoHP<)f-yEGzQCi>`Q+k{aZx))yXac?QM-dJK*cYs68t;_1+A>cVkv@WEZH7z1}6H$y)-M&hChG7 zrf@Ic!G^e?$eJ1E2JAnV`Uc0ZO<;94}ZVhOyn1s&=JrPX0<6zOA^nmBcTV#Ky6z()k-DamNAr^~%J^=8bTOrH|qF)gmxu zvAId;U$E4FI7-InvXF3h<}koC#eH^aQ9s*i9L@B>$E(h=NWDCB7YEgg+`KOO4?yG}W2De$f%HqFft-O2lN^6MH zKKXLnp-yze^8m}u_ndH3Eac1L9r>rWVR+D5`&X!zL`9nid>!`X^2TuFk2>1vkL7kp zzZVmKEJ-brjLTr>zE%81atz0EoH{cx{v>}K1rZdu&QF{>K05X!A41V_1pJv;j`3%X zoj%P^p&*O`*XhZr)2Mg`MQ0H%A{YoW2zUryLcqFj->*#)KZ!MxBcN;XCcqlmWggbE zlOPZ7fB(WyF8=W1*7*55B*>yS57cnj=^?%QKJaXhoU4wUyF>hJ@aB;GX=nelpFKvm zkDRI=Ikh!Dv1R7&5D$yLb)kj>cuPHov#y;svLF0JS#)HWC5XS9%xHy%aQh&vc?S{5#NhKx(144@IV3dICggPyfm#F1}MF)n`3Z+Z3 zvLIJxFi0#&to#)$h$S1L6QT!Z$Qj^4K%NH?B;+jQKt^&PgM#EIeSs!W<+2 zB2D-N%)KJLBC>#7LS8^F!#phD?u%G2VqNMKOH2FJjN9HVY(DH1pnZRHFYJ)l!mp{v zrhloTjy_*i%EKhC^-` z*oM=LYr)=Vx$CCeG@7-#^LI>GJ=?CHX^ZavzW#3w=hkflZ!;Xr{6p&AX7i7@aefdn<5ylM-MnYxDyn6*}*IyYz4UW@c{Sy-TQjm}k5?9V}v6@>yeyu-XG9HVJuwO|o;47vWK46FAMV308xwvKpI%oW;v*tA;(t#}00$=})iLoq0UGbNVvX zT2~5A;IK>I=2`@D9`Y*WWyovn3L^-<0R1ZTSNhi$7wBNzafU~^+k;O<6cJ;owxlO) zNNgx%U`QlBI%MqCvt9=_rjr9o|dBLq}ZIKH$DJb$46hNpcZ{ zZKXq{7!Yz2Qz40xu%(*2MnzPUE|okoOF$rDl;}3_8rQu8r2l6gWjZMW&(SUgp*J%{dwo0row4Vro@>Sfhq2`pCMlYn+6UGB7kNP&Dk(V(N zs)%`qDzY@--pa}{_6=`kb=g}@_nXW0wYAmdhC4V()$8@@T+n);4jWu@9rXF<-3VoJ z)&Rkt>Ug8;29Lmu7QV23FMSab8Dnnh-LTtCY<%BjY`^ORSAj7rZ4Q*uOQgVL#KYfm{WbB!q~nNhN{$nJ^<}z#ZoWAD-VD5rOHclI ztJVzGvh`>4uLb<9!{f2*XU^lGE5o10Zp@F4&=<#bcAn1O@Yz{>byyz%?riDa{>Qhr zceaK%^OxPi_T7)RHs9ab*c$HVzs}7KpXL9ay#?zWw%Nw_>3A-e`)90@%l~_Q_6 z4rI|~cKL?VPw5BL3}n?+cZIl{u6jqZOB}q4KxfW9x-+`x&dm2*PDSuMfBmETPC)1< z4`z=vC07xU3q%mXF7mL6G3SCSc%ms{B%mrH;u#_t2Y(aOIc6qNB~aySs+6b-sM%|( zoTy8ns@GIyC={1}@#Tt`Wh#E`>78`(6!A2;dJN@iCLUbm%36944b)Tw+ztET&qP7m(QHe8sXp#GbMaSn#m)YGQEG<{4NJD)bzJ*%&kjoaK_~VcKMG4n!z%3)qwkdl!!EE8 zm;+r4cLqbsw=w}v!iNB7XuP^Ls*dx8(cAIHgHin&Y;K?G^zLlR;;!F=&x^Z0%oHV- z)u6RWp9S}X2_C$?6TK+Y6~1ha!zut%pe-72mI4h)30UWZZt|q0iY?CW&wx)3*8sSM zJXn~*X*JE}iMOmdut`$0)C=MePDUs2JcoArw#(GMPvS75z!%t%4jOHv!qmM+yrj}8G&4^t~V=T=s7RmXRz9R)P?6MDAm z!s)hY*P;BvEb?H~%bLa{t=z0u=u=3#S$C0Z9QcOJ)jchKRyWUq>z3i?kBShm{QpC_ zL!1wG>_#EW&RBXplMPN(dH$3GLdCmINz8c e7$$c_y#6JcAQ&d9hzlt%B>a5;59o!Y#s2^w&@UGN literal 2030 zcmbVNJ#5=n5Ppx;4=qb_EG2=EbSTi+u+Ts%G8jdXA1E;^JE7@7zW@t_5KPu_qrW~% zMU}}0GIY$ArBkOCT{3p;)TK+dm=4~7Fr;O$K&01?~adm_ul(8 zl}ZqxH}tooUt~glMFw#FAeSD`L|hAqJ8W z5oi?9*c=)aXdF;w4vh(P1<=GC8Xrmd)ju&WuFuo1KD`FFaTEviS z`3ohOGJ6|Qz>_mQkc{|<<|Uq}_J-`xu8sP(o>#bHn%!2%Hcg%|%}&o6woy)+=9j}( z+qWo|{dsHH9yolhR*^f%0~zB={`t6A zcWmYqTiqkO-Fp7C)hq7w4u>7PJ8+7RM`dVVQv8cbpG^`T5y! z(;JWT?bs<#|0FcIi0Q0{Y%XRK!_>{U>up>$NQ07a&W|8t^oEFw?mB4jg1=o4Cfvz(k z+#Hw?h76m=c>)ZYBYWM;-f*)wzTfq3-f?f<`T1+FY`8FzpPi^@x%a(X!Oaz3KlQdX zcUybYc;Yp>E{yfw$;1CNpFW)S6@GA`uVes_#@_*Zx4wdkNk$B+iGLCzK$mPy;jsd? zC4B_w)ld*ng-23!MXGFfZPps}m}m`&T?aeEPSW$KrEQU{?w2&pEUP+}dtPhusIc)Q zoRwwue9D{#Q-sFXXSEFGU4WV_kBbSN10N!WEDMjb1I#b=mYdyrt#}`)E{x=-P-1L= zizpWUmYciv)0X#1&4saE4+@H5;ns-Yq0F$DJac|h7lLa-9CXv;TAWFu_r$6eSIU*! z(;Me5+lEkh%Q^Re{UuXM-;yhD$;Kom(c;U?69TV^BGb)p1``6WNkXQ5I#v1`@ diff --git a/pygridsim/__pycache__/lines.cpython-312.pyc b/pygridsim/__pycache__/lines.cpython-312.pyc index 1cc464aebdf5219fa544269f4d9c1d3268eccb9f..c8347fc72ba65c5b0008a377b907b6db3f1b0527 100644 GIT binary patch delta 1253 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 delta 1881 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 delta 2406 zcmbuAduUU46vy+sdEMq^ljhZ=d8mEt-rCmsYORl&YFovas(tvHmS|#ZZIk+I6g#S8 zPUb{mo#&6ewS#RaEixBnvdJbo#$X#uwm?c4jt=~z3}K)!_Sg11H|Z)}Wrh79pWJ)S z`91FUo^$T6$IkW`zSZkBGB(!nKSs>n8wNKahoOo@6hj7KLEu2*Wf zUKPCVE`r@U9b8aYxDW@cT_T(mtXxO|zqq{cy-s6@TW~=fA>}ZE9r_Z-7?(2;*;7u{ zFzGFZ$yG)0nxKYTZZC`~wEBN0Gp`FK3yS3G5D(YOZN!t0)!1c1LEsw6Y6oM->7j6U zd}ts%Mc59IRNLS;wHPR*a&}AI3|URP6xG3kvg(e`olRQ;&D4V)-X9BwB)f8RTW5PS z_2#TS(Qqz$TUWQAMT5w{Pp-gZg{5&^%!q4K;@TwdO7rU`_yrl>o#Nf2wKw@s4L1x) z-ks(fC3A6#FHSnEla893_DroWRqIRhO;A|S!|k5Go~Dp;Ts4Nz!UmBsNi2C03Jh^u z&MZSS({V;AxX0ens6rDOLZRq$ERKqZN<=Y3i@?;2(_nP)aE$hcDJ?-yHG^Q7k&f1& zbtwY%qP2)+2rpteVg)?X+u;5R6HI7MkkinnwQTx7B7Ji_$rq>jP6!&!&{kRQ)3RMq zfX4^f8-7C;XP3FLNw)tZnd}sa=W|OYW0rTAg^MemiWz|--BQCi8N&o&gQ=*1yGtx; zZdg7pALC%3&SO+W$S|2nQWjCG_7Efdsq^TKxp_=xMQ;(x4E1^klUgmjON;$mXh4)f(xe7O9q=tVAr$?T!vT3+wg&*yeerH z(&nZKvom8BQ)cn%vD;gcW-)DUkxXSNb6K*YAz8lW_MWu46_g9YT*o|;4F()4m~^>W z^=hHSZISA5c6M3ekjVsJx~-U5ee6-yxksHsv1c+%;HZNcvdTVITg#=q`d3P2we4+w z-_GvszCg48nW>dkZ_bzB?|L)KFgx5Y>>@*0hE14Z8&cv1sSJJdDZ`~3la5Va9m%wG zrCPeu{H{dMXyiEhU+VOiSZ6oBA%Qi%>2CLIy^4quf+m|^HD^ZTgwfBgH6LpE%vx)L z_0CfG%zS{HMHRZ{uYxPZyXJ_VyGI3$#fftko{;Lqi1iObmcXm_)$Hb;-A*_=Dz@j6 z)uxN{?6A`4)!feA#hAJOB8A;gP_vxsvDE20QdhzL&O3_M)fK!OSH zDk~vBu~!&gG=aVl0^zNm9)&SM1P2Y6WLA?HC^-=>n*Jr8^9U78W*!cWTJ fE_kWlYl#t3_vVp|yC&tXc_PERCm}i9t{49X*2`Ev diff --git a/tests/test_circuit.py b/tests/test_circuit.py index 1b12466..cb2b31f 100644 --- a/tests/test_circuit.py +++ b/tests/test_circuit.py @@ -39,9 +39,9 @@ def test_000_basic(self): def test_001_one_source_one_load(self): circuit = PyGridSim() - circuit.update_source(source_type=SourceType.TURBINE) - circuit.add_load_nodes(num=1, load_type=LoadType.HOUSE) - circuit.add_lines([("source", "load0")], LineType.MV_LINE) + circuit.update_source(source_type="turbine") + circuit.add_load_nodes(num=1, load_type="house") + circuit.add_lines([("source", "load0")], "MV") #circuit.add_transformers([("source", "load0")], params={"Conns": [Connection.wye, Connection.delta]}) print("Load Nodes:", circuit.view_load_nodes()) print("Source Nodes:", circuit.view_source_node()) @@ -52,9 +52,9 @@ def test_001_one_source_one_load(self): def test_002_one_source_one_load_no_transformer(self): # doesn't throw error, but should have stranger output VMag circuit = PyGridSim() - circuit.update_source(source_type=SourceType.TURBINE) - circuit.add_load_nodes(num=1, load_type=LoadType.HOUSE) - circuit.add_lines([("source", "load0")], LineType.MV_LINE, transformer=False) + circuit.update_source(source_type="turbine") + circuit.add_load_nodes(num=1, load_type="house") + circuit.add_lines([("source", "load0")],"MV", transformer=False) circuit.solve() print(circuit.results(["Voltages", "Losses"])) circuit.clear() @@ -64,9 +64,9 @@ def test_003_one_source_one_load_exhaustive(self): for source_type in SourceType: for load_type in LoadType: circuit = PyGridSim() - circuit.update_source(source_type=source_type) - circuit.add_load_nodes(num=1, load_type=load_type) - circuit.add_lines([("source", "load0")], line_type) + circuit.update_source(source_type=source_type.value) + circuit.add_load_nodes(num=1, load_type=load_type.value) + circuit.add_lines([("source", "load0")], line_type.value) circuit.solve() print("LineType:", line_type, "SourceType", source_type, "LoadType", load_type) print(circuit.results(["Voltages", "Losses"])) @@ -75,9 +75,9 @@ def test_003_one_source_one_load_exhaustive(self): def test_004_one_source_multi_load(self): circuit = PyGridSim() - circuit.update_source(source_type=SourceType.SOLAR_PANEL) - circuit.add_load_nodes(num=4, load_type=LoadType.HOUSE) - circuit.add_lines([("source", "load0"), ("source", "load3")], LineType.HV_LINE) + circuit.update_source(source_type="turbine") + circuit.add_load_nodes(num=4, load_type="house") + circuit.add_lines([("source", "load0"), ("source", "load3")], "HV") circuit.solve() print(circuit.results(["Voltages"])) circuit.clear() @@ -92,10 +92,10 @@ def test_005_bad_query(self): def test_006_update_multiple_source(self): circuit = PyGridSim() - circuit.update_source(source_type=SourceType.SOLAR_PANEL) - circuit.add_load_nodes(num=1, load_type=LoadType.HOUSE) - circuit.update_source(source_type=SourceType.SOLAR_PANEL) - circuit.add_lines([("source", "load0")], LineType.HV_LINE) + circuit.update_source(source_type="turbine") + circuit.add_load_nodes(num=1, load_type="house") + circuit.update_source(source_type="turbine") + circuit.add_lines([("source", "load0")], "HV") circuit.solve() print(circuit.results(["Voltages"])) # TODO: can add assert to make sure it's in reasonable range? @@ -121,10 +121,46 @@ def test_009_generator(self): circuit = PyGridSim() circuit.update_source() circuit.add_load_nodes() - circuit.add_generator(num=1, gen_type=GeneratorType.SMALL) + circuit.add_generator(num=3, gen_type="small") circuit.add_lines([("source", "load0"), ("generator0", "load0")]) circuit.solve() print(circuit.results(["Voltages", "Losses"])) + + def test_010_configs(self): + circuit = PyGridSim() + + # LOAD CONFIG + # should work, because not case sensitive + circuit.add_load_nodes(num=2, load_type="HOUSE") + circuit.add_load_nodes(num=2, load_type="hoUSE") + # should fail, invalid load_type value + with self.assertRaises(KeyError): + circuit.add_load_nodes(num=2, load_type="badloadtype") + # don't want loadtype input, just string + with self.assertRaises(Exception): + circuit.add_load_nodes(num=2, load_type=LoadType.HOUSE) + + # LINE CONFIG + # works, because not case sensitive + circuit.add_lines([("source", "load0")], line_type="HV") + # don't want linetype input, just string + with self.assertRaises(Exception): + circuit.add_lines([("source", "load0")], line_type=LineType.HV_LINE) + + # GENERATOR CONFIG + # works, because not case sensitive + circuit.add_generator(num=3, gen_type="SMALl") + # don't want linetype input, just string + with self.assertRaises(Exception): + circuit.add_generator(num=3, gen_type=GeneratorType.SMALL) + + # SOURCE CONFIG + # works, because not case sensitive + circuit.update_source(source_type="turBINE") + # don't want linetype input, just string + with self.assertRaises(Exception): + circuit.update_source(source_type=SourceType.TURBINE) + class TestCustomizedCircuit(unittest.TestCase): From 8de850dc863ca6e9f42ca6163112ffcb598c2948 Mon Sep 17 00:00:00 2001 From: Angela Zhao Date: Mon, 17 Mar 2025 20:15:24 -0400 Subject: [PATCH 07/21] multiple sources tests, strip spaces on string input --- .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 341 bytes pygridsim/__pycache__/core.cpython-310.pyc | Bin 5124 -> 6561 bytes pygridsim/__pycache__/core.cpython-312.pyc | Bin 7989 -> 7991 bytes pygridsim/__pycache__/lines.cpython-312.pyc | Bin 2846 -> 3147 bytes .../__pycache__/parameters.cpython-312.pyc | Bin 7531 -> 7590 bytes pygridsim/core.py | 6 ++--- pygridsim/lines.py | 21 +++++++++++++----- pygridsim/parameters.py | 2 +- sim.json | 8 +++---- .../__pycache__/test_circuit.cpython-310.pyc | Bin 0 -> 8749 bytes .../__pycache__/test_circuit.cpython-312.pyc | Bin 14562 -> 15477 bytes tests/test_circuit.py | 17 ++++++++++++-- 12 files changed, 39 insertions(+), 15 deletions(-) create mode 100644 pygridsim/__pycache__/__init__.cpython-310.pyc create mode 100644 tests/__pycache__/test_circuit.cpython-310.pyc diff --git a/pygridsim/__pycache__/__init__.cpython-310.pyc b/pygridsim/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..35e5ac05012dcc9de4aae124b2136b606b3648a5 GIT binary patch literal 341 zcmYjNu};G<5Vg~!p{-gmF?-EG5@rx85)vCiDlA@3R%}uWJC2;BQu0Uq0AGTHl$D8J zVB*rD;!b`~&$_#Jwp*{41mpAKtNcLzp2YtMP;Buu3_%i3B;`~FJdiU!lc9`EXd@m` zBIi4j!~=VF^`%hO6buAH0@3ZPQ_OSCz^L#`nSv8(|0Jt<`O+WH-cl zdX?sB{)28Lq2uDz_?XPc7(luLU|a%-uH8Eiz!w0@3T^Ou1#nQl(XK+VsrwQ=8}uxk zSAKfQJMl5n5q__;mjttutEya1w N^oL=9Nke)b`~ml!U{e49 literal 0 HcmV?d00001 diff --git a/pygridsim/__pycache__/core.cpython-310.pyc b/pygridsim/__pycache__/core.cpython-310.pyc index 513ff90d25e5eac9f4a2975e046f3102c8806da6..7f507a1c0370d97d389e254f24269625746951a3 100644 GIT binary patch literal 6561 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 literal 5124 zcmdT|NpBp-74Btr4u^|uSxcOhmBpNd9)?jCfG`3JB4Y@!sX+7sbZiV-Q#Heudl^>s zkmi5_0!Rnvl1mN&aRP||-uGTj zvbx%`@cI2`e;WOD&9eSZmGZ|$Grx4uYc4$SGXW3MCP_{igay%z;JvXX&m8j}f zqncOK@7=H-HM~aD^qRU}30u*Mw-U9zwysyh)u`ijbh#F;MeE+WZ8fd8Ener1#};oq za=Z=RJhHm2FR{ASwX>QZrd+9REvwxM)BU5PY~?-a$7-0!NXV@Ifl4NFAhOCkiO;hp z$#)YjLQ_0C_Q#^@pc2I5{WwTf);dbUQ$c+cUUVY=6VVSbsvn~%Ti10nr*3&-XPuLY zkmr4sgp)K#Vze~PD9kyaZI(YX_&!6cusoYvp2KbKJhnV{WCi#ey4>ZJ$F^4qEM6Tt zyvFOORr6YdH&Ltc7GJ@b`p6pEyviNB0zn_uRy z;JM1L@T+)s_%*U$6)>%!_o>yWlCWAiAxX@xtF zY-rBKbd~8_t!DEM@C^Jgm{heZOfM>H#*;|vNoDPldQ`STFHDP)bQI{P zqC_}+V#zD0{^Qop`$|Z)hyNU0#& z86;Bl#^+h1-w$xue!q>vrr*KT_K)*Qlwotz=B2{II)6vn^nw zM2bVlZ*Vd6Ct=F;5RpQ`nDkIGn_3s}rG4w;&4-l>_j5aS zF5qJi+(*tA@URQ4@xbNwFW{Jc_oSxl=%?#=YUBC2F`f^PMLdV+42st(ghD5N7@m_Z zjooZB;7F{Mo6%X29Tm#|J_Be0ei%1YbbwAby9U9qQE77b?J{VPpH(nR2hU;abb7kj; zSyH$BE&!Dj;3TO>(}H}7K&~21f16srPl8(I4@gk>C~?9%>AF1qPwD*@#Pr&thRdA> z#2Uqi=%2ns2kKi87eoWikDP~&p@j>OfNh;1=xR4d+C(wpXe2n4g3 zF>`$Eu*dEU5fb<$=AZ-9eVcIvi}>|a69U*iJ%-=Ue4QMxMAl_8*YUZ;<0d}z*ntnX z4pI@3YtlY6`wx?OFrzR4+Sl3H?zVQ{T}}M&-QB;7C8(z!8N}lW&Vs-bDkwaOQ$L7V z5dun#gKZv4q^!t4w9c}X(xyFE$${r`l`gBTsa=%l=vRa~v2nZ6wk!XfURu~S7HwIP4zA zNCr_3bW43+h|*sQl#BuVKj0*{>EKH~zo8Fa_UDgg@LZpp&ojNgI?3)}d}=+gKX<;M zOO^KX=?HL@(&-zxYn+N3EJDf$n_(uc-X{IW#&alalQk46qrRe0Ko63Mg8M7vMhcmt z?o_0J@Sm=$b7Zf9TadoZcvXELl9b>qAHJ%$F~l21p3tdG*XBpo?-uM}f!v5s1M49& z8xUMWlbidt;b^iODvryuv6Vu`_dFHD#T;X$_69`|%1O;WW zaFSWxqv0SYGueR2dhg|^(9DAPOZVC)fPHw5&Qy^RVU%3O?hBTwQ@22oOo*>)Kve1t6Z<#jh~>i&=gj8<#`zN@Cm^bnoP4pcSuaoGK_z{U7i5(I@CP7XsZ<5f-+|Q^q-=HqheNb*d z&=o<^#0{%queUnw&Sqn?-EOxUtwycUZs1?{JM3<1l9euvBvzDk4V095$T|sP2>gPh zR8Qb;p=6U9>1PG6HNVT4D~Zllcj-L^4oNwqTqi+0dfryE#+wEcx;t2k`nGL`tH?Tj LtZ3Vgv+4W`p8|J$ diff --git a/pygridsim/__pycache__/core.cpython-312.pyc b/pygridsim/__pycache__/core.cpython-312.pyc index b678161d569c18726978f76b7e9f887b582d2208..0d09533e56e5358d3612b3428497201bb1e4af8b 100644 GIT binary patch delta 238 zcmdmLx808WG%qg~0}yQAbz>v<3Py<(rc8zu<}~IMmQ8?EDrjHD~O!^CwKZB?batwL~I}$%L2r>zMP-C!kW4vzRebK`ELRiE{27V@y M6}+2Y%K9(@01SUXOaK4? delta 236 zcmdmPx7CjOG%qg~0}ycAT;IsOf>9!qA%!W0IgL4mC6y(ODTTF#HHsA|#y0shqm+0i zLn=p>5J))+*!+iaI}r~XKz*^B JU(5P10swf+K5zg4 diff --git a/pygridsim/__pycache__/lines.cpython-312.pyc b/pygridsim/__pycache__/lines.cpython-312.pyc index c8347fc72ba65c5b0008a377b907b6db3f1b0527..bba4c5cfea5a0bcba691e194331f66500cbde042 100644 GIT binary patch delta 897 zcmZvaO-vI(6vt=UZM(aqT}iYQ1Ue*YyF}zeqd^djM$vFE#)bniY1Zy^Sz30@?9%Yj z05QablaM{w6EV?)#*2}YH_vkEYD`JPfdh$0iFh{7EM3v)Kbd(m@BQ9uJS8jLehaM0w<2madOl8#*={@WOzeCYFRtjrQI`7 z1}ZG10U#YVogZo{;N0U{WzL@;+512ZltJllI_%N>5#^649sGwD8NKvh+K&2}D)**w z=EqPD%|8$k)u>*=22zk^6W!2|nWtmJR57wA6&vAM-LkE-D39&jB+_jQ6~>WC5K(js zBTNV#>v^P_*fLVr8@#t}J#3jXB!}x<(NxsBpkV_O#Wu-&%N?Vn6m=C@B*)fLEgKoi zG?pVI=(U&DP5C#U8%Rq_ihW)+Mp|V!G+a@%AhNqu1RT%RQdF_aJ(Y8 zLKn@fNl8~qJ{Mf6yC(IxQcsod*^9-iEq$M3{Z+pIpo8uPGPy7_4Y3+{KOqy`yaIm) zF55$Xs0{q~|HB7;pB5;GvYo%#(9~6DG?awGrWPu}fQ+24;g2xsyo<;&L@Dpe^KFUG3zzU8r%yStoJ;}R~H_`tF;9%|G%qg~0}xy{zn<>MK9Ns?v1p=txf)R1pBW;1+LA zW?pK1No7H5e11|^5g$;jm;*>CK)~exOg5sNxry1S@gRjora&o9keZgwQe1M3^$*y& zIx?E-??@}ox0`9VLiwV!-gRlyi_)fB%C=W;tUh3T(cJyIxz|N=uM1M%9o)VAPox#E zOKV@0)?VR!QQF|TwDCo0<1Jy^qc=t$5WZ;Ydfn9HqN&FPDbEh>9{w9F{MT6|F0x2m zWs&*}w3IO)Hi}EP&KQJ~u5b}jVjZqq`8URuqg-ied diff --git a/pygridsim/__pycache__/parameters.cpython-312.pyc b/pygridsim/__pycache__/parameters.cpython-312.pyc index 2a419b63e8d2d853af6f815ce7c75d14fe3475ef..78160576a7cfddb324af2c9119c6450add13fcc4 100644 GIT binary patch delta 1063 zcmaJ=K~EDw6yDu-TWGtaEz*_(>57rk1~DK~f(R^SB@Lw|t$-Y4S-YEBy6rZzEe29T zVmuk*!7-Zn1H71+7!H!?#ps0)4~7F~kDiPiJm}dtvr8i(#!2SO%$x7M_w9Rck4Ilz zV-6U`L7-)O`z8PDHIpXWZRln}`{!c>&j^XwqUyvnaeENf$dTd#RE-D3ymCLmfTPRm* z)reK6k*y}{w4&aVfo=zK#j1!o8B)|EhabgpqOB$2b1LLM3dKH$Vtbao%wcHq&^5XH zj+&y*`4B;O0kJHpC7~h$u>@G?rFk*{Z_(Qx z!O&)sG@UjAX}Cr#%K{^aH+NUg6@}A05QU#?!zkLSzkRpM{=-6Egp6~5jKT@$dD0I> zXD`_UA36sa7U!U+#e%W{`r*EFlI(*HSJ-DnZYhaHSx{6_63VJ1gE*XVeIx_BF6O<( zb_sbRmqYg~8^y-~9I17YOD3j;YA2i1Bpl zMq*|m!`)1zQ(07}2cB-vC}uP#=H~fnE*0m&7<}WoLh|s~6Al>i+=e_&t%00u3S5Fw z?-3G6wSJ`<0>8J#Y^FdM_Jy{GaPq4d{vimkIA?1%o#Zk|eTq*CQ(Tr8W*0#}b{Rtu zq4nm!B{6#BK!bxiRF)MDOkmzJ0u4_qYEq+3c0;YTvJO_@zV9hgx$6H-F}REo$_#%Q z7K7ItVqXP2QKt@qUH_M?2WI#bk1ChW2xrQO3ut`NDe-o5s+#h0S*UJQWJ9m+YFq{N z&Kg+7ejEb51>0f1!+&}nkWB_+RRtgqpLBe{^W3?X#O(*281Ua=rZu{4)IN@FOBhx# cCc1FzyE778=u6(od-vVXdFS4Pv2QnocY@&N z*lLU&uYZ0nSlXt2VD(OuIHbI>pi#1^ENv=cNt0wz)ntWE!=Cpw%a|69EcS~ml7%$+ z=Ik*%_JimPrSXTlJFnI0U8S&HQ7Fnx?FhpNQG_c9R~hJmd~SJZHYLvHvNtp7<)uU+ zlgsAW=U@7IeAm&#m04I!B@@}%6di>hzF{&07yL2y#jHO_3ZVFp8KH@mPkggU2vhS6 zcH%JL3&VV{Icd_vWM@_q^O>Z$xFRklmJ$njlbsV|1`&o3{=t(GdKwJP_2Kgj2mz^@)r?LX(odtUfUt@n bBXl9)1e?M*$IF^rFDa9>2$}G0W43<-qT=7d diff --git a/pygridsim/core.py b/pygridsim/core.py index f36cc16..49a7dcc 100644 --- a/pygridsim/core.py +++ b/pygridsim/core.py @@ -22,7 +22,7 @@ def __init__(self): altdss.ClearAll() altdss('new circuit.MyCircuit') - def add_load_nodes(self, params = {}, load_type: str = "house", num = 1): + def add_load_nodes(self, load_type: str = "house", params = {}, num = 1): """ When the user wants to manually add nodes, or make nodes with varying parameters. @@ -40,7 +40,7 @@ def add_load_nodes(self, params = {}, load_type: str = "house", num = 1): self.num_loads += 1 return load_nodes - def update_source(self, params = {}, source_type: str = "turbine"): + def update_source(self, source_type: str = "turbine", params = {}): """ Adds a main voltage source if it doesn't exist, otherwise edits it @@ -74,7 +74,7 @@ def add_PVSystem(self, load_nodes, params = {}, num_panels = 1): self.num_pv += 1 return PV_nodes - def add_generator(self, num, params = {}, gen_type: GeneratorType = GeneratorType.SMALL): + def add_generator(self, num, gen_type: GeneratorType = GeneratorType.SMALL, params = {}): """ Specify parameters for a generator to add to the circuit diff --git a/pygridsim/lines.py b/pygridsim/lines.py index a75ce3a..241fad7 100644 --- a/pygridsim/lines.py +++ b/pygridsim/lines.py @@ -6,6 +6,19 @@ from pygridsim.parameters import get_param, random_param, check_valid_params, get_enum_obj from dss.enums import LineUnits +def get_kv(node_name): + """ + Given a string of a node that exists, fetch its kV or raise error if doesn't exist + """ + if node_name == "source": + return altdss.Vsource[node_name].BasekV + elif "load" in node_name: + return altdss.Load[node_name].kV + elif "generator" in node_name: + return altdss.Generator[node_name].kV + else: + raise KeyError("Invalid src or dst name") + def make_line(src, dst, line_type, count, params = {}, transformer = True): """ Add a line between src and dst @@ -39,9 +52,7 @@ def make_line(src, dst, line_type, count, params = {}, transformer = True): transformer.XHL = get_param(params, "XHL", defaults.XHL) transformer.Buses = [src, dst] transformer.Conns = get_param(params, "Conns", [defaults.PRIMARY_CONN, defaults.SECONDARY_CONN]) - # TOOD: edit this for clarity - if src == "source": - transformer.kVs = [altdss.Vsource[src].BasekV, altdss.Load[dst].kV] - else: - transformer.kVs = [altdss.Generator[src].kV, altdss.Load[dst].kV] + + transformer.kVs = [get_kv(src), get_kv(dst)] + transformer.end_edit() diff --git a/pygridsim/parameters.py b/pygridsim/parameters.py index c0a0565..b41feb0 100644 --- a/pygridsim/parameters.py +++ b/pygridsim/parameters.py @@ -11,7 +11,7 @@ def get_enum_obj(enum_class, enum_val): enum_obj = None for enum_type in enum_class: - if (enum_type.value == enum_val.lower()): + if (enum_type.value == enum_val.lower().replace(" ", "")): enum_obj = enum_type if not enum_obj: raise KeyError("invalid enum input") diff --git a/sim.json b/sim.json index 581dc52..16d6773 100644 --- a/sim.json +++ b/sim.json @@ -1,10 +1,10 @@ { "Voltages": { - "source": 1689.9694678157916, - "load0": 213.88830907538258 + "source": 2922.164017017074, + "load0": 130.76382218128552 }, "Losses": { - "Active Power Loss": 138083.11472325015, - "Reactive Power Loss": 287047.4734936169 + "Active Power Loss": 742550.0603061075, + "Reactive Power Loss": 1543879.3995447825 } } \ No newline at end of file diff --git a/tests/__pycache__/test_circuit.cpython-310.pyc b/tests/__pycache__/test_circuit.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ac09fcef7e4350a615473d14375e7151c6d98091 GIT binary patch literal 8749 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 VLEl^}x?wuTqOJXS@v)_g{{`3Pv)KRu literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_circuit.cpython-312.pyc b/tests/__pycache__/test_circuit.cpython-312.pyc index 4f2f8efeb169c426bce2d246a5055c84b1d63fd8..5c3ea3ded11b62c98eee77468f34385ff0f5e470 100644 GIT binary patch delta 1340 zcmZvcduUr#9LMjuH#he-U7Eg@HqATf+TA{vu4#fD=mu+i)HHiI*P@GQlVy*lnJ4M` z0BwEj0akJR9IG%x6@-S?KivIiOq7+)6}BOr6gz?_3Ksf@AZ{Y~kDlL+RUDo_KIfe8 z?{UsO=XdUpFaI`PcE@NmaI8JJc0cLf{%M(m5DKj%Wr&;JknY=e}(fnU_YFIDamF|JSYacNP8NS#|0 z;w6g)xLf5GN*8&U*13%FEpg+bVS#6vI1YAqT8v39UiJ}LAVtO9YJoXjDKWu5$q5S$ zHB%FuQV}i~PNl~Z^we-{Buf?MN)IFY5D|vr4m&pR+vt8oKVkr}9q|MMbBfVqLJ_D1 zr56|!zFE^9;W)@&k^jqdR6h^AsA z6VXh1lnx~_ldUjEYTzBKwDl3oYb-D`4?i@TrIr=hzA6VGVevH671_2bKYd>|t;zO# zvVG1ypVZ7<|48$SCUn9bt4;rP-QcP`1hI;0=xdh2WOMLe33w6ei?(w-Tz8m-vIPP^ z+X7JO93=Z-$!FHROJ7J*;d$lv4EY&W-rQHJfU4F|kJPsG48zZGB4@G;?`v|<@>LEV3?NUs>=ump(=<#Ic zZRV0Wuk!ACV%+@H+0?4s0w21oAn36YKOFRUdn>uJrWK>|M`jlbSkhPbD8f>})6*r~ zFnB|PaMSJynS?JNcZaOPEk*3vDc$N4L!7iMh@magvPlfpO3PL;R4;{5Uft#-pR2iTmqMNc{)b(eDQsph5p9Z$&&hQV>e%qE_4cU27%G^9HJR<9`P1*H#L$O7;2g% zx7F{OdW9(rQ21hgc`z1_#Aqy~We96^OW)H15n;strNw8;3i|-s&ms<@Ah7~w;}l{9 z@oyz#5f{rDZgy6{wYI(Fn=9=NLd!HWZ2ZaE-#gIW$_x{aUuNQeQl?>l#{^kd?{;hu zy|&0KeAbyJzeBVCL}V0KIE@%Xj3X)#H3+N*dI50}@jl`*!i=awlp`iLp~6r8$H=7W z>M|2vM<5u8drH_}gTAsE5LWc`(M92lfW0(_9te)WdcZ+)AO`#NTIL)K1nuNw7!N8n bFY#m#nLW1VXus!Zf5>Umhdm-(4L1D+xxZY9 delta 910 zcmZwET}TvB6ae78GtN%#;^rT_itOnA+GxAF3)bq0nBdsYy7?0p7|E_%rmn8erl@KD zB?Jix2dM{NA_&ADjHyQhDK|ojdXg4;2?96jNh^q`?pZ4+x)0x+x%ZqickcZ(@^;X$ znUSH>(24&QCEzPzI|+JB+D zD>in3Zd%Cn{F#`h*|9No!fq!Jau{L5VIm%QmLTjd&d!)KrjG>EdpeQU zI~-J&nY{xahYuw)SJ47_j^lUexe8Y64!pxe(*Vu8r) z_1_l?hMR&)urJjipwwc`^;97eK>pVj?_Fe-W?UafT5y6_Sd2T7Fd`s@NITMsz{Bh; zX!O>TXDWD|>_PmAsB=iyz&D0!`R97+;x>MJ)O;ER&?@W|KG z)Qg1?qz~ywvJew;6}g7YBMS&1MkEKxL Date: Tue, 18 Mar 2025 15:21:56 -0400 Subject: [PATCH 08/21] check for negative kv in check_valid_params --- .../__pycache__/parameters.cpython-312.pyc | Bin 7590 -> 7185 bytes pygridsim/parameters.py | 20 ++++++------------ sim.json | 8 +++---- 3 files changed, 10 insertions(+), 18 deletions(-) diff --git a/pygridsim/__pycache__/parameters.cpython-312.pyc b/pygridsim/__pycache__/parameters.cpython-312.pyc index 78160576a7cfddb324af2c9119c6450add13fcc4..2e19ffcf0cdb8243c71e33835e84e6148a7ad8af 100644 GIT binary patch delta 895 zcmaJFK^!a^1YvVFD^W2*L~1x zO8`0B@4w9KpW4!eSko+du7fOagQD5hbLEz!aEh zsKEA$vJ?#=q6jjk!4N+!#wqWr#K$CA=9?3zOLg~SA4?s3ocYn@reY(Ruj|TN zF79yMc}+J7<~hfwQpZMWbNboxtI_8xdz>|IYun-4^P2VpH851*t|ALu!=iQ~r!`eW z{JGem3<5!wv#ZUF3DweinCN&x8BK`@Rg-P?f1zeZCBfcQwDM6qFb$`G!I_B~9T_Gltt|z7VbQ*OYhrGjnkK5(z^WY!G zM%a&QxB>VY$GI&=!(nHc4YuUQ%UU6uRthR{6vwKr;kxppp_2lMf=|%>u8+#;L#`pO zJM0gI{jPv(IEd(mpkfNNWz)<^N!VqvTWR~pGZKnU7O8kfiiZ>FB?@uOr>v-4lP<5aJMjL)$jlpL8(`sUmzr~HMwpKWZ1GZK>3!R4s6EqyQ Um>_r9qJvZL$YF#N5SfU|FE@JNkpKVy delta 1393 zcmah}O=ufO6yDL#Y9*~?trFGpDy|pDHeJ)$5sez58tj$4HfkJMkrVZY6m@HD9NV&1 zon5QQRhnRWu%O_CA=I~)97>^=20>FO4W-BSBCLzq@wd-+ew0g$Mo9-qN3;`~E!5$8q>2Ri~z@4?+}m!&bM|K^5rW3kKEc zSJMuvMv3;!h9|2)Wlc3yC~R=TvM!W0L(tbN6%86{Q3Q~~=ZJQA8ZRbWRZ7dnLWQ*G zrqf!{oNF*Qig(BG)J1G=QBS$vE$5y$u*2?phaLy{o%g?We*H;nY_b)ZY6qnjEB)c5 zf?*iO)r)p)x`V|Ii4T84itpVf+dB-LbxARnu~XGbhO(pz%VnXY zDMj%F97XrMTO1?^O;27at*bJG8bqUP6ugeEvJ;*Z-a3b;{s7%$zv^Y!ZCAr}JGyz} zu|M4En{4~1TFlfQl6(W;SyS;n0Pz(bmme8L@GnTNe?YQhNKEro&yRpUgFE3EG6O<% zW90u(=-N75R0$5!6-9RLT;NUOju3O6m^hl{2Hr5~q@t^sEcZ-KzH~*-q~60WR6kx< z%ZoLbz?G&ueK9LfOPQ1mCvc4JaA$#xe&uGtZ^#q8&%1lJeGT6Zx9j39>{8pGY%$3v zUJm^n><8DIkAg9fs5|}>zvBh|etfbuiq4n#YqaQ6E}`?`Yp8zm@MebsT-CWt@mLnF zX;8@K^_p&|YZFGi?U&u;1>EZ$;`hyHHQHrSIUXceiy9tT;%kZ7}H3&*kFA!__sqOjz8cXBI5+K!LnPhcxnTuFh|T!A~q0wTcQSan@wJ zVL|(71%60cB$D@&JUYXlrElR-{{b!XcZc?!6xYAcQ10M1+hBLVuB*@D`t7#=LW{XT zxaQGwzBCXe=bR#@ml%N Date: Tue, 18 Mar 2025 15:28:11 -0400 Subject: [PATCH 09/21] type checking in check_valid_params --- .../__pycache__/parameters.cpython-312.pyc | Bin 7185 -> 7362 bytes pygridsim/parameters.py | 2 ++ sim.json | 8 ++++---- .../__pycache__/test_circuit.cpython-312.pyc | Bin 15477 -> 15733 bytes tests/test_circuit.py | 9 +++++++-- 5 files changed, 13 insertions(+), 6 deletions(-) diff --git a/pygridsim/__pycache__/parameters.cpython-312.pyc b/pygridsim/__pycache__/parameters.cpython-312.pyc index 2e19ffcf0cdb8243c71e33835e84e6148a7ad8af..dfc0714e6cd0d21af68ee9015b65bb98a91f9a94 100644 GIT binary patch delta 781 zcmZ`$OK%cU6rRg4GcE5yTY1!GqK0-fA!($cv=vK)QcN9?w!}n{fDDyFnaQ1@u>>{I zts8R})rGNf+b%Su3**LgXWTSV7f!nICy0N*dqM2Nc#`?eajuQ>tOJ0H0pG?+qftna~PbjLQ&Ea3(-omaN78HCU`*Cb22!Z4!wkZYdM z0D&t6qA1DFfd%xGkAmyykdHFAaX8yy+#B?Ah$tp8NTLJwdtk?K=3>jKcp;N3WMbLa zjTK1#7aSrmOJI(`KXX2e#3te-lgFSj7zAQ)6f=X{EY{?Lx&=$vt9Q4VD+q>3bd10m0s?{F`Fi&tmxknGy~SY-?fB0E6&?7a e<3k|QJ?#OmZpZ`N-H-$1!LM^XxCNjG>wg2fKCxH; delta 614 zcmX?PInjdeG%qg~0}yOGelz{4$VR>}Hl7S1cRE82g9}5f?&JbCEsGka6y`F9V#Xfn z8ipDsNuYEJOEwb&NJOQC8KfHoQdn0rLRd|VEDV(lnrxG$*cB!xvFouh6$t`mChuhT z;L-&$^nke7V=^~~`s4r(1xC)zg&Yr=8FeQI^Xz2QpUlf^!|DQ5VYb>%8KHEysXVv#2lHWK(=c#f$c9c1hV}!1)z?YtS@C%kJ~Dc zffDYney%}|A^t(}&i;OGp6;PQj;Ft0aFGpAx<~;?XtEb6gOqZlr{=|%R2HNbIe@r4 zFm8N)QdUs{P^icWB+dsHFGws(%$@u~N{KZcC{ewcUz(dy&lsdo21JO12n7%U4rXw; zfnuZx6tZ9s7Nt-2kdbA~nVcqLC&$KU`AI;6QQ(t_1f$R=6F$aR#?MNEj1i1Q5pS6^o+^8vYiS4Oau1VoM;=z;H)Mda`y0`wd>f>%4LodFAF*Ugg!i!6ST~N9iJu z(h8FevKO@MFYqW`;c@uR%)qC0omcZBuja2}PN41uqIS&tSRL8f{WN(dJ6Ow4cC(aZ zTrfG>QjyVUa;>En_a`MbR@2V{%&d-#o7Y&%GBR>bK4q24$T!)*+Ky`x(1aoo!8*CZ zTAp#yK=Q4%EZ0h)C@A2HqbG~ln2Y%{GCDHO@VG9cdr?OB3j>(@C1rBFjTivo C^rZ>_ delta 465 zcmexb^|gZcG%qg~0}y=Pbt7GIBkyT$M{XdG86+}~k%3`4LkUP03|tsuk1#OQGL|qQ ziR=W5FqN<%iL9F}$@4^~L>MNN!dkq2hv;!(}PQD Date: Wed, 19 Mar 2025 11:44:02 -0400 Subject: [PATCH 10/21] add type checking --- pygridsim/__pycache__/core.cpython-312.pyc | Bin 7991 -> 8097 bytes pygridsim/core.py | 12 ++++++------ sim.json | 8 ++++---- .../__pycache__/test_circuit.cpython-312.pyc | Bin 15733 -> 15733 bytes 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/pygridsim/__pycache__/core.cpython-312.pyc b/pygridsim/__pycache__/core.cpython-312.pyc index 0d09533e56e5358d3612b3428497201bb1e4af8b..25909de3d0158837daedee9b626940722544cb36 100644 GIT binary patch delta 529 zcmY*Szi-n(7`;2&X>+k_CpKwHlu)Jo2q|S~q)Md-8h!{NwF@1PA|VvzE>YUxRF`C6 z>XHHG`v;tj1w`e6E}%+CC=vsmE!2^TA%TIF@4WRJ-o5v}_r3dcZ+zeSZdnw;n7^X- zk7MgCriPL*e@|tAuN*Oh8!eqBMn*ls<~pcF*gV$(li+}68gRkNpO9S7w*B5rHG96#n}bfz?}x5)j!p4EZ6C&w z(8zoyxGcYVWxNso_Db{ElXl_udZcyyfml@+J{TT$ zxqMOBEPVt$LVpM)rD+b`s-8TX)Mm&bUa&V+&uLR07xLN7tx02s(j*f+dgqRxP8FSK r@~p6uui?jdBF-9ohA3GKt_H*L>QvE_6^V;KaZjEXb9gBK6}SHbI^%>G delta 415 zcmZ2zzuk`aG%qg~0}yQAbt8T4M&3?FE@luH2tF^Gyns<&D~&0IwS_f`HH9sc0mx=g zWdV{LKoKB6g&D}^Y+;OIPvyuGn*5hh+?^|x11QD~l;=v}0jl6lV@}}%>){8Aai=q+ zF{TIrb?~GJwlGBTrU(H^z7(+(VW1d)iU^P=P${Y@zB!dim1%Q7i!T%FE#|z^+|3W! z*qIqMC%@zj-yF!*$RwZ%bm1*7piF#0VqR)a@#fn+9ZYQMK+z)8$(j5L+*%-}HHgrh zJcWPlW-(CiGxvavZJh? zLXj>=-Uvikfd~;Gaf>zB*U`tP$N|WnyinFsx(mo?Vfe(v#iaB>f-7j|>7# zA`5~i|B;nu(KFbQI9XRtna{-HfYODKh>r|hOyVnoCuhsuk;(z;Em8sz3P9o(hfQvN PN@-52T~X2GM0p1QUIA?; diff --git a/pygridsim/core.py b/pygridsim/core.py index 49a7dcc..450164f 100644 --- a/pygridsim/core.py +++ b/pygridsim/core.py @@ -22,7 +22,7 @@ def __init__(self): altdss.ClearAll() altdss('new circuit.MyCircuit') - def add_load_nodes(self, load_type: str = "house", params = {}, num = 1): + def add_load_nodes(self, load_type: str = "house", params = {}, num: int = 1): """ When the user wants to manually add nodes, or make nodes with varying parameters. @@ -55,7 +55,7 @@ def update_source(self, source_type: str = "turbine", params = {}): """ return make_source_node(params, source_type) - def add_PVSystem(self, load_nodes, params = {}, num_panels = 1): + def add_PVSystem(self, load_nodes: list[str], params = {}, num_panels: int = 1): """ Specify a list of load nodes to add a PVsystem ("solar panel") to. @@ -74,7 +74,7 @@ def add_PVSystem(self, load_nodes, params = {}, num_panels = 1): self.num_pv += 1 return PV_nodes - def add_generator(self, num, gen_type: GeneratorType = GeneratorType.SMALL, params = {}): + def add_generator(self, num: int = 1, gen_type: GeneratorType = GeneratorType.SMALL, params = {}): """ Specify parameters for a generator to add to the circuit @@ -92,7 +92,7 @@ def add_generator(self, num, gen_type: GeneratorType = GeneratorType.SMALL, para return generators - def add_lines(self, connections, line_type: str = "lv", params = {}, transformer = True): + def add_lines(self, connections: list[tuple], line_type: str = "lv", params = {}, transformer: bool = True): """ Specify all lines that the user wants to add. If redundant lines, doesn't add anything @@ -104,7 +104,7 @@ def add_lines(self, connections, line_type: str = "lv", params = {}, transformer make_line(src, dst, line_type, self.num_lines, params, transformer) self.num_lines += 1 - def view_load_nodes(self, indices = []): + def view_load_nodes(self, indices: list = []): """ View load nodes (what their parameters are) at the given indices. @@ -151,7 +151,7 @@ def solve(self): """ altdss.Solution.Solve() - def results(self, queries, export_path = ""): + def results(self, queries: list[str], export_path = ""): """ Allow the user to query for many results at once instead of learning how to manually query diff --git a/sim.json b/sim.json index 50b55c1..52d4e25 100644 --- a/sim.json +++ b/sim.json @@ -1,10 +1,10 @@ { "Voltages": { - "source": 2077.428822659733, - "load0": 217.52249209519556 + "source": 1391.2908459682467, + "load0": 202.6090367072441 }, "Losses": { - "Active Power Loss": 284917.58902059204, - "Reactive Power Loss": 592389.8824783975 + "Active Power Loss": 78708.71838388889, + "Reactive Power Loss": 163597.67777927459 } } \ No newline at end of file diff --git a/tests/__pycache__/test_circuit.cpython-312.pyc b/tests/__pycache__/test_circuit.cpython-312.pyc index ab316d2943525b6b4c558baca1e826999552ccb5..2ecda2f375d7f5552b6b23459443fbd29e5ba253 100644 GIT binary patch delta 18 Ycmexb^|gxgG%qg~0}$A3 Date: Thu, 20 Mar 2025 10:53:30 -0400 Subject: [PATCH 11/21] new branch for lint cleanup --- pygridsim/__pycache__/core.cpython-312.pyc | Bin 8097 -> 8180 bytes sim.json | 8 ++++---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pygridsim/__pycache__/core.cpython-312.pyc b/pygridsim/__pycache__/core.cpython-312.pyc index 25909de3d0158837daedee9b626940722544cb36..cf4dd1e48b4b8726328a3186c556edb3f8f4429b 100644 GIT binary patch delta 474 zcmZ2z|HYp7G%qg~0}z-zyOsWaBX1`o7dwax1fTCrUceZsmcpFMl_drdLMAgA(wI|N zQ(04ZQ@PSuCQCBOxTOfE@};q*h_tXq@uxGSF{X&7a-=b(hynQmDdH^*QGzKFKvF10 zHbpX(Bb7xGXdX~r3Mem}A`O%gsg%)_+nmbunV0t#cS%uVUU6D}QEqC{<_LjDjI2d2 zK=qT|h3dI)v1jI`WG1H;Co@f+$Re`&j*uaff)7x($QMZ5V#zK`EGjYsGBw$YD;TF~?zI28(#uSkj#wh+2(H4d%ffO+yDVQRaA`TQ2N|6BagexUAr8hS+edgWV zDDa4p_ZD|aQDR_vQ!Ue;7AEl@w&;yv1Hvnp%_zl>aSNz{DsrIY(BD(Qoo} zS<}gvWGxvtOy-e`3bb@%yl&xr(Zc&eSj0yLekPF>yq`hT2NecKMpwoYMHdoNKQeGJ zi7!xDP`Xh21Bkgp`7?<6Ai VTO2mI`6;D2sdh!Blefq_007)BXJ7yT diff --git a/sim.json b/sim.json index 52d4e25..71dc8cf 100644 --- a/sim.json +++ b/sim.json @@ -1,10 +1,10 @@ { "Voltages": { - "source": 1391.2908459682467, - "load0": 202.6090367072441 + "source": 1780.380636334411, + "load0": 131.72617974134454 }, "Losses": { - "Active Power Loss": 78708.71838388889, - "Reactive Power Loss": 163597.67777927459 + "Active Power Loss": 241674.29037881663, + "Reactive Power Loss": 502464.37327243283 } } \ No newline at end of file From e15ad0cbf7aa2e5547bf1a5376882292103d06e8 Mon Sep 17 00:00:00 2001 From: Angela Zhao Date: Thu, 20 Mar 2025 11:43:05 -0400 Subject: [PATCH 12/21] remove TODO from code: either resolved or for future update --- pygridsim/core.py | 5 ----- pygridsim/enums.py | 1 - pygridsim/parameters.py | 2 -- pygridsim/results.py | 1 - tests/test_circuit.py | 1 - 5 files changed, 10 deletions(-) diff --git a/pygridsim/core.py b/pygridsim/core.py index 450164f..ad70d96 100644 --- a/pygridsim/core.py +++ b/pygridsim/core.py @@ -134,8 +134,6 @@ def view_source_node(self): Args: indices (optional): Which indices to view the nodes at. If none given, display all - - TODO once capability for more source nodes is initialized """ source_obj = altdss.Vsource["source"] source_info = {} @@ -146,8 +144,6 @@ def view_source_node(self): def solve(self): """ Initialize "solve" mode in AltDSS, then allowing the user to query various results on the circuit - - TODO: error handling here """ altdss.Solution.Solve() @@ -170,7 +166,6 @@ def clear(self): Must call after we are done using the circuit, or will cause re-creation errors. We only work with one circuit at a time, can only have one PyGridSim object at a time. - TODO: maybe this isn't necessary because it's done in the beginning """ altdss.ClearAll() self.num_loads = 0 diff --git a/pygridsim/enums.py b/pygridsim/enums.py index e75a4b1..4ed5450 100644 --- a/pygridsim/enums.py +++ b/pygridsim/enums.py @@ -1,7 +1,6 @@ from enum import Enum import pygridsim.defaults as defaults -# todo: update to have a name so that users can query from name class SourceType(Enum): TURBINE = "turbine" POWER_PLANT = "powerplant" diff --git a/pygridsim/parameters.py b/pygridsim/parameters.py index 40c6eef..cdb7298 100644 --- a/pygridsim/parameters.py +++ b/pygridsim/parameters.py @@ -27,7 +27,6 @@ def random_param(range): [lower_bound, upper_bound]; range of typical value Return: Randomly selected value in range - TODO: allow for non-uniform distributions """ if type(range) is not list: return range @@ -120,7 +119,6 @@ def make_pv(load_node, params, num_panels, count): pv.Bus1 = load_node pv.Phases = get_param(params, "phases", defaults.PHASES) pv.kV = get_param(params, "kV", random_param(defaults.SOLAR_PANEL_BASE_KV) * num_panels) - # todo: inverter capacity? def make_generator(params, gen_type, count): """ diff --git a/pygridsim/results.py b/pygridsim/results.py index 6883aaa..05b1562 100644 --- a/pygridsim/results.py +++ b/pygridsim/results.py @@ -11,7 +11,6 @@ def query_solution(query): Args: query: a query for the solve function - TODO: only BusVMag, Losses, TotalPower is supported, need to make accessible which queries are supported Return: Query result or the string "Invalid" if the query is not supported """ diff --git a/tests/test_circuit.py b/tests/test_circuit.py index f132abf..db9f4cc 100644 --- a/tests/test_circuit.py +++ b/tests/test_circuit.py @@ -98,7 +98,6 @@ def test_006_update_multiple_source(self): circuit.add_lines([("source", "load0")], "HV") circuit.solve() print(circuit.results(["Voltages"])) - # TODO: can add assert to make sure it's in reasonable range? def test_007_export(self): circuit = PyGridSim() From ec8bccd8f767b07bc4a33ba1984c27495c012235 Mon Sep 17 00:00:00 2001 From: Angela Zhao Date: Thu, 20 Mar 2025 12:02:35 -0400 Subject: [PATCH 13/21] remove temp.py test file, make ruff linter fixes --- pygridsim.egg-info/PKG-INFO | 2 +- pygridsim/__init__.py | 2 +- .../__pycache__/__init__.cpython-312.pyc | Bin 360 -> 360 bytes pygridsim/__pycache__/configs.cpython-312.pyc | Bin 1771 -> 2437 bytes pygridsim/__pycache__/core.cpython-312.pyc | Bin 8180 -> 7736 bytes .../__pycache__/defaults.cpython-312.pyc | Bin 1899 -> 1877 bytes pygridsim/__pycache__/enums.cpython-312.pyc | Bin 1281 -> 1236 bytes pygridsim/__pycache__/lines.cpython-312.pyc | Bin 3147 -> 3135 bytes .../__pycache__/parameters.cpython-312.pyc | Bin 7362 -> 7348 bytes pygridsim/__pycache__/results.cpython-312.pyc | Bin 1789 -> 1673 bytes pygridsim/configs.py | 52 +++++++++--------- pygridsim/core.py | 7 +-- pygridsim/defaults.py | 1 - pygridsim/enums.py | 1 - pygridsim/lines.py | 4 +- pygridsim/parameters.py | 6 +- sim.json | 8 +-- .../__pycache__/test_circuit.cpython-312.pyc | Bin 15733 -> 15721 bytes tests/temp.py | 36 ------------ tests/test_circuit.py | 8 +-- 20 files changed, 41 insertions(+), 86 deletions(-) delete mode 100644 tests/temp.py diff --git a/pygridsim.egg-info/PKG-INFO b/pygridsim.egg-info/PKG-INFO index e2dd3db..b4213d1 100644 --- a/pygridsim.egg-info/PKG-INFO +++ b/pygridsim.egg-info/PKG-INFO @@ -63,7 +63,7 @@ Package to simulate OpenDSS circuits on Python # Overview -TODO: Provide a short overview of the project here. +PyGridSim aims to make building electrical circuits and corresponding circuit simulations easy for a Python coder. It builds on the distribution system OpenDSS and corresponding python package AltDSS. # Install diff --git a/pygridsim/__init__.py b/pygridsim/__init__.py index d712b60..066174b 100644 --- a/pygridsim/__init__.py +++ b/pygridsim/__init__.py @@ -6,4 +6,4 @@ __email__ = 'amzhao@mit.edu' __version__ = '0.1.0.0' -from pygridsim.core import PyGridSim \ No newline at end of file +from pygridsim.core import PyGridSim as PyGridSim \ No newline at end of file diff --git a/pygridsim/__pycache__/__init__.cpython-312.pyc b/pygridsim/__pycache__/__init__.cpython-312.pyc index d3ebbc9cffe9c46c583cb66c309eb7ab0b69c378..6cd83eea70072500443f0591beb9661ca7d92d78 100644 GIT binary patch delta 29 hcmaFC^n!`^G%qg~0}$w0-bp{akvEi)&9De0004R;2L%8C delta 29 hcmaFC^n!`^G%qg~0}xyhyPm#nBX1}pn@SN#004nT2WbER diff --git a/pygridsim/__pycache__/configs.cpython-312.pyc b/pygridsim/__pycache__/configs.cpython-312.pyc index 974acdbc277e73055c1b923b048bbae0a34202ed..22e49178c7e13dd34d479824cd2deb556d6d7d34 100644 GIT binary patch literal 2437 zcmbu9%WoQ26vpp77!WmM0ya37UAyt4P&p>8s;Wt&NZ2Nrb_^E7qe4{?G7}8pVGX8| zyX&f5cGpe*fo}SbRH{1a0_&<(7hQEnlwDRmb3KOxNf(WZ1mE{N=euX_+!^t6C=_Jy zxxW8<>nDw|zg)mi$TKf~Q5gGyHCa>YvYu3vdU8$fDK(|1)>O%@%Uxejt7#Imq>hfu zNiD4tCPD|*2zpYeE)k(?D$f*{9YZFC{0b2|sIHF?i^r+wCRI0IwD2~*N{7pkw``Um>8YNe~LsZ z@&++F*ppIw*HSvCSRsWS6^YP6wS=CusXdcnN`)%uApbdfQmEF5(0Nn-{T=-RQ=~BE zOCogc6u7H!SU)w=`4ZP>KwQhH)XnmNSrTLT@*GY_gihvDb4aP<`P3XvQ@S}<=dpR7 z=9bMuxpZ;e;ar7N%tz&D=QP;fIo}=$UYvcd5)*W@-8+g~z@4~=MZSqd^HtckHvM0`A z$x)ZC1L5xz<4DqpBq0(P*MuW_)7E0}<_K1qFEVq$TaLaZ4%ju%eF~gw;6EnBfw<2z Y;pho5!!Y>v9szef(pgJb9AxOC(6i=xsKOz&h zqPIPDk9*rouY1_T{v~@Ur=U^QOHaK~_106L2M>d@RkW&Qc;EN^%skH<5B#gDF$5R> z<-GNmjL;iDVV4?+_pb$n{zMLPgbw;g6lO~B6&BkH8_pw^u#6Q)d=UYzai1w1#b4l9 zz*EfS5iesEYd&`)$8nr!-{6cXCxTa80oXQkcm%de*=_DI1uR8bo;f@MTc_+U_m~2f zq3j-Wcm%fL3a)aT#n;>SxzCg%;VqbZy}iR69)aDU>;d-*l>@Q%vOjO3l_u zl!nH`qq(Y+81sr2iS1Sn4s>g`Tr`NvwLc-0)=4}>{i$VhuVz;*I+bfWbuophi|G+e zO&XQrUSqdnJ}8%JRFSrNHEXAA>LebB#!k`J{nA$sD|Ov!92!Nl zO0g3CX7aP?0k5wn@fOL4v73;#H{zmWp-@=C<3$+3E z28Cv?g*(k>kDL9%UjJm+#l5pZ;c!%fV{g0N!u-4!PWrt^ZflS~9g*nI-M%yI;QQWB zPzwG&(cme3Pa}dLyh7PmXltqb15~JQj_TN@BL{+ysG$50W&j}GQQaZGt114v9tl^OYJ7Oo1f!m z$5NJ7xCIrql<8N=tFV%_=^fg`>R4KxL=%7H0j6nrXzc%(@z|`P43byaR%9kx=A9gY ceTZJ-(w4N%iM9!2p{1m{A&$|y_XE6uk6Ez3tpET3 diff --git a/pygridsim/__pycache__/core.cpython-312.pyc b/pygridsim/__pycache__/core.cpython-312.pyc index cf4dd1e48b4b8726328a3186c556edb3f8f4429b..553349cbb67c662f6cd64728c389802efa4ef39f 100644 GIT binary patch delta 1625 zcmY*Z-D@0G6u)K#=SS|l9}D* z&L)zgq=i7AtjK+^K8O{3k+u-nhxSh>^r?u5SEW9v=v$gZ6h-iynIzSL`OQ7Q^L5WT zckce&-I?zD$z+_s^Wh8M*KTJ%>dtRkAbm_2Vbmcmu?WSr=1^C&G&f|0T;0-L!!mq6 zUb6>+0h)R%Q9=Eki!B{8Cr1;UIi!ooK-%s`0MwGlC+zv0rPDr`G#=6R;Bx?Ovf zFFQ?}EjOBzjH@1>@S1C)%7FqVFsbnd7k0ZTRK&MvtxJtrRw3~sP)uCM4UwPjdw)>9{}7x*-f@~#57us*J{3{R|tSr#mkHL^lkKaZ|xEC+Ho z%Wn}Y#R`BuY?uvzpN@W@9|V0bD}pAyF=URY*tv}bQD^7tZk2YfX?G}%cTVf?X_JFs zZ-$g1>_&|X9VC%LDlGbOT?A0!mMv`86GQT^@G#BELS&Nm%Z12kTIgJhENUfTpi3xl z8AHDkfENNNl}aKf)A0#9E@$HdVcee>?YtFV(iZ*Px{6n9XN|uq1oSX$w_3cx1a?fM z0S-4ZibM%v96&|SRs11%O2-*_VIUzDJdiDuH0en>n_Tj{s0`1w9jEhY@;h1%Qi>4_ zG=YGQq7UFO(GU_(Ba{GC{Aj+OI0nT3Gd)O6&@=L%R0TTmM$fPG6vi)`n&^VB=m9Vz zL06tb;v_-|;duZR@su4Q0S;or^4bQvjUdXNAF$50J5Q*UrD_;LI~I9eSQr=l}%ldU;? qR@6a($Hc=1?u00%Ka;{kVtqxdhh*jlGWH`$|DoF&E$$LTKghpb!+qNT delta 2028 zcmY*aO>7%Q6rNeHH@4%S*m2@GKg~7}TGyoErvi~il(Z=&YLX%)O<@D18}B&TW_NAP z+L2r#nV$$G#HB0}g+tXNv>;W=rAH1G2jD=9P^F=$a40PTiT(*LNbufnQd%qd{N9^4 z-@N(e&G`K2-95=~5{Vdr&#qs^(w`kCl3mRY!TX39#Gn?jiAE^e64+FuwxmgRNDJAr zCfi{xY%7}LkB6)lJEBGGs225o*@}H3`BvC!wc}dcPG||=SFEI+(o(+NVzt?6Ep2DC zjNPua+gUA3nx#DqLq(G3wroT?bi3e1^hy~+v_IHto6J7&!lv6+gs$}qfoA9wrzWCL8T6SyqfJWTciznHn7|QkINP@Y{^s8qv~5 z7huNdGx9J`#(6N_4dd-b&sq!7vW?!tmi24&0;P%dGoja|BM(DPAtb_}(-IR&TVG)d z7VKlefnD=1994KfeDOg5p;UFQ+b(|uo!GrZSI`Alftc!lxax6bh~~Z1%JXz!{kn2Q z8WL?jcW?wgdm$7M4RX8xo%8tgO1};(*=pQApssw zp(W5@F9!A@_~nj+B|Hh!&*eslP;l)EV9evtBfVEwDE3{50pybumf^Qd<%U+hyM z!b2;T>W^J3R8WjgD2QnE9ESZi2+k>5P3D%s3T6|UeunNBeu-|w$ z!u>l0UxZ5*)A@1l>z=m6rx0+lPeIhAcfDt8E8di8c>YMC!)xyyY;Fag9|8~|)2ZpYYKu$h zljEn`Kc2Wlz`WBNlX?SoB%UsG1{%q@N*Doq(7z=-f>snjMBz7OCv)oX?8PwHiotBP zu>?oz!jbwI_aT~23bk`D$6}IdE>LiUuF&d=7Bm|$Wu3x4>Xh3Emk-% z>9k>@O?J>mhwRd6g+1zN62V*??52*t^-^7)T$KxnCSf!%~=Vwv0vQDR$xVV_>4+bmDJw?Ok#BpISt| P3`5MdrKG$3NzLRJyC7gV delta 446 zcmXYuJ4*vW6ou#RGq2sevw26OiLPKNHvR?+%V~moAWedh*k}{*AIKK=wwC!B79uEu zAP6>sjTXVylek;Vch0?Y?hLcf{+I9FdtOTM`#pFWeq4LC*@-B1qoA~cz!=F`w8&DM z)P^=hB^4}f!qyg*19xa>8x|6zgCs1{g^LuKKpGh`2@h#971z`7k)_Wdhdk+VQbGHi zGAq(%8OxD5lu#z~s30H#|QA3?9#r-nlB{W#6aKv(FfM9h%6-{{bwfF+{cyfaY zA2vHp*l3Y0w9p-tV z$)96v2oDyGk5=3{#-tNDo56#I+msdS5hvCkvI~d^XbTF8h%c?ccnGYiE=-paW ZF8MRQO%eGq46zoDlKPu!%|Gq2`~k0qV?h7_ diff --git a/pygridsim/__pycache__/enums.cpython-312.pyc b/pygridsim/__pycache__/enums.cpython-312.pyc index e0896e36f347edf56ae5f549f2720989e9591d7d..3a1315451ccea646d9f5c5ceb8046ca19386d705 100644 GIT binary patch delta 225 zcmZqVy28nKnwOW00SE-F@1%cVoX96pp8@1eXGmd4Va#F3WsG8EWME=&XGmdcVMt+4 zWn9e+Qq8~+#RL{*0gAFBi86yl*?^+#NTMuYQ4XLeCz2>@C6^}mOORojjJH@^^Gb7* zf$WW&>=_xECx2o*#K=8)E7K`PfyoWb+ZjbCTd*ke`DwD4BO~Ko2GK7plh3gj0|44cEj$1K delta 267 zcmcb@*~rCrnwOW00SHWOucwDGP2`iPF9GtVGo&!2Fy=7iGDa~ng4j$sOu5Wa%!~|7 z4DJjm%q|MX|CVKh0ctOtdpNI9%AI3yn^WzqtN7H=IxB)leJltwKX|zv7`c36@lDv zOQ@hSy(lxKI5Sr-B{eOvG^eEa76*(qIfg|~$`GiG5r~Vefy4)9Mn=ZF45D`#RKKuI IUdUn$0H!-TqyPW_ diff --git a/pygridsim/__pycache__/lines.cpython-312.pyc b/pygridsim/__pycache__/lines.cpython-312.pyc index bba4c5cfea5a0bcba691e194331f66500cbde042..2b3b7a44576522100cd5f2d4e1b3e554cc6eb97f 100644 GIT binary patch delta 428 zcmX>tv0sAsG%qg~0}z;7-$}Qh$SbK)2INdmLm zmpO`gVnB*2<1OxxqQt!7wEUvn)FMsBTf#n`ey;J({(f$r?x8`BA)fwz!5c3ZFfmGO zc41CoW#pW^l0%mbWML88l$lbTnX8wapO==IUJQ27Yx&-r%+HRf)XSsu@pq1?BYet8Mm$7S(#ZOe}*m5xnl

&H-m$yrTBVHgRf zdO?ed_H-@y(Q^m7q=o>#*{COvfg;>yL-H>s{Z{ZJ{ywMCLDOLb?pMcZa*uO3Slwqz2n5 zA?M;$6$cGT2uojlIJT&bnC%w(9vRpc;~Ogp;X!ZY_>5+ycYSq%$;f45zvpPG`oABQ yKTPH3+(3*Km!_B$lM>1TUI3MYEQi#~u7^erKBkq2*p~JU@?Rhwq+;2S^!x%*J96p( diff --git a/pygridsim/__pycache__/parameters.cpython-312.pyc b/pygridsim/__pycache__/parameters.cpython-312.pyc index dfc0714e6cd0d21af68ee9015b65bb98a91f9a94..4058003e64c661375e760b2286b22ec6a78b41d0 100644 GIT binary patch delta 1307 zcmaKrL2MgE6oz-a_O9)C?bu12*hC>sW4T*OT8Ki4QW{L-#%YV4#BD$eXtnihoXB3= z%-TVLLqOt!5JJ&#hZ7P9Dj}m@I3OW$Xt@xnr!6Qq&Jcmbk@seef)HY*{XO&M&GYB~ zJ%6|O^`iEJrbQ)qK3Mvx{@S6IA)g%P^9Mwtga(@-M==yfHB={TghedWj5tvv>I@k} zPRxjjn9|goxDg+$6Gnon?@Puo4TC0W1T;mXpd)k$bd<(G$EXIHrg6~meML{aU5u9O zX2)jJ+r8G|_cw^l=g8za*$dxlTlDsR$M&Mtc8}F;vDQ}Ymd&hgo8eZM`B$;@rLk(| z&gQkEd96~uzP5U2vv7N@Qm%RvtHp8=HkHkPo%GA3Lr8{y8~BA>>VGcJ6Rw7yot*$X zycn}uwC$K3i&+kvfzTMd?(-n;O23ctH$n>}%X#QvOr%HZc6X3_4pL@$UO5}g!irZ& zx=)okLPj`O7f6mjP@kL9MAMW4u2_+pNF6q zXuRSD8+#UGdD!YnHqWcEGo=h{n2I8!1VKExWxwUgZkKt%mwN6q42e8ty;P_ctMIvF zxwgx&>z?Y`U8~z=Y=$4jmdFCvw0u^;#T~0*n@#ZEY_+M)N|1h;m$ffQw*RO0k*qui z0d}5$m^{0M&}DTLn!Dr zdx~dL?@bDpVZq|x@@Wjn*x>h5-vA98xfj^*X&_qGA10tx0o~bS7Q`F;QF;$p zZ;n3%iMetC-D!BT8*chg~h=R`PD$DVE*)ycZf6V6o z+0FXj{~5LedGGMV6Q3R6jOr7fYMQiNGtJW}V!|c-b}!M{ud`k1?mBZe{B+l!H_=h# z^pdCNwRUTJx9(4u-%Nz_Ql}Zz-nM$pt}7bE4yNGPpAgY?F%Dv$N_c>M76uApHj7&% z_AL%yaoV)kw68J;Vgz1y1LRkk5b|3fK!SfL63HG*7mlP0$I|kVw0tbxJ(BMJEae_c c+DT9)qw2}1MlPOA@lPi+(di_4m5BO(0XTv^0RR91 delta 1239 zcmaJ#K6X4#9LJv+L)^L{89uF|67@@ksY5;_c4en2GAhF~Z)!~DMN7^GH zD?7<{k}B^=ZJnx!DXJlk(m3K6O(3S}2;w+RB4((LII$xesogKGO(|TdI{jL!#Yfh` z@`9T_xHfQgBk%{XX|n<;#Rw-)?0-mlgydN!`U`nw|F7t2Vyri6jq_#8as1n5Oe=f7 z_w>N)iV9`g4f@c%G3a-FFJQCsnG-o2lqazT^A-%=I{Nwa(EJgKnX)G3lG{-#C9HXtnfgblG@g1tsyrjw&$7LAWlc;0XGGJ?Ms;<$X0{qvo0k{N zE7fLotp%a(L@PAsNVy`CE(#EG;aLHf5ZEn}SHnGn!Ls9Tl|ngVp`4+?LqRWNY?FOD z{y7TrG9O1WLqW*ajT8(eu~WI?2~AW!FW`cJ|7eNRySd2~v3o=2@uQ(D$nb`^|s*#@(%kpw~d!#Pn+C-HUCMZD5Mz?5Dj1+p>B*lRQP1E zv>7f)U$i|NtiBINJBo{h|CP=QiwpGyw6oFtm$&eoNG>B7Dpc6J#bboByT$2$+S_^9 z61Fhz4fbpCgN=g7$a2**slREO!)q2p62!<5+9qxtgnJbV`Dkya16>+)-IF#hE8yuP zV$=6-b~^!k@JRNKxFS#zASNDq9GV}xwIn#u`FS~&3QncP zVZMp!Ito7d#l@+`Itn5AC5br!`Q@oa3YoS#l@LPIjIWe8JWo$3WcSqMVYC^3W-Ij2u)ld%Ysr%N{jNWz-$GD&9|7U85u=3 chp|jzWK@~_l65k#6r=2C3noT`B5|Ob0Xt(li~s-t diff --git a/pygridsim/configs.py b/pygridsim/configs.py index d1eb8cf..226698f 100644 --- a/pygridsim/configs.py +++ b/pygridsim/configs.py @@ -1,68 +1,68 @@ -from pygridsim.enums import * -from pygridsim.defaults import * +from pygridsim.enums import LoadType, LineType, GeneratorType, SourceType +import pygridsim.defaults as defaults LOAD_CONFIGURATIONS = { LoadType.HOUSE: { - "kV": HOUSE_KV, - "kW": HOUSE_KW, - "kvar": HOUSE_KVAR + "kV": defaults.HOUSE_KV, + "kW": defaults.HOUSE_KW, + "kvar": defaults.HOUSE_KVAR }, LoadType.COMMERCIAL: { - "kV": COMMERCIAL_KV, - "kW": COMMERCIAL_KW, - "kvar": COMMERCIAL_KVAR + "kV": defaults.COMMERCIAL_KV, + "kW": defaults.COMMERCIAL_KW, + "kvar": defaults.COMMERCIAL_KVAR }, LoadType.INDUSTRIAL: { - "kV": INDUSTRIAL_KV, - "kW": INDUSTRIAL_KW, - "kvar": INDUSTRIAL_KVAR + "kV": defaults.INDUSTRIAL_KV, + "kW": defaults.INDUSTRIAL_KW, + "kvar": defaults.INDUSTRIAL_KVAR } } SOURCE_CONFIGURATIONS = { SourceType.TURBINE: { - "kV": TURBINE_BASE_KV + "kV": defaults.TURBINE_BASE_KV }, SourceType.POWER_PLANT: { - "kV": POWER_PLANT_KV + "kV": defaults.POWER_PLANT_KV }, SourceType.LV_SUBSTATION: { - "kV": LV_SUBSTATION_BASE_KV + "kV": defaults.LV_SUBSTATION_BASE_KV }, SourceType.MV_SUBSTATION: { - "kV": MV_SUBSTATION_BASE_KV + "kV": defaults.MV_SUBSTATION_BASE_KV }, SourceType.HV_SUBSTATION: { - "kV": HV_SUBSTATION_BASE_KV + "kV": defaults.HV_SUBSTATION_BASE_KV }, SourceType.SHV_SUBSTATION: { - "kV": SHV_SUBSTATION_BASE_KV + "kV": defaults.SHV_SUBSTATION_BASE_KV }, } LINE_CONFIGURATIONS = { LineType.LV_LINE: { - "length": LV_LINE_LENGTH + "length": defaults.LV_LINE_LENGTH }, LineType.MV_LINE: { - "length": MV_LINE_LENGTH + "length": defaults.MV_LINE_LENGTH }, LineType.HV_LINE: { - "length": HV_LINE_LENGTH + "length": defaults.HV_LINE_LENGTH } } GENERATOR_CONFIGURATIONS = { GeneratorType.SMALL: { - "kV": SMALL_GEN_KV, - "kW": SMALL_GEN_KW, + "kV": defaults.SMALL_GEN_KV, + "kW": defaults.SMALL_GEN_KW, }, GeneratorType.LARGE: { - "kV": LARGE_GEN_KV, - "kW": LARGE_GEN_KW, + "kV": defaults.LARGE_GEN_KV, + "kW": defaults.LARGE_GEN_KW, }, GeneratorType.INDUSTRIAL: { - "kV": INDUSTRIAL_GEN_KV, - "kW": INDUSTRIAL_GEN_KW, + "kV": defaults.INDUSTRIAL_GEN_KV, + "kW": defaults.INDUSTRIAL_GEN_KW, } } \ No newline at end of file diff --git a/pygridsim/core.py b/pygridsim/core.py index ad70d96..eeba652 100644 --- a/pygridsim/core.py +++ b/pygridsim/core.py @@ -1,11 +1,8 @@ # -*- coding: utf-8 -*- from altdss import altdss -from altdss import AltDSS, Transformer, Vsource, Load, LoadModel, LoadShape -from dss.enums import LineUnits, SolveModes -from pygridsim.parameters import * +from pygridsim.parameters import make_load_node, make_source_node, make_generator, make_pv from pygridsim.results import query_solution, export_results from pygridsim.lines import make_line -from pygridsim.enums import LineType, SourceType, LoadType, GeneratorType """Main module.""" @@ -74,7 +71,7 @@ def add_PVSystem(self, load_nodes: list[str], params = {}, num_panels: int = 1): self.num_pv += 1 return PV_nodes - def add_generator(self, num: int = 1, gen_type: GeneratorType = GeneratorType.SMALL, params = {}): + def add_generator(self, num: int = 1, gen_type: str = "small", params = {}): """ Specify parameters for a generator to add to the circuit diff --git a/pygridsim/defaults.py b/pygridsim/defaults.py index cade565..cc081d6 100644 --- a/pygridsim/defaults.py +++ b/pygridsim/defaults.py @@ -1,7 +1,6 @@ """ Set any defaults (i.e. default source voltage, default node load etc.) """ -from altdss import altdss from altdss import Connection """ Overall Defaults, used for load, sources, lines, etc. diff --git a/pygridsim/enums.py b/pygridsim/enums.py index 4ed5450..b6ed6d3 100644 --- a/pygridsim/enums.py +++ b/pygridsim/enums.py @@ -1,5 +1,4 @@ from enum import Enum -import pygridsim.defaults as defaults class SourceType(Enum): TURBINE = "turbine" diff --git a/pygridsim/lines.py b/pygridsim/lines.py index 241fad7..c9c6306 100644 --- a/pygridsim/lines.py +++ b/pygridsim/lines.py @@ -1,6 +1,6 @@ from altdss import altdss -from altdss import Transformer, Connection -from pygridsim.configs import * +from altdss import Transformer +from pygridsim.configs import LINE_CONFIGURATIONS import pygridsim.defaults as defaults from pygridsim.enums import LineType from pygridsim.parameters import get_param, random_param, check_valid_params, get_enum_obj diff --git a/pygridsim/parameters.py b/pygridsim/parameters.py index cdb7298..0f8dcc8 100644 --- a/pygridsim/parameters.py +++ b/pygridsim/parameters.py @@ -2,9 +2,9 @@ Helper functions to parse the parameters used for loads and sources """ from altdss import altdss -from altdss import AltDSS, Transformer, Vsource, Load, PVSystem, Generator -from pygridsim.enums import * -from pygridsim.configs import * +from altdss import Load, PVSystem, Generator +from pygridsim.enums import LoadType, SourceType, GeneratorType +from pygridsim.configs import LOAD_CONFIGURATIONS, SOURCE_CONFIGURATIONS, GENERATOR_CONFIGURATIONS import pygridsim.defaults as defaults import random diff --git a/sim.json b/sim.json index 71dc8cf..6029a3f 100644 --- a/sim.json +++ b/sim.json @@ -1,10 +1,10 @@ { "Voltages": { - "source": 1780.380636334411, - "load0": 131.72617974134454 + "source": 2282.7562444775963, + "load0": 206.47949848565221 }, "Losses": { - "Active Power Loss": 241674.29037881663, - "Reactive Power Loss": 502464.37327243283 + "Active Power Loss": 370747.6727038353, + "Reactive Power Loss": 770855.4012118444 } } \ No newline at end of file diff --git a/tests/__pycache__/test_circuit.cpython-312.pyc b/tests/__pycache__/test_circuit.cpython-312.pyc index 2ecda2f375d7f5552b6b23459443fbd29e5ba253..17a626c7cb6e6be94185fcb2a22b56ae42e625dc 100644 GIT binary patch delta 3077 zcma);U2IfE6vyw}-Fx?|Tei!xv~0U6r3G7r0@^}pOG+se3R%Fib}waNKkD3F zNgGZ5K%k>x2*FrR$Vp4YlC(yw zNhP8r)rd+Y2i{l`wunuZI;5EOs1#E)+aV7tvCTbk!9K?!%qlnArkkC@Z0BajG;^nG z#1eK+KuVYxj^2?D8jtnGlVPi2?~bRm9V5dUAEl!)F>>~$vvkn3x;wO#Mx&WD#jD&r z(kv4n>$Ye`bGSF1aD-?HyJT7JE`>qncuJx^cA>Z|=e2Gj#Lf0Ae!qv?4clOx4rb#S zF)M_1$CVbf9P4(o{r=5t+^4W|)y;QUSXP$Xpq?dU0sF~TU0s3YYIj=KH9hR47XC;V z0wJIhaI+QmC6$XXtOBZm#T=8n@v%|PF51i4DSI6XW0#Yz=W zfXUDd<*{fYt4)hg#D=iK3Ki$+Nbt)W$ncAy%doZqsNvAzDuh2;!birEjHYK!7FV$w z?pD&ms*8_tO&5wQNylW+6GBH}&|#Sduv|&-)L3cAo&9FSvjjWevq$a1&T)Q`^VmzC z-TY{I4zRyGMk@}`u(w5H+ju-9=WJ6!&Wz5@XPVbnc$N#i8_0I{us82Dcg^c0YbLeN zdSMU2mAIgd7!~^S`Sz(1Zq`$IxgmDmx6aH4W|=qc5_fK1FZ*R)g?APo75;T(knQmg zW zu$q0gpqXS&1|H2H#EXIB`DE|Mwp)N6tPpv$Vgfyp_5!cJxmb{;o)bQ1Em`EQh-J8$;>b zy0focv;sppnC4@{^++^^nh>QY?)f1;GfZd;|3?wEq4aHO?M{f`3|l5k+q!z%MRyr> z4X2OrvK~%EQ<<>GR3Bm`RZDtA12_N|LO3eYuyytibYrau$TsP^+w6a69ENSj&h5f~ zVUoX6^&oj6cdg1M$Iuk07eJS$OMoWe0bniA3bX?qz-C|vun&j6kP9n|fa#wSJVWScfDJG8 zdvquCs3^k#phB61Ia&49_4;TEKQd`c>)ZR}nv8%Pm zc~wT1y+_92o<0sd4Pa+_6c9q5#prpCe5M!l+WQNhn&}IeTmj%?)AKJnf}$WB8yW`E z{IkF=)s?U_bifJGkD@Hyg&F!zV;A`{ceAm^vKxvf{^EamF`}vvcl-@* zEbyL$yAX%r?8hgvozgTlw-a?!xJSBa3%QZI)O3ZcpZb_Jh1GoF!Iw}fgujNzyPaUK zAp3Jwko~x-ncU8mKTt~A#TmNv42`FTx>Cd0j8Go7nvUVlaNtLiDK7-i1Evl&4BfR>? z1NSIAcD^OxQV3u9Kg(^-+TfTI^GC5AHtFFh3U zf7>Z5ZnJk_PPoV@9v&IuzhCuuvVJg4HOkJf^^c)fnm?e>5vk~t_G~JiK}{I;9h@7Y zx@NX3aWrDvLMeuQZ89CpCbaeREce3YNIIJNuNFecZ>mHVe=l`?C3THU)jvpc?l=cz d(nii4{5H6}=z4JZ9Z5Xj*~mKAg{?S>zX9n*gzo?V delta 2982 zcma);YfKzf6vyYzGPAS0EZxGELKo;-D(ym{MWIT8YD*}^P^eO{q7_$m1mZsGouw8M z1C6!y(Z-PLqoyVr6HQ2bH5=n2KGF}y_)OHOablAu8V#R()#wLfJ^wpfmc_PlKK%CH zGxwhJzxSSVXXmH>nDT$@_j?t3+CKbt^vtZk{D!xv^Q00}Vl1vC*brlAt8w)uRkmDl zSHd;qlI;R&7Yr3J#e*?gTpQ9|$kwWU<}cv?k(d%hpEXW|YsVe3>|;1zA8m zp|$F(F>|lDC$K^!OPj?ffnru7PF0m>cIhuLRxZxD*RHLA8@(rGS*8{7au;=Z6@bY+ z3>1nsV_n4+Xs!XOfwcswDh!>|#?AVASRSQl?c&{_TZBD**=P@W3fUgKLo%lNj>d%Stj|_(s`uF35ua zh}SlH#*^lr$^EA7?N3ec5vOhRq@poca|^e%1JU?|xoG`zu%1WQvCLkZ)dO?kziU|U6H(ZjS4IJVP82J2ebhxr1`%HM~G%2$!q*5V}VYFpho z=xoA&*DnHrTUn2Y2e{*0{1vdbVJmH8do*?<>7Sf)=N7eeHAo)kF!Od*loWU91N6@7 zyO1^B6Y(#L>b^2I@RH1{#no)f!U8UOklW!{9^4MJ^1b_m`}BSAo+R(h;`v~^lOf{o z;8~x{1Lw%aPb(^mFEYQhv|S&?{K2fc&TNK#TDqL+4G0(#Kdh|nTjYz35o5_l*oDzp zY?_;GQsSAigV}hE<;83(;@QTinRGG%G3Qj|hgg-Z_3zr&6PMy`cY1lGc;xXJUv-4vSzUE@u$g{=RF1Q_=?-!L446VIZtsXTo|wNW8B`n zi~X2+vH26$lKTWTM|7v?;l`ONg`Yt8B2G?Sa|`=3qf%=|4{p286`PmXNr=8jT7yI0lx&W(aG^k1iF|KuqB>$Jub4I?RT za&fY)R7at6U7T(!8aWTgJ&=q#&cS_|M qrTmOi`3rjAE6dJ#?@-xxc4F+Cs*RslZ9J#Q?ztVJtvynJ75@wVZFe;Q diff --git a/tests/temp.py b/tests/temp.py deleted file mode 100644 index 9147595..0000000 --- a/tests/temp.py +++ /dev/null @@ -1,36 +0,0 @@ -# -*- coding: utf-8 -*- -from altdss import altdss -from altdss import AltDSS, Transformer, Vsource, Load, LoadModel, LoadShape -from dss.enums import LineUnits, SolveModes -""" -this is from colab stuff, delete later -""" - -altdss('new circuit.IEEE13Nodeckt') - -# create voltage source -source1 = altdss.Vsource[0] -source1.Bus1 = 'SourceBus' -source1.BasekV = 0.6 -source1.Phases = 3 -source1.Frequency = 60 - -# create load -load1 : Load = altdss.Load.new('load1') -load1.Bus1 = 'LoadBus' -load1.Phases = 3 -load1.kV = 200 -load1.kW = 1.2 -load1.kvar = 0.6 - -# line between voltage source and load -line1 = altdss.Line.new('line1') -line1.Phases = 3 -line1.Bus1 = 'SourceBus' -line1.Bus2 = 'LoadBus' -line1.Length = 0.1 -line1.Units = LineUnits.km - -# "solve" the circuit -altdss.Solution.Solve() -print(altdss.BusVMag()) \ No newline at end of file diff --git a/tests/test_circuit.py b/tests/test_circuit.py index db9f4cc..2af257c 100644 --- a/tests/test_circuit.py +++ b/tests/test_circuit.py @@ -1,15 +1,11 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- from pygridsim.core import PyGridSim -from pygridsim.enums import * -from altdss import altdss -from altdss import Connection - +from pygridsim.enums import LineType, LoadType, SourceType, GeneratorType +import unittest """Tests for `pygridsim` package.""" -import unittest - # from pygridsim import pygridsim From d9309efef26ac42ec35d6584534574ef80504285 Mon Sep 17 00:00:00 2001 From: Angela Zhao Date: Fri, 21 Mar 2025 15:01:13 -0400 Subject: [PATCH 14/21] remove unnecessary view functions --- pygridsim/core.py | 37 ------------------ sim.json | 8 ++-- .../__pycache__/test_circuit.cpython-312.pyc | Bin 15721 -> 15479 bytes tests/test_circuit.py | 3 -- 4 files changed, 4 insertions(+), 44 deletions(-) diff --git a/pygridsim/core.py b/pygridsim/core.py index eeba652..71e23ba 100644 --- a/pygridsim/core.py +++ b/pygridsim/core.py @@ -101,43 +101,6 @@ def add_lines(self, connections: list[tuple], line_type: str = "lv", params = {} make_line(src, dst, line_type, self.num_lines, params, transformer) self.num_lines += 1 - def view_load_nodes(self, indices: list = []): - """ - View load nodes (what their parameters are) at the given indices. - - Args: - indices (optional): Which indices to view the nodes at. - If none given, display all - """ - load_nodes = [] - if not indices: - indices = [i for i in range(self.num_loads)] - - for idx in indices: - load_obj = altdss.Load["load" + str(idx)] - load_info = {} - load_info["name"] = "load" + str(idx) - load_info["kV"] = load_obj.kV - load_info["kW"] = load_obj.kW - load_info["kVar"] = load_obj.kvar - load_nodes.append(load_info) - return load_nodes - - - def view_source_node(self): - """ - View source nodes (what their parameters are) at the given indices. - - Args: - indices (optional): Which indices to view the nodes at. - If none given, display all - """ - source_obj = altdss.Vsource["source"] - source_info = {} - source_info["name"] = "source" - source_info["kV"] = source_obj.BasekV - return source_info - def solve(self): """ Initialize "solve" mode in AltDSS, then allowing the user to query various results on the circuit diff --git a/sim.json b/sim.json index 6029a3f..aa5fffd 100644 --- a/sim.json +++ b/sim.json @@ -1,10 +1,10 @@ { "Voltages": { - "source": 2282.7562444775963, - "load0": 206.47949848565221 + "source": 1735.8007811315708, + "load0": 205.64441923330276 }, "Losses": { - "Active Power Loss": 370747.6727038353, - "Reactive Power Loss": 770855.4012118444 + "Active Power Loss": 198582.96141955358, + "Reactive Power Loss": 412884.39931989944 } } \ No newline at end of file diff --git a/tests/__pycache__/test_circuit.cpython-312.pyc b/tests/__pycache__/test_circuit.cpython-312.pyc index 17a626c7cb6e6be94185fcb2a22b56ae42e625dc..330fa5625f8a7598826272a82aa227c9b20dac03 100644 GIT binary patch delta 1133 zcmZwGUrbY190&0GySLmzI}or^pca&}VhIevFjgo`ONfG9!7)4NmXVq=L~5(2uqay` zYMgs8QS&p=_$O-OvKaTU<;0-VxXsrsOUxb?yZ9&Zse9PW!otI1-1%P7WQ+IV)7#(q zo$on4_clMfxToaD;$nxUuEhMki7y+DmxLWjEor3eaeI;WP5d97mUGOwKyJBc z&g=;9E?vRtigx~~)W>s0Mf^j_Cp@`)h;O(n__57L4!&VuUo5<;J7-2R+3a|h?>O9i zuyB~_IaM0wTP_c`yylm4MR$psW!!mNrw-{YiR#oRQ>DL?8O2hAFP6INs+QlEx016* z)vaU^<_jGwxXd+b#?YHqz3uV~*BH^Wk?M+|IfjuKQe?Vftxgm2eC4Qa?m~I{Qn*Vt zc>bW?cM!Z8L=?G#R3?#Z%j0ka_9C_dtRw;;q)<%>F)qq^a$B+9FS4P*9Av9U;hv`+;M`Z9D# ze&_S(>(*iXbIb1;_h3h3VAxUu#FaB22MC1%Eu~0-H>w*02DCUCLMB=&vkL>V+0?cCaQ)%#E251A z9Wxn=nVBb>m>8M=n3=`Q<(e25{l{eb$25vtBx#oTbAR*?7q^ith8Vr)t$(QT{qf1Y z=bZ2N+;{GKcV8&vwp_8>tp@S@5x72mqV?340jtFjH^hxe^Q8IWz#mHM@f)`VX7I??c3hOl@5@@qjGnlHC+n*4!xE+HymT)FhJU0j z2xdJkotNS+H$r~CKhi9XW|Jhkh4cJbL>!}xMgl( zo0mfwO-pF16@M>tbl53W`uuESKAIH5XqtriGCiQ_Vm-tfMIC#9(1br(9Qd(0BKyQv zdtJQTVDqnv{dj6+|GK+#&E0v`z4MyVeO-hyEA#7~?ln*MRZs6VC4gtkEAin6n`s98 zP32pFc0ObMT!J8Pvxg-ZMw>FgKP^26@>AsfBn^%)mcI-qRd!v>|Ok#V-w&o|Dbw8lCzYWDW)oUSM5!Bbc}pQ2w{P|i6*h5 zK-bJh3Hu4-1eLH$KorH;bV4<aSE|Nf% z7>V=BGqLz+jKxyALs*|7JEaQ=A;SOJ(hnqtyqEGz1o|*kGc(fqFd<3s5E=*v2>M0f z4NEzm+dc%}@tfP5jea^u;VZET*_gbSGJ?T2|>_0`~)y?=rUF9#BhRuJhN)zCGDRhj*_6NZBB zt*cZ)08y`%i^Va+ElDydw`Ixn&>gE}vg-zH6)`x`q&L+y)g&ZqMxwmZm&(NFl8IgH oJuK^Ud44oB{bDHHutp^qfR&l``fY3V+cpgPc4N?lPxSf!28S|KWB>pF diff --git a/tests/test_circuit.py b/tests/test_circuit.py index 2af257c..a2de2ef 100644 --- a/tests/test_circuit.py +++ b/tests/test_circuit.py @@ -38,9 +38,6 @@ def test_001_one_source_one_load(self): circuit.update_source(source_type="turbine") circuit.add_load_nodes(num=1, load_type="house") circuit.add_lines([("source", "load0")], "MV") - #circuit.add_transformers([("source", "load0")], params={"Conns": [Connection.wye, Connection.delta]}) - print("Load Nodes:", circuit.view_load_nodes()) - print("Source Nodes:", circuit.view_source_node()) circuit.solve() print(circuit.results(["Voltages", "Losses"])) circuit.clear() From 6a5fd2d17e3ec7470f4d27b3bd72f0f11314dd13 Mon Sep 17 00:00:00 2001 From: Angela Zhao Date: Fri, 21 Mar 2025 15:04:43 -0400 Subject: [PATCH 15/21] update core docstrings --- pygridsim/core.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/pygridsim/core.py b/pygridsim/core.py index 71e23ba..c3a7b75 100644 --- a/pygridsim/core.py +++ b/pygridsim/core.py @@ -42,11 +42,8 @@ def update_source(self, source_type: str = "turbine", params = {}): Adds a main voltage source if it doesn't exist, otherwise edits it Args: - params: load parameters for these manual additions source_type: source type as a string - num (optional): number of sources to create with these parameters (removed for now) - (removed) num_in_batch: how many to batch together directly (so they can't be connected to lines separately, etc. - most common use case is if a house has 20 solar panels it's more useful to group them together) + params: load parameters for these manual additions Return: List of source_nodes """ @@ -96,6 +93,8 @@ def add_lines(self, connections: list[tuple], line_type: str = "lv", params = {} Args: connections: a list of new connections to add. Each item of the list follows the form (source1, load1) line_type: a string representing linetype if user wants to use preset parameters + params: any custom parameters for lines or transformers + transformer: whether or not to include a transformer, default yes """ for src, dst in connections: make_line(src, dst, line_type, self.num_lines, params, transformer) @@ -110,8 +109,11 @@ def solve(self): def results(self, queries: list[str], export_path = ""): """ Allow the user to query for many results at once instead of learning how to manually query - - Returns: + + Args: + queries: List of queries to fetch the result of + export_path: if specified, exports result to this string + Return: Results for each query, in a dictionary """ results = {} From 05910e8c3f76a520c6f1823c0aacba0a1121e399 Mon Sep 17 00:00:00 2001 From: Angela Zhao Date: Wed, 2 Apr 2025 17:27:31 -0400 Subject: [PATCH 16/21] fixes from sarah's comments: update docstrings, add _ to private functions, remove mutable types from function argument, etc --- pygridsim/__init__.py | 2 +- .../__pycache__/__init__.cpython-312.pyc | Bin 360 -> 363 bytes pygridsim/__pycache__/configs.cpython-312.pyc | Bin 2437 -> 2437 bytes pygridsim/__pycache__/core.cpython-312.pyc | Bin 7736 -> 8467 bytes .../__pycache__/defaults.cpython-312.pyc | Bin 1877 -> 1923 bytes pygridsim/__pycache__/enums.cpython-312.pyc | Bin 1236 -> 1236 bytes pygridsim/__pycache__/lines.cpython-312.pyc | Bin 3135 -> 3285 bytes .../__pycache__/parameters.cpython-312.pyc | Bin 7348 -> 7370 bytes pygridsim/__pycache__/results.cpython-312.pyc | Bin 1673 -> 1673 bytes pygridsim/core.py | 177 ++++++++++++------ pygridsim/defaults.py | 4 +- pygridsim/lines.py | 24 +-- pygridsim/parameters.py | 62 +++--- sim.json | 8 +- .../__pycache__/test_circuit.cpython-312.pyc | Bin 15479 -> 15479 bytes tests/test_circuit.py | 2 +- 16 files changed, 170 insertions(+), 109 deletions(-) diff --git a/pygridsim/__init__.py b/pygridsim/__init__.py index 066174b..110d963 100644 --- a/pygridsim/__init__.py +++ b/pygridsim/__init__.py @@ -4,6 +4,6 @@ __author__ = 'Angela Zhao' __email__ = 'amzhao@mit.edu' -__version__ = '0.1.0.0' +__version__ = '0.1.0.dev0' from pygridsim.core import PyGridSim as PyGridSim \ No newline at end of file diff --git a/pygridsim/__pycache__/__init__.cpython-312.pyc b/pygridsim/__pycache__/__init__.cpython-312.pyc index 6cd83eea70072500443f0591beb9661ca7d92d78..975285af52b3f1272bb36983724b0dcb24b43985 100644 GIT binary patch delta 47 zcmaFC^qPtHG%qg~0}!m4|2F;DMBaKXE(1M7Jp;Xz)Ut__PjO2%a6e-(ECMM30A)rE A^#A|> delta 44 wcmaFO^n!`^G%qg~0}$w0-bp_^k++_m-9XP!&p>bDv{T&T4cyNd42wYW02r?r-F-;sgLQ!UaA6 delta 20 acmZn_ZWZP}&CAQh00cKI?`-6*;sgLRRs~l8 diff --git a/pygridsim/__pycache__/core.cpython-312.pyc b/pygridsim/__pycache__/core.cpython-312.pyc index 553349cbb67c662f6cd64728c389802efa4ef39f..43bee90ecb42d0cbd45e54a0f8622a0393cf5d65 100644 GIT binary patch literal 8467 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 PPku$uJ@lDIsT$<3u*?aS literal 7736 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 delta 247 zcmZqXzskpZnwOW00SMTv@1&oc$ScVhwo%=cQ7lS5MKMJwoheEqogqbe5o45QrHZEN z<_U~EjP==Jx0tfSZ?R;TB^KRcE67MJPA%4CFA@ftQX~c>ZgHj+r52W^<|S9&VhS<< zV#8ZZ5kNY^P?PxYk9%Q7=EO*UZN$K?f7#R$a3<(q%7Ml!028ed=#yd~y+fkF6|g4G2E*&D** WGbAnuDK+rllGMM*AXel7R1E;|+C_c< diff --git a/pygridsim/__pycache__/enums.cpython-312.pyc b/pygridsim/__pycache__/enums.cpython-312.pyc index 3a1315451ccea646d9f5c5ceb8046ca19386d705..4348504a29f3d523c51b4b74282ea93340554638 100644 GIT binary patch delta 20 acmcb@d4-evG%qg~0}$MmxWAG6BntpOtp*YR delta 20 acmcb@d4-evG%qg~0}u#U-`U80k_7-c)dgh$ diff --git a/pygridsim/__pycache__/lines.cpython-312.pyc b/pygridsim/__pycache__/lines.cpython-312.pyc index 2b3b7a44576522100cd5f2d4e1b3e554cc6eb97f..295d0a3d5ae17550f6fce2ac817a87d9587a130b 100644 GIT binary patch delta 434 zcmdllaaEG{G%qg~0}wPUeVe{!BJV9(uK4uSlK6teqQu-=yzxbec`5n1P_A(NWJX3| zCf@kTqKx{6K8y?u(-~?QQW&!}7#NE5YZyvE27y5q6O4tR%O(dhx-bKkO`gUmH+d4H zE0}$QQEu}U#%xAicCfwKWknJ|Eu27H+yf*U7(Q??a0pKDxWq2AKyppm`n;8S7Zq(L zCos!$gZbGjvo9)IPOfE^ab3afqJrBM7WX?Mic2(BcwQDUo2<{JB_lHg#}_OM7MBk=h?_}SvNGL5ZTVcK>;<~BVMN_Xc9@l-6FZv{3FiE*AkqTDvL|kr0@#LB%;VXg{$6OFI nnry@UOg8Q^L)={k`A;m|j7A@%7);F%q8oE=}5 zn3I_T5h}jLGg*>RpZ5V!|8#~Lh7`tZ4Ti~;j4qQOGCFN`XUbqyWCNL&T~;IkRKf|w z#hE~&f#CxO1Bc)Qk4x+_lkYIg%HH7@?XT{vo?&^BU-de_#zlUO3mh6ZI7Mb~UgT8V ztj7}1X2zMDn4KD*lbM%VWCb)r3}luyBgm{TVhpU}6UydPT$gvfDDQfO#qExW!V-xU zmX}3LCm-R`l9ry~w!mXe&J}CF6SWtuV=u&|U9?WWte0_FD04CwcSV5w0=5;bYbw^) ztgN{#X4Bx^;(tR@W=8T1t_JTbETVTL6c?ziP~YNl-Nf^viRT%M>)uHhy^}5&CtsFG z0jqc-E;}Q6a`h6o6~>FbFNhgTzQp}ZHtI4%)LjPoPb}PwMjxaYOw101d|^;wlrEA4 Gx*Pz|?t-ZR diff --git a/pygridsim/__pycache__/parameters.cpython-312.pyc b/pygridsim/__pycache__/parameters.cpython-312.pyc index 4058003e64c661375e760b2286b22ec6a78b41d0..2c7dad8dd38a1066f0fd6d9c10aac307cd78a0b9 100644 GIT binary patch delta 1716 zcmaJ>ZA@EL7{0e(yM^9f`aN10x7Gs9h8WoxOa?2o$j90;aE_6{_1fO?*_NFaCXTur zvn89E*_IPs6ZeC}#?;Jc7f7}xB-1~}=%3ZgQqmEfWE z^PY2_^Svyg6_cUEbpcel0xAE95`V+EAg)AlNTOT2~PDF^5Vv(F8k@2r~bK9O$ z!kbPJ9~O%0d46V2C{q2xf**i5@TlQcg_G3_vAHOR*0>U1E8EG1Ss|fD=dtiBg)cyJ z<3f^?SK@C?0XteKM?G;2fk><~Cb4JTQhj~w+L&Z<7c32VOG7rCdquJ|i@}GMnv2?X zo#jgCQYihdq-%ivN(cF9d0hDySy_o36lo6du}D11&GLYc0vDRI!ZYe>@)7({?IIoU zuKJu+W|qnKDA7EKRtp0fL|8tpNs(kN{C!tVjm$G~;Rzu;jh{6cDY;F6{b)lY+(*UH zh8xs3O50w1xMKQ5Q8hi!1Ar7HJO;2IF6f-39e%8Hksf$Y_X6pHzvx~io8cb1&MUiT zxF|m@Ai?+u7mG&((2KUVqMlenAQFGt3H9!Dd1koa?#R14)>KC}%+5@GwpTJY!wd9F zdV?d~pWVIEa=YVJhh%_X(@t;S(%GDEwc%SvIy5X*oqRxzY^n)^dy^uJ4$*hMZ@rum z`+)=b4{yf-8WIGKE;*cjfV^#Z`K(?^)+cueQ!M5@-%#kFm!{N77kr;_lP|&?(?DvL ze`M~E2M;1DkY&-H0>bGzAr@Znm}KR^A+%OBz2QCD>*Iz(#|OLo+<;kQ zv>orop8`5C9KnEtME*~(4~>f2?m_>t581VbN!DkM=@MU8=*$?B! zx+z(3LrL&Nd=7+#lH|k4;SlPHI|z{ERxCN4dAm^8m9OhsQ~5Tmu1sI9T(Y)_p~tl8 z%Gjl`v^P)h5xduocCq_>|Au)_I+dMRrS36z8OhuO|2A4VJQZ09-0vKc_P;Kfk0WAW z!{%IS$T?Og3he{=_5sOuOzd7$nIAK@0#m=n)L&F?P|Q_LT6tq6OXm`+J%zSlzAY$K zhaOM^n@Xa>v#B9;Mlk>!%Q4dz3e%3vL63f0T-a!>scAz`0f#aCmzXXXwN{Sf-|?u6 z+GoL6i)M;tIE!cbm@tz7e(YfcK`Db-)PO7_Rg!Ub9&l(iiWwM?dS;ke%6uJb5Yn!Z5QTNp3 za8=_m`!xhb{m#5xY7(%O);*W`J8uD}5I==_;yMB(q;W^cjyx-8zKP9L=P1e43XP5? zy>qEHTffqCJ9H}~*?e%w;jFZ0yXDN+ONUNK&fy2t$v;r$S0g1qa4a0fX$NXB$Rgm^ zl(Gz$Gr8~poC@-f%C`Y-Y~n(({poGdcw}xyXb019udD3@EWB1_r8#no KHIO5uyyG8=E7`mN delta 1710 zcmaJ>?N3`(7{BNC?RMP0(B8iC(wCK&x=lo2P+_HG4A~e|rf!{kX=-~JqqJqGfDk}x zoC%o4EjuQwx=fPwLv_Z15Qk4 z!53tsiFbHdP(XfcG!*6wOdmge7{UZ}OVP))L!;#56S3g<^cbI%Vz+3E?w)7Q^W#BL zpLlx&TClndOY#_o6qVQLQ@!^MwgqLLHC*v8`qNXNzx&C%f~{fO)|#`mu1nUB3pSs? z`tm0GV(&v4Wwbw%Q!H0h8#hdQ1ohqxW^cYspYlJ({-`h@_+&}&E}>R$N{V2=8J`O* z48b!@%Pn_nQ6_=yzh{1um|nn& z0v$bBkVYp%5Z2+VyBs#5>#PG<(0A-^P>+6Noxpib)ec%vhpNseI#w!57x zoq`TMP&p1BS&A+<->du~A$U#*l_$5D0Oq;8=AoR@RiwHv9eq%yN%cW1_8)#yEci%K zq#g;!kH1BmOknj>wFIycIW9xY&75r9fqvA~04I8nvm%*R4-~5w?K)`Kk6%DBc;yh} zFHZ3B@U&Z6ppUqN$&2mMuUX(dGi83N?@3W^iS!~_iU@BmSfOh7Mz zP6DL3#N5I?$g8u^(1)TrFF1<6)YZ+43~EINOD;+rzJ=cmVo8330dr_19L{Biw`;p{ zwOyOiLq(%A^GbF`Ft(@sf2#CX&MlrxAIzz$Q$2Z|HPv&eugF!UW7)vk)ZO`&d4YQs z>-vl4ec43L>|GzvnY%Znh9Y;07`?I9vEdsOnvM(H>!O*-zErhbb}z7fz@Izd7fi3E zdN!rpADX%aNs-Z9m8T^)PA$zXhwrs*xA*7T`-Q53Eyn*)LTT%9idbE$A6i$J^4hGZ>O& zme|RHBBKhC(XmMw!ulvNh+z=#@E8-u5FuG0d0Ce`)9VI1Lyrq2K!szx%y5DHp;wvu4o zv{*`zG{Asc`!r^swQ^pp870<>H3Q}3^#44t#KcE{j0U#?iUcs{`M5aI#PADvnw73W zGR?xox(7o+{Y)>;ha|dhWuI?Y{F#TL@dSj!*n9>{@;V00k&YCb$dNZ^6B|}<%c!zb zg1!yaS2U^ZOU7sYYC422R5&b_?0&IfK^SPPGD~LnF-Dx%h-A=O_oCS~V?r-F-V*>y)hXp$T delta 20 acmeC=?d0V?&CAQh00c7TcQ$g@u>k-s>jahn diff --git a/pygridsim/core.py b/pygridsim/core.py index c3a7b75..e6b71fb 100644 --- a/pygridsim/core.py +++ b/pygridsim/core.py @@ -1,15 +1,24 @@ # -*- coding: utf-8 -*- from altdss import altdss -from pygridsim.parameters import make_load_node, make_source_node, make_generator, make_pv +from pygridsim.parameters import _make_load_node, _make_source_node, _make_generator, _make_pv from pygridsim.results import query_solution, export_results -from pygridsim.lines import make_line +from pygridsim.lines import _make_line """Main module.""" class PyGridSim: def __init__(self): - """ - Initialize OpenDSS/AltDSS engine. Creates an Empty Circuit + """Initialize OpenDSS engine. + + Instantiate an OpenDSS circuit that user can build circuit components on. Stores numbers of circuit components + to ensure unique naming of repeat circuit components + + Attributes: + num_loads (int): Number of loads in circuit so far. + num_lines (int): Number of lines in circuit so far. + num_transformers (int): Number of transformers in circuit so far. + num_pv (int): Number of PV systems in circuit so far. + num_generators (int): Number generators in circuit so far. """ self.num_loads = 0 self.num_lines = 0 @@ -19,115 +28,163 @@ def __init__(self): altdss.ClearAll() altdss('new circuit.MyCircuit') - def add_load_nodes(self, load_type: str = "house", params = {}, num: int = 1): - """ - When the user wants to manually add nodes, or make nodes with varying parameters. + def add_load_nodes(self, load_type: str = "house", params: dict[str, int] = None, num: int = 1): + """Adds Load Node(s) to circuit. + + Allows the user to add num load nodes, either with customized parameters or using a default load_type. Args: - params: load parameters for these manual additions - load_type: input as string, representing one of the load types - lines: which nodes these new loads are connected to - num (optional): number of loads to create with these parameters - Return: - List of load_nodes + load_type (str, optional): + Load type as a string, one of "house", "commercial", "industrial". Defaults to "house". + params (dict[str, int], optional): + Load parameters for these manual additions. Defaults to empty dictionary. + num (int, optional): + The number of loads to create with these parameters. Defaults to 1. + + Returns: + list[OpenDSS object]: + A list of OpenDSS objects representing the load nodes created. """ + params = params or dict() load_nodes = [] for _ in range(num): - make_load_node(params, load_type, self.num_loads) + _make_load_node(params, load_type, self.num_loads) self.num_loads += 1 + return load_nodes - def update_source(self, source_type: str = "turbine", params = {}): - """ - Adds a main voltage source if it doesn't exist, otherwise edits it + def update_source(self, source_type: str = "turbine", params: dict[str, int] = None): + """Adds or updates source node in system. + + If a Vsource node does not exist, it is created. Otherwise, its parameters are updated based on the provided values. Args: - source_type: source type as a string - params: load parameters for these manual additions - Return: - List of source_nodes - """ - return make_source_node(params, source_type) + source_type (str, optional): + The type of the source (one of "turbine", "powerplant", "lvsub", "mvsub", "hvsub", "shvsub"). Defaults to "turbine". + params (dict[str, int], optional): + A dictionary of parameters to configure the source node. Defaults to None. - def add_PVSystem(self, load_nodes: list[str], params = {}, num_panels: int = 1): + Returns: + OpenDSS object: + The OpenDSS object representing the source node. """ - Specify a list of load nodes to add a PVsystem ("solar panel") to. + params = params or dict() + return _make_source_node(params, source_type) + + def add_PVSystem(self, load_nodes: list[str], params: dict[str, int] = None, num_panels: int = 1): + """Adds a photovoltaic (PV) system to the specified load nodes. + + Adds PV system with num_panels to each of the listed load nodes. Can be customized with parameters. Args: - load_nodes: which load nodes to add PVsystem to - params: specify anything else about the PVsystem. otherwise defaults to typical solar panel - num_panels: representing how many solar panels (to represent scale) - Return: - list of PVSystem objects + load_nodes (list[str]): + A list of node names where the PV system will be connected. + params (dict[str, int], optional): + A dictionary of additional parameters for the PV system. Defaults to None. + num_panels (int, optional): + The number of PV panels in the system. Defaults to 1. + + Returns: + list[DSS objects]: + A list of OpenDSS objects representing the PV systems created. """ + params = params or dict() if not load_nodes: raise ValueError("Need to enter load nodes to add PVSystem to") + PV_nodes = [] for load in load_nodes: - PV_nodes.append(make_pv(load, params, num_panels, self.num_pv)) + PV_nodes.append(_make_pv(load, params, num_panels, self.num_pv)) self.num_pv += 1 + return PV_nodes - def add_generator(self, num: int = 1, gen_type: str = "small", params = {}): - """ - Specify parameters for a generator to add to the circuit - + def add_generator(self, num: int = 1, gen_type: str = "small", params: dict[str, int] = None): + """Adds generator(s) to the system. + Args: - num: number of generators - gen_type: specify the generator type (small, large, industrial) - params: specify anything else about the generator. - Return: - list of generator objects + num (int, optional): + The number of generator units to add. Defaults to 1. + gen_type (str, optional): + The type of generator (one of "small", "large", "industrial"). Defaults to "small". + params (dict[str, int], optional): + A dictionary of parameters to configure the generator. Defaults to None. + + Returns: + list[DSS objects]: + A list of OpenDSS objects representing the generators created. """ + params = params or dict() generators = [] for _ in range(num): - generators.append(make_generator(params, gen_type, count=self.num_generators)) + generators.append(_make_generator(params, gen_type, count=self.num_generators)) self.num_generators += 1 + return generators - def add_lines(self, connections: list[tuple], line_type: str = "lv", params = {}, transformer: bool = True): - """ - Specify all lines that the user wants to add. If redundant lines, doesn't add anything + def add_lines(self, connections: list[tuple], line_type: str = "lv", params: dict[str, int] = None, transformer: bool = True): + """Adds lines to the system. + + Adds electrical lines according to the given connections. Users can specify the parameters of the lines or otherwise use given line type options. Args: - connections: a list of new connections to add. Each item of the list follows the form (source1, load1) - line_type: a string representing linetype if user wants to use preset parameters - params: any custom parameters for lines or transformers - transformer: whether or not to include a transformer, default yes + connections (list[tuple]): + A list of tuples defining the connections between nodes. + line_type (str, optional): + The type of line (one of "lv", "mv", "hv"). Defaults to "lv". + params (dict[str, int], optional): + A dictionary of parameters to configure the lines. Defaults to None. + transformer (bool, optional): + Whether to include a transformer in the connection. Defaults to True. + + Returns: + None """ + params = params or dict() for src, dst in connections: - make_line(src, dst, line_type, self.num_lines, params, transformer) + _make_line(src, dst, line_type, self.num_lines, params, transformer) self.num_lines += 1 def solve(self): - """ - Initialize "solve" mode in AltDSS, then allowing the user to query various results on the circuit + """Solves the OpenDSS circuit. + + Initializes "solve" mode in OpenDSS, which then allows the user to query results on the circuit. + + Returns: + None """ altdss.Solution.Solve() def results(self, queries: list[str], export_path = ""): - """ - Allow the user to query for many results at once instead of learning how to manually query + """Gets simulation results based on specified queries. + + Allows the user to query for many results at once by providing a list of desired queries. Args: - queries: List of queries to fetch the result of - export_path: if specified, exports result to this string - Return: - Results for each query, in a dictionary + queries (list[str]): + A list of queries to the circuit ("Voltages", "Losses", "TotalPower") + export_path (str, optional): + The file path to export results. If empty, results are not exported. Defaults to "". + + Returns: + dict: + A dictionary containing the fetched simulation results. """ results = {} for query in queries: results[query] = query_solution(query) + if (export_path): export_results(results, export_path) + return results def clear(self): - """ - Must call after we are done using the circuit, or will cause re-creation errors. + """Clears the OpenDSS circuit. - We only work with one circuit at a time, can only have one PyGridSim object at a time. + Returns: + None """ altdss.ClearAll() self.num_loads = 0 diff --git a/pygridsim/defaults.py b/pygridsim/defaults.py index cc081d6..7a67a33 100644 --- a/pygridsim/defaults.py +++ b/pygridsim/defaults.py @@ -67,8 +67,10 @@ """ Valid parameter lists """ +IMPEDANCE_PARAMS = ["R0", "R1", "X0", "X1"] + VALID_LOAD_PARAMS = ["kV", "kW", "kvar", "phases"] -VALID_SOURCE_PARAMS = ["kV", "phases", "frequency", "R0", "R1", "X0", "X1"] +VALID_SOURCE_PARAMS = ["kV", "phases", "frequency"] + IMPEDANCE_PARAMS VALID_LINE_TRANSFORMER_PARAMS = ["length", "XHL", "Conns"] VALID_PV_PARAMS = ["kV", "phases"] VALID_GENERATOR_PARAMS = ["kV", "kW", "phases"] \ No newline at end of file diff --git a/pygridsim/lines.py b/pygridsim/lines.py index c9c6306..d44251e 100644 --- a/pygridsim/lines.py +++ b/pygridsim/lines.py @@ -3,23 +3,23 @@ from pygridsim.configs import LINE_CONFIGURATIONS import pygridsim.defaults as defaults from pygridsim.enums import LineType -from pygridsim.parameters import get_param, random_param, check_valid_params, get_enum_obj +from pygridsim.parameters import _get_param, _random_param, _check_valid_params, _get_enum_obj from dss.enums import LineUnits -def get_kv(node_name): +def _get_kv(node_name): """ Given a string of a node that exists, fetch its kV or raise error if doesn't exist """ - if node_name == "source": + if node_name == "source" and node_name in altdss.Vsource: return altdss.Vsource[node_name].BasekV - elif "load" in node_name: + elif "load" in node_name and node_name in altdss.Load: return altdss.Load[node_name].kV - elif "generator" in node_name: + elif "generator" in node_name and node_name in altdss.Generator: return altdss.Generator[node_name].kV else: raise KeyError("Invalid src or dst name") -def make_line(src, dst, line_type, count, params = {}, transformer = True): +def _make_line(src, dst, line_type, count, params = {}, transformer = True): """ Add a line between src and dst @@ -30,11 +30,11 @@ def make_line(src, dst, line_type, count, params = {}, transformer = True): Returns: Line object that was created """ - check_valid_params(params, defaults.VALID_LINE_TRANSFORMER_PARAMS) - line_type_obj = get_enum_obj(LineType, line_type) + _check_valid_params(params, defaults.VALID_LINE_TRANSFORMER_PARAMS) + line_type_obj = _get_enum_obj(LineType, line_type) line = altdss.Line.new('line' + str(count)) line.Phases = defaults.PHASES - line.Length = get_param(params, "length", random_param(LINE_CONFIGURATIONS[line_type_obj]["length"])) + line.Length = _get_param(params, "length", _random_param(LINE_CONFIGURATIONS[line_type_obj]["length"])) line.Bus1 = src line.Bus2 = dst line.Units = LineUnits.km @@ -49,10 +49,10 @@ def make_line(src, dst, line_type, count, params = {}, transformer = True): transformer: Transformer = altdss.Transformer.new('transformer' + str(count)) transformer.Phases = defaults.PHASES transformer.Windings = defaults.NUM_WINDINGS - transformer.XHL = get_param(params, "XHL", defaults.XHL) + transformer.XHL = _get_param(params, "XHL", defaults.XHL) transformer.Buses = [src, dst] - transformer.Conns = get_param(params, "Conns", [defaults.PRIMARY_CONN, defaults.SECONDARY_CONN]) + transformer.Conns = _get_param(params, "Conns", [defaults.PRIMARY_CONN, defaults.SECONDARY_CONN]) - transformer.kVs = [get_kv(src), get_kv(dst)] + transformer.kVs = [_get_kv(src), _get_kv(dst)] transformer.end_edit() diff --git a/pygridsim/parameters.py b/pygridsim/parameters.py index 0f8dcc8..6521d3d 100644 --- a/pygridsim/parameters.py +++ b/pygridsim/parameters.py @@ -8,17 +8,18 @@ import pygridsim.defaults as defaults import random -def get_enum_obj(enum_class, enum_val): +def _get_enum_obj(enum_class, enum_val): enum_obj = None + enum_val_lower = enum_val.lower().replace(" ", "") for enum_type in enum_class: - if (enum_type.value == enum_val.lower().replace(" ", "")): + if (enum_type.value == enum_val_lower): enum_obj = enum_type if not enum_obj: raise KeyError("invalid enum input") + return enum_obj - -def random_param(range): +def _random_param(range): """ Given the range of a normal parameter (i.e. normal load for a house), uniformly select value. In case the value is not a range and just a value, just return that value @@ -30,10 +31,11 @@ def random_param(range): """ if type(range) is not list: return range + [max, min] = range return random.random() * (max - min) + min -def get_param(params, name, default): +def _get_param(params, name, default): """ Get param or use default """ @@ -42,7 +44,7 @@ def get_param(params, name, default): else: return default -def check_valid_params(params, valid_params): +def _check_valid_params(params, valid_params): # Invalid parameter handling for key in params: if key not in valid_params: @@ -52,7 +54,7 @@ def check_valid_params(params, valid_params): if key in ["kV", "BasekV"] and params[key] < 0: raise ValueError("KV cannot be less than 0") -def make_load_node(load_params, load_type, count): +def _make_load_node(load_params, load_type, count): """ Make a load node with the parmeters given, filling in with defaults for any undefined but required parameter. Parse through the parameters, potentially throwing errors and warnings if @@ -65,20 +67,20 @@ def make_load_node(load_params, load_type, count): Return: load object """ - check_valid_params(load_params, defaults.VALID_LOAD_PARAMS) - load_type_obj = get_enum_obj(LoadType, load_type) + _check_valid_params(load_params, defaults.VALID_LOAD_PARAMS) + load_type_obj = _get_enum_obj(LoadType, load_type) load : Load = altdss.Load.new('load' + str(count)) load.Bus1 = 'load' + str(count) - load.Phases = get_param(load_params, "phases", defaults.PHASES) + load.Phases =_get_param(load_params, "phases", defaults.PHASES) for attr in ["kV", "kW", "kvar"]: load_type_param = LOAD_CONFIGURATIONS[load_type_obj][attr] - setattr(load, attr, get_param(load_params, attr, random_param(load_type_param))) - load.Daily = 'default' + setattr(load, attr, _get_param(load_params, attr, _random_param(load_type_param))) + load.Daily = 'default' return load -def make_source_node(source_params, source_type): +def _make_source_node(source_params, source_type): """ Make a source node with the parmeters given, filling in with defaults for any undefined but required parameter. Parse through the parameters, potentially throwing errors and warnings if @@ -89,22 +91,22 @@ def make_source_node(source_params, source_type): Return: source object """ - check_valid_params(source_params, defaults.VALID_SOURCE_PARAMS) - source_type_obj = get_enum_obj(SourceType, source_type) + _check_valid_params(source_params, defaults.VALID_SOURCE_PARAMS) + source_type_obj = _get_enum_obj(SourceType, source_type) source = altdss.Vsource[0] source.Bus1 = 'source' - source.Phases = get_param(source_params, "phases", defaults.PHASES) + source.Phases = _get_param(source_params, "phases", defaults.PHASES) source_type_param = SOURCE_CONFIGURATIONS[source_type_obj]["kV"] - source.BasekV = get_param(source_params, "kV", random_param(source_type_param)) - source.Frequency = get_param(source_params, "frequency", defaults.FREQUENCY) + source.BasekV = _get_param(source_params, "kV", _random_param(source_type_param)) + source.Frequency = _get_param(source_params, "frequency", defaults.FREQUENCY) - for imp in ["R0", "R1", "X0", "X1"]: - setattr(source, imp, get_param(source_params, imp, defaults.IMPEDANCE)) + for imp in defaults.IMPEDANCE_PARAMS: + setattr(source, imp, _get_param(source_params, imp, defaults.IMPEDANCE)) return source -def make_pv(load_node, params, num_panels, count): +def _make_pv(load_node, params, num_panels, count): """ Make a PV at the load node given, scaling kV by the number of solar panels @@ -114,27 +116,27 @@ def make_pv(load_node, params, num_panels, count): num_panels: representation of how many solar panels this PVsystem includes count: how many pv already made, to not run into duplicates """ - check_valid_params(params, defaults.VALID_PV_PARAMS) + _check_valid_params(params, defaults.VALID_PV_PARAMS) pv : PVSystem = altdss.PVSystem.new('pv' + str(count)) pv.Bus1 = load_node - pv.Phases = get_param(params, "phases", defaults.PHASES) - pv.kV = get_param(params, "kV", random_param(defaults.SOLAR_PANEL_BASE_KV) * num_panels) + pv.Phases = _get_param(params, "phases", defaults.PHASES) + pv.kV = _get_param(params, "kV", _random_param(defaults.SOLAR_PANEL_BASE_KV) * num_panels) -def make_generator(params, gen_type, count): +def _make_generator(params, gen_type, count): """ - Make a PV at the load node given, scaling kV by the number of solar panels + Make a generator in the circuit Args: params: any customized parameters gen_type: type of generator (small, large, industrial) in string count: how many generators already made, to not run into duplicates """ - check_valid_params(params, defaults.VALID_GENERATOR_PARAMS) - gen_type_obj = get_enum_obj(GeneratorType, gen_type) + _check_valid_params(params, defaults.VALID_GENERATOR_PARAMS) + gen_type_obj = _get_enum_obj(GeneratorType, gen_type) generator : Generator = altdss.Generator.new('generator' + str(count)) generator.Bus1 = 'generator' + str(count) - generator.Phases = get_param(params, "phases", defaults.PHASES) + generator.Phases = _get_param(params, "phases", defaults.PHASES) for attr in ["kV", "kW"]: gen_type_param = GENERATOR_CONFIGURATIONS[gen_type_obj][attr] - setattr(generator, attr, get_param(params, attr, random_param(gen_type_param))) \ No newline at end of file + setattr(generator, attr, _get_param(params, attr, _random_param(gen_type_param))) \ No newline at end of file diff --git a/sim.json b/sim.json index aa5fffd..fbc551d 100644 --- a/sim.json +++ b/sim.json @@ -1,10 +1,10 @@ { "Voltages": { - "source": 1735.8007811315708, - "load0": 205.64441923330276 + "source": 1523.4068912046298, + "load0": 187.13882108513008 }, "Losses": { - "Active Power Loss": 198582.96141955358, - "Reactive Power Loss": 412884.39931989944 + "Active Power Loss": 160914.96444476524, + "Reactive Power Loss": 334569.1340276267 } } \ No newline at end of file diff --git a/tests/__pycache__/test_circuit.cpython-312.pyc b/tests/__pycache__/test_circuit.cpython-312.pyc index 330fa5625f8a7598826272a82aa227c9b20dac03..5c07796143f86dff12159333ac9b1d564bf349ad 100644 GIT binary patch delta 59 zcmexf@x6lgG%qg~0}!lU@-}_xM&8+GY*|2Fk>cb;9ofmJ%^F!MuJUS34loyE*SyZF NagkSJbFMiTD*$iM6J-DZ delta 59 zcmexf@x6lgG%qg~0}v!`zni{%Bkyc8w#h(Vk>cb;9ofmJ%^F#%uJUS44loyE*S^lH Nb&*$VbFMiTD*$P?6H@>H diff --git a/tests/test_circuit.py b/tests/test_circuit.py index a2de2ef..5d4a381 100644 --- a/tests/test_circuit.py +++ b/tests/test_circuit.py @@ -240,7 +240,7 @@ def test_103_invalid_nodes_in_line(self): circuit = PyGridSim() circuit.add_load_nodes() circuit.update_source() - with self.assertRaises(ValueError): + with self.assertRaises(KeyError): # only has source, load0 for now but tries to add another one circuit.add_lines([("source", "load5")]) From 3d54b0ea360620f60e9c50b6ee6e9ec78f65a8fb Mon Sep 17 00:00:00 2001 From: Angela Zhao Date: Wed, 2 Apr 2025 17:30:04 -0400 Subject: [PATCH 17/21] remove cache files and add gitignore --- .gitignore | 1 + tests/__pycache__/test_circuit.cpython-310.pyc | Bin 8749 -> 0 bytes tests/__pycache__/test_circuit.cpython-312.pyc | Bin 15479 -> 0 bytes .../__pycache__/test_pygridsim.cpython-312.pyc | Bin 1912 -> 0 bytes 4 files changed, 1 insertion(+) create mode 100644 .gitignore delete mode 100644 tests/__pycache__/test_circuit.cpython-310.pyc delete mode 100644 tests/__pycache__/test_circuit.cpython-312.pyc delete mode 100644 tests/__pycache__/test_pygridsim.cpython-312.pyc diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ba0430d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +__pycache__/ \ No newline at end of file diff --git a/tests/__pycache__/test_circuit.cpython-310.pyc b/tests/__pycache__/test_circuit.cpython-310.pyc deleted file mode 100644 index ac09fcef7e4350a615473d14375e7151c6d98091..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8749 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 VLEl^}x?wuTqOJXS@v)_g{{`3Pv)KRu diff --git a/tests/__pycache__/test_circuit.cpython-312.pyc b/tests/__pycache__/test_circuit.cpython-312.pyc deleted file mode 100644 index 5c07796143f86dff12159333ac9b1d564bf349ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15479 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 QT)!i~e#fsExS((OzZj1tr~m)} diff --git a/tests/__pycache__/test_pygridsim.cpython-312.pyc b/tests/__pycache__/test_pygridsim.cpython-312.pyc deleted file mode 100644 index 81a7d5c7d941576463bf6d08be562433a8cc46d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1912 zcmah}O>7%Q6rNps*JCG+)3p4gA!ccXRP*B)A$q7FRh6VaQsh>|3DQbvyY+0Gb@#{2 ztSPoY>LCY;kcz}1963^@7bFB14ji~3kg%nol#wcs$|bj|p%+fPnf1m=05OL*Z@%~D z%{On}n;-M}9D>n)`|Cy~jnD(JNQO30c3YrqAcBbEAzv{SMd+%h`YAKzr_HplnVQ5> zp6=_WF7-6%88f4xtnk)6Y+@B%Ktx|hB;(-bL~_h<-b}^1nd@jJydxGRg=epHE>M>& zxqd0d@uC|zwNA_7xuvj8>#>d(Lz@T`+;!WF2xFk-=E5Lw>X91;)%x%hgp|Qz_XH># z$U&w;kf{>IOc8Y*nQ4*&sgX2D9jNGhq~@?_&ZYIX8+D6f!Hm_A8dqDL25@7pf7NK& z_3L)SDc6(m$&un#yO3Nss-u+D?(~uq8SR!4K^SAzeJ^TLhrMLDtA-tP%GEpQj>6N- z@m86LWc>BU%rbK*o3Vq2uui&A~v&^oEZ_0Nonn|Dz`dZV@|Z(>K@s5 zg|dW>3SQ!oZ=&Dv=q@Pef4Lhq$EF4eZv_8EpN>Ktng7u~vGK*VZ=2h*wf=0ahm9?~EDgmzE`I*XSNNN;FUNYgxP{M3c(RWtdsF3J zWv+L8{`>ra9c;ercXUet6KgM2C<8=R+J}8x6%k78-927kUDW? z6o#M!)fT_6tPUy)fM$e{Z;IQ28;Rs|EDCzghUb(l4l?8T_4sD9^fc@ht-vZE9;OsU sd8{Ml`QOl)K00$BP2NY-4+Zc575>Z}Rf?aS+MYPspE&s#!9r618xd2ywEzGB From 141e512d0031e02e41c9d0b828d2bb17cb1ccad2 Mon Sep 17 00:00:00 2001 From: Angela Zhao Date: Wed, 2 Apr 2025 17:30:34 -0400 Subject: [PATCH 18/21] remove other pycache files --- pygridsim/__pycache__/__init__.cpython-310.pyc | Bin 341 -> 0 bytes pygridsim/__pycache__/__init__.cpython-312.pyc | Bin 363 -> 0 bytes pygridsim/__pycache__/configs.cpython-312.pyc | Bin 2437 -> 0 bytes pygridsim/__pycache__/core.cpython-310.pyc | Bin 6561 -> 0 bytes pygridsim/__pycache__/core.cpython-312.pyc | Bin 8467 -> 0 bytes pygridsim/__pycache__/defaults.cpython-310.pyc | Bin 1614 -> 0 bytes pygridsim/__pycache__/defaults.cpython-312.pyc | Bin 1923 -> 0 bytes pygridsim/__pycache__/enums.cpython-312.pyc | Bin 1236 -> 0 bytes pygridsim/__pycache__/lines.cpython-310.pyc | Bin 834 -> 0 bytes pygridsim/__pycache__/lines.cpython-312.pyc | Bin 3285 -> 0 bytes pygridsim/__pycache__/parameters.cpython-310.pyc | Bin 2856 -> 0 bytes pygridsim/__pycache__/parameters.cpython-312.pyc | Bin 7370 -> 0 bytes pygridsim/__pycache__/queries.cpython-310.pyc | Bin 916 -> 0 bytes pygridsim/__pycache__/queries.cpython-312.pyc | Bin 1279 -> 0 bytes pygridsim/__pycache__/results.cpython-312.pyc | Bin 1673 -> 0 bytes .../__pycache__/transformers.cpython-312.pyc | Bin 1790 -> 0 bytes 16 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 pygridsim/__pycache__/__init__.cpython-310.pyc delete mode 100644 pygridsim/__pycache__/__init__.cpython-312.pyc delete mode 100644 pygridsim/__pycache__/configs.cpython-312.pyc delete mode 100644 pygridsim/__pycache__/core.cpython-310.pyc delete mode 100644 pygridsim/__pycache__/core.cpython-312.pyc delete mode 100644 pygridsim/__pycache__/defaults.cpython-310.pyc delete mode 100644 pygridsim/__pycache__/defaults.cpython-312.pyc delete mode 100644 pygridsim/__pycache__/enums.cpython-312.pyc delete mode 100644 pygridsim/__pycache__/lines.cpython-310.pyc delete mode 100644 pygridsim/__pycache__/lines.cpython-312.pyc delete mode 100644 pygridsim/__pycache__/parameters.cpython-310.pyc delete mode 100644 pygridsim/__pycache__/parameters.cpython-312.pyc delete mode 100644 pygridsim/__pycache__/queries.cpython-310.pyc delete mode 100644 pygridsim/__pycache__/queries.cpython-312.pyc delete mode 100644 pygridsim/__pycache__/results.cpython-312.pyc delete mode 100644 pygridsim/__pycache__/transformers.cpython-312.pyc diff --git a/pygridsim/__pycache__/__init__.cpython-310.pyc b/pygridsim/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 35e5ac05012dcc9de4aae124b2136b606b3648a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 341 zcmYjNu};G<5Vg~!p{-gmF?-EG5@rx85)vCiDlA@3R%}uWJC2;BQu0Uq0AGTHl$D8J zVB*rD;!b`~&$_#Jwp*{41mpAKtNcLzp2YtMP;Buu3_%i3B;`~FJdiU!lc9`EXd@m` zBIi4j!~=VF^`%hO6buAH0@3ZPQ_OSCz^L#`nSv8(|0Jt<`O+WH-cl zdX?sB{)28Lq2uDz_?XPc7(luLU|a%-uH8Eiz!w0@3T^Ou1#nQl(XK+VsrwQ=8}uxk zSAKfQJMl5n5q__;mjttutEya1w N^oL=9Nke)b`~ml!U{e49 diff --git a/pygridsim/__pycache__/__init__.cpython-312.pyc b/pygridsim/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 975285af52b3f1272bb36983724b0dcb24b43985..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 363 zcmX|7Jxjzu5Z%4phnM^K0ml{T&S__b)815BwcA z{(&QvAP5$Ma-EeE(G1MIH!$cKVkIIcVZj{>g>$Qob6K1l$*-hx%fV?JiikP>lIe2H zREc<^WabK|V^eRS$sc0HCq~Se`AlLEZ-tipdD+0AM9d zDs_y_I4MH3P0=>cMi>hfH)K}}e;;}`DGqw<_nP_$?@R}|5^@0SYK*LeYqj`m4?z+8>-~i<({vvH8hD?Qdh_2 zq?Xo=5TS!=6g??a7m3idl_v_!UPdN`e1ZraRFmjQp}InZ&YS%nGAZQOiO@myHhNO1 zZW5t$XLpoF%u>54tdX`=SoI+>x{d_-9VAkb-z7#T@^_I)MgC)AbRz!=5~;|4N{mkA zKSLrF`Fq6ZME*V!smMPdM%R%#T4UXkyL(t6ZTsMi4v5jgHRSF?BvO$-Bt|FlUm}r; zyg`f(_M|jEu$1mGR!Ct-Wg>J?t)M4uYfogDQlknw$bXHV6sip(bl#LVzoXw^iWH`N zON7py0(W)yN>2O#af@k{2aI8>UAa29z;y2hn(piM1vsiuZj_MkbONM>d?u#&f^Aq)mbl z9IJ6hjf=#lqi>RNqbVnnf@t!sqVY&v{*%Qf+sqdptILkMd>vT$>1?cTJNouSk#A}4 z4xyEF)TGzia`Y`|tzv7%QCGayj-&5DYwiEFRvmTK8+gaj@4&!yZSsEX7VLCsvLnu6 z(NPz#1CgIo<7nE6rXdm+*MuW_+g3Pua|B7|i_RSIhNEwY19r`Gp91F^_>T#3Anx-_ YIeJRWa1G3WbBTpkWQQf}&*6Re7fp`^WdHyG diff --git a/pygridsim/__pycache__/core.cpython-310.pyc b/pygridsim/__pycache__/core.cpython-310.pyc deleted file mode 100644 index 7f507a1c0370d97d389e254f24269625746951a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6561 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 diff --git a/pygridsim/__pycache__/core.cpython-312.pyc b/pygridsim/__pycache__/core.cpython-312.pyc deleted file mode 100644 index 43bee90ecb42d0cbd45e54a0f8622a0393cf5d65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8467 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 PPku$uJ@lDIsT$<3u*?aS diff --git a/pygridsim/__pycache__/defaults.cpython-310.pyc b/pygridsim/__pycache__/defaults.cpython-310.pyc deleted file mode 100644 index 2dfa6f4c841802da2f8e7eb72d19563dcc5ce2c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1614 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 diff --git a/pygridsim/__pycache__/parameters.cpython-310.pyc b/pygridsim/__pycache__/parameters.cpython-310.pyc deleted file mode 100644 index aa824475ad3dd9050095bbafd58e3be5585d7660..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2856 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 InQkV30eXA;$N&HU diff --git a/pygridsim/__pycache__/queries.cpython-312.pyc b/pygridsim/__pycache__/queries.cpython-312.pyc deleted file mode 100644 index 95f570784039f81ea9904366ebcaec9d271123cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1279 zcmZ8g&ube;6rRz_maIy_t?W=67X~*dR^oc^ZrqX}NJAPstrHVW5;4|{q-j<=>ddTC z85w%$p@$w)dT?%q_R`=&&xJz&fL@#$TC;H=&|Z3TF@ca%-i%hZ;|DwY=FR)@&HLW` zQ7GgP$PX{RZ=f_n|JcnyQi*af3Cbp7XcaNcQUPw^Rg4kyzCx?1Zn`|Q9_1>$E<&z} zX>y{uA+kn$5@-XPLvLgKoO}iyI4N6+;h5L(Ngsp;URz1eD(FrTq1&+ANNsp#WDwEwwvxI% z+)G^m^EcyZ)WgdbU&`Sd$LLrs$Ic+S{~y#^1_oTj*fIb7>%Mk(w>|yoB$0XWTHk5C&Cb+VcVgBU^$oNqH5@Qr`end+w+h% z5ZVobGua7vjnG3P4?}M(RhH(741+GY6zP>~v@uIQmRfT?OKwO*gX=I)fJGA>wcAn| z&Spu-VZ@9iEqad=TB~ub#ah70{idij2WSXYFqVTLSMXDJ*(2PaoVc+YWTQmbAk$a+ z*PSM!eylryBb4Su+BlOykB9rv5XJT(%w3VH_I13Srw8gcuLmLm(14)gt zL#8sYl+*E$qaz+!i*&Wqq75Bqtr|j5Uvow~yq1BN75}D&_v6#B!2`P9q|&d*TGZm9 z(LST%J#C_T-M`+wtOQ#YEx+AufTlr9*qdv2<5R9^Rm&i<&rQ7v=`9{DVfhm6kD)h4 zpB7H6~{w+r8WxSgMVQkd8)PW)Xw^SF3sr&!v~mv#%M zc8gO7P!cVcy*N{?GFhuuUFRI6M@YQ|hiVj-ID4TbSrqUO)HrPIOVeYp?0XpF|5F}L QKhGjOd5}Jh-*Hi|08@BQ2LJ#7 diff --git a/pygridsim/__pycache__/results.cpython-312.pyc b/pygridsim/__pycache__/results.cpython-312.pyc deleted file mode 100644 index 76d236d485d9a27f0d441ae0acea9ecf1021e069..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1673 zcmZux&2Jk;6rb5$f7XryCZw)XWt9{s4p9sTC=DS}A!><=)3kv|jiA=nJ9aj#cg@VM z6I+hd0|!?sYHkT|;J~F-D)o$n#2^2RZ)y%y4y*KZ@ zo%iu$JRU_b_D=p*{7FOT4{_)WrA-_R1F?=ww17-(DmE_R1&jr)+RB1rYM-M8)eOL@ zRn>H`=0~SU!Ey-Gy+xuk;^}TdH*DKoCZ_(GPpAc~VQY+x={F2UF3szPr;`eyRo!t- zlGY8!jFzceu}lzLBzBolrWag#sL!=4Btr@FZ4Xf2$$OUTj71*_Z_}6u4cjvro5|z0 z`(g{gRAC;>0=kasXa$@2Q}{1>2_p-wV(*ExC*ObORi+}#c=%nP%@`$69Rg}T zYZQ5)V7rD#MN)B%62s=2RWgb+1VB2-1M)q1ZK{WAOY zxJPU1{6 zab`P_+KQ!G@vc^)?*P0*`A$<42k{;v4hI!j*3r`*P>1f&sogiAW{*_Eb9zD@)fH2@ zuWkxmFrYQcucHB@DjGzuBZik1jIIG+AS>!Mw2af*49CllgjUhJpe`T+X_aeknK)cq zVlJ$vUn&C@YR7`vrXWNm2U+}$g`gfsuDD4M*}f2;p76Y=~anNc4E-U_7yJe13sZa$Zj zX-iK7Q$}6tzK3Y90HpEoM9DRMn@rMI029rP^}({QVvPS%RIL3IM)=f2bmDIY-?f(D|^Px8Y diff --git a/pygridsim/__pycache__/transformers.cpython-312.pyc b/pygridsim/__pycache__/transformers.cpython-312.pyc deleted file mode 100644 index f41f426473f366490ff88e5589014a74ced3a1ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1790 zcmZ8h%WoS+7@zg79VclEg4S^ws3$-|U1-uMZB?ZeD33OYoH`+CQ}D&w?2esv_7TmD z6kFVEhFuGzwf!Vk&QACd`I;s_j00eFB+WGXgtPzfm#CjcuY#YvPB0k7Jsqm{G(Yj)B} zl~PVusSEhzeN;*})O_ks88EMilx}mAv3x@G-lDq8DjszR6+P3Q>k@-oo?8T6ca`w+ zrcQN790M!UbK0B%d3II`kP6@7zlzL}cNDcS`;G*mS~A8QK~v#fp|qLUgD7&{g)hXP zX*?YWVXFn*3b{6IYGs*4uws@cLRmz?vJ;8F9?F}lnTYwF4CN8slNG`O|IYuLsHs#F zAn9%E5PB)18jF|>Eg~Azo{pp;swQH8?9>tK?U~RrqD|BfObthp5XJo73S|*(DuLfS zkt9Sxby1hJT0Yc7bngf%sG;SP`VNe*2g8~)O|0YC;lgW#ZxP~RMhy&y37d@fv`uN1 zO$10ff_egPtrJSHZMg(9u2atNS?1NLL9pwYB;PTH7%v$Uh-qIO1DA74F+da6oIJ4O9!Fd_Zgq$1_B)V=fYC;GO}zM>@GHm4cP$(=Za;MAUn|;t6HcZ&n<|gyzs1;KSkvM zr}AD4)g@a(Wt@uiQMpW{mgXi`uCD-H*BN2rSn>AF@}2qO%zSZnMWpXou4%bdM&&i6 z@`i}y6qEsmOUv^&Czn4dPcIgW;>5~zpfe#)<;@XYtL@Q>)D* Date: Fri, 4 Apr 2025 17:13:45 -0400 Subject: [PATCH 19/21] remove docstrings of private functions, change results.py functions to be private --- pygridsim/core.py | 6 ++--- pygridsim/lines.py | 13 ----------- pygridsim/parameters.py | 51 ----------------------------------------- pygridsim/results.py | 12 ++-------- sim.json | 8 +++---- tests/test_circuit.py | 2 -- 6 files changed, 9 insertions(+), 83 deletions(-) diff --git a/pygridsim/core.py b/pygridsim/core.py index e6b71fb..ca6a488 100644 --- a/pygridsim/core.py +++ b/pygridsim/core.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from altdss import altdss from pygridsim.parameters import _make_load_node, _make_source_node, _make_generator, _make_pv -from pygridsim.results import query_solution, export_results +from pygridsim.results import _query_solution, _export_results from pygridsim.lines import _make_line """Main module.""" @@ -173,10 +173,10 @@ def results(self, queries: list[str], export_path = ""): """ results = {} for query in queries: - results[query] = query_solution(query) + results[query] = _query_solution(query) if (export_path): - export_results(results, export_path) + _export_results(results, export_path) return results diff --git a/pygridsim/lines.py b/pygridsim/lines.py index d44251e..f7ac3a8 100644 --- a/pygridsim/lines.py +++ b/pygridsim/lines.py @@ -7,9 +7,6 @@ from dss.enums import LineUnits def _get_kv(node_name): - """ - Given a string of a node that exists, fetch its kV or raise error if doesn't exist - """ if node_name == "source" and node_name in altdss.Vsource: return altdss.Vsource[node_name].BasekV elif "load" in node_name and node_name in altdss.Load: @@ -20,16 +17,6 @@ def _get_kv(node_name): raise KeyError("Invalid src or dst name") def _make_line(src, dst, line_type, count, params = {}, transformer = True): - """ - Add a line between src and dst - - Args: - src: where line starts (node) - dst: where line end (node) - params (optional): any non-default parameters to use. Params can also include transformer params like XHL, Conns - Returns: - Line object that was created - """ _check_valid_params(params, defaults.VALID_LINE_TRANSFORMER_PARAMS) line_type_obj = _get_enum_obj(LineType, line_type) line = altdss.Line.new('line' + str(count)) diff --git a/pygridsim/parameters.py b/pygridsim/parameters.py index 6521d3d..0904af3 100644 --- a/pygridsim/parameters.py +++ b/pygridsim/parameters.py @@ -20,15 +20,6 @@ def _get_enum_obj(enum_class, enum_val): return enum_obj def _random_param(range): - """ - Given the range of a normal parameter (i.e. normal load for a house), uniformly select value. - In case the value is not a range and just a value, just return that value - - Args: - [lower_bound, upper_bound]; range of typical value - Return: - Randomly selected value in range - """ if type(range) is not list: return range @@ -36,9 +27,6 @@ def _random_param(range): return random.random() * (max - min) + min def _get_param(params, name, default): - """ - Get param or use default - """ if name in params: return params[name] else: @@ -55,18 +43,6 @@ def _check_valid_params(params, valid_params): raise ValueError("KV cannot be less than 0") def _make_load_node(load_params, load_type, count): - """ - Make a load node with the parmeters given, filling in with defaults for - any undefined but required parameter. Parse through the parameters, potentially throwing errors and warnings if - one of the parameter names is invalid. - - Args: - load_params: any specified parameters to override default ones - load_type: LoadType representing type of load, house, commercial, industrial - count: how many loads have already been made, to not use repeat names - Return: - load object - """ _check_valid_params(load_params, defaults.VALID_LOAD_PARAMS) load_type_obj = _get_enum_obj(LoadType, load_type) @@ -81,16 +57,6 @@ def _make_load_node(load_params, load_type, count): return load def _make_source_node(source_params, source_type): - """ - Make a source node with the parmeters given, filling in with defaults for - any undefined but required parameter. Parse through the parameters, potentially throwing errors and warnings if - one of the parameter names is invalid. Note that this updates the source node if one already exists - - Args: - source_params: any specified parameters to override default ones - Return: - source object - """ _check_valid_params(source_params, defaults.VALID_SOURCE_PARAMS) source_type_obj = _get_enum_obj(SourceType, source_type) @@ -107,15 +73,6 @@ def _make_source_node(source_params, source_type): return source def _make_pv(load_node, params, num_panels, count): - """ - Make a PV at the load node given, scaling kV by the number of solar panels - - Args: - load_node: which load to add PVsystem to - params: any customized parameters - num_panels: representation of how many solar panels this PVsystem includes - count: how many pv already made, to not run into duplicates - """ _check_valid_params(params, defaults.VALID_PV_PARAMS) pv : PVSystem = altdss.PVSystem.new('pv' + str(count)) pv.Bus1 = load_node @@ -123,14 +80,6 @@ def _make_pv(load_node, params, num_panels, count): pv.kV = _get_param(params, "kV", _random_param(defaults.SOLAR_PANEL_BASE_KV) * num_panels) def _make_generator(params, gen_type, count): - """ - Make a generator in the circuit - - Args: - params: any customized parameters - gen_type: type of generator (small, large, industrial) in string - count: how many generators already made, to not run into duplicates - """ _check_valid_params(params, defaults.VALID_GENERATOR_PARAMS) gen_type_obj = _get_enum_obj(GeneratorType, gen_type) diff --git a/pygridsim/results.py b/pygridsim/results.py index 05b1562..e68868a 100644 --- a/pygridsim/results.py +++ b/pygridsim/results.py @@ -5,15 +5,7 @@ from altdss import altdss import json -def query_solution(query): - """ - Given a query, return the query result or indicate it is invalid - - Args: - query: a query for the solve function - Return: - Query result or the string "Invalid" if the query is not supported - """ +def _query_solution(query): match query: case "Voltages": bus_vmags = {} @@ -32,6 +24,6 @@ def query_solution(query): case _: return "Invalid" -def export_results(results, path): +def _export_results(results, path): with open(path, "w") as json_file: json.dump(results, json_file, indent=4) \ No newline at end of file diff --git a/sim.json b/sim.json index fbc551d..d2c2b44 100644 --- a/sim.json +++ b/sim.json @@ -1,10 +1,10 @@ { "Voltages": { - "source": 1523.4068912046298, - "load0": 187.13882108513008 + "source": 1722.6218596951128, + "load0": 222.38058356537 }, "Losses": { - "Active Power Loss": 160914.96444476524, - "Reactive Power Loss": 334569.1340276267 + "Active Power Loss": 201075.15204291482, + "Reactive Power Loss": 418081.9257259038 } } \ No newline at end of file diff --git a/tests/test_circuit.py b/tests/test_circuit.py index 5d4a381..9c697a9 100644 --- a/tests/test_circuit.py +++ b/tests/test_circuit.py @@ -61,8 +61,6 @@ def test_003_one_source_one_load_exhaustive(self): circuit.add_load_nodes(num=1, load_type=load_type.value) circuit.add_lines([("source", "load0")], line_type.value) circuit.solve() - #print("LineType:", line_type, "SourceType", source_type, "LoadType", load_type) - #print(circuit.results(["Voltages", "Losses"])) circuit.clear() From 809aea0d6d898fc5218c3d6511baf7cce1a31487 Mon Sep 17 00:00:00 2001 From: Angela Zhao Date: Sat, 5 Apr 2025 11:49:11 -0400 Subject: [PATCH 20/21] remove misc comments --- pygridsim/results.py | 1 - sim.json | 8 ++++---- tests/test_circuit.py | 2 -- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/pygridsim/results.py b/pygridsim/results.py index e68868a..e9cb3da 100644 --- a/pygridsim/results.py +++ b/pygridsim/results.py @@ -13,7 +13,6 @@ def _query_solution(query): bus_vmags[bus_name] = float(bus_vmag) return bus_vmags case "Losses": - # Parse it to output active power loss, reactive power loss, instead of just complex number. vector_losses = altdss.Losses() losses = {} losses["Active Power Loss"] = vector_losses.real diff --git a/sim.json b/sim.json index d2c2b44..871da14 100644 --- a/sim.json +++ b/sim.json @@ -1,10 +1,10 @@ { "Voltages": { - "source": 1722.6218596951128, - "load0": 222.38058356537 + "source": 1849.5447950048963, + "load0": 137.73342558455806 }, "Losses": { - "Active Power Loss": 201075.15204291482, - "Reactive Power Loss": 418081.9257259038 + "Active Power Loss": 279477.14429364825, + "Reactive Power Loss": 581075.6700056968 } } \ No newline at end of file diff --git a/tests/test_circuit.py b/tests/test_circuit.py index 9c697a9..fa27276 100644 --- a/tests/test_circuit.py +++ b/tests/test_circuit.py @@ -6,8 +6,6 @@ """Tests for `pygridsim` package.""" -# from pygridsim import pygridsim - class TestDefaultRangeCircuit(unittest.TestCase): """ From 3c739fe73200b0dd83547d91bd68183dd6b0cae3 Mon Sep 17 00:00:00 2001 From: Angela Zhao Date: Mon, 7 Apr 2025 13:51:48 -0400 Subject: [PATCH 21/21] remove sim.json --- sim.json | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 sim.json diff --git a/sim.json b/sim.json deleted file mode 100644 index 871da14..0000000 --- a/sim.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "Voltages": { - "source": 1849.5447950048963, - "load0": 137.73342558455806 - }, - "Losses": { - "Active Power Loss": 279477.14429364825, - "Reactive Power Loss": 581075.6700056968 - } -} \ No newline at end of file