quadgrid 0.1
simple cartesian quad grid with particles for c++/octave
Loading...
Searching...
No Matches
quadgrid_t< distributed_vector > Class Template Reference

#include <quadgrid_cpp.h>

Classes

struct  grid_properties_t
class  cell_iterator
class  neighbor_iterator
class  cell_t

Public Types

using idx_t = int

Public Member Functions

void from_json (const nlohmann::json &j, grid_properties_t &q)
 quadgrid_t (MPI_Comm _comm=MPI_COMM_WORLD)
 Default constructor, set all pointers to nullptr.
 quadgrid_t (const nlohmann::json &j, MPI_Comm _comm=MPI_COMM_WORLD)
 Ctor that reads grid properties from a json object.
 quadgrid_t (const quadgrid_t &)=delete
 Delete copy constructor.
quadgrid_t & operator= (const quadgrid_t &)=delete
 Delete assignment operator.
 ~quadgrid_t ()=default
 Destructor.
void set_sizes (idx_t numrows, idx_t numcols, real_t hx, real_t hy)
void vtk_export (const char *filename, const std::map< std::string, distributed_vector > &f) const
void octave_ascii_export (const char *filename, const std::map< std::string, distributed_vector > &f) const
cell_iterator begin_cell_sweep ()
const cell_iterator begin_cell_sweep () const
cell_iterator end_cell_sweep ()
const cell_iterator end_cell_sweep () const
idx_t num_owned_nodes ()
idx_t num_local_nodes () const
idx_t num_global_nodes () const
idx_t num_local_cells () const
idx_t num_global_cells () const
idx_t num_rows () const
idx_t num_cols () const
real_t hx () const
real_t hy () const
idx_t sub2gind (idx_t r, idx_t c) const
idx_t gind2row (idx_t idx) const
idx_t gind2col (idx_t idx) const
const cell_t & operator[] (idx_t tmp) const

Static Public Member Functions

HOST static DEVICE idx_t gind2col (idx_t idx, idx_t numrows)
HOST static DEVICE idx_t gind2row (idx_t idx, idx_t numrows)
HOST static DEVICE idx_t gt (idx_t inode, idx_t cidx, idx_t ridx, idx_t numrows)
HOST static DEVICE real_t p (idx_t idir, idx_t inode, idx_t colidx, idx_t rowidx, real_t hx, real_t hy)
HOST static DEVICE real_t shp (real_t x, real_t y, idx_t inode, idx_t c, idx_t r, real_t hx, real_t hy)
HOST static DEVICE real_t shg (real_t x, real_t y, idx_t idir, idx_t inode, idx_t c, idx_t r, real_t hx, real_t hy)
HOST static DEVICE idx_t sub2gind (idx_t r, idx_t c, idx_t nr)

Public Attributes

MPI_Comm comm
int rank
int size

Private Attributes

cell_t current_cell
cell_t current_neighbor
grid_properties_t grid_properties

Detailed Description

template<class distributed_vector>
class quadgrid_t< distributed_vector >

Definition at line 13 of file quadgrid_cpp.h.

Member Typedef Documentation

◆ idx_t

template<class distributed_vector>
using quadgrid_t< distributed_vector >::idx_t = int

Definition at line 19 of file quadgrid_cpp.h.

Constructor & Destructor Documentation

◆ quadgrid_t() [1/3]

template<class distributed_vector>
quadgrid_t< distributed_vector >::quadgrid_t ( MPI_Comm _comm = MPI_COMM_WORLD)
inline

Default constructor, set all pointers to nullptr.

Definition at line 408 of file quadgrid_cpp.h.

408 :
409 comm (_comm), rank (0), size (1),
412 {
413 int flag = 0;
415 if (flag) {
418 } else {
419 rank = 0;
420 size = 1;
421 }
422 grid_properties.numrows = 0;
423 grid_properties.numcols = 0;
424 grid_properties.hx = 0.;
425 grid_properties.hy = 0.;
426 grid_properties.start_cell_row = 0;
427 grid_properties.end_cell_row = 0;
428 grid_properties.start_cell_col = 0;
429 grid_properties.end_cell_col = 0;
430 grid_properties.start_owned_nodes = 0;
431 grid_properties.num_owned_nodes = 0;
432 };
cell_t current_cell
MPI_Comm comm
cell_t current_neighbor
grid_properties_t grid_properties

◆ quadgrid_t() [2/3]

template<class distributed_vector>
quadgrid_t< distributed_vector >::quadgrid_t ( const nlohmann::json & j,
MPI_Comm _comm = MPI_COMM_WORLD )
inline

