quadgrid 0.1
simple cartesian quad grid with particles for c++/octave
Loading...
Searching...
No Matches
quadgrid_cpp.h
Go to the documentation of this file.
1#ifndef QUADGRID_H
2#define QUADGRID_H
3
4#include <algorithm>
5#include <fstream>
6#include <iomanip>
7#include <json.hpp>
8#include <map>
9#ifdef USE_MPI_H
10#include <mpi.h>
11#else
12#define MPI_Comm int
13#define MPI_COMM_WORLD 1
14#define MPI_Initialized(x)
15#define MPI_Comm_size(x, y) { *y = 0; }
16#define MPI_Comm_rank(x, y) { *y = 0; }
17#endif
18#include <vector>
19
20
21template <class distributed_vector>
22class
24{
25
26public:
27
28 using idx_t = int;
29
30 class cell_t;
31
43
44 void
45 from_json (const nlohmann::json &j, grid_properties_t &q) {
46
47 j.at ("nx").get_to (q.numcols);
48 j.at ("ny").get_to (q.numrows);
49 j.at ("hx").get_to (q.hx);
50 j.at ("hy").get_to (q.hy);
51
52
53 q.start_cell_row = 0;
54 q.end_cell_row = q.numrows - 1;
55 q.start_cell_col = 0;
56 q.end_cell_col = q.numcols - 1;
57 q.start_owned_nodes = 0;
58 q.num_owned_nodes = (q.numrows+1)*(q.numcols+1);
59
60 }
61
62 static idx_t
63 gind2col (idx_t idx, idx_t numrows) {
64 return (idx / numrows);
65 }
66
67 static idx_t
68 gind2row (idx_t idx, idx_t numrows) {
69 return (idx % numrows);
70 }
71
72 static idx_t
73 gt (idx_t inode, idx_t cidx, idx_t ridx, idx_t numrows) {
74 idx_t bottom_left = 0;
75 // should check that inode < 4 in an efficient way
76 bottom_left = ridx + cidx * (numrows + 1);
77 switch (inode) {
78 case 0 :
79 return (bottom_left);
80 break;
81 case 1 :
82 return (bottom_left + 1);
83 break;
84 case 2 :
85 return (bottom_left + (numrows + 1));
86 break;
87 case 3 :
88 return (bottom_left + (numrows + 2));
89 break;
90 default :
91 return -1;
92 }
93 }
94
95
96 //-----------------------------------
97 //
98 // Numbering of nodes and edges :
99 //
100 // 1
101 // |
102 // V
103 // 1 -> O---------------O <- 3
104 // | |
105 // | |
106 // 2 -> | | <- 3
107 // | |
108 // | |
109 // 0 -> O---------------O <- 2
110 // ^
111 // |
112 // 0
113 //
114 //-----------------------------------
115
116 static double
117 p (idx_t idir, idx_t inode, idx_t colidx, idx_t rowidx, double hx, double hy) {
118 double bottom_left = 0.0;
119 // should check that inode < 4 in an efficient way
120 if (idir == 0) {
121 bottom_left = colidx * hx;
122 if (inode > 1)
123 bottom_left += hx;
124 } else {
125 bottom_left = rowidx * hy;
126 if (inode == 1 || inode == 3)
127 bottom_left += hy;
128 }
129 return (bottom_left);
130 }
131
132
133 static double
134 shp (double x, double y, idx_t inode,
135 idx_t c, idx_t r, double hx, double hy) {
136
137 switch (inode) {
138 case 3 :
139 return ((x - p(0,0,c,r,hx,hy))/hx * (y - p(1,0,c,r,hx,hy))/hy);
140 break;
141 case 2 :
142 return ((x - p(0,0,c,r,hx,hy))/hx * (1. - (y - p(1,0,c,r,hx,hy))/hy));
143 break;
144 case 1 :
145 return ((1. - (x - p(0,0,c,r,hx,hy))/hx) * (y - p(1,0,c,r,hx,hy))/hy);
146 break;
147 case 0 :
148 return ((1. - (x - p(0,0,c,r,hx,hy))/hx) * (1. - (y - p(1,0,c,r,hx,hy))/hy));
149 break;
150 default :
151 return 0;
152 }
153
154 }
155
156 static double
157 shg (double x, double y, idx_t idir, idx_t inode,
158 idx_t c, idx_t r, double hx, double hy) {
159 switch (inode) {
160 case 3 :
161 if (idir == 0) {
162 return ((1. / hx) * ((y - p(1,0,c,r,hx,hy)) / hy));
163 }
164 else if (idir == 1) {
165 return (((x - p(0,0,c,r,hx,hy)) / hx) * (1. / hy));
166 }
167 break;
168 case 2 :
169 if (idir == 0) {
170 return ((1. / hx) * ((1. - (y - p(1,0,c,r,hx,hy)) / hy)));
171 }
172 else if (idir == 1) {
173 return (((x - p(0,0,c,r,hx,hy)) / hx) * (- 1. / hy));
174 }
175 break;
176 case 1 :
177 if (idir == 0) {
178 return ((- 1. / hx) * ((y - p(1,0,c,r,hx,hy)) / hy));
179 }
180 else if (idir == 1) {
181 return ((1. - (x - p(0,0,c,r,hx,hy)) / hx) * (1. / hy));
182 }
183 break;
184 case 0 :
185 if (idir == 0) {
186 return ((- 1. / hx) * (1. - (y - p(1,0,c,r,hx,hy)) / hy));
187 }
188 else if (idir == 1) {
189 return ((1. - (x - p(0,0,c,r,hx,hy))/ hx) * (- 1. / hy));
190 }
191 break;
192 }
193 return 0.;
194 };
195
196
197 static idx_t
199 return (r + nr * c);
200 }
201
202
203 class
205 {
206
207 public:
208
209 cell_iterator (cell_t* _data = nullptr)
210 : data (_data) { };
211
212 void
213 operator++ ();
214
215 cell_t&
216 operator* ()
217 { return *(this->data); };
218
219 const cell_t&
220 operator* () const
221 { return *(this->data); };
222
223 cell_t*
224 operator-> ()
225 { return this->data; };
226
227 const cell_t*
228 operator-> () const
229 { return this->data; };
230
231 bool
232 operator== (const cell_iterator& other)
233 { return (data == other.data); }
234
235 bool
236 operator!= (const cell_iterator& other)
237 { return ! ((*this) == other); }
238
239
240 private :
242 };
243
244 class
246 {
247
248 public:
249
250 void
251 operator++ ();
252
253 neighbor_iterator (cell_t *_data = nullptr,
254 int _face_idx = -1)
255 : cell_iterator (_data), face_idx (_face_idx) { };
256
257 int
259 { return face_idx; };
260
261 private:
263
264 private :
266 };
267
268 class
269 cell_t
270 {
271
272 friend class cell_iterator;
273 friend class quadgrid_t;
274
275 public:
276
277 static constexpr idx_t nodes_per_cell = 4;
278 static constexpr idx_t edges_per_cell = 4;
279 static constexpr idx_t NOT_ON_BOUNDARY = -1;
280
282 : grid_properties (_gp), rowidx (0), colidx (0), is_ghost (false) { };
283
284 double
285 p (idx_t i, idx_t j) const;
286
287 double
289
290 idx_t
291 t (idx_t i) const;
292
293 idx_t
294 gt (idx_t i) const {
295 // should check that inode < 4 in an efficient way
296 switch (i) {
297 case 0 :
298 case 1 :
299 case 2 :
300 case 3 :
301 return quadgrid_t::gt (i, col_idx (), row_idx (), num_rows ());
302 break;
303 default :
304 return -1;
305 }
306 }
307
308 idx_t
309 e (idx_t i) const;
310
311 double
312 shp (double x, double y, idx_t inode) const;
313
314 double
315 shp_new (double x, double y, idx_t inode) const;
316
317 double
318 shg (double x, double y, idx_t idir, idx_t inode) const;
319
322
325
328 { return neighbor_iterator (); };
329
332 { return neighbor_iterator (); };
333
334 idx_t
336 { return local_cell_idx; };
337
338 idx_t
340 { return global_cell_idx; };
341
342 idx_t
344 { return grid_properties.end_cell_col; };
345
346 idx_t
348 { return grid_properties.end_cell_row; };
349
350 idx_t
352 { return grid_properties.start_cell_col; };
353
354 idx_t
356 { return grid_properties.start_cell_row; };
357
358 idx_t
359 num_rows () const
360 { return grid_properties.numrows; };
361
362 idx_t
363 num_cols () const
364 { return grid_properties.numcols; };
365
366 idx_t
367 row_idx () const
368 { return rowidx; };
369
370 idx_t
371 col_idx () const
372 { return colidx; };
373
374
375 idx_t
376 sub2gind (idx_t r, idx_t c) const {
377 return quadgrid_t::sub2gind (r, c, grid_properties.numrows);
378 }
379
380 idx_t
381 gind2row (idx_t idx) const {
382 return quadgrid_t:: gind2row (idx, grid_properties.numrows);
383 }
384
385 idx_t
386 gind2col (idx_t idx) const {
387 return quadgrid_t:: gind2col (idx, grid_properties.numrows);
388 }
389
390 void
391 reset () {
392 rowidx = grid_properties.start_cell_row;
393 colidx = grid_properties.start_cell_col;
396 sub2gind (grid_properties.start_cell_row,
397 grid_properties.start_cell_col);
398 };
399
400 private:
401
408
409 };
410
411
414 comm (_comm), rank (0), size (1),
417 {
418 int flag = 0;
419 MPI_Initialized (&flag);
420 if (flag) {
423 } else {
424 rank = 0;
425 size = 1;
426 }
427 grid_properties.numrows = 0;
428 grid_properties.numcols = 0;
429 grid_properties.hx = 0.;
430 grid_properties.hy = 0.;
431 grid_properties.start_cell_row = 0;
432 grid_properties.end_cell_row = 0;
433 grid_properties.start_cell_col = 0;
434 grid_properties.end_cell_col = 0;
435 grid_properties.start_owned_nodes = 0;
436 grid_properties.num_owned_nodes = 0;
437 };
438
440 quadgrid_t (const nlohmann::json &j, MPI_Comm _comm = MPI_COMM_WORLD) :
441 quadgrid_t(_comm) { from_json (j, grid_properties); };
442
444 quadgrid_t (const quadgrid_t &) = delete;
445
447 quadgrid_t &
448 operator= (const quadgrid_t &) = delete;
449
451 ~quadgrid_t () = default;
452
453 void
454 set_sizes (idx_t numrows, idx_t numcols,
455 double hx, double hy);
456
457 void
458 vtk_export (const char *filename,
459 const std::map<std::string,
460 distributed_vector> & f) const;
461
462 void
463 octave_ascii_export (const char *filename,
464 const std::map<std::string,
465 distributed_vector> & f) const;
466
467 cell_iterator
469
470 const cell_iterator
472
473 cell_iterator
475 { return cell_iterator (); };
476
477 const cell_iterator
479 { return cell_iterator (); };
480
481 idx_t
483 { return grid_properties.num_owned_nodes; };
484
485 idx_t
487
488 idx_t
490
491 idx_t
493
494 idx_t
496
497 idx_t
498 num_rows () const
499 { return grid_properties.numrows; };
500
501 idx_t
502 num_cols () const
503 { return grid_properties.numcols; };
504
505 double
506 hx () const
507 { return grid_properties.hx; };
508
509 double
510 hy () const
511 { return grid_properties.hy; };
512
513 idx_t
514 sub2gind (idx_t r, idx_t c) const {
515 return (r + grid_properties.numrows * c);
516 }
517
518 idx_t
519 gind2row (idx_t idx) const {
520 return quadgrid_t:: gind2row (idx, grid_properties.numrows);
521 }
522
523 idx_t
524 gind2col (idx_t idx) const {
525 return quadgrid_t:: gind2col (idx, grid_properties.numrows);
526 }
527
528 const cell_t&
529 operator[] (idx_t tmp) const;
530
532 int rank;
533 int size;
534
535private :
536
537 mutable cell_t current_cell;
538 mutable cell_t current_neighbor;
539
540 grid_properties_t grid_properties;
541
542};
543
544
545
546#include "quadgrid_cpp_imp.h"
547
548#endif /* QUADGRID_H */
549
cell_t * data
Definition quadgrid_cpp.h:241
cell_iterator(cell_t *_data=nullptr)
Definition quadgrid_cpp.h:209
Definition quadgrid_cpp.h:270
idx_t start_cell_row() const
Definition quadgrid_cpp.h:355
idx_t end_cell_col() const
Definition quadgrid_cpp.h:343
idx_t sub2gind(idx_t r, idx_t c) const
Definition quadgrid_cpp.h:376
static constexpr idx_t NOT_ON_BOUNDARY
Definition quadgrid_cpp.h:279
idx_t global_cell_idx
Definition quadgrid_cpp.h:406
idx_t row_idx() const
Definition quadgrid_cpp.h:367
idx_t num_rows() const
Definition quadgrid_cpp.h:359
idx_t rowidx
Definition quadgrid_cpp.h:403
static constexpr idx_t edges_per_cell
Definition quadgrid_cpp.h:278
idx_t colidx
Definition quadgrid_cpp.h:404
const neighbor_iterator begin_neighbor_sweep() const
const neighbor_iterator end_neighbor_sweep() const
Definition quadgrid_cpp.h:331
cell_t(const grid_properties_t &_gp)
Definition quadgrid_cpp.h:281
idx_t local_cell_idx
Definition quadgrid_cpp.h:405
idx_t end_cell_row() const
Definition quadgrid_cpp.h:347
void reset()
Definition quadgrid_cpp.h:391
idx_t get_global_cell_idx() const
Definition quadgrid_cpp.h:339
bool is_ghost
Definition quadgrid_cpp.h:402
const grid_properties_t & grid_properties
Definition quadgrid_cpp.h:407
idx_t col_idx() const
Definition quadgrid_cpp.h:371
idx_t gt(idx_t i) const
Definition quadgrid_cpp.h:294
neighbor_iterator end_neighbor_sweep()
Definition quadgrid_cpp.h:327
idx_t gind2col(idx_t idx) const
Definition quadgrid_cpp.h:386
idx_t get_local_cell_idx() const
Definition quadgrid_cpp.h:335
friend class cell_iterator
Definition quadgrid_cpp.h:272
idx_t gind2row(idx_t idx) const
Definition quadgrid_cpp.h:381
double centroid(idx_t i)
friend class quadgrid_t
Definition quadgrid_cpp.h:273
static constexpr idx_t nodes_per_cell
Definition quadgrid_cpp.h:277
idx_t t(idx_t i) const
Definition quadgrid_cpp_imp.h:167
neighbor_iterator begin_neighbor_sweep()
idx_t num_cols() const
Definition quadgrid_cpp.h:363
double shp_new(double x, double y, idx_t inode) const
idx_t start_cell_col() const
Definition quadgrid_cpp.h:351
Definition quadgrid_cpp.h:246
neighbor_iterator(cell_t *_data=nullptr, int _face_idx=-1)
Definition quadgrid_cpp.h:253
cell_t * data
Face index in 0...3 (-1 if not defined).
Definition quadgrid_cpp.h:265
idx_t face_idx
Definition quadgrid_cpp.h:262
int get_face_idx()
Definition quadgrid_cpp.h:258
static double shp(double x, double y, idx_t inode, idx_t c, idx_t r, double hx, double hy)
Definition quadgrid_cpp.h:134
const cell_t & operator[](idx_t tmp) const
Definition quadgrid_cpp_imp.h:60
idx_t sub2gind(idx_t r, idx_t c) const
Definition quadgrid_cpp.h:514
idx_t gind2row(idx_t idx) const
Definition quadgrid_cpp.h:519
idx_t num_local_cells() const
Definition quadgrid_cpp_imp.h:136
cell_t current_cell
Definition quadgrid_cpp.h:537
static double shg(double x, double y, idx_t idir, idx_t inode, idx_t c, idx_t r, double hx, double hy)
Definition quadgrid_cpp.h:157
static idx_t gt(idx_t inode, idx_t cidx, idx_t ridx, idx_t numrows)
Definition quadgrid_cpp.h:73
idx_t num_owned_nodes()
Definition quadgrid_cpp.h:482
static idx_t gind2col(idx_t idx, idx_t numrows)
Definition quadgrid_cpp.h:63
idx_t num_cols() const
Definition quadgrid_cpp.h:502
static double p(idx_t idir, idx_t inode, idx_t colidx, idx_t rowidx, double hx, double hy)
Definition quadgrid_cpp.h:117
double hy() const
Definition quadgrid_cpp.h:510
static idx_t sub2gind(idx_t r, idx_t c, idx_t nr)
Definition quadgrid_cpp.h:198
void vtk_export(const char *filename, const std::map< std::string, distributed_vector > &f) const
Definition quadgrid_cpp_imp.h:345
void set_sizes(idx_t numrows, idx_t numcols, double hx, double hy)
Definition quadgrid_cpp_imp.h:22
double hx() const
Definition quadgrid_cpp.h:506
quadgrid_t & operator=(const quadgrid_t &)=delete
Delete assignment operator.
quadgrid_t(const quadgrid_t &)=delete
Delete copy constructor.
idx_t num_local_nodes() const
Definition quadgrid_cpp_imp.h:160
idx_t num_global_nodes() const
Definition quadgrid_cpp_imp.h:154
const cell_iterator begin_cell_sweep() const
Definition quadgrid_cpp_imp.h:13
MPI_Comm comm
Definition quadgrid_cpp.h:531
idx_t num_rows() const
Definition quadgrid_cpp.h:498
int idx_t
Definition quadgrid_cpp.h:28
int size
Definition quadgrid_cpp.h:533
cell_t current_neighbor
Definition quadgrid_cpp.h:538
cell_iterator begin_cell_sweep()
Definition quadgrid_cpp_imp.h:4
void octave_ascii_export(const char *filename, const std::map< std::string, distributed_vector > &f) const
Definition quadgrid_cpp_imp.h:396
void from_json(const nlohmann::json &j, grid_properties_t &q)
Definition quadgrid_cpp.h:45
quadgrid_t(const nlohmann::json &j, MPI_Comm _comm=MPI_COMM_WORLD)
Ctor that reads grid properties from a json object.
Definition quadgrid_cpp.h:440
const cell_iterator end_cell_sweep() const
Definition quadgrid_cpp.h:478
static idx_t gind2row(idx_t idx, idx_t numrows)
Definition quadgrid_cpp.h:68
grid_properties_t grid_properties
Definition quadgrid_cpp.h:540
quadgrid_t(MPI_Comm _comm=MPI_COMM_WORLD)
Default constructor, set all pointers to nullptr.
Definition quadgrid_cpp.h:413
cell_iterator end_cell_sweep()
Definition quadgrid_cpp.h:474
int rank
Definition quadgrid_cpp.h:532
~quadgrid_t()=default
Destructor.
idx_t gind2col(idx_t idx) const
Definition quadgrid_cpp.h:524
idx_t num_global_cells() const
Definition quadgrid_cpp_imp.h:145
x
Definition make_input_json.m:5
y
Definition make_input_json.m:6
#define MPI_COMM_WORLD
Definition quadgrid_cpp.h:13
#define MPI_Comm_size(x, y)
Definition quadgrid_cpp.h:15
#define MPI_Initialized(x)
Definition quadgrid_cpp.h:14
#define MPI_Comm
Definition quadgrid_cpp.h:12
#define MPI_Comm_rank(x, y)
Definition quadgrid_cpp.h:16
Definition quadgrid_cpp.h:32
idx_t start_cell_row
Definition quadgrid_cpp.h:36
double hy
Definition quadgrid_cpp.h:35
idx_t end_cell_row
Definition quadgrid_cpp.h:37
idx_t end_cell_col
Definition quadgrid_cpp.h:39
double hx
Definition quadgrid_cpp.h:35
idx_t start_cell_col
Definition quadgrid_cpp.h:38
idx_t numcols
Definition quadgrid_cpp.h:34
idx_t numrows
Definition quadgrid_cpp.h:33
idx_t num_owned_nodes
Definition quadgrid_cpp.h:41
idx_t start_owned_nodes
Definition quadgrid_cpp.h:40