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 
29 
30 #ifdef WARPX_USE_PSATD
31 # ifdef WARPX_DIM_RZ
34 # else
36 # endif
37 #endif
39 #include "Evolve/WarpXDtType.H"
40 #include "Evolve/WarpXPushType.H"
43 #include "Filter/BilinearFilter.H"
47 #include "Utils/export.H"
48 
49 #include <AMReX.H>
50 #include <AMReX_AmrCore.H>
51 #include <AMReX_Array.H>
52 #include <AMReX_Config.H>
53 #ifdef AMREX_USE_EB
54 # include <AMReX_EBFabFactory.H>
55 #endif
56 #include <AMReX_GpuContainers.H>
57 #include <AMReX_IntVect.H>
58 #include <AMReX_LayoutData.H>
59 #include <AMReX_Parser.H>
60 #include <AMReX_REAL.H>
61 #include <AMReX_RealBox.H>
62 #include <AMReX_RealVect.H>
63 #include <AMReX_Vector.H>
64 #include <AMReX_VisMF.H>
65 
66 #include <AMReX_BaseFwd.H>
67 #include <AMReX_AmrCoreFwd.H>
68 
69 #include <array>
70 #include <iostream>
71 #include <limits>
72 #include <memory>
73 #include <optional>
74 #include <string>
75 #include <vector>
76 #include <map>
77 
78 
79 enum struct PatchType : int
80 {
81  fine,
82  coarse
83 };
84 
85 class WARPX_EXPORT WarpX
86  : public amrex::AmrCore
87 {
88 public:
89 
90  friend class PML;
91 
92  static WarpX& GetInstance ();
93 
94  static void ResetInstance ();
95 
100  static void Finalize();
101 
103  ~WarpX () override;
104 
106  WarpX ( WarpX const &) = delete;
108  WarpX& operator= ( WarpX const & ) = delete;
109 
111  WarpX ( WarpX && ) = default;
113  WarpX& operator= ( WarpX && ) = default;
114 
115  static std::string Version ();
116  static std::string PicsarVersion ();
117 
118  [[nodiscard]] int Verbose () const { return verbose; }
119 
120  void InitData ();
121 
122  void Evolve (int numsteps = -1);
123 
124  void EvolveImplicitPicardInit (int lev);
125  void SaveParticlesAtImplicitStepStart (WarpXParticleContainer& pc, int lev);
126  void FinishImplicitParticleUpdate (WarpXParticleContainer& pc, int lev);
127  void FinishImplicitFieldUpdate(amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3 > >& Efield_fp,
128  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3 > >& Efield_n);
129 
132  MacroscopicProperties& GetMacroscopicProperties () { return *m_macroscopic_properties; }
133  HybridPICModel& GetHybridPICModel () { return *m_hybrid_pic_model; }
134  MultiDiagnostics& GetMultiDiags () {return *multi_diags;}
135 
136  ParticleBoundaryBuffer& GetParticleBoundaryBuffer () { return *m_particle_boundary_buffer; }
137 
138  static void shiftMF (amrex::MultiFab& mf, const amrex::Geometry& geom,
139  int num_shift, int dir, int lev, bool update_cost_flag,
140  amrex::Real external_field=0.0, bool useparser = false,
141  amrex::ParserExecutor<3> const& field_parser={});
142 
148  [[nodiscard]] std::string GetAuthors () const { return m_authors; }
149 
155 
156  // Algorithms
162  static short field_gathering_algo;
164  static short particle_pusher_algo;
168  static short evolve_scheme;
172  static amrex::Real picard_iteration_tolerance;
180  static int em_solver_medium;
205 
209  static short psatd_solution_type;
210 
213  static short J_in_time;
214  static short rho_in_time;
215 
219  static bool do_current_centering;
220 
222  // to satisfy the continuity equation and charge conservation
224 
227  bool update_with_rho = false;
228 
231 
234 
237 
240 
243 
246 
249 
252  static bool do_dive_cleaning;
254  static bool do_divb_cleaning;
255 
257  static int nox;
259  static int noy;
261  static int noz;
262 
269 
276 
283  static int ncomps;
284 
287  static bool use_fdtd_nci_corr;
298 
302 
304  static bool use_filter;
306  static bool use_kspace_filter;
309 
312 
314  static amrex::Real gamma_boost;
316  static amrex::Real beta_boost;
329  static amrex::Real zmin_domain_boost_step_0;
330 
333 
335  static bool refine_plasma;
336 
339 
344 
345  static bool do_subcycling;
346  static bool do_multi_J;
348 
350  static bool safe_guard_cells;
351 
360 
363  static short grid_type;
364 
365  // Global rho nodal flag to know about rho index type when rho MultiFab is not allocated
367 
383  static void AllocInitMultiFab (
384  std::unique_ptr<amrex::MultiFab>& mf,
385  const amrex::BoxArray& ba,
386  const amrex::DistributionMapping& dm,
387  int ncomp,
388  const amrex::IntVect& ngrow,
389  int level,
390  const std::string& name,
391  std::optional<const amrex::Real> initial_value = {});
392 
408  static void AllocInitMultiFab (
409  std::unique_ptr<amrex::iMultiFab>& mf,
410  const amrex::BoxArray& ba,
411  const amrex::DistributionMapping& dm,
412  int ncomp,
413  const amrex::IntVect& ngrow,
414  int level,
415  const std::string& name,
416  std::optional<const int> initial_value = {});
417 
429  static void AliasInitMultiFab (
430  std::unique_ptr<amrex::MultiFab>& mf,
431  const amrex::MultiFab& mf_to_alias,
432  int scomp,
433  int ncomp,
434  int level,
435  const std::string& name,
436  std::optional<const amrex::Real> initial_value);
437 
450  static void AllocInitMultiFabFromModel (
451  std::unique_ptr<amrex::MultiFab>& mf,
452  amrex::MultiFab& mf_model,
453  int level,
454  const std::string& name,
455  std::optional<const amrex::Real> initial_value = {});
456 
457  // Maps of all of the MultiFabs and iMultiFabs used (this can include MFs from other classes)
458  // This is a convenience for the Python interface, allowing all MultiFabs
459  // to be easily referenced from Python.
460  static std::map<std::string, amrex::MultiFab *> multifab_map;
461  static std::map<std::string, amrex::iMultiFab *> imultifab_map;
462 
463  [[nodiscard]] std::array<const amrex::MultiFab* const, 3>
464  get_array_Bfield_aux (const int lev) const {
465  return {
466  Bfield_aux[lev][0].get(),
467  Bfield_aux[lev][1].get(),
468  Bfield_aux[lev][2].get()
469  };
470  }
471 
472  [[nodiscard]] std::array<const amrex::MultiFab* const, 3>
473  get_array_Efield_aux (const int lev) const {
474  return {
475  Efield_aux[lev][0].get(),
476  Efield_aux[lev][1].get(),
477  Efield_aux[lev][2].get()
478  };
479  }
480 
481  [[nodiscard]] amrex::MultiFab * get_pointer_Efield_aux (int lev, int direction) const { return Efield_aux[lev][direction].get(); }
482  [[nodiscard]] amrex::MultiFab * get_pointer_Bfield_aux (int lev, int direction) const { return Bfield_aux[lev][direction].get(); }
483 
484  [[nodiscard]] amrex::MultiFab * get_pointer_Efield_fp (int lev, int direction) const { return Efield_fp[lev][direction].get(); }
485  [[nodiscard]] amrex::MultiFab * get_pointer_Bfield_fp (int lev, int direction) const { return Bfield_fp[lev][direction].get(); }
486  [[nodiscard]] amrex::MultiFab * get_pointer_current_fp (int lev, int direction) const { return current_fp[lev][direction].get(); }
487  [[nodiscard]] amrex::MultiFab * get_pointer_current_fp_nodal (int lev, int direction) const { return current_fp_nodal[lev][direction].get(); }
488  [[nodiscard]] amrex::MultiFab * get_pointer_rho_fp (int lev) const { return rho_fp[lev].get(); }
489  [[nodiscard]] amrex::MultiFab * get_pointer_F_fp (int lev) const { return F_fp[lev].get(); }
490  [[nodiscard]] amrex::MultiFab * get_pointer_G_fp (int lev) const { return G_fp[lev].get(); }
491  [[nodiscard]] amrex::MultiFab * get_pointer_phi_fp (int lev) const { return phi_fp[lev].get(); }
492  [[nodiscard]] amrex::MultiFab * get_pointer_vector_potential_fp (int lev, int direction) const { return vector_potential_fp_nodal[lev][direction].get(); }
493 
494  [[nodiscard]] amrex::MultiFab * get_pointer_Efield_cp (int lev, int direction) const { return Efield_cp[lev][direction].get(); }
495  [[nodiscard]] amrex::MultiFab * get_pointer_Bfield_cp (int lev, int direction) const { return Bfield_cp[lev][direction].get(); }
496  [[nodiscard]] amrex::MultiFab * get_pointer_current_cp (int lev, int direction) const { return current_cp[lev][direction].get(); }
497  [[nodiscard]] amrex::MultiFab * get_pointer_rho_cp (int lev) const { return rho_cp[lev].get(); }
498  [[nodiscard]] amrex::MultiFab * get_pointer_F_cp (int lev) const { return F_cp[lev].get(); }
499  [[nodiscard]] amrex::MultiFab * get_pointer_G_cp (int lev) const { return G_cp[lev].get(); }
500 
501  [[nodiscard]] amrex::MultiFab * get_pointer_edge_lengths (int lev, int direction) const { return m_edge_lengths[lev][direction].get(); }
502  [[nodiscard]] amrex::MultiFab * get_pointer_face_areas (int lev, int direction) const { return m_face_areas[lev][direction].get(); }
503 
504  const amrex::MultiFab& getEfield (int lev, int direction) {return *Efield_aux[lev][direction];}
505  const amrex::MultiFab& getBfield (int lev, int direction) {return *Bfield_aux[lev][direction];}
506 
507  const amrex::MultiFab& getcurrent_cp (int lev, int direction) {return *current_cp[lev][direction];}
508  const amrex::MultiFab& getEfield_cp (int lev, int direction) {return *Efield_cp[lev][direction];}
509  const amrex::MultiFab& getBfield_cp (int lev, int direction) {return *Bfield_cp[lev][direction];}
510  const amrex::MultiFab& getrho_cp (int lev) {return *rho_cp[lev];}
511  const amrex::MultiFab& getF_cp (int lev) {return *F_cp[lev];}
512  const amrex::MultiFab& getG_cp (int lev) {return *G_cp[lev];}
513 
514  const amrex::MultiFab& getcurrent_fp (int lev, int direction) {return *current_fp[lev][direction];}
515  const amrex::MultiFab& getEfield_fp (int lev, int direction) {return *Efield_fp[lev][direction];}
516  const amrex::MultiFab& getBfield_fp (int lev, int direction) {return *Bfield_fp[lev][direction];}
517  const amrex::MultiFab& getrho_fp (int lev) {return *rho_fp[lev];}
518  const amrex::MultiFab& getphi_fp (int lev) {return *phi_fp[lev];}
519  const amrex::MultiFab& getF_fp (int lev) {return *F_fp[lev];}
520  const amrex::MultiFab& getG_fp (int lev) {return *G_fp[lev];}
521 
522  const amrex::MultiFab& getEfield_avg_fp (int lev, int direction) {return *Efield_avg_fp[lev][direction];}
523  const amrex::MultiFab& getBfield_avg_fp (int lev, int direction) {return *Bfield_avg_fp[lev][direction];}
524  const amrex::MultiFab& getEfield_avg_cp (int lev, int direction) {return *Efield_avg_cp[lev][direction];}
525  const amrex::MultiFab& getBfield_avg_cp (int lev, int direction) {return *Bfield_avg_cp[lev][direction];}
526 
527  const amrex::MultiFab& getedgelengths (int lev, int direction) {return *m_edge_lengths[lev][direction];}
528  const amrex::MultiFab& getfaceareas (int lev, int direction) {return *m_face_areas[lev][direction];}
529 
530  [[nodiscard]] bool DoPML () const {return do_pml;}
531  [[nodiscard]] bool DoFluidSpecies () const {return do_fluid_species;}
532 
533 #if (defined WARPX_DIM_RZ) && (defined WARPX_USE_PSATD)
534  const PML_RZ* getPMLRZ() {return pml_rz[0].get();}
535 #endif
536 
538  [[nodiscard]] std::vector<bool> getPMLdirections() const;
539 
540  static amrex::LayoutData<amrex::Real>* getCosts (int lev);
541 
542  void setLoadBalanceEfficiency (int lev, amrex::Real efficiency);
543 
544  amrex::Real getLoadBalanceEfficiency (int lev);
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 
572 
574  void WriteUsedInputsFile () const;
575 
577  void PrintDtDxDyDz ();
578 
584  void ComputeMaxStep ();
585  // Compute max_step automatically for simulations in a boosted frame.
587 
592  int MoveWindow (int step, bool move_j);
593 
599  void ShiftGalileanBoundary ();
600 
605  void UpdateInjectionPosition (amrex::Real dt);
606 
607  void ResetProbDomain (const amrex::RealBox& rb);
608  void EvolveE ( amrex::Real dt);
609  void EvolveE (int lev, amrex::Real dt);
610  void EvolveB ( amrex::Real dt, DtType dt_type);
611  void EvolveB (int lev, amrex::Real dt, DtType dt_type);
612  void EvolveF ( amrex::Real dt, DtType dt_type);
613  void EvolveF (int lev, amrex::Real dt, DtType dt_type);
614  void EvolveG ( amrex::Real dt, DtType dt_type);
615  void EvolveG (int lev, amrex::Real dt, DtType dt_type);
616  void EvolveB (int lev, PatchType patch_type, amrex::Real dt, DtType dt_type);
617  void EvolveE (int lev, PatchType patch_type, amrex::Real dt);
618  void EvolveF (int lev, PatchType patch_type, amrex::Real dt, DtType dt_type);
619  void EvolveG (int lev, PatchType patch_type, amrex::Real dt, DtType dt_type);
620 
621  void MacroscopicEvolveE ( amrex::Real dt);
622  void MacroscopicEvolveE (int lev, amrex::Real dt);
623  void MacroscopicEvolveE (int lev, PatchType patch_type, amrex::Real dt);
624 
630  void HybridPICEvolveFields ();
631 
639  void HybridPICDepositInitialRhoAndJ ();
640 
645  void Hybrid_QED_Push ( amrex::Vector<amrex::Real> dt);
646 
652  void Hybrid_QED_Push (int lev, amrex::Real dt);
653 
660  void Hybrid_QED_Push (int lev, PatchType patch_type, amrex::Real dt);
661 
662  static amrex::Real quantum_xi_c2;
663 
666  void LoadBalance ();
669  void ResetCosts ();
670 
674  {
675  return load_balance_intervals;
676  }
677 
685  void DampFieldsInGuards (int lev,
686  const std::array<std::unique_ptr<amrex::MultiFab>,3>& Efield,
687  const std::array<std::unique_ptr<amrex::MultiFab>,3>& Bfield);
688 
696  void DampFieldsInGuards (int lev, std::unique_ptr<amrex::MultiFab>& mf);
697 
698 #ifdef WARPX_DIM_RZ
699  void ApplyInverseVolumeScalingToCurrentDensity(amrex::MultiFab* Jx,
700  amrex::MultiFab* Jy,
701  amrex::MultiFab* Jz,
702  int lev);
703 
704  void ApplyInverseVolumeScalingToChargeDensity(amrex::MultiFab* Rho,
705  int lev);
706 #endif
707 
713  void ApplyRhofieldBoundary (int lev, amrex::MultiFab* Rho,
714  PatchType patch_type);
715 
721  void ApplyJfieldBoundary (int lev, amrex::MultiFab* Jx,
723  PatchType patch_type);
724 
725  void ApplyEfieldBoundary (int lev, PatchType patch_type);
726  void ApplyBfieldBoundary (int lev, PatchType patch_type, DtType dt_type);
727 
728 #ifdef WARPX_DIM_RZ
729  // Applies the boundary conditions that are specific to the axis when in RZ.
730  void ApplyFieldBoundaryOnAxis (amrex::MultiFab* Er, amrex::MultiFab* Et, amrex::MultiFab* Ez, int lev);
731 #endif
732 
741  void ApplyElectronPressureBoundary (int lev, PatchType patch_type);
742 
743  void DampPML ();
744  void DampPML (int lev);
745  void DampPML (int lev, PatchType patch_type);
746  void DampPML_Cartesian (int lev, PatchType patch_type);
747 
748  void DampJPML ();
749  void DampJPML (int lev);
750  void DampJPML (int lev, PatchType patch_type);
751 
752  void CopyJPML ();
753  bool isAnyBoundaryPML();
754 
755  PML* GetPML (int lev);
756 #if (defined WARPX_DIM_RZ) && (defined WARPX_USE_PSATD)
757  PML_RZ* GetPML_RZ (int lev);
758 #endif
759 
761  void doFieldIonization ();
765  void doFieldIonization (int lev);
766 
767 #ifdef WARPX_QED
769  void doQEDEvents ();
773  void doQEDEvents (int lev);
774 #endif
775 
776  void PushParticlesandDeposit (int lev, amrex::Real cur_time, DtType a_dt_type=DtType::Full, bool skip_current=false,
777  PushType push_type=PushType::Explicit);
778  void PushParticlesandDeposit (amrex::Real cur_time, bool skip_current=false,
779  PushType push_type=PushType::Explicit);
780 
781  // This function does aux(lev) = fp(lev) + I(aux(lev-1)-cp(lev)).
782  // Caller must make sure fp and cp have ghost cells filled.
783  void UpdateAuxilaryData ();
784  void UpdateAuxilaryDataStagToNodal ();
785  void UpdateAuxilaryDataSameType ();
786 
795  void UpdateCurrentNodalToStag (amrex::MultiFab& dst, amrex::MultiFab const& src);
796 
797  // Fill boundary cells including coarse/fine boundaries
798  void FillBoundaryB (amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
799  void FillBoundaryE (amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
800  void FillBoundaryB_avg (amrex::IntVect ng);
801  void FillBoundaryE_avg (amrex::IntVect ng);
802 
803  void FillBoundaryF (amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
804  void FillBoundaryG (amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
805  void FillBoundaryAux (amrex::IntVect ng);
806  void FillBoundaryE (int lev, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
807  void FillBoundaryB (int lev, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
808  void FillBoundaryE_avg (int lev, amrex::IntVect ng);
809  void FillBoundaryB_avg (int lev, amrex::IntVect ng);
810 
811  void FillBoundaryF (int lev, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
812  void FillBoundaryG (int lev, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
813  void FillBoundaryAux (int lev, amrex::IntVect ng);
814 
821  void SyncCurrentAndRho ();
822 
835  void SyncCurrent (
836  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
837  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp,
838  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_buffer);
839 
840  void SyncRho ();
841 
842  void SyncRho (
843  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
844  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp,
845  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_buffer);
846 
847  [[nodiscard]] amrex::Vector<int> getnsubsteps () const {return nsubsteps;}
848  [[nodiscard]] int getnsubsteps (int lev) const {return nsubsteps[lev];}
849  [[nodiscard]] amrex::Vector<int> getistep () const {return istep;}
850  [[nodiscard]] int getistep (int lev) const {return istep[lev];}
851  void setistep (int lev, int ii) {istep[lev] = ii;}
852  [[nodiscard]] amrex::Vector<amrex::Real> gett_old () const {return t_old;}
853  [[nodiscard]] amrex::Real gett_old (int lev) const {return t_old[lev];}
854  [[nodiscard]] amrex::Vector<amrex::Real> gett_new () const {return t_new;}
855  [[nodiscard]] amrex::Real gett_new (int lev) const {return t_new[lev];}
856  void sett_new (int lev, amrex::Real time) {t_new[lev] = time;}
857  [[nodiscard]] amrex::Vector<amrex::Real> getdt () const {return dt;}
858  [[nodiscard]] amrex::Real getdt (int lev) const {return dt.at(lev);}
859  [[nodiscard]] int getdo_moving_window() const {return do_moving_window;}
860  [[nodiscard]] amrex::Real getmoving_window_x() const {return moving_window_x;}
861  [[nodiscard]] bool getis_synchronized() const {return is_synchronized;}
862 
863  [[nodiscard]] int maxStep () const {return max_step;}
864  void updateMaxStep (const int new_max_step) {max_step = new_max_step;}
865  [[nodiscard]] amrex::Real stopTime () const {return stop_time;}
866  void updateStopTime (const amrex::Real new_stop_time) {stop_time = new_stop_time;}
867 
869  amrex::Vector<amrex::MultiFab>& mf_avg, amrex::IntVect ngrow) const;
870 
871  void prepareFields( int step, amrex::Vector<std::string>& varnames,
874  amrex::Vector<amrex::Geometry>& output_geom ) const;
875 
876  static std::array<amrex::Real,3> CellSize (int lev);
877  static amrex::RealBox getRealBox(const amrex::Box& bx, int lev);
878 
887  static std::array<amrex::Real,3> LowerCorner (const amrex::Box& bx, int lev, amrex::Real time_shift_delta);
896  static std::array<amrex::Real,3> UpperCorner (const amrex::Box& bx, int lev, amrex::Real time_shift_delta);
897 
898  static amrex::IntVect RefRatio (int lev);
899 
900  static const amrex::iMultiFab* CurrentBufferMasks (int lev);
901  static const amrex::iMultiFab* GatherBufferMasks (int lev);
902 
904 
905  // Parameters for lab frame electrostatic
906  static amrex::Real self_fields_required_precision;
907  static amrex::Real self_fields_absolute_tolerance;
910 
911  static int do_moving_window; // boolean
912  static int start_moving_window_step; // the first step to move window
913  static int end_moving_window_step; // the last step to move window
919  static int moving_window_active (int const step) {
920  bool const step_before_end = (step < end_moving_window_step) || (end_moving_window_step < 0);
921  bool const step_after_start = (step >= start_moving_window_step);
922  return do_moving_window && step_before_end && step_after_start;
923  }
924  static int moving_window_dir;
925  static amrex::Real moving_window_v;
927 
928  // these should be private, but can't due to Cuda limitations
929  static void ComputeDivB (amrex::MultiFab& divB, int dcomp,
930  const std::array<const amrex::MultiFab* const, 3>& B,
931  const std::array<amrex::Real,3>& dx);
932 
933  static void ComputeDivB (amrex::MultiFab& divB, int dcomp,
934  const std::array<const amrex::MultiFab* const, 3>& B,
935  const std::array<amrex::Real,3>& dx, amrex::IntVect ngrow);
936 
937  void ComputeDivE(amrex::MultiFab& divE, int lev);
938 
939  [[nodiscard]] amrex::IntVect getngEB() const { return guard_cells.ng_alloc_EB; }
940  [[nodiscard]] amrex::IntVect getngF() const { return guard_cells.ng_alloc_F; }
941  [[nodiscard]] amrex::IntVect getngUpdateAux() const { return guard_cells.ng_UpdateAux; }
942  [[nodiscard]] amrex::IntVect get_ng_depos_J() const {return guard_cells.ng_depos_J;}
943  [[nodiscard]] amrex::IntVect get_ng_depos_rho() const {return guard_cells.ng_depos_rho;}
944  [[nodiscard]] amrex::IntVect get_ng_fieldgather () const {return guard_cells.ng_FieldGather;}
945 
953  [[nodiscard]] amrex::IntVect get_numprocs() const {return numprocs;}
954 
956  void ComputeSpaceChargeField (bool reset_fields);
957  void AddBoundaryField ();
958  void AddSpaceChargeField (WarpXParticleContainer& pc);
959  void AddSpaceChargeFieldLabFrame ();
960  void computePhi (const amrex::Vector<std::unique_ptr<amrex::MultiFab> >& rho,
961  amrex::Vector<std::unique_ptr<amrex::MultiFab> >& phi,
962  std::array<amrex::Real, 3> beta = {{0,0,0}},
963  amrex::Real required_precision=amrex::Real(1.e-11),
964  amrex::Real absolute_tolerance=amrex::Real(0.0),
965  int max_iters=200,
966  int verbosity=2) const;
967 
968  void setPhiBC (amrex::Vector<std::unique_ptr<amrex::MultiFab> >& phi ) const;
969 
970  void computeE (amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>, 3> >& E,
971  const amrex::Vector<std::unique_ptr<amrex::MultiFab> >& phi,
972  std::array<amrex::Real, 3> beta = {{0,0,0}} ) const;
973  void computeB (amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>, 3> >& B,
974  const amrex::Vector<std::unique_ptr<amrex::MultiFab> >& phi,
975  std::array<amrex::Real, 3> beta = {{0,0,0}} ) const;
976  void computePhiTriDiagonal (const amrex::Vector<std::unique_ptr<amrex::MultiFab> >& rho,
977  amrex::Vector<std::unique_ptr<amrex::MultiFab> >& phi) const;
978 
979  // Magnetostatic Solver Interface
981  void ComputeMagnetostaticField ();
982  void AddMagnetostaticFieldLabFrame ();
983  void computeVectorPotential (const amrex::Vector<amrex::Array<std::unique_ptr<amrex::MultiFab>, 3> >& curr,
984  amrex::Vector<amrex::Array<std::unique_ptr<amrex::MultiFab>, 3> >& A,
985  amrex::Real required_precision=amrex::Real(1.e-11),
986  amrex::Real absolute_tolerance=amrex::Real(0.0),
987  int max_iters=200,
988  int verbosity=2) const;
989 
990  void setVectorPotentialBC (amrex::Vector<amrex::Array<std::unique_ptr<amrex::MultiFab>, 3> >& A) const;
991 
1015  amrex::ParserExecutor<3> const& xfield_parser,
1016  amrex::ParserExecutor<3> const& yfield_parser,
1017  amrex::ParserExecutor<3> const& zfield_parser,
1018  std::array< std::unique_ptr<amrex::MultiFab>, 3 > const& edge_lengths,
1019  std::array< std::unique_ptr<amrex::MultiFab>, 3 > const& face_areas,
1020  char field,
1021  int lev, PatchType patch_type);
1022 
1028 
1034  std::string read_fields_from_path, amrex::MultiFab* mf,
1035  std::string F_name, std::string F_component);
1036 
1045  void InitializeEBGridData(int lev);
1046 
1052  void ComputeCostsHeuristic (amrex::Vector<std::unique_ptr<amrex::LayoutData<amrex::Real> > >& costs);
1053 
1054  void ApplyFilterandSumBoundaryRho (int lev, int glev, amrex::MultiFab& rho, int icomp, int ncomp);
1055 
1064  static amrex::Vector<amrex::Real> getFornbergStencilCoefficients(int n_order, short a_grid_type);
1065 
1066  // Device vectors of stencil coefficients used for finite-order centering of fields
1070 
1071  // Device vectors of stencil coefficients used for finite-order centering of currents
1075 
1076  // This needs to be public for CUDA.
1078  void ErrorEst (int lev, amrex::TagBoxArray& tags, amrex::Real time, int /*ngrow*/) final;
1079 
1080  // Return the accelerator lattice instance defined at the given refinement level
1081  const AcceleratorLattice& get_accelerator_lattice (int lev) {return *(m_accelerator_lattice[lev]);}
1082 
1083  // for cuda
1084  void BuildBufferMasksInBox ( amrex::Box tbx, amrex::IArrayBox &buffer_mask,
1085  const amrex::IArrayBox &guard_mask, int ng );
1086 #ifdef AMREX_USE_EB
1087  amrex::EBFArrayBoxFactory const& fieldEBFactory (int lev) const noexcept {
1088  return static_cast<amrex::EBFArrayBoxFactory const&>(*m_field_factory[lev]);
1089  }
1090 #endif
1091 
1092  void InitEB ();
1093 
1094 #ifdef AMREX_USE_EB
1099  static void ComputeEdgeLengths (std::array< std::unique_ptr<amrex::MultiFab>, 3 >& edge_lengths,
1100  const amrex::EBFArrayBoxFactory& eb_fact);
1105  static void ComputeFaceAreas (std::array< std::unique_ptr<amrex::MultiFab>, 3 >& face_areas,
1106  const amrex::EBFArrayBoxFactory& eb_fact);
1107 
1111  static void ScaleEdges (std::array< std::unique_ptr<amrex::MultiFab>, 3 >& edge_lengths,
1112  const std::array<amrex::Real,3>& cell_size);
1116  static void ScaleAreas (std::array< std::unique_ptr<amrex::MultiFab>, 3 >& face_areas,
1117  const std::array<amrex::Real,3>& cell_size);
1126  void MarkCells();
1127 #endif
1128 
1132  void ComputeDistanceToEB ();
1136  amrex::Array1D<int, 0, 2> CountExtFaces();
1141  void ComputeFaceExtensions();
1145  void InitBorrowing();
1149  void ShrinkBorrowing();
1153  void ComputeOneWayExtensions();
1157  void ComputeEightWaysExtensions();
1166  void ApplyBCKCorrection(int idim);
1167 
1172  void PSATDSubtractCurrentPartialSumsAvg ();
1173 
1174 #ifdef WARPX_USE_PSATD
1175 
1176 # ifdef WARPX_DIM_RZ
1178 # else
1180 # endif
1181  get_spectral_solver_fp (int lev) {return *spectral_solver_fp[lev];}
1182 #endif
1183 
1184  FiniteDifferenceSolver * get_pointer_fdtd_solver_fp (int lev) { return m_fdtd_solver_fp[lev].get(); }
1185 
1186 protected:
1187 
1213  void InitLevelData (int lev, amrex::Real time);
1214 
1217  void PostProcessBaseGrids (amrex::BoxArray& ba0) const final;
1218 
1222  void MakeNewLevelFromScratch (int lev, amrex::Real time, const amrex::BoxArray& new_grids,
1223  const amrex::DistributionMapping& new_dmap) final;
1224 
1228  void MakeNewLevelFromCoarse (int /*lev*/, amrex::Real /*time*/, const amrex::BoxArray& /*ba*/,
1229  const amrex::DistributionMapping& /*dm*/) final;
1230 
1234  void RemakeLevel (int lev, amrex::Real time, const amrex::BoxArray& ba,
1235  const amrex::DistributionMapping& dm) final;
1236 
1238  void ClearLevel (int lev) final;
1239 
1240 private:
1241 
1248  WarpX ();
1249 
1254  static void MakeWarpX ();
1255 
1256  // Singleton is used when the code is run from python
1258 
1260  void HandleSignals ();
1261 
1262  void FillBoundaryB (int lev, PatchType patch_type, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
1263  void FillBoundaryE (int lev, PatchType patch_type, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
1264  void FillBoundaryF (int lev, PatchType patch_type, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
1265  void FillBoundaryG (int lev, PatchType patch_type, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
1266 
1267  void FillBoundaryB_avg (int lev, PatchType patch_type, amrex::IntVect ng);
1268  void FillBoundaryE_avg (int lev, PatchType patch_type, amrex::IntVect ng);
1269 
1271 
1272  void OneStep_nosub (amrex::Real cur_time);
1273  void OneStep_sub1 (amrex::Real cur_time);
1274 
1275  void OneStep_ImplicitPicard(amrex::Real cur_time);
1276 
1280  void OneStep_multiJ (amrex::Real cur_time);
1281 
1282  void RestrictCurrentFromFineToCoarsePatch (
1283  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
1284  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp,
1285  int lev);
1286  void AddCurrentFromFineLevelandSumBoundary (
1287  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
1288  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp,
1289  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_buffer,
1290  int lev);
1291  void StoreCurrent (int lev);
1292  void RestoreCurrent (int lev);
1293  void ApplyFilterJ (
1294  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& current,
1295  int lev,
1296  int idim);
1297  void ApplyFilterJ (
1298  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& current,
1299  int lev);
1300  void SumBoundaryJ (
1301  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& current,
1302  int lev,
1303  int idim,
1304  const amrex::Periodicity& period);
1305  void SumBoundaryJ (
1306  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& current,
1307  int lev,
1308  const amrex::Periodicity& period);
1309  void NodalSyncJ (
1310  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
1311  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp,
1312  int lev,
1313  PatchType patch_type);
1314 
1315  void RestrictRhoFromFineToCoarsePatch (
1316  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
1317  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp,
1318  int lev);
1319  void ApplyFilterandSumBoundaryRho (
1320  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
1321  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp,
1322  int lev,
1323  PatchType patch_type,
1324  int icomp,
1325  int ncomp);
1326  void AddRhoFromFineLevelandSumBoundary (
1327  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
1328  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp,
1329  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_buffer,
1330  int lev,
1331  int icomp,
1332  int ncomp);
1333  void NodalSyncRho (
1334  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
1335  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp,
1336  int lev,
1337  PatchType patch_type,
1338  int icomp,
1339  int ncomp);
1340 
1341  void ReadParameters ();
1342 
1345  void BackwardCompatibility ();
1346 
1348 
1349  void AllocLevelData (int lev, const amrex::BoxArray& ba,
1350  const amrex::DistributionMapping& dm);
1351 
1352  [[nodiscard]] amrex::DistributionMapping
1353  GetRestartDMap (const std::string& chkfile, const amrex::BoxArray& ba, int lev) const;
1354 
1355  void InitFromCheckpoint ();
1356  void PostRestart ();
1357 
1358  void InitPML ();
1360 
1361  void InitFilter ();
1362 
1364 
1366 
1372 
1377 
1380 
1381  void BuildBufferMasks ();
1382 
1383  [[nodiscard]] const amrex::iMultiFab* getCurrentBufferMasks (int lev) const {
1384  return current_buffer_masks[lev].get();
1385  }
1386 
1387  [[nodiscard]] const amrex::iMultiFab* getGatherBufferMasks (int lev) const
1388  {
1389  return gather_buffer_masks[lev].get();
1390  }
1391 
1401  void ReorderFornbergCoefficients (amrex::Vector<amrex::Real>& ordered_coeffs,
1402  amrex::Vector<amrex::Real>& unordered_coeffs,
1403  int order);
1416  void AllocateCenteringCoefficients (amrex::Gpu::DeviceVector<amrex::Real>& device_centering_stencil_coeffs_x,
1417  amrex::Gpu::DeviceVector<amrex::Real>& device_centering_stencil_coeffs_y,
1418  amrex::Gpu::DeviceVector<amrex::Real>& device_centering_stencil_coeffs_z,
1419  int centering_nox,
1420  int centering_noy,
1421  int centering_noz,
1422  short a_grid_type);
1423 
1424  void AllocLevelMFs (int lev, const amrex::BoxArray& ba, const amrex::DistributionMapping& dm,
1425  const amrex::IntVect& ngEB, amrex::IntVect& ngJ,
1426  const amrex::IntVect& ngRho, const amrex::IntVect& ngF,
1427  const amrex::IntVect& ngG, bool aux_is_nodal);
1428 
1429 #ifdef WARPX_USE_PSATD
1430 # ifdef WARPX_DIM_RZ
1431  void AllocLevelSpectralSolverRZ (amrex::Vector<std::unique_ptr<SpectralSolverRZ>>& spectral_solver,
1432  int lev,
1433  const amrex::BoxArray& realspace_ba,
1434  const amrex::DistributionMapping& dm,
1435  const std::array<amrex::Real,3>& dx);
1436 # else
1437  void AllocLevelSpectralSolver (amrex::Vector<std::unique_ptr<SpectralSolver>>& spectral_solver,
1438  int lev,
1439  const amrex::BoxArray& realspace_ba,
1440  const amrex::DistributionMapping& dm,
1441  const std::array<amrex::Real,3>& dx,
1442  bool pml_flag=false);
1443 # endif
1444 #endif
1445 
1447  std::string m_authors;
1448 
1449  amrex::Vector<int> istep; // which step?
1450  amrex::Vector<int> nsubsteps; // how many substeps on each level?
1451 
1455 
1456  // Particle container
1457  std::unique_ptr<MultiParticleContainer> mypc;
1458  std::unique_ptr<MultiDiagnostics> multi_diags;
1459 
1460  // Fluid container
1461  bool do_fluid_species = false;
1462  std::unique_ptr<MultiFluidContainer> myfl;
1463 
1464  //
1465  // Fields: First array for level, second for direction
1466  //
1467 
1468  // Full solution
1471 
1472  // Fine patch
1483 
1484  // Implicit, fields at start of step and from the previous iteration
1489 
1490  // Memory buffers for computing magnetostatic fields
1491  // Vector Potential A and previous step. Time buffer needed for computing dA/dt to first order
1495 
1496  // Same as Bfield_fp/Efield_fp for reading external field data
1499 
1504 
1527 
1540 
1541  //EB level set
1543 
1544  // store fine patch
1546 
1547  // Nodal MultiFab for nodal current deposition if warpx.do_current_centering = 1
1549 
1550  // Coarse patch
1559 
1560  // Copy of the coarse aux
1565 
1566  // If charge/current deposition buffers are used
1569 
1570  // PML
1571  int do_pml = 0;
1572  int do_silver_mueller = 0;
1573  int pml_ncell = 10;
1574  int pml_delta = 10;
1575  int pml_has_particles = 0;
1576  int do_pml_j_damping = 0;
1577  int do_pml_in_domain = 0;
1578  static int do_similar_dm_pml;
1579  bool do_pml_dive_cleaning; // default set in WarpX.cpp
1580  bool do_pml_divb_cleaning; // default set in WarpX.cpp
1584 #if (defined WARPX_DIM_RZ) && (defined WARPX_USE_PSATD)
1586 #endif
1587  amrex::Real v_particle_pml;
1588 
1589  // External fields parameters
1590  std::unique_ptr<ExternalFieldParams> m_p_ext_field_params;
1591 
1592  amrex::Real moving_window_x = std::numeric_limits<amrex::Real>::max();
1593 
1594  // Plasma injection parameters
1595  int warpx_do_continuous_injection = 0;
1596  int num_injected_species = -1;
1598 
1599  std::optional<amrex::Real> m_const_dt;
1600 
1601  // Macroscopic properties
1602  std::unique_ptr<MacroscopicProperties> m_macroscopic_properties;
1603 
1604  // Hybrid PIC algorithm parameters
1605  std::unique_ptr<HybridPICModel> m_hybrid_pic_model;
1606 
1607  // Load balancing
1615  int load_balance_with_sfc = 0;
1620  amrex::Real load_balance_knapsack_factor = amrex::Real(1.24);
1626  amrex::Real load_balance_efficiency_ratio_threshold = amrex::Real(1.1);
1634  amrex::Real costs_heuristic_cells_wt = amrex::Real(0);
1640  amrex::Real costs_heuristic_particles_wt = amrex::Real(0);
1641 
1642  // Determines timesteps for override sync
1644 
1645  // Other runtime parameters
1646  int verbose = 1;
1647 
1648  bool use_hybrid_QED = false;
1649 
1650  int max_step = std::numeric_limits<int>::max();
1651  amrex::Real stop_time = std::numeric_limits<amrex::Real>::max();
1652 
1653  int regrid_int = -1;
1654 
1655  amrex::Real cfl = amrex::Real(0.999);
1656 
1657  std::string restart_chkfile;
1658 
1660  bool write_diagnostics_on_restart = false;
1661 
1664 
1665  bool use_single_read = true;
1666  bool use_single_write = true;
1667  int mffile_nstreams = 4;
1668  int field_io_nfiles = 1024;
1669  int particle_io_nfiles = 1024;
1670 
1674  std::unique_ptr<amrex::Parser> ref_patch_parser;
1675 
1676  bool is_synchronized = true;
1677 
1678  // Synchronization of nodal points
1679  static constexpr bool sync_nodal_points = true;
1680 
1682 
1683  //Slice Parameters
1685  int slice_plot_int = -1;
1694 
1695  bool fft_periodic_single_box = false;
1696  int nox_fft = 16;
1697  int noy_fft = 16;
1698  int noz_fft = 16;
1699 
1701  amrex::IntVect numprocs{0};
1702 
1704  std::unique_ptr<ParticleBoundaryBuffer> m_particle_boundary_buffer;
1705 
1706  // Accelerator lattice elements
1708 
1709  //
1710  // Embedded Boundary
1711  //
1712 
1713  // Factory for field data
1715 
1716  [[nodiscard]]
1717  amrex::FabFactory<amrex::FArrayBox> const& fieldFactory (int lev) const noexcept
1718  {
1719  return *m_field_factory[lev];
1720  }
1721 
1723 
1724  void PushPSATD ();
1725 
1726 #ifdef WARPX_USE_PSATD
1727 
1740  void PSATDForwardTransformEB (
1741  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& E_fp,
1742  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& B_fp,
1743  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& E_cp,
1744  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& B_cp);
1745 
1759  void PSATDBackwardTransformEB (
1760  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& E_fp,
1761  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& B_fp,
1762  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& E_cp,
1763  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& B_cp);
1764 
1777  void PSATDBackwardTransformEBavg (
1778  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& E_avg_fp,
1779  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& B_avg_fp,
1780  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& E_avg_cp,
1781  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& B_avg_cp);
1782 
1794  void PSATDForwardTransformJ (
1795  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
1796  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp,
1797  bool apply_kspace_filter=true);
1798 
1807  void PSATDBackwardTransformJ (
1808  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
1809  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp);
1810 
1822  void PSATDForwardTransformRho (
1823  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
1824  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp,
1825  int icomp, int dcomp, bool apply_kspace_filter=true);
1826 
1830  void PSATDMoveRhoNewToRhoOld ();
1831 
1835  void PSATDMoveJNewToJOld ();
1836 
1840  void PSATDForwardTransformF ();
1841 
1845  void PSATDBackwardTransformF ();
1846 
1850  void PSATDForwardTransformG ();
1851 
1855  void PSATDBackwardTransformG ();
1856 
1860  void PSATDCurrentCorrection ();
1861 
1865  void PSATDVayDeposition ();
1866 
1870  void PSATDPushSpectralFields ();
1871 
1877  void PSATDScaleAverageFields (amrex::Real scale_factor);
1878 
1882  void PSATDEraseAverageFields ();
1883 
1884 # ifdef WARPX_DIM_RZ
1887 # else
1890 # endif
1891 
1892 #endif
1893 
1896 };
1897 
1898 #endif
PatchType
Definition: WarpX.H:80
DtType
Definition: WarpXDtType.H:11
PushType
Definition: WarpXPushType.H:12
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:66
Definition: PML_RZ.H:31
Definition: PML.H:137
void PushPSATD(int lev)
Definition: PML.cpp:1349
void FillBoundaryG(PatchType patch_type, std::optional< bool > nodal_sync=std::nullopt)
Definition: PML.cpp:1285
void FillBoundaryB(PatchType patch_type, std::optional< bool > nodal_sync=std::nullopt)
Definition: PML.cpp:1253
void FillBoundaryE(PatchType patch_type, std::optional< bool > nodal_sync=std::nullopt)
Definition: PML.cpp:1236
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:1270
Definition: ParticleBoundaryBuffer.H:22
Top-level class for the electromagnetic spectral solver.
Definition: SpectralSolver.H:33
Definition: SpectralSolverRZ.H:22
Definition: WarpX.H:87
std::unique_ptr< ParticleBoundaryBuffer > m_particle_boundary_buffer
particle buffer for scraped particles on the boundaries
Definition: WarpX.H:1704
static int self_fields_max_iters
Definition: WarpX.H:908
const amrex::MultiFab & getrho_fp(int lev)
Definition: WarpX.H:517
static int field_centering_nox
Order of finite centering of fields (from staggered grid to nodal grid), along x.
Definition: WarpX.H:264
amrex::Vector< std::unique_ptr< amrex::LayoutData< amrex::Real > > > costs
Definition: WarpX.H:1613
static short current_deposition_algo
Integer that corresponds to the current deposition algorithm (Esirkepov, direct, Vay)
Definition: WarpX.H:158
int maxlevel_extEMfield_init
Definition: WarpX.H:154
amrex::Vector< std::unique_ptr< amrex::MultiFab > > G_fp
Definition: WarpX.H:1474
amrex::Gpu::DeviceVector< amrex::Real > device_field_centering_stencil_coeffs_y
Definition: WarpX.H:1068
static int moving_window_dir
Definition: WarpX.H:924
amrex::Gpu::DeviceVector< amrex::Real > device_current_centering_stencil_coeffs_x
Definition: WarpX.H:1072
void InitFilter()
static bool do_dive_cleaning
Definition: WarpX.H:252
static amrex::Real zmax_plasma_to_compute_max_step
Definition: WarpX.H:322
bool DoFluidSpecies() const
Definition: WarpX.H:531
amrex::MultiFab * get_pointer_edge_lengths(int lev, int direction) const
Definition: WarpX.H:501
amrex::MultiFab * get_pointer_Efield_fp(int lev, int direction) const
Definition: WarpX.H:484
const amrex::MultiFab & getEfield_fp(int lev, int direction)
Definition: WarpX.H:515
amrex::Vector< int > getnsubsteps() const
Definition: WarpX.H:847
static bool do_multi_J
Definition: WarpX.H:346
std::unique_ptr< MacroscopicProperties > m_macroscopic_properties
Definition: WarpX.H:1602
MultiDiagnostics & GetMultiDiags()
Definition: WarpX.H:134
bool DoPML() const
Definition: WarpX.H:530
const amrex::MultiFab & getcurrent_cp(int lev, int direction)
Definition: WarpX.H:507
static short rho_in_time
Definition: WarpX.H:214
amrex::Vector< std::unique_ptr< amrex::FabFactory< amrex::FArrayBox > > > m_field_factory
Definition: WarpX.H:1714
bool getis_synchronized() const
Definition: WarpX.H:861
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_cp
Definition: WarpX.H:1554
amrex::Vector< std::unique_ptr< amrex::MultiFab > > m_distance_to_eb
Definition: WarpX.H:1542
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_slice
Definition: WarpX.H:1692
MultiFluidContainer & GetFluidContainer()
Definition: WarpX.H:131
static short psatd_solution_type
Definition: WarpX.H:209
amrex::Vector< std::unique_ptr< amrex::iMultiFab > > gather_buffer_masks
Definition: WarpX.H:1564
void updateStopTime(const amrex::Real new_stop_time)
Definition: WarpX.H:866
std::array< const amrex::MultiFab *const, 3 > get_array_Efield_aux(const int lev) const
Definition: WarpX.H:473
amrex::Vector< int > mirror_z_npoints
Definition: WarpX.H:560
static amrex::Real zmin_domain_boost_step_0
Definition: WarpX.H:329
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_slice
Definition: WarpX.H:1691
static bool do_compute_max_step_from_zmax
Definition: WarpX.H:326
static short evolve_scheme
Integer that corresponds to the evolve scheme (explicit, implicit_picard, semi_implicit_picard)
Definition: WarpX.H:168
static amrex::Vector< int > field_boundary_lo
Definition: WarpX.H:189
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:341
SpectralSolverRZ & get_spectral_solver_fp(int lev)
Definition: WarpX.H:1181
static int n_field_gather_buffer
Definition: WarpX.H:355
static int do_multi_J_n_depositions
Definition: WarpX.H:347
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:1548
amrex::Vector< amrex::Real > t_new
Definition: WarpX.H:1452
static bool do_single_precision_comms
perform field communications in single precision
Definition: WarpX.H:230
amrex::IntVect slice_cr_ratio
Definition: WarpX.H:1687
static amrex::Vector< ParticleBoundaryType > particle_boundary_lo
Definition: WarpX.H:199
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_store
Definition: WarpX.H:1545
void CheckKnownIssues()
Checks for known numerical issues involving different WarpX modules.
guardCellManager guard_cells
Definition: WarpX.H:1681
static bool do_shared_mem_charge_deposition
used shared memory algorithm for charge deposition
Definition: WarpX.H:233
static int em_solver_medium
Integer that corresponds to electromagnetic Maxwell solver (vacuum - 0, macroscopic - 1)
Definition: WarpX.H:180
MultiParticleContainer & GetPartContainer()
Definition: WarpX.H:130
static amrex::Vector< int > boost_direction
Direction of the Lorentz transform that defines the boosted frame of the simulation.
Definition: WarpX.H:318
static bool use_fdtd_nci_corr
Definition: WarpX.H:287
static bool verboncoeur_axis_correction
Definition: WarpX.H:301
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:925
static bool do_shared_mem_current_deposition
use shared memory algorithm for current deposition
Definition: WarpX.H:236
amrex::Vector< amrex::IntVect > do_pml_Hi
Definition: WarpX.H:1582
std::string GetAuthors() const
If an authors' string is specified in the inputfile, this method returns that string....
Definition: WarpX.H:148
void setistep(int lev, int ii)
Definition: WarpX.H:851
amrex::MultiFab * get_pointer_vector_potential_fp(int lev, int direction) const
Definition: WarpX.H:492
static bool fft_do_time_averaging
Definition: WarpX.H:926
static short particle_pusher_algo
Integer that corresponds to the particle push algorithm (Boris, Vay, Higuera-Cary)
Definition: WarpX.H:164
amrex::Vector< std::unique_ptr< PML > > pml
Definition: WarpX.H:1583
amrex::RealVect fine_tag_lo
Definition: WarpX.H:1671
std::string restart_chkfile
Definition: WarpX.H:1657
static WarpX * m_instance
Definition: WarpX.H:1257
const amrex::MultiFab & getG_fp(int lev)
Definition: WarpX.H:520
amrex::Vector< std::unique_ptr< amrex::MultiFab > > rho_cp
Definition: WarpX.H:1553
amrex::MultiFab * get_pointer_G_fp(int lev) const
Definition: WarpX.H:490
static bool do_dynamic_scheduling
Definition: WarpX.H:334
void PostRestart()
const amrex::MultiFab & getBfield_cp(int lev, int direction)
Definition: WarpX.H:509
std::unique_ptr< amrex::Parser > ref_patch_parser
User-defined parser to define refinement patches.
Definition: WarpX.H:1674
amrex::Gpu::DeviceVector< amrex::Real > device_field_centering_stencil_coeffs_z
Definition: WarpX.H:1069
amrex::MultiFab * get_pointer_phi_fp(int lev) const
Definition: WarpX.H:491
static int self_fields_verbosity
Definition: WarpX.H:909
amrex::Real stopTime() const
Definition: WarpX.H:865
amrex::Vector< std::unique_ptr< PML_RZ > > pml_rz
Definition: WarpX.H:1585
const amrex::MultiFab & getphi_fp(int lev)
Definition: WarpX.H:518
void InitData()
static std::map< std::string, amrex::MultiFab * > multifab_map
Definition: WarpX.H:460
std::unique_ptr< MultiFluidContainer > myfl
Definition: WarpX.H:1462
amrex::Gpu::DeviceVector< amrex::Real > device_field_centering_stencil_coeffs_x
Definition: WarpX.H:1067
amrex::MultiFab * get_pointer_current_fp(int lev, int direction) const
Definition: WarpX.H:486
std::unique_ptr< HybridPICModel > m_hybrid_pic_model
Definition: WarpX.H:1605
void AddExternalFields()
amrex::MultiFab * get_pointer_current_cp(int lev, int direction) const
Definition: WarpX.H:496
amrex::Vector< amrex::Real > getdt() const
Definition: WarpX.H:857
static int noz
Order of the particle shape factors (splines) along z.
Definition: WarpX.H:261
amrex::Gpu::DeviceVector< amrex::Real > device_current_centering_stencil_coeffs_z
Definition: WarpX.H:1074
amrex::Vector< amrex::Real > gett_new() const
Definition: WarpX.H:854
const amrex::MultiFab & getBfield_avg_cp(int lev, int direction)
Definition: WarpX.H:525
static int num_mirrors
Definition: WarpX.H:557
amrex::MultiFab * get_pointer_face_areas(int lev, int direction) const
Definition: WarpX.H:502
amrex::Vector< std::unique_ptr< amrex::MultiFab > > phi_fp
Definition: WarpX.H:1476
ParticleBoundaryBuffer & GetParticleBoundaryBuffer()
Definition: WarpX.H:136
void WriteUsedInputsFile() const
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_n
Definition: WarpX.H:1486
bool do_pml_divb_cleaning
Definition: WarpX.H:1580
amrex::Vector< int > getistep() const
Definition: WarpX.H:849
static int current_centering_noy
Order of finite centering of currents (from nodal grid to staggered grid), along y.
Definition: WarpX.H:273
amrex::Gpu::DeviceVector< amrex::Real > device_current_centering_stencil_coeffs_y
Definition: WarpX.H:1073
amrex::MultiFab * get_pointer_Efield_aux(int lev, int direction) const
Definition: WarpX.H:481
void InitDiagnostics()
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_avg_cp
Definition: WarpX.H:1557
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:510
amrex::Vector< amrex::Real > load_balance_efficiency
Definition: WarpX.H:1628
static amrex::Real self_fields_required_precision
Definition: WarpX.H:906
static amrex::IntVect sort_bin_size
Definition: WarpX.H:338
WarpX(WarpX &&)=default
amrex::IntVect m_rho_nodal_flag
Definition: WarpX.H:366
static std::map< std::string, amrex::iMultiFab * > imultifab_map
Definition: WarpX.H:461
utils::parser::IntervalsParser load_balance_intervals
Definition: WarpX.H:1610
amrex::Vector< std::array< std::unique_ptr< amrex::iMultiFab >, 3 > > m_flag_ext_face
Definition: WarpX.H:1518
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_fp
Definition: WarpX.H:1477
amrex::IntVect getngEB() const
Definition: WarpX.H:939
utils::parser::IntervalsParser override_sync_intervals
Definition: WarpX.H:1643
utils::parser::IntervalsParser get_load_balance_intervals() const
returns the load balance interval
Definition: WarpX.H:673
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > m_face_areas
EB: Areas of the mesh faces.
Definition: WarpX.H:1503
amrex::Real gett_old(int lev) const
Definition: WarpX.H:853
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_cax
Definition: WarpX.H:1562
amrex::MultiFab * get_pointer_F_cp(int lev) const
Definition: WarpX.H:498
const amrex::MultiFab & getF_fp(int lev)
Definition: WarpX.H:519
static int do_moving_window
Definition: WarpX.H:911
amrex::MultiFab * get_pointer_Efield_cp(int lev, int direction) const
Definition: WarpX.H:494
void ReadExternalFieldFromFile(std::string read_fields_from_path, amrex::MultiFab *mf, std::string F_name, std::string F_component)
Load field values from a user-specified openPMD file for a specific field (specified by F_name)
int maxStep() const
Definition: WarpX.H:863
static int nox
Order of the particle shape factors (splines) along x.
Definition: WarpX.H:257
int getnsubsteps(int lev) const
Definition: WarpX.H:848
WarpX(WarpX const &)=delete
static amrex::Real quantum_xi_c2
Definition: WarpX.H:662
void InitFromScratch()
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_slice
Definition: WarpX.H:1693
amrex::Vector< std::array< std::unique_ptr< amrex::iMultiFab >, 3 > > m_flag_info_face
Definition: WarpX.H:1511
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_fp_vay
Definition: WarpX.H:1478
void updateMaxStep(const int new_max_step)
Definition: WarpX.H:864
HybridPICModel & GetHybridPICModel()
Definition: WarpX.H:133
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_cp
Definition: WarpX.H:1556
static bool serialize_initial_conditions
If true, the initial conditions from random number generators are serialized (useful for reproducible...
Definition: WarpX.H:311
const amrex::iMultiFab * getGatherBufferMasks(int lev) const
Definition: WarpX.H:1387
amrex::Vector< std::unique_ptr< SpectralSolverRZ > > spectral_solver_fp
Definition: WarpX.H:1885
static amrex::IntVect m_fill_guards_fields
Whether to fill guard cells when computing inverse FFTs of fields.
Definition: WarpX.H:245
static short grid_type
Definition: WarpX.H:363
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > vector_potential_grad_buf_b_stag
Definition: WarpX.H:1494
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_aux
Definition: WarpX.H:1469
const amrex::MultiFab & getEfield_cp(int lev, int direction)
Definition: WarpX.H:508
static int current_centering_nox
Order of finite centering of currents (from nodal grid to staggered grid), along x.
Definition: WarpX.H:271
amrex::MultiFab * get_pointer_Bfield_aux(int lev, int direction) const
Definition: WarpX.H:482
static bool use_filter_compensation
If true, a compensation step is added to the bilinear filtering of charge and currents.
Definition: WarpX.H:308
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > vector_potential_grad_buf_e_stag
Definition: WarpX.H:1493
amrex::Vector< std::array< std::unique_ptr< amrex::LayoutData< FaceInfoBox > >, 3 > > m_borrowing
Definition: WarpX.H:1526
static short charge_deposition_algo
Integer that corresponds to the charge deposition algorithm (only standard deposition)
Definition: WarpX.H:160
amrex::Real gett_new(int lev) const
Definition: WarpX.H:855
amrex::Vector< amrex::Real > dt
Definition: WarpX.H:1454
amrex::Vector< std::unique_ptr< amrex::MultiFab > > rho_slice
Definition: WarpX.H:1690
amrex::Vector< std::unique_ptr< amrex::MultiFab > > F_cp
Definition: WarpX.H:1551
amrex::RealVect fine_tag_hi
Definition: WarpX.H:1672
amrex::IntVect get_ng_fieldgather() const
Definition: WarpX.H:944
amrex::IntVect get_ng_depos_rho() const
Definition: WarpX.H:943
const amrex::MultiFab & getfaceareas(int lev, int direction)
Definition: WarpX.H:528
static int start_moving_window_step
Definition: WarpX.H:912
amrex::Vector< int > istep
Definition: WarpX.H:1449
static int electrostatic_solver_id
Definition: WarpX.H:903
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:1081
amrex::Vector< std::unique_ptr< amrex::MultiFab > > G_slice
Definition: WarpX.H:1689
static int n_current_deposition_buffer
Definition: WarpX.H:359
amrex::Vector< std::unique_ptr< amrex::MultiFab > > F_fp
Definition: WarpX.H:1473
static amrex::Vector< int > field_boundary_hi
Definition: WarpX.H:194
int Verbose() const
Definition: WarpX.H:118
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_cax
Definition: WarpX.H:1561
amrex::Vector< std::unique_ptr< amrex::MultiFab > > charge_buf
Definition: WarpX.H:1568
std::array< const amrex::MultiFab *const, 3 > get_array_Bfield_aux(const int lev) const
Definition: WarpX.H:464
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > m_edge_lengths
EB: Lengths of the mesh edges.
Definition: WarpX.H:1501
const amrex::iMultiFab * getCurrentBufferMasks(int lev) const
Definition: WarpX.H:1383
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_avg_fp
Definition: WarpX.H:1481
amrex::Vector< int > injected_plasma_species
Definition: WarpX.H:1597
static bool do_device_synchronize
Definition: WarpX.H:349
static int max_picard_iterations
The maximum number of Picard iterations to do each time step.
Definition: WarpX.H:170
static bool use_kspace_filter
If true, the bilinear filtering of charge and currents is done in Fourier space.
Definition: WarpX.H:306
amrex::MultiFab * get_pointer_F_fp(int lev) const
Definition: WarpX.H:489
void InitNCICorrector()
int getistep(int lev) const
Definition: WarpX.H:850
std::unique_ptr< MultiDiagnostics > multi_diags
Definition: WarpX.H:1458
static int noy
Order of the particle shape factors (splines) along y.
Definition: WarpX.H:259
amrex::Vector< int > nsubsteps
Definition: WarpX.H:1450
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:268
void sett_new(int lev, amrex::Real time)
Definition: WarpX.H:856
static amrex::Real picard_iteration_tolerance
The tolerance for the Picard iteration convergence.
Definition: WarpX.H:172
amrex::IntVect getngF() const
Definition: WarpX.H:940
static amrex::Real beta_boost
Beta value corresponding to the Lorentz factor of the boosted frame of the simulation.
Definition: WarpX.H:316
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_fp_external
Definition: WarpX.H:1497
amrex::MultiFab * get_pointer_G_cp(int lev) const
Definition: WarpX.H:499
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:254
std::unique_ptr< MultiParticleContainer > mypc
Definition: WarpX.H:1457
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_buf
Definition: WarpX.H:1567
static bool use_filter
If true, a bilinear filter is used to smooth charge and currents.
Definition: WarpX.H:304
amrex::MultiFab * get_pointer_rho_fp(int lev) const
Definition: WarpX.H:488
static amrex::IntVect m_fill_guards_current
Whether to fill guard cells when computing inverse FFTs of currents.
Definition: WarpX.H:248
void LoadExternalFieldsFromFile(int lev)
Load field values from a user-specified openPMD file, for the fields Ex, Ey, Ez, Bx,...
MacroscopicProperties & GetMacroscopicProperties()
Definition: WarpX.H:132
MagnetostaticSolver::VectorPoissonBoundaryHandler m_vector_poisson_boundary_handler
Definition: WarpX.H:980
const amrex::MultiFab & getG_cp(int lev)
Definition: WarpX.H:512
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > vector_potential_fp_nodal
Definition: WarpX.H:1492
ElectrostaticSolver::PoissonBoundaryHandler m_poisson_boundary_handler
Definition: WarpX.H:955
static amrex::IntVect shared_tilesize
tileSize to use for shared current deposition operations
Definition: WarpX.H:242
static int do_similar_dm_pml
Definition: WarpX.H:1578
amrex::Vector< std::unique_ptr< FiniteDifferenceSolver > > m_fdtd_solver_fp
Definition: WarpX.H:1894
amrex::Vector< amrex::Real > gett_old() const
Definition: WarpX.H:852
static int current_centering_noz
Order of finite centering of currents (from nodal grid to staggered grid), along z.
Definition: WarpX.H:275
static bool safe_guard_cells
Definition: WarpX.H:350
amrex::IntVect getngUpdateAux() const
Definition: WarpX.H:941
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_cp
Definition: WarpX.H:1555
amrex::Vector< std::unique_ptr< amrex::MultiFab > > rho_fp
Definition: WarpX.H:1475
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_n
Definition: WarpX.H:1485
amrex::MultiFab * get_pointer_rho_cp(int lev) const
Definition: WarpX.H:497
const amrex::MultiFab & getedgelengths(int lev, int direction)
Definition: WarpX.H:527
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_fp
Definition: WarpX.H:1480
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_save
Definition: WarpX.H:1487
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > ECTRhofield
Definition: WarpX.H:1535
amrex::Vector< amrex::Real > t_old
Definition: WarpX.H:1453
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:343
static bool refine_plasma
Definition: WarpX.H:335
amrex::FabFactory< amrex::FArrayBox > const & fieldFactory(int lev) const noexcept
Definition: WarpX.H:1717
static int macroscopic_solver_algo
Definition: WarpX.H:184
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_aux
Definition: WarpX.H:1470
static int ncomps
Definition: WarpX.H:283
static int moving_window_active(int const step)
Definition: WarpX.H:919
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_save
Definition: WarpX.H:1488
static bool galerkin_interpolation
Definition: WarpX.H:297
amrex::Vector< std::unique_ptr< NCIGodfreyFilter > > nci_godfrey_filter_bxbyez
Definition: WarpX.H:549
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > m_area_mod
Definition: WarpX.H:1522
static amrex::IntVect filter_npass_each_dir
Definition: WarpX.H:546
amrex::IntVect get_numprocs() const
Definition: WarpX.H:953
const amrex::MultiFab & getBfield_fp(int lev, int direction)
Definition: WarpX.H:516
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Venl
Definition: WarpX.H:1539
static short electromagnetic_solver_id
Integer that corresponds to the type of Maxwell solver (Yee, CKC, PSATD, ECT)
Definition: WarpX.H:166
void InitPML()
amrex::Real v_particle_pml
Definition: WarpX.H:1587
amrex::IntVect get_ng_depos_J() const
Definition: WarpX.H:942
BilinearFilter bilinear_filter
Definition: WarpX.H:547
amrex::MultiFab * get_pointer_current_fp_nodal(int lev, int direction) const
Definition: WarpX.H:487
const amrex::MultiFab & getEfield_avg_fp(int lev, int direction)
Definition: WarpX.H:522
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_avg_fp
Definition: WarpX.H:1482
const amrex::MultiFab & getBfield_avg_fp(int lev, int direction)
Definition: WarpX.H:523
static int field_centering_noy
Order of finite centering of fields (from staggered grid to nodal grid), along y.
Definition: WarpX.H:266
amrex::Real getdt(int lev) const
Definition: WarpX.H:858
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_fp_external
Definition: WarpX.H:1498
const amrex::MultiFab & getEfield_avg_cp(int lev, int direction)
Definition: WarpX.H:524
amrex::Vector< std::unique_ptr< NCIGodfreyFilter > > nci_godfrey_filter_exeybz
Definition: WarpX.H:548
static bool do_current_centering
Definition: WarpX.H:219
amrex::Vector< amrex::Real > mirror_z
Definition: WarpX.H:558
amrex::Vector< std::unique_ptr< amrex::MultiFab > > F_slice
Definition: WarpX.H:1688
int getdo_moving_window() const
Definition: WarpX.H:859
static bool do_subcycling
Definition: WarpX.H:345
static int n_rz_azimuthal_modes
Number of modes for the RZ multi-mode version.
Definition: WarpX.H:278
static short J_in_time
Definition: WarpX.H:213
std::unique_ptr< ExternalFieldParams > m_p_ext_field_params
Definition: WarpX.H:1590
static amrex::Real gamma_boost
Lorentz factor of the boosted frame in which a boosted-frame simulation is run.
Definition: WarpX.H:314
static short field_gathering_algo
Integer that corresponds to the field gathering algorithm (energy-conserving, momentum-conserving)
Definition: WarpX.H:162
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_avg_cp
Definition: WarpX.H:1558
static int shared_mem_current_tpb
number of threads to use per block in shared deposition
Definition: WarpX.H:239
static short load_balance_costs_update_algo
Definition: WarpX.H:178
amrex::MultiFab * get_pointer_Bfield_fp(int lev, int direction) const
Definition: WarpX.H:485
amrex::Vector< std::unique_ptr< FiniteDifferenceSolver > > m_fdtd_solver_cp
Definition: WarpX.H:1895
void computeMaxStepBoostAccelerator()
amrex::Vector< amrex::Real > mirror_z_width
Definition: WarpX.H:559
const amrex::MultiFab & getcurrent_fp(int lev, int direction)
Definition: WarpX.H:514
std::unique_ptr< MultiReducedDiags > reduced_diags
object with all reduced diagnostics, similar to MultiParticleContainer for species.
Definition: WarpX.H:563
const amrex::MultiFab & getBfield(int lev, int direction)
Definition: WarpX.H:505
void PerformanceHints()
const amrex::MultiFab & getF_cp(int lev)
Definition: WarpX.H:511
amrex::Vector< std::unique_ptr< amrex::iMultiFab > > current_buffer_masks
Definition: WarpX.H:1563
std::string m_authors
Author of an input file / simulation setup.
Definition: WarpX.H:1447
void ScrapeParticles()
amrex::MultiFab * get_pointer_Bfield_cp(int lev, int direction) const
Definition: WarpX.H:495
int slice_max_grid_size
Definition: WarpX.H:1684
amrex::Vector< std::unique_ptr< amrex::MultiFab > > G_cp
Definition: WarpX.H:1552
static bool require_picard_convergence
Flags whether the Picard iterations are required to converge.
Definition: WarpX.H:174
const amrex::MultiFab & getEfield(int lev, int direction)
Definition: WarpX.H:504
static amrex::Real self_fields_absolute_tolerance
Definition: WarpX.H:907
amrex::Vector< std::unique_ptr< AcceleratorLattice > > m_accelerator_lattice
Definition: WarpX.H:1707
static amrex::Vector< ParticleBoundaryType > particle_boundary_hi
Definition: WarpX.H:204
std::optional< amrex::Real > m_const_dt
Definition: WarpX.H:1599
FiniteDifferenceSolver * get_pointer_fdtd_solver_fp(int lev)
Definition: WarpX.H:1184
amrex::RealBox slice_realbox
Definition: WarpX.H:1686
amrex::Vector< amrex::IntVect > do_pml_Lo
Definition: WarpX.H:1581
amrex::Vector< std::unique_ptr< SpectralSolverRZ > > spectral_solver_cp
Definition: WarpX.H:1886
amrex::Real getmoving_window_x() const
Definition: WarpX.H:860
bool do_pml_dive_cleaning
Definition: WarpX.H:1579
const PML_RZ * getPMLRZ()
Definition: WarpX.H:534
static bool compute_max_step_from_btd
If true, the code will compute max_step from the back transformed diagnostics.
Definition: WarpX.H:332
bool current_correction
If true, a correction is applied to the current in Fourier space,.
Definition: WarpX.H:223
void ComputePMLFactors()
static int end_moving_window_step
Definition: WarpX.H:913
static utils::parser::IntervalsParser sort_intervals
Definition: WarpX.H:337
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_fp
Definition: WarpX.H:1479
Definition: WarpXParticleContainer.H:110
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:86
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:126
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()