Ctor that reads grid properties from a json object.

Definition at line 435 of file quadgrid_cpp.h.

435 :
void from_json(const nlohmann::json &j, grid_properties_t &q)
quadgrid_t(MPI_Comm _comm=MPI_COMM_WORLD)
Default constructor, set all pointers to nullptr.

◆ quadgrid_t() [3/3]

template<class distributed_vector>
quadgrid_t< distributed_vector >::quadgrid_t ( const quadgrid_t< distributed_vector > & )
delete

Delete copy constructor.

◆ ~quadgrid_t()

template<class distributed_vector>
quadgrid_t< distributed_vector >::~quadgrid_t ( )
default

Destructor.

Member Function Documentation

◆ begin_cell_sweep() [1/2]

template<class T>
quadgrid_t< T >::cell_iterator quadgrid_t< T >::begin_cell_sweep ( )

Definition at line 4 of file quadgrid_cpp_imp.h.

4 {
5 current_cell.reset ();
7}
cell_iterator(cell_t *_data=nullptr)

◆ begin_cell_sweep() [2/2]

template<class T>
const quadgrid_t< T >::cell_iterator quadgrid_t< T >::begin_cell_sweep ( ) const

Definition at line 13 of file quadgrid_cpp_imp.h.

13 {
14 current_cell.reset ();
16}

◆ end_cell_sweep() [1/2]

template<class distributed_vector>
cell_iterator quadgrid_t< distributed_vector >::end_cell_sweep ( )
inline

Definition at line 469 of file quadgrid_cpp.h.

470 { return cell_iterator (); };

◆ end_cell_sweep() [2/2]

template<class distributed_vector>
const cell_iterator quadgrid_t< distributed_vector >::end_cell_sweep ( ) const
inline

Definition at line 473 of file quadgrid_cpp.h.

474 { return cell_iterator (); };

◆ from_json()

template<class distributed_vector>
void quadgrid_t< distributed_vector >::from_json ( const nlohmann::json & j,
grid_properties_t & q )
inline

Definition at line 36 of file quadgrid_cpp.h.

36 {
37
38 j.at ("nx").get_to (q.numcols);
39 j.at ("ny").get_to (q.numrows);
40 j.at ("hx").get_to (q.hx);
41 j.at ("hy").get_to (q.hy);
42
43
44 q.start_cell_row = 0;
45 q.end_cell_row = q.numrows - 1;
46 q.start_cell_col = 0;
47 q.end_cell_col = q.numcols - 1;
48 q.start_owned_nodes = 0;
49 q.num_owned_nodes = (q.numrows+1)*(q.numcols+1);
50
51 }
real_t hy() const
idx_t num_owned_nodes()
real_t hx() const

◆ gind2col() [1/2]

template<class distributed_vector>
idx_t quadgrid_t< distributed_vector >::gind2col ( idx_t idx) const
inline

Definition at line 519 of file quadgrid_cpp.h.

519 {
520 return quadgrid_t:: gind2col (idx, grid_properties.numrows);
521 }
HOST static DEVICE idx_t gind2col(idx_t idx, idx_t numrows)

◆ gind2col() [2/2]

template<class distributed_vector>
HOST static DEVICE idx_t quadgrid_t< distributed_vector >::gind2col ( idx_t idx,
idx_t numrows )
inlinestatic

Definition at line 55 of file quadgrid_cpp.h.

55 {
56 return (idx / numrows);
57 }

◆ gind2row() [1/2]

template<class distributed_vector>
idx_t quadgrid_t< distributed_vector >::gind2row ( idx_t idx) const
inline

Definition at line 514 of file quadgrid_cpp.h.

514 {
515 return quadgrid_t:: gind2row (idx, grid_properties.numrows);
516 }
HOST static DEVICE idx_t gind2row(idx_t idx, idx_t numrows)

◆ gind2row() [2/2]

template<class distributed_vector>
HOST static DEVICE idx_t quadgrid_t< distributed_vector >::gind2row ( idx_t idx,
idx_t numrows )
inlinestatic

Definition at line 61 of file quadgrid_cpp.h.

61 {
62 return (idx % numrows);
63 }

◆ gt()

template<class distributed_vector>
HOST static DEVICE idx_t quadgrid_t< distributed_vector >::gt ( idx_t inode,
idx_t cidx,
idx_t ridx,
idx_t numrows )
inlinestatic

Definition at line 67 of file quadgrid_cpp.h.

