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)
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>
180template <
class T,
int N>
190template <
class T,
int N>
196template <
class T,
int N>
206template <
class T,
int N>
216template <
class T,
int N>
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) {
305 for(std::list<int>::iterator it = coeffs.begin(); it != coeffs.end(); ++it) {
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>
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;
431 for(
int m = 2; m <= trcOrder; ++m) {
433 result = t1inv * (
id - tr);
440template <
class T,
int N>
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;
512 for(
int m = 2; m <= trcOrder; ++m) {
514 result = t1inv * (
id - tr);
516 result += t1inv * (
id - tr);
523template <
class T,
int N>
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++) {
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>
573 if(maxOrder) --maxOrder;
575 T *m = monoms.
begin();
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>
607template <
class T,
int N>
612 "Transformation order, n, is negative.");
615 "Transformation order, n, exceeds globalTruncOrder.");
620 for(
int k = N; k-- > 0;) {
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.");
743 for(
int k = N; k-- > 0;) {
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;
767 nl = std::max(nl, minOrder);
768 nh = std::min(nh, maxOrder);
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;
808 ni = std::max(ni, nl);
810 int n1 = std::max(nl, ni), n2 = nh;
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>
894template <
class T,
int N>
902 int g_min = orders[0], g_max = orders[1], g_trc = orders[2];
903 for(
int k = N; k-- > 0;) {
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;
952 ni = std::max(ni, nl);
954 int n1 = std::max(nl, ni), n2 = nh;
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>
1079 os <<
"FVps " << N << std::endl;
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>
int FTpsData< N >::topOrder
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 sum(const PETE_Expr< T > &expr)
T::PETE_Expr_t::PETE_Return_t prod(const PETE_Expr< T > &expr)
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.
FVps(int minOrder, int maxOrder, int trcOrder)
Constructor.
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.
A templated representation for one-dimensional arrays.
iterator end()
Get iterator pointing past end of array.
iterator begin()
Get iterator pointing to beginning of array.
A templated representation for matrices.
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.
static const int EXACT
Representation of infinite precision.
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 getGlobalTruncOrder()
Return the global truncation order.
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.