7 cdf::timer::timer_t timer;
10 constexpr auto filename =
"driftdiffusion.json";
13 std::ifstream inbuf (filename);
22 std::map<std::string, vector_t<real_t>> vars=
23 j[
"grid_vars"].get<std::map<std::string, vector_t<real_t>>> ();
27 for (
const auto & g : vars)
28 p.device_grid_vars[g.first] = g.second;
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);
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);
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);
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);
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);
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);
58 stepper step(p.device_x.begin(), p.device_y.begin(), p.device_dprops[
"VX"].begin(), p.device_dprops[
"VY"].begin(), 1.);
60 thrust::counting_iterator<idx_t> first_p(0), last_p(p.
num_particles);
63 for(
int it=0; it<1000; ++it){
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);
77 p.
g2p(p.device_grid_vars, {
"betax",
"betay"}, {
"BETAx",
"BETAy"},
false);
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);
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>());
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>());
95 p.
p2gd(p.device_grid_vars, Jdiff_x);
96 p.
p2gd(p.device_grid_vars, Jdiff_y);
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>());
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>());
107 p.
g2p(p.device_grid_vars, VX);
108 p.
g2p(p.device_grid_vars, VY);
112 timer.tic(
"move partcles");
113 thrust::for_each(thrust::device, first_p, last_p, step);
115 timer.toc(
"move partcles");
118 p.
p2g(p.device_grid_vars, {
"M"}, {
"rho"},
true);
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());
128 const std::string ofilename =
"particle";
129 const std::string ofileext =
".csv";
130 const std::string numfile = std::string(
".") + std::to_string(it);
132 std::ofstream outbuf (ofilename + numfile + ofileext);
138 const std::string gfilename = std::string(
"grid.") + std::to_string(it) + std::string(
".vts");
145 timer.print_report();
void p2g(std::map< std::string, device_vector_t< real_t > > &vars, bool apply_mass=false)
Map particle variables to the grid.
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)