11
22#pragma once
33
4+ #include " gauss_corrector_base.hxx"
45#include " fields.hxx"
56#include " writer_mrc.hxx"
67#include " mpi_dtype_traits.hxx"
@@ -66,45 +67,35 @@ inline void correct(const Grid_t& grid, E1& efield, const Int3& efield_ib,
6667 assert (efield_ib == -grid.ibn );
6768 assert (mf_ib == -grid.ibn );
6869
69- Real3 fac = {.5f * grid.dt * diffusion / grid.domain .dx [0 ],
70- .5f * grid.dt * diffusion / grid.domain .dx [1 ],
71- .5f * grid.dt * diffusion / grid.domain .dx [2 ]};
70+ Real3 fac = .5f * real_t (grid.dt ) * diffusion * Real3 (grid.domain .dx_inv );
7271
7372 for (int p = 0 ; p < grid.n_patches (); p++) {
7473 Int3 lx, rx, ly, ry, lz, rz;
7574 detail::find_limits (grid, p, lx, rx, ly, ry, lz, rz);
7675
77- if (!grid.isInvar (0 )) {
78- Int3 l = lx, r = rx;
79- auto ex = efield.view (_all, _all, _all, 0 , p);
80- auto res = mf.view (_all, _all, _all, 0 , p);
81- ex.view (_s (l[0 ], r[0 ]), _s (l[1 ], r[1 ]), _s (l[2 ], r[2 ])) =
82- ex.view (_s (l[0 ], r[0 ]), _s (l[1 ], r[1 ]), _s (l[2 ], r[2 ])) +
83- (res.view (_s (l[0 ] + 1 , r[0 ] + 1 ), _s (l[1 ], r[1 ]), _s (l[2 ], r[2 ])) -
84- res.view (_s (l[0 ], r[0 ]), _s (l[1 ], r[1 ]), _s (l[2 ], r[2 ]))) *
85- fac[0 ];
86- }
76+ Int3 ls[3 ] = {lx, ly, lz};
77+ Int3 rs[3 ] = {rx, ry, rz};
8778
88- {
89- Int3 l = ly, r = ry;
90- auto ey = efield.view (_all, _all, _all, 1 , p);
91- auto res = mf.view (_all, _all, _all, 0 , p);
92- ey.view (_s (l[0 ], r[0 ]), _s (l[1 ], r[1 ]), _s (l[2 ], r[2 ])) =
93- ey.view (_s (l[0 ], r[0 ]), _s (l[1 ], r[1 ]), _s (l[2 ], r[2 ])) +
94- (res.view (_s (l[0 ], r[0 ]), _s (l[1 ] + 1 , r[1 ] + 1 ), _s (l[2 ], r[2 ])) -
95- res.view (_s (l[0 ], r[0 ]), _s (l[1 ], r[1 ]), _s (l[2 ], r[2 ]))) *
96- fac[1 ];
97- }
79+ auto res = mf.view (_all, _all, _all, 0 , p);
80+ for (int d = 0 ; d < 3 ; d++) {
81+ if (grid.isInvar (d)) {
82+ continue ;
83+ }
84+
85+ Int3 l = ls[d];
86+ Int3 r = rs[d];
87+ auto e_comp = efield.view (_all, _all, _all, d, p);
88+
89+ gt::gslice s1x = _s (l[0 ], r[0 ]);
90+ gt::gslice s1y = _s (l[1 ], r[1 ]);
91+ gt::gslice s1z = _s (l[2 ], r[2 ]);
92+
93+ gt::gslice s2[3 ] = {_s (l[0 ], r[0 ]), _s (l[1 ], r[1 ]), _s (l[2 ], r[2 ])};
94+ s2[d] = _s (l[d] + 1 , r[d] + 1 );
9895
99- {
100- Int3 l = lz, r = rz;
101- auto ez = efield.view (_all, _all, _all, 2 , p);
102- auto res = mf.view (_all, _all, _all, 0 , p);
103- ez.view (_s (l[0 ], r[0 ]), _s (l[1 ], r[1 ]), _s (l[2 ], r[2 ])) =
104- ez.view (_s (l[0 ], r[0 ]), _s (l[1 ], r[1 ]), _s (l[2 ], r[2 ])) +
105- (res.view (_s (l[0 ], r[0 ]), _s (l[1 ], r[1 ]), _s (l[2 ] + 1 , r[2 ] + 1 )) -
106- res.view (_s (l[0 ], r[0 ]), _s (l[1 ], r[1 ]), _s (l[2 ], r[2 ]))) *
107- fac[2 ];
96+ e_comp.view (s1x, s1y, s1z) =
97+ e_comp.view (s1x, s1y, s1z) +
98+ (res.view (s2[0 ], s2[1 ], s2[2 ]) - res.view (s1x, s1y, s1z)) * fac[d];
10899 }
109100 }
110101}
@@ -198,12 +189,14 @@ inline void correct(const Grid_t& grid, E1& efield, const Int3& efield_ib,
198189} // namespace marder
199190} // namespace psc
200191
201- template <typename S, typename D, typename ITEM_RHO , typename BND >
202- class MarderCommon
192+ template <typename MFIELDS_STATE , typename MPARTICLES , typename ITEM_RHO ,
193+ typename BND >
194+ class MarderCommon : public GaussCorrectorBase <MFIELDS_STATE , MPARTICLES >
203195{
204196public:
205- using storage_type = S;
206- using dim_t = D;
197+ using MfieldsState = MFIELDS_STATE ;
198+ using Mparticles = MPARTICLES ;
199+ using storage_type = typename MfieldsState::Storage;
207200 using Item_rho_t = ITEM_RHO ;
208201 using Bnd = BND ;
209202 using real_t = typename storage_type::value_type;
@@ -241,23 +234,16 @@ public:
241234 }
242235 }
243236
244- // ----------------------------------------------------------------------
245- // operator()
246- //
247- // Do the modified marder correction (See eq.(5, 7, 9, 10) in Mardahl and
248- // Verboncoeur, CPC, 1997)
249-
250- template <typename Mparticles>
251- void operator ()(const Grid_t& grid, storage_type& mflds, const Int3& mflds_ib,
252- Mparticles& mprts)
237+ void correct_gauss (MfieldsState& mflds, Mparticles& mprts) override
253238 {
254- auto efield = mflds.view (_all, _all, _all, _s (EX , EX + 3 ), _all);
255- auto efield_ib = mflds_ib;
239+ const Grid_t& grid = mflds.grid ();
240+ auto efield = mflds.storage ().view (_all, _all, _all, _s (EX , EX + 3 ), _all);
241+ Int3 efield_ib = mflds.ib ();
256242
257243 double inv_sum = 0 .;
258244 for (int d = 0 ; d < 3 ; d++) {
259245 if (!grid.isInvar (d)) {
260- inv_sum += 1 . / sqr (grid.domain .dx [d]);
246+ inv_sum += sqr (grid.domain .dx_inv [d]);
261247 }
262248 }
263249 double diffusion_max = 1 . / 2 . / (.5 * grid.dt ) / inv_sum;
@@ -270,7 +256,7 @@ public:
270256 // and expected to be filled when done, so we're playing it safe for the
271257 // time being.
272258 for (int i = 0 ; i < loop_; i++) {
273- bnd_.fill_ghosts (grid, mflds, mflds_ib , EX , EX + 3 );
259+ bnd_.fill_ghosts (mflds, EX , EX + 3 );
274260 auto dive = psc::mflds::interior (grid, psc::item::div_nc (grid, efield));
275261
276262 Int3 res_ib = -grid.ibn ;
@@ -282,21 +268,8 @@ public:
282268
283269 psc::marder::correct (grid, efield, efield_ib, res, res_ib, diffusion);
284270 }
285- bnd_.fill_ghosts (grid, mflds, mflds_ib, EX , EX + 3 );
286- }
287-
288- template <typename MfieldsState, typename Mparticles>
289- void operator ()(MfieldsState& mflds, Mparticles& mprts)
290- {
291- static int pr;
292- if (!pr) {
293- pr = prof_register (" marder" , 1 ., 0 , 0 );
294- }
295-
296- prof_start (pr);
297- (*this )(mprts.grid (), mflds.storage (), mflds.ib (), mprts);
298- prof_stop (pr);
299- }
271+ bnd_.fill_ghosts (mflds, EX , EX + 3 );
272+ };
300273
301274 // private:
302275 real_t diffusion_; // < diffusion coefficient for Marder correction
@@ -306,16 +279,18 @@ public:
306279 WriterMRC io_; // < for debug dumping
307280};
308281
309- template <typename S, typename D>
310- using Marder_ = MarderCommon<S, D, Moment_rho_1st_nc<S, D>, Bnd_>;
282+ template <typename MFIELDS_STATE , typename MPARTICLES , typename D>
283+ using Marder_ =
284+ MarderCommon<MFIELDS_STATE , MPARTICLES ,
285+ Moment_rho_1st_nc<typename MFIELDS_STATE ::Storage, D>, Bnd_>;
311286
312287#ifdef USE_CUDA
313288
314289#include " psc_particles_single.h"
315290#include " mparticles_cuda.hxx"
316291#include " fields_item_moments_1st_cuda.hxx"
317292
318- template <typename D>
319- using MarderCuda = MarderCommon<MfieldsStateCuda::Storage, D ,
293+ template <typename Mparticles, typename D>
294+ using MarderCuda = MarderCommon<MfieldsStateCuda, Mparticles ,
320295 Moment_rho_1st_nc_cuda<D>, BndCuda3>;
321296#endif
0 commit comments