| 1 | /* | 
| 2 |  * Ghost.hpp | 
| 3 |  * | 
| 4 |  *  Created on: Apr 28, 2015 | 
| 5 |  *      Author: Pietro Incardona | 
| 6 |  */ | 
| 7 |  | 
| 8 | #ifndef GHOST_HPP_ | 
| 9 | #define GHOST_HPP_ | 
| 10 |  | 
| 11 | #include "SpaceBox.hpp" | 
| 12 |  | 
| 13 | #define INVALID_GHOST 9223372036854775807 | 
| 14 |  | 
| 15 | /*! Ghost | 
| 16 |  * | 
| 17 |  * it indicate the ghost extension | 
| 18 |  * | 
| 19 |  * Ghost margins for each dimensions (p1 negative part) (p2 positive part) | 
| 20 |                 ^ p2[1] | 
| 21 |                 | | 
| 22 |                 | | 
| 23 |            +----+----+ | 
| 24 |            |         | | 
| 25 |            |         | | 
| 26 | p1[0]<-----+         +----> p2[0] | 
| 27 |            |         | | 
| 28 |            |         | | 
| 29 |            +----+----+ | 
| 30 |                 | | 
| 31 |                 v  p1[1] | 
| 32 |  | 
| 33 |  | 
| 34 |     \warning p1[0] and p1[1] must be negative hile p2[1] and p2[0] must be positive | 
| 35 |  * | 
| 36 |  */ | 
| 37 |  | 
| 38 | template<unsigned int dim, typename T> | 
| 39 | class Ghost : public Box<dim,T> | 
| 40 | { | 
| 41 | public: | 
| 42 |  | 
| 43 | 	/*! constructor from another Ghost | 
| 44 | 	 * | 
| 45 | 	 * \param g ghost | 
| 46 | 	 * | 
| 47 | 	 */ | 
| 48 | 	template <typename S> inline Ghost(const Ghost<dim,S> & g) | 
| 49 | 	{ | 
| 50 | 		for (size_t i = 0 ; i < dim ; i++) | 
| 51 | 		{ | 
| 52 | 			this->setLow(i,g.getLow(i)); | 
| 53 | 			this->setHigh(i,g.getHigh(i)); | 
| 54 | 		} | 
| 55 | 	} | 
| 56 |  | 
| 57 | 	/*! \brief Constructor from initializer list | 
| 58 | 	 * | 
| 59 | 	 * \param p1 Low point, initialize as a list example {0.0,0.0,0.0} | 
| 60 | 	 * \param p2 High point, initialized as a list example {1.0,1.0,1.0} | 
| 61 | 	 * | 
| 62 | 	 */ | 
| 63 | 	Ghost(std::initializer_list<T> p1, std::initializer_list<T> p2) | 
| 64 | 	:Box<dim,T>(p1,p2) | 
| 65 | 	{} | 
| 66 |  | 
| 67 | 	// construct a ghost based on interaction radius | 
| 68 | 	inline Ghost(T r) | 
| 69 | 	{ | 
| 70 | 		for (size_t i = 0 ; i < dim ; i++) | 
| 71 | 		{ | 
| 72 | 			this->setLow(i,-r); | 
| 73 | 			this->setHigh(i,r); | 
| 74 | 		} | 
| 75 | 	} | 
| 76 |  | 
| 77 | 	// Basic constructor | 
| 78 | 	inline Ghost() | 
| 79 | 	{ | 
| 80 | 		for (size_t i = 0 ; i < dim ; i++) | 
| 81 | 		{ | 
| 82 | 			this->setLow(i,0); | 
| 83 | 			this->setHigh(i,0); | 
| 84 | 		} | 
| 85 | 	} | 
| 86 |  | 
| 87 | 	/*! \brief Divide component wise the ghost box with a point | 
| 88 | 	 * | 
| 89 | 	 * \param p point | 
| 90 | 	 * | 
| 91 | 	 * \return itself | 
| 92 | 	 * | 
| 93 | 	 */ | 
| 94 | 	inline Ghost<dim,T> & operator/=(const Point<dim,T> & p) | 
| 95 | 	{ | 
| 96 | 		Box<dim,T>::operator/=(p); | 
| 97 |  | 
| 98 | 		return *this; | 
| 99 | 	} | 
| 100 |  | 
| 101 | 	/*! \brief check if the Ghost is valid | 
| 102 | 	 * | 
| 103 | 	 * | 
| 104 | 	 * | 
| 105 | 	 */ | 
| 106 | 	inline bool isInvalidGhost() | 
| 107 | 	{ | 
| 108 | 		for (size_t i = 0 ; i < dim ; i++) | 
| 109 | 		{ | 
| 110 | 			if (this->getLow(i) == -INVALID_GHOST)	return true; | 
| 111 | 			if (this->getHigh(i) == INVALID_GHOST)	return true; | 
| 112 | 		} | 
| 113 |  | 
| 114 | 		return false; | 
| 115 | 	} | 
| 116 | }; | 
| 117 |  | 
| 118 | /*! \brief Class that contain Padding information on each direction positive and Negative direction | 
| 119 |  * | 
| 120 |  * It is equivalent to a Ghost<dim,size_t> | 
| 121 |  * | 
| 122 |  * \see Ghost | 
| 123 |  * | 
| 124 |  */ | 
| 125 | template<unsigned int dim> | 
| 126 | class Padding : public Ghost<dim,long int> | 
| 127 | { | 
| 128 | public: | 
| 129 | 	/*! \brief Constructor from initializer list | 
| 130 | 	 * | 
| 131 | 	 * \param p1 Padding left, initialize as a list example {0.0,0.0,0.0} | 
| 132 | 	 * \param p2 Padding right, initialized as a list example {1.0,1.0,1.0} | 
| 133 | 	 * | 
| 134 | 	 */ | 
| 135 | 	Padding(std::initializer_list<long int> p1, std::initializer_list<long int> p2) | 
| 136 | 	{ | 
| 137 | 		Box<dim,long int>::set(p1,p2); | 
| 138 | 	} | 
| 139 | }; | 
| 140 |  | 
| 141 | #endif /* GHOST_HPP_ */ | 
| 142 |  |