1#ifndef CLASSIC_TransportFun_CC
2#define CLASSIC_TransportFun_CC
39template <
class T,
int N>
41 for(
int i = 0; i <
SIZE; ++i) data[i] = 0.0;
45template <
class T,
int N>
48 for(
int i = 1; i <
SIZE; ++i) data[i] = 0.0;
52template <
class T,
int N>
55 for(
int i = 1; i <
SIZE; ++i) data[i] = 0.0;
59template <
class T,
int N>
62 for(
int i = 1; i <
SIZE; ++i) data[i] = 0.0;
67template <
class T,
int N>
69 return (index > N) ?
T(0) : data[index];
73template <
class T,
int N>
75 if(index1 <= index2 && index2 < N) {
76 int index = N * (2 * N + 1 - index1) * index1 + (N + 1) + index2;
84template <
class T,
int N>
86 if(index <= N) data[index] = value;
90template <
class T,
int N>
92 if(index1 <= index2 && index2 < N) {
93 int index = N * (2 * N + 1 - index1) * index1 + (N + 1) + index2;
99template <
class T,
int N>
inline
105template <
class T,
int N>
inline
111template <
class T,
int N>
inline
113 int index = N * (2 * N + 1 - index1) * index1 + (N + 1) + index2;
118template <
class T,
int N>
inline
120 int index = N * (2 * N + 1 - index1) * index1 + (N + 1) + index2;
125template <
class T,
int N>
128 for(
int i = 0; i <
SIZE; ++i) z.
data[i] = 0.0;
129 z.
data[var+1] =
T(1);
134template <
class T,
int N>
inline
140template <
class T,
int N>
143 for(
int i = 0; i <
SIZE; ++i) z.
data[i] = - data[i];
148template <
class T,
int N>
150 for(
int i = 0; i <
SIZE; ++i) data[i] += rhs.
data[i];
155template <
class T,
int N>
157 for(
int i = 0; i <
SIZE; ++i) data[i] -= rhs.
data[i];
162template <
class T,
int N>
164 return *
this = multiply(rhs);
168template <
class T,
int N>
171 return *
this = multiply(rhs.
inverse());
175template <
class T,
int N>
inline
182template <
class T,
int N>
inline
189template <
class T,
int N>
191 for(
int i = 0; i <
SIZE; ++i) data[i] *= rhs;
196template <
class T,
int N>
198 if(rhs ==
T(0))
throw DivideError(
"TransportFun::operator/=()");
199 for(
int i = 0; i <
SIZE; ++i) data[i] /= rhs;
204template <
class T,
int N>
206 for(
int i = 0; i <
SIZE; ++i) {
207 if(data[i] != rhs.
data[i])
return false;
214template <
class T,
int N>
216 if(data[0] != rhs)
return false;
218 for(
int i = 1; i <
SIZE; ++i) {
219 if(data[i] !=
T(0))
return false;
226template <
class T,
int N>
inline
228 return !(*
this == rhs);
232template <
class T,
int N>
inline
234 return !(*
this == rhs);
238template <
class T,
int N>
241 if(aZero ==
T(0))
throw DivideError(
"TransportFun::inverse()");
244 series[0] =
T(1) / aZero;
245 series[1] = - series[0] / aZero;
246 series[2] = - series[1] / aZero;
247 return taylor(series);
259 for(
int i = 1; i <
SIZE; ++i) {
260 z.
data[i] = data[0] * rhs.
data[i] + data[i] * rhs.
data[0];
265 for(
int i = 0; i < N; ++i) {
268 z.
data[k] += data[i+1] * rhs.
data[i+1];
271 for(
int j = i + 1; j < N; ++j) {
273 z.
data[k] += data[i+1] * rhs.
data[j+1] + data[j+1] * rhs.
data[i+1];
281template <
class T,
int N>
288 for(
int i = 0; i < N; ++i) {
289 z += data[++k] * rhs[i];
293 for(
int i = 0; i < N; ++i) {
294 for(
int j = i; j < N; ++j) {
295 z += data[++k] * rhs[i] * rhs[j];
303template <
class T,
int N>
309template <
class T,
int N>
316 for(
int i = 0; i < N; ++i) {
317 z += data[++k] * m[i];
321 for(
int i = 0; i < N; ++i) {
322 for(
int j = i; j < N; ++i) {
323 z += data[++k] * m[i] * m[j];
331template <
class T,
int N>
335 return (series[2] * x + series[1]) * x + series[0];
339template <
class T,
int N>
341 is.flags(std::ios::skipws);
345 if(strcmp(head,
"Tps") != 0) {
346 throw FormatError(
"TransportFun::get()",
"Flag word \"Tps\" missing.");
349 int maxOrder, truncOrder, nVar;
350 is >> maxOrder >> truncOrder >> nVar;
353 throw FormatError(
"TransportFun::get()",
"Invalid number of variables.");
366 for(
int var = 0; var < nVar; ++var) {
369 if(mono[var] < 0) done =
true;
374 if(fail)
throw FormatError(
"TransportFun::get()",
"File read error");
377 if(order <= 2 && coeff !=
T(0)) {
380 for(
int var = N; var-- > 0;) {
384 }
else if(order == 2) {
385 index += N + order - var;
394template <
class T,
int N>
396 os <<
"Tps " << this->itsRep->max <<
' ' << this->itsRep->trc <<
' ' << N
398 std::streamsize old_prec = os.
precision(14);
399 os.setf(std::ios::scientific, std::ios::floatfield);
404 os << std::setw(24) << *coeff[0];
405 for(
int var = 0; var < N; ++var) {
406 os << std::setw(3) << 0;
411 for(
int i = 0; i < N; i++) {
414 os << std::setw(24) << *coeff;
415 for(
int var = 0; var < N; ++var) {
416 os << std::setw(3) << ((var == i) ? 1 : 0);
423 for(
int i = 0; i < N; ++i) {
426 os << std::setw(24) << *coeff;
427 for(
int var = 0; var < N; ++var) {
428 os << std::setw(3) << ((var == i) ? 2 : 0);
431 for(
int j = i + 1; j < N; ++j) {
434 os << std::setw(24) << *coeff;
435 for(
int var = 0; var < N; ++var) {
436 os << std::setw(3) << ((var == i || var == j) ? 1 : 0);
444 os << std::setw(24) <<
T(0);
445 for(
int var = 0; var < N; ++var) {
446 os << std::setw(3) << (-1);
451 os.setf(std::ios::fixed, std::ios::floatfield);
459template <
class T,
int N>
inline
466template <
class T,
int N>
inline
473template <
class T,
int N>
inline
480template <
class T,
int N>
inline
487template <
class T,
int N>
inline
494template <
class T,
int N>
inline
501template <
class T,
int N>
inline
507template <
class T,
int N>
inline
513template <
class T,
int N>
inline
520template <
class T,
int N>
inline
527template <
class T,
int N>
inline
534template <
class T,
int N>
inline
540template <
class T,
int N>
inline
546template <
class T,
int N>
inline
552template <
class T,
int N>
558template <
class T,
int N>
TransportFun< T, N > operator/(const TransportFun< T, N > &lhs, const TransportFun< T, N > &rhs)
Divide.
TransportFun< T, N > operator-(const TransportFun< T, N > &lhs, const TransportFun< T, N > &rhs)
Subtract.
bool operator!=(const T &lhs, const TransportFun< T, N > &rhs)
Inequality.
std::istream & operator>>(std::istream &is, TransportFun< T, N > &fun)
Extract TransportFun from stream [b]is[/b].
TransportFun< T, N > operator+(const TransportFun< T, N > &lhs, const TransportFun< T, N > &rhs)
Add.
bool operator==(const T &lhs, const TransportFun< T, N > &rhs)
Equality.
std::ostream & operator<<(std::ostream &os, const TransportFun< T, N > &fun)
Insert TransportFun to stream [b]os[/b].
TransportFun< T, N > operator*(const TransportFun< T, N > &lhs, const TransportFun< T, N > &rhs)
Multiply.
Inform & endl(Inform &inf)
A templated representation for vectors.
Transport map with values of type [b]T[/b] in [b]N[/b] variables.
Transport function in N variables of type T.
const T getCoefficient(int index) const
Get coefficient.
static TransportFun makeVariable(int var)
Make variable.
TransportFun multiply(const TransportFun &y) const
Multiplication truncated to order one.
T evaluate(const FVector< T, N > &) const
Evaluate TransportFun at point.
TransportFun & operator+=(const TransportFun &y)
Add and assign.
T data[SIZE]
Representation.
void setCoefficient(int index, const T &value)
Set coefficient.
TransportFun taylor(const T series[2]) const
Taylor series.
bool operator!=(const TransportFun &y) const
Inequality operator.
TransportFun< T, N > substitute(const TransportMap< T, N > &m) const
Substitute.
TransportFun operator-() const
Unary minus.
TransportFun operator+() const
Unary plus.
const T operator[](int) const
Get coefficient.
TransportFun & operator/=(const TransportFun &y)
Approximate division and assignation.
TransportFun()
Default constructor.
bool operator==(const TransportFun &y) const
Equality operator.
std::ostream & put(std::ostream &os) const
Write TransportFun on the stream [b]os[/b].
std::istream & get(std::istream &is)
Read TransportFun on the stream [b]is[/b].
const T operator()(int i1, int i2) const
Get coefficient.
TransportFun inverse() const
Approximate reciprocal value 1/(*this).
TransportFun & operator*=(const TransportFun &y)
Multiply and assign.
TransportFun & operator=(const T &y)
Convert and assign.
TransportFun & operator-=(const TransportFun &y)
Subtract and assign.