1 #ifndef CLASSIC_FVps_CC
2 #define CLASSIC_FVps_CC
45 template <
class T,
int N>
51 template <
class T,
int N>
53 for(
int i = 0; i < N; ++i) data[i] = rhs.
data[i];
57 template <
class T,
int N>
60 for(
int i = 0; i < N; ++i) {
61 if(rhs[i][0] !=
T(0)) data[i].setMinOrder(0);
62 for(
int j = 0; j <= N; ++j) data[i][j] = rhs[i][j];
67 template <
class T,
int N>
70 for(
int i = 0; i < N; ++i) {
72 for(
int j = 0; j <
SIZE; ++j) data[i][j] = rhs[i][j];
77 template <
class T,
int N>
79 for(
int i = 0; i < N; ++i)
80 data[i] =
FTps<T, N>(minOrder, maxOrder, trcOrder);
84 template <
class T,
int N>
87 for(
int i = 0; i < N; ++i)
88 for(
int j = 0; j < N; j++) data[i][j+1] = x(i, j);
92 template <
class T,
int N>
94 for(
int i = 0; i < N; i++) data[i] = FTps<T, N>(x[i]);
98 template <
class T,
int N>
103 template <
class T,
int N>
105 if(&rhs !=
this)
for(
int i = 0; i < N; ++i) data[i] = rhs.
data[i];
110 template <
class T,
int N>
112 for(
int i = 0; i < N; ++i) data[i] = FTps<T, N>::makeVariable(i);
116 template <
class T,
int N>
118 for(
int i = 0; i < N; ++i) data[i] =
T(0);
122 template <
class T,
int N>
124 if(index < 0 || index >= N)
125 throw CLRangeError(
"FVps::getComponent()",
"Index out of range.");
131 template <
class T,
int N>
133 if(index < 0 || index >= N)
134 throw CLRangeError(
"FVps::setComponent()",
"Index out of range.");
140 template <
class T,
int N>
inline
146 template <
class T,
int N>
inline
152 template <
class T,
int N>
158 template <
class T,
int N>
164 template <
class T,
int N>
174 template <
class T,
int N>
176 for(
int i = 0; i < N; ++i) data[i].setMinOrder(order);
180 template <
class T,
int N>
190 template <
class T,
int N>
192 for(
int i = 0; i < N; ++i) data[i].setMaxOrder(order);
196 template <
class T,
int N>
206 template <
class T,
int N>
216 template <
class T,
int N>
218 for(
int i = 0; i < N; ++i) data[i].setTruncOrder(order);
222 template <
class T,
int N>
227 for(
int i = 0; i < N; i++)
228 result[i] = data[i].filter(minOrder, maxOrder, trcOrder);
233 template <
class T,
int N>
235 return filter(0, trunc, trunc);
239 template <
class T,
int N>
245 template <
class T,
int N>
248 for(
int i = 0; i < N; i++) result[i] = - data[i];
253 template <
class T,
int N>
255 for(
int i = 0; i < N; i++) data[i] += rhs[i];
260 template <
class T,
int N>
262 for(
int i = 0; i < N; i++) data[i] -= rhs[i];
267 template <
class T,
int N>
269 for(
int i = 0; i < N; i++) data[i] += rhs[i];
274 template <
class T,
int N>
276 for(
int i = 0; i < N; i++) data[i] -= rhs[i];
281 template <
class T,
int N>
283 for(
int i = 0; i < N; i++) data[i] *= rhs;
287 template <
class T,
int N>
291 for(
int i = 0; i < N; ++i) {
312 for(
int j = 0; j < N; ++j) {
314 if (expons[j] != 0) {
337 template <
class T,
int N>
340 for(
int i = 0; i < N; i++) data[i] *= t;
345 template <
class T,
int N>
347 for(
int i = 0; i < N; i++) data[i] *= rhs;
352 template <
class T,
int N>
354 for(
int i = 0; i < N; i++) data[i] /= rhs;
359 template <
class T,
int N>
364 int minOrder = getMinOrder(), maxOrder = getMaxOrder(), trcOrder = getTruncOrder();
365 maxOrder =
std::min(maxOrder, trunc);
366 trcOrder =
std::min(trcOrder, trunc);
369 if(maxOrder < minOrder) {
370 std::cerr <<
" <*** ERROR ***> in FVps::inverse():\n";
371 throw LogicalError(
"FVps<T,N>::inverse()",
"Map truncated to a zero map.");
376 std::cerr <<
" <*** ERROR ***> in FVps::inverse():\n"
377 <<
" Cannot invert a purely nonlinear map." <<
std::endl;
379 }
else if(minOrder == 1) {
381 std::cerr <<
" <*** ERROR ***> in FVps::inverse():\n"
382 <<
" Cannot invert an EXACT nonlinear map." <<
std::endl;
387 std::cerr <<
" <*** ERROR ***> in FVps::inverse():\n"
388 <<
" Cannot invert a constant map." <<
std::endl;
392 std::cerr <<
" <*** ERROR ***> in FVps::inverse():\n"
393 <<
" Cannot invert a nonlinear map containing a constant term." <<
std::endl;
397 std::cerr <<
" <*** ERROR ***> in FVps::inverse():\n"
398 <<
" Cannot invert a map with both constant and linear terms unless it is EXACT."
412 std::cerr <<
" <*** ERROR ***> in FVps::inverse():\n"
413 <<
" Cannot invert a map having a singular linear part." <<
std::endl;
419 if(minOrder == 0) r1 -= t1inv * constantTerm();
430 FVps<T, N> T2n = filter(2, maxOrder, trcOrder);
431 for(
int m = 2; m <= trcOrder; ++m) {
433 result = t1inv * (
id - tr);
440 template <
class T,
int N>
445 int minOrder = getMinOrder(), maxOrder = getMaxOrder(), trcOrder = getTruncOrder();
446 maxOrder =
std::min(maxOrder, trunc);
447 trcOrder =
std::min(trcOrder, trunc);
450 if(maxOrder < minOrder) {
451 std::cerr <<
" <*** ERROR ***> in FVps::inverse():\n";
452 throw LogicalError(
"FVps<T,N>::inverse()",
"Map truncated to a zero map.");
457 std::cerr <<
" <*** ERROR ***> in FVps::inverse():\n"
458 <<
" Cannot invert a purely nonlinear map." <<
std::endl;
460 }
else if(minOrder == 1) {
462 std::cerr <<
" <*** ERROR ***> in FVps::inverse():\n"
463 <<
" Cannot invert an EXACT nonlinear map." <<
std::endl;
468 std::cerr <<
" <*** ERROR ***> in FVps::inverse():\n"
469 <<
" Cannot invert a constant map." <<
std::endl;
473 std::cerr <<
" <*** ERROR ***> in FVps::inverse():\n"
474 <<
" Cannot invert a nonlinear map containing a constant term." <<
std::endl;
478 std::cerr <<
" <*** ERROR ***> in FVps::inverse():\n"
479 <<
" Cannot invert a map with both constant and linear terms unless it is EXACT."
493 std::cerr <<
" <*** ERROR ***> in FVps::inverse():\n"
494 <<
" Cannot invert a map having a singular linear part." <<
std::endl;
500 if(minOrder == 0) r1 -= t1inv * constantTerm();
511 FVps<T, N> T2n = filter(2, maxOrder, trcOrder);
512 for(
int m = 2; m <= trcOrder; ++m) {
514 result = t1inv * (
id - tr);
515 tr = substitute(result, m);
516 result += t1inv * (
id - tr);
523 template <
class T,
int N>
526 for(
int i = 0; i < N; i++) result[i] = data[i].derivative(var);
531 template <
class T,
int N>
534 for(
int i = 0; i < N; i++) result[i] = data[i].integral(var);
539 template <
class T,
int N>
542 for(
int i = 0; i < N; i++) {
543 if(data[i].getMinOrder() == 0) result[i] = data[i][0];
544 else result[i] =
T(0);
550 template <
class T,
int N>
554 for(
int v = N; v-- > 0;)
555 result[v] = (*
this)[v].evaluate(P);
560 template <
class T,
int N>
563 for(
int i = 0; i < N; i++)
564 for(
int j = 0; j < N; j++)
result(i, j) = data[i][j+1];
569 template <
class T,
int N>
572 int maxOrder = getMaxOrder();
573 if(maxOrder) --maxOrder;
578 for(
int i = 0; i < N; ++i) {
579 for(
int j = 0; j < N; ++j) {
583 T *dk = gzij.
begin() + ks, *mk = m + ks, *mke = m + ke;
585 while(mk != mke) rij += *dk++ * *mk++;
593 template <
class T,
int N>
599 ordersL[0] = getMinOrder(), ordersL[1] = getMaxOrder(), ordersL[2] = getTruncOrder();
607 template <
class T,
int N>
612 "Transformation order, n, is negative.");
615 "Transformation order, n, exceeds globalTruncOrder.");
619 int minOrder = getMinOrder(), maxOrder = getMaxOrder(), trcOrder = getTruncOrder();
620 for(
int k = N; k-- > 0;) {
621 if(f[k].getMinOrder() != minOrder) f[k].
setMinOrder(minOrder);
622 if(f[k].getMaxOrder() != maxOrder) f[k].
setMaxOrder(maxOrder);
623 if(f[k].getTruncOrder() != trcOrder) f[k].
setTruncOrder(trcOrder);
628 for(
int k = N; k-- > 0;)
634 std::cerr <<
" <*** WARNING ***> from FTps<T,N>::substitute(mat,n):\n"
635 <<
" Transformation order exceeds truncation order;\n"
636 <<
" returning map unchanged." <<
std::endl;
640 if(n == 0 || n < minOrder || maxOrder < n)
return result;
645 static int max_n = -1;
658 for(
int k = N; k-- > 0;) {
659 fj[k] = f[k].begin(n);
660 g[k] = result[k].begin();
661 std::fill(g[k] + start_n, g[k] + end_n,
T(0));
665 for(
int j = start_n; j < end_n; ++j) {
668 for(
int k = N; k-- > 0;)
669 if(*fj[k] !=
T(0)) zeroQ =
false;
671 for(
int k = N; k-- > 0;) ++fj[k];
679 while((*vrbl)[vi] == (*oldvrbl)[vi]) ++vi;
686 mv = mat[(*vrbl)[0]];
700 mv = mat[(*vrbl)[ord1]];
701 for(
int k = 0; k < N; k++) {
703 if(mvk ==
T(0))
continue;
705 for(
int l = start_l; l < end_l; l++) t[prod[l]] += mvk * t[l];
710 for(
int k = N; k-- > 0;) {
714 for(
int i = start_n; i < end_n; i++) gk[i] += fjk * t[i];
720 for(
int k = N; k-- > 0;) ++fj[k];
727 template <
class T,
int N>
732 "Inconsistent transformation orders: nl > nh.");
735 "Transformation order nl is negative.");
738 "Transformation order nh exceeds globalTruncOrder.");
742 int minOrder = getMinOrder(), maxOrder = getMaxOrder(), trcOrder = getTruncOrder();
743 for(
int k = N; k-- > 0;) {
744 if(f[k].getMinOrder() != minOrder) f[k].
setMinOrder(minOrder);
745 if(f[k].getMaxOrder() != maxOrder) f[k].
setMaxOrder(maxOrder);
746 if(f[k].getTruncOrder() != trcOrder) f[k].
setTruncOrder(trcOrder);
751 for(
int k = N; k-- > 0;)
756 std::cerr <<
" <*** WARNING ***> from FVps<T,N>::substitute(mat,nl,nh):\n"
757 <<
" Transformation order nh exceeds truncation order;\n"
758 <<
" truncation order unchanged." <<
std::endl;
763 if(nh == 0 || nh < minOrder || maxOrder < nl)
return result;
769 for(
int k = N; k-- > 0;)
770 std::fill(result[k].
begin(nl), result[k].
end(nh),
T(0));
775 static int max_nh = -1;
786 const T *fp[N][nh+1];
788 for(
int k = N; k-- > 0;) {
789 for(
int m = nl; m <= nh; ++m) fp[k][m] = f[k].
begin(m);
790 g[k] = result[k].begin();
794 int nh1 = nh - 1, nh2 = nh - 2;
797 for(
int j = start_nh; j < end_nh; ++j) {
802 while((*vrbl)[vk] == (*oldvrbl)[vk]) ++vk;
805 int jl = (*vrbl)[nh1], ni = nh2;
806 while(ni >= 0 && (*vrbl)[ni] == jl) --ni;
813 for(
int k = N; k-- > 0;) {
814 if(*fp[k][n1] !=
T(0)) {
824 for(
int k = N; k-- > 0;) {
825 if(*fp[k][n2] !=
T(0)) {
835 for(
int k = N; k-- > 0;)
836 for(
int m = ni; m <= nh; ++m) ++fp[k][m];
845 mv = mat[(*vrbl)[0]];
860 mv = mat[(*vrbl)[ord1]];
861 for(
int k = 0; k < N; k++) {
863 if(mvk ==
T(0))
continue;
865 for(
int l = start_l; l < end_l; ++l) t[prod[l]] += mvk * t[l];
871 for(
int k = N; k-- > 0;) {
872 for(
int m = n1; m <= n2; ++m) {
873 const T fkj = *fp[k][m];
875 for(
int i = start_m; i < end_m; i++) g[k][i] += fkj * t[i];
877 for(
int m = ni; m <= nh; ++m) ++fp[k][m];
888 template <
class T,
int N>
890 return substitute(mat, getMinOrder(), getMaxOrder());
894 template <
class T,
int N>
900 int f_min = getMinOrder(), f_max = getMaxOrder(), f_trc = getTruncOrder();
902 int g_min = orders[0], g_max = orders[1], g_trc = orders[2];
903 for(
int k = N; k-- > 0;) {
904 if(f[k].getMinOrder() != f_min) f[k].
setMinOrder(f_min);
905 if(f[k].getMaxOrder() != f_max) f[k].
setMaxOrder(f_max);
911 throw LogicalError(
"FVps::substitute(FVps rhs, int trunc)",
912 "Truncation order exceeds globalTruncOrder!");
915 if(g_min > g_max)
return FVps<T, N>(g_trc, g_trc, g_trc);
920 for(
int k = N; k-- > 0;) result[k][0] = *f[k].
begin();
921 if(f_max == 0)
return result;
924 int nl = f_min, nh = f_max;
928 const T *fp[N][nh+1];
934 for(
int k = N; k-- > 0;)
935 for(
int m = nl; m <= nh; ++m) fp[k][m] = f[k].
begin(m);
938 int nh1 = nh - 1, nh2 = nh - 2;
941 for(
int j = start_nh; j < end_nh; ++j) {
946 while((*vrbl)[vk] == (*oldvrbl)[vk]) ++vk;
949 int jl = (*vrbl)[nh1], ni = nh2;
950 while(ni >= 0 && (*vrbl)[ni] == jl) --ni;
957 for(
int k = N; k-- > 0;) {
958 if(*fp[k][n1] !=
T(0)) {
968 for(
int k = N; k-- > 0;) {
969 if(*fp[k][n2] !=
T(0)) {
979 for(
int k = N; k-- > 0;)
980 for(
int m = ni; m <= nh; ++m) ++fp[k][m];
988 t[1] = rhs[(*vrbl)[0]];
998 t[ord] = t[ord1].multiply(rhs[(*vrbl)[ord1]], g_trc);
1004 for(
int k = N; k-- > 0;) {
1005 const T **fpk = fp[k];
1006 for(
int m = n1; m <= n2; ++m) result[k] += *fpk[m] * t[m];
1007 for(
int m = ni; m <= nh; ++m) ++fpk[m];
1020 template <
class T,
int N>
1024 for(
int i = 0; i < N; ++i) {
1026 for(
int j = 1; j < N; ++j) sum += lhs(i, j) * data[j];
1033 template <
class T,
int N>
1037 if ( std::any_of(power.
begin(), power.
end(), [&](
int p) {
return p < 0; }) )
1038 throw LogicalError(
"FVps<T,N>::getFTps(power)",
"Negative power.");
1044 for (
int i = 0; i < N; ++i) {
1049 for (
int j = 0; j < power[i]; ++j)
1056 template <
class T,
int N>
1058 is.flags(std::ios::skipws);
1060 (is >> std::ws).
get(head, 4);
1062 if(strcmp(head,
"FVps") != 0)
1063 throw FormatError(
"FVps::get()",
"Flag word \"FVps\" missing.");
1067 if(nDim != N)
throw FormatError(
"FVps::get()",
"Invalid FVps dimension");
1071 for(
int i = 0; i < N; i++) is >> result.
data[i];
1077 template <
class T,
int N>
1080 for(
int i = 0; i < N; i++) os << data[i];
1088 template <
class T,
int N>
1091 for(
int i = 0; i < N; ++i) result[i] = lhs[i] + rhs[i];
1096 template <
class T,
int N>
1099 for(
int i = 0; i < N; ++i) result[i] = lhs[i] - rhs[i];
1104 template <
class T,
int N>
1107 for(
int i = 0; i < N; ++i) result[i] = lhs[i] + rhs[i];
1112 template <
class T,
int N>
1115 for(
int i = 0; i < N; ++i) result[i] = lhs[i] - rhs[i];
1120 template <
class T,
int N>
1123 for(
int i = 0; i < N; ++i) result[i] = lhs[i] + rhs[i];
1128 template <
class T,
int N>
1131 for(
int i = 0; i < N; ++i) result[i] = lhs[i] - rhs[i];
1136 template <
class T,
int N>
1139 for (
int i = 0; i < N; ++i) {
1147 template <
class T,
int N>
1150 for(
int i = 0; i < N; ++i) result[i] = lhs[i] * rhs;
1155 template <
class T,
int N>
1158 for(
int i = 0; i < N; ++i) result[i] = lhs * rhs[i];
1163 template <
class T,
int N>
1166 for(
int i = 0; i < N; ++i) result[i] = lhs[i] * rhs;
1171 template <
class T,
int N>
1174 for(
int i = 0; i < N; ++i) result[i] = lhs * rhs[i];
1178 template <
class T,
int N>
1184 template <
class T,
int N>
1187 for(
int i = 0; i < N; ++i) result[i] = lhs[i] / rhs;
1192 template <
class T,
int N>
1195 for(
int i = 0; i < N; ++i) result[i] = lhs[i] / rhs;
1206 const int MAX_ITER = 400;
1213 #ifdef DEBUG_FVps_CC
1214 std::cerr <<
" <*** WARNING ***> from ExpMap(H,map,trunc):\n"
1215 <<
" Incomplete computation of feed-down terms.\n" <<
std::endl;
1222 for(
int i = 0; i < N; i += 2) {
1231 for(
int var = 0; var < N; var++) {
1237 for(
int k = 1; expHf != old; ++k) {
1239 std::cerr <<
" present error:\n" << expHf - old <<
std::endl;
1241 "No convergence in ExpMap(H,map)");
1248 for(
int v = 1; v < N; ++v) {
1251 dHk1f += dH[v].
multiply(ddHkf, trunc);
1254 dHkf = dHk1f /
T(k);
1257 expHmap[var] = expHf;
1268 for(
int v = 0; v < N; ++v)
1274 template <
class T,
int N>
1280 template <
class T,
int N>
1281 std::ostream &operator<<(std::ostream &os, const FVps<T, N> &vps) {
1285 #endif // CLASSIC_FVps_CC
A templated representation for vectors.
Singular matrix exception.
T evaluate(const FVector< T, N > &) const
Evaluate FTps at point.
void setMinOrder(int order)
Set minimum order.
Linear map with values of type [b]T[/b] in [b]N[/b] variables.
and give any other recipients of the Program a copy of this License along with the Program You may charge a fee for the physical act of transferring a copy
FVps inverse(int trunc=(FTps< T, N >::EXACT)) const
Inverse.
void setComponent(int, const FTps< T, N > &)
Set component.
int getVariables() const
Get number of variables.
FVps operator*(const FVps< T, N > &rhs) const
Multiply.
and that you know you can do these things To protect your we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights These restrictions translate to certain responsibilities for you if you distribute copies of the or if you modify it For if you distribute copies of such a whether gratis or for a you must give the recipients all the rights that you have You must make sure that receive or can get the source code And you must show them these terms so they know their rights We protect your rights with two distribute and or modify the software for each author s protection and we want to make certain that everyone understands that there is no warranty for this free software If the software is modified by someone else and passed we want its recipients to know that what they have is not the so that any problems introduced by others will not reflect on the original authors reputations any free program is threatened constantly by software patents We wish to avoid the danger that redistributors of a free program will individually obtain patent in effect making the program proprietary To prevent we have made it clear that any patent must be licensed for everyone s free use or not licensed at all The precise terms and conditions for distribution and modification follow GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR DISTRIBUTION AND MODIFICATION This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License The refers to any such program or and a work based on the Program means either the Program or any derivative work under copyright a work containing the Program or a portion of it
FVps truncate(int trunc)
Truncate.
Array1D< int > getSubstOrders(const FVps< T, N > &rhs, int trunc=EXACT) const
Return orders {min, max, trc} of f(rhs(z)).
void setTruncOrder(int order)
Set truncation order.
Truncated power series in N variables of type T.
FVps operator-() const
Unary minus.
const FVps & operator=(const FVps &)
FVps filter(int minOrder, int maxOrder, int trcOrder=(FTps< T, N >::EXACT)) const
Extract given range of orders, with truncation.
Matrix< T > operator-(const Matrix< T > &, const Matrix< T > &)
Matrix subtraction.
FVps & operator*=(const FTps< T, N > &rhs)
Multiply and assign.
const FTps< T, N > & operator[](int) const
Get Component.
T * begin() const
Return beginning of monomial array.
FVps & operator-=(const FVps &rhs)
Subtract and assign.
FTps multiply(const FTps &y, int trunc=EXACT) const
Multiplication.
static int getGlobalTruncOrder()
Return the global truncation order.
std::list< int > getListOfNonzeroCoefficients() const
Get a list containing the indexes of non-zero coefficients of a FTps.
A templated representation of a LU-decomposition.
const T getCoefficient(int index) const
Get coefficient.
Matrix< T > operator*(const Matrix< T > &, const Matrix< T > &)
Matrix multiply.
int getTruncOrder() const
Get truncation order.
clearpage the user may choose between constant or variable radius This model includes fringe fields begin
static Array1D< T > evalMonoms(const FVector< T, N > &, int)
Evaluate monomials at point.
Inform & endl(Inform &inf)
Transport map with values of type [b]T[/b] in [b]N[/b] variables.
FTps inverse(int trunc=EXACT) const
Reciprocal, 1/(*this).
T::PETE_Expr_t::PETE_Return_t min(const PETE_Expr< T > &expr, NDIndex< D > &loc)
T::PETE_Expr_t::PETE_Return_t max(const PETE_Expr< T > &expr, NDIndex< D > &loc)
static int orderStart(int order)
Get index at which [b]order[/b] starts.
FVps integral(int var) const
Partial integral.
std::string::iterator iterator
FVps derivative(int var) const
Partial derivative.
int getMaxOrder() const
Get highest order contained in any component.
void setMinOrder(int order)
Set minimum order.
Convergence error exception.
FVps substitute(const FMatrix< T, N, N > &M, int n) const
Substitute.
FVps< T, N > ExpMap(const FTps< T, N > &H, int trunc=FTps< T, N >::EXACT)
Build the exponential series.
T::PETE_Expr_t::PETE_Return_t sum(const PETE_Expr< T > &expr)
int getMinOrder() const
Get minimum order.
static int getSize(int order)
int getMinOrder() const
Get lowest order contained in any component.
T::PETE_Expr_t::PETE_Return_t prod(const PETE_Expr< T > &expr)
FVps & operator+=(const FVps &rhs)
Add and assign.
iterator begin()
Get beginning of data.
iterator end()
Get iterator pointing past end of array.
Matrix< T > operator+(const Matrix< T > &, const Matrix< T > &)
Matrix addition.
FTps< T, N > makePower(int power) const
Multiply FTps with itself.
FMatrix< T, N, N > linearTerms() const
Extract the linear part of the map.
Array1D< int > getSubstOrders(const FVps< T, N > &rhs, int trunc=(FTps< T, N >::EXACT)) const
Return orders {min, max, trc} of f(rhs(z)).
int getSize() const
Get total number of coefficients.
FVps operator+() const
Unary plus.
void setTruncOrder(int order)
Set truncation order for all components.
Vector truncated power series in n variables.
const FTps< T, N > & getComponent(int n) const
Get component.
int getTopOrder() const
Get highest order contained in any component.
FVps myInverse(int trunc=(FTps< T, N >::EXACT)) const
Inverse.
FMatrix< T, N, N > inverse() const
Get inverse.
FTps derivative(int var) const
Partial derivative.
static const Array1D< int > & getVariableList(int index)
std::istream & get(std::istream &is)
Get a FVps from stream [b]is[/b].
int getTruncOrder() const
Get lowest truncation order in any component.
FArray1D< int, N > extractExponents(int index) const
Extract exponents of coefficient.
b mention the algorithm in the References section The appropriate citation is
FVps & operator/=(const FTps< T, N > &rhs)
Divide and assign.
FLieGenerator< T, N > PoissonBracket(const FLieGenerator< T, N > &, const FLieGenerator< T, N > &)
Poisson bracket of two Lie generators.
int getMaxOrder() const
Get maximum order.
std::istream & operator>>(std::istream &, Tps< T > &x)
Extract from stream.
void identity()
Set to identity.
int getDimension() const
Get dimension.
static int orderEnd(int order)
Get one plus index at which [b]order[/b] ends.
void setMaxOrder(int order)
Set maximum order.
Matrix< T > operator/(const Matrix< T > &, const T &)
Matrix divided by scalar.
FVector< T, N > constantTerm() const
Extract the constant part of the map.
FTps< T, N > getFTps(const FArray1D< int, N > &power) const
Get a FTps that is a combination of the polynomials of FVps.
static const Array1D< int > & getProductArray(int index)
FVps substituteInto(const FMatrix< T, N, N > &lhs) const
Substitute map into matrix.
iterator begin()
Get iterator pointing to beginning of array.
std::ostream & put(std::ostream &os) const
Put a FVps to stream [b]os[/b].