OpenFPM_pdata  1.1.0
Project that contain the implementation of distributed structures
 All Data Structures Namespaces Functions Variables Typedefs Enumerations Friends Pages
staggered_dist_grid.hpp
1 /*
2  * staggered_grid.hpp
3  *
4  * Created on: Aug 19, 2015
5  * Author: i-bird
6  */
7 
8 #ifndef SRC_GRID_STAGGERED_DIST_GRID_HPP_
9 #define SRC_GRID_STAGGERED_DIST_GRID_HPP_
10 
11 #include "Grid/grid_dist_id.hpp"
12 #include "staggered_dist_grid_util.hpp"
13 #include "VTKWriter/VTKWriter.hpp"
14 #include "staggered_dist_grid_copy.hpp"
15 #include <boost/mpl/vector_c.hpp>
16 
62 template<unsigned int dim, typename St, typename T, typename Decomposition=CartDecomposition<dim,St>,typename Memory=HeapMemory , typename device_grid=grid_cpu<dim,T>>
63 class staggered_grid_dist : public grid_dist_id<dim,St,T,Decomposition,Memory,device_grid>
64 {
66  openfpm::vector<comb<dim>> c_prp[T::max_prop_real];
67 
68 public:
69 
71  typedef T value_type;
72 
74  static const unsigned int dims = dim;
75 
86  template<typename H> staggered_grid_dist(const grid_dist_id<dim,St,H,typename Decomposition::base_type,Memory,grid_cpu<dim,H>> & g,
87  const Ghost<dim,long int> & gh,
88  Box<dim,size_t> ext)
89  :grid_dist_id<dim,St,T,Decomposition,Memory,device_grid>(g,gh,ext)
90  {
91  }
92 
101  staggered_grid_dist(const size_t (& g_sz)[dim],
102  const Box<dim,St> & domain,
103  const Ghost<dim,St> & ghost)
104  :grid_dist_id<dim,St,T,Decomposition,Memory,device_grid>(g_sz,domain,ghost)
105  {}
106 
114  template<unsigned int p> void setStagPosition(openfpm::vector<comb<dim>> & cmb)
115  {
116 #ifdef SE_CLASS1
117  if (extends< typename boost::mpl::at<typename T::type,boost::mpl::int_<p> >::type >::mul() != cmb.size())
118  std::cerr << __FILE__ << ":" << __LINE__ << " error properties has " << extends< typename boost::mpl::at<typename T::type,boost::mpl::int_<p> >::type >::mul() << " components, but " << cmb.size() << "has been defined \n";
119 #endif
120  c_prp[p] = cmb;
121  }
122 
127  {
128  // for each properties
129 
131 
132  boost::mpl::for_each_ref< boost::mpl::range_c<int,0,T::max_prop_real> >(ssp);
133  }
134 
147  template<typename Grid_dst ,unsigned int ... pos> bool to_normal(Grid_dst & g_dst, const Padding<dim> & pd, const long int (& start)[dim], const long int (& stop)[dim])
148  {
149  // interpolation points for each property
150  openfpm::vector<std::vector<comb<dim>>> interp_pos[sizeof...(pos)];
151 
152  typedef boost::mpl::vector_c<unsigned int,pos ... > v_pos_type;
153 
155  boost::mpl::for_each_ref<v_pos_type>(itp);
156 
157  // shift the start and stop by the padding
158  grid_key_dx<dim> start_k = grid_key_dx<dim>(start);
159  grid_key_dx<dim> stop_k = grid_key_dx<dim>(stop);
160 
161  // sub-grid iterator over the grid map
162  auto g_map_it = this->getSubDomainIterator(start_k,stop_k);
163 
164  // Iterator over the destination grid
165  auto g_dst_it = g_dst.getDomainIterator();
166 
167  // Check that the 2 iterator has the same size
168  checkIterator<Grid_dst,decltype(g_map_it),decltype(g_dst_it)>(g_map_it,g_dst_it);
169 
170  while (g_map_it.isNext() == true)
171  {
172  typedef typename to_boost_vmpl<pos...>::type vid;
173  typedef boost::mpl::size<vid> v_size;
174 
175  auto key_src = g_map_it.get();
176 
177  // destination point
178  auto key_dst = g_dst_it.get();
179 
180  // Transform this id into an id for the Eigen vector
181 
182  interp_ele<vid,Grid_dst,typename std::remove_reference<decltype(*this)>::type,sizeof...(pos)> cp(key_dst,g_dst,*this,key_src,interp_pos);
183 
184  // For each property in the target grid
185  boost::mpl::for_each_ref<boost::mpl::range_c<int,0,v_size::value>>(cp);
186 
187  ++g_map_it;
188  ++g_dst_it;
189  }
190 
191  return true;
192  }
193 
200  const openfpm::vector<comb<dim>> (& getStagPositions()) [T::max_prop]
201  {
202  return c_prp;
203  }
204 
210  void write(std::string str)
211  {
213 
214  boost::mpl::for_each_ref< boost::mpl::range_c<int,0,T::max_prop> >(sgw);
215  }
216 
224  bool is_staggered_prop(size_t prp)
225  {
226  return c_prp[prp].size() != 0;
227  }
228 
235  {
236  return true;
237  }
238 
239  friend class stag_create_and_add_grid<dim,staggered_grid_dist<dim,St,T,Decomposition,Memory,device_grid>,St>;
240 };
241 
242 #endif /* SRC_GRID_STAGGERED_DIST_GRID_HPP_ */
size_t g_sz[dim]
Size of the grid on each dimension.
void setDefaultStagPosition()
It set all the properties defined to be staggered on the default location.
void write(std::string str)
Write a vtk file with the information of the staggered grid.
grid_key_dx is the key to access any element in the grid
Definition: grid_key.hpp:18
Position of the element of dimension d in the hyper-cube of dimension dim.
Definition: comb.hpp:34
this class is a functor for "for_each" algorithm
Ghost< dim, St > ghost
Ghost expansion.
T value_type
Properties for each grid point.
staggered_grid_dist(const size_t(&g_sz)[dim], const Box< dim, St > &domain, const Ghost< dim, St > &ghost)
Constructor.
openfpm::vector< comb< dim > > c_prp[T::max_prop_real]
position of the properties in the grid cell
Class that contain Padding information on each direction positive and Negative direction.
Definition: Ghost.hpp:117
It create separated grid for each properties to write them into a file.
size_t size()
Stub size.
Definition: map_vector.hpp:70
grid_dist_iterator_sub< dim, device_grid > getSubDomainIterator(const grid_key_dx< dim > &start, const grid_key_dx< dim > &stop) const
It return an iterator that span the grid domain only in the specified part.
this class is a functor for "for_each" algorithm
static const unsigned int dims
Number of dimensions.
This class define the domain decomposition interface.
bool is_staggered()
Return if the grid is staggered.
It model an expression expr1 * expr2.
Definition: mul.hpp:119
This is a distributed grid.
Implementation of the staggered grid.
this class is a functor for "for_each" algorithm
Box< dim, St > domain
Domain.
void setStagPosition(openfpm::vector< comb< dim >> &cmb)
set the staggered positions of the properties
bool to_normal(Grid_dst &g_dst, const Padding< dim > &pd, const long int(&start)[dim], const long int(&stop)[dim])
Copy the staggered grid into a normal one.
bool is_staggered_prop(size_t prp)
Return if the properties is a staggered property or not.
Classes to get the number of components of the properties.
staggered_grid_dist(const grid_dist_id< dim, St, H, typename Decomposition::base_type, Memory, grid_cpu< dim, H >> &g, const Ghost< dim, long int > &gh, Box< dim, size_t > ext)
This constructor is special, it construct an expanded grid that perfectly overlap with the previous...
Implementation of 1-D std::vector like structure.
Definition: map_vector.hpp:61
Vcluster & getVC()
Get the Virtual Cluster machine.