WarpX
WarpX.H
Go to the documentation of this file.
1 /* Copyright 2016-2020 Andrew Myers, Ann Almgren, Aurore Blelly
2  * Axel Huebl, Burlen Loring, David Grote
3  * Glenn Richardson, Junmin Gu, Luca Fedeli
4  * Mathieu Lobet, Maxence Thevenet, Michael Rowan
5  * Remi Lehe, Revathi Jambunathan, Weiqun Zhang
6  * Yinjian Zhao
7  *
8  * This file is part of WarpX.
9  *
10  * License: BSD-3-Clause-LBNL
11  */
12 #ifndef WARPX_H_
13 #define WARPX_H_
14 
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"
41 
42 #include <AMReX.H>
43 #include <AMReX_AmrCore.H>
44 #include <AMReX_Array.H>
45 #include <AMReX_Config.H>
46 #ifdef AMREX_USE_EB
47 # include <AMReX_EBFabFactory.H>
48 #endif
49 #include <AMReX_GpuContainers.H>
50 #include <AMReX_IntVect.H>
51 #include <AMReX_LayoutData.H>
52 #include <AMReX_Parser.H>
53 #include <AMReX_REAL.H>
54 #include <AMReX_RealBox.H>
55 #include <AMReX_RealVect.H>
56 #include <AMReX_Vector.H>
57 #include <AMReX_VisMF.H>
58 
59 #include <AMReX_BaseFwd.H>
60 #include <AMReX_AmrCoreFwd.H>
61 
62 #include <array>
63 #include <iostream>
64 #include <limits>
65 #include <memory>
66 #include <optional>
67 #include <string>
68 #include <vector>
69 #include <map>
70 
71 enum struct PatchType : int
72 {
73  fine,
74  coarse
75 };
76 
77 class WarpX
78  : public amrex::AmrCore
79 {
80 public:
81 
82  friend class PML;
83 
84  static WarpX& GetInstance ();
85  static void ResetInstance ();
86 
87  WarpX ();
88  ~WarpX ();
89 
90  static std::string Version ();
91  static std::string PicsarVersion ();
92 
93  int Verbose () const { return verbose; }
94 
95  void InitData ();
96 
97  void Evolve (int numsteps = -1);
98 
100  MacroscopicProperties& GetMacroscopicProperties () { return *m_macroscopic_properties; }
101  MultiDiagnostics& GetMultiDiags () {return *multi_diags;}
102 
103  ParticleBoundaryBuffer& GetParticleBoundaryBuffer () { return *m_particle_boundary_buffer; }
104 
105  static void shiftMF (amrex::MultiFab& mf, const amrex::Geometry& geom,
106  int num_shift, int dir, const int lev, bool update_cost_flag,
107  amrex::Real external_field=0.0, bool useparser = false,
108  amrex::ParserExecutor<3> const& field_parser={});
109 
110  static void GotoNextLine (std::istream& is);
111 
113  static std::string authors;
114 
119 
121  static std::string B_ext_grid_s;
123  static std::string E_ext_grid_s;
124 
126  static bool add_external_E_field;
128  static bool add_external_B_field;
129 
131  static std::string str_Bx_ext_grid_function;
133  static std::string str_By_ext_grid_function;
135  static std::string str_Bz_ext_grid_function;
137  static std::string str_Ex_ext_grid_function;
139  static std::string str_Ey_ext_grid_function;
141  static std::string str_Ez_ext_grid_function;
142 
144  std::unique_ptr<amrex::Parser> Bxfield_parser;
146  std::unique_ptr<amrex::Parser> Byfield_parser;
148  std::unique_ptr<amrex::Parser> Bzfield_parser;
150  std::unique_ptr<amrex::Parser> Exfield_parser;
152  std::unique_ptr<amrex::Parser> Eyfield_parser;
154  std::unique_ptr<amrex::Parser> Ezfield_parser;
155 
156  // Algorithms
162  static short field_gathering_algo;
164  static short particle_pusher_algo;
172  static int em_solver_medium;
197 
201  static short psatd_solution_type;
202 
205  static short J_in_time;
206  static short rho_in_time;
207 
211  static bool do_current_centering;
212 
214  // to satisfy the continuity equation and charge conservation
216 
219  bool update_with_rho = false;
220 
223 
226 
229 
232 
235 
238 
241 
244  static bool do_dive_cleaning;
246  static bool do_divb_cleaning;
247 
249  static int nox;
251  static int noy;
253  static int noz;
254 
261 
268 
275  static int ncomps;
276 
279  static bool use_fdtd_nci_corr;
290 
294 
296  static bool use_filter;
298  static bool use_kspace_filter;
301 
304 
306  static amrex::Real gamma_boost;
308  static amrex::Real beta_boost;
321  static amrex::Real zmin_domain_boost_step_0;
322 
325 
327  static bool refine_plasma;
328 
331 
336 
337  static bool do_subcycling;
338  static bool do_multi_J;
340 
342  static bool safe_guard_cells;
343 
352 
355  static short grid_type;
356 
357  // Global rho nodal flag to know about rho index type when rho MultiFab is not allocated
359 
374  static void AllocInitMultiFab (
375  std::unique_ptr<amrex::MultiFab>& mf,
376  const amrex::BoxArray& ba,
377  const amrex::DistributionMapping& dm,
378  const int ncomp,
379  const amrex::IntVect& ngrow,
380  const std::string& name,
381  std::optional<const amrex::Real> initial_value = {});
382 
397  static void AllocInitMultiFab (
398  std::unique_ptr<amrex::iMultiFab>& mf,
399  const amrex::BoxArray& ba,
400  const amrex::DistributionMapping& dm,
401  const int ncomp,
402  const amrex::IntVect& ngrow,
403  const std::string& name,
404  std::optional<const int> initial_value = {});
405 
416  static void AliasInitMultiFab (
417  std::unique_ptr<amrex::MultiFab>& mf,
418  const amrex::MultiFab& mf_to_alias,
419  const int scomp,
420  const int ncomp,
421  const std::string& name,
422  std::optional<const amrex::Real> initial_value);
423 
424  // Maps of all of the MultiFabs and iMultiFabs used (this can include MFs from other classes)
425  // This is a convenience for the Python interface, allowing all MultiFabs
426  // to be easily referenced from Python.
427  static std::map<std::string, amrex::MultiFab *> multifab_map;
428  static std::map<std::string, amrex::iMultiFab *> imultifab_map;
429 
436  static void AddToMultiFabMap(const std::string& name, const std::unique_ptr<amrex::MultiFab>& mf) {
437  multifab_map[name] = mf.get();
438  }
439 
446  static void AddToMultiFabMap(const std::string& name, const std::unique_ptr<amrex::iMultiFab>& mf) {
447  imultifab_map[name] = mf.get();
448  }
449 
450  std::array<const amrex::MultiFab* const, 3>
451  get_array_Bfield_aux (const int lev) const {
452  return {
453  Bfield_aux[lev][0].get(),
454  Bfield_aux[lev][1].get(),
455  Bfield_aux[lev][2].get()
456  };
457  }
458  std::array<const amrex::MultiFab* const, 3>
459  get_array_Efield_aux (const int lev) const {
460  return {
461  Efield_aux[lev][0].get(),
462  Efield_aux[lev][1].get(),
463  Efield_aux[lev][2].get()
464  };
465  }
466 
467  amrex::MultiFab * get_pointer_Efield_aux (int lev, int direction) const { return Efield_aux[lev][direction].get(); }
468  amrex::MultiFab * get_pointer_Bfield_aux (int lev, int direction) const { return Bfield_aux[lev][direction].get(); }
469 
470  amrex::MultiFab * get_pointer_Efield_fp (int lev, int direction) const { return Efield_fp[lev][direction].get(); }
471  amrex::MultiFab * get_pointer_Bfield_fp (int lev, int direction) const { return Bfield_fp[lev][direction].get(); }
472  amrex::MultiFab * get_pointer_current_fp (int lev, int direction) const { return current_fp[lev][direction].get(); }
473  amrex::MultiFab * get_pointer_current_fp_nodal (int lev, int direction) const { return current_fp_nodal[lev][direction].get(); }
474  amrex::MultiFab * get_pointer_rho_fp (int lev) const { return rho_fp[lev].get(); }
475  amrex::MultiFab * get_pointer_F_fp (int lev) const { return F_fp[lev].get(); }
476  amrex::MultiFab * get_pointer_G_fp (int lev) const { return G_fp[lev].get(); }
477  amrex::MultiFab * get_pointer_phi_fp (int lev) const { return phi_fp[lev].get(); }
478  amrex::MultiFab * get_pointer_vector_potential_fp (int lev, int direction) const { return vector_potential_fp_nodal[lev][direction].get(); }
479 
480  amrex::MultiFab * get_pointer_Efield_cp (int lev, int direction) const { return Efield_cp[lev][direction].get(); }
481  amrex::MultiFab * get_pointer_Bfield_cp (int lev, int direction) const { return Bfield_cp[lev][direction].get(); }
482  amrex::MultiFab * get_pointer_current_cp (int lev, int direction) const { return current_cp[lev][direction].get(); }
483  amrex::MultiFab * get_pointer_rho_cp (int lev) const { return rho_cp[lev].get(); }
484  amrex::MultiFab * get_pointer_F_cp (int lev) const { return F_cp[lev].get(); }
485  amrex::MultiFab * get_pointer_G_cp (int lev) const { return G_cp[lev].get(); }
486 
487  amrex::MultiFab * get_pointer_edge_lengths (int lev, int direction) const { return m_edge_lengths[lev][direction].get(); }
488  amrex::MultiFab * get_pointer_face_areas (int lev, int direction) const { return m_face_areas[lev][direction].get(); }
489 
490  const amrex::MultiFab& getEfield (int lev, int direction) {return *Efield_aux[lev][direction];}
491  const amrex::MultiFab& getBfield (int lev, int direction) {return *Bfield_aux[lev][direction];}
492 
493  const amrex::MultiFab& getcurrent_cp (int lev, int direction) {return *current_cp[lev][direction];}
494  const amrex::MultiFab& getEfield_cp (int lev, int direction) {return *Efield_cp[lev][direction];}
495  const amrex::MultiFab& getBfield_cp (int lev, int direction) {return *Bfield_cp[lev][direction];}
496  const amrex::MultiFab& getrho_cp (int lev) {return *rho_cp[lev];}
497  const amrex::MultiFab& getF_cp (int lev) {return *F_cp[lev];}
498  const amrex::MultiFab& getG_cp (int lev) {return *G_cp[lev];}
499 
500  const amrex::MultiFab& getcurrent_fp (int lev, int direction) {return *current_fp[lev][direction];}
501  const amrex::MultiFab& getEfield_fp (int lev, int direction) {return *Efield_fp[lev][direction];}
502  const amrex::MultiFab& getBfield_fp (int lev, int direction) {return *Bfield_fp[lev][direction];}
503  const amrex::MultiFab& getrho_fp (int lev) {return *rho_fp[lev];}
504  const amrex::MultiFab& getphi_fp (int lev) {return *phi_fp[lev];}
505  const amrex::MultiFab& getF_fp (int lev) {return *F_fp[lev];}
506  const amrex::MultiFab& getG_fp (int lev) {return *G_fp[lev];}
507 
508  const amrex::MultiFab& getEfield_avg_fp (int lev, int direction) {return *Efield_avg_fp[lev][direction];}
509  const amrex::MultiFab& getBfield_avg_fp (int lev, int direction) {return *Bfield_avg_fp[lev][direction];}
510  const amrex::MultiFab& getEfield_avg_cp (int lev, int direction) {return *Efield_avg_cp[lev][direction];}
511  const amrex::MultiFab& getBfield_avg_cp (int lev, int direction) {return *Bfield_avg_cp[lev][direction];}
512 
513  bool DoPML () const {return do_pml;}
514 
515 #if (defined WARPX_DIM_RZ) && (defined WARPX_USE_PSATD)
516  const PML_RZ* getPMLRZ() {return pml_rz[0].get();}
517 #endif
518 
520  std::vector<bool> getPMLdirections() const;
521 
522  static amrex::LayoutData<amrex::Real>* getCosts (int lev);
523 
524  void setLoadBalanceEfficiency (const int lev, const amrex::Real efficiency)
525  {
526  if (m_instance)
527  {
528  m_instance->load_balance_efficiency[lev] = efficiency;
529  } else
530  {
531  return;
532  }
533  }
534 
535  amrex::Real getLoadBalanceEfficiency (const int lev)
536  {
537  if (m_instance)
538  {
539  return m_instance->load_balance_efficiency[lev];
540  } else
541  {
542  return -1;
543  }
544  }
545 
550 
551  amrex::Real time_of_last_gal_shift = 0;
552  amrex::Vector<amrex::Real> m_v_galilean = amrex::Vector<amrex::Real>(3, amrex::Real(0.));
553  amrex::Array<amrex::Real,3> m_galilean_shift = {{0}};
554 
555  amrex::Vector<amrex::Real> m_v_comoving = amrex::Vector<amrex::Real>(3, amrex::Real(0.));
556 
557  static int num_mirrors;
561 
563  std::unique_ptr<MultiReducedDiags> reduced_diags;
564 
565  void applyMirrors(amrex::Real time);
566 
568  void ComputeDt ();
569 
571  void PrintMainPICparameters ();
572 
574  void WriteUsedInputsFile () const;
575 
577  void PrintDtDxDyDz ();
578 
584  void ComputeMaxStep ();
585  // Compute max_step automatically for simulations in a boosted frame.
586  void computeMaxStepBoostAccelerator();
587 
592  int MoveWindow (const int step, bool move_j);
593 
599  void ShiftGalileanBoundary ();
600  void UpdatePlasmaInjectionPosition (amrex::Real dt);
601  void ResetProbDomain (const amrex::RealBox& rb);
602  void EvolveE ( amrex::Real dt);
603  void EvolveE (int lev, amrex::Real dt);
604  void EvolveB ( amrex::Real dt, DtType dt_type);
605  void EvolveB (int lev, amrex::Real dt, DtType dt_type);
606  void EvolveF ( amrex::Real dt, DtType dt_type);
607  void EvolveF (int lev, amrex::Real dt, DtType dt_type);
608  void EvolveG ( amrex::Real dt, DtType dt_type);
609  void EvolveG (int lev, amrex::Real dt, DtType dt_type);
610  void EvolveB (int lev, PatchType patch_type, amrex::Real dt, DtType dt_type);
611  void EvolveE (int lev, PatchType patch_type, amrex::Real dt);
612  void EvolveF (int lev, PatchType patch_type, amrex::Real dt, DtType dt_type);
613  void EvolveG (int lev, PatchType patch_type, amrex::Real dt, DtType dt_type);
614 
615  void MacroscopicEvolveE ( amrex::Real dt);
616  void MacroscopicEvolveE (int lev, amrex::Real dt);
617  void MacroscopicEvolveE (int lev, PatchType patch_type, amrex::Real dt);
618 
623  void Hybrid_QED_Push ( amrex::Vector<amrex::Real> dt);
624 
630  void Hybrid_QED_Push (int lev, amrex::Real dt);
631 
638  void Hybrid_QED_Push (int lev, PatchType patch_type, amrex::Real dt);
639 
640  static amrex::Real quantum_xi_c2;
641 
644  void LoadBalance ();
647  void ResetCosts ();
648 
652  {
653  return load_balance_intervals;
654  }
655 
663  void DampFieldsInGuards (const int lev,
664  const std::array<std::unique_ptr<amrex::MultiFab>,3>& Efield,
665  const std::array<std::unique_ptr<amrex::MultiFab>,3>& Bfield);
666 
674  void DampFieldsInGuards (const int lev, std::unique_ptr<amrex::MultiFab>& mf);
675 
676 #ifdef WARPX_DIM_RZ
677  void ApplyInverseVolumeScalingToCurrentDensity(amrex::MultiFab* Jx,
678  amrex::MultiFab* Jy,
679  amrex::MultiFab* Jz,
680  int lev);
681 
682  void ApplyInverseVolumeScalingToChargeDensity(amrex::MultiFab* Rho,
683  int lev);
684 #endif
685 
691  void ApplyRhofieldBoundary (const int lev, amrex::MultiFab* Rho,
692  PatchType patch_type);
693 
699  void ApplyJfieldBoundary (const int lev, amrex::MultiFab* Jx,
701  PatchType patch_type);
702 
703  void ApplyEfieldBoundary (const int lev, PatchType patch_type);
704  void ApplyBfieldBoundary (const int lev, PatchType patch_type, DtType dt_type);
705 
706  void DampPML ();
707  void DampPML (const int lev);
708  void DampPML (const int lev, PatchType patch_type);
709  void DampPML_Cartesian (const int lev, PatchType patch_type);
710 
711  void DampJPML ();
712  void DampJPML (int lev);
713  void DampJPML (int lev, PatchType patch_type);
714 
715  void CopyJPML ();
716  bool isAnyBoundaryPML();
717 
721  void NodalSyncPML ();
722 
726  void NodalSyncPML (int lev);
727 
731  void NodalSyncPML (int lev, PatchType patch_type);
732 
733  PML* GetPML (int lev);
734 #if (defined WARPX_DIM_RZ) && (defined WARPX_USE_PSATD)
735  PML_RZ* GetPML_RZ (int lev);
736 #endif
737 
739  void doFieldIonization ();
743  void doFieldIonization (int lev);
744 
745 #ifdef WARPX_QED
746 
747  void doQEDEvents ();
751  void doQEDEvents (int lev);
752 #endif
753 
754  void PushParticlesandDepose (int lev, amrex::Real cur_time, DtType a_dt_type=DtType::Full, bool skip_current=false);
755  void PushParticlesandDepose ( amrex::Real cur_time, bool skip_current=false);
756 
757  // This function does aux(lev) = fp(lev) + I(aux(lev-1)-cp(lev)).
758  // Caller must make sure fp and cp have ghost cells filled.
759  void UpdateAuxilaryData ();
760  void UpdateAuxilaryDataStagToNodal ();
761  void UpdateAuxilaryDataSameType ();
762 
771  void UpdateCurrentNodalToStag (amrex::MultiFab& dst, amrex::MultiFab const& src);
772 
773  // Fill boundary cells including coarse/fine boundaries
774  void FillBoundaryB (amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
775  void FillBoundaryE (amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
776  void FillBoundaryB_avg (amrex::IntVect ng);
777  void FillBoundaryE_avg (amrex::IntVect ng);
778 
779  void FillBoundaryF (amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
780  void FillBoundaryG (amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
781  void FillBoundaryAux (amrex::IntVect ng);
782  void FillBoundaryE (int lev, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
783  void FillBoundaryB (int lev, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
784  void FillBoundaryE_avg (int lev, amrex::IntVect ng);
785  void FillBoundaryB_avg (int lev, amrex::IntVect ng);
786 
787  void FillBoundaryF (int lev, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
788  void FillBoundaryG (int lev, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
789  void FillBoundaryAux (int lev, amrex::IntVect ng);
790 
796  void SyncCurrentAndRho ();
797 
809  void SyncCurrent (
810  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
811  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp);
812 
813  void SyncRho ();
814 
815  void SyncRho (
816  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
817  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp);
818 
819  amrex::Vector<int> getnsubsteps () const {return nsubsteps;}
820  int getnsubsteps (int lev) const {return nsubsteps[lev];}
821  amrex::Vector<int> getistep () const {return istep;}
822  int getistep (int lev) const {return istep[lev];}
823  void setistep (int lev, int ii) {istep[lev] = ii;}
824  amrex::Vector<amrex::Real> gett_old () const {return t_old;}
825  amrex::Real gett_old (int lev) const {return t_old[lev];}
826  amrex::Vector<amrex::Real> gett_new () const {return t_new;}
827  amrex::Real gett_new (int lev) const {return t_new[lev];}
828  void sett_new (int lev, amrex::Real time) {t_new[lev] = time;}
830  amrex::Real getdt (int lev) const {return dt[lev];}
831  int getdo_moving_window() const {return do_moving_window;}
832  amrex::Real getmoving_window_x() const {return moving_window_x;}
833  amrex::Real getcurrent_injection_position () const {return current_injection_position;}
834  bool getis_synchronized() const {return is_synchronized;}
835 
836  int maxStep () const {return max_step;}
837  void updateMaxStep (const int new_max_step) {max_step = new_max_step;}
838  amrex::Real stopTime () const {return stop_time;}
839  void updateStopTime (const amrex::Real new_stop_time) {stop_time = new_stop_time;}
840 
841  void AverageAndPackFields( amrex::Vector<std::string>& varnames,
842  amrex::Vector<amrex::MultiFab>& mf_avg, const amrex::IntVect ngrow) const;
843 
844  void prepareFields( int const step, amrex::Vector<std::string>& varnames,
847  amrex::Vector<amrex::Geometry>& output_geom ) const;
848 
849  static std::array<amrex::Real,3> CellSize (int lev);
850  static amrex::RealBox getRealBox(const amrex::Box& bx, int lev);
851 
860  static std::array<amrex::Real,3> LowerCorner (const amrex::Box& bx, const int lev, const amrex::Real time_shift_delta);
869  static std::array<amrex::Real,3> UpperCorner (const amrex::Box& bx, const int lev, const amrex::Real time_shift_delta);
870 
871  static amrex::IntVect RefRatio (int lev);
872 
873  static const amrex::iMultiFab* CurrentBufferMasks (int lev);
874  static const amrex::iMultiFab* GatherBufferMasks (int lev);
875 
877 
878  // Parameters for lab frame electrostatic
879  static amrex::Real self_fields_required_precision;
880  static amrex::Real self_fields_absolute_tolerance;
883 
884  static int do_moving_window; // boolean
885  static int start_moving_window_step; // the first step to move window
886  static int end_moving_window_step; // the last step to move window
892  static int moving_window_active (int const step) {
893  bool const step_before_end = (step < end_moving_window_step) || (end_moving_window_step < 0);
894  bool const step_after_start = (step >= start_moving_window_step);
895  return do_moving_window && step_before_end && step_after_start;
896  }
897  static int moving_window_dir;
898  static amrex::Real moving_window_v;
900 
901  // these should be private, but can't due to Cuda limitations
902  static void ComputeDivB (amrex::MultiFab& divB, int const dcomp,
903  const std::array<const amrex::MultiFab* const, 3>& B,
904  const std::array<amrex::Real,3>& dx);
905 
906  static void ComputeDivB (amrex::MultiFab& divB, int const dcomp,
907  const std::array<const amrex::MultiFab* const, 3>& B,
908  const std::array<amrex::Real,3>& dx, amrex::IntVect const ngrow);
909 
910  void ComputeDivE(amrex::MultiFab& divE, const int lev);
911 
912  const amrex::IntVect getngEB() const { return guard_cells.ng_alloc_EB; }
913  const amrex::IntVect getngF() const { return guard_cells.ng_alloc_F; }
914  const amrex::IntVect getngUpdateAux() const { return guard_cells.ng_UpdateAux; }
915  const amrex::IntVect get_ng_depos_J() const {return guard_cells.ng_depos_J;}
916  const amrex::IntVect get_ng_depos_rho() const {return guard_cells.ng_depos_rho;}
917  const amrex::IntVect get_ng_fieldgather () const {return guard_cells.ng_FieldGather;}
918 
926  const amrex::IntVect get_numprocs() const {return numprocs;}
927 
929  void ComputeSpaceChargeField (bool const reset_fields);
930  void AddBoundaryField ();
931  void AddSpaceChargeField (WarpXParticleContainer& pc);
932  void AddSpaceChargeFieldLabFrame ();
933  void computePhi (const amrex::Vector<std::unique_ptr<amrex::MultiFab> >& rho,
934  amrex::Vector<std::unique_ptr<amrex::MultiFab> >& phi,
935  std::array<amrex::Real, 3> const beta = {{0,0,0}},
936  amrex::Real const required_precision=amrex::Real(1.e-11),
937  amrex::Real absolute_tolerance=amrex::Real(0.0),
938  const int max_iters=200,
939  const int verbosity=2) const;
940 
941  void setPhiBC (amrex::Vector<std::unique_ptr<amrex::MultiFab> >& phi ) const;
942 
943  void computeE (amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>, 3> >& E,
944  const amrex::Vector<std::unique_ptr<amrex::MultiFab> >& phi,
945  std::array<amrex::Real, 3> const beta = {{0,0,0}} ) const;
946  void computeB (amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>, 3> >& B,
947  const amrex::Vector<std::unique_ptr<amrex::MultiFab> >& phi,
948  std::array<amrex::Real, 3> const beta = {{0,0,0}} ) const;
949  void computePhiTriDiagonal (const amrex::Vector<std::unique_ptr<amrex::MultiFab> >& rho,
950  amrex::Vector<std::unique_ptr<amrex::MultiFab> >& phi) const;
951 
952  // Magnetostatic Solver Interface
954  void ComputeMagnetostaticField ();
955  void AddMagnetostaticFieldLabFrame ();
956  void computeVectorPotential (const amrex::Vector<amrex::Array<std::unique_ptr<amrex::MultiFab>, 3> >& curr,
957  amrex::Vector<amrex::Array<std::unique_ptr<amrex::MultiFab>, 3> >& A,
958  amrex::Real const required_precision=amrex::Real(1.e-11),
959  amrex::Real absolute_tolerance=amrex::Real(0.0),
960  const int max_iters=200,
961  const int verbosity=2) const;
962 
963  void setVectorPotentialBC (amrex::Vector<amrex::Array<std::unique_ptr<amrex::MultiFab>, 3> >& A) const;
964 
986  void InitializeExternalFieldsOnGridUsingParser (
988  amrex::ParserExecutor<3> const& xfield_parser,
989  amrex::ParserExecutor<3> const& yfield_parser,
990  amrex::ParserExecutor<3> const& zfield_parser,
991  std::array< std::unique_ptr<amrex::MultiFab>, 3 > const& edge_lengths,
992  std::array< std::unique_ptr<amrex::MultiFab>, 3 > const& face_areas,
993  const char field,
994  const int lev, PatchType patch_type);
995 
996  void ReadExternalFieldFromFile (
997  std::string read_fields_from_path, amrex::MultiFab* mf,
998  std::string F_name, std::string F_component);
999 
1008  void InitializeEBGridData(int lev);
1009 
1015  void ComputeCostsHeuristic (amrex::Vector<std::unique_ptr<amrex::LayoutData<amrex::Real> > >& costs);
1016 
1017  void ApplyFilterandSumBoundaryRho (int lev, int glev, amrex::MultiFab& rho, int icomp, int ncomp);
1018 
1027  static amrex::Vector<amrex::Real> getFornbergStencilCoefficients(const int n_order, const short a_grid_type);
1028 
1029  // Device vectors of stencil coefficients used for finite-order centering of fields
1033 
1034  // Device vectors of stencil coefficients used for finite-order centering of currents
1038 
1039  // This needs to be public for CUDA.
1041  virtual void ErrorEst (int lev, amrex::TagBoxArray& tags, amrex::Real time, int /*ngrow*/) final;
1042 
1043  // Return the accelerator lattice instance defined at the given refinement level
1044  const AcceleratorLattice& get_accelerator_lattice (int lev) {return *(m_accelerator_lattice[lev]);}
1045 
1046 protected:
1047 
1073  void InitLevelData (int lev, amrex::Real time);
1074 
1077  virtual void PostProcessBaseGrids (amrex::BoxArray& ba0) const final;
1078 
1082  virtual void MakeNewLevelFromScratch (int lev, amrex::Real time, const amrex::BoxArray& ba,
1083  const amrex::DistributionMapping& dm) final;
1084 
1088  virtual void MakeNewLevelFromCoarse (int /*lev*/, amrex::Real /*time*/, const amrex::BoxArray& /*ba*/,
1089  const amrex::DistributionMapping& /*dm*/) final;
1090 
1094  virtual void RemakeLevel (int lev, amrex::Real time, const amrex::BoxArray& ba,
1095  const amrex::DistributionMapping& dm) final;
1096 
1098  virtual void ClearLevel (int lev) final;
1099 
1100 private:
1101 
1102  // Singleton is used when the code is run from python
1104 
1106  static void CheckSignals ();
1108  void HandleSignals ();
1109 
1113  void EvolveEM(int numsteps);
1114 
1115  void FillBoundaryB (const int lev, const PatchType patch_type, const amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
1116  void FillBoundaryE (const int lev, const PatchType patch_type, const amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
1117  void FillBoundaryF (int lev, PatchType patch_type, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
1118  void FillBoundaryG (int lev, PatchType patch_type, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
1119 
1120  void FillBoundaryB_avg (int lev, PatchType patch_type, amrex::IntVect ng);
1121  void FillBoundaryE_avg (int lev, PatchType patch_type, amrex::IntVect ng);
1122 
1123  void AddExternalFields ();
1124 
1125  void OneStep_nosub (amrex::Real t);
1126  void OneStep_sub1 (amrex::Real t);
1127 
1131  void OneStep_multiJ (const amrex::Real t);
1132 
1133  void RestrictCurrentFromFineToCoarsePatch (
1134  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
1135  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp,
1136  const int lev);
1137  void AddCurrentFromFineLevelandSumBoundary (
1138  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
1139  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp,
1140  const int lev);
1141  void StoreCurrent (const int lev);
1142  void RestoreCurrent (const int lev);
1143  void ApplyFilterJ (
1144  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& current,
1145  const int lev,
1146  const int idim);
1147  void ApplyFilterJ (
1148  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& current,
1149  const int lev);
1150  void SumBoundaryJ (
1151  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& current,
1152  const int lev,
1153  const int idim,
1154  const amrex::Periodicity& period);
1155  void SumBoundaryJ (
1156  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& current,
1157  const int lev,
1158  const amrex::Periodicity& period);
1159  void NodalSyncJ (
1160  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
1161  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp,
1162  const int lev,
1163  PatchType patch_type);
1164 
1165  void RestrictRhoFromFineToCoarsePatch (
1166  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
1167  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp,
1168  const int lev);
1169  void ApplyFilterandSumBoundaryRho (
1170  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
1171  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp,
1172  const int lev,
1173  PatchType patch_type,
1174  const int icomp,
1175  const int ncomp);
1176  void AddRhoFromFineLevelandSumBoundary (
1177  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
1178  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp,
1179  const int lev,
1180  const int icomp,
1181  const int ncomp);
1182  void NodalSyncRho (
1183  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
1184  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp,
1185  const int lev,
1186  PatchType patch_type,
1187  const int icomp,
1188  const int ncomp);
1189 
1190  void ReadParameters ();
1191 
1194  void BackwardCompatibility ();
1195 
1196  void InitFromScratch ();
1197 
1198  void AllocLevelData (int lev, const amrex::BoxArray& new_grids,
1199  const amrex::DistributionMapping& new_dmap);
1200 
1202  GetRestartDMap (const std::string& chkfile, const amrex::BoxArray& ba, int lev) const;
1203 
1204  void InitFromCheckpoint ();
1205  void PostRestart ();
1206 
1207  void InitPML ();
1208  void ComputePMLFactors ();
1209 
1210  void InitFilter ();
1211 
1212  void InitDiagnostics ();
1213 
1214  void InitNCICorrector ();
1215 
1220  void CheckGuardCells();
1221 
1226  void CheckGuardCells(amrex::MultiFab const& mf);
1227 
1231  void CheckKnownIssues();
1232 
1234  void PerformanceHints ();
1235 
1236  void BuildBufferMasks ();
1237 public: // for cuda
1238  void BuildBufferMasksInBox ( const amrex::Box tbx, amrex::IArrayBox &buffer_mask,
1239  const amrex::IArrayBox &guard_mask, const int ng );
1240 private:
1241  const amrex::iMultiFab* getCurrentBufferMasks (int lev) const {
1242  return current_buffer_masks[lev].get();
1243  }
1244  const amrex::iMultiFab* getGatherBufferMasks (int lev) const {
1245  return gather_buffer_masks[lev].get();
1246  }
1247 
1257  void ReorderFornbergCoefficients (amrex::Vector<amrex::Real>& ordered_coeffs,
1258  amrex::Vector<amrex::Real>& unordered_coeffs,
1259  const int order);
1272  void AllocateCenteringCoefficients (amrex::Gpu::DeviceVector<amrex::Real>& device_centering_stencil_coeffs_x,
1273  amrex::Gpu::DeviceVector<amrex::Real>& device_centering_stencil_coeffs_y,
1274  amrex::Gpu::DeviceVector<amrex::Real>& device_centering_stencil_coeffs_z,
1275  const int centering_nox,
1276  const int centering_noy,
1277  const int centering_noz,
1278  const short a_grid_type);
1279 
1280  void AllocLevelMFs (int lev, const amrex::BoxArray& ba, const amrex::DistributionMapping& dm,
1281  const amrex::IntVect& ngEB, amrex::IntVect& ngJ,
1282  const amrex::IntVect& ngRho, const amrex::IntVect& ngF,
1283  const amrex::IntVect& ngG, const bool aux_is_nodal);
1284 
1285 #ifdef WARPX_USE_PSATD
1286 # ifdef WARPX_DIM_RZ
1287  void AllocLevelSpectralSolverRZ (amrex::Vector<std::unique_ptr<SpectralSolverRZ>>& spectral_solver,
1288  const int lev,
1289  const amrex::BoxArray& realspace_ba,
1290  const amrex::DistributionMapping& dm,
1291  const std::array<amrex::Real,3>& dx);
1292 # else
1293  void AllocLevelSpectralSolver (amrex::Vector<std::unique_ptr<SpectralSolver>>& spectral_solver,
1294  const int lev,
1295  const amrex::BoxArray& realspace_ba,
1296  const amrex::DistributionMapping& dm,
1297  const std::array<amrex::Real,3>& dx,
1298  const bool pml_flag=false);
1299 # endif
1300 #endif
1301 
1302  amrex::Vector<int> istep; // which step?
1303  amrex::Vector<int> nsubsteps; // how many substeps on each level?
1304 
1308 
1309  // Particle container
1310  std::unique_ptr<MultiParticleContainer> mypc;
1311  std::unique_ptr<MultiDiagnostics> multi_diags;
1312 
1313  //
1314  // Fields: First array for level, second for direction
1315  //
1316 
1317  // Full solution
1320 
1321  // Fine patch
1332 
1333  // Memory buffers for computing magnetostatic fields
1334  // Vector Potential A and previous step. Time buffer needed for computing dA/dt to first order
1338 
1339  // Same as Bfield_fp/Efield_fp for reading external field data
1342 
1347 
1370 
1383 
1384  //EB level set
1386 
1387  // store fine patch
1389 
1390  // Nodal MultiFab for nodal current deposition if warpx.do_current_centering = 1
1392 
1393  // Coarse patch
1402 
1403  // Copy of the coarse aux
1408 
1409  // If charge/current deposition buffers are used
1412 
1413  // PML
1414  int do_pml = 0;
1415  int do_silver_mueller = 0;
1416  int pml_ncell = 10;
1417  int pml_delta = 10;
1418  int pml_has_particles = 0;
1419  int do_pml_j_damping = 0;
1420  int do_pml_in_domain = 0;
1421  static int do_similar_dm_pml;
1422  bool do_pml_dive_cleaning; // default set in WarpX.cpp
1423  bool do_pml_divb_cleaning; // default set in WarpX.cpp
1427 #if (defined WARPX_DIM_RZ) && (defined WARPX_USE_PSATD)
1429 #endif
1430  amrex::Real v_particle_pml;
1431 
1432  amrex::Real moving_window_x = std::numeric_limits<amrex::Real>::max();
1433  amrex::Real current_injection_position = 0;
1434 
1435  // Plasma injection parameters
1436  int warpx_do_continuous_injection = 0;
1437  int num_injected_species = -1;
1439 
1440  std::optional<amrex::Real> m_const_dt;
1441 
1442  // Macroscopic properties
1443  std::unique_ptr<MacroscopicProperties> m_macroscopic_properties;
1444 
1445  // Load balancing
1453  int load_balance_with_sfc = 0;
1458  amrex::Real load_balance_knapsack_factor = amrex::Real(1.24);
1464  amrex::Real load_balance_efficiency_ratio_threshold = amrex::Real(1.1);
1472  amrex::Real costs_heuristic_cells_wt = amrex::Real(0);
1478  amrex::Real costs_heuristic_particles_wt = amrex::Real(0);
1479 
1480  // Determines timesteps for override sync
1482 
1483  // Other runtime parameters
1484  int verbose = 1;
1485 
1486  bool use_hybrid_QED = 0;
1487 
1488  int max_step = std::numeric_limits<int>::max();
1489  amrex::Real stop_time = std::numeric_limits<amrex::Real>::max();
1490 
1491  int regrid_int = -1;
1492 
1493  amrex::Real cfl = amrex::Real(0.999);
1494 
1495  std::string restart_chkfile;
1496 
1499 
1500  bool use_single_read = true;
1501  bool use_single_write = true;
1502  int mffile_nstreams = 4;
1503  int field_io_nfiles = 1024;
1504  int particle_io_nfiles = 1024;
1505 
1508 
1509  bool is_synchronized = true;
1510 
1511  // Synchronization of nodal points
1512  const bool sync_nodal_points = true;
1513 
1515 
1516  //Slice Parameters
1518  int slice_plot_int = -1;
1527 
1528  bool fft_periodic_single_box = false;
1529  int nox_fft = 16;
1530  int noy_fft = 16;
1531  int noz_fft = 16;
1532 
1534  amrex::IntVect numprocs{0};
1535 
1537  std::unique_ptr<ParticleBoundaryBuffer> m_particle_boundary_buffer;
1538 
1539  // Accelerator lattice elements
1541 
1542  //
1543  // Embedded Boundary
1544  //
1545 
1546  // Factory for field data
1548 
1549  amrex::FabFactory<amrex::FArrayBox> const& fieldFactory (int lev) const noexcept {
1550  return *m_field_factory[lev];
1551  }
1552 #ifdef AMREX_USE_EB
1553 public:
1554  amrex::EBFArrayBoxFactory const& fieldEBFactory (int lev) const noexcept {
1555  return static_cast<amrex::EBFArrayBoxFactory const&>(*m_field_factory[lev]);
1556  }
1557 #endif
1558 
1559 public:
1560  void InitEB ();
1566 public:
1567 #ifdef AMREX_USE_EB
1568  static void ComputeEdgeLengths (std::array< std::unique_ptr<amrex::MultiFab>, 3 >& edge_lengths,
1569  const amrex::EBFArrayBoxFactory& eb_fact);
1574  static void ComputeFaceAreas (std::array< std::unique_ptr<amrex::MultiFab>, 3 >& face_areas,
1575  const amrex::EBFArrayBoxFactory& eb_fact);
1576 
1580  static void ScaleEdges (std::array< std::unique_ptr<amrex::MultiFab>, 3 >& edge_lengths,
1581  const std::array<amrex::Real,3>& cell_size);
1585  static void ScaleAreas (std::array< std::unique_ptr<amrex::MultiFab>, 3 >& face_areas,
1586  const std::array<amrex::Real,3>& cell_size);
1595  void MarkCells();
1599 #endif
1600  void ComputeDistanceToEB ();
1604  amrex::Array1D<int, 0, 2> CountExtFaces();
1609  void ComputeFaceExtensions();
1613  void InitBorrowing();
1617  void ShrinkBorrowing();
1621  void ComputeOneWayExtensions();
1625  void ComputeEightWaysExtensions();
1634  void ApplyBCKCorrection(const int idim);
1635 
1640  void PSATDSubtractCurrentPartialSumsAvg ();
1641 
1642 private:
1643  void ScrapeParticles ();
1644 
1645  void PushPSATD ();
1646 
1647 #ifdef WARPX_USE_PSATD
1648 
1661  void PSATDForwardTransformEB (
1662  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& E_fp,
1663  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& B_fp,
1664  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& E_cp,
1665  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& B_cp);
1666 
1680  void PSATDBackwardTransformEB (
1681  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& E_fp,
1682  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& B_fp,
1683  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& E_cp,
1684  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& B_cp);
1685 
1698  void PSATDBackwardTransformEBavg (
1699  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& E_avg_fp,
1700  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& B_avg_fp,
1701  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& E_avg_cp,
1702  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& B_avg_cp);
1703 
1715  void PSATDForwardTransformJ (
1716  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
1717  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp,
1718  const bool apply_kspace_filter=true);
1719 
1728  void PSATDBackwardTransformJ (
1729  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
1730  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp);
1731 
1743  void PSATDForwardTransformRho (
1744  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
1745  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp,
1746  const int icomp, const int dcomp, const bool apply_kspace_filter=true);
1747 
1751  void PSATDMoveRhoNewToRhoOld ();
1752 
1756  void PSATDMoveJNewToJOld ();
1757 
1761  void PSATDForwardTransformF ();
1762 
1766  void PSATDBackwardTransformF ();
1767 
1771  void PSATDForwardTransformG ();
1772 
1776  void PSATDBackwardTransformG ();
1777 
1781  void PSATDCurrentCorrection ();
1782 
1786  void PSATDVayDeposition ();
1787 
1791  void PSATDPushSpectralFields ();
1792 
1798  void PSATDScaleAverageFields (const amrex::Real scale_factor);
1799 
1803  void PSATDEraseAverageFields ();
1804 
1805 # ifdef WARPX_DIM_RZ
1808 # else
1811 # endif
1812 
1813 public:
1814 
1815 # ifdef WARPX_DIM_RZ
1817 # else
1819 # endif
1820  get_spectral_solver_fp (int lev) {return *spectral_solver_fp[lev];}
1821 #endif
1822 
1823 private:
1826 };
1827 
1828 #endif
const amrex::MultiFab & getG_cp(int lev)
Definition: WarpX.H:498
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:135
amrex::Gpu::DeviceVector< amrex::Real > device_current_centering_stencil_coeffs_y
Definition: WarpX.H:1036
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_fp
Definition: WarpX.H:1326
static bool fft_do_time_averaging
Definition: WarpX.H:899
amrex::MultiFab * get_pointer_current_fp_nodal(int lev, int direction) const
Definition: WarpX.H:473
static int moving_window_dir
Definition: WarpX.H:897
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_fp
Definition: WarpX.H:1329
amrex::Vector< std::unique_ptr< NCIGodfreyFilter > > nci_godfrey_filter_bxbyez
Definition: WarpX.H:549
amrex::Vector< amrex::Real > getdt() const
Definition: WarpX.H:829
static short rho_in_time
Definition: WarpX.H:206
amrex::Vector< int > getistep() const
Definition: WarpX.H:821
amrex::FabFactory< amrex::FArrayBox > const & fieldFactory(int lev) const noexcept
Definition: WarpX.H:1549
DtType
Definition: WarpXDtType.H:10
amrex::Vector< std::unique_ptr< SpectralSolverRZ > > spectral_solver_cp
Definition: WarpX.H:1807
static bool add_external_E_field
Whether to apply the effect of an externally-defined electric field.
Definition: WarpX.H:126
static bool do_shared_mem_current_deposition
use shared memory algorithm for current deposition
Definition: WarpX.H:228
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_avg_cp
Definition: WarpX.H:1400
static bool refine_plasma
Definition: WarpX.H:327
amrex::RealVect fine_tag_hi
Definition: WarpX.H:1507
static std::map< std::string, amrex::iMultiFab * > imultifab_map
Definition: WarpX.H:428
static int do_moving_window
Definition: WarpX.H:884
bool do_pml_dive_cleaning
Definition: WarpX.H:1422
This class contains the macroscopic properties of the medium needed to evaluate macroscopic Maxwell e...
Definition: MacroscopicProperties.H:30
static bool compute_max_step_from_btd
If true, the code will compute max_step from the back transformed diagnostics.
Definition: WarpX.H:324
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_avg_fp
Definition: WarpX.H:1331
amrex::Vector< amrex::IntVect > do_pml_Hi
Definition: WarpX.H:1425
amrex::IntVect m_rho_nodal_flag
Definition: WarpX.H:358
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:335
static amrex::Vector< int > field_boundary_lo
Definition: WarpX.H:181
void PushPSATD(const int lev)
Definition: PML.cpp:1383
static amrex::Real self_fields_required_precision
Definition: WarpX.H:879
const amrex::MultiFab & getrho_fp(int lev)
Definition: WarpX.H:503
amrex::Vector< int > injected_plasma_species
Definition: WarpX.H:1438
std::unique_ptr< SpectralSolver > spectral_solver_cp
Definition: PML.H:244
static WarpX * m_instance
Definition: WarpX.H:1103
static amrex::Vector< int > boost_direction
Direction of the Lorentz transform that defines the boosted frame of the simulation.
Definition: WarpX.H:310
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_store
Definition: WarpX.H:1388
amrex::Vector< std::array< std::unique_ptr< amrex::iMultiFab >, 3 > > m_flag_info_face
Definition: WarpX.H:1354
amrex::Vector< std::array< std::unique_ptr< amrex::LayoutData< FaceInfoBox > >, 3 > > m_borrowing
Definition: WarpX.H:1369
amrex::Real gett_new(int lev) const
Definition: WarpX.H:827
int maxStep() const
Definition: WarpX.H:836
static short electromagnetic_solver_id
Integer that corresponds to the type of Maxwell solver (Yee, CKC, PSATD, ECT)
Definition: WarpX.H:166
void ComputePMLFactors(amrex::Real dt)
Definition: PML.cpp:991
amrex::Vector< std::unique_ptr< amrex::MultiFab > > F_cp
Definition: WarpX.H:1394
MultiParticleContainer & GetPartContainer()
Definition: WarpX.H:99
void sett_new(int lev, amrex::Real time)
Definition: WarpX.H:828
const amrex::MultiFab & getBfield_cp(int lev, int direction)
Definition: WarpX.H:495
std::unique_ptr< amrex::Parser > Bxfield_parser
User-defined parser to initialize x-component of the magnetic field on the grid.
Definition: WarpX.H:144
Definition: AcceleratorLattice.H:20
Definition: ParticleBoundaryBuffer.H:19
const amrex::MultiFab & getG_fp(int lev)
Definition: WarpX.H:506
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > vector_potential_fp_nodal
Definition: WarpX.H:1335
amrex::Vector< std::unique_ptr< AcceleratorLattice > > m_accelerator_lattice
Definition: WarpX.H:1540
const amrex::MultiFab & getEfield_fp(int lev, int direction)
Definition: WarpX.H:501
std::unique_ptr< MultiDiagnostics > multi_diags
Definition: WarpX.H:1311
int verbosity()
void setLoadBalanceEfficiency(const int lev, const amrex::Real efficiency)
Definition: WarpX.H:524
static int n_field_gather_buffer
Definition: WarpX.H:347
std::unique_ptr< MultiParticleContainer > mypc
Definition: WarpX.H:1310
void computeVectorPotential(amrex::Vector< amrex::Array< amrex::MultiFab *, 3 > > const &curr, amrex::Vector< amrex::Array< amrex::MultiFab *, 3 > > &A, amrex::Real const relative_tolerance, amrex::Real absolute_tolerance, int const max_iters, int const verbosity, amrex::Vector< amrex::Geometry > const geom, amrex::Vector< amrex::DistributionMapping > const dmap, amrex::Vector< amrex::BoxArray > const grids, T_BoundaryHandler const boundary_handler, bool const do_single_precision_comms=false, std::optional< amrex::Vector< amrex::IntVect > > rel_ref_ratio=std::nullopt, [[maybe_unused]] T_PostACalculationFunctor post_A_calculation=std::nullopt, [[maybe_unused]] std::optional< amrex::Real const > current_time=std::nullopt, [[maybe_unused]] std::optional< amrex::Vector< T_FArrayBoxFactory const *> > eb_farray_box_factory=std::nullopt)
Definition: VectorPoissonSolver.H:95
float cfl
Definition: yt3d_mpi.py:41
static bool do_current_centering
Definition: WarpX.H:211
static int noy
Order of the particle shape factors (splines) along y.
Definition: WarpX.H:251
amrex::Vector< std::array< std::unique_ptr< amrex::iMultiFab >, 3 > > m_flag_ext_face
Definition: WarpX.H:1361
amrex::MultiFab * get_pointer_edge_lengths(int lev, int direction) const
Definition: WarpX.H:487
const AcceleratorLattice & get_accelerator_lattice(int lev)
Definition: WarpX.H:1044
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_avg_cp
Definition: WarpX.H:1401
static bool verboncoeur_axis_correction
Definition: WarpX.H:293
const amrex::MultiFab & getEfield(int lev, int direction)
Definition: WarpX.H:490
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_fp_nodal
Definition: WarpX.H:1391
amrex::Vector< std::unique_ptr< amrex::iMultiFab > > gather_buffer_masks
Definition: WarpX.H:1407
static short current_deposition_algo
Integer that corresponds to the current deposition algorithm (Esirkepov, direct, Vay) ...
Definition: WarpX.H:158
utils::parser::IntervalsParser get_load_balance_intervals() const
returns the load balance interval
Definition: WarpX.H:651
std::unique_ptr< MultiReducedDiags > reduced_diags
object with all reduced diagnotics, similar to MultiParticleContainer for species.
Definition: WarpX.H:563
std::unique_ptr< amrex::Parser > Bzfield_parser
User-defined parser to initialize z-component of the magnetic field on the grid.
Definition: WarpX.H:148
bool current_correction
If true, a correction is applied to the current in Fourier space,.
Definition: WarpX.H:215
static short charge_deposition_algo
Integer that corresponds to the charge deposition algorithm (only standard deposition) ...
Definition: WarpX.H:160
amrex::Vector< std::unique_ptr< amrex::MultiFab > > rho_cp
Definition: WarpX.H:1396
amrex::MultiFab * get_pointer_rho_fp(int lev) const
Definition: WarpX.H:474
static amrex::Real moving_window_v
Definition: WarpX.H:898
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_cp
Definition: WarpX.H:1399
amrex::MultiFab * get_pointer_Efield_aux(int lev, int direction) const
Definition: WarpX.H:467
void FillBoundaryE()
Definition: PML.cpp:1242
MultiDiagnostics & GetMultiDiags()
Definition: WarpX.H:101
bool getis_synchronized() const
Definition: WarpX.H:834
SpectralSolverRZ & get_spectral_solver_fp(int lev)
Definition: WarpX.H:1820
static int electrostatic_solver_id
Definition: WarpX.H:876
const amrex::IntVect get_ng_depos_J() const
Definition: WarpX.H:915
amrex::MultiFab * get_pointer_Efield_cp(int lev, int direction) const
Definition: WarpX.H:480
Definition: MultiParticleContainer.H:64
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:436
bool DoPML() const
Definition: WarpX.H:513
static int current_centering_nox
Order of finite centering of currents (from nodal grid to staggered grid), along x.
Definition: WarpX.H:263
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_buf
Definition: WarpX.H:1410
amrex::RealBox slice_realbox
Definition: WarpX.H:1519
amrex::Vector< std::unique_ptr< amrex::MultiFab > > charge_buf
Definition: WarpX.H:1411
void updateStopTime(const amrex::Real new_stop_time)
Definition: WarpX.H:839
amrex::MultiFab * get_pointer_Bfield_fp(int lev, int direction) const
Definition: WarpX.H:471
amrex::Vector< std::unique_ptr< amrex::LayoutData< amrex::Real > > > costs
Definition: WarpX.H:1451
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > vector_potential_grad_buf_b_stag
Definition: WarpX.H:1337
const amrex::MultiFab & getF_fp(int lev)
Definition: WarpX.H:505
static int em_solver_medium
Integer that corresponds to electromagnetic Maxwell solver (vacuum - 0, macroscopic - 1) ...
Definition: WarpX.H:172
const amrex::MultiFab & getrho_cp(int lev)
Definition: WarpX.H:496
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > m_area_mod
Definition: WarpX.H:1365
static bool do_device_synchronize
Definition: WarpX.H:341
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:141
static bool do_shared_mem_charge_deposition
used shared memory algorithm for charge deposition
Definition: WarpX.H:225
amrex::Vector< int > istep
Definition: WarpX.H:1302
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_aux
Definition: WarpX.H:1318
amrex::MultiFab * get_pointer_rho_cp(int lev) const
Definition: WarpX.H:483
std::unique_ptr< amrex::Parser > Byfield_parser
User-defined parser to initialize y-component of the magnetic field on the grid.
Definition: WarpX.H:146
static int num_mirrors
Definition: WarpX.H:557
amrex::Vector< std::unique_ptr< amrex::iMultiFab > > current_buffer_masks
Definition: WarpX.H:1406
int verbose
static amrex::Vector< ParticleBoundaryType > particle_boundary_hi
Definition: WarpX.H:196
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_avg_fp
Definition: WarpX.H:1330
Definition: ElectrostaticSolver.H:35
amrex::MultiFab * get_pointer_face_areas(int lev, int direction) const
Definition: WarpX.H:488
void updateMaxStep(const int new_max_step)
Definition: WarpX.H:837
const amrex::iMultiFab * getGatherBufferMasks(int lev) const
Definition: WarpX.H:1244
amrex::Vector< std::unique_ptr< amrex::MultiFab > > F_fp
Definition: WarpX.H:1322
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_slice
Definition: WarpX.H:1526
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_fp_vay
Definition: WarpX.H:1327
amrex::Vector< int > mirror_z_npoints
Definition: WarpX.H:560
void FillBoundaryF()
Definition: PML.cpp:1290
amrex::Vector< amrex::Real > gett_old() const
Definition: WarpX.H:824
amrex::Real getdt(int lev) const
Definition: WarpX.H:830
amrex::Real getLoadBalanceEfficiency(const int lev)
Definition: WarpX.H:535
static int do_multi_J_n_depositions
Definition: WarpX.H:339
direction
Definition: AnyFFT.H:74
BilinearFilter bilinear_filter
Definition: WarpX.H:547
static int n_current_deposition_buffer
Definition: WarpX.H:351
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_cp
Definition: WarpX.H:1397
amrex::Vector< std::unique_ptr< amrex::MultiFab > > m_distance_to_eb
Definition: WarpX.H:1385
static bool use_fdtd_nci_corr
Definition: WarpX.H:279
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > vector_potential_grad_buf_e_stag
Definition: WarpX.H:1336
static int start_moving_window_step
Definition: WarpX.H:885
const FArrayBox & get(const MFIter &mfi) const noexcept
std::string Version()
static int moving_window_active(int const step)
Definition: WarpX.H:892
static amrex::Real gamma_boost
Lorentz factor of the boosted frame in which a boosted-frame simulation is run.
Definition: WarpX.H:306
cell_size
Definition: compute_domain.py:37
amrex::Vector< amrex::Real > t_new
Definition: WarpX.H:1305
void computePhi(amrex::Vector< amrex::MultiFab *> const &rho, amrex::Vector< amrex::MultiFab *> &phi, std::array< amrex::Real, 3 > const beta, amrex::Real const relative_tolerance, amrex::Real absolute_tolerance, int const max_iters, int const verbosity, amrex::Vector< amrex::Geometry > const geom, amrex::Vector< amrex::DistributionMapping > const dmap, amrex::Vector< amrex::BoxArray > const grids, T_BoundaryHandler const boundary_handler, bool const do_single_precision_comms=false, std::optional< amrex::Vector< amrex::IntVect > > rel_ref_ratio=std::nullopt, [[maybe_unused]] T_PostPhiCalculationFunctor post_phi_calculation=std::nullopt, [[maybe_unused]] std::optional< amrex::Real const > current_time=std::nullopt, [[maybe_unused]] std::optional< amrex::Vector< T_FArrayBoxFactory const *> > eb_farray_box_factory=std::nullopt)
Definition: PoissonSolver.H:133
amrex::MultiFab * get_pointer_phi_fp(int lev) const
Definition: WarpX.H:477
amrex::Vector< std::unique_ptr< amrex::MultiFab > > G_slice
Definition: WarpX.H:1522
static short psatd_solution_type
Definition: WarpX.H:201
std::optional< amrex::Real > m_const_dt
Definition: WarpX.H:1440
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_slice
Definition: WarpX.H:1525
static utils::parser::IntervalsParser sort_intervals
Definition: WarpX.H:329
int getnsubsteps(int lev) const
Definition: WarpX.H:820
utils::parser::IntervalsParser load_balance_intervals
Definition: WarpX.H:1448
static amrex::Vector< amrex::Real > E_external_grid
Initial electric field on the grid.
Definition: WarpX.H:116
amrex::Vector< amrex::IntVect > do_pml_Lo
Definition: WarpX.H:1424
void FillBoundaryG()
Definition: PML.cpp:1312
amrex::Vector< std::unique_ptr< amrex::MultiFab > > G_cp
Definition: WarpX.H:1395
Definition: PML.H:127
std::array< const amrex::MultiFab *const, 3 > get_array_Efield_aux(const int lev) const
Definition: WarpX.H:459
static amrex::Real beta_boost
Beta value corresponding to the Lorentz factor of the boosted frame of the simulation.
Definition: WarpX.H:308
static bool do_dive_cleaning
Definition: WarpX.H:244
amrex::Vector< amrex::Real > dt
Definition: WarpX.H:1307
std::unique_ptr< amrex::Parser > Exfield_parser
User-defined parser to initialize x-component of the electric field on the grid.
Definition: WarpX.H:150
static bool do_multi_J
Definition: WarpX.H:338
std::array< const amrex::MultiFab *const, 3 > get_array_Bfield_aux(const int lev) const
Definition: WarpX.H:451
amrex::MultiFab * get_pointer_G_fp(int lev) const
Definition: WarpX.H:476
static int field_centering_noz
Order of finite centering of fields (from staggered grid to nodal grid), along z. ...
Definition: WarpX.H:260
amrex::Real stopTime() const
Definition: WarpX.H:838
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:102
const amrex::MultiFab & getBfield_avg_cp(int lev, int direction)
Definition: WarpX.H:511
static std::string E_ext_grid_s
Initialization type for external electric field on the grid.
Definition: WarpX.H:123
amrex::Vector< std::unique_ptr< SpectralSolverRZ > > spectral_solver_fp
Definition: WarpX.H:1806
const amrex::IntVect get_ng_depos_rho() const
Definition: WarpX.H:916
static bool use_filter
If true, a bilinear filter is used to smooth charge and currents.
Definition: WarpX.H:296
int getdo_moving_window() const
Definition: WarpX.H:831
amrex::Gpu::DeviceVector< amrex::Real > device_field_centering_stencil_coeffs_y
Definition: WarpX.H:1031
static int shared_mem_current_tpb
number of threads to use per block in shared deposition
Definition: WarpX.H:231
amrex::Vector< amrex::Real > load_balance_efficiency
Definition: WarpX.H:1466
ii
Definition: check_interp_points_and_weights.py:148
Definition: BilinearFilter.H:16
amrex::Vector< std::unique_ptr< PML > > pml
Definition: WarpX.H:1426
static amrex::Real zmax_plasma_to_compute_max_step
Definition: WarpX.H:314
amrex::Gpu::DeviceVector< amrex::Real > device_field_centering_stencil_coeffs_x
Definition: WarpX.H:1030
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:333
This class contains a vector of all diagnostics in the simulation.
Definition: MultiDiagnostics.H:20
amrex::Vector< std::unique_ptr< amrex::MultiFab > > phi_fp
Definition: WarpX.H:1325
const amrex::MultiFab & getBfield_fp(int lev, int direction)
Definition: WarpX.H:502
amrex::MultiFab * get_pointer_Bfield_cp(int lev, int direction) const
Definition: WarpX.H:481
amrex::MultiFab * get_pointer_G_cp(int lev) const
Definition: WarpX.H:485
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > m_edge_lengths
EB: Lengths of the mesh edges.
Definition: WarpX.H:1344
Definition: WarpX.H:77
amrex::MultiFab * get_pointer_current_fp(int lev, int direction) const
Definition: WarpX.H:472
const amrex::MultiFab & getEfield_avg_cp(int lev, int direction)
Definition: WarpX.H:510
static int self_fields_verbosity
Definition: WarpX.H:882
static int field_centering_noy
Order of finite centering of fields (from staggered grid to nodal grid), along y. ...
Definition: WarpX.H:258
const amrex::MultiFab & getBfield(int lev, int direction)
Definition: WarpX.H:491
const amrex::IntVect get_numprocs() const
Definition: WarpX.H:926
static amrex::IntVect shared_tilesize
tileSize to use for shared current deposition operations
Definition: WarpX.H:234
std::unique_ptr< MacroscopicProperties > m_macroscopic_properties
Definition: WarpX.H:1443
static amrex::Real quantum_xi_c2
Definition: WarpX.H:640
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_cp
Definition: WarpX.H:1398
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > m_face_areas
EB: Areas of the mesh faces.
Definition: WarpX.H:1346
const amrex::IntVect getngUpdateAux() const
Definition: WarpX.H:914
amrex::RealVect fine_tag_lo
Definition: WarpX.H:1506
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_cax
Definition: WarpX.H:1404
static int n_rz_azimuthal_modes
Number of modes for the RZ multi-mode version.
Definition: WarpX.H:270
static short field_gathering_algo
Integer that corresponds to the field gathering algorithm (energy-conserving, momentum-conserving) ...
Definition: WarpX.H:162
void FillBoundaryB()
Definition: PML.cpp:1266
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:446
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_slice
Definition: WarpX.H:1524
ParticleBoundaryBuffer & GetParticleBoundaryBuffer()
Definition: WarpX.H:103
const amrex::IntVect getngF() const
Definition: WarpX.H:913
static bool do_compute_max_step_from_zmax
Definition: WarpX.H:318
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:131
const int[]
std::unique_ptr< ParticleBoundaryBuffer > m_particle_boundary_buffer
particle buffer for scraped particles on the boundaries
Definition: WarpX.H:1537
const amrex::MultiFab & getEfield_avg_fp(int lev, int direction)
Definition: WarpX.H:508
amrex::Gpu::DeviceVector< amrex::Real > device_current_centering_stencil_coeffs_z
Definition: WarpX.H:1037
string name
Definition: stencil.py:452
static int ncomps
Definition: WarpX.H:275
int getistep(int lev) const
Definition: WarpX.H:822
bool do_pml_divb_cleaning
Definition: WarpX.H:1423
amrex::Gpu::DeviceVector< amrex::Real > device_current_centering_stencil_coeffs_x
Definition: WarpX.H:1035
std::unique_ptr< amrex::Parser > Eyfield_parser
User-defined parser to initialize y-component of the electric field on the grid.
Definition: WarpX.H:152
Definition: PML_RZ.H:29
static bool use_kspace_filter
If true, the bilinear filtering of charge and currents is done in Fourier space.
Definition: WarpX.H:298
static bool use_filter_compensation
If true, a compensation step is added to the bilinear filtering of charge and currents.
Definition: WarpX.H:300
static bool do_divb_cleaning
Solve additional Maxwell equation for G in order to control errors in magnetic Gauss&#39; law...
Definition: WarpX.H:246
amrex::Vector< std::unique_ptr< NCIGodfreyFilter > > nci_godfrey_filter_exeybz
Definition: WarpX.H:548
amrex::Vector< int > getnsubsteps() const
Definition: WarpX.H:819
amrex::Gpu::DeviceVector< amrex::Real > device_field_centering_stencil_coeffs_z
Definition: WarpX.H:1032
const amrex::MultiFab & getF_cp(int lev)
Definition: WarpX.H:497
const amrex::IntVect get_ng_fieldgather() const
Definition: WarpX.H:917
static short load_balance_costs_update_algo
Definition: WarpX.H:170
static bool do_single_precision_comms
perform field communications in single precision
Definition: WarpX.H:222
amrex::MultiFab * get_pointer_current_cp(int lev, int direction) const
Definition: WarpX.H:482
static bool do_subcycling
Definition: WarpX.H:337
amrex::MultiFab * get_pointer_Efield_fp(int lev, int direction) const
Definition: WarpX.H:470
static amrex::IntVect m_fill_guards_fields
Whether to fill guard cells when computing inverse FFTs of fields.
Definition: WarpX.H:237
const amrex::MultiFab & getBfield_avg_fp(int lev, int direction)
Definition: WarpX.H:509
static amrex::Real self_fields_absolute_tolerance
Definition: WarpX.H:880
Definition: MagnetostaticSolver.H:21
std::unique_ptr< SpectralSolver > spectral_solver_fp
Definition: PML.H:243
static short grid_type
Definition: WarpX.H:355
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:137
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > ECTRhofield
Definition: WarpX.H:1378
amrex::Vector< amrex::Real > t_old
Definition: WarpX.H:1306
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_cax
Definition: WarpX.H:1405
int dx
Definition: stencil.py:436
amrex::Vector< std::unique_ptr< PML_RZ > > pml_rz
Definition: WarpX.H:1428
static bool add_external_B_field
Whether to apply the effect of an externally-defined magnetic field.
Definition: WarpX.H:128
static int current_centering_noy
Order of finite centering of currents (from nodal grid to staggered grid), along y.
Definition: WarpX.H:265
amrex::Vector< int > nsubsteps
Definition: WarpX.H:1303
int dt
Definition: stencil.py:440
static int end_moving_window_step
Definition: WarpX.H:886
MagnetostaticSolver::VectorPoissonBoundaryHandler m_vector_poisson_boundary_handler
Definition: WarpX.H:953
static amrex::Real zmin_domain_boost_step_0
Definition: WarpX.H:321
static amrex::IntVect filter_npass_each_dir
Definition: WarpX.H:546
static bool galerkin_interpolation
Definition: WarpX.H:289
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:139
static int field_centering_nox
Order of finite centering of fields (from staggered grid to nodal grid), along x. ...
Definition: WarpX.H:256
amrex::IntVect slice_cr_ratio
Definition: WarpX.H:1520
amrex::Real getcurrent_injection_position() const
Definition: WarpX.H:833
amrex::MultiFab * get_pointer_Bfield_aux(int lev, int direction) const
Definition: WarpX.H:468
static int current_centering_noz
Order of finite centering of currents (from nodal grid to staggered grid), along z.
Definition: WarpX.H:267
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_fp_external
Definition: WarpX.H:1341
static int nox
Order of the particle shape factors (splines) along x.
Definition: WarpX.H:249
static amrex::Vector< amrex::Real > B_external_grid
Initial magnetic field on the grid.
Definition: WarpX.H:118
amrex::Real getmoving_window_x() const
Definition: WarpX.H:832
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Venl
Definition: WarpX.H:1382
static std::map< std::string, amrex::MultiFab * > multifab_map
Definition: WarpX.H:427
const amrex::MultiFab & getphi_fp(int lev)
Definition: WarpX.H:504
static bool serialize_initial_conditions
If true, the initial conditions from random number generators are serialized (useful for reproducible...
Definition: WarpX.H:303
MacroscopicProperties & GetMacroscopicProperties()
Definition: WarpX.H:100
amrex::Vector< std::unique_ptr< amrex::MultiFab > > G_fp
Definition: WarpX.H:1323
static std::string B_ext_grid_s
Initialization type for external magnetic field on the grid.
Definition: WarpX.H:121
amrex::Vector< std::unique_ptr< FiniteDifferenceSolver > > m_fdtd_solver_fp
Definition: WarpX.H:1824
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:133
static amrex::Vector< ParticleBoundaryType > particle_boundary_lo
Definition: WarpX.H:191
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_aux
Definition: WarpX.H:1319
PatchType
Definition: WarpX.H:71
std::string restart_chkfile
Definition: WarpX.H:1495
int slice_max_grid_size
Definition: WarpX.H:1517
static amrex::IntVect m_fill_guards_current
Whether to fill guard cells when computing inverse FFTs of currents.
Definition: WarpX.H:240
amrex::Vector< amrex::Real > mirror_z
Definition: WarpX.H:558
int Verbose() const
Definition: WarpX.H:93
static bool do_dynamic_scheduling
Definition: WarpX.H:326
static int macroscopic_solver_algo
Definition: WarpX.H:176
utils::parser::IntervalsParser override_sync_intervals
Definition: WarpX.H:1481
ElectrostaticSolver::PoissonBoundaryHandler m_poisson_boundary_handler
Definition: WarpX.H:928
amrex::Vector< std::unique_ptr< amrex::MultiFab > > F_slice
Definition: WarpX.H:1521
static std::string authors
Author of an input file / simulation setup.
Definition: WarpX.H:113
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_fp
Definition: WarpX.H:1328
static amrex::Vector< int > field_boundary_hi
Definition: WarpX.H:186
string field
Definition: video_yt.py:31
static bool safe_guard_cells
Definition: WarpX.H:342
Definition: SpectralSolverRZ.H:21
amrex::Vector< std::unique_ptr< amrex::MultiFab > > rho_slice
Definition: WarpX.H:1523
const amrex::IntVect getngEB() const
Definition: WarpX.H:912
const PML_RZ * getPMLRZ()
Definition: WarpX.H:516
static short particle_pusher_algo
Integer that corresponds to the particle push algorithm (Boris, Vay, Higuera-Cary) ...
Definition: WarpX.H:164
const amrex::MultiFab & getcurrent_fp(int lev, int direction)
Definition: WarpX.H:500
static int self_fields_max_iters
Definition: WarpX.H:881
amrex::Vector< std::unique_ptr< FiniteDifferenceSolver > > m_fdtd_solver_cp
Definition: WarpX.H:1825
std::array< T, N > Array
amrex::Vector< std::unique_ptr< amrex::FabFactory< amrex::FArrayBox > > > m_field_factory
Definition: WarpX.H:1547
amrex::MultiFab * get_pointer_vector_potential_fp(int lev, int direction) const
Definition: WarpX.H:478
amrex::Real v_particle_pml
Definition: WarpX.H:1430
guardCellManager guard_cells
Definition: WarpX.H:1514
amrex::MultiFab * get_pointer_F_cp(int lev) const
Definition: WarpX.H:484
amrex::Real gett_old(int lev) const
Definition: WarpX.H:825
amrex::Vector< amrex::Real > mirror_z_width
Definition: WarpX.H:559
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_fp_external
Definition: WarpX.H:1340
amrex::Vector< amrex::Real > gett_new() const
Definition: WarpX.H:826
std::unique_ptr< amrex::Parser > Ezfield_parser
User-defined parser to initialize z-component of the electric field on the grid.
Definition: WarpX.H:154
static int noz
Order of the particle shape factors (splines) along z.
Definition: WarpX.H:253
const amrex::MultiFab & getcurrent_cp(int lev, int direction)
Definition: WarpX.H:493
const amrex::MultiFab & getEfield_cp(int lev, int direction)
Definition: WarpX.H:494
void setistep(int lev, int ii)
Definition: WarpX.H:823
const amrex::iMultiFab * getCurrentBufferMasks(int lev) const
Definition: WarpX.H:1241
amrex::Vector< std::unique_ptr< amrex::MultiFab > > rho_fp
Definition: WarpX.H:1324
This class computes and stores the number of guard cells needed for the allocation of the MultiFabs a...
Definition: GuardCellManager.H:20
Definition: WarpXParticleContainer.H:102
static amrex::IntVect sort_bin_size
Definition: WarpX.H:330
static int do_similar_dm_pml
Definition: WarpX.H:1421
amrex::MultiFab * get_pointer_F_fp(int lev) const
Definition: WarpX.H:475
static short J_in_time
Definition: WarpX.H:205
Top-level class for the electromagnetic spectral solver.
Definition: SpectralSolver.H:32