WarpX
WarpX.H
Go to the documentation of this file.
1 /* Copyright 2016-2020 Andrew Myers, Ann Almgren, Aurore Blelly
2  * Axel Huebl, Burlen Loring, David Grote
3  * Glenn Richardson, Junmin Gu, Luca Fedeli
4  * Mathieu Lobet, Maxence Thevenet, Michael Rowan
5  * Remi Lehe, Revathi Jambunathan, Weiqun Zhang
6  * Yinjian Zhao
7  *
8  * This file is part of WarpX.
9  *
10  * License: BSD-3-Clause-LBNL
11  */
12 #ifndef WARPX_H_
13 #define WARPX_H_
14 
19 #include "Evolve/WarpXDtType.H"
25 #ifdef WARPX_USE_PSATD
26 # ifdef WARPX_DIM_RZ
28 # else
30 # endif
31 #endif
32 #include "Filter/BilinearFilter.H"
37 #include "Utils/IntervalsParser.H"
39 
40 #include <AMReX.H>
41 #include <AMReX_AmrCore.H>
42 #include <AMReX_Array.H>
43 #include <AMReX_Config.H>
44 #ifdef AMREX_USE_EB
45 # include "AMReX_EBFabFactory.H"
46 #endif
47 #include <AMReX_GpuContainers.H>
48 #include <AMReX_IntVect.H>
49 #include <AMReX_LayoutData.H>
50 #include <AMReX_Parser.H>
51 #include <AMReX_REAL.H>
52 #include <AMReX_RealBox.H>
53 #include <AMReX_RealVect.H>
54 #include <AMReX_Vector.H>
55 #include <AMReX_VisMF.H>
56 
57 #include <AMReX_BaseFwd.H>
58 #include <AMReX_AmrCoreFwd.H>
59 
60 #include <array>
61 #include <iostream>
62 #include <limits>
63 #include <memory>
64 #include <string>
65 #include <vector>
66 
67 #if defined(AMREX_USE_EB) && defined(WARPX_DIM_RZ)
68 static_assert(false, "Embedded boundaries are not supported in RZ mode.");
69 #endif
70 
71 enum struct PatchType : int
72 {
73  fine,
74  coarse
75 };
76 
77 class WarpX
78  : public amrex::AmrCore
79 {
80 public:
81 
82  friend class PML;
83 
84  static WarpX& GetInstance ();
85  static void ResetInstance ();
86 
87  WarpX ();
88  ~WarpX ();
89 
90  static std::string Version ();
91  static std::string PicsarVersion ();
92 
93  int Verbose () const { return verbose; }
94 
95 
96  void InitData ();
97 
98  void Evolve (int numsteps = -1);
99 
101 
102  ParticleBoundaryBuffer& GetParticleBoundaryBuffer () { return *m_particle_boundary_buffer; }
103 
104  static void shiftMF (amrex::MultiFab& mf, const amrex::Geometry& geom,
105  int num_shift, int dir, amrex::Real external_field=0.0,
106  bool useparser = false, amrex::ParserExecutor<3> const& field_parser={});
107 
108  static void GotoNextLine (std::istream& is);
109 
111  static std::string authors;
112 
113  // Initial field on the grid.
114  static amrex::Vector<amrex::Real> E_external_grid;
115  static amrex::Vector<amrex::Real> B_external_grid;
116 
117  // Initialization Type for External E and B on grid
118  static std::string B_ext_grid_s;
119  static std::string E_ext_grid_s;
120 
121  // Parser for B_external on the grid
122  static std::string str_Bx_ext_grid_function;
123  static std::string str_By_ext_grid_function;
124  static std::string str_Bz_ext_grid_function;
125  // Parser for E_external on the grid
126  static std::string str_Ex_ext_grid_function;
127  static std::string str_Ey_ext_grid_function;
128  static std::string str_Ez_ext_grid_function;
129 
130  // Parser for B_external on the grid
131  std::unique_ptr<amrex::Parser> Bxfield_parser;
132  std::unique_ptr<amrex::Parser> Byfield_parser;
133  std::unique_ptr<amrex::Parser> Bzfield_parser;
134  // Parser for E_external on the grid
135  std::unique_ptr<amrex::Parser> Exfield_parser;
136  std::unique_ptr<amrex::Parser> Eyfield_parser;
137  std::unique_ptr<amrex::Parser> Ezfield_parser;
138 
139  // Algorithms
142  static long field_gathering_algo;
143  static long particle_pusher_algo;
144  static int maxwell_solver_id;
146  static int em_solver_medium;
148  static amrex::Vector<int> field_boundary_lo;
149  static amrex::Vector<int> field_boundary_hi;
150  static amrex::Vector<ParticleBoundaryType> particle_boundary_lo;
151  static amrex::Vector<ParticleBoundaryType> particle_boundary_hi;
152 
153 
154  // If true, the current is deposited on a nodal grid and then centered onto a staggered grid
155  static bool do_current_centering;
156 
157  // PSATD: If true (overwritten by the user in the input file), the current correction
158  // defined in equation (19) of https://doi.org/10.1016/j.jcp.2013.03.010 is applied
159  bool current_correction = false;
160 
161  // PSATD: If true, the update equation for E contains both J and rho (at times n and n+1):
162  // default is false for standard PSATD and true for Galilean PSATD (set in WarpX.cpp)
163  bool update_with_rho = false;
164 
165  // PSATD: Whether to fill the guard cells with inverse FFTs based on the boundary conditions
166  static amrex::IntVect fill_guards;
167 
168  // div(E) and div(B) cleaning
169  static bool do_dive_cleaning;
170  static bool do_divb_cleaning;
171 
172  // Interpolation order
173  static int nox;
174  static int noy;
175  static int noz;
176 
177  // Order of finite-order centering of fields (staggered to nodal)
181 
182  // Order of finite-order centering of currents (nodal to staggered)
186 
187  // Number of modes for the RZ multimode version
189  static int ncomps;
190 
191  static bool use_fdtd_nci_corr;
193 
194  static bool use_filter;
195  static bool use_kspace_filter;
197  static bool serialize_ics;
198 
199  // Back transformation diagnostic
201  static std::string lab_data_directory;
202  static int num_snapshots_lab;
203  static amrex::Real dt_snapshots_lab;
206 
207  // Boosted frame parameters
208  static amrex::Real gamma_boost;
209  static amrex::Real beta_boost;
210  static amrex::Vector<int> boost_direction;
213 
215  static bool refine_plasma;
216 
218  static amrex::IntVect sort_bin_size;
219 
220  static int do_subcycling;
221  static int do_multi_J;
223  static int J_linear_in_time;
224 
226  static bool safe_guard_cells;
227 
228  // buffers
231 
232  // do nodal
233  static int do_nodal;
234 
235  std::array<const amrex::MultiFab* const, 3>
236  get_array_Bfield_aux (const int lev) const {
237  return {
238  Bfield_aux[lev][0].get(),
239  Bfield_aux[lev][1].get(),
240  Bfield_aux[lev][2].get()
241  };
242  }
243  std::array<const amrex::MultiFab* const, 3>
244  get_array_Efield_aux (const int lev) const {
245  return {
246  Efield_aux[lev][0].get(),
247  Efield_aux[lev][1].get(),
248  Efield_aux[lev][2].get()
249  };
250  }
251 
252  amrex::MultiFab * get_pointer_Efield_aux (int lev, int direction) const { return Efield_aux[lev][direction].get(); }
253  amrex::MultiFab * get_pointer_Bfield_aux (int lev, int direction) const { return Bfield_aux[lev][direction].get(); }
254 
255  amrex::MultiFab * get_pointer_Efield_fp (int lev, int direction) const { return Efield_fp[lev][direction].get(); }
256  amrex::MultiFab * get_pointer_Bfield_fp (int lev, int direction) const { return Bfield_fp[lev][direction].get(); }
257  amrex::MultiFab * get_pointer_current_fp (int lev, int direction) const { return current_fp[lev][direction].get(); }
258  amrex::MultiFab * get_pointer_rho_fp (int lev) const { return rho_fp[lev].get(); }
259  amrex::MultiFab * get_pointer_F_fp (int lev) const { return F_fp[lev].get(); }
260  amrex::MultiFab * get_pointer_G_fp (int lev) const { return G_fp[lev].get(); }
261  amrex::MultiFab * get_pointer_phi_fp (int lev) const { return phi_fp[lev].get(); }
262 
263  amrex::MultiFab * get_pointer_Efield_cp (int lev, int direction) const { return Efield_cp[lev][direction].get(); }
264  amrex::MultiFab * get_pointer_Bfield_cp (int lev, int direction) const { return Bfield_cp[lev][direction].get(); }
265  amrex::MultiFab * get_pointer_current_cp (int lev, int direction) const { return current_cp[lev][direction].get(); }
266  amrex::MultiFab * get_pointer_rho_cp (int lev) const { return rho_cp[lev].get(); }
267  amrex::MultiFab * get_pointer_F_cp (int lev) const { return F_cp[lev].get(); }
268  amrex::MultiFab * get_pointer_G_cp (int lev) const { return G_cp[lev].get(); }
269 
270  const amrex::MultiFab& getcurrent (int lev, int direction) {return *current_fp[lev][direction];}
271  const amrex::MultiFab& getEfield (int lev, int direction) {return *Efield_aux[lev][direction];}
272  const amrex::MultiFab& getBfield (int lev, int direction) {return *Bfield_aux[lev][direction];}
273 
274  const amrex::MultiFab& getcurrent_cp (int lev, int direction) {return *current_cp[lev][direction];}
275  const amrex::MultiFab& getEfield_cp (int lev, int direction) {return *Efield_cp[lev][direction];}
276  const amrex::MultiFab& getBfield_cp (int lev, int direction) {return *Bfield_cp[lev][direction];}
277  const amrex::MultiFab& getrho_cp (int lev) {return *rho_cp[lev];}
278 
279  const amrex::MultiFab& getcurrent_fp (int lev, int direction) {return *current_fp[lev][direction];}
280  const amrex::MultiFab& getEfield_fp (int lev, int direction) {return *Efield_fp[lev][direction];}
281  const amrex::MultiFab& getBfield_fp (int lev, int direction) {return *Bfield_fp[lev][direction];}
282  const amrex::MultiFab& getrho_fp (int lev) {return *rho_fp[lev];}
283  const amrex::MultiFab& getphi_fp (int lev) {return *phi_fp[lev];}
284  const amrex::MultiFab& getF_fp (int lev) {return *F_fp[lev];}
285  const amrex::MultiFab& getG_fp (int lev) {return *G_fp[lev];}
286 
287  const amrex::MultiFab& getEfield_avg_fp (int lev, int direction) {return *Efield_avg_fp[lev][direction];}
288  const amrex::MultiFab& getBfield_avg_fp (int lev, int direction) {return *Bfield_avg_fp[lev][direction];}
289  const amrex::MultiFab& getEfield_avg_cp (int lev, int direction) {return *Efield_avg_cp[lev][direction];}
290  const amrex::MultiFab& getBfield_avg_cp (int lev, int direction) {return *Bfield_avg_cp[lev][direction];}
291 
292  bool DoPML () const {return do_pml;}
293 
295  std::vector<bool> getPMLdirections() const;
296 
297  static amrex::LayoutData<amrex::Real>* getCosts (int lev);
298 
299  void setLoadBalanceEfficiency (const int lev, const amrex::Real efficiency)
300  {
301  if (m_instance)
302  {
303  m_instance->load_balance_efficiency[lev] = efficiency;
304  } else
305  {
306  return;
307  }
308  }
309 
310  amrex::Real getLoadBalanceEfficiency (const int lev)
311  {
312  if (m_instance)
313  {
314  return m_instance->load_balance_efficiency[lev];
315  } else
316  {
317  return -1;
318  }
319  }
320 
321  static amrex::IntVect filter_npass_each_dir;
323  amrex::Vector< std::unique_ptr<NCIGodfreyFilter> > nci_godfrey_filter_exeybz;
324  amrex::Vector< std::unique_ptr<NCIGodfreyFilter> > nci_godfrey_filter_bxbyez;
325 
326  amrex::Real time_of_last_gal_shift = 0;
327  amrex::Array<amrex::Real,3> m_v_galilean = {{0}};
328  amrex::Array<amrex::Real,3> m_galilean_shift = {{0}};
329 
330  amrex::Array<amrex::Real,3> m_v_comoving = {{0.}};
331 
332  static int num_mirrors;
333  amrex::Vector<amrex::Real> mirror_z;
334  amrex::Vector<amrex::Real> mirror_z_width;
335  amrex::Vector<int> mirror_z_npoints;
336 
339 
340  void applyMirrors(amrex::Real time);
341 
343  void ComputeDt ();
344 
346  void PrintDtDxDyDz ();
347 
353  void ComputeMaxStep ();
354  // Compute max_step automatically for simulations in a boosted frame.
355  void computeMaxStepBoostAccelerator(const amrex::Geometry& geom);
356 
361  int MoveWindow (const int step, bool move_j);
362 
368  void ShiftGalileanBoundary ();
369  void UpdatePlasmaInjectionPosition (amrex::Real dt);
370  void ResetProbDomain (const amrex::RealBox& rb);
371  void EvolveE ( amrex::Real dt);
372  void EvolveE (int lev, amrex::Real dt);
373  void EvolveB ( amrex::Real dt, DtType dt_type);
374  void EvolveB (int lev, amrex::Real dt, DtType dt_type);
375  void EvolveF ( amrex::Real dt, DtType dt_type);
376  void EvolveF (int lev, amrex::Real dt, DtType dt_type);
377  void EvolveG ( amrex::Real dt, DtType dt_type);
378  void EvolveG (int lev, amrex::Real dt, DtType dt_type);
379  void EvolveB (int lev, PatchType patch_type, amrex::Real dt, DtType dt_type);
380  void EvolveE (int lev, PatchType patch_type, amrex::Real dt);
381  void EvolveF (int lev, PatchType patch_type, amrex::Real dt, DtType dt_type);
382  void EvolveG (int lev, PatchType patch_type, amrex::Real dt, DtType dt_type);
383 
384  void MacroscopicEvolveE ( amrex::Real dt);
385  void MacroscopicEvolveE (int lev, amrex::Real dt);
386  void MacroscopicEvolveE (int lev, PatchType patch_type, amrex::Real dt);
387 
391  void Hybrid_QED_Push ( amrex::Vector<amrex::Real> dt);
392 
397  void Hybrid_QED_Push (int lev, amrex::Real dt);
398 
404  void Hybrid_QED_Push (int lev, PatchType patch_type, amrex::Real dt);
405 
406  static amrex::Real quantum_xi_c2;
407 
410  void LoadBalance ();
413  void ResetCosts ();
414 
417  IntervalsParser get_load_balance_intervals () const {return load_balance_intervals;}
418 
426  void DampFieldsInGuards (std::array<std::unique_ptr<amrex::MultiFab>,3>& Efield,
427  std::array<std::unique_ptr<amrex::MultiFab>,3>& Bfield);
428 
429 #ifdef WARPX_DIM_RZ
430  void ApplyInverseVolumeScalingToCurrentDensity(amrex::MultiFab* Jx,
431  amrex::MultiFab* Jy,
432  amrex::MultiFab* Jz,
433  int lev);
434 
435  void ApplyInverseVolumeScalingToChargeDensity(amrex::MultiFab* Rho,
436  int lev);
437 #endif
438 
439  void ApplyEfieldBoundary (const int lev, PatchType patch_type);
440  void ApplyBfieldBoundary (const int lev, PatchType patch_type, DtType dt_type);
441 
442  void DampPML ();
443  void DampPML (int lev);
444  void DampPML (int lev, PatchType patch_type);
445 
446  void DampJPML ();
447  void DampJPML (int lev);
448  void DampJPML (int lev, PatchType patch_type);
449 
450  void CopyJPML ();
451  bool isAnyBoundaryPML();
452 
456  void NodalSyncPML ();
457 
461  void NodalSyncPML (int lev);
462 
466  void NodalSyncPML (int lev, PatchType patch_type);
467 
468  PML* GetPML (int lev);
469 
471  void doFieldIonization ();
475  void doFieldIonization (int lev);
476 
477 #ifdef WARPX_QED
478 
479  void doQEDEvents ();
483  void doQEDEvents (int lev);
484 #endif
485 
486  void PushParticlesandDepose (int lev, amrex::Real cur_time, DtType a_dt_type=DtType::Full, bool skip_current=false);
487  void PushParticlesandDepose ( amrex::Real cur_time, bool skip_current=false);
488 
489  // This function does aux(lev) = fp(lev) + I(aux(lev-1)-cp(lev)).
490  // Caller must make sure fp and cp have ghost cells filled.
491  void UpdateAuxilaryData ();
492  void UpdateAuxilaryDataStagToNodal ();
493  void UpdateAuxilaryDataSameType ();
494 
503  void UpdateCurrentNodalToStag (amrex::MultiFab& dst, amrex::MultiFab const& src);
504 
505  // Fill boundary cells including coarse/fine boundaries
506  void FillBoundaryB (amrex::IntVect ng);
507  void FillBoundaryE (amrex::IntVect ng);
508  void FillBoundaryB_avg (amrex::IntVect ng);
509  void FillBoundaryE_avg (amrex::IntVect ng);
510 
511  void FillBoundaryF (amrex::IntVect ng);
512  void FillBoundaryG (amrex::IntVect ng);
513  void FillBoundaryAux (amrex::IntVect ng);
514  void FillBoundaryE (int lev, amrex::IntVect ng);
515  void FillBoundaryB (int lev, amrex::IntVect ng);
516  void FillBoundaryE_avg (int lev, amrex::IntVect ng);
517  void FillBoundaryB_avg (int lev, amrex::IntVect ng);
518 
519  void FillBoundaryF (int lev, amrex::IntVect ng);
520  void FillBoundaryG (int lev, amrex::IntVect ng);
521  void FillBoundaryAux (int lev, amrex::IntVect ng);
522 
523  void SyncCurrent ();
524  void SyncRho ();
525 
526  amrex::Vector<int> getnsubsteps () const {return nsubsteps;}
527  int getnsubsteps (int lev) const {return nsubsteps[lev];}
528  amrex::Vector<int> getistep () const {return istep;}
529  int getistep (int lev) const {return istep[lev];}
530  void setistep (int lev, int ii) {istep[lev] = ii;}
531  amrex::Vector<amrex::Real> gett_old () const {return t_old;}
532  amrex::Real gett_old (int lev) const {return t_old[lev];}
533  amrex::Vector<amrex::Real> gett_new () const {return t_new;}
534  amrex::Real gett_new (int lev) const {return t_new[lev];}
535  void sett_new (int lev, amrex::Real time) {t_new[lev] = time;}
536  amrex::Vector<amrex::Real> getdt () const {return dt;}
537  amrex::Real getdt (int lev) const {return dt[lev];}
538  int getdo_moving_window() const {return do_moving_window;}
539  amrex::Real getmoving_window_x() const {return moving_window_x;}
540  amrex::Real getcurrent_injection_position () const {return current_injection_position;}
541  bool getis_synchronized() const {return is_synchronized;}
542 
543  int maxStep () const {return max_step;}
544  amrex::Real stopTime () const {return stop_time;}
545 
546  void AverageAndPackFields( amrex::Vector<std::string>& varnames,
547  amrex::Vector<amrex::MultiFab>& mf_avg, const amrex::IntVect ngrow) const;
548 
549  void prepareFields( int const step, amrex::Vector<std::string>& varnames,
550  amrex::Vector<amrex::MultiFab>& mf_avg,
551  amrex::Vector<const amrex::MultiFab*>& output_mf,
552  amrex::Vector<amrex::Geometry>& output_geom ) const;
553 
554  static std::array<amrex::Real,3> CellSize (int lev);
555  static amrex::RealBox getRealBox(const amrex::Box& bx, int lev);
556  static std::array<amrex::Real,3> LowerCorner (const amrex::Box& bx,
557  std::array<amrex::Real,3> galilean_shift, int lev);
558  static std::array<amrex::Real,3> UpperCorner (const amrex::Box& bx, int lev);
559 
560  /*
561  /brief This computes the lower of the problem domain, taking into account any shift when using the Galilean algorithm.
562  */
563  std::array<amrex::Real,3> LowerCornerWithGalilean (const amrex::Box& bx, const amrex::Array<amrex::Real,3>& v_galilean, int lev);
564 
565  static amrex::IntVect RefRatio (int lev);
566 
567  static const amrex::iMultiFab* CurrentBufferMasks (int lev);
568  static const amrex::iMultiFab* GatherBufferMasks (int lev);
569 
570  static int do_electrostatic;
571 
572  // Parameters for lab frame electrostatic
573  static amrex::Real self_fields_required_precision;
576 
577  static int do_moving_window; // boolean
578  static int start_moving_window_step; // the first step to move window
579  static int end_moving_window_step; // the last step to move window
585  static int moving_window_active (int const step) {
586  bool const step_before_end = (step < end_moving_window_step) || (end_moving_window_step < 0);
587  bool const step_after_start = (step >= start_moving_window_step);
588  return do_moving_window && step_before_end && step_after_start;
589  }
590  static int moving_window_dir;
591  static amrex::Real moving_window_v;
593 
594  // slice generation //
596  static amrex::Real dt_slice_snapshots_lab;
597  static amrex::Real particle_slice_width_lab;
598  amrex::RealBox getSliceRealBox() const {return slice_realbox;}
599 
600  // these should be private, but can't due to Cuda limitations
601  static void ComputeDivB (amrex::MultiFab& divB, int const dcomp,
602  const std::array<const amrex::MultiFab* const, 3>& B,
603  const std::array<amrex::Real,3>& dx);
604 
605  static void ComputeDivB (amrex::MultiFab& divB, int const dcomp,
606  const std::array<const amrex::MultiFab* const, 3>& B,
607  const std::array<amrex::Real,3>& dx, amrex::IntVect const ngrow);
608 
609  void ComputeDivE(amrex::MultiFab& divE, const int lev);
610 
611  const amrex::IntVect getngE() const { return guard_cells.ng_alloc_EB; }
612  const amrex::IntVect getngF() const { return guard_cells.ng_alloc_F; }
613  const amrex::IntVect getngUpdateAux() const { return guard_cells.ng_UpdateAux; }
614  const amrex::IntVect get_ng_depos_J() const {return guard_cells.ng_depos_J;}
615  const amrex::IntVect get_ng_depos_rho() const {return guard_cells.ng_depos_rho;}
616 
624  const amrex::IntVect get_numprocs() const {return numprocs;}
625 
627  void ComputeSpaceChargeField (bool const reset_fields);
628  void AddSpaceChargeField (WarpXParticleContainer& pc);
629  void AddSpaceChargeFieldLabFrame ();
630  void computePhi (const amrex::Vector<std::unique_ptr<amrex::MultiFab> >& rho,
631  amrex::Vector<std::unique_ptr<amrex::MultiFab> >& phi,
632  std::array<amrex::Real, 3> const beta = {{0,0,0}},
633  amrex::Real const required_precision=amrex::Real(1.e-11),
634  const int max_iters=200,
635  const int verbosity=2) const;
636  void computePhiRZ (const amrex::Vector<std::unique_ptr<amrex::MultiFab> >& rho,
637  amrex::Vector<std::unique_ptr<amrex::MultiFab> >& phi,
638  std::array<amrex::Real, 3> const beta,
639  amrex::Real const required_precision,
640  int const max_iters,
641  int const verbosity) const;
642  void computePhiCartesian (const amrex::Vector<std::unique_ptr<amrex::MultiFab> >& rho,
643  amrex::Vector<std::unique_ptr<amrex::MultiFab> >& phi,
644  std::array<amrex::Real, 3> const beta,
645  amrex::Real const required_precision,
646  int const max_iters,
647  int const verbosity) const;
648 
649  void setPhiBC (amrex::Vector<std::unique_ptr<amrex::MultiFab> >& phi,
650  std::array<bool,AMREX_SPACEDIM> dirichlet_flag,
651  amrex::Array<amrex::Real,AMREX_SPACEDIM> phi_bc_values_lo,
652  amrex::Array<amrex::Real,AMREX_SPACEDIM> phi_bc_values_hi
653  ) const;
654  void getPhiBC (const int idim, amrex::Real &pot_lo,
655  amrex::Real &pot_hi) const;
656 
657  void computeE (amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>, 3> >& E,
658  const amrex::Vector<std::unique_ptr<amrex::MultiFab> >& phi,
659  std::array<amrex::Real, 3> const beta = {{0,0,0}} ) const;
660  void computeB (amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>, 3> >& B,
661  const amrex::Vector<std::unique_ptr<amrex::MultiFab> >& phi,
662  std::array<amrex::Real, 3> const beta = {{0,0,0}} ) const;
663 
682  void InitializeExternalFieldsOnGridUsingParser (
683  amrex::MultiFab *mfx, amrex::MultiFab *mfy, amrex::MultiFab *mfz,
684  amrex::ParserExecutor<3> const& xfield_parser,
685  amrex::ParserExecutor<3> const& yfield_parser,
686  amrex::ParserExecutor<3> const& zfield_parser,
687  std::array< std::unique_ptr<amrex::MultiFab>, 3 > const& geom_data, const int lev);
688 
694  void ComputeCostsHeuristic (amrex::Vector<std::unique_ptr<amrex::LayoutData<amrex::Real> > >& costs);
695 
696  void ApplyFilterandSumBoundaryRho (int lev, int glev, amrex::MultiFab& rho, int icomp, int ncomp);
697 
698 #ifdef WARPX_USE_PSATD
699  // Device vectors of stencil coefficients used for finite-order centering of fields
700  amrex::Gpu::DeviceVector<amrex::Real> device_field_centering_stencil_coeffs_x;
701  amrex::Gpu::DeviceVector<amrex::Real> device_field_centering_stencil_coeffs_y;
702  amrex::Gpu::DeviceVector<amrex::Real> device_field_centering_stencil_coeffs_z;
703  // Device vectors of stencil coefficients used for finite-order centering of currents
704  amrex::Gpu::DeviceVector<amrex::Real> device_current_centering_stencil_coeffs_x;
705  amrex::Gpu::DeviceVector<amrex::Real> device_current_centering_stencil_coeffs_y;
706  amrex::Gpu::DeviceVector<amrex::Real> device_current_centering_stencil_coeffs_z;
707 #endif
708 
709 protected:
710 
736  void InitLevelData (int lev, amrex::Real time);
737 
739  virtual void ErrorEst (int lev, amrex::TagBoxArray& tags, amrex::Real time, int /*ngrow*/) final;
740 
743  virtual void PostProcessBaseGrids (amrex::BoxArray& ba0) const final;
744 
748  virtual void MakeNewLevelFromScratch (int lev, amrex::Real time, const amrex::BoxArray& ba,
749  const amrex::DistributionMapping& dm) final;
750 
754  virtual void MakeNewLevelFromCoarse (int /*lev*/, amrex::Real /*time*/, const amrex::BoxArray& /*ba*/,
755  const amrex::DistributionMapping& /*dm*/) final
756  { amrex::Abort("MakeNewLevelFromCoarse: To be implemented"); }
757 
761  virtual void RemakeLevel (int lev, amrex::Real time, const amrex::BoxArray& ba,
762  const amrex::DistributionMapping& dm) final;
763 
765  virtual void ClearLevel (int lev) final;
766 
767 private:
768 
769  // Singleton is used when the code is run from python
770  static WarpX* m_instance;
771 
775  void EvolveEM(int numsteps);
776 
777  void FillBoundaryB (int lev, PatchType patch_type, amrex::IntVect ng);
778  void FillBoundaryE (int lev, PatchType patch_type, amrex::IntVect ng);
779  void FillBoundaryF (int lev, PatchType patch_type, amrex::IntVect ng);
780  void FillBoundaryG (int lev, PatchType patch_type, amrex::IntVect ng);
781 
782  void FillBoundaryB_avg (int lev, PatchType patch_type, amrex::IntVect ng);
783  void FillBoundaryE_avg (int lev, PatchType patch_type, amrex::IntVect ng);
784 
788  void NodalSyncE ();
789 
793  void NodalSyncE (int lev);
794 
798  void NodalSyncE (int lev, PatchType patch_type);
799 
803  void NodalSyncB ();
804 
808  void NodalSyncB (int lev);
809 
813  void NodalSyncB (int lev, PatchType patch_type);
814 
815  void OneStep_nosub (amrex::Real t);
816  void OneStep_sub1 (amrex::Real t);
817 
821  void OneStep_multiJ (const amrex::Real t);
822 
823  void RestrictCurrentFromFineToCoarsePatch (int lev);
824  void AddCurrentFromFineLevelandSumBoundary (int lev);
825  void StoreCurrent (int lev);
826  void RestoreCurrent (int lev);
827  void ApplyFilterandSumBoundaryJ (int lev, PatchType patch_type);
828  void NodalSyncJ (int lev, PatchType patch_type);
829 
830  void RestrictRhoFromFineToCoarsePatch (int lev);
831  void ApplyFilterandSumBoundaryRho (int lev, PatchType patch_type, int icomp, int ncomp);
832  void AddRhoFromFineLevelandSumBoundary (int lev, int icomp, int ncomp);
833  void NodalSyncRho (int lev, PatchType patch_type, int icomp, int ncomp);
834 
842  void CurrentCorrection ();
843 
851  void VayDeposition ();
852 
853  void ReadParameters ();
854 
857  void BackwardCompatibility ();
858 
859  void InitFromScratch ();
860 
861  void AllocLevelData (int lev, const amrex::BoxArray& new_grids,
862  const amrex::DistributionMapping& new_dmap);
863 
864  amrex::DistributionMapping
865  GetRestartDMap (const std::string& chkfile, const amrex::BoxArray& ba, int lev) const;
866 
867  void InitFromCheckpoint ();
868  void PostRestart ();
869 
870  void InitPML ();
871  void ComputePMLFactors ();
872 
873  void InitFilter ();
874 
875  void InitDiagnostics ();
876 
877  void InitNCICorrector ();
878 
883  void CheckGuardCells();
884 
889  void CheckGuardCells(amrex::MultiFab const& mf);
890 
892  void PerformanceHints ();
893 
894  std::unique_ptr<amrex::MultiFab> GetCellCenteredData();
895 
896  void BuildBufferMasks ();
897  void BuildBufferMasksInBox ( const amrex::Box tbx, amrex::IArrayBox &buffer_mask,
898  const amrex::IArrayBox &guard_mask, const int ng );
899  const amrex::iMultiFab* getCurrentBufferMasks (int lev) const {
900  return current_buffer_masks[lev].get();
901  }
902  const amrex::iMultiFab* getGatherBufferMasks (int lev) const {
903  return gather_buffer_masks[lev].get();
904  }
905 
906 #ifdef WARPX_USE_PSATD
907 
916  void ReorderFornbergCoefficients (amrex::Vector<amrex::Real>& ordered_coeffs,
917  amrex::Vector<amrex::Real>& unordered_coeffs,
918  const int order);
930  void AllocateCenteringCoefficients (amrex::Gpu::DeviceVector<amrex::Real>& device_centering_stencil_coeffs_x,
931  amrex::Gpu::DeviceVector<amrex::Real>& device_centering_stencil_coeffs_y,
932  amrex::Gpu::DeviceVector<amrex::Real>& device_centering_stencil_coeffs_z,
933  const int centering_nox,
934  const int centering_noy,
935  const int centering_noz);
936 #endif
937 
938  void AllocLevelMFs (int lev, const amrex::BoxArray& ba, const amrex::DistributionMapping& dm,
939  const amrex::IntVect& ngE, const amrex::IntVect& ngJ,
940  const amrex::IntVect& ngRho, const amrex::IntVect& ngF,
941  const amrex::IntVect& ngG, const bool aux_is_nodal);
942 #ifdef WARPX_USE_PSATD
943 # ifdef WARPX_DIM_RZ
944  void AllocLevelSpectralSolverRZ (amrex::Vector<std::unique_ptr<SpectralSolverRZ>>& spectral_solver,
945  const int lev,
946  const amrex::BoxArray& realspace_ba,
947  const amrex::DistributionMapping& dm,
948  const std::array<amrex::Real,3>& dx);
949 # else
950  void AllocLevelSpectralSolver (amrex::Vector<std::unique_ptr<SpectralSolver>>& spectral_solver,
951  const int lev,
952  const amrex::BoxArray& realspace_ba,
953  const amrex::DistributionMapping& dm,
954  const std::array<amrex::Real,3>& dx,
955  const bool pml_flag=false);
956 # endif
957 #endif
958 
959  amrex::Vector<int> istep; // which step?
960  amrex::Vector<int> nsubsteps; // how many substeps on each level?
961 
962  amrex::Vector<amrex::Real> t_new;
963  amrex::Vector<amrex::Real> t_old;
964  amrex::Vector<amrex::Real> dt;
965 
966  // Particle container
967  std::unique_ptr<MultiParticleContainer> mypc;
968  std::unique_ptr<MultiDiagnostics> multi_diags;
969 
970  // Boosted Frame Diagnostics
971  std::unique_ptr<BackTransformedDiagnostic> myBFD;
972 
973  //
974  // Fields: First array for level, second for direction
975  //
976 
977  // Full solution
978  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3 > > Efield_aux;
979  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3 > > Bfield_aux;
980 
981  // Fine patch
982  amrex::Vector< std::unique_ptr<amrex::MultiFab> > F_fp;
983  amrex::Vector< std::unique_ptr<amrex::MultiFab> > G_fp;
984  amrex::Vector< std::unique_ptr<amrex::MultiFab> > rho_fp;
985  amrex::Vector< std::unique_ptr<amrex::MultiFab> > phi_fp;
986  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3 > > current_fp;
987  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3 > > Efield_fp;
988  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3 > > Bfield_fp;
989  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3 > > Efield_avg_fp;
990  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3 > > Bfield_avg_fp;
991 
992  //EB grid info
993  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3 > > Venl;
994  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3 > > m_edge_lengths;
995  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3 > > m_face_areas;
996  amrex::Vector<std::array< std::unique_ptr<amrex::iMultiFab>, 3 > > m_flag_info_face;
997  amrex::Vector<std::array< std::unique_ptr<amrex::iMultiFab>, 3 > > m_flag_ext_face;
998  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3 > > m_area_mod;
999  amrex::Vector<std::array< std::unique_ptr<amrex::LayoutData<FaceInfoBox> >, 3 > > m_borrowing;
1000 
1001  //This is just needed for the ECT solver
1002  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3 > > ECTRhofield;
1003 
1004  //EB level set
1005  amrex::Vector<std::unique_ptr<amrex::MultiFab> > m_distance_to_eb;
1006 
1007  // store fine patch
1008  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3 > > current_store;
1009 
1010  // Nodal MultiFab for nodal current deposition if warpx.do_current_centering = 1
1011  amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>> current_fp_nodal;
1012 
1013  // Coarse patch
1014  amrex::Vector< std::unique_ptr<amrex::MultiFab> > F_cp;
1015  amrex::Vector< std::unique_ptr<amrex::MultiFab> > G_cp;
1016  amrex::Vector< std::unique_ptr<amrex::MultiFab> > rho_cp;
1017  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3 > > current_cp;
1018  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3 > > Efield_cp;
1019  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3 > > Bfield_cp;
1020  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3 > > Efield_avg_cp;
1021  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3 > > Bfield_avg_cp;
1022 
1023  // Copy of the coarse aux
1024  amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>, 3 > > Efield_cax;
1025  amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>, 3 > > Bfield_cax;
1026  amrex::Vector<std::unique_ptr<amrex::iMultiFab> > current_buffer_masks;
1027  amrex::Vector<std::unique_ptr<amrex::iMultiFab> > gather_buffer_masks;
1028 
1029  // If charge/current deposition buffers are used
1030  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3 > > current_buf;
1031  amrex::Vector<std::unique_ptr<amrex::MultiFab> > charge_buf;
1032 
1033  // PML
1034  int do_pml = 0;
1035  int do_silver_mueller = 0;
1036  int pml_ncell = 10;
1037  int pml_delta = 10;
1038  int pml_has_particles = 0;
1039  int do_pml_j_damping = 0;
1040  int do_pml_in_domain = 0;
1041  bool do_pml_dive_cleaning; // default set in WarpX.cpp
1042  bool do_pml_divb_cleaning; // default set in WarpX.cpp
1043  amrex::IntVect do_pml_Lo = amrex::IntVect::TheZeroVector();
1044  amrex::IntVect do_pml_Hi = amrex::IntVect::TheZeroVector();
1045  amrex::Vector<std::unique_ptr<PML> > pml;
1046 
1047  amrex::Real moving_window_x = std::numeric_limits<amrex::Real>::max();
1048  amrex::Real current_injection_position = 0;
1049 
1050  // Plasma injection parameters
1051  int warpx_do_continuous_injection = 0;
1052  int num_injected_species = -1;
1053  amrex::Vector<int> injected_plasma_species;
1054 
1055  amrex::Real const_dt = amrex::Real(0.5e-11);
1056 
1057  // Macroscopic properties
1058  std::unique_ptr<MacroscopicProperties> m_macroscopic_properties;
1059 
1060 
1061  // Load balancing
1067  amrex::Vector<std::unique_ptr<amrex::LayoutData<amrex::Real> > > costs;
1069  int load_balance_with_sfc = 0;
1074  amrex::Real load_balance_knapsack_factor = amrex::Real(1.24);
1080  amrex::Real load_balance_efficiency_ratio_threshold = amrex::Real(1.1);
1082  amrex::Vector<amrex::Real> load_balance_efficiency;
1088  amrex::Real costs_heuristic_cells_wt = amrex::Real(-1);
1094  amrex::Real costs_heuristic_particles_wt = amrex::Real(-1);
1095 
1096  // Determines timesteps for override sync
1098 
1099  // Other runtime parameters
1100  int verbose = 1;
1101 
1102  bool use_hybrid_QED = 0;
1103 
1104  int max_step = std::numeric_limits<int>::max();
1105  amrex::Real stop_time = std::numeric_limits<amrex::Real>::max();
1106 
1107  int regrid_int = -1;
1108 
1109  amrex::Real cfl = amrex::Real(0.7);
1110 
1111  std::string restart_chkfile;
1112 
1113  amrex::VisMF::Header::Version plotfile_headerversion = amrex::VisMF::Header::Version_v1;
1114  amrex::VisMF::Header::Version slice_plotfile_headerversion = amrex::VisMF::Header::Version_v1;
1115 
1116  bool use_single_read = true;
1117  bool use_single_write = true;
1118  int mffile_nstreams = 4;
1119  int field_io_nfiles = 1024;
1120  int particle_io_nfiles = 1024;
1121 
1122  amrex::RealVect fine_tag_lo;
1123  amrex::RealVect fine_tag_hi;
1124 
1125  bool is_synchronized = true;
1126 
1128 
1129  //Slice Parameters
1131  int slice_plot_int = -1;
1132  amrex::RealBox slice_realbox;
1133  amrex::IntVect slice_cr_ratio;
1134  amrex::Vector< std::unique_ptr<amrex::MultiFab> > F_slice;
1135  amrex::Vector< std::unique_ptr<amrex::MultiFab> > G_slice;
1136  amrex::Vector< std::unique_ptr<amrex::MultiFab> > rho_slice;
1137  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3 > > current_slice;
1138  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3 > > Efield_slice;
1139  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3 > > Bfield_slice;
1140 
1141  bool fft_periodic_single_box = false;
1142  int nox_fft = 16;
1143  int noy_fft = 16;
1144  int noz_fft = 16;
1145 
1147  amrex::IntVect numprocs{0};
1148 
1150  std::unique_ptr<ParticleBoundaryBuffer> m_particle_boundary_buffer;
1151 
1152  //
1153  // Embedded Boundary
1154  //
1155 
1156  // Factory for field data
1157  amrex::Vector<std::unique_ptr<amrex::FabFactory<amrex::FArrayBox> > > m_field_factory;
1158 
1159  amrex::FabFactory<amrex::FArrayBox> const& fieldFactory (int lev) const noexcept {
1160  return *m_field_factory[lev];
1161  }
1162 #ifdef AMREX_USE_EB
1163  amrex::EBFArrayBoxFactory const& fieldEBFactory (int lev) const noexcept {
1164  return static_cast<amrex::EBFArrayBoxFactory const&>(*m_field_factory[lev]);
1165  }
1166 #endif
1167 
1168 public:
1169  void InitEB ();
1175 public:
1176  void ComputeEdgeLengths ();
1181  void ComputeFaceAreas ();
1185  void ScaleEdges ();
1189  void ScaleAreas ();
1198  void MarkCells();
1202  void ComputeDistanceToEB ();
1206  amrex::Array1D<int, 0, 2> CountExtFaces();
1211  void ComputeFaceExtensions();
1215  void InitBorrowing();
1219  void ShrinkBorrowing();
1223  void ComputeOneWayExtensions();
1227  void ComputeEightWaysExtensions();
1228 
1229 
1230 private:
1231  void ScrapeParticles ();
1232 
1233  void PushPSATD ();
1234 
1235 #ifdef WARPX_USE_PSATD
1236 
1240  void PSATDForwardTransformEB ();
1241 
1246  void PSATDBackwardTransformEB ();
1247 
1251  void PSATDBackwardTransformEBavg ();
1252 
1257  void PSATDForwardTransformJ ();
1258 
1266  void PSATDForwardTransformRho (const int icomp, const int dcomp);
1267 
1271  void PSATDMoveRhoNewToRhoOld ();
1272 
1276  void PSATDMoveJNewToJOld ();
1277 
1281  void PSATDForwardTransformF ();
1282 
1286  void PSATDBackwardTransformF ();
1287 
1291  void PSATDForwardTransformG ();
1292 
1296  void PSATDBackwardTransformG ();
1297 
1301  void PSATDPushSpectralFields ();
1302 
1308  void PSATDScaleAverageFields (const amrex::Real scale_factor);
1309 
1313  void PSATDEraseAverageFields ();
1314 #endif
1315 
1316  int fftw_plan_measure = 1; // used with PSATD
1317 
1318 #ifdef WARPX_USE_PSATD
1319 # ifdef WARPX_DIM_RZ
1320  amrex::Vector<std::unique_ptr<SpectralSolverRZ>> spectral_solver_fp;
1321  amrex::Vector<std::unique_ptr<SpectralSolverRZ>> spectral_solver_cp;
1322 # else
1323  amrex::Vector<std::unique_ptr<SpectralSolver>> spectral_solver_fp;
1324  amrex::Vector<std::unique_ptr<SpectralSolver>> spectral_solver_cp;
1325 # endif
1326 
1327 public:
1328 
1329 # ifdef WARPX_DIM_RZ
1331 # else
1333 # endif
1334  get_spectral_solver_fp (int lev) {return *spectral_solver_fp[lev];}
1335 #endif
1336 
1337 private:
1338  amrex::Vector<std::unique_ptr<FiniteDifferenceSolver>> m_fdtd_solver_fp;
1339  amrex::Vector<std::unique_ptr<FiniteDifferenceSolver>> m_fdtd_solver_cp;
1340 };
1341 
1342 #endif
static std::string str_Bz_ext_grid_function
Definition: WarpX.H:124
amrex::Gpu::DeviceVector< amrex::Real > device_current_centering_stencil_coeffs_y
Definition: WarpX.H:705
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_fp
Definition: WarpX.H:986
static bool fft_do_time_averaging
Definition: WarpX.H:592
static int moving_window_dir
Definition: WarpX.H:590
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_fp
Definition: WarpX.H:988
amrex::Vector< std::unique_ptr< NCIGodfreyFilter > > nci_godfrey_filter_bxbyez
Definition: WarpX.H:324
amrex::Vector< amrex::Real > getdt() const
Definition: WarpX.H:536
amrex::Vector< int > getistep() const
Definition: WarpX.H:528
static bool do_back_transformed_diagnostics
Definition: WarpX.H:200
static int do_subcycling
Definition: WarpX.H:220
amrex::FabFactory< amrex::FArrayBox > const & fieldFactory(int lev) const noexcept
Definition: WarpX.H:1159
DtType
Definition: WarpXDtType.H:10
amrex::Vector< std::unique_ptr< SpectralSolverRZ > > spectral_solver_cp
Definition: WarpX.H:1321
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_avg_cp
Definition: WarpX.H:1020
static bool refine_plasma
Definition: WarpX.H:215
amrex::RealVect fine_tag_hi
Definition: WarpX.H:1123
static long particle_pusher_algo
Definition: WarpX.H:143
static int do_moving_window
Definition: WarpX.H:577
bool do_pml_dive_cleaning
Definition: WarpX.H:1041
static bool do_back_transformed_particles
Definition: WarpX.H:205
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_avg_fp
Definition: WarpX.H:990
static long load_balance_costs_update_algo
Definition: WarpX.H:145
This class is a parser for multiple slices of the form x,y,z,... where x, y and z are slices of the f...
Definition: IntervalsParser.H:82
static amrex::Vector< int > field_boundary_lo
Definition: WarpX.H:148
void PushPSATD(const int lev)
Definition: PML.cpp:1201
static amrex::Real self_fields_required_precision
Definition: WarpX.H:573
const amrex::MultiFab & getrho_fp(int lev)
Definition: WarpX.H:282
amrex::Vector< int > injected_plasma_species
Definition: WarpX.H:1053
std::unique_ptr< SpectralSolver > spectral_solver_cp
Definition: PML.H:217
static WarpX * m_instance
Definition: WarpX.H:770
static amrex::Vector< int > boost_direction
Definition: WarpX.H:210
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_store
Definition: WarpX.H:1008
amrex::Vector< std::array< std::unique_ptr< amrex::iMultiFab >, 3 > > m_flag_info_face
Definition: WarpX.H:996
amrex::Vector< std::array< std::unique_ptr< amrex::LayoutData< FaceInfoBox > >, 3 > > m_borrowing
Definition: WarpX.H:999
amrex::Real gett_new(int lev) const
Definition: WarpX.H:534
static int num_slice_snapshots_lab
Definition: WarpX.H:595
int maxStep() const
Definition: WarpX.H:543
void ComputePMLFactors(amrex::Real dt)
Definition: PML.cpp:798
amrex::Vector< std::unique_ptr< amrex::MultiFab > > F_cp
Definition: WarpX.H:1014
MultiParticleContainer & GetPartContainer()
Definition: WarpX.H:100
void sett_new(int lev, amrex::Real time)
Definition: WarpX.H:535
const amrex::MultiFab & getBfield_cp(int lev, int direction)
Definition: WarpX.H:276
std::unique_ptr< amrex::Parser > Bxfield_parser
Definition: WarpX.H:131
Definition: ParticleBoundaryBuffer.H:18
const amrex::MultiFab & getG_fp(int lev)
Definition: WarpX.H:285
const amrex::MultiFab & getEfield_fp(int lev, int direction)
Definition: WarpX.H:280
std::unique_ptr< MultiDiagnostics > multi_diags
Definition: WarpX.H:968
void setLoadBalanceEfficiency(const int lev, const amrex::Real efficiency)
Definition: WarpX.H:299
static int n_field_gather_buffer
Definition: WarpX.H:229
std::unique_ptr< MultiParticleContainer > mypc
Definition: WarpX.H:967
float cfl
Definition: yt3d_mpi.py:38
static bool do_current_centering
Definition: WarpX.H:155
static int noy
Definition: WarpX.H:174
amrex::Vector< std::array< std::unique_ptr< amrex::iMultiFab >, 3 > > m_flag_ext_face
Definition: WarpX.H:997
static int do_multi_J
Definition: WarpX.H:221
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_avg_cp
Definition: WarpX.H:1021
const amrex::MultiFab & getEfield(int lev, int direction)
Definition: WarpX.H:271
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_fp_nodal
Definition: WarpX.H:1011
IntervalsParser override_sync_intervals
Definition: WarpX.H:1097
amrex::Vector< std::unique_ptr< amrex::iMultiFab > > gather_buffer_masks
Definition: WarpX.H:1027
int dx
Definition: compute_domain.py:35
std::unique_ptr< amrex::Parser > Bzfield_parser
Definition: WarpX.H:133
amrex::Vector< std::unique_ptr< amrex::MultiFab > > rho_cp
Definition: WarpX.H:1016
amrex::MultiFab * get_pointer_rho_fp(int lev) const
Definition: WarpX.H:258
static amrex::Real moving_window_v
Definition: WarpX.H:591
static amrex::Real dt_slice_snapshots_lab
Definition: WarpX.H:596
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_cp
Definition: WarpX.H:1019
amrex::MultiFab * get_pointer_Efield_aux(int lev, int direction) const
Definition: WarpX.H:252
void FillBoundaryE()
Definition: PML.cpp:1060
static amrex::Real dt_snapshots_lab
Definition: WarpX.H:203
bool getis_synchronized() const
Definition: WarpX.H:541
SpectralSolverRZ & get_spectral_solver_fp(int lev)
Definition: WarpX.H:1334
Definition: MultiReducedDiags.H:24
const amrex::IntVect get_ng_depos_J() const
Definition: WarpX.H:614
amrex::MultiFab * get_pointer_Efield_cp(int lev, int direction) const
Definition: WarpX.H:263
Definition: MultiParticleContainer.H:64
bool DoPML() const
Definition: WarpX.H:292
static amrex::Real particle_slice_width_lab
Definition: WarpX.H:597
static int current_centering_nox
Definition: WarpX.H:183
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_buf
Definition: WarpX.H:1030
IntervalsParser load_balance_intervals
Definition: WarpX.H:1064
amrex::RealBox slice_realbox
Definition: WarpX.H:1132
amrex::Vector< std::unique_ptr< amrex::MultiFab > > charge_buf
Definition: WarpX.H:1031
static std::string lab_data_directory
Definition: WarpX.H:201
amrex::MultiFab * get_pointer_Bfield_fp(int lev, int direction) const
Definition: WarpX.H:256
amrex::Vector< std::unique_ptr< amrex::LayoutData< amrex::Real > > > costs
Definition: WarpX.H:1067
const amrex::MultiFab & getF_fp(int lev)
Definition: WarpX.H:284
static int em_solver_medium
Definition: WarpX.H:146
const amrex::MultiFab & getrho_cp(int lev)
Definition: WarpX.H:277
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > m_area_mod
Definition: WarpX.H:998
static std::string str_Ez_ext_grid_function
Definition: WarpX.H:128
amrex::Vector< int > istep
Definition: WarpX.H:959
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_aux
Definition: WarpX.H:978
amrex::MultiFab * get_pointer_rho_cp(int lev) const
Definition: WarpX.H:266
std::unique_ptr< amrex::Parser > Byfield_parser
Definition: WarpX.H:132
static int num_mirrors
Definition: WarpX.H:332
amrex::Vector< std::unique_ptr< amrex::iMultiFab > > current_buffer_masks
Definition: WarpX.H:1026
static amrex::Vector< ParticleBoundaryType > particle_boundary_hi
Definition: WarpX.H:151
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_avg_fp
Definition: WarpX.H:989
static int do_electrostatic
Definition: WarpX.H:570
static long charge_deposition_algo
Definition: WarpX.H:141
const amrex::iMultiFab * getGatherBufferMasks(int lev) const
Definition: WarpX.H:902
amrex::Vector< std::unique_ptr< amrex::MultiFab > > F_fp
Definition: WarpX.H:982
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_slice
Definition: WarpX.H:1139
amrex::Vector< int > mirror_z_npoints
Definition: WarpX.H:335
void FillBoundaryF()
Definition: PML.cpp:1108
amrex::Vector< amrex::Real > gett_old() const
Definition: WarpX.H:531
amrex::Real getdt(int lev) const
Definition: WarpX.H:537
static IntervalsParser sort_intervals
Definition: WarpX.H:217
amrex::Real getLoadBalanceEfficiency(const int lev)
Definition: WarpX.H:310
static int do_multi_J_n_depositions
Definition: WarpX.H:222
direction
Definition: AnyFFT.H:74
BilinearFilter bilinear_filter
Definition: WarpX.H:322
static int n_current_deposition_buffer
in number of cells from the edge (identical for each dimension)
Definition: WarpX.H:230
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_cp
Definition: WarpX.H:1017
amrex::Vector< std::unique_ptr< amrex::MultiFab > > m_distance_to_eb
Definition: WarpX.H:1005
static bool use_fdtd_nci_corr
Definition: WarpX.H:191
static int start_moving_window_step
Definition: WarpX.H:578
static int moving_window_active(int const step)
Definition: WarpX.H:585
static amrex::Real gamma_boost
Definition: WarpX.H:208
amrex::Vector< amrex::Real > t_new
Definition: WarpX.H:962
amrex::MultiFab * get_pointer_phi_fp(int lev) const
Definition: WarpX.H:261
amrex::Vector< std::unique_ptr< amrex::MultiFab > > G_slice
Definition: WarpX.H:1135
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_slice
Definition: WarpX.H:1138
int getnsubsteps(int lev) const
Definition: WarpX.H:527
static amrex::Vector< amrex::Real > E_external_grid
Definition: WarpX.H:114
void FillBoundaryG()
Definition: PML.cpp:1130
amrex::Vector< std::unique_ptr< amrex::MultiFab > > G_cp
Definition: WarpX.H:1015
Definition: PML.H:109
std::array< const amrex::MultiFab *const, 3 > get_array_Efield_aux(const int lev) const
Definition: WarpX.H:244
static amrex::Real beta_boost
Definition: WarpX.H:209
static bool do_dive_cleaning
Definition: WarpX.H:169
amrex::Vector< amrex::Real > dt
Definition: WarpX.H:964
std::unique_ptr< amrex::Parser > Exfield_parser
Definition: WarpX.H:135
std::array< const amrex::MultiFab *const, 3 > get_array_Bfield_aux(const int lev) const
Definition: WarpX.H:236
amrex::MultiFab * get_pointer_G_fp(int lev) const
Definition: WarpX.H:260
static int field_centering_noz
Definition: WarpX.H:180
amrex::Real stopTime() const
Definition: WarpX.H:544
static bool do_back_transformed_fields
Definition: WarpX.H:204
const amrex::MultiFab & getBfield_avg_cp(int lev, int direction)
Definition: WarpX.H:290
static std::string E_ext_grid_s
Definition: WarpX.H:119
amrex::Vector< std::unique_ptr< SpectralSolverRZ > > spectral_solver_fp
Definition: WarpX.H:1320
const amrex::IntVect get_ng_depos_rho() const
Definition: WarpX.H:615
static bool use_filter
Definition: WarpX.H:194
int getdo_moving_window() const
Definition: WarpX.H:538
amrex::Gpu::DeviceVector< amrex::Real > device_field_centering_stencil_coeffs_y
Definition: WarpX.H:701
amrex::Vector< amrex::Real > load_balance_efficiency
Definition: WarpX.H:1082
ii
Definition: check_interp_points_and_weights.py:145
Definition: BilinearFilter.H:16
amrex::Vector< std::unique_ptr< PML > > pml
Definition: WarpX.H:1045
static amrex::Real zmax_plasma_to_compute_max_step
Definition: WarpX.H:211
amrex::Gpu::DeviceVector< amrex::Real > device_field_centering_stencil_coeffs_x
Definition: WarpX.H:700
amrex::Vector< std::unique_ptr< amrex::MultiFab > > phi_fp
Definition: WarpX.H:985
const amrex::MultiFab & getBfield_fp(int lev, int direction)
Definition: WarpX.H:281
amrex::MultiFab * get_pointer_Bfield_cp(int lev, int direction) const
Definition: WarpX.H:264
amrex::MultiFab * get_pointer_G_cp(int lev) const
Definition: WarpX.H:268
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > m_edge_lengths
Definition: WarpX.H:994
Definition: WarpX.H:77
amrex::MultiFab * get_pointer_current_fp(int lev, int direction) const
Definition: WarpX.H:257
const amrex::MultiFab & getcurrent(int lev, int direction)
Definition: WarpX.H:270
const amrex::MultiFab & getEfield_avg_cp(int lev, int direction)
Definition: WarpX.H:289
static int self_fields_verbosity
Definition: WarpX.H:575
static int field_centering_noy
Definition: WarpX.H:179
const amrex::MultiFab & getBfield(int lev, int direction)
Definition: WarpX.H:272
const amrex::IntVect get_numprocs() const
Definition: WarpX.H:624
std::unique_ptr< MacroscopicProperties > m_macroscopic_properties
Definition: WarpX.H:1058
static amrex::Real quantum_xi_c2
Definition: WarpX.H:406
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_cp
Definition: WarpX.H:1018
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > m_face_areas
Definition: WarpX.H:995
const amrex::IntVect getngUpdateAux() const
Definition: WarpX.H:613
amrex::RealVect fine_tag_lo
Definition: WarpX.H:1122
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_cax
Definition: WarpX.H:1024
static int n_rz_azimuthal_modes
Definition: WarpX.H:188
void FillBoundaryB()
Definition: PML.cpp:1084
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_slice
Definition: WarpX.H:1137
ParticleBoundaryBuffer & GetParticleBoundaryBuffer()
Definition: WarpX.H:102
const amrex::IntVect getngF() const
Definition: WarpX.H:612
static std::string str_Bx_ext_grid_function
Definition: WarpX.H:122
amrex::RealBox getSliceRealBox() const
Definition: WarpX.H:598
std::unique_ptr< ParticleBoundaryBuffer > m_particle_boundary_buffer
particle buffer for scraped particles on the boundaries
Definition: WarpX.H:1150
const amrex::MultiFab & getEfield_avg_fp(int lev, int direction)
Definition: WarpX.H:287
amrex::Gpu::DeviceVector< amrex::Real > device_current_centering_stencil_coeffs_z
Definition: WarpX.H:706
static int ncomps
Definition: WarpX.H:189
int getistep(int lev) const
Definition: WarpX.H:529
bool do_pml_divb_cleaning
Definition: WarpX.H:1042
amrex::Gpu::DeviceVector< amrex::Real > device_current_centering_stencil_coeffs_x
Definition: WarpX.H:704
std::unique_ptr< amrex::Parser > Eyfield_parser
Definition: WarpX.H:136
static bool use_kspace_filter
Definition: WarpX.H:195
static bool use_filter_compensation
Definition: WarpX.H:196
static bool do_divb_cleaning
Definition: WarpX.H:170
static long current_deposition_algo
Definition: WarpX.H:140
amrex::Vector< std::unique_ptr< NCIGodfreyFilter > > nci_godfrey_filter_exeybz
Definition: WarpX.H:323
static bool do_device_synchronize_before_profile
Definition: WarpX.H:225
static int num_snapshots_lab
Definition: WarpX.H:202
amrex::Vector< int > getnsubsteps() const
Definition: WarpX.H:526
amrex::Gpu::DeviceVector< amrex::Real > device_field_centering_stencil_coeffs_z
Definition: WarpX.H:702
static amrex::IntVect fill_guards
Definition: WarpX.H:166
amrex::MultiFab * get_pointer_current_cp(int lev, int direction) const
Definition: WarpX.H:265
amrex::MultiFab * get_pointer_Efield_fp(int lev, int direction) const
Definition: WarpX.H:255
const amrex::MultiFab & getBfield_avg_fp(int lev, int direction)
Definition: WarpX.H:288
static int maxwell_solver_id
Definition: WarpX.H:144
std::unique_ptr< SpectralSolver > spectral_solver_fp
Definition: PML.H:216
static std::string str_Ex_ext_grid_function
Definition: WarpX.H:126
static bool serialize_ics
Definition: WarpX.H:197
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > ECTRhofield
Definition: WarpX.H:1002
amrex::Vector< amrex::Real > t_old
Definition: WarpX.H:963
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_cax
Definition: WarpX.H:1025
const amrex::IntVect getngE() const
Definition: WarpX.H:611
ElectrostaticSolver::BoundaryValueHandler field_boundary_value_handler
Definition: WarpX.H:626
static int current_centering_noy
Definition: WarpX.H:184
amrex::Vector< int > nsubsteps
Definition: WarpX.H:960
static int end_moving_window_step
Definition: WarpX.H:579
static long field_gathering_algo
Definition: WarpX.H:142
static amrex::IntVect filter_npass_each_dir
Definition: WarpX.H:321
static bool galerkin_interpolation
Definition: WarpX.H:192
static std::string str_Ey_ext_grid_function
Definition: WarpX.H:127
static int field_centering_nox
Definition: WarpX.H:178
amrex::IntVect slice_cr_ratio
Definition: WarpX.H:1133
amrex::Real getcurrent_injection_position() const
Definition: WarpX.H:540
amrex::MultiFab * get_pointer_Bfield_aux(int lev, int direction) const
Definition: WarpX.H:253
static int current_centering_noz
Definition: WarpX.H:185
static int nox
Definition: WarpX.H:173
static amrex::Vector< amrex::Real > B_external_grid
Definition: WarpX.H:115
amrex::Real getmoving_window_x() const
Definition: WarpX.H:539
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Venl
Definition: WarpX.H:993
const amrex::MultiFab & getphi_fp(int lev)
Definition: WarpX.H:283
amrex::Vector< std::unique_ptr< amrex::MultiFab > > G_fp
Definition: WarpX.H:983
static std::string B_ext_grid_s
Definition: WarpX.H:118
amrex::Vector< std::unique_ptr< FiniteDifferenceSolver > > m_fdtd_solver_fp
Definition: WarpX.H:1338
static std::string str_By_ext_grid_function
Definition: WarpX.H:123
static amrex::Vector< ParticleBoundaryType > particle_boundary_lo
Definition: WarpX.H:150
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_aux
Definition: WarpX.H:979
IntervalsParser get_load_balance_intervals() const
returns the load balance interval
Definition: WarpX.H:417
PatchType
Definition: WarpX.H:71
std::string restart_chkfile
Definition: WarpX.H:1111
int slice_max_grid_size
Definition: WarpX.H:1130
amrex::Vector< amrex::Real > mirror_z
Definition: WarpX.H:333
int Verbose() const
Definition: WarpX.H:93
static bool do_dynamic_scheduling
Definition: WarpX.H:214
static int macroscopic_solver_algo
Definition: WarpX.H:147
amrex::Vector< std::unique_ptr< amrex::MultiFab > > F_slice
Definition: WarpX.H:1134
static std::string authors
Author of an input file / simulation setup.
Definition: WarpX.H:111
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_fp
Definition: WarpX.H:987
static amrex::Vector< int > field_boundary_hi
Definition: WarpX.H:149
virtual void MakeNewLevelFromCoarse(int, amrex::Real, const amrex::BoxArray &, const amrex::DistributionMapping &) final
Definition: WarpX.H:754
static int do_nodal
in number of cells from the edge (identical for each dimension)
Definition: WarpX.H:233
static bool safe_guard_cells
Definition: WarpX.H:226
Definition: SpectralSolverRZ.H:21
amrex::Vector< std::unique_ptr< amrex::MultiFab > > rho_slice
Definition: WarpX.H:1136
const amrex::MultiFab & getcurrent_fp(int lev, int direction)
Definition: WarpX.H:279
static int self_fields_max_iters
Definition: WarpX.H:574
amrex::Vector< std::unique_ptr< FiniteDifferenceSolver > > m_fdtd_solver_cp
Definition: WarpX.H:1339
amrex::Vector< std::unique_ptr< amrex::FabFactory< amrex::FArrayBox > > > m_field_factory
Definition: WarpX.H:1157
Definition: ElectrostaticSolver.H:35
guardCellManager guard_cells
Definition: WarpX.H:1127
amrex::MultiFab * get_pointer_F_cp(int lev) const
Definition: WarpX.H:267
amrex::Real gett_old(int lev) const
Definition: WarpX.H:532
amrex::Vector< amrex::Real > mirror_z_width
Definition: WarpX.H:334
amrex::Vector< amrex::Real > gett_new() const
Definition: WarpX.H:533
std::unique_ptr< amrex::Parser > Ezfield_parser
Definition: WarpX.H:137
static int noz
Definition: WarpX.H:175
const amrex::MultiFab & getcurrent_cp(int lev, int direction)
Definition: WarpX.H:274
const amrex::MultiFab & getEfield_cp(int lev, int direction)
Definition: WarpX.H:275
void setistep(int lev, int ii)
Definition: WarpX.H:530
const amrex::iMultiFab * getCurrentBufferMasks(int lev) const
Definition: WarpX.H:899
amrex::Vector< std::unique_ptr< amrex::MultiFab > > rho_fp
Definition: WarpX.H:984
This class computes and stores the number of guard cells needed for the allocation of the MultiFabs a...
Definition: GuardCellManager.H:19
Definition: WarpXParticleContainer.H:110
static amrex::IntVect sort_bin_size
Definition: WarpX.H:218
static int J_linear_in_time
Definition: WarpX.H:223
static int do_compute_max_step_from_zmax
Definition: WarpX.H:212
MultiReducedDiags * reduced_diags
object with all reduced diagnotics, similar to MultiParticleContainer for species.
Definition: WarpX.H:338
amrex::MultiFab * get_pointer_F_fp(int lev) const
Definition: WarpX.H:259
std::unique_ptr< BackTransformedDiagnostic > myBFD
Definition: WarpX.H:971
Top-level class for the electromagnetic spectral solver.
Definition: SpectralSolver.H:32