1# ifndef _RHEO_BASIC_POINT_H
2# define _RHEO_BASIC_POINT_H
79#include "rheolef/compiler_mpi.h"
140 std::istream&
get (std::istream& s,
int d = 3);
141 std::ostream&
put (std::ostream& s,
int d = 3)
const;
146 const T&
x()
const {
return _x[0]; }
147 const T&
y()
const {
return _x[1]; }
148 const T&
z()
const {
return _x[2]; }
173template <
class T,
class U>
176 details::is_rheolef_arithmetic<U>::value
244template<
class T,
size_t d>
250template <
class T,
class U>
254 details::is_rheolef_arithmetic<U>::value
269 v[0]*w[1]-v[1]*w[0]);
276 return x[0]*y[0]+x[1]*y[1]+x[2]*y[2];
288 return sqrt(
norm2(x));
311template<
class T,
size_t d>
317 if (a[i] < b[i])
return true;
318 if (a[i] > b[i])
return false;
363 typedef typename std::initializer_list<T>::const_iterator
const_iterator;
364 check_macro (il.size() <= 3,
"unexpected initializer list size=" << il.size() <<
" > 3");
366 for (
const_iterator iter = il.begin(); iter != il.end(); ++iter, ++i) {
369 for (i = il.size(); i < 3; ++i) {
379 case 0 : _x[0] = _x[1] = _x[2] =
T(0);
return s;
380 case 1 : _x[1] = _x[2] =
T(0);
return s >> _x[0];
381 case 2 : _x[2] =
T(0);
return s >> _x[0] >> _x[1];
382 default:
return s >> _x[0] >> _x[1] >> _x[2];
392 case 1 :
return s << _x[0];
393 case 2 :
return s << _x[0] <<
" " << _x[1];
394 default:
return s << _x[0] <<
" " << _x[1] <<
" " << _x[2];
402 return s >>
p[0] >>
p[1] >>
p[2];
409 return s <<
p[0] <<
" " <<
p[1] <<
" " <<
p[2];
415 std::ostringstream ostrstr;
417 return ostrstr.str();
422#define def_point_function2(f,F) \
426f (const point_basic<T>& x) \
429 for (size_t i = 0; i < 3; i++) \
434#define def_point_function(f) def_point_function2(f,f)
441#undef def_point_function2
442#undef def_point_function
448 return _x[0] == v[0] && _x[1] == v[1] && _x[2] == v[2];
516template<
class T1,
class T2>
522 for (
size_t i = 0; i < 3; i++)
523 if (x[i] != 0) y[i] = a/x[i];
530 details::is_rheolef_arithmetic<U>::value
573#ifdef _RHEOLEF_HAVE_MPI
574#include <boost/serialization/serialization.hpp>
577 namespace serialization {
578 template<
class Archive,
class T>
594 struct is_mpi_datatype<
rheolef::point_basic<double> > : mpl::true_ { };
point_basic< T > operator-() const
const T & operator()(int i_coord) const
std::istream & get(std::istream &s, int d=3)
bool operator==(const point_basic< T > &v) const
T & operator()(int i_coord)
point_basic< T > & operator+=(const point_basic< T > &v)
point_basic< T > operator+(const point_basic< T > &v) const
std::ostream & put(std::ostream &s, int d=3) const
bool operator!=(const point_basic< T > &v) const
point_basic< T > operator/(const T &a) const
point_basic< T > & operator=(const point_basic< T1 > &p)
std::enable_if< details::is_rheolef_arithmetic< U >::value, point_basic< T > >::type operator*(const U &a) const
static T _my_abs(const T &x)
point_basic< T > & operator*=(const T &a)
point_basic< T > & operator/=(const T &a)
const T & operator[](int i_coord) const
point_basic(const T &x0, const T &x1=0, const T &x2=0)
T & operator[](int i_coord)
point_basic(const std::initializer_list< T > &il)
point_basic< T > & operator-=(const point_basic< T > &v)
point_basic< Float > point
check_macro(expr1.have_homogeneous_space(Xh1), "dual(expr1,expr2); expr1 should have homogeneous space. HINT: use dual(interpolate(Xh, expr1),expr2)")
void serialize(Archive &ar, class rheolef::point_basic< T > &x, const unsigned int version)
This file is part of Rheolef.
bool lexicographically_less(const point_basic< T > &a, const point_basic< T > &b)
T orient2d(const point_basic< T > &a, const point_basic< T > &b, const point_basic< T > &c)
bool operator==(const heap_allocator< T1 > &lhs, const heap_allocator< T1 > &rhs)
std::ostream & operator<<(std::ostream &os, const catchmark &m)
point_basic< T > vect(const point_basic< T > &v, const point_basic< T > &w)
dia< T, M > operator/(const T &lambda, const dia< T, M > &d)
T norm2(const vec< T, M > &x)
norm2(x): see the expression page for the full documentation
T dist_infty(const point_basic< T > &x, const point_basic< T > &y)
T orient3d(const point_basic< T > &a, const point_basic< T > &b, const point_basic< T > &c, const point_basic< T > &d)
int sign_orient2d(const point_basic< T > &a, const point_basic< T > &b, const point_basic< T > &c)
int sign_orient3d(const point_basic< T > &a, const point_basic< T > &b, const point_basic< T > &c, const point_basic< T > &d)
T mixt(const point_basic< T > &u, const point_basic< T > &v, const point_basic< T > &w)
rheolef::std enable_if ::type dot const Expr1 expr1, const Expr2 expr2 dot(const Expr1 &expr1, const Expr2 &expr2)
T dist2(const point_basic< T > &x, const point_basic< T > &y)
std::string ptos(const point_basic< T > &x, int d=3)
std::istream & operator>>(std::istream &is, const catchmark &m)
T vect2d(const point_basic< T > &v, const point_basic< T > &w)
T dist(const point_basic< T > &x, const point_basic< T > &y)
csr< T, sequential > operator*(const T &lambda, const csr< T, sequential > &a)
T norm(const vec< T, M > &x)
norm(x): see the expression page for the full documentation
#define def_point_function(f)
float_traits< T >::type type
helper for std::complex<T>: get basic T type
helper for point_basic<T> & tensor_basic<T>: get basic T type