67 {
69 // should check that inode < 4 in an efficient way
70 bottom_left = ridx + cidx * (numrows + 1);
71 switch (inode) {
72 case 0 :
73 return (bottom_left);
74 break;
75 case 1 :
76 return (bottom_left + 1);
77 break;
78 case 2 :
79 return (bottom_left + (numrows + 1));
80 break;
81 case 3 :
82 return (bottom_left + (numrows + 2));
83 break;
84 default :
85 return -1;
86 }
87 }

◆ hx()

template<class distributed_vector>
real_t quadgrid_t< distributed_vector >::hx ( ) const
inline

Definition at line 501 of file quadgrid_cpp.h.

502 { return grid_properties.hx; };

◆ hy()

template<class distributed_vector>
real_t quadgrid_t< distributed_vector >::hy ( ) const
inline

Definition at line 505 of file quadgrid_cpp.h.

506 { return grid_properties.hy; };

◆ num_cols()

template<class distributed_vector>
idx_t quadgrid_t< distributed_vector >::num_cols ( ) const
inline

Definition at line 497 of file quadgrid_cpp.h.

498 { return grid_properties.numcols; };

◆ num_global_cells()

template<class T>
quadgrid_t< T >::idx_t quadgrid_t< T >::num_global_cells ( ) const

Definition at line 145 of file quadgrid_cpp_imp.h.

145 {
146 return grid_properties.numrows*grid_properties.numcols;
147}

◆ num_global_nodes()

template<class T>
quadgrid_t< T >::idx_t quadgrid_t< T >::num_global_nodes ( ) const

Definition at line 154 of file quadgrid_cpp_imp.h.

154 {
155 return (grid_properties.numrows+1)*(grid_properties.numcols+1);
156}

◆ num_local_cells()

template<class T>
quadgrid_t< T >::idx_t quadgrid_t< T >::num_local_cells ( ) const

Definition at line 136 of file quadgrid_cpp_imp.h.

136 {
137 return grid_properties.numrows*grid_properties.numcols;
138}

◆ num_local_nodes()

template<class T>
quadgrid_t< T >::idx_t quadgrid_t< T >::num_local_nodes ( ) const

Definition at line 160 of file quadgrid_cpp_imp.h.

160 {
161 return (grid_properties.numrows+1)*(grid_properties.numcols+1);
162}

◆ num_owned_nodes()

template<class distributed_vector>
idx_t quadgrid_t< distributed_vector >::num_owned_nodes ( )
inline

Definition at line 477 of file quadgrid_cpp.h.

478 { return grid_properties.num_owned_nodes; };

◆ num_rows()

template<class distributed_vector>
idx_t quadgrid_t< distributed_vector >::num_rows ( ) const
inline

Definition at line 493 of file quadgrid_cpp.h.

494 { return grid_properties.numrows; };

◆ octave_ascii_export()

template<class distributed_vector>
void quadgrid_t< T >::octave_ascii_export ( const char * filename,
const std::map< std::string, distributed_vector > & f ) const

Definition at line 395 of file quadgrid_cpp_imp.h.

397 {
398
400
401 os << "# name: p" << std::endl
402 << "# type: matrix" << std::endl
403 << "# rows: 2" << std::endl
404 << "# columns: " << num_owned_nodes () << std::endl;
405
406 for (idx_t jj = 0; jj < num_cols () + 1; ++jj) {
407 for (idx_t ii = 0; ii < num_rows () + 1; ++ii) {
408 os << std::setprecision(16) << jj*hx() << " ";
409 }
410 }
411 os << std::endl;
412
413 for (idx_t jj = 0; jj < num_cols () + 1; ++jj) {
414 for (idx_t ii = 0; ii < num_rows () + 1; ++ii) {
415 os << std::setprecision(16) << ii*hy() << " ";
416 }
417 }
418 os << std::endl;
419
420 os << "# name: t" << std::endl
421 << "# type: matrix" << std::endl
422 << "# rows: 4" << std::endl
423 << "# columns: " << num_local_cells () << std::endl;
424 for (auto inode = 0;
426 ++inode) {
427 for (auto icell = begin_cell_sweep ();
428 icell != end_cell_sweep (); ++icell) {
429 os << std::setprecision(16) << icell->gt(inode) << " ";
430 }
431 os << std::endl;
432 }
433
434
435 os << "# name: vars" << std::endl
436 << "# type: scalar struct" << std::endl
437 << "# ndims: 2" << std::endl
438 << "1 1" << std::endl
439 << "# length: " << vars.size () << std::endl;
440
441
442 for (auto const & ii : vars) {
443 os << "# name: " << ii.first << std::endl
444 << "# type: matrix" << std::endl
445 << "# rows: 1" << std::endl
446 << "# columns: " << ii.second.size () << std::endl;
447 for (auto const & kk : ii.second) {
448 os << std::setprecision(16) << kk << " ";
449 }
450 os << std::endl;
451 }
452 os << std::endl;
453
454 os.close ();
455}
static constexpr idx_t nodes_per_cell
idx_t num_local_cells() const
idx_t num_cols() const
idx_t num_rows() const
HOST static DEVICE idx_t gt(idx_t inode, idx_t cidx, idx_t ridx, idx_t numrows)
cell_iterator begin_cell_sweep()
cell_iterator end_cell_sweep()

