diff --git a/Examples/Tutorial/Jamfile b/Examples/Tutorial/Jamfile index e6ed108e795f5a1e99c616fd60661fb10a3565e8..c1f16964e5b1343bd540587f9a50c1a49459bde3 100644 --- a/Examples/Tutorial/Jamfile +++ b/Examples/Tutorial/Jamfile @@ -2,3 +2,4 @@ build-project DfuncClebschG ; build-project MinuitFit ; build-project LineShapes ; +build-project qft++Exams ; diff --git a/Examples/Tutorial/qft++Exams/Dummy.cc b/Examples/Tutorial/qft++Exams/Dummy.cc new file mode 100644 index 0000000000000000000000000000000000000000..f2de7dd1a45d883033e4527d9621af7f26e4c4a2 --- /dev/null +++ b/Examples/Tutorial/qft++Exams/Dummy.cc @@ -0,0 +1,33 @@ +//************************************************************************// +// // +// Copyright 2013 Bertram Kopf (bertram@ep1.rub.de) // +// Julian Pychy (julian@ep1.rub.de) // +// - Ruhr-Universität Bochum // +// // +// This file is part of Pawian. // +// // +// Pawian is free software: you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation, either version 3 of the License, or // +// (at your option) any later version. // +// // +// Pawian is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY; without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with Pawian. If not, see <http://www.gnu.org/licenses/>. // +// // +//************************************************************************// + + +#include "Examples/pbarp/Dummy.hh" + +Dummy::Dummy() +{ +} + +Dummy::~Dummy(){ +} + diff --git a/Examples/Tutorial/qft++Exams/Dummy.hh b/Examples/Tutorial/qft++Exams/Dummy.hh new file mode 100644 index 0000000000000000000000000000000000000000..1462ba33d13aab2c0dea89d0f21e3d4007128710 --- /dev/null +++ b/Examples/Tutorial/qft++Exams/Dummy.hh @@ -0,0 +1,37 @@ +//************************************************************************// +// // +// Copyright 2013 Bertram Kopf (bertram@ep1.rub.de) // +// Julian Pychy (julian@ep1.rub.de) // +// - Ruhr-Universität Bochum // +// // +// This file is part of Pawian. // +// // +// Pawian is free software: you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation, either version 3 of the License, or // +// (at your option) any later version. // +// // +// Pawian is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY; without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with Pawian. If not, see <http://www.gnu.org/licenses/>. // +// // +//************************************************************************// + + +#pragma once + +class Dummy { + +public: + Dummy(); + virtual ~Dummy(); + +protected: + +private: +}; + diff --git a/Examples/Tutorial/qft++Exams/Jamfile b/Examples/Tutorial/qft++Exams/Jamfile new file mode 100644 index 0000000000000000000000000000000000000000..60c7e445820775811dd7bd0ced4731a35d755616 --- /dev/null +++ b/Examples/Tutorial/qft++Exams/Jamfile @@ -0,0 +1,12 @@ +project : + ; + +lib qft++Exams : + [ glob *.cc : *App.cc ] + $(TOP)/qft++//qft++ + $(TOP)/ErrLogger//ErrLogger + : + : + : ; + +exe TensorApp : TensorApp.cc qft++Exams : ; diff --git a/Examples/Tutorial/qft++Exams/TensorApp.cc b/Examples/Tutorial/qft++Exams/TensorApp.cc new file mode 100644 index 0000000000000000000000000000000000000000..a773a79f643a75f9da88ff29488c3b4cd9aaa026 --- /dev/null +++ b/Examples/Tutorial/qft++Exams/TensorApp.cc @@ -0,0 +1,206 @@ +/* Copyright 2008 Mike Williams (mwill@jlab.org) + * + * This file is part of qft++. + * + * qft++ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * qft++ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with qft++. If not, see <http://www.gnu.org/licenses/>. + */ +//_____________________________________________________________________________ +/** @file tensor.cxx + * @author Mike Williams + * + * @brief Provides example usage of the tensor module + * + * This tutorial gives a number of examples of how to perform common tensor + * operations using the qft++ tensor package. + */ +//_____________________________________________________________________________ + +#include <getopt.h> +#include "qft++/topincludes/relativistic-quantum-mechanics.hh" +#include "qft++/topincludes/tensor.hh" + +using namespace std; +//_____________________________________________________________________________ + +/// Prints program usage to the screen +void PrintUsage(); + +/// Prints a line accross the screen +void PrintLine(char __c){ + for(int i = 0; i < 80; i++) cout << __c; + cout << endl; +} +//_____________________________________________________________________________ + +int main(int __argc,char *__argv[]){ + + /*__________________________Parse the Command Line_________________________*/ + int c; + //extern char* optarg; + //extern int optind; + + while((c = getopt(__argc,__argv,"h")) != -1){ + switch(c){ + case 'h': // help option + PrintUsage(); + return EXIT_SUCCESS; + break; + default: + break; + } + } + + /*_____________________________Creating Tensors____________________________*/ + // Tensor is a template class, here we'll work with double's and + // complex<double>'s...but you could use any data type that defines the + // proper operators. The constructor argument is the rank. + Tensor<double> x1(1),x2(2),x3(3); + Tensor<complex<double> > y1(1); + Vector4<double> v; + LeviCivitaTensor eps; // totally anti-symetric 4th rank tensor + MetricTensor g; // g_{mu,nu} + + /*_____________________________Setting Tensors_____________________________*/ + // The metric and Levi-Civita tensors are set when they're created. To set + // elements of our other tensors we have several options. We can either set + // them using other Tensor's (using the = operator), or by direct access to + // the elements. + + PrintLine(':'); + cout << "We've set up the following tensors: " << endl; + cout << "tensors storing double's:" << endl; + // element access + for(int e = 0; e < 4; e++) { + x1(e) = e; + x2(e,e) = 1.0; // make it diagnol + } + cout << "->x1: " << x1 << endl; + cout << "->x2: " << x2 << endl; + + // using the assignment operator + x3 = x1 % x2; // tensor outer product + cout << "->x3: x1^{mu}x2^{nu,rho} (printing only defined for rank <= 2)" + << endl; + // just make sure these don't throw errors + x3.Symmetric(); + x3.AntiSymmetric(); + + cout << "->metric: g^{mu,nu}: " << g << endl; + cout << "->Levi-Civita: epsilon^{mu,nu,rho,sigma} (not printable)" + << endl; + + cout << "4-vectors storing double's:" << endl; + double mass = 0.13957; + v.SetP4(sqrt(1 + mass*mass),0,0,1.); + cout << "->v: " << v << endl; + + cout << "tensors storing complex double's:" << endl; + y1(0) = complex<double>(0.,1.); + y1(3) = complex<double>(0.,1.); + cout << "->y1: " << y1 << endl; + + /*_____________________________Basic Operations____________________________*/ + PrintLine(':'); + + cout << "Tensor contractions:" << endl; + + // To contract the last index of x with the 1st index of y, just do x*y + cout << "contraction of 1 index: " << endl; + cout << "x1_{mu}x1^{mu}:\nx1*x1\t->\t" << x1*x1 << endl; + cout << "x1_{mu}x2^{mu,nu}:\nx1*x2\t->\t" << x1 * x2 << endl; + cout << "x1_{mu}x3^{mu,nu,rho}:\nx1*x3\t->\t" << x1 * x3 << endl; + cout << "x1_{rho}x3^{mu,nu,rho}:\nx3*x1\t->\t" << x3 * x1 << endl; + cout << "x1_{nu}x3^{mu,nu,rho}:\n(x3.Permute(2,3))*x1\t->\t" << (x3.Permute(2,3)) * x1 << endl; + cout << "sqrt(v^{mu}v_{mu}):\nsqrt(v*v)\t->\t" << sqrt(v*v) << endl; + + // To contract the last n indicies of x with the 1st n indicies of y, do + // x.Contract(y,n). If n is the rank of either x or y, then you can just do + // (x|y)...a tensor inner product. + cout << "contraction of multiple indicies:" << endl; + cout << "x2_{mu,nu}x3^{mu,nu,rho}:\n(x2|x3)\t->\t" << (x2|x3) << endl; + cout << "x1^{mu}x2^{nu,rho}x3_{mu,nu,rho}:\n((x1%x2)|x3)\t->\t" << ((x1%x2)|x3) << endl; + cout << "(x1^{mu}x2^{nu,rho} + 2*x3^{mu,nu,rho})x3_{mu,nu,rho}:\n(((x1%x2) + 2*x3)|x3)\t->\t" + << (((x1%x2) + 2*x3)|x3) << endl; + cout << "epsilon^{mu,nu,rho,pi} x2_{mu,nu}:\n(eps|x2)\t->\t" << (eps|x2) << endl; + cout << "etc...as complicated as you want, it's still easy in the code." + << endl; + + PrintLine(':'); + // We can also obtain symmeterized versions of tensors. + cout << "Symmetrization is easy: " << endl; + Tensor<double> xx(2); + for(int i = 0; i < 4; i++) xx(i,i) = 1.0; + xx(2,1) = -2.; + xx(2,3) = 3.; + cout << "for a tensor:\n->" << xx << endl; + cout << "symmetric:\nxx.Symmetric()\t->\t" << xx.Symmetric() << endl; + cout << "anti-symmetric:\nxx.AntiSymmetric()\t->\t" << xx.AntiSymmetric() << endl; + cout << "this works for any rank." << endl; + + // Lorentz transformations are done either thru a general transformation + // tensor via x.Transform(lambda), where lambda_{mu,nu} is a 2nd rank + // tensor...or to simply boost, you can use either a 1st rank tensor via + // x.Boost(y) to boost to y's rest frame or specify the 3 boost vector + // components and using x.Boost(bx,by,bz). You can also rotate by providing + // the 3 euler angles via x.Rotate(alpha,beta,gamma). + cout << "Lorentz transformations are also easy:" << endl; + Vector4<double> v_cm(v); + v_cm.Boost(v); + cout << "boost to v's rest frame:\n->v_cm:" << v_cm << endl; + cout << "we can boost to any frame, rotate, etc..." << endl; + + /*_________________________Special 4-Vector Methods________________________*/ + PrintLine(':'); + cout << "There are also a number of special methods defined for 4-vectors:" + << endl; + cout << "4-vector v:->" << v << endl; + cout << "invariant mass:-> " << v.Mass() << endl; + cout << "beta:-> " << v.Beta() << endl; + cout << "cos(theta):-> " << v.CosTheta() << endl; + cout << "see the Vector4 class documentation for a complete list." << endl; + PrintLine(':'); + /*_________________________Orbital tensors________________________*/ + Vector4<double> v1; + v1.SetP4(sqrt(1. + mass*mass),0,0,1.); + Vector4<double> v2; + v2.SetP4(sqrt(1. + mass*mass),0.2,0.5,0.3); + Spin L0=0; + Spin L1=1; + Spin L2=2; + + OrbitalTensor orbTensor0(L0); + orbTensor0.SetP4(v1, v2); + + OrbitalTensor orbTensor1(L1); + orbTensor1.SetP4(v1, v2); + + OrbitalTensor orbTensor2(L2); + orbTensor2.SetP4(v1, v2); + + cout << "orbTensor0:-> " << orbTensor0 << endl; + cout << "orbTensor1:-> " << orbTensor1 << endl; + cout << "orbTensor2:-> " << orbTensor2 << endl; + + return EXIT_SUCCESS; +} +//_____________________________________________________________________________ + +void PrintUsage(){ + cout << "Usage: tensor " << endl; + cout << "This executable provides a number of example usages of the tensor " + << "package. Run\nthe executable to see what's being done, then look at" + << " the source file to see \nhow it's done in the code." + << endl; +} +//_____________________________________________________________________________