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 
28 
29 #ifdef WARPX_USE_PSATD
30 # ifdef WARPX_DIM_RZ
33 # else
35 # endif
36 #endif
37 #include "Evolve/WarpXDtType.H"
40 #include "Filter/BilinearFilter.H"
45 #include "Utils/export.H"
46 
47 #include <AMReX.H>
48 #include <AMReX_AmrCore.H>
49 #include <AMReX_Array.H>
50 #include <AMReX_Config.H>
51 #ifdef AMREX_USE_EB
52 # include <AMReX_EBFabFactory.H>
53 #endif
54 #include <AMReX_GpuContainers.H>
55 #include <AMReX_IntVect.H>
56 #include <AMReX_LayoutData.H>
57 #include <AMReX_Parser.H>
58 #include <AMReX_REAL.H>
59 #include <AMReX_RealBox.H>
60 #include <AMReX_RealVect.H>
61 #include <AMReX_Vector.H>
62 #include <AMReX_VisMF.H>
63 
64 #include <AMReX_BaseFwd.H>
65 #include <AMReX_AmrCoreFwd.H>
66 
67 #include <array>
68 #include <iostream>
69 #include <limits>
70 #include <memory>
71 #include <optional>
72 #include <string>
73 #include <vector>
74 #include <map>
75 
76 
77 enum struct PatchType : int
78 {
79  fine,
80  coarse
81 };
82 
83 class WARPX_EXPORT WarpX
84  : public amrex::AmrCore
85 {
86 public:
87 
88  friend class PML;
89 
90  static WarpX& GetInstance ();
91 
92  static void ResetInstance ();
93 
98  static void Finalize();
99 
101  ~WarpX () override;
102 
104  WarpX ( WarpX const &) = delete;
106  WarpX& operator= ( WarpX const & ) = delete;
107 
109  WarpX ( WarpX && ) = default;
111  WarpX& operator= ( WarpX && ) = default;
112 
113  static std::string Version ();
114  static std::string PicsarVersion ();
115 
116  [[nodiscard]] int Verbose () const { return verbose; }
117 
118  void InitData ();
119 
120  void Evolve (int numsteps = -1);
121 
124  MacroscopicProperties& GetMacroscopicProperties () { return *m_macroscopic_properties; }
125  HybridPICModel& GetHybridPICModel () { return *m_hybrid_pic_model; }
126  MultiDiagnostics& GetMultiDiags () {return *multi_diags;}
127 
128  ParticleBoundaryBuffer& GetParticleBoundaryBuffer () { return *m_particle_boundary_buffer; }
129 
130  static void shiftMF (amrex::MultiFab& mf, const amrex::Geometry& geom,
131  int num_shift, int dir, int lev, bool update_cost_flag,
132  amrex::Real external_field=0.0, bool useparser = false,
133  amrex::ParserExecutor<3> const& field_parser={});
134 
140  [[nodiscard]] std::string GetAuthors () const { return m_authors; }
141 
146 
148  static std::string B_ext_grid_s;
150  static std::string E_ext_grid_s;
151 
153  static bool add_external_E_field;
155  static bool add_external_B_field;
156 
158  std::unique_ptr<amrex::Parser> Bxfield_parser;
160  std::unique_ptr<amrex::Parser> Byfield_parser;
162  std::unique_ptr<amrex::Parser> Bzfield_parser;
164  std::unique_ptr<amrex::Parser> Exfield_parser;
166  std::unique_ptr<amrex::Parser> Eyfield_parser;
168  std::unique_ptr<amrex::Parser> Ezfield_parser;
169 
175 
176  // Algorithms
182  static short field_gathering_algo;
184  static short particle_pusher_algo;
192  static int em_solver_medium;
217 
221  static short psatd_solution_type;
222 
225  static short J_in_time;
226  static short rho_in_time;
227 
231  static bool do_current_centering;
232 
234  // to satisfy the continuity equation and charge conservation
236 
239  bool update_with_rho = false;
240 
243 
246 
249 
252 
255 
258 
261 
264  static bool do_dive_cleaning;
266  static bool do_divb_cleaning;
267 
269  static int nox;
271  static int noy;
273  static int noz;
274 
281 
288 
295  static int ncomps;
296 
299  static bool use_fdtd_nci_corr;
310 
314 
316  static bool use_filter;
318  static bool use_kspace_filter;
321 
324 
326  static amrex::Real gamma_boost;
328  static amrex::Real beta_boost;
341  static amrex::Real zmin_domain_boost_step_0;
342 
345 
347  static bool refine_plasma;
348 
351 
356 
357  static bool do_subcycling;
358  static bool do_multi_J;
360 
362  static bool safe_guard_cells;
363 
372 
375  static short grid_type;
376 
377  // Global rho nodal flag to know about rho index type when rho MultiFab is not allocated
379 
395  static void AllocInitMultiFab (
396  std::unique_ptr<amrex::MultiFab>& mf,
397  const amrex::BoxArray& ba,
398  const amrex::DistributionMapping& dm,
399  int ncomp,
400  const amrex::IntVect& ngrow,
401  int level,
402  const std::string& name,
403  std::optional<const amrex::Real> initial_value = {});
404 
420  static void AllocInitMultiFab (
421  std::unique_ptr<amrex::iMultiFab>& mf,
422  const amrex::BoxArray& ba,
423  const amrex::DistributionMapping& dm,
424  int ncomp,
425  const amrex::IntVect& ngrow,
426  int level,
427  const std::string& name,
428  std::optional<const int> initial_value = {});
429 
441  static void AliasInitMultiFab (
442  std::unique_ptr<amrex::MultiFab>& mf,
443  const amrex::MultiFab& mf_to_alias,
444  int scomp,
445  int ncomp,
446  int level,
447  const std::string& name,
448  std::optional<const amrex::Real> initial_value);
449 
450  // Maps of all of the MultiFabs and iMultiFabs used (this can include MFs from other classes)
451  // This is a convenience for the Python interface, allowing all MultiFabs
452  // to be easily referenced from Python.
453  static std::map<std::string, amrex::MultiFab *> multifab_map;
454  static std::map<std::string, amrex::iMultiFab *> imultifab_map;
455 
456  [[nodiscard]] std::array<const amrex::MultiFab* const, 3>
457  get_array_Bfield_aux (const int lev) const {
458  return {
459  Bfield_aux[lev][0].get(),
460  Bfield_aux[lev][1].get(),
461  Bfield_aux[lev][2].get()
462  };
463  }
464 
465  [[nodiscard]] std::array<const amrex::MultiFab* const, 3>
466  get_array_Efield_aux (const int lev) const {
467  return {
468  Efield_aux[lev][0].get(),
469  Efield_aux[lev][1].get(),
470  Efield_aux[lev][2].get()
471  };
472  }
473 
474  [[nodiscard]] amrex::MultiFab * get_pointer_Efield_aux (int lev, int direction) const { return Efield_aux[lev][direction].get(); }
475  [[nodiscard]] amrex::MultiFab * get_pointer_Bfield_aux (int lev, int direction) const { return Bfield_aux[lev][direction].get(); }
476 
477  [[nodiscard]] amrex::MultiFab * get_pointer_Efield_fp (int lev, int direction) const { return Efield_fp[lev][direction].get(); }
478  [[nodiscard]] amrex::MultiFab * get_pointer_Bfield_fp (int lev, int direction) const { return Bfield_fp[lev][direction].get(); }
479  [[nodiscard]] amrex::MultiFab * get_pointer_current_fp (int lev, int direction) const { return current_fp[lev][direction].get(); }
480  [[nodiscard]] amrex::MultiFab * get_pointer_current_fp_nodal (int lev, int direction) const { return current_fp_nodal[lev][direction].get(); }
481  [[nodiscard]] amrex::MultiFab * get_pointer_rho_fp (int lev) const { return rho_fp[lev].get(); }
482  [[nodiscard]] amrex::MultiFab * get_pointer_F_fp (int lev) const { return F_fp[lev].get(); }
483  [[nodiscard]] amrex::MultiFab * get_pointer_G_fp (int lev) const { return G_fp[lev].get(); }
484  [[nodiscard]] amrex::MultiFab * get_pointer_phi_fp (int lev) const { return phi_fp[lev].get(); }
485  [[nodiscard]] amrex::MultiFab * get_pointer_vector_potential_fp (int lev, int direction) const { return vector_potential_fp_nodal[lev][direction].get(); }
486 
487  [[nodiscard]] amrex::MultiFab * get_pointer_Efield_cp (int lev, int direction) const { return Efield_cp[lev][direction].get(); }
488  [[nodiscard]] amrex::MultiFab * get_pointer_Bfield_cp (int lev, int direction) const { return Bfield_cp[lev][direction].get(); }
489  [[nodiscard]] amrex::MultiFab * get_pointer_current_cp (int lev, int direction) const { return current_cp[lev][direction].get(); }
490  [[nodiscard]] amrex::MultiFab * get_pointer_rho_cp (int lev) const { return rho_cp[lev].get(); }
491  [[nodiscard]] amrex::MultiFab * get_pointer_F_cp (int lev) const { return F_cp[lev].get(); }
492  [[nodiscard]] amrex::MultiFab * get_pointer_G_cp (int lev) const { return G_cp[lev].get(); }
493 
494  [[nodiscard]] amrex::MultiFab * get_pointer_edge_lengths (int lev, int direction) const { return m_edge_lengths[lev][direction].get(); }
495  [[nodiscard]] amrex::MultiFab * get_pointer_face_areas (int lev, int direction) const { return m_face_areas[lev][direction].get(); }
496 
497  const amrex::MultiFab& getEfield (int lev, int direction) {return *Efield_aux[lev][direction];}
498  const amrex::MultiFab& getBfield (int lev, int direction) {return *Bfield_aux[lev][direction];}
499 
500  const amrex::MultiFab& getcurrent_cp (int lev, int direction) {return *current_cp[lev][direction];}
501  const amrex::MultiFab& getEfield_cp (int lev, int direction) {return *Efield_cp[lev][direction];}
502  const amrex::MultiFab& getBfield_cp (int lev, int direction) {return *Bfield_cp[lev][direction];}
503  const amrex::MultiFab& getrho_cp (int lev) {return *rho_cp[lev];}
504  const amrex::MultiFab& getF_cp (int lev) {return *F_cp[lev];}
505  const amrex::MultiFab& getG_cp (int lev) {return *G_cp[lev];}
506 
507  const amrex::MultiFab& getcurrent_fp (int lev, int direction) {return *current_fp[lev][direction];}
508  const amrex::MultiFab& getEfield_fp (int lev, int direction) {return *Efield_fp[lev][direction];}
509  const amrex::MultiFab& getBfield_fp (int lev, int direction) {return *Bfield_fp[lev][direction];}
510  const amrex::MultiFab& getrho_fp (int lev) {return *rho_fp[lev];}
511  const amrex::MultiFab& getphi_fp (int lev) {return *phi_fp[lev];}
512  const amrex::MultiFab& getF_fp (int lev) {return *F_fp[lev];}
513  const amrex::MultiFab& getG_fp (int lev) {return *G_fp[lev];}
514 
515  const amrex::MultiFab& getEfield_avg_fp (int lev, int direction) {return *Efield_avg_fp[lev][direction];}
516  const amrex::MultiFab& getBfield_avg_fp (int lev, int direction) {return *Bfield_avg_fp[lev][direction];}
517  const amrex::MultiFab& getEfield_avg_cp (int lev, int direction) {return *Efield_avg_cp[lev][direction];}
518  const amrex::MultiFab& getBfield_avg_cp (int lev, int direction) {return *Bfield_avg_cp[lev][direction];}
519 
520  const amrex::MultiFab& getedgelengths (int lev, int direction) {return *m_edge_lengths[lev][direction];}
521  const amrex::MultiFab& getfaceareas (int lev, int direction) {return *m_face_areas[lev][direction];}
522 
523  [[nodiscard]] bool DoPML () const {return do_pml;}
524  [[nodiscard]] bool DoFluidSpecies () const {return do_fluid_species;}
525 
526 #if (defined WARPX_DIM_RZ) && (defined WARPX_USE_PSATD)
527  const PML_RZ* getPMLRZ() {return pml_rz[0].get();}
528 #endif
529 
531  [[nodiscard]] std::vector<bool> getPMLdirections() const;
532 
533  static amrex::LayoutData<amrex::Real>* getCosts (int lev);
534 
535  void setLoadBalanceEfficiency (int lev, amrex::Real efficiency);
536 
537  amrex::Real getLoadBalanceEfficiency (int lev);
538 
543 
544  amrex::Real time_of_last_gal_shift = 0;
545  amrex::Vector<amrex::Real> m_v_galilean = amrex::Vector<amrex::Real>(3, amrex::Real(0.));
546  amrex::Array<amrex::Real,3> m_galilean_shift = {{0}};
547 
548  amrex::Vector<amrex::Real> m_v_comoving = amrex::Vector<amrex::Real>(3, amrex::Real(0.));
549 
550  static int num_mirrors;
554 
556  std::unique_ptr<MultiReducedDiags> reduced_diags;
557 
558  void applyMirrors(amrex::Real time);
559 
561  void ComputeDt ();
562 
565 
567  void WriteUsedInputsFile () const;
568 
570  void PrintDtDxDyDz ();
571 
577  void ComputeMaxStep ();
578  // Compute max_step automatically for simulations in a boosted frame.
580 
585  int MoveWindow (int step, bool move_j);
586 
592  void ShiftGalileanBoundary ();
593 
598  void UpdateInjectionPosition (amrex::Real dt);
599 
600  void ResetProbDomain (const amrex::RealBox& rb);
601  void EvolveE ( amrex::Real dt);
602  void EvolveE (int lev, amrex::Real dt);
603  void EvolveB ( amrex::Real dt, DtType dt_type);
604  void EvolveB (int lev, amrex::Real dt, DtType dt_type);
605  void EvolveF ( amrex::Real dt, DtType dt_type);
606  void EvolveF (int lev, amrex::Real dt, DtType dt_type);
607  void EvolveG ( amrex::Real dt, DtType dt_type);
608  void EvolveG (int lev, amrex::Real dt, DtType dt_type);
609  void EvolveB (int lev, PatchType patch_type, amrex::Real dt, DtType dt_type);
610  void EvolveE (int lev, PatchType patch_type, amrex::Real dt);
611  void EvolveF (int lev, PatchType patch_type, amrex::Real dt, DtType dt_type);
612  void EvolveG (int lev, PatchType patch_type, amrex::Real dt, DtType dt_type);
613 
614  void MacroscopicEvolveE ( amrex::Real dt);
615  void MacroscopicEvolveE (int lev, amrex::Real dt);
616  void MacroscopicEvolveE (int lev, PatchType patch_type, amrex::Real dt);
617 
623  void HybridPICEvolveFields ();
624 
632  void HybridPICDepositInitialRhoAndJ ();
633 
638  void Hybrid_QED_Push ( amrex::Vector<amrex::Real> dt);
639 
645  void Hybrid_QED_Push (int lev, amrex::Real dt);
646 
653  void Hybrid_QED_Push (int lev, PatchType patch_type, amrex::Real dt);
654 
655  static amrex::Real quantum_xi_c2;
656 
659  void LoadBalance ();
662  void ResetCosts ();
663 
667  {
668  return load_balance_intervals;
669  }
670 
678  void DampFieldsInGuards (int lev,
679  const std::array<std::unique_ptr<amrex::MultiFab>,3>& Efield,
680  const std::array<std::unique_ptr<amrex::MultiFab>,3>& Bfield);
681 
689  void DampFieldsInGuards (int lev, std::unique_ptr<amrex::MultiFab>& mf);
690 
691 #ifdef WARPX_DIM_RZ
692  void ApplyInverseVolumeScalingToCurrentDensity(amrex::MultiFab* Jx,
693  amrex::MultiFab* Jy,
694  amrex::MultiFab* Jz,
695  int lev);
696 
697  void ApplyInverseVolumeScalingToChargeDensity(amrex::MultiFab* Rho,
698  int lev);
699 #endif
700 
706  void ApplyRhofieldBoundary (int lev, amrex::MultiFab* Rho,
707  PatchType patch_type);
708 
714  void ApplyJfieldBoundary (int lev, amrex::MultiFab* Jx,
716  PatchType patch_type);
717 
718  void ApplyEfieldBoundary (int lev, PatchType patch_type);
719  void ApplyBfieldBoundary (int lev, PatchType patch_type, DtType dt_type);
720 
729  void ApplyElectronPressureBoundary (int lev, PatchType patch_type);
730 
731  void DampPML ();
732  void DampPML (int lev);
733  void DampPML (int lev, PatchType patch_type);
734  void DampPML_Cartesian (int lev, PatchType patch_type);
735 
736  void DampJPML ();
737  void DampJPML (int lev);
738  void DampJPML (int lev, PatchType patch_type);
739 
740  void CopyJPML ();
741  bool isAnyBoundaryPML();
742 
743  PML* GetPML (int lev);
744 #if (defined WARPX_DIM_RZ) && (defined WARPX_USE_PSATD)
745  PML_RZ* GetPML_RZ (int lev);
746 #endif
747 
749  void doFieldIonization ();
753  void doFieldIonization (int lev);
754 
755 #ifdef WARPX_QED
757  void doQEDEvents ();
761  void doQEDEvents (int lev);
762 #endif
763 
764  void PushParticlesandDepose (int lev, amrex::Real cur_time, DtType a_dt_type=DtType::Full, bool skip_current=false);
765  void PushParticlesandDepose ( amrex::Real cur_time, bool skip_current=false);
766 
767  // This function does aux(lev) = fp(lev) + I(aux(lev-1)-cp(lev)).
768  // Caller must make sure fp and cp have ghost cells filled.
769  void UpdateAuxilaryData ();
770  void UpdateAuxilaryDataStagToNodal ();
771  void UpdateAuxilaryDataSameType ();
772 
781  void UpdateCurrentNodalToStag (amrex::MultiFab& dst, amrex::MultiFab const& src);
782 
783  // Fill boundary cells including coarse/fine boundaries
784  void FillBoundaryB (amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
785  void FillBoundaryE (amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
786  void FillBoundaryB_avg (amrex::IntVect ng);
787  void FillBoundaryE_avg (amrex::IntVect ng);
788 
789  void FillBoundaryF (amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
790  void FillBoundaryG (amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
791  void FillBoundaryAux (amrex::IntVect ng);
792  void FillBoundaryE (int lev, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
793  void FillBoundaryB (int lev, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
794  void FillBoundaryE_avg (int lev, amrex::IntVect ng);
795  void FillBoundaryB_avg (int lev, amrex::IntVect ng);
796 
797  void FillBoundaryF (int lev, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
798  void FillBoundaryG (int lev, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
799  void FillBoundaryAux (int lev, amrex::IntVect ng);
800 
807  void SyncCurrentAndRho ();
808 
821  void SyncCurrent (
822  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
823  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp,
824  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_buffer);
825 
826  void SyncRho ();
827 
828  void SyncRho (
829  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
830  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp,
831  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_buffer);
832 
833  [[nodiscard]] amrex::Vector<int> getnsubsteps () const {return nsubsteps;}
834  [[nodiscard]] int getnsubsteps (int lev) const {return nsubsteps[lev];}
835  [[nodiscard]] amrex::Vector<int> getistep () const {return istep;}
836  [[nodiscard]] int getistep (int lev) const {return istep[lev];}
837  void setistep (int lev, int ii) {istep[lev] = ii;}
838  [[nodiscard]] amrex::Vector<amrex::Real> gett_old () const {return t_old;}
839  [[nodiscard]] amrex::Real gett_old (int lev) const {return t_old[lev];}
840  [[nodiscard]] amrex::Vector<amrex::Real> gett_new () const {return t_new;}
841  [[nodiscard]] amrex::Real gett_new (int lev) const {return t_new[lev];}
842  void sett_new (int lev, amrex::Real time) {t_new[lev] = time;}
843  [[nodiscard]] amrex::Vector<amrex::Real> getdt () const {return dt;}
844  [[nodiscard]] amrex::Real getdt (int lev) const {return dt.at(lev);}
845  [[nodiscard]] int getdo_moving_window() const {return do_moving_window;}
846  [[nodiscard]] amrex::Real getmoving_window_x() const {return moving_window_x;}
847  [[nodiscard]] bool getis_synchronized() const {return is_synchronized;}
848 
849  [[nodiscard]] int maxStep () const {return max_step;}
850  void updateMaxStep (const int new_max_step) {max_step = new_max_step;}
851  [[nodiscard]] amrex::Real stopTime () const {return stop_time;}
852  void updateStopTime (const amrex::Real new_stop_time) {stop_time = new_stop_time;}
853 
855  amrex::Vector<amrex::MultiFab>& mf_avg, amrex::IntVect ngrow) const;
856 
857  void prepareFields( int step, amrex::Vector<std::string>& varnames,
860  amrex::Vector<amrex::Geometry>& output_geom ) const;
861 
862  static std::array<amrex::Real,3> CellSize (int lev);
863  static amrex::RealBox getRealBox(const amrex::Box& bx, int lev);
864 
873  static std::array<amrex::Real,3> LowerCorner (const amrex::Box& bx, int lev, amrex::Real time_shift_delta);
882  static std::array<amrex::Real,3> UpperCorner (const amrex::Box& bx, int lev, amrex::Real time_shift_delta);
883 
884  static amrex::IntVect RefRatio (int lev);
885 
886  static const amrex::iMultiFab* CurrentBufferMasks (int lev);
887  static const amrex::iMultiFab* GatherBufferMasks (int lev);
888 
890 
891  // Parameters for lab frame electrostatic
892  static amrex::Real self_fields_required_precision;
893  static amrex::Real self_fields_absolute_tolerance;
896 
897  static int do_moving_window; // boolean
898  static int start_moving_window_step; // the first step to move window
899  static int end_moving_window_step; // the last step to move window
905  static int moving_window_active (int const step) {
906  bool const step_before_end = (step < end_moving_window_step) || (end_moving_window_step < 0);
907  bool const step_after_start = (step >= start_moving_window_step);
908  return do_moving_window && step_before_end && step_after_start;
909  }
910  static int moving_window_dir;
911  static amrex::Real moving_window_v;
913 
914  // these should be private, but can't due to Cuda limitations
915  static void ComputeDivB (amrex::MultiFab& divB, int dcomp,
916  const std::array<const amrex::MultiFab* const, 3>& B,
917  const std::array<amrex::Real,3>& dx);
918 
919  static void ComputeDivB (amrex::MultiFab& divB, int dcomp,
920  const std::array<const amrex::MultiFab* const, 3>& B,
921  const std::array<amrex::Real,3>& dx, amrex::IntVect ngrow);
922 
923  void ComputeDivE(amrex::MultiFab& divE, int lev);
924 
925  [[nodiscard]] amrex::IntVect getngEB() const { return guard_cells.ng_alloc_EB; }
926  [[nodiscard]] amrex::IntVect getngF() const { return guard_cells.ng_alloc_F; }
927  [[nodiscard]] amrex::IntVect getngUpdateAux() const { return guard_cells.ng_UpdateAux; }
928  [[nodiscard]] amrex::IntVect get_ng_depos_J() const {return guard_cells.ng_depos_J;}
929  [[nodiscard]] amrex::IntVect get_ng_depos_rho() const {return guard_cells.ng_depos_rho;}
930  [[nodiscard]] amrex::IntVect get_ng_fieldgather () const {return guard_cells.ng_FieldGather;}
931 
939  [[nodiscard]] amrex::IntVect get_numprocs() const {return numprocs;}
940 
942  void ComputeSpaceChargeField (bool reset_fields);
943  void AddBoundaryField ();
944  void AddSpaceChargeField (WarpXParticleContainer& pc);
945  void AddSpaceChargeFieldLabFrame ();
946  void computePhi (const amrex::Vector<std::unique_ptr<amrex::MultiFab> >& rho,
947  amrex::Vector<std::unique_ptr<amrex::MultiFab> >& phi,
948  std::array<amrex::Real, 3> beta = {{0,0,0}},
949  amrex::Real required_precision=amrex::Real(1.e-11),
950  amrex::Real absolute_tolerance=amrex::Real(0.0),
951  int max_iters=200,
952  int verbosity=2) const;
953 
954  void setPhiBC (amrex::Vector<std::unique_ptr<amrex::MultiFab> >& phi ) const;
955 
956  void computeE (amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>, 3> >& E,
957  const amrex::Vector<std::unique_ptr<amrex::MultiFab> >& phi,
958  std::array<amrex::Real, 3> beta = {{0,0,0}} ) const;
959  void computeB (amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>, 3> >& B,
960  const amrex::Vector<std::unique_ptr<amrex::MultiFab> >& phi,
961  std::array<amrex::Real, 3> beta = {{0,0,0}} ) const;
962  void computePhiTriDiagonal (const amrex::Vector<std::unique_ptr<amrex::MultiFab> >& rho,
963  amrex::Vector<std::unique_ptr<amrex::MultiFab> >& phi) const;
964 
965  // Magnetostatic Solver Interface
967  void ComputeMagnetostaticField ();
968  void AddMagnetostaticFieldLabFrame ();
969  void computeVectorPotential (const amrex::Vector<amrex::Array<std::unique_ptr<amrex::MultiFab>, 3> >& curr,
970  amrex::Vector<amrex::Array<std::unique_ptr<amrex::MultiFab>, 3> >& A,
971  amrex::Real required_precision=amrex::Real(1.e-11),
972  amrex::Real absolute_tolerance=amrex::Real(0.0),
973  int max_iters=200,
974  int verbosity=2) const;
975 
976  void setVectorPotentialBC (amrex::Vector<amrex::Array<std::unique_ptr<amrex::MultiFab>, 3> >& A) const;
977 
1001  amrex::ParserExecutor<3> const& xfield_parser,
1002  amrex::ParserExecutor<3> const& yfield_parser,
1003  amrex::ParserExecutor<3> const& zfield_parser,
1004  std::array< std::unique_ptr<amrex::MultiFab>, 3 > const& edge_lengths,
1005  std::array< std::unique_ptr<amrex::MultiFab>, 3 > const& face_areas,
1006  char field,
1007  int lev, PatchType patch_type);
1008 
1010  std::string read_fields_from_path, amrex::MultiFab* mf,
1011  std::string F_name, std::string F_component);
1012 
1021  void InitializeEBGridData(int lev);
1022 
1028  void ComputeCostsHeuristic (amrex::Vector<std::unique_ptr<amrex::LayoutData<amrex::Real> > >& costs);
1029 
1030  void ApplyFilterandSumBoundaryRho (int lev, int glev, amrex::MultiFab& rho, int icomp, int ncomp);
1031 
1040  static amrex::Vector<amrex::Real> getFornbergStencilCoefficients(int n_order, short a_grid_type);
1041 
1042  // Device vectors of stencil coefficients used for finite-order centering of fields
1046 
1047  // Device vectors of stencil coefficients used for finite-order centering of currents
1051 
1052  // This needs to be public for CUDA.
1054  void ErrorEst (int lev, amrex::TagBoxArray& tags, amrex::Real time, int /*ngrow*/) final;
1055 
1056  // Return the accelerator lattice instance defined at the given refinement level
1057  const AcceleratorLattice& get_accelerator_lattice (int lev) {return *(m_accelerator_lattice[lev]);}
1058 
1059  // for cuda
1060  void BuildBufferMasksInBox ( amrex::Box tbx, amrex::IArrayBox &buffer_mask,
1061  const amrex::IArrayBox &guard_mask, int ng );
1062 #ifdef AMREX_USE_EB
1063  amrex::EBFArrayBoxFactory const& fieldEBFactory (int lev) const noexcept {
1064  return static_cast<amrex::EBFArrayBoxFactory const&>(*m_field_factory[lev]);
1065  }
1066 #endif
1067 
1068  void InitEB ();
1069 
1070 #ifdef AMREX_USE_EB
1075  static void ComputeEdgeLengths (std::array< std::unique_ptr<amrex::MultiFab>, 3 >& edge_lengths,
1076  const amrex::EBFArrayBoxFactory& eb_fact);
1081  static void ComputeFaceAreas (std::array< std::unique_ptr<amrex::MultiFab>, 3 >& face_areas,
1082  const amrex::EBFArrayBoxFactory& eb_fact);
1083 
1087  static void ScaleEdges (std::array< std::unique_ptr<amrex::MultiFab>, 3 >& edge_lengths,
1088  const std::array<amrex::Real,3>& cell_size);
1092  static void ScaleAreas (std::array< std::unique_ptr<amrex::MultiFab>, 3 >& face_areas,
1093  const std::array<amrex::Real,3>& cell_size);
1102  void MarkCells();
1103 #endif
1104 
1108  void ComputeDistanceToEB ();
1112  amrex::Array1D<int, 0, 2> CountExtFaces();
1117  void ComputeFaceExtensions();
1121  void InitBorrowing();
1125  void ShrinkBorrowing();
1129  void ComputeOneWayExtensions();
1133  void ComputeEightWaysExtensions();
1142  void ApplyBCKCorrection(int idim);
1143 
1148  void PSATDSubtractCurrentPartialSumsAvg ();
1149 
1150 #ifdef WARPX_USE_PSATD
1151 
1152 # ifdef WARPX_DIM_RZ
1154 # else
1156 # endif
1157  get_spectral_solver_fp (int lev) {return *spectral_solver_fp[lev];}
1158 #endif
1159 
1160  FiniteDifferenceSolver * get_pointer_fdtd_solver_fp (int lev) { return m_fdtd_solver_fp[lev].get(); }
1161 
1162 protected:
1163 
1189  void InitLevelData (int lev, amrex::Real time);
1190 
1193  void PostProcessBaseGrids (amrex::BoxArray& ba0) const final;
1194 
1198  void MakeNewLevelFromScratch (int lev, amrex::Real time, const amrex::BoxArray& ba,
1199  const amrex::DistributionMapping& dm) final;
1200 
1204  void MakeNewLevelFromCoarse (int /*lev*/, amrex::Real /*time*/, const amrex::BoxArray& /*ba*/,
1205  const amrex::DistributionMapping& /*dm*/) final;
1206 
1210  void RemakeLevel (int lev, amrex::Real time, const amrex::BoxArray& ba,
1211  const amrex::DistributionMapping& dm) final;
1212 
1214  void ClearLevel (int lev) final;
1215 
1216 private:
1217 
1224  WarpX ();
1225 
1230  static void MakeWarpX ();
1231 
1232  // Singleton is used when the code is run from python
1234 
1236  void HandleSignals ();
1237 
1238  void FillBoundaryB (int lev, PatchType patch_type, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
1239  void FillBoundaryE (int lev, PatchType patch_type, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
1240  void FillBoundaryF (int lev, PatchType patch_type, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
1241  void FillBoundaryG (int lev, PatchType patch_type, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
1242 
1243  void FillBoundaryB_avg (int lev, PatchType patch_type, amrex::IntVect ng);
1244  void FillBoundaryE_avg (int lev, PatchType patch_type, amrex::IntVect ng);
1245 
1247 
1248  void OneStep_nosub (amrex::Real t);
1249  void OneStep_sub1 (amrex::Real t);
1250 
1254  void OneStep_multiJ (amrex::Real t);
1255 
1256  void RestrictCurrentFromFineToCoarsePatch (
1257  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
1258  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp,
1259  int lev);
1260  void AddCurrentFromFineLevelandSumBoundary (
1261  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
1262  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp,
1263  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_buffer,
1264  int lev);
1265  void StoreCurrent (int lev);
1266  void RestoreCurrent (int lev);
1267  void ApplyFilterJ (
1268  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& current,
1269  int lev,
1270  int idim);
1271  void ApplyFilterJ (
1272  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& current,
1273  int lev);
1274  void SumBoundaryJ (
1275  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& current,
1276  int lev,
1277  int idim,
1278  const amrex::Periodicity& period);
1279  void SumBoundaryJ (
1280  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& current,
1281  int lev,
1282  const amrex::Periodicity& period);
1283  void NodalSyncJ (
1284  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
1285  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp,
1286  int lev,
1287  PatchType patch_type);
1288 
1289  void RestrictRhoFromFineToCoarsePatch (
1290  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
1291  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp,
1292  int lev);
1293  void ApplyFilterandSumBoundaryRho (
1294  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
1295  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp,
1296  int lev,
1297  PatchType patch_type,
1298  int icomp,
1299  int ncomp);
1300  void AddRhoFromFineLevelandSumBoundary (
1301  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
1302  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp,
1303  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_buffer,
1304  int lev,
1305  int icomp,
1306  int ncomp);
1307  void NodalSyncRho (
1308  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
1309  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp,
1310  int lev,
1311  PatchType patch_type,
1312  int icomp,
1313  int ncomp);
1314 
1315  void ReadParameters ();
1316 
1319  void BackwardCompatibility ();
1320 
1322 
1323  void AllocLevelData (int lev, const amrex::BoxArray& new_grids,
1324  const amrex::DistributionMapping& new_dmap);
1325 
1326  [[nodiscard]] amrex::DistributionMapping
1327  GetRestartDMap (const std::string& chkfile, const amrex::BoxArray& ba, int lev) const;
1328 
1329  void InitFromCheckpoint ();
1330  void PostRestart ();
1331 
1332  void InitPML ();
1334 
1335  void InitFilter ();
1336 
1338 
1340 
1346 
1351 
1354 
1355  void BuildBufferMasks ();
1356 
1357  [[nodiscard]] const amrex::iMultiFab* getCurrentBufferMasks (int lev) const {
1358  return current_buffer_masks[lev].get();
1359  }
1360 
1361  [[nodiscard]] const amrex::iMultiFab* getGatherBufferMasks (int lev) const
1362  {
1363  return gather_buffer_masks[lev].get();
1364  }
1365 
1375  void ReorderFornbergCoefficients (amrex::Vector<amrex::Real>& ordered_coeffs,
1376  amrex::Vector<amrex::Real>& unordered_coeffs,
1377  int order);
1390  void AllocateCenteringCoefficients (amrex::Gpu::DeviceVector<amrex::Real>& device_centering_stencil_coeffs_x,
1391  amrex::Gpu::DeviceVector<amrex::Real>& device_centering_stencil_coeffs_y,
1392  amrex::Gpu::DeviceVector<amrex::Real>& device_centering_stencil_coeffs_z,
1393  int centering_nox,
1394  int centering_noy,
1395  int centering_noz,
1396  short a_grid_type);
1397 
1398  void AllocLevelMFs (int lev, const amrex::BoxArray& ba, const amrex::DistributionMapping& dm,
1399  const amrex::IntVect& ngEB, amrex::IntVect& ngJ,
1400  const amrex::IntVect& ngRho, const amrex::IntVect& ngF,
1401  const amrex::IntVect& ngG, bool aux_is_nodal);
1402 
1403 #ifdef WARPX_USE_PSATD
1404 # ifdef WARPX_DIM_RZ
1405  void AllocLevelSpectralSolverRZ (amrex::Vector<std::unique_ptr<SpectralSolverRZ>>& spectral_solver,
1406  int lev,
1407  const amrex::BoxArray& realspace_ba,
1408  const amrex::DistributionMapping& dm,
1409  const std::array<amrex::Real,3>& dx);
1410 # else
1411  void AllocLevelSpectralSolver (amrex::Vector<std::unique_ptr<SpectralSolver>>& spectral_solver,
1412  int lev,
1413  const amrex::BoxArray& realspace_ba,
1414  const amrex::DistributionMapping& dm,
1415  const std::array<amrex::Real,3>& dx,
1416  bool pml_flag=false);
1417 # endif
1418 #endif
1419 
1421  std::string m_authors;
1422 
1423  amrex::Vector<int> istep; // which step?
1424  amrex::Vector<int> nsubsteps; // how many substeps on each level?
1425 
1429 
1430  // Particle container
1431  std::unique_ptr<MultiParticleContainer> mypc;
1432  std::unique_ptr<MultiDiagnostics> multi_diags;
1433 
1434  // Fluid container
1435  bool do_fluid_species = false;
1436  std::unique_ptr<MultiFluidContainer> myfl;
1437 
1438  //
1439  // Fields: First array for level, second for direction
1440  //
1441 
1442  // Full solution
1445 
1446  // Fine patch
1457 
1458  // Memory buffers for computing magnetostatic fields
1459  // Vector Potential A and previous step. Time buffer needed for computing dA/dt to first order
1463 
1464  // Same as Bfield_fp/Efield_fp for reading external field data
1467 
1472 
1495 
1508 
1509  //EB level set
1511 
1512  // store fine patch
1514 
1515  // Nodal MultiFab for nodal current deposition if warpx.do_current_centering = 1
1517 
1518  // Coarse patch
1527 
1528  // Copy of the coarse aux
1533 
1534  // If charge/current deposition buffers are used
1537 
1538  // PML
1539  int do_pml = 0;
1540  int do_silver_mueller = 0;
1541  int pml_ncell = 10;
1542  int pml_delta = 10;
1543  int pml_has_particles = 0;
1544  int do_pml_j_damping = 0;
1545  int do_pml_in_domain = 0;
1546  static int do_similar_dm_pml;
1547  bool do_pml_dive_cleaning; // default set in WarpX.cpp
1548  bool do_pml_divb_cleaning; // default set in WarpX.cpp
1552 #if (defined WARPX_DIM_RZ) && (defined WARPX_USE_PSATD)
1554 #endif
1555  amrex::Real v_particle_pml;
1556 
1557  amrex::Real moving_window_x = std::numeric_limits<amrex::Real>::max();
1558 
1559  // Plasma injection parameters
1560  int warpx_do_continuous_injection = 0;
1561  int num_injected_species = -1;
1563 
1564  std::optional<amrex::Real> m_const_dt;
1565 
1566  // Macroscopic properties
1567  std::unique_ptr<MacroscopicProperties> m_macroscopic_properties;
1568 
1569  // Hybrid PIC algorithm parameters
1570  std::unique_ptr<HybridPICModel> m_hybrid_pic_model;
1571 
1572  // Load balancing
1580  int load_balance_with_sfc = 0;
1585  amrex::Real load_balance_knapsack_factor = amrex::Real(1.24);
1591  amrex::Real load_balance_efficiency_ratio_threshold = amrex::Real(1.1);
1599  amrex::Real costs_heuristic_cells_wt = amrex::Real(0);
1605  amrex::Real costs_heuristic_particles_wt = amrex::Real(0);
1606 
1607  // Determines timesteps for override sync
1609 
1610  // Other runtime parameters
1611  int verbose = 1;
1612 
1613  bool use_hybrid_QED = false;
1614 
1615  int max_step = std::numeric_limits<int>::max();
1616  amrex::Real stop_time = std::numeric_limits<amrex::Real>::max();
1617 
1618  int regrid_int = -1;
1619 
1620  amrex::Real cfl = amrex::Real(0.999);
1621 
1622  std::string restart_chkfile;
1623 
1625  bool write_diagnostics_on_restart = false;
1626 
1629 
1630  bool use_single_read = true;
1631  bool use_single_write = true;
1632  int mffile_nstreams = 4;
1633  int field_io_nfiles = 1024;
1634  int particle_io_nfiles = 1024;
1635 
1639  std::unique_ptr<amrex::Parser> ref_patch_parser;
1640 
1641  bool is_synchronized = true;
1642 
1643  // Synchronization of nodal points
1644  static constexpr bool sync_nodal_points = true;
1645 
1647 
1648  //Slice Parameters
1650  int slice_plot_int = -1;
1659 
1660  bool fft_periodic_single_box = false;
1661  int nox_fft = 16;
1662  int noy_fft = 16;
1663  int noz_fft = 16;
1664 
1666  amrex::IntVect numprocs{0};
1667 
1669  std::unique_ptr<ParticleBoundaryBuffer> m_particle_boundary_buffer;
1670 
1671  // Accelerator lattice elements
1673 
1674  //
1675  // Embedded Boundary
1676  //
1677 
1678  // Factory for field data
1680 
1681  [[nodiscard]]
1682  amrex::FabFactory<amrex::FArrayBox> const& fieldFactory (int lev) const noexcept
1683  {
1684  return *m_field_factory[lev];
1685  }
1686 
1688 
1689  void PushPSATD ();
1690 
1691 #ifdef WARPX_USE_PSATD
1692 
1705  void PSATDForwardTransformEB (
1706  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& E_fp,
1707  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& B_fp,
1708  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& E_cp,
1709  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& B_cp);
1710 
1724  void PSATDBackwardTransformEB (
1725  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& E_fp,
1726  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& B_fp,
1727  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& E_cp,
1728  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& B_cp);
1729 
1742  void PSATDBackwardTransformEBavg (
1743  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& E_avg_fp,
1744  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& B_avg_fp,
1745  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& E_avg_cp,
1746  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& B_avg_cp);
1747 
1759  void PSATDForwardTransformJ (
1760  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
1761  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp,
1762  bool apply_kspace_filter=true);
1763 
1772  void PSATDBackwardTransformJ (
1773  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
1774  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp);
1775 
1787  void PSATDForwardTransformRho (
1788  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
1789  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp,
1790  int icomp, int dcomp, bool apply_kspace_filter=true);
1791 
1795  void PSATDMoveRhoNewToRhoOld ();
1796 
1800  void PSATDMoveJNewToJOld ();
1801 
1805  void PSATDForwardTransformF ();
1806 
1810  void PSATDBackwardTransformF ();
1811 
1815  void PSATDForwardTransformG ();
1816 
1820  void PSATDBackwardTransformG ();
1821 
1825  void PSATDCurrentCorrection ();
1826 
1830  void PSATDVayDeposition ();
1831 
1835  void PSATDPushSpectralFields ();
1836 
1842  void PSATDScaleAverageFields (amrex::Real scale_factor);
1843 
1847  void PSATDEraseAverageFields ();
1848 
1849 # ifdef WARPX_DIM_RZ
1852 # else
1855 # endif
1856 
1857 #endif
1858 
1861 };
1862 
1863 #endif
PatchType
Definition: WarpX.H:78
DtType
Definition: WarpXDtType.H:11
Definition: AcceleratorLattice.H:21
Definition: BilinearFilter.H:17
Definition: ElectrostaticSolver.H:41
Top-level class for the electromagnetic finite-difference solver.
Definition: FiniteDifferenceSolver.H:34
This class contains the parameters needed to evaluate hybrid field solutions (kinetic ions with fluid...
Definition: HybridPICModel.H:30
This class contains the macroscopic properties of the medium needed to evaluate macroscopic Maxwell e...
Definition: MacroscopicProperties.H:31
Definition: MagnetostaticSolver.H:21
This class contains a vector of all diagnostics in the simulation.
Definition: MultiDiagnostics.H:21
Definition: MultiFluidContainer.H:33
Definition: MultiParticleContainer.H:65
Definition: PML_RZ.H:31
Definition: PML.H:137
void PushPSATD(int lev)
Definition: PML.cpp:1347
void FillBoundaryG(PatchType patch_type, std::optional< bool > nodal_sync=std::nullopt)
Definition: PML.cpp:1283
void FillBoundaryB(PatchType patch_type, std::optional< bool > nodal_sync=std::nullopt)
Definition: PML.cpp:1251
void FillBoundaryE(PatchType patch_type, std::optional< bool > nodal_sync=std::nullopt)
Definition: PML.cpp:1234
std::unique_ptr< SpectralSolver > spectral_solver_cp
Definition: PML.H:250
std::unique_ptr< SpectralSolver > spectral_solver_fp
Definition: PML.H:249
void FillBoundaryF(PatchType patch_type, std::optional< bool > nodal_sync=std::nullopt)
Definition: PML.cpp:1268
Definition: ParticleBoundaryBuffer.H:22
Top-level class for the electromagnetic spectral solver.
Definition: SpectralSolver.H:33
Definition: SpectralSolverRZ.H:22
Definition: WarpX.H:85
std::unique_ptr< ParticleBoundaryBuffer > m_particle_boundary_buffer
particle buffer for scraped particles on the boundaries
Definition: WarpX.H:1669
static int self_fields_max_iters
Definition: WarpX.H:894
const amrex::MultiFab & getrho_fp(int lev)
Definition: WarpX.H:510
static int field_centering_nox
Order of finite centering of fields (from staggered grid to nodal grid), along x.
Definition: WarpX.H:276
amrex::Vector< std::unique_ptr< amrex::LayoutData< amrex::Real > > > costs
Definition: WarpX.H:1578
static short current_deposition_algo
Integer that corresponds to the current deposition algorithm (Esirkepov, direct, Vay)
Definition: WarpX.H:178
int maxlevel_extEMfield_init
Definition: WarpX.H:174
amrex::Vector< std::unique_ptr< amrex::MultiFab > > G_fp
Definition: WarpX.H:1448
amrex::Gpu::DeviceVector< amrex::Real > device_field_centering_stencil_coeffs_y
Definition: WarpX.H:1044
static int moving_window_dir
Definition: WarpX.H:910
amrex::Gpu::DeviceVector< amrex::Real > device_current_centering_stencil_coeffs_x
Definition: WarpX.H:1048
void InitFilter()
static bool do_dive_cleaning
Definition: WarpX.H:264
static amrex::Real zmax_plasma_to_compute_max_step
Definition: WarpX.H:334
bool DoFluidSpecies() const
Definition: WarpX.H:524
amrex::MultiFab * get_pointer_edge_lengths(int lev, int direction) const
Definition: WarpX.H:494
amrex::MultiFab * get_pointer_Efield_fp(int lev, int direction) const
Definition: WarpX.H:477
const amrex::MultiFab & getEfield_fp(int lev, int direction)
Definition: WarpX.H:508
amrex::Vector< int > getnsubsteps() const
Definition: WarpX.H:833
static bool do_multi_J
Definition: WarpX.H:358
std::unique_ptr< MacroscopicProperties > m_macroscopic_properties
Definition: WarpX.H:1567
MultiDiagnostics & GetMultiDiags()
Definition: WarpX.H:126
bool DoPML() const
Definition: WarpX.H:523
const amrex::MultiFab & getcurrent_cp(int lev, int direction)
Definition: WarpX.H:500
static short rho_in_time
Definition: WarpX.H:226
amrex::Vector< std::unique_ptr< amrex::FabFactory< amrex::FArrayBox > > > m_field_factory
Definition: WarpX.H:1679
bool getis_synchronized() const
Definition: WarpX.H:847
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_cp
Definition: WarpX.H:1522
amrex::Vector< std::unique_ptr< amrex::MultiFab > > m_distance_to_eb
Definition: WarpX.H:1510
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_slice
Definition: WarpX.H:1657
MultiFluidContainer & GetFluidContainer()
Definition: WarpX.H:123
static short psatd_solution_type
Definition: WarpX.H:221
amrex::Vector< std::unique_ptr< amrex::iMultiFab > > gather_buffer_masks
Definition: WarpX.H:1532
void updateStopTime(const amrex::Real new_stop_time)
Definition: WarpX.H:852
std::array< const amrex::MultiFab *const, 3 > get_array_Efield_aux(const int lev) const
Definition: WarpX.H:466
amrex::Vector< int > mirror_z_npoints
Definition: WarpX.H:553
static amrex::Real zmin_domain_boost_step_0
Definition: WarpX.H:341
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_slice
Definition: WarpX.H:1656
static bool do_compute_max_step_from_zmax
Definition: WarpX.H:338
static amrex::Vector< int > field_boundary_lo
Definition: WarpX.H:201
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:353
SpectralSolverRZ & get_spectral_solver_fp(int lev)
Definition: WarpX.H:1157
static int n_field_gather_buffer
Definition: WarpX.H:367
static int do_multi_J_n_depositions
Definition: WarpX.H:359
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, char field, int lev, PatchType patch_type)
This function initializes the E and B fields on each level using the parser and the user-defined func...
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_fp_nodal
Definition: WarpX.H:1516
amrex::Vector< amrex::Real > t_new
Definition: WarpX.H:1426
static bool do_single_precision_comms
perform field communications in single precision
Definition: WarpX.H:242
amrex::IntVect slice_cr_ratio
Definition: WarpX.H:1652
static amrex::Vector< ParticleBoundaryType > particle_boundary_lo
Definition: WarpX.H:211
static amrex::Vector< amrex::Real > B_external_grid
Initial magnetic field on the grid.
Definition: WarpX.H:145
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_store
Definition: WarpX.H:1513
void CheckKnownIssues()
Checks for known numerical issues involving different WarpX modules.
guardCellManager guard_cells
Definition: WarpX.H:1646
static bool do_shared_mem_charge_deposition
used shared memory algorithm for charge deposition
Definition: WarpX.H:245
static int em_solver_medium
Integer that corresponds to electromagnetic Maxwell solver (vacuum - 0, macroscopic - 1)
Definition: WarpX.H:192
MultiParticleContainer & GetPartContainer()
Definition: WarpX.H:122
static amrex::Vector< int > boost_direction
Direction of the Lorentz transform that defines the boosted frame of the simulation.
Definition: WarpX.H:330
static bool use_fdtd_nci_corr
Definition: WarpX.H:299
static bool verboncoeur_axis_correction
Definition: WarpX.H:313
void AverageAndPackFields(amrex::Vector< std::string > &varnames, amrex::Vector< amrex::MultiFab > &mf_avg, amrex::IntVect ngrow) const
static amrex::Real moving_window_v
Definition: WarpX.H:911
static bool do_shared_mem_current_deposition
use shared memory algorithm for current deposition
Definition: WarpX.H:248
amrex::Vector< amrex::IntVect > do_pml_Hi
Definition: WarpX.H:1550
std::string GetAuthors() const
If an authors' string is specified in the inputfile, this method returns that string....
Definition: WarpX.H:140
void setistep(int lev, int ii)
Definition: WarpX.H:837
amrex::MultiFab * get_pointer_vector_potential_fp(int lev, int direction) const
Definition: WarpX.H:485
static bool fft_do_time_averaging
Definition: WarpX.H:912
static short particle_pusher_algo
Integer that corresponds to the particle push algorithm (Boris, Vay, Higuera-Cary)
Definition: WarpX.H:184
amrex::Vector< std::unique_ptr< PML > > pml
Definition: WarpX.H:1551
amrex::RealVect fine_tag_lo
Definition: WarpX.H:1636
std::string restart_chkfile
Definition: WarpX.H:1622
static WarpX * m_instance
Definition: WarpX.H:1233
const amrex::MultiFab & getG_fp(int lev)
Definition: WarpX.H:513
amrex::Vector< std::unique_ptr< amrex::MultiFab > > rho_cp
Definition: WarpX.H:1521
amrex::MultiFab * get_pointer_G_fp(int lev) const
Definition: WarpX.H:483
static bool do_dynamic_scheduling
Definition: WarpX.H:346
void PostRestart()
const amrex::MultiFab & getBfield_cp(int lev, int direction)
Definition: WarpX.H:502
std::unique_ptr< amrex::Parser > ref_patch_parser
User-defined parser to define refinement patches.
Definition: WarpX.H:1639
static std::string E_ext_grid_s
Initialization type for external electric field on the grid.
Definition: WarpX.H:150
amrex::Gpu::DeviceVector< amrex::Real > device_field_centering_stencil_coeffs_z
Definition: WarpX.H:1045
amrex::MultiFab * get_pointer_phi_fp(int lev) const
Definition: WarpX.H:484
static int self_fields_verbosity
Definition: WarpX.H:895
amrex::Real stopTime() const
Definition: WarpX.H:851
std::unique_ptr< amrex::Parser > Byfield_parser
User-defined parser to initialize y-component of the magnetic field on the grid.
Definition: WarpX.H:160
amrex::Vector< std::unique_ptr< PML_RZ > > pml_rz
Definition: WarpX.H:1553
const amrex::MultiFab & getphi_fp(int lev)
Definition: WarpX.H:511
void InitData()
static std::map< std::string, amrex::MultiFab * > multifab_map
Definition: WarpX.H:453
std::unique_ptr< MultiFluidContainer > myfl
Definition: WarpX.H:1436
amrex::Gpu::DeviceVector< amrex::Real > device_field_centering_stencil_coeffs_x
Definition: WarpX.H:1043
amrex::MultiFab * get_pointer_current_fp(int lev, int direction) const
Definition: WarpX.H:479
std::unique_ptr< HybridPICModel > m_hybrid_pic_model
Definition: WarpX.H:1570
void AddExternalFields()
amrex::MultiFab * get_pointer_current_cp(int lev, int direction) const
Definition: WarpX.H:489
amrex::Vector< amrex::Real > getdt() const
Definition: WarpX.H:843
static int noz
Order of the particle shape factors (splines) along z.
Definition: WarpX.H:273
amrex::Gpu::DeviceVector< amrex::Real > device_current_centering_stencil_coeffs_z
Definition: WarpX.H:1050
amrex::Vector< amrex::Real > gett_new() const
Definition: WarpX.H:840
const amrex::MultiFab & getBfield_avg_cp(int lev, int direction)
Definition: WarpX.H:518
static int num_mirrors
Definition: WarpX.H:550
amrex::MultiFab * get_pointer_face_areas(int lev, int direction) const
Definition: WarpX.H:495
amrex::Vector< std::unique_ptr< amrex::MultiFab > > phi_fp
Definition: WarpX.H:1450
ParticleBoundaryBuffer & GetParticleBoundaryBuffer()
Definition: WarpX.H:128
void WriteUsedInputsFile() const
bool do_pml_divb_cleaning
Definition: WarpX.H:1548
amrex::Vector< int > getistep() const
Definition: WarpX.H:835
static int current_centering_noy
Order of finite centering of currents (from nodal grid to staggered grid), along y.
Definition: WarpX.H:285
amrex::Gpu::DeviceVector< amrex::Real > device_current_centering_stencil_coeffs_y
Definition: WarpX.H:1049
static bool add_external_E_field
Whether to apply the effect of an externally-defined electric field.
Definition: WarpX.H:153
amrex::MultiFab * get_pointer_Efield_aux(int lev, int direction) const
Definition: WarpX.H:474
void InitDiagnostics()
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_avg_cp
Definition: WarpX.H:1525
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:503
amrex::Vector< amrex::Real > load_balance_efficiency
Definition: WarpX.H:1593
static amrex::Real self_fields_required_precision
Definition: WarpX.H:892
static amrex::IntVect sort_bin_size
Definition: WarpX.H:350
WarpX(WarpX &&)=default
amrex::IntVect m_rho_nodal_flag
Definition: WarpX.H:378
static std::map< std::string, amrex::iMultiFab * > imultifab_map
Definition: WarpX.H:454
utils::parser::IntervalsParser load_balance_intervals
Definition: WarpX.H:1575
amrex::Vector< std::array< std::unique_ptr< amrex::iMultiFab >, 3 > > m_flag_ext_face
Definition: WarpX.H:1486
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_fp
Definition: WarpX.H:1451
amrex::IntVect getngEB() const
Definition: WarpX.H:925
utils::parser::IntervalsParser override_sync_intervals
Definition: WarpX.H:1608
std::unique_ptr< amrex::Parser > Bxfield_parser
User-defined parser to initialize x-component of the magnetic field on the grid.
Definition: WarpX.H:158
utils::parser::IntervalsParser get_load_balance_intervals() const
returns the load balance interval
Definition: WarpX.H:666
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > m_face_areas
EB: Areas of the mesh faces.
Definition: WarpX.H:1471
amrex::Real gett_old(int lev) const
Definition: WarpX.H:839
std::unique_ptr< amrex::Parser > Exfield_parser
User-defined parser to initialize x-component of the electric field on the grid.
Definition: WarpX.H:164
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_cax
Definition: WarpX.H:1530
amrex::MultiFab * get_pointer_F_cp(int lev) const
Definition: WarpX.H:491
const amrex::MultiFab & getF_fp(int lev)
Definition: WarpX.H:512
static int do_moving_window
Definition: WarpX.H:897
amrex::MultiFab * get_pointer_Efield_cp(int lev, int direction) const
Definition: WarpX.H:487
void ReadExternalFieldFromFile(std::string read_fields_from_path, amrex::MultiFab *mf, std::string F_name, std::string F_component)
int maxStep() const
Definition: WarpX.H:849
static int nox
Order of the particle shape factors (splines) along x.
Definition: WarpX.H:269
int getnsubsteps(int lev) const
Definition: WarpX.H:834
WarpX(WarpX const &)=delete
static amrex::Real quantum_xi_c2
Definition: WarpX.H:655
void InitFromScratch()
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_slice
Definition: WarpX.H:1658
amrex::Vector< std::array< std::unique_ptr< amrex::iMultiFab >, 3 > > m_flag_info_face
Definition: WarpX.H:1479
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_fp_vay
Definition: WarpX.H:1452
void updateMaxStep(const int new_max_step)
Definition: WarpX.H:850
HybridPICModel & GetHybridPICModel()
Definition: WarpX.H:125
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_cp
Definition: WarpX.H:1524
static bool serialize_initial_conditions
If true, the initial conditions from random number generators are serialized (useful for reproducible...
Definition: WarpX.H:323
const amrex::iMultiFab * getGatherBufferMasks(int lev) const
Definition: WarpX.H:1361
std::unique_ptr< amrex::Parser > Bzfield_parser
User-defined parser to initialize z-component of the magnetic field on the grid.
Definition: WarpX.H:162
amrex::Vector< std::unique_ptr< SpectralSolverRZ > > spectral_solver_fp
Definition: WarpX.H:1850
static amrex::IntVect m_fill_guards_fields
Whether to fill guard cells when computing inverse FFTs of fields.
Definition: WarpX.H:257
static short grid_type
Definition: WarpX.H:375
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > vector_potential_grad_buf_b_stag
Definition: WarpX.H:1462
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_aux
Definition: WarpX.H:1443
const amrex::MultiFab & getEfield_cp(int lev, int direction)
Definition: WarpX.H:501
static int current_centering_nox
Order of finite centering of currents (from nodal grid to staggered grid), along x.
Definition: WarpX.H:283
amrex::MultiFab * get_pointer_Bfield_aux(int lev, int direction) const
Definition: WarpX.H:475
static bool use_filter_compensation
If true, a compensation step is added to the bilinear filtering of charge and currents.
Definition: WarpX.H:320
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > vector_potential_grad_buf_e_stag
Definition: WarpX.H:1461
amrex::Vector< std::array< std::unique_ptr< amrex::LayoutData< FaceInfoBox > >, 3 > > m_borrowing
Definition: WarpX.H:1494
static bool add_external_B_field
Whether to apply the effect of an externally-defined magnetic field.
Definition: WarpX.H:155
static short charge_deposition_algo
Integer that corresponds to the charge deposition algorithm (only standard deposition)
Definition: WarpX.H:180
amrex::Real gett_new(int lev) const
Definition: WarpX.H:841
amrex::Vector< amrex::Real > dt
Definition: WarpX.H:1428
amrex::Vector< std::unique_ptr< amrex::MultiFab > > rho_slice
Definition: WarpX.H:1655
amrex::Vector< std::unique_ptr< amrex::MultiFab > > F_cp
Definition: WarpX.H:1519
amrex::RealVect fine_tag_hi
Definition: WarpX.H:1637
amrex::IntVect get_ng_fieldgather() const
Definition: WarpX.H:930
amrex::IntVect get_ng_depos_rho() const
Definition: WarpX.H:929
const amrex::MultiFab & getfaceareas(int lev, int direction)
Definition: WarpX.H:521
static int start_moving_window_step
Definition: WarpX.H:898
amrex::Vector< int > istep
Definition: WarpX.H:1423
static int electrostatic_solver_id
Definition: WarpX.H:889
void PrintMainPICparameters()
void prepareFields(int 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
const AcceleratorLattice & get_accelerator_lattice(int lev)
Definition: WarpX.H:1057
amrex::Vector< std::unique_ptr< amrex::MultiFab > > G_slice
Definition: WarpX.H:1654
static int n_current_deposition_buffer
Definition: WarpX.H:371
amrex::Vector< std::unique_ptr< amrex::MultiFab > > F_fp
Definition: WarpX.H:1447
static amrex::Vector< int > field_boundary_hi
Definition: WarpX.H:206
int Verbose() const
Definition: WarpX.H:116
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_cax
Definition: WarpX.H:1529
amrex::Vector< std::unique_ptr< amrex::MultiFab > > charge_buf
Definition: WarpX.H:1536
std::array< const amrex::MultiFab *const, 3 > get_array_Bfield_aux(const int lev) const
Definition: WarpX.H:457
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > m_edge_lengths
EB: Lengths of the mesh edges.
Definition: WarpX.H:1469
const amrex::iMultiFab * getCurrentBufferMasks(int lev) const
Definition: WarpX.H:1357
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_avg_fp
Definition: WarpX.H:1455
amrex::Vector< int > injected_plasma_species
Definition: WarpX.H:1562
static bool do_device_synchronize
Definition: WarpX.H:361
static bool use_kspace_filter
If true, the bilinear filtering of charge and currents is done in Fourier space.
Definition: WarpX.H:318
amrex::MultiFab * get_pointer_F_fp(int lev) const
Definition: WarpX.H:482
void InitNCICorrector()
int getistep(int lev) const
Definition: WarpX.H:836
std::unique_ptr< MultiDiagnostics > multi_diags
Definition: WarpX.H:1432
std::unique_ptr< amrex::Parser > Ezfield_parser
User-defined parser to initialize z-component of the electric field on the grid.
Definition: WarpX.H:168
static int noy
Order of the particle shape factors (splines) along y.
Definition: WarpX.H:271
amrex::Vector< int > nsubsteps
Definition: WarpX.H:1424
void ComputeMaxStep()
Compute the last time step of the simulation Calls computeMaxStepBoostAccelerator() if required.
static int field_centering_noz
Order of finite centering of fields (from staggered grid to nodal grid), along z.
Definition: WarpX.H:280
void sett_new(int lev, amrex::Real time)
Definition: WarpX.H:842
amrex::IntVect getngF() const
Definition: WarpX.H:926
static amrex::Real beta_boost
Beta value corresponding to the Lorentz factor of the boosted frame of the simulation.
Definition: WarpX.H:328
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_fp_external
Definition: WarpX.H:1465
amrex::MultiFab * get_pointer_G_cp(int lev) const
Definition: WarpX.H:492
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:266
std::unique_ptr< MultiParticleContainer > mypc
Definition: WarpX.H:1431
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_buf
Definition: WarpX.H:1535
static bool use_filter
If true, a bilinear filter is used to smooth charge and currents.
Definition: WarpX.H:316
amrex::MultiFab * get_pointer_rho_fp(int lev) const
Definition: WarpX.H:481
static amrex::IntVect m_fill_guards_current
Whether to fill guard cells when computing inverse FFTs of currents.
Definition: WarpX.H:260
MacroscopicProperties & GetMacroscopicProperties()
Definition: WarpX.H:124
MagnetostaticSolver::VectorPoissonBoundaryHandler m_vector_poisson_boundary_handler
Definition: WarpX.H:966
const amrex::MultiFab & getG_cp(int lev)
Definition: WarpX.H:505
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > vector_potential_fp_nodal
Definition: WarpX.H:1460
ElectrostaticSolver::PoissonBoundaryHandler m_poisson_boundary_handler
Definition: WarpX.H:941
static amrex::IntVect shared_tilesize
tileSize to use for shared current deposition operations
Definition: WarpX.H:254
static int do_similar_dm_pml
Definition: WarpX.H:1546
amrex::Vector< std::unique_ptr< FiniteDifferenceSolver > > m_fdtd_solver_fp
Definition: WarpX.H:1859
amrex::Vector< amrex::Real > gett_old() const
Definition: WarpX.H:838
static int current_centering_noz
Order of finite centering of currents (from nodal grid to staggered grid), along z.
Definition: WarpX.H:287
static bool safe_guard_cells
Definition: WarpX.H:362
amrex::IntVect getngUpdateAux() const
Definition: WarpX.H:927
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_cp
Definition: WarpX.H:1523
amrex::Vector< std::unique_ptr< amrex::MultiFab > > rho_fp
Definition: WarpX.H:1449
amrex::MultiFab * get_pointer_rho_cp(int lev) const
Definition: WarpX.H:490
const amrex::MultiFab & getedgelengths(int lev, int direction)
Definition: WarpX.H:520
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_fp
Definition: WarpX.H:1454
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > ECTRhofield
Definition: WarpX.H:1503
amrex::Vector< amrex::Real > t_old
Definition: WarpX.H:1427
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:355
static bool refine_plasma
Definition: WarpX.H:347
amrex::FabFactory< amrex::FArrayBox > const & fieldFactory(int lev) const noexcept
Definition: WarpX.H:1682
static int macroscopic_solver_algo
Definition: WarpX.H:196
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_aux
Definition: WarpX.H:1444
static int ncomps
Definition: WarpX.H:295
static int moving_window_active(int const step)
Definition: WarpX.H:905
static bool galerkin_interpolation
Definition: WarpX.H:309
amrex::Vector< std::unique_ptr< NCIGodfreyFilter > > nci_godfrey_filter_bxbyez
Definition: WarpX.H:542
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > m_area_mod
Definition: WarpX.H:1490
static amrex::IntVect filter_npass_each_dir
Definition: WarpX.H:539
amrex::IntVect get_numprocs() const
Definition: WarpX.H:939
const amrex::MultiFab & getBfield_fp(int lev, int direction)
Definition: WarpX.H:509
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Venl
Definition: WarpX.H:1507
static short electromagnetic_solver_id
Integer that corresponds to the type of Maxwell solver (Yee, CKC, PSATD, ECT)
Definition: WarpX.H:186
void InitPML()
amrex::Real v_particle_pml
Definition: WarpX.H:1555
amrex::IntVect get_ng_depos_J() const
Definition: WarpX.H:928
BilinearFilter bilinear_filter
Definition: WarpX.H:540
amrex::MultiFab * get_pointer_current_fp_nodal(int lev, int direction) const
Definition: WarpX.H:480
const amrex::MultiFab & getEfield_avg_fp(int lev, int direction)
Definition: WarpX.H:515
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_avg_fp
Definition: WarpX.H:1456
const amrex::MultiFab & getBfield_avg_fp(int lev, int direction)
Definition: WarpX.H:516
static int field_centering_noy
Order of finite centering of fields (from staggered grid to nodal grid), along y.
Definition: WarpX.H:278
amrex::Real getdt(int lev) const
Definition: WarpX.H:844
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_fp_external
Definition: WarpX.H:1466
const amrex::MultiFab & getEfield_avg_cp(int lev, int direction)
Definition: WarpX.H:517
amrex::Vector< std::unique_ptr< NCIGodfreyFilter > > nci_godfrey_filter_exeybz
Definition: WarpX.H:541
static bool do_current_centering
Definition: WarpX.H:231
amrex::Vector< amrex::Real > mirror_z
Definition: WarpX.H:551
amrex::Vector< std::unique_ptr< amrex::MultiFab > > F_slice
Definition: WarpX.H:1653
int getdo_moving_window() const
Definition: WarpX.H:845
static bool do_subcycling
Definition: WarpX.H:357
static int n_rz_azimuthal_modes
Number of modes for the RZ multi-mode version.
Definition: WarpX.H:290
static short J_in_time
Definition: WarpX.H:225
static amrex::Real gamma_boost
Lorentz factor of the boosted frame in which a boosted-frame simulation is run.
Definition: WarpX.H:326
static short field_gathering_algo
Integer that corresponds to the field gathering algorithm (energy-conserving, momentum-conserving)
Definition: WarpX.H:182
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_avg_cp
Definition: WarpX.H:1526
static int shared_mem_current_tpb
number of threads to use per block in shared deposition
Definition: WarpX.H:251
static short load_balance_costs_update_algo
Definition: WarpX.H:190
amrex::MultiFab * get_pointer_Bfield_fp(int lev, int direction) const
Definition: WarpX.H:478
amrex::Vector< std::unique_ptr< FiniteDifferenceSolver > > m_fdtd_solver_cp
Definition: WarpX.H:1860
void computeMaxStepBoostAccelerator()
amrex::Vector< amrex::Real > mirror_z_width
Definition: WarpX.H:552
const amrex::MultiFab & getcurrent_fp(int lev, int direction)
Definition: WarpX.H:507
std::unique_ptr< MultiReducedDiags > reduced_diags
object with all reduced diagnotics, similar to MultiParticleContainer for species.
Definition: WarpX.H:556
const amrex::MultiFab & getBfield(int lev, int direction)
Definition: WarpX.H:498
void PerformanceHints()
const amrex::MultiFab & getF_cp(int lev)
Definition: WarpX.H:504
amrex::Vector< std::unique_ptr< amrex::iMultiFab > > current_buffer_masks
Definition: WarpX.H:1531
std::string m_authors
Author of an input file / simulation setup.
Definition: WarpX.H:1421
void ScrapeParticles()
amrex::MultiFab * get_pointer_Bfield_cp(int lev, int direction) const
Definition: WarpX.H:488
int slice_max_grid_size
Definition: WarpX.H:1649
static std::string B_ext_grid_s
Initialization type for external magnetic field on the grid.
Definition: WarpX.H:148
amrex::Vector< std::unique_ptr< amrex::MultiFab > > G_cp
Definition: WarpX.H:1520
const amrex::MultiFab & getEfield(int lev, int direction)
Definition: WarpX.H:497
std::unique_ptr< amrex::Parser > Eyfield_parser
User-defined parser to initialize y-component of the electric field on the grid.
Definition: WarpX.H:166
static amrex::Real self_fields_absolute_tolerance
Definition: WarpX.H:893
amrex::Vector< std::unique_ptr< AcceleratorLattice > > m_accelerator_lattice
Definition: WarpX.H:1672
static amrex::Vector< ParticleBoundaryType > particle_boundary_hi
Definition: WarpX.H:216
std::optional< amrex::Real > m_const_dt
Definition: WarpX.H:1564
FiniteDifferenceSolver * get_pointer_fdtd_solver_fp(int lev)
Definition: WarpX.H:1160
amrex::RealBox slice_realbox
Definition: WarpX.H:1651
amrex::Vector< amrex::IntVect > do_pml_Lo
Definition: WarpX.H:1549
amrex::Vector< std::unique_ptr< SpectralSolverRZ > > spectral_solver_cp
Definition: WarpX.H:1851
amrex::Real getmoving_window_x() const
Definition: WarpX.H:846
static amrex::Vector< amrex::Real > E_external_grid
Initial electric field on the grid.
Definition: WarpX.H:143
bool do_pml_dive_cleaning
Definition: WarpX.H:1547
const PML_RZ * getPMLRZ()
Definition: WarpX.H:527
static bool compute_max_step_from_btd
If true, the code will compute max_step from the back transformed diagnostics.
Definition: WarpX.H:344
bool current_correction
If true, a correction is applied to the current in Fourier space,.
Definition: WarpX.H:235
void ComputePMLFactors()
static int end_moving_window_step
Definition: WarpX.H:899
static utils::parser::IntervalsParser sort_intervals
Definition: WarpX.H:349
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_fp
Definition: WarpX.H:1453
Definition: WarpXParticleContainer.H:109
void MakeNewLevelFromScratch(int lev, Real time, const BoxArray &ba, const DistributionMapping &dm) override=0
virtual void ClearLevel(int lev)=0
AmrCore & operator=(AmrCore &&rhs) noexcept
void ErrorEst(int lev, TagBoxArray &tags, Real time, int ngrow) override=0
virtual void RemakeLevel(int lev, Real time, const BoxArray &ba, const DistributionMapping &dm)=0
virtual void MakeNewLevelFromCoarse(int lev, Real time, const BoxArray &ba, const DistributionMapping &dm)=0
virtual void PostProcessBaseGrids(BoxArray &) const
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
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
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:93
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:132
int verbose
void Finalize(AMReX *pamrex)
const int[]
std::string Version()
std::array< T, N > Array
ii
Definition: check_interp_points_and_weights.py:148
cell_size
Definition: compute_domain.py:37
name
Definition: run_automated.py:229
float dt
Definition: stencil.py:442
tuple dx
lab frame
Definition: stencil.py:429
beta
Definition: stencil.py:434
float cfl
Definition: stencil.py:439
string field
Definition: video_yt.py:31
int verbosity()