◆ operator=()

template<class distributed_vector>
quadgrid_t & quadgrid_t< distributed_vector >::operator= ( const quadgrid_t< distributed_vector > & )
delete

Delete assignment operator.

◆ operator[]()

template<class T>
const quadgrid_t< T >::cell_t & quadgrid_t< T >::operator[] ( idx_t tmp) const

Definition at line 60 of file quadgrid_cpp_imp.h.

60 {
61 assert (tmp <= (current_cell.end_cell_row () +
62 current_cell.num_rows () * current_cell.end_cell_col ()));
65 current_cell.global_cell_idx = tmp;
66 current_cell.local_cell_idx = tmp -
67 (current_cell.start_cell_row () +
68 current_cell.num_rows () * current_cell.start_cell_col ());
69 return current_cell;
70};

◆ p()

template<class distributed_vector>
HOST static DEVICE real_t quadgrid_t< distributed_vector >::p ( idx_t idir,
idx_t inode,
idx_t colidx,
idx_t rowidx,
real_t hx,
real_t hy )
inlinestatic

Definition at line 111 of file quadgrid_cpp.h.

111 {
112 real_t bottom_left = 0.0;
113 // should check that inode < 4 in an efficient way
114 if (idir == 0) {
116 if (inode > 1)
117 bottom_left += hx;
118 } else {
120 if (inode == 1 || inode == 3)
121 bottom_left += hy;
122 }
123 return (bottom_left);
124 }

◆ set_sizes()

template<class T>
void quadgrid_t< T >::set_sizes ( idx_t numrows,
idx_t numcols,
real_t hx,
real_t hy )

Definition at line 22 of file quadgrid_cpp_imp.h.

23 {
24 grid_properties.numrows = numrows;
25 grid_properties.numcols = numcols;
28 grid_properties.start_cell_row = 0;
29 grid_properties.end_cell_row = numrows - 1;
30 grid_properties.start_cell_col = 0;
31 grid_properties.end_cell_col = numcols - 1;
32 grid_properties.start_owned_nodes = 0;
34}

◆ shg()

template<class distributed_vector>
HOST static DEVICE real_t quadgrid_t< distributed_vector >::shg ( real_t x,
real_t y,
idx_t idir,
idx_t inode,
idx_t c,
idx_t r,
real_t hx,
real_t hy )
inlinestatic

Definition at line 152 of file quadgrid_cpp.h.

153 {
154 switch (inode) {
155 case 3 :
156 if (idir == 0) {
157 return ((1. / hx) * ((y - p(1,0,c,r,hx,hy)) / hy));
158 }
159 else if (idir == 1) {
160 return (((x - p(0,0,c,r,hx,hy)) / hx) * (1. / hy));
161 }
162 break;
163 case 2 :
164 if (idir == 0) {
165 return ((1. / hx) * ((1. - (y - p(1,0,c,r,hx,hy)) / hy)));
166 }
167 else if (idir == 1) {
168 return (((x - p(0,0,c,r,hx,hy)) / hx) * (- 1. / hy));
169 }
170 break;
171 case 1 :
172 if (idir == 0) {
173 return ((- 1. / hx) * ((y - p(1,0,c,r,hx,hy)) / hy));
174 }
175 else if (idir == 1) {
176 return ((1. - (x - p(0,0,c,r,hx,hy)) / hx) * (1. / hy));
177 }
178 break;
179 case 0 :
180 if (idir == 0) {
181 return ((- 1. / hx) * (1. - (y - p(1,0,c,r,hx,hy)) / hy));
182 }
183 else if (idir == 1) {
184 return ((1. - (x - p(0,0,c,r,hx,hy))/ hx) * (- 1. / hy));
185 }
186 break;
187 }
188 return 0.;
189 };
HOST static DEVICE real_t p(idx_t idir, idx_t inode, idx_t colidx, idx_t rowidx, real_t hx, real_t hy)

◆ shp()

template<class distributed_vector>
HOST static DEVICE real_t quadgrid_t< distributed_vector >::shp ( real_t x,
real_t y,
idx_t inode,
idx_t c,
idx_t r,
real_t hx,
real_t hy )
inlinestatic

