WarpX
WarpX.H
Go to the documentation of this file.
1 /* Copyright 2016-2020 Andrew Myers, Ann Almgren, Aurore Blelly
2  * Axel Huebl, Burlen Loring, David Grote
3  * Glenn Richardson, Junmin Gu, Luca Fedeli
4  * Mathieu Lobet, Maxence Thevenet, Michael Rowan
5  * Remi Lehe, Revathi Jambunathan, Weiqun Zhang
6  * Yinjian Zhao
7  *
8  * This file is part of WarpX.
9  *
10  * License: BSD-3-Clause-LBNL
11  */
12 #ifndef WARPX_H_
13 #define WARPX_H_
14 
29 
30 #ifdef WARPX_USE_PSATD
31 # ifdef WARPX_DIM_RZ
34 # else
36 # endif
37 #endif
39 #include "Evolve/WarpXDtType.H"
40 #include "Evolve/WarpXPushType.H"
41 #include "FieldSolver/Fields.H"
44 #include "Filter/BilinearFilter.H"
48 #include "Utils/export.H"
49 
50 #include <AMReX.H>
51 #include <AMReX_AmrCore.H>
52 #include <AMReX_Array.H>
53 #include <AMReX_Config.H>
54 #ifdef AMREX_USE_EB
55 # include <AMReX_EBFabFactory.H>
56 #endif
57 #include <AMReX_GpuContainers.H>
58 #include <AMReX_IntVect.H>
59 #include <AMReX_LayoutData.H>
60 #include <AMReX_Parser.H>
61 #include <AMReX_REAL.H>
62 #include <AMReX_RealBox.H>
63 #include <AMReX_RealVect.H>
64 #include <AMReX_Vector.H>
65 #include <AMReX_VisMF.H>
66 
67 #include <AMReX_BaseFwd.H>
68 #include <AMReX_AmrCoreFwd.H>
69 
70 #include <array>
71 #include <iostream>
72 #include <limits>
73 #include <map>
74 #include <memory>
75 #include <optional>
76 #include <string>
77 #include <vector>
78 
79 class WARPX_EXPORT WarpX
80  : public amrex::AmrCore
81 {
82 public:
83 
84  static WarpX& GetInstance ();
85 
86  static void ResetInstance ();
87 
92  static void Finalize();
93 
95  ~WarpX () override;
96 
98  WarpX ( WarpX const &) = delete;
100  WarpX& operator= ( WarpX const & ) = delete;
101 
103  WarpX ( WarpX && ) = default;
105  WarpX& operator= ( WarpX && ) = default;
106 
107  static std::string Version ();
108  static std::string PicsarVersion ();
109 
110  [[nodiscard]] int Verbose () const { return verbose; }
111 
112  void InitData ();
113 
114  void Evolve (int numsteps = -1);
115 
116  void EvolveImplicitPicardInit (int lev);
117  void SaveParticlesAtImplicitStepStart (WarpXParticleContainer& pc, int lev);
118  void FinishImplicitParticleUpdate (WarpXParticleContainer& pc, int lev);
119  void FinishImplicitFieldUpdate(amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3 > >& Efield_fp,
120  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3 > >& Efield_n);
121 
124  MacroscopicProperties& GetMacroscopicProperties () { return *m_macroscopic_properties; }
125  HybridPICModel& GetHybridPICModel () { return *m_hybrid_pic_model; }
126  [[nodiscard]] HybridPICModel * get_pointer_HybridPICModel () const { return m_hybrid_pic_model.get(); }
127  MultiDiagnostics& GetMultiDiags () {return *multi_diags;}
128 #ifdef AMREX_USE_EB
129  amrex::Vector<std::unique_ptr<amrex::MultiFab> >& GetDistanceToEB () {return m_distance_to_eb;}
130 #endif
131  ParticleBoundaryBuffer& GetParticleBoundaryBuffer () { return *m_particle_boundary_buffer; }
132 
133  static void shiftMF (amrex::MultiFab& mf, const amrex::Geometry& geom,
134  int num_shift, int dir, int lev, bool update_cost_flag,
135  amrex::Real external_field=0.0, bool useparser = false,
136  amrex::ParserExecutor<3> const& field_parser={});
137 
143  [[nodiscard]] std::string GetAuthors () const { return m_authors; }
144 
150 
151  // Algorithms
157  static short field_gathering_algo;
159  static short particle_pusher_algo;
163  static short evolve_scheme;
167  static amrex::Real picard_iteration_tolerance;
175  static int em_solver_medium;
200 
204  static short psatd_solution_type;
205 
208  static short J_in_time;
209  static short rho_in_time;
210 
214  static bool do_current_centering;
215 
217  // to satisfy the continuity equation and charge conservation
219 
222  bool update_with_rho = false;
223 
226 
229 
232 
235 
238 
241 
244 
247  static bool do_dive_cleaning;
249  static bool do_divb_cleaning;
250 
252  static int nox;
254  static int noy;
256  static int noz;
257 
264 
271 
278  static int ncomps;
279 
282  static bool use_fdtd_nci_corr;
293 
297 
299  static bool use_filter;
301  static bool use_kspace_filter;
304 
307 
309  static amrex::Real gamma_boost;
311  static amrex::Real beta_boost;
324  static amrex::Real zmin_domain_boost_step_0;
325 
328 
330  static bool refine_plasma;
331 
334 
339 
340  static bool do_subcycling;
341  static bool do_multi_J;
343 
345  static bool safe_guard_cells;
346 
355 
358  static short grid_type;
359 
360  // Global rho nodal flag to know about rho index type when rho MultiFab is not allocated
362 
378  static void AllocInitMultiFab (
379  std::unique_ptr<amrex::MultiFab>& mf,
380  const amrex::BoxArray& ba,
381  const amrex::DistributionMapping& dm,
382  int ncomp,
383  const amrex::IntVect& ngrow,
384  int level,
385  const std::string& name,
386  std::optional<const amrex::Real> initial_value = {});
387 
403  static void AllocInitMultiFab (
404  std::unique_ptr<amrex::iMultiFab>& mf,
405  const amrex::BoxArray& ba,
406  const amrex::DistributionMapping& dm,
407  int ncomp,
408  const amrex::IntVect& ngrow,
409  int level,
410  const std::string& name,
411  std::optional<const int> initial_value = {});
412 
424  static void AliasInitMultiFab (
425  std::unique_ptr<amrex::MultiFab>& mf,
426  const amrex::MultiFab& mf_to_alias,
427  int scomp,
428  int ncomp,
429  int level,
430  const std::string& name,
431  std::optional<const amrex::Real> initial_value);
432 
445  static void AllocInitMultiFabFromModel (
446  std::unique_ptr<amrex::MultiFab>& mf,
447  amrex::MultiFab& mf_model,
448  int level,
449  const std::string& name,
450  std::optional<const amrex::Real> initial_value = {});
451 
452  // Maps of all of the MultiFabs and iMultiFabs used (this can include MFs from other classes)
453  // This is a convenience for the Python interface, allowing all MultiFabs
454  // to be easily referenced from Python.
455  static std::map<std::string, amrex::MultiFab *> multifab_map;
456  static std::map<std::string, amrex::iMultiFab *> imultifab_map;
457 
468  [[nodiscard]] bool
469  isFieldInitialized (warpx::fields::FieldType field_type, int lev, int direction = 0) const;
470 
481  [[nodiscard]] amrex::MultiFab*
482  getFieldPointer (warpx::fields::FieldType field_type, int lev, int direction = 0) const;
483 
493  [[nodiscard]] std::array<const amrex::MultiFab* const, 3>
494  getFieldPointerArray (warpx::fields::FieldType field_type, int lev) const;
495 
506  [[nodiscard]] const amrex::MultiFab&
507  getField(warpx::fields::FieldType field_type, int lev, int direction = 0) const;
508 
509  [[nodiscard]] bool DoPML () const {return do_pml;}
510  [[nodiscard]] bool DoFluidSpecies () const {return do_fluid_species;}
511 
512 #if (defined WARPX_DIM_RZ) && (defined WARPX_USE_PSATD)
513  const PML_RZ* getPMLRZ() {return pml_rz[0].get();}
514 #endif
515 
517  [[nodiscard]] std::vector<bool> getPMLdirections() const;
518 
519  static amrex::LayoutData<amrex::Real>* getCosts (int lev);
520 
521  void setLoadBalanceEfficiency (int lev, amrex::Real efficiency);
522 
523  amrex::Real getLoadBalanceEfficiency (int lev);
524 
529 
530  amrex::Real time_of_last_gal_shift = 0;
531  amrex::Vector<amrex::Real> m_v_galilean = amrex::Vector<amrex::Real>(3, amrex::Real(0.));
532  amrex::Array<amrex::Real,3> m_galilean_shift = {{0}};
533 
534  amrex::Vector<amrex::Real> m_v_comoving = amrex::Vector<amrex::Real>(3, amrex::Real(0.));
535 
536  static int num_mirrors;
540 
542  std::unique_ptr<MultiReducedDiags> reduced_diags;
543 
544  void applyMirrors(amrex::Real time);
545 
547  void ComputeDt ();
548 
551 
553  void WriteUsedInputsFile () const;
554 
556  void PrintDtDxDyDz ();
557 
563  void ComputeMaxStep ();
564  // Compute max_step automatically for simulations in a boosted frame.
566 
571  int MoveWindow (int step, bool move_j);
572 
578  void ShiftGalileanBoundary ();
579 
584  void UpdateInjectionPosition (amrex::Real dt);
585 
586  void ResetProbDomain (const amrex::RealBox& rb);
587  void EvolveE ( amrex::Real dt);
588  void EvolveE (int lev, amrex::Real dt);
589  void EvolveB ( amrex::Real dt, DtType dt_type);
590  void EvolveB (int lev, amrex::Real dt, DtType dt_type);
591  void EvolveF ( amrex::Real dt, DtType dt_type);
592  void EvolveF (int lev, amrex::Real dt, DtType dt_type);
593  void EvolveG ( amrex::Real dt, DtType dt_type);
594  void EvolveG (int lev, amrex::Real dt, DtType dt_type);
595  void EvolveB (int lev, PatchType patch_type, amrex::Real dt, DtType dt_type);
596  void EvolveE (int lev, PatchType patch_type, amrex::Real dt);
597  void EvolveF (int lev, PatchType patch_type, amrex::Real dt, DtType dt_type);
598  void EvolveG (int lev, PatchType patch_type, amrex::Real dt, DtType dt_type);
599 
600  void MacroscopicEvolveE ( amrex::Real dt);
601  void MacroscopicEvolveE (int lev, amrex::Real dt);
602  void MacroscopicEvolveE (int lev, PatchType patch_type, amrex::Real dt);
603 
609  void HybridPICEvolveFields ();
610 
618  void HybridPICDepositInitialRhoAndJ ();
619 
624  void Hybrid_QED_Push ( amrex::Vector<amrex::Real> dt);
625 
631  void Hybrid_QED_Push (int lev, amrex::Real dt);
632 
639  void Hybrid_QED_Push (int lev, PatchType patch_type, amrex::Real dt);
640 
641  static amrex::Real quantum_xi_c2;
642 
645  void CheckLoadBalance (int step);
646 
649  void LoadBalance ();
650 
653  void ResetCosts ();
654 
661  void RescaleCosts (int step);
662 
666  {
667  return load_balance_intervals;
668  }
669 
677  void DampFieldsInGuards (int lev,
678  const std::array<std::unique_ptr<amrex::MultiFab>,3>& Efield,
679  const std::array<std::unique_ptr<amrex::MultiFab>,3>& Bfield);
680 
688  void DampFieldsInGuards (int lev, std::unique_ptr<amrex::MultiFab>& mf);
689 
690 #ifdef WARPX_DIM_RZ
691  void ApplyInverseVolumeScalingToCurrentDensity(amrex::MultiFab* Jx,
692  amrex::MultiFab* Jy,
693  amrex::MultiFab* Jz,
694  int lev);
695 
696  void ApplyInverseVolumeScalingToChargeDensity(amrex::MultiFab* Rho,
697  int lev);
698 #endif
699 
705  void ApplyRhofieldBoundary (int lev, amrex::MultiFab* Rho,
706  PatchType patch_type);
707 
713  void ApplyJfieldBoundary (int lev, amrex::MultiFab* Jx,
715  PatchType patch_type);
716 
717  void ApplyEfieldBoundary (int lev, PatchType patch_type);
718  void ApplyBfieldBoundary (int lev, PatchType patch_type, DtType dt_type);
719 
720 #ifdef WARPX_DIM_RZ
721  // Applies the boundary conditions that are specific to the axis when in RZ.
722  void ApplyFieldBoundaryOnAxis (amrex::MultiFab* Er, amrex::MultiFab* Et, amrex::MultiFab* Ez, int lev) const;
723 #endif
724 
733  void ApplyElectronPressureBoundary (int lev, PatchType patch_type);
734 
735  void DampPML ();
736  void DampPML (int lev);
737  void DampPML (int lev, PatchType patch_type);
738  void DampPML_Cartesian (int lev, PatchType patch_type);
739 
740  void DampJPML ();
741  void DampJPML (int lev);
742  void DampJPML (int lev, PatchType patch_type);
743 
744  void CopyJPML ();
745  bool isAnyBoundaryPML();
747  static bool isAnyParticleBoundaryThermal();
748 
749  PML* GetPML (int lev);
750 #if (defined WARPX_DIM_RZ) && (defined WARPX_USE_PSATD)
751  PML_RZ* GetPML_RZ (int lev);
752 #endif
753 
755  void doFieldIonization ();
759  void doFieldIonization (int lev);
760 
761 #ifdef WARPX_QED
763  void doQEDEvents ();
767  void doQEDEvents (int lev);
768 #endif
769 
770  void PushParticlesandDeposit (int lev, amrex::Real cur_time, DtType a_dt_type=DtType::Full, bool skip_current=false,
771  PushType push_type=PushType::Explicit);
772  void PushParticlesandDeposit (amrex::Real cur_time, bool skip_current=false,
773  PushType push_type=PushType::Explicit);
774 
775  // This function does aux(lev) = fp(lev) + I(aux(lev-1)-cp(lev)).
776  // Caller must make sure fp and cp have ghost cells filled.
777  void UpdateAuxilaryData ();
778  void UpdateAuxilaryDataStagToNodal ();
779  void UpdateAuxilaryDataSameType ();
780 
789  void UpdateCurrentNodalToStag (amrex::MultiFab& dst, amrex::MultiFab const& src);
790 
791  // Fill boundary cells including coarse/fine boundaries
792  void FillBoundaryB (amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
793  void FillBoundaryE (amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
794  void FillBoundaryB_avg (amrex::IntVect ng);
795  void FillBoundaryE_avg (amrex::IntVect ng);
796 
797  void FillBoundaryF (amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
798  void FillBoundaryG (amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
799  void FillBoundaryAux (amrex::IntVect ng);
800  void FillBoundaryE (int lev, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
801  void FillBoundaryB (int lev, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
802  void FillBoundaryE_avg (int lev, amrex::IntVect ng);
803  void FillBoundaryB_avg (int lev, amrex::IntVect ng);
804 
805  void FillBoundaryF (int lev, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
806  void FillBoundaryG (int lev, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
807  void FillBoundaryAux (int lev, amrex::IntVect ng);
808 
815  void SyncCurrentAndRho ();
816 
829  void SyncCurrent (
830  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
831  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp,
832  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_buffer);
833 
834  void SyncRho ();
835 
836  void SyncRho (
837  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
838  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp,
839  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_buffer);
840 
841  [[nodiscard]] amrex::Vector<int> getnsubsteps () const {return nsubsteps;}
842  [[nodiscard]] int getnsubsteps (int lev) const {return nsubsteps[lev];}
843  [[nodiscard]] amrex::Vector<int> getistep () const {return istep;}
844  [[nodiscard]] int getistep (int lev) const {return istep[lev];}
845  void setistep (int lev, int ii) {istep[lev] = ii;}
846  [[nodiscard]] amrex::Vector<amrex::Real> gett_old () const {return t_old;}
847  [[nodiscard]] amrex::Real gett_old (int lev) const {return t_old[lev];}
848  [[nodiscard]] amrex::Vector<amrex::Real> gett_new () const {return t_new;}
849  [[nodiscard]] amrex::Real gett_new (int lev) const {return t_new[lev];}
850  void sett_new (int lev, amrex::Real time) {t_new[lev] = time;}
851  [[nodiscard]] amrex::Vector<amrex::Real> getdt () const {return dt;}
852  [[nodiscard]] amrex::Real getdt (int lev) const {return dt.at(lev);}
853  [[nodiscard]] int getdo_moving_window() const {return do_moving_window;}
854  [[nodiscard]] amrex::Real getmoving_window_x() const {return moving_window_x;}
855  [[nodiscard]] bool getis_synchronized() const {return is_synchronized;}
856 
857  [[nodiscard]] int maxStep () const {return max_step;}
858  void updateMaxStep (const int new_max_step) {max_step = new_max_step;}
859  [[nodiscard]] amrex::Real stopTime () const {return stop_time;}
860  void updateStopTime (const amrex::Real new_stop_time) {stop_time = new_stop_time;}
861 
863  amrex::Vector<amrex::MultiFab>& mf_avg, amrex::IntVect ngrow) const;
864 
865  void prepareFields( int step, amrex::Vector<std::string>& varnames,
868  amrex::Vector<amrex::Geometry>& output_geom ) const;
869 
870  static std::array<amrex::Real,3> CellSize (int lev);
871  static amrex::RealBox getRealBox(const amrex::Box& bx, int lev);
872 
881  static std::array<amrex::Real,3> LowerCorner (const amrex::Box& bx, int lev, amrex::Real time_shift_delta);
890  static std::array<amrex::Real,3> UpperCorner (const amrex::Box& bx, int lev, amrex::Real time_shift_delta);
891 
892  static amrex::IntVect RefRatio (int lev);
893 
894  static const amrex::iMultiFab* CurrentBufferMasks (int lev);
895  static const amrex::iMultiFab* GatherBufferMasks (int lev);
896 
898  static int poisson_solver_id;
899 
900  // Parameters for lab frame electrostatic
901  static amrex::Real self_fields_required_precision;
902  static amrex::Real self_fields_absolute_tolerance;
905 
906  static int do_moving_window; // boolean
907  static int start_moving_window_step; // the first step to move window
908  static int end_moving_window_step; // the last step to move window
914  static int moving_window_active (int const step) {
915  bool const step_before_end = (step < end_moving_window_step) || (end_moving_window_step < 0);
916  bool const step_after_start = (step >= start_moving_window_step);
917  return do_moving_window && step_before_end && step_after_start;
918  }
919  static int moving_window_dir;
920  static amrex::Real moving_window_v;
922 
923  // these should be private, but can't due to Cuda limitations
924  static void ComputeDivB (amrex::MultiFab& divB, int dcomp,
925  const std::array<const amrex::MultiFab* const, 3>& B,
926  const std::array<amrex::Real,3>& dx);
927 
928  static void ComputeDivB (amrex::MultiFab& divB, int dcomp,
929  const std::array<const amrex::MultiFab* const, 3>& B,
930  const std::array<amrex::Real,3>& dx, amrex::IntVect ngrow);
931 
932  void ComputeDivE(amrex::MultiFab& divE, int lev);
933 
934  [[nodiscard]] amrex::IntVect getngEB() const { return guard_cells.ng_alloc_EB; }
935  [[nodiscard]] amrex::IntVect getngF() const { return guard_cells.ng_alloc_F; }
936  [[nodiscard]] amrex::IntVect getngUpdateAux() const { return guard_cells.ng_UpdateAux; }
937  [[nodiscard]] amrex::IntVect get_ng_depos_J() const {return guard_cells.ng_depos_J;}
938  [[nodiscard]] amrex::IntVect get_ng_depos_rho() const {return guard_cells.ng_depos_rho;}
939  [[nodiscard]] amrex::IntVect get_ng_fieldgather () const {return guard_cells.ng_FieldGather;}
940 
948  [[nodiscard]] amrex::IntVect get_numprocs() const {return numprocs;}
949 
950  bool m_boundary_potential_specified = false;
952  void ComputeSpaceChargeField (bool reset_fields);
953  void AddBoundaryField ();
954  void AddSpaceChargeField (WarpXParticleContainer& pc);
955  void AddSpaceChargeFieldLabFrame ();
956  void computePhi (const amrex::Vector<std::unique_ptr<amrex::MultiFab> >& rho,
957  amrex::Vector<std::unique_ptr<amrex::MultiFab> >& phi,
958  std::array<amrex::Real, 3> beta = {{0,0,0}},
959  amrex::Real required_precision=amrex::Real(1.e-11),
960  amrex::Real absolute_tolerance=amrex::Real(0.0),
961  int max_iters=200,
962  int verbosity=2) const;
963 
964  void setPhiBC (amrex::Vector<std::unique_ptr<amrex::MultiFab> >& phi ) const;
965 
966  void computeE (amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>, 3> >& E,
967  const amrex::Vector<std::unique_ptr<amrex::MultiFab> >& phi,
968  std::array<amrex::Real, 3> beta = {{0,0,0}} ) const;
969  void computeB (amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>, 3> >& B,
970  const amrex::Vector<std::unique_ptr<amrex::MultiFab> >& phi,
971  std::array<amrex::Real, 3> beta = {{0,0,0}} ) const;
972  void computePhiTriDiagonal (const amrex::Vector<std::unique_ptr<amrex::MultiFab> >& rho,
973  amrex::Vector<std::unique_ptr<amrex::MultiFab> >& phi) const;
974 
975  // Magnetostatic Solver Interface
977  void ComputeMagnetostaticField ();
978  void AddMagnetostaticFieldLabFrame ();
979  void computeVectorPotential (const amrex::Vector<amrex::Array<std::unique_ptr<amrex::MultiFab>, 3> >& curr,
980  amrex::Vector<amrex::Array<std::unique_ptr<amrex::MultiFab>, 3> >& A,
981  amrex::Real required_precision=amrex::Real(1.e-11),
982  amrex::Real absolute_tolerance=amrex::Real(0.0),
983  int max_iters=200,
984  int verbosity=2) const;
985 
986  void setVectorPotentialBC (amrex::Vector<amrex::Array<std::unique_ptr<amrex::MultiFab>, 3> >& A) const;
987 
1011  amrex::ParserExecutor<3> const& xfield_parser,
1012  amrex::ParserExecutor<3> const& yfield_parser,
1013  amrex::ParserExecutor<3> const& zfield_parser,
1014  std::array< std::unique_ptr<amrex::MultiFab>, 3 > const& edge_lengths,
1015  std::array< std::unique_ptr<amrex::MultiFab>, 3 > const& face_areas,
1016  char field,
1017  int lev, PatchType patch_type);
1018 
1024 
1030  const std::string& read_fields_from_path, amrex::MultiFab* mf,
1031  const std::string& F_name, const std::string& F_component);
1032 
1041  void InitializeEBGridData(int lev);
1042 
1048  void ComputeCostsHeuristic (amrex::Vector<std::unique_ptr<amrex::LayoutData<amrex::Real> > >& costs);
1049 
1050  void ApplyFilterandSumBoundaryRho (int lev, int glev, amrex::MultiFab& rho, int icomp, int ncomp);
1051 
1060  static amrex::Vector<amrex::Real> getFornbergStencilCoefficients(int n_order, short a_grid_type);
1061 
1062  // Device vectors of stencil coefficients used for finite-order centering of fields
1066 
1067  // Device vectors of stencil coefficients used for finite-order centering of currents
1071 
1072  // This needs to be public for CUDA.
1074  void ErrorEst (int lev, amrex::TagBoxArray& tags, amrex::Real time, int /*ngrow*/) final;
1075 
1076  // Return the accelerator lattice instance defined at the given refinement level
1077  const AcceleratorLattice& get_accelerator_lattice (int lev) {return *(m_accelerator_lattice[lev]);}
1078 
1079  // for cuda
1080  void BuildBufferMasksInBox ( amrex::Box tbx, amrex::IArrayBox &buffer_mask,
1081  const amrex::IArrayBox &guard_mask, int ng );
1082 #ifdef AMREX_USE_EB
1083  amrex::EBFArrayBoxFactory const& fieldEBFactory (int lev) const noexcept {
1084  return static_cast<amrex::EBFArrayBoxFactory const&>(*m_field_factory[lev]);
1085  }
1086 #endif
1087 
1088  void InitEB ();
1089 
1090 #ifdef AMREX_USE_EB
1095  static void ComputeEdgeLengths (std::array< std::unique_ptr<amrex::MultiFab>, 3 >& edge_lengths,
1096  const amrex::EBFArrayBoxFactory& eb_fact);
1101  static void ComputeFaceAreas (std::array< std::unique_ptr<amrex::MultiFab>, 3 >& face_areas,
1102  const amrex::EBFArrayBoxFactory& eb_fact);
1103 
1107  static void ScaleEdges (std::array< std::unique_ptr<amrex::MultiFab>, 3 >& edge_lengths,
1108  const std::array<amrex::Real,3>& cell_size);
1112  static void ScaleAreas (std::array< std::unique_ptr<amrex::MultiFab>, 3 >& face_areas,
1113  const std::array<amrex::Real,3>& cell_size);
1122  void MarkCells();
1123 #endif
1124 
1128  void ComputeDistanceToEB ();
1132  amrex::Array1D<int, 0, 2> CountExtFaces();
1137  void ComputeFaceExtensions();
1141  void InitBorrowing();
1145  void ShrinkBorrowing();
1149  void ComputeOneWayExtensions();
1153  void ComputeEightWaysExtensions();
1162  void ApplyBCKCorrection(int idim);
1163 
1168  void PSATDSubtractCurrentPartialSumsAvg ();
1169 
1170 #ifdef WARPX_USE_PSATD
1171 
1172 # ifdef WARPX_DIM_RZ
1174 # else
1176 # endif
1177  get_spectral_solver_fp (int lev) {return *spectral_solver_fp[lev];}
1178 #endif
1179 
1180  FiniteDifferenceSolver * get_pointer_fdtd_solver_fp (int lev) { return m_fdtd_solver_fp[lev].get(); }
1181 
1182 protected:
1183 
1209  void InitLevelData (int lev, amrex::Real time);
1210 
1213  void PostProcessBaseGrids (amrex::BoxArray& ba0) const final;
1214 
1218  void MakeNewLevelFromScratch (int lev, amrex::Real time, const amrex::BoxArray& new_grids,
1219  const amrex::DistributionMapping& new_dmap) final;
1220 
1224  void MakeNewLevelFromCoarse (int /*lev*/, amrex::Real /*time*/, const amrex::BoxArray& /*ba*/,
1225  const amrex::DistributionMapping& /*dm*/) final;
1226 
1230  void RemakeLevel (int lev, amrex::Real time, const amrex::BoxArray& ba,
1231  const amrex::DistributionMapping& dm) final;
1232 
1234  void ClearLevel (int lev) final;
1235 
1236 private:
1237 
1244  WarpX ();
1245 
1250  static void MakeWarpX ();
1251 
1252  // Singleton is used when the code is run from python
1254 
1256  void HandleSignals ();
1257 
1258  void FillBoundaryB (int lev, PatchType patch_type, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
1259  void FillBoundaryE (int lev, PatchType patch_type, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
1260  void FillBoundaryF (int lev, PatchType patch_type, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
1261  void FillBoundaryG (int lev, PatchType patch_type, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
1262 
1263  void FillBoundaryB_avg (int lev, PatchType patch_type, amrex::IntVect ng);
1264  void FillBoundaryE_avg (int lev, PatchType patch_type, amrex::IntVect ng);
1265 
1267 
1268  void OneStep_nosub (amrex::Real cur_time);
1269  void OneStep_sub1 (amrex::Real cur_time);
1270 
1271  void OneStep_ImplicitPicard(amrex::Real cur_time);
1272 
1276  void OneStep_multiJ (amrex::Real cur_time);
1277 
1278  void RestrictCurrentFromFineToCoarsePatch (
1279  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
1280  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp,
1281  int lev);
1282  void AddCurrentFromFineLevelandSumBoundary (
1283  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
1284  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp,
1285  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_buffer,
1286  int lev);
1287  void StoreCurrent (int lev);
1288  void RestoreCurrent (int lev);
1289  void ApplyFilterJ (
1290  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& current,
1291  int lev,
1292  int idim);
1293  void ApplyFilterJ (
1294  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& current,
1295  int lev);
1296  void SumBoundaryJ (
1297  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& current,
1298  int lev,
1299  int idim,
1300  const amrex::Periodicity& period);
1301  void SumBoundaryJ (
1302  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& current,
1303  int lev,
1304  const amrex::Periodicity& period);
1305  void NodalSyncJ (
1306  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
1307  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp,
1308  int lev,
1309  PatchType patch_type);
1310 
1311  void RestrictRhoFromFineToCoarsePatch (
1312  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
1313  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp,
1314  int lev);
1315  void ApplyFilterandSumBoundaryRho (
1316  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
1317  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp,
1318  int lev,
1319  PatchType patch_type,
1320  int icomp,
1321  int ncomp);
1322  void AddRhoFromFineLevelandSumBoundary (
1323  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
1324  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp,
1325  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_buffer,
1326  int lev,
1327  int icomp,
1328  int ncomp);
1329  void NodalSyncRho (
1330  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
1331  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp,
1332  int lev,
1333  PatchType patch_type,
1334  int icomp,
1335  int ncomp);
1336 
1337  void ReadParameters ();
1338 
1341  void BackwardCompatibility ();
1342 
1344 
1345  void AllocLevelData (int lev, const amrex::BoxArray& ba,
1346  const amrex::DistributionMapping& dm);
1347 
1348  [[nodiscard]] amrex::DistributionMapping
1349  GetRestartDMap (const std::string& chkfile, const amrex::BoxArray& ba, int lev) const;
1350 
1351  void InitFromCheckpoint ();
1352  void PostRestart ();
1353 
1354  void InitPML ();
1356 
1357  void InitFilter ();
1358 
1360 
1362 
1368 
1373 
1376 
1377  void BuildBufferMasks ();
1378 
1379  [[nodiscard]] const amrex::iMultiFab* getCurrentBufferMasks (int lev) const {
1380  return current_buffer_masks[lev].get();
1381  }
1382 
1383  [[nodiscard]] const amrex::iMultiFab* getGatherBufferMasks (int lev) const
1384  {
1385  return gather_buffer_masks[lev].get();
1386  }
1387 
1397  void ReorderFornbergCoefficients (amrex::Vector<amrex::Real>& ordered_coeffs,
1398  amrex::Vector<amrex::Real>& unordered_coeffs,
1399  int order);
1412  void AllocateCenteringCoefficients (amrex::Gpu::DeviceVector<amrex::Real>& device_centering_stencil_coeffs_x,
1413  amrex::Gpu::DeviceVector<amrex::Real>& device_centering_stencil_coeffs_y,
1414  amrex::Gpu::DeviceVector<amrex::Real>& device_centering_stencil_coeffs_z,
1415  int centering_nox,
1416  int centering_noy,
1417  int centering_noz,
1418  short a_grid_type);
1419 
1420  void AllocLevelMFs (int lev, const amrex::BoxArray& ba, const amrex::DistributionMapping& dm,
1421  const amrex::IntVect& ngEB, amrex::IntVect& ngJ,
1422  const amrex::IntVect& ngRho, const amrex::IntVect& ngF,
1423  const amrex::IntVect& ngG, bool aux_is_nodal);
1424 
1425 #ifdef WARPX_USE_PSATD
1426 # ifdef WARPX_DIM_RZ
1427  void AllocLevelSpectralSolverRZ (amrex::Vector<std::unique_ptr<SpectralSolverRZ>>& spectral_solver,
1428  int lev,
1429  const amrex::BoxArray& realspace_ba,
1430  const amrex::DistributionMapping& dm,
1431  const std::array<amrex::Real,3>& dx);
1432 # else
1433  void AllocLevelSpectralSolver (amrex::Vector<std::unique_ptr<SpectralSolver>>& spectral_solver,
1434  int lev,
1435  const amrex::BoxArray& realspace_ba,
1436  const amrex::DistributionMapping& dm,
1437  const std::array<amrex::Real,3>& dx,
1438  bool pml_flag=false);
1439 # endif
1440 #endif
1441 
1443  std::string m_authors;
1444 
1445  amrex::Vector<int> istep; // which step?
1446  amrex::Vector<int> nsubsteps; // how many substeps on each level?
1447 
1451 
1452  // Particle container
1453  std::unique_ptr<MultiParticleContainer> mypc;
1454  std::unique_ptr<MultiDiagnostics> multi_diags;
1455 
1456  // Fluid container
1457  bool do_fluid_species = false;
1458  std::unique_ptr<MultiFluidContainer> myfl;
1459 
1460  //
1461  // Fields: First array for level, second for direction
1462  //
1463 
1464  // Full solution
1467 
1468  // Fine patch
1479 
1480  // Implicit, fields at start of step and from the previous iteration
1485 
1486  // Memory buffers for computing magnetostatic fields
1487  // Vector Potential A and previous step. Time buffer needed for computing dA/dt to first order
1491 
1492  // Same as Bfield_fp/Efield_fp for reading external field data
1495 
1500 
1523 
1536 
1537  //EB level set
1539 
1540  // store fine patch
1542 
1543  // Nodal MultiFab for nodal current deposition if warpx.do_current_centering = 1
1545 
1546  // Coarse patch
1555 
1556  // Copy of the coarse aux
1561 
1562  // If charge/current deposition buffers are used
1565 
1577  [[nodiscard]] amrex::MultiFab*
1578  getFieldPointerUnchecked (warpx::fields::FieldType field_type, int lev, int direction = 0) const;
1579 
1580  // PML
1581  int do_pml = 0;
1582  int do_silver_mueller = 0;
1583  int pml_ncell = 10;
1584  int pml_delta = 10;
1585  int pml_has_particles = 0;
1586  int do_pml_j_damping = 0;
1587  int do_pml_in_domain = 0;
1588  bool do_similar_dm_pml = true;
1589  bool do_pml_dive_cleaning; // default set in WarpX.cpp
1590  bool do_pml_divb_cleaning; // default set in WarpX.cpp
1594 #if (defined WARPX_DIM_RZ) && (defined WARPX_USE_PSATD)
1596 #endif
1597  amrex::Real v_particle_pml;
1598 
1599  // External fields parameters
1600  std::unique_ptr<ExternalFieldParams> m_p_ext_field_params;
1601 
1602  amrex::Real moving_window_x = std::numeric_limits<amrex::Real>::max();
1603 
1604  // Plasma injection parameters
1605  int warpx_do_continuous_injection = 0;
1606  int num_injected_species = -1;
1608 
1609  std::optional<amrex::Real> m_const_dt;
1610 
1611  // Macroscopic properties
1612  std::unique_ptr<MacroscopicProperties> m_macroscopic_properties;
1613 
1614  // Hybrid PIC algorithm parameters
1615  std::unique_ptr<HybridPICModel> m_hybrid_pic_model;
1616 
1617  // Load balancing
1625  int load_balance_with_sfc = 0;
1630  amrex::Real load_balance_knapsack_factor = amrex::Real(1.24);
1636  amrex::Real load_balance_efficiency_ratio_threshold = amrex::Real(1.1);
1644  amrex::Real costs_heuristic_cells_wt = amrex::Real(0);
1650  amrex::Real costs_heuristic_particles_wt = amrex::Real(0);
1651 
1652  // Determines timesteps for override sync
1654 
1655  // Other runtime parameters
1656  int verbose = 1;
1657 
1658  bool use_hybrid_QED = false;
1659 
1660  int max_step = std::numeric_limits<int>::max();
1661  amrex::Real stop_time = std::numeric_limits<amrex::Real>::max();
1662 
1663  int regrid_int = -1;
1664 
1665  amrex::Real cfl = amrex::Real(0.999);
1666 
1667  std::string restart_chkfile;
1668 
1670  bool write_diagnostics_on_restart = false;
1671 
1674 
1675  bool use_single_read = true;
1676  bool use_single_write = true;
1677  int mffile_nstreams = 4;
1678  int field_io_nfiles = 1024;
1679  int particle_io_nfiles = 1024;
1680 
1684  std::unique_ptr<amrex::Parser> ref_patch_parser;
1685 
1686  bool is_synchronized = true;
1687 
1688  // Synchronization of nodal points
1689  static constexpr bool sync_nodal_points = true;
1690 
1692 
1693  //Slice Parameters
1695  int slice_plot_int = -1;
1704 
1705  bool fft_periodic_single_box = false;
1706  int nox_fft = 16;
1707  int noy_fft = 16;
1708  int noz_fft = 16;
1709 
1711  amrex::IntVect numprocs{0};
1712 
1714  std::unique_ptr<ParticleBoundaryBuffer> m_particle_boundary_buffer;
1715 
1716  // Accelerator lattice elements
1718 
1719  //
1720  // Embedded Boundary
1721  //
1722 
1723  // Factory for field data
1725 
1726  [[nodiscard]]
1727  amrex::FabFactory<amrex::FArrayBox> const& fieldFactory (int lev) const noexcept
1728  {
1729  return *m_field_factory[lev];
1730  }
1731 
1734  bool m_exit_loop_due_to_interrupt_signal = false;
1735 
1738  [[nodiscard]]
1739  bool checkStopSimulation (amrex::Real cur_time);
1740 
1746  void checkEarlyUnusedParams ();
1747 
1756  void HandleParticlesAtBoundaries (int step, amrex::Real cur_time, int num_moved);
1757 
1759 
1765  void ExplicitFillBoundaryEBUpdateAux ();
1766 
1767  void PushPSATD ();
1768 
1769 #ifdef WARPX_USE_PSATD
1770 
1783  void PSATDForwardTransformEB (
1784  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& E_fp,
1785  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& B_fp,
1786  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& E_cp,
1787  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& B_cp);
1788 
1802  void PSATDBackwardTransformEB (
1803  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& E_fp,
1804  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& B_fp,
1805  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& E_cp,
1806  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& B_cp);
1807 
1820  void PSATDBackwardTransformEBavg (
1821  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& E_avg_fp,
1822  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& B_avg_fp,
1823  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& E_avg_cp,
1824  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& B_avg_cp);
1825 
1837  void PSATDForwardTransformJ (
1838  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
1839  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp,
1840  bool apply_kspace_filter=true);
1841 
1850  void PSATDBackwardTransformJ (
1851  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
1852  const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp);
1853 
1865  void PSATDForwardTransformRho (
1866  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
1867  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp,
1868  int icomp, int dcomp, bool apply_kspace_filter=true);
1869 
1873  void PSATDMoveRhoNewToRhoOld ();
1874 
1878  void PSATDMoveJNewToJOld ();
1879 
1883  void PSATDForwardTransformF ();
1884 
1888  void PSATDBackwardTransformF ();
1889 
1893  void PSATDForwardTransformG ();
1894 
1898  void PSATDBackwardTransformG ();
1899 
1903  void PSATDCurrentCorrection ();
1904 
1908  void PSATDVayDeposition ();
1909 
1913  void PSATDPushSpectralFields ();
1914 
1920  void PSATDScaleAverageFields (amrex::Real scale_factor);
1921 
1925  void PSATDEraseAverageFields ();
1926 
1927 # ifdef WARPX_DIM_RZ
1930 # else
1933 # endif
1934 
1935 #endif
1936 
1939 };
1940 
1941 #endif
PatchType
Definition: WarpXAlgorithmSelection.H:59
DtType
Definition: WarpXDtType.H:11
PushType
Definition: WarpXPushType.H:12
Definition: AcceleratorLattice.H:21
Definition: BilinearFilter.H:17
Definition: ElectrostaticSolver.H:41
Top-level class for the electromagnetic finite-difference solver.
Definition: FiniteDifferenceSolver.H:35
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:34
Definition: MagnetostaticSolver.H:21
This class contains a vector of all diagnostics in the simulation.
Definition: MultiDiagnostics.H:21
Definition: MultiFluidContainer.H:33
Definition: MultiParticleContainer.H:66
Definition: PML_RZ.H:31
Definition: PML.H:137
Definition: ParticleBoundaryBuffer.H:22
Top-level class for the electromagnetic spectral solver.
Definition: SpectralSolver.H:33
Definition: SpectralSolverRZ.H:22
Definition: WarpX.H:81
std::unique_ptr< ParticleBoundaryBuffer > m_particle_boundary_buffer
particle buffer for scraped particles on the boundaries
Definition: WarpX.H:1714
static int self_fields_max_iters
Definition: WarpX.H:903
static int field_centering_nox
Order of finite centering of fields (from staggered grid to nodal grid), along x.
Definition: WarpX.H:259
amrex::Vector< std::unique_ptr< amrex::LayoutData< amrex::Real > > > costs
Definition: WarpX.H:1623
static short current_deposition_algo
Integer that corresponds to the current deposition algorithm (Esirkepov, direct, Vay,...
Definition: WarpX.H:153
int maxlevel_extEMfield_init
Definition: WarpX.H:149
amrex::Vector< std::unique_ptr< amrex::MultiFab > > G_fp
Definition: WarpX.H:1470
amrex::Gpu::DeviceVector< amrex::Real > device_field_centering_stencil_coeffs_y
Definition: WarpX.H:1064
static int moving_window_dir
Definition: WarpX.H:919
amrex::Gpu::DeviceVector< amrex::Real > device_current_centering_stencil_coeffs_x
Definition: WarpX.H:1068
void InitFilter()
static bool do_dive_cleaning
Definition: WarpX.H:247
static amrex::Real zmax_plasma_to_compute_max_step
Definition: WarpX.H:317
bool DoFluidSpecies() const
Definition: WarpX.H:510
amrex::Vector< int > getnsubsteps() const
Definition: WarpX.H:841
static bool do_multi_J
Definition: WarpX.H:341
std::unique_ptr< MacroscopicProperties > m_macroscopic_properties
Definition: WarpX.H:1612
MultiDiagnostics & GetMultiDiags()
Definition: WarpX.H:127
bool DoPML() const
Definition: WarpX.H:509
static short rho_in_time
Definition: WarpX.H:209
amrex::Vector< std::unique_ptr< amrex::FabFactory< amrex::FArrayBox > > > m_field_factory
Definition: WarpX.H:1724
bool getis_synchronized() const
Definition: WarpX.H:855
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_cp
Definition: WarpX.H:1550
amrex::Vector< std::unique_ptr< amrex::MultiFab > > m_distance_to_eb
Definition: WarpX.H:1538
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_slice
Definition: WarpX.H:1702
MultiFluidContainer & GetFluidContainer()
Definition: WarpX.H:123
static short psatd_solution_type
Definition: WarpX.H:204
amrex::Vector< std::unique_ptr< amrex::iMultiFab > > gather_buffer_masks
Definition: WarpX.H:1560
void updateStopTime(const amrex::Real new_stop_time)
Definition: WarpX.H:860
amrex::Vector< int > mirror_z_npoints
Definition: WarpX.H:539
static amrex::Real zmin_domain_boost_step_0
Definition: WarpX.H:324
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_slice
Definition: WarpX.H:1701
static bool do_compute_max_step_from_zmax
Definition: WarpX.H:321
static short evolve_scheme
Integer that corresponds to the evolve scheme (explicit, implicit_picard, semi_implicit_picard)
Definition: WarpX.H:163
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:336
SpectralSolverRZ & get_spectral_solver_fp(int lev)
Definition: WarpX.H:1177
static int n_field_gather_buffer
Definition: WarpX.H:350
static int do_multi_J_n_depositions
Definition: WarpX.H:342
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:1544
amrex::Vector< amrex::Real > t_new
Definition: WarpX.H:1448
static bool do_single_precision_comms
perform field communications in single precision
Definition: WarpX.H:225
amrex::IntVect slice_cr_ratio
Definition: WarpX.H:1697
static amrex::Vector< ParticleBoundaryType > particle_boundary_lo
Definition: WarpX.H:194
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_store
Definition: WarpX.H:1541
void CheckKnownIssues()
Checks for known numerical issues involving different WarpX modules.
guardCellManager guard_cells
Definition: WarpX.H:1691
static bool do_shared_mem_charge_deposition
used shared memory algorithm for charge deposition
Definition: WarpX.H:228
static int em_solver_medium
Integer that corresponds to electromagnetic Maxwell solver (vacuum - 0, macroscopic - 1)
Definition: WarpX.H:175
MultiParticleContainer & GetPartContainer()
Definition: WarpX.H:122
static amrex::Vector< int > boost_direction
Direction of the Lorentz transform that defines the boosted frame of the simulation.
Definition: WarpX.H:313
static bool use_fdtd_nci_corr
Definition: WarpX.H:282
static bool verboncoeur_axis_correction
Definition: WarpX.H:296
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:920
static bool do_shared_mem_current_deposition
use shared memory algorithm for current deposition
Definition: WarpX.H:231
amrex::Vector< amrex::IntVect > do_pml_Hi
Definition: WarpX.H:1592
std::string GetAuthors() const
If an authors' string is specified in the inputfile, this method returns that string....
Definition: WarpX.H:143
void setistep(int lev, int ii)
Definition: WarpX.H:845
static bool fft_do_time_averaging
Definition: WarpX.H:921
static short particle_pusher_algo
Integer that corresponds to the particle push algorithm (Boris, Vay, Higuera-Cary)
Definition: WarpX.H:159
amrex::Vector< std::unique_ptr< PML > > pml
Definition: WarpX.H:1593
amrex::RealVect fine_tag_lo
Definition: WarpX.H:1681
std::string restart_chkfile
Definition: WarpX.H:1667
static WarpX * m_instance
Definition: WarpX.H:1253
amrex::Vector< std::unique_ptr< amrex::MultiFab > > rho_cp
Definition: WarpX.H:1549
static bool do_dynamic_scheduling
Definition: WarpX.H:329
void PostRestart()
std::unique_ptr< amrex::Parser > ref_patch_parser
User-defined parser to define refinement patches.
Definition: WarpX.H:1684
amrex::Gpu::DeviceVector< amrex::Real > device_field_centering_stencil_coeffs_z
Definition: WarpX.H:1065
static int self_fields_verbosity
Definition: WarpX.H:904
amrex::Real stopTime() const
Definition: WarpX.H:859
amrex::Vector< std::unique_ptr< PML_RZ > > pml_rz
Definition: WarpX.H:1595
void InitData()
static std::map< std::string, amrex::MultiFab * > multifab_map
Definition: WarpX.H:455
std::unique_ptr< MultiFluidContainer > myfl
Definition: WarpX.H:1458
amrex::Gpu::DeviceVector< amrex::Real > device_field_centering_stencil_coeffs_x
Definition: WarpX.H:1063
std::unique_ptr< HybridPICModel > m_hybrid_pic_model
Definition: WarpX.H:1615
void AddExternalFields()
amrex::Vector< amrex::Real > getdt() const
Definition: WarpX.H:851
static int noz
Order of the particle shape factors (splines) along z.
Definition: WarpX.H:256
amrex::Gpu::DeviceVector< amrex::Real > device_current_centering_stencil_coeffs_z
Definition: WarpX.H:1070
amrex::Vector< amrex::Real > gett_new() const
Definition: WarpX.H:848
static int num_mirrors
Definition: WarpX.H:536
amrex::Vector< std::unique_ptr< amrex::MultiFab > > phi_fp
Definition: WarpX.H:1472
ParticleBoundaryBuffer & GetParticleBoundaryBuffer()
Definition: WarpX.H:131
void WriteUsedInputsFile() const
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_n
Definition: WarpX.H:1482
bool do_pml_divb_cleaning
Definition: WarpX.H:1590
amrex::Vector< int > getistep() const
Definition: WarpX.H:843
static int current_centering_noy
Order of finite centering of currents (from nodal grid to staggered grid), along y.
Definition: WarpX.H:268
static amrex::Vector< FieldBoundaryType > field_boundary_lo
Definition: WarpX.H:184
amrex::Gpu::DeviceVector< amrex::Real > device_current_centering_stencil_coeffs_y
Definition: WarpX.H:1069
void InitDiagnostics()
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_avg_cp
Definition: WarpX.H:1553
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...
amrex::Vector< amrex::Real > load_balance_efficiency
Definition: WarpX.H:1638
static amrex::Real self_fields_required_precision
Definition: WarpX.H:901
static amrex::IntVect sort_bin_size
Definition: WarpX.H:333
WarpX(WarpX &&)=default
amrex::IntVect m_rho_nodal_flag
Definition: WarpX.H:361
static std::map< std::string, amrex::iMultiFab * > imultifab_map
Definition: WarpX.H:456
utils::parser::IntervalsParser load_balance_intervals
Definition: WarpX.H:1620
amrex::Vector< std::array< std::unique_ptr< amrex::iMultiFab >, 3 > > m_flag_ext_face
Definition: WarpX.H:1514
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_fp
Definition: WarpX.H:1473
amrex::IntVect getngEB() const
Definition: WarpX.H:934
utils::parser::IntervalsParser override_sync_intervals
Definition: WarpX.H:1653
utils::parser::IntervalsParser get_load_balance_intervals() const
returns the load balance interval
Definition: WarpX.H:665
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > m_face_areas
EB: Areas of the mesh faces.
Definition: WarpX.H:1499
amrex::Real gett_old(int lev) const
Definition: WarpX.H:847
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_cax
Definition: WarpX.H:1558
static int do_moving_window
Definition: WarpX.H:906
int maxStep() const
Definition: WarpX.H:857
static int nox
Order of the particle shape factors (splines) along x.
Definition: WarpX.H:252
int getnsubsteps(int lev) const
Definition: WarpX.H:842
WarpX(WarpX const &)=delete
static amrex::Real quantum_xi_c2
Definition: WarpX.H:641
void InitFromScratch()
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_slice
Definition: WarpX.H:1703
amrex::Vector< std::array< std::unique_ptr< amrex::iMultiFab >, 3 > > m_flag_info_face
Definition: WarpX.H:1507
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_fp_vay
Definition: WarpX.H:1474
void updateMaxStep(const int new_max_step)
Definition: WarpX.H:858
HybridPICModel & GetHybridPICModel()
Definition: WarpX.H:125
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_cp
Definition: WarpX.H:1552
static bool serialize_initial_conditions
If true, the initial conditions from random number generators are serialized (useful for reproducible...
Definition: WarpX.H:306
const amrex::iMultiFab * getGatherBufferMasks(int lev) const
Definition: WarpX.H:1383
amrex::Vector< std::unique_ptr< SpectralSolverRZ > > spectral_solver_fp
Definition: WarpX.H:1928
static amrex::IntVect m_fill_guards_fields
Whether to fill guard cells when computing inverse FFTs of fields.
Definition: WarpX.H:240
static short grid_type
Definition: WarpX.H:358
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > vector_potential_grad_buf_b_stag
Definition: WarpX.H:1490
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_aux
Definition: WarpX.H:1465
static int current_centering_nox
Order of finite centering of currents (from nodal grid to staggered grid), along x.
Definition: WarpX.H:266
static bool use_filter_compensation
If true, a compensation step is added to the bilinear filtering of charge and currents.
Definition: WarpX.H:303
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > vector_potential_grad_buf_e_stag
Definition: WarpX.H:1489
amrex::Vector< std::array< std::unique_ptr< amrex::LayoutData< FaceInfoBox > >, 3 > > m_borrowing
Definition: WarpX.H:1522
static short charge_deposition_algo
Integer that corresponds to the charge deposition algorithm (only standard deposition)
Definition: WarpX.H:155
amrex::Real gett_new(int lev) const
Definition: WarpX.H:849
amrex::Vector< amrex::Real > dt
Definition: WarpX.H:1450
amrex::Vector< std::unique_ptr< amrex::MultiFab > > rho_slice
Definition: WarpX.H:1700
amrex::Vector< std::unique_ptr< amrex::MultiFab > > F_cp
Definition: WarpX.H:1547
amrex::RealVect fine_tag_hi
Definition: WarpX.H:1682
amrex::IntVect get_ng_fieldgather() const
Definition: WarpX.H:939
amrex::IntVect get_ng_depos_rho() const
Definition: WarpX.H:938
static int poisson_solver_id
Definition: WarpX.H:898
static int start_moving_window_step
Definition: WarpX.H:907
amrex::Vector< int > istep
Definition: WarpX.H:1445
static int electrostatic_solver_id
Definition: WarpX.H:897
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:1077
amrex::Vector< std::unique_ptr< amrex::MultiFab > > G_slice
Definition: WarpX.H:1699
static int n_current_deposition_buffer
Definition: WarpX.H:354
amrex::Vector< std::unique_ptr< amrex::MultiFab > > F_fp
Definition: WarpX.H:1469
int Verbose() const
Definition: WarpX.H:110
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_cax
Definition: WarpX.H:1557
amrex::Vector< std::unique_ptr< amrex::MultiFab > > charge_buf
Definition: WarpX.H:1564
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > m_edge_lengths
EB: Lengths of the mesh edges.
Definition: WarpX.H:1497
const amrex::iMultiFab * getCurrentBufferMasks(int lev) const
Definition: WarpX.H:1379
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_avg_fp
Definition: WarpX.H:1477
amrex::Vector< int > injected_plasma_species
Definition: WarpX.H:1607
static bool do_device_synchronize
Definition: WarpX.H:344
static int max_picard_iterations
The maximum number of Picard iterations to do each time step.
Definition: WarpX.H:165
static bool use_kspace_filter
If true, the bilinear filtering of charge and currents is done in Fourier space.
Definition: WarpX.H:301
void InitNCICorrector()
int getistep(int lev) const
Definition: WarpX.H:844
std::unique_ptr< MultiDiagnostics > multi_diags
Definition: WarpX.H:1454
static int noy
Order of the particle shape factors (splines) along y.
Definition: WarpX.H:254
amrex::Vector< int > nsubsteps
Definition: WarpX.H:1446
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:263
void sett_new(int lev, amrex::Real time)
Definition: WarpX.H:850
static amrex::Real picard_iteration_tolerance
The tolerance for the Picard iteration convergence.
Definition: WarpX.H:167
amrex::IntVect getngF() const
Definition: WarpX.H:935
static amrex::Real beta_boost
Beta value corresponding to the Lorentz factor of the boosted frame of the simulation.
Definition: WarpX.H:311
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_fp_external
Definition: WarpX.H:1493
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...
void ReadExternalFieldFromFile(const std::string &read_fields_from_path, amrex::MultiFab *mf, const std::string &F_name, const std::string &F_component)
Load field values from a user-specified openPMD file for a specific field (specified by F_name)
static bool do_divb_cleaning
Solve additional Maxwell equation for G in order to control errors in magnetic Gauss' law.
Definition: WarpX.H:249
std::unique_ptr< MultiParticleContainer > mypc
Definition: WarpX.H:1453
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_buf
Definition: WarpX.H:1563
static bool use_filter
If true, a bilinear filter is used to smooth charge and currents.
Definition: WarpX.H:299
static amrex::IntVect m_fill_guards_current
Whether to fill guard cells when computing inverse FFTs of currents.
Definition: WarpX.H:243
void LoadExternalFieldsFromFile(int lev)
Load field values from a user-specified openPMD file, for the fields Ex, Ey, Ez, Bx,...
MacroscopicProperties & GetMacroscopicProperties()
Definition: WarpX.H:124
MagnetostaticSolver::VectorPoissonBoundaryHandler m_vector_poisson_boundary_handler
Definition: WarpX.H:976
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > vector_potential_fp_nodal
Definition: WarpX.H:1488
ElectrostaticSolver::PoissonBoundaryHandler m_poisson_boundary_handler
Definition: WarpX.H:951
static amrex::IntVect shared_tilesize
tileSize to use for shared current deposition operations
Definition: WarpX.H:237
amrex::Vector< std::unique_ptr< FiniteDifferenceSolver > > m_fdtd_solver_fp
Definition: WarpX.H:1937
amrex::Vector< amrex::Real > gett_old() const
Definition: WarpX.H:846
static int current_centering_noz
Order of finite centering of currents (from nodal grid to staggered grid), along z.
Definition: WarpX.H:270
static bool safe_guard_cells
Definition: WarpX.H:345
amrex::IntVect getngUpdateAux() const
Definition: WarpX.H:936
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_cp
Definition: WarpX.H:1551
amrex::Vector< std::unique_ptr< amrex::MultiFab > > rho_fp
Definition: WarpX.H:1471
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_n
Definition: WarpX.H:1481
static amrex::Vector< FieldBoundaryType > field_boundary_hi
Definition: WarpX.H:189
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_fp
Definition: WarpX.H:1476
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_save
Definition: WarpX.H:1483
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > ECTRhofield
Definition: WarpX.H:1531
amrex::Vector< amrex::Real > t_old
Definition: WarpX.H:1449
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:338
static bool refine_plasma
Definition: WarpX.H:330
amrex::FabFactory< amrex::FArrayBox > const & fieldFactory(int lev) const noexcept
Definition: WarpX.H:1727
static int macroscopic_solver_algo
Definition: WarpX.H:179
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_aux
Definition: WarpX.H:1466
static int ncomps
Definition: WarpX.H:278
static int moving_window_active(int const step)
Definition: WarpX.H:914
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_save
Definition: WarpX.H:1484
static bool galerkin_interpolation
Definition: WarpX.H:292
amrex::Vector< std::unique_ptr< NCIGodfreyFilter > > nci_godfrey_filter_bxbyez
Definition: WarpX.H:528
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > m_area_mod
Definition: WarpX.H:1518
static amrex::IntVect filter_npass_each_dir
Definition: WarpX.H:525
amrex::IntVect get_numprocs() const
Definition: WarpX.H:948
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Venl
Definition: WarpX.H:1535
static short electromagnetic_solver_id
Integer that corresponds to the type of Maxwell solver (Yee, CKC, PSATD, ECT)
Definition: WarpX.H:161
void InitPML()
amrex::Real v_particle_pml
Definition: WarpX.H:1597
amrex::IntVect get_ng_depos_J() const
Definition: WarpX.H:937
BilinearFilter bilinear_filter
Definition: WarpX.H:526
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_avg_fp
Definition: WarpX.H:1478
static int field_centering_noy
Order of finite centering of fields (from staggered grid to nodal grid), along y.
Definition: WarpX.H:261
amrex::Real getdt(int lev) const
Definition: WarpX.H:852
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_fp_external
Definition: WarpX.H:1494
HybridPICModel * get_pointer_HybridPICModel() const
Definition: WarpX.H:126
amrex::Vector< std::unique_ptr< NCIGodfreyFilter > > nci_godfrey_filter_exeybz
Definition: WarpX.H:527
static bool do_current_centering
Definition: WarpX.H:214
amrex::Vector< amrex::Real > mirror_z
Definition: WarpX.H:537
amrex::Vector< std::unique_ptr< amrex::MultiFab > > F_slice
Definition: WarpX.H:1698
int getdo_moving_window() const
Definition: WarpX.H:853
static bool do_subcycling
Definition: WarpX.H:340
static int n_rz_azimuthal_modes
Number of modes for the RZ multi-mode version.
Definition: WarpX.H:273
static short J_in_time
Definition: WarpX.H:208
std::unique_ptr< ExternalFieldParams > m_p_ext_field_params
Definition: WarpX.H:1600
static amrex::Real gamma_boost
Lorentz factor of the boosted frame in which a boosted-frame simulation is run.
Definition: WarpX.H:309
static short field_gathering_algo
Integer that corresponds to the field gathering algorithm (energy-conserving, momentum-conserving)
Definition: WarpX.H:157
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Bfield_avg_cp
Definition: WarpX.H:1554
static int shared_mem_current_tpb
number of threads to use per block in shared deposition
Definition: WarpX.H:234
static short load_balance_costs_update_algo
Definition: WarpX.H:173
amrex::Vector< std::unique_ptr< FiniteDifferenceSolver > > m_fdtd_solver_cp
Definition: WarpX.H:1938
void computeMaxStepBoostAccelerator()
amrex::Vector< amrex::Real > mirror_z_width
Definition: WarpX.H:538
std::unique_ptr< MultiReducedDiags > reduced_diags
object with all reduced diagnostics, similar to MultiParticleContainer for species.
Definition: WarpX.H:542
void PerformanceHints()
amrex::Vector< std::unique_ptr< amrex::iMultiFab > > current_buffer_masks
Definition: WarpX.H:1559
std::string m_authors
Author of an input file / simulation setup.
Definition: WarpX.H:1443
void ScrapeParticles()
int slice_max_grid_size
Definition: WarpX.H:1694
amrex::Vector< std::unique_ptr< amrex::MultiFab > > G_cp
Definition: WarpX.H:1548
static bool require_picard_convergence
Flags whether the Picard iterations are required to converge.
Definition: WarpX.H:169
static amrex::Real self_fields_absolute_tolerance
Definition: WarpX.H:902
amrex::Vector< std::unique_ptr< AcceleratorLattice > > m_accelerator_lattice
Definition: WarpX.H:1717
static amrex::Vector< ParticleBoundaryType > particle_boundary_hi
Definition: WarpX.H:199
std::optional< amrex::Real > m_const_dt
Definition: WarpX.H:1609
FiniteDifferenceSolver * get_pointer_fdtd_solver_fp(int lev)
Definition: WarpX.H:1180
amrex::RealBox slice_realbox
Definition: WarpX.H:1696
amrex::Vector< amrex::IntVect > do_pml_Lo
Definition: WarpX.H:1591
amrex::Vector< std::unique_ptr< SpectralSolverRZ > > spectral_solver_cp
Definition: WarpX.H:1929
amrex::Real getmoving_window_x() const
Definition: WarpX.H:854
bool do_pml_dive_cleaning
Definition: WarpX.H:1589
const PML_RZ * getPMLRZ()
Definition: WarpX.H:513
static bool compute_max_step_from_btd
If true, the code will compute max_step from the back transformed diagnostics.
Definition: WarpX.H:327
bool current_correction
If true, a correction is applied to the current in Fourier space,.
Definition: WarpX.H:218
void ComputePMLFactors()
static int end_moving_window_step
Definition: WarpX.H:908
static utils::parser::IntervalsParser sort_intervals
Definition: WarpX.H:332
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > Efield_fp
Definition: WarpX.H:1475
Definition: WarpXParticleContainer.H:111
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 IArrayBox & get(const MFIter &mfi) const noexcept
This class computes and stores the number of guard cells needed for the allocation of the MultiFabs a...
Definition: GuardCellManager.H:20
This class is a parser for multiple slices of the form x,y,z,... where x, y and z are slices of the f...
Definition: IntervalsParser.H:103
void computeVectorPotential(amrex::Vector< amrex::Array< amrex::MultiFab *, 3 > > const &curr, amrex::Vector< amrex::Array< amrex::MultiFab *, 3 > > &A, amrex::Real const relative_tolerance, amrex::Real absolute_tolerance, int const max_iters, int const verbosity, amrex::Vector< amrex::Geometry > const &geom, amrex::Vector< amrex::DistributionMapping > const &dmap, amrex::Vector< amrex::BoxArray > const &grids, T_BoundaryHandler const boundary_handler, bool const do_single_precision_comms=false, std::optional< amrex::Vector< amrex::IntVect > > rel_ref_ratio=std::nullopt, [[maybe_unused]] T_PostACalculationFunctor post_A_calculation=std::nullopt, [[maybe_unused]] std::optional< amrex::Real const > current_time=std::nullopt, [[maybe_unused]] std::optional< amrex::Vector< T_FArrayBoxFactory const * > > eb_farray_box_factory=std::nullopt)
Definition: VectorPoissonSolver.H:86
void computePhi(amrex::Vector< amrex::MultiFab * > const &rho, amrex::Vector< amrex::MultiFab * > &phi, std::array< amrex::Real, 3 > const beta, amrex::Real const relative_tolerance, amrex::Real absolute_tolerance, int const max_iters, int const verbosity, amrex::Vector< amrex::Geometry > const &geom, amrex::Vector< amrex::DistributionMapping > const &dmap, amrex::Vector< amrex::BoxArray > const &grids, T_BoundaryHandler const boundary_handler, [[maybe_unused]] bool is_solver_multigrid, 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:98
int verbose
void Finalize(AMReX *pamrex)
std::string Version()
std::array< T, N > Array
ii
Definition: check_interp_points_and_weights.py:148
cell_size
Definition: compute_domain.py:37
name
Definition: run_automated.py:229
float dt
Definition: stencil.py:442
tuple dx
lab frame
Definition: stencil.py:429
beta
Definition: stencil.py:434
float cfl
Definition: stencil.py:439
string field
Definition: video_yt.py:31
FieldType
Definition: Fields.H:13
int verbosity()