You are aware of http://www.jsoftware.com/help/dictionary/d131.htm I hope?
Thanks, -- Raul On Tue, May 28, 2013 at 10:52 PM, P T <[email protected]> wrote: > Thanks for the comments and feedback. Most of the code is in data > preparation. The core of the methodology in matrix inversion and > multiplication. > > 1) I will use the "TAB" instead of redefining it. > 2) I am still in testing mode and so hard paths are OK at this time. If and > when this is distributed to others, it should have a GUI, where user can > selects the the required files. > 3) jview is not needed for the script and safe to delete. > 4) I inconsistently used global and local scope. I will make them local. > 5) I checked the output against the published results from the reference I > cited above the code and they agree. > 6) This is a small test case. My intention is to apply to large to apply to > large network where the matrix size can be 50000x50000 and this can be very > sparse. > > PT > > > On Fri, May 24, 2013 at 12:38 PM, Raul Miller <[email protected]> wrote: > >> --This is a lot of code and I do not have access to the reference >> (that I know of), so my comments will be superficial. >> >> 1. TAB is already defined and has the same definition as your 'tab'. >> >> 2. Hardcoded paths are awkward. For something like this they are >> probably fine. It's also nice that you included sample data to test >> against. I had to fix some problems induced by email line wrap. >> >> 3. But I don't have jview, so I commented out the line that loads it >> -- I don't know if that matters. >> >> 4. I got a domain error: >> |domain error: script >> | lineSusceptance =:(_1*+/lineSusceptance)setDiag lineSusceptance >> >> I think the issue here is that lineSusceptance was already defined >> locally and here it's being defined globally. If you are running this >> in a global context you will not have this problem, but loading it as >> a script fails because of this distinction (you cannot update a global >> name in the same context where that identical name exists as a local >> name - this is easy to work around if you really want it to happen and >> is almost always a coding mistake.) >> >> 5. I do not know how to verify that the results are correct, and am >> generally not in a position to talk about correctness of the code. >> >> 6. Unless your data is much sparser than the example, I think that a >> sparse representation will not help. >> >> Thanks, >> >> -- >> Raul >> >> >> On Fri, May 24, 2013 at 12:23 PM, P T <[email protected]> wrote: >> > Here is the my first program in J! >> > >> > >> > >> > NB. Goal: To compute DC power flows in an electrical transmission network >> > NB. given transmission line reactance and bus injections and withdrawals >> > >> > NB. Reference: R.D. CHRISTIE, B. WOLLENBERG, AND I. WANGENSTEEN >> > NB. "Transmission Management in the Deregulated Environment" >> > NB. Proceedings of IEEE, Vol. 88, N0. 2 Feb 2000 >> > >> > >> > load 'files' >> > load 'jview' >> > >> > tab=. 9{a. >> > >> > NB. read the bus and branch data from files >> > >> > NB. rawData=. <;._2 "1 (,.&tab 'm' fread 'E:\EMCAS Misc\J >> > Loadflow\Bus11.txt') >> > NB. bus=. _ ".&> rawData >> > >> > NB. rawData=. <;._2 "1 (,.&tab 'm' fread 'E:\EMCAS Misc\J >> > Loadflow\Branch11.txt') >> > NB. branch=. _ ".&> rawData >> > >> > NB. outFile=. 'E:\EMCAS Misc\J Loadflow\lineFLows11.txt' >> > >> > >> > >> > rawData=. 1 1000 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 >> 0 >> > 10 0 11 _1000 >> > bus=. 11 2 $ rawData >> > >> > rawData=. 1 2 4 0.02 2000 1 3 4 0.025 2000 2 >> > 3 2 0.08 2000 2 4 3 0.01 2000 2 5 2 0.02 >> > 2000 3 8 4 0.04 2000 3 9 2 0.05 2000 4 5 2 >> > 0.01 2000 4 6 4 0.02 2000 4 7 3 0.01 2000 5 >> > 7 3 0.015 2000 6 7 2 0.01 2000 8 10 4 >> > 0.025 2000 8 9 3 0.03 2000 9 10 2 0.04 2000 6 >> > 11 3 0.02 2000 7 11 3 0.025 2000 10 11 2 >> > 0.04 2000 >> > branch=. 18 5 $ rawData >> > >> > >> > netInj=. 1{"1 bus >> > >> > >> > circuits=. 2{"1 branch >> > reactance=. 3{"1 branch >> > >> > >> > fromTo=. 0 1{"1 branch NB. select branch from to nodes >> > fromTo=. fromTo - 1 NB. subtract 1 for zero based indexing >> > fromTo=. ,;/ fromTo >> > >> > NB. create a nxn matrix for reactance with all zero values >> > size =. #bus >> > spReactance=. (size,size) $ 0 >> > >> > >> > NB. amend the values in spReactance with values from reactance at >> locations >> > indicated by fromTo >> > spReactance=. reactance fromTo } spReactance >> > >> > NB. spReactance is upper traingle. transpose and add >> > NB. why the hook +|: is not equal to y + (|:y) ? >> > tmp=. |: spReactance >> > spReactance=. spReactance + tmp >> > >> > >> > NB. create a nxn matrix for no. of circuits >> > spCircuits=. (size,size) $ 0 >> > spCircuits=. circuits fromTo } spCircuits >> > tmp=. |: spCircuits >> > spCircuits=. spCircuits + tmp >> > >> > >> > lineReactance=. spReactance%spCircuits >> > lineSusceptance=._1 % lineReactance >> > >> > NB. above two lines can be combined as shown below. But, need >> lineReactance >> > later >> > NB. lineSusceptance=. _1*spCircuits%spReactance >> > >> > >> > NB. replace all __ with 0 >> > lineSusceptance=. (lineSusceptance=__)}lineSusceptance,:0 >> > >> > setDiag =: (>: * i.) @#@] } >> > >> > NB. line susceptance with diagonal calculations >> > lineSusceptance =: (_1 * +/ lineSusceptance) setDiag lineSusceptance >> > >> > NB. eliminate slack bus and column. Currently last row and last column >> > NB. In future should be deleting row and column specified by slack bus >> > >> > NB. delete last row and column >> > lineSusceptance =: _1 }. "1 ] _1 }. lineSusceptance >> > >> > >> > NB. inverse the matrix >> > lineSusceptance =: %. lineSusceptance >> > >> > NB. insert slack row and column with zero values (auto fills in 2nd >> > dimension) >> > lineSusceptance =: lineSusceptance, ((1, size) $0) >> > >> > >> > NB. define matrix product >> > mp=: +/ .* >> > >> > NB. calculate bus phase angles >> > phase =: lineSusceptance mp netInj >> > >> > >> > NB. calculate line flows >> > Pij=: -/~@[ % ] >> > >> > lineFlows=. phase Pij lineReactance >> > >> > NB. replace all _ and __ with 0 >> > lineFlows=. (lineFlows=_)}lineFlows,:0 >> > lineFlows=. (lineFlows=__)}lineFlows,:0 >> > >> > ]lineFlows >> > >> > NB. write the results to a file >> > NB. lineFlows fwrites outFile >> > >> > >> > NB. Check and identify the lines that are over loaded >> > NB. TODO: use sparse matrices if possible >> > NB. TODO: there are some division by zeros. Can this be avoided? >> > NB. TODO: Handle arbitrary bus labels instead of 1 to n >> > >> > >> > On Tue, May 21, 2013 at 1:42 PM, P T <[email protected]> wrote: >> > >> >> That works perfectly! All the assumptions you made are correct and >> thanks >> >> for reading my mind. >> >> >> >> Yes, I am dividing by zero and all those values are not applicable as >> >> there are no connections between those nodes in the network. After >> cleaning >> >> up, I will post the complete program along with sample data. It still >> looks >> >> like a Java program rather than a J program. >> >> >> >> Thanks, >> >> PT >> >> >> >> >> >> On Tue, May 21, 2013 at 1:11 PM, Raul Miller <[email protected] >> >wrote: >> >> >> >>> On Tue, May 21, 2013 at 12:49 PM, P T <[email protected]> wrote: >> >>> > I am almost close to finishing an initial version. But, I don't know >> >>> how to >> >>> > write a verb P(ij) = (phase(i) - phase(j))/lineReactance(ij) where >> >>> >> >>> Without looking at your data, this smells like: >> >>> >> >>> Pij=: -/~@[ % ] >> >>> >> >>> which you use as: >> >>> phase Pij lineReactance >> >>> >> >>> Here, phase is assumed to be 1 dimensional and lineReactance two >> >>> dimensional and square. And phase -:&# lineReactance should always be >> >>> true. >> >>> >> >>> I did not try this on your example data since I do not know what the >> >>> result would be. >> >>> >> >>> I will note that you are dividing by zero, which is worrying. >> >>> >> >>> -- >> >>> Raul >> >>> ---------------------------------------------------------------------- >> >>> For information about J forums see http://www.jsoftware.com/forums.htm >> >>> >> >> >> >> >> > ---------------------------------------------------------------------- >> > For information about J forums see http://www.jsoftware.com/forums.htm >> ---------------------------------------------------------------------- >> For information about J forums see http://www.jsoftware.com/forums.htm >> > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