Definition at line 128 of file quadgrid_cpp.h.

129 {
130
131 switch (inode) {
132 case 3 :
133 return ((x - p(0,0,c,r,hx,hy))/hx * (y - p(1,0,c,r,hx,hy))/hy);
134 break;
135 case 2 :
136 return ((x - p(0,0,c,r,hx,hy))/hx * (1. - (y - p(1,0,c,r,hx,hy))/hy));
137 break;
138 case 1 :
139 return ((1. - (x - p(0,0,c,r,hx,hy))/hx) * (y - p(1,0,c,r,hx,hy))/hy);
140 break;
141 case 0 :
142 return ((1. - (x - p(0,0,c,r,hx,hy))/hx) * (1. - (y - p(1,0,c,r,hx,hy))/hy));
143 break;
144 default :
145 return 0;
146 }
147
148 }

◆ sub2gind() [1/2]

template<class distributed_vector>
idx_t quadgrid_t< distributed_vector >::sub2gind ( idx_t r,
idx_t c ) const
inline

Definition at line 509 of file quadgrid_cpp.h.

509 {
510 return (r + grid_properties.numrows * c);
511 }

◆ sub2gind() [2/2]

template<class distributed_vector>
HOST static DEVICE idx_t quadgrid_t< distributed_vector >::sub2gind ( idx_t r,
idx_t c,
idx_t nr )
inlinestatic

Definition at line 193 of file quadgrid_cpp.h.

193 {
194 return (r + nr * c);
195 }

◆ vtk_export()

template<class distributed_vector>
void quadgrid_t< T >::vtk_export ( const char * filename,
const std::map< std::string, distributed_vector > & f ) const

Definition at line 345 of file quadgrid_cpp_imp.h.

346 {
347
349
350 // This is the XML format of a VTS file to write :
351
352 ofs <<
353 "<VTKFile type=\"StructuredGrid\" version=\"StructuredGrid\" byte_order=\"LittleEndian\">\n\
354 <StructuredGrid WholeExtent=\"0 " << num_rows() << " 0 " << num_cols() << " 0 0\">\n \
355 <Piece Extent=\"0 " << num_rows() << " 0 " << num_cols() << " 0 0\">\n";
356
357 ofs << " <PointData Scalars=\"";
358 for (auto const & ii : f) {
359 ofs << ii.first << ",";
360 }
361 ofs << "\">\n";
362
363 for (auto const & ii : f) {
364 ofs << " <DataArray type=\"Float64\" Name=\"" << ii.first <<"\" format=\"ascii\">\n ";
365 for (auto const & jj : ii.second) {
366 ofs << jj << " ";
367 }
368 ofs << std::endl << " </DataArray>" << std::endl;
369 }
370
371 ofs << " </PointData>\n";
372
373 ofs << " <Points>\n <DataArray type=\"Float64\" NumberOfComponents=\"3\" format=\"ascii\">\n";
374 for (idx_t ii = 0; ii <= num_cols(); ++ii) {
375 ofs << " ";
376 for (idx_t jj = 0; jj <= num_rows(); ++jj) {
377 ofs << std::setprecision(16) << hx()*ii << " " << hy()*jj << " 0 ";
378 }
379 ofs << std::endl;
380 }
381 ofs << " </DataArray>\n </Points>\n";
382
383
384 ofs <<
385 " </Piece>\n\
386 </StructuredGrid>\n\
387</VTKFile>\n";
388
389 ofs.close ();
390}

Member Data Documentation

◆ comm

template<class distributed_vector>
MPI_Comm quadgrid_t< distributed_vector >::comm

Definition at line 526 of file quadgrid_cpp.h.

◆ current_cell

template<class distributed_vector>
cell_t quadgrid_t< distributed_vector >::current_cell
mutableprivate

Definition at line 532 of file quadgrid_cpp.h.

◆ current_neighbor

template<class distributed_vector>
cell_t quadgrid_t< distributed_vector >::current_neighbor
mutableprivate

Definition at line 533 of file quadgrid_cpp.h.

◆ grid_properties

template<class distributed_vector>
grid_properties_t quadgrid_t< distributed_vector >::grid_properties
private

Definition at line 535 of file quadgrid_cpp.h.

◆ rank

template<class distributed_vector>
int quadgrid_t< distributed_vector >::rank

Definition at line 527 of file quadgrid_cpp.h.

◆ size

template<class distributed_vector>
int quadgrid_t< distributed_vector >::size

Definition at line 528 of file quadgrid_cpp.h.


The documentation for this class was generated from the following files: