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 
26 #ifdef WARPX_USE_PSATD
27 # ifdef WARPX_DIM_RZ
30 # else
32 # endif
33 #endif
34 #include "Evolve/WarpXDtType.H"
37 #include "Filter/BilinearFilter.H"
42 #include "Utils/export.H"
43 
44 #include <AMReX.H>
45 #include <AMReX_AmrCore.H>
46 #include <AMReX_Array.H>
47 #include <AMReX_Config.H>
48 #ifdef AMREX_USE_EB
49 # include <AMReX_EBFabFactory.H>
50 #endif
51 #include <AMReX_GpuContainers.H>
52 #include <AMReX_IntVect.H>
53 #include <AMReX_LayoutData.H>
54 #include <AMReX_Parser.H>
55 #include <AMReX_REAL.H>
56 #include <AMReX_RealBox.H>
57 #include <AMReX_RealVect.H>
58 #include <AMReX_Vector.H>
59 #include <AMReX_VisMF.H>
60 
61 #include <AMReX_BaseFwd.H>
62 #include <AMReX_AmrCoreFwd.H>
63 
64 #include <array>
65 #include <iostream>
66 #include <limits>
67 #include <memory>
68 #include <optional>
69 #include <string>
70 #include <vector>
71 #include <map>
72 
73 
74 enum struct PatchType : int
75 {
76  fine,
77  coarse
78 };
79 
80 class WARPX_EXPORT WarpX
81  : public amrex::AmrCore
82 {
83 public:
84 
85  friend class PML;
86 
87  static WarpX& GetInstance ();
88 
89  static void ResetInstance ();
90 
95  static void Finalize();
96 
98  ~WarpX ();
99 
101  WarpX ( WarpX const &) = delete;
103  WarpX& operator= ( WarpX const & ) = delete;
104 
106  WarpX ( WarpX && ) = default;
108  WarpX& operator= ( WarpX && ) = default;
109 
110  static std::string Version ();
111  static std::string PicsarVersion ();
112 
113  int Verbose () const { return verbose; }
114 
115  void InitData ();
116 
117  void Evolve (int numsteps = -1);
118 
120  MacroscopicProperties& GetMacroscopicProperties () { return *m_macroscopic_properties; }
121  HybridPICModel& GetHybridPICModel () { return *m_hybrid_pic_model; }
122  MultiDiagnostics& GetMultiDiags () {return *multi_diags;}
123 
124  ParticleBoundaryBuffer& GetParticleBoundaryBuffer () { return *m_particle_boundary_buffer; }
125 
126  static void shiftMF (amrex::MultiFab& mf, const amrex::Geometry& geom,
127  int num_shift, int dir, int lev, bool update_cost_flag,
128  amrex::Real external_field=0.0, bool useparser = false,
129  amrex::ParserExecutor<3> const& field_parser={});
130 
132  static std::string authors;
133 
138 
140  static std::string B_ext_grid_s;
142  static std::string E_ext_grid_s;
143 
145  static bool add_external_E_field;
147  static bool add_external_B_field;
148 
150  std::unique_ptr<amrex::Parser> Bxfield_parser;
152  std::unique_ptr<amrex::Parser> Byfield_parser;
154  std::unique_ptr<amrex::Parser> Bzfield_parser;
156  std::unique_ptr<amrex::Parser> Exfield_parser;
158  std::unique_ptr<amrex::Parser> Eyfield_parser;
160  std::unique_ptr<amrex::Parser> Ezfield_parser;
161 
162  // Algorithms
168  static short field_gathering_algo;
170  static short particle_pusher_algo;
178  static int em_solver_medium;
203 
207  static short psatd_solution_type;
208 
211  static short J_in_time;
212  static short rho_in_time;
213 
217  static bool do_current_centering;
218 
220  // to satisfy the continuity equation and charge conservation
222 
225  bool update_with_rho = false;
226 
229 
232 
235 
238 
241 
244 
247 
250  static bool do_dive_cleaning;
252  static bool do_divb_cleaning;
253 
255  static int nox;
257  static int noy;
259  static int noz;
260 
267 
274 
281  static int ncomps;
282 
285  static bool use_fdtd_nci_corr;
296 
300 
302  static bool use_filter;
304  static bool use_kspace_filter;
307 
310 
312  static amrex::Real gamma_boost;
314  static amrex::Real beta_boost;
327  static amrex::Real zmin_domain_boost_step_0;
328 
331 
333  static bool refine_plasma;
334 
337 
342 
343  static bool do_subcycling;
344  static bool do_multi_J;
346 
348  static bool safe_guard_cells;
349 
358 
361  static short grid_type;
362 
363  // Global rho nodal flag to know about rho index type when rho MultiFab is not allocated
365 
381  static void AllocInitMultiFab (
382  std::unique_ptr<amrex::MultiFab>& mf,
383  const amrex::BoxArray& ba,
384  const amrex::DistributionMapping& dm,
385  int ncomp,
386  const amrex::IntVect& ngrow,
387  int level,
388  const std::string& name,
389  std::optional<const amrex::Real> initial_value = {});
390 
406  static void AllocInitMultiFab (
407  std::unique_ptr<amrex::iMultiFab>& mf,
408  const amrex::BoxArray& ba,
409  const amrex::DistributionMapping& dm,
410  int ncomp,
411  const amrex::IntVect& ngrow,
412  int level,
413  const std::string& name,
414  std::optional<const int> initial_value = {});
415 
427  static void AliasInitMultiFab (
428  std::unique_ptr<amrex::MultiFab>& mf,
429  const amrex::MultiFab& mf_to_alias,
430  int scomp,
431  int ncomp,
432  int level,
433  const std::string& name,
434  std::optional<const amrex::Real> initial_value);
435 
436  // Maps of all of the MultiFabs and iMultiFabs used (this can include MFs from other classes)
437  // This is a convenience for the Python interface, allowing all MultiFabs
438  // to be easily referenced from Python.
439  static std::map<std::string, amrex::MultiFab *> multifab_map;
440  static std::map<std::string, amrex::iMultiFab *> imultifab_map;
441 
442  std::array<const amrex::MultiFab* const, 3>
443  get_array_Bfield_aux (const int lev) const {
444  return {
445  Bfield_aux[lev][0].get(),
446  Bfield_aux[lev][1].get(),
447  Bfield_aux[lev][2].get()
448  };
449  }
450  std::array<const amrex::MultiFab* const, 3>
451  get_array_Efield_aux (const int lev) const {
452  return {
453  Efield_aux[lev][0].get(),
454  Efield_aux[lev][1].get(),
455  Efield_aux[lev][2].get()
456  };
457  }
458 
459  amrex::MultiFab * get_pointer_Efield_aux (int lev, int direction) const { return Efield_aux[lev][direction].get(); }
460  amrex::MultiFab * get_pointer_Bfield_aux (int lev, int direction) const { return Bfield_aux[lev][direction].get(); }
461 
462  amrex::MultiFab * get_pointer_Efield_fp (int lev, int direction) const { return Efield_fp[lev][direction].get(); }
463  amrex::MultiFab * get_pointer_Bfield_fp (int lev, int direction) const { return Bfield_fp[lev][direction].get(); }
464  amrex::MultiFab * get_pointer_current_fp (int lev, int direction) const { return current_fp[lev][direction].get(); }
465  amrex::MultiFab * get_pointer_current_fp_nodal (int lev, int direction) const { return current_fp_nodal[lev][direction].get(); }
466  amrex::MultiFab * get_pointer_rho_fp (int lev) const { return rho_fp[lev].get(); }
467  amrex::MultiFab * get_pointer_F_fp (int lev) const { return F_fp[lev].get(); }
468  amrex::MultiFab * get_pointer_G_fp (int lev) const { return G_fp[lev].get(); }
469  amrex::MultiFab * get_pointer_phi_fp (int lev) const { return phi_fp[lev].get(); }
470  amrex::MultiFab * get_pointer_vector_potential_fp (int lev, int direction) const { return vector_potential_fp_nodal[lev][direction].get(); }
471 
472  amrex::MultiFab * get_pointer_Efield_cp (int lev, int direction) const { return Efield_cp[lev][direction].get(); }
473  amrex::MultiFab * get_pointer_Bfield_cp (int lev, int direction) const { return Bfield_cp[lev][direction].get(); }
474  amrex::MultiFab * get_pointer_current_cp (int lev, int direction) const { return current_cp[lev][direction].get(); }
475  amrex::MultiFab * get_pointer_rho_cp (int lev) const { return rho_cp[lev].get(); }
476  amrex::MultiFab * get_pointer_F_cp (int lev) const { return F_cp[lev].get(); }
477  amrex::MultiFab * get_pointer_G_cp (int lev) const { return G_cp[lev].get(); }
478 
479  amrex::MultiFab * get_pointer_edge_lengths (int lev, int direction) const { return m_edge_lengths[lev][direction].get(); }
480  amrex::MultiFab * get_pointer_face_areas (int lev, int direction) const { return m_face_areas[lev][direction].get(); }
481 
482  const amrex::MultiFab& getEfield (int lev, int direction) {return *Efield_aux[lev][direction];}
483  const amrex::MultiFab& getBfield (int lev, int direction) {return *Bfield_aux[lev][direction];}
484 
485  const amrex::MultiFab& getcurrent_cp (int lev, int direction) {return *current_cp[lev][direction];}
486  const amrex::MultiFab& getEfield_cp (int lev, int direction) {return *Efield_cp[lev][direction];}
487  const amrex::MultiFab& getBfield_cp (int lev, int direction) {return *Bfield_cp[lev][direction];}
488  const amrex::MultiFab& getrho_cp (int lev) {return *rho_cp[lev];}
489  const amrex::MultiFab& getF_cp (int lev) {return *F_cp[lev];}
490  const amrex::MultiFab& getG_cp (int lev) {return *G_cp[lev];}
491 
492  const amrex::MultiFab& getcurrent_fp (int lev, int direction) {return *current_fp[lev][direction];}
493  const amrex::MultiFab& getEfield_fp (int lev, int direction) {return *Efield_fp[lev][direction];}
494  const amrex::MultiFab& getBfield_fp (int lev, int direction) {return *Bfield_fp[lev][direction];}
495  const amrex::MultiFab& getrho_fp (int lev) {return *rho_fp[lev];}
496  const amrex::MultiFab& getphi_fp (int lev) {return *phi_fp[lev];}
497  const amrex::MultiFab& getF_fp (int lev) {return *F_fp[lev];}
498  const amrex::MultiFab& getG_fp (int lev) {return *G_fp[lev];}
499 
500  const amrex::MultiFab& getEfield_avg_fp (int lev, int direction) {return *Efield_avg_fp[lev][direction];}
501  const amrex::MultiFab& getBfield_avg_fp (int lev, int direction) {return *Bfield_avg_fp[lev][direction];}
502  const amrex::MultiFab& getEfield_avg_cp (int lev, int direction) {return *Efield_avg_cp[lev][direction];}
503  const amrex::MultiFab& getBfield_avg_cp (int lev, int direction) {return *Bfield_avg_cp[lev][direction];}
504 
505  bool DoPML () const {return do_pml;}
506 
507 #if (defined WARPX_DIM_RZ) && (defined WARPX_USE_PSATD)
508  const PML_RZ* getPMLRZ() {return pml_rz[0].get();}
509 #endif
510 
512  std::vector<bool> getPMLdirections() const;
513 
514  static amrex::LayoutData<amrex::Real>* getCosts (int lev);
515 
516  void setLoadBalanceEfficiency (int lev, amrex::Real efficiency);
517 
518  amrex::Real getLoadBalanceEfficiency (int lev);
519 
524 
525  amrex::Real time_of_last_gal_shift = 0;
526  amrex::Vector<amrex::Real> m_v_galilean = amrex::Vector<amrex::Real>(3, amrex::Real(0.));
527  amrex::Array<amrex::Real,3> m_galilean_shift = {{0}};
528 
529  amrex::Vector<amrex::Real> m_v_comoving = amrex::Vector<amrex::Real>(3, amrex::Real(0.));
530 
531  static int num_mirrors;
535 
537  std::unique_ptr<MultiReducedDiags> reduced_diags;
538 
539  void applyMirrors(amrex::Real time);
540 
542  void ComputeDt ();
543 
546 
548  void WriteUsedInputsFile () const;
549 
551  void PrintDtDxDyDz ();
552 
558  void ComputeMaxStep ();
559  // Compute max_step automatically for simulations in a boosted frame.
561 
566  int MoveWindow (int step, bool move_j);
567 
573  void ShiftGalileanBoundary ();
574 
579  void UpdateInjectionPosition (amrex::Real dt);
580 
581  void ResetProbDomain (const amrex::RealBox& rb);
582  void EvolveE ( amrex::Real dt);
583  void EvolveE (int lev, amrex::Real dt);
584  void EvolveB ( amrex::Real dt, DtType dt_type);
585  void EvolveB (int lev, amrex::Real dt, DtType dt_type);
586  void EvolveF ( amrex::Real dt, DtType dt_type);
587  void EvolveF (int lev, amrex::Real dt, DtType dt_type);
588  void EvolveG ( amrex::Real dt, DtType dt_type);
589  void EvolveG (int lev, amrex::Real dt, DtType dt_type);
590  void EvolveB (int lev, PatchType patch_type, amrex::Real dt, DtType dt_type);
591  void EvolveE (int lev, PatchType patch_type, amrex::Real dt);
592  void EvolveF (int lev, PatchType patch_type, amrex::Real dt, DtType dt_type);
593  void EvolveG (int lev, PatchType patch_type, amrex::Real dt, DtType dt_type);
594 
595  void MacroscopicEvolveE ( amrex::Real dt);
596  void MacroscopicEvolveE (int lev, amrex::Real dt);
597  void MacroscopicEvolveE (int lev, PatchType patch_type, amrex::Real dt);
598 
604  void HybridPICEvolveFields ();
605 
613  void HybridPICDepositInitialRhoAndJ ();
614 
619  void Hybrid_QED_Push ( amrex::Vector<amrex::Real> dt);
620 
626  void Hybrid_QED_Push (int lev, amrex::Real dt);
627 
634  void Hybrid_QED_Push (int lev, PatchType patch_type, amrex::Real dt);
635 
636  static amrex::Real quantum_xi_c2;
637 
640  void LoadBalance ();
643  void ResetCosts ();
644 
648  {
649  return load_balance_intervals;
650  }
651 
659  void DampFieldsInGuards (int lev,
660  const std::array<std::unique_ptr<amrex::MultiFab>,3>& Efield,
661  const std::array<std::unique_ptr<amrex::MultiFab>,3>& Bfield);
662 
670  void DampFieldsInGuards (int lev, std::unique_ptr<amrex::MultiFab>& mf);
671 
672 #ifdef WARPX_DIM_RZ
673  void ApplyInverseVolumeScalingToCurrentDensity(amrex::MultiFab* Jx,
674  amrex::MultiFab* Jy,
675  amrex::MultiFab* Jz,
676  int lev);
677 
678  void ApplyInverseVolumeScalingToChargeDensity(amrex::MultiFab* Rho,
679  int lev);
680 #endif
681 
687  void ApplyRhofieldBoundary (int lev, amrex::MultiFab* Rho,
688  PatchType patch_type);
689 
695  void ApplyJfieldBoundary (int lev, amrex::MultiFab* Jx,
697  PatchType patch_type);
698 
699  void ApplyEfieldBoundary (int lev, PatchType patch_type);
700  void ApplyBfieldBoundary (int lev, PatchType patch_type, DtType dt_type);
701 
710  void ApplyElectronPressureBoundary (int lev, PatchType patch_type);
711 
712  void DampPML ();
713  void DampPML (int lev);
714  void DampPML (int lev, PatchType patch_type);
715  void DampPML_Cartesian (int lev, PatchType patch_type);
716 
717  void DampJPML ();
718  void DampJPML (int lev);
719  void DampJPML (int lev, PatchType patch_type);
720 
721  void CopyJPML ();
722  bool isAnyBoundaryPML();
723 
727  void NodalSyncPML ();
728 
732  void NodalSyncPML (int lev);
733 
737  void NodalSyncPML (int lev, PatchType patch_type);
738 
739  PML* GetPML (int lev);
740 #if (defined WARPX_DIM_RZ) && (defined WARPX_USE_PSATD)
741  PML_RZ* GetPML_RZ (int lev);
742 #endif
743 
745  void doFieldIonization ();
749  void doFieldIonization (int lev);
750 
751 #ifdef WARPX_QED
753  void doQEDEvents ();
757  void doQEDEvents (int lev);
758 #endif
759 
760  void PushParticlesandDepose (int lev, amrex::Real cur_time, DtType a_dt_type=DtType::Full, bool skip_current=false);
761  void PushParticlesandDepose ( amrex::Real cur_time, bool skip_current=false);
762 
763  // This function does aux(lev) = fp(lev) + I(aux(lev-1)-cp(lev)).
764  // Caller must make sure fp and cp have ghost cells filled.
765  void UpdateAuxilaryData ();
766  void UpdateAuxilaryDataStagToNodal ();
767  void UpdateAuxilaryDataSameType ();
768 
777  void UpdateCurrentNodalToStag (amrex::MultiFab& dst, amrex::MultiFab const& src);
778 
779  // Fill boundary cells including coarse/fine boundaries
780  void FillBoundaryB (amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
781  void FillBoundaryE (amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
782  void FillBoundaryB_avg (amrex::IntVect ng);
783  void FillBoundaryE_avg (amrex::IntVect ng);
784 
785  void FillBoundaryF (amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
786  void FillBoundaryG (amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
787  void FillBoundaryAux (amrex::IntVect ng);
788  void FillBoundaryE (int lev, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
789  void FillBoundaryB (int lev, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
790  void FillBoundaryE_avg (int lev, amrex::IntVect ng);
791  void FillBoundaryB_avg (int lev, amrex::IntVect ng);
792 
793  void FillBoundaryF (int lev, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
794  void FillBoundaryG (int lev, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
795  void FillBoundaryAux (int lev, amrex::IntVect ng);
796 
803  void SyncCurrentAndRho ();
804 
817  void SyncCurrent (
818  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
819  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp,
820  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_buffer);
821 
822  void SyncRho ();
823 
824  void SyncRho (
825  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
826  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp,
827  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_buffer);
828 
829  amrex::Vector<int> getnsubsteps () const {return nsubsteps;}
830  int getnsubsteps (int lev) const {return nsubsteps[lev];}
831  amrex::Vector<int> getistep () const {return istep;}
832  int getistep (int lev) const {return istep[lev];}
833  void setistep (int lev, int ii) {istep[lev] = ii;}
834  amrex::Vector<amrex::Real> gett_old () const {return t_old;}
835  amrex::Real gett_old (int lev) const {return t_old[lev];}
836  amrex::Vector<amrex::Real> gett_new () const {return t_new;}
837  amrex::Real gett_new (int lev) const {return t_new[lev];}
838  void sett_new (int lev, amrex::Real time) {t_new[lev] = time;}
840  amrex::Real getdt (int lev) const {return dt.at(lev);}
841  int getdo_moving_window() const {return do_moving_window;}
842  amrex::Real getmoving_window_x() const {return moving_window_x;}
843  bool getis_synchronized() const {return is_synchronized;}
844 
845  int maxStep () const {return max_step;}
846  void updateMaxStep (const int new_max_step) {max_step = new_max_step;}
847  amrex::Real stopTime () const {return stop_time;}
848  void updateStopTime (const amrex::Real new_stop_time) {stop_time = new_stop_time;}
849 
851  amrex::Vector<amrex::MultiFab>& mf_avg, amrex::IntVect ngrow) const;
852 
853  void prepareFields( int step, amrex::Vector<std::string>& varnames,
856  amrex::Vector<amrex::Geometry>& output_geom ) const;
857 
858  static std::array<amrex::Real,3> CellSize (int lev);
859  static amrex::RealBox getRealBox(const amrex::Box& bx, int lev);
860 
869  static std::array<amrex::Real,3> LowerCorner (const amrex::Box& bx, int lev, amrex::Real time_shift_delta);
878  static std::array<amrex::Real,3> UpperCorner (const amrex::Box& bx, int lev, amrex::Real time_shift_delta);
879 
880  static amrex::IntVect RefRatio (int lev);
881 
882  static const amrex::iMultiFab* CurrentBufferMasks (int lev);
883  static const amrex::iMultiFab* GatherBufferMasks (int lev);
884 
886 
887  // Parameters for lab frame electrostatic
888  static amrex::Real self_fields_required_precision;
889  static amrex::Real self_fields_absolute_tolerance;
892 
893  static int do_moving_window; // boolean
894  static int start_moving_window_step; // the first step to move window
895  static int end_moving_window_step; // the last step to move window
901  static int moving_window_active (int const step) {
902  bool const step_before_end = (step < end_moving_window_step) || (end_moving_window_step < 0);
903  bool const step_after_start = (step >= start_moving_window_step);
904  return do_moving_window && step_before_end && step_after_start;
905  }
906  static int moving_window_dir;
907  static amrex::Real moving_window_v;
909 
910  // these should be private, but can't due to Cuda limitations
911  static void ComputeDivB (amrex::MultiFab& divB, int dcomp,
912  const std::array<const amrex::MultiFab* const, 3>& B,
913  const std::array<amrex::Real,3>& dx);
914 
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, amrex::IntVect ngrow);
918 
919  void ComputeDivE(amrex::MultiFab& divE, int lev);
920 
921  amrex::IntVect getngEB() const { return guard_cells.ng_alloc_EB; }
922  amrex::IntVect getngF() const { return guard_cells.ng_alloc_F; }
923  amrex::IntVect getngUpdateAux() const { return guard_cells.ng_UpdateAux; }
924  amrex::IntVect get_ng_depos_J() const {return guard_cells.ng_depos_J;}
925  amrex::IntVect get_ng_depos_rho() const {return guard_cells.ng_depos_rho;}
926  amrex::IntVect get_ng_fieldgather () const {return guard_cells.ng_FieldGather;}
927 
935  amrex::IntVect get_numprocs() const {return numprocs;}
936 
938  void ComputeSpaceChargeField (bool reset_fields);
939  void AddBoundaryField ();
940  void AddSpaceChargeField (WarpXParticleContainer& pc);
941  void AddSpaceChargeFieldLabFrame ();
942  void computePhi (const amrex::Vector<std::unique_ptr<amrex::MultiFab> >& rho,
943  amrex::Vector<std::unique_ptr<amrex::MultiFab> >& phi,
944  std::array<amrex::Real, 3> beta = {{0,0,0}},
945  amrex::Real required_precision=amrex::Real(1.e-11),
946  amrex::Real absolute_tolerance=amrex::Real(0.0),
947  int max_iters=200,
948  int verbosity=2) const;
949 
950  void setPhiBC (amrex::Vector<std::unique_ptr<amrex::MultiFab> >& phi ) const;
951 
952  void computeE (amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>, 3> >& E,
953  const amrex::Vector<std::unique_ptr<amrex::MultiFab> >& phi,
954  std::array<amrex::Real, 3> beta = {{0,0,0}} ) const;
955  void computeB (amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>, 3> >& B,
956  const amrex::Vector<std::unique_ptr<amrex::MultiFab> >& phi,
957  std::array<amrex::Real, 3> beta = {{0,0,0}} ) const;
958  void computePhiTriDiagonal (const amrex::Vector<std::unique_ptr<amrex::MultiFab> >& rho,
959  amrex::Vector<std::unique_ptr<amrex::MultiFab> >& phi) const;
960 
961  // Magnetostatic Solver Interface
963  void ComputeMagnetostaticField ();
964  void AddMagnetostaticFieldLabFrame ();
965  void computeVectorPotential (const amrex::Vector<amrex::Array<std::unique_ptr<amrex::MultiFab>, 3> >& curr,
966  amrex::Vector<amrex::Array<std::unique_ptr<amrex::MultiFab>, 3> >& A,
967  amrex::Real required_precision=amrex::Real(1.e-11),
968  amrex::Real absolute_tolerance=amrex::Real(0.0),
969  int max_iters=200,
970  int verbosity=2) const;
971 
972  void setVectorPotentialBC (amrex::Vector<amrex::Array<std::unique_ptr<amrex::MultiFab>, 3> >& A) const;
973 
997  amrex::ParserExecutor<3> const& xfield_parser,
998  amrex::ParserExecutor<3> const& yfield_parser,
999  amrex::ParserExecutor<3> const& zfield_parser,
1000  std::array< std::unique_ptr<amrex::MultiFab>, 3 > const& edge_lengths,
1001  std::array< std::unique_ptr<amrex::MultiFab>, 3 > const& face_areas,
1002  char field,
1003  int lev, PatchType patch_type);
1004 
1006  std::string read_fields_from_path, amrex::MultiFab* mf,
1007  std::string F_name, std::string F_component);
1008 
1017  void InitializeEBGridData(int lev);
1018 
1024  void ComputeCostsHeuristic (amrex::Vector<std::unique_ptr<amrex::LayoutData<amrex::Real> > >& costs);
1025 
1026  void ApplyFilterandSumBoundaryRho (int lev, int glev, amrex::MultiFab& rho, int icomp, int ncomp);
1027 
1036  static amrex::Vector<amrex::Real> getFornbergStencilCoefficients(int n_order, short a_grid_type);
1037 
1038  // Device vectors of stencil coefficients used for finite-order centering of fields
1042 
1043  // Device vectors of stencil coefficients used for finite-order centering of currents
1047 
1048  // This needs to be public for CUDA.
1050  virtual void ErrorEst (int lev, amrex::TagBoxArray& tags, amrex::Real time, int /*ngrow*/) final;
1051 
1052  // Return the accelerator lattice instance defined at the given refinement level
1053  const AcceleratorLattice& get_accelerator_lattice (int lev) {return *(m_accelerator_lattice[lev]);}
1054 
1055 protected:
1056 
1082  void InitLevelData (int lev, amrex::Real time);
1083 
1086  virtual void PostProcessBaseGrids (amrex::BoxArray& ba0) const final;
1087 
1091  virtual void MakeNewLevelFromScratch (int lev, amrex::Real time, const amrex::BoxArray& ba,
1092  const amrex::DistributionMapping& dm) final;
1093 
1097  virtual void MakeNewLevelFromCoarse (int /*lev*/, amrex::Real /*time*/, const amrex::BoxArray& /*ba*/,
1098  const amrex::DistributionMapping& /*dm*/) final;
1099 
1103  virtual void RemakeLevel (int lev, amrex::Real time, const amrex::BoxArray& ba,
1104  const amrex::DistributionMapping& dm) final;
1105 
1107  virtual void ClearLevel (int lev) final;
1108 
1109 private:
1110 
1117  WarpX ();
1118 
1123  static void MakeWarpX ();
1124 
1125  // Singleton is used when the code is run from python
1127 
1129  void HandleSignals ();
1130 
1134  void EvolveEM(int numsteps);
1135 
1136  void FillBoundaryB (int lev, PatchType patch_type, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
1137  void FillBoundaryE (int lev, PatchType patch_type, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
1138  void FillBoundaryF (int lev, PatchType patch_type, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
1139  void FillBoundaryG (int lev, PatchType patch_type, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
1140 
1141  void FillBoundaryB_avg (int lev, PatchType patch_type, amrex::IntVect ng);
1142  void FillBoundaryE_avg (int lev, PatchType patch_type, amrex::IntVect ng);
1143 
1145 
1146  void OneStep_nosub (amrex::Real t);
1147  void OneStep_sub1 (amrex::Real t);
1148 
1152  void OneStep_multiJ (amrex::Real t);
1153 
1154  void RestrictCurrentFromFineToCoarsePatch (
1155  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
1156  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp,
1157  int lev);
1158  void AddCurrentFromFineLevelandSumBoundary (
1159  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
1160  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp,
1161  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_buffer,
1162  int lev);
1163  void StoreCurrent (int lev);
1164  void RestoreCurrent (int lev);
1165  void ApplyFilterJ (
1166  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& current,
1167  int lev,
1168  int idim);
1169  void ApplyFilterJ (
1170  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& current,
1171  int lev);
1172  void SumBoundaryJ (
1173  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& current,
1174  int lev,
1175  int idim,
1176  const amrex::Periodicity& period);
1177  void SumBoundaryJ (
1178  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& current,
1179  int lev,
1180  const amrex::Periodicity& period);
1181  void NodalSyncJ (
1182  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
1183  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp,
1184  int lev,
1185  PatchType patch_type);
1186 
1187  void RestrictRhoFromFineToCoarsePatch (
1188  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
1189  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp,
1190  int lev);
1191  void ApplyFilterandSumBoundaryRho (
1192  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
1193  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp,
1194  int lev,
1195  PatchType patch_type,
1196  int icomp,
1197  int ncomp);
1198  void AddRhoFromFineLevelandSumBoundary (
1199  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
1200  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp,
1201  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_buffer,
1202  int lev,
1203  int icomp,
1204  int ncomp);
1205  void NodalSyncRho (
1206  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
1207  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp,
1208  int lev,
1209  PatchType patch_type,
1210  int icomp,
1211  int ncomp);
1212 
1213  void ReadParameters ();
1214 
1217  void BackwardCompatibility ();
1218 
1220 
1221  void AllocLevelData (int lev, const amrex::BoxArray& new_grids,
1222  const amrex::DistributionMapping& new_dmap);
1223 
1225  GetRestartDMap (const std::string& chkfile, const amrex::BoxArray& ba, int lev) const;
1226 
1227  void InitFromCheckpoint ();
1228  void PostRestart ();
1229 
1230  void InitPML ();
1232 
1233  void InitFilter ();
1234 
1236 
1238 
1244 
1249 
1252 
1253  void BuildBufferMasks ();
1254 public: // for cuda
1255  void BuildBufferMasksInBox ( amrex::Box tbx, amrex::IArrayBox &buffer_mask,
1256  const amrex::IArrayBox &guard_mask, int ng );
1257 private:
1258  const amrex::iMultiFab* getCurrentBufferMasks (int lev) const {
1259  return current_buffer_masks[lev].get();
1260  }
1261  const amrex::iMultiFab* getGatherBufferMasks (int lev) const {
1262  return gather_buffer_masks[lev].get();
1263  }
1264 
1274  void ReorderFornbergCoefficients (amrex::Vector<amrex::Real>& ordered_coeffs,
1275  amrex::Vector<amrex::Real>& unordered_coeffs,
1276  int order);
1289  void AllocateCenteringCoefficients (amrex::Gpu::DeviceVector<amrex::Real>& device_centering_stencil_coeffs_x,
1290  amrex::Gpu::DeviceVector<amrex::Real>& device_centering_stencil_coeffs_y,
1291  amrex::Gpu::DeviceVector<amrex::Real>& device_centering_stencil_coeffs_z,
1292  int centering_nox,
1293  int centering_noy,
1294  int centering_noz,
1295  short a_grid_type);
1296 
1297  void AllocLevelMFs (int lev, const amrex::BoxArray& ba, const amrex::DistributionMapping& dm,
1298  const amrex::IntVect& ngEB, amrex::IntVect& ngJ,
1299  const amrex::IntVect& ngRho, const amrex::IntVect& ngF,
1300  const amrex::IntVect& ngG, bool aux_is_nodal);
1301 
1302 #ifdef WARPX_USE_PSATD
1303 # ifdef WARPX_DIM_RZ
1304  void AllocLevelSpectralSolverRZ (amrex::Vector<std::unique_ptr<SpectralSolverRZ>>& spectral_solver,
1305  int lev,
1306  const amrex::BoxArray& realspace_ba,
1307  const amrex::DistributionMapping& dm,
1308  const std::array<amrex::Real,3>& dx);
1309 # else
1310  void AllocLevelSpectralSolver (amrex::Vector<std::unique_ptr<SpectralSolver>>& spectral_solver,
1311  int lev,
1312  const amrex::BoxArray& realspace_ba,
1313  const amrex::DistributionMapping& dm,
1314  const std::array<amrex::Real,3>& dx,
1315  bool pml_flag=false);
1316 # endif
1317 #endif
1318 
1319  amrex::Vector<int> istep; // which step?
1320  amrex::Vector<int> nsubsteps; // how many substeps on each level?
1321 
1325 
1326  // Particle container
1327  std::unique_ptr<MultiParticleContainer> mypc;
1328  std::unique_ptr<MultiDiagnostics> multi_diags;
1329 
1330  //
1331  // Fields: First array for level, second for direction
1332  //
1333 
1334  // Full solution
1337 
1338  // Fine patch
1349 
1350  // Memory buffers for computing magnetostatic fields
1351  // Vector Potential A and previous step. Time buffer needed for computing dA/dt to first order
1355 
1356  // Same as Bfield_fp/Efield_fp for reading external field data
1359 
1364 
1387 
1400 
1401  //EB level set
1403 
1404  // store fine patch
1406 
1407  // Nodal MultiFab for nodal current deposition if warpx.do_current_centering = 1
1409 
1410  // Coarse patch
1419 
1420  // Copy of the coarse aux
1425 
1426  // If charge/current deposition buffers are used
1429 
1430  // PML
1431  int do_pml = 0;
1432  int do_silver_mueller = 0;
1433  int pml_ncell = 10;
1434  int pml_delta = 10;
1435  int pml_has_particles = 0;
1436  int do_pml_j_damping = 0;
1437  int do_pml_in_domain = 0;
1438  static int do_similar_dm_pml;
1439  bool do_pml_dive_cleaning; // default set in WarpX.cpp
1440  bool do_pml_divb_cleaning; // default set in WarpX.cpp
1444 #if (defined WARPX_DIM_RZ) && (defined WARPX_USE_PSATD)
1446 #endif
1447  amrex::Real v_particle_pml;
1448 
1449  amrex::Real moving_window_x = std::numeric_limits<amrex::Real>::max();
1450 
1451  // Plasma injection parameters
1452  int warpx_do_continuous_injection = 0;
1453  int num_injected_species = -1;
1455 
1456  std::optional<amrex::Real> m_const_dt;
1457 
1458  // Macroscopic properties
1459  std::unique_ptr<MacroscopicProperties> m_macroscopic_properties;
1460 
1461  // Hybrid PIC algorithm parameters
1462  std::unique_ptr<HybridPICModel> m_hybrid_pic_model;
1463 
1464  // Load balancing
1472  int load_balance_with_sfc = 0;
1477  amrex::Real load_balance_knapsack_factor = amrex::Real(1.24);
1483  amrex::Real load_balance_efficiency_ratio_threshold = amrex::Real(1.1);
1491  amrex::Real costs_heuristic_cells_wt = amrex::Real(0);
1497  amrex::Real costs_heuristic_particles_wt = amrex::Real(0);
1498 
1499  // Determines timesteps for override sync
1501 
1502  // Other runtime parameters
1503  int verbose = 1;
1504 
1505  bool use_hybrid_QED = 0;
1506 
1507  int max_step = std::numeric_limits<int>::max();
1508  amrex::Real stop_time = std::numeric_limits<amrex::Real>::max();
1509 
1510  int regrid_int = -1;
1511 
1512  amrex::Real cfl = amrex::Real(0.999);
1513 
1514  std::string restart_chkfile;
1515 
1517  bool write_diagonstics_on_restart = false;
1518 
1521 
1522  bool use_single_read = true;
1523  bool use_single_write = true;
1524  int mffile_nstreams = 4;
1525  int field_io_nfiles = 1024;
1526  int particle_io_nfiles = 1024;
1527 
1530 
1531  bool is_synchronized = true;
1532 
1533  // Synchronization of nodal points
1534  static constexpr bool sync_nodal_points = true;
1535 
1537 
1538  //Slice Parameters
1540  int slice_plot_int = -1;
1549 
1550  bool fft_periodic_single_box = false;
1551  int nox_fft = 16;
1552  int noy_fft = 16;
1553  int noz_fft = 16;
1554 
1556  amrex::IntVect numprocs{0};
1557 
1559  std::unique_ptr<ParticleBoundaryBuffer> m_particle_boundary_buffer;
1560 
1561  // Accelerator lattice elements
1563 
1564  //
1565  // Embedded Boundary
1566  //
1567 
1568  // Factory for field data
1570 
1571  amrex::FabFactory<amrex::FArrayBox> const& fieldFactory (int lev) const noexcept {
1572  return *m_field_factory[lev];
1573  }
1574 #ifdef AMREX_USE_EB
1575 public:
1576  amrex::EBFArrayBoxFactory const& fieldEBFactory (int lev) const noexcept {
1577  return static_cast<amrex::EBFArrayBoxFactory const&>(*m_field_factory[lev]);
1578  }
1579 #endif
1580 
1581 public:
1582  void InitEB ();
1588 public:
1589 #ifdef AMREX_USE_EB
1590  static void ComputeEdgeLengths (std::array< std::unique_ptr<amrex::MultiFab>, 3 >& edge_lengths,
1591  const amrex::EBFArrayBoxFactory& eb_fact);
1596  static void ComputeFaceAreas (std::array< std::unique_ptr<amrex::MultiFab>, 3 >& face_areas,
1597  const amrex::EBFArrayBoxFactory& eb_fact);
1598 
1602  static void ScaleEdges (std::array< std::unique_ptr<amrex::MultiFab>, 3 >& edge_lengths,
1603  const std::array<amrex::Real,3>& cell_size);
1607  static void ScaleAreas (std::array< std::unique_ptr<amrex::MultiFab>, 3 >& face_areas,
1608  const std::array<amrex::Real,3>& cell_size);
1617  void MarkCells();
1621 #endif
1622  void ComputeDistanceToEB ();
1626  amrex::Array1D<int, 0, 2> CountExtFaces();
1631  void ComputeFaceExtensions();
1635  void InitBorrowing();
1639  void ShrinkBorrowing();
1643  void ComputeOneWayExtensions();
1647  void ComputeEightWaysExtensions();
1656  void ApplyBCKCorrection(int idim);
1657 
1662  void PSATDSubtractCurrentPartialSumsAvg ();
1663 
1664 private:
1666 
1667  void PushPSATD ();
1668 
1669 #ifdef WARPX_USE_PSATD
1670 
1683  void PSATDForwardTransformEB (
1684  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& E_fp,
1685  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& B_fp,
1686  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& E_cp,
1687  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& B_cp);
1688 
1702  void PSATDBackwardTransformEB (
1703  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& E_fp,
1704  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& B_fp,
1705  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& E_cp,
1706  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& B_cp);
1707 
1720  void PSATDBackwardTransformEBavg (
1721  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& E_avg_fp,
1722  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& B_avg_fp,
1723  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& E_avg_cp,
1724  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& B_avg_cp);
1725 
1737  void PSATDForwardTransformJ (
1738  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
1739  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp,
1740  bool apply_kspace_filter=true);
1741 
1750  void PSATDBackwardTransformJ (
1751  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
1752  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp);
1753 
1765  void PSATDForwardTransformRho (
1766  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
1767  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp,
1768  int icomp, int dcomp, bool apply_kspace_filter=true);
1769 
1773  void PSATDMoveRhoNewToRhoOld ();
1774 
1778  void PSATDMoveJNewToJOld ();
1779 
1783  void PSATDForwardTransformF ();
1784 
1788  void PSATDBackwardTransformF ();
1789 
1793  void PSATDForwardTransformG ();
1794 
1798  void PSATDBackwardTransformG ();
1799 
1803  void PSATDCurrentCorrection ();
1804 
1808  void PSATDVayDeposition ();
1809 
1813  void PSATDPushSpectralFields ();
1814 
1820  void PSATDScaleAverageFields (amrex::Real scale_factor);
1821 
1825  void PSATDEraseAverageFields ();
1826 
1827 # ifdef WARPX_DIM_RZ
1830 # else
1833 # endif
1834 
1835 public:
1836 
1837 # ifdef WARPX_DIM_RZ
1839 # else
1841 # endif
1842  get_spectral_solver_fp (int lev) {return *spectral_solver_fp[lev];}
1843 #endif
1844 
1845 public:
1846  FiniteDifferenceSolver * get_pointer_fdtd_solver_fp (int lev) { return m_fdtd_solver_fp[lev].get(); }
1847 
1848 private:
1851 };
1852 
1853 #endif
PatchType
Definition: WarpX.H:75
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:32
Definition: MagnetostaticSolver.H:21
This class contains a vector of all diagnostics in the simulation.
Definition: MultiDiagnostics.H:21
Definition: MultiParticleContainer.H:65
Definition: PML_RZ.H:30
Definition: PML.H:128
void FillBoundaryE()
Definition: PML.cpp:1241
void PushPSATD(int lev)
Definition: PML.cpp:1382
void FillBoundaryG()
Definition: PML.cpp:1311
void FillBoundaryB()
Definition: PML.cpp:1265
std::unique_ptr< SpectralSolver > spectral_solver_cp
Definition: PML.H:244
std::unique_ptr< SpectralSolver > spectral_solver_fp
Definition: PML.H:243
void FillBoundaryF()
Definition: PML.cpp:1289
Definition: ParticleBoundaryBuffer.H:22
Top-level class for the electromagnetic spectral solver.
Definition: SpectralSolver.H:33
Definition: SpectralSolverRZ.H:22
Definition: WarpX.H:82
std::unique_ptr< ParticleBoundaryBuffer > m_particle_boundary_buffer
particle buffer for scraped particles on the boundaries
Definition: WarpX.H:1559
static int self_fields_max_iters
Definition: WarpX.H:890
const amrex::MultiFab & getrho_fp(int lev)
Definition: WarpX.H:495
static int field_centering_nox
Order of finite centering of fields (from staggered grid to nodal grid), along x.
Definition: WarpX.H:262
amrex::Vector< std::unique_ptr< amrex::LayoutData< amrex::Real > > > costs
Definition: WarpX.H:1470
static short current_deposition_algo
Integer that corresponds to the current deposition algorithm (Esirkepov, direct, Vay)
Definition: WarpX.H:164
amrex::Vector< std::unique_ptr< amrex::MultiFab > > G_fp
Definition: WarpX.H:1340
amrex::Gpu::DeviceVector< amrex::Real > device_field_centering_stencil_coeffs_y
Definition: WarpX.H:1040
static int moving_window_dir
Definition: WarpX.H:906
amrex::Gpu::DeviceVector< amrex::Real > device_current_centering_stencil_coeffs_x
Definition: WarpX.H:1044
void InitFilter()
static bool do_dive_cleaning
Definition: WarpX.H:250
static amrex::Real zmax_plasma_to_compute_max_step
Definition: WarpX.H:320
amrex::MultiFab * get_pointer_edge_lengths(int lev, int direction) const
Definition: WarpX.H:479
amrex::MultiFab * get_pointer_Efield_fp(int lev, int direction) const
Definition: WarpX.H:462
const amrex::MultiFab & getEfield_fp(int lev, int direction)
Definition: WarpX.H:493
amrex::Vector< int > getnsubsteps() const
Definition: WarpX.H:829
static bool do_multi_J
Definition: WarpX.H:344
std::unique_ptr< MacroscopicProperties > m_macroscopic_properties
Definition: WarpX.H:1459
MultiDiagnostics & GetMultiDiags()
Definition: WarpX.H:122
bool DoPML() const
Definition: WarpX.H:505
const amrex::MultiFab & getcurrent_cp(int lev, int direction)
Definition: WarpX.H:485
static short rho_in_time
Definition: WarpX.H:212
amrex::Vector< std::unique_ptr< amrex::FabFactory< amrex::FArrayBox > > > m_field_factory
Definition: WarpX.H:1569
bool getis_synchronized() const
Definition: WarpX.H:843
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_cp
Definition: WarpX.H:1414
amrex::Vector< std::unique_ptr< amrex::MultiFab > > m_distance_to_eb
Definition: WarpX.H:1402
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_slice
Definition: WarpX.H:1547
static short psatd_solution_type
Definition: WarpX.H:207
amrex::Vector< std::unique_ptr< amrex::iMultiFab > > gather_buffer_masks
Definition: WarpX.H:1424
void updateStopTime(const amrex::Real new_stop_time)
Definition: WarpX.H:848
std::array< const amrex::MultiFab *const, 3 > get_array_Efield_aux(const int lev) const
Definition: WarpX.H:451
amrex::Vector< int > mirror_z_npoints
Definition: WarpX.H:534
static amrex::Real zmin_domain_boost_step_0
Definition: WarpX.H:327
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_slice
Definition: WarpX.H:1546
static bool do_compute_max_step_from_zmax
Definition: WarpX.H:324
static amrex::Vector< int > field_boundary_lo
Definition: WarpX.H:187
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:339
SpectralSolverRZ & get_spectral_solver_fp(int lev)
Definition: WarpX.H:1842
static int n_field_gather_buffer
Definition: WarpX.H:353
static int do_multi_J_n_depositions
Definition: WarpX.H:345
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:1408
amrex::Vector< amrex::Real > t_new
Definition: WarpX.H:1322
static bool do_single_precision_comms
perform field communications in single precision
Definition: WarpX.H:228
amrex::IntVect slice_cr_ratio
Definition: WarpX.H:1542
static amrex::Vector< ParticleBoundaryType > particle_boundary_lo
Definition: WarpX.H:197
static amrex::Vector< amrex::Real > B_external_grid
Initial magnetic field on the grid.
Definition: WarpX.H:137
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_store
Definition: WarpX.H:1405
void CheckKnownIssues()
Checks for known numerical issues involving different WarpX modules.
guardCellManager guard_cells
Definition: WarpX.H:1536
static bool do_shared_mem_charge_deposition
used shared memory algorithm for charge deposition
Definition: WarpX.H:231
static int em_solver_medium
Integer that corresponds to electromagnetic Maxwell solver (vacuum - 0, macroscopic - 1)
Definition: WarpX.H:178
MultiParticleContainer & GetPartContainer()
Definition: WarpX.H:119
static amrex::Vector< int > boost_direction
Direction of the Lorentz transform that defines the boosted frame of the simulation.
Definition: WarpX.H:316
static bool use_fdtd_nci_corr
Definition: WarpX.H:285
static bool verboncoeur_axis_correction
Definition: WarpX.H:299
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:907
static bool do_shared_mem_current_deposition
use shared memory algorithm for current deposition
Definition: WarpX.H:234
amrex::Vector< amrex::IntVect > do_pml_Hi
Definition: WarpX.H:1442
void setistep(int lev, int ii)
Definition: WarpX.H:833
amrex::MultiFab * get_pointer_vector_potential_fp(int lev, int direction) const
Definition: WarpX.H:470
static bool fft_do_time_averaging
Definition: WarpX.H:908
static short particle_pusher_algo
Integer that corresponds to the particle push algorithm (Boris, Vay, Higuera-Cary)
Definition: WarpX.H:170
amrex::Vector< std::unique_ptr< PML > > pml
Definition: WarpX.H:1443
amrex::RealVect fine_tag_lo
Definition: WarpX.H:1528
std::string restart_chkfile
Definition: WarpX.H:1514
static WarpX * m_instance
Definition: WarpX.H:1126
const amrex::MultiFab & getG_fp(int lev)
Definition: WarpX.H:498
amrex::Vector< std::unique_ptr< amrex::MultiFab > > rho_cp
Definition: WarpX.H:1413
amrex::MultiFab * get_pointer_G_fp(int lev) const
Definition: WarpX.H:468
static bool do_dynamic_scheduling
Definition: WarpX.H:332
void PostRestart()
const amrex::MultiFab & getBfield_cp(int lev, int direction)
Definition: WarpX.H:487
static std::string E_ext_grid_s
Initialization type for external electric field on the grid.
Definition: WarpX.H:142
amrex::Gpu::DeviceVector< amrex::Real > device_field_centering_stencil_coeffs_z
Definition: WarpX.H:1041
amrex::MultiFab * get_pointer_phi_fp(int lev) const
Definition: WarpX.H:469
static int self_fields_verbosity
Definition: WarpX.H:891
amrex::Real stopTime() const
Definition: WarpX.H:847
std::unique_ptr< amrex::Parser > Byfield_parser
User-defined parser to initialize y-component of the magnetic field on the grid.
Definition: WarpX.H:152
amrex::Vector< std::unique_ptr< PML_RZ > > pml_rz
Definition: WarpX.H:1445
const amrex::MultiFab & getphi_fp(int lev)
Definition: WarpX.H:496
void InitData()
static std::map< std::string, amrex::MultiFab * > multifab_map
Definition: WarpX.H:439
amrex::Gpu::DeviceVector< amrex::Real > device_field_centering_stencil_coeffs_x
Definition: WarpX.H:1039
amrex::MultiFab * get_pointer_current_fp(int lev, int direction) const
Definition: WarpX.H:464
std::unique_ptr< HybridPICModel > m_hybrid_pic_model
Definition: WarpX.H:1462
void AddExternalFields()
amrex::MultiFab * get_pointer_current_cp(int lev, int direction) const
Definition: WarpX.H:474
amrex::Vector< amrex::Real > getdt() const
Definition: WarpX.H:839
static int noz
Order of the particle shape factors (splines) along z.
Definition: WarpX.H:259
amrex::Gpu::DeviceVector< amrex::Real > device_current_centering_stencil_coeffs_z
Definition: WarpX.H:1046
amrex::Vector< amrex::Real > gett_new() const
Definition: WarpX.H:836
const amrex::MultiFab & getBfield_avg_cp(int lev, int direction)
Definition: WarpX.H:503
static int num_mirrors
Definition: WarpX.H:531
amrex::MultiFab * get_pointer_face_areas(int lev, int direction) const
Definition: WarpX.H:480
amrex::Vector< std::unique_ptr< amrex::MultiFab > > phi_fp
Definition: WarpX.H:1342
ParticleBoundaryBuffer & GetParticleBoundaryBuffer()
Definition: WarpX.H:124
void WriteUsedInputsFile() const
bool do_pml_divb_cleaning
Definition: WarpX.H:1440
amrex::Vector< int > getistep() const
Definition: WarpX.H:831
static int current_centering_noy
Order of finite centering of currents (from nodal grid to staggered grid), along y.
Definition: WarpX.H:271
amrex::Gpu::DeviceVector< amrex::Real > device_current_centering_stencil_coeffs_y
Definition: WarpX.H:1045
static bool add_external_E_field
Whether to apply the effect of an externally-defined electric field.
Definition: WarpX.H:145
amrex::MultiFab * get_pointer_Efield_aux(int lev, int direction) const
Definition: WarpX.H:459
void InitDiagnostics()
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_avg_cp
Definition: WarpX.H:1417
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:488
amrex::Vector< amrex::Real > load_balance_efficiency
Definition: WarpX.H:1485
static amrex::Real self_fields_required_precision
Definition: WarpX.H:888
static amrex::IntVect sort_bin_size
Definition: WarpX.H:336
WarpX(WarpX &&)=default
amrex::IntVect m_rho_nodal_flag
Definition: WarpX.H:364
static std::map< std::string, amrex::iMultiFab * > imultifab_map
Definition: WarpX.H:440
utils::parser::IntervalsParser load_balance_intervals
Definition: WarpX.H:1467
amrex::Vector< std::array< std::unique_ptr< amrex::iMultiFab >, 3 > > m_flag_ext_face
Definition: WarpX.H:1378
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_fp
Definition: WarpX.H:1343
amrex::IntVect getngEB() const
Definition: WarpX.H:921
utils::parser::IntervalsParser override_sync_intervals
Definition: WarpX.H:1500
std::unique_ptr< amrex::Parser > Bxfield_parser
User-defined parser to initialize x-component of the magnetic field on the grid.
Definition: WarpX.H:150
utils::parser::IntervalsParser get_load_balance_intervals() const
returns the load balance interval
Definition: WarpX.H:647
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > m_face_areas
EB: Areas of the mesh faces.
Definition: WarpX.H:1363
amrex::Real gett_old(int lev) const
Definition: WarpX.H:835
std::unique_ptr< amrex::Parser > Exfield_parser
User-defined parser to initialize x-component of the electric field on the grid.
Definition: WarpX.H:156
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_cax
Definition: WarpX.H:1422
amrex::MultiFab * get_pointer_F_cp(int lev) const
Definition: WarpX.H:476
const amrex::MultiFab & getF_fp(int lev)
Definition: WarpX.H:497
static int do_moving_window
Definition: WarpX.H:893
amrex::MultiFab * get_pointer_Efield_cp(int lev, int direction) const
Definition: WarpX.H:472
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:845
static int nox
Order of the particle shape factors (splines) along x.
Definition: WarpX.H:255
int getnsubsteps(int lev) const
Definition: WarpX.H:830
WarpX(WarpX const &)=delete
static amrex::Real quantum_xi_c2
Definition: WarpX.H:636
void InitFromScratch()
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_slice
Definition: WarpX.H:1548
amrex::Vector< std::array< std::unique_ptr< amrex::iMultiFab >, 3 > > m_flag_info_face
Definition: WarpX.H:1371
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_fp_vay
Definition: WarpX.H:1344
void updateMaxStep(const int new_max_step)
Definition: WarpX.H:846
HybridPICModel & GetHybridPICModel()
Definition: WarpX.H:121
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_cp
Definition: WarpX.H:1416
static bool serialize_initial_conditions
If true, the initial conditions from random number generators are serialized (useful for reproducible...
Definition: WarpX.H:309
const amrex::iMultiFab * getGatherBufferMasks(int lev) const
Definition: WarpX.H:1261
std::unique_ptr< amrex::Parser > Bzfield_parser
User-defined parser to initialize z-component of the magnetic field on the grid.
Definition: WarpX.H:154
amrex::Vector< std::unique_ptr< SpectralSolverRZ > > spectral_solver_fp
Definition: WarpX.H:1828
static amrex::IntVect m_fill_guards_fields
Whether to fill guard cells when computing inverse FFTs of fields.
Definition: WarpX.H:243
static short grid_type
Definition: WarpX.H:361
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > vector_potential_grad_buf_b_stag
Definition: WarpX.H:1354
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_aux
Definition: WarpX.H:1335
const amrex::MultiFab & getEfield_cp(int lev, int direction)
Definition: WarpX.H:486
static int current_centering_nox
Order of finite centering of currents (from nodal grid to staggered grid), along x.
Definition: WarpX.H:269
amrex::MultiFab * get_pointer_Bfield_aux(int lev, int direction) const
Definition: WarpX.H:460
static bool use_filter_compensation
If true, a compensation step is added to the bilinear filtering of charge and currents.
Definition: WarpX.H:306
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > vector_potential_grad_buf_e_stag
Definition: WarpX.H:1353
amrex::Vector< std::array< std::unique_ptr< amrex::LayoutData< FaceInfoBox > >, 3 > > m_borrowing
Definition: WarpX.H:1386
static bool add_external_B_field
Whether to apply the effect of an externally-defined magnetic field.
Definition: WarpX.H:147
static short charge_deposition_algo
Integer that corresponds to the charge deposition algorithm (only standard deposition)
Definition: WarpX.H:166
amrex::Real gett_new(int lev) const
Definition: WarpX.H:837
amrex::Vector< amrex::Real > dt
Definition: WarpX.H:1324
amrex::Vector< std::unique_ptr< amrex::MultiFab > > rho_slice
Definition: WarpX.H:1545
amrex::Vector< std::unique_ptr< amrex::MultiFab > > F_cp
Definition: WarpX.H:1411
amrex::RealVect fine_tag_hi
Definition: WarpX.H:1529
amrex::IntVect get_ng_fieldgather() const
Definition: WarpX.H:926
amrex::IntVect get_ng_depos_rho() const
Definition: WarpX.H:925
static int start_moving_window_step
Definition: WarpX.H:894
amrex::Vector< int > istep
Definition: WarpX.H:1319
static int electrostatic_solver_id
Definition: WarpX.H:885
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:1053
amrex::Vector< std::unique_ptr< amrex::MultiFab > > G_slice
Definition: WarpX.H:1544
static int n_current_deposition_buffer
Definition: WarpX.H:357
amrex::Vector< std::unique_ptr< amrex::MultiFab > > F_fp
Definition: WarpX.H:1339
static amrex::Vector< int > field_boundary_hi
Definition: WarpX.H:192
int Verbose() const
Definition: WarpX.H:113
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_cax
Definition: WarpX.H:1421
amrex::Vector< std::unique_ptr< amrex::MultiFab > > charge_buf
Definition: WarpX.H:1428
std::array< const amrex::MultiFab *const, 3 > get_array_Bfield_aux(const int lev) const
Definition: WarpX.H:443
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > m_edge_lengths
EB: Lengths of the mesh edges.
Definition: WarpX.H:1361
const amrex::iMultiFab * getCurrentBufferMasks(int lev) const
Definition: WarpX.H:1258
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_avg_fp
Definition: WarpX.H:1347
amrex::Vector< int > injected_plasma_species
Definition: WarpX.H:1454
static bool do_device_synchronize
Definition: WarpX.H:347
static bool use_kspace_filter
If true, the bilinear filtering of charge and currents is done in Fourier space.
Definition: WarpX.H:304
amrex::MultiFab * get_pointer_F_fp(int lev) const
Definition: WarpX.H:467
void InitNCICorrector()
int getistep(int lev) const
Definition: WarpX.H:832
std::unique_ptr< MultiDiagnostics > multi_diags
Definition: WarpX.H:1328
std::unique_ptr< amrex::Parser > Ezfield_parser
User-defined parser to initialize z-component of the electric field on the grid.
Definition: WarpX.H:160
static int noy
Order of the particle shape factors (splines) along y.
Definition: WarpX.H:257
void EvolveEM(int numsteps)
amrex::Vector< int > nsubsteps
Definition: WarpX.H:1320
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:266
void sett_new(int lev, amrex::Real time)
Definition: WarpX.H:838
amrex::IntVect getngF() const
Definition: WarpX.H:922
static amrex::Real beta_boost
Beta value corresponding to the Lorentz factor of the boosted frame of the simulation.
Definition: WarpX.H:314
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_fp_external
Definition: WarpX.H:1357
amrex::MultiFab * get_pointer_G_cp(int lev) const
Definition: WarpX.H:477
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:252
std::unique_ptr< MultiParticleContainer > mypc
Definition: WarpX.H:1327
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_buf
Definition: WarpX.H:1427
static bool use_filter
If true, a bilinear filter is used to smooth charge and currents.
Definition: WarpX.H:302
amrex::MultiFab * get_pointer_rho_fp(int lev) const
Definition: WarpX.H:466
static amrex::IntVect m_fill_guards_current
Whether to fill guard cells when computing inverse FFTs of currents.
Definition: WarpX.H:246
MacroscopicProperties & GetMacroscopicProperties()
Definition: WarpX.H:120
MagnetostaticSolver::VectorPoissonBoundaryHandler m_vector_poisson_boundary_handler
Definition: WarpX.H:962
const amrex::MultiFab & getG_cp(int lev)
Definition: WarpX.H:490
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > vector_potential_fp_nodal
Definition: WarpX.H:1352
ElectrostaticSolver::PoissonBoundaryHandler m_poisson_boundary_handler
Definition: WarpX.H:937
static amrex::IntVect shared_tilesize
tileSize to use for shared current deposition operations
Definition: WarpX.H:240
static int do_similar_dm_pml
Definition: WarpX.H:1438
amrex::Vector< std::unique_ptr< FiniteDifferenceSolver > > m_fdtd_solver_fp
Definition: WarpX.H:1849
amrex::Vector< amrex::Real > gett_old() const
Definition: WarpX.H:834
static int current_centering_noz
Order of finite centering of currents (from nodal grid to staggered grid), along z.
Definition: WarpX.H:273
static bool safe_guard_cells
Definition: WarpX.H:348
amrex::IntVect getngUpdateAux() const
Definition: WarpX.H:923
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_cp
Definition: WarpX.H:1415
amrex::Vector< std::unique_ptr< amrex::MultiFab > > rho_fp
Definition: WarpX.H:1341
amrex::MultiFab * get_pointer_rho_cp(int lev) const
Definition: WarpX.H:475
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_fp
Definition: WarpX.H:1346
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > ECTRhofield
Definition: WarpX.H:1395
amrex::Vector< amrex::Real > t_old
Definition: WarpX.H:1323
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:341
static bool refine_plasma
Definition: WarpX.H:333
amrex::FabFactory< amrex::FArrayBox > const & fieldFactory(int lev) const noexcept
Definition: WarpX.H:1571
static int macroscopic_solver_algo
Definition: WarpX.H:182
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_aux
Definition: WarpX.H:1336
static int ncomps
Definition: WarpX.H:281
static int moving_window_active(int const step)
Definition: WarpX.H:901
static bool galerkin_interpolation
Definition: WarpX.H:295
amrex::Vector< std::unique_ptr< NCIGodfreyFilter > > nci_godfrey_filter_bxbyez
Definition: WarpX.H:523
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > m_area_mod
Definition: WarpX.H:1382
static amrex::IntVect filter_npass_each_dir
Definition: WarpX.H:520
amrex::IntVect get_numprocs() const
Definition: WarpX.H:935
const amrex::MultiFab & getBfield_fp(int lev, int direction)
Definition: WarpX.H:494
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Venl
Definition: WarpX.H:1399
static short electromagnetic_solver_id
Integer that corresponds to the type of Maxwell solver (Yee, CKC, PSATD, ECT)
Definition: WarpX.H:172
void InitPML()
amrex::Real v_particle_pml
Definition: WarpX.H:1447
amrex::IntVect get_ng_depos_J() const
Definition: WarpX.H:924
BilinearFilter bilinear_filter
Definition: WarpX.H:521
amrex::MultiFab * get_pointer_current_fp_nodal(int lev, int direction) const
Definition: WarpX.H:465
const amrex::MultiFab & getEfield_avg_fp(int lev, int direction)
Definition: WarpX.H:500
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_avg_fp
Definition: WarpX.H:1348
const amrex::MultiFab & getBfield_avg_fp(int lev, int direction)
Definition: WarpX.H:501
static int field_centering_noy
Order of finite centering of fields (from staggered grid to nodal grid), along y.
Definition: WarpX.H:264
amrex::Real getdt(int lev) const
Definition: WarpX.H:840
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_fp_external
Definition: WarpX.H:1358
const amrex::MultiFab & getEfield_avg_cp(int lev, int direction)
Definition: WarpX.H:502
amrex::Vector< std::unique_ptr< NCIGodfreyFilter > > nci_godfrey_filter_exeybz
Definition: WarpX.H:522
static bool do_current_centering
Definition: WarpX.H:217
amrex::Vector< amrex::Real > mirror_z
Definition: WarpX.H:532
amrex::Vector< std::unique_ptr< amrex::MultiFab > > F_slice
Definition: WarpX.H:1543
int getdo_moving_window() const
Definition: WarpX.H:841
static bool do_subcycling
Definition: WarpX.H:343
static int n_rz_azimuthal_modes
Number of modes for the RZ multi-mode version.
Definition: WarpX.H:276
static short J_in_time
Definition: WarpX.H:211
static amrex::Real gamma_boost
Lorentz factor of the boosted frame in which a boosted-frame simulation is run.
Definition: WarpX.H:312
static short field_gathering_algo
Integer that corresponds to the field gathering algorithm (energy-conserving, momentum-conserving)
Definition: WarpX.H:168
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_avg_cp
Definition: WarpX.H:1418
static int shared_mem_current_tpb
number of threads to use per block in shared deposition
Definition: WarpX.H:237
static short load_balance_costs_update_algo
Definition: WarpX.H:176
amrex::MultiFab * get_pointer_Bfield_fp(int lev, int direction) const
Definition: WarpX.H:463
amrex::Vector< std::unique_ptr< FiniteDifferenceSolver > > m_fdtd_solver_cp
Definition: WarpX.H:1850
void computeMaxStepBoostAccelerator()
amrex::Vector< amrex::Real > mirror_z_width
Definition: WarpX.H:533
const amrex::MultiFab & getcurrent_fp(int lev, int direction)
Definition: WarpX.H:492
std::unique_ptr< MultiReducedDiags > reduced_diags
object with all reduced diagnotics, similar to MultiParticleContainer for species.
Definition: WarpX.H:537
const amrex::MultiFab & getBfield(int lev, int direction)
Definition: WarpX.H:483
void PerformanceHints()
const amrex::MultiFab & getF_cp(int lev)
Definition: WarpX.H:489
amrex::Vector< std::unique_ptr< amrex::iMultiFab > > current_buffer_masks
Definition: WarpX.H:1423
void ScrapeParticles()
amrex::MultiFab * get_pointer_Bfield_cp(int lev, int direction) const
Definition: WarpX.H:473
int slice_max_grid_size
Definition: WarpX.H:1539
static std::string B_ext_grid_s
Initialization type for external magnetic field on the grid.
Definition: WarpX.H:140
amrex::Vector< std::unique_ptr< amrex::MultiFab > > G_cp
Definition: WarpX.H:1412
const amrex::MultiFab & getEfield(int lev, int direction)
Definition: WarpX.H:482
std::unique_ptr< amrex::Parser > Eyfield_parser
User-defined parser to initialize y-component of the electric field on the grid.
Definition: WarpX.H:158
static amrex::Real self_fields_absolute_tolerance
Definition: WarpX.H:889
amrex::Vector< std::unique_ptr< AcceleratorLattice > > m_accelerator_lattice
Definition: WarpX.H:1562
static amrex::Vector< ParticleBoundaryType > particle_boundary_hi
Definition: WarpX.H:202
std::optional< amrex::Real > m_const_dt
Definition: WarpX.H:1456
FiniteDifferenceSolver * get_pointer_fdtd_solver_fp(int lev)
Definition: WarpX.H:1846
amrex::RealBox slice_realbox
Definition: WarpX.H:1541
amrex::Vector< amrex::IntVect > do_pml_Lo
Definition: WarpX.H:1441
amrex::Vector< std::unique_ptr< SpectralSolverRZ > > spectral_solver_cp
Definition: WarpX.H:1829
amrex::Real getmoving_window_x() const
Definition: WarpX.H:842
static amrex::Vector< amrex::Real > E_external_grid
Initial electric field on the grid.
Definition: WarpX.H:135
bool do_pml_dive_cleaning
Definition: WarpX.H:1439
static std::string authors
Author of an input file / simulation setup.
Definition: WarpX.H:132
const PML_RZ * getPMLRZ()
Definition: WarpX.H:508
static bool compute_max_step_from_btd
If true, the code will compute max_step from the back transformed diagnostics.
Definition: WarpX.H:330
bool current_correction
If true, a correction is applied to the current in Fourier space,.
Definition: WarpX.H:221
void ComputePMLFactors()
static int end_moving_window_step
Definition: WarpX.H:895
static utils::parser::IntervalsParser sort_intervals
Definition: WarpX.H:335
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_fp
Definition: WarpX.H:1345
Definition: WarpXParticleContainer.H:104
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
direction
Definition: AnyFFT.H:75
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:440
tuple dx
lab frame
Definition: stencil.py:427
beta
Definition: stencil.py:432
float cfl
Definition: stencil.py:437
string field
Definition: video_yt.py:31
int verbosity()