Hi, In response to the previous request on vector algebra in different bases I include a simple illustration how to achieve principal vector operations from the Clifford algebra functionality in GiNaC. This is working with current CVS but will not work yet with the current release 1.3.1. Hope this can be useful, Vladimir -- Vladimir V. Kisil email: kisilv@maths.leeds.ac.uk -- www: http://maths.leeds.ac.uk/~kisilv/ #include <ginac/ginac.h> using namespace std; using namespace GiNaC; ex vector3D(const ex & list, const ex & basis, const ex & mu) { varidx nu((new symbol)->setflag(status_flags::dynallocated), 3); return indexed(matrix(1, 3, ex_to<lst>(list)), nu.toggle_variance())*basis.subs(mu == nu); } ex scalar_product(const ex & v1, const ex & v2) { return remove_dirac_ONE(canonicalize_clifford(expand_dummy_sum((v1*v2 + v2*v1)/2))); } ex vector_product(const ex & v1, const ex & v2, const ex & e_prod) { return canonicalize_clifford(expand_dummy_sum((v1*v2 - v2*v1)*e_prod/2)); } int main(){ realsymbol a1("a1"), b1("b1"), c1("c1"), a2("a2"), b2("b2"), c2("c2"), a3("a3"), b3("b3"), c3("c3"), t("t"); varidx nu(symbol("nu", "\\nu"), 3), mu(symbol("mu", "\\mu"), 3); ex M = diag_matrix(lst(1, 1, 1)), // Metrics of point spaces T = matrix (3, 3, lst(0, 0, 1, 0, 1, 0, -1, 0, 0)),// Transformation matrix basis1 = clifford_unit(mu, M, 0), // Main basis defined by Clifford units basis2 = basis1 * indexed(T, nu, mu.toggle_variance()), // Transformed basis e1_prod = basis1.subs(mu == 0)*basis1.subs(mu == 1)*basis1.subs(mu == 2), // Maps bivecors to vectors vect1 = vector3D(lst(a1, b1, c1), basis1, mu), // vector in the main basis vect2 = vector3D(lst(a2, b2, c2), basis2, nu), // vector in the transformed basis vect3 = vector3D(lst(a3, b3, c3), basis1, mu); // second vector in the main basis cout << canonicalize_clifford(expand_dummy_sum(2*vect1+t*vect2)) << endl; //-> -e~0*c2*t+a2*t*e~2+2*a1*e~0+2*c1*e~2+e~1*b2*t+2*b1*e~1 cout << clifford_to_lst(2*vect1+t*vect2, basis1) << endl; //-> {-c2*t+2*a1,b2*t+2*b1,2*c1+a2*t} cout << scalar_product(vect1, vect3) << endl; //-> b3*b1+c1*c3+a3*a1 cout << scalar_product(vect1, vect2) << endl; //-> a2*c1+b1*b2-a1*c2 cout << vector_product(vect1, vect3, e1_prod) << endl; //-> a3*b1*e~2-c1*a3*e~1+c1*b3*e~0-b1*e~0*c3+a1*e~1*c3-b3*a1*e~2 cout << clifford_to_lst(vector_product(vect1, vect3, e1_prod), basis1) << endl; //-> {-b1*c3+c1*b3,a1*c3-c1*a3,-b3*a1+a3*b1} cout << vector_product(vect1, vect2, e1_prod) << endl; //-> c1*e~1*c2+a2*a1*e~1-a1*b2*e~2-a2*b1*e~0+c1*e~0*b2-b1*c2*e~2 cout << clifford_to_lst(vector_product(vect1, vect2, e1_prod), basis1) << endl; //-> {c1*b2-a2*b1,c1*c2+a2*a1,-b1*c2-a1*b2} }
On Fri, 2005-06-24 at 17:04 +0100, Vladimir Kisil wrote:
Hi,
In response to the previous request on vector algebra in different bases I include a simple illustration how to achieve principal vector operations from the Clifford algebra functionality in GiNaC. This is working with current CVS but will not work yet with the current release 1.3.1.
Hope this can be useful, Vladimir
Thanks Vladimir Of course it is!. I want to acknowledge the time and patience with which you have answered my (starter) questions. I see the code and I see you have made the hard work to me, I'm installing and compiling the CVS version to test it. I'm sure I'll be back with more questions, but I'm sure they will be much more easier to answer (or to me to understand) that this one. Nevertheless I see GiNaC at the symbolic back end of my program. I got the summer to deal with the new codding. Thanks, for your help an for providing such a wonderful peace of software. Javier Ros
participants (2)
-
Javier Ros Ganuza
-
Vladimir Kisil