quadgrid 0.1
simple cartesian quad grid with particles for c++/octave
Loading...
Searching...
No Matches
drift_diffusion.cpp
Go to the documentation of this file.
1#include "drift_diffusion.h"
2
3int main(){
4
6
7 cdf::timer::timer_t timer;
8
9 // read data from file
10 constexpr auto filename = "driftdiffusion.json";
11
12 nlohmann::json j;
13 std::ifstream inbuf (filename);
14 inbuf >> j;
15
16 quadgrid_t<vector_t<real_t>> qg(j["grid_properties"]);
17 particles_t p(j,qg);
18
19 p.build_mass();
21
22 std::map<std::string, vector_t<real_t>> vars=
23 j["grid_vars"].get<std::map<std::string, vector_t<real_t>>> ();
24
26
27 for (const auto & g : vars)
28 p.device_grid_vars[g.first] = g.second;
29
30 inbuf.close ();
31
32
33 p2g_step1 Jdrift_x(p.device_x.cbegin(), p.device_y.cbegin(), thrust::raw_pointer_cast(p.device_grid_M.data()),
34 thrust::raw_pointer_cast(p.device_grid_vars["Jdrift_x"].data()), p.device_ptcl_to_grd.cbegin(), qg.num_rows(), qg.hx(),
35 qg.hy(), p.device_dprops["BETAx"].cbegin(), p.device_dprops["M"].cbegin(), false);
36
37 p2g_step1 Jdrift_y(p.device_x.cbegin(), p.device_y.cbegin(), thrust::raw_pointer_cast(p.device_grid_M.data()),
38 thrust::raw_pointer_cast(p.device_grid_vars["Jdrift_y"].data()), p.device_ptcl_to_grd.cbegin(), qg.num_rows(), qg.hx(),
39 qg.hy(), p.device_dprops["BETAy"].cbegin(), p.device_dprops["M"].cbegin(), false);
40
41 p2gd_step2 Jdiff_x(p.device_x.cbegin(), p.device_y.cbegin(), thrust::raw_pointer_cast(p.device_grid_M.data()),
42 thrust::raw_pointer_cast(p.device_grid_vars["Jdiff_x"].data()), p.device_ptcl_to_grd.cbegin(), qg.num_rows(), qg.hx(),
43 qg.hy(), 1e-6, p.device_dprops["M"].cbegin(), p.device_dprops["zero"].cbegin(), false);
44
45 p2gd_step2 Jdiff_y(p.device_x.cbegin(), p.device_y.cbegin(), thrust::raw_pointer_cast(p.device_grid_M.data()),
46 thrust::raw_pointer_cast(p.device_grid_vars["Jdiff_y"].data()), p.device_ptcl_to_grd.cbegin(), qg.num_rows(), qg.hx(),
47 qg.hy(), 1e-6, p.device_dprops["zero"].cbegin(), p.device_dprops["M"].cbegin(), false);
48
49 g2p_step3 VX(thrust::raw_pointer_cast(p.device_x.data()), thrust::raw_pointer_cast(p.device_y.data()), p.device_grid_M.cbegin(),
50 p.device_grid_vars["Jdrift_x"].cbegin(), p.device_grid_vars["Jdiff_x"].cbegin(), p.device_ptcl_to_grd.cbegin(), qg.num_rows (), qg.hx (), qg.hy (),
51 thrust::raw_pointer_cast(p.device_dprops["VX"].data()), false);
52
53 g2p_step3 VY(thrust::raw_pointer_cast(p.device_x.data()), thrust::raw_pointer_cast(p.device_y.data()), p.device_grid_M.cbegin(),
54 p.device_grid_vars["Jdrift_y"].cbegin(), p.device_grid_vars["Jdiff_y"].cbegin(), p.device_ptcl_to_grd.cbegin(), qg.num_rows (), qg.hx (), qg.hy (),
55 thrust::raw_pointer_cast(p.device_dprops["VY"].data()), false);
56
57
58 stepper step(p.device_x.begin(), p.device_y.begin(), p.device_dprops["VX"].begin(), p.device_dprops["VY"].begin(), 1.);
59
60 thrust::counting_iterator<idx_t> first_p(0), last_p(p.num_particles);
61
62 // Time stepping
63 for(int it=0; it<1000; ++it){
64
65 thrust::fill(p.device_grid_vars["Jdrift_x"].begin(), p.device_grid_vars["Jdrift_x"].end(), 0.0);
66 thrust::fill(p.device_grid_vars["Jdrift_y"].begin(), p.device_grid_vars["Jdrift_y"].end(), 0.0);
67 thrust::fill(p.device_grid_vars["Jdiff_x"].begin(), p.device_grid_vars["Jdiff_x"].end(), 0.0);
68 thrust::fill(p.device_grid_vars["Jdiff_y"].begin(), p.device_grid_vars["Jdiff_y"].end(), 0.0);
69 thrust::fill(p.device_grid_vars["rho"].begin(), p.device_grid_vars["rho"].end(), 0.0);
70 thrust::fill(p.device_dprops["BETAx"].begin(), p.device_dprops["BETAx"].end(), 0.0);
71 thrust::fill(p.device_dprops["BETAy"].begin(), p.device_dprops["BETAy"].end(), 0.0);
72 thrust::fill(p.device_dprops["VX"].begin(), p.device_dprops["VX"].end(), 0.0);
73 thrust::fill(p.device_dprops["VY"].begin(), p.device_dprops["VY"].end(), 0.0);
74
75 //G2P of drift velocity
76 timer.tic("g2p_1");
77 p.g2p(p.device_grid_vars, {"betax", "betay"}, {"BETAx", "BETAy"}, false);
78 timer.toc("g2p_1");
79
80 //P2G of Jdrift
81 timer.tic("p2g");
82 p.p2g(p.device_grid_vars, {"M"}, {"rho"}, false);
83 p.p2g(p.device_grid_vars, Jdrift_x);
84 p.p2g(p.device_grid_vars, Jdrift_y);
85
86 thrust::transform(p.device_grid_vars["Jdrift_x"].begin(), p.device_grid_vars["Jdrift_x"].end(),
87 p.device_grid_vars["rho"].begin(), p.device_grid_vars["Jdrift_x"].begin(), thrust::divides<double>());
88
89 thrust::transform(p.device_grid_vars["Jdrift_y"].begin(), p.device_grid_vars["Jdrift_y"].end(),
90 p.device_grid_vars["rho"].begin(), p.device_grid_vars["Jdrift_y"].begin(), thrust::divides<double>());
91 timer.toc("p2g");
92
93 //P2GD of Jdiff
94 timer.tic("p2gd");
95 p.p2gd(p.device_grid_vars, Jdiff_x);
96 p.p2gd(p.device_grid_vars, Jdiff_y);
97
98 thrust::transform(p.device_grid_vars["Jdiff_x"].begin(), p.device_grid_vars["Jdiff_x"].end(),
99 p.device_grid_vars["rho"].begin(), p.device_grid_vars["Jdiff_x"].begin(), thrust::divides<double>());
100
101 thrust::transform(p.device_grid_vars["Jdiff_y"].begin(), p.device_grid_vars["Jdiff_y"].end(),
102 p.device_grid_vars["rho"].begin(), p.device_grid_vars["Jdiff_y"].begin(), thrust::divides<double>());
103 timer.toc("p2gd");
104
105 //G2P of VX and VY
106 timer.tic("g2p_2");
107 p.g2p(p.device_grid_vars, VX);
108 p.g2p(p.device_grid_vars, VY);
109 timer.toc("g2p_2");
110
111 //Moving Particles
112 timer.tic("move partcles");
113 thrust::for_each(thrust::device, first_p, last_p, step);
114 p.update_ptcl_to_grd<particles_t::update_ptcl_to_grd_device>();
115 timer.toc("move partcles");
116
117 if (it % 50 == 0) {
118 p.p2g(p.device_grid_vars, {"M"}, {"rho"}, true);
120 //The following copy cannot be included in the memcpy function since vars is not defined in particles.h
121 thrust::copy (p.device_grid_vars["rho"].cbegin(), p.device_grid_vars["rho"].cend(), vars.at("rho").begin());
122 thrust::copy (p.device_grid_vars["Jdrift_x"].cbegin(), p.device_grid_vars["Jdrift_x"].cend(), vars.at("Jdrift_x").begin());
123 thrust::copy (p.device_grid_vars["Jdrift_y"].cbegin(), p.device_grid_vars["Jdrift_y"].cend(), vars.at("Jdrift_y").begin());
124 thrust::copy (p.device_grid_vars["Jdiff_x"].cbegin(), p.device_grid_vars["Jdiff_x"].cend(), vars.at("Jdiff_x").begin());
125 thrust::copy (p.device_grid_vars["Jdiff_y"].cbegin(), p.device_grid_vars["Jdiff_y"].cend(), vars.at("Jdiff_y").begin());
126
127 // write particle data to file
128 const std::string ofilename = "particle";
129 const std::string ofileext = ".csv";
130 const std::string numfile = std::string(".") + std::to_string(it);
131
132 std::ofstream outbuf (ofilename + numfile + ofileext);
134
135 outbuf.close ();
136
137 // write grid data to file
138 const std::string gfilename = std::string("grid.") + std::to_string(it) + std::string(".vts");
139 qg.vtk_export (gfilename.c_str(), vars);
140
141 }
142
143
144 }
145 timer.print_report();
146 return 0;
147}
148
149
150
151
152
153
154
155
156
157
158
real_t hy() const
void vtk_export(const char *filename, const std::map< std::string, distributed_vector > &f) const
idx_t num_rows() const
real_t hx() const
Functor class for moving particles.
int main()
main implementing the time loop.
Class to represent particles embedded in a grid.
Definition particles.h:29
void p2g(std::map< std::string, device_vector_t< real_t > > &vars, bool apply_mass=false)
Map particle variables to the grid.
Definition particles.h:331
void memcpy_host_to_device()
Copy Host To Device.
void g2p(const std::map< std::string, device_vector_t< real_t > > &vars, bool apply_mass=false)
Definition particles.h:401
idx_t num_particles
number of particles.
Definition particles.h:34
void init_particle_mesh()
Build grid/particles connectivity.
quadgrid_t< vector_t< real_t > >::idx_t idx_t
datatype for indexing into vectors of properties
Definition particles.h:32
void print(std::ostream &os) const
Template for export function.
Definition particles.h:109
void build_mass()
Construct a mass matrix.
void p2gd(std::map< std::string, device_vector_t< real_t > > &vars, PT const &pxvarnames, PT const &pyvarnames, std::string const &area, GT const &gvarnames, bool apply_mass=false)
void memcpy_device_to_host()
Copy Device To Host.
void update_ptcl_to_grd()
Updates theptcl_to_grd map only, without changing.