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);
627 FVps<T, N> result(minOrder, maxOrder, trcOrder);
628 for(
int k = N; k-- > 0;)
629 std::copy(f[k].
begin(minOrder), f[k].
end(maxOrder), result[k].
begin(minOrder));
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]];
687 std::copy(mv, mv + N, t1);
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);
750 FVps<T, N> result(minOrder, maxOrder, trcOrder);
751 for(
int k = N; k-- > 0;)
752 std::copy(f[k].
begin(minOrder), f[k].
end(maxOrder), result[k].
begin(minOrder));
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]];
846 std::copy(mv, mv + N, t1);
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)");
1247 FTps<T, N> dHk1f = dH[0].multiply(ddHkf, trunc);
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>
PartBunchBase< T, Dim >::ConstIterator end(PartBunchBase< T, Dim > const &bunch)
PartBunchBase< T, Dim >::ConstIterator begin(PartBunchBase< T, Dim > const &bunch)
FVps< T, N > operator/(const FVps< T, N > &lhs, const FTps< T, N > &rhs)
Divide.
FVps< T, N > PoissonBracket(const FTps< T, N > &x, const FVps< T, N > &y, int trunc)
Poisson bracket.
FVps< T, N > ExpMap(const FTps< T, N > &H, const FVps< T, N > &map, int trunc)
Build the exponential series.
FVps< T, N > operator-(const FVps< T, N > &lhs, const FVps< T, N > &rhs)
Subtract.
FVps< T, N > operator+(const FVps< T, N > &lhs, const FVps< T, N > &rhs)
Add.
std::ostream & operator<<(std::ostream &os, const FVps< T, N > &vps)
Insert FVps to stream [b]os[/b].
FVector< T, N > operator*(const FVps< T, N > &lhs, const FVector< T, N > &rhs)
Multiply.
std::istream & operator>>(std::istream &is, FVps< T, N > &vps)
Extract FVps from stream [b]is[/b].
T::PETE_Expr_t::PETE_Return_t max(const PETE_Expr< T > &expr, NDIndex< D > &loc)
T::PETE_Expr_t::PETE_Return_t min(const PETE_Expr< T > &expr, NDIndex< D > &loc)
T::PETE_Expr_t::PETE_Return_t sum(const PETE_Expr< T > &expr)
T::PETE_Expr_t::PETE_Return_t prod(const PETE_Expr< T > &expr)
Inform & endl(Inform &inf)
std::string::iterator iterator
Vector truncated power series in n variables.
FVps integral(int var) const
Partial integral.
const FVps & operator=(const FVps &)
Array1D< int > getSubstOrders(const FVps< T, N > &rhs, int trunc=(FTps< T, N >::EXACT)) const
Return orders {min, max, trc} of f(rhs(z)).
void setComponent(int, const FTps< T, N > &)
Set component.
FVps & operator*=(const FTps< T, N > &rhs)
Multiply and assign.
void setMinOrder(int order)
Set minimum order.
std::ostream & put(std::ostream &os) const
Put a FVps to stream [b]os[/b].
void setTruncOrder(int order)
Set truncation order for all components.
FVector< T, N > constantTerm() const
Extract the constant part of the map.
int getTopOrder() const
Get highest order contained in any component.
FVps substituteInto(const FMatrix< T, N, N > &lhs) const
Substitute map into matrix.
FVps substitute(const FMatrix< T, N, N > &M, int n) const
Substitute.
FTps< T, N > getFTps(const FArray1D< int, N > &power) const
Get a FTps that is a combination of the polynomials of FVps.
int getMaxOrder() const
Get highest order contained in any component.
FVps operator+() const
Unary plus.
FVps myInverse(int trunc=(FTps< T, N >::EXACT)) const
Inverse.
int getVariables() const
Get number of variables.
FVps & operator+=(const FVps &rhs)
Add and assign.
FVps truncate(int trunc)
Truncate.
void setMaxOrder(int order)
Set maximum order.
FVps operator*(const FVps< T, N > &rhs) const
Multiply.
FVps derivative(int var) const
Partial derivative.
FVps & operator/=(const FTps< T, N > &rhs)
Divide and assign.
const FTps< T, N > & getComponent(int n) const
Get component.
FVps filter(int minOrder, int maxOrder, int trcOrder=(FTps< T, N >::EXACT)) const
Extract given range of orders, with truncation.
void identity()
Set to identity.
int getDimension() const
Get dimension.
std::istream & get(std::istream &is)
Get a FVps from stream [b]is[/b].
FVps & operator-=(const FVps &rhs)
Subtract and assign.
int getTruncOrder() const
Get lowest truncation order in any component.
FVps inverse(int trunc=(FTps< T, N >::EXACT)) const
Inverse.
int getMinOrder() const
Get lowest order contained in any component.
const FTps< T, N > & operator[](int) const
Get Component.
FMatrix< T, N, N > linearTerms() const
Extract the linear part of the map.
FVps operator-() const
Unary minus.
iterator begin()
Get beginning of data.
iterator end()
Get iterator pointing past end of array.
iterator begin()
Get iterator pointing to beginning of array.
Truncated power series in N variables of type T.
FTps< T, N > makePower(int power) const
Multiply FTps with itself.
const T getCoefficient(int index) const
Get coefficient.
std::list< int > getListOfNonzeroCoefficients() const
Get a list containing the indexes of non-zero coefficients of a FTps.
FTps inverse(int trunc=EXACT) const
Reciprocal, 1/(*this).
void setTruncOrder(int order)
Set truncation order.
int getMinOrder() const
Get minimum order.
int getTruncOrder() const
Get truncation order.
FTps multiply(const FTps &y, int trunc=EXACT) const
Multiplication.
T * begin() const
Return beginning of monomial array.
int getSize() const
Get total number of coefficients.
static Array1D< T > evalMonoms(const FVector< T, N > &, int)
Evaluate monomials at point.
FTps derivative(int var) const
Partial derivative.
static int orderEnd(int order)
Get one plus index at which [b]order[/b] ends.
T evaluate(const FVector< T, N > &) const
Evaluate FTps at point.
int getMaxOrder() const
Get maximum order.
static int orderStart(int order)
Get index at which [b]order[/b] starts.
Array1D< int > getSubstOrders(const FVps< T, N > &rhs, int trunc=EXACT) const
Return orders {min, max, trc} of f(rhs(z)).
FArray1D< int, N > extractExponents(int index) const
Extract exponents of coefficient.
void setMinOrder(int order)
Set minimum order.
A templated representation of a LU-decomposition.
FMatrix< T, N, N > inverse() const
Get inverse.
A templated representation for vectors.
static int getSize(int order)
static const Array1D< int > & getVariableList(int index)
static const Array1D< int > & getProductArray(int index)
Linear map with values of type [b]T[/b] in [b]N[/b] variables.
Transport map with values of type [b]T[/b] in [b]N[/b] variables.
Convergence error exception.
Singular matrix exception.