On Wed, Sep 07, 2005 at 05:56:01PM +1000, John Pye wrote:
I'm struggling to understand how to correctly use the 'idx' functionality in GiNaC.
See http://www.ginac.de/FAQ.html#matrix_indexed for a (short) explanation.
My application is for something like a simple one-dimensional pipe flow calculation. For example, I would like to evaluate the pressures in the flow alow a pipe. I will set up some expressions relating the values of my pressures at different nodes in my pipe, then I will substitute values for those pressures and then evaluate residuals from my expressions. So I am hoping to write something like
sym p[100] = sym[]("p"); sym mdot[100] = sym[]("mdot"); sym rho("rho");
lst f; for(int i=1; i<100; ++i){ f.append( p[i] - p[i-1] - 0.5 * rho * pow( mdot[i-1] / (rho * A) , 2) ); }
for(int i=1; i<100; ++i){ f.subs(p[i] == 1.5454223494); }
cerr << f << endl;
In this way, I will have an array of symbols and a lst of expressions. I can then use those to generate equations which can be exported to numerical solver.
Probably, I'm just missing something important, but I don't understand why you need to do _symbolic_ manipulations in this problem.
Perhaps the best way to do this is to create standard C-style array of symbols? I am hoping there's a more elegant way.
Why don't you use an associative array, e.g. std::map<sybol, ex, ex_is_less>, or just GiNaC::exmap?
Also, I'd like to know your thoughts on how efficient this sort of approach might be as the number of equations / symbols grows.
I don't think your approach will be efficient.
Am I right in thinking I shuold be using the 'idx' class?
NO! -- All science is either physics or stamp collecting.