@@ -46,7 +46,7 @@ ExternalVectorPotential::ReadParameters ()
46
46
m_A_external.resize (m_nFields);
47
47
48
48
m_A_ext_time_function.resize (m_nFields);
49
- for (std::string & field_time : m_A_ext_time_function) {field_time = " 1.0" ; }
49
+ for (std::string & field_time : m_A_ext_time_function) { field_time = " 1.0" ; }
50
50
51
51
m_A_external_time_parser.resize (m_nFields);
52
52
m_A_time_scale.resize (m_nFields);
@@ -272,7 +272,7 @@ ExternalVectorPotential::CalculateExternalCurlA (std::string& coil_name)
272
272
273
273
AMREX_FORCE_INLINE
274
274
void
275
- ExternalVectorPotential::PopulateExternalFieldFromVectorPotential (
275
+ ExternalVectorPotential::AddExternalFieldFromVectorPotential (
276
276
ablastr::fields::VectorField const & dstField,
277
277
amrex::Real scale_factor,
278
278
ablastr::fields::VectorField const & srcField,
@@ -313,21 +313,21 @@ ExternalVectorPotential::PopulateExternalFieldFromVectorPotential (
313
313
// Skip field update in the embedded boundaries
314
314
if (update_Fx_arr && update_Fx_arr (i, j, k) == 0 ) { return ; }
315
315
316
- Fx (i,j,k) = scale_factor * Sx (i,j,k);
316
+ Fx (i,j,k) + = scale_factor * Sx (i,j,k);
317
317
},
318
318
319
319
[=] AMREX_GPU_DEVICE (int i, int j, int k){
320
320
// Skip field update in the embedded boundaries
321
321
if (update_Fy_arr && update_Fy_arr (i, j, k) == 0 ) { return ; }
322
322
323
- Fy (i,j,k) = scale_factor * Sy (i,j,k);
323
+ Fy (i,j,k) + = scale_factor * Sy (i,j,k);
324
324
},
325
325
326
326
[=] AMREX_GPU_DEVICE (int i, int j, int k){
327
327
// Skip field update in the embedded boundaries
328
328
if (update_Fz_arr && update_Fz_arr (i, j, k) == 0 ) { return ; }
329
329
330
- Fz (i,j,k) = scale_factor * Sz (i,j,k);
330
+ Fz (i,j,k) + = scale_factor * Sz (i,j,k);
331
331
}
332
332
);
333
333
}
@@ -339,12 +339,20 @@ ExternalVectorPotential::UpdateHybridExternalFields (const amrex::Real t, const
339
339
using ablastr::fields::Direction;
340
340
auto & warpx = WarpX::GetInstance ();
341
341
342
-
343
342
ablastr::fields::MultiLevelVectorField B_ext =
344
343
warpx.m_fields .get_mr_levels_alldirs (FieldType::hybrid_B_fp_external, warpx.finestLevel ());
345
344
ablastr::fields::MultiLevelVectorField E_ext =
346
345
warpx.m_fields .get_mr_levels_alldirs (FieldType::hybrid_E_fp_external, warpx.finestLevel ());
347
346
347
+ // Zero E and B external fields prior to accumulating external fields
348
+ for (int lev = 0 ; lev <= warpx.finestLevel (); ++lev) {
349
+ for (int idir = 0 ; idir < 3 ; ++idir) {
350
+ B_ext[lev][Direction{idir}]->setVal (0 .0_rt);
351
+ E_ext[lev][Direction{idir}]->setVal (0 .0_rt);
352
+ }
353
+ }
354
+
355
+ // Iterate over external fields and add together with individual time functions.
348
356
for (int i = 0 ; i < m_nFields; ++i) {
349
357
const std::string Aext_field = m_field_names[i] + std::string{" _Aext" };
350
358
const std::string curlAext_field = m_field_names[i] + std::string{" _curlAext" };
@@ -363,8 +371,8 @@ ExternalVectorPotential::UpdateHybridExternalFields (const amrex::Real t, const
363
371
warpx.m_fields .get_mr_levels_alldirs (curlAext_field, warpx.finestLevel ());
364
372
365
373
for (int lev = 0 ; lev <= warpx.finestLevel (); ++lev) {
366
- PopulateExternalFieldFromVectorPotential (E_ext[lev], scale_factor_E, A_ext[lev], warpx.GetEBUpdateEFlag ()[lev]);
367
- PopulateExternalFieldFromVectorPotential (B_ext[lev], scale_factor_B, curlA_ext[lev], warpx.GetEBUpdateBFlag ()[lev]);
374
+ AddExternalFieldFromVectorPotential (E_ext[lev], scale_factor_E, A_ext[lev], warpx.GetEBUpdateEFlag ()[lev]);
375
+ AddExternalFieldFromVectorPotential (B_ext[lev], scale_factor_B, curlA_ext[lev], warpx.GetEBUpdateBFlag ()[lev]);
368
376
369
377
for (int idir = 0 ; idir < 3 ; ++idir) {
370
378
E_ext[lev][Direction{idir}]->FillBoundary (warpx.Geom (lev).periodicity ());
0 commit comments