46#include <initializer_list>
57template<std::
size_t N>
66 Index size()
const {
return VectorNd<N>::size(); }
67 const double *
data()
const {
return VectorNd<N>::data(); }
68 double *
data() {
return VectorNd<N>::data(); }
72 class =
typename std::enable_if_t<
sizeof...(Args) ==
N>,
73 class = std::enable_if_t<(std::conjunction_v<std::is_same<double, Args>...>)>
76 std::initializer_list<double> ini{ args ... };
77 int i=0;
for(
const double& x: ini){ (*this)[i++]=x; }
82 double &operator[] (
Index i){
return VectorNd<N>::operator[](i); }
83 const double &operator[] (
Index i)
const {
return VectorNd<N>::operator[](i); }
92 auto begin() {
return this->values.begin(); }
93 auto end() {
return this->values.end(); }
94 auto begin()
const {
return this->values.begin(); }
95 auto end()
const {
return this->values.end(); }
105 OOFEM_ERROR(
"Can't convert dynamic float array of size %d to fixed size %ld\n", x.
giveSize(),
N);
111 template<
typename... V,
class =
typename std::enable_if_t<
sizeof...(V) ==
N>>
125 inline double &operator[] (std::size_t i)
138 inline const double &operator[] (std::size_t i)
const {
157 inline double &
at(std::size_t i) {
return (*
this)[i-1]; }
163 inline double at(std::size_t i)
const {
return (*
this)[i-1]; }
166 template<std::
size_t M>
inline FloatArrayF<M> operator[] (std::size_t
const (&c)[M])
const {
return (*
this)(c).eval(); }
167 template<
size_t M>
inline void assign(
const FloatArrayF<M> &x,
int const (&c)[M] ){ (*this)(c)=x; }
168 template<
size_t M>
inline void assemble(
const FloatArrayF<M> &x,
int const (&c)[M] ){ (*this)(c)+=x; }
174 template<std::
size_t M>
178 for ( std::size_t i = 0; i < M; ++i ) {
179 x[i] = (*this)[ c[i] ];
188 for ( std::size_t i = 0; i < M; ++i ) {
189 (*this)[c[i]] = x[i];
197 for ( std::size_t i = 0; i < M; ++i ) {
198 (*this)[c[i]] += x[i];
210 printf(
"%s (%d): \n", name.c_str(), this->size());
211 for (
double x: *
this ) {
212 printf(
"%10.3e ", x );
225 if ( !stream.
write(this->givePointer(), this->size()) ) {
233 if ( !stream.
read(this->givePointer(), this->size()) ) {
249template<std::
size_t N>
253 for (
double xi : x ) {
262template<
size_t N,
size_t M>
inline FloatArrayF<N>
assemble(
const FloatArrayF<M> &x,
int const (&c)[M] ){ FloatArrayF<N> out=VectorNd<N>::Zero(); out(c)=x;
return out; }
281template<std::
size_t N>
double sum(
const FloatArrayF<N> & x ){
return x.array().sum(); }
291template<
size_t N,
size_t M>
295 for ( std::size_t i = 0; i < M; ++i ) {
304template<std::
size_t N>
308 for ( std::size_t i = 0; i <
N; ++i ) {
314template<std::
size_t N>
321template<std::
size_t N>
325 for ( std::size_t i = 0; i <
N; ++i ) {
326 out[i] = x[i] * y[i];
332template<std::
size_t N>
336 for ( std::size_t i = 0; i <
N; ++i ) {
342template<std::
size_t N>
346 for ( std::size_t i = 0; i <
N; ++i ) {
347 out[i] = std::pow(x[i], a);
352template<std::
size_t N>
356 for ( std::size_t i = 0; i <
N; ++i ) {
357 out[i] = x[i] + y[i];
362template<std::
size_t N>
366 for ( std::size_t i = 0; i <
N; ++i ) {
367 out[i] = x[i] - y[i];
372template<std::
size_t N>
376 for ( std::size_t i = 0; i <
N; ++i ) {
382template<std::
size_t N>
385 for ( std::size_t i = 0; i <
N; ++i ) {
391template<std::
size_t N>
394 for ( std::size_t i = 0; i <
N; ++i ) {
400template<std::
size_t N>
403 for (
auto &v : x ) {
409template<std::
size_t N>
412 for (
auto &v : x ) {
418template<std::
size_t N>
421 for (
auto &v : x ) {
428template<std::
size_t N>
431 for (
auto &v : x ) {
440template<std::
size_t N>
443 for (
auto &val : x ) {
444 if ( !std::isfinite(val) ) {
452template<std::
size_t N>
456 for (
auto &val : x ) {
463template<std::
size_t N>
470template<std::
size_t N>
477template<std::
size_t N>
480 return std::accumulate(x.
begin(), x.
end(), 0.);
484template<std::
size_t N>
487 return std::accumulate(x.
begin(), x.
end(), 1.0, [](
double a,
double b) { return a*b; });
494 x[1] * y[2] - x[2] * y[1],
495 x[2] * y[0] - x[0] * y[2],
496 x[0] * y[1] - x[1] * y[0],
501template<std::
size_t N>
505 for ( std::size_t i = 0; i <
N; ++i ) {
511template<std::
size_t N>
515 for (std::size_t i = 0; i <
N; ++i) {
516 out[i] = std::max(a[i], b[i]);
521template<std::
size_t N>
525 for (std::size_t i = 0; i <
N; ++i) {
526 out[i] = std::min(a[i], b[i]);
532template<std::
size_t N>
543template<std::
size_t N>
550template<std::
size_t N>
564 std::swap( t[3], t[5] );
571 std::swap( t[3], t[5] );
572 std::swap( t[7], t[8] );
582 return {s[0], s[1], s[2], 0.5*s[3], 0.5*s[4], 0.5*s[5]};
588 return {e[0], e[1], e[2], 2*e[3], 2*e[4], 2*e[5]};
virtual int read(int *data, std::size_t count)=0
Reads count integer values into array pointed by data.
virtual int givePackSizeOfDouble(std::size_t count)=0
virtual int write(const int *data, std::size_t count)=0
Writes count integer values from array pointed by data.
void printYourself(const std::string &name="FloatArrayF") const
double & at(std::size_t i)
const double * data() const
FloatArrayF(const FloatArray &x)
Ctor from dynamic array (size must match).
const double * givePointer() const
std::array< double, N > values
Stored values.
FloatArrayF()
Empty Ctor (zeroes).
contextIOResultType storeYourself(DataStream &stream) const
int giveSize() const
Returns the size of receiver.
void assemble(const FloatArrayF< M > &x, int const (&c)[M])
Assemble x into self.
double at(std::size_t i) const
contextIOResultType restoreYourself(DataStream &stream)
void assign(const FloatArrayF< M > &x, int const (&c)[M])
Assign x into self.
FloatArrayF(V... x)
Direct value ctor.
int size() const
Returns the size of receiver.
FloatArrayF(const FloatArrayF< N > &x)
Copy ctor.
int givePackSize(DataStream &buff) const
std::vector< double >::iterator begin()
Index giveSize() const
Returns the size of receiver.
FloatArray operator+(const FloatArray &x, const FloatArray &y)
double norm(const FloatArray &x)
OOFEM_EXPORT FloatArray operator/(const FloatArray &x, const double &a)
FloatArrayF< N > min(const FloatArrayF< N > &a, const FloatArrayF< N > &b)
FloatArrayF< 6 > to_voigt_strain_6(const FloatArrayF< 6 > &s)
Convert stress to strain Voigt form.
bool iszero(const FloatArray &x)
FloatArray operator-(const FloatArray &x, const FloatArray &y)
FloatArrayF< N > assemble(const FloatArrayF< M > &x, int const (&c)[M])
Assemble components into zero matrix.
FloatArrayF< N > max(const FloatArrayF< N > &a, const FloatArrayF< N > &b)
FloatArray & operator/=(FloatArray &x, const double &a)
FloatArray & operator+=(FloatArray &x, const FloatArray &y)
std::ostream & operator<<(std ::ostream &out, const Dictionary &r)
FloatArrayF< N > operator^=(FloatArrayF< N > &x, double a)
FloatArrayF< 3 > cross(const FloatArrayF< 3 > &x, const FloatArrayF< 3 > &y)
Computes $ x \cross y $.
double sum(const FloatArray &x)
FloatArrayF< N > operator^(const FloatArrayF< N > &x, double a)
double dot(const FloatArray &x, const FloatArray &y)
FloatArrayF< N > mult(const FloatArrayF< N > &x, const FloatArrayF< N > &y)
Element-wise multiplication.
bool isfinite(const FloatArray &x)
FloatArray & operator-=(FloatArray &x, const FloatArray &y)
double product(const FloatArray &x)
FloatArray operator*(const double &a, const FloatArray &x)
void swap_46(FloatArrayF< 6 > &t)
FloatArrayF< N > normalize(const FloatArrayF< N > &x)
Normalizes vector (L2 norm).
FloatArrayF< N > zeros()
For more readable code.
FloatArray & operator*=(FloatArray &x, const double &a)
Vector multiplication by scalar.
double distance(const FloatArray &x, const FloatArray &y)
@ CIO_IOERR
General IO error.
FloatArrayF< 6 > to_voigt_stress_6(const FloatArrayF< 6 > &e)
Convert strain to stress Voigt form.
double norm_squared(const FloatArrayF< N > &x)
Computes the L2 norm of x.
const FloatArrayF< 6 > I6
I expressed in Voigt form.
FloatArrayF< N > distance_squared(const FloatArrayF< N > &a, const FloatArrayF< N > &b)
Computes the norm(a-b)^2.