45template <
class T,
int N>
51template <
class T,
int N>
53 for(
int i = 0; i < N; ++i) data[i] = rhs.
data[i];
57template <
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];
67template <
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];
77template <
class T,
int N>
79 for(
int i = 0; i < N; ++i)
80 data[i] =
FTps<T, N>(minOrder, maxOrder, trcOrder);
84template <
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);
92template <
class T,
int N>
94 for(
int i = 0; i < N; i++) data[i] = FTps<T, N>(x[i]);
98template <
class T,
int N>
103template <
class T,
int N>
105 if(&rhs !=
this)
for(
int i = 0; i < N; ++i) data[i] = rhs.
data[i];
110template <
class T,
int N>
112 for(
int i = 0; i < N; ++i) data[i] = FTps<T, N>::makeVariable(i);
116template <
class T,
int N>
118 for(
int i = 0; i < N; ++i) data[i] =
T(0);
122template <
class T,
int N>
124 if(index < 0 || index >= N)
125 throw CLRangeError(
"FVps::getComponent()",
"Index out of range.");
131template <
class T,
int N>
133 if(index < 0 || index >= N)
134 throw CLRangeError(
"FVps::setComponent()",
"Index out of range.");
140template <
class T,
int N>
inline
146template <
class T,
int N>
inline
152template <
class T,
int N>
158template <
class T,
int N>
164template <
class T,
int N>
174template <
class T,
int N>
176 for(
int i = 0; i < N; ++i) data[i].setMinOrder(order);
180template <
class T,
int N>
190template <
class T,
int N>
192 for(
int i = 0; i < N; ++i) data[i].setMaxOrder(order);
196template <
class T,
int N>
206template <
class T,
int N>
216template <
class T,
int N>
218 for(
int i = 0; i < N; ++i) data[i].setTruncOrder(order);
222template <
class T,
int N>
227 for(
int i = 0; i < N; i++)
228 result[i] = data[i].filter(minOrder, maxOrder, trcOrder);
233template <
class T,
int N>
235 return filter(0, trunc, trunc);
239template <
class T,
int N>
245template <
class T,
int N>
248 for(
int i = 0; i < N; i++) result[i] = - data[i];
253template <
class T,
int N>
255 for(
int i = 0; i < N; i++) data[i] += rhs[i];
260template <
class T,
int N>
262 for(
int i = 0; i < N; i++) data[i] -= rhs[i];
267template <
class T,
int N>
269 for(
int i = 0; i < N; i++) data[i] += rhs[i];
274template <
class T,
int N>
276 for(
int i = 0; i < N; i++) data[i] -= rhs[i];
281template <
class T,
int N>
283 for(
int i = 0; i < N; i++) data[i] *= rhs;
287template <
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) {
337template <
class T,
int N>
340 for(
int i = 0; i < N; i++) data[i] *= t;
345template <
class T,
int N>
347 for(
int i = 0; i < N; i++) data[i] *= rhs;
352template <
class T,
int N>
354 for(
int i = 0; i < N; i++) data[i] /= rhs;
359template <
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);
440template <
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);
523template <
class T,
int N>
526 for(
int i = 0; i < N; i++) result[i] = data[i].derivative(var);
531template <
class T,
int N>
534 for(
int i = 0; i < N; i++) result[i] = data[i].integral(var);
539template <
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);
550template <
class T,
int N>
554 for(
int v = N; v-- > 0;)
555 result[v] = (*
this)[v].evaluate(P);
560template <
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];
569template <
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++;
593template <
class T,
int N>
599 ordersL[0] = getMinOrder(), ordersL[1] = getMaxOrder(), ordersL[2] = getTruncOrder();
607template <
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];
727template <
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];
888template <
class T,
int N>
890 return substitute(mat, getMinOrder(), getMaxOrder());
894template <
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];
1020template <
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];
1033template <
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)
1056template <
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];
1077template <
class T,
int N>
1080 for(
int i = 0; i < N; i++) os << data[i];
1088template <
class T,
int N>
1091 for(
int i = 0; i < N; ++i) result[i] = lhs[i] + rhs[i];
1096template <
class T,
int N>
1099 for(
int i = 0; i < N; ++i) result[i] = lhs[i] - rhs[i];
1104template <
class T,
int N>
1107 for(
int i = 0; i < N; ++i) result[i] = lhs[i] + rhs[i];
1112template <
class T,
int N>
1115 for(
int i = 0; i < N; ++i) result[i] = lhs[i] - rhs[i];
1120template <
class T,
int N>
1123 for(
int i = 0; i < N; ++i) result[i] = lhs[i] + rhs[i];
1128template <
class T,
int N>
1131 for(
int i = 0; i < N; ++i) result[i] = lhs[i] - rhs[i];
1136template <
class T,
int N>
1139 for (
int i = 0; i < N; ++i) {
1147template <
class T,
int N>
1150 for(
int i = 0; i < N; ++i) result[i] = lhs[i] * rhs;
1155template <
class T,
int N>
1158 for(
int i = 0; i < N; ++i) result[i] = lhs * rhs[i];
1163template <
class T,
int N>
1166 for(
int i = 0; i < N; ++i) result[i] = lhs[i] * rhs;
1171template <
class T,
int N>
1174 for(
int i = 0; i < N; ++i) result[i] = lhs * rhs[i];
1178template <
class T,
int N>
1184template <
class T,
int N>
1187 for(
int i = 0; i < N; ++i) result[i] = lhs[i] / rhs;
1192template <
class T,
int N>
1195 for(
int i = 0; i < N; ++i) result[i] = lhs[i] / rhs;
1206 const int MAX_ITER = 400;
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)
1274template <
class T,
int N>
1280template <
class T,
int N>
FVps< T, N > operator/(const FVps< T, N > &lhs, const FTps< T, N > &rhs)
Divide.
FVector< T, N > operator*(const FVps< T, N > &lhs, const FVector< T, N > &rhs)
Multiply.
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::istream & operator>>(std::istream &is, FVps< T, N > &vps)
Extract FVps from stream [b]is[/b].
std::ostream & operator<<(std::ostream &os, const FVps< T, N > &vps)
Insert FVps to stream [b]os[/b].
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.
PartBunchBase< T, Dim >::ConstIterator end(PartBunchBase< T, Dim > const &bunch)
PartBunchBase< T, Dim >::ConstIterator begin(PartBunchBase< T, Dim > const &bunch)
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.
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.
T * begin() const
Return beginning of monomial array.
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.