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"
36 #include "Filter/BilinearFilter.H"
40 
41 #include <AMReX.H>
42 #include <AMReX_AmrCore.H>
43 #include <AMReX_Array.H>
44 #include <AMReX_Config.H>
45 #ifdef AMREX_USE_EB
46 # include <AMReX_EBFabFactory.H>
47 #endif
48 #include <AMReX_GpuContainers.H>
49 #include <AMReX_IntVect.H>
50 #include <AMReX_LayoutData.H>
51 #include <AMReX_Parser.H>
52 #include <AMReX_REAL.H>
53 #include <AMReX_RealBox.H>
54 #include <AMReX_RealVect.H>
55 #include <AMReX_Vector.H>
56 #include <AMReX_VisMF.H>
57 
58 #include <AMReX_BaseFwd.H>
59 #include <AMReX_AmrCoreFwd.H>
60 
61 #include <array>
62 #include <iostream>
63 #include <limits>
64 #include <memory>
65 #include <optional>
66 #include <string>
67 #include <vector>
68 
69 enum struct PatchType : int
70 {
71  fine,
72  coarse
73 };
74 
75 class WarpX
76  : public amrex::AmrCore
77 {
78 public:
79 
80  friend class PML;
81 
82  static WarpX& GetInstance ();
83  static void ResetInstance ();
84 
85  WarpX ();
86  ~WarpX ();
87 
88  static std::string Version ();
89  static std::string PicsarVersion ();
90 
91  int Verbose () const { return verbose; }
92 
93  void InitData ();
94 
95  void Evolve (int numsteps = -1);
96 
98  MacroscopicProperties& GetMacroscopicProperties () { return *m_macroscopic_properties; }
99 
100  ParticleBoundaryBuffer& GetParticleBoundaryBuffer () { return *m_particle_boundary_buffer; }
101 
102  static void shiftMF (amrex::MultiFab& mf, const amrex::Geometry& geom,
103  int num_shift, int dir, const int lev, bool update_cost_flag,
104  amrex::Real external_field=0.0, bool useparser = false,
105  amrex::ParserExecutor<3> const& field_parser={});
106 
107  static void GotoNextLine (std::istream& is);
108 
110  static std::string authors;
111 
116 
118  static std::string B_ext_grid_s;
120  static std::string E_ext_grid_s;
121 
123  static std::string str_Bx_ext_grid_function;
125  static std::string str_By_ext_grid_function;
127  static std::string str_Bz_ext_grid_function;
129  static std::string str_Ex_ext_grid_function;
131  static std::string str_Ey_ext_grid_function;
133  static std::string str_Ez_ext_grid_function;
134 
136  std::unique_ptr<amrex::Parser> Bxfield_parser;
138  std::unique_ptr<amrex::Parser> Byfield_parser;
140  std::unique_ptr<amrex::Parser> Bzfield_parser;
142  std::unique_ptr<amrex::Parser> Exfield_parser;
144  std::unique_ptr<amrex::Parser> Eyfield_parser;
146  std::unique_ptr<amrex::Parser> Ezfield_parser;
147 
148  // Algorithms
154  static short field_gathering_algo;
156  static short particle_pusher_algo;
158  static short maxwell_solver_id;
164  static int em_solver_medium;
189 
192  static short J_in_time;
193  static short rho_in_time;
194 
198  static bool do_current_centering;
199 
201  // to satisfy the continuity equation and charge conservation
203 
206  bool update_with_rho = false;
207 
210 
213 
216 
219  static bool do_dive_cleaning;
221  static bool do_divb_cleaning;
222 
224  static int nox;
226  static int noy;
228  static int noz;
229 
236 
243 
250  static int ncomps;
251 
254  static bool use_fdtd_nci_corr;
265 
267  static bool use_filter;
269  static bool use_kspace_filter;
272 
275 
280  static std::string lab_data_directory;
282  static int num_snapshots_lab;
284  static amrex::Real dt_snapshots_lab;
291 
293  static amrex::Real gamma_boost;
295  static amrex::Real beta_boost;
306 
308  static bool refine_plasma;
309 
312 
313  static bool do_subcycling;
314  static bool do_multi_J;
316 
318  static bool safe_guard_cells;
319 
328 
330  static bool do_nodal;
331 
332  // Global rho nodal flag to know about rho index type when rho MultiFab is not allocated
334 
335  std::array<const amrex::MultiFab* const, 3>
336  get_array_Bfield_aux (const int lev) const {
337  return {
338  Bfield_aux[lev][0].get(),
339  Bfield_aux[lev][1].get(),
340  Bfield_aux[lev][2].get()
341  };
342  }
343  std::array<const amrex::MultiFab* const, 3>
344  get_array_Efield_aux (const int lev) const {
345  return {
346  Efield_aux[lev][0].get(),
347  Efield_aux[lev][1].get(),
348  Efield_aux[lev][2].get()
349  };
350  }
351 
352  amrex::MultiFab * get_pointer_Efield_aux (int lev, int direction) const { return Efield_aux[lev][direction].get(); }
353  amrex::MultiFab * get_pointer_Bfield_aux (int lev, int direction) const { return Bfield_aux[lev][direction].get(); }
354 
355  amrex::MultiFab * get_pointer_Efield_fp (int lev, int direction) const { return Efield_fp[lev][direction].get(); }
356  amrex::MultiFab * get_pointer_Bfield_fp (int lev, int direction) const { return Bfield_fp[lev][direction].get(); }
357  amrex::MultiFab * get_pointer_current_fp (int lev, int direction) const { return current_fp[lev][direction].get(); }
358  amrex::MultiFab * get_pointer_rho_fp (int lev) const { return rho_fp[lev].get(); }
359  amrex::MultiFab * get_pointer_F_fp (int lev) const { return F_fp[lev].get(); }
360  amrex::MultiFab * get_pointer_G_fp (int lev) const { return G_fp[lev].get(); }
361  amrex::MultiFab * get_pointer_phi_fp (int lev) const { return phi_fp[lev].get(); }
362 
363  amrex::MultiFab * get_pointer_Efield_cp (int lev, int direction) const { return Efield_cp[lev][direction].get(); }
364  amrex::MultiFab * get_pointer_Bfield_cp (int lev, int direction) const { return Bfield_cp[lev][direction].get(); }
365  amrex::MultiFab * get_pointer_current_cp (int lev, int direction) const { return current_cp[lev][direction].get(); }
366  amrex::MultiFab * get_pointer_rho_cp (int lev) const { return rho_cp[lev].get(); }
367  amrex::MultiFab * get_pointer_F_cp (int lev) const { return F_cp[lev].get(); }
368  amrex::MultiFab * get_pointer_G_cp (int lev) const { return G_cp[lev].get(); }
369 
370  amrex::MultiFab * get_pointer_edge_lengths (int lev, int direction) const { return m_edge_lengths[lev][direction].get(); }
371  amrex::MultiFab * get_pointer_face_areas (int lev, int direction) const { return m_face_areas[lev][direction].get(); }
372 
373  const amrex::MultiFab& getEfield (int lev, int direction) {return *Efield_aux[lev][direction];}
374  const amrex::MultiFab& getBfield (int lev, int direction) {return *Bfield_aux[lev][direction];}
375 
376  const amrex::MultiFab& getcurrent_cp (int lev, int direction) {return *current_cp[lev][direction];}
377  const amrex::MultiFab& getEfield_cp (int lev, int direction) {return *Efield_cp[lev][direction];}
378  const amrex::MultiFab& getBfield_cp (int lev, int direction) {return *Bfield_cp[lev][direction];}
379  const amrex::MultiFab& getrho_cp (int lev) {return *rho_cp[lev];}
380  const amrex::MultiFab& getF_cp (int lev) {return *F_cp[lev];}
381  const amrex::MultiFab& getG_cp (int lev) {return *G_cp[lev];}
382 
383  const amrex::MultiFab& getcurrent_fp (int lev, int direction) {return *current_fp[lev][direction];}
384  const amrex::MultiFab& getEfield_fp (int lev, int direction) {return *Efield_fp[lev][direction];}
385  const amrex::MultiFab& getBfield_fp (int lev, int direction) {return *Bfield_fp[lev][direction];}
386  const amrex::MultiFab& getrho_fp (int lev) {return *rho_fp[lev];}
387  const amrex::MultiFab& getphi_fp (int lev) {return *phi_fp[lev];}
388  const amrex::MultiFab& getF_fp (int lev) {return *F_fp[lev];}
389  const amrex::MultiFab& getG_fp (int lev) {return *G_fp[lev];}
390 
391  const amrex::MultiFab& getEfield_avg_fp (int lev, int direction) {return *Efield_avg_fp[lev][direction];}
392  const amrex::MultiFab& getBfield_avg_fp (int lev, int direction) {return *Bfield_avg_fp[lev][direction];}
393  const amrex::MultiFab& getEfield_avg_cp (int lev, int direction) {return *Efield_avg_cp[lev][direction];}
394  const amrex::MultiFab& getBfield_avg_cp (int lev, int direction) {return *Bfield_avg_cp[lev][direction];}
395 
396  bool DoPML () const {return do_pml;}
397 
398 #if (defined WARPX_DIM_RZ) && (defined WARPX_USE_PSATD)
399  const PML_RZ* getPMLRZ() {return pml_rz[0].get();}
400 #endif
401 
403  std::vector<bool> getPMLdirections() const;
404 
405  static amrex::LayoutData<amrex::Real>* getCosts (int lev);
406 
407  void setLoadBalanceEfficiency (const int lev, const amrex::Real efficiency)
408  {
409  if (m_instance)
410  {
411  m_instance->load_balance_efficiency[lev] = efficiency;
412  } else
413  {
414  return;
415  }
416  }
417 
418  amrex::Real getLoadBalanceEfficiency (const int lev)
419  {
420  if (m_instance)
421  {
422  return m_instance->load_balance_efficiency[lev];
423  } else
424  {
425  return -1;
426  }
427  }
428 
433 
434  amrex::Real time_of_last_gal_shift = 0;
435  amrex::Vector<amrex::Real> m_v_galilean = amrex::Vector<amrex::Real>(3, amrex::Real(0.));
436  amrex::Array<amrex::Real,3> m_galilean_shift = {{0}};
437 
438  amrex::Vector<amrex::Real> m_v_comoving = amrex::Vector<amrex::Real>(3, amrex::Real(0.));
439 
440  static int num_mirrors;
444 
446  std::unique_ptr<MultiReducedDiags> reduced_diags;
447 
448  void applyMirrors(amrex::Real time);
449 
451  void ComputeDt ();
452 
454  void PrintMainPICparameters ();
455 
457  void WriteUsedInputsFile () const;
458 
460  void PrintDtDxDyDz ();
461 
467  void ComputeMaxStep ();
468  // Compute max_step automatically for simulations in a boosted frame.
469  void computeMaxStepBoostAccelerator(const amrex::Geometry& geom);
470 
475  int MoveWindow (const int step, bool move_j);
476 
482  void ShiftGalileanBoundary ();
483  void UpdatePlasmaInjectionPosition (amrex::Real dt);
484  void ResetProbDomain (const amrex::RealBox& rb);
485  void EvolveE ( amrex::Real dt);
486  void EvolveE (int lev, amrex::Real dt);
487  void EvolveB ( amrex::Real dt, DtType dt_type);
488  void EvolveB (int lev, amrex::Real dt, DtType dt_type);
489  void EvolveF ( amrex::Real dt, DtType dt_type);
490  void EvolveF (int lev, amrex::Real dt, DtType dt_type);
491  void EvolveG ( amrex::Real dt, DtType dt_type);
492  void EvolveG (int lev, amrex::Real dt, DtType dt_type);
493  void EvolveB (int lev, PatchType patch_type, amrex::Real dt, DtType dt_type);
494  void EvolveE (int lev, PatchType patch_type, amrex::Real dt);
495  void EvolveF (int lev, PatchType patch_type, amrex::Real dt, DtType dt_type);
496  void EvolveG (int lev, PatchType patch_type, amrex::Real dt, DtType dt_type);
497 
498  void MacroscopicEvolveE ( amrex::Real dt);
499  void MacroscopicEvolveE (int lev, amrex::Real dt);
500  void MacroscopicEvolveE (int lev, PatchType patch_type, amrex::Real dt);
501 
506  void Hybrid_QED_Push ( amrex::Vector<amrex::Real> dt);
507 
513  void Hybrid_QED_Push (int lev, amrex::Real dt);
514 
521  void Hybrid_QED_Push (int lev, PatchType patch_type, amrex::Real dt);
522 
523  static amrex::Real quantum_xi_c2;
524 
527  void LoadBalance ();
530  void ResetCosts ();
531 
535  {
536  return load_balance_intervals;
537  }
538 
546  void DampFieldsInGuards (const int lev,
547  const std::array<std::unique_ptr<amrex::MultiFab>,3>& Efield,
548  const std::array<std::unique_ptr<amrex::MultiFab>,3>& Bfield);
549 
557  void DampFieldsInGuards (const int lev, std::unique_ptr<amrex::MultiFab>& mf);
558 
559 #ifdef WARPX_DIM_RZ
560  void ApplyInverseVolumeScalingToCurrentDensity(amrex::MultiFab* Jx,
561  amrex::MultiFab* Jy,
562  amrex::MultiFab* Jz,
563  int lev);
564 
565  void ApplyInverseVolumeScalingToChargeDensity(amrex::MultiFab* Rho,
566  int lev);
567 #endif
568 
569  void ApplyEfieldBoundary (const int lev, PatchType patch_type);
570  void ApplyBfieldBoundary (const int lev, PatchType patch_type, DtType dt_type);
571 
572  void DampPML ();
573  void DampPML (const int lev);
574  void DampPML (const int lev, PatchType patch_type);
575  void DampPML_Cartesian (const int lev, PatchType patch_type);
576 
577  void DampJPML ();
578  void DampJPML (int lev);
579  void DampJPML (int lev, PatchType patch_type);
580 
581  void CopyJPML ();
582  bool isAnyBoundaryPML();
583 
587  void NodalSyncPML ();
588 
592  void NodalSyncPML (int lev);
593 
597  void NodalSyncPML (int lev, PatchType patch_type);
598 
599  PML* GetPML (int lev);
600 #if (defined WARPX_DIM_RZ) && (defined WARPX_USE_PSATD)
601  PML_RZ* GetPML_RZ (int lev);
602 #endif
603 
605  void doFieldIonization ();
609  void doFieldIonization (int lev);
610 
611 #ifdef WARPX_QED
612 
613  void doQEDEvents ();
617  void doQEDEvents (int lev);
618 #endif
619 
620  void PushParticlesandDepose (int lev, amrex::Real cur_time, DtType a_dt_type=DtType::Full, bool skip_current=false);
621  void PushParticlesandDepose ( amrex::Real cur_time, bool skip_current=false);
622 
623  // This function does aux(lev) = fp(lev) + I(aux(lev-1)-cp(lev)).
624  // Caller must make sure fp and cp have ghost cells filled.
625  void UpdateAuxilaryData ();
626  void UpdateAuxilaryDataStagToNodal ();
627  void UpdateAuxilaryDataSameType ();
628 
637  void UpdateCurrentNodalToStag (amrex::MultiFab& dst, amrex::MultiFab const& src);
638 
639  // Fill boundary cells including coarse/fine boundaries
640  void FillBoundaryB (amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
641  void FillBoundaryE (amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
642  void FillBoundaryB_avg (amrex::IntVect ng);
643  void FillBoundaryE_avg (amrex::IntVect ng);
644 
645  void FillBoundaryF (amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
646  void FillBoundaryG (amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
647  void FillBoundaryAux (amrex::IntVect ng);
648  void FillBoundaryE (int lev, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
649  void FillBoundaryB (int lev, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
650  void FillBoundaryE_avg (int lev, amrex::IntVect ng);
651  void FillBoundaryB_avg (int lev, amrex::IntVect ng);
652 
653  void FillBoundaryF (int lev, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
654  void FillBoundaryG (int lev, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
655  void FillBoundaryAux (int lev, amrex::IntVect ng);
656 
662  void SyncCurrentAndRho ();
663 
675  void SyncCurrent (
676  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
677  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp);
678 
679  void SyncRho ();
680 
681  amrex::Vector<int> getnsubsteps () const {return nsubsteps;}
682  int getnsubsteps (int lev) const {return nsubsteps[lev];}
683  amrex::Vector<int> getistep () const {return istep;}
684  int getistep (int lev) const {return istep[lev];}
685  void setistep (int lev, int ii) {istep[lev] = ii;}
686  amrex::Vector<amrex::Real> gett_old () const {return t_old;}
687  amrex::Real gett_old (int lev) const {return t_old[lev];}
688  amrex::Vector<amrex::Real> gett_new () const {return t_new;}
689  amrex::Real gett_new (int lev) const {return t_new[lev];}
690  void sett_new (int lev, amrex::Real time) {t_new[lev] = time;}
692  amrex::Real getdt (int lev) const {return dt[lev];}
693  int getdo_moving_window() const {return do_moving_window;}
694  amrex::Real getmoving_window_x() const {return moving_window_x;}
695  amrex::Real getcurrent_injection_position () const {return current_injection_position;}
696  bool getis_synchronized() const {return is_synchronized;}
697 
698  int maxStep () const {return max_step;}
699  amrex::Real stopTime () const {return stop_time;}
700 
701  void AverageAndPackFields( amrex::Vector<std::string>& varnames,
702  amrex::Vector<amrex::MultiFab>& mf_avg, const amrex::IntVect ngrow) const;
703 
704  void prepareFields( int const step, amrex::Vector<std::string>& varnames,
707  amrex::Vector<amrex::Geometry>& output_geom ) const;
708 
709  static std::array<amrex::Real,3> CellSize (int lev);
710  static amrex::RealBox getRealBox(const amrex::Box& bx, int lev);
711 
720  static std::array<amrex::Real,3> LowerCorner (const amrex::Box& bx, const int lev, const amrex::Real time_shift_delta);
729  static std::array<amrex::Real,3> UpperCorner (const amrex::Box& bx, const int lev, const amrex::Real time_shift_delta);
730 
731  static amrex::IntVect RefRatio (int lev);
732 
733  static const amrex::iMultiFab* CurrentBufferMasks (int lev);
734  static const amrex::iMultiFab* GatherBufferMasks (int lev);
735 
736  static int do_electrostatic;
737 
738  // Parameters for lab frame electrostatic
739  static amrex::Real self_fields_required_precision;
740  static amrex::Real self_fields_absolute_tolerance;
743 
744  static int do_moving_window; // boolean
745  static int start_moving_window_step; // the first step to move window
746  static int end_moving_window_step; // the last step to move window
752  static int moving_window_active (int const step) {
753  bool const step_before_end = (step < end_moving_window_step) || (end_moving_window_step < 0);
754  bool const step_after_start = (step >= start_moving_window_step);
755  return do_moving_window && step_before_end && step_after_start;
756  }
757  static int moving_window_dir;
758  static amrex::Real moving_window_v;
760 
761  // slice generation //
763  static amrex::Real dt_slice_snapshots_lab;
764  static amrex::Real particle_slice_width_lab;
765  amrex::RealBox getSliceRealBox() const {return slice_realbox;}
766 
767  // these should be private, but can't due to Cuda limitations
768  static void ComputeDivB (amrex::MultiFab& divB, int const dcomp,
769  const std::array<const amrex::MultiFab* const, 3>& B,
770  const std::array<amrex::Real,3>& dx);
771 
772  static void ComputeDivB (amrex::MultiFab& divB, int const dcomp,
773  const std::array<const amrex::MultiFab* const, 3>& B,
774  const std::array<amrex::Real,3>& dx, amrex::IntVect const ngrow);
775 
776  void ComputeDivE(amrex::MultiFab& divE, const int lev);
777 
778  const amrex::IntVect getngEB() const { return guard_cells.ng_alloc_EB; }
779  const amrex::IntVect getngF() const { return guard_cells.ng_alloc_F; }
780  const amrex::IntVect getngUpdateAux() const { return guard_cells.ng_UpdateAux; }
781  const amrex::IntVect get_ng_depos_J() const {return guard_cells.ng_depos_J;}
782  const amrex::IntVect get_ng_depos_rho() const {return guard_cells.ng_depos_rho;}
783  const amrex::IntVect get_ng_fieldgather () const {return guard_cells.ng_FieldGather;}
784 
792  const amrex::IntVect get_numprocs() const {return numprocs;}
793 
795  void ComputeSpaceChargeField (bool const reset_fields);
796  void AddBoundaryField ();
797  void AddSpaceChargeField (WarpXParticleContainer& pc);
798  void AddSpaceChargeFieldLabFrame ();
799  void computePhi (const amrex::Vector<std::unique_ptr<amrex::MultiFab> >& rho,
800  amrex::Vector<std::unique_ptr<amrex::MultiFab> >& phi,
801  std::array<amrex::Real, 3> const beta = {{0,0,0}},
802  amrex::Real const required_precision=amrex::Real(1.e-11),
803  amrex::Real absolute_tolerance=amrex::Real(0.0),
804  const int max_iters=200,
805  const int verbosity=2) const;
806 
807  void setPhiBC (amrex::Vector<std::unique_ptr<amrex::MultiFab> >& phi ) const;
808 
809  void computeE (amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>, 3> >& E,
810  const amrex::Vector<std::unique_ptr<amrex::MultiFab> >& phi,
811  std::array<amrex::Real, 3> const beta = {{0,0,0}} ) const;
812  void computeB (amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>, 3> >& B,
813  const amrex::Vector<std::unique_ptr<amrex::MultiFab> >& phi,
814  std::array<amrex::Real, 3> const beta = {{0,0,0}} ) const;
815  void computePhiTriDiagonal (const amrex::Vector<std::unique_ptr<amrex::MultiFab> >& rho,
816  amrex::Vector<std::unique_ptr<amrex::MultiFab> >& phi) const;
817 
838  void InitializeExternalFieldsOnGridUsingParser (
840  amrex::ParserExecutor<3> const& xfield_parser,
841  amrex::ParserExecutor<3> const& yfield_parser,
842  amrex::ParserExecutor<3> const& zfield_parser,
843  std::array< std::unique_ptr<amrex::MultiFab>, 3 > const& edge_lengths,
844  std::array< std::unique_ptr<amrex::MultiFab>, 3 > const& face_areas,
845  const char field,
846  const int lev);
847 
856  void InitializeEBGridData(int lev);
857 
863  void ComputeCostsHeuristic (amrex::Vector<std::unique_ptr<amrex::LayoutData<amrex::Real> > >& costs);
864 
865  void ApplyFilterandSumBoundaryRho (int lev, int glev, amrex::MultiFab& rho, int icomp, int ncomp);
866 
876  static amrex::Vector<amrex::Real> getFornbergStencilCoefficients(const int n_order, const bool nodal);
877 
878  // Device vectors of stencil coefficients used for finite-order centering of fields
882 
883  // Device vectors of stencil coefficients used for finite-order centering of currents
887 
888  // This needs to be public for CUDA.
890  virtual void ErrorEst (int lev, amrex::TagBoxArray& tags, amrex::Real time, int /*ngrow*/) final;
891 
892 protected:
893 
919  void InitLevelData (int lev, amrex::Real time);
920 
923  virtual void PostProcessBaseGrids (amrex::BoxArray& ba0) const final;
924 
928  virtual void MakeNewLevelFromScratch (int lev, amrex::Real time, const amrex::BoxArray& ba,
929  const amrex::DistributionMapping& dm) final;
930 
934  virtual void MakeNewLevelFromCoarse (int /*lev*/, amrex::Real /*time*/, const amrex::BoxArray& /*ba*/,
935  const amrex::DistributionMapping& /*dm*/) final;
936 
940  virtual void RemakeLevel (int lev, amrex::Real time, const amrex::BoxArray& ba,
941  const amrex::DistributionMapping& dm) final;
942 
944  virtual void ClearLevel (int lev) final;
945 
946 private:
947 
948  // Singleton is used when the code is run from python
949  static WarpX* m_instance;
950 
952  static void CheckSignals ();
954  void HandleSignals ();
955 
959  void EvolveEM(int numsteps);
960 
961  void FillBoundaryB (const int lev, const PatchType patch_type, const amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
962  void FillBoundaryE (const int lev, const PatchType patch_type, const amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
963  void FillBoundaryF (int lev, PatchType patch_type, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
964  void FillBoundaryG (int lev, PatchType patch_type, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
965 
966  void FillBoundaryB_avg (int lev, PatchType patch_type, amrex::IntVect ng);
967  void FillBoundaryE_avg (int lev, PatchType patch_type, amrex::IntVect ng);
968 
969  void OneStep_nosub (amrex::Real t);
970  void OneStep_sub1 (amrex::Real t);
971 
975  void OneStep_multiJ (const amrex::Real t);
976 
977  void RestrictCurrentFromFineToCoarsePatch (
978  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
979  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp,
980  const int lev);
981  void AddCurrentFromFineLevelandSumBoundary (
982  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
983  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp,
984  const int lev);
985  void StoreCurrent (const int lev);
986  void RestoreCurrent (const int lev);
987  void ApplyFilterJ (
988  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& current,
989  const int lev,
990  const int idim);
991  void ApplyFilterJ (
992  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& current,
993  const int lev);
994  void SumBoundaryJ (
995  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& current,
996  const int lev,
997  const int idim,
998  const amrex::Periodicity& period);
999  void SumBoundaryJ (
1000  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& current,
1001  const int lev,
1002  const amrex::Periodicity& period);
1003  void NodalSyncJ (
1004  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
1005  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp,
1006  const int lev,
1007  PatchType patch_type);
1008 
1009  void RestrictRhoFromFineToCoarsePatch (
1010  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
1011  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp,
1012  const int lev);
1013  void ApplyFilterandSumBoundaryRho (
1014  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
1015  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp,
1016  const int lev,
1017  PatchType patch_type,
1018  const int icomp,
1019  const int ncomp);
1020  void AddRhoFromFineLevelandSumBoundary (
1021  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
1022  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp,
1023  const int lev,
1024  const int icomp,
1025  const int ncomp);
1026  void NodalSyncRho (
1027  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
1028  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp,
1029  const int lev,
1030  PatchType patch_type,
1031  const int icomp,
1032  const int ncomp);
1033 
1034  void ReadParameters ();
1035 
1038  void BackwardCompatibility ();
1039 
1040  void InitFromScratch ();
1041 
1042  void AllocLevelData (int lev, const amrex::BoxArray& new_grids,
1043  const amrex::DistributionMapping& new_dmap);
1044 
1046  GetRestartDMap (const std::string& chkfile, const amrex::BoxArray& ba, int lev) const;
1047 
1048  void InitFromCheckpoint ();
1049  void PostRestart ();
1050 
1051  void InitPML ();
1052  void ComputePMLFactors ();
1053 
1054  void InitFilter ();
1055 
1056  void InitDiagnostics ();
1057 
1058  void InitNCICorrector ();
1059 
1064  void CheckGuardCells();
1065 
1070  void CheckGuardCells(amrex::MultiFab const& mf);
1071 
1075  void CheckKnownIssues();
1076 
1078  void PerformanceHints ();
1079 
1080  std::unique_ptr<amrex::MultiFab> GetCellCenteredData();
1081 
1082  void BuildBufferMasks ();
1083  void BuildBufferMasksInBox ( const amrex::Box tbx, amrex::IArrayBox &buffer_mask,
1084  const amrex::IArrayBox &guard_mask, const int ng );
1085  const amrex::iMultiFab* getCurrentBufferMasks (int lev) const {
1086  return current_buffer_masks[lev].get();
1087  }
1088  const amrex::iMultiFab* getGatherBufferMasks (int lev) const {
1089  return gather_buffer_masks[lev].get();
1090  }
1091 
1101  void ReorderFornbergCoefficients (amrex::Vector<amrex::Real>& ordered_coeffs,
1102  amrex::Vector<amrex::Real>& unordered_coeffs,
1103  const int order);
1115  void AllocateCenteringCoefficients (amrex::Gpu::DeviceVector<amrex::Real>& device_centering_stencil_coeffs_x,
1116  amrex::Gpu::DeviceVector<amrex::Real>& device_centering_stencil_coeffs_y,
1117  amrex::Gpu::DeviceVector<amrex::Real>& device_centering_stencil_coeffs_z,
1118  const int centering_nox,
1119  const int centering_noy,
1120  const int centering_noz);
1121 
1122  void AllocLevelMFs (int lev, const amrex::BoxArray& ba, const amrex::DistributionMapping& dm,
1123  const amrex::IntVect& ngEB, amrex::IntVect& ngJ,
1124  const amrex::IntVect& ngRho, const amrex::IntVect& ngF,
1125  const amrex::IntVect& ngG, const bool aux_is_nodal);
1126 #ifdef WARPX_USE_PSATD
1127 # ifdef WARPX_DIM_RZ
1128  void AllocLevelSpectralSolverRZ (amrex::Vector<std::unique_ptr<SpectralSolverRZ>>& spectral_solver,
1129  const int lev,
1130  const amrex::BoxArray& realspace_ba,
1131  const amrex::DistributionMapping& dm,
1132  const std::array<amrex::Real,3>& dx);
1133 # else
1134  void AllocLevelSpectralSolver (amrex::Vector<std::unique_ptr<SpectralSolver>>& spectral_solver,
1135  const int lev,
1136  const amrex::BoxArray& realspace_ba,
1137  const amrex::DistributionMapping& dm,
1138  const std::array<amrex::Real,3>& dx,
1139  const bool pml_flag=false);
1140 # endif
1141 #endif
1142 
1143  amrex::Vector<int> istep; // which step?
1144  amrex::Vector<int> nsubsteps; // how many substeps on each level?
1145 
1149 
1150  // Particle container
1151  std::unique_ptr<MultiParticleContainer> mypc;
1152  std::unique_ptr<MultiDiagnostics> multi_diags;
1153 
1154  // Boosted Frame Diagnostics
1155  std::unique_ptr<BackTransformedDiagnostic> myBFD;
1156 
1157  //
1158  // Fields: First array for level, second for direction
1159  //
1160 
1161  // Full solution
1164 
1165  // Fine patch
1176 
1181 
1204 
1217 
1218  //EB level set
1220 
1221  // store fine patch
1223 
1224  // Nodal MultiFab for nodal current deposition if warpx.do_current_centering = 1
1226 
1227  // Coarse patch
1236 
1237  // Copy of the coarse aux
1242 
1243  // If charge/current deposition buffers are used
1246 
1247  // PML
1248  int do_pml = 0;
1249  int do_silver_mueller = 0;
1250  int pml_ncell = 10;
1251  int pml_delta = 10;
1252  int pml_has_particles = 0;
1253  int do_pml_j_damping = 0;
1254  int do_pml_in_domain = 0;
1255  static int do_similar_dm_pml;
1256  bool do_pml_dive_cleaning; // default set in WarpX.cpp
1257  bool do_pml_divb_cleaning; // default set in WarpX.cpp
1261 #if (defined WARPX_DIM_RZ) && (defined WARPX_USE_PSATD)
1263 #endif
1264  amrex::Real v_particle_pml;
1265 
1266  amrex::Real moving_window_x = std::numeric_limits<amrex::Real>::max();
1267  amrex::Real current_injection_position = 0;
1268 
1269  // Plasma injection parameters
1270  int warpx_do_continuous_injection = 0;
1271  int num_injected_species = -1;
1273 
1274  amrex::Real const_dt = amrex::Real(0.5e-11);
1275 
1276  // Macroscopic properties
1277  std::unique_ptr<MacroscopicProperties> m_macroscopic_properties;
1278 
1279  // Load balancing
1287  int load_balance_with_sfc = 0;
1292  amrex::Real load_balance_knapsack_factor = amrex::Real(1.24);
1298  amrex::Real load_balance_efficiency_ratio_threshold = amrex::Real(1.1);
1306  amrex::Real costs_heuristic_cells_wt = amrex::Real(0);
1312  amrex::Real costs_heuristic_particles_wt = amrex::Real(0);
1313 
1314  // Determines timesteps for override sync
1316 
1317  // Other runtime parameters
1318  int verbose = 1;
1319 
1320  bool use_hybrid_QED = 0;
1321 
1322  int max_step = std::numeric_limits<int>::max();
1323  amrex::Real stop_time = std::numeric_limits<amrex::Real>::max();
1324 
1325  int regrid_int = -1;
1326 
1327  amrex::Real cfl = amrex::Real(0.999);
1328 
1329  std::string restart_chkfile;
1330 
1333 
1334  bool use_single_read = true;
1335  bool use_single_write = true;
1336  int mffile_nstreams = 4;
1337  int field_io_nfiles = 1024;
1338  int particle_io_nfiles = 1024;
1339 
1342 
1343  bool is_synchronized = true;
1344 
1345  // Synchronization of nodal points
1346  const bool sync_nodal_points = true;
1347 
1349 
1350  //Slice Parameters
1352  int slice_plot_int = -1;
1361 
1362  bool fft_periodic_single_box = false;
1363  int nox_fft = 16;
1364  int noy_fft = 16;
1365  int noz_fft = 16;
1366 
1368  amrex::IntVect numprocs{0};
1369 
1371  std::unique_ptr<ParticleBoundaryBuffer> m_particle_boundary_buffer;
1372 
1373  //
1374  // Embedded Boundary
1375  //
1376 
1377  // Factory for field data
1379 
1380  amrex::FabFactory<amrex::FArrayBox> const& fieldFactory (int lev) const noexcept {
1381  return *m_field_factory[lev];
1382  }
1383 #ifdef AMREX_USE_EB
1384  amrex::EBFArrayBoxFactory const& fieldEBFactory (int lev) const noexcept {
1385  return static_cast<amrex::EBFArrayBoxFactory const&>(*m_field_factory[lev]);
1386  }
1387 #endif
1388 
1389 public:
1390  void InitEB ();
1396 public:
1397 #ifdef AMREX_USE_EB
1398  static void ComputeEdgeLengths (std::array< std::unique_ptr<amrex::MultiFab>, 3 >& edge_lengths,
1399  const amrex::EBFArrayBoxFactory& eb_fact);
1404  static void ComputeFaceAreas (std::array< std::unique_ptr<amrex::MultiFab>, 3 >& face_areas,
1405  const amrex::EBFArrayBoxFactory& eb_fact);
1406 
1410  static void ScaleEdges (std::array< std::unique_ptr<amrex::MultiFab>, 3 >& edge_lengths,
1411  const std::array<amrex::Real,3>& cell_size);
1415  static void ScaleAreas (std::array< std::unique_ptr<amrex::MultiFab>, 3 >& face_areas,
1416  const std::array<amrex::Real,3>& cell_size);
1425  void MarkCells();
1429 #endif
1430  void ComputeDistanceToEB ();
1434  amrex::Array1D<int, 0, 2> CountExtFaces();
1439  void ComputeFaceExtensions();
1443  void InitBorrowing();
1447  void ShrinkBorrowing();
1451  void ComputeOneWayExtensions();
1455  void ComputeEightWaysExtensions();
1464  void ApplyBCKCorrection(const int idim);
1465 
1470  void PSATDSubtractCurrentPartialSumsAvg ();
1471 
1472 private:
1473  void ScrapeParticles ();
1474 
1475  void PushPSATD ();
1476 
1477 #ifdef WARPX_USE_PSATD
1478 
1491  void PSATDForwardTransformEB (
1492  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& E_fp,
1493  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& B_fp,
1494  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& E_cp,
1495  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& B_cp);
1496 
1510  void PSATDBackwardTransformEB (
1511  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& E_fp,
1512  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& B_fp,
1513  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& E_cp,
1514  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& B_cp);
1515 
1528  void PSATDBackwardTransformEBavg (
1529  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& E_avg_fp,
1530  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& B_avg_fp,
1531  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& E_avg_cp,
1532  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& B_avg_cp);
1533 
1545  void PSATDForwardTransformJ (
1546  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
1547  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp,
1548  const bool apply_kspace_filter=true);
1549 
1558  void PSATDBackwardTransformJ (
1559  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
1560  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp);
1561 
1573  void PSATDForwardTransformRho (
1574  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
1575  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp,
1576  const int icomp, const int dcomp, const bool apply_kspace_filter=true);
1577 
1581  void PSATDMoveRhoNewToRhoOld ();
1582 
1586  void PSATDMoveJNewToJOld ();
1587 
1591  void PSATDForwardTransformF ();
1592 
1596  void PSATDBackwardTransformF ();
1597 
1601  void PSATDForwardTransformG ();
1602 
1606  void PSATDBackwardTransformG ();
1607 
1611  void PSATDCurrentCorrection ();
1612 
1616  void PSATDVayDeposition ();
1617 
1621  void PSATDPushSpectralFields ();
1622 
1628  void PSATDScaleAverageFields (const amrex::Real scale_factor);
1629 
1633  void PSATDEraseAverageFields ();
1634 
1635 # ifdef WARPX_DIM_RZ
1638 # else
1641 # endif
1642 
1643 public:
1644 
1645 # ifdef WARPX_DIM_RZ
1647 # else
1649 # endif
1650  get_spectral_solver_fp (int lev) {return *spectral_solver_fp[lev];}
1651 #endif
1652 
1653 private:
1656 };
1657 
1658 #endif
const amrex::MultiFab & getG_cp(int lev)
Definition: WarpX.H:381
static std::string str_Bz_ext_grid_function
String storing parser function to initialize z-component of the magnetic field on the grid...
Definition: WarpX.H:127
amrex::Gpu::DeviceVector< amrex::Real > device_current_centering_stencil_coeffs_y
Definition: WarpX.H:885
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_fp
Definition: WarpX.H:1170
static bool fft_do_time_averaging
Definition: WarpX.H:759
static int moving_window_dir
Definition: WarpX.H:757
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_fp
Definition: WarpX.H:1173
amrex::Vector< std::unique_ptr< NCIGodfreyFilter > > nci_godfrey_filter_bxbyez
Definition: WarpX.H:432
amrex::Vector< amrex::Real > getdt() const
Definition: WarpX.H:691
static short rho_in_time
Definition: WarpX.H:193
amrex::Vector< int > getistep() const
Definition: WarpX.H:683
static bool do_back_transformed_diagnostics
Definition: WarpX.H:278
amrex::FabFactory< amrex::FArrayBox > const & fieldFactory(int lev) const noexcept
Definition: WarpX.H:1380
DtType
Definition: WarpXDtType.H:10
amrex::Vector< std::unique_ptr< SpectralSolverRZ > > spectral_solver_cp
Definition: WarpX.H:1637
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_avg_cp
Definition: WarpX.H:1234
static bool refine_plasma
Definition: WarpX.H:308
amrex::RealVect fine_tag_hi
Definition: WarpX.H:1341
static int do_moving_window
Definition: WarpX.H:744
bool do_pml_dive_cleaning
Definition: WarpX.H:1256
This class contains the macroscopic properties of the medium needed to evaluate macroscopic Maxwell e...
Definition: MacroscopicProperties.H:30
static bool do_back_transformed_particles
Definition: WarpX.H:290
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_avg_fp
Definition: WarpX.H:1175
amrex::Vector< amrex::IntVect > do_pml_Hi
Definition: WarpX.H:1259
amrex::IntVect m_rho_nodal_flag
Definition: WarpX.H:333
Box bx
static amrex::Vector< int > field_boundary_lo
Definition: WarpX.H:173
void PushPSATD(const int lev)
Definition: PML.cpp:1408
static amrex::Real self_fields_required_precision
Definition: WarpX.H:739
const amrex::MultiFab & getrho_fp(int lev)
Definition: WarpX.H:386
amrex::Vector< int > injected_plasma_species
Definition: WarpX.H:1272
std::unique_ptr< SpectralSolver > spectral_solver_cp
Definition: PML.H:242
static WarpX * m_instance
Definition: WarpX.H:949
static amrex::Vector< int > boost_direction
Direction of the Lorentz transform that defines the boosted frame of the simulation.
Definition: WarpX.H:297
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_store
Definition: WarpX.H:1222
amrex::Vector< std::array< std::unique_ptr< amrex::iMultiFab >, 3 > > m_flag_info_face
Definition: WarpX.H:1188
amrex::Vector< std::array< std::unique_ptr< amrex::LayoutData< FaceInfoBox > >, 3 > > m_borrowing
Definition: WarpX.H:1203
amrex::Real gett_new(int lev) const
Definition: WarpX.H:689
static int num_slice_snapshots_lab
Definition: WarpX.H:762
int maxStep() const
Definition: WarpX.H:698
void ComputePMLFactors(amrex::Real dt)
Definition: PML.cpp:1016
amrex::Vector< std::unique_ptr< amrex::MultiFab > > F_cp
Definition: WarpX.H:1228
MultiParticleContainer & GetPartContainer()
Definition: WarpX.H:97
void sett_new(int lev, amrex::Real time)
Definition: WarpX.H:690
const amrex::MultiFab & getBfield_cp(int lev, int direction)
Definition: WarpX.H:378
std::unique_ptr< amrex::Parser > Bxfield_parser
User-defined parser to initialize x-component of the magnetic field on the grid.
Definition: WarpX.H:136
Definition: ParticleBoundaryBuffer.H:19
const amrex::MultiFab & getG_fp(int lev)
Definition: WarpX.H:389
const amrex::MultiFab & getEfield_fp(int lev, int direction)
Definition: WarpX.H:384
std::unique_ptr< MultiDiagnostics > multi_diags
Definition: WarpX.H:1152
void setLoadBalanceEfficiency(const int lev, const amrex::Real efficiency)
Definition: WarpX.H:407
static int n_field_gather_buffer
Definition: WarpX.H:323
std::unique_ptr< MultiParticleContainer > mypc
Definition: WarpX.H:1151
float cfl
Definition: yt3d_mpi.py:41
static bool do_current_centering
Definition: WarpX.H:198
static int noy
Order of the particle shape factors (splines) along y.
Definition: WarpX.H:226
amrex::Vector< std::array< std::unique_ptr< amrex::iMultiFab >, 3 > > m_flag_ext_face
Definition: WarpX.H:1195
amrex::MultiFab * get_pointer_edge_lengths(int lev, int direction) const
Definition: WarpX.H:370
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_avg_cp
Definition: WarpX.H:1235
const amrex::MultiFab & getEfield(int lev, int direction)
Definition: WarpX.H:373
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_fp_nodal
Definition: WarpX.H:1225
amrex::Vector< std::unique_ptr< amrex::iMultiFab > > gather_buffer_masks
Definition: WarpX.H:1241
static short current_deposition_algo
Integer that corresponds to the current deposition algorithm (Esirkepov, direct, Vay) ...
Definition: WarpX.H:150
int dx
Definition: compute_domain.py:35
utils::parser::IntervalsParser get_load_balance_intervals() const
returns the load balance interval
Definition: WarpX.H:534
std::unique_ptr< MultiReducedDiags > reduced_diags
object with all reduced diagnotics, similar to MultiParticleContainer for species.
Definition: WarpX.H:446
std::unique_ptr< amrex::Parser > Bzfield_parser
User-defined parser to initialize z-component of the magnetic field on the grid.
Definition: WarpX.H:140
bool current_correction
If true, a correction is applied to the current in Fourier space,.
Definition: WarpX.H:202
static short charge_deposition_algo
Integer that corresponds to the charge deposition algorithm (only standard deposition) ...
Definition: WarpX.H:152
amrex::Vector< std::unique_ptr< amrex::MultiFab > > rho_cp
Definition: WarpX.H:1230
amrex::MultiFab * get_pointer_rho_fp(int lev) const
Definition: WarpX.H:358
static amrex::Real moving_window_v
Definition: WarpX.H:758
static amrex::Real dt_slice_snapshots_lab
Definition: WarpX.H:763
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_cp
Definition: WarpX.H:1233
amrex::MultiFab * get_pointer_Efield_aux(int lev, int direction) const
Definition: WarpX.H:352
void FillBoundaryE()
Definition: PML.cpp:1267
static amrex::Real dt_snapshots_lab
Time interval in lab-frame between the back-transformed snapshots.
Definition: WarpX.H:284
bool getis_synchronized() const
Definition: WarpX.H:696
SpectralSolverRZ & get_spectral_solver_fp(int lev)
Definition: WarpX.H:1650
const amrex::IntVect get_ng_depos_J() const
Definition: WarpX.H:781
amrex::MultiFab * get_pointer_Efield_cp(int lev, int direction) const
Definition: WarpX.H:363
Definition: MultiParticleContainer.H:64
bool DoPML() const
Definition: WarpX.H:396
static amrex::Real particle_slice_width_lab
Definition: WarpX.H:764
static int current_centering_nox
Order of finite centering of currents (from nodal grid to staggered grid), along x.
Definition: WarpX.H:238
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_buf
Definition: WarpX.H:1244
amrex::RealBox slice_realbox
Definition: WarpX.H:1353
amrex::Vector< std::unique_ptr< amrex::MultiFab > > charge_buf
Definition: WarpX.H:1245
static std::string lab_data_directory
Name of the back-transformed diagnostics output directory.
Definition: WarpX.H:280
static bool do_nodal
If true, all fields are evaluated on a nodal grid and all MultiFabs have a nodal index type...
Definition: WarpX.H:330
int dt
Definition: Stencil.py:468
amrex::MultiFab * get_pointer_Bfield_fp(int lev, int direction) const
Definition: WarpX.H:356
amrex::Vector< std::unique_ptr< amrex::LayoutData< amrex::Real > > > costs
Definition: WarpX.H:1285
const amrex::MultiFab & getF_fp(int lev)
Definition: WarpX.H:388
static int em_solver_medium
Integer that corresponds to electromagnetic Maxwell solver (vaccum - 0, macroscopic - 1) ...
Definition: WarpX.H:164
const amrex::MultiFab & getrho_cp(int lev)
Definition: WarpX.H:379
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > m_area_mod
Definition: WarpX.H:1199
static bool do_device_synchronize
Definition: WarpX.H:317
static std::string str_Ez_ext_grid_function
String storing parser function to initialize z-component of the electric field on the grid...
Definition: WarpX.H:133
amrex::Vector< int > istep
Definition: WarpX.H:1143
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_aux
Definition: WarpX.H:1162
amrex::MultiFab * get_pointer_rho_cp(int lev) const
Definition: WarpX.H:366
std::unique_ptr< amrex::Parser > Byfield_parser
User-defined parser to initialize y-component of the magnetic field on the grid.
Definition: WarpX.H:138
static int num_mirrors
Definition: WarpX.H:440
amrex::Vector< std::unique_ptr< amrex::iMultiFab > > current_buffer_masks
Definition: WarpX.H:1240
int verbose
static amrex::Vector< ParticleBoundaryType > particle_boundary_hi
Definition: WarpX.H:188
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_avg_fp
Definition: WarpX.H:1174
static int do_electrostatic
Definition: WarpX.H:736
Definition: ElectrostaticSolver.H:35
amrex::MultiFab * get_pointer_face_areas(int lev, int direction) const
Definition: WarpX.H:371
static short maxwell_solver_id
Integer that corresponds to the type of Maxwell solver (Yee, CKC, PSATD, ECT)
Definition: WarpX.H:158
const amrex::iMultiFab * getGatherBufferMasks(int lev) const
Definition: WarpX.H:1088
amrex::Vector< std::unique_ptr< amrex::MultiFab > > F_fp
Definition: WarpX.H:1166
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_slice
Definition: WarpX.H:1360
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_fp_vay
Definition: WarpX.H:1171
amrex::Vector< int > mirror_z_npoints
Definition: WarpX.H:443
void FillBoundaryF()
Definition: PML.cpp:1315
amrex::Vector< amrex::Real > gett_old() const
Definition: WarpX.H:686
amrex::Real getdt(int lev) const
Definition: WarpX.H:692
amrex::Real getLoadBalanceEfficiency(const int lev)
Definition: WarpX.H:418
static int do_multi_J_n_depositions
Definition: WarpX.H:315
direction
Definition: AnyFFT.H:74
BilinearFilter bilinear_filter
Definition: WarpX.H:430
static int n_current_deposition_buffer
Definition: WarpX.H:327
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_cp
Definition: WarpX.H:1231
amrex::Vector< std::unique_ptr< amrex::MultiFab > > m_distance_to_eb
Definition: WarpX.H:1219
static bool use_fdtd_nci_corr
Definition: WarpX.H:254
static int start_moving_window_step
Definition: WarpX.H:745
const FArrayBox & get(const MFIter &mfi) const noexcept
std::string Version()
static int moving_window_active(int const step)
Definition: WarpX.H:752
static amrex::Real gamma_boost
Lorentz factor of the boosted frame in which a boosted-frame simulation is run.
Definition: WarpX.H:293
cell_size
Definition: compute_domain.py:37
amrex::Vector< amrex::Real > t_new
Definition: WarpX.H:1146
void computePhi(amrex::Vector< amrex::MultiFab *> const &rho, amrex::Vector< amrex::MultiFab *> &phi, std::array< amrex::Real, 3 > const beta, amrex::Real const relative_tolerance, amrex::Real absolute_tolerance, int const max_iters, int const verbosity, amrex::Vector< amrex::Geometry > const geom, amrex::Vector< amrex::DistributionMapping > const dmap, amrex::Vector< amrex::BoxArray > const grids, T_BoundaryHandler const boundary_handler, bool const do_single_precision_comms=false, std::optional< amrex::Vector< amrex::IntVect > > rel_ref_ratio=std::nullopt, [[maybe_unused]] T_PostPhiCalculationFunctor post_phi_calculation=std::nullopt, [[maybe_unused]] std::optional< amrex::Real const > current_time=std::nullopt, [[maybe_unused]] std::optional< amrex::Vector< T_FArrayBoxFactory const *> > eb_farray_box_factory=std::nullopt)
Definition: PoissonSolver.H:133
amrex::MultiFab * get_pointer_phi_fp(int lev) const
Definition: WarpX.H:361
amrex::Vector< std::unique_ptr< amrex::MultiFab > > G_slice
Definition: WarpX.H:1356
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_slice
Definition: WarpX.H:1359
static utils::parser::IntervalsParser sort_intervals
Definition: WarpX.H:310
int getnsubsteps(int lev) const
Definition: WarpX.H:682
utils::parser::IntervalsParser load_balance_intervals
Definition: WarpX.H:1282
static amrex::Vector< amrex::Real > E_external_grid
Initial electric field on the grid.
Definition: WarpX.H:113
amrex::Vector< amrex::IntVect > do_pml_Lo
Definition: WarpX.H:1258
void FillBoundaryG()
Definition: PML.cpp:1337
amrex::Vector< std::unique_ptr< amrex::MultiFab > > G_cp
Definition: WarpX.H:1229
Definition: PML.H:125
std::array< const amrex::MultiFab *const, 3 > get_array_Efield_aux(const int lev) const
Definition: WarpX.H:344
static amrex::Real beta_boost
Beta value corresponding to the Lorentz factor of the boosted frame of the simulation.
Definition: WarpX.H:295
static bool do_dive_cleaning
Definition: WarpX.H:219
amrex::Vector< amrex::Real > dt
Definition: WarpX.H:1148
std::unique_ptr< amrex::Parser > Exfield_parser
User-defined parser to initialize x-component of the electric field on the grid.
Definition: WarpX.H:142
static bool do_multi_J
Definition: WarpX.H:314
std::array< const amrex::MultiFab *const, 3 > get_array_Bfield_aux(const int lev) const
Definition: WarpX.H:336
amrex::MultiFab * get_pointer_G_fp(int lev) const
Definition: WarpX.H:360
static int field_centering_noz
Order of finite centering of fields (from staggered grid to nodal grid), along z. ...
Definition: WarpX.H:235
amrex::Real stopTime() const
Definition: WarpX.H:699
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:101
static bool do_back_transformed_fields
Definition: WarpX.H:287
const amrex::MultiFab & getBfield_avg_cp(int lev, int direction)
Definition: WarpX.H:394
static std::string E_ext_grid_s
Initialization type for external electric field on the grid.
Definition: WarpX.H:120
amrex::Vector< std::unique_ptr< SpectralSolverRZ > > spectral_solver_fp
Definition: WarpX.H:1636
const amrex::IntVect get_ng_depos_rho() const
Definition: WarpX.H:782
static bool use_filter
If true, a bilinear filter is used to smooth charge and currents.
Definition: WarpX.H:267
int getdo_moving_window() const
Definition: WarpX.H:693
amrex::Gpu::DeviceVector< amrex::Real > device_field_centering_stencil_coeffs_y
Definition: WarpX.H:880
amrex::Vector< amrex::Real > load_balance_efficiency
Definition: WarpX.H:1300
ii
Definition: check_interp_points_and_weights.py:147
Definition: BilinearFilter.H:16
amrex::Vector< std::unique_ptr< PML > > pml
Definition: WarpX.H:1260
static amrex::Real zmax_plasma_to_compute_max_step
Definition: WarpX.H:301
amrex::Gpu::DeviceVector< amrex::Real > device_field_centering_stencil_coeffs_x
Definition: WarpX.H:879
amrex::Vector< std::unique_ptr< amrex::MultiFab > > phi_fp
Definition: WarpX.H:1169
const amrex::MultiFab & getBfield_fp(int lev, int direction)
Definition: WarpX.H:385
amrex::MultiFab * get_pointer_Bfield_cp(int lev, int direction) const
Definition: WarpX.H:364
amrex::MultiFab * get_pointer_G_cp(int lev) const
Definition: WarpX.H:368
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > m_edge_lengths
EB: Lengths of the mesh edges.
Definition: WarpX.H:1178
Definition: WarpX.H:75
amrex::MultiFab * get_pointer_current_fp(int lev, int direction) const
Definition: WarpX.H:357
const amrex::MultiFab & getEfield_avg_cp(int lev, int direction)
Definition: WarpX.H:393
static int self_fields_verbosity
Definition: WarpX.H:742
static int field_centering_noy
Order of finite centering of fields (from staggered grid to nodal grid), along y. ...
Definition: WarpX.H:233
const amrex::MultiFab & getBfield(int lev, int direction)
Definition: WarpX.H:374
const amrex::IntVect get_numprocs() const
Definition: WarpX.H:792
std::unique_ptr< MacroscopicProperties > m_macroscopic_properties
Definition: WarpX.H:1277
static amrex::Real quantum_xi_c2
Definition: WarpX.H:523
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_cp
Definition: WarpX.H:1232
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > m_face_areas
EB: Areas of the mesh faces.
Definition: WarpX.H:1180
const amrex::IntVect getngUpdateAux() const
Definition: WarpX.H:780
amrex::RealVect fine_tag_lo
Definition: WarpX.H:1340
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_cax
Definition: WarpX.H:1238
static int n_rz_azimuthal_modes
Number of modes for the RZ multi-mode version.
Definition: WarpX.H:245
static short field_gathering_algo
Integer that corresponds to the field gathering algorithm (energy-conserving, momentum-conserving) ...
Definition: WarpX.H:154
void FillBoundaryB()
Definition: PML.cpp:1291
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_slice
Definition: WarpX.H:1358
ParticleBoundaryBuffer & GetParticleBoundaryBuffer()
Definition: WarpX.H:100
const amrex::IntVect getngF() const
Definition: WarpX.H:779
static bool do_compute_max_step_from_zmax
Definition: WarpX.H:305
static std::string str_Bx_ext_grid_function
String storing parser function to initialize x-component of the magnetic field on the grid...
Definition: WarpX.H:123
amrex::RealBox getSliceRealBox() const
Definition: WarpX.H:765
const int[]
std::unique_ptr< ParticleBoundaryBuffer > m_particle_boundary_buffer
particle buffer for scraped particles on the boundaries
Definition: WarpX.H:1371
const amrex::MultiFab & getEfield_avg_fp(int lev, int direction)
Definition: WarpX.H:391
amrex::Gpu::DeviceVector< amrex::Real > device_current_centering_stencil_coeffs_z
Definition: WarpX.H:886
static int ncomps
Definition: WarpX.H:250
int getistep(int lev) const
Definition: WarpX.H:684
bool do_pml_divb_cleaning
Definition: WarpX.H:1257
amrex::Gpu::DeviceVector< amrex::Real > device_current_centering_stencil_coeffs_x
Definition: WarpX.H:884
std::unique_ptr< amrex::Parser > Eyfield_parser
User-defined parser to initialize y-component of the electric field on the grid.
Definition: WarpX.H:144
Definition: PML_RZ.H:29
static bool use_kspace_filter
If true, the bilinear filtering of charge and currents is done in Fourier space.
Definition: WarpX.H:269
static bool use_filter_compensation
If true, a compensation step is added to the bilinear filtering of charge and currents.
Definition: WarpX.H:271
static bool do_divb_cleaning
Solve additional Maxwell equation for G in order to control errors in magnetic Gauss&#39; law...
Definition: WarpX.H:221
amrex::Vector< std::unique_ptr< NCIGodfreyFilter > > nci_godfrey_filter_exeybz
Definition: WarpX.H:431
static int num_snapshots_lab
Number of back-tranformed snapshots in the lab-frame.
Definition: WarpX.H:282
amrex::Vector< int > getnsubsteps() const
Definition: WarpX.H:681
amrex::Gpu::DeviceVector< amrex::Real > device_field_centering_stencil_coeffs_z
Definition: WarpX.H:881
const amrex::MultiFab & getF_cp(int lev)
Definition: WarpX.H:380
const amrex::IntVect get_ng_fieldgather() const
Definition: WarpX.H:783
static short load_balance_costs_update_algo
Definition: WarpX.H:162
static bool do_single_precision_comms
perform field communications in single precision
Definition: WarpX.H:209
amrex::MultiFab * get_pointer_current_cp(int lev, int direction) const
Definition: WarpX.H:365
static bool do_subcycling
Definition: WarpX.H:313
amrex::MultiFab * get_pointer_Efield_fp(int lev, int direction) const
Definition: WarpX.H:355
static amrex::IntVect m_fill_guards_fields
Whether to fill guard cells when computing inverse FFTs of fields.
Definition: WarpX.H:212
const amrex::MultiFab & getBfield_avg_fp(int lev, int direction)
Definition: WarpX.H:392
static amrex::Real self_fields_absolute_tolerance
Definition: WarpX.H:740
std::unique_ptr< SpectralSolver > spectral_solver_fp
Definition: PML.H:241
static std::string str_Ex_ext_grid_function
String storing parser function to initialize x-component of the electric field on the grid...
Definition: WarpX.H:129
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > ECTRhofield
Definition: WarpX.H:1212
amrex::Vector< amrex::Real > t_old
Definition: WarpX.H:1147
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_cax
Definition: WarpX.H:1239
amrex::Vector< std::unique_ptr< PML_RZ > > pml_rz
Definition: WarpX.H:1262
static int current_centering_noy
Order of finite centering of currents (from nodal grid to staggered grid), along y.
Definition: WarpX.H:240
amrex::Vector< int > nsubsteps
Definition: WarpX.H:1144
static int end_moving_window_step
Definition: WarpX.H:746
static amrex::IntVect filter_npass_each_dir
Definition: WarpX.H:429
static bool galerkin_interpolation
Definition: WarpX.H:264
static std::string str_Ey_ext_grid_function
String storing parser function to initialize y-component of the electric field on the grid...
Definition: WarpX.H:131
int dir
static int field_centering_nox
Order of finite centering of fields (from staggered grid to nodal grid), along x. ...
Definition: WarpX.H:231
amrex::IntVect slice_cr_ratio
Definition: WarpX.H:1354
amrex::Real getcurrent_injection_position() const
Definition: WarpX.H:695
amrex::MultiFab * get_pointer_Bfield_aux(int lev, int direction) const
Definition: WarpX.H:353
static int current_centering_noz
Order of finite centering of currents (from nodal grid to staggered grid), along z.
Definition: WarpX.H:242
static int nox
Order of the particle shape factors (splines) along x.
Definition: WarpX.H:224
static amrex::Vector< amrex::Real > B_external_grid
Initial magnetic field on the grid.
Definition: WarpX.H:115
amrex::Real getmoving_window_x() const
Definition: WarpX.H:694
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Venl
Definition: WarpX.H:1216
const amrex::MultiFab & getphi_fp(int lev)
Definition: WarpX.H:387
static bool serialize_initial_conditions
If true, the initial conditions from random number generators are serialized (useful for reproducible...
Definition: WarpX.H:274
MacroscopicProperties & GetMacroscopicProperties()
Definition: WarpX.H:98
amrex::Vector< std::unique_ptr< amrex::MultiFab > > G_fp
Definition: WarpX.H:1167
static std::string B_ext_grid_s
Initialization type for external magnetic field on the grid.
Definition: WarpX.H:118
amrex::Vector< std::unique_ptr< FiniteDifferenceSolver > > m_fdtd_solver_fp
Definition: WarpX.H:1654
static std::string str_By_ext_grid_function
String storing parser function to initialize y-component of the magnetic field on the grid...
Definition: WarpX.H:125
static amrex::Vector< ParticleBoundaryType > particle_boundary_lo
Definition: WarpX.H:183
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_aux
Definition: WarpX.H:1163
PatchType
Definition: WarpX.H:69
std::string restart_chkfile
Definition: WarpX.H:1329
int slice_max_grid_size
Definition: WarpX.H:1351
static amrex::IntVect m_fill_guards_current
Whether to fill guard cells when computing inverse FFTs of currents.
Definition: WarpX.H:215
amrex::Vector< amrex::Real > mirror_z
Definition: WarpX.H:441
int Verbose() const
Definition: WarpX.H:91
static bool do_dynamic_scheduling
Definition: WarpX.H:307
static int macroscopic_solver_algo
Definition: WarpX.H:168
utils::parser::IntervalsParser override_sync_intervals
Definition: WarpX.H:1315
ElectrostaticSolver::PoissonBoundaryHandler m_poisson_boundary_handler
Definition: WarpX.H:794
amrex::Vector< std::unique_ptr< amrex::MultiFab > > F_slice
Definition: WarpX.H:1355
static std::string authors
Author of an input file / simulation setup.
Definition: WarpX.H:110
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_fp
Definition: WarpX.H:1172
static amrex::Vector< int > field_boundary_hi
Definition: WarpX.H:178
string field
Definition: video_yt.py:31
static bool safe_guard_cells
Definition: WarpX.H:318
Definition: SpectralSolverRZ.H:21
amrex::Vector< std::unique_ptr< amrex::MultiFab > > rho_slice
Definition: WarpX.H:1357
const amrex::IntVect getngEB() const
Definition: WarpX.H:778
const PML_RZ * getPMLRZ()
Definition: WarpX.H:399
static short particle_pusher_algo
Integer that corresponds to the particle push algorithm (Boris, Vay, Higuera-Cary) ...
Definition: WarpX.H:156
const amrex::MultiFab & getcurrent_fp(int lev, int direction)
Definition: WarpX.H:383
static int self_fields_max_iters
Definition: WarpX.H:741
amrex::Vector< std::unique_ptr< FiniteDifferenceSolver > > m_fdtd_solver_cp
Definition: WarpX.H:1655
std::array< T, N > Array
amrex::Vector< std::unique_ptr< amrex::FabFactory< amrex::FArrayBox > > > m_field_factory
Definition: WarpX.H:1378
amrex::Real v_particle_pml
Definition: WarpX.H:1264
guardCellManager guard_cells
Definition: WarpX.H:1348
amrex::MultiFab * get_pointer_F_cp(int lev) const
Definition: WarpX.H:367
amrex::Real gett_old(int lev) const
Definition: WarpX.H:687
amrex::Vector< amrex::Real > mirror_z_width
Definition: WarpX.H:442
amrex::Vector< amrex::Real > gett_new() const
Definition: WarpX.H:688
std::unique_ptr< amrex::Parser > Ezfield_parser
User-defined parser to initialize z-component of the electric field on the grid.
Definition: WarpX.H:146
static int noz
Order of the particle shape factors (splines) along z.
Definition: WarpX.H:228
const amrex::MultiFab & getcurrent_cp(int lev, int direction)
Definition: WarpX.H:376
const amrex::MultiFab & getEfield_cp(int lev, int direction)
Definition: WarpX.H:377
void setistep(int lev, int ii)
Definition: WarpX.H:685
const amrex::iMultiFab * getCurrentBufferMasks(int lev) const
Definition: WarpX.H:1085
amrex::Vector< std::unique_ptr< amrex::MultiFab > > rho_fp
Definition: WarpX.H:1168
This class computes and stores the number of guard cells needed for the allocation of the MultiFabs a...
Definition: GuardCellManager.H:20
Definition: WarpXParticleContainer.H:101
static amrex::IntVect sort_bin_size
Definition: WarpX.H:311
static int do_similar_dm_pml
Definition: WarpX.H:1255
amrex::MultiFab * get_pointer_F_fp(int lev) const
Definition: WarpX.H:359
std::unique_ptr< BackTransformedDiagnostic > myBFD
Definition: WarpX.H:1155
static short J_in_time
Definition: WarpX.H:192
Top-level class for the electromagnetic spectral solver.
Definition: SpectralSolver.H:32