ARTEMIS
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 
25 #ifdef WARPX_USE_PSATD
26 # ifdef WARPX_DIM_RZ
29 # else
31 # endif
32 #endif
33 #include "Evolve/WarpXDtType.H"
36 #include "Filter/BilinearFilter.H"
42 
43 #include <AMReX.H>
44 #include <AMReX_AmrCore.H>
45 #include <AMReX_Array.H>
46 #include <AMReX_Config.H>
47 #ifdef AMREX_USE_EB
48 # include <AMReX_EBFabFactory.H>
49 #endif
50 #include <AMReX_GpuContainers.H>
51 #include <AMReX_IntVect.H>
52 #include <AMReX_LayoutData.H>
53 #include <AMReX_Parser.H>
54 #include <AMReX_REAL.H>
55 #include <AMReX_RealBox.H>
56 #include <AMReX_RealVect.H>
57 #include <AMReX_Vector.H>
58 #include <AMReX_VisMF.H>
59 
60 #include <AMReX_BaseFwd.H>
61 #include <AMReX_AmrCoreFwd.H>
62 
63 #include <array>
64 #include <iostream>
65 #include <limits>
66 #include <memory>
67 #include <optional>
68 #include <string>
69 #include <vector>
70 #include <map>
71 
72 enum struct PatchType : int
73 {
74  fine,
75  coarse
76 };
77 
78 class WarpX
79  : public amrex::AmrCore
80 {
81 public:
82 
83  friend class PML;
84 
85  static WarpX& GetInstance ();
86  static void ResetInstance ();
87 
88  WarpX ();
89  ~WarpX ();
90 
91  static std::string Version ();
92  static std::string PicsarVersion ();
93 
94  int Verbose () const { return verbose; }
95 
96  void InitData ();
97 
98  void Evolve (int numsteps = -1);
99 
102  London& getLondon () { return *m_london; }
104 
106 
107  static void shiftMF (amrex::MultiFab& mf, const amrex::Geometry& geom,
108  int num_shift, int dir, const int lev, bool update_cost_flag,
109  amrex::Real external_field=0.0, bool useparser = false,
110  amrex::ParserExecutor<3> const& field_parser={});
111 
112  static void GotoNextLine (std::istream& is);
113 
115  static std::string authors;
116 
121 
122 #ifdef WARPX_MAG_LLG
123  static amrex::Vector<amrex::Real> H_external_grid;
124  static amrex::Vector<amrex::Real> M_external_grid;
125  static amrex::Vector<amrex::Real> H_bias_external_grid;
126 #endif
127 
129  static std::string B_ext_grid_s;
131  static std::string E_ext_grid_s;
132 
133  // Initialization Type for External E and B excitation on grid
134  static std::string B_excitation_grid_s;
135  static std::string E_excitation_grid_s;
136 #ifdef WARPX_MAG_LLG
137  static std::string H_excitation_grid_s;
138  static std::string H_bias_excitation_grid_s;
139 #endif
140 
141 #ifdef WARPX_MAG_LLG
142  static std::string H_ext_grid_s; // added for H;
143  static std::string M_ext_grid_s; // added for M;
144  static std::string H_bias_ext_grid_s;
145 #endif
148  static bool add_external_E_field;
150  static bool add_external_B_field;
151 
153  static std::string str_Bx_ext_grid_function;
155  static std::string str_By_ext_grid_function;
157  static std::string str_Bz_ext_grid_function;
159  static std::string str_Ex_ext_grid_function;
161  static std::string str_Ey_ext_grid_function;
163  static std::string str_Ez_ext_grid_function;
164 
165  // Function for B excitation (x,y,z,t) on the grid
169  // Function for E excitation (x,y,z,t) on the grid
173 #ifdef WARPX_MAG_LLG
174  // Function for H excitation (x,y,z,t) on the grid
175  static std::string str_Hx_excitation_grid_function;
176  static std::string str_Hy_excitation_grid_function;
177  static std::string str_Hz_excitation_grid_function;
178  // Function for H bias excitation (x,y,z,t) on the grid
179  static std::string str_Hx_bias_excitation_grid_function;
180  static std::string str_Hy_bias_excitation_grid_function;
181  static std::string str_Hz_bias_excitation_grid_function;
182 #endif
183  // Flag for type of excitation (hard/soft)
190 #ifdef WARPX_MAG_LLG
191  static std::string str_Hx_excitation_flag_function;
192  static std::string str_Hy_excitation_flag_function;
193  static std::string str_Hz_excitation_flag_function;
194  static std::string str_Hx_bias_excitation_flag_function;
195  static std::string str_Hy_bias_excitation_flag_function;
196  static std::string str_Hz_bias_excitation_flag_function;
197 #endif
198 
199 #ifdef WARPX_MAG_LLG
200  // Parser for H_external on the grid
201  static std::string str_Hx_ext_grid_function;
202  static std::string str_Hy_ext_grid_function;
203  static std::string str_Hz_ext_grid_function;
204  // Parser for M_external on the grid
205  static std::string str_Mx_ext_grid_function;
206  static std::string str_My_ext_grid_function;
207  static std::string str_Mz_ext_grid_function;
208  // Parser for H_bias_external on the grid
209  static std::string str_Hx_bias_ext_grid_function;
210  static std::string str_Hy_bias_ext_grid_function;
211  static std::string str_Hz_bias_ext_grid_function;
212 #endif
213 
215  std::unique_ptr<amrex::Parser> Bxfield_parser;
217  std::unique_ptr<amrex::Parser> Byfield_parser;
219  std::unique_ptr<amrex::Parser> Bzfield_parser;
221  std::unique_ptr<amrex::Parser> Exfield_parser;
223  std::unique_ptr<amrex::Parser> Eyfield_parser;
225  std::unique_ptr<amrex::Parser> Ezfield_parser;
226 
227 
228  // Parser for B_external excitation on the grid
229  std::unique_ptr<amrex::Parser> Bxfield_xt_grid_parser;
230  std::unique_ptr<amrex::Parser> Byfield_xt_grid_parser;
231  std::unique_ptr<amrex::Parser> Bzfield_xt_grid_parser;
232  // Parser for E_external excitation on the grid
233  std::unique_ptr<amrex::Parser> Exfield_xt_grid_parser;
234  std::unique_ptr<amrex::Parser> Eyfield_xt_grid_parser;
235  std::unique_ptr<amrex::Parser> Ezfield_xt_grid_parser;
236 #ifdef WARPX_MAG_LLG
237  // Parser for H_external excitation on the grid
238  std::unique_ptr<amrex::Parser> Hxfield_xt_grid_parser;
239  std::unique_ptr<amrex::Parser> Hyfield_xt_grid_parser;
240  std::unique_ptr<amrex::Parser> Hzfield_xt_grid_parser;
241  // Parser for H_bias external excitation on the grid
242  std::unique_ptr<amrex::Parser> Hx_biasfield_xt_grid_parser;
243  std::unique_ptr<amrex::Parser> Hy_biasfield_xt_grid_parser;
244  std::unique_ptr<amrex::Parser> Hz_biasfield_xt_grid_parser;
245 #endif
246  std::unique_ptr<amrex::Parser> Exfield_flag_parser;
247  std::unique_ptr<amrex::Parser> Eyfield_flag_parser;
248  std::unique_ptr<amrex::Parser> Ezfield_flag_parser;
249  std::unique_ptr<amrex::Parser> Bxfield_flag_parser;
250  std::unique_ptr<amrex::Parser> Byfield_flag_parser;
251  std::unique_ptr<amrex::Parser> Bzfield_flag_parser;
252 #ifdef WARPX_MAG_LLG
253  std::unique_ptr<amrex::Parser> Hxfield_flag_parser;
254  std::unique_ptr<amrex::Parser> Hyfield_flag_parser;
255  std::unique_ptr<amrex::Parser> Hzfield_flag_parser;
256  std::unique_ptr<amrex::Parser> Hx_biasfield_flag_parser;
257  std::unique_ptr<amrex::Parser> Hy_biasfield_flag_parser;
258  std::unique_ptr<amrex::Parser> Hz_biasfield_flag_parser;
259 #endif
260 
261 #ifdef WARPX_MAG_LLG
262  // Parser for H_external on the grid
263  std::unique_ptr<amrex::Parser> Hxfield_parser;
264  std::unique_ptr<amrex::Parser> Hyfield_parser;
265  std::unique_ptr<amrex::Parser> Hzfield_parser;
266  // Parser for M_external on the grid
267  std::unique_ptr<amrex::Parser> Mxfield_parser;
268  std::unique_ptr<amrex::Parser> Myfield_parser;
269  std::unique_ptr<amrex::Parser> Mzfield_parser;
270  // Parser for H_bias_external on the grid
271  std::unique_ptr<amrex::Parser> Hx_biasfield_parser;
272  std::unique_ptr<amrex::Parser> Hy_biasfield_parser;
273  std::unique_ptr<amrex::Parser> Hz_biasfield_parser;
274 #endif
275 
276  // Algorithms
282  static short field_gathering_algo;
284  static short particle_pusher_algo;
292  static int em_solver_medium;
318 
322  static short psatd_solution_type;
323 
326  static short J_in_time;
327  static short rho_in_time;
328 
329 #ifdef WARPX_MAG_LLG
330  // second-order magnetization normalization strategy
331  int mag_M_normalization;
332  // turn on LLG + Maxwell coupling
333  int mag_LLG_coupling = 1;
334  // turn off the exchange coupling term H_exchange in H_eff for the LLG updates
335  int mag_LLG_exchange_coupling = 0;
336  // turn off the anisotropy coupling term H_anisotropy in H_eff for the LLG updates
337  int mag_LLG_anisotropy_coupling = 0;
338 #endif
342  static bool do_current_centering;
343 
345  // to satisfy the continuity equation and charge conservation
347 
350  bool update_with_rho = false;
351 
354 
357 
360 
363 
366 
369 
372 
375  static bool do_dive_cleaning;
377  static bool do_divb_cleaning;
378 
380  static int nox;
382  static int noy;
384  static int noz;
385 
392 
399 
406  static int ncomps;
407 
410  static bool use_fdtd_nci_corr;
421 
425 
427  static bool use_filter;
429  static bool use_kspace_filter;
432 
435 
437  static amrex::Real gamma_boost;
439  static amrex::Real beta_boost;
452  static amrex::Real zmin_domain_boost_step_0;
453 
456 
458  static bool refine_plasma;
459 
462 
467 
468  static bool do_subcycling;
469  static bool do_multi_J;
471 
473  static bool safe_guard_cells;
474 
483 
486  static short grid_type;
487 
488  // Global rho nodal flag to know about rho index type when rho MultiFab is not allocated
490 
505  static void AllocInitMultiFab (
506  std::unique_ptr<amrex::MultiFab>& mf,
507  const amrex::BoxArray& ba,
508  const amrex::DistributionMapping& dm,
509  const int ncomp,
510  const amrex::IntVect& ngrow,
511  const std::string& name,
512  std::optional<const amrex::Real> initial_value = {});
513 
528  static void AllocInitMultiFab (
529  std::unique_ptr<amrex::iMultiFab>& mf,
530  const amrex::BoxArray& ba,
531  const amrex::DistributionMapping& dm,
532  const int ncomp,
533  const amrex::IntVect& ngrow,
534  const std::string& name,
535  std::optional<const int> initial_value = {});
536 
547  static void AliasInitMultiFab (
548  std::unique_ptr<amrex::MultiFab>& mf,
549  const amrex::MultiFab& mf_to_alias,
550  const int scomp,
551  const int ncomp,
552  const std::string& name,
553  std::optional<const amrex::Real> initial_value);
554 
555  // Maps of all of the MultiFabs and iMultiFabs used (this can include MFs from other classes)
556  // This is a convenience for the Python interface, allowing all MultiFabs
557  // to be easily referenced from Python.
558  static std::map<std::string, amrex::MultiFab *> multifab_map;
559  static std::map<std::string, amrex::iMultiFab *> imultifab_map;
560 
567  static void AddToMultiFabMap(const std::string& name, const std::unique_ptr<amrex::MultiFab>& mf) {
568  multifab_map[name] = mf.get();
569  }
570 
577  static void AddToMultiFabMap(const std::string& name, const std::unique_ptr<amrex::iMultiFab>& mf) {
578  imultifab_map[name] = mf.get();
579  }
580 
581  std::array<const amrex::MultiFab* const, 3>
582  get_array_Bfield_aux (const int lev) const {
583  return {
584  Bfield_aux[lev][0].get(),
585  Bfield_aux[lev][1].get(),
586  Bfield_aux[lev][2].get()
587  };
588  }
589  std::array<const amrex::MultiFab* const, 3>
590  get_array_Efield_aux (const int lev) const {
591  return {
592  Efield_aux[lev][0].get(),
593  Efield_aux[lev][1].get(),
594  Efield_aux[lev][2].get()
595  };
596  }
597 
598 #ifdef WARPX_MAG_LLG
599  std::array<const amrex::MultiFab* const, 3>
600  get_array_Hfield_aux (const int lev) const {
601  return {
602  Hfield_aux[lev][0].get(),
603  Hfield_aux[lev][1].get(),
604  Hfield_aux[lev][2].get()
605  };
606  }
607  std::array<const amrex::MultiFab* const, 3>
608  get_array_Mfield_aux (const int lev) const {
609  return {
610  Mfield_aux[lev][0].get(),
611  Mfield_aux[lev][1].get(),
612  Mfield_aux[lev][2].get()
613  };
614  }
615  std::array<const amrex::MultiFab* const, 3>
616  get_array_H_biasfield_aux (const int lev) const {
617  return {
618  H_biasfield_aux[lev][0].get(),
619  H_biasfield_aux[lev][1].get(),
620  H_biasfield_aux[lev][2].get()
621  };
622  }
623 #endif
624  amrex::MultiFab * get_pointer_Efield_aux (int lev, int direction) const { return Efield_aux[lev][direction].get(); }
625  amrex::MultiFab * get_pointer_Bfield_aux (int lev, int direction) const { return Bfield_aux[lev][direction].get(); }
626 #ifdef WARPX_MAG_LLG
627  amrex::MultiFab * get_pointer_Hfield_aux (int lev, int direction) const { return Hfield_aux[lev][direction].get(); }
628  amrex::MultiFab * get_pointer_Mfield_aux (int lev, int direction) const { return Mfield_aux[lev][direction].get(); }
629  amrex::MultiFab * get_pointer_H_biasfield_aux (int lev, int direction) const { return H_biasfield_aux[lev][direction].get(); }
630 #endif
631  amrex::MultiFab * get_pointer_Efield_fp (int lev, int direction) const { return Efield_fp[lev][direction].get(); }
632  amrex::MultiFab * get_pointer_Bfield_fp (int lev, int direction) const { return Bfield_fp[lev][direction].get(); }
633  amrex::MultiFab * get_pointer_Bfield_sc_fp (int lev, int direction) const { return Bfield_sc_fp[lev][direction].get(); }
634 
635 #ifdef WARPX_MAG_LLG
636  amrex::MultiFab * get_pointer_Hfield_fp (int lev, int direction) const { return Hfield_fp[lev][direction].get();}
637  // note "direction" of M means face. For M, each face stores all 3 vector components of M
638  amrex::MultiFab * get_pointer_Mfield_fp (int lev, int direction) const { return Mfield_fp[lev][direction].get();}
639  amrex::MultiFab * get_pointer_H_biasfield_fp (int lev, int direction) const { return H_biasfield_fp[lev][direction].get();}
640 #endif
641  amrex::MultiFab * get_pointer_current_fp (int lev, int direction) const { return current_fp[lev][direction].get(); }
642  amrex::MultiFab * get_pointer_current_fp_nodal (int lev, int direction) const { return current_fp_nodal[lev][direction].get(); }
643  amrex::MultiFab * get_pointer_rho_fp (int lev) const { return rho_fp[lev].get(); }
644  amrex::MultiFab * get_pointer_F_fp (int lev) const { return F_fp[lev].get(); }
645  amrex::MultiFab * get_pointer_G_fp (int lev) const { return G_fp[lev].get(); }
646  amrex::MultiFab * get_pointer_phi_fp (int lev) const { return phi_fp[lev].get(); }
648 
649  amrex::MultiFab * get_pointer_Efield_cp (int lev, int direction) const { return Efield_cp[lev][direction].get(); }
650  amrex::MultiFab * get_pointer_Bfield_cp (int lev, int direction) const { return Bfield_cp[lev][direction].get(); }
651 #ifdef WARPX_MAG_LLG
652  amrex::MultiFab * get_pointer_Hfield_cp (int lev, int direction) const { return Hfield_cp[lev][direction].get(); }
653  amrex::MultiFab * get_pointer_Mfield_cp (int lev, int direction) const { return Mfield_cp[lev][direction].get(); }
654  amrex::MultiFab * get_pointer_H_biasfield_cp (int lev, int direction) const { return H_biasfield_cp[lev][direction].get(); }
655 #endif
656  amrex::MultiFab * get_pointer_current_cp (int lev, int direction) const { return current_cp[lev][direction].get(); }
657  amrex::MultiFab * get_pointer_rho_cp (int lev) const { return rho_cp[lev].get(); }
658  amrex::MultiFab * get_pointer_F_cp (int lev) const { return F_cp[lev].get(); }
659  amrex::MultiFab * get_pointer_G_cp (int lev) const { return G_cp[lev].get(); }
660 
661  amrex::MultiFab * get_pointer_edge_lengths (int lev, int direction) const { return m_edge_lengths[lev][direction].get(); }
662  amrex::MultiFab * get_pointer_face_areas (int lev, int direction) const { return m_face_areas[lev][direction].get(); }
663 
664  const amrex::MultiFab& getEfield (int lev, int direction) {return *Efield_aux[lev][direction];}
665  const amrex::MultiFab& getBfield (int lev, int direction) {return *Bfield_aux[lev][direction];}
666 #ifdef WARPX_MAG_LLG
667  const amrex::MultiFab& getHfield (int lev, int direction) {return *Hfield_aux[lev][direction];}
668  const amrex::MultiFab& getMfield (int lev, int direction) {return *Mfield_aux[lev][direction];}
669  const amrex::MultiFab& getH_biasfield (int lev, int direction) {return *H_biasfield_aux[lev][direction];}
670 #endif
671  const amrex::MultiFab& getcurrent_cp (int lev, int direction) {return *current_cp[lev][direction];}
672  const amrex::MultiFab& getEfield_cp (int lev, int direction) {return *Efield_cp[lev][direction];}
673  const amrex::MultiFab& getBfield_cp (int lev, int direction) {return *Bfield_cp[lev][direction];}
674 #ifdef WARPX_MAG_LLG
675  const amrex::MultiFab& getHfield_cp (int lev, int direction) {return *Hfield_cp[lev][direction];}
676  const amrex::MultiFab& getMfield_cp (int lev, int direction) {return *Mfield_cp[lev][direction];}
677  const amrex::MultiFab& getH_biasfield_cp (int lev, int direction) {return *H_biasfield_cp[lev][direction];}
678 #endif
679  const amrex::MultiFab& getrho_cp (int lev) {return *rho_cp[lev];}
680  const amrex::MultiFab& getF_cp (int lev) {return *F_cp[lev];}
681  const amrex::MultiFab& getG_cp (int lev) {return *G_cp[lev];}
682 
683  const amrex::MultiFab& getcurrent_fp (int lev, int direction) {return *current_fp[lev][direction];}
684  const amrex::MultiFab& getEfield_fp (int lev, int direction) {return *Efield_fp[lev][direction];}
685  const amrex::MultiFab& getBfield_fp (int lev, int direction) {return *Bfield_fp[lev][direction];}
686  const amrex::MultiFab& getBfield_sc_fp (int lev, int direction) {return *Bfield_sc_fp[lev][direction];}
687 #ifdef WARPX_MAG_LLG
688  const amrex::MultiFab& getHfield_fp (int lev, int direction) {return *Hfield_fp[lev][direction];}
689  const amrex::MultiFab& getMfield_fp (int lev, int direction) {return *Mfield_fp[lev][direction];}
690  const amrex::MultiFab& getH_biasfield_fp (int lev, int direction) {return *H_biasfield_fp[lev][direction];}
691 #endif
692  const amrex::MultiFab& getrho_fp (int lev) {return *rho_fp[lev];}
693  const amrex::MultiFab& getphi_fp (int lev) {return *phi_fp[lev];}
694  const amrex::MultiFab& getF_fp (int lev) {return *F_fp[lev];}
695  const amrex::MultiFab& getG_fp (int lev) {return *G_fp[lev];}
696 
697  const amrex::MultiFab& getEfield_avg_fp (int lev, int direction) {return *Efield_avg_fp[lev][direction];}
698  const amrex::MultiFab& getBfield_avg_fp (int lev, int direction) {return *Bfield_avg_fp[lev][direction];}
699  const amrex::MultiFab& getEfield_avg_cp (int lev, int direction) {return *Efield_avg_cp[lev][direction];}
700  const amrex::MultiFab& getBfield_avg_cp (int lev, int direction) {return *Bfield_avg_cp[lev][direction];}
701 
702  bool DoPML () const {return do_pml;}
703 
704 #if (defined WARPX_DIM_RZ) && (defined WARPX_USE_PSATD)
705  const PML_RZ* getPMLRZ() {return pml_rz[0].get();}
706 #endif
707 
709  std::vector<bool> getPMLdirections() const;
710 
711  static amrex::LayoutData<amrex::Real>* getCosts (int lev);
712 
713  void setLoadBalanceEfficiency (const int lev, const amrex::Real efficiency)
714  {
715  if (m_instance)
716  {
717  m_instance->load_balance_efficiency[lev] = efficiency;
718  } else
719  {
720  return;
721  }
722  }
723 
724  amrex::Real getLoadBalanceEfficiency (const int lev)
725  {
726  if (m_instance)
727  {
728  return m_instance->load_balance_efficiency[lev];
729  } else
730  {
731  return -1;
732  }
733  }
734 
739 
740  amrex::Real time_of_last_gal_shift = 0;
743 
745 
746  static int num_mirrors;
750 
752  std::unique_ptr<MultiReducedDiags> reduced_diags;
753 
754  void applyMirrors(amrex::Real time);
755 
757  void ComputeDt ();
758 
761 
763  void WriteUsedInputsFile () const;
764 
766  void PrintDtDxDyDz ();
767 
773  void ComputeMaxStep ();
774  // Compute max_step automatically for simulations in a boosted frame.
776 
781  int MoveWindow (const int step, bool move_j);
782 
788  void ShiftGalileanBoundary ();
789  void UpdatePlasmaInjectionPosition (amrex::Real dt);
790  void ResetProbDomain (const amrex::RealBox& rb);
791  void EvolveE ( amrex::Real dt); // declare this function, defined somewhere else
792  void EvolveE (int lev, amrex::Real dt);
793  void EvolveB ( amrex::Real dt, DtType dt_type);
794  void EvolveB (int lev, amrex::Real dt, DtType dt_type);
795  void EvolveF ( amrex::Real dt, DtType dt_type);
796  void EvolveF (int lev, amrex::Real dt, DtType dt_type);
797  void EvolveG ( amrex::Real dt, DtType dt_type);
798  void EvolveG (int lev, amrex::Real dt, DtType dt_type);
799  void EvolveB (int lev, PatchType patch_type, amrex::Real dt, DtType dt_type);
800  void EvolveE (int lev, PatchType patch_type, amrex::Real dt);
801  void EvolveF (int lev, PatchType patch_type, amrex::Real dt, DtType dt_type);
802  void EvolveG (int lev, PatchType patch_type, amrex::Real dt, DtType dt_type);
803  void EvolveBLondon ( amrex::Real dt, DtType dt_type);
804  void EvolveBLondon (int lev, amrex::Real dt, DtType dt_type);
805  void EvolveBLondon (int lev, PatchType patch_type, amrex::Real dt, DtType dt_type);
806 
807  void MacroscopicEvolveE ( amrex::Real dt);
808  void MacroscopicEvolveE (int lev, amrex::Real dt);
809  void MacroscopicEvolveE (int lev, PatchType patch_type, amrex::Real dt);
810 
811 #ifdef WARPX_MAG_LLG
812  void MacroscopicEvolveHM ( amrex::Real dt);
813  void MacroscopicEvolveHM (int lev, amrex::Real dt);
814  void MacroscopicEvolveHM (int lev, PatchType patch_type, amrex::Real dt);
815 
816  void MacroscopicEvolveHM_2nd ( amrex::Real dt);
817  void MacroscopicEvolveHM_2nd (int lev, amrex::Real dt);
818  void MacroscopicEvolveHM_2nd (int lev, PatchType patch_type, amrex::Real dt);
819 #endif
820 
826 
832  void Hybrid_QED_Push (int lev, amrex::Real dt);
833 
840  void Hybrid_QED_Push (int lev, PatchType patch_type, amrex::Real dt);
841 
842  static amrex::Real quantum_xi_c2;
843 
846  void LoadBalance ();
849  void ResetCosts ();
850 
854  {
855  return load_balance_intervals;
856  }
857 
865  void DampFieldsInGuards (const int lev,
866  const std::array<std::unique_ptr<amrex::MultiFab>,3>& Efield,
867  const std::array<std::unique_ptr<amrex::MultiFab>,3>& Bfield);
868 
876  void DampFieldsInGuards (const int lev, std::unique_ptr<amrex::MultiFab>& mf);
877 
878 #ifdef WARPX_DIM_RZ
880  amrex::MultiFab* Jy,
881  amrex::MultiFab* Jz,
882  int lev);
883 
885  int lev);
886 #endif
887 
893  void ApplyRhofieldBoundary (const int lev, amrex::MultiFab* Rho,
894  PatchType patch_type);
895 
901  void ApplyJfieldBoundary (const int lev, amrex::MultiFab* Jx,
903  PatchType patch_type);
904 
905  void ApplyEfieldBoundary (const int lev, PatchType patch_type);
906  void ApplyBfieldBoundary (const int lev, PatchType patch_type, DtType dt_type);
907 
908  void DampPML ();
909  void DampPML (const int lev);
910  void DampPML (const int lev, PatchType patch_type);
911  void DampPML_Cartesian (const int lev, PatchType patch_type);
912 
913  void DampJPML ();
914  void DampJPML (int lev);
915  void DampJPML (int lev, PatchType patch_type);
916 
917  void CopyJPML ();
918  bool isAnyBoundaryPML();
919 
923  void NodalSyncPML ();
924 
928  void NodalSyncPML (int lev);
929 
933  void NodalSyncPML (int lev, PatchType patch_type);
934 
935  PML* GetPML (int lev);
936 #if (defined WARPX_DIM_RZ) && (defined WARPX_USE_PSATD)
937  PML_RZ* GetPML_RZ (int lev);
938 #endif
939 
941  void doFieldIonization ();
945  void doFieldIonization (int lev);
946 
947 #ifdef WARPX_QED
949  void doQEDEvents ();
953  void doQEDEvents (int lev);
954 #endif
955 
956  void PushParticlesandDepose (int lev, amrex::Real cur_time, DtType a_dt_type=DtType::Full, bool skip_current=false);
957  void PushParticlesandDepose ( amrex::Real cur_time, bool skip_current=false);
958 
959  // This function does aux(lev) = fp(lev) + I(aux(lev-1)-cp(lev)).
960  // Caller must make sure fp and cp have ghost cells filled.
961  void UpdateAuxilaryData ();
964 
974 
975  // Fill boundary cells including coarse/fine boundaries
976  void FillBoundaryB (amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
977  void FillBoundaryE (amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
980 #ifdef WARPX_MAG_LLG
981  void FillBoundaryM (amrex::IntVect ng);
982  void FillBoundaryH (amrex::IntVect ng);
983 #endif
984 
985  void FillBoundaryF (amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
986  void FillBoundaryG (amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
988  void FillBoundaryE (int lev, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
989  void FillBoundaryB (int lev, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
990  void FillBoundaryE_avg (int lev, amrex::IntVect ng);
991  void FillBoundaryB_avg (int lev, amrex::IntVect ng);
992 #ifdef WARPX_MAG_LLG
993  void FillBoundaryM (int lev, amrex::IntVect ng);
994  void FillBoundaryH (int lev, amrex::IntVect ng);
995 #endif
996 
997  void FillBoundaryF (int lev, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
998  void FillBoundaryG (int lev, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
999  void FillBoundaryAux (int lev, amrex::IntVect ng);
1000 
1001  void FillBoundaryJ (amrex::IntVect ng);
1002  void FillBoundaryJ (const int lev, amrex::IntVect ng);
1003 
1009  void SyncCurrentAndRho ();
1010 
1022  void SyncCurrent (
1023  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
1024  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp);
1025 
1026  void SyncRho ();
1027 
1028  void SyncRho (
1029  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
1030  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp);
1031 
1033  int getnsubsteps (int lev) const {return nsubsteps[lev];}
1034  amrex::Vector<int> getistep () const {return istep;}
1035  int getistep (int lev) const {return istep[lev];}
1036  void setistep (int lev, int ii) {istep[lev] = ii;}
1038  amrex::Real gett_old (int lev) const {return t_old[lev];}
1040  amrex::Real gett_new (int lev) const {return t_new[lev];}
1041  void sett_new (int lev, amrex::Real time) {t_new[lev] = time;}
1043  amrex::Real getdt (int lev) const {return dt[lev];}
1045  amrex::Real getmoving_window_x() const {return moving_window_x;}
1047  bool getis_synchronized() const {return is_synchronized;}
1048 
1049  int maxStep () const {return max_step;}
1050  void updateMaxStep (const int new_max_step) {max_step = new_max_step;}
1051  amrex::Real stopTime () const {return stop_time;}
1052  void updateStopTime (const amrex::Real new_stop_time) {stop_time = new_stop_time;}
1053 
1055  amrex::Vector<amrex::MultiFab>& mf_avg, const amrex::IntVect ngrow) const;
1056 
1057  void prepareFields( int const step, amrex::Vector<std::string>& varnames,
1060  amrex::Vector<amrex::Geometry>& output_geom ) const;
1061 
1062  static std::array<amrex::Real,3> CellSize (int lev);
1063  static amrex::RealBox getRealBox(const amrex::Box& bx, int lev);
1064 
1073  static std::array<amrex::Real,3> LowerCorner (const amrex::Box& bx, const int lev, const amrex::Real time_shift_delta);
1082  static std::array<amrex::Real,3> UpperCorner (const amrex::Box& bx, const int lev, const amrex::Real time_shift_delta);
1083 
1084  static amrex::IntVect RefRatio (int lev);
1085 
1086  static const amrex::iMultiFab* CurrentBufferMasks (int lev);
1087  static const amrex::iMultiFab* GatherBufferMasks (int lev);
1088 
1090 
1091  // Parameters for lab frame electrostatic
1096 
1097  static int do_moving_window; // boolean
1098  static int start_moving_window_step; // the first step to move window
1099  static int end_moving_window_step; // the last step to move window
1105  static int moving_window_active (int const step) {
1106  bool const step_before_end = (step < end_moving_window_step) || (end_moving_window_step < 0);
1107  bool const step_after_start = (step >= start_moving_window_step);
1108  return do_moving_window && step_before_end && step_after_start;
1109  }
1110  static int moving_window_dir;
1111  static amrex::Real moving_window_v;
1113 
1114  // these should be private, but can't due to Cuda limitations
1115  static void ComputeDivB (amrex::MultiFab& divB, int const dcomp,
1116  const std::array<const amrex::MultiFab* const, 3>& B,
1117  const std::array<amrex::Real,3>& dx);
1118 
1119  static void ComputeDivB (amrex::MultiFab& divB, int const dcomp,
1120  const std::array<const amrex::MultiFab* const, 3>& B,
1121  const std::array<amrex::Real,3>& dx, amrex::IntVect const ngrow);
1122 
1123  void ComputeDivE(amrex::MultiFab& divE, const int lev);
1124 
1125  const amrex::IntVect getngEB() const { return guard_cells.ng_alloc_EB; }
1126  const amrex::IntVect getngF() const { return guard_cells.ng_alloc_F; }
1131 
1139  const amrex::IntVect get_numprocs() const {return numprocs;}
1140 
1142  void ComputeSpaceChargeField (bool const reset_fields);
1143  void AddBoundaryField ();
1146  void computePhi (const amrex::Vector<std::unique_ptr<amrex::MultiFab> >& rho,
1147  amrex::Vector<std::unique_ptr<amrex::MultiFab> >& phi,
1148  std::array<amrex::Real, 3> const beta = {{0,0,0}},
1149  amrex::Real const required_precision=amrex::Real(1.e-11),
1150  amrex::Real absolute_tolerance=amrex::Real(0.0),
1151  const int max_iters=200,
1152  const int verbosity=2) const;
1153 
1154  void setPhiBC (amrex::Vector<std::unique_ptr<amrex::MultiFab> >& phi ) const;
1155 
1156  void computeE (amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>, 3> >& E,
1157  const amrex::Vector<std::unique_ptr<amrex::MultiFab> >& phi,
1158  std::array<amrex::Real, 3> const beta = {{0,0,0}} ) const;
1159  void computeB (amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>, 3> >& B,
1160  const amrex::Vector<std::unique_ptr<amrex::MultiFab> >& phi,
1161  std::array<amrex::Real, 3> const beta = {{0,0,0}} ) const;
1162  void computePhiTriDiagonal (const amrex::Vector<std::unique_ptr<amrex::MultiFab> >& rho,
1163  amrex::Vector<std::unique_ptr<amrex::MultiFab> >& phi) const;
1164 
1165  // Magnetostatic Solver Interface
1167  void ComputeMagnetostaticField ();
1169  void computeVectorPotential (const amrex::Vector<amrex::Array<std::unique_ptr<amrex::MultiFab>, 3> >& curr,
1170  amrex::Vector<amrex::Array<std::unique_ptr<amrex::MultiFab>, 3> >& A,
1171  amrex::Real const required_precision=amrex::Real(1.e-11),
1172  amrex::Real absolute_tolerance=amrex::Real(0.0),
1173  const int max_iters=200,
1174  const int verbosity=2) const;
1175 
1176  void setVectorPotentialBC (amrex::Vector<amrex::Array<std::unique_ptr<amrex::MultiFab>, 3> >& A) const;
1177 
1201  amrex::ParserExecutor<3> const& xfield_parser,
1202  amrex::ParserExecutor<3> const& yfield_parser,
1203  amrex::ParserExecutor<3> const& zfield_parser,
1204  std::array< std::unique_ptr<amrex::MultiFab>, 3 > const& edge_lengths,
1205  std::array< std::unique_ptr<amrex::MultiFab>, 3 > const& face_areas,
1206  const char field,
1207  const int lev, PatchType patch_type);
1208 
1210  std::string read_fields_from_path, amrex::MultiFab* mf,
1211  std::string F_name, std::string F_component);
1212 
1221  void InitializeEBGridData(int lev);
1222 
1229 
1230  void ApplyFilterandSumBoundaryRho (int lev, int glev, amrex::MultiFab& rho, int icomp, int ncomp);
1231 
1258  void ApplyExternalFieldExcitationOnGrid (int const externalfieldtype, DtType a_dt_type = DtType::Full);
1260  amrex::MultiFab *mfy, amrex::MultiFab *mfz,
1261  amrex::ParserExecutor<4> const& xfield_parser,
1262  amrex::ParserExecutor<4> const& yfield_parser,
1263  amrex::ParserExecutor<4> const& zfield_parser,
1264  amrex::ParserExecutor<3> const& xflag_parser,
1265  amrex::ParserExecutor<3> const& yflag_parser,
1266  amrex::ParserExecutor<3> const& zflag_parser, const int lev,
1267  DtType a_dt_type );
1269  void ReadExcitationParser ();
1270 
1271 #ifdef WARPX_MAG_LLG
1272  void AverageParsedMtoFaces(amrex::MultiFab& Mx_cc,
1273  amrex::MultiFab& My_cc,
1274  amrex::MultiFab& Mz_cc,
1275  amrex::MultiFab& Mx_face,
1276  amrex::MultiFab& My_face,
1277  amrex::MultiFab& Mz_face);
1278 #endif
1279 
1288  static amrex::Vector<amrex::Real> getFornbergStencilCoefficients(const int n_order, const short a_grid_type);
1289 
1290  // Device vectors of stencil coefficients used for finite-order centering of fields
1294 
1295  // Device vectors of stencil coefficients used for finite-order centering of currents
1299 
1300  // This needs to be public for CUDA.
1302  virtual void ErrorEst (int lev, amrex::TagBoxArray& tags, amrex::Real time, int /*ngrow*/) final;
1303 
1304  // Return the accelerator lattice instance defined at the given refinement level
1306 
1307 protected:
1308 
1334  void InitLevelData (int lev, amrex::Real time);
1335 
1338  virtual void PostProcessBaseGrids (amrex::BoxArray& ba0) const final;
1339 
1343  virtual void MakeNewLevelFromScratch (int lev, amrex::Real time, const amrex::BoxArray& ba,
1344  const amrex::DistributionMapping& dm) final;
1345 
1349  virtual void MakeNewLevelFromCoarse (int /*lev*/, amrex::Real /*time*/, const amrex::BoxArray& /*ba*/,
1350  const amrex::DistributionMapping& /*dm*/) final;
1351 
1355  virtual void RemakeLevel (int lev, amrex::Real time, const amrex::BoxArray& ba,
1356  const amrex::DistributionMapping& dm) final;
1357 
1359  virtual void ClearLevel (int lev) final;
1360 
1361 private:
1362 
1363  // Singleton is used when the code is run from python
1365 
1367  static void CheckSignals ();
1369  void HandleSignals ();
1370 
1374  void EvolveEM(int numsteps);
1375 
1376 #ifdef WARPX_MAG_LLG
1377  void FillBoundaryM (const int lev, const PatchType patch_type, const amrex::IntVect ng);
1378  void FillBoundaryH (const int lev, const PatchType patch_type, const amrex::IntVect ng);
1379 #endif
1380  void FillBoundaryB (const int lev, const PatchType patch_type, const amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
1381  void FillBoundaryE (const int lev, const PatchType patch_type, const amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
1382  void FillBoundaryF (int lev, PatchType patch_type, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
1383  void FillBoundaryG (int lev, PatchType patch_type, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
1384 
1385  void FillBoundaryB_avg (int lev, PatchType patch_type, amrex::IntVect ng);
1386  void FillBoundaryE_avg (int lev, PatchType patch_type, amrex::IntVect ng);
1387  void FillBoundaryJ (const int lev, const PatchType patch_type, const amrex::IntVect ng);
1388 
1390 
1391  void OneStep_nosub (amrex::Real t);
1392  void OneStep_sub1 (amrex::Real t);
1393 
1397  void OneStep_multiJ (const amrex::Real t);
1398 
1400  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
1401  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp,
1402  const int lev);
1404  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
1405  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp,
1406  const int lev);
1407  void StoreCurrent (const int lev);
1408  void RestoreCurrent (const int lev);
1409  void ApplyFilterJ (
1410  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& current,
1411  const int lev,
1412  const int idim);
1413  void ApplyFilterJ (
1414  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& current,
1415  const int lev);
1416  void SumBoundaryJ (
1417  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& current,
1418  const int lev,
1419  const int idim,
1420  const amrex::Periodicity& period);
1421  void SumBoundaryJ (
1422  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& current,
1423  const int lev,
1424  const amrex::Periodicity& period);
1425  void NodalSyncJ (
1426  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
1427  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp,
1428  const int lev,
1429  PatchType patch_type);
1430 
1432  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
1433  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp,
1434  const int lev);
1436  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
1437  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp,
1438  const int lev,
1439  PatchType patch_type,
1440  const int icomp,
1441  const int ncomp);
1443  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
1444  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp,
1445  const int lev,
1446  const int icomp,
1447  const int ncomp);
1448  void NodalSyncRho (
1449  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
1450  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp,
1451  const int lev,
1452  PatchType patch_type,
1453  const int icomp,
1454  const int ncomp);
1455 
1456  void ReadParameters ();
1457 
1460  void BackwardCompatibility ();
1461 
1463 
1464  void AllocLevelData (int lev, const amrex::BoxArray& new_grids,
1465  const amrex::DistributionMapping& new_dmap);
1466 
1468  GetRestartDMap (const std::string& chkfile, const amrex::BoxArray& ba, int lev) const;
1469 
1470  void InitFromCheckpoint ();
1471  void PostRestart ();
1472 
1473  void InitPML ();
1475 
1476  void InitFilter ();
1477 
1479 
1481 
1487 
1493 
1498 
1501 
1502  void BuildBufferMasks ();
1503 public: // for cuda
1504  void BuildBufferMasksInBox ( const amrex::Box tbx, amrex::IArrayBox &buffer_mask,
1505  const amrex::IArrayBox &guard_mask, const int ng );
1506 private:
1507  const amrex::iMultiFab* getCurrentBufferMasks (int lev) const {
1508  return current_buffer_masks[lev].get();
1509  }
1510  const amrex::iMultiFab* getGatherBufferMasks (int lev) const {
1511  return gather_buffer_masks[lev].get();
1512  }
1513 
1524  amrex::Vector<amrex::Real>& unordered_coeffs,
1525  const int order);
1538  void AllocateCenteringCoefficients (amrex::Gpu::DeviceVector<amrex::Real>& device_centering_stencil_coeffs_x,
1539  amrex::Gpu::DeviceVector<amrex::Real>& device_centering_stencil_coeffs_y,
1540  amrex::Gpu::DeviceVector<amrex::Real>& device_centering_stencil_coeffs_z,
1541  const int centering_nox,
1542  const int centering_noy,
1543  const int centering_noz,
1544  const short a_grid_type);
1545 
1546  void AllocLevelMFs (int lev, const amrex::BoxArray& ba, const amrex::DistributionMapping& dm,
1547  const amrex::IntVect& ngEB, amrex::IntVect& ngJ,
1548  const amrex::IntVect& ngRho, const amrex::IntVect& ngF,
1549  const amrex::IntVect& ngG, const bool aux_is_nodal);
1550 
1551 #ifdef WARPX_USE_PSATD
1552 # ifdef WARPX_DIM_RZ
1553  void AllocLevelSpectralSolverRZ (amrex::Vector<std::unique_ptr<SpectralSolverRZ>>& spectral_solver,
1554  const int lev,
1555  const amrex::BoxArray& realspace_ba,
1556  const amrex::DistributionMapping& dm,
1557  const std::array<amrex::Real,3>& dx);
1558 # else
1559  void AllocLevelSpectralSolver (amrex::Vector<std::unique_ptr<SpectralSolver>>& spectral_solver,
1560  const int lev,
1561  const amrex::BoxArray& realspace_ba,
1562  const amrex::DistributionMapping& dm,
1563  const std::array<amrex::Real,3>& dx,
1564  const bool pml_flag=false);
1565 # endif
1566 #endif
1567 
1568  amrex::Vector<int> istep; // which step?
1569  amrex::Vector<int> nsubsteps; // how many substeps on each level?
1570 
1574 
1575  // Particle container
1576  std::unique_ptr<MultiParticleContainer> mypc;
1577  std::unique_ptr<MultiDiagnostics> multi_diags;
1578 
1579  //
1580  // Fields: First array for level, second for direction
1581  //
1582 
1583  // Full solution
1586 #ifdef WARPX_MAG_LLG
1590 #endif
1593 
1594  // Fine patch
1603 #ifdef WARPX_MAG_LLG
1607 #endif
1610 
1612  // Memory buffers for computing magnetostatic fields
1613  // Vector Potential A and previous step. Time buffer needed for computing dA/dt to first order
1617 
1618  // Same as Bfield_fp/Efield_fp for reading external field data
1621 
1626 
1649 
1662 
1663  //EB level set
1665 
1666  // store fine patch
1668 
1669  // Nodal MultiFab for nodal current deposition if warpx.do_current_centering = 1
1671 
1672  // Coarse patch
1679 #ifdef WARPX_MAG_LLG
1683 #endif
1686 
1687  // Copy of the coarse aux
1690 #ifdef WARPX_MAG_LLG
1694 #endif
1697 
1698  // If charge/current deposition buffers are used
1701 
1702  // PML
1703  int do_pml = 0;
1705  int pml_ncell = 10;
1706  int pml_delta = 10;
1710  static int do_similar_dm_pml;
1711  bool do_pml_dive_cleaning; // default set in WarpX.cpp
1712  bool do_pml_divb_cleaning; // default set in WarpX.cpp
1716 #if (defined WARPX_DIM_RZ) && (defined WARPX_USE_PSATD)
1718 #endif
1719  amrex::Real v_particle_pml;
1720 
1721  amrex::Real moving_window_x = std::numeric_limits<amrex::Real>::max();
1723 
1724  // Plasma injection parameters
1728 
1729  std::optional<amrex::Real> m_const_dt;
1730 
1731  // Macroscopic properties
1732  std::unique_ptr<MacroscopicProperties> m_macroscopic_properties;
1733  // London solver
1734  std::unique_ptr<London> m_london;
1735 
1736 
1737 #ifdef WARPX_MAG_LLG
1738  // time advancement scheme of M field
1739  int mag_time_scheme_order = 1;
1740 #endif
1741 
1742  // Load balancing
1755  amrex::Real load_balance_knapsack_factor = amrex::Real(1.24);
1761  amrex::Real load_balance_efficiency_ratio_threshold = amrex::Real(1.1);
1769  amrex::Real costs_heuristic_cells_wt = amrex::Real(0);
1775  amrex::Real costs_heuristic_particles_wt = amrex::Real(0);
1776 
1777  // Determines timesteps for override sync
1779 
1780  // Other runtime parameters
1781  int verbose = 1;
1782 
1783  bool use_hybrid_QED = 0;
1784 
1785  int max_step = std::numeric_limits<int>::max();
1786  amrex::Real stop_time = std::numeric_limits<amrex::Real>::max();
1787 
1788  int regrid_int = -1;
1789 
1790  amrex::Real cfl = amrex::Real(0.999);
1791 
1792  std::string restart_chkfile;
1793 
1796 
1797  bool use_single_read = true;
1798  bool use_single_write = true;
1800  int field_io_nfiles = 1024;
1802 
1805 
1806  bool is_synchronized = true;
1807 
1808  // Synchronization of nodal points
1809  const bool sync_nodal_points = true;
1810 
1812 
1813  //Slice Parameters
1815  int slice_plot_int = -1;
1824 
1826  int nox_fft = 16;
1827  int noy_fft = 16;
1828  int noz_fft = 16;
1829 
1832 
1834  std::unique_ptr<ParticleBoundaryBuffer> m_particle_boundary_buffer;
1835 
1836  // Accelerator lattice elements
1838 
1839  //
1840  // Embedded Boundary
1841  //
1842 
1843  // Factory for field data
1845 
1846  amrex::FabFactory<amrex::FArrayBox> const& fieldFactory (int lev) const noexcept {
1847  return *m_field_factory[lev];
1848  }
1849 #ifdef AMREX_USE_EB
1850 public:
1851  amrex::EBFArrayBoxFactory const& fieldEBFactory (int lev) const noexcept {
1852  return static_cast<amrex::EBFArrayBoxFactory const&>(*m_field_factory[lev]);
1853  }
1854 #endif
1855 
1856 public:
1857  void InitEB ();
1863 public:
1864 #ifdef AMREX_USE_EB
1865  static void ComputeEdgeLengths (std::array< std::unique_ptr<amrex::MultiFab>, 3 >& edge_lengths,
1866  const amrex::EBFArrayBoxFactory& eb_fact);
1871  static void ComputeFaceAreas (std::array< std::unique_ptr<amrex::MultiFab>, 3 >& face_areas,
1872  const amrex::EBFArrayBoxFactory& eb_fact);
1873 
1877  static void ScaleEdges (std::array< std::unique_ptr<amrex::MultiFab>, 3 >& edge_lengths,
1878  const std::array<amrex::Real,3>& cell_size);
1882  static void ScaleAreas (std::array< std::unique_ptr<amrex::MultiFab>, 3 >& face_areas,
1883  const std::array<amrex::Real,3>& cell_size);
1892  void MarkCells();
1896 #endif
1897  void ComputeDistanceToEB ();
1906  void ComputeFaceExtensions();
1910  void InitBorrowing();
1914  void ShrinkBorrowing();
1918  void ComputeOneWayExtensions();
1931  void ApplyBCKCorrection(const int idim);
1932 
1938 
1939 private:
1941 
1942  void PushPSATD ();
1943 
1944 #ifdef WARPX_USE_PSATD
1945 
1959  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& E_fp,
1960  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& B_fp,
1961  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& E_cp,
1962  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& B_cp);
1963 
1978  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& E_fp,
1979  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& B_fp,
1980  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& E_cp,
1981  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& B_cp);
1982 
1996  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& E_avg_fp,
1997  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& B_avg_fp,
1998  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& E_avg_cp,
1999  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& B_avg_cp);
2000 
2012  void PSATDForwardTransformJ (
2013  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
2014  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp,
2015  const bool apply_kspace_filter=true);
2016 
2026  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
2027  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp);
2028 
2041  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
2042  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp,
2043  const int icomp, const int dcomp, const bool apply_kspace_filter=true);
2044 
2048  void PSATDMoveRhoNewToRhoOld ();
2049 
2053  void PSATDMoveJNewToJOld ();
2054 
2058  void PSATDForwardTransformF ();
2059 
2063  void PSATDBackwardTransformF ();
2064 
2068  void PSATDForwardTransformG ();
2069 
2073  void PSATDBackwardTransformG ();
2074 
2078  void PSATDCurrentCorrection ();
2079 
2083  void PSATDVayDeposition ();
2084 
2088  void PSATDPushSpectralFields ();
2089 
2095  void PSATDScaleAverageFields (const amrex::Real scale_factor);
2096 
2100  void PSATDEraseAverageFields ();
2101 
2102 # ifdef WARPX_DIM_RZ
2105 # else
2108 # endif
2109 
2110 public:
2111 
2112 # ifdef WARPX_DIM_RZ
2114 # else
2116 # endif
2117  get_spectral_solver_fp (int lev) {return *spectral_solver_fp[lev];}
2118 #endif
2119 
2120 private:
2123 
2124 };
2125 
2126 #endif
PatchType
Definition: WarpX.H:73
DtType
Definition: WarpXDtType.H:11
Definition: AcceleratorLattice.H:21
Definition: BilinearFilter.H:17
Definition: ElectrostaticSolver.H:35
Definition: London.H:22
This class contains the macroscopic properties of the medium needed to evaluate macroscopic Maxwell e...
Definition: MacroscopicProperties.H:32
Definition: MagnetostaticSolver.H:21
This class contains a vector of all diagnostics in the simulation.
Definition: MultiDiagnostics.H:21
Definition: MultiParticleContainer.H:65
Definition: PML_RZ.H:30
Definition: PML.H:128
Definition: ParticleBoundaryBuffer.H:20
Top-level class for the electromagnetic spectral solver.
Definition: SpectralSolver.H:33
Definition: SpectralSolverRZ.H:22
Definition: WarpX.H:80
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_avg_aux
Definition: WarpX.H:1592
void DampFieldsInGuards(const int lev, const std::array< std::unique_ptr< amrex::MultiFab >, 3 > &Efield, const std::array< std::unique_ptr< amrex::MultiFab >, 3 > &Bfield)
Private function for spectral solver Applies a damping factor in the guards cells that extend beyond ...
Definition: WarpXPushFieldsEM.cpp:1225
std::unique_ptr< ParticleBoundaryBuffer > m_particle_boundary_buffer
particle buffer for scraped particles on the boundaries
Definition: WarpX.H:1834
static int self_fields_max_iters
Definition: WarpX.H:1094
void PSATDMoveRhoNewToRhoOld()
Copy rho_new to rho_old in spectral space (when rho is linear in time)
Definition: WarpXPushFieldsEM.cpp:560
const amrex::MultiFab & getrho_fp(int lev)
Definition: WarpX.H:692
static int field_centering_nox
Order of finite centering of fields (from staggered grid to nodal grid), along x.
Definition: WarpX.H:387
amrex::Vector< std::unique_ptr< amrex::LayoutData< amrex::Real > > > costs
Definition: WarpX.H:1748
static short current_deposition_algo
Integer that corresponds to the current deposition algorithm (Esirkepov, direct, Vay)
Definition: WarpX.H:278
std::unique_ptr< amrex::Parser > Bzfield_flag_parser
Definition: WarpX.H:251
amrex::Vector< std::unique_ptr< amrex::MultiFab > > G_fp
Definition: WarpX.H:1596
amrex::Gpu::DeviceVector< amrex::Real > device_field_centering_stencil_coeffs_y
Definition: WarpX.H:1292
static int moving_window_dir
Definition: WarpX.H:1110
amrex::Gpu::DeviceVector< amrex::Real > device_current_centering_stencil_coeffs_x
Definition: WarpX.H:1296
std::unique_ptr< amrex::Parser > Eyfield_flag_parser
Definition: WarpX.H:247
void computePhi(const amrex::Vector< std::unique_ptr< amrex::MultiFab > > &rho, amrex::Vector< std::unique_ptr< amrex::MultiFab > > &phi, std::array< amrex::Real, 3 > const beta={{0, 0, 0}}, amrex::Real const required_precision=amrex::Real(1.e-11), amrex::Real absolute_tolerance=amrex::Real(0.0), const int max_iters=200, const int verbosity=2) const
Definition: ElectrostaticSolver.cpp:275
void InitFilter()
void ComputeSpaceChargeField(bool const reset_fields)
Definition: ElectrostaticSolver.cpp:58
void BuildBufferMasks()
Definition: WarpX.cpp:3129
static std::string str_Bx_excitation_flag_function
Definition: WarpX.H:187
bool use_hybrid_QED
Definition: WarpX.H:1783
static bool do_dive_cleaning
Definition: WarpX.H:375
static amrex::Real zmax_plasma_to_compute_max_step
Definition: WarpX.H:445
void doFieldIonization()
Definition: WarpXEvolve.cpp:1017
amrex::MultiFab * get_pointer_edge_lengths(int lev, int direction) const
Definition: WarpX.H:661
static std::string str_Bz_excitation_grid_function
Definition: WarpX.H:168
const amrex::IntVect get_ng_fieldgather() const
Definition: WarpX.H:1130
static std::string str_By_excitation_flag_function
Definition: WarpX.H:188
amrex::MultiFab * get_pointer_Efield_fp(int lev, int direction) const
Definition: WarpX.H:631
const amrex::MultiFab & getEfield_fp(int lev, int direction)
Definition: WarpX.H:684
const amrex::IntVect getngEB() const
Definition: WarpX.H:1125
static std::string Version()
Version of WarpX executable.
Definition: WarpXVersion.cpp:14
amrex::Vector< int > getnsubsteps() const
Definition: WarpX.H:1032
void PSATDVayDeposition()
Vay deposition in Fourier space (https://doi.org/10.1016/j.jcp.2013.03.010)
Definition: WarpXPushFieldsEM.cpp:417
static bool do_multi_J
Definition: WarpX.H:469
std::unique_ptr< MacroscopicProperties > m_macroscopic_properties
Definition: WarpX.H:1732
MultiDiagnostics & GetMultiDiags()
Definition: WarpX.H:103
bool DoPML() const
Definition: WarpX.H:702
const amrex::MultiFab & getcurrent_cp(int lev, int direction)
Definition: WarpX.H:671
static short rho_in_time
Definition: WarpX.H:327
void UpdateAuxilaryDataSameType()
Definition: WarpXComm.cpp:274
virtual void PostProcessBaseGrids(amrex::BoxArray &ba0) const final
Definition: WarpXInitData.cpp:85
int pml_delta
Definition: WarpX.H:1706
amrex::Vector< std::unique_ptr< amrex::FabFactory< amrex::FArrayBox > > > m_field_factory
Definition: WarpX.H:1844
bool getis_synchronized() const
Definition: WarpX.H:1047
int do_pml_j_damping
Definition: WarpX.H:1708
int noy_fft
Definition: WarpX.H:1827
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_cp
Definition: WarpX.H:1676
amrex::Vector< std::unique_ptr< amrex::MultiFab > > m_distance_to_eb
Definition: WarpX.H:1664
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_slice
Definition: WarpX.H:1822
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_sc_fp
Definition: WarpX.H:1611
void PSATDBackwardTransformEB(const amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 >> &E_fp, const amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 >> &B_fp, const amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 >> &E_cp, const amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 >> &B_cp)
Backward FFT of E,B on all mesh refinement levels, with field damping in the guard cells (if needed)
Definition: WarpXPushFieldsEM.cpp:123
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_avg_aux
Definition: WarpX.H:1591
void NodalSyncPML()
Synchronize the nodal points of the PML MultiFabs.
Definition: WarpXComm.cpp:1485
static std::string str_Ex_ext_grid_function
String storing parser function to initialize x-component of the electric field on the grid.
Definition: WarpX.H:159
void ComputeFaceExtensions()
Main function computing the cell extension. Where possible it computes one-way extensions and,...
Definition: WarpXFaceExtensions.cpp:183
static void CheckSignals()
Check and clear signal flags and asynchronously broadcast them from process 0.
Definition: WarpXEvolve.cpp:1196
amrex::Vector< amrex::Real > m_v_galilean
Definition: WarpX.H:741
void DampJPML()
Definition: WarpXEvolvePML.cpp:254
static short psatd_solution_type
Definition: WarpX.H:322
void ResetProbDomain(const amrex::RealBox &rb)
Definition: WarpXMovingWindow.cpp:579
amrex::Vector< std::unique_ptr< amrex::iMultiFab > > gather_buffer_masks
Definition: WarpX.H:1696
void updateStopTime(const amrex::Real new_stop_time)
Definition: WarpX.H:1052
std::array< const amrex::MultiFab *const, 3 > get_array_Efield_aux(const int lev) const
Definition: WarpX.H:590
amrex::Vector< int > mirror_z_npoints
Definition: WarpX.H:749
static amrex::Real zmin_domain_boost_step_0
Definition: WarpX.H:452
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_slice
Definition: WarpX.H:1821
static const amrex::iMultiFab * GatherBufferMasks(int lev)
Definition: WarpX.cpp:3313
static bool do_compute_max_step_from_zmax
Definition: WarpX.H:449
static amrex::Vector< int > field_boundary_lo
Definition: WarpX.H:301
static bool sort_particles_for_deposition
If true, particles will be sorted in the order x -> y -> z -> ppc for faster deposition.
Definition: WarpX.H:464
SpectralSolverRZ & get_spectral_solver_fp(int lev)
Definition: WarpX.H:2117
std::unique_ptr< amrex::Parser > Ezfield_xt_grid_parser
Definition: WarpX.H:235
static int n_field_gather_buffer
Definition: WarpX.H:478
static void shiftMF(amrex::MultiFab &mf, const amrex::Geometry &geom, int num_shift, int dir, const int lev, bool update_cost_flag, amrex::Real external_field=0.0, bool useparser=false, amrex::ParserExecutor< 3 > const &field_parser={})
Definition: WarpXMovingWindow.cpp:357
static int do_multi_J_n_depositions
Definition: WarpX.H:470
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_fp_nodal
Definition: WarpX.H:1670
void MacroscopicEvolveE(amrex::Real dt)
Definition: WarpXPushFieldsEM.cpp:1059
amrex::Vector< amrex::Real > t_new
Definition: WarpX.H:1571
static bool do_single_precision_comms
perform field communications in single precision
Definition: WarpX.H:353
amrex::IntVect slice_cr_ratio
Definition: WarpX.H:1817
void SyncCurrentAndRho()
Synchronize J and rho: filter (if used), exchange guard cells, interpolate across MR levels....
Definition: WarpXEvolve.cpp:602
int field_io_nfiles
Definition: WarpX.H:1800
static amrex::Vector< ParticleBoundaryType > particle_boundary_lo
Definition: WarpX.H:311
void AddSpaceChargeFieldLabFrame()
Definition: ElectrostaticSolver.cpp:194
static amrex::Vector< amrex::Real > B_external_grid
Initial magnetic field on the grid.
Definition: WarpX.H:120
std::unique_ptr< amrex::Parser > Exfield_xt_grid_parser
Definition: WarpX.H:233
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_store
Definition: WarpX.H:1667
void prepareFields(int const step, amrex::Vector< std::string > &varnames, amrex::Vector< amrex::MultiFab > &mf_avg, amrex::Vector< const amrex::MultiFab * > &output_mf, amrex::Vector< amrex::Geometry > &output_geom) const
void CheckKnownIssues()
Checks for known numerical issues involving different WarpX modules.
guardCellManager guard_cells
Definition: WarpX.H:1811
static bool do_shared_mem_charge_deposition
used shared memory algorithm for charge deposition
Definition: WarpX.H:356
amrex::VisMF::Header::Version slice_plotfile_headerversion
Definition: WarpX.H:1795
static int em_solver_medium
Integer that corresponds to electromagnetic Maxwell solver (vacuum - 0, macroscopic - 1)
Definition: WarpX.H:292
void ComputeMagnetostaticField()
Definition: MagnetostaticSolver.cpp:59
void computeB(amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > &B, const amrex::Vector< std::unique_ptr< amrex::MultiFab > > &phi, std::array< amrex::Real, 3 > const beta={{0, 0, 0}}) const
Definition: ElectrostaticSolver.cpp:568
amrex::Real stop_time
Definition: WarpX.H:1786
MultiParticleContainer & GetPartContainer()
Definition: WarpX.H:100
static amrex::Vector< int > boost_direction
Direction of the Lorentz transform that defines the boosted frame of the simulation.
Definition: WarpX.H:441
void ComputeDt()
Definition: WarpXComputeDt.cpp:33
void PSATDSubtractCurrentPartialSumsAvg()
Subtract the average of the cumulative sums of the preliminary current D from the current J (computed...
Definition: WarpXPushFieldsEM.cpp:430
static bool use_fdtd_nci_corr
Definition: WarpX.H:410
static bool verboncoeur_axis_correction
Definition: WarpX.H:424
static amrex::Real moving_window_v
Definition: WarpX.H:1111
static bool do_shared_mem_current_deposition
use shared memory algorithm for current deposition
Definition: WarpX.H:359
amrex::Vector< amrex::IntVect > do_pml_Hi
Definition: WarpX.H:1714
void setistep(int lev, int ii)
Definition: WarpX.H:1036
amrex::MultiFab * get_pointer_vector_potential_fp(int lev, int direction) const
Definition: WarpX.H:647
void BuildBufferMasksInBox(const amrex::Box tbx, amrex::IArrayBox &buffer_mask, const amrex::IArrayBox &guard_mask, const int ng)
Build buffer mask within given FArrayBox.
Definition: WarpX.cpp:3170
static bool fft_do_time_averaging
Definition: WarpX.H:1112
void EvolveF(amrex::Real dt, DtType dt_type)
Definition: WarpXPushFieldsEM.cpp:965
static short particle_pusher_algo
Integer that corresponds to the particle push algorithm (Boris, Vay, Higuera-Cary)
Definition: WarpX.H:284
virtual void ClearLevel(int lev) final
Delete level data. Called by AmrCore::regrid.
Definition: WarpX.cpp:1980
amrex::Vector< std::unique_ptr< PML > > pml
Definition: WarpX.H:1715
void FillBoundaryE_avg(amrex::IntVect ng)
Definition: WarpXComm.cpp:521
amrex::RealVect fine_tag_lo
Definition: WarpX.H:1803
std::string restart_chkfile
Definition: WarpX.H:1792
static WarpX * m_instance
Definition: WarpX.H:1364
const amrex::MultiFab & getG_fp(int lev)
Definition: WarpX.H:695
amrex::Vector< std::unique_ptr< amrex::MultiFab > > rho_cp
Definition: WarpX.H:1675
amrex::MultiFab * get_pointer_G_fp(int lev) const
Definition: WarpX.H:645
static amrex::RealBox getRealBox(const amrex::Box &bx, int lev)
Definition: WarpX.cpp:2922
static bool do_dynamic_scheduling
Definition: WarpX.H:457
void PostRestart()
static int ApplyExcitationInPML
Definition: WarpX.H:146
const amrex::MultiFab & getBfield_cp(int lev, int direction)
Definition: WarpX.H:673
void ReorderFornbergCoefficients(amrex::Vector< amrex::Real > &ordered_coeffs, amrex::Vector< amrex::Real > &unordered_coeffs, const int order)
Re-orders the Fornberg coefficients so that they can be used more conveniently for finite-order cente...
Definition: WarpX.cpp:3235
void InitFromCheckpoint()
Definition: WarpXIO.cpp:94
static std::string str_Ez_excitation_grid_function
Definition: WarpX.H:172
void SumBoundaryJ(const amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 >> &current, const int lev, const int idim, const amrex::Periodicity &period)
Definition: WarpXComm.cpp:1160
void RestrictCurrentFromFineToCoarsePatch(const amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 >> &J_fp, const amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 >> &J_cp, const int lev)
Fills the values of the current on the coarse patch by averaging the values of the current of the fin...
Definition: WarpXComm.cpp:1111
static std::array< amrex::Real, 3 > CellSize(int lev)
Definition: WarpX.cpp:2908
static std::string E_ext_grid_s
Initialization type for external electric field on the grid.
Definition: WarpX.H:131
amrex::Gpu::DeviceVector< amrex::Real > device_field_centering_stencil_coeffs_z
Definition: WarpX.H:1293
void AllocateCenteringCoefficients(amrex::Gpu::DeviceVector< amrex::Real > &device_centering_stencil_coeffs_x, amrex::Gpu::DeviceVector< amrex::Real > &device_centering_stencil_coeffs_y, amrex::Gpu::DeviceVector< amrex::Real > &device_centering_stencil_coeffs_z, const int centering_nox, const int centering_noy, const int centering_noz, const short a_grid_type)
Allocates and initializes the stencil coefficients used for the finite-order centering of fields and ...
Definition: WarpX.cpp:3248
amrex::MultiFab * get_pointer_phi_fp(int lev) const
Definition: WarpX.H:646
void PSATDForwardTransformEB(const amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 >> &E_fp, const amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 >> &B_fp, const amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 >> &E_cp, const amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 >> &B_cp)
Forward FFT of E,B on all mesh refinement levels.
Definition: WarpXPushFieldsEM.cpp:102
static int self_fields_verbosity
Definition: WarpX.H:1095
amrex::Real stopTime() const
Definition: WarpX.H:1051
std::unique_ptr< amrex::Parser > Byfield_parser
User-defined parser to initialize y-component of the magnetic field on the grid.
Definition: WarpX.H:217
amrex::Vector< std::unique_ptr< PML_RZ > > pml_rz
Definition: WarpX.H:1717
void FillBoundaryE(amrex::IntVect ng, std::optional< bool > nodal_sync=std::nullopt)
Definition: WarpXComm.cpp:485
amrex::Array1D< int, 0, 2 > CountExtFaces()
Auxiliary function to count the amount of faces which still need to be extended.
Definition: WarpXFaceExtensions.cpp:147
const amrex::MultiFab & getphi_fp(int lev)
Definition: WarpX.H:693
amrex::Vector< amrex::Real > m_v_comoving
Definition: WarpX.H:744
void InitData()
static std::map< std::string, amrex::MultiFab * > multifab_map
Definition: WarpX.H:558
void RestoreCurrent(const int lev)
Definition: WarpX.cpp:3330
void InitializeExternalFieldsOnGridUsingParser(amrex::MultiFab *mfx, amrex::MultiFab *mfy, amrex::MultiFab *mfz, amrex::ParserExecutor< 3 > const &xfield_parser, amrex::ParserExecutor< 3 > const &yfield_parser, amrex::ParserExecutor< 3 > const &zfield_parser, std::array< std::unique_ptr< amrex::MultiFab >, 3 > const &edge_lengths, std::array< std::unique_ptr< amrex::MultiFab >, 3 > const &face_areas, const char field, const int lev, PatchType patch_type)
This function initializes the E and B fields on each level using the parser and the user-defined func...
void PSATDBackwardTransformG()
Backward FFT of G on all mesh refinement levels.
Definition: WarpXPushFieldsEM.cpp:242
amrex::Array< amrex::Real, 3 > m_galilean_shift
Definition: WarpX.H:742
amrex::Gpu::DeviceVector< amrex::Real > device_field_centering_stencil_coeffs_x
Definition: WarpX.H:1291
amrex::MultiFab * get_pointer_current_fp(int lev, int direction) const
Definition: WarpX.H:641
void AddExternalFields()
void UpdateCurrentNodalToStag(amrex::MultiFab &dst, amrex::MultiFab const &src)
This function is called if warpx.do_current_centering = 1 and it centers the currents from a nodal gr...
Definition: WarpXComm.cpp:428
const amrex::IntVect get_ng_depos_rho() const
Definition: WarpX.H:1129
amrex::MultiFab * get_pointer_current_cp(int lev, int direction) const
Definition: WarpX.H:656
static std::string str_Bx_excitation_grid_function
Definition: WarpX.H:166
amrex::Vector< amrex::Real > getdt() const
Definition: WarpX.H:1042
static int noz
Order of the particle shape factors (splines) along z.
Definition: WarpX.H:384
static std::string E_excitation_grid_s
Definition: WarpX.H:135
amrex::Gpu::DeviceVector< amrex::Real > device_current_centering_stencil_coeffs_z
Definition: WarpX.H:1298
amrex::Vector< amrex::Real > gett_new() const
Definition: WarpX.H:1039
const amrex::MultiFab & getBfield_avg_cp(int lev, int direction)
Definition: WarpX.H:700
int mffile_nstreams
Definition: WarpX.H:1799
static int num_mirrors
Definition: WarpX.H:746
std::vector< bool > getPMLdirections() const
Definition: WarpX.cpp:3099
static std::string str_Ex_excitation_flag_function
Definition: WarpX.H:184
amrex::MultiFab * get_pointer_face_areas(int lev, int direction) const
Definition: WarpX.H:662
amrex::Vector< std::unique_ptr< amrex::MultiFab > > phi_fp
Definition: WarpX.H:1598
void AddMagnetostaticFieldLabFrame()
Definition: MagnetostaticSolver.cpp:71
ParticleBoundaryBuffer & GetParticleBoundaryBuffer()
Definition: WarpX.H:105
void WriteUsedInputsFile() const
void AddSpaceChargeField(WarpXParticleContainer &pc)
Definition: ElectrostaticSolver.cpp:140
void OneStep_nosub(amrex::Real t)
Definition: WarpXEvolve.cpp:418
bool do_pml_divb_cleaning
Definition: WarpX.H:1712
amrex::Vector< int > getistep() const
Definition: WarpX.H:1034
static int current_centering_noy
Order of finite centering of currents (from nodal grid to staggered grid), along y.
Definition: WarpX.H:396
static std::string str_By_excitation_grid_function
Definition: WarpX.H:167
void ReadParameters()
Definition: WarpX.cpp:580
static void ResetInstance()
Definition: WarpX.cpp:316
static void AddToMultiFabMap(const std::string &name, const std::unique_ptr< amrex::MultiFab > &mf)
Add the MultiFab to the map of MultiFabs.
Definition: WarpX.H:567
int verbose
Definition: WarpX.H:1781
amrex::Gpu::DeviceVector< amrex::Real > device_current_centering_stencil_coeffs_y
Definition: WarpX.H:1297
static bool add_external_E_field
Whether to apply the effect of an externally-defined electric field.
Definition: WarpX.H:148
amrex::MultiFab * get_pointer_Efield_aux(int lev, int direction) const
Definition: WarpX.H:624
void InitDiagnostics()
int MoveWindow(const int step, bool move_j)
Move the moving window.
Definition: WarpXMovingWindow.cpp:82
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_avg_cp
Definition: WarpX.H:1684
void InitLevelData(int lev, amrex::Real time)
This function initializes E, B, rho, and F, at all the levels of the multifab. rho and F are initiali...
const amrex::MultiFab & getrho_cp(int lev)
Definition: WarpX.H:679
amrex::Real load_balance_knapsack_factor
Definition: WarpX.H:1755
void setVectorPotentialBC(amrex::Vector< amrex::Array< std::unique_ptr< amrex::MultiFab >, 3 > > &A) const
Definition: MagnetostaticSolver.cpp:206
amrex::Vector< amrex::Real > load_balance_efficiency
Definition: WarpX.H:1763
static amrex::Real self_fields_required_precision
Definition: WarpX.H:1092
static amrex::IntVect sort_bin_size
Definition: WarpX.H:461
static std::string str_Bx_ext_grid_function
String storing parser function to initialize x-component of the magnetic field on the grid.
Definition: WarpX.H:153
amrex::IntVect m_rho_nodal_flag
Definition: WarpX.H:489
static std::map< std::string, amrex::iMultiFab * > imultifab_map
Definition: WarpX.H:559
utils::parser::IntervalsParser load_balance_intervals
Definition: WarpX.H:1745
amrex::Vector< std::array< std::unique_ptr< amrex::iMultiFab >, 3 > > m_flag_ext_face
Definition: WarpX.H:1640
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_fp
Definition: WarpX.H:1599
static std::array< amrex::Real, 3 > LowerCorner(const amrex::Box &bx, const int lev, const amrex::Real time_shift_delta)
Return the lower corner of the box in real units.
Definition: WarpX.cpp:2930
utils::parser::IntervalsParser override_sync_intervals
Definition: WarpX.H:1778
void EvolveB(amrex::Real dt, DtType dt_type)
Definition: WarpXPushFieldsEM.cpp:833
std::unique_ptr< amrex::Parser > Bxfield_parser
User-defined parser to initialize x-component of the magnetic field on the grid.
Definition: WarpX.H:215
London & getLondon()
Definition: WarpX.H:102
bool isAnyBoundaryPML()
Definition: WarpX.cpp:3340
utils::parser::IntervalsParser get_load_balance_intervals() const
returns the load balance interval
Definition: WarpX.H:853
void ComputeCostsHeuristic(amrex::Vector< std::unique_ptr< amrex::LayoutData< amrex::Real > > > &costs)
adds particle and cell contributions in cells to compute heuristic cost in each box on each level,...
Definition: WarpXRegrid.cpp:369
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > m_face_areas
EB: Areas of the mesh faces.
Definition: WarpX.H:1625
amrex::Real gett_old(int lev) const
Definition: WarpX.H:1038
std::unique_ptr< amrex::Parser > Exfield_parser
User-defined parser to initialize x-component of the electric field on the grid.
Definition: WarpX.H:221
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_cax
Definition: WarpX.H:1689
amrex::MultiFab * get_pointer_F_cp(int lev) const
Definition: WarpX.H:658
amrex::MultiFab * get_pointer_Bfield_sc_fp(int lev, int direction) const
Definition: WarpX.H:633
const amrex::MultiFab & getF_fp(int lev)
Definition: WarpX.H:694
std::unique_ptr< amrex::Parser > Exfield_flag_parser
Definition: WarpX.H:246
void StoreCurrent(const int lev)
Definition: WarpX.cpp:3319
static int do_moving_window
Definition: WarpX.H:1097
virtual void MakeNewLevelFromCoarse(int, amrex::Real, const amrex::BoxArray &, const amrex::DistributionMapping &) final
Definition: WarpX.cpp:1973
amrex::Real moving_window_x
Definition: WarpX.H:1721
amrex::MultiFab * get_pointer_Efield_cp(int lev, int direction) const
Definition: WarpX.H:649
void ReadExternalFieldFromFile(std::string read_fields_from_path, amrex::MultiFab *mf, std::string F_name, std::string F_component)
static std::string str_By_ext_grid_function
String storing parser function to initialize y-component of the magnetic field on the grid.
Definition: WarpX.H:155
int maxStep() const
Definition: WarpX.H:1049
static int nox
Order of the particle shape factors (splines) along x.
Definition: WarpX.H:380
int getnsubsteps(int lev) const
Definition: WarpX.H:1033
static void AllocInitMultiFab(std::unique_ptr< amrex::MultiFab > &mf, const amrex::BoxArray &ba, const amrex::DistributionMapping &dm, const int ncomp, const amrex::IntVect &ngrow, const std::string &name, std::optional< const amrex::Real > initial_value={})
Allocate and optionally initialize the MultiFab. This also adds the MultiFab to the map of MultiFabs ...
Definition: WarpX.cpp:3350
static amrex::Real quantum_xi_c2
Definition: WarpX.H:842
const amrex::IntVect getngF() const
Definition: WarpX.H:1126
static void GotoNextLine(std::istream &is)
Definition: WarpXIO.cpp:54
void InitFromScratch()
static amrex::Vector< amrex::Real > getFornbergStencilCoefficients(const int n_order, const short a_grid_type)
Returns an array of coefficients (Fornberg coefficients), corresponding to the weight of each point i...
Definition: WarpX.cpp:3192
void AllocLevelData(int lev, const amrex::BoxArray &new_grids, const amrex::DistributionMapping &new_dmap)
Definition: WarpX.cpp:2061
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_slice
Definition: WarpX.H:1823
void AverageAndPackFields(amrex::Vector< std::string > &varnames, amrex::Vector< amrex::MultiFab > &mf_avg, const amrex::IntVect ngrow) const
amrex::Vector< std::array< std::unique_ptr< amrex::iMultiFab >, 3 > > m_flag_info_face
Definition: WarpX.H:1633
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_fp_vay
Definition: WarpX.H:1600
static void AddToMultiFabMap(const std::string &name, const std::unique_ptr< amrex::iMultiFab > &mf)
Add the iMultiFab to the map of MultiFabs.
Definition: WarpX.H:577
void AddRhoFromFineLevelandSumBoundary(const amrex::Vector< std::unique_ptr< amrex::MultiFab >> &charge_fp, const amrex::Vector< std::unique_ptr< amrex::MultiFab >> &charge_cp, const int lev, const int icomp, const int ncomp)
Definition: WarpXComm.cpp:1357
void updateMaxStep(const int new_max_step)
Definition: WarpX.H:1050
void PSATDMoveJNewToJOld()
Copy J_new to J_old in spectral space (when J is linear in time)
Definition: WarpXPushFieldsEM.cpp:576
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_cp
Definition: WarpX.H:1678
static bool serialize_initial_conditions
If true, the initial conditions from random number generators are serialized (useful for reproducible...
Definition: WarpX.H:434
const amrex::iMultiFab * getGatherBufferMasks(int lev) const
Definition: WarpX.H:1510
std::unique_ptr< amrex::Parser > Bzfield_parser
User-defined parser to initialize z-component of the magnetic field on the grid.
Definition: WarpX.H:219
void doQEDEvents()
Definition: WarpXEvolve.cpp:1034
amrex::Vector< std::unique_ptr< SpectralSolverRZ > > spectral_solver_fp
Definition: WarpX.H:2103
void ApplyInverseVolumeScalingToChargeDensity(amrex::MultiFab *Rho, int lev)
Definition: WarpXPushFieldsEM.cpp:1546
static amrex::IntVect m_fill_guards_fields
Whether to fill guard cells when computing inverse FFTs of fields.
Definition: WarpX.H:368
void CopyJPML()
Copy the current J from the regular grid to the PML.
Definition: WarpXEvolvePML.cpp:374
static short grid_type
Definition: WarpX.H:486
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > vector_potential_grad_buf_b_stag
Definition: WarpX.H:1616
void NodalSyncJ(const amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 >> &J_fp, const amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 >> &J_cp, const int lev, PatchType patch_type)
Definition: WarpXComm.cpp:1437
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_aux
Definition: WarpX.H:1584
const amrex::MultiFab & getEfield_cp(int lev, int direction)
Definition: WarpX.H:672
void PSATDCurrentCorrection()
Correct current in Fourier space so that the continuity equation is satisfied.
Definition: WarpXPushFieldsEM.cpp:404
static int current_centering_nox
Order of finite centering of currents (from nodal grid to staggered grid), along x.
Definition: WarpX.H:394
amrex::MultiFab * get_pointer_Bfield_aux(int lev, int direction) const
Definition: WarpX.H:625
static bool use_filter_compensation
If true, a compensation step is added to the bilinear filtering of charge and currents.
Definition: WarpX.H:431
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > vector_potential_grad_buf_e_stag
Definition: WarpX.H:1615
amrex::Vector< std::array< std::unique_ptr< amrex::LayoutData< FaceInfoBox > >, 3 > > m_borrowing
Definition: WarpX.H:1648
void PSATDPushSpectralFields()
Update all necessary fields in spectral space.
Definition: WarpXPushFieldsEM.cpp:546
static bool add_external_B_field
Whether to apply the effect of an externally-defined magnetic field.
Definition: WarpX.H:150
static short charge_deposition_algo
Integer that corresponds to the charge deposition algorithm (only standard deposition)
Definition: WarpX.H:280
void PushParticlesandDepose(int lev, amrex::Real cur_time, DtType a_dt_type=DtType::Full, bool skip_current=false)
Definition: WarpXEvolve.cpp:1061
amrex::Real cfl
Definition: WarpX.H:1790
static std::string str_Ey_excitation_flag_function
Definition: WarpX.H:185
static std::string str_Ez_excitation_flag_function
Definition: WarpX.H:186
amrex::Real gett_new(int lev) const
Definition: WarpX.H:1040
amrex::Vector< amrex::Real > dt
Definition: WarpX.H:1573
amrex::Vector< std::unique_ptr< amrex::MultiFab > > rho_slice
Definition: WarpX.H:1820
amrex::Vector< std::unique_ptr< amrex::MultiFab > > F_cp
Definition: WarpX.H:1673
std::unique_ptr< amrex::Parser > Bzfield_xt_grid_parser
Definition: WarpX.H:231
int nox_fft
Definition: WarpX.H:1826
void UpdateAuxilaryData()
Definition: WarpXComm.cpp:53
int particle_io_nfiles
Definition: WarpX.H:1801
bool is_synchronized
Definition: WarpX.H:1806
amrex::Real current_injection_position
Definition: WarpX.H:1722
static WarpX & GetInstance()
Definition: WarpX.cpp:307
amrex::Real getcurrent_injection_position() const
Definition: WarpX.H:1046
void ApplyExternalFieldExcitationOnGrid(int const externalfieldtype, DtType a_dt_type=DtType::Full)
Adds the contribution of user-defined external field-excitation to Efield, Bfield,...
Definition: WarpXExternalEMFields.cpp:22
amrex::RealVect fine_tag_hi
Definition: WarpX.H:1804
const amrex::MultiFab & getBfield_sc_fp(int lev, int direction)
Definition: WarpX.H:686
static int start_moving_window_step
Definition: WarpX.H:1098
PML_RZ * GetPML_RZ(int lev)
Definition: WarpX.cpp:3076
void PSATDForwardTransformF()
Forward FFT of F on all mesh refinement levels.
Definition: WarpXPushFieldsEM.cpp:180
int do_silver_mueller
Definition: WarpX.H:1704
void setPhiBC(amrex::Vector< std::unique_ptr< amrex::MultiFab > > &phi) const
Definition: ElectrostaticSolver.cpp:369
amrex::Vector< int > istep
Definition: WarpX.H:1568
static int electrostatic_solver_id
Definition: WarpX.H:1089
void PrintMainPICparameters()
void FillBoundaryB(amrex::IntVect ng, std::optional< bool > nodal_sync=std::nullopt)
Definition: WarpXComm.cpp:476
void UpdatePlasmaInjectionPosition(amrex::Real dt)
Definition: WarpXMovingWindow.cpp:56
static std::string str_Ex_excitation_grid_function
Definition: WarpX.H:170
void RestrictRhoFromFineToCoarsePatch(const amrex::Vector< std::unique_ptr< amrex::MultiFab >> &charge_fp, const amrex::Vector< std::unique_ptr< amrex::MultiFab >> &charge_cp, const int lev)
Definition: WarpXComm.cpp:1299
const AcceleratorLattice & get_accelerator_lattice(int lev)
Definition: WarpX.H:1305
void HandleSignals()
Complete the asynchronous broadcast of signal flags, and initiate a checkpoint if requested.
Definition: WarpXEvolve.cpp:1202
amrex::Vector< std::unique_ptr< amrex::MultiFab > > G_slice
Definition: WarpX.H:1819
static int n_current_deposition_buffer
Definition: WarpX.H:482
static void AliasInitMultiFab(std::unique_ptr< amrex::MultiFab > &mf, const amrex::MultiFab &mf_to_alias, const int scomp, const int ncomp, const std::string &name, std::optional< const amrex::Real > initial_value)
Create an alias of a MultiFab, adding the alias to the MultiFab map.
Definition: WarpX.cpp:3386
std::unique_ptr< amrex::Parser > Bxfield_flag_parser
Definition: WarpX.H:249
amrex::Vector< std::unique_ptr< amrex::MultiFab > > F_fp
Definition: WarpX.H:1595
static amrex::Vector< int > field_boundary_hi
Definition: WarpX.H:306
void UpdateAuxilaryDataStagToNodal()
Definition: WarpXComm.cpp:65
std::unique_ptr< amrex::Parser > Byfield_flag_parser
Definition: WarpX.H:250
int Verbose() const
Definition: WarpX.H:94
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_cax
Definition: WarpX.H:1688
std::unique_ptr< amrex::Parser > Eyfield_xt_grid_parser
Definition: WarpX.H:234
amrex::Vector< std::unique_ptr< amrex::MultiFab > > charge_buf
Definition: WarpX.H:1700
amrex::DistributionMapping GetRestartDMap(const std::string &chkfile, const amrex::BoxArray &ba, int lev) const
Definition: WarpXIO.cpp:61
std::array< const amrex::MultiFab *const, 3 > get_array_Bfield_aux(const int lev) const
Definition: WarpX.H:582
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > m_edge_lengths
EB: Lengths of the mesh edges.
Definition: WarpX.H:1623
const amrex::iMultiFab * getCurrentBufferMasks(int lev) const
Definition: WarpX.H:1507
void ShiftGalileanBoundary()
This function shifts the boundary of the grid by 'm_v_galilean*dt'. In doding so, only positions attr...
Definition: WarpXMovingWindow.cpp:528
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_avg_fp
Definition: WarpX.H:1608
amrex::Vector< int > injected_plasma_species
Definition: WarpX.H:1727
static bool do_device_synchronize
Definition: WarpX.H:472
void Evolve(int numsteps=-1)
Definition: WarpXEvolve.cpp:62
void CheckGuardCells(amrex::MultiFab const &mf)
Check that the number of guard cells is smaller than the number of valid cells, for a given MultiFab,...
static bool use_kspace_filter
If true, the bilinear filtering of charge and currents is done in Fourier space.
Definition: WarpX.H:429
amrex::MultiFab * get_pointer_F_fp(int lev) const
Definition: WarpX.H:644
void InitNCICorrector()
int getistep(int lev) const
Definition: WarpX.H:1035
std::unique_ptr< MultiDiagnostics > multi_diags
Definition: WarpX.H:1577
std::unique_ptr< amrex::Parser > Ezfield_parser
User-defined parser to initialize z-component of the electric field on the grid.
Definition: WarpX.H:225
static int noy
Order of the particle shape factors (splines) along y.
Definition: WarpX.H:382
void EvolveEM(int numsteps)
amrex::Vector< int > nsubsteps
Definition: WarpX.H:1569
void AddCurrentFromFineLevelandSumBoundary(const amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 >> &J_fp, const amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 >> &J_cp, const int lev)
Definition: WarpXComm.cpp:1222
void ComputeMaxStep()
Compute the last time step of the simulation Calls computeMaxStepBoostAccelerator() if required.
void SyncRho()
Definition: WarpXComm.cpp:1076
int noz_fft
Definition: WarpX.H:1828
void PSATDForwardTransformRho(const amrex::Vector< std::unique_ptr< amrex::MultiFab >> &charge_fp, const amrex::Vector< std::unique_ptr< amrex::MultiFab >> &charge_cp, const int icomp, const int dcomp, const bool apply_kspace_filter=true)
Forward FFT of rho on all mesh refinement levels, with k-space filtering (if needed)
Definition: WarpXPushFieldsEM.cpp:368
void ApplyFilterJ(const amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 >> &current, const int lev, const int idim)
Definition: WarpXComm.cpp:1133
static int field_centering_noz
Order of finite centering of fields (from staggered grid to nodal grid), along z.
Definition: WarpX.H:391
void EvolveBLondon(amrex::Real dt, DtType dt_type)
Definition: WarpXPushFieldsEM.cpp:794
void sett_new(int lev, amrex::Real time)
Definition: WarpX.H:1041
void computePhiTriDiagonal(const amrex::Vector< std::unique_ptr< amrex::MultiFab > > &rho, amrex::Vector< std::unique_ptr< amrex::MultiFab > > &phi) const
Definition: ElectrostaticSolver.cpp:677
amrex::Real load_balance_efficiency_ratio_threshold
Definition: WarpX.H:1761
void PSATDBackwardTransformEBavg(const amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 >> &E_avg_fp, const amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 >> &B_avg_fp, const amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 >> &E_avg_cp, const amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 >> &B_avg_cp)
Backward FFT of averaged E,B on all mesh refinement levels.
Definition: WarpXPushFieldsEM.cpp:154
void DampPML()
Definition: WarpXEvolvePML.cpp:43
static std::string PicsarVersion()
Version of PICSAR dependency.
Definition: WarpXVersion.cpp:27
static amrex::Real beta_boost
Beta value corresponding to the Lorentz factor of the boosted frame of the simulation.
Definition: WarpX.H:439
void FillBoundaryAux(amrex::IntVect ng)
Definition: WarpXComm.cpp:1002
void PSATDBackwardTransformJ(const amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 >> &J_fp, const amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 >> &J_cp)
Backward FFT of J on all mesh refinement levels.
Definition: WarpXPushFieldsEM.cpp:332
void FillBoundaryB_avg(amrex::IntVect ng)
Definition: WarpXComm.cpp:512
void ShrinkBorrowing()
Shrink the vectors in the FaceInfoBoxes.
Definition: WarpXFaceExtensions.cpp:720
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_fp_external
Definition: WarpX.H:1619
void ComputeDivE(amrex::MultiFab &divE, const int lev)
Definition: WarpX.cpp:3060
amrex::MultiFab * get_pointer_G_cp(int lev) const
Definition: WarpX.H:659
void InitializeEBGridData(int lev)
This function initializes and calculates grid quantities used along with EBs such as edge lengths,...
void CheckGuardCells()
Check that the number of guard cells is smaller than the number of valid cells, for all available Mul...
static bool do_divb_cleaning
Solve additional Maxwell equation for G in order to control errors in magnetic Gauss' law.
Definition: WarpX.H:377
void NodalSyncRho(const amrex::Vector< std::unique_ptr< amrex::MultiFab >> &charge_fp, const amrex::Vector< std::unique_ptr< amrex::MultiFab >> &charge_cp, const int lev, PatchType patch_type, const int icomp, const int ncomp)
Definition: WarpXComm.cpp:1461
void ApplyExternalFieldExcitationOnGrid(amrex::MultiFab *mfx, amrex::MultiFab *mfy, amrex::MultiFab *mfz, amrex::ParserExecutor< 4 > const &xfield_parser, amrex::ParserExecutor< 4 > const &yfield_parser, amrex::ParserExecutor< 4 > const &zfield_parser, amrex::ParserExecutor< 3 > const &xflag_parser, amrex::ParserExecutor< 3 > const &yflag_parser, amrex::ParserExecutor< 3 > const &zflag_parser, const int lev, DtType a_dt_type)
WarpX()
Definition: WarpX.cpp:322
const amrex::IntVect get_ng_depos_J() const
Definition: WarpX.H:1128
int load_balance_with_sfc
Definition: WarpX.H:1750
amrex::Real getLoadBalanceEfficiency(const int lev)
Definition: WarpX.H:724
std::unique_ptr< MultiParticleContainer > mypc
Definition: WarpX.H:1576
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_buf
Definition: WarpX.H:1699
static bool use_filter
If true, a bilinear filter is used to smooth charge and currents.
Definition: WarpX.H:427
amrex::MultiFab * get_pointer_rho_fp(int lev) const
Definition: WarpX.H:643
static amrex::IntVect m_fill_guards_current
Whether to fill guard cells when computing inverse FFTs of currents.
Definition: WarpX.H:371
MacroscopicProperties & GetMacroscopicProperties()
Definition: WarpX.H:101
MagnetostaticSolver::VectorPoissonBoundaryHandler m_vector_poisson_boundary_handler
Definition: WarpX.H:1166
const amrex::MultiFab & getG_cp(int lev)
Definition: WarpX.H:681
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > vector_potential_fp_nodal
Definition: WarpX.H:1614
ElectrostaticSolver::PoissonBoundaryHandler m_poisson_boundary_handler
Definition: WarpX.H:1141
static amrex::IntVect shared_tilesize
tileSize to use for shared current deposition operations
Definition: WarpX.H:365
static int do_similar_dm_pml
Definition: WarpX.H:1710
static std::string str_Ey_ext_grid_function
String storing parser function to initialize y-component of the electric field on the grid.
Definition: WarpX.H:161
void ReadExcitationParser()
Definition: WarpXExternalEMFields.cpp:222
amrex::Vector< std::unique_ptr< FiniteDifferenceSolver > > m_fdtd_solver_fp
Definition: WarpX.H:2121
void ApplyInverseVolumeScalingToCurrentDensity(amrex::MultiFab *Jx, amrex::MultiFab *Jy, amrex::MultiFab *Jz, int lev)
Definition: WarpXPushFieldsEM.cpp:1373
amrex::Vector< amrex::Real > gett_old() const
Definition: WarpX.H:1037
static int current_centering_noz
Order of finite centering of currents (from nodal grid to staggered grid), along z.
Definition: WarpX.H:398
static bool safe_guard_cells
Definition: WarpX.H:473
static std::string str_Ey_excitation_grid_function
Definition: WarpX.H:171
void PSATDScaleAverageFields(const amrex::Real scale_factor)
Scale averaged E,B fields to account for time integration.
Definition: WarpXPushFieldsEM.cpp:622
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_cp
Definition: WarpX.H:1677
amrex::Vector< std::unique_ptr< amrex::MultiFab > > rho_fp
Definition: WarpX.H:1597
int slice_plot_int
Definition: WarpX.H:1815
amrex::MultiFab * get_pointer_rho_cp(int lev) const
Definition: WarpX.H:657
void InitEB()
Definition: WarpXInitEB.cpp:81
void BackwardCompatibility()
Definition: WarpX.cpp:1722
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_fp
Definition: WarpX.H:1602
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > ECTRhofield
Definition: WarpX.H:1657
void ApplyEfieldBoundary(const int lev, PatchType patch_type)
Definition: WarpXFieldBoundaries.cpp:20
int num_injected_species
Definition: WarpX.H:1726
void AllocLevelSpectralSolverRZ(amrex::Vector< std::unique_ptr< SpectralSolverRZ >> &spectral_solver, const int lev, const amrex::BoxArray &realspace_ba, const amrex::DistributionMapping &dm, const std::array< amrex::Real, 3 > &dx)
Definition: WarpX.cpp:2818
amrex::Vector< amrex::Real > t_old
Definition: WarpX.H:1572
static amrex::IntVect sort_idx_type
Specifies the type of grid used for the above sorting, i.e. cell-centered, nodal, or mixed.
Definition: WarpX.H:466
int regrid_int
Definition: WarpX.H:1788
bool use_single_write
Definition: WarpX.H:1798
static bool refine_plasma
Definition: WarpX.H:458
void SyncCurrent(const amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 >> &J_fp, const amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 >> &J_cp)
Apply filter and sum guard cells across MR levels. If current centering is used, center the current f...
Definition: WarpXComm.cpp:1028
amrex::FabFactory< amrex::FArrayBox > const & fieldFactory(int lev) const noexcept
Definition: WarpX.H:1846
static int macroscopic_solver_algo
Definition: WarpX.H:296
bool use_single_read
Definition: WarpX.H:1797
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_aux
Definition: WarpX.H:1585
amrex::IntVect numprocs
Domain decomposition on Level 0.
Definition: WarpX.H:1831
static int ncomps
Definition: WarpX.H:406
static int yee_coupled_solver_algo
Definition: WarpX.H:317
static int moving_window_active(int const step)
Definition: WarpX.H:1105
void PSATDForwardTransformG()
Forward FFT of G on all mesh refinement levels.
Definition: WarpXPushFieldsEM.cpp:226
const bool sync_nodal_points
Definition: WarpX.H:1809
void DampPML_Cartesian(const int lev, PatchType patch_type)
Definition: WarpXEvolvePML.cpp:76
const amrex::IntVect getngUpdateAux() const
Definition: WarpX.H:1127
void FillBoundaryJ(amrex::IntVect ng)
Definition: WarpXComm.cpp:530
int warpx_do_continuous_injection
Definition: WarpX.H:1725
static bool galerkin_interpolation
Definition: WarpX.H:420
static std::string str_Ez_ext_grid_function
String storing parser function to initialize z-component of the electric field on the grid.
Definition: WarpX.H:163
int do_pml_in_domain
Definition: WarpX.H:1709
void PSATDForwardTransformJ(const amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 >> &J_fp, const amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 >> &J_cp, const bool apply_kspace_filter=true)
Forward FFT of J on all mesh refinement levels, with k-space filtering (if needed)
Definition: WarpXPushFieldsEM.cpp:271
amrex::Vector< std::unique_ptr< NCIGodfreyFilter > > nci_godfrey_filter_bxbyez
Definition: WarpX.H:738
virtual void ErrorEst(int lev, amrex::TagBoxArray &tags, amrex::Real time, int) final
Tagging cells for refinement.
Definition: WarpXTagging.cpp:28
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > m_area_mod
Definition: WarpX.H:1644
void AllocLevelMFs(int lev, const amrex::BoxArray &ba, const amrex::DistributionMapping &dm, const amrex::IntVect &ngEB, amrex::IntVect &ngJ, const amrex::IntVect &ngRho, const amrex::IntVect &ngF, const amrex::IntVect &ngG, const bool aux_is_nodal)
Definition: WarpX.cpp:2141
void PrintDtDxDyDz()
Definition: WarpXComputeDt.cpp:92
virtual void MakeNewLevelFromScratch(int lev, amrex::Real time, const amrex::BoxArray &ba, const amrex::DistributionMapping &dm) final
Definition: WarpX.cpp:1964
static amrex::IntVect filter_npass_each_dir
Definition: WarpX.H:735
const amrex::MultiFab & getBfield_fp(int lev, int direction)
Definition: WarpX.H:685
void ComputeDistanceToEB()
Compute the length of the mesh edges. Here the length is a value in [0, 1]. An edge of length 0 is fu...
Definition: WarpXInitEB.cpp:408
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Venl
Definition: WarpX.H:1661
void setLoadBalanceEfficiency(const int lev, const amrex::Real efficiency)
Definition: WarpX.H:713
static short electromagnetic_solver_id
Integer that corresponds to the type of Maxwell solver (Yee, CKC, PSATD, ECT)
Definition: WarpX.H:286
void InitPML()
PML * GetPML(int lev)
Definition: WarpX.cpp:3088
std::unique_ptr< amrex::Parser > Bxfield_xt_grid_parser
Definition: WarpX.H:229
amrex::Real v_particle_pml
Definition: WarpX.H:1719
void OneStep_sub1(amrex::Real t)
Definition: WarpXEvolve.cpp:858
std::unique_ptr< London > m_london
Definition: WarpX.H:1734
BilinearFilter bilinear_filter
Definition: WarpX.H:736
void FillBoundaryF(amrex::IntVect ng, std::optional< bool > nodal_sync=std::nullopt)
Definition: WarpXComm.cpp:494
amrex::MultiFab * get_pointer_current_fp_nodal(int lev, int direction) const
Definition: WarpX.H:642
bool fft_periodic_single_box
Definition: WarpX.H:1825
const amrex::MultiFab & getEfield_avg_fp(int lev, int direction)
Definition: WarpX.H:697
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_avg_fp
Definition: WarpX.H:1609
const amrex::MultiFab & getBfield_avg_fp(int lev, int direction)
Definition: WarpX.H:698
static amrex::LayoutData< amrex::Real > * getCosts(int lev)
Definition: WarpX.cpp:3117
void PushPSATD()
Definition: WarpXPushFieldsEM.cpp:649
static int field_centering_noy
Order of finite centering of fields (from staggered grid to nodal grid), along y.
Definition: WarpX.H:389
int do_pml
Definition: WarpX.H:1703
static std::string str_Bz_ext_grid_function
String storing parser function to initialize z-component of the magnetic field on the grid.
Definition: WarpX.H:157
amrex::Real getdt(int lev) const
Definition: WarpX.H:1043
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_fp_external
Definition: WarpX.H:1620
static amrex::IntVect RefRatio(int lev)
Definition: WarpX.cpp:2980
int max_step
Definition: WarpX.H:1785
void ApplyBfieldBoundary(const int lev, PatchType patch_type, DtType dt_type)
Definition: WarpXFieldBoundaries.cpp:45
void EvolveG(amrex::Real dt, DtType dt_type)
Definition: WarpXPushFieldsEM.cpp:1015
const amrex::MultiFab & getEfield_avg_cp(int lev, int direction)
Definition: WarpX.H:699
amrex::Real costs_heuristic_particles_wt
Definition: WarpX.H:1775
int pml_has_particles
Definition: WarpX.H:1707
amrex::Vector< std::unique_ptr< NCIGodfreyFilter > > nci_godfrey_filter_exeybz
Definition: WarpX.H:737
static bool do_current_centering
Definition: WarpX.H:342
std::unique_ptr< amrex::Parser > Byfield_xt_grid_parser
Definition: WarpX.H:230
amrex::Vector< amrex::Real > mirror_z
Definition: WarpX.H:747
amrex::Vector< std::unique_ptr< amrex::MultiFab > > F_slice
Definition: WarpX.H:1818
int getdo_moving_window() const
Definition: WarpX.H:1044
static bool do_subcycling
Definition: WarpX.H:468
int pml_ncell
Definition: WarpX.H:1705
static void ComputeDivB(amrex::MultiFab &divB, int const dcomp, const std::array< const amrex::MultiFab *const, 3 > &B, const std::array< amrex::Real, 3 > &dx)
Definition: WarpX.cpp:2986
static int n_rz_azimuthal_modes
Number of modes for the RZ multi-mode version.
Definition: WarpX.H:401
static short J_in_time
Definition: WarpX.H:326
void PSATDBackwardTransformF()
Backward FFT of F on all mesh refinement levels.
Definition: WarpXPushFieldsEM.cpp:196
~WarpX()
Definition: WarpX.cpp:571
static amrex::Real gamma_boost
Lorentz factor of the boosted frame in which a boosted-frame simulation is run.
Definition: WarpX.H:437
static short field_gathering_algo
Integer that corresponds to the field gathering algorithm (energy-conserving, momentum-conserving)
Definition: WarpX.H:282
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_avg_cp
Definition: WarpX.H:1685
static int shared_mem_current_tpb
number of threads to use per block in shared deposition
Definition: WarpX.H:362
static short load_balance_costs_update_algo
Definition: WarpX.H:290
amrex::MultiFab * get_pointer_Bfield_fp(int lev, int direction) const
Definition: WarpX.H:632
amrex::Vector< std::unique_ptr< FiniteDifferenceSolver > > m_fdtd_solver_cp
Definition: WarpX.H:2122
void ResetCosts()
resets costs to zero
Definition: WarpXRegrid.cpp:399
void InitBorrowing()
Initialize the memory for the FaceInfoBoxes.
Definition: WarpXFaceExtensions.cpp:258
void computeMaxStepBoostAccelerator()
void OneStep_multiJ(const amrex::Real t)
Perform one PIC iteration, with the multiple J deposition per time step.
Definition: WarpXEvolve.cpp:671
amrex::Vector< amrex::Real > mirror_z_width
Definition: WarpX.H:748
const amrex::MultiFab & getcurrent_fp(int lev, int direction)
Definition: WarpX.H:683
std::unique_ptr< MultiReducedDiags > reduced_diags
object with all reduced diagnotics, similar to MultiParticleContainer for species.
Definition: WarpX.H:752
const amrex::MultiFab & getBfield(int lev, int direction)
Definition: WarpX.H:665
void PerformanceHints()
void ApplyBCKCorrection(const int idim)
Whenever an unstable cell cannot be extended we increase its area to be the minimal for stability....
Definition: WarpXFaceExtensions.cpp:687
const amrex::MultiFab & getF_cp(int lev)
Definition: WarpX.H:680
amrex::Vector< std::unique_ptr< amrex::iMultiFab > > current_buffer_masks
Definition: WarpX.H:1695
const amrex::IntVect get_numprocs() const
Definition: WarpX.H:1139
void ScrapeParticles()
amrex::MultiFab * get_pointer_Bfield_cp(int lev, int direction) const
Definition: WarpX.H:650
int slice_max_grid_size
Definition: WarpX.H:1814
static std::string B_ext_grid_s
Initialization type for external magnetic field on the grid.
Definition: WarpX.H:129
void PSATDEraseAverageFields()
Set averaged E,B fields to zero before new iteration.
Definition: WarpXPushFieldsEM.cpp:596
virtual void RemakeLevel(int lev, amrex::Real time, const amrex::BoxArray &ba, const amrex::DistributionMapping &dm) final
Definition: WarpXRegrid.cpp:161
amrex::Vector< std::unique_ptr< amrex::MultiFab > > G_cp
Definition: WarpX.H:1674
void FillBoundaryG(amrex::IntVect ng, std::optional< bool > nodal_sync=std::nullopt)
Definition: WarpXComm.cpp:503
const amrex::MultiFab & getEfield(int lev, int direction)
Definition: WarpX.H:664
void ComputeEightWaysExtensions()
Do the eight-ways extension.
Definition: WarpXFaceExtensions.cpp:529
void ApplyFilterandSumBoundaryRho(int lev, int glev, amrex::MultiFab &rho, int icomp, int ncomp)
Definition: WarpXComm.cpp:1326
std::unique_ptr< amrex::Parser > Eyfield_parser
User-defined parser to initialize y-component of the electric field on the grid.
Definition: WarpX.H:223
static amrex::Real self_fields_absolute_tolerance
Definition: WarpX.H:1093
amrex::Vector< std::unique_ptr< AcceleratorLattice > > m_accelerator_lattice
Definition: WarpX.H:1837
void EvolveE(amrex::Real dt)
Definition: WarpXPushFieldsEM.cpp:882
static amrex::Vector< ParticleBoundaryType > particle_boundary_hi
Definition: WarpX.H:316
std::optional< amrex::Real > m_const_dt
Definition: WarpX.H:1729
static std::array< amrex::Real, 3 > UpperCorner(const amrex::Box &bx, const int lev, const amrex::Real time_shift_delta)
Return the upper corner of the box in real units.
Definition: WarpX.cpp:2955
void ComputeOneWayExtensions()
Do the one-way extension.
Definition: WarpXFaceExtensions.cpp:405
void Hybrid_QED_Push(amrex::Vector< amrex::Real > dt)
Definition: WarpX_QED_Field_Pushers.cpp:46
amrex::RealBox slice_realbox
Definition: WarpX.H:1816
amrex::Vector< amrex::IntVect > do_pml_Lo
Definition: WarpX.H:1713
void applyMirrors(amrex::Real time)
Definition: WarpXEvolve.cpp:1126
amrex::Vector< std::unique_ptr< SpectralSolverRZ > > spectral_solver_cp
Definition: WarpX.H:2104
amrex::Real getmoving_window_x() const
Definition: WarpX.H:1045
amrex::Real costs_heuristic_cells_wt
Definition: WarpX.H:1769
static amrex::Vector< amrex::Real > E_external_grid
Initial electric field on the grid.
Definition: WarpX.H:118
bool do_pml_dive_cleaning
Definition: WarpX.H:1711
static std::string authors
Author of an input file / simulation setup.
Definition: WarpX.H:115
amrex::VisMF::Header::Version plotfile_headerversion
Definition: WarpX.H:1794
void AddBoundaryField()
Definition: ElectrostaticSolver.cpp:100
static std::string str_Bz_excitation_flag_function
Definition: WarpX.H:189
const PML_RZ * getPMLRZ()
Definition: WarpX.H:705
void ApplyRhofieldBoundary(const int lev, amrex::MultiFab *Rho, PatchType patch_type)
If a PEC boundary conditions is used the charge density deposited in the guard cells have to be refle...
Definition: WarpXFieldBoundaries.cpp:80
static bool compute_max_step_from_btd
If true, the code will compute max_step from the back transformed diagnostics.
Definition: WarpX.H:455
void computeE(amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > &E, const amrex::Vector< std::unique_ptr< amrex::MultiFab > > &phi, std::array< amrex::Real, 3 > const beta={{0, 0, 0}}) const
Definition: ElectrostaticSolver.cpp:450
bool current_correction
If true, a correction is applied to the current in Fourier space,.
Definition: WarpX.H:346
static const amrex::iMultiFab * CurrentBufferMasks(int lev)
Definition: WarpX.cpp:3307
void ComputePMLFactors()
static int end_moving_window_step
Definition: WarpX.H:1099
std::unique_ptr< amrex::Parser > Ezfield_flag_parser
Definition: WarpX.H:248
static utils::parser::IntervalsParser sort_intervals
Definition: WarpX.H:460
void computeVectorPotential(const amrex::Vector< amrex::Array< std::unique_ptr< amrex::MultiFab >, 3 > > &curr, amrex::Vector< amrex::Array< std::unique_ptr< amrex::MultiFab >, 3 > > &A, amrex::Real const required_precision=amrex::Real(1.e-11), amrex::Real absolute_tolerance=amrex::Real(0.0), const int max_iters=200, const int verbosity=2) const
Definition: MagnetostaticSolver.cpp:142
static std::string B_excitation_grid_s
Definition: WarpX.H:134
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_fp
Definition: WarpX.H:1601
void ApplyJfieldBoundary(const int lev, amrex::MultiFab *Jx, amrex::MultiFab *Jy, amrex::MultiFab *Jz, PatchType patch_type)
If a PEC boundary conditions is used the current density deposited in the guard cells have to be refl...
Definition: WarpXFieldBoundaries.cpp:86
bool update_with_rho
Definition: WarpX.H:350
void LoadBalance()
perform load balance; compute and communicate new amrex::DistributionMapping
Definition: WarpXRegrid.cpp:51
amrex::Real time_of_last_gal_shift
Definition: WarpX.H:740
Definition: WarpXParticleContainer.H:104
Vector< Geometry > geom
const FArrayBox & get(const MFIter &mfi) const noexcept
This class computes and stores the number of guard cells needed for the allocation of the MultiFabs a...
Definition: GuardCellManager.H:20
amrex::IntVect ng_depos_rho
Definition: GuardCellManager.H:108
amrex::IntVect ng_depos_J
Definition: GuardCellManager.H:107
amrex::IntVect ng_alloc_F
Definition: GuardCellManager.H:85
amrex::IntVect ng_alloc_EB
Definition: GuardCellManager.H:79
amrex::IntVect ng_UpdateAux
Definition: GuardCellManager.H:100
amrex::IntVect ng_FieldGather
Definition: GuardCellManager.H:98
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:103
direction
Definition: AnyFFT.H:74
const int[]
std::array< T, N > Array
ii
Definition: check_interp_points_and_weights.py:148
cell_size
Definition: compute_domain.py:37
int dx
Definition: stencil.py:436
string name
Definition: stencil.py:452
string field
Definition: video_yt.py:31
int verbosity()