@@ -221,167 +221,32 @@ void HybridPICModel::InitData ()
221221 // if the current is time dependent which is what needs to be done to
222222 // write time independent fields on the first step.
223223 for (int lev = 0 ; lev <= warpx.finestLevel (); ++lev) {
224- auto edge_lengths = std::array<std::unique_ptr<amrex::MultiFab>, 3 >();
225- #ifdef AMREX_USE_EB
226- if (EB::enabled ()) {
227- using ablastr::fields::Direction;
228- auto const & edge_lengths_x = *warpx.m_fields .get (FieldType::edge_lengths, Direction{0 }, lev);
229- auto const & edge_lengths_y = *warpx.m_fields .get (FieldType::edge_lengths, Direction{1 }, lev);
230- auto const & edge_lengths_z = *warpx.m_fields .get (FieldType::edge_lengths, Direction{2 }, lev);
231-
232- edge_lengths = std::array< std::unique_ptr<amrex::MultiFab>, 3 >{
233- std::make_unique<amrex::MultiFab>(
234- edge_lengths_x, amrex::make_alias, 0 , edge_lengths_x.nComp ()),
235- std::make_unique<amrex::MultiFab>(
236- edge_lengths_y, amrex::make_alias, 0 , edge_lengths_y.nComp ()),
237- std::make_unique<amrex::MultiFab>(
238- edge_lengths_z, amrex::make_alias, 0 , edge_lengths_z.nComp ())
239- };
240- }
241- #endif
242- GetCurrentExternal (ablastr::fields::a2m (edge_lengths), lev);
224+ warpx.ComputeExternalFieldOnGridUsingParser (
225+ FieldType::hybrid_current_fp_external,
226+ m_J_external[0 ],
227+ m_J_external[1 ],
228+ m_J_external[2 ],
229+ lev, PatchType::fine, ' e' ,
230+ warpx.m_fields .get_alldirs (FieldType::edge_lengths, lev),
231+ warpx.m_fields .get_alldirs (FieldType::face_areas, lev));
243232 }
244233}
245234
246- void HybridPICModel::GetCurrentExternal (
247- ablastr::fields::MultiLevelVectorField const & edge_lengths)
235+ void HybridPICModel::GetCurrentExternal ()
248236{
249237 if (!m_external_field_has_time_dependence) { return ; }
250238
251239 auto & warpx = WarpX::GetInstance ();
252240 for (int lev = 0 ; lev <= warpx.finestLevel (); ++lev)
253241 {
254- GetCurrentExternal (edge_lengths[lev], lev);
255- }
256- }
257-
258-
259- void HybridPICModel::GetCurrentExternal (
260- ablastr::fields::VectorField const & edge_lengths,
261- int lev)
262- {
263- // This logic matches closely to WarpX::InitializeExternalFieldsOnGridUsingParser
264- // except that the parsers include time dependence.
265- auto & warpx = WarpX::GetInstance ();
266-
267- auto t = warpx.gett_new (lev);
268-
269- auto dx_lev = warpx.Geom (lev).CellSizeArray ();
270- const RealBox& real_box = warpx.Geom (lev).ProbDomain ();
271-
272- using ablastr::fields::Direction;
273- amrex::MultiFab * mfx = warpx.m_fields .get (FieldType::hybrid_current_fp_external, Direction{0 }, lev);
274- amrex::MultiFab * mfy = warpx.m_fields .get (FieldType::hybrid_current_fp_external, Direction{1 }, lev);
275- amrex::MultiFab * mfz = warpx.m_fields .get (FieldType::hybrid_current_fp_external, Direction{2 }, lev);
276-
277- const amrex::IntVect x_nodal_flag = mfx->ixType ().toIntVect ();
278- const amrex::IntVect y_nodal_flag = mfy->ixType ().toIntVect ();
279- const amrex::IntVect z_nodal_flag = mfz->ixType ().toIntVect ();
280-
281- // avoid implicit lambda capture
282- auto Jx_external = m_J_external[0 ];
283- auto Jy_external = m_J_external[1 ];
284- auto Jz_external = m_J_external[2 ];
285-
286- for ( MFIter mfi (*mfx, TilingIfNotGPU ()); mfi.isValid (); ++mfi)
287- {
288- const amrex::Box& tbx = mfi.tilebox ( x_nodal_flag, mfx->nGrowVect () );
289- const amrex::Box& tby = mfi.tilebox ( y_nodal_flag, mfy->nGrowVect () );
290- const amrex::Box& tbz = mfi.tilebox ( z_nodal_flag, mfz->nGrowVect () );
291-
292- auto const & mfxfab = mfx->array (mfi);
293- auto const & mfyfab = mfy->array (mfi);
294- auto const & mfzfab = mfz->array (mfi);
295-
296- amrex::Array4<amrex::Real> lx, ly, lz;
297- if (EB::enabled ()) {
298- lx = edge_lengths[0 ]->array (mfi);
299- ly = edge_lengths[1 ]->array (mfi);
300- lz = edge_lengths[2 ]->array (mfi);
301- }
302-
303- amrex::ParallelFor (tbx, tby, tbz,
304- [=] AMREX_GPU_DEVICE (int i, int j, int k) {
305- // skip if node is covered by an embedded boundary
306- if (lx && lx (i, j, k) <= 0 ) { return ; }
307-
308- // Shift required in the x-, y-, or z- position
309- // depending on the index type of the multifab
310- #if defined(WARPX_DIM_1D_Z)
311- const amrex::Real x = 0 ._rt ;
312- const amrex::Real y = 0 ._rt ;
313- const amrex::Real fac_z = (1 ._rt - x_nodal_flag[0 ]) * dx_lev[0 ] * 0 .5_rt;
314- const amrex::Real z = j*dx_lev[0 ] + real_box.lo (0 ) + fac_z;
315- #elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
316- const amrex::Real fac_x = (1 ._rt - x_nodal_flag[0 ]) * dx_lev[0 ] * 0 .5_rt;
317- const amrex::Real x = i*dx_lev[0 ] + real_box.lo (0 ) + fac_x;
318- const amrex::Real y = 0 ._rt ;
319- const amrex::Real fac_z = (1 ._rt - x_nodal_flag[1 ]) * dx_lev[1 ] * 0 .5_rt;
320- const amrex::Real z = j*dx_lev[1 ] + real_box.lo (1 ) + fac_z;
321- #else
322- const amrex::Real fac_x = (1 ._rt - x_nodal_flag[0 ]) * dx_lev[0 ] * 0 .5_rt;
323- const amrex::Real x = i*dx_lev[0 ] + real_box.lo (0 ) + fac_x;
324- const amrex::Real fac_y = (1 ._rt - x_nodal_flag[1 ]) * dx_lev[1 ] * 0 .5_rt;
325- const amrex::Real y = j*dx_lev[1 ] + real_box.lo (1 ) + fac_y;
326- const amrex::Real fac_z = (1 ._rt - x_nodal_flag[2 ]) * dx_lev[2 ] * 0 .5_rt;
327- const amrex::Real z = k*dx_lev[2 ] + real_box.lo (2 ) + fac_z;
328- #endif
329- // Initialize the x-component of the field.
330- mfxfab (i,j,k) = Jx_external (x,y,z,t);
331- },
332- [=] AMREX_GPU_DEVICE (int i, int j, int k) {
333- // skip if node is covered by an embedded boundary
334- if (ly && ly (i, j, k) <= 0 ) { return ; }
335-
336- #if defined(WARPX_DIM_1D_Z)
337- const amrex::Real x = 0 ._rt ;
338- const amrex::Real y = 0 ._rt ;
339- const amrex::Real fac_z = (1 ._rt - y_nodal_flag[0 ]) * dx_lev[0 ] * 0 .5_rt;
340- const amrex::Real z = j*dx_lev[0 ] + real_box.lo (0 ) + fac_z;
341- #elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
342- const amrex::Real fac_x = (1 ._rt - y_nodal_flag[0 ]) * dx_lev[0 ] * 0 .5_rt;
343- const amrex::Real x = i*dx_lev[0 ] + real_box.lo (0 ) + fac_x;
344- const amrex::Real y = 0 ._rt ;
345- const amrex::Real fac_z = (1 ._rt - y_nodal_flag[1 ]) * dx_lev[1 ] * 0 .5_rt;
346- const amrex::Real z = j*dx_lev[1 ] + real_box.lo (1 ) + fac_z;
347- #elif defined(WARPX_DIM_3D)
348- const amrex::Real fac_x = (1 ._rt - y_nodal_flag[0 ]) * dx_lev[0 ] * 0 .5_rt;
349- const amrex::Real x = i*dx_lev[0 ] + real_box.lo (0 ) + fac_x;
350- const amrex::Real fac_y = (1 ._rt - y_nodal_flag[1 ]) * dx_lev[1 ] * 0 .5_rt;
351- const amrex::Real y = j*dx_lev[1 ] + real_box.lo (1 ) + fac_y;
352- const amrex::Real fac_z = (1 ._rt - y_nodal_flag[2 ]) * dx_lev[2 ] * 0 .5_rt;
353- const amrex::Real z = k*dx_lev[2 ] + real_box.lo (2 ) + fac_z;
354- #endif
355- // Initialize the y-component of the field.
356- mfyfab (i,j,k) = Jy_external (x,y,z,t);
357- },
358- [=] AMREX_GPU_DEVICE (int i, int j, int k) {
359- // skip if node is covered by an embedded boundary
360- if (lz && lz (i, j, k) <= 0 ) { return ; }
361-
362- #if defined(WARPX_DIM_1D_Z)
363- const amrex::Real x = 0 ._rt ;
364- const amrex::Real y = 0 ._rt ;
365- const amrex::Real fac_z = (1 ._rt - z_nodal_flag[0 ]) * dx_lev[0 ] * 0 .5_rt;
366- const amrex::Real z = j*dx_lev[0 ] + real_box.lo (0 ) + fac_z;
367- #elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
368- const amrex::Real fac_x = (1 ._rt - z_nodal_flag[0 ]) * dx_lev[0 ] * 0 .5_rt;
369- const amrex::Real x = i*dx_lev[0 ] + real_box.lo (0 ) + fac_x;
370- const amrex::Real y = 0 ._rt ;
371- const amrex::Real fac_z = (1 ._rt - z_nodal_flag[1 ]) * dx_lev[1 ] * 0 .5_rt;
372- const amrex::Real z = j*dx_lev[1 ] + real_box.lo (1 ) + fac_z;
373- #elif defined(WARPX_DIM_3D)
374- const amrex::Real fac_x = (1 ._rt - z_nodal_flag[0 ]) * dx_lev[0 ] * 0 .5_rt;
375- const amrex::Real x = i*dx_lev[0 ] + real_box.lo (0 ) + fac_x;
376- const amrex::Real fac_y = (1 ._rt - z_nodal_flag[1 ]) * dx_lev[1 ] * 0 .5_rt;
377- const amrex::Real y = j*dx_lev[1 ] + real_box.lo (1 ) + fac_y;
378- const amrex::Real fac_z = (1 ._rt - z_nodal_flag[2 ]) * dx_lev[2 ] * 0 .5_rt;
379- const amrex::Real z = k*dx_lev[2 ] + real_box.lo (2 ) + fac_z;
380- #endif
381- // Initialize the z-component of the field.
382- mfzfab (i,j,k) = Jz_external (x,y,z,t);
383- }
384- );
242+ warpx.ComputeExternalFieldOnGridUsingParser (
243+ FieldType::hybrid_current_fp_external,
244+ m_J_external[0 ],
245+ m_J_external[1 ],
246+ m_J_external[2 ],
247+ lev, PatchType::fine, ' e' ,
248+ warpx.m_fields .get_alldirs (FieldType::edge_lengths, lev),
249+ warpx.m_fields .get_alldirs (FieldType::face_areas, lev));
385250 }
386251}
387252
0 commit comments