2009/8/9 Alan Grimes <agrimes@speakeasy.net>

P Zoltan wrote:
>  here is a patch that makes ktechlab to use Eigen for calculations, so
> the internal matrix implementation can be removed.


>  Known problems:
>  - the caching and changed/unchanged flags probabily don't work as they
> should

I think that's where your memory leak is. It tries to cache everything
and runs out of memory.
Memory leak? I have of that, too?
>  - when inserting a reactive element in the circuit, the cpu usage will
> increase to 100% after a time. Probable causes are that eigen uses great
> precision calculation, so the circuit will never enter in steady state.
> Or just some caching problem...

>  Todos:
>  - test it :D
>  - we'll have to define _clearly_ the algorithms and data structures
> used in the cirucit solving process. Currently I don't know how the A, b
> changed flags should work and what is the purpose of CNode and CBranch
> classes, how/when the iterations shoud be done, and so on...

When the circuit is in a steady state, it doesn't make any sense to
recompute LU. (simply solve LbU = x ) or something like that.

Note: the function call you make "mp_lu->rank() == 0" is equivalent to a
correct version of my "validate()" function. Ie, when rank = 0, the
matrix is singular/invalid/unsolvable. -- IIRC. Since I'm a dunce, I
hacked together the validate() function in an attempt to detect bugs in
the components as early as possible. asking "rank() == 0?" does the same
Yes, I know. Still, that rank() call should be removed, as LU::solve() method returns false if it can't solve the equation system. That case is not addressed -- the question is what to do in that case: write a "?" for voltage level, or use the last valid state for the circuit?

>  Here is the sketch of the algorithm (should be extended...):

> if a component is added, removed, connected, ... in the circuitdocument:
>  split the document in circuits, by connectivity
>  create elementset from the circuit
>     create the matrix corresponding to the elements

> a step in the simulator:
>   if the circuit contains nonlinear elements
>     solve the cirucit by iterations
>      in each iteration
>        call the handler of nonlinear elements
>        recreate the LU of the eqation matrix
>        update nodes (why?)

Could you point me to a class, method and line number for that so that I
can explain it?
In not that interested in a particuar class, but in the interaction of all the  classes; or just the algorithm, without any particular class/method. 

>        run logic (here -- why?)
-- cuz you could have triggered a state change.

>        check for convergence
>   else
>     solve as a linear system
>   run logic

>  (where are the components updated?)