quadgrid 0.1
simple cartesian quad grid with particles for c++/octave
Loading...
Searching...
No Matches
particles.h
Go to the documentation of this file.
1#ifndef PARTICLES_H
2#define PARTICLES_H
3
4#include <algorithm>
5#include <functional>
6#include <iomanip>
7#include <iostream>
8#include <json.hpp>
9#include <map>
10#include <quadgrid_cpp.h>
11#include <string>
12
13
15
27
28struct
30
33
35 std::vector<double> x;
36 std::vector<double> y;
37
39 std::map<std::string, std::vector<idx_t>> iprops;
40
42 std::map<std::string, std::vector<double>> dprops;
43
44 std::vector<double> M;
45 std::map<idx_t, std::vector<idx_t>> grd_to_ptcl;
46 std::vector<idx_t> ptcl_to_grd;
47 std::vector<idx_t> ptcl_grd_color;
49
51 enum class
53 csv = 0,
56
59
60 json = 2
62 };
63
65 enum class
67 red = 0,
68 green = 1,
69 blue = 2,
70 black = 3,
72 };
73
74
78
80 double
81 default_x_generator ();
82
86
88 double
89 default_y_generator ();
90
92
95 template<output_format fmt>
96 void
97 print (std::ostream & os) const {
98 os << "output format not implementd" << std::endl;
99 }
100
102
106 particles_t (idx_t n, const quadgrid_t<std::vector<double>>& grid_)
107 : num_particles(n), grid(grid_) { }
108
110
113 particles_t (const nlohmann::json &j,
114 const quadgrid_t<std::vector<double>>& grid_)
115 : grid(grid_)
116 {
117 j["dprops"].get_to<std::map<std::string, std::vector<double>>> (dprops);
118 j["iprops"].get_to<std::map<std::string, std::vector<int>>> (iprops);
119 j["x"].get_to<std::vector<double>> (x);
120 j["y"].get_to<std::vector<double>> (y);
121 j["num_particles"].get_to<idx_t> (num_particles);
122 }
123
125
132 particles_t (idx_t n, const std::vector<std::string>& ipropnames,
133 const std::vector<std::string>& dpropnames,
134 const quadgrid_t<std::vector<double>>& grid_);
135
137
147 particles_t (idx_t n, const std::vector<std::string>& ipropnames,
148 const std::vector<std::string>& dpropnames,
149 const quadgrid_t<std::vector<double>>& grid_,
150 const std::vector<double> & xv,
151 const std::vector<double> & yv);
152
154
164 particles_t (idx_t n, const std::vector<std::string>& ipropnames,
165 const std::vector<std::string>& dpropnames,
166 const quadgrid_t<std::vector<double>>& grid_,
167 std::function<double ()> xgen,
168 std::function<double ()> ygen);
169
171
177 void
178 init_props (const std::vector<std::string>& ipropnames,
179 const std::vector<std::string>& dpropnames);
180
182
187 void
188 remove_in_region (std::function<bool (double, double)> fun) {
189 std::vector<idx_t> vin{};
190 for (idx_t i = 0; i < num_particles; ++i) {
191 if (fun (x[i], y[i])) {
192 vin.push_back (i);
193 }
194 }
195
196 for (auto &dprop : dprops) {
197 for (auto id = vin.rbegin (); id != vin.rend (); ++id) {
198 dprop.second.erase (dprop.second.begin () + (*id));
199 }
200 }
201
202 for (auto &iprop : iprops) {
203 for (auto id = vin.rbegin (); id != vin.rend (); ++id) {
204 iprop.second.erase (iprop.second.begin () + (*id));
205 }
206 }
207
208 for (auto id = vin.rbegin (); id != vin.rend (); ++id) {
209 x.erase (x.begin () + (*id));
210 y.erase (y.begin () + (*id));
212 }
213 };
214
216
219 void
220 init_particle_mesh ();
221
223 // `grd_to_ptcl`, if not needed.
224 void
225 update_ptcl_to_grd ();
226
228
229 void
231
233 void
234 reorder (std::vector<idx_t> &);
235
237
240 void
241 init_particle_positions (std::function<double ()> xgentr,
242 std::function<double ()> ygentr);
243
245
248 void
249 build_mass ();
250
252 double &
253 dp (const std::string & name, idx_t ii) {
254 return dprops.at (name) [ii];
255 }
256
258 const double &
259 dp (const std::string & name, idx_t ii) const {
260 return dprops.at (name) [ii];
261 }
262
264 idx_t &
265 ip (const std::string & name, idx_t ii) {
266 return iprops.at (name) [ii];
267 }
268
270 const idx_t &
271 ip (const std::string & name, idx_t ii) const {
272 return iprops.at (name) [ii];
273 }
274
275 static
276 const std::string &
277 getkey(std::map<std::string, std::vector<double>> const &varnames,
278 std::size_t ivar) {
279 return std::next (varnames.begin (), ivar)->first;
280 };
281
282 static
283 const std::string &
284 getkey(std::vector<std::string> const &varnames,
285 std::size_t ivar) {
286 return varnames[ivar];
287 };
288
289 static
290 const char*
291 getkey(std::initializer_list<const char *> const &varnames,
292 std::size_t ivar) {
293 return *(std::next (varnames.begin (), ivar));
294 };
295
297
301 void
302 p2g (std::map<std::string, std::vector<double>> & vars,
303 bool apply_mass = false) const {
304 p2g (vars, vars, vars, apply_mass);
305 }
306
308
313 template<typename GT, typename PT>
314 void
315 p2g (std::map<std::string, std::vector<double>> & vars,
316 PT const & pvarnames,
317 GT const & gvarnames,
318 bool apply_mass = false) const;
319
320 template<typename str>
321 void
322 p2g (std::map<std::string, std::vector<double>> & vars,
323 std::initializer_list<str> const & pvarnames,
324 std::initializer_list<str> const & gvarnames,
325 bool apply_mass = false) const;
326
327 template<typename GT, typename PT>
328 void
329 p2gd (std::map<std::string, std::vector<double>> & vars,
330 PT const & pxvarnames,
331 PT const & pyvarnames,
332 std::string const &area,
333 GT const & gvarnames,
334 bool apply_mass = false) const;
335
336 template<typename str>
337 void
338 p2gd (std::map<std::string, std::vector<double>> & vars,
339 std::initializer_list<str> const & pxvarnames,
340 std::initializer_list<str> const & pyvarnames,
341 std::string const & area,
342 std::initializer_list<str> const & gvarnames,
343 bool apply_mass = false) const;
344
345 void
346 g2p (const std::map<std::string, std::vector<double>>& vars,
347 bool apply_mass = false) {
348 g2p (vars, vars, vars, apply_mass);
349 }
350
351 template<typename str>
352 void
353 g2p (const std::map<std::string, std::vector<double>>& vars,
354 std::initializer_list<str> const & gvarnames,
355 std::initializer_list<str> const & pvarnames,
356 bool apply_mass = false);
357
358 template<typename GT, typename PT>
359 void
360 g2p (const std::map<std::string, std::vector<double>>& vars,
361 GT const & gvarnames,
362 PT const & pvarnames,
363 bool apply_mass = false);
364
365 template<typename GT, typename PT>
366 void
367 g2pd (const std::map<std::string, std::vector<double>>& vars,
368 GT const & gvarnames,
369 PT const & pxvarnames,
370 PT const & pyvarnames,
371 bool apply_mass = false);
372
373 template<typename str>
374 void
375 g2pd (const std::map<std::string, std::vector<double>>& vars,
376 std::initializer_list<str> const & gvarnames,
377 std::initializer_list<str> const &pxvarnames,
378 std::initializer_list<str> const & pyvarnames,
379 bool apply_mass = false);
380
381};
382
385void
386to_json (nlohmann::json &j, const particles_t &p);
387
390template<typename P2G_t, typename COORD_t>
391class
393
396 const COORD_t x;
397 const COORD_t y;
398 const double hx;
399 const double hy;
401
402public :
403 ptcl_to_grd_update_t (P2G_t ptcl_to_grd_,
404 const COORD_t x_, const COORD_t y_,
405 double hx_, double hy_, const idx_t nrows_)
406 : ptcl_to_grd(ptcl_to_grd_), x(x_), y(y_), hx(hx_), hy(hy_), nrows(nrows_) { }
407
408 void operator() (particles_t::idx_t ii) {
409 ptcl_to_grd[ii] = quadgrid_t<COORD_t>::sub2gind (static_cast<idx_t> (std::floor (y[ii] / hy)),
410 static_cast<idx_t> (std::floor (x[ii] / hx)),
411 nrows);
412 }
413};
414
415
416#include "particles_imp.h"
417
418#endif /* PARTICLES_H */
const double hx
Definition particles.h:398
P2G_t ptcl_to_grd
Definition particles.h:395
const idx_t nrows
Definition particles.h:400
const double hy
Definition particles.h:399
particles_t::idx_t idx_t
Definition particles.h:394
const COORD_t x
Definition particles.h:396
ptcl_to_grd_update_t(P2G_t ptcl_to_grd_, const COORD_t x_, const COORD_t y_, double hx_, double hy_, const idx_t nrows_)
Definition particles.h:403
const COORD_t y
Definition particles.h:397
Definition quadgrid_cpp.h:24
static idx_t sub2gind(idx_t r, idx_t c, idx_t nr)
Definition quadgrid_cpp.h:198
void to_json(nlohmann::json &j, const particles_t &p)
Adaptor to allow implicit conversion from particles_t to json.
Definition particles.cpp:359
Class to represent particles embedded in a grid.
Definition particles.h:29
const idx_t & ip(const std::string &name, idx_t ii) const
shortcut for iprops.at (name) [ii]
Definition particles.h:271
idx_t & ip(const std::string &name, idx_t ii)
shortcut for iprops.at (name) [ii]
Definition particles.h:265
std::vector< idx_t > ptcl_grd_color
color of particle's cell.
Definition particles.h:47
std::map< idx_t, std::vector< idx_t > > grd_to_ptcl
grid->particles connectivity.
Definition particles.h:45
std::map< std::string, std::vector< idx_t > > iprops
integer type quantities associated with the particles.
Definition particles.h:39
particles_t(idx_t n, const quadgrid_t< std::vector< double > > &grid_)
Simplest form of constructor.
Definition particles.h:106
void mark_by_cell_color()
Mark particles by cell color.
double & dp(const std::string &name, idx_t ii)
shortcut for dprops.at (name) [ii]
Definition particles.h:253
idx_t num_particles
number of particles.
Definition particles.h:34
void g2p(const std::map< std::string, std::vector< double > > &vars, bool apply_mass=false)
Definition particles.h:346
quadgrid_t< std::vector< double > >::idx_t idx_t
datatype for indexing into vectors of properties
Definition particles.h:32
const quadgrid_t< std::vector< double > > & grid
refernce to a grid object.
Definition particles.h:48
cell_color
Enumeration of cell colors.
Definition particles.h:66
@ black
Definition particles.h:70
@ blue
Definition particles.h:69
@ all_colors
Definition particles.h:71
@ green
Definition particles.h:68
@ red
Definition particles.h:67
output_format
Enumeration of available output format.
Definition particles.h:52
@ json
Definition particles.h:60
@ csv
Definition particles.h:53
@ octave_ascii
Definition particles.h:57
static const char * getkey(std::initializer_list< const char * > const &varnames, std::size_t ivar)
Definition particles.h:291
static const std::string & getkey(std::map< std::string, std::vector< double > > const &varnames, std::size_t ivar)
Definition particles.h:277
void print(std::ostream &os) const
Template for export function.
Definition particles.h:97
std::map< std::string, std::vector< double > > dprops
double type quantities associated with the particles.
Definition particles.h:42
void remove_in_region(std::function< bool(double, double)> fun)
Erase particcles based on coordinates.
Definition particles.h:188
const double & dp(const std::string &name, idx_t ii) const
shortcut for dprops.at (name) [ii]
Definition particles.h:259
std::vector< idx_t > ptcl_to_grd
particles->grid connectivity.
Definition particles.h:46
std::vector< double > x
x coordinate of particle positions.
Definition particles.h:35
particles_t(const nlohmann::json &j, const quadgrid_t< std::vector< double > > &grid_)
Ctor to import data from json.
Definition particles.h:113
std::vector< double > y
y coordinate of particle positions.
Definition particles.h:36
void build_mass()
Construct a mass matrix.
Definition particles.cpp:249
static const std::string & getkey(std::vector< std::string > const &varnames, std::size_t ivar)
Definition particles.h:284
std::vector< double > M
Mass matrix to be used for transfers if required.
Definition particles.h:44
void reorder(std::vector< idx_t > &)
Reorder coordinates an properties according to the ordering vvector.
Definition particles.cpp:376
void p2g(std::map< std::string, std::vector< double > > &vars, bool apply_mass=false) const
Map particle variables to the grid.
Definition particles.h:302
void init_particle_positions(std::function< double()> xgentr, std::function< double()> ygentr)
Initialize particle positions with generator functions.
Definition particles.cpp:236