23 std::cerr <<
"num_gpus=" << num_gpus <<std::endl;
27 std::cerr <<
"running on gpu n. " << device << std::endl;
32 cdf::timer::timer_t timer;
35 constexpr auto filename =
"td.json";
38 std::ifstream inbuf (filename);
47 std::map<std::string, vector_t<real_t>> vars=
48 j[
"grid_vars"].get<std::map<std::string, vector_t<real_t>>> ();
52 for (
const auto & g : vars)
53 p.device_grid_vars[g.first] = g.second;
58 p2g_step1 Jdrift_x(p.device_x.cbegin(), p.device_y.cbegin(), thrust::raw_pointer_cast(p.device_grid_M.data()),
59 thrust::raw_pointer_cast(p.device_grid_vars[
"Jdrift_x"].data()), p.device_ptcl_to_grd.cbegin(), qg.
num_rows(), qg.
hx(),
60 qg.
hy(), p.device_dprops[
"BETAx"].cbegin(), p.device_dprops[
"M"].cbegin(),
false);
62 p2g_step1 Jdrift_y(p.device_x.cbegin(), p.device_y.cbegin(), thrust::raw_pointer_cast(p.device_grid_M.data()),
63 thrust::raw_pointer_cast(p.device_grid_vars[
"Jdrift_y"].data()), p.device_ptcl_to_grd.cbegin(), qg.
num_rows(), qg.
hx(),
64 qg.
hy(), p.device_dprops[
"BETAy"].cbegin(), p.device_dprops[
"M"].cbegin(),
false);
66 p2gd_step2 Jdiff_x(p.device_x.cbegin(), p.device_y.cbegin(), thrust::raw_pointer_cast(p.device_grid_M.data()),
67 thrust::raw_pointer_cast(p.device_grid_vars[
"Jdiff_x"].data()), p.device_ptcl_to_grd.cbegin(), qg.
num_rows(), qg.
hx(),
68 qg.
hy(), 1., p.device_dprops[
"M"].cbegin(), p.device_dprops[
"zero"].cbegin(),
false);
70 p2gd_step2 Jdiff_y(p.device_x.cbegin(), p.device_y.cbegin(), thrust::raw_pointer_cast(p.device_grid_M.data()),
71 thrust::raw_pointer_cast(p.device_grid_vars[
"Jdiff_y"].data()), p.device_ptcl_to_grd.cbegin(), qg.
num_rows(), qg.
hx(),
72 qg.
hy(), 1., p.device_dprops[
"zero"].cbegin(), p.device_dprops[
"M"].cbegin(),
false);
74 g2p_step3 VX(thrust::raw_pointer_cast(p.device_x.data()), thrust::raw_pointer_cast(p.device_y.data()), p.device_grid_M.cbegin(),
75 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 (),
76 thrust::raw_pointer_cast(p.device_dprops[
"VX"].data()),
false);
78 g2p_step3 VY(thrust::raw_pointer_cast(p.device_x.data()), thrust::raw_pointer_cast(p.device_y.data()), p.device_grid_M.cbegin(),
79 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 (),
80 thrust::raw_pointer_cast(p.device_dprops[
"VY"].data()),
false);
84 stepper step(p.device_x.begin(), p.device_y.begin(), p.device_dprops[
"VX"].begin(), p.device_dprops[
"VY"].begin(), 1e-8);
86 thrust::counting_iterator<idx_t> first_p(0), last_p(p.
num_particles), first_n(0), last_n(qg.
num_cols());
88 constexpr int nsave = 10;
89 constexpr double tmax = 0.02;
90 constexpr double dtsave = tmax / nsave;
94 for(
int isave=0; isave < nsave; ++isave){
97 p.
p2g(p.device_grid_vars, {
"M"}, {
"rho"},
true);
100 thrust::copy (p.device_grid_vars[
"rho"].cbegin(), p.device_grid_vars[
"rho"].cend(), vars.at(
"rho").begin());
101 thrust::copy (p.device_grid_vars[
"Jdrift_x"].cbegin(), p.device_grid_vars[
"Jdrift_x"].cend(), vars.at(
"Jdrift_x").begin());
102 thrust::copy (p.device_grid_vars[
"Jdrift_y"].cbegin(), p.device_grid_vars[
"Jdrift_y"].cend(), vars.at(
"Jdrift_y").begin());
103 thrust::copy (p.device_grid_vars[
"Jdiff_x"].cbegin(), p.device_grid_vars[
"Jdiff_x"].cend(), vars.at(
"Jdiff_x").begin());
104 thrust::copy (p.device_grid_vars[
"Jdiff_y"].cbegin(), p.device_grid_vars[
"Jdiff_y"].cend(), vars.at(
"Jdiff_y").begin());
107 const std::string ofilename =
"particle";
108 const std::string ofileext =
".csv";
109 const std::string numfile = std::string(
".") + std::to_string(isave);
111 std::ofstream outbuf (ofilename + numfile + ofileext);
117 const std::string gfilename = std::string(
"grid.") + std::to_string(isave) + std::string(
".vts");
122 while(t < dtsave*(isave +1)){
123 thrust::fill(p.device_grid_vars[
"Jdrift_x"].begin(), p.device_grid_vars[
"Jdrift_x"].end(), 0.0);
124 thrust::fill(p.device_grid_vars[
"Jdrift_y"].begin(), p.device_grid_vars[
"Jdrift_y"].end(), 0.0);
125 thrust::fill(p.device_grid_vars[
"Jdiff_x"].begin(), p.device_grid_vars[
"Jdiff_x"].end(), 0.0);
126 thrust::fill(p.device_grid_vars[
"Jdiff_y"].begin(), p.device_grid_vars[
"Jdiff_y"].end(), 0.0);
127 thrust::fill(p.device_grid_vars[
"rho"].begin(), p.device_grid_vars[
"rho"].end(), 0.0);
128 thrust::fill(p.device_dprops[
"BETAx"].begin(), p.device_dprops[
"BETAx"].end(), 0.0);
129 thrust::fill(p.device_dprops[
"BETAy"].begin(), p.device_dprops[
"BETAy"].end(), 0.0);
130 thrust::fill(p.device_dprops[
"VX"].begin(), p.device_dprops[
"VX"].end(), 0.0);
131 thrust::fill(p.device_dprops[
"VY"].begin(), p.device_dprops[
"VY"].end(), 0.0);
135 p.
g2p(p.device_grid_vars, {
"betax",
"betay"}, {
"BETAx",
"BETAy"},
false);
140 p.
p2g(p.device_grid_vars, {
"M"}, {
"rho"},
false);
141 p.
p2g(p.device_grid_vars, Jdrift_x);
142 p.
p2g(p.device_grid_vars, Jdrift_y);
144 thrust::transform(p.device_grid_vars[
"Jdrift_x"].begin(), p.device_grid_vars[
"Jdrift_x"].end(),
145 p.device_grid_vars[
"rho"].begin(), p.device_grid_vars[
"Jdrift_x"].begin(),
safe_divide());
147 thrust::transform(p.device_grid_vars[
"Jdrift_y"].begin(), p.device_grid_vars[
"Jdrift_y"].end(),
148 p.device_grid_vars[
"rho"].begin(), p.device_grid_vars[
"Jdrift_y"].begin(),
safe_divide());
153 p.
p2gd(p.device_grid_vars, Jdiff_x);
154 p.
p2gd(p.device_grid_vars, Jdiff_y);
156 thrust::transform(p.device_grid_vars[
"Jdiff_x"].begin(), p.device_grid_vars[
"Jdiff_x"].end(),
157 p.device_grid_vars[
"rho"].begin(), p.device_grid_vars[
"Jdiff_x"].begin(),
safe_divide());
159 thrust::transform(p.device_grid_vars[
"Jdiff_y"].begin(), p.device_grid_vars[
"Jdiff_y"].end(),
160 p.device_grid_vars[
"rho"].begin(), p.device_grid_vars[
"Jdiff_y"].begin(),
safe_divide());
162 thrust::for_each(thrust::device, first_n, last_n, bc);
167 p.
g2p(p.device_grid_vars, VX);
168 p.
g2p(p.device_grid_vars, VY);
173 auto abs_vx = thrust::make_transform_iterator(p.device_dprops[
"VX"].begin(),
abs_no_nan());
174 auto abs_vy = thrust::make_transform_iterator(p.device_dprops[
"VY"].begin(),
abs_no_nan());
177 real_t dtx = maxvx > 0.0 ? .5 * qg.
hx() / maxvx : dtsave * (isave + 1) - t;
178 real_t dty = maxvy > 0.0 ? .5 * qg.
hy() / maxvy : dtsave * (isave + 1) - t;
179 step.
dt = fmin (dtx, dty);
180 if (t + step.
dt > dtsave * (isave + 1)) step.
dt = dtsave * (isave + 1) - t;
184 timer.tic(
"move partcles");
185 thrust::for_each(thrust::device, first_p, last_p, step);
187 timer.toc(
"move partcles");
195 p.
p2g(p.device_grid_vars, {
"M"}, {
"rho"},
true);
198 thrust::copy (p.device_grid_vars[
"rho"].cbegin(), p.device_grid_vars[
"rho"].cend(), vars.at(
"rho").begin());
199 thrust::copy (p.device_grid_vars[
"Jdrift_x"].cbegin(), p.device_grid_vars[
"Jdrift_x"].cend(), vars.at(
"Jdrift_x").begin());
200 thrust::copy (p.device_grid_vars[
"Jdrift_y"].cbegin(), p.device_grid_vars[
"Jdrift_y"].cend(), vars.at(
"Jdrift_y").begin());
201 thrust::copy (p.device_grid_vars[
"Jdiff_x"].cbegin(), p.device_grid_vars[
"Jdiff_x"].cend(), vars.at(
"Jdiff_x").begin());
202 thrust::copy (p.device_grid_vars[
"Jdiff_y"].cbegin(), p.device_grid_vars[
"Jdiff_y"].cend(), vars.at(
"Jdiff_y").begin());
205 const std::string ofilename =
"particle";
206 const std::string ofileext =
".csv";
207 const std::string numfile = std::string(
".") + std::to_string(nsave);
209 std::ofstream outbuf (ofilename + numfile + ofileext);
215 const std::string gfilename = std::string(
"grid.") + std::to_string(nsave) + std::string(
".vts");
221 timer.print_report();