1%%%%%%%%%%%%%%%%%%% 2% XLiFE++ is an extended library of finite elements written in C++ 3% Copyright (C) 2014 Lunéville, Eric; Kielbasiewicz, Nicolas; Lafranche, Yvon; Nguyen, Manh-Ha; Chambeyron, Colin 4% 5% This program is free software: you can redistribute it and/or modify 6% it under the terms of the GNU General Public License as published by 7% the Free Software Foundation, either version 3 of the License, or 8% (at your option) any later version. 9% This program is distributed in the hope that it will be useful, 10% but WITHOUT ANY WARRANTY; without even the implied warranty of 11% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12% GNU General Public License for more details. 13% You should have received a copy of the GNU General Public License 14% along with this program. If not, see <http://www.gnu.org/licenses/>. 15%%%%%%%%%%%%%%%%%%% 16 17\section{The polynomials classes} 18 19In order to deal with general polynomial spaces (using formal polynomials), \xlifepp provides the following template classes 20\begin{itemize} 21 \item {\class MonomialT} to deal with monomials of the form $x^iy^jz^k$ 22 \item {\class PolynomialT} to deal with polynomials as combination of monomials, say 23 $$ 24 p(x,y,z)=\sum_{i,j,k\ge 0} \alpha_{ijk}x^iy^jz^k 25 $$ 26 \item {\class PolynomialBasisT} to deal with set of polynomials, may be a poynomials basis: 27 $$P[x,y,z]=\text{span}\left\{ P_\ell,\ \ell=1,L \right\}$$ 28 \item {\class PolynomialsBasisT} to deal with set of vector polynomials, may be a poynomial basis: 29 $$\mathbf{P}[x,y,z]=\text{span}\left\{ \mathbf{P}_\ell= 30 \left( 31 \begin{array}{c} 32 P^x_\ell \\P^y_\ell\\P^z_\ell 33 \end{array}\right),\ \ell=1,L \right\} 34 $$ 35 \item {\class PolyNodeT} to represent a polynomial as tree, useful to evaluate polynomial in a best way (Horner algorithm) 36\end{itemize} 37These classes can manage one, two or three variables and are templated by the type of the variable (K) which is of real\_t type by default.\\ 38 39Note that there is no specific class to deal with vector polynomial, they are described as {\cmd std::vector<PolynomialT>}.\\ 40 41For users, some useful aliases are available : 42\vspace{.1cm} 43\begin{lstlisting}[]{} 44typedef MonomialT<real_t> Monomial; 45typedef PolynomialT<real_t> Polynomial; 46typedef PolynomialBasisT<real_t> PolynomialBasis; 47typedef PolynomialsBasisT<real_t> PolynomialsBasis; 48\end{lstlisting} 49\vspace{.3cm} 50Some usual scalar polynomials spaces may be constructed in 1d, 2d or 3d: 51$$ 52\begin{array}{lll} 53Pn[x,y,z] & :\ \sum a_{ijk} x^iy^jz^k & i,j,k \ge 0,\ i+j+k \le n \\ 54PHn[x,y,z] & :\ \sum a_{ijk} x^iy^jz^k & i,j,k \ge 0,\ i+j+k = n \\ 55Qn[x,y,z] & :\ \sum a_{ijk} x^iy^jz^k & i,j,k \ge 0,\ i,j,k \le n \\ 56Qns[x,y,z] & :\ \sum a_{ijk} x^iy^jz^k & i,j,k \ge 0,\ i\le nx, j\le ny, k\le nz 57\end{array} 58$$ 59Some particular vector polynomials spaces related to FE space are also provided (see {\class PolynomialsBasisT} class). They can be addressed using the enumeration: 60\vspace{.1cm} 61\begin{lstlisting}[]{} 62enum PolynomialSpace {_Pk,_PHk,_Qk,_Qks,_Rk, _SHk,_Dk,_DQk,_DQ2k}; 63\end{lstlisting} 64\vspace{.3cm} 65 66Main algebraic operations are supported and some formal derivative operations too. Polynomials may be evaluated at point $(x,y,z)$ using operator ().\\ 67 68Besides, Polynomials may have a tree representation using {\class PolyNodeT} class. It may be useful when evaluating large polynomials. 69 70\subsection{The {\classtitle MonomialT} class} 71This class deals with monomials of the form : 72$$x_1^{a_1}x_2^{a_2}x_3^{a_3}$$ 73storing only the three power numbers $a_1,\ a_2,\ a_3$: 74\vspace{.1cm} 75\begin{lstlisting}[]{} 76template <typename K = real_t> 77class MonomialT 78{ 79 public: 80 dimen_t a1, a2, a3; 81 ... 82}; 83\end{lstlisting} 84\vspace{.3cm} 85Thus, it allows only to deal with monomials of 3 variables of type K. Note that no coefficient is attached to a monomial.\\ 86 87{\class MonomialT} class provides only one fundamental constructor, overloaded operator () to evaluate monomial at a point or a vector of points, product by a monomial, comparison operators and print facilities: 88\vspace{.1cm} 89\begin{lstlisting}[]{} 90MonomialT(dimen_t p1=0, dimen_t p2=0, dimen_t p3=0) 91K operator()(const K& x1, const K& x2 = K(1), const K& x3 = K(1))const 92K operator() (const std::vector<K>& x) const 93MonomialT<K>& operator*=(const MonomialT<K>& m); 94void swapVar(dimen_t v1, dimen_t v2, dimen_t v3); 95string_t asString() const; 96void print(std::ostream& out) const; 97\end{lstlisting} 98\vspace{.3cm} 99\begin{lstlisting}[]{} 100MonomialT<K> operator*(const MonomialT<K>& m1, const MonomialT<K>& m2); 101friend std::ostream& operator<<(std::ostream& out, const MonomialT& m); 102bool operator== (const MonomialT<K>& m1, const MonomialT<K>& m2); 103bool operator!= (const MonomialT<K>& m1, const MonomialT<K>& m2); 104bool operator < (const MonomialT<K>& m1, const MonomialT<K>& m2); 105bool operator > (const MonomialT<K>& m1, const MonomialT<K>& m2); 106\end{lstlisting} 107\vspace{.3cm} 108 109\subsection{The {\classtitle PolynomialT} class} 110The {\class PolynomialT} class deals with polynomial up to 3 variables of value type K stored as a list of pairs of {\class MonomialT} object and a coefficient of type K: 111\vspace{.1cm} 112\begin{lstlisting}[]{} 113template <typename K=real_t> 114class PolynomialT 115{ 116 public: 117 std::list<std::pair<MonomialT<K>, K > > monomials; 118 real_t epsilon; 119 mutable PolyNodeT<K> tree; 120 ... 121} 122\end{lstlisting} 123\vspace{.2cm} 124The member data {\var epsilon} is used to round to 0 the very small coefficients of the polynomial. By default its value is 100000*{\var theEpsilon} (about $10^{-10}$ in double precision). The member data {\var tree} may store a tree representation ({\class PolyNode} object) of the polynomial, that is useful to evaluate it at a point in a faster and more stable way (generalized Horner algorithm).\\ 125 126The class provides simple constructors from monomials and a copy constructor: 127\vspace{.1cm} 128\begin{lstlisting}[]{} 129PolynomialT(); 130PolynomialT(const MonomialT<K>&,const K& =K(1)); 131PolynomialT(const MonomialT<K>& ,const K&, const MonomialT<K>&, const K&); 132PolynomialT(const PolynomialT<K>&); 133PolynomialT<K>& operator=(const PolynomialT<K>& p); 134\end{lstlisting} 135\vspace{.2cm} 136There are some useful tools: 137\vspace{.1cm} 138\begin{lstlisting}[]{} 139void push_back(const K&, const MonomialT<K>&); //add a monomial part 140(const_) iterator begin() (const) ; 141(const_)iterator end()(const) ; 142dimen_t degree() const; 143void clean(real_t asZero); //remove "zero" part 144void clean(); 145void swapVar(dimen_t v1, dimen_t v2, dimen_t v3); 146static PolynomialT<K> zero(); 147bool isZero() const; 148\end{lstlisting} 149\vspace{.2cm} 150To evaluate the polynomial two methods are available. One evaluating the polynomial as a linear combination of monomials, the other one using a generalized Horner algorithm based on a tree representation of the polynomial: 151\vspace{.1cm} 152\begin{lstlisting}[]{} 153void buildTree() const; 154K eval (const K& x1, const K& x2 = K(1), const K& x3 = K(1)) const ; 155K evalTree(const K& x1, const K& x2 = K(1), const K& x3 = K(1)) const; 156K operator() (const K& x1, const K& x2 = K(1), const K& x3 = K(1)) const; 157K operator() (const std::vector<K>& x) const; 158\end{lstlisting} 159\vspace{.1cm} 160If tree representation is built, the {\cmd eval} functions used always tree representation.\\ 161 162Main algebraic operations are avalaible, either as internal or external functions to the class: 163\vspace{.1cm} 164\begin{lstlisting}[]{} 165PolynomialT<K>& operator *=(const MonomialT<K>&); 166PolynomialT<K>& operator *=(const K&); 167PolynomialT<K>& operator /=(const K& k); 168PolynomialT<K>& operator +=(const MonomialT<K>&); 169PolynomialT<K>& operator -=(const MonomialT<K>&); 170PolynomialT<K>& operator +=(const PolynomialT<K>&); 171PolynomialT<K>& operator -=(const PolynomialT<K>&); 172PolynomialT<K>& operator *=(const PolynomialT<K>&); 173 174//extern operation 175template <typename K> 176PolynomialT<K> operator *(const PolynomialT<K>& ,const MonomialT<K>&); 177PolynomialT<K> operator *(const MonomialT<K>&, const PolynomialT<K>&); 178PolynomialT<K> operator *(const MonomialT<K>&, const K&); 179PolynomialT<K> operator *(const K&, const MonomialT<K>&); 180PolynomialT<K> operator /(const MonomialT<K>&, const K&); 181PolynomialT<K> operator *(const PolynomialT<K>&, const K&); 182PolynomialT<K> operator *(const K&, const PolynomialT<K>&); 183PolynomialT<K> operator /(const PolynomialT<K>&, const K&); 184PolynomialT<K> operator -(const PolynomialT<K>&); 185PolynomialT<K> operator +(const PolynomialT<K>&, const PolynomialT<K>&); 186PolynomialT<K> operator -(const PolynomialT<K>&, const PolynomialT<K>&); 187PolynomialT<K> operator *(const PolynomialT<K>&, const PolynomialT<K>&); 188\end{lstlisting} 189\vspace{.3cm} 190Using the operator \verb|(.)|, polynomials may be chained (say $q(p1(x,y,z),p2(x,y,z), p3(x,y,z)$) : 191\vspace{.1cm} 192\begin{lstlisting}[]{} 193template <typename K> 194PolynomialT<K> operator()(const PolynomialT<K>& px, 195 const PolynomialT<K>& py=PolynomialT<K>(), 196 const PolynomialT<K>& pz=PolynomialT<K>()) const; 197PolynomialT<K>& replace(VariableName, const PolynomialT<K>&); 198\end{lstlisting} 199\vspace{.3cm} 200It is also possible to get some derivatives and integrals of polynomials: 201\vspace{.1cm} 202\begin{lstlisting}[]{} 203template <typename K> 204PolynomialT<K> dx(const MonomialT<K>&); 205PolynomialT<K> dy(const MonomialT<K>&); 206PolynomialT<K> dz(const MonomialT<K>&); 207vector<PolynomialT<K> > grad(const MonomialT<K>&, dimen_t =3); 208vector<PolynomialT<K> > curl(const MonomialT<K>&, dimen_t =3); 209PolynomialT<K> derivative(VariableName, const MonomialT<K>&); 210PolynomialT<K> integral(VariableName, const MonomialT<K>&); 211 212PolynomialT<K> dx(const PolynomialT<K>&); 213PolynomialT<K> dy(const PolynomialT<K>&); 214PolynomialT<K> dz(const PolynomialT<K>&); 215vector<PolynomialT<K> > grad(const PolynomialT<K>&, dimen_t =3); 216vector<PolynomialT<K> > curl(const PolynomialT<K>&, dimen_t =3); 217PolynomialT<K> derivative(VariableName, const PolynomialT<K>&); 218PolynomialT<K> integral(VariableName, const PolynomialT<K>&); 219 220vector<PolynomialT<K> > dx(const vector<PolynomialT<K> >&); 221vector<PolynomialT<K> > dy(const vector<PolynomialT<K> >&); 222vector<PolynomialT<K> > dz(const vector<PolynomialT<K> >&); 223vector<PolynomialT<K> > curl(const vector<PolynomialT<K> >&); 224PolynomialT<K> div(const vector<PolynomialT<K> >&); 225PolynomialT<K> dot(const vector<PolynomialT<K> >&, const vector<K>&); 226vector<PolynomialT<K> > derivative(VariableName,const vector<PolynomialT<K> >&) 227vector<PolynomialT<K> > integral(VariableName,const vector<PolynomialT<K> >); 228 229\end{lstlisting} 230\vspace{.3cm} 231Finally, some print facilities are provided: 232\vspace{.1cm} 233\begin{lstlisting}[]{} 234string_t asString() const; 235void print(std::ostream&) const; 236friend std::ostream& operator<<(std::ostream&, const PolynomialT&) 237\end{lstlisting} 238\vspace{.1cm} 239 240\subsection{The {\classtitle PolyNodeT} class} 241In order to be computed in a faster and a more stable way, a polynomial may be represented as a tree and evaluated by traveling this tree. In this tree representation, each node represents one of the factor $1,\ x_1,\ x_2$ or $x_3$. When it is a leaf, the coefficient of the corresponding monomial is stored. For instance the polynomial $2+4x+5xy+xz+3yz+5z^2$ has the following tree : 242\begin{figure}[H] 243\begin{center} 244\includePict[width=17cm]{polynomial_tree} 245\end{center} 246\end{figure} 247Horizontal lines represents addition while vertical lines represent product. Note that the tree representation is not unique.\\ 248 249The {\class PolyNodeT} class manages for each node a factor type and a coefficient, and some pointers to travel the tree: 250\vspace{.1cm} 251\begin{lstlisting}[]{} 252template <typename K=real_t> 253class PolyNodeT 254{public: 255 dimen_t type; // 0: 1, 1: x1, 2:x2, 3:x3 256 K coef; 257 PolyNodeT<K>* parent, * child, * right; 258 ... 259}; 260\end{lstlisting} 261\vspace{.3cm} 262It offers only a few member functions to build the polynomial tree: 263\vspace{.1cm} 264\begin{lstlisting}[]{} 265PolyNodeT(dimen_t =0, PolyNodeT<K>* =0, const K& =K(0)); 266~PolyNodeT(); 267void clear(); 268void insert(const MonomialT<K>&, const K&); 269bool rootNode() const; 270bool isZero() const {return (coef==K(0) && child==0);} 271void print(std::ostream&) const; 272void printTree(std::ostream&, std::string&) const; 273string_t varString() const; 274\end{lstlisting} 275\vspace{.3cm} 276The most important function is the operator (): 277\vspace{.1cm} 278\begin{lstlisting}[]{} 279K operator()(const K& x, const K& y=K(1), const K& z=K(1)) const; 280\end{lstlisting} 281\vspace{.1cm} 282that evaluates the polynomial at a point $(x,y,z)$. 283 284\subsection{The {\classtitle PolynomialBasisT} class} 285A space of polynomials (of finite dimension $p$) may be described by one of its basis, say a set of $p$ polynomials. The {\class PolynomialBasisT} class manages this basis as a list of {\class PolynomialT} objects. In fact it inherits from std::list\verb?<?PolynomialT\verb?<?K\verb?>? \verb?>?: 286\vspace{.1cm} 287\begin{lstlisting}[]{} 288template <typename K=real_t> 289class PolynomialBasisT : public std::list<PolynomialT<K> > 290{public: 291 dimen_t dim; // number of variables in Polynomials 292 string_t name; // basis name 293 ... 294}; 295\end{lstlisting} 296\vspace{.3cm} 297There exists some basic constructors from monomials and a general constructor for rather standard polynomial spaces identified by the enumerator {\cmd PolynomialSpace}: 298\vspace{.1cm} 299\begin{lstlisting}[]{} 300enum PolynomialSpace {_Pk,_PHk,_Qk,_Qks,_Rk, _SHk,_Dk,_DQk,_DQ2k}; 301 302PolynomialBasisT(dimen_t =0, const string_t& =""); 303PolynomialBasisT(dimen_t, const MonomialT<K>&, const string_t& na=""); 304PolynomialBasisT(dimen_t, const MonomialT<K>&, const MonomialT<K>&, 305 const string_t& =""); 306PolynomialBasisT(PolynomialSpace, dimen_t, dimen_t, dimen_t =0, dimen_t =0); 307void buildPk(dimen_t); 308void buildPHk(dimen_t); 309void buildQk(dimen_t); 310void buildQks(dimen_t , dimen_t =0, dimen_t=0); 311void buildTree(); 312\end{lstlisting} 313\vspace{.3cm} 314The (scalar) polynomial spaces that can be constructed are ($n$ number of variables, $\alpha$ multi-index): 315$$ 316\begin{array}{|l|l|c|} 317\hline 318\text{polynomial space} & \text{dimension}& \text{\xlifepp}\\ 319\hline 320 & & \\[-2mm] 321\displaystyle P_k=\left\{\sum_{|a|\leq k}a_\alpha x^\alpha \right\} & \displaystyle C^{n+k}_k=\frac{(n+k)!}{k!\,n!} & \text{\_Pk}\\[6mm] 322\displaystyle\tilde{P}_k=\left\{\sum_{|\alpha|= k}a_\alpha x^\alpha \right\} & 323\begin{array}{l} 324\displaystyle n=2\ :\ k+1\\ 325\displaystyle n=3\ :\ \frac{1}{2}(k+2)(k+1) 326\end{array} 327& \text{\_PHk} \\[6mm] 328\displaystyle Q_k=\left\{\sum_{\alpha_1\leq k,\alpha_2\leq k, \alpha_3\leq k }a_\alpha x^\alpha \right\} &\displaystyle (k+1)^n& \text{\_Qk}\\[6mm] 329\displaystyle\tilde{Q}_{lmn}=\left\{\sum_{\alpha_1\leq l,\alpha_2\leq m, \alpha_3\leq n }a_\alpha x^\alpha \right\} &\displaystyle (l+1)(m+1)(n+1)& \text{\_Qks}\\[4mm] 330\hline 331\end{array} 332$$ 333 334\vspace{.3cm} 335Several functions are devoted to the managment of the list: 336\vspace{.1cm} 337\begin{lstlisting}[]{} 338void push_back(const PolynomialT<K>&); 339void add(const MonomialT<K>&); 340void add(const PolynomialT<K>&); 341void add(const PolynomialBasisT&); 342iterator begin(); 343iterator end(); 344const_iterator begin() const; 345const_iterator end() const; 346size_t size() const; 347void resize(size_t n); 348void clean(); 349void clean(real_t asZero); 350dimen_t degree() const; 351void swapVar(dimen_t v1, dimen_t v2, dimen_t v3); 352\end{lstlisting} 353\vspace{.3cm} 354\begin{remark} 355 The {\class PolynomialsBasisT} class is intended to deal with polynomial basis but there is no tool to check independance of polynomials! 356\end{remark}\\ 357 358It is also possible to evaluate all the polynomials at a point using different ways: 359\vspace{.1cm} 360\begin{lstlisting}[]{} 361std::vector<K>& eval(std::vector<K>& res, const K& x1, const K& x2 = K(1), 362 const K& x3 = K(1)) const; 363std::vector<K> eval(const K& x1, const K& x2 = K(1), const K& x3 = K(1)) const; 364std::vector<K>& evalTree(std::vector<K>& res, const K& x1, const K& x2 = K(1), 365 const K& x3 = K(1)) const; 366std::vector<K> evalTree(const K& x1, const K& x2 = K(1), 367 const K& x3 = K(1)) const; 368std::vector<K> operator()(const K& x1, const K& x2 = K(1), 369 const K& x3 = K(1)) const; 370std::vector<K>& operator()(std::vector<K>& res, const K& x1, const K& x2 = K(1), 371 const K& x3 = K(1)) const: 372\end{lstlisting} 373\vspace{.3cm} 374As usual, there are some print facilities: 375\vspace{.1cm} 376\begin{lstlisting}[]{} 377void print(std::ostream&) const; 378friend std::ostream& operator<<(std::ostream&, const PolynomialBasisT<K>& ); 379\end{lstlisting} 380\vspace{.3cm} 381 382\subsection{The {\classtitle PolynomialsBasisT} class} 383In finite element approximation, some vector polynomial spaces are required. This is the role of the {\class PolynomialsBasisT} class. There is no class to deal with vector polynomial, they are represented by some {\var vector\verb?<?PolynomialT\verb?>?}. As a consequence, the {\class PolynomialsBasisT} class inherits from {\var list\verb?<?std::vector\verb?<?PolynomialT\verb?<?K\verb?>?\verb?>?\verb?>?}: 384\vspace{.1cm} 385\begin{lstlisting}[]{} 386template <typename K=real_t> 387class PolynomialsBasisT : public std::list<std::vector<PolynomialT<K> > > 388{ 389public: 390dimen_t dimVar; // dimension of Polynomials (number of variables) 391dimen_t dimVec; // dimension of vectors of Polynomials 392string_t name; // basis name 393... 394}; 395\end{lstlisting} 396\vspace{.3cm} 397Several constructors are available. Some construct product spaces from {\class PolynomialBasisT} objects. There is a general constructor allowing to get particular vector polynomial spaces enumerated in {\cmd PolynomialSpace}: 398 399 400\vspace{.1cm} 401\begin{lstlisting}[]{} 402PolynomialsBasisT(dimen_t =0, dimen_t =0, const string_t& =""); 403PolynomialsBasisT(const PolynomialBasisT<K>&, dimen_t, const string_t& na=""); 404PolynomialsBasisT(const PolynomialBasisT<K>&, const PolynomialBasisT<K>&, 405 const string_t& =""); 406PolynomialsBasisT(const PolynomialBasisT<K>&, const PolynomialBasisT<K>&, 407 const PolynomialBasisT<K>&, const string_t& na=""); 408PolynomialsBasisT(PolynomialSpace, dimen_t, dimen_t); 409void buildSHk(dimen_t); 410void buildRk(dimen_t); 411void buildDk(dimen_t); 412void buildDQk(dimen_t); 413void buildDQ2k(dimen_t); 414void buildTree(); 415\end{lstlisting} 416\vspace{.3cm} 417The following FE spaces are available: 418$$ 419\begin{array}{|l|l|c|} 420\hline 421\text{polynomial space} & \text{dimension}& \text{\xlifepp}\\ 422\hline 423& & \\[-2mm] 424\displaystyle S_k=\left\{p\in(\tilde{P}_k)^n;\ x.p=0 \right\} & n\dim\tilde{P}_k-\dim\tilde{P}_{k+1} & \text{\_Sk}\\[2mm] 425\displaystyle D_k=(P_{k-1})^n \oplus \tilde{P}_{k-1}x & 426n\dim P_{k-1}+\dim\tilde{P}_{k-1} & \text{\_Dk} \\[6mm] 427\displaystyle R_k=(P_{k-1})^n \oplus Sk & n\dim P_{k-1}+\dim S_{k} & \text{\_Rk} \\[6mm] 428DQk= Q_{k,k-1,k-1} \times Q_{k-1,k,k-1} \times Q_{k-1,k-1,k} & 3k(k-1)^2& \text{\_DQk} \\[6mm] 429DQ2k_{2d} = (P_k)^2 \oplus \text{span}\left\{ \text{curl}\, x_1^{k+1}x_2, \text{curl}\, x_2^{k+1}x_1 \right\} & 2(\dim P_{k}+1)& \text{\_DQ2k} \\[6mm] 430\hline 431\end{array} 432$$ 433The operator * allows to build tensor polynomials space, say if $P[x_1,x_2]$ and $Q[x_3]$ are two polynomials sets, $(P*Q)[x_1,x_2,x_3]$ is the set: 434$$ 435\left\{ p_i(x_1,x_2)q_j(x_3),\ i=1,m,\ j=1,n\right\}, 436$$ 437\begin{lstlisting}[]{} 438PolynomialBasisT<K> operator*(const PolynomialBasisT<K>& P, 439 const PolynomialBasisT<K>& Q) 440\end{lstlisting} 441\vspace{.3cm} 442 443 444Member functions are similar to member functions of the {\class PolynomialBasisT} class: 445\vspace{.1cm} 446\begin{lstlisting}[]{} 447void push_back(const std::vector<PolynomialT<K> >&); 448void add(const PolynomialT<K>&); 449void add(const PolynomialT<K>&, const PolynomialT<K>&); 450void add(const PolynomialT<K>&, const PolynomialT<K>&, 451 const PolynomialT<K>&); 452void add(const std::vector<PolynomialT<K> >&); 453void add(const PolynomialsBasisT&); 454iterator begin(); 455iterator end(); 456const_iterator begin() const; 457const_iterator end() const; 458size_t size() const; 459void resize(size_t); 460dimen_t degree() const; 461void swapVar(dimen_t, dimen_t, dimen_t); 462void clean(); 463void clean(real_t asZero); 464 465//evaluation of basis 466vector<vector<K> >& eval(vector<vector<K> >&, const K&, const K& = K(1), 467 const K& = K(1)) const; 468vector<vector<K> > eval(const K&, const K& = K(1), const K& = K(1)) const; 469vector<vector<K> >& evalTree(vector<vector<K> >&, const K&, 470 const K& = K(1), const K& = K(1)) const; 471vector<vector<K> > evalTree(const K&, const K& = K(1), const K& = K(1)) const; 472vector<vector<K> >& operator()(vector<vector<K> >&, const K&, 473 const K& = K(1), const K& = K(1)) const; 474 475//print facilities 476void print(std::ostream&) const; 477friend std::ostream& operator<<(std::ostream&, const PolynomialsBasisT<K>&) 478\end{lstlisting} 479\vspace{.3cm} 480 481\displayInfos{library=utils, header=polynomials.hpp, implementation=polynomials.hpp, 482test=test\_polynomials.cpp, header dep={config.h, utils.h}} 483