From a87577567faa99655f0c0ce80a94422e1b505f6a Mon Sep 17 00:00:00 2001 From: Markus Quaritsch <markus.quaritsch@tugraz.at> Date: Fri, 20 Nov 2020 15:41:56 +0100 Subject: [PATCH] refactor electric motor: move transmission effiency and transmission ratio from power map transformation to explicit calculation step rename B2 ... positions to E2... add more colums to .vmod and .vsum for electric motor component --- .../3-simulation-models/Electric_Motor.md | 23 + .../User Manual/OriginalPictures/EM_Model.png | Bin 0 -> 57506 bytes .../User Manual/pics/EM_Model_scaled.png | Bin 0 -> 69752 bytes VECTO/GUI/ElectricMotorForm.vb | 6 +- .../VectoCommon/Models/PowertrainPosition.cs | 13 +- .../ElectricFullLoadCurveReader.cs | 14 +- .../ComponentData/ElectricMotorMapReader.cs | 14 +- .../EngineeringDataAdapter.cs | 8 +- .../EngineeringModeVectoRunDataFactory.cs | 2 +- .../Simulation/Data/ModalResultField.cs | 54 +- .../Simulation/DataBus/IAxlegearInfo.cs | 7 + .../Models/Simulation/DataBus/IDataBus.cs | 1 + .../Models/Simulation/DataBus/IWheelsInfo.cs | 1 + .../Simulation/Impl/PowertrainBuilder.cs | 14 +- .../Simulation/Impl/VehicleContainer.cs | 4 + .../Data/ElectricMotor/ElectricMotorData.cs | 3 + .../Models/SimulationComponent/IAxlegear.cs | 2 + .../SimulationComponent/Impl/Angledrive.cs | 7 +- .../SimulationComponent/Impl/AxleGear.cs | 5 + .../SimulationComponent/Impl/ElectricMotor.cs | 524 ++++++++---------- .../SimulationComponent/Impl/Gearbox.cs | 2 +- .../Impl/PEVAMTShiftStrategy.cs | 8 +- .../SimulationComponent/Impl/Vehicle.cs | 77 +-- .../VelocitySpeedGearshiftPreprocessor.cs | 4 +- .../Models/SimulationComponent/Impl/Wheels.cs | 15 +- .../Strategies/HybridStrategy.cs | 4 +- .../OutputData/IModalDataContainer.cs | 5 + .../OutputData/ModalDataContainer.cs | 154 ++++- .../OutputData/SummaryDataContainer.cs | 39 +- .../FileIO/JsonReadHybridTest.cs | 20 +- .../BatteryElectric/BatteryElectricTest.cs | 38 +- .../ElectricMotorEfficienyMapTest.cs | 8 +- .../Utils/MockModalDataContainer.cs | 25 + .../Utils/MockVehicleContainer.cs | 3 + 34 files changed, 649 insertions(+), 455 deletions(-) create mode 100644 Documentation/User Manual/OriginalPictures/EM_Model.png create mode 100644 Documentation/User Manual/pics/EM_Model_scaled.png diff --git a/Documentation/User Manual/3-simulation-models/Electric_Motor.md b/Documentation/User Manual/3-simulation-models/Electric_Motor.md index b193137cd5..92ccfc93c2 100644 --- a/Documentation/User Manual/3-simulation-models/Electric_Motor.md +++ b/Documentation/User Manual/3-simulation-models/Electric_Motor.md @@ -14,9 +14,32 @@ The first two curves are read from a single .vemp file (see [Electric Motor Max The convention for all input files is that positive torque values drive the vehicle while negative torque values apply additional drag and generate electric power. +The follwing picture shows the signals used in VECTO and provided in the .vmod file. The VECTO convention is that positive torque adds additional drag to the drivetrain. Thus, if the electric motor propells the vehicle it applies negative torque.  +###Electric Motor Model + +The VECTO component for the electric motor contains the electric motor itself which is connected via a transmission stage to the drivetrain. The ratio and efficiency of the transmission stage can be defined in the vehicle model. + + + +The naming convention for the signals is that 'X' denotes the position of the EM in the powertrain. P_X_... denotes signals related to the drivetrain speed while P_X-em_... denotes signals to the electric motor shaft. + +P_X_in = P_X_out + P_X_mech + +P_X_mech = P_X-em_mech + P_X_transm_loss + +P_X-em_mech = P_X-em_mech_elmap + P_X-em_inertia + +P_X-em_mech_elmap = P_X-em_el + P_X-em_loss + +P_X-em_mech_elmap = n_X-em * T_X-em_map + +P_X-em_el = PowerMap(n_X-em, T_X-em_map) + +P_X_loss = P_X_mech - P_X-em_el + ###Thermal De-Rating diff --git a/Documentation/User Manual/OriginalPictures/EM_Model.png b/Documentation/User Manual/OriginalPictures/EM_Model.png new file mode 100644 index 0000000000000000000000000000000000000000..6cc51b583bcd8f71fbe070a28f8523bc62cfdced GIT binary patch literal 57506 zcmeFZc{r5s|2{k|Dx=b3sf1LP2xTp@7Aj<$p{$AQ`<i8jWJp4VWZ$>JAj{aND9V<7 zFoq=SSi@k(@ViEz&+~o%zRPnw&++{A9LMiIj_Nku_dVDBx~}WBoagxxru{(e81x(z z0)ZU6clVAi1j677f$S$8IRrkbQvZ?y{@LfQtELRWbe^9DKOD4H(o}*#N~4&z%^ASY zj4pQ{xkDhwo9KV`wK(TlLLfh-@7+;?Ju{srG9|$#lc#rcW6xw<?AnZy<ugBbE-9_^ z(-9k0-mRu!^$VoS-NE6Jx7jYShjBa)3|iz9N=th(a7HAu{l<gFr%y7XSr1))o4ikx zrOzt!-QY;b9jgxRH*BJLcXw&>v|C?$bG1xrYS9!}|1`~)b1r{QFZV&RAi4&(UNEND zzsYj|jF5iZ&C(mW^7j;S;rS8QeSgm{eEvVDbW8jnJN*B8J#-0@@Ws+_INWNa%60J_ zpAptcvcJFIYWe5q#Zzfj`h^e8Qxko;=C)?GrVH63z~aAuj7J2#vYXdT7ms^~Bz|yZ zZMJtIf96lvY5oMfSpcy;>1MA9lm(v|C2yy-e#@USo4fGP)PF@q+D;z01_9RKDsca| zp<~h`j}Lr&dr2*!O%yj`V%OdpE7Y+_tkraMbPR_QOQ2$LD*Z7!-Hzb-E%Sq=O|)`P z4>^-DXCcFiAwxg%{PoqT4)ILY2)oKCnPO^2YUZXdd45(EJUlz<1UvZWrp}uhuLVO{ z{r;j{ZI8~Rn_k-s&H;p!5JRJ_!LF{Ks{AV0^iP|uLd71_hH6wa$*&vTG4Qa=D&nk! z&6`J6F6l#6u9>yvVVzp>VqXst{86|~k%rAD(snyZHOq}m#3K+$ng>i0`HgOvz;amq zT!Ewa!tkVsWaTf|^QRk&L`?*uezrR^lzK1vYdCwZvMGG|IEPewWN)_&jk@7Ioe)gu zTA-frYI`r-AsAGq124pISJ-r46!#-Lc#B9wty*56o#>QYzz>#MXyP#@jy8Fp2us#R zm1alK?*@>wr854TCAH<Zf}@JK4l~SW=yM~e<O=ip{Tq&i%Aq#;d@;uE+57(U56qW~ zaXY?#f>1F8!(3m!p3%W79jFVdm6c(}J}1~S>c&_Aj$=~Qk^9zyv){<Gi3q1YmL9=D z(~`%}>zQTxeNgStY}R?c&tT5x^Y?eSO>i4A^r2sqxqN=V?V}-<KObHIo>DQN=L>M} ziu$``=iMpQ4wU2ZSFA8o-`VW^SL*QCsbP10)_Cx~Wflwtl9G~MBWyLA+;;Y6EF;Z2 zvCARHINE=Ik0$a81TUA?PejUUEREJLJY1|HiTI(@<Oqikf{DGS@{$P{yzrgWO@l!{ zgV^`ggXOk*=!@co8IIux4j-@5(Mx3XxC$SiD}~?SJ~Y)3bW5-6I0T{%-E-P+VpG3q zn86Kr3)vr>g10kfVru3DrNyS6ALeq&Y<H?(*Y`s!I<L)idyVLu)OfgFvPeOY9~m(w z2%#FlR>`TUk+HvlNwt?NDn?fF&>V)#ZSxnl9MNhkuULgf3^kQ<c71MaCE(gc=VZ^T zVa1(CZ;3x!{@GVk!?_T(B%2sHCXHK?c~Fz=l3Ic5Uiea!>zI{zVX;$osr*Mrwt8HR zdcv)>uG?g{<oysxjF_@9cxB6Mi010JomipE#p|f_8e?_87u^HeOD3A8yy$Wb_C+7C zb0ZdJ3HlVnhDIeFh8agJ@xA*S*(YC)_@PPpGB=`2e4ov9rITSSzIN|KDo!kKsF!1c zhOg-53{tNqSQZtr91>d7j~ZGaU~APAoz#l1Hb-$gr*h0L){aT9|LV8MVr-UBGO7A8 zZ04x;yxayiG0?kUd$Iaj8hNd*?^LDEiHeUe<*n%}?&O|_xZhKOHzlby-`ZYoa$<4r zN5h@^>Rw^x`uzI!KKOp;jmrw^)!@_k@Kbe&e;67d@4xBdhyDb6o*M*X`0hU4S#dhg z_EEiWMRJK|9M#U8XtwLlfJ*^JjpoyIQ?Sh_fti=wakk$2Guc5oHRjTE%quAp9n1PD zgj&c|f#k@r$a^)$b34S+Sc_V2(Q@1y%zv5~OcLz?j0zDrfe<!@$7ZBtH-#K4o45fz z1%JxH>U5hYqqwjSzksO7d5{_VA;SwIe-QR*7U#z8q^D$V<eMX?v3}alr>1CYbvoDZ z$QQ<qS`0?St5KLC_Q0W|B^Gc_>iYvS@JX~ld54Frj-AO*BSA}w_=Q_mP(5kq(UB+I ztbF!<4a(B~#<wbzj?8Y3A*l-;ToW#-w}@lh+dmK6;+eSBz|y|2$V>OKuT*)Gf_gpL zI+JCI3Dt~7m$DLnUah-T7}Rl?Aq;&V-ZgtA3H}Y8CS~$t(B(;G03|oTEpw`|4Y!sp zTK)Dqbz{l<l7;-%cdZ&7q;1AEt&Qs<minL0=|e;NJ6-*k&mEg(O$#kgi8RVtXAuJ# z5A4+5Vv8v>=DX3GWsuR@qr9e?e9Px!esM9D$HMqS0kp^F$HTF6N_~+RB5}rqqj+Zi zH?^}liG~ic+>MA<*enP6&}gM&qMRnb$)tnCh0dq-Hk0606ss@od4+C)nYGjDUxkZ~ zJ?fX|={;zTo`D6x84Ju-HQ||dEot}4`+i-RA4h-EQF0O>APZuHoUv&qBn$8NA9QQL z78#zkId!cf<eRl88s|uiq-<LmZX=HI%Y(5iB2WGTQ=69cG~wrbir->sE}E?aA8a)w z;6bdgk8@=DdFAKpO8p~7mv8NCPB`^lcE~<~-~R;6e<iL&AWL5eipqzEvldpW-LU;Y zHaZ>g)bNNiSkBPD!Gu>cHh)KmW_RGHkS?n#CGfgohv88>rk@3llcg<O?wNeU{J1gb zv!==;$dBb7!WTTuSbp1yl`c!c)(alP2~PHjs7$q}8XeN+++#4azq$Wz64Qt4bNpgP zrB6_Dtm{P!N6cfFfqNa9xr`e_=Mc+nqd5yIf}HoAJXG$=vMdOZf42O%ETs-w7I*d0 zla?aZkY+SF!rt#B){+!PcZrpMt^7Sv!uB19q^4z#Ak3@-4eg%!{phRPz$5Ewow{Pg zg1wW+M_p-$q7$RV8va_N9f{Jl>JRi+D^biZ;uVjAr0(pVpVa;%q4RL?l2p=NhpF~> zCzyYMev#WHi$llHZWF(x}6@fSKWCTkE!LRN%SvU7!MG>&3*E~&nDxzxMJRSVwI zM&a*zLV@I<MyEH}IOA2%cvC3BRX%^ZFz88z{9Uz$^Nn_c9`FjhiFY!`S#ihVa@b~q zi2uNXh-uwmvi$?rZ$IRzg`5ScPOvjjYxKutc|;9|B&Wfc^$kvjM#qKE^w*w8pX>ib zuS5h+FhsgfwU=7J!~VwEY7nOvET5*ka3r(~Ieiq($6%cFpUZeJ8kar(yx$vB?UFdh zU*L7HTKCP|ZEc3HXyf{sjPUubkdQ-0@LInOCqGj$N3-$iA?wtI&g3k4tZQ`X7D4|m zm7Yl$yL@IK|A{m8{XXJ}H_0bN)M~=FBDobtlkMle8|mp;r1<~2N39Ab32Bpg$`>;S z>gPYU=?Y&&?o!7R&2}mHsWASOl60Su30*jRQni`fp~*i+0&6aYW6y3Zuru$cl$Dl1 zP#me|s}8B6XFN>oA|BJPk4f}aT(;4ASs+LNF1*S;e)8kOwQH=JHd6$_J1Q>*Z$ORX zL`>#7C8a^+fn~c1I4NYdh)37d)UefuGSaJ<KQFxYEG7USs8ltc8LqH5kQU2Pj}vj~ zduPbDd9Ru!*lO+y$D%<M%~&Jl*3h9ZZE>R5boX-4=OTKnB?I4i&!=2758{xlCJ);a z^LQ)Vy1ZEXLa+s;i)G4-9{Vr?7otoJs0F<D;q6fCiiRa3X_itG**I1OG1&Ipws`jd zL)t<d-{1s$_LMe#^+G(ZRlsHl*kVV9^b4!Y<4ueF;6un>{-PM__xr7yZoNNzoj&T| zJi0f5$UIDyN9dk@mu;^JehO?=+4GuR&numX2~d}Qj`t9H9;maIaVj1*tgwsaIO|UI z#8;mLAG@4dV4>f29A;wTNF5&-7)Y>A@o5HezllcAGHjITS;pSMs47eUI{I<<+TPUs zJsk%5&V5xlJeC6(6f%3#6CxlDqkAFxp%|nC-b&zX!>Kqd-I;$G-%x=}zPe8j=k()$ zd(uB1`j1mSsRNLhqkL$ATLG`d?|E;RnPB^h4?`gDe&BwrB9Ety{IwhXX^g7i-P0_! zAL%?hZvj%B)=iT`iq#pX=mwx4r(W;n#Q*JSR$pJ=;NA<qIj`Yx2#i?+_FQ@5<{^lp z?L__g|EG`n$M<B-6R<z%FAWL&oo8p+stQpIdt5o*Sg>Z%?tT;!*wgHHGtlktbkVQ6 ze1`5012fT_g5G;S|E)6q<G<)<|GMhGKfRlupI^E+Ul(qo&&3Cwg=k+yqtWwMoJ|B+ zQh-Hbq(<BJ#Rv)hM+Hw`Lor7Mh2D|IBd8q;@+-35A~#i!?o@4&s~Q%Ky>7JthvHZl zcR;}4ACtNlW$0s24C;Qc527u$>1#X=vZfy?1Hg*C_nZFleqaF!oZZ$neHM#+?Gp(u z9)2czSQ|t4uDmbITA7M7qe}Viu3|WcdLv$iPM-m#OT>m7SR`Psz=N~vmSresm{Yf6 zIL?;MrnHTKg5!epcEgc0<Ljko_w4Y0Z<K$S>Yw(Zf4^euXuaQpZoWijMQZ;!`i1X; z{^u34_n`l>g#J0p7w8-EO1<y;$A3-2UI?Mz_b-SbskvE|9upvn?@s*37Wua|FBHi6 zkv|j}VTbh~U-!~`aOF>dv_cF<3gq0S>R_X{SGi8KCrH|lNJ1?@ftpWfpR8=84cIo= zQY$JdtiHYBA;(-`7ZCaP2Acl#{J_*Y-pqU2aJb$N`>58d=&S;=?wFzX{NOn9ote0G zr^h9W9L+?l<D4?TJHIB%dOO+S01RZOwR*3Gmqm^_tz^$s_cb*mOu%>^JA9qZPzg^E zesSoSn}VbjmAqgDa_UD11}e2HmcG5cwD53z{vEIS{EbM%^8ydwgK9SMthm*ntNc0% z|AULUJHPXQKnhwl=kXy(%n^j7#xs(jS(CLqaQzN7(_+$sTzd<((!VZF=mfkCqVuxG zyy=kaaoc1eOjX9CNm5U?`ofJ=*re>^PZ00U51<g~#RUX-FJ6Wp6w-d*UtmChoKf^i z-`n(olT=ak*d@q?dQe~2J+d*%+o^&&Gz}a9@zFIi+Jhkf2|l9{$P~l>*Iw_L_w_BE zguHol<~{nNL4P&Mg}Q(xurYpgolq@9(tKsvDqOX3###$pkbm9s!Dn@92-@z^mZy_B zFM~=7lNkwJX715wjIU*qECqSQ>}E;@sxMQG*}a9+yUM+pUQ_0C)y+kdjAU${lvU|7 zZN<!Ta8Niu<M@jomR|IXAMLGZ*o{Z#9(iE{sotw21AP{&r$+=*1OwPajBWVE9@RZ7 zt(Cy>X(s$uZN6$$dDUJedPi|BHZ#F8rz@apKjZ}bC1b}g5V3AbrYAHAm%2^f=Xf($ z{|G7>{|J`j>~Q{u%cqFfwl+2;OTCnOrKQ<%3MKhT`-kf{10FM_G1C3e-65=Vs)_bc zpPy(F%4nK~zoA0ggr59O1`|4jS9GqK<&(C%7a%d_)+W4|bbVvguNVXX?eo5(f6{Z- zz*I*-FZmbOu6D|HfV!P{(}KE+ej<IPJU}l;qtt?-8hvWOuZ}rGWn6@{T5<935-T>X zpATx4GH*NxYXAAZ427d463IxTQ1|5k6y4m<?U$kOnufog*;pK9hm-gWtot>~?xEJW zW%_McJ$`HBN&VrFG1Ys+mR37*hMyNOCbjKB3{3M&EQCr&douM)6SKm+D&*t8YI8~x z%pAk~@M&+3rc;bUO){uwYTcXl392~sIT|I8&wn2z?ZX;RrhM001C_W`qhpSWPV%`& zlWLvoFK~3>U~O<NHmMzmfLPw92g#ojQc}YVvnBzwbtlVqfc(s<Ze`nDRM2@X=mYcQ zfcnkYX2e}aAXp&UrZ5#Wn=-Qda#BK88y0#3{yvgRZa7(}Fj>|+2V`HlsmS4ocej@& zX3;O!8%$m^jt9Dd?|{8=IkYsR3nH~OV?Tc@%AxZ|`vmZ(BK2#!(t?F0(ipT8jfC@^ zwpC{7#;ZwotMkm(x8k&X?FR~N$)j1NJ0(#K0nJ5m7`Zz!mD!%_qw~eZ*%eFu!-r`n zi)hT)^fveLjZ2F=`xSY+f{oEt>*1r(jrVH$NboV(mG@Q1l{p2YmuzZ~Q#mIUzjg&| z8Pj*SG{y+qX(EJ^-$vyQIXVt~{7Sn#`e(9DkA&Q8si|d&ZB<~`zQKujt)O6GZ>QuM zasH;*`lhw7;{f%AnHK&^7W3{kCs!ljz4F^W)`$MS{mgi7Zf@T1tpc~nTG@-k%)=Ws z8l(tL*#Sqnl*PEw@Cgiw-O-F19Z9~_D{r$x<$wlY7D8KOYrdFpLu3*HBJ7y!kB1g} zcdINN^Ns2uA+8G>mJ3uc1901sEFZs6&ug~5U>gRFGO8Rq*|=c<sRqs>PaEw5jdQWm zL&#Z!ePBfzC|Z2CZ9cU!k~jC=;Fb>J=!JVJzH?Wk#jJjQdJgh%ajW*b>omRfBEh?e zbv-o=D=CkeuD;7+HHi9D#HL!FoG4`o;15<p!Qw@^I{~wTZtDpOmfzm=89eo*d6EX= z!E0C6Gtj)sX+p(yVvZ`9$k?&NoVRh@=rc_GkxcxPVLi0|mE*<SI}K?hH6s&HK6aCw zEG+bDd2tSdC7&PkW#b%Qsl-;It61wrek4d13{kU2ji4(V9DxV7mKlyHqPhZna9_go zkLOczPQWTo>yz__r5<d4{}UQ;t43X@DKtPJchT><V8?xw0-r!qq<k~%mse8BMLr@a z(iEq#ZE?NAG`*qXq+z|U=Nx%E10kTluJ_Eid<G%rOBlEJsxmFtl`<A3`Z;Xw<WafQ zmco#nj^cuK$yGGg`i;38s>Msi)9i3Bl>*16mOBJU;N_KKt%dG{S3OU<Nu^`C%N4bQ zW5#RPY+jHMrj>wH<V}XwyQU!}I708Gptcp);dcc&In5%9F{W{F;;hgeh3(s=0?}2$ zU>i!0`Mc{B0LZ`^Zl>aFB<@VAZ(Sv=FO7|v^jtR9S}N6<+aQS=Oxo8ln)ms2J5K{( zt0XslSqu@*yZA6aZh5LB(dazk4Oyw)J@a&nEzW~m<;P(`93-t|O@_4lpci`uxL3=T z47|GuA0^~Yjk7OA00ENdgl=x%ac&RfpAY^_y8?Lb!1i0mFE{<oBm6m{?_=%y(N^NF zBuS%y3n6Ad0_ccfRo5ENSlJJGQm3TPpYQy{yegKLIerQ?o4>+|0vqcY<I@vS3X7`E z8XvBGj`$UE=6Yj_;My^TBmJSp@<;T$67na5m8WdF&bLbF{4l^#;L`gcEW=;IP7}Wk zKKU@?*M6H>?zid+gBYas0FOu@8z_~gR8bWIGZBQh;!&X<1gH>YZ8jR}E|KXiQuZ91 z6IGPTd#muHZfqj1!Kz`skE7cRqe9&eL6tiUeFTFK9qZ8sFh{4xxS9OyZFw^qX;x0T z7(dA;Q&y!s>JdJwRtG#)jm~N*v+q7gwmNqXg?Sow@bnJt=j?&n5=B+o(7qUM5K@ID zBqXYI%&$PY4hp3(i#XS<sQL+hO=#B`FKpD&oXIJ<xSdddJgNKm+S68+Uaa$2`98;I zBfuHXsjm26aQ*%5q@Umr<^Y6K<#Q2VdCwQaTCW8`!@z=)9_&E3yiJg())MQazAcOX zdD4M8jqo7yjlXaYfV}5aA%VIq53KmGqrL?k6)Z?U<)xFp%naJ5Al8&Ge>tsH_4Ycu z>9ceWR@GBhTpRnG24$4ZQG%!noB0i$@d7K7$erTHsEY{*<M72=tpC=ZzDYwdL_I6y zk5aK@L<GO}xV}rlXr61o0?MOTQyM@`8$|Eah0i3Rh&5As#FZ6c?|wC5JVTouasS~t z4S`JFVG!M^=OK)#+J&?496Q+%x?g~KZ%Of2HcY1*yM5;cj%99|CFGs_-G1)uGOLb{ z6Ux2#h;4*E^$^1WsF1|I2)2mzRhLt7B}66pS$1*Z@h`gU#x6>8Zo-_`<C!5WiH3cf zcq;}h@>E3$YZN*<L-@%3c;-Cbqut`dq0HP)<c1UaV{D{ENr<*njmPXS)#jt;Z*)bx zQb+MMB<o-TIBdmcT;7!_v!ra|!nPNJ*U~dYk+TCu0L*IH9VuqMAPc7T3e=^z>KD`- zGaEhjL_;8_6|>B2aAlx<f-*4{zzfGI&ah`!5&EA};&*v(o4fNMuk4o@Za`4y_j_EX zjibXJ)m^LV$Flinzm<nE5&p!~EHjT*B9G~FZ~Kf(+e0ALy?zn9B@Um17#4ee^^BR% z%9p6C;k&Wc+w0Ko9UBnMy$ChQ0t=aBxPk$X1|Ovw=M344ka;cxuEHQ@RLYUJ@t$jp z1%{j~FLoX-<;Ay1I}ZO=)iig@F^gO)TQ2y5qx2V#91-B&OV_*Jt{n?oCS`UjD8p@k zE5LdWJ52U$Xf62G?ZsllTr(WfDW)E(&TZKv4hrWq36Q_D3MP3Phwrwc^8~#Bgr<_; z7#o@7b1MllRhCLC<j7_}#5nG`53-f6eSJG5ct1g)UIAo!qx6lNS8n3j56^coT<RFw zua7F}_BtgaWv=ywgsBy&oD3FBTYJ8+y|qf@1sV5UI{N*7=S?p+BB4F!!#>Q8;=;H1 zmQ=sRn*gwnPTkG|Uxn0^tP=_R^Am@B8F~7_my9$iBK58Bdn(d@?kUDOHb#bsFVU)N z-~r&01V_~zO*dTrXCI<JIH_hg>eio^M%2senrr4IOS71TP3JK>-Siq@ILN?+HoQBi z>$_HtxITwYzJTKLuy1!<`o28+3bPfDIsoZm;uqIb%ukbwE_qdM%y(0dkOEThT;+#w zULhBFTESBgOe^o>wGN(pU^#W=1F_D>-HrolU%|P%z)_ETHR?Pen7j|-n7i>26slgr zfOm7UU&wX*N>sIHBl1Hy0r038datp4V*IigZkM)16sV_TO%bopN;!Pss90;}aIQKD zi3xFeZ_^<{Jjvz1tR!tmc`VAokYdpiSz*BtYo5C5&uGodY%LVk>M3Wog`P-qk|T=N zE6mZZ$*kmJa@!=*6C3KqeEwK&L{IhY<Tf;nIyL>cEK<`D86Whk%6W9t69GwjaE8me z1_#l$J$LThh``wlM-n6kgI10Gxi9Ysg{7Y~vrDmy?gB2XPn6Zu)3bxpF=wCJz@M=* z*e+FTYcy-0jlO@1rj+DJ9&*909d^0V{isTq)}53e)ULorxosS9M-4^L4G(`}aF;(; z!Ku!Z^?@4q#JG4WKpUlq?(uYV<#)&!``_~2<7HO+EiU~VSCTsVUKp@`mj4tBFvVJ( zXeQCRu87w@J6qELj$-&+bW(qJ4~hwF1qo!@49hplHJFm4TIVgy@?d}`Ed3+jt1u=v z)}NH(`B!MKOfx0gTCT!^s^(|+a^Hsp_@vXBgSowB)>>etb*piEUP@cGv$LDud*t2Y z0QzCQd}V><5HnZO94fJBA<(Lee7eNa2wUVeKWKjF=$W6Lk_>GC4ZX&0;_+6l7;T99 zn4&yZB_DLE(&z*OZnzV81&6$Xw1))z!2>mBv%^;eB*<l$@Buw$Q%5z0@Y)BwKS{2W z#hHXF%jXY3(#ls%kEa=ff|>O)BM*j8JW=fFD^8)T5ddy;=4SrXD{~8P)I#Bqx*z;? zJ(pPxjNewQ;2Qh5X)|i2`!IRK`u%nCS&==6o$p%6Csd-H)rtoXrae*m$5rF1u4LIO zy`HU{xR^Kv<&mB&=A4i9NUJj7`OBj{DpWV+d-Z*BHv!iudl(|Xy9bGs>p=ux?g+%X zyq|lb{;Pc=Bdkdx9IJc~mBqtQJVz*CZ0>>o^rgfP==8fhyjNg>aa34s7q3LUNM#sJ zZSKBo-~H&TqzKHO5n@w7K2)_8Q~u~PnCC$MG*G^3i{%vx1kh2JK=RN34uQ(D`EyGc zI0%3*{ddU2?>pjA1vr==TgRCc=7jmHPSm1D<;UpPgUG1(lIa5fy#$|aP_a85gluKs z)BbRT4u2{3z!00E(13h^>II?mP*_ak?2N@N|0z9C)#UhzxL*Rdk1SI!{#WQ~@6mrz ztbd&TkD$xhSE(oV0Js0|pi5T87V3r7kiwE=XjH?rh*CAFzaY*861YKs*FEE8t?#Uy zp32?z`n0{iJ-vCG3nF-QX&>ZO1anm2NCby;CkzgcpPRGuW^CmI<?n@p4R8%>Mrmoc z2;{*pIf!EE^7zR&wH5aG;ojk4L%&yl)Iibq?QFoe1B#P>|KIn3WhEflK!pH+8Nek2 zpt`IdXV{4NW(leZE5ML?DbPGCUZ0a}brL0dc_h2g9MmyXy;gehThuH%0MV{~#thNE zS~m(=@md_2Rc&4a`D_Gq2_WPymn`<e^$H7GFppEr^5vsShxnleL@i*|!SEAMOza8! z4jdZ%L@z^l{E`PYfAcHMs!kT5-!2{959xXKguvZyVn0W$UVA|Dc(wH_d-wZmPBNn& zaZ<wDc4zjq{&-P=%YQ=J6xHqy`#}Q##4UL8$Kg4UW>*^kh?98TqIqzIUIQ2Fv%D94 z$Qs!CUf8I8GS1AY1vRxB;JGwPJTLD*7&%e+sH~YDMw0EtyyhRecdM`ux!%70;#hFg zW9e;$f;kfuPRyq3!fJmpvOltScBsr+<<=728n%;^!*vET3ct4i{0BaGcFzwOX6Mh! z_(_~7TPj)r(QkSEz}NdZPy_hK`=u!)^AZ`i-*?OCNKxdgLsd{`)*C>1KrnIZNs;qw zAE|clpo=UVomYN+wW5n4>i(rKki~d_Jq-DM%*;m!L1*Ik1rGdcHlweCJj4Cc?Lec; z040jGE3I4WQ3rdV#Jp)F?<V|d=st{K8S7j#LsdrG`l`)^?d{bcwQsM3=#<aFQ_6!m zg^X1;Ffbr!^_0)l>H2!yLJ0oij?;DKDw<Bfi3;f#y2S0bVMdmUnD}ihR;XwHSvm|E zjsz?AYa>ZhY_s?aySR3tW$U%NClBn{tQ7WARY1N};*H%SWbrU1!T{T0^F$PqMyWn| z>g+E;ltCC75Evb#V%(yLBzgP!fx{y=J+k;y{d*$r<9yb7wSZr5_Mg)O5e2gKGoUo3 ze1>6lxtTWA;T>6<3W2n8(l-R}QTHFz0B4EZWSs?Mkh0FRGqh!+&xyFJl(ILC@{{s* zj3+P!j%dl-HNWK6pRbdw1o_%L>zB#B-N=xQ3awQ64s!Rd2KH<=y3d7LGbZ?Q_3Nt| zrxC<DX|{5Ey#hm4X?!*45uI>lrXQ(_eLK5pbz0vzfYO`ll^Om1>Z5n9%Pce43WlJ? zU4ShtR8>|E(8-9%x1UZJ?0)v2tvJUkYSu79hCRYMB`-uP*&=(d|Jh}9r@?Ns<`mUO z?(|aG<7PblXOTCzL!k#|tJp6>7IGCvc2~m2;&G<S=jj_3HBR5q0__Vv-T3zG(*`TP zdXLSsEoEAnGGfH(X}HwJN_9}KBN~grOdn{|2BH(<w+{wpi2jHKJ;ho6?RR@Lrn{l2 zp89@<FsNKb>No;km51o_j49hpwS7{Qmz!djKvEid?{=Q(yzaBEl#AgYDiq<d&SteK z%wj4eJF{}FL}_QQxO48G8Q813??GeWXYy&Uoo>g`>pznonVp8YojZg}GtW>hv{An$ z&&&ZrwR<jy4v{mq>cmE*>>_XpNOD<f{P$>n!cQ+?B`bQu%pWVft%aHTF*KvlD~uia z)j8?K8Ltq4oclVdZbo@07rPu?=(fqcK411@xR-97t*_jF{_S~^<$d{zr5SRb$O<R? zY+Y4(hV=Or#y_H!u<2|P3V$y+(2HNBW5c_A8!Qj4&}R@UU)hOy)wN3vgouP-ctN@v zm(Q1o*VRC(GLjc2#sZ%WNzWeB((K`Fy`Q5I|D@#<dyf3Zh&y@hSGcH@fvHb+{n(B? zX=iQ_6<gkF7;>C5q1C(`<D?h<!?awB^1g;$*aKEF-vl!;le48wq!aoPw(60mD_y#1 z0Kdtt981~XzD($$Cl?$_=yRtfo@VZ3CLzc}UWJF{uJ$+IqeRI8m{_(`;!;}f?w9d! zbrC$H^X=Ugpip|+l2Lr{^;z-e$n__>tz`#8epDMrs;fb*9S*mCjprs=Hr)Ch)ovi~ zhvBr&bUt*X>{wj!a)nc`TwJxz%H{Q&&3=$p9s4mrPT}|~X`e?baz>NexJ{j*YO(3^ z^X+R?y${##8oxhrOp8?}<f}jQ6zhKV8WI(^RPPaw8a}#tZR_Xf7aa}eh0YhLX|SOf zx1i-|XdLSlg%(pqT?{B*^GK$vAxg)r1{w<X;}2IseE^$j*OH>_QgM5k^kveDB2|IJ zoS%-jPO)`0s!0wB3DIXSK~?LHTtAk27`h67Go(Mhf_MEUG3$0^TF3Ei-U)0{<7Z_i zv!fs7g2%(7;}&Fm&9&p}XQC5Jl7oE9^2*KDY#&^~R(&J$X&>D-KYrofsLzDL{A^1n z<&vMFEwUkNR&HTc{DD3P2&;b-KO_doCw|j^8E5}3H?0Rd_?pcS6@U{u5m9Np{0OyQ zBlY>67mpdSr;n*OrDiiJ^B#RYvFImJ9?A6Lwt43%@3Fe&%{v<=;~&Y7{+ML3S>3Vo zMmx9pbuSyYG{}v)MYfgn+|$l_#1dwgd*XdlONU43KySdZaq4!;&IENg$#>sNa?>%t zZ$Rcy?F36`6hoxALms#5F(dowq}yajrN~zHr(V6giIHxM+&=}4+hN)9w!hZs4pXO1 z>MiutQr+qU*@hhoX(4~}{h@Stfj%hWPxEQGWb)Yw&Dti3c+hA|0ZXbY8*=j`LG)Ek zY>~?t@4PTawxFRXG0Q5$S<l)|t=ll3Pm*cL-j4vAd-yxSe6|{9dy4g!*k{<{cCOG6 zsQu;0Fw!*TAhX}MVA02>H`m`F=;`^(>GSj~3AVp+WcvuU!wSm6?KgiN<k_I4@yHxt zx~+{uq{j*w3`^~ArDIVsQoBdO2g)C8c08fAYkB1?++iA4Hg`GeJr+PCnbqp(NxJ0B zTLLgUpN$dS*inuV^sl$!HZ{>=#bsQ8S->|{qu@rHC*(yALsJjC(%g(L-NMMQq02R~ zm#aCg(mkHNEZ~o6U8)EcKP~977FQ56+#4XczS%XoqsNUvXL@ee*tMNd)AEW9q<U7^ z7|m6`!@!8WQZ&!)00^;RM~_PD_Nt)G1e|a*B5jfE<%mn<E~z??RE*8;c7Oz`bUdJZ z`E=PEvYZ|(#;FZgwR!fKXS|id(Wn9pdqb6F28mQP+ba}+;M6mD4~Tk?*XuVZEz04Q zxedbcrX^zaCwz8Rn6O2JR(v=Q<igE9)#v(v1&1AK93g*a5eV@Q(4!GKk;fDgorpEn z-S-;OI(CJZ<d#1jAg@g&Iy<qELvBU~pLWqqy3rkxuo)y7X2qjpemBupS6nAA={t@_ zz*Xz4-kY2VW-WCs5@vOvTre1lFqFu{JNf+yzZMt9WZN|Nll(-ttX<~TmtzIay(?OZ zTOH2GXy{25^90KCO*i}Gokee4nT3`X4E1_WEhA9uYR5q3TB;#IdnRu29<5JL6QRDI zaf!lQB!9*C`X6fMf*ln^l?u6Hm!756fbLU8xx06vS60UXY3J0JRGiT-&&(}<%R<~n zE7jD;6<#H?lVYU_`;_0JHn}tI+E45MQN~d1YrJ-`aDuJj2<gL|80Un>zS_#-<%cZ~ zqbxQ@y2yRcjG~lACeUr$@-6izW~av|*qw~9*)7YJ1Sj`6`U(VMHFGC|B@+v;5#&s) z@E0bg;ag7+?Kt~!e>e`Xp_Gs{=>}(`69(mMhXAfIZ%q_1{jl<d=*`U~B>ElpNNC)( z-Q#u4^{tW1?cbH5B^7e(oaE=&k4GojXFtAmXuMA_Zwjf_F%KSl-vBZw;t|u((5eKD z`_UG&j8pkH%S2Ygt(I2($BY@G>EcUTRC*~U^OUFDTh@oZ@-LbEUgcdj!WQuQ{~{^e zuF>ucc$Kkxa5!a`nS{+IY?N!ENBS$9XuZDX_i)PhY5Wf1RqR=B8Z~z_PSP$5COe4Q zoFWSk<O)M?tOuo0(bU|QPlt&$#<3-{0umch;Z9mV_U(QMZPCM?^iJ}4&Du_7w>MEc zR_Te*Y@RYJ>5;>j$0J9Wx`9yljZBE|$abaY+=ghc0bOAWi0T*Du$~_oUg-=qYHY1U z1<b3i$Z0jr8JkIXk%|C|OG{oXivldvu-=MKkaP6~IzT9Q4Aoy2@4Fh3?mB{C4j=kO znN;1H5QvY|d8m@)SUV?M*ihA~>aUtfU}V~GV;xPcst#_nAijTdgM}-+<gi!*eWRYx zNHq+e#G7sZVqbWQWIS-!th!+L8B}+j+X_@2UaImPH}bU3H}cm9RV|~kF__Ms&_p@E zN|W-2l)jXp{wn@t=G8TBI3e6g9m{<v3Z#^pf+KwtO7#GfI)T@O)lq6Z;N1=LXLAZ+ zb3<jh^rV4B)L)5-<9TRft1aSPCi?+Yf=pyhfbUV{W)pXf<b#HXs`>lz3L-L2zOLQj zuLIgMTlD0fC=X*IOKrH<9?r;6>_RZb5DH!FqYzhRH>wexFsmYXbZ)(B%aH`bW=}W5 z4NRWm=^7G9OsMxL?Nc3@QacraJ>uHSDCFSID9B5|zNqN9h6@u)fEKt%amm?**ZQZ) z*biLw6ExpRAK|@fsCQ!|q4GG7V@qf=h%aU9ZH`P&Sy~_08Dk3^ep@S0<7MLr*zwH9 z`{Q)0dY$s!9yTn@vmkM+vrbOxzJ6$XO1$(D=ClS%?mo+?+~&_0wyAZLAM-D6$n9hK z^0ladzoK|JW?3OAI8|ozv6Pe1IFoLb=~^_)n7Wi%<2BtiZdLR0;M6;))XQJjudc{h zdKmYvJ1|D!1QeqhHlO-k?_(+}{?s3yyTAKJyy?&WSB-}|eU)DM8J8hi<7RKN%OCDp zH}59<=+LbY_{U}L3f$_;&!|LPqWfFA9%E{xOtv=lg5cGoZP}igme3QdKZyW)2K4I~ zZP6PfVkKz{5z?b~;eCSCBjSPAcDsBjUYH*z8c$SKlyh=R+&5->TV&>BKRambP4rwe zjvjCT$=DCi%uV^Gq0Pr8k93SXGoDD(+L`#<oFlG<GKO=z>ON5(anOS5+?d_%4Qs>! zO;d0gmpqW>o;`rAY7jJ)=!3f?3D@<~v;#S?rVlg5vent8?UFU>l^S=ijq~fo2b&$f zi%0VKZUe33;$~>NcTx%7sRm*osw)qB|HFSu94M^!Q(JB7wMh(@9z2XV&z>~>C+Re* zewZ7QcaU3_6h()dw67d-HWI~uFKmS91hlkFGEn?vx7jKhjwNDlTs<lZ04#?KdgSzV z|MWyd#hkVijmC-#vbTrTSRr<@=8xkYb;~@ktk7_1rtlTdy1pL07QQ;7OYJaLqrcdk zBgEl!uFB+a@57t#axG$P#R7=@tWzrPH~1vmL{9QxQe5N}+t;#=@b~Kqa^uVTd!rkj z^+;2HxcQTp^;l3Lvq2NfdfBpzRhJyQ3I_I>=A5Vz_PB~5LF$)LqRQjp)(=sFJJAC5 z0$Bx($D(kimVNR(odv}WbE?9A9doF!xNoW(T2u`CkqX1E`LLapUf*%oJ)M^1x)0;5 zE1rfAPvVnYb*i3ZleT-ea5J}Un<)!jEn5Bi-QfG90LT}qU2O5nhbfr3RRf8J;?|`) z$J&yM`i{^w@46t_3icxhZqYipEARImoS{_jkntH^x&h8qXB{CN<Frca7i%U;h;#Wh zq4vOSUkXP+^Xs!-=lPS`HK>`!N>rdiJ&O|Qm1?|LT2=Uc%oNj~)q3mJ<e3^dB1TNK z<3JX~fbhrM*`pR}yDnZ-JTV(p)R2s6^XE8ZBB~e3#*e?(5pxMe%_hL^l9s|1B5O1@ z?kPF1A%k!B1ME*1ua5nKxS+jw>g2DGSWJ8h%XpR{U6YdeY)2vDPFrVLn0`x0YKA4n zgWo~&4aUIk3|F({Y$v=b%Gb@$+>9{Wn@i9W_1BSg`~8wbvLbnz8e@B^e0ejpzg%bB zx7)PL+}Wreq7R2>zXt>y;pkbhFO`PN8%n9~RLnj#U4!p#H95}I@hPu@dHE)B_L0QZ zALOLoQr&_h+`s2GZEAf#^R&}Js=ywVX9Q$|_ULYXA#QA)ZdZoL?(;v%1ZOP<FGB;; ztaE@cR2adPj@#`;WDbQhX}UW`rEU3%IU4P={?IF6(A6O5(uX9;3-B*z@MHyleuAkF zV!cYWxI(uib0zDaxvI?x79s|xxo5?N57#Yp30)0#97XgXaIfPQr-7rwE#$CSfZ4X| z+J+KIC49l3w=x)5aC^=G=VosZc_+9kp6>$`6^rrx{Oz)_bet)V`3%Rg?MB6Gl-Wr3 z%5z=O*NIHG&v4P>dW50qNK1)>yhC5I{d(yVPbPbW2fXSOSFZ+Z@1EtxnM`Hq&K$er zZl6)U{BVxp3-`2#hr-&$Tt*UX{k->iH=oYgGk83nfCvkzrW|CX`)+NSBhIU8LocUt z84K>l#^=pR4MUXzda3s&o8D-N(P*iW#dleW$eQ^}b;1=d+MkM*(ZN|S;<8jZ=R)n` z3%C8;cbY34kK*Fb>yxcAsD%){mQHJCdAznx0`z<1#GkLCNRYtg4QjVs^L1!)xI;~8 zD~+JHfXMY%iglRr4mSiDYa)vY$D-10cFR)}KA4hJ%A^Cv++&5=ud2Z#xZNg>XKKlA z=N_Q^cq1ZEguztqOG!Cmt{!wl&~IbhKF9Hupw2oYY9@?L-%wBj=9xRA0IT7`j7zO? z%bOJJi}fd+KF}SIHSqppD9lHY5|y?K8FprP{mzMizTCgk6>ywp4GXK6Pk*aH6|UwA z0DAoh?aiv0uL4<K%<)|Oj2i|~Ey0YZ=Lg#)t2)<jPUi<1!aH|LPcH;uu!m#N|5q_- zuR!~?9d}@t+kJgnp+CngfkrajKU$-G;XkRRKHd8lI!3FRSfLz9JAXOj6h2NvXic3x z2P_3wUQ)az(~Lha+SqTQ0%*PqlOmA!Pqg+aUtl3`&ftqvIVv>Q^p5Sa?l(yhIZuwr zq?N8Yp7fX(hmTMBZa1xq!AXM8^daX&hPZMC7^=D*e+$M<8{bV8xbjoKYXQ|?2NBDh z+XoS32k?;$v{(VsdJklHLwq0pG~TN)lvPhgOZV!mql=HiZ=4k_X6Bb{>wC|m$Mjr# zaN?4lKoS%8H@jU=g>BdNzGA7YPyJ&X8uc!`_z7-ITt2RpYlG}N5g|R2=jn#%{0bn# zTn<U+-^VX-;cmontv_P+D>|TPw88~R%almj48(Iop5`{)9;wu@^P0_$tI_c__nf3{ zj4i2l<TEG_64pK+=Jv=0nwAbRxG#nNx7U=tZrKfHxwSWP{R`G}Og%+L($Zr2)RZEq zft%dUkl;Jof>3)W3nusUgBdn`ZLDg}bW+fQ#=bIzPTeq?L7?$UsNXCALjl~JRs`VN zE}b=s`_Jt4sW@hn4ia<V$KG)sCnFF^vX4DKC+jzdK${jq9a+y)mi6TvXa>9ex1}&* zQiVO5{CKwgTM2#bOxU;fDvl3T5=owy@e`><7kvPE4{%37W|#xfLY%L0d0xgt#EbQ3 zTMfZHa;owW{EmG+tB`&crdS1!pD4KhG$K<>Zo1F1)_JUfOc{=I!ATs*Qm`^Cu2|p> zy#I-N@h{xdrPGK{jguCUaOU2sr!qofqK>By7M_Ss@PUqQ-!YrD@k3)?7kt$GlVx?v zNeiZ9WM-Cn{f%Rr=VfmCHFx8Ljix%Y*^@0hdnd#I>I`#93A2)W9kLpq;*R`<)ew_o z4|Izr{XRwcT74#3<=QN4+;i>v;!IcvBq^pG0G*S?6{i!w*6-|*3H{@-Rn;2TvWv0Q zPflN6o+L}KLrE;(u6Qu<@9TBEasl=Rtte)a7`%tVz22I)Rv@VggRBSVp4nb>$UjPn zh_v@BZ4T3aJEg0`QQyhwJ@R&4rs(DlvR-3f#r`f~qsqaS3;xD;Sbyx4ZhdA({uFV1 zkX{&M%`nwn$s$u(qY?YjbsuK)jXstW(Rrl{zshUqQ{?GcO-_Wc-v~nsLGq024nt-H z>UJP`cQ_5h3ZxFof6-g6q+`y9AeV2~*u9KI*JOOmSO!9tpS%kIV%%!e4@+z#G2=w{ z3mAY~Nc;z)MFY0l0O4|15DgZs+uq7urT~S*`Cp>|DRBCtu?u-)x&7-XBsLtFh!X{t z^o{&H9!%=2+3DvI=OhLDnGNby<7c@c??TOzgtYc#nRKFK?^2umJUQ2bf&#tMW<Cju z_v>BCG%+B2$#u4xscn3jq^p@*w!XUWrusDO+^zL>TBXxztQDv5T2J_(&g{a5cLMjM ztC0Dur?Aoeigg+KfPd=Zg6YR7&{e~Ve#`VbJZHXG(Vaaw0^8|;{oe6c<f_=Z$Mn-b zxqF;0t9;W_U?94udWF1u@t@?ipSm>$+O6oM)CJrB^qhY@^1nY-{I?_(0{N~)SK#Ra zZK8eLeIS*6%1*!K?%z(Hz0-dx*6D-VJN}FM{LM$_G5LQEHEV6IzwKWd?mdo;eqZ3h zy$%zXa~vECdrauPf2!o^BiTC`RsZKx-G8vCdp7#$y<}Po101;E|Ev!NYU_VXh5zem zU<~Mb9NOd4-khh4{V!x26q|bOP0i)QbVcXh@h_2i@8F=#{|g%_etn2T*5{+qAKU2K z<LtkW;s8%gdr}8fOu#+u(5S>C=?Mwv{=<BMfY6Bo%_a}v0;+NH2+9Z7iDuS1H`jmY zmahbo3ANtECW5g6$LOXEybQ#dk3o9!*ffCV>5a)I)_Nxb(k)?SqJ@y=*%HaQ$iF4& zKBWOzHbAINb*0~4G_I?5pUxrsfp$(Zy_o^1Ge&?q!zKrC2UiWt^M>dg(}tc!rSq5* z9buMy?8pSCMxMXf6Uo{s^62B2$O#8xP5+^`o_arTaf{}ovYpZl0}W!%Uth5<f|h=8 z1pWfU>UwR+-<~2@JM__!AXWCXjg8~|tNjB6r`nFlRn7ELtjl;~IUFZV^oRyZb&pxy zULgAQ7QyYQnVRWBD0;&MNY7Wm;J$sQ(`8M%#o9DiAXyqKlx$48=?+?+h?RmtDzUZb zpL;V25ikH#>Bbh4jc$gkzfi8CkqLTm9EY@%1n61DTIg^bUT<4(Y&C%_0Oi3yR<2?J zU3Q!`aKwAWHB{ER9aM!M<~|q5S0ly5H63zViOSkWjO(B2L}G1LzTn_S%ewkq*2W#T zu|rP)M+VwEhfQ-FL!Ot<50$l$hdCwfV0LmiOyitJ^tZ3Xlps&k0@6sPe@la~l7U~R zrnhBKh2xzR>KYb97p(=H>VYbnH4E=%G%IgACK;bPrX}oKSYF&sWl?LnOA5u~$zpPq z!x$vS;#YAdkOp2+HJdW6_x<<sr6*|?5Z3$86PSfqdz^sSF>*p6@K4dvK7Ip7HYjhM zFnq)m=x4lsN$O-fArOeqzT<)ttLCnJ<LY_)jmCD&i8Y>6xZRE2l;HrajoXM2USox5 zx-|TgxS+3Jl)_FGoj#T0<|lgHNzd{<VSNfw`*L&#=!26I97OI%;X$D7;8)nXN6@-S zM9!@srsA!8<S|f*>>_8Aarw|F6_`lN?H*1&R5u;JE4r-3zqp&AY{pO(pW=tw3BZq9 zjF|p2O-qSv*v)qM6gvj!bH!>j^*eS%pn9(lg06ZLXV5bj7%DbXkQRLHw^WY@49dTC z)76bY!UjFh`d%2YUM5c*icL+X;(+FTBl<l|Zayj&llw_K-2@O+3s2FFYvvh2>Tp)- zg5Zf`OQg+}i86hJDQHm7f9%nfrbH%}YjXRl8><uweA#%OJ%C4$sTrl@uUPC|HSE#> zW1<!jIY@Yzp0!wvzDGkg7hyr`mwVGO=_+^5+bvg)y3khEsOPx!<fNdcnfe&xc&Lk~ z0xOwffnKml1O_it*zhkn!70SKw0tw2M5^?p^A#hK+D9laq7*3frGL3IG$0R>=VDap zp!38$4p6c+>PCj;Had3oN-qvot25byJ)BRtN_JF#=HRg_&KMQ7r!XGq@2^gkq7R3< zI@uOit8REs*2}@p$d&Y!I9lUL8qrETf9qKnSFr|xF{+d-WZ;S|o?wMWnN^v3C}fhd z3Cz2zmC%iwiz~)-DeJWBhMI>)lSR(D$D=&pBz81%tD(+D6Oq3*(lh;$%>#WwJw3ZZ z8^a6`ZRGt~$%f2;xP5`jKqajBpf9}FAhOjPM>PS8YnON8qJ>?WAL*#5tsfbL9|E2D zrgw^&^z;A`6)`Vg?8a%%OGV<oYc}5ZPQ!&lqx$!x;ryun>fz$bWh^%>0oNG{|2j(+ zuNkFtws}?b?rXpUgeq*CI}rAB>cN8w67*p=soyR|4VLD<dZJ@SFkTqLjYYh6l-=|1 zfk2Cp7H?APHPn!f)N$5k&;cTQS9^(y!!JWzP#-}fF&j-O6-lv`zAu7cZKy}6H<7q+ zx_ycGMf6|ousty05Y-PLXE54WMI*}^TDVBfw+J`0;!9i>6;;dQ1%`Z<vQB$d`FoyP z=4bu7JQ$*K(qE}jHE4W2CHb9$KEG)eAU@fs^1K&xqGgPx$q$}FMWdCkvY{U7%ta*@ zsX3^v);k;B-nd7zZOT4F=QPk>`Zz-r8OkLje8+#i-vH38Coid1fxKO7W_kBzaQ~0F z!~)Y#z}b1nebKX-Z!%lgTLj&4v<tkmKRoH*sW=Y4^V|K?;#cb6+7<MEM%(c#pP>AQ zd*xpWy3?xquH<n_J0*cIRN0?;JLITsCCdv#fxLHpT7%gwk3LU;rp9D1v2r&$BU$tI zI?w<(#h5<SIsagjA8ILiHlDc!{#Mqi{S5U6$tPLl!dQv<3)(IpQtXDD2=sY4>l~?J z+HH4l7QWIIR%aRRMmTwS;RGJ)J|heu^BvQFYO`W9E;tMnKC%MHO1`$k!f=HOQw3CI zA1M5YaW-u)pXgo4*FOj4LP+N2i5c)@1gVurHf~WUzGXJu88F4g7mwgW&G0Go7-k0t z^!3?~q8_6@`C@DmQJ6QQd(ji5JhAlV9LR-xAd9;EPS6oik}r>jzF~DCy0&nV#lq|> zv<3Sxiu>{fKInG=Spxo|qNo%q7)Tt-`m4}LGRrM1`@`CEjcjK?LyvprTHkH_YJZuI zZ)azU9O2M!s8y37!5&l1=NMZ?;UV30TmGp;9XX;<_wb`-7$@jFhCl>Ck`eet2UXN4 zsKb!yTj?9kuk`>fIVUs^v<@W`x*)sV0Fqk;>d+5|t~jU0;>ffv<NByLQL{yn>r>;Q z++LY~Jm_5b+fpSjsRWN7ZQ1utJ{O`L5U8S{5zR!YAy*msgU9(Ftd1+tzc0-V#L>G+ z^sd^s*H@>1V3qV|(nGm`Tn+$b?=v(%t<wb=I#iS#jCJwry~Zz3pdIy>)FP{Ne0nB+ z3Yo5NTH51X0ZtEYrvvFkfm#420R_jgW5=9g;`i^AyxPl<v>(w;`pUPM62HT0I7_1G zKnabCBtV~(O(@?0_$gSk{3*{aI)Ans^p@H-Y{)GhvKK3O(q(BhYsed{WOd!|qIXOQ z>I*2~PErSFZl)odcYM$-x~JoPWUPQzHL@Oai?-J5WU28ZMGi>1TVzd^%!yL~uCi}w zIK@eSSM8hhF{s{%j}MNG)S;kpxy5npcJIU);>NRJamH?8$A&?~vTpiONdZvM91!(# z%JfyDx)5C%jzVXS7I-q<+pq^pOsP9C?g1AC7E9kfn)6Tg_tnN0zfXbt@?GHJjYgXH z*~sEZx?=rCR?7o?KLz^D^Oh%ibx!nZ%_8VUT^Q{B0gBPy`K`3l6z_)p8x&G8HW!tF z{8YVm@DP2VEX?#pa0F;VRV-_y4rI7U7A9Q%ec77Md~lpKLgc48jyIz65spmjTkHK* z!<{i#^xEI>+@Al1Euw-&QRx4t1!Rd4R@<8^!sOff#iq$CD+26x#PnCB5?#X<m8fbq z6n5u>z&yNo*hX{$kh$5I;&s+Hq-S#yM*}>GCGeNdmolawZu)l(8qnrSb)!a<|5cr{ z%qB8XAXkZ49>Ivn7m;eG3?=pfX&pV`{NI$&0mhr(+gV&X5+vIq#j8Qam8j{apQkXm z2HygG8<I>g&su2m?L9q?<Zgohd6aj;E%no(C?HP2e=z{Dt+c<H9uDKEz1q+GfLHd+ zd^U{v;;4qrB=jy&*6%1~Dc@#z>FOx#R!=j=GeteBoWSc>-vSNwict|kq?zk0QBlZB zdpu_F`^>gQfoBF!U8ksF`L{ki9$N(nmB@<7>HyR5=5hD^if*$UN5Ss5WrvgPIT5P| zQR&ViGY76AIF!dk@-1t2Wsb{m$$;cPtsMUMceLD<KwW4wG8p$*yUr!QO7CZ(D;iGT z{~RcUv(_RZ{|NgThOzXZeHGX#in(2}>#^T(A@{PmEh_f?5%v$>cu=l(rM`LfKlFcZ ztkGzLmox0i%tBOFOm<@X3CCP#k(ZI{*>R?JEt7Y~WONm?RpffbyJ;IgZU%tbOL6w% zUgz>3jc6q_v`^G7G(%qy>MqAnU9SI4wBm&JIuVFj+djroyEE0m?gD-2(ywx<#S>{0 zI<rN*pds}zy}*Gep3JkZY#b?BS_l1$^uAEYUAkPjHrR}0|KnZpz3&n?VIyRtvM-vy zP?0AQNT2bi)mKpoYsVqOzre}`zZQZEv8Dr>DIky@P|<aXjN>Wqe$oYz!ESHLrww@X z=<T$DjaRIS2X2QR9~#Y1@DSd1QJ?m#My7O@+xE`a0KM|!yBseDu#F!$s#&a)Bb@l1 z>K){aSItN3eDV>IREQ`M0gVE>D8#&Pe5B@G;p-l?<FtPAdb&%c)S(*Tq9p~z0r^ns zFVPLsF@R2|uvbhhleT!XXg$aoH)5*CK(U!~0M{apZTCC~GmPCwKpSxvfz8=u5=b#B zbKXaOaxYw<1WbbRk^Y;6a#C)CCFmMgSq^ycKHr)L={DRo-b*PpMO9Bh5*Pur$&2SY zP#bC_8{%@!ct$Gct!E{!KrD9_&mrqoNbohc^gG&^YE3ZUto3MVHfr$qnfGi`*?82# z7ip$Ot?*r+v%;^2|1aL&GAzoqdmkQkqgxEzgs7Bmix5y!KtgPhE@>6%l9t8*R3x^5 zNOuhaBHfC@2vX9GNXO7a5A$Ewjr;jMzyI+b?}zup%LnDqnYr(|?km<h*Lj}np$jva zwwb&VN)T`SD4y&-AHdD21ruXqj0cqan84WcZ|BLhl-_UeAgTfHjkI`W)d(=(DHhM# z+t!|;Wt4B;^#B&Q#dUvX6W#%!G8Qe=a^<K+fe^JdldHQORHjNjhse{g)AEDZw6?Gx z=xub$eMe`eKv766H;pNAoVDa_$u0r95y(wv2(Xz<-|Yw!bIcSk*L=&X7d`3re!~?a z*iLIvP>%2o5dsSIbsA@VmlcJq`XjqDQ(`uHT9nk)$K2mUK>a46i`=nTX(dxI6!6T$ z9MFzEw)bJ}yi6(J?k}!o3MowTz1`c(X|4L>h?**%v*3`anVE7y9ChPG(3Z(&z;XSz z<HW5&@{jmecT}^y?aCgpROseD6$JYgHTEvnXN4Q|ed<v(YzgCy*9e~}+EdjT2?Wia zm8mLX03}Rs>D|M4i&gs})*OYx%o)dEOPSCcY|8R0HF|n0e}(vgXny>$>iXCh#)}|j zZ(P|J%HVQh?JpeI9HOhR9ebmXN`+PdQ&SBF1eg-Lwb#U5G*^PGx>{~0vc^Nsm^%a@ z*gNDj<u6WRSFK9Oa#sl%$+zg4z8KRwWC!Pi!+TR?zSC{ZOuD05m4=s8J#dVAHelHv z<PFI;0$7(_zgb<e(aBPv5I&0UF6uu^D%1gsD3)|ihvn%mhiNZKbt<#sTZ*cGVYDlM zmvftD{;wg^o{>kkTC$`nzn(0GLQ9?=e>&Ez-_l*N>mwXV9gi_(Ix-W$;hgeK+c?Dr zL-ptvIM_)$GRyH>KcCTbTbGL?*OG^IfS&iV_rLh-<n#oP1o`t-3PFCV|3$9ox1fst zyhHAtjdd?xSCCVsU3(hJ^NGPL+WGxyt$UONHu5*WH~O6)?puC+m;inY0^9ftmOdND z7<_*lCSp69`1bsg^1F1_6feA~N|n{kCnm+$+OqqR2hE>d>`RAL7pqx19{m{NmiQ!p zRwq{b&JVXSGT;Qmu~9q0fnbhQxGnR4Pc%+x+Dso)q+Xz3b(@gUtG!zkMsvUCY5R+O zwr}m>pT4g+6aOI!+4Sw9dN<L1_&GPNCf9m5ZNBoi5&N?(?$^AglFd?LC#Qf26wXFj zC1_k3l@>Q-KLD&%PyZX3)kB~Wbt(Pv)oWzKj`teMb2#;G+MknLl(A@+OfjE3-Q8+Z zC*0q#zeZtm27Tk<pTH;gN91MP&(%){*bVT-OO?k(T5MM5?zfaUS~+q*q*Y6pyh~td zEKE8S)R{*JQP&Nl-n5rQYxW@PrB3r0RU*9m%@c&>4cC8RT8RLe!tGw0j&SD!AE`AU zJ4Y}Hx+Sr$jh*FM%s6_xew{R>3|V@*7wqR}<9T^;xEI(B;DY~&yW#`!m%Jo7m+3^z z_18xRud^@)OHwu$EnA&=%U9#U4#m9lys&9nT-;|r*z#{+&>ODy8?XgJ@bsz`E#@bN zfa5z2A!3X~pWo}Si`Ea?hf=n3!mqwBt1PdQzcha}qQGg;i?LX7{rqFVbPOQ^nE~$A zxUs6Asly*QDXs|`CE1zgEWL_&H}ab<?|r-+gu50;OU-U9+nqe6!BMZR%MKoEx82Ih z6O0x*PMN|!;yCs?Ow=BaaA-4RF4VmU;x_M$YFE(r5hc=BCIC1gHkNA7%9nST1(+B7 z1BJg;R)AYr2rNutLKfi&fMDSg=(tc0ekgSsMo|X58^AWRatAV3&j(dHAAngr>O-{k z95+C_XX>S(rDc{0)@523(%lrT^m$8Z$_<{T%&7;3uSFMv)J3pE*CnIRk+=e4z+h21 z-8feMU~eU7zp;M}H>A=zn2(&l=Sd!#dn3bR9XcA|OqyVPgw#?EY0bvyxSC3J{?kGk zJX=EjmjmQCdGc_^We|;pAw>_T4Z|EqYui-*TSWin)M0D2Cw8|*|Lq8FDT2tVO5ZCE zui0izBHSftg>rlf;n6AXY*{XzE#K(<)_Gn%Ai<Kb=VMWmPgb{w6{J9EZXNDZPH|%m zAQkQd?}gX|gl%eCP_}|p-;^I?j}a((h4;Pcv6-n|)a>7)sQQ6Yo3b?y`E?;n0%;rR z9g+MK*Ig;kp4<^PXEw`n?Q*8>71dk#+jW7<ilH3OwSgiW2F6VrHMhVJ%`TyC$HUAi z5+v!-llhAb#@E-}ZaFd)&6us`+}W`LLh(B~I#C&wEZ}<wes}!@yVv%cd2*C3a-Y21 zLdX29Q&E#kB5Tgvg*K8~?DT|4>d^76PM@XCxeeC-^5t6_+Io6c5{qGtg))nb(!0Qi zC=TrfZA%RG;9O9tMjq#Shp($Im@|uAKdEy0Iprk(dOL%=xKLk*uA-)Qqie0->n^)S z15ge~d>ZLUXitE*2lK*?C`CvBIY^V~<ja(Dm-UgtLpw6Zh3F6YR{k>f`X{A*AJEgk z$!z2H?7|Qkd48ofs#2>czbM@QIDzS?*k9X-^oTbs*ucA!gDJ~@PMp&%z1S9{u3AzT zj!8n;Z=g4-^=u=y`Qii!sYZFYU*8HkQzf?=?^Xza6!EUO?H7EXYt!-=BpXQd6Fz-= zMT741L$eb<Qsmi6%G*Owob;&+<fLw{2|X{h<a-n#zs0NsaP*-bvKEaWA5>8n<Tb~+ z`Iqo!XxL4|c8@78V%revyV3fpvO#(h+yaZx#3?#MEe3zjv`X{>P?61VRS+UgMMa?Y z23rHD`)m0iSoo3Z#$N>WJqXa){Q*F5fQRdD>F`Vrr4v^VY10)|Wu){l@f+UxQ5l9| zj8fKX9XYpKkoh58{M&OhDvyECEd<FSxC#}mPo~#@H26M!aUdv+<6IO{7^PRL)8Ub{ zod^7X<W;G-w95v)nWisB8O6A@@BTn-w3*+^`uF>D?PP_jSx9I2GE>~Tv-N$%_QduY z$A4Sqfn3-@i;KmXjD2f?A7@}I!`#4vpChw7MP-I`#*AhQ8dV0L9Ww}ggz0FWrNd2q zGumnNC_ez$CH_yfRhyEBxTcbUfIT@iMa-waJKdd^uE9>!x}2J2l}x%lpWd8Q?IVqj z(7;pZdA>Q+!E<>>3f^wfV5Bw#h&IOnYaWOayG3L{N;$C4K%`g2OH_s3Z!;NR$#o`^ zT2BhMID1*@V35YmGjKRc)hLxbwR1D+kq*g=jtM^JU#X)yS&PC36Vdxr*6ha)jeXR; z`vlw=aJW=ddhmP`ySFmFHS=E0o6|F3@+Nk(;HpdA`rfKmo)ebjNAqOUFE1O>t8whl z@z;-4?7(T>I+1+l7j2#Z9LvvG7+>Kn0ELK{ypVpYI<xTCtJXE}Z0c;^Gw7Z?G_adt z{NR!EpZvAB*3~qTWfZr^;o24FwVzh$O$9;qb7Atp;*FRos`CqcxGQrrT08^L)@cr0 ztZQ(ynX8gJKzXicJq13-=aZgf7{AGmuqyA0;zzm=%U0wV1x_1QFONgG1DyN$pvVy4 z|5eq%1sdZ6QPd;m*qnGPNQwJEE0<7a-&4G;s@Ff3NFSz^!*OI;MTfb-z4uMVS<AGp z?Ft9pv9i_(ee0V$(Wu5JrGF&CL<e$y`8Gn|IdiMQ)qscY1vd6?u!(sWyc=#&;maq5 z1T1?mY6)_M2b;sA1Xo7nF_w_*UW`5wcWMU`E&ZdSDhB#ac&t9G&fomPOGxcn0P2}K z0<bWnJ@sD)q(xfW6_<1m>_XqLec|TdLqmN20he}fyEX8|>=S7@w`!5`NDDvRmS}*a zOk@Yuu=HzfpNq|*eq#ujf#Fy~l!F^~d1^1Th%Wx9se22CTi53e>%&K`Pn;F`9%5-W z(_7^5{*cDT1pv|bAAUPjf)qiz`EDByC2}y>(<Vio$Y})o9ITFKoCi>mu;AXi$o0}h zg4`lWhKdSPs$t0iGKld;fbK>kx%q)94=oaG&#qM!w7gm7q<R#|dP@Fh%O<c#X?HA= zJ%`qJj%gut5tQoTZu;Y^X^JjDTo1G$19_(@&d5aO|5jQuur_ArGd&tvnKtQ@FE^0i zfg4E()*W&}wnfM<3HNAe51Ypl8oZmwQ1poX{NKeyss7g>D_cHc));Sry}&aFKpdQt zEvVYDoD+vzLv_P%5eJxr63=*>PJJ}2KUN@U_xyiPH(cU$Ur7f~NNoWLeGFD1!#?ld zIwbb5+a<~W=U+KsG38)qz;T2l;iPW=&sbm;TI}O~-+u}wd3&QzUMHa{5Xj>4%#K2e z*z=$i_VzHvgzI^Qy2yy=SCwy{=2`(L-b$>j3rdU{Sql!s24Dvp0Q}HS!M4qh(mk;b zhn@l}$Arg7XN=5bVckH~UJvyyYT9AWi>#t{#?$2!4(gfO6Ab{!+};iiV}A)E?|@RV z+0qv8%(cWoA!R8tkQI?_*}oULeI4@FdPvx{%Ic!TIxONW=<_YRb8Di$2kc>e{K+qT zyc{0V*EG|_c_v)!)zllYbM2}ZZ(XdWvFf$j0!2`fEjt5cpxk0PcjoNC#}ujZRC$Ze zQK=`>nA_Z@V#yzQvVS7$k@sNq0$T(m(1tzv$z#qg8UIS#_)(d0`7?L58<nOR6nJt{ zlID&<iixXbK&EZSlaPZ24yT`4wyY^^8sDE6{^A@PtMm8?VbcZVp9euLP7}jJIJR|Q z>uYbmLs^;6d1?GG_d#$U9=vW*VAL3G$WT!1m!4T%8wGHy@k=nS^L+EUV~CURUppRk zz}VfMkY;rYMNQF<QBQUEAyg1NgT{GGsI|dMM;2JKy{9uk3NMgj-o*zSMVfL-IGjL- ziRC*pu7SbZ_~UJxFR5e5Vl?3lG3w_u6j}4xER7e2Yk;`GuD*Wwy1jiKIrcK!=#Grv zHdQ7|5LT&u^#-3JR$<dJBm>(0Ir@yu)Iddr*q&1z1Fo(<BAZd4N58${?M}Ks@z{20 zHml%!gk*VDDQVoXPK>f1>onWJR6nn-C*())FE-m52r*ltE`?znZVY8B3ern571GCX zRs7b!t_qtrNAGQbyq`zdln<4Ici#T=lBVwE$vx8xpDE-FCy!Z&681v36|a~uNB8X3 z-Njb#3#&`Z=WItwVm@KQTgz5;5t2o1%smS$qvZ7z8HrvUsBmW_-YM7*DUO;3fG2G_ zCn+jFX07ByqKZmcy*9*Q19s%_RKkk=O3TC^BgRvqJ9{H6i)*H#8l$r_wu%1nu>Mni zFHry{9LB=er)ZO7BL&OdzA{t#vg%#L+9L{t-3FM+gbATui$aRoXa*&(X?F!1^SO)x zG0YzNRSJz$>!LHV@uC#$>~K|<w<I+mR&}_(;dH}<%@X`G;F+0am4WL}Fvf1!CRZFU zLdh8@)9ZxG=MUI!u3E#5N-sWvfH6PgfYD3^#a-Bxw(m^fLrIa=M!SglLY-nc%Gs8Y zDH;K854Q@Dq3;71j5f!Lk{1m+!duo42&TA~2Be7+?HudhO00h2S)9qgVZP7Xd!zip zvp(UD2BBGrmDB_7GG3Y)P-17#L(8wVy}dZ*SPr;N+d?I$#CFXd%(GG?w40y50F{Xm zoLXr#fw_$kY31wVlF*3(YqAugtx+#V-48>0TMMCv5HUFHkDV)D&dVxN3~HBql&r>1 zZ72QXR*UB;m&Io-bsT*SdA`!!0ZYePbC=3mU6&fO&a<(&hKRTg7u1Cf&1RplTG1*9 zx6Ba^%Q-`i5*f;}<d32}csj9^CMl>IC1<O3=@$3lewT@{(F~9BzS8o?g--e-9v2Ai zMYXPvRvj(<9v%Z{fiQ6w2U86&eeMEfxkkBbkyZl7JwG|acQp8F<jCABqR(Y9ByqRd ztTD>5f1&{^_zUk;Fh%<-4zqbX)h0<<lq^xCBP)(x(TP>Mv@xAy*qW*+!n<aw9$P~Y z*sGB$NEew#%adq&Q8s*caE@}r^nFqCJZ|yF6Fs36kNa;$rkE)AitEY3F8IY1ojE7l zT8**7yeK-hcS96iqyDYX64@^+TeWhr$+{&;tq%8Lh1PQtF&R-UZ=ZkGrfQPKlKu4= z6hS}K#2+5D-@~qh?a!yBGw7vFQ|3rn9(|<{C4kZSCdX?91FcM7yxyYVzQ=a7e5CR^ z`-Q(r-}ZZvIiB2(zpbr0jOSaa%l4Hm(4aif5{Q&A^k2J4JY5}WgV)M=c}BryOph(s zg3*7AOmd*js~(yyiaFDPu$t7g4Cy#z=WN-!G-$c%oYHZY(w*=jbkZX>7h|*p<J_(( zanr{y5xVPz2c{c#ys-WGX@{_B4B)^8?|zyi<K*Dz^4mnN!K?SF#W|h?wZ_LSp4OKQ zt<W$m9@tD2S*%^lzb)LYzCteRsYlxibCFB1lgrQwtxlB7+DK@L;{6GSYJV0pf^(Fj zo~}GyoHMFPSbPrTT_@{9@{2^<$#{G%4?w!hJv3e2H||6Tap#q%Og-;uehi!l;6{DT z=y?0`OwW~#*o`zY&B_(RNj<h>JFT&2e)|)6_(VJWo#U|zzDk|yf=`rEngsRkzuFmS z?6O<6$N*f6yB!8G+!?2+8ddVHWj(+W->e!dw#CXc?#)mfzB%2gOe37$pvvTZ%7pmU zhnNkNlGZ(U@aw8nnNP2~X-O@JhlNQiyB$gDAr+jU{>Od;A(~ks6aG(VMDw=%S;Wk7 zc<g>5md)q(&rg_2)Uv7#=5R8L3c6KDQyeqsW7|!`LX+25BT&QK#JW8fj(6WaF&Qzi znH;scpWP8`+bEOTZ@>7^l$eeBI4fKiU-)(s{7@@{&p!%8=MNa3#kcQEAu&yM^O&Dc zp`j#abRSro)TV-5e~!OpBA9a}$e&cl-&pvM$q#w4fz~mhO*MbcN2<ih5nDcfszPen zYoD_@JqiH-Wt1Hsby?yZF2&NRAV7nXbx*e4xa;OZ5}lneD(G{F5cduPmu-fRf2&_! z0LV{iBen<9xV*A~b(Z=SDYXx%ILjorYYk&tVZ5rR4;34GDC7!Cff!>}TwGiin>mj9 zq~+5b0E)l+X}-$WYU+p%yZfiHxa^yDr*9n=lwKYWHxJ**UYdiH2JAe_N?zt4+E90V zJfNM&J4e68&<%Kw@(%pd>w2g0fr5HjBKWHZcJ+d5a0J!9!<|-Q#y@<tsk6vtiBH?i z-M-|-XzJ1BaG1A~Q9^UTMBHuYa~4!xLmkTQWK|K9j%#eNQ=8lO;J4byY9Tqxx8gEW zI3FAzz@oF?rj)LFIf;r~UI6VB+0KKjzloeUNoBEeA8(-yj=mPWcE_&EF8R1=E5y}i zj6XMoULKAoaTcV1%0rX!wvs}2A1yxrB;mJGizu%og$~G6ztgYKR$V%;PMIae;m@ei zdqq`+E1ZiQzGK$|US^NRx~;GjQKc`PCNI9#VH8ni$3CtcP(Pn8C2&lDE0M(g_tz}O zvie8jY#&FpRy8wYFX<TMNb3y5+zpT<TmNH)&8EF8i!qemXotzxnn;hWwdHi5_@8Q@ ze|T&XJl-+tx&GJ$e-S~CtuYTvkKM74esx3njp6>!6YE2gdSs^^0;*%2UsdgACQeou zG`gJazx43mT@IgSWVz$g+HjD=0(S*_DVU8~<<MBsuQH^sZ%w3tdi)Gtw+{r;Vjb@I z_ar`2tZLKbvo_QLpv7*cY^6V!E>p*KzREIq!?}yoqvrwU`d5}xL}8J2UyK+i{40=c z`~HQ&esH7hCTV#SYzYil-B<6stg&s)?O8PPST-7c&EN20YzMv1(?13%O}-I7r!m9) zGXq=81$}=?Nu<#hpc6Eczdg)JzSMMUZggYjY<1-0A;BJgb-Gx$IUk*w=1qmXq;jEI zMoONC;)}Gb4o3Y-ZpF4S>>!Cs+$s!9bxeQSXeaYcy%^6aWZCy<ua;PFG4x7+;xv>K z{mLrb_fG6`I39y-JhXDEEb!iFv5uuZ&!tc0-TjmD0jF?j{n2U8$e(xkzuc(k{{Gxh z>b}X}xg(96pZBkBeIH%otus{%OW)gc?5)4BRhHJnV*xDop`)QswPYVB?JWm%!T0db zS9ni1&-Zh8FQ>C#trr;V@Z7Nrm1>)LB;M^mJJ~EW)P5k;=1;4#u^5kjzt_aQ%#I%9 zUoN|Mc}Zd6+S69G%ewAs1}@aGg{_A_tA{%cCW`*(561V(uBhI_t&wKt>5>=q?wr@L z+Dwbu&n>v48zQ)DqxSHV0~=h6GqwRjI_(F;RnoJwFXW9g@lW>P_m;m}qqsq40tT93 z@xYo+_H_KtU68w)?8&$s<=2uVqg*kVaHHq2>&E$_U>3x1(Hw&nV|Vhn<o41+)YPZL ziy=jK!gtt38oT@<`8jM$Z(XWNIdvD@rs3ey;6U#E%rjROj}1sX=wBb}vGAqJ(_%NE zHUfP2x?^UV<NNVvXC!Oha@t|`<BHVLUyh3wufF_R>E4eQ^4Ai!tZAn!px+N2E&$K_ zXdp99eyw#qfR&g@HH^_PZ%!bxc%W<e#cNCUvN)ELeSa7^4!9MFbzBWGw$3Ts#qO`1 zE@@D_Ng^kIZ=<yMi}ySj+{$7w|CRHg>5o_C_P)|R=gkoS!6fMS<?WvqgXs<lY)T<w zdD#o`L4+MuSGR|M^G-)r>B1{<Dh1c|;@m8|MS<*p)(5=-=79bnqRlt99=;GUTMwuw zc+1J<-Bs|=mUT@|QYf?8cTJTNu28@4iq?-=YSXo!UQ_v1u<!PM%YFAXJ<@HIKL#~} z08?+_ov$!k_)qhC9$ZxAQ9DoYG-YFHj%bZM&ndh%6JWJ~fF+nL@Ou>+xec+^r5SY; z%J^ketEy(=ZNYMkf04d@o#ycs$TdvWE;Eq>(*%>{V~`VG<i!hSGG|q{lBcS)ZZFAF z=LH^O`2y`jdaOl@8;KdtyMF=u1C)Zt$#LyPwnmHHW?5lSCx)>1fpX)Q@jr}C$e#ZS z(|*Bj{p;H3dk#r~C|(f_*{rR?$)Jq}-nZSin%<lPjnj#Y%I=HKWR2pbFB?Pbs}^P- z@M;Ib6BS!4FK0YJ+0)9kkRnZb+NqD9pY4eNhn08WeAi8qiITQq^G=U<f`HBtY6@u^ z8P^6gbr;(f@MWrvQp^Yy@T48#vV7OOKV%p<MtL5W3LJj0wR_?JECI!NUuu#@j$zSX zo{1>Pwq1WGlCM6)VHCajVI<1Kt%+Gj{EI;ON`A>Hjd%bd6YH1m|D#LU^pOoaBl6wr zH>P5d=Jf?cLKuC5&wcZ;OV=_{mZ2WHb!4X`$+Z=Ny@VXg4XSbAg5Bz~;-<C)mY`XH zOo3(Jw6m1NcHG52pfm_f)ch21{A44n4;AJ4ZhhcUxpuer52N_3foiw1qf#GJ)h#<F zB=b}HH!Aub^gq5AFJe9HS(13`Voe)F?&H_1&|#l=hF@9my>z!Z<hF4tr_-Dr3kd(g zXWEE9^fr@u@*(M(XDyWoSV4F+P`HD%IrV-<@5B}TK1P-e#LwIq4@gP*Zg*#C5qTfX zGzT?^uk^OsKem$6QW1Q6dq@~3Rh14j<P_wOrQ|>VU%BrgI8|IX+RDIe_}#4QnAl9S z|An8mvt2F4F|OaEcdo^AYI=QG`v3(#L;eDvB@d2uQb&8~Va}_H3e3%H3q{YlbeGCG z51|8FY>!<eluoQ>XZcK%VsC3_O)go2p}ueZ4QD|bt{t(R7z)IJ{9-Pftipk2As^Pe zf8>tdQGYeDJg@v8K;?AIJgwU5Rgi$o6BPKY(aEIVVI}Ly1$9*0gk&;#A+!RbT=usC z<Pibe(U3*rAI8nA%YWG}u_cE)#<;Xb@A34P-ZnFTsU;$cr!8oWhMLdZ)3x3)38Mx{ zitA#!9=TSh`vTmG=Ys03ki!1?0djX~k+ZkR{Ai7CcNA|)d!)ph6%icEGi0|8v(e?3 z5}2_|x!bR|#)Ri2Z#G4)$83Goc~F;~!YX7%`Q8UrF?vQs6_<J`I`o>qPGl@nAFTZ4 z0^wcJQ8w)&qwlBGP<m(|dc<}*G`*X77+>{@)2k;ZH(ypJNi+Mwwdr}YdT^*E=I=fQ zUX<`jdzHDU5D#1&aI-aK`|b&c2RSV~tEDB0#LF|N&BLEw?FfpOTEqDD?DtXgo)iQ^ zC>&3TG;P?NWFa235jO9<=R(Rif<@!kbBqtAXXr|(Xjve5{OG$*kU{b-<((M>6C;$F z%bS5qnTgq@QtOH}!ddsRhSP)>pV@>5SUc$L43%FsW&`FCj&R@2`hiWqwXKzkSsrc) zu$qUld<miy(fKD%i-dxAE4u4NC7<3kcwG1#x#gvS2I$~6tb@q)mnY_eBFZ)wz9Zf_ z{mt-Kz50#s!Rayf(RNAzq<Qi*hd88!>`&hvSGQp3rw|WA6BcUJcEIz^WihYHp(CNm zlIsbQd{$+ow+JXkosvp&3yo7iALHvl%`FJqfXMnvN5oK;kQ?1~x>)<Q^<Bv=XT#4h zQ*8s;xY)04?d{#lcyyhEUin74WXXCCqbU7Gu2#3j8<aK_ez>sW7W}Z3`|A%zMj*6{ zjnuIwe-|9cd6F6Vcrj39eNI?*Xntkd3HJ>%!}g>_W;HIFP}BkdRLUBgE0NYC#C-Kk zR|sQ9qx8<@>Hp`&V^?~?&ZR0Eip#%5G6obDv*Uum^cjc-9}pG;UwQ%4er((9Csh?F z$DW1h!7`+OrQ8xFy?|>Ju#)|WLHo90(SOw(uq*JE1RrDjg{NHsMzaHy8D5PCE7ymq zH%NA|t$f?DxLiHkbpbbwO*hXRRL2hvheCY>RE4`Qa5F%m_ehGJSO+}6Fo2F{EnU8r zQhK=IQRV_!4QA-k*d#bfSY{J;RhYXBJ6n;nyprcvUC;}V6&SqWPc2SZK>oJXdVPj? zxmiQP+5X4%r5km}#CCfwZ%^A@WiBiEDI^jJO$EFCRD~%NFxF~#=eT8`WOB)&HENe< zK7_hp51-Uccer|q*wYbRj?EmYHKm?la2`_zFgjUQ>?nQ6N1IalRCCkxN2a8d>AO2- z#I#sH>f?;L(4n%8_rxw?v2}2Cq12k#qo1BmWKsvQP<yK}bjVHGOKe1CF?(>p&giw% zN~k0sMA5?yJEW$zcl;-|4I%_PDBXf0;T_bB>vc54pp<8xzV_>|>N*IFYTw_@u4EQf zDU?ixGGAzMy>>eF7ji#Tvr53a8ZTG!a}iBHiHB{&hO_4D<t!k;!_MN17=D?y;AYL` zW|IQ}dWoV8eyIl#-!Q15SzOKr1ND`l&2ZF~<tTz5bL^+o9C@Op4JrnJ-@^w1Zh<~@ zTiED)VFe|e*_pdH1bIA#wzW1$FQbHq_E48xG$&420x|Yl{o8DPLUD`$Rk42c>zZR9 z^1XK2_eDD*FIKqlpXDQOwE(7p*k2dm_TXZGj2^;7^GxPHD{+3dY%VAH0xp*pd%$5x z1qq$3fXsN_5Qr@GZw1ZT-+}a`$5h?w*VmVp!Fu@WjEsytebp{}w@?Gv+bfkxAtNN7 zicK3(e+BzAFve`+=KC18LYZKww_}sN19DGpJ>hGy2HV;UF(dO-trx7h;?7IwfvpPs zfsA~=<-s=nyhnr5Vl(|^C5UQBJc3h@kZ86_O`Ghk@|V0=*jQR2?AF7EyXk{1-aAcl zCmgA5Zum0;=G1ex;83+6Q)n@ZY7c%=h+fXw0X*hAe}Z+OE?zXsP@>x-7b;67jgq6+ zae>IV6&I*9DSn?z=k80F>COvc*PXHRsFK=c2tV1bPBv8%WMfS)`vT3!h!^!*r_@ha z1JZv7k&6Y|4Z_xOQ)@#VE6~>`EK?m^$ay=`c215v{AzDmlU5PEu?C<Bt*SV$ZfRi` znN83%*dpz(S5N`|X5TE<HwKE3FbJViGG_zim-3rm_IP`|U&_&5wYWNK6?bM<CMBb> z1UUbj%dgf-TjyJf2lW%K5rlMn>E$=#?a8)EOObP-W+wIJvAJ$`KSP04wxYLQ^m}D7 z3&Lsf_fme979({U!rPPHdr-FgAQCd^Me{cCBF2w9^~59N+p_Zo$C=(%XWzrzHlc^F zKh}b(Z*C}TpvgQv9}RrV&aokm%SHRi*4F$M?unV4<<r_XWFD7|e{?39x|D(ZfUu=4 z19gW*XSSi$p5}QSU>QJC%vO1ga3fb9unM=@Q!Q@G-w{Vm|Bb)DUN5P#icO!_^|hS` zX;FK|>cq&R(-<Y-`73hi`}A}(W&vY`X;S62sYDl7d&yjXxjcW#7|WLu4Y%GTcC4Cj z&fkgm9#I!&EhaV+7iK73KY6IYe=+nt(2P#4h1vxB*gW=kBc<!*otQz&0v-;3rTx}l zJg>*;o#6Pi_e%cxx*Eq%$xTgGT9>n>&rzvr(x36!_={1=`@TkDW`5GobHxYzzRdAJ z(U-no?qa*Uu}5W-w#<?DMw;^XbtBI+FLkUCG$i*GBoI#dM?1Q+a68MHvgJMxNO-G| zO!zhsV2slkAA2kj<JcwLJMPv__UreqCOYYQuiVh5dcU=0O!;DwxFI=BiJ8j&la0or zaaLya(vNuJ*}qO$x|foN7gSzsj5Z!Fl-U7YJx=e3ULm)(l9)&0n4|Sk)$v5;&ZiGJ z^9~8`f1djgA6&=iB{gVas(2_D#2^LNH@phsn%HODIf9pV1j{8%T@CPiYdn7VKoXhO zt^ZmF*Tbayg>0Ji@2|~jX`fEqnRjQZiptKpZnM#z^6ROt1^@n;_(AQZ&aYGv#Vi%P zafJl-8H($X2b1oHZ<nJlq+LP3;FPAHLcX~|QC=bF>Giy#b1R?dyc)yR9XjU(9wR}X zhlC~jdvdrLezC57hWY@Qv__)}m_Z^$2+K>t6>EOt*JLI`ovIkrq5T5@<pu0?uhM8n zzun^#ELt0lP%eADI0z<IkX5y3>M*%ftgp;komHfh&CfS!IU^=#M4D{lUMHEBxHCn! zBNrF3j#I_`NN$(<0Z{><;@bUdi<f$x4qQ_Mn&B&w5_O7fl9-OVh>0dEc8@-zkr)Sn z8Yp#8e;Udh;&s;jO1j!^s}GBRxzmu=ae4$?3>*`Z$F9WD|8feIjf(-1vHf%lnbJz0 zr^MKMd?e)}R!pDnQc=9yUN$CDjlWAn+$B4RBahnFra5dv$%WeuY_+Mk&r1>DZxInS zk7$zA@?3Q=zUHO({-bZG8|mKz$?%K+K3O_rae%|YfdsQB?3VxB2vHk!4pB;ew8|f| z_L}MF;*=hx+fTFEq4HLkG+10eVHzpdm6)|UL;dsD)m^#T?TbN;UX@MUedNOyDRA;Q zl!7YHWm0^(v!-hT<?6z(LMMdySX`){OBkOEmcBIm@mB33UnKMV_>a2#y?_WYF<JWh zYph<JKcT&bpR@~~SbCYfVj{9NYY%0vE_7P{)>I}<l`b~qq+r=}h8?g=O!8Mh+@cRp z<>S%$@Wx8!?YUcCgy@~p_3kk*Iel8V?~?`~!|6@spns(`z<dAa5>~df8Ie5o!v|+g z5Y`6TD6x3ZR=#o(arc=*qHjC*Uz?Se7~uUPwOYlfXLm9<K~C@)+T>Q~K;43cAvb@h z&yzdm6~pOoI>7ObQ2SBnE@&HCsXU&X)no<2kklQSJ7d5Jv^!h645;c|*{RgZs>RlJ z;;IKzw2&KbyTB;0vOyvNhMk8?+zVqZDt~HUHt)?o5NiB*%ByXm%9-`Bw20*F5~W#v zP918$g}lWTQf6+6V>KNXc`7(h<h=`N_fb8+p6D#DP~Yn7V*gl~{!s5GF{~qIX@(;6 zwgS?2z-=WA_<kwn5*g=tr?ZbuHYfQqRW0hZg(5z;X%tEV|FZdqXtp>pzU#S-N@k;& z7YTxY3&qbgxg8ujV2ICFe&YunqZHSFhZl<{c!GvbeSt2MN+$xJYEc!^%0=4){#7lZ zJDGOuK>U{x5Gq*8>SIkYOuHR=*R8)p9@?81=sULyCmwB05U_l?{Pn=DRlAVRq*(13 zM~GVua$b(9h<hMn!^#O!MO~NY_Y2EqpDd`htquFwp7nn_Lvh1ZZIdQZpQxl()XXNj znXzDqBeDbq8bza@Gj?j`IUMr3hRAS3`PAtSzJgEgCN1nR?@cr+!o2>!y+h5l{BFyO zNX)jTbQhG&mF18IWlr?yUYh?(XW8o7EEpW4+#pJT-Yl*gFCda|z%WUJ>c)fer!5I3 z#QYwmHdktMhF)*W3i7hb@j|G!_3SFh$hD}*04`E~V!BumQqNnqwiXm}S32y(m=aZ5 zkTx-$MwhL8Syj205U<&C`vDYHOalC(uas-*5k7Vjbrl{$zJ=ljAHUf$i@KLI(?@>y zN@3?OkE(=_n#dvQ{q(5h{69~RQspb+r%Pb_f*}8lT;%w5i=l#~pR3+Xmfw!0=A9MD ze24()gk-|Go;_zKvyQo)1GyLYukR@Dw!CUm0um2?s9ne}>8n~cmTW7@woR)=#C6?2 zR%(yu-2-TaJDN*W?S7-Vct5*`s!=rfmqtE*cI)PjVMJNM#nz?L769{lv`t-45amxL z^i_v<^HUc!yD>ojm@ZVA_a`w})_V`AQST=Ip-H_PJacGE#JvpN6;}nI2oCqiCiX=_ zQ$FNPIfFMVKg%L&=aV(KG4y^?Lq`Z24f5an<awA4KTa{}l-7qzii3{0uIAE_38y%M zB488RF5y>4mP=c<d>9s})yVqk1l9ZRS+m-e@-kSJS@uwlm@VXfpcbC_!Wta&ftM#J zV#ha)lQ`UIX)7&2Fw~HEUtt}Z33hfuLR!rt=1?d@ola2)KUmt;j#vJ!Wp{ypZwjqp z&H9oiGIYyC^V}iyU~-)8C%QK~?}50TS;Xd{sY}@5KDAa@)Jl>a4$U>dDIT%9B6DU< z+X~n>_3httTR}l-CMXP1O(%&QPq^6_pkU^2vZ~FVC@nb)fyjP}d^LA5%^=0rf|v6W ztEM9`9nuzmT<eipVZQbBR9UsrP=LvsvU$e=<4bluF+C$?Iu$mdJEaUUd+K0Fe!7#C z;Gp`>GxDiGCG~4feQ^o3sNT`eZAW&#Q7A!zs!U}<7>t0$+SQwZg7A=F5%)?@_G@C- zQl6~d$kasPIB-EjQ#f%~@T*IN4?q}S7JvqMCcn5UqGvm_|J<5iE(k##^M($KyT?J@ z1vP)t3Soj1*%?J~L0u+M#*z=MCYqBBp}Fqzg}p1cdX$qgSrf+9r)|ZTe|ba`xAN5? zRIzRhdLYSbUq{ww>Syeu5l@E14S>zH*Cn}Ye^^-yXoUF(WJXxJOhlh#mxSa|Lqi_8 z5k+{VH&fL>wgTE&i1<jxJ})J?#%wLCvNms@b$ofXm(YLVO;Sn9Jzn6<+@1Y&T`Bs* zdms?W43=#YJ&JmmH%2(cB-~boWyenFLCW*(IRa=7nSlmknI_IorubExQn{{(V$8L) zujqf?oSS~>@~blfj-{~e?Kf_*QF0*KFhY<GaEA^KBe!0(V=M;3j$w#)jN@o#kvSg} zpVpb}wJFpUNgYN($tjJyFE>7aUL8=z9Y^ieaIyOliC0d*4zht94~n}Z$43xKTK+Ih z$or1^__hb`B@_>h7gn(}wx4s}#O2DSNN(AJHuV{0HN)i6Ry0_lPi)^32i{t1mIRH) zPSPKP_h5Q=Y7^*{vkaly4D?hC3JLwhVYGZcC0a+H04<k?cS;Fu?{2j#Rj0q!>u9_9 zwQmz8ubi<aWajN76k8ZJMzgqF(#k=yT8je{=k9(uZvP$vq*)%S@aJuXgp~>)aR#z( zXK_g9wVlPm2pkn9T{=3=Hc;`!4|iM~!(;gn!3Fnb;$+!wlwVTB0Ll4?rI+l=So)4` z=hSzMVjuvljnWFo63A{vx9{?HNFhMKLRn?Y$LNmkzy+R9Ay3?dq39z@TA%z)XjiCq z6`VnAbdWLJ^bR<<37PKVRzrRM-;B8CG}BhQFgQCs!Q{cER*NyP1Q9tdEqCgVT0x&^ ztW8$ZnlQ{E;5fx<w~>dnEQ7U^mN$MeaZ!9xT;kvgKymWoX)l+o-3r|p2+6KrPU{Fn zJOn$OBHZ8=)$rSx5z^!YDHKc{shU_?M&mMMpkU=X#5C%ww;8Vi9Uvi-_gqjht>6_x z=+ei>&&5M{^gKSfCUzVLNaGMfxNrt{f+F@J?CNGTzD3ST=yO*#h3pA4%yxS`>I#$} zkA$dWU-fOnl{3e%NN}s4i1;*+$4YO%>^<n%Mk8$-E)W9P&VHl99e*O1u@yXVX_XTp zK0t@@!~Hz9{dgR~7PUti?j09+hmA?JOT~WX0fB9EU?6<O;XSMq<OB|EVQp9^L=JS1 zr<B_!`tFQ<-|CLyAC0Q#dMz^l1ZL#+g&S9@AcN0BxMNMr+D9{h#Fjq{VHMt-ky*Gw z#IJ-i1j=qs%S)8a7>Ygux)xOIMe8Fa7S2Ge=h(_>I&X<Bj&mCa3WL}K8<2b`-3zg; z1)Y#Jl5@S+zh0A(JYQB2(XcDkc>CI!z}HHKH~{%mAPbHf`)ZG97n?UZ&o=7BBFe1@ zI8J1qfs>+&JqBQ0^CKX3bRO>zTdvbw+_EYtgiA7P|33yW@|6Mg?`Cn!mR+I<@o6J; zDJvya91f?mTCg}4`vzNoDxM&P>}mngunV}NzNybwy;v5(5(CKJ;%ET$?1k<fSb<z& z$NDnSOx^_GMJW>nPnXfq3bQ(nl<q}>o?90xeNP{e8o_|7R9yMl8E8%Q02>vzVR`R& zEfwd#!$_Bfx?A?IRVg_hlsf(UrO>@=StX<po-sTpT%c<d?@==eQS2EzZjml8_WP4& zm_2V}HZ2M}8ZHj)UwkR=TDiMWWe8Gt&4wfV1lPpbB*5paB-RJ&=RLA)$G{pFn-|oB zXN41ZVYE(<BHT}(F+y3gKV@PQs)av1A_1IMIkf${A0S_Gxs5b2Nhy=LEwZ6z<wkNM zIX>b8tNlHH6iHE~nQjI$?E(TXC?=PK3wUBJSRen~!4D3Sh_Ms_rGX+Dz);yj<~Dxq z*|QRs;IVSR_E-ItWmnadmb#<r4Z?_p<5I4~qH*bx{T<H-BBbeKEu`w0Vp}i7QDZ;) zyijVxyuY+-vrUg2f@qU#U{^NCLj~+(mD*X~AICfLwN@ut7+8i`x2zb$CMol!VteRs zT!?W*HuSjELr_dD7f%A_KQ2kO&BI8CLbKfZA28azEPLXT=SQsFoWh9)kuhf5>Z3+T zA89*&NKg0=Tx@VuGf}%`q+-*;_xK7Rv=*W?vG1|)StSq{{EfdcN7#jUWNq5deIqv^ z=AFoT0>u;>NGnKSD~$7|g++#V5<*2sE?=I}P<A(#XkJlrd<lD|gRj%jlb54k|JgM| zi%asyme5mIuy6kl_!(Rd+l8=B=2lGdVqjK@%<HwEG$nVwESS}8xIkO=-_6`Tsekow zAafCf81q@zrj0`7RlrDBWB{!{-PV7LA^KWd{mXS!3dO(g3~_>?;|Ng4<x@y(7R7hg z#d-`sqY-jxS*d68pd9Gt!kxzYyv9C#4l~l9B?o4tg086BFIU_4T)|Pa`^&sW+i5bC zRl^+hR>MmEkmA^$$j4!ems1^TRstgGLeg#Eh2+%1W}ubd_7v6QoTh%vz61JOe#T*3 zFh-sAq#jDQHi2dtQegnQqJ2iT1B#7^K3CF&l@CnriuRYTO!>ih-NG^mh5O^aP*5=t zAxV;7ikQ{X$c|OK`w1HOuS{8C!XB=^QLEF>o^623&YSH+x)MW+w?>64vSHcAZmOak z3aSzLRh0nq5Ag_&lKUFpd2dvh_V=%fw>+LsEuoic-hS#w2ITHT#E6au75{)%-3P_} zt8^`h^io1K^>xoEFpeS+tFON&yL^HV_YxyF!X2VQkwH3Eo1C)>&lKKj#nz{izFeu( zx6-vBt$HS|%nP%`-f14Hz(25Ej{)1}fuMlJ;!ec84rCM*+Z?G$=4cton#JaX!!(Nr z3HaobVX{Fne~s>ZxlI;$0_P^AkLGBv8Cm}pv;TsTEG2ubQ%^2OwYYx|Wu@SGk(BiI zS31u2s~tQCVZA7H3Cwp9BpjnAgr@ZBppY#DysE;OtChVhQ>d8HD<9~KTB>fN>kK91 zMj+$j13QBAJ_lKBI$jmPp4n-UsFhov>S}()t^%v~ifa!HFp@6?E$deN9>Z8*4RkB7 zBS0XqQp>Bb&+rl}+vwJ?n(f2+M~lnF*G8X7PTNRcKC|Z_^Z9Mc^BebkXc@{6UClPc zx`CI~E3fH{yz<$Fk-LDMl0<$skiC(vBM0E$lGzg;dJyAV++$8D>&Uvg?SF%#m5r&T zw$hQ>K(a@}%IAAWfm&0#HX-jZiFTCS`Hcr#s66DfQbefB=Jv2UE8#ndc#dpk<1(YU zk}O^C8Lnir{AZ&HJqIDRAb4Ov|IMHdJ&!UL7kP=bhdIY{AVNcpT$3TMn0XU)m{%7y zJJ%;bP%Qu;QO=NEE=H;^Iz#O9e%b~CutHne6_e@CY=;Ias&Y8t1%dIJFR7Jl{124o z@>yJnW$th27oE_2N6mi^4hJ|7x<iD0A!haK**YYngsBlM1RX_~^AsM>B9?B9N1dGO z;Ut{;<r$NhEf3k0ZW(hI?+2VAht!{p10Q?(V&Y^EB8YK1AmkljFH=I?c~1+oPhI^M zU`lY->>GaL64ZbfM|eHDFb|gQ#Ig?gHxDFcQ8f*x@WfTV7um-l=mgb~0{x}C0uGkf zMhdR^IQ+QyzSIKW>DJ0j{^22bV}{wVUt6ps&0{7z!ScYv_}d-80rG+K2@(t2golbT znrxr&Pla@Fu0SsA`5=1iQ~t_&$o9Uo6VfaWhT(O+L^%3weoWAfMeuJeYPVP{(=Drv zU7@xc0QzaZ$IO)DLH-+*`*@M%@2X2p^$(zh0|b1Nvr}pD`FY(g<lEaPcAV>r@56?$ zlDJh~GO3NZPuq5cDNC~M9YwLn0Qt4khTe?OffbK>jNUvhDJMK@u6w^f%Om`DA8kw0 z_nMb8(QeBcw&M!lC2GQQ|8twtYc+gGM+C8|lorG~`W_<nc2QgM$x{VeU1-xwZegQ& zBq@F?E(6VaYFma$&R#dz0Xu72`Zq||du$76zvz&vNCHI~v}wd=1Hz=)GC(La8NU9{ zSV)slrHc=BYW|jjcrBuO4jCe5%>!XG!jdKptLZ&;CXBBAkx*Q=^cw{NP9LMYVSoRU z8-y)Z7Z7RNyTr6AHk-#~j8Vp7E<IL#%2e^lCJHlGXWfbUD%~@ML#XFYZ=tni@TEa_ zyyNWYQ0)h2|NgG(lBJghZLmN71;v4P7Dv8i0UIo=V)J{205G{cs(Bl5o*zHW`qnu9 z^6M}kcXsuN64~0&i=f#WD!>YWDHgW33vBCwRDOp<dEBq_=G?lt8BntwE<vvuvHR-A zz(hicEkDv$kEy2Nt!|T`S4lJtw{B@?T^K*~AIkvm^DgU1P|-1%GXdqy?7~|38O{jk z$04`F&Lt~`-iOk2?V3wJis5eWt_a?>mXwu=@@Tu6-mc9-8V_g^gHtG8b<192|D+n2 zZi*<1{gD?p#TGxu4Rk5X2EO%GqPEUaOa%*zW|f}w)bpP8DES>-_|EG%CRa-kdI<EC z(YIQb*%p6E7kOvH%A}>||B8heQeH}`UT=Y67zVYs5(s^8uTt<WCdn-+u-!wIrGDZ| zg-HW*NvB;@ez#qPeforuOOQoPtiyg3p7S7H_1buh-u=)3M8$^W!G&z|!FA0>D=C8K zlWaI@O!8{*n(tx3slgJ!>-mAC!f)D|`kHLn1G9TOjQPCDws)JS1R?G#M1ekgL;2Ix zm0lEVM$V7Sb|!t-8?Y*NCGW5uRhM7BD=VrR#+lp7=QyM7(yy#)da+1DsM{Og0L2<k z<14U1QSXGT(c&PRggLki^i6N2ia&qac?Yeh?ZfReqEEQo##mC1-PV_~<C5MYFab`k zFpxuZ$E0O^g1B8Ke_e%0Q@L>xn1;fj!m=LYGn*xS-%bUnra(<C-uIi=AZ4AlX9m@K z?p~fjJzoh)oTZWro%#Vqik5I)n{EBVXRLaOcYg?b(fE;lj6BeIn@e7%jBy%Z+^Or; zfaHAjv+3xc3O%_U&yKqM+Aa~p8>&(UYLHO^0blJl{LhW)LX{}{b`8r`A$Xo5n0zGl z9{ww_H7y7oymz3>66ARBHU}_I1%Wl#eTOoIByYF4z{Ie<c`NH9FR=Kna_uekQWfM$ z;}?+(5@LCWQg~cg!)rNOSqUNZ%r^2txcOT&0@JxjaU)Bw27gR)_`d;>Z&`ck&b%YA zdGu})2evG7Zk>WaO>ndPZqY$XfiJd-qGaAehx70gSG+s3HP4_%w*EsPM%`X7L+yTB zuE4-?h-?66k@1&71(*CdoCBbR4!y{n@4?qUu`W`J>uMcf24R6CLTle|V9M7MWkw+d zCBJJ#RZgjzpP@Ff=gSwPX5XEbdHW8v9|yTt(yIYRF7=}4h3kgFS=9_w;qC`_?cLR> z{czt?+rKQYsD4D9sfWye?d)9El{A4eBog4_q`a_4y}e$x>?fM5{64NYs@@ZW`3D&+ z5`cmmF=xJDC9cz~QRs|(wE43UfU$ZW3Ga`*7HUGtlhela^iQetAybUg&uXb-&+9%O zq*^R$bZbCW{88xWiY4UDUuJznxN1TQ+4V3DPOP!3Jr$OUOYv>zc!khQARN{2nZ+FH zO2I8-+n(^&WxzG0YUcC;b_IGszsh0}Qmb-32&WKvX9k4|0)N@7uy%9Ao@|nXMUJ~> z|Lf~s7w1}zO=skqa_RtfmGel+4SjWU!k|K51da;mjK(EBxvg#Y2WIG@pyF<m6RPLl z1u;7;)@|w7J1nihHh5g%B`gs9u#J>JjKv4h&hLA~;yj$MDd1VS<6&4de-ANH;DeCJ z6o<Q8PFn!27q>rq_x3-<Y%Qe_Cw>DeIM0U|*TPd3r10_+5TU}Y??Y)a?%aUf<^N=# zz~#VriMaNoMv?bXmc;ZE1@v&Gf0chY&R+HM1%^dLRerCTSL-_Ot7iv0E$&p$KUH7q zUkcL{*#hOo#*hXMZ9oD(VD}ry2btpHr(HA{zYMu~ZGSfwB*ubIpLeqcjTJgi|8-dK z42H(QJuSbPF|fcMV*_+^0`Uz_V<tGiEm1kJzzE$iQt`xHxpNSWF(&K8;lk5^dys-s zWq=Z}f%G)o95&>w*!+m#4O~+;c7IKEDUxK9e<?daLpg_yqQDTB^~!V?LO1^B-;mXV z%WZk=X&n8%jB%bK4%6?}Rtb`p1P^HIa0hTDz)4^Y5CBGkzw6m^iQvG@(t?fV?=NHg zd8G==6|p9vaE+#&0CU5uw@q0+52HH;Cx`7j-4;tUNh4+yRw3LTE$l4tJdDx~_|_Ot z7N>b}EYkK4kQVC!Vl~ipAqqlu6%Fn72;4=^i^xgA34|P2qg0%zwCa#gFS=v&6L@}G z$_BswzZs`uul@h>f}76~rvW*(s;H|+KtTvKQNyVSVS|o)Iftr#|6D-%fD;P+Mc~$J zv4}449z+5%s%NUX@oLP#lgPN&3kOMw+Sav|1TYFZYBh^sqo_G(ZSme(5_`bMuz9l= zEOYq43dywU-<E&SijZlPQ>wn85n6#+wmyVZ&k!L08EqLZ^~~I<=it0Cb{%~~O^kgN z`<lJ33=~&=MVm*#6z{;xD=2n{tiXOuPU(d!l+lW9Wl>QXL98Ig1fk&p^mROGKZ3Fr znZ|~KT|_u=vLc|mTM{FrXkd9llM$2l*fpbuwd0Af<91RHHbL({%#umUY#Sd=Wfgbs zr0xR6M2U=CF_@F|vU?!*3_rwDj+rla4t+SL?q;KUfLUp-7uk>;gp2?C-ivu0N1*;J z*6|RM6d>bZEuEu&cU?x@X(mC%kU0=z_rf6Ka2DGz({7azt^MGe>d_OpQ$Np2fx*)5 z?|k6=iDYdg_b8J7Lv6vQr`M+{Ch+A4!V&JH)2Mf2?3(IV6s#@h6k33L0Qtq#-bnf4 z`nlz+;y&u{@7_n&2kT+}KJ9J#Ka;djQ$Z0~_pw>q$8OxB5=E9*HWF%<KN8J^oG;mx z5W9B67rABj2mJY9q9gB-1|&%vw`?J|GS9Y*n+D=fl?BjGgdj`IuQFJR??Hr+93p|c zxE{(Iju}Dl(3{Q0qhiDyEpxude+O|k(LN`mz!@k3x+k6oq*oVP6$cCweGn;yDB9KD zl6~p%Tx?0ms9n*F3y@E)6@*NbPZb?=EPM1)S91MQdv<_}<wn(j9z0hY^&}68O)7K> z>`laf30(h<{QkfoAmk;cVSEick04kl*^Dj7w}t%ZFHj7(t5*-m_u-U4?I#RZc<J&U zrDkPWsqJ`=Z-zr162qyhXZ3u8rkufPDnH{|dD^;)o6qTijY|&Got={g;)XEg?8iPL zvQ0+Q!I6c{xk||!l^YT1g#<8>jP1pasMxO=dKKl@KBakP1{&7AyZ<G}4x*p1P@K9Y z6hRGF<jEck%$%Do@z$MmcXuRb2EC*a$&2aE&xdxcHZB_M9i-O$*rv_$@j^4UT;A>! zW65Fd4rK)<iyN^D!uucP9q^j(_8yR1DiXxRr15GDKXB?D^91=6KyB?MYZ?XuV4`=Q z?rylU;s{d#$bf+Gtj{r`9q3fByUxB)Xqi^NTn?Ap2w8Z<5;aifQlORoh%fKxT_6N$ zrMuZlRuU)6tMYcd(Bh@HNQtc~komJJ@2_tL;%*}qhvGB-u&anC?uuV26NJjw^LXwf z@sca?Q(grO;zF9jGZ%n1OFkF;og6YwB#5IWJc3n;JZbri8X{YV<xsU3cy+h&3(Z=^ zc4-rRB?V&Y7r|pO61pO<4h4Yo;Z?44u<`!t%&MQ-a-iXSW`AdM*kGd9eS>Ie*9_fo zG=xPtEXzP`4r<!&!#E2;$XgFvFxd^5LAkN$%tX7d^ZG;z7zjLdSeY4R==&kGS2q{G zg5nh>LDfa?ax&41AYq7aZD?OOIph8fsRUB@(nSJxX0wfSouMCwV2{VjVn3gvLMTU} zcD}hr_dVGT(q+3|U<q4n{JbsjqRpaO=Z1_xorLpJDpQs3zQdB>r&Ijn)~(4ri1E~g zP36S@xiZoI{UIDj0G;$&x6=~CdYYQ<$&=pQVDs6>Q}_vbS@e-#c#orD+QuZGr~R!& zzTQ@#qUr}Rt%D@TdsL_M3%|<6Zve*8maV;rLBk#`Eyc#JbYJ6A7i*|C^TkJ>kQ_Tu z9@}kCKLnCt+O6bV^Pc>Awfw^g>+M>lkF9;P`qKH7gFL)c1WOQsaV8PslVZh7dDjq& zP^?1;f7^0aD3D297qtR~as<v(8jD+`8d^txLJnXz7M^OAww`f4-F757!qO%oi2kC_ zWji~tj(F64csKQ{p-eg*m5|6pp+A#2XF9JlitA1|kHOi$En>k1=D-%4JMM&aKEfZD ze`0A2+amXwVpBh?(-z$T7vmbEx@=GP5DVid>bV7lL$IU4vIKCjjd4H*NZNFIUQ=sQ z!u0BK5$RX~KAfH2-|UCyvagvWYF{s0tCK6apySv#a=qT9SycAHjR62sJ*T%rp&;<w zhG+DnN$rVc?lE<;ZQG3kZUM!J^&W3<?4T|wJHM%1H4ev5eW}yp9po2)>WT7!TzN4s zBpiT4lTFvk@#p}@%?|zZkLP|KCclGeJpqcgRWlaK<B9BM`#t-Q+)FPG+Yk0MSkrkN z?qO1sTu`W2ylSDYwqWM^czzy3CAb{{tAKu!LtCX#3mCMasLKoL>ZnG|C17rB{Kzap z5U3IkVu~8ZpvDn;L?UQ@M~0L7v9;r{2Nw!Puz&DV8=5Q{V&fH8E6#KT341Ye>Tbpm zVJS64)=UWcRSAy&)v9ydZ?i^y*WX(L+vZx~yIT;Q^!=F;XR1w=^W%_E(01!NCL!|= zK}`lZV3pTNgJQNOW~`X=)GOl;`Ulrtz8?M#cR6)k7FpC?a8>@qWbtecGb^3q_=Z@h zaRYD?X_;${F&yJTzK?BfsL5wZi~v-&WpWN(bavzIAPMZfTd2$P#6at6fHg7>O)b*y zXvtn|7LUozKtKl~0G*dOHa_WGTw$6OXaDO=rt*>Z$2%l-2eX@(?Q{kVPXteqU+6|p z6v6hdaPZ$C5bhV}`5erS(J$~ri-B7I^=s^FRfu=6cI~K(t=1JGQ8jDA2SHy}et6aK zZTV3(@^2S5EkRr#X`!`?YHN?{;C~f#vFTHL7tX4_RAR9Maq{}NGi(G-wg5ngaJ4f3 ze+F=H!B3QdesaY(#UvNztj!&kciLmFUR|JaP`qILQKNM9sq`Ho9-I55hH8etXxs15 zpLl5|z`1p3(Lmep_>mhI0@<{0XoQCRylLZguD9y|0JlQ4Ctkkb+6wl2xwgw@OxZTN zfnPACIK3p@8Sm21n>uXgD61ZYS8mghm$aAj`wL3|;4VCmokVB^_9J*5<>c6p>FeVt zxzR+r3O=j;Qafi5)PKoYLoF*G!Wy2~T!;EUPHOB=#L0?Hf~W4K^ajdLB5NxZ6c*Mh zVrTZrHE`B#UYMJEv@Qv+^=vqVE-EEc0eg24u$&VOsEk&KJ)v*)w?G7O7PZ9G)ctVp z@<*6Hxqy-4V)++&WT_3{x8oh4-~8vCR{pt5x8DGH=PVGtlpouL73;1-bK#bS&d$5X za1iX^nnd_ep;qC=&irz-=RgGaX*QVT?bumZ+j|<bsj>^WgAxz=<nl-00Mk7_>)`5o zNu$70N3)^)ZD<-AidgZ7=u5SB0@wNt#My#;nhflyZ)OY6zNOMLAtY^Hq$HIEnhzc8 z=^9|Zb{`qOLmt+|sqcyiVfm!`HY@*2rPsccHgZ}@^lda`=R58=*N=JtJaVkj#8b$H zmz=et=25O|E+MYgL0c9(lIjkjiAC$>pf)kFPmx*aqb4K3oiwhq>Zu+tBWXKyW#2-T zCtTYJI(S5})%3^d>}BWRyPt&^)bXT3cpli(3<LelBsR~K`jBS9-jgR!)_{O12)S*! zz5iS%7bU9N?aY2&L_nbRuI}r%z@M@b`uJ3w%1}K+GvsYvChZh;<z2~g>U&^g!f{C~ z>aF8=Q`|5(VD4)Smf6wj!{%OiK}wr7gMb95COd4YR2m~ig5GKwTuG14-!GZ<lmJ+y zd2zjX1_3tcN}w9yg8k4elJe6yq<)!iUqAl+&mIsDhq|J%-04>9*#~FrV-*&*BW>&K zo?2D+45<yla_!?^!7ArBKm&XyvuHGY7$BWH{T>wZFi@>z^@8p;@s(uev*a~YP{^}E z0A(f4{?iB1Q2l5+=c9>T->4h7Vx2*gkP=X_F;g-Olty!NtBe8gS8n;pe#H?Mze$mX zOH+Q?BtE^_W?9@dP<O`?ShgI8li&Rfg4An}*<tmT0$UAacX~EJo(+z6f};R;<1(5$ ztwH6PYbM6V<ISKg`jW0(U0r=Fix=1-m$b?T2M0~2l1;!VXt2#@)gYC5XsQAXiRPva z=;-MDIxLQ{upIb5?Y&o2Q)?S1j&cAGsCX1XRD@%pNl`#hN<a}%6zL#ch0p^kgq{RJ z#iJl9O~4R}^d>FQ(5xUt2t6c`Vu3(HXn{ZofqBFE{{Qu@HEU+g#avD<Sh)yE_Rik# z`#it)RA1}W9>fy5bu={gPQHABwj@-=jfR6lej4BIYp{f`YzN6=pH60|q0faBEi_Gb z6u@q<I8jfNlXY?&qX~=D+zcl8HaFA?_$_oSB(K73SuC4bWaL!PIV1u7$D0eU>;yDN zf1uqQP+W=@&MMgs_<WijYc*8$Dc$IlOapt*>k)OWf~!A3R+FNB)(a-XQELoj2pl<L z(b2ua#Em_)d1t2pZJUIXa+j^b-f&tsxvf^_FZg&WC0@guMfr3nxalwR%M_W1oOZ(v z@a$LtslRqm(u7&*$P*M45cmfDgMTBgU3A}L%lANA(a|7?OdBtG3ecirg|mp&9|?J> zSH-Tk@r%N|)Z-qAWqZZ0*Rux}@lkJPMPE<FfE27<g`@l+DPyI}jZyO;_Dj<I^5T$7 z@Pj_6XsAp0pJnCSTlrztVuhu#x4(fN5WG;$z3G5C_?b#Xw|=cqFMvqrg^~dnlI{Ib zxzQmrFEVA*1v62WdovK3-Ly~P+Wo#8)@|k0b!)|4{C(5Pyl;l7A}i-83*hwclgul! zS`H|_Dy2kn>mBQv92zFr>n?pLYFF-w&TkEOzX3gI-}$!1BG6$boJ$Gq(JnaOa*IXv zijUoOQ0NBOsIzz929X1`AK?xeB12#9vpYm&W1gia!3%R|PsO}<++Z1QYNi&k9n<F~ zFQACA-r&;)83egmu!{7n*RFYZ9Chja5<5xyt-jMcyH=?}t;P?;l}xXB*Il_)FSB&Q z1IOd641E2F|EgSz#@l-%QkV0VhfJQJh+(4zE);JHvSl|A?fFHw*Sb9JVcQ_qx%T8@ z*YY(lg-XjKmBpql>^UE5ffUzt{f?X0W0(tUU(!b9a`)_$AU3SAv*gMVrotx9SyCYM z3Z}pF?S7$!BhfQ8ULbBWY2(gVBn|zYD2O_Q{08zmrOhwj-B{;X`4hq5(mm!p0t82@ z_Q0@N)PMMQS?Y`5U?`S&;k2956zkeH4@;sG22bDTn7sdwA;=(YvNP@Ep%GucCUts~ zf6lKT7_X>aeI8MFOw5PV`&dC;rLQ-NaSL2TN$`L(6G?3<2Q99{pYYHY6mNS{bH$pk z#P8uTui`S(cx|NDq(h47&+exZqgTT&`em1WH)9T%*#?H*Ns6hoZuMkwmGoYOlk0i6 z2rzBvO0w+pM)E*KWqMvB{`WtFHS{$BMU3IY?A~{z$?TUecMu&up&Ym&ErxTSA!ZbN z2lNt-4Ou%(uw}=L^l&KYd2>70MpJk><D_GAbtIHoJyCoUZ80WZTmQ;oO!dq{CfHPZ z^jJ&8-x+UO@^=a}BCa}Z#{f68bGHpPOZeTJtM@w8@$ZhUcMC%^oxL9f=`Cd{(S5Eu zsib)1f6~0H!I_9@+tGn^c@&h*m%sKeGOAl4%sB;hjTay?Bf)IqWC5ge@hzjOv9Go^ zauz7ZO%W~Ng>9A5`6NrU?wMoJuT?t#7;QmBJF}^S>l`8~$gAd(9+iYmqu*fKPJjlq za6-Ah%rag0O2-lPPOFCHLB$_YvP{}c%X8&q9q9IHZJXY6xq~+#z`g~`GVw|s2_3X| zd|+nFodsjzFA@C9%bpC{(p@w3HxLNDLozbx(?|7UqiiLc{n!m%7+N%Zw9n^*nJhw! zS$92Ldzgm6(GG7KD6pIJ6kEHyAk~DNYTJ#FGV+Q{>yb#RS-6*CwgXsU`-pp}W)xJh zCFYt3ODnkrH@ysS9JR=~=9Rwo{N>)2I*|MH+F`65tU1Ctac_C@+3$*G-m7#KR0w68 zW&RES#n@AzyLwe>P$6LP<KJDWR%{a$J>q6_QHT1>kF-V3#Ak`pWOfQYH3Q1fyr%V~ z)~qvs`OSpyyVI0eB;s+P2Zr}^)16Rm^L$Oqlj=UVj~gwMz~0Cz`_{ccwU`L=a~s?k z7`@e=l+%9)O6Y-<o8#dBSnJg<JIcQ@oYf_-2zY16v}R>3&{C9>;hQ{Vb|efVl@+S? z813_95u-X1b8QXo&xSyWq|*Gkxw+a7?#>0O6-H#^&L}Or*?ow%7u*hbQU>Cu^1ho9 z5oh(YI{UsxfmQU7lUx=qDAT9KlF*?}%hN*B{WACEuX&m681ntt*=;pxqGD|9w09It zIF>b^P%ej1EIYkB2wHY+?Z3ZxM%Xc@`ejk;cN8sDbxf%v)ybRL2bOF6sW%osDt47= zrT^)ic68Zql3reYO<rBHp9c<nm;cWdMA%q*hj?f~;tz1>X_2qll6pZ)uY%(-fbLaH ztES?;l%fL`j~a9}*<(}L8N>q$0is4asmy?}>d@|FggZmu6C<K4Wx)ET>Gy8mMx9Cc z8(&V>)ZyW4tv}$)036p(eX+zcU+%P#oCOPp?2(Cn?fN<8&Z6b9Y~aY<W8Oc_G7cs6 z$^}}2P4IkA#(7tMZ07|(<x`W>gwm14LTU;yTV<v*egjJx*k5qp?_N>tst4{ptE?Bh zKGJ_GN#55GZCbwIw5;?|P33iBu4Cf%XJOoT6e~^qiQX7c@8)TxsKo_ZDG8A!1U6`f zo0*VwWs#eH#gNGQIS_g!b>s_lCD=a3s?TF8y#rULEI0!tnS9tAP2^X&)0>jFr$fgC zW2fpq3u~qTZbUcLo6?FxDW33?IwN{E%-k@Fa?WYQq~yv`1gSro@_M|gWuK}WzP`8c zqG5lyo|rr1aFs5DTSYIcDqccd7*QPdi9X2($1nK#qaH!_Ekbax&1sew=q>w&zuJ+^ zon<ZPWqH{MP{hXmT+@D3t|CrQ?vc7K_FLJ?8&Nzh)*AP&EAExav{+e730*8;=1E|q zQvxI+91wL6Z339Wk+tXh%4+AM>}6pz_dn)a09*@p!{>QVI>kOK#{&@%$AaPj?_KIV zS^b*G-AUvRpUJapxyI;MLmjr;zdC@e&wbs!4SIO&G~4)@-ToWujcTI)!(ZO58Q8JY zHt!X7BE)aZm$pWW9i*!jdygqe99{~y0O6)5QYpnDnaI@IIYj5z!Eghi(=eNH2O6w$ zjGqAAO`40DcOFB4IC{*Gy{E`(2;#4D$LigM1nr>j2h25<<Ywop7V484#I>epk5;De zE`j<emc9hr;~3*`PuSJU=%Qd|CWsJ(qoqs6E4Rz8#g(a-t$n1ErO08L=7{+!C%HZ! zozT6%Bf(4#a0zkil$*<v)#Q@Yc9)BebAk?rE(|9I?~A-Q%pZ2__vV_EC*S7d*~|=H zj!AQ>U=9@9ijJ?ro`)}xRAo~ul<Vw1SjoD=((ZjP)nMd%5|HovYHs4r%Ibxw@I1;W zD*|Ounuyrc#Dd^s_d8$q=h^K>wAaew>W?HFu&+A@nTB6*8n-|HH7JNc;#?6dQSvP% zX3SuFLUdQA;oQ7|e)MIwPFGx$39X;qz$sf>cR&w9(_6T!M3A98XpgbgB~hbRd6=|a zWefuVD&)-j$_qi6nr<ka)2G3yjdfx`2@Y1|@P4qS#ERZ;xx?-Iok41QFP0_WI<DOb z-RV{IL3f>NiL|y5$>@<2*S0{`Scv@Nn}HhhUfR&cbTWI`y}Hz~fM<zi!x~y=`uz}E zijOy4n2aD{b3YR<Iejp&k)y2<d0rw1eJ%dsus%`_TPqx(l<$kc|6n*l5uxA7ckR@& zyJgrLy2yG=nT><ndQFw*r+!XHy7dIW(oY>&zu{NeQa&B>WwLUu5%h!aU3DxsuOb)d zE}cg6I0M3Osct_+4gA80<`njfb^3>Wmio_kZ&;a57He1!w7$HG{9z$-<gv9kS|c_| zLygkGo~IU(@8a#l5KBlYb@!_T!;MwX#bng_vC4!=DX7FrLQ$EDtF?}F7{Pb+@BE76 z%gsJ4B`)}3l7h`ZJLPBiwul@6Wi9vCF8by+1j;;~hZ)JM)0G+cPq+XX2FWel&H1Sx z)*|iPjOJ8YP1!cripJeg1Em0b=ggo6JwL2O&8>b^*HI~eAbW^jM}CTi7>)=EL>ckK zTv|U?LWs-K{M{66!L0$HR=Dv3>|@`2#C&bEy>QZ5kn+mMSM@Q?r88d+ba^szOGi|i z1GR6aIh8|)+I>R36qr<Zuf6`8RE;{PBvZx@%~nscg1?Rf?K(Eh{b3L}2H|W`6IGv& zEkt<E^#-}XGCUm0m6C_ZI5Wd(j)n&3iDH2o#MmIZ%Eo}%(1hJ75L-;V!=3S6j+|;G z{6>iIX@qlYcuQB_+U86h@u8V5=rTy~hm(8=@2fK)k}Rh)BanMeEuSb)6v@_#$kL#t z=J_#lcQ%LBYNh>{776daA!qMhneK!E{Gmpww~h9Xk?=8eOK{q{+zn?R4_S*Lvs&Wt zdOv0(H9d*q9Vn+6tSx*dpm5~FR~4}V4Ff8yoY}V+=v1kAOpypWUy^UKQ<Qsq@|xhl zVwsJp+bzM&$esSe0=}e5+~`5`%fDDw7#(~;r@X-st+nmR9>mypJUqaePm7pbIE7Q^ z?9{^87grF2R#$AaFVvN$e6xb;QMkCQ`oyr+it85k-Vs^KjAN8Gq(?xR2Gy7`l`$A- z^AM&&AY=cb*tpB%niD2VUsPLWN*9&kh^Dh9Ma9H{+1KiH?|OiRtuJ^$(fG<Io6$0| zr|p^10z6}yww`#X<^&@BrtYS6-?Uu<t6}JGY*5W*Oj^A-f7M!s?IEGw*}eZJqQ3mr z7IMnQi+)^DI$GAyk7sW<B0TmqPyk205oV3dtSRkZ^Ma}?-ulq5aa}+=xbMs3xUZ2? zDkk{L^HPH&^`xUQh=CTu9<gzU219+>)S2JICyySQFQF$q3!>+Hc5D~w+TJC)o2t<X z7NoT+jbj0e@^PVGK4aY)Q(EQ*?m+^U(57R@YCrfP*i#~(-4P`I6@b|tI4SZqYu$!? z;A^}1s8(c6ueHt&<eSo?^6F112j7=Y$=zV~!C+)HiL%4bI_&H*2S$)V@jjOtsVyZ( z<Fh6fsGf`475F57|J@<L`S-uw<xcIwpSF58!yB?d+|rU8?&+~A(EAgf*TXc5GvVBO zUq;!?uM(+19^1c5mt^6#K6cIhh5`UbEeTG5<BTdG2oD--%>g_%HJwi!f-h;c2ZveR zsb$f5>hwlBw~6}1Wr2KWqnYp%3{Rx*eNS?s7G;n%><5aaUDAt`*~yfQW>nqIcKsG! zs74wZ(GNq^4q(?8NYi(QlnnP=Ps?oW)UBPU&pzQ|rvtBPWq9>%fF>6_c!kx%+P3mV z8Um{2w?jiio!MDLHCt1dLi}D%qV_JNownhQVK4&mfH~TlmwMV)8r`{W=WthD<F-ZS z@)pRmqfp6klS4Ev)kp4m<1YS3;Z9&CaRk-8VjV=cC>0vmJ_g_|qQ>nn;(uU48epd| zqyH`#A-NY|Pg^b4#I(KJt<-aTgaS0&S3HF7U?L|o+f=(nC%uFJbeOlfchx#~8Vne` zN?^VPU=(PQfzSMa`2+{t#TQB&<z5F-NhR+$(!=1;9>R@hsrDELiKQqu+2>P1X^==+ z2?Gqey5Lu4&~ODe;(<?PpBV|&5FICjZUKEoQq@_)UC9i$e3}TPO$FJ131!2%twGas zg`nMk*f$_9Y2O>!R#F8x;ho8y{V=x}m(J`8?jP3gM{>sa@DB*?1&^gCEr0$jBRUe! z+K)59o`0F(1kj|Ng~$2)wQ=cLD4WhRAxH3Yg#;f#7o?GB;X#S_%^<d*c$r+9_%$p( zi%zw>cUCCA0io9mL)7o)TVvzzM^eundLt>Ds{tLLP4yP!X&K~t$Pc#Hi;kD_N+D~l z`=A46gsp~X2#mIxxVDzh#Hwu}6vz1nY5pf44Iuj~oc2fg8;0dP2a?{4$tN4s2TfSC zW)IDgp~6Stxb;)Zc=z~ZIpE-{)rGZLf|-}=&J!daEyR1kHQr|iQCmS%_OYNeke?|W z;{3)$&~};=R!fnXsS&tS93Sf>Knn76v{DV8R|y8HSIszUOOUu%3$(HI-#gY)tuZq# zgWO>`k3~?0Mmo<sq}m@KY-eI2`LVSllkS6gKSYSOr*wmRDgyOpyb$ZT-Zk&T9k6J{ zsp<HvF5zAcI`Re>3-zNn73@NYp!i57);gY1b%hW)AiQ2<2=HC2EZv~ct1fO5^Yts* z&ZZTOk7mvljhydzO~p&}J^_0H{}JW2__Jk5>s0@Coo6qE`~0E4z9pwOZzl+<CnYCa zx&#IG-KFHM)VDH2_naDRuQu*g(%vzAP$$AxfnjTk(8^8mNcQdr+0EIzy@$Y0q{dz$ zTsiQEO7c)wdVdAvSkSZjYeQ!3PkD&m4)MpNj<J9~<X1XYEuS}+(eK~6doK+aU3a-1 zQMYZfp18h_-uY$-=H|QrJBQ`N%iyj@l_J7LK~m9$V<}eB0W~|nRe+}Ocxq9tiC*5- z3%m9fedq_H@KU@-qB?)G2ueRaHrE^#Pjv9}0q@&H4+Q%+rm7wyNUQ@2)7Vd0u+9x! z98Q?dm-gBP>}qUzaeEXJfW_w!YoYy#?LmxRBDJ>Z-u5bbHn1`>Y<44TbqfWLu4Q7S z8}?zCkpR;JFbKeL513~x<JDfs9KYtoqOkSCW-cZBS;8F+shx{McQDLgDi=s5js57a z27+|t`?d~>?1SA}U}850q(+o-W9aciYv=5(%Ev_X4%V-&2FXi&-T0ki*>~6Q;A?!z z$p^s0S!Af9w5PlZ(s?A2uV4VE`4hR>!>^HWFfBVheZQTpe4qmPKK!)rvUTol5V+_! zRI>fS!Alh*8&-^4&*(>6)TvD^nOh5}K&JzDR>G<UXg!KH8Ip@g@rcgcK_B3LN>Y<r zGnhJe3En#%DEZ!A=j0!^|6Ovc_k2cs4lrYbwmCZd<_GGwh)3*pMhq;!2Xc-6S`7p4 zIsU&{n=XKM4wF789#jVj`Ok-$hKq(g5{|URmifxnc*oygjz3?Xtm0IAyvtQaTKe)4 z)cV4FAPO8PpJ0dtewqGly{UW<wCCgyI^~6=uJmu9yxA!n_cr8F?Vpx8`kAhX<w3#I z2l{gd%~G4A0ED{)A1aduXKHNXiIn>8&*I>2&20tI+S=!U2*g?KS6^3)v3Tc-mVm&d zDBkv^@xWkgoK^hZ`NQ>VkLa3;9z`OhYGoqZTm_n6H(CI(K56i^Y_3%>zW*3@?(sD! zo47GxYk6kWkzxNCu#E>%#?cJfgP~!-=sf-YeK24FBP2tt(O^sc71vAyu%1|Rbz8-o z)|*YD0wLS@xMFM;XM;OuTpEIp7g#P5FxTnE7|NQDP~Y4%=68%2@C8Mg0CZ86$uI)k z-8EAm*_!h{6V%|=T_?Voz}G6Q<DRzVJd;JP{!QlNJKY7jbAXvR2sQ~pas55!0;k?i z@dbFf-l2D*fHiX77ta@5230zEjDSJCW&ne-su~knKOEY5R1XLfBDB!rH%d^PmxqGh z{>|q{A_fe09S9)U-(aU$LcsFuj{%xJ3qe&4MbCW$_T&+zRY;h)jPB=_>`!#IQ;GpD zF*%u*^J|^+_|8dzZ~Om6gCDitmbw4o*k8rec#G<ms*|z#E=*P1kkC-ANH9RLueP{K zDr{~Pot}0M2U1k(6a7<VJ_|j5SxGzy<pcv-LN#CyBN?*hYx?YZ`01$xc`-Kq)tO6f zGuw=g;Q1ydfoH<zAkX66yy9gL6WF2khM^R3Ynv<dE)XVZstOuOFMWC*hsz%iRIy#< zt33a>z5j-Mtk{hzxh)b*uF!=E52#hV1ZHu!)CaET`T#F?9$~jYp&syKgQWtX$iVtj zwSgZD#wiXnxGdq=^JZJ5*}L_r39#j4KF{=9YBH6;aqxu`bS!WGNe8X;>J`UlHG_}V zoLeSwy`2p~_%p*fq}MJ3b#wc&E$8xD0%&{3M5=3pV5t!>k;Y07oJKp|dFo-Drs!TS zv${4XK)WX^xB$POn$th#lwFTaL12bsqFjd_aZO5O{6{KwV|P2_j%ro&&?Pd|kgU+1 zoRz*iP!>08tyQUSk~v&I;SI+d5?+j`<-?dnC1u7-Vh-sR%Zci5N_ApQujfxt#$1{` zndYcpG(y#rUKTqiEBIL{W)cM0)>p`;0QJoCbl^}^1uzOI-0zke9{2MIU3;f_hzTON zTj*2Nz|quj_p+Zrd3&YZP95^3K{YTltjV9pJ4d0XjY!sT267gk`W291va7l-R6;qf ztDKVs^MvU|6PtJmkbDTAE9j9mH8mYj^42Z=E|wzIp9H<;el@|Tn8gBDQi6}3rmij} zqPpoaK`)vexcX!|Fo(|}GHP#pi1R}+iUIYq6f7?<pVeIqr=Mt@A?NY}38b)85ZtJf z)6Z6Z!Y*LPH;0d=l13ZUkVjC7pNnd0YL@1*8Z;XoXfS|sSf}PPql_7x?77YWW<rn@ z?jdE^igG8^(i+^me9uL)!Wy?uBACO1!NwR)pQ&8Q)bz>fCIvRu`-f{gaal2XQ(w+u zcX(jRR_qhm4}t+4+LA<xEL9mn&Mx7b)6O%-srJt=!&!KP(K_0k1NQ@@uKXvp`DvXu z)r@INEg019@$qqQ^jntsQgpqUhqcjryukX6cIolh;#rrTli$91>UK36zoUkPZ=PC` zI_zAerdzLX5!EHKmz6%TIhwKTPVwF_(Bi~G>o~Pi)%J@7^e+7P5|t>T*xB-kE!9Dp zq!6*h2KDu*sRorUpK5L-_?KkziWS-8woZ1ndCQ1jU)Y=Fc^I+UHgQac9lmy`Ia%KA zI~U8Kk+7N+8oQ~eDK~x<P82@TID&yLEH4oTT1a8+YAVZQ@=0YKwz|1Ww>$?lo^qFH zcGVfQ;e5Mrm!i(P57qIMnlV!{Y<L&bHrhk=)0|=RWO92GbBw@tkVG90;L@)<pqE=c z#GAdT$I7X{+*o7=(p~Rqy+wUYw0p|agtAp_8p(`mT<vE_4q-QWv^H@TDM_lvn~Y#P zomSp@^k<~NB4OyR0m{9X9T;}aY;)_z?lD^zGG&WJr>&b*sR<{Fv!^$M)b@scxJl@V z{t{Odg+le_i=kDbyX4&tKuIT~^C~V&Idx6;bC(`_RFi+!jRy81l{6!MX5{e>1{nH_ zbWvW4Zy!$GB{>y5W3ZlT@UWKkMJ<ak9*>M9EVSb-PLr{(a5704!|3(Z_r`U28Z%jg z?c;QddV(6}Nxja35)F_L)P|;{il5|d)`zO$nC7$X*iWQ$(XW<XU>{T_ScnFt6;=?@ z?pT~g$u*>OP1poOf~sbZZuMk#VX_yu=R?2F9;*xqL$wb%v7qq;GUpZsO=0^JYhVf+ zO?%35*x*r(EHtCH_1_EUFVwxi8hc7#w937Ka<4x3-j;ZDJ^GB89Op^;^&5lkglM-~ zDTv9WEid{@H8rqPSiUnT1afL`<NGrk7qqF`wNjmtu=ZB7UQU^ATZ~aYStI7zMR0YP z)yQ3Ts1u9EEM$^KdHUpEMTtBoNe^O^K+5&lQZz^R2i4DgPiJ+=e%f%DFNX}z+(rJ? zc<E3usH^ng0l}54zs^>VB6F@&PyUKfkJ=atTV&aP!9_C#nJWi23$FHZYH8H`^}Dy$ zb*Yimxklyq(J2FAZBQ8*{S9W<Tgs~+?OO!#J^lC2YR#uzbw3+w&@%{1?0x2!bzhq0 zfcXfeHAnaq%NpuPWk}-ar;{3(UGy`KzHidNBzAzI-v!1eD|(Lbbq-%gP)i|#$&Y<^ zzp0}*1i*KqHdq({0*@+GGhI=<<vhEX77Yf2N8DVu1e*b1*Y}xg`pGm@nKXl5!EM(P zf9_@IXOwkx@~$`**v%7cUVH~AMV?*Ph6>?|dUI-{8xqL9@7pYJvUVL!HH(L5f-W|p zFVr66$?XM^au@s_3+w7dE_y`_G%G{G={=*)=fGwRKI{z1b)R`Z@3(^CpM}TY0pp&c z#q=`Ag<6UZxhb6!@$(<)vHjmbfc;_fFEj#nBEMqPpL-e{V}$N-$y8J2wx3`S!^Tn# zWd_))U!<Qt@UL!TkK60%TVE<XS|L0SsXrsnTe-zdT9BVp_{{!B^^@nr>&RN86t|1{ zF+k>(eW$lX?6dc=`zPlQQ9ZOdx#L@uf-UT%cB=&d)OLo*cK~UiB;fog_@`*^56NMi z+$+ToA3nUGbQ!Wf|H%q}^`1%Z=_$dKkVsTpNu>{C#9V<ke7*?w7P$ZBr)t5B$on?0 zATG7kQOi+R-uHKGN&x6qfzPSYDr*)90YF0tW)>k8Eq+8)o6cz35gYPl|M&*xg&o9< zjBLC~I4COp4paeCg7CLr2FEUxD$Plb&A?vNba*xD`1*AEv$Gu8G0?0eXcTg+ln6lu z6dj?BY@ea}1Uml;>RrJNV>LM|ds?f=q^4RL!&GmsIx=wMz$SjEIn9B^^|Wrs)2Qd! z>$XE1Dpz`$Hj^<??l?8|+qjSIMGkPasHc@SGLV3EZ4!))Y}BI4Yg>+bajU-((PZD? z5vvsu_6GUa_f`1UFsU8}3%9ylYTg^>F&RUVqURf9D#2XPfyB9k7x#@Q?v(#m#`03* zf=WooIvAC(t8kh>j>_t>ZCK_)rY`ek)9TI>sU1Feeg^0?jGZFYGwsRT<PR>Hs0hS5 z3~f=dn!!X>Ixt}UdBW~IPKbJ^Fwq!ez-+Yn8YXy}v_b=QYzpw@6yj*K5w`0^J^pWz zh+=#+Wm@CN+`vyDAxlHYxEF=}JnYl&y7AqbJp-h|eYH<npssoC#O_=l*yQV00#Rsg z-H6cb4YdSpgGLje@&~2c5skG@-E?g6B}w%)u`T9Yf<6C9TxYvPSU{=T(u`z)r4%AV ztx#~<l&^e!aISbos#L6Pc)h07e(b(4X04xvkWr3336R(6&3u<vh}*;xV)rnzwgZ;} z1eIq}i$?XdQGtA&=4$zd&-oX4FyY5j@kCN=bKEvjtw(X!$w6|HiyL;0SXhBTJ{<+- zI!nV<^U)zQxi&7*OTA{F3JAEzjF69bZjZK2hWhEXz>c73LnouVRjAq3mUr-O#}%2i zzb|ZZ1wdHsQgQvvosHQXh;b!BLi)&&YoONf4%FmsYmi0+Q6Y7#hfkk_h$VSd&)fg% zoc``itUZ4t^lt=+cB)tDyui@@^{KX)esDNTtX@3rhj+}l!##08wyW({eNt`<v285d z_L<)4Bia`Cqpr(`OgTNrZ6CqHTom23GgfF%)LRY!W*ta!LUZ#1CvW}5Uosvb&%UX+ z2osSFY`8aiaUyVx&de&u=xwy)`K8VGS>hGZ!}Lg@3Qt5?_r$Mem5ry8h@rBvfU%(` zeLjy6K__F&$D5c}cyC|N`0v~u#}_&HUj7h2<J*oOeq)pq7u6}pXagY?(&mGSZAn9^ z4W3T1_!6RUei*O_zCCOArZk)PdIdNxLB~wH8fzZof&!8mV?TMQN4M$i%jXXfBJ56C z+^YpxpE^S2U&;pjBK0?3{ua9F3`=%@<;lIb-3GYa#FL9eU?$Sz8|^0ygB2#}w5Rai zyc?DHGAn^zpHs4sn6n57(G@aE_}OSUpV{S9iLFGA*AQX6`2x?2f?1h-Jq1tG=-*ZC zgzR@POwjU}rVkJ(^n;@~&KNkBtiRXXR!XK)Lt_8+vQH2G(Z~W<f5x?u0Tfm#_DAra zj_<Xva7U7Js(AyuqSeK$8Yr0fy<VK^&9!Q)EPB?_bc<Ec;aM~eVoB?|Wl1g%OX9eZ z1!&?RZ<>24iFpN07-;v^9C_v0fClO8FLL4saDIliMxBb+vzb_9?ZDxlVfnS^1=&^d zYs(?UE<=Xzw!c9mgSrO6@6v)A-vY$d`q={u<EZ1Ei-t>_ise8<cBET!?&iPOlP%<J z@r?&-24_UIRujdSJ%^`-s?;DeVF<TSUnfzo>Fu_R+{;obQP=K02DSPL1<RbPG>iqZ zCyy_2vDsXR&z%0LuWnWB@}-h!z$^x74-nPx3m*=M#VQ#!+@0uL;sv4tYy_;OYDH~I zTied(?$jyAZI|;Wloimc*p+x^;e7Eu>=#45+o56WglZIzVU^`qHA{@1Yt{j(4v^z# z$?#nUEV#Cx<fGmga3<hK>Ssl=REuXrt8lTYlpKm}BK98*vm{EtEBE_!dQdA#dx%4; zYMk|7-{Y5p4DERh%a%HhDQ}N<LV{FDzMv5Fd@xUBqhIt|NN~DPqzP9eyP?YSbN3Hu zs6kxTTfVrs<+O%Ie(#;W%M)d20MGRSfawrHANV~Zpm@+BXibu9Jk27onrqR~)eg3S zh;>F+>KRORv=jIBpawx3bQRZg*x@HVJw1~+3hH~+f$U1YsSna{x^-8!g|oxZ=g${^ z!J92}z=n`cZw4~Ew%Xbhx-J9)VZKaWpk8B)n(MK|#l>|d2PLQ*P9w9#T8T;@X;uRz zBdcDOX|U9)^y_f>at%o<?IzYRAoQu<7os5*qX(@&Ry`FnGS7WG_?lgbNF8J@%u=gH zi=|s%l}W%>pj{aT?cNHo@G<RX(1*3L)^;W@5J=H^o6q@9r5>}YW;O-XC>$0o!3M7N z@;NlZ!u`_k-9sr|t5aGh&9$N$Ov4<*27a5EMTB+!Hi?dUGXDF)WnIfa#7uA?Vo?GJ z&z3fILcoaX`!?Z#QW>gL;gg!6)&OY;hs`;ug?@-4<rIQ=)Sw!4uypgw!otFmK^@hJ zdzonI{@S!|XEh**+rnyH?t4D&F5VU$*fL!C9a<AruF4IoT4THe@o0s(&y+hkB*~d{ z*XCJ~L!JHI>zzB634^eW%23cu{S3Abav<ijoLnBkbOxOSjY_ZS8cKJS<F8%4`kHnr zAiRZ_hIqORD?QY_QNfuiNIpnC5BD9CEw|ppU@fwsDw4fS+BJ2mi*%}60PoN87XJdI zjf(?<xjI;LkdgAvkrrG-f^8_T66d{{EmJWYXBVLbzbIIAbp|DSmx>RH=HZBw9r}`l zts#!CfB~EhKCsPejon6wZ??yEQu*jq{dp;yu--DU6K=P+8L3aF`-|ODmU}&J_{_{u zz!g4d@8^VZ5&fuq;7~#2mY%dabN;VWjbFFqwYs4IXtB!5=@J!a&Xvm+x}DZ#CLmS0 z3PB8FLfi!$mz=d5CEw5dy@fr5z8A3!rTUG+dIYTYbN{}Kb8ZDLOFwBvItbhnFFZSf z3?7jihH(VE#Ygx~5CNGU#qV@mD<^XxirG!vZWO%gGBSwrevb6I7bx{79kt9C<ODS@ z4=vTifK|C;b7OAv8YAF3Vq!Fm3j6U_EZImNs59RS^nF<eLV0}FjvZP!P={%8E#ev9 z9s>KuQT!MMy#(=v0l{xClhnNgCLKHoH%`Y|1ZFpA`pI^k0E&yCgO6-=MC;%!lXXSm zow}w2CLcjk!a+eOn1OMecm6Iwz>@rcTRlmjYSPw&0N*)&cl5ohF&{L!A%HeSK~k;K z_`0M1K(}G{rijz2J!0t%5B*)=-u^q)D%JEgDXC!#J}X*Tt(Zn@B>#m7LhHhnrDbF+ zH1E{$M(H)k!##|w>MDe42>*@4`F=?L!^(3@#>;<d^na>%=D&F0z*e!se_C>SYft1q zwes9Tu=r1N+qSkD{?q^c8&BDK#4P+rJ`JS5AM3z>9MIZ&pI8W-j}Du^00LHU`$-(w z;ErwPtb;$hiQrW?uv-G{k{WTyYVLDC>1;5I?>Qg*+=aI{`JnGI$`=O8d7MNxqqx+u zhd$Qf{Bu+bB!*t#e0Km5-KV;j48HPsX&C3JtEURERD<q8WZ7#LTD9(L?Rpdg1-K&V zE#UDWAMaEAf&hk_j`Hf3Ea4G}i={`S7x|7(4SoGr=_sHw;@jW+&Lt21=rxnwmHgs2 zm_4)O#J~t{40#BYB_OiH>Z9ulKz57Ukw+TRK(3X7Q!5g2&{uWQ*izwN<>uNi`*PL@ zC?F3qV6;=<<M(fUJOsp%WO;dcy*{mER0H^}dH)x}*2tB{u?J=o6fj?d5Af8-{Qmk} zt6!T4l$Hm#8CA0Ia7Ld7eGX_rVKX$aJT9T$_n&LWBxtF6wCFeKE`RC+DpvOnar3o2 zbDD(p?Jxjc`<*ilSD1RG=-<zu2TuT`Q+Z^D`~wYezWpb+G@UKV*B3!4Qw+5fbcXR& z(B>~dA!Uv~HBYdXqX9V8ye`yWq@^PEDYRATWh2lM)h8}0Srw`Tb_B>8;bQb`_bl@@ z*yMhF(Dtp=e<Oi#gW?GdC4!?H^5uW&)-~exTcwwE{{z0m-b{Ykg_zAtIFc1sJ`Z+N zDf5ZGyDBWl4^GhU-p%tL#ggQn#y$Sy_PuvMfEqhnvc9qm<th}&<ERZaKS_sea}`4W zIlf&$_+J=#+imd45BltIqW0(hf6%i3n@hn}{bk}wQFhSqo4-{BUml8iV`n%y^~&mj z_ef*OA(7>bfF(~LF^iAoOSaz&SV_97`<@$eEQ`~kXOO^!bpq`1U|dH|@8AU;2^A#0 zw74kgT6OQ_el7pBh2q$2VWCmHB$RsEAlw8iOB{}&JLEf7j2`5T0Uk)jtjh=G6K_$P zqkXG&lqB+g-FE}Br-;Tx)UP`%<$x+a+E0(c0a<a{ll`yTqgozs*co`px)>T1>$>nN z5m3SBHJqilUvIcm)Urr8B@2hS16{$aiLPUmYHg2RwzUwW4r{K91EEd|`sRK2Br3Z~ zFs_Y<jA+Hz9mPg^u=b5_c-5D=w(X@9)12X&5^Uj0Ee)>kkMbE)(8i=YF5kIT4<WOH zM_(@||I?fx<5@{5ml4bwn+jg%e8S4mo)TiR``3Q=Mp0s%g<}ueVz%_a#m}GrmE`g4 znlkMifFwOz%36Pd;$gB6WWF9GWW9X(R!duZD542m-lu%dnVOj$nnUw5cnYa<rVLM( zj3IKp52Q{O^C~e*S)*p~K>jy519NOe*QE>v$HX)(oE?J1aC@6-bUCg48cfa%(iND% zew~4}d)FftCt>#L7S2Qm!qmg+V)`7;HqeHf?hUhs_i@|!c%)xWpx)3Jh2i{=;+>8$ zo3qAxGmjETn!(YjU(~N~t*C8B0$e80`*eHhuW~OF2JT3v7)bI?zW^&frPz5B;Hgvk zS)o_co!SpnmJcal*M}wabkZYt2RFzDQtb;d-7--#L~0Fon${cjxm#U;9{;b{pCfiL zjWzZ2+hqS2*TMBDzsQZFt>2y)p?;J@L2A#j=HbEDq;(;G_Zx#E0_#!AXY-?0NleaB zmLJEyS9^((8&x*zEH1mg!1_!{7_&sWaCA9Qs{#+)SpWmHn9vs$9gcA>qQxg=)gSS1 zbgqh%K^|fRv*L6|7MH&T`M{(GiH6m+Lk(YJP9rg;75KHVnK5HR$08Nd=<!)3vTVnV zGXYXLV=Gx@6qJ0UEHCWMxRZ2D?v)hmJ*IJk$C$R(7xq0vN#4d#^mM~a^i-q=27rv+ z(a^6s2?M(;N4%*ml$so3&gODcR{@6?J$0tljcSk(fTYTAaFh)N8%D8*TfgCR^wz@# zyRr@B8;-E?qvA%*|1RjK-Db!_>79{$AhI*+gGY>GO`wqA3<AC&EtWVHHz1-LdNX?h zmn7eX*`>A0oS_la`iaGBj$b_91{l;zjXJA)1Y6XwpI17LhG{{J@|cqxUT?)L#5cuF zVa$6mE)X*QSGlcpi~+1u_*8utBKC99j4qV+Wbg{SkNpj+SAe*Ms$S{r(^$l!$J(2R z-N|7;IB;w3jL?{SnKRbIRK-f3qM&UVc!&clxXe8l-SW8MN>@f#?zip?QWbts`8|zv zOft4|@o)}8-GJSGvySDebBkNjP20VIQE1_<;kERtwhf5<yRii9&+RqI6+bm~w5m*O ztzza&MSA73(i3sH-$Lu3JwCT>SAhuRKG|%7FG=;A(8@1p&p*c<i5e9#yv00r=<H*m zOHB?^%aw7eKWPiFUZ49DLLU=hzsj~xkg?gMmKY=aR7?%e>V9x>jX<i0Pk<Dq1?e); zkQUV7FZE)?f&AXn-p&Vg)xR?!8{NaDa<Tr&kn8CN;sD2CWJ`H1%~^-?;XHE9_li;N z<e@X=B--uPrfbQc9M%@TKQ}O~XkHD0yXy&BsqYK~ilH8br$-F3cDs9}2+KKvc>hHp ziG6tPh1cc=uLGcl9}E0JhOSC#k?*NIzVyLtBpP_yFZivMtT-Kf>$|x9j4EoeLt%O| z(miUr@cTB>|Az$D3X)QP0Q1G}!qO;OWkL=qO0ogu;#7&er}Df16CD8T*l(WUH=bi@ z$kS4-26JefU1BzQD*zdrZJcYddfW(dF#0zEW@pPWGI1t0vEjh~k^n%)&{ttUK^3?I zAcheOw-nuq5XA^Z-61g7J#*>sjra%|{fJYz%G7BPVb$MltUW&pkhG77FY`D33gDg9 zFH7$}huw9R{e2(_ggKuAI{+|uAr!xi{I_Le>GM9z-@D(2vAT5lpV?Va?bBY%4n7hP zLPp3nLlQRWj;*4Fqf;3n30M;Fz)J&45^&-#k2GRYW~Qd*vI2XI&iso~{{x&U#{n7; zd{uOm@}N#Fw!N(_%Uv<!@&`N!NquORu_YD#sU?crj)_bu7RXTnyS;8T2Be0)>JE@9 z<jwH;(8AJjQ>RHHM%End(i{a>v`C7{nGkdrm5A`ybPqJ7ytbxVWE$=qxQy){i(y$r zoEQUQ-a{YMWHxmbE=g}&%MW#3WAy;m`cQkBuiKKRP4(yQbGkZEYIZTHmO5s+ksyfD zryqFS6`T?dCUjWQJ;L1W$05nElK~l{uE3_R+Q@wTN^hy)aa_l(_BXy``XEEiPuhsL zwFFGr;(doq$Wv3kcj*JAIYPI;_y{ORREVAL6<P(Mtm*0efb?{b45A#~Cse999I%vA z6Uoymk=lS<Dc_yi3r16?rZ;RFu8zmo2aZPkN?JlSSjf)r$J{(jO+YS^C*m)BP=mHs zUavWtsT1sO2JiMB_$SUobhcX_ogmR<f7=)MQGSr=oWKjv&9$r0lkHRMX(Jm*-P_|v zFEuYiKz=^Z{09CSUf1RX{ysmh`LnJa+-NZB*yNd4p9r>X?~IpznQIRR(E<f{_qLXN zOpj`EMp2vAB|eUKB0*gC8h;Sicj}e$+$WI)0lRsJ51uHOO~4yxMvKL$xDXnDK0evE z>5029dGmvp9gSa00z=60)hdYr`C6DpSR?$TzdFd+fJY3pO7z%}6grU%?dxe>^LDY7 z8RSmU;WgH?t)pSuJF5Mh6SmTeoT+Iqf+{l{kX&m;2GA$(EIf;8K>oK8<qCBGO9P(b zv@rBdGDaCxNh8w%V7_Sb{XU8A9}|kK?|fwf@vJ!2=UnWD(H5)wK<O+Ow4Ffe$lLcg zXo4-B1<K$n1Se5_A3-Bz?X2K><&T<N>(PNS!!Jl%dykBf9@sm{VQb-+LNf^V&n=Jy z|1D@DZMfx$g}-|9&Ycbud=>Svh<xTL2qfnf7$)WHwtURur0CQztOuyiy&9`tilzDm zQ0)-yW$3AdcmQd<CSG=5QKO4~4(86hmTgO%3l6<?>!>a&kZzB8Z*SAu0+}kV(p2Hv zLZdChJ-r%P<A>d!)^^M2T2dn~(1P_67%_bnjK2hyFZ}1AtbBNfm3<lN190nLJ2tLA z?4z0n&AI3qal1+%=|^BsC8KTaL&Nz*3D-oSH!*Ba_lLjbY$owCnxY>S1MI2ADKi|P z40&ktVjbk&`Tfzhyn!Eys<PrPFkwKw<mV(2yUZ)sW{ei@K<N)Hn58L?0RP_frY@<R zdIWQ#99F@KrMSC0LPC}gyQgaqW!7#Ej$Sbgok|cdm^Bet64~my6fcr>(}ffvz9&2H zv!u@>N3X3yBxyE1a~ZAcP(=&q&PljM9?fOfamO@%Yr7k0#rSTJ*k+*}D#!E)$=?k# z;%>HZ1u=t}aL~Y7J${lTKgWGLurS0FSKxj0Ibyi-Jw!9k86=tSESwx^l=zX{4kQr| z`^Njvku;13?c?Hpb-rkrvD_6_#3rfOBCB#f5p0Iu8B<3g)%$l2wG7<wmP~bg)=ZVv z6Ic@7Y8oYe*1;t%K6Yz5d92&VLum(DX{<dzPP;OQV<%9aeZ#^{@vKkgebIb<zU_f* z>jnnTli{-epcfe>iI-#r=AE980#->=b$nR4q=09z1IJlwvF6D+<zPM7W`7YkV}EK| z!gsDE>S9V6)4VfsFN%f*?0FYI1Y*!Y5H={YJ-zT%_|E->*r2(>5a;qlA9TF%-!FrB zDFl85L2u1jN8%5t(y#A-Z<vX18V6w2x#!Q0ZI6G-zl{Z)7vnRP_GCzv*qXkotxMeA zigr&uxyKX7Jn36d@%OHx0=Tt+RZ86FsA~mb>Mq!dVnKcTY0wgYjSK0+$2^6TwUm4d z@f7V$)&JNOWK0+-8JQWdLv%-5rZKmNUCgeezXdZSw61f&-u3VuHzSTI+2ruvg-fKo zp;zJg-cy7@^5!-Z*e9QywM2Z=tl-8Psr6ysw|l*7|HNI@ewnGyTj~d_TyTIthBAt_ z87FKC<ROZfflP-KnQZMH_N}(_l<rmvQuhcmLBK*+!B5ZEX2f&b`*$(B)s3ZTyP1c$ zy~eyt0j&p_vIYukHJ>^K{Ac*?8vg(<uir0PYW-{?wZWaq?)xni<7oigM;}je*4I;{ z9{wPAPt7r#oh^VqKpX`pXPpT+SZ#Ur>U|#{<>;0mKRxQ*Tm3-1iVvQ-Q-P?bBJE_e zJ(l@_mYPYC|C&E1ZJQ-kuAll9>}mUag>kVrD*cQ{Iii%Aho^XsRjsoqw9`mVlsfYe z5l6n(ear-BJZOh<Ne0#Ud?2LDlcf%JJbkJ(+GRbmk}N^BG)evffXRp5>L$td7Lk}; z&AJKPFy}#Sr6`ruGafp$-LNas?l4EL=E=t7_IBVa6`()jJD_6^vf}BhE+?a>L0jwZ zwWye4PByA6vFz*+`&1w3l!fN=DjJcev%Eu{+VZT!hJQZ@&QdClj7fj~4h)?Db&cvr zClgxTRolU8a?D6ySWc6iCHG|mOev~@miA9!;??Lb-2PwGZy;dqkU6J{4;6CHFc>yV zcqsWF_5=J?Uz25<wi0$G8(j=#oP*x?lL%WLxh~{kX*lle(90RvodqyKGUW|6#X5Q@ zj6W5rzQqyIxb{nS^W{eM3b7HUn{8dZZ3ip#?vVw?ujCYW8`IWZ-bJtlkbYM<;mzkL zhDZHFMnXe!L!NX$006Jwp#~mo=@q-$9R=dUKh|Y%m`C&+EP6TX3$DM1gE9cyZcyp* zy|=e_smU|tsbzy3YBw09hX_5iLO(p~5rAdldo5|ZF=?2tah<4HK)3D$PzV^Yx$A@g zT+8zLcPmgQ0wLO-k;$MBvO-9$v-^7<<Ild4-6iodi2Vy4M8>Hdm$+^xB?}^cw_scW z0l`k6iI#=7LwSE_t$=p|ox8TLW*t0ZhrqWp|3XeT1g6s?7~L18U(~n^-gC%;8|P_H zirhM$D<&|Q$B&f<sFG1wb|c>QERZHfNcwh#KhK4@3@R{y?)ar^NY|O^kh`Gu`VAuT zgO@U^T43U`kXJw{J+Wo|Kb0FQR<Y}k0i|8}h1=?TUI{-V*ZbK<3`h%^1AV{Lkq@@= z<F!!2$Aa#OU9YrCB-LDBZlL%))O;QJeG3C!i-YT7{$8u-i4CgxQ0JZfRPa!4rR~At z%CdWs+j14RbXf<iXhe+o2|Fght@7?GgEki6e7kvyxqjH~Z$ECmNdxjdFj-!zyPXEj zE~N1#N8JUHj05k}f&||RSV{dCmiM0%2M+sx4lLlGjQ@K89{=6`lZ5d9-uQocDk_h2 aP#0x(bT<9o!QVy%E}LAtSasn>-2VWc!Xe23 literal 0 HcmV?d00001 diff --git a/Documentation/User Manual/pics/EM_Model_scaled.png b/Documentation/User Manual/pics/EM_Model_scaled.png new file mode 100644 index 0000000000000000000000000000000000000000..bece268af3058d7659c76a46592cf8080c4f8162 GIT binary patch literal 69752 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 literal 0 HcmV?d00001 diff --git a/VECTO/GUI/ElectricMotorForm.vb b/VECTO/GUI/ElectricMotorForm.vb index 8b4ae44268..4708d71435 100644 --- a/VECTO/GUI/ElectricMotorForm.vb +++ b/VECTO/GUI/ElectricMotorForm.vb @@ -360,21 +360,21 @@ Public Class ElectricMotorForm Dim fldFile As String = If(Not String.IsNullOrWhiteSpace(_emFile), Path.Combine(Path.GetDirectoryName(_emFile), tbMaxTorque.Text), tbDragTorque.Text) If File.Exists(fldFile) Then _ - fullLoadCurve = ElectricFullLoadCurveReader.Create(VectoCSVFile.Read(fldFile), 1.0, 1, 1.0) + fullLoadCurve = ElectricFullLoadCurveReader.Create(VectoCSVFile.Read(fldFile), 1) Catch ex As Exception End Try Try Dim fcFile As String = If(Not String.IsNullOrWhiteSpace(_emFile), Path.Combine(Path.GetDirectoryName(_emFile), tbMap.Text), tbMap.Text) - If File.Exists(fcFile) Then fcMap = ElectricMotorMapReader.Create(VectoCSVFile.Read(fcFile), 1.0, 1, 1.0) + If File.Exists(fcFile) Then fcMap = ElectricMotorMapReader.Create(VectoCSVFile.Read(fcFile), 1) Catch ex As Exception End Try Try Dim dragFile As String = If(Not String.IsNullOrWhiteSpace(_emFile), Path.Combine(Path.GetDirectoryName(_emFile), tbDragTorque.Text), tbMap.Text) - If File.Exists(dragFile) Then dragCurve = ElectricMotorDragCurveReader.Create(VectoCSVFile.Read(dragFile), 1.0, 1, 1.0) + If File.Exists(dragFile) Then dragCurve = ElectricMotorDragCurveReader.Create(VectoCSVFile.Read(dragFile), 1) Catch ex As Exception End Try diff --git a/VectoCommon/VectoCommon/Models/PowertrainPosition.cs b/VectoCommon/VectoCommon/Models/PowertrainPosition.cs index e16fbf0189..203705d3cb 100644 --- a/VectoCommon/VectoCommon/Models/PowertrainPosition.cs +++ b/VectoCommon/VectoCommon/Models/PowertrainPosition.cs @@ -12,9 +12,9 @@ namespace TUGraz.VectoCommon.InputData { HybridP3, HybridP4, - BatteryElectricB4, - BatteryElectricB3, - BatteryElectricB2, + BatteryElectricE4, + BatteryElectricE3, + BatteryElectricE2, } public static class PowertrainPositionHelper @@ -29,6 +29,9 @@ namespace TUGraz.VectoCommon.InputData { } if (pos.StartsWith("B", StringComparison.InvariantCultureIgnoreCase)) { + return (BatteryElectriPrefix + pos.Replace("B", "E")).ParseEnum<PowertrainPosition>(); + } + if (pos.StartsWith("E", StringComparison.InvariantCultureIgnoreCase)) { return (BatteryElectriPrefix + pos).ParseEnum<PowertrainPosition>(); } throw new VectoException("invalid powertrain position {0}", pos); @@ -54,8 +57,8 @@ namespace TUGraz.VectoCommon.InputData { public static bool IsBatteryElectric(this PowertrainPosition pos) { - return pos == PowertrainPosition.BatteryElectricB2 || pos == PowertrainPosition.BatteryElectricB3 || - pos == PowertrainPosition.BatteryElectricB4; + return pos == PowertrainPosition.BatteryElectricE2 || pos == PowertrainPosition.BatteryElectricE3 || + pos == PowertrainPosition.BatteryElectricE4; } public static bool IsParallelHybrid(this PowertrainPosition pos) diff --git a/VectoCore/VectoCore/InputData/Reader/ComponentData/ElectricFullLoadCurveReader.cs b/VectoCore/VectoCore/InputData/Reader/ComponentData/ElectricFullLoadCurveReader.cs index 06990cb404..d242372c60 100644 --- a/VectoCore/VectoCore/InputData/Reader/ComponentData/ElectricFullLoadCurveReader.cs +++ b/VectoCore/VectoCore/InputData/Reader/ComponentData/ElectricFullLoadCurveReader.cs @@ -9,7 +9,7 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData { public static class ElectricFullLoadCurveReader { - public static ElectricMotorFullLoadCurve Create(DataTable data, double ratio, int count, double efficiency) + public static ElectricMotorFullLoadCurve Create(DataTable data, int count) { if (data.Columns.Count < 3) { throw new VectoException("Motor FullLoadCurve Data must contain at least 3 columns"); @@ -27,9 +27,9 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData return new ElectricMotorFullLoadCurve( (from DataRow row in data.Rows select new ElectricMotorFullLoadCurve.FullLoadEntry { - MotorSpeed = row.ParseDouble(Fields.MotorSpeed).RPMtoRad() / ratio, - FullDriveTorque = -row.ParseDouble(Fields.DrivingTorque).SI<NewtonMeter>() * count * ratio * efficiency, - FullGenerationTorque = -row.ParseDouble(Fields.GenerationTorque).SI<NewtonMeter>() * count * ratio / efficiency + MotorSpeed = row.ParseDouble(Fields.MotorSpeed).RPMtoRad(), // / ratio, + FullDriveTorque = -row.ParseDouble(Fields.DrivingTorque).SI<NewtonMeter>() * count, // * ratio * efficiency, + FullGenerationTorque = -row.ParseDouble(Fields.GenerationTorque).SI<NewtonMeter>() * count, //* ratio / efficiency }).ToList()); } @@ -51,7 +51,7 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData public static class ElectricMotorDragCurveReader { - public static DragCurve Create(DataTable data, double ratio, int count, double efficiency) + public static DragCurve Create(DataTable data, int count) { if (data.Columns.Count < 2) { throw new VectoException("Drag Curve must contain at least 2 columns"); @@ -66,8 +66,8 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData data.Columns[1].ColumnName = Fields.DragTorque; } return new DragCurve(data.AsEnumerable().Cast<DataRow>().Select(x => new DragCurve.DragLoadEntry() { - MotorSpeed = x.ParseDouble(Fields.MotorSpeed).RPMtoRad() / ratio, - DragTorque = -x.ParseDouble(Fields.DragTorque).SI<NewtonMeter>() * ratio * count / efficiency + MotorSpeed = x.ParseDouble(Fields.MotorSpeed).RPMtoRad(), // / ratio, + DragTorque = -x.ParseDouble(Fields.DragTorque).SI<NewtonMeter>() * count, // * ratio / efficiency }).ToList()); } diff --git a/VectoCore/VectoCore/InputData/Reader/ComponentData/ElectricMotorMapReader.cs b/VectoCore/VectoCore/InputData/Reader/ComponentData/ElectricMotorMapReader.cs index 27bb374a26..73cf6ca8ad 100644 --- a/VectoCore/VectoCore/InputData/Reader/ComponentData/ElectricMotorMapReader.cs +++ b/VectoCore/VectoCore/InputData/Reader/ComponentData/ElectricMotorMapReader.cs @@ -12,12 +12,12 @@ using TUGraz.VectoCore.Utils; namespace TUGraz.VectoCore.InputData.Reader.ComponentData { public static class ElectricMotorMapReader { - public static EfficiencyMap Create(Stream data, double ratio, int count, double efficiency) + public static EfficiencyMap Create(Stream data, int count) { - return Create(VectoCSVFile.ReadStream(data), ratio, count, efficiency); + return Create(VectoCSVFile.ReadStream(data), count); } - public static EfficiencyMap Create(DataTable data, double ratio, int count, double efficiency) + public static EfficiencyMap Create(DataTable data, int count) { var headerValid = HeaderIsValid(data.Columns); if (!headerValid) @@ -37,12 +37,12 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData { { var entry = CreateEntry(row); if (entry.Torque.IsGreaterOrEqual(0)) { - delaunayMap.AddPoint(-entry.Torque.Value() * count * ratio * efficiency, - entry.MotorSpeed.Value() / ratio, + delaunayMap.AddPoint(-entry.Torque.Value() * count, // * ratio * efficiency, + entry.MotorSpeed.Value(), // / ratio, -entry.PowerElectrical.Value() * count); } else { - delaunayMap.AddPoint(-entry.Torque.Value() * count * ratio / efficiency, - entry.MotorSpeed.Value() / ratio, + delaunayMap.AddPoint(-entry.Torque.Value() * count, // * ratio / efficiency, + entry.MotorSpeed.Value(), // / ratio, -entry.PowerElectrical.Value() * count); } } diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs index 488da9e14c..f41a99b775 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs @@ -680,14 +680,16 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter double ratio, double efficiency) { return new ElectricMotorData() { - FullLoadCurve = ElectricFullLoadCurveReader.Create(motorData.FullLoadCurve, ratio, count, efficiency), - DragCurve = ElectricMotorDragCurveReader.Create(motorData.DragCurve, ratio, count, efficiency), - EfficiencyMap = ElectricMotorMapReader.Create(motorData.EfficiencyMap, ratio, count, efficiency), + FullLoadCurve = ElectricFullLoadCurveReader.Create(motorData.FullLoadCurve, count), + DragCurve = ElectricMotorDragCurveReader.Create(motorData.DragCurve, count), + EfficiencyMap = ElectricMotorMapReader.Create(motorData.EfficiencyMap, count), Inertia = motorData.Inertia, ContinuousPower = motorData.ContinuousPower * count, ContinuousPowerSpeed = motorData.ContinuousPowerSpeed, OverloadTime = motorData.OverloadTime, OverloadRegenerationFactor = motorData.OverloadRecoveryFactor, + Ratio = ratio, + TransmissionEfficiency = efficiency }; } diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs index bc03c0e2b5..5d1b932354 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs @@ -93,7 +93,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl GearboxData gearboxData = null; ShiftStrategyParameters gearshiftParams = null; AngledriveData angledriveData = null; - if (electricMachinesData.Any(x => x.Item1 == PowertrainPosition.BatteryElectricB2)) { + if (electricMachinesData.Any(x => x.Item1 == PowertrainPosition.BatteryElectricE2)) { // gearbox required! var tmpRunData = new VectoRunData() { JobType = VectoSimulationJobType.BatteryElectricVehicle, diff --git a/VectoCore/VectoCore/Models/Simulation/Data/ModalResultField.cs b/VectoCore/VectoCore/Models/Simulation/Data/ModalResultField.cs index 2bc2cc74bd..4f07a71129 100644 --- a/VectoCore/VectoCore/Models/Simulation/Data/ModalResultField.cs +++ b/VectoCore/VectoCore/Models/Simulation/Data/ModalResultField.cs @@ -378,37 +378,49 @@ namespace TUGraz.VectoCore.Models.Simulation.Data [ModalResultField(typeof(SI), "P_WHR_mech [kW]", outputFactor: 1e-3)] P_WHR_mech_map, [ModalResultField(typeof(SI), "P_WHR_mech_corr [kW]", outputFactor: 1e-3)] P_WHR_mech_corr, - [ModalResultField(typeof(SI), caption: "n_em-{0}_avg [1/min]", outputFactor: 60 / (2 * Math.PI))] n_electricMotor_, - [ModalResultField(typeof(SI), caption: "T_em-{0} [Nm]")] T_electricMotor_, - [ModalResultField(typeof(SI), caption: "T_em-{0}_drive_max [Nm]")] T_electricMotor_drive_max_, - [ModalResultField(typeof(SI), caption: "T_em-{0}_gen_max [Nm]")] T_electricMotor_gen_max_, - [ModalResultField(typeof(SI), caption: "P_em-{0}_in [kW]", outputFactor: 1e-3)] P_electricMotor_in_, - [ModalResultField(typeof(SI), caption: "P_em-{0}_out [kW]", outputFactor: 1e-3)] P_electricMotor_out_, - [ModalResultField(typeof(SI), caption: "P_em-{0}_mech [kW]", outputFactor: 1e-3)] P_electricMotor_mech_, - [ModalResultField(typeof(SI), caption: "P_em-{0}_el [kW]", outputFactor: 1e-3)] P_electricMotor_el_, - [ModalResultField(typeof(SI), caption: "P_em-{0}_gen_max_ [kW]", outputFactor: 1e-3)] P_electricMotor_gen_max_, - [ModalResultField(typeof(SI), caption: "P_em-{0}_drive_max [kW]", outputFactor: 1e-3)] P_electricMotor_drive_max_, - //[ModalResultField(typeof(SI), caption: "P_em-{0}_brake [kW]", outputFactor: 1e-3)] P_electricMotor_brake_, - [ModalResultField(typeof(SI), caption: "P_em-{0}_loss [kW]", outputFactor: 1e-3)] P_electricMotorLoss_, - [ModalResultField(typeof(SI), caption: "P_em-{0}_transm_loss [kW]", outputFactor: 1e-3)] P_electricMotorTransmissionLoss_, - [ModalResultField(typeof(SI), caption: "P_em-{0}_inertia_loss [kW]", outputFactor: 1e-3)] P_electricMotorInertiaLoss_, - [ModalResultField(typeof(SI), caption: "EM-{0}_OverloadBuffer [%]", outputFactor: 100)] ElectricMotor_OvlBuffer_, + [ModalResultField(typeof(SI), caption: "i_{0}-em [-]")] EM_ratio_, + [ModalResultField(typeof(SI), caption: "n_{0}-em_avg [1/min]", outputFactor: 60 / (2 * Math.PI))] n_EM_electricMotor_, + [ModalResultField(typeof(SI), caption: "T_{0}-em [Nm]")] T_EM_electricMotor_, + [ModalResultField(typeof(SI), caption: "T_{0}-em_map [Nm]")] T_EM_electricMotor_map_, + + [ModalResultField(typeof(SI), caption: "T_{0}-em_drive_max [Nm]")] T_EM_electricMotor_drive_max_, + [ModalResultField(typeof(SI), caption: "T_{0}-em_gen_max [Nm]")] T_EM_electricMotor_gen_max_, + [ModalResultField(typeof(SI), caption: "P_{0}-em_gen_max_ [kW]", outputFactor: 1e-3)] P_EM_electricMotor_gen_max_, + [ModalResultField(typeof(SI), caption: "P_{0}-em_drive_max [kW]", outputFactor: 1e-3)] P_EM_electricMotor_drive_max_, + + [ModalResultField(typeof(SI), caption: "P_{0}-em_mech [kW]", outputFactor: 1e-3)] P_EM_electricMotor_em_mech_, + [ModalResultField(typeof(SI), caption: "P_{0}-em_mech_map [kW]", outputFactor: 1e-3)] P_EM_electricMotor_em_mech_map_, + [ModalResultField(typeof(SI), caption: "P_{0}-em_el [kW]", outputFactor: 1e-3)] P_EM_electricMotor_el_, + [ModalResultField(typeof(SI), caption: "P_{0}-em_loss [kW]", outputFactor: 1e-3)] P_EM_electricMotorLoss_, + [ModalResultField(typeof(SI), caption: "P_{0}-em_inertia_loss [kW]", outputFactor: 1e-3)] P_EM_electricMotorInertiaLoss_, + + [ModalResultField(typeof(SI), caption: "P_{0}_in [kW]", outputFactor: 1e-3)] P_EM_in_, + [ModalResultField(typeof(SI), caption: "P_{0}_out [kW]", outputFactor: 1e-3)] P_EM_out_, + [ModalResultField(typeof(SI), caption: "P_{0}_mech [kW]", outputFactor: 1e-3)] P_EM_mech_, + [ModalResultField(typeof(SI), caption: "P_{0}_loss [kW]", outputFactor: 1e-3)] P_EM_loss_, + + [ModalResultField(typeof(SI), caption: "P_{0}_transm_loss [kW]", outputFactor: 1e-3)] P_EM_TransmissionLoss_, + + [ModalResultField(typeof(SI), caption: "EM_OVL-{0}-em [%]", outputFactor: 100)] ElectricMotor_OvlBuffer_, + + [ModalResultField(typeof(SI), caption: "EM_{0}_off")] EM_Off_, + // only for graphDrawing Testcase - [ModalResultField(typeof(SI), caption: "P_em-P2_mech [kW]", outputFactor: 1e-3)] + [ModalResultField(typeof(SI), caption: "P_P2_mech [kW]", outputFactor: 1e-3)] P_electricMotor_mech_P2, - [ModalResultField(typeof(SI), caption: "P_em-P3_mech [kW]", outputFactor: 1e-3)] + [ModalResultField(typeof(SI), caption: "P_P3_mech [kW]", outputFactor: 1e-3)] P_electricMotor_mech_P3, - [ModalResultField(typeof(SI), caption: "P_em-P4_mech [kW]", outputFactor: 1e-3)] + [ModalResultField(typeof(SI), caption: "P_P4_mech [kW]", outputFactor: 1e-3)] P_electricMotor_mech_P4, - [ModalResultField(typeof(SI), caption: "P_em-B4_mech [kW]", outputFactor: 1e-3)] + [ModalResultField(typeof(SI), caption: "P_E4_mech [kW]", outputFactor: 1e-3)] P_electricMotor_mech_B4, - [ModalResultField(typeof(SI), caption: "P_em-B3_mech [kW]", outputFactor: 1e-3)] + [ModalResultField(typeof(SI), caption: "P_E3_mech [kW]", outputFactor: 1e-3)] P_electricMotor_mech_B3, - [ModalResultField(typeof(SI), caption: "P_em-B2_mech [kW]", outputFactor: 1e-3)] + [ModalResultField(typeof(SI), caption: "P_E2_mech [kW]", outputFactor: 1e-3)] P_electricMotor_mech_B2, // --> diff --git a/VectoCore/VectoCore/Models/Simulation/DataBus/IAxlegearInfo.cs b/VectoCore/VectoCore/Models/Simulation/DataBus/IAxlegearInfo.cs index 2677b92dcb..fdaf27c16e 100644 --- a/VectoCore/VectoCore/Models/Simulation/DataBus/IAxlegearInfo.cs +++ b/VectoCore/VectoCore/Models/Simulation/DataBus/IAxlegearInfo.cs @@ -39,5 +39,12 @@ namespace TUGraz.VectoCore.Models.Simulation.DataBus Watt AxlegearLoss(); Tuple<PerSecond, NewtonMeter> CurrentAxleDemand { get; } + + double Ratio { get; } + } + + public interface IAngledriveInfo + { + double Ratio { get; } } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/Simulation/DataBus/IDataBus.cs b/VectoCore/VectoCore/Models/Simulation/DataBus/IDataBus.cs index 6ab1f6c291..729be51228 100644 --- a/VectoCore/VectoCore/Models/Simulation/DataBus/IDataBus.cs +++ b/VectoCore/VectoCore/Models/Simulation/DataBus/IDataBus.cs @@ -80,6 +80,7 @@ namespace TUGraz.VectoCore.Models.Simulation.DataBus IHybridControllerInfo HybridControllerInfo { get; } IHybridControllerCtl HybridControllerCtl { get; } + IAngledriveInfo AngledriveInfo { get; } } public interface IPowertainInfo diff --git a/VectoCore/VectoCore/Models/Simulation/DataBus/IWheelsInfo.cs b/VectoCore/VectoCore/Models/Simulation/DataBus/IWheelsInfo.cs index eba2f5092d..a9bf31e94b 100644 --- a/VectoCore/VectoCore/Models/Simulation/DataBus/IWheelsInfo.cs +++ b/VectoCore/VectoCore/Models/Simulation/DataBus/IWheelsInfo.cs @@ -36,5 +36,6 @@ namespace TUGraz.VectoCore.Models.Simulation.DataBus public interface IWheelsInfo { Kilogram ReducedMassWheels { get; } + Meter DynamicTyreRadius { get; } } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs b/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs index 95d8e9dff1..d2bd40e5b1 100644 --- a/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs +++ b/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs @@ -488,27 +488,27 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl case PowertrainPosition.HybridP3: case PowertrainPosition.HybridP4: throw new VectoException("testcase does not support parallel powertrain configurations"); - case PowertrainPosition.BatteryElectricB4: + case PowertrainPosition.BatteryElectricE4: powertrain.AddComponent( - GetElectricMachine(PowertrainPosition.BatteryElectricB4, data.ElectricMachinesData, container, es, ctl)); + GetElectricMachine(PowertrainPosition.BatteryElectricE4, data.ElectricMachinesData, container, es, ctl)); new DummyGearboxInfo(container); //new MockEngineInfo(container); new ATClutchInfo(container); break; - case PowertrainPosition.BatteryElectricB3: + case PowertrainPosition.BatteryElectricE3: powertrain.AddComponent(new AxleGear(container, data.AxleGearData)) .AddComponent( - GetElectricMachine(PowertrainPosition.BatteryElectricB3, data.ElectricMachinesData, container, es, ctl)); + GetElectricMachine(PowertrainPosition.BatteryElectricE3, data.ElectricMachinesData, container, es, ctl)); new DummyGearboxInfo(container); //new MockEngineInfo(container); new ATClutchInfo(container); break; - case PowertrainPosition.BatteryElectricB2: + case PowertrainPosition.BatteryElectricE2: var strategy = new PEVAMTShiftStrategy(container); powertrain.AddComponent(new AxleGear(container, data.AxleGearData)) .AddComponent(new PEVGearbox(container, strategy)) .AddComponent( - GetElectricMachine(PowertrainPosition.BatteryElectricB2, data.ElectricMachinesData, container, es, ctl)); + GetElectricMachine(PowertrainPosition.BatteryElectricE2, data.ElectricMachinesData, container, es, ctl)); new ATClutchInfo(container); break; default: throw new ArgumentOutOfRangeException(nameof(pos), pos, null); @@ -713,7 +713,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl .AddComponent(new AxleGear(container, data.AxleGearData)) .AddComponent(data.AngledriveData != null ? new Angledrive(container, data.AngledriveData) : null) .AddComponent(GetSimpleGearbox(container, data), data.Retarder, container) - .AddComponent(GetElectricMachine(PowertrainPosition.BatteryElectricB2, data.ElectricMachinesData, container, es, ctl)); + .AddComponent(GetElectricMachine(PowertrainPosition.BatteryElectricE2, data.ElectricMachinesData, container, es, ctl)); // DistanceBasedDrivingCycle --> driver --> vehicle --> wheels // --> axleGear --> (retarder) --> gearBox --> (retarder) --> clutch --> engine <-- Aux diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs b/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs index 6b11991934..d6ac780099 100644 --- a/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs +++ b/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs @@ -60,6 +60,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl public virtual IGearboxInfo GearboxInfo { get; protected set; } public virtual IGearboxControl GearboxCtl { get; protected set; } public virtual IAxlegearInfo AxlegearInfo { get; protected set; } + public virtual IAngledriveInfo AngledriveInfo { get; protected set; } public virtual IVehicleInfo VehicleInfo { get; protected set; } public virtual IBrakes Brakes { get; protected set; } public virtual IWheelsInfo WheelsInfo { get; protected set; } @@ -132,6 +133,8 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl get { return HybridController; } } + + public virtual void AddComponent(VectoSimulationComponent component) { var commitPriority = 0; @@ -152,6 +155,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl .If<IGearboxControl>(c => GearboxCtl = c) .If<ITorqueConverterControl>(c => TorqueConverterCtl = c) .If<IAxlegearInfo>(c => AxlegearInfo = c) + .If<IAngledriveInfo>(c => AngledriveInfo = c) .If<IWheelsInfo>(c => WheelsInfo = c) .If<IVehicleInfo>(c => { VehicleInfo = c; diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricMotor/ElectricMotorData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricMotor/ElectricMotorData.cs index fe6417b85e..4e00de495a 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricMotor/ElectricMotorData.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricMotor/ElectricMotorData.cs @@ -27,5 +27,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data [SIRange(0, 1)] public double OverloadRegenerationFactor { get; internal set; } + + public double Ratio { get; internal set; } + public double TransmissionEfficiency { get; internal set; } } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/SimulationComponent/IAxlegear.cs b/VectoCore/VectoCore/Models/SimulationComponent/IAxlegear.cs index 38eaa2abd1..98e3df2cf3 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/IAxlegear.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/IAxlegear.cs @@ -34,4 +34,6 @@ using TUGraz.VectoCore.Models.Simulation.DataBus; namespace TUGraz.VectoCore.Models.SimulationComponent { public interface IAxlegear : IPowerTrainComponent, IAxlegearInfo {} + + public interface IAngledrive : IPowerTrainComponent, IAngledriveInfo {} } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Angledrive.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Angledrive.cs index f780dddc7b..539a029abb 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Angledrive.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Angledrive.cs @@ -38,7 +38,7 @@ using TUGraz.VectoCore.OutputData; namespace TUGraz.VectoCore.Models.SimulationComponent.Impl { - public class Angledrive : TransmissionComponent + public class Angledrive : TransmissionComponent, IAngledrive { public Angledrive(IVehicleContainer container, AngledriveData modelData) : base(container, modelData.Angledrive) {} @@ -57,5 +57,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl avgAngularVelocity; container[ModalResultField.P_angle_in] = CurrentState.InTorque * avgAngularVelocity; } + + public double Ratio + { + get { return ModelData.Ratio; } + } } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/AxleGear.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/AxleGear.cs index c5c88be82f..61ea47843b 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/AxleGear.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/AxleGear.cs @@ -81,5 +81,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl (PreviousState.InAngularVelocity + CurrentState.InAngularVelocity) / 2.0, CurrentState.InTorque); } } + + public double Ratio + { + get { return ModelData.Ratio; } + } } } diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs index 1ab7d3136d..67d0073fc5 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs @@ -1,4 +1,7 @@ -using TUGraz.VectoCommon.Exceptions; +using System.Runtime.InteropServices.WindowsRuntime; +using System.Security.Cryptography; +using NLog.LayoutRenderers; +using TUGraz.VectoCommon.Exceptions; using TUGraz.VectoCommon.InputData; using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Utils; @@ -14,6 +17,7 @@ using TUGraz.VectoCore.Utils; namespace TUGraz.VectoCore.Models.SimulationComponent.Impl { + public class ElectricMotor : StatefulProviderComponent<ElectricMotorState, ITnOutPort, ITnInPort, ITnOutPort>, IPowerTrainComponent, IElectricMotor, ITnOutPort, ITnInPort { @@ -52,7 +56,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl public PowertrainPosition Position { get; } public PerSecond MaxSpeed { - get { return _maxSpeed ?? (_maxSpeed = ModelData.FullLoadCurve.FullLoadEntries.MaxBy(x => x.MotorSpeed).MotorSpeed); } + get { return _maxSpeed ?? (_maxSpeed = ModelData.FullLoadCurve.FullLoadEntries.MaxBy(x => x.MotorSpeed).MotorSpeed) / ModelData.Ratio; } } public Watt DragPower(PerSecond electricMotorSpeed) @@ -67,24 +71,29 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl public IResponse Initialize(NewtonMeter outTorque, PerSecond outAngularVelocity) { - PreviousState.OutAngularVelocity = outAngularVelocity; - PreviousState.OutTorque = outTorque; - PreviousState.InAngularVelocity = outAngularVelocity; - PreviousState.InTorque = outTorque; + var emOutAngularVelocity = outAngularVelocity * ModelData.Ratio; + var emOutTorque = outTorque / ModelData.Ratio; + + PreviousState.EMSpeed = emOutAngularVelocity; + PreviousState.EMTorque = 0.SI<NewtonMeter>(); + + PreviousState.DrivetrainSpeed = outAngularVelocity; + PreviousState.DrivetrainOutTorque = outTorque; + if (NextComponent == null) { return new ResponseSuccess(this) { Engine = { - PowerRequest = outTorque * outAngularVelocity, - EngineSpeed = outAngularVelocity + PowerRequest = emOutTorque * emOutAngularVelocity, + EngineSpeed = emOutAngularVelocity } }; } - if (!DataBus.EngineCtl.CombustionEngineOn) - { - PreviousState.InTorque = 0.SI<NewtonMeter>(); - PreviousState.InAngularVelocity = outAngularVelocity; + if (!DataBus.EngineCtl.CombustionEngineOn) { + PreviousState.DrivetrainInTorque = 0.SI<NewtonMeter>(); + //PreviousState.InAngularVelocity = emOutAngularVelocity; } - return NextComponent.Initialize(PreviousState.InTorque, PreviousState.InAngularVelocity); + return NextComponent.Initialize(outTorque, outAngularVelocity); + //return NextComponent.Initialize(PreviousState.InTorque, PreviousState.InAngularVelocity); } /// <summary> @@ -100,91 +109,65 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl public IResponse Request( Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity, bool dryRun = false) { - var avgSpeed = (PreviousState.OutAngularVelocity + outAngularVelocity) / 2; - var maxDriveTorque = GetMaxDriveTorque(absTime, dt, avgSpeed); - var maxRecuperationTorque = GetMaxRecuperationTorque(absTime, dt, avgSpeed); - - var retVal = HandleRequest(absTime, dt, outTorque, outAngularVelocity, dryRun, maxDriveTorque, maxRecuperationTorque); - - retVal.ElectricMotor.MaxDriveTorque = maxDriveTorque; - retVal.ElectricMotor.MaxRecuperationTorque = maxRecuperationTorque; - retVal.ElectricMotor.AngularVelocity = avgSpeed; - retVal.ElectricMotor.PowerRequest = outTorque * avgSpeed; - if (!dryRun) { - CurrentState.DragMax = maxRecuperationTorque; - CurrentState.DriveMax = maxDriveTorque; - CurrentState.ElectricPowerToBattery = retVal.ElectricSystem?.ConsumerPower; - } - return retVal; - } - - private NewtonMeter GetMaxRecuperationTorque(Second absTime, Second dt, PerSecond avgSpeed) - { - var tqContinuousPwr = DeRatingActive ? ContinuousTorque : null; - if (!avgSpeed.IsEqual(0)) { - tqContinuousPwr = DeRatingActive ? ModelData.ContinuousPower / avgSpeed : null; - } - var maxEmTorque = VectoMath.Min(tqContinuousPwr, ModelData.FullLoadCurve.FullGenerationTorque(avgSpeed)); - var electricSystemResponse = ElectricPower.Request(absTime, dt, 0.SI<Watt>(), true); - var maxBatPower = electricSystemResponse.MaxPowerDrag; + var avgDtSpeed = (PreviousState.DrivetrainSpeed + outAngularVelocity) / 2; + var emSpeed = outAngularVelocity * ModelData.Ratio; - var maxBatRecuperationTorque = maxBatPower.IsEqual(0) ? ModelData.DragCurve.Lookup(avgSpeed) : ModelData.EfficiencyMap.LookupTorque(maxBatPower, avgSpeed, maxEmTorque); - var maxTorqueRecuperate = VectoMath.Min(maxEmTorque, maxBatRecuperationTorque); - return maxTorqueRecuperate < 0 ? null : maxTorqueRecuperate; - } - - private NewtonMeter GetMaxDriveTorque(Second absTime, Second dt, PerSecond avgSpeed) - { - var tqContinuousPwr = DeRatingActive ? -ContinuousTorque : null; - if (!avgSpeed.IsEqual(0)) { - tqContinuousPwr = DeRatingActive ? -ModelData.ContinuousPower / avgSpeed : null; - } - var maxEmTorque = VectoMath.Max(tqContinuousPwr ,ModelData.FullLoadCurve.FullLoadDriveTorque(avgSpeed)); - var electricSystemResponse = ElectricPower.Request(absTime, dt, 0.SI<Watt>(), true); - var maxBatPower = electricSystemResponse.MaxPowerDrive; + var avgEmSpeed = (PreviousState.EMSpeed + emSpeed) / 2; + var inertiaTorqueEm = avgEmSpeed.IsEqual(0) + ? 0.SI<NewtonMeter>() + : Formulas.InertiaPower(avgEmSpeed, PreviousState.EMSpeed, ModelData.Inertia, dt) / avgEmSpeed; - var maxBatDriveTorque = maxBatPower.IsEqual(0) ? ModelData.DragCurve.Lookup(avgSpeed) : ModelData.EfficiencyMap.LookupTorque(maxBatPower, avgSpeed, maxEmTorque); - //if (maxBatDriveTorque == null) { - // return ModelData.DragCurve.Lookup(avgSpeed); - //} - var maxTorqueDrive = VectoMath.Max(maxEmTorque, maxBatDriveTorque); - return maxTorqueDrive > 0 ? null : maxTorqueDrive; - } + var maxDriveTorqueEmMap = GetMaxDriveTorque(absTime, dt, avgEmSpeed); + var maxRecuperationTorqueEmMap = GetMaxRecuperationTorque(absTime, dt, avgEmSpeed); + // inertia has to be added here. drive torque is negative, when accelerating inertia is positive and thus 'reduces' drive torque, i.e 'less negative' + var maxDriveTorqueEm = maxDriveTorqueEmMap == null ? null : maxDriveTorqueEmMap + inertiaTorqueEm; + // inertia has to be added here. recuperation torque is positive, when accelerating inertia is positive and adds more drag to the drivetrain, + var maxRecuperationTorqueEm = maxRecuperationTorqueEmMap == null ? null : maxRecuperationTorqueEmMap + inertiaTorqueEm; - protected virtual IResponse HandleRequest( - Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity, bool dryRun, - NewtonMeter maxDriveTorque, NewtonMeter maxRecuperationTorque) - { + var maxDriveTorqueDt = maxDriveTorqueEm == null ? null : ConvertEmTorqueToDrivetrain(maxDriveTorqueEm); + var maxRecuperationTorqueDt = maxRecuperationTorqueEm == null ? null : ConvertEmTorqueToDrivetrain(maxRecuperationTorqueEm); + + // control returns torque that shall be applied on the drivetrain. calculate backward to the EM + var emTorqueDt = Control.MechanicalAssistPower(absTime, dt, outTorque, + PreviousState.DrivetrainSpeed, outAngularVelocity, maxDriveTorqueDt, maxRecuperationTorqueDt, Position, dryRun); + + if (!dryRun && emTorqueDt != null && (emTorqueDt.IsSmaller(maxDriveTorqueDt ?? 0.SI<NewtonMeter>(), 1e-3) || + emTorqueDt.IsGreater(maxRecuperationTorqueDt ?? 0.SI<NewtonMeter>(), 1e-3))) { + // check if provided EM torque (drivetrain) is valid) + if (DataBus.HybridControllerInfo != null && !avgDtSpeed.IsEqual(DataBus.HybridControllerInfo.ElectricMotorSpeed(Position))) { + return new ResponseInvalidOperatingPoint(this); + } + throw new VectoException( + "Invalid operating point provided by strategy! SupportPower: {0}, max Power: {1}, min Power: {2}", + emTorqueDt, maxDriveTorqueDt, maxRecuperationTorqueDt); + } - var avgSpeed = (PreviousState.OutAngularVelocity + outAngularVelocity) / 2; - var inertiaTorqueLoss = avgSpeed.IsEqual(0) - ? 0.SI<NewtonMeter>() - : Formulas.InertiaPower(outAngularVelocity, PreviousState.OutAngularVelocity, ModelData.Inertia, dt) / avgSpeed; - var inTorque = outTorque + inertiaTorqueLoss; - //var maxDriveTorque = ModelData.FullLoadCurve.FullLoadDriveTorque(avgSpeed); - //var maxDragTorque = ModelData.FullLoadCurve.FullGenerationTorque(avgSpeed); - if (!dryRun) { - CurrentState.InertiaTorqueLoss = inertiaTorqueLoss; - CurrentState.OutTorque = outTorque; - } + var emTorque = emTorqueDt == null ? null : ConvertDrivetrainTorqueToEm(emTorqueDt); + var emOff = false; - if (ElectricPower == null) { - var retVal = ForwardRequest(absTime, dt, inTorque, inTorque, outAngularVelocity, null, dryRun); - return retVal; + if (ElectricPower == null || emTorqueDt == null) { + // no electric system or EM shall be off - apply drag only + // if EM is off, calculate EM drag torque 'forward' to be applied on drivetrain + // add inertia, drag is positive + emTorque = ModelData.DragCurve.Lookup(avgEmSpeed) + inertiaTorqueEm; + emTorqueDt = ConvertEmTorqueToDrivetrain(emTorque); + emOff = true; } - var eMotorTorque = Control.MechanicalAssistPower( - absTime, dt, inTorque, PreviousState.OutAngularVelocity, outAngularVelocity, maxDriveTorque, maxRecuperationTorque, - Position, dryRun); - - if (Position == PowertrainPosition.HybridP2 && - !DataBus.GearboxInfo.GearEngaged(absTime) /* && !DataBus.ClutchInfo.ClutchClosed(absTime)*/) { + if (Position == PowertrainPosition.HybridP2 && !DataBus.GearboxInfo.GearEngaged(absTime)) { // electric motor is between gearbox and clutch, but no gear is engaged... - if (eMotorTorque != null) { + if (emTorque != null) { if (!DataBus.HybridControllerInfo.GearboxEngaged) { - return new ResponseInvalidOperatingPoint(this); + return new ResponseInvalidOperatingPoint(this) { + ElectricMotor = { + MaxDriveTorque = maxDriveTorqueDt, + MaxRecuperationTorque = maxRecuperationTorqueDt, + AngularVelocity = avgDtSpeed, + PowerRequest = outTorque * avgDtSpeed + } + }; } if (!dryRun) { @@ -192,248 +175,206 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl "electric motor cannot provide torque when gearbox and clutch are disengaged"); } } - - var electricSystemResponse = ElectricPower.Request(absTime, dt, 0.SI<Watt>(), dryRun); - if (!dryRun) { - if (!(electricSystemResponse is ElectricSystemResponseSuccess)) { - throw new VectoException("unexpected response from electric system: {0}", electricSystemResponse); - } - - SetState(inTorque, outAngularVelocity); - } - - var retVal = NextComponent.Request(absTime, dt, outTorque, outAngularVelocity, dryRun); - retVal.ElectricMotor.ElectricMotorPowerMech = 0.SI<Watt>(); - retVal.ElectricSystem = electricSystemResponse; - retVal.ElectricMotor.InertiaPowerDemand = 0.SI<Watt>(); // inertiaTorqueLoss * avgSpeed; - return retVal; } - if (eMotorTorque == null) { - var retVal = ElectricMotorOff(absTime, dt, outTorque, outAngularVelocity, dryRun); - retVal.ElectricMotor.InertiaPowerDemand = inertiaTorqueLoss * avgSpeed; - return retVal; + // inertia torque 'brakes' - electric motor has to provide this torque in addition (T_inertia > 0 when angular speed increases) + // emTorque < 0 when propelling, emTorqueMap needs to be 'more negative' to provide torque for inertia + // emTorque > 0 when recuperating, inertia 'brakes' in addition, emTorqueMap is decreased + var emTorqueMap = emTorque - inertiaTorqueEm ; + if (emOff) { + // not used later + emTorqueMap = null; } - //if (eMotorTorque.IsEqual(0, 1e-3)) - //{ - // var electricSystemResponse = ElectricPower.Request(absTime, dt, 0.SI<Watt>(), dryRun); + var electricPower = emOff // TODO: still needed? || ModelData.DragCurve.Lookup(avgEmSpeed).IsEqual(emTorque) + ? 0.SI<Watt>() + : ModelData.EfficiencyMap + .LookupElectricPower(avgEmSpeed, emTorqueMap, DataBus.ExecutionMode != ExecutionMode.Declaration) + .ElectricalPower; - // var retVal = ForwardRequest(absTime, dt, inTorque, inTorque, outAngularVelocity, dryRun); - // retVal.ElectricSystem = electricSystemResponse; - // retVal.ElectricMotor.ElectricMotorPowerMech = 0.SI<Watt>(); - // return retVal; - //} - - if (!dryRun && (eMotorTorque.IsSmaller(maxDriveTorque ?? 0.SI<NewtonMeter>(), 1e-3) || - eMotorTorque.IsGreater(maxRecuperationTorque ?? 0.SI<NewtonMeter>(), 1e-3))) { - if (DataBus.HybridControllerInfo != null && !avgSpeed.IsEqual(DataBus.HybridControllerInfo.ElectricMotorSpeed(Position))) { + var electricSupplyResponse = + ElectricPower.Request(absTime, dt, electricPower, dryRun); + if (!dryRun && !(electricSupplyResponse is ElectricSystemResponseSuccess)) { + if (DataBus.HybridControllerInfo != null && !avgEmSpeed.IsEqual(DataBus.HybridControllerInfo.ElectricMotorSpeed(Position))) { return new ResponseInvalidOperatingPoint(this); } throw new VectoException( - "Invalid operating point provided by strategy! SupportPower: {0}, max Power: {1}, min Power: {2}", - eMotorTorque, - maxDriveTorque, maxRecuperationTorque); + "Invalid operating point provided by strategy! EM Torque: {0}, req. electric Power: {1}, battery demand motor: {3}, max Power from Battery: {2}", + emTorque, electricPower, + emTorque < 0 ? electricSupplyResponse.MaxPowerDrive : electricSupplyResponse.MaxPowerDrag, electricSupplyResponse.ConsumerPower); } + var inTorqueDt = outTorque + emTorqueDt; - var electricPower = ModelData.EfficiencyMap - .LookupElectricPower(avgSpeed, eMotorTorque, DataBus.ExecutionMode != ExecutionMode.Declaration) - .ElectricalPower; - - if (ModelData.DragCurve.Lookup(avgSpeed).IsEqual(eMotorTorque)) { - electricPower = 0.SI<Watt>(); - } - - - var electricSupplyResponse = ElectricPower.Request(absTime, dt, electricPower, dryRun); - //if (!dryRun && !(electricSupplyResponse is ElectricSystemResponseSuccess) && - // electricPower > electricSupplyResponse.MaxPowerDrag) { - // // can't charge all power into the battery - probably it's full - // // dissipate remaining power - // electricSupplyResponse = ElectricPower.Request(absTime, dt, electricSupplyResponse.MaxPowerDrag); - // CurrentState.ElectricBrakePower = electricPower - electricSupplyResponse.MaxPowerDrag; - //} - if (!dryRun && !(electricSupplyResponse is ElectricSystemResponseSuccess)) { - if (DataBus.HybridControllerInfo != null && !avgSpeed.IsEqual(DataBus.HybridControllerInfo.ElectricMotorSpeed(Position))) { - return new ResponseInvalidOperatingPoint(this); + IResponse retVal = null; + if (NextComponent == null) { + // electric motor only + var remainingPower = inTorqueDt * avgDtSpeed; + if (dryRun) { + retVal = new ResponseDryRun(this) { + Engine = { EngineSpeed = avgDtSpeed}, + ElectricMotor = { + ElectricMotorPowerMech = (inTorqueDt - outTorque) * avgDtSpeed, + TotalTorqueDemand = inTorqueDt, + }, + DeltaFullLoad = remainingPower, + DeltaDragLoad = remainingPower, + }; + } else { + + if (remainingPower.IsEqual(0, Constants.SimulationSettings.LineSearchTolerance)) { + if (electricSupplyResponse.MaxPowerDrive.IsGreaterOrEqual(0)) { + retVal = new ResponseBatteryEmpty(this); + } else { + retVal = new ResponseSuccess(this) { + ElectricMotor = { + ElectricMotorPowerMech = (inTorqueDt - outTorque) * avgDtSpeed, + TotalTorqueDemand = inTorqueDt + }, + Engine = { + PowerRequest = 0.SI<Watt>(), + EngineSpeed = outAngularVelocity + }, + }; + } + } else { + if (remainingPower > 0) { + retVal = new ResponseOverload(this) { Delta = remainingPower }; + } else { + retVal = new ResponseUnderload(this) { Delta = remainingPower }; + } + + retVal.Engine.EngineSpeed = avgDtSpeed; + } } - throw new VectoException( - "Invalid operating point provided by strategy! SupportPower: {0}, req. electric Power: {1}, battery demand motor: {3}, max Power from Battery: {2}", - eMotorTorque, electricPower, - eMotorTorque < 0 ? electricSupplyResponse.MaxPowerDrive : electricSupplyResponse.MaxPowerDrag, electricSupplyResponse.ConsumerPower); + } else { + retVal = NextComponent.Request(absTime, dt, inTorqueDt, outAngularVelocity, dryRun); + retVal.ElectricMotor.ElectricMotorPowerMech = (inTorqueDt - outTorque) * avgDtSpeed; + retVal.ElectricMotor.TotalTorqueDemand = inTorqueDt; } - var response = ForwardRequest(absTime, dt, inTorque, inTorque + eMotorTorque, outAngularVelocity, electricSupplyResponse, dryRun); + retVal.ElectricMotor.MaxDriveTorque = maxDriveTorqueDt; + retVal.ElectricMotor.MaxRecuperationTorque = maxRecuperationTorqueDt; + retVal.ElectricMotor.AngularVelocity = avgEmSpeed; + + retVal.ElectricMotor.PowerRequest = outTorque * outAngularVelocity; + retVal.ElectricMotor.InertiaPowerDemand = inertiaTorqueEm * avgEmSpeed; + retVal.ElectricSystem = electricSupplyResponse; + + if (!dryRun) { + CurrentState.EMSpeed = emSpeed; + CurrentState.EMTorque = emTorque; + CurrentState.EmTorqueMap = emTorqueMap; + CurrentState.DragMax = maxRecuperationTorqueEmMap; + CurrentState.DriveMax = maxDriveTorqueEmMap; - response.ElectricSystem = electricSupplyResponse; - response.ElectricMotor.InertiaPowerDemand = inertiaTorqueLoss * avgSpeed; + CurrentState.InertiaTorqueLoss = inertiaTorqueEm; - return response; - } + CurrentState.DrivetrainSpeed = outAngularVelocity; + CurrentState.DrivetrainInTorque = inTorqueDt; + CurrentState.DrivetrainOutTorque = outTorque; - private IResponse ElectricMotorOff(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity, bool dryRun) - { - var avgSpeed = (PreviousState.InAngularVelocity + outAngularVelocity) / 2.0; - var torqueLoss = ModelData.DragCurve.Lookup(avgSpeed); - var inTorque = outTorque + torqueLoss; + CurrentState.TransmissionTorqueLoss = avgDtSpeed.IsEqual(0) ? 0.SI<NewtonMeter>() : + ((inTorqueDt - outTorque) * avgDtSpeed - emTorque * avgEmSpeed) / avgDtSpeed; - if (!dryRun) { - SetState(inTorque, outAngularVelocity); - } - var electricSystemResponse = ElectricPower.Request(absTime, dt, 0.SI<Watt>(), dryRun); + CurrentState.ElectricPowerToBattery = retVal.ElectricSystem?.ConsumerPower; - var retVal = NextComponent == null - ? RequestElectricMotorOnly(absTime, dt, outTorque, inTorque, outAngularVelocity, dryRun, avgSpeed, electricSystemResponse) - : NextComponent.Request(absTime, dt, inTorque, outAngularVelocity, dryRun); - retVal.ElectricMotor.ElectricMotorPowerMech = (inTorque - outTorque) * avgSpeed; - retVal.ElectricSystem = electricSystemResponse; + } return retVal; } - public IResponse ForwardRequest(Second absTime, Second dt, NewtonMeter outTorque, NewtonMeter inTorque, PerSecond outAngularVelocity, - IElectricSystemResponse electricSystemResponse, bool dryRun = false) + private NewtonMeter GetMaxRecuperationTorque(Second absTime, Second dt, PerSecond avgSpeed) { - var avgSpeed = (PreviousState.OutAngularVelocity + outAngularVelocity) / 2; - if (NextComponent == null) - { - return RequestElectricMotorOnly(absTime, dt, outTorque, inTorque, outAngularVelocity, dryRun, avgSpeed, electricSystemResponse); + var tqContinuousPwr = DeRatingActive ? ContinuousTorque : null; + if (!avgSpeed.IsEqual(0)) { + tqContinuousPwr = DeRatingActive ? ModelData.ContinuousPower / avgSpeed : null; } + var maxEmTorque = VectoMath.Min(tqContinuousPwr, ModelData.FullLoadCurve.FullGenerationTorque(avgSpeed)); + var electricSystemResponse = ElectricPower.Request(absTime, dt, 0.SI<Watt>(), true); + var maxBatPower = electricSystemResponse.MaxPowerDrag; - if (!dryRun) { - SetState(inTorque, outAngularVelocity); - } - var retVal = NextComponent.Request(absTime, dt, inTorque, outAngularVelocity, dryRun); - retVal.ElectricMotor.ElectricMotorPowerMech = (inTorque - outTorque) * avgSpeed; - retVal.ElectricMotor.TotalTorqueDemand = inTorque; - return retVal; + var maxBatRecuperationTorque = maxBatPower.IsEqual(0) ? ModelData.DragCurve.Lookup(avgSpeed) : ModelData.EfficiencyMap.LookupTorque(maxBatPower, avgSpeed, maxEmTorque); + var maxTorqueRecuperate = VectoMath.Min(maxEmTorque, maxBatRecuperationTorque); + return maxTorqueRecuperate < 0 ? null : maxTorqueRecuperate; } - private IResponse RequestElectricMotorOnly(Second absTime, Second dt, NewtonMeter outTorque, - NewtonMeter inTorque, PerSecond outAngularVelocity, bool dryRun, PerSecond avgSpeed, - IElectricSystemResponse electricSystemResponse) + private NewtonMeter GetMaxDriveTorque(Second absTime, Second dt, PerSecond avgSpeed) { - var remainingPower = inTorque * avgSpeed; - if (dryRun) { - //var driveTorque = Control.MaxDriveTorque(avgSpeed, dt); - var dragTorque = 0.SI<NewtonMeter>(); //Control.MaxDragTorque(avgSpeed, dt); - var powerDemand = outTorque * avgSpeed; - return new ResponseDryRun(this) { - Engine = { - EngineSpeed = avgSpeed, - }, - ElectricMotor = { - ElectricMotorPowerMech = (inTorque - outTorque) * avgSpeed, - TotalTorqueDemand = inTorque, - }, - DeltaFullLoad = remainingPower, //powerDemand + driveTorque * avgSpeed, - DeltaDragLoad = remainingPower, // powerDemand + dragTorque * avgSpeed, - }; + var tqContinuousPwr = DeRatingActive ? -ContinuousTorque : null; + if (!avgSpeed.IsEqual(0)) { + tqContinuousPwr = DeRatingActive ? -ModelData.ContinuousPower / avgSpeed : null; } + var maxEmTorque = VectoMath.Max(tqContinuousPwr ,ModelData.FullLoadCurve.FullLoadDriveTorque(avgSpeed)); + var electricSystemResponse = ElectricPower.Request(absTime, dt, 0.SI<Watt>(), true); + var maxBatPower = electricSystemResponse.MaxPowerDrive; - //if (!DataBus.GearboxInfo.GearEngaged(absTime)) { - // return RequestDisengagedElectricMotorOnly(absTime, dt, outTorque, inTorque, outAngularVelocity, dryRun, - // avgSpeed, electricSystemResponse); + var maxBatDriveTorque = maxBatPower.IsEqual(0) ? ModelData.DragCurve.Lookup(avgSpeed) : ModelData.EfficiencyMap.LookupTorque(maxBatPower, avgSpeed, maxEmTorque); + //if (maxBatDriveTorque == null) { + // return ModelData.DragCurve.Lookup(avgSpeed); //} + var maxTorqueDrive = VectoMath.Max(maxEmTorque, maxBatDriveTorque); + return maxTorqueDrive > 0 ? null : maxTorqueDrive; + } - if ((inTorque * avgSpeed).IsEqual(0, Constants.SimulationSettings.LineSearchTolerance)) { - SetState(inTorque, outAngularVelocity); - if (electricSystemResponse.MaxPowerDrive.IsGreaterOrEqual(0)) { - return new ResponseBatteryEmpty(this); - } - - return new ResponseSuccess(this) { - ElectricMotor = { - ElectricMotorPowerMech = (inTorque - outTorque) * avgSpeed, - TotalTorqueDemand = inTorque - }, - Engine = { - PowerRequest = 0.SI<Watt>(), - EngineSpeed = outAngularVelocity - }, - }; - } - - AbstractResponse response; - if (remainingPower > 0) { - response = new ResponseOverload(this) { Delta = remainingPower }; - } else { - response = new ResponseUnderload(this) { Delta = remainingPower }; - } + protected NewtonMeter ConvertEmTorqueToDrivetrain(NewtonMeter emTorque) + { + return emTorque * ModelData.Ratio * + (emTorque < 0 ? ModelData.TransmissionEfficiency : 1 / ModelData.TransmissionEfficiency); + } - response.Engine.EngineSpeed = avgSpeed; - return response; + protected NewtonMeter ConvertDrivetrainTorqueToEm(NewtonMeter dtTorque) + { + return dtTorque / ModelData.Ratio * + (dtTorque < 0 ? 1 / ModelData.TransmissionEfficiency : ModelData.TransmissionEfficiency); } - //private IResponse RequestDisengagedElectricMotorOnly(Second absTime, Second dt, NewtonMeter outTorque, - // NewtonMeter inTorque, PerSecond outAngularVelocity, bool dryRun, PerSecond avgSpeed, - // IElectricSystemResponse electricSystemResponse) - //{ - // var angularSpeed = SearchAlgorithm.Search(outAngularVelocity, inTorque, - // Constants.SimulationSettings.EngineIdlingSearchInterval, - // getYValue: t => (NewtonMeter)t, - // evaluateFunction: n => { - // var avg = (PreviousState.InAngularVelocity + n) / 2.0; - // var tDrag = ModelData.DragCurve.Lookup(avg); - // var tInert = Formulas.InertiaPower(n, PreviousState.InAngularVelocity, ModelData.Inertia, dt) / avg; - // return tDrag + tInert; - // }, - // criterion: t => ((NewtonMeter)t).Value()); - // Log.Debug("Found operating point for idling. absTime: {0}, dt: {1}, torque: {2}, angularSpeed: {3}", absTime, dt, - // 0.SI<NewtonMeter>(), angularSpeed); - // SetState(inTorque, angularSpeed); - // return new ResponseSuccess(this) { - // ElectricMotor = { - // ElectricMotorPowerMech = (inTorque - outTorque) * (PreviousState.InAngularVelocity + angularSpeed) / 2.0, - // TotalTorqueDemand = inTorque - // }, - // Engine = { - // PowerRequest = 0.SI<Watt>(), - // EngineSpeed = outAngularVelocity - // }, - // }; - //} - private void SetState(NewtonMeter inTorque, PerSecond outAngularVelocity) + protected override void DoWriteModalResults(Second time, Second simulationInterval, IModalDataContainer container) { - CurrentState.OutAngularVelocity = outAngularVelocity; - CurrentState.InAngularVelocity = outAngularVelocity; - //CurrentState.OutTorque = outTorque; - CurrentState.InTorque = inTorque; - } + var avgEMSpeed = (PreviousState.EMSpeed + CurrentState.EMSpeed) / 2; + var avgDTSpeed = (PreviousState.DrivetrainSpeed + CurrentState.DrivetrainSpeed) / 2; + container[ModalResultField.EM_ratio_, Position] = ModelData.Ratio.SI<Scalar>(); + container[ModalResultField.n_EM_electricMotor_, Position] = avgEMSpeed; + container[ModalResultField.T_EM_electricMotor_, Position] = CurrentState.EMTorque; + container[ModalResultField.T_EM_electricMotor_map_, Position] = CurrentState.EmTorqueMap; + container[ModalResultField.T_EM_electricMotor_drive_max_, Position] = CurrentState.DriveMax; + container[ModalResultField.T_EM_electricMotor_gen_max_, Position] = CurrentState.DragMax; + container[ModalResultField.P_EM_electricMotor_gen_max_, Position] = (CurrentState.DragMax ?? 0.SI<NewtonMeter>()) * avgEMSpeed; + container[ModalResultField.P_EM_electricMotor_drive_max_, Position] = (CurrentState.DriveMax ?? 0.SI<NewtonMeter>()) * avgEMSpeed; + + container[ModalResultField.P_EM_electricMotor_em_mech_, Position] = CurrentState.EMTorque * avgEMSpeed; + container[ModalResultField.P_EM_electricMotor_em_mech_map_, Position] = (CurrentState.EmTorqueMap ?? 0.SI<NewtonMeter>()) * avgEMSpeed; - protected override void DoWriteModalResults(Second time, Second simulationInterval, IModalDataContainer container) - { - var avgSpeed = (PreviousState.OutAngularVelocity + CurrentState.OutAngularVelocity) / 2; - container[ModalResultField.n_electricMotor_, Position] = avgSpeed; - container[ModalResultField.T_electricMotor_, Position] = CurrentState.InTorque - CurrentState.OutTorque; - container[ModalResultField.T_electricMotor_drive_max_, Position] = CurrentState.DriveMax; - container[ModalResultField.T_electricMotor_gen_max_, Position] = CurrentState.DragMax; - container[ModalResultField.P_electricMotor_mech_, Position] = (CurrentState.InTorque - CurrentState.OutTorque) * avgSpeed; - container[ModalResultField.P_electricMotor_out_, Position] = CurrentState.OutTorque * avgSpeed; - container[ModalResultField.P_electricMotor_in_, Position] = CurrentState.InTorque * avgSpeed; - container[ModalResultField.P_electricMotor_el_, Position] = CurrentState.ElectricPowerToBattery; - //container[ModalResultField.P_electricMotor_brake_, Position] = CurrentState.ElectricBrakePower; - container[ModalResultField.P_electricMotor_gen_max_, Position] = (CurrentState.DragMax ?? 0.SI<NewtonMeter>()) * avgSpeed; - container[ModalResultField.P_electricMotor_drive_max_, Position] = (CurrentState.DriveMax ?? 0.SI<NewtonMeter>()) * avgSpeed; - container[ModalResultField.P_electricMotorLoss_, Position] = (CurrentState.InTorque - CurrentState.OutTorque) * avgSpeed - (CurrentState.ElectricPowerToBattery); - container[ModalResultField.P_electricMotorTransmissionLoss_, Position] = 0.SI<Watt>(); - container[ModalResultField.P_electricMotorInertiaLoss_, Position] = CurrentState.InertiaTorqueLoss * avgSpeed; - - var contribution = - (((CurrentState.InTorque - CurrentState.OutTorque) * avgSpeed - - CurrentState.ElectricPowerToBattery) - ContinuousPowerLoss) * simulationInterval; + + container[ModalResultField.P_EM_in_, Position] = CurrentState.DrivetrainInTorque * avgDTSpeed; + container[ModalResultField.P_EM_out_, Position] = CurrentState.DrivetrainOutTorque * avgDTSpeed; + container[ModalResultField.P_EM_mech_, Position] = (CurrentState.DrivetrainInTorque - CurrentState.DrivetrainOutTorque) * avgDTSpeed; + + container[ModalResultField.P_EM_electricMotor_el_, Position] = CurrentState.ElectricPowerToBattery; + + container[ModalResultField.P_EM_electricMotorLoss_, Position] = (CurrentState.EmTorqueMap ?? 0.SI<NewtonMeter>()) * avgEMSpeed - CurrentState.ElectricPowerToBattery; + + container[ModalResultField.P_EM_TransmissionLoss_, Position] = CurrentState.TransmissionTorqueLoss * avgDTSpeed; + + container[ModalResultField.P_EM_electricMotorInertiaLoss_, Position] = CurrentState.InertiaTorqueLoss * avgEMSpeed; + + container[ModalResultField.P_EM_loss_, Position] = (CurrentState.DrivetrainInTorque - CurrentState.DrivetrainOutTorque) * avgDTSpeed - CurrentState.ElectricPowerToBattery; + + container[ModalResultField.EM_Off_, Position] = CurrentState.EMTorque == null ? 1.SI<Scalar>() : 0.SI<Scalar>(); + + var losses = (CurrentState.EmTorqueMap ?? 0.SI<NewtonMeter>()) * avgEMSpeed - CurrentState.ElectricPowerToBattery; + var contribution = (losses - ContinuousPowerLoss) * simulationInterval; container[ModalResultField.ElectricMotor_OvlBuffer_, Position] = VectoMath.Max(0, (ThermalBuffer + contribution) / OverloadBuffer); } protected override void DoCommitSimulationStep(Second time, Second simulationInterval) { - var avgSpeed = (PreviousState.OutAngularVelocity + CurrentState.OutAngularVelocity) / 2; - var losses = (CurrentState.InTorque - CurrentState.OutTorque) * avgSpeed - (CurrentState.ElectricPowerToBattery); + var avgSpeed = (PreviousState.EMSpeed + CurrentState.EMSpeed) / 2; + var losses = CurrentState.EMTorque * avgSpeed - CurrentState.ElectricPowerToBattery; ThermalBuffer += (losses - ContinuousPowerLoss) * simulationInterval; if (ThermalBuffer < 0) { ThermalBuffer = 0.SI<Joule>(); @@ -461,7 +402,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl public PerSecond ElectricMotorSpeed { - get { return PreviousState.InAngularVelocity; } + get { return PreviousState.EMSpeed; } } public void Connect(IElectricSystem powersupply) @@ -470,12 +411,23 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl } } - public class ElectricMotorState : SimpleComponentState + public class ElectricMotorState // : SimpleComponentState { + + public PerSecond DrivetrainSpeed; + public NewtonMeter DrivetrainInTorque; + public NewtonMeter DrivetrainOutTorque; + public NewtonMeter TransmissionTorqueLoss; + + public PerSecond EMSpeed; + public NewtonMeter EMTorque; + public NewtonMeter EmTorqueMap; + public NewtonMeter DriveMax; public NewtonMeter DragMax; - public Watt ElectricPowerToBattery; - //public Watt ElectricBrakePower = 0.SI<Watt>(); public NewtonMeter InertiaTorqueLoss; + + + public Watt ElectricPowerToBattery; } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs index 9ac3583b32..3ec161f248 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs @@ -563,7 +563,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl NextComponent.Request(absTime, Constants.SimulationSettings.TargetTimeInterval, inTorque, inAngularVelocity, true); //NextComponent.Initialize(inTorque, inAngularVelocity); - var fullLoad = -DataBus.ElectricMotorInfo(PowertrainPosition.BatteryElectricB2).MaxPowerDrive(inAngularVelocity); + var fullLoad = -DataBus.ElectricMotorInfo(PowertrainPosition.BatteryElectricE2).MaxPowerDrive(inAngularVelocity); Gear = oldGear; return new ResponseDryRun(this, response) { diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/PEVAMTShiftStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/PEVAMTShiftStrategy.cs index 98469d1461..37182493bb 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/PEVAMTShiftStrategy.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/PEVAMTShiftStrategy.cs @@ -53,9 +53,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl } ModelData = dataBus.RunData.GearboxData; PowerMap = dataBus.RunData.ElectricMachinesData - .FirstOrDefault(x => x.Item1 == PowertrainPosition.BatteryElectricB2)?.Item2.EfficiencyMap; + .FirstOrDefault(x => x.Item1 == PowertrainPosition.BatteryElectricE2)?.Item2.EfficiencyMap; FullLoadCurve = dataBus.RunData.ElectricMachinesData - .FirstOrDefault(x => x.Item1 == PowertrainPosition.BatteryElectricB2)?.Item2.FullLoadCurve; + .FirstOrDefault(x => x.Item1 == PowertrainPosition.BatteryElectricE2)?.Item2.FullLoadCurve; DataBus = dataBus; EarlyShiftUp = true; @@ -240,7 +240,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl var vDrop = DataBus.VehicleInfo.VehicleSpeed - estimatedVelocityPostShift; var vehicleSpeedPostShift = DataBus.VehicleInfo.VehicleSpeed - vDrop * shiftStrategyParameters.VelocityDropFactor; - var totalTransmissionRatio = DataBus.ElectricMotorInfo(PowertrainPosition.BatteryElectricB2).ElectricMotorSpeed / DataBus.VehicleInfo.VehicleSpeed; + var totalTransmissionRatio = DataBus.ElectricMotorInfo(PowertrainPosition.BatteryElectricE2).ElectricMotorSpeed / DataBus.VehicleInfo.VehicleSpeed; //var totalTransmissionRatio = outAngularVelocity / DataBus.VehicleSpeed; var results = new List<Tuple<uint, double>>(); @@ -607,7 +607,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl { return (outAngularSpeed * ModelData.Gears[gear].Ratio).IsGreaterOrEqual(VectoMath.Min(ModelData.Gears[gear].MaxSpeed, - DataBus.ElectricMotorInfo(PowertrainPosition.BatteryElectricB2).MaxSpeed)); + DataBus.ElectricMotorInfo(PowertrainPosition.BatteryElectricE2).MaxSpeed)); } public void Disengage(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity) { } diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Vehicle.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Vehicle.cs index 41e65280e5..6b21ee7b75 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Vehicle.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Vehicle.cs @@ -64,44 +64,13 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl } var model = container.RunData; - if (container.PowertrainInfo.HasCombustionEngine) { - if (model?.GearboxData == null || model.AxleGearData == null) { - return; - } - MaxVehicleSpeed = model.EngineData.FullLoadCurves[0].N95hSpeed / - model.GearboxData.Gears[model.GearboxData.Gears.Keys.Max()].Ratio / - model.AxleGearData.AxleGear.Ratio / - (model.AngledriveData?.Angledrive.Ratio - ?? 1.0) * model.VehicleData.DynamicTyreRadius * 0.995; - } - - if (model.ElectricMachinesData.Count > 0) { - var positions = model.ElectricMachinesData.Select(x => x.Item1).ToArray(); - if (positions.Length > 1) { - throw new VectoException("Multiple electrical machines are currently not supported"); - } - - var pos = positions.First(); - if (pos.IsBatteryElectric()) { - var maxEMSpeed = model.ElectricMachinesData.Find(x => x.Item1 == pos).Item2.FullLoadCurve.MaxSpeed; - var ratio = 1.0; - if (pos == PowertrainPosition.BatteryElectricB3) { - ratio = model.AxleGearData.AxleGear.Ratio; - } - - if (pos == PowertrainPosition.BatteryElectricB2) { - ratio = model.GearboxData.Gears[model.GearboxData.Gears.Keys.Max()].Ratio * - model.AxleGearData.AxleGear.Ratio * - (model.AngledriveData?.Angledrive.Ratio ?? 1.0); - } - MaxVehicleSpeed = maxEMSpeed / ratio * model.VehicleData.DynamicTyreRadius * 0.995; - } - } + } public IResponse Initialize(MeterPerSecond vehicleSpeed, Radian roadGradient) { + SetMaxVehicleSpeed(); PreviousState = new VehicleState { Distance = DataBus.DrivingCycleInfo.CycleStartDistance, Velocity = vehicleSpeed, @@ -116,6 +85,46 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl return NextComponent?.Initialize(PreviousState.VehicleTractionForce, vehicleSpeed); } + protected virtual void SetMaxVehicleSpeed() + { + if (DataBus.PowertrainInfo.HasCombustionEngine) { + if (DataBus.GearboxInfo == null || DataBus.AxlegearInfo == null) { + throw new VectoException("Powertrain with combustion engine requires gearbox and axlegear!"); + //return; + } + MaxVehicleSpeed = DataBus.EngineInfo.EngineN95hSpeed / + DataBus.GearboxInfo.GetGearData(DataBus.GearboxInfo.NumGears).Ratio / + DataBus.AxlegearInfo.Ratio / + (DataBus.AngledriveInfo?.Ratio ?? 1.0) * + DataBus.WheelsInfo.DynamicTyreRadius * 0.995; + } + + + if (DataBus.PowertrainInfo.HasElectricMotor) { + var positions = DataBus.PowertrainInfo.ElectricMotorPositions; + if (positions.Length > 1) { + throw new VectoException("Multiple electrical machines are currently not supported"); + } + + var pos = positions.First(); + if (pos.IsBatteryElectric()) { + var maxEMSpeed = DataBus.ElectricMotorInfo(pos).MaxSpeed; + + var ratio = 1.0; + if (pos == PowertrainPosition.BatteryElectricE3) { + ratio = DataBus.AxlegearInfo.Ratio; + } + + if (pos == PowertrainPosition.BatteryElectricE2) { + ratio = DataBus.GearboxInfo.GetGearData(DataBus.GearboxInfo.NumGears).Ratio * + DataBus.AxlegearInfo.Ratio * + (DataBus.AngledriveInfo?.Ratio ?? 1.0); + } + MaxVehicleSpeed = maxEMSpeed / ratio * DataBus.WheelsInfo.DynamicTyreRadius * 0.995; + } + } + } + public IResponse Initialize(MeterPerSecond vehicleSpeed, Radian roadGradient, MeterPerSquareSecond startAcceleration) { //CurrentState.Velocity = vehicleSpeed + startAcceleration * Constants.SimulationSettings.TargetTimeInterval; @@ -216,7 +225,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl return retVal; } - public MeterPerSecond MaxVehicleSpeed { get; } + public MeterPerSecond MaxVehicleSpeed { get; set; } public Newton AirDragResistance(MeterPerSecond previousVelocity, MeterPerSecond nextVelocity) { diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/VelocitySpeedGearshiftPreprocessor.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/VelocitySpeedGearshiftPreprocessor.cs index 040cc1f1bb..45b4997ec4 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/VelocitySpeedGearshiftPreprocessor.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/VelocitySpeedGearshiftPreprocessor.cs @@ -204,14 +204,14 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl protected override PerSecond GetMotorTargetSpeed(VectoRunData runData) { return 0.5 * runData.ElectricMachinesData - .FirstOrDefault(x => x.Item1 == PowertrainPosition.BatteryElectricB2)?.Item2.FullLoadCurve + .FirstOrDefault(x => x.Item1 == PowertrainPosition.BatteryElectricE2)?.Item2.FullLoadCurve .MaxSpeed; } protected override PerSecond GetMaxMotorspeed(VectoRunData runData) { return runData.ElectricMachinesData - .FirstOrDefault(x => x.Item1 == PowertrainPosition.BatteryElectricB2)?.Item2.FullLoadCurve + .FirstOrDefault(x => x.Item1 == PowertrainPosition.BatteryElectricE2)?.Item2.FullLoadCurve .MaxSpeed; } } diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Wheels.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Wheels.cs index 73e3312961..9e9b33c285 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Wheels.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Wheels.cs @@ -42,7 +42,6 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl public class Wheels : StatefulProviderComponent<Wheels.WheelsState, IFvOutPort, ITnInPort, ITnOutPort>, IWheels, IFvOutPort, ITnInPort { - private readonly Meter _dynamicWheelRadius; private readonly KilogramSquareMeter _totalWheelsInertia; public class WheelsState @@ -55,14 +54,14 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl public Wheels(IVehicleContainer cockpit, Meter rdyn, KilogramSquareMeter totalWheelsInertia) : base(cockpit) { - _dynamicWheelRadius = rdyn; + DynamicTyreRadius = rdyn; _totalWheelsInertia = totalWheelsInertia; } public IResponse Initialize(Newton force, MeterPerSecond velocity) { - PreviousState.TorqueIn = force * _dynamicWheelRadius; - PreviousState.AngularVelocity = velocity / _dynamicWheelRadius; + PreviousState.TorqueIn = force * DynamicTyreRadius; + PreviousState.AngularVelocity = velocity / DynamicTyreRadius; PreviousState.InertiaTorqueLoss = 0.SI<NewtonMeter>(); return NextComponent.Initialize(PreviousState.TorqueIn, PreviousState.AngularVelocity); @@ -72,13 +71,13 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl { Log.Debug("request: force: {0}, velocity: {1}", force, velocity); - CurrentState.AngularVelocity = velocity / _dynamicWheelRadius; + CurrentState.AngularVelocity = velocity / DynamicTyreRadius; var avgAngularSpeed = (CurrentState.AngularVelocity + PreviousState.AngularVelocity) / 2.0; CurrentState.InertiaTorqueLoss = avgAngularSpeed.IsEqual(0.SI<PerSecond>()) ? 0.SI<NewtonMeter>() : Formulas.InertiaPower(CurrentState.AngularVelocity, PreviousState.AngularVelocity, _totalWheelsInertia, dt) / avgAngularSpeed; //(_totalWheelsInertia * avgAngularSpeed / dt).Cast<NewtonMeter>(); - CurrentState.TorqueIn = force * _dynamicWheelRadius + CurrentState.InertiaTorqueLoss; + CurrentState.TorqueIn = force * DynamicTyreRadius + CurrentState.InertiaTorqueLoss; var retVal = NextComponent.Request(absTime, dt, CurrentState.TorqueIn, CurrentState.AngularVelocity, dryRun); @@ -96,7 +95,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl public Kilogram ReducedMassWheels { - get { return (_totalWheelsInertia / _dynamicWheelRadius / _dynamicWheelRadius).Cast<Kilogram>(); } + get { return (_totalWheelsInertia / DynamicTyreRadius / DynamicTyreRadius).Cast<Kilogram>(); } } + + public Meter DynamicTyreRadius { get; } } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs index d385888f12..32b11ca845 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs @@ -1279,11 +1279,11 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies (DataBus.ElectricMotorInfo(pos) as ElectricMotor).DeRatingActive; if (/*nextGear != DataBus.GearboxInfo.Gear && */TestPowertrain.ElectricMotorP2 != null) { - TestPowertrain.ElectricMotorP2.PreviousState.OutAngularVelocity = + TestPowertrain.ElectricMotorP2.PreviousState.EMSpeed = DataBus.ElectricMotorInfo(PowertrainPosition.HybridP2).ElectricMotorSpeed; } if (/*nextGear != DataBus.GearboxInfo.Gear && */TestPowertrain.ElectricMotorP3 != null) { - TestPowertrain.ElectricMotorP3.PreviousState.OutAngularVelocity = + TestPowertrain.ElectricMotorP3.PreviousState.EMSpeed = DataBus.ElectricMotorInfo(PowertrainPosition.HybridP3).ElectricMotorSpeed; } diff --git a/VectoCore/VectoCore/OutputData/IModalDataContainer.cs b/VectoCore/VectoCore/OutputData/IModalDataContainer.cs index fad3bc204a..8659e62b7a 100644 --- a/VectoCore/VectoCore/OutputData/IModalDataContainer.cs +++ b/VectoCore/VectoCore/OutputData/IModalDataContainer.cs @@ -126,11 +126,16 @@ namespace TUGraz.VectoCore.OutputData bool HasCombustionEngine { get; } WattSecond TotalElectricMotorWorkDrive(PowertrainPosition emPos); WattSecond TotalElectricMotorWorkRecuperate(PowertrainPosition emPos); + WattSecond TotalElectricMotorMotWorkDrive(PowertrainPosition emPos); + WattSecond TotalElectricMotorMotWorkRecuperate(PowertrainPosition emPos); PerSecond ElectricMotorAverageSpeed(PowertrainPosition emPos); double ElectricMotorEfficiencyDrive(PowertrainPosition emPos); double ElectricMotorEfficiencyGenerate(PowertrainPosition emPos); + double ElectricMotorMotEfficiencyDrive(PowertrainPosition emPos); + double ElectricMotorMotEfficiencyGenerate(PowertrainPosition emPos); WattSecond ElectricMotorOffLosses(PowertrainPosition emPos); WattSecond ElectricMotorLosses(PowertrainPosition emPos); + WattSecond ElectricMotorMotLosses(PowertrainPosition emPos); WattSecond ElectricMotorTransmissionLosses(PowertrainPosition emPos); double BatteryStartSoC(); diff --git a/VectoCore/VectoCore/OutputData/ModalDataContainer.cs b/VectoCore/VectoCore/OutputData/ModalDataContainer.cs index 82aed0a061..22131e5438 100644 --- a/VectoCore/VectoCore/OutputData/ModalDataContainer.cs +++ b/VectoCore/VectoCore/OutputData/ModalDataContainer.cs @@ -65,14 +65,32 @@ namespace TUGraz.VectoCore.OutputData private Meter _distance; private readonly ModalResultField[] _electricMotorColumns = new[] { - ModalResultField.n_electricMotor_, ModalResultField.T_electricMotor_, - ModalResultField.T_electricMotor_drive_max_, ModalResultField.T_electricMotor_gen_max_, - ModalResultField.P_electricMotor_in_, ModalResultField.P_electricMotor_out_, - ModalResultField.P_electricMotor_mech_, ModalResultField.P_electricMotor_el_, - ModalResultField.P_electricMotorLoss_, ModalResultField.P_electricMotorInertiaLoss_, - ModalResultField.P_electricMotorTransmissionLoss_, - /*ModalResultField.P_electricMotor_brake_,*/ ModalResultField.P_electricMotor_drive_max_, - ModalResultField.P_electricMotor_gen_max_, ModalResultField.ElectricMotor_OvlBuffer_ + ModalResultField.EM_ratio_, + ModalResultField.P_EM_out_, + ModalResultField.P_EM_mech_, + ModalResultField.P_EM_in_, + + ModalResultField.P_EM_TransmissionLoss_, + ModalResultField.P_EM_electricMotor_em_mech_, + ModalResultField.P_EM_electricMotorInertiaLoss_, + ModalResultField.P_EM_electricMotor_em_mech_map_, + ModalResultField.P_EM_electricMotorLoss_, + ModalResultField.P_EM_electricMotor_el_, + + ModalResultField.P_EM_loss_, + + ModalResultField.n_EM_electricMotor_, + ModalResultField.T_EM_electricMotor_, + ModalResultField.T_EM_electricMotor_map_, + + ModalResultField.T_EM_electricMotor_drive_max_, + ModalResultField.T_EM_electricMotor_gen_max_, + + ModalResultField.P_EM_electricMotor_drive_max_, + ModalResultField.P_EM_electricMotor_gen_max_, + + ModalResultField.ElectricMotor_OvlBuffer_, + ModalResultField.EM_Off_, }; public static readonly IList<ModalResultField> FuelConsumptionSignals = new[] { @@ -258,7 +276,21 @@ namespace TUGraz.VectoCore.OutputData if (!_eEmDrive.ContainsKey(emPos)) { _eEmDrive[emPos] = TimeIntegral<WattSecond>( - string.Format(ModalResultField.P_electricMotor_mech_.GetCaption(), emPos.GetName()), x => x < 0); + string.Format(ModalResultField.P_EM_mech_.GetCaption(), emPos.GetName()), x => x < 0); + } + + return -_eEmDrive[emPos]; + } + + public WattSecond TotalElectricMotorMotWorkDrive(PowertrainPosition emPos) + { + if (!ElectricMotors.Contains(emPos)) { + return null; + } + + if (!_eEmDrive.ContainsKey(emPos)) { + _eEmDrive[emPos] = TimeIntegral<WattSecond>( + string.Format(ModalResultField.P_EM_electricMotor_em_mech_.GetCaption(), emPos.GetName()), x => x < 0); } return -_eEmDrive[emPos]; @@ -272,12 +304,28 @@ namespace TUGraz.VectoCore.OutputData if (!_eEmRecuperate.ContainsKey(emPos)) { _eEmRecuperate[emPos] = TimeIntegral<WattSecond>( - string.Format(ModalResultField.P_electricMotor_mech_.GetCaption(), emPos.GetName()), x => x > 0); ; + string.Format(ModalResultField.P_EM_mech_.GetCaption(), emPos.GetName()), x => x > 0); ; } return _eEmRecuperate[emPos]; } + public WattSecond TotalElectricMotorMotWorkRecuperate(PowertrainPosition emPos) + { + if (!ElectricMotors.Contains(emPos)) { + return null; + } + + if (!_eEmRecuperate.ContainsKey(emPos)) { + _eEmRecuperate[emPos] = TimeIntegral<WattSecond>( + string.Format(ModalResultField.P_EM_electricMotor_em_mech_.GetCaption(), emPos.GetName()), x => x > 0); + ; + } + + return _eEmRecuperate[emPos]; + } + + public double ElectricMotorEfficiencyDrive(PowertrainPosition emPos) { if (!ElectricMotors.Contains(emPos)) { @@ -287,11 +335,11 @@ namespace TUGraz.VectoCore.OutputData var selected = Data.AsEnumerable().Cast<DataRow>().Select(r => { var dt = r.Field<Second>(ModalResultField.simulationInterval.GetName()); return new { - P_em = r.Field<Watt>(string.Format(ModalResultField.P_electricMotor_el_.GetCaption(), + P_em = r.Field<Watt>(string.Format(ModalResultField.P_EM_electricMotor_el_.GetCaption(), emPos.GetName())), - E_mech = r.Field<Watt>(string.Format(ModalResultField.P_electricMotor_mech_.GetCaption(), + E_mech = r.Field<Watt>(string.Format(ModalResultField.P_EM_mech_.GetCaption(), emPos.GetName())) * dt, - E_el = r.Field<Watt>(string.Format(ModalResultField.P_electricMotor_el_.GetCaption(), + E_el = r.Field<Watt>(string.Format(ModalResultField.P_EM_electricMotor_el_.GetCaption(), emPos.GetName())) * dt, }; }); @@ -305,6 +353,34 @@ namespace TUGraz.VectoCore.OutputData return eMech.Value() / eEl.Value(); } + public double ElectricMotorMotEfficiencyDrive(PowertrainPosition emPos) + { + if (!ElectricMotors.Contains(emPos)) { + return double.NaN; + } + + var selected = Data.AsEnumerable().Cast<DataRow>().Select(r => { + var dt = r.Field<Second>(ModalResultField.simulationInterval.GetName()); + return new { + P_em = r.Field<Watt>(string.Format(ModalResultField.P_EM_electricMotor_el_.GetCaption(), + emPos.GetName())), + E_mech = r.Field<Watt>(string.Format(ModalResultField.P_EM_electricMotor_em_mech_.GetCaption(), + emPos.GetName())) * dt, + E_el = r.Field<Watt>(string.Format(ModalResultField.P_EM_electricMotor_el_.GetCaption(), + emPos.GetName())) * dt, + }; + }); + var eMech = 0.SI<WattSecond>(); + var eEl = 0.SI<WattSecond>(); + foreach (var entry in selected.Where(x => x.P_em.IsSmaller(0))) { + eMech += entry.E_mech; + eEl += entry.E_el; + } + + return eMech.Value() / eEl.Value(); + } + + public double ElectricMotorEfficiencyGenerate(PowertrainPosition emPos) { if (!ElectricMotors.Contains(emPos)) { @@ -314,11 +390,11 @@ namespace TUGraz.VectoCore.OutputData var dt = r.Field<Second>(ModalResultField.simulationInterval.GetName()); return new { - P_em = r.Field<Watt>(string.Format(ModalResultField.P_electricMotor_el_.GetCaption(), + P_em = r.Field<Watt>(string.Format(ModalResultField.P_EM_electricMotor_el_.GetCaption(), emPos.GetName())), - E_mech = r.Field<Watt>(string.Format(ModalResultField.P_electricMotor_mech_.GetCaption(), + E_mech = r.Field<Watt>(string.Format(ModalResultField.P_EM_mech_.GetCaption(), emPos.GetName())) * dt, - E_el = r.Field<Watt>(string.Format(ModalResultField.P_electricMotor_el_.GetCaption(), + E_el = r.Field<Watt>(string.Format(ModalResultField.P_EM_electricMotor_el_.GetCaption(), emPos.GetName())) * dt, }; }); @@ -334,6 +410,33 @@ namespace TUGraz.VectoCore.OutputData return eff; } + public double ElectricMotorMotEfficiencyGenerate(PowertrainPosition emPos) + { + if (!ElectricMotors.Contains(emPos)) { + return double.NaN; + } + var selected = Data.AsEnumerable().Cast<DataRow>().Select(r => { + var dt = r.Field<Second>(ModalResultField.simulationInterval.GetName()); + return new { + P_em = r.Field<Watt>(string.Format(ModalResultField.P_EM_electricMotor_el_.GetCaption(), + emPos.GetName())), + E_mech = r.Field<Watt>(string.Format(ModalResultField.P_EM_electricMotor_em_mech_.GetCaption(), + emPos.GetName())) * dt, + E_el = r.Field<Watt>(string.Format(ModalResultField.P_EM_electricMotor_el_.GetCaption(), + emPos.GetName())) * dt, + }; + }); + var eMech = 0.SI<WattSecond>(); + var eEl = 0.SI<WattSecond>(); + foreach (var entry in selected.Where(x => x.P_em.IsGreater(0))) { + eMech += entry.E_mech; + eEl += entry.E_el; + } + + var eff = eEl.Value() / eMech.Value(); + return eff; + } + public WattSecond ElectricMotorOffLosses(PowertrainPosition emPos) { if (!ElectricMotors.Contains(emPos)) { @@ -343,9 +446,9 @@ namespace TUGraz.VectoCore.OutputData var dt = r.Field<Second>(ModalResultField.simulationInterval.GetName()); return new { - P_em = r.Field<Watt>(string.Format(ModalResultField.P_electricMotor_el_.GetCaption(), + P_em = r.Field<Watt>(string.Format(ModalResultField.P_EM_electricMotor_el_.GetCaption(), emPos.GetName())), - E_mech = r.Field<Watt>(string.Format(ModalResultField.P_electricMotorLoss_.GetCaption(), + E_mech = r.Field<Watt>(string.Format(ModalResultField.P_EM_electricMotorLoss_.GetCaption(), emPos.GetName())) * dt, }; }); @@ -356,7 +459,16 @@ namespace TUGraz.VectoCore.OutputData { return Data.AsEnumerable().Cast<DataRow>().Sum(r => { var dt = r.Field<Second>(ModalResultField.simulationInterval.GetName()); - return r.Field<Watt>(string.Format(ModalResultField.P_electricMotorLoss_.GetCaption(), + return r.Field<Watt>(string.Format(ModalResultField.P_EM_loss_.GetCaption(), + emPos.GetName())) * dt; + }); + } + + public WattSecond ElectricMotorMotLosses(PowertrainPosition emPos) + { + return Data.AsEnumerable().Cast<DataRow>().Sum(r => { + var dt = r.Field<Second>(ModalResultField.simulationInterval.GetName()); + return r.Field<Watt>(string.Format(ModalResultField.P_EM_electricMotorLoss_.GetCaption(), emPos.GetName())) * dt; }); } @@ -365,14 +477,14 @@ namespace TUGraz.VectoCore.OutputData { return Data.AsEnumerable().Cast<DataRow>().Sum(r => { var dt = r.Field<Second>(ModalResultField.simulationInterval.GetName()); - return r.Field<Watt>(string.Format(ModalResultField.P_electricMotorTransmissionLoss_.GetCaption(), + return r.Field<Watt>(string.Format(ModalResultField.P_EM_TransmissionLoss_.GetCaption(), emPos.GetName())) * dt; }); } public PerSecond ElectricMotorAverageSpeed(PowertrainPosition emPos) { - var integral = GetValues(x => x.Field<PerSecond>(string.Format(ModalResultField.n_electricMotor_.GetCaption(), emPos.GetName())).Value() * + var integral = GetValues(x => x.Field<PerSecond>(string.Format(ModalResultField.n_EM_electricMotor_.GetCaption(), emPos.GetName())).Value() * x.Field<Second>(ModalResultField.simulationInterval.GetName()).Value()).Sum(); return (integral / Duration.Value()).SI<PerSecond>(); } diff --git a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs index 16f553f788..070f562848 100644 --- a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs +++ b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs @@ -724,14 +724,25 @@ namespace TUGraz.VectoCore.OutputData foreach (var em in runData.ElectricMachinesData) { var emColumns = new List<Tuple<string, ConvertedSI>>() { - Tuple.Create(Fields.E_EM_DRIVE_FORMAT, modData.TotalElectricMotorWorkDrive(em.Item1).ConvertToKiloWattHour()), + Tuple.Create(Fields.EM_AVG_SPEED_FORMAT, modData.ElectricMotorAverageSpeed(em.Item1).ConvertToRoundsPerMinute()), + + Tuple.Create(Fields.E_EM_Mot_DRIVE_FORMAT, modData.TotalElectricMotorMotWorkDrive(em.Item1).ConvertToKiloWattHour()), + Tuple.Create(Fields.E_EM_Mot_GENERATE_FORMAT, modData.TotalElectricMotorMotWorkRecuperate(em.Item1).ConvertToKiloWattHour()), + + Tuple.Create(Fields.ETA_EM_Mot_DRIVE_FORMAT, new ConvertedSI(modData.ElectricMotorMotEfficiencyDrive(em.Item1), "")), + Tuple.Create(Fields.ETA_EM_Mot_GEN_FORMAT, new ConvertedSI(modData.ElectricMotorMotEfficiencyGenerate(em.Item1), "")), + + + Tuple.Create(Fields.E_EM_DRIVE_FORMAT, modData.TotalElectricMotorWorkDrive(em.Item1).ConvertToKiloWattHour()), Tuple.Create(Fields.E_EM_GENERATE_FORMAT, modData.TotalElectricMotorWorkRecuperate(em.Item1).ConvertToKiloWattHour()), - Tuple.Create(Fields.E_EM_AVG_SPEED_FORMAT, modData.ElectricMotorAverageSpeed(em.Item1).ConvertToRoundsPerMinute()), - Tuple.Create(Fields.E_EM_ETA_DRIVE_FORMAT, new ConvertedSI(modData.ElectricMotorEfficiencyDrive(em.Item1), "")), - Tuple.Create(Fields.E_EM_ETA_GEN_FORMAT, new ConvertedSI(modData.ElectricMotorEfficiencyGenerate(em.Item1), "")), + + Tuple.Create(Fields.ETA_EM_DRIVE_FORMAT, new ConvertedSI(modData.ElectricMotorEfficiencyDrive(em.Item1), "")), + Tuple.Create(Fields.ETA_EM_GEN_FORMAT, new ConvertedSI(modData.ElectricMotorEfficiencyGenerate(em.Item1), "")), + Tuple.Create(Fields.E_EM_OFF_Loss_Format, modData.ElectricMotorOffLosses(em.Item1).ConvertToKiloWattHour()), - Tuple.Create(Fields.E_EM_LOSS_FORMAT, modData.ElectricMotorLosses(em.Item1).ConvertToKiloWattHour()), - Tuple.Create(Fields.E_EM_LOSS_TRANSM_FORMAT, modData.ElectricMotorTransmissionLosses(em.Item1).ConvertToKiloWattHour()) + Tuple.Create(Fields.E_EM_LOSS_TRANSM_FORMAT, modData.ElectricMotorTransmissionLosses(em.Item1).ConvertToKiloWattHour()), + Tuple.Create(Fields.E_EM_Mot_LOSS_FORMAT, modData.ElectricMotorLosses(em.Item1).ConvertToKiloWattHour()), + Tuple.Create(Fields.E_EM_LOSS_FORMAT, modData.ElectricMotorMotLosses(em.Item1).ConvertToKiloWattHour()), }; emColumns.Reverse(); foreach (var entry in emColumns) { @@ -1311,12 +1322,20 @@ namespace TUGraz.VectoCore.OutputData public const string E_EM_DRIVE_FORMAT = "E_EM_{0}_drive [kWh]"; public const string E_EM_GENERATE_FORMAT = "E_EM_{0}_gen [kWh]"; - public const string E_EM_AVG_SPEED_FORMAT = "n_EM_{0}_avg [rpm]"; - public const string E_EM_ETA_DRIVE_FORMAT = "η_EM_{0}_drive"; - public const string E_EM_ETA_GEN_FORMAT = "η_EM_{0}_gen"; + public const string ETA_EM_DRIVE_FORMAT = "η_EM_{0}_drive"; + public const string ETA_EM_GEN_FORMAT = "η_EM_{0}_gen"; + + public const string E_EM_Mot_DRIVE_FORMAT = "E_EM_{0}-em_drive [kWh]"; + public const string E_EM_Mot_GENERATE_FORMAT = "E_EM_{0}-em_gen [kWh]"; + public const string ETA_EM_Mot_DRIVE_FORMAT = "η_EM_{0}-em_drive"; + public const string ETA_EM_Mot_GEN_FORMAT = "η_EM_{0}-em_gen"; + + public const string EM_AVG_SPEED_FORMAT = "n_EM_{0}-em_avg [rpm]"; + public const string E_EM_OFF_Loss_Format = "E_EM_{0}_off_loss [kWh]"; - public const string E_EM_LOSS_FORMAT = "E_EM_{0}_loss [kWh]"; public const string E_EM_LOSS_TRANSM_FORMAT = "E_EM_{0}_transm_loss [kWh]"; + public const string E_EM_Mot_LOSS_FORMAT = "E_EM_{0}-em_loss [kWh]"; + public const string E_EM_LOSS_FORMAT = "E_EM_{0}_loss [kWh]"; public const string REESS_StartSoC = "REESS Start SoC [%]"; diff --git a/VectoCore/VectoCoreTest/FileIO/JsonReadHybridTest.cs b/VectoCore/VectoCoreTest/FileIO/JsonReadHybridTest.cs index 1ced8a5152..a9c6fab0bb 100644 --- a/VectoCore/VectoCoreTest/FileIO/JsonReadHybridTest.cs +++ b/VectoCore/VectoCoreTest/FileIO/JsonReadHybridTest.cs @@ -64,7 +64,7 @@ namespace TUGraz.VectoCore.Tests.FileIO Assert.AreEqual("401.07", fld.Rows[0][ElectricFullLoadCurveReader.Fields.DrivingTorque]); Assert.AreEqual("-401.07", fld.Rows[0][ElectricFullLoadCurveReader.Fields.GenerationTorque]); - var fldMap = ElectricFullLoadCurveReader.Create(fld, 1, 1, 1); + var fldMap = ElectricFullLoadCurveReader.Create(fld, 1); Assert.AreEqual(-401.07, fldMap.FullLoadDriveTorque(0.RPMtoRad()).Value()); Assert.AreEqual(401.07, fldMap.FullGenerationTorque(0.RPMtoRad()).Value()); @@ -73,7 +73,7 @@ namespace TUGraz.VectoCore.Tests.FileIO Assert.AreEqual("-800", pwr.Rows[0][ElectricMotorMapReader.Fields.Torque]); Assert.AreEqual("9.8449", pwr.Rows[0][ElectricMotorMapReader.Fields.PowerElectrical]); - var pwrMap = ElectricMotorMapReader.Create(pwr, 1, 1, 1); + var pwrMap = ElectricMotorMapReader.Create(pwr, 1); Assert.AreEqual(-10171.0, pwrMap.LookupElectricPower(-0.RPMtoRad(), -800.SI<NewtonMeter>()).ElectricalPower.Value()); Assert.AreEqual(-20430.186, pwrMap.LookupElectricPower(120.RPMtoRad(), -800.SI<NewtonMeter>()).ElectricalPower.Value(), 1e-3); @@ -93,22 +93,22 @@ namespace TUGraz.VectoCore.Tests.FileIO Assert.AreEqual("401.07", fld.Rows[0][ElectricFullLoadCurveReader.Fields.DrivingTorque]); Assert.AreEqual("-401.07", fld.Rows[0][ElectricFullLoadCurveReader.Fields.GenerationTorque]); - var fldMap = ElectricFullLoadCurveReader.Create(fld, 22.6, 2, 0.97); - Assert.AreEqual(-17584.51308 , fldMap.FullLoadDriveTorque(0.RPMtoRad()).Value(), 1e-3); - Assert.AreEqual(18689.03505, fldMap.FullGenerationTorque(0.RPMtoRad()).Value(), 1e-3); + var fldMap = ElectricFullLoadCurveReader.Create(fld, 2); + Assert.AreEqual(-802.14 , fldMap.FullLoadDriveTorque(0.RPMtoRad()).Value(), 1e-3); + Assert.AreEqual(802.14, fldMap.FullGenerationTorque(0.RPMtoRad()).Value(), 1e-3); - Assert.AreEqual(-17584.51308, fldMap.FullLoadDriveTorque(50.RPMtoRad()).Value(), 1e-3); - Assert.AreEqual(18689.03505, fldMap.FullGenerationTorque(50.RPMtoRad()).Value(), 1e-3); + Assert.AreEqual(-802.14, fldMap.FullLoadDriveTorque(50.RPMtoRad()).Value(), 1e-3); + Assert.AreEqual(802.14, fldMap.FullGenerationTorque(50.RPMtoRad()).Value(), 1e-3); var pwr = inputProvider.EfficiencyMap; Assert.AreEqual("0", pwr.Rows[0][ElectricMotorMapReader.Fields.MotorSpeed]); Assert.AreEqual("-800", pwr.Rows[0][ElectricMotorMapReader.Fields.Torque]); Assert.AreEqual("9.8449", pwr.Rows[0][ElectricMotorMapReader.Fields.PowerElectrical]); - var pwrMap = ElectricMotorMapReader.Create(pwr, 22.6, 2, 0.97); - Assert.AreEqual(-146.469, pwrMap.LookupElectricPower(-0.RPMtoRad(), -800.SI<NewtonMeter>()).ElectricalPower.Value(), 1e-3); + var pwrMap = ElectricMotorMapReader.Create(pwr, 2); + Assert.AreEqual(-5816.6, pwrMap.LookupElectricPower(-0.RPMtoRad(), -800.SI<NewtonMeter>()).ElectricalPower.Value(), 1e-3); - Assert.AreEqual(-20773.997, pwrMap.LookupElectricPower(120.RPMtoRad(), -800.SI<NewtonMeter>()).ElectricalPower.Value(), 1e-3); + Assert.AreEqual(-16170.5166, pwrMap.LookupElectricPower(120.RPMtoRad(), -800.SI<NewtonMeter>()).ElectricalPower.Value(), 1e-3); } diff --git a/VectoCore/VectoCoreTest/Integration/BatteryElectric/BatteryElectricTest.cs b/VectoCore/VectoCoreTest/Integration/BatteryElectric/BatteryElectricTest.cs index 5bae324576..624940ba9d 100644 --- a/VectoCore/VectoCoreTest/Integration/BatteryElectric/BatteryElectricTest.cs +++ b/VectoCore/VectoCoreTest/Integration/BatteryElectric/BatteryElectricTest.cs @@ -110,7 +110,7 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric const bool largeMotor = true; var modFilename = string.Format("SimpleBatteryElectric-B4_constant_{0}-{1}_{2}_{3}", vmax, initialSoC, slope, pAuxEl); - const PowertrainPosition pos = PowertrainPosition.BatteryElectricB4; + const PowertrainPosition pos = PowertrainPosition.BatteryElectricE4; var job = CreateEngineeringRun( cycle, modFilename, initialSoC, pos, 2, 22.6, largeMotor: true, pAuxEl: pAuxEl); var run = job.Runs.First().Run; @@ -146,7 +146,7 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric const bool largeMotor = true; var modFilename = string.Format("SimpleBatteryElectric-B4_acc_{0}-{1}_{2}", vmax, initialSoC, slope); - const PowertrainPosition pos = PowertrainPosition.BatteryElectricB4; + const PowertrainPosition pos = PowertrainPosition.BatteryElectricE4; var job = CreateEngineeringRun( cycle, modFilename, initialSoC, pos, 2, 22.6, largeMotor: true); var run = job.Runs.First().Run; @@ -182,7 +182,7 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric const bool largeMotor = true; var modFilename = string.Format("SimpleParallelHybrid-B4_cycle_{0}-{1}_{2}_{3}", declarationMission, initialSoC, payload, pAuxEl); - const PowertrainPosition pos = PowertrainPosition.BatteryElectricB4; + const PowertrainPosition pos = PowertrainPosition.BatteryElectricE4; var job = CreateEngineeringRun( cycle, modFilename, initialSoC, pos, 2, 22.6, largeMotor: true); var run = job.Runs.First().Run; @@ -267,7 +267,7 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric const bool largeMotor = true; var modFilename = string.Format("SimpleBatteryElectric-B3_constant_{0}-{1}_{2}_{3}", vmax, initialSoC, slope, pAuxEl); - const PowertrainPosition pos = PowertrainPosition.BatteryElectricB3; + const PowertrainPosition pos = PowertrainPosition.BatteryElectricE3; var job = CreateEngineeringRun( cycle, modFilename, initialSoC, pos, 2, 22.6, largeMotor: true, pAuxEl: pAuxEl); var run = job.Runs.First().Run; @@ -303,7 +303,7 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric const bool largeMotor = true; var modFilename = string.Format("SimpleBatteryElectric-B3_acc_{0}-{1}_{2}", vmax, initialSoC, slope); - const PowertrainPosition pos = PowertrainPosition.BatteryElectricB3; + const PowertrainPosition pos = PowertrainPosition.BatteryElectricE3; var job = CreateEngineeringRun( cycle, modFilename, initialSoC, pos, 2, 22.6, largeMotor: true); var run = job.Runs.First().Run; @@ -339,7 +339,7 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric const bool largeMotor = true; var modFilename = string.Format("SimpleParallelHybrid-B3_cycle_{0}-{1}_{2}_{3}", declarationMission, initialSoC, payload, pAuxEl); - const PowertrainPosition pos = PowertrainPosition.BatteryElectricB3; + const PowertrainPosition pos = PowertrainPosition.BatteryElectricE3; var job = CreateEngineeringRun( cycle, modFilename, initialSoC, pos, 2, 22.6, largeMotor: true); @@ -393,7 +393,7 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric const bool largeMotor = true; var modFilename = string.Format("SimpleBatteryElectric-B2_constant_{0}-{1}_{2}_{3}", vmax, initialSoC, slope, pAuxEl); - const PowertrainPosition pos = PowertrainPosition.BatteryElectricB2; + const PowertrainPosition pos = PowertrainPosition.BatteryElectricE2; var job = CreateEngineeringRun( cycle, modFilename, initialSoC, pos, 2, 2, largeMotor: true, pAuxEl: pAuxEl); var run = job.Runs.First().Run; @@ -431,7 +431,7 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric const bool largeMotor = true; var modFilename = string.Format("SimpleBatteryElectric-B2_stop_{0}-{1}_{2}", vmax, initialSoC, slope); - const PowertrainPosition pos = PowertrainPosition.BatteryElectricB2; + const PowertrainPosition pos = PowertrainPosition.BatteryElectricE2; var job = CreateEngineeringRun( cycle, modFilename, initialSoC, pos, 2, 2, largeMotor: true); var run = job.Runs.First().Run; @@ -461,7 +461,7 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric const bool largeMotor = true; var modFilename = string.Format("SimpleBatteryElectric-B2_acc_{0}-{1}_{2}", vmax, initialSoC, slope); - const PowertrainPosition pos = PowertrainPosition.BatteryElectricB2; + const PowertrainPosition pos = PowertrainPosition.BatteryElectricE2; var job = CreateEngineeringRun( cycle, modFilename, initialSoC, pos, 2, 2, largeMotor: true); var run = job.Runs.First().Run; @@ -497,7 +497,7 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric const bool largeMotor = true; var modFilename = string.Format("SimpleParallelHybrid-B2_cycle_{0}-{1}_{2}_{3}", declarationMission, initialSoC, payload, pAuxEl); - const PowertrainPosition pos = PowertrainPosition.BatteryElectricB2; + const PowertrainPosition pos = PowertrainPosition.BatteryElectricE2; var job = CreateEngineeringRun( cycle, modFilename, initialSoC, pos, 2, 2, largeMotor: true); var run = job.Runs.First().Run; @@ -603,7 +603,7 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric var driverData = CreateDriverData(AccelerationFile, true); var electricMotorData = - MockSimulationDataFactory.CreateElectricMotorData(MotorFile, count, pos, ratio / (pos == PowertrainPosition.BatteryElectricB3 ? 2.59 : 1.0), 0.97); + MockSimulationDataFactory.CreateElectricMotorData(MotorFile, count, pos, ratio / (pos == PowertrainPosition.BatteryElectricE3 ? 2.59 : 1.0), 0.97); var batteryData = MockSimulationDataFactory.CreateBatteryData(BatFile, initialBatCharge); @@ -636,11 +636,11 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric { WriteModalResults = true, }; - if (pos == PowertrainPosition.BatteryElectricB3) { + if (pos == PowertrainPosition.BatteryElectricE3) { runData.AxleGearData = axleGearData; } - if (pos == PowertrainPosition.BatteryElectricB2) { + if (pos == PowertrainPosition.BatteryElectricE2) { runData.AxleGearData = axleGearData; runData.GearboxData = gearboxData; } @@ -682,22 +682,22 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric case PowertrainPosition.HybridP3: case PowertrainPosition.HybridP4: throw new VectoException("testcase does not support parallel powertrain configurations"); - case PowertrainPosition.BatteryElectricB4: + case PowertrainPosition.BatteryElectricE4: powertrain.AddComponent( - GetElectricMachine(PowertrainPosition.BatteryElectricB4, runData.ElectricMachinesData, container, es, ctl)); + GetElectricMachine(PowertrainPosition.BatteryElectricE4, runData.ElectricMachinesData, container, es, ctl)); new DummyGearboxInfo(container); //new MockEngineInfo(container); new ATClutchInfo(container); break; - case PowertrainPosition.BatteryElectricB3: + case PowertrainPosition.BatteryElectricE3: powertrain.AddComponent(new AxleGear(container, runData.AxleGearData)) .AddComponent( - GetElectricMachine(PowertrainPosition.BatteryElectricB3, runData.ElectricMachinesData, container, es, ctl)); + GetElectricMachine(PowertrainPosition.BatteryElectricE3, runData.ElectricMachinesData, container, es, ctl)); new DummyGearboxInfo(container); //new MockEngineInfo(container); new ATClutchInfo(container); break; - case PowertrainPosition.BatteryElectricB2: + case PowertrainPosition.BatteryElectricE2: var strategy = new PEVAMTShiftStrategy(container); foreach (var entry in gearboxData.Gears) { @@ -708,7 +708,7 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric powertrain.AddComponent(new AxleGear(container, runData.AxleGearData)) .AddComponent(new PEVGearbox(container, strategy)) .AddComponent( - GetElectricMachine(PowertrainPosition.BatteryElectricB2, runData.ElectricMachinesData, container, es, ctl)); + GetElectricMachine(PowertrainPosition.BatteryElectricE2, runData.ElectricMachinesData, container, es, ctl)); new ATClutchInfo(container); break; //throw new VectoException("Battery Electric configuration B2 currently not supported"); diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponentData/ElectricMotorEfficienyMapTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponentData/ElectricMotorEfficienyMapTest.cs index d23702ed40..b8b8a666a4 100644 --- a/VectoCore/VectoCoreTest/Models/SimulationComponentData/ElectricMotorEfficienyMapTest.cs +++ b/VectoCore/VectoCoreTest/Models/SimulationComponentData/ElectricMotorEfficienyMapTest.cs @@ -26,10 +26,10 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData { JSONInputDataFactory.ReadElectricMotorData(@"TestData\Hybrids\ElectricMotor\GenericEMotor.vem", false); var fld = inputProvider.FullLoadCurve; - var fldMap = ElectricFullLoadCurveReader.Create(fld, 1.0, 1, 1.0); + var fldMap = ElectricFullLoadCurveReader.Create(fld, 1); var pwr = inputProvider.EfficiencyMap; - var pwrMap = ElectricMotorMapReader.Create(pwr, 1.0, 1, 1.0); + var pwrMap = ElectricMotorMapReader.Create(pwr, 1); var maxEmPwr = batPwr < 0 ? fldMap.FullLoadDriveTorque(emSpeed.RPMtoRad()) @@ -51,10 +51,10 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData { JSONInputDataFactory.ReadElectricMotorData(@"TestData\Hybrids\ElectricMotor\GenericEMotor.vem", false); var fld = inputProvider.FullLoadCurve; - var fldMap = ElectricFullLoadCurveReader.Create(fld, 1.0, 1, 1.0); + var fldMap = ElectricFullLoadCurveReader.Create(fld, 1); var pwr = inputProvider.EfficiencyMap; - var pwrMap = ElectricMotorMapReader.Create(pwr, 1.0, 1, 1.0); + var pwrMap = ElectricMotorMapReader.Create(pwr, 1); var maxEmPwr = batPwr < 0 ? fldMap.FullLoadDriveTorque(emSpeed.RPMtoRad()) diff --git a/VectoCore/VectoCoreTest/Utils/MockModalDataContainer.cs b/VectoCore/VectoCoreTest/Utils/MockModalDataContainer.cs index 23b5b02884..c1d923b5eb 100644 --- a/VectoCore/VectoCoreTest/Utils/MockModalDataContainer.cs +++ b/VectoCore/VectoCoreTest/Utils/MockModalDataContainer.cs @@ -281,6 +281,16 @@ namespace TUGraz.VectoCore.Tests.Utils throw new NotImplementedException(); } + public WattSecond TotalElectricMotorMotWorkDrive(PowertrainPosition emPos) + { + throw new NotImplementedException(); + } + + public WattSecond TotalElectricMotorMotWorkRecuperate(PowertrainPosition emPos) + { + throw new NotImplementedException(); + } + public PerSecond ElectricMotorAverageSpeed(PowertrainPosition emPos) { throw new NotImplementedException(); @@ -296,6 +306,16 @@ namespace TUGraz.VectoCore.Tests.Utils throw new NotImplementedException(); } + public double ElectricMotorMotEfficiencyDrive(PowertrainPosition emPos) + { + throw new NotImplementedException(); + } + + public double ElectricMotorMotEfficiencyGenerate(PowertrainPosition emPos) + { + throw new NotImplementedException(); + } + public WattSecond ElectricMotorOffLosses(PowertrainPosition emPos) { throw new NotImplementedException(); @@ -306,6 +326,11 @@ namespace TUGraz.VectoCore.Tests.Utils throw new NotImplementedException(); } + public WattSecond ElectricMotorMotLosses(PowertrainPosition emPos) + { + throw new NotImplementedException(); + } + public WattSecond ElectricMotorTransmissionLosses(PowertrainPosition emPos) { throw new NotImplementedException(); diff --git a/VectoCore/VectoCoreTest/Utils/MockVehicleContainer.cs b/VectoCore/VectoCoreTest/Utils/MockVehicleContainer.cs index 27db481980..00b278ec31 100644 --- a/VectoCore/VectoCoreTest/Utils/MockVehicleContainer.cs +++ b/VectoCore/VectoCoreTest/Utils/MockVehicleContainer.cs @@ -161,6 +161,7 @@ namespace TUGraz.VectoCore.Tests.Utils public IHybridControllerInfo HybridControllerInfo { get; } public IHybridControllerCtl HybridControllerCtl { get; } + public IAngledriveInfo AngledriveInfo { get; } public Watt GearboxLoss() { @@ -350,8 +351,10 @@ namespace TUGraz.VectoCore.Tests.Utils } public Tuple<PerSecond, NewtonMeter> CurrentAxleDemand { get; } + public double Ratio { get; } public Kilogram ReducedMassWheels { get; set; } + public Meter DynamicTyreRadius { get; } #region Implementation of IEngineControl -- GitLab