WarpX
Loading...
Searching...
No Matches
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
31
32#ifdef WARPX_USE_FFT
33# ifdef WARPX_DIM_RZ
36# else
38# endif
39#endif
41#include "Fields.H"
49#include "Utils/export.H"
50
52#include <ablastr/utils/Enums.H>
53
54#include <AMReX.H>
55#include <AMReX_AmrCore.H>
56#include <AMReX_Array.H>
57#include <AMReX_Config.H>
58#ifdef AMREX_USE_EB
59# include <AMReX_EBFabFactory.H>
60#endif
61#include <AMReX_GpuContainers.H>
62#include <AMReX_IntVect.H>
63#include <AMReX_LayoutData.H>
64#include <AMReX_Parser.H>
65#include <AMReX_REAL.H>
66#include <AMReX_RealBox.H>
67#include <AMReX_RealVect.H>
68#include <AMReX_Vector.H>
69
70#include <AMReX_BaseFwd.H>
71#include <AMReX_AmrCoreFwd.H>
72
73#include <array>
74#include <iostream>
75#include <limits>
76#include <map>
77#include <memory>
78#include <optional>
79#include <string>
80#include <variant>
81#include <vector>
82
83class WARPX_EXPORT WarpX
84 : public amrex::AmrCore
85{
86public:
87 static WarpX& GetInstance ();
88
89 static void ResetInstance ();
90
95 static void Finalize();
96
98 ~WarpX () override;
99
101 WarpX ( WarpX const &) = delete;
103 WarpX& operator= ( WarpX const & ) = delete;
104
106 WarpX ( WarpX && ) = delete;
108 WarpX& operator= ( WarpX && ) = delete;
109
110 static std::string Version ();
111 static std::string PicsarVersion ();
112
113 [[nodiscard]] int Verbose () const { return verbose; }
114
116 {
117 return field_boundary_lo;
118 }
121 {
122 return field_boundary_hi;
123 }
124
125 void InitData ();
126
127 void Evolve (int numsteps = -1);
128
133
134 //
135 // Functions used by implicit solvers
136 //
137 void SyncMassMatricesPC ();
140 void SetElectricFieldAndApplyBCs ( const WarpXSolverVec& a_E, amrex::Real a_time );
142 amrex::Real a_thetadt, amrex::Real start_time );
143 void SpectralSourceFreeFieldAdvance ( amrex::Real start_time);
145 amrex::Real a_theta, amrex::Real a_time );
148 amrex::Real theta );
149 void ImplicitComputeRHSE ( amrex::Real dt, WarpXSolverVec& a_Erhs_vec);
150 void ImplicitComputeRHSE (int lev, amrex::Real dt, WarpXSolverVec& a_Erhs_vec);
151 void ImplicitComputeRHSE (int lev, PatchType patch_type, amrex::Real dt, WarpXSolverVec& a_Erhs_vec);
152
156 [[nodiscard]] HybridPICModel * get_pointer_HybridPICModel () const { return m_hybrid_pic_model.get(); }
162
168 [[nodiscard]] std::string GetAuthors () const { return m_authors; }
169
175
176 // Algorithms
197
202
208
214
219
224
226 // to satisfy the continuity equation and charge conservation
228
231 bool update_with_rho = false;
232
235
238
241
244
247
250
253
256 static bool do_dive_cleaning;
258 static bool do_divb_cleaning;
259
261 static int nox;
263 static int noy;
265 static int noz;
266
269
276
283 static int ncomps;
284
287 static bool use_fdtd_nci_corr;
298
300 static bool use_filter;
302 static bool use_kspace_filter;
305
308
310 static amrex::Real gamma_boost;
312 static amrex::Real beta_boost;
315
318 static amrex::Real zmin_domain_boost_step_0;
319
322
324 static bool refine_plasma;
325
328
333
342
346
347 // Global rho nodal flag to know about rho index type when rho MultiFab is not allocated
349
365 void AllocInitMultiFab (
366 std::unique_ptr<amrex::iMultiFab>& mf,
367 const amrex::BoxArray& ba,
369 int ncomp,
370 const amrex::IntVect& ngrow,
371 int level,
372 const std::string& name,
373 std::optional<const int> initial_value = {});
374
375 // Maps of all of the iMultiFabs used (this can include MFs from other classes)
376 // This is a convenience for the Python interface, allowing all iMultiFabs
377 // to be easily referenced from Python.
378 std::map<std::string, amrex::iMultiFab *> imultifab_map;
379
384 [[nodiscard]] const amrex::iMultiFab*
386
387 [[nodiscard]] bool DoPML () const {return do_pml;}
388 [[nodiscard]] bool DoFluidSpecies () const {return do_fluid_species;}
389
391 [[nodiscard]] std::vector<bool> getPMLdirections() const;
392
393 static amrex::LayoutData<amrex::Real>* getCosts (int lev);
394
395 void setLoadBalanceEfficiency (int lev, amrex::Real efficiency);
396
397 amrex::Real getLoadBalanceEfficiency (int lev);
398
403
404 amrex::Real time_of_last_gal_shift = 0;
407
409
411 std::unique_ptr<MultiReducedDiags> reduced_diags;
412
413 void applyMirrors(amrex::Real time);
414
416 void ComputeDt ();
417
423
426
433 // Compute max_step automatically for simulations in a boosted frame.
435
440 int MoveWindow (int step, bool move_j);
441
447 void ShiftGalileanBoundary ();
448
449 void ResetProbDomain (const amrex::RealBox& rb);
450 void EvolveE ( amrex::Real dt, amrex::Real start_time);
451 void EvolveE (int lev, amrex::Real dt, amrex::Real start_time);
452 void EvolveB ( amrex::Real dt, SubcyclingHalf subcycling_half, amrex::Real start_time);
453 void EvolveB (int lev, amrex::Real dt, SubcyclingHalf subcycling_half, amrex::Real start_time);
454 void EvolveF ( amrex::Real dt, int const rho_comp);
455 void EvolveF (int lev, amrex::Real dt, int const rho_comp);
456 void EvolveG ( amrex::Real dt);
457 void EvolveG (int lev, amrex::Real dt);
458 void EvolveB (int lev, PatchType patch_type, amrex::Real dt, SubcyclingHalf subcycling_half, amrex::Real start_time);
459 void EvolveE (int lev, PatchType patch_type, amrex::Real dt, amrex::Real start_time);
460 void EvolveF (int lev, PatchType patch_type, amrex::Real dt, int const rho_comp);
461 void EvolveG (int lev, PatchType patch_type, amrex::Real dt);
462
463 void MacroscopicEvolveE ( amrex::Real dt, amrex::Real start_time);
464 void MacroscopicEvolveE (int lev, amrex::Real dt, amrex::Real start_time);
465 void MacroscopicEvolveE (int lev, PatchType patch_type, amrex::Real dt, amrex::Real start_time);
466
472 void HybridPICEvolveFields ();
473
482
490
496
502 void Hybrid_QED_Push (int lev, amrex::Real dt);
503
510 void Hybrid_QED_Push (int lev, PatchType patch_type, amrex::Real dt);
511
512 amrex::Real m_quantum_xi_c2;
513
516 void CheckLoadBalance (int step);
517
520 void LoadBalance ();
521
524 void ResetCosts ();
525
532 void RescaleCosts (int step);
533
540
548 void DampFieldsInGuards (int lev,
549 const ablastr::fields::VectorField& Efield,
550 const ablastr::fields::VectorField& Bfield);
551
559 void DampFieldsInGuards (int lev, amrex::MultiFab* mf);
560
561#if defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
562 void ApplyInverseVolumeScalingToCurrentDensity(amrex::MultiFab* Jx,
563 amrex::MultiFab* Jy,
564 amrex::MultiFab* Jz,
565 int lev) const;
566
567 void ApplyInverseVolumeScalingToChargeDensity(amrex::MultiFab* Rho,
568 int lev) const;
569#endif
570
576 void ApplyRhofieldBoundary (int lev, amrex::MultiFab* Rho,
577 PatchType patch_type);
578
584 void ApplyJfieldBoundary (int lev, amrex::MultiFab* Jx,
586 PatchType patch_type);
587
588 void ApplyEfieldBoundary (int lev, PatchType patch_type, amrex::Real cur_time);
589 void ApplyBfieldBoundary (int lev, PatchType patch_type, SubcyclingHalf subcycling_half, amrex::Real cur_time);
590
591#if defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
592 // Applies the boundary conditions that are specific to the axis when in RZ.
593 void ApplyFieldBoundaryOnAxis (amrex::MultiFab* Er, amrex::MultiFab* Et, amrex::MultiFab* Ez, int lev) const;
594#endif
595
604 void ApplyElectronPressureBoundary (int lev, PatchType patch_type);
605
606 void DampPML ();
607 void DampPML (int lev);
608 void DampPML (int lev, PatchType patch_type);
609 void DampPML_Cartesian (int lev, PatchType patch_type);
610
611 void DampJPML ();
612 void DampJPML (int lev);
613 void DampJPML (int lev, PatchType patch_type);
614
615 void CopyJPML ();
616
618 static bool isAnyParticleBoundaryThermal();
619
620 PML* GetPML (int lev);
621#if (defined WARPX_DIM_RZ) && (defined WARPX_USE_FFT)
622 PML_RZ* GetPML_RZ (int lev);
623#endif
624
626 void doFieldIonization ();
627
628#ifdef WARPX_QED
630 void doQEDEvents ();
631#endif
632
633 void PushParticlesandDeposit (int lev, amrex::Real cur_time, SubcyclingHalf subcycling_half=SubcyclingHalf::None, bool skip_deposition=false,
634 PositionPushType position_push_type=PositionPushType::Full,
635 MomentumPushType momentum_push_type=MomentumPushType::Full,
636 ImplicitOptions const * implicit_options = nullptr);
637
638 void PushParticlesandDeposit (amrex::Real cur_time, bool skip_deposition=false,
639 PositionPushType position_push_type=PositionPushType::Full,
640 MomentumPushType momentum_push_type=MomentumPushType::Full,
641 ImplicitOptions const * implicit_options = nullptr);
642
643 // This function does aux(lev) = fp(lev) + I(aux(lev-1)-cp(lev)).
644 // Caller must make sure fp and cp have ghost cells filled.
645 void UpdateAuxilaryData ();
646 void UpdateAuxilaryDataStagToNodal ();
647 void UpdateAuxilaryDataSameType ();
648
649 // Fill boundary cells including coarse/fine boundaries
650 void FillBoundaryB (amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
651 void FillBoundaryE (amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
652 void FillBoundaryB_avg (amrex::IntVect ng);
653 void FillBoundaryE_avg (amrex::IntVect ng);
654
655 void FillBoundaryF (amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
656 void FillBoundaryG (amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
657 void FillBoundaryAux (amrex::IntVect ng);
658 void FillBoundaryE (int lev, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
659 void FillBoundaryB (int lev, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
660 void FillBoundaryE_avg (int lev, amrex::IntVect ng);
661 void FillBoundaryB_avg (int lev, amrex::IntVect ng);
662
663 void FillBoundaryF (int lev, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
664 void FillBoundaryG (int lev, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
665 void FillBoundaryAux (int lev, amrex::IntVect ng);
666
673 void SyncCurrentAndRho ();
674
685 void SyncCurrent (const std::string& current_fp_string);
686
687 void SyncRho ();
688
689 void SyncRho (
692 ablastr::fields::MultiLevelScalarField const & charge_buffer);
693
694 [[nodiscard]] amrex::Vector<int> getnsubsteps () const {return nsubsteps;}
695 [[nodiscard]] int getnsubsteps (int lev) const {return nsubsteps[lev];}
696 [[nodiscard]] amrex::Vector<int> getistep () const {return istep;}
697 [[nodiscard]] int getistep (int lev) const {return istep[lev];}
698 void setistep (int lev, int ii) {istep[lev] = ii;}
699 [[nodiscard]] amrex::Vector<amrex::Real> gett_old () const {return t_old;}
700 [[nodiscard]] amrex::Real gett_old (int lev) const {return t_old[lev];}
701 [[nodiscard]] amrex::Vector<amrex::Real> gett_new () const {return t_new;}
702 [[nodiscard]] amrex::Real gett_new (int lev) const {return t_new[lev];}
703 void sett_new (int lev, amrex::Real time) {t_new[lev] = time;}
704 [[nodiscard]] amrex::Vector<amrex::Real> getdt () const {return dt;}
705 [[nodiscard]] amrex::Real getdt (int lev) const {return dt.at(lev);}
706 [[nodiscard]] int getdo_moving_window() const {return do_moving_window;}
707 [[nodiscard]] amrex::Real getmoving_window_x() const {return moving_window_x;}
708 [[nodiscard]] bool getis_synchronized() const {return m_is_synchronized;}
709
710 [[nodiscard]] int maxStep () const {return max_step;}
711 void updateMaxStep (const int new_max_step) {max_step = new_max_step;}
712 [[nodiscard]] amrex::Real stopTime () const {return stop_time;}
713 void updateStopTime (const amrex::Real new_stop_time) {stop_time = new_stop_time;}
714
715 static std::array<amrex::Real,3> CellSize (int lev);
716 static amrex::XDim3 InvCellSize (int lev);
717 static amrex::RealBox getRealBox(const amrex::Box& bx, int lev);
718
727 static amrex::XDim3 LowerCorner (const amrex::Box& bx, int lev, amrex::Real time_shift_delta);
736 static amrex::XDim3 UpperCorner (const amrex::Box& bx, int lev, amrex::Real time_shift_delta);
737
738 static amrex::IntVect RefRatio (int lev);
739
740 static const amrex::iMultiFab* CurrentBufferMasks (int lev);
741 static const amrex::iMultiFab* GatherBufferMasks (int lev);
742
745
746 static int do_moving_window; // boolean
747 static int start_moving_window_step; // the first step to move window
748 static int end_moving_window_step; // the last step to move window
754 static int moving_window_active (int const step) {
755 bool const step_before_end = (step < end_moving_window_step) || (end_moving_window_step < 0);
756 bool const step_after_start = (step >= start_moving_window_step);
757 return do_moving_window && step_before_end && step_after_start;
758 }
760 static amrex::Real moving_window_v;
762
763 // these should be private, but can't due to Cuda limitations
764 static void ComputeDivB (amrex::MultiFab& divB, int dcomp,
766 const std::array<amrex::Real,3>& dx);
767
768 static void ComputeDivB (amrex::MultiFab& divB, int dcomp,
770 const std::array<amrex::Real,3>& dx, amrex::IntVect ngrow);
771
772 void ComputeDivE(amrex::MultiFab& divE, int lev);
773
774 void ProjectionCleanDivB ();
776
777 [[nodiscard]] amrex::IntVect getngEB() const { return guard_cells.ng_alloc_EB; }
778 [[nodiscard]] amrex::IntVect getngF() const { return guard_cells.ng_alloc_F; }
779 [[nodiscard]] amrex::IntVect getngUpdateAux() const { return guard_cells.ng_UpdateAux; }
780 [[nodiscard]] amrex::IntVect get_ng_depos_J() const {return guard_cells.ng_depos_J;}
781 [[nodiscard]] amrex::IntVect get_ng_depos_rho() const {return guard_cells.ng_depos_rho;}
782 [[nodiscard]] amrex::IntVect get_ng_fieldgather () const {return guard_cells.ng_FieldGather;}
783
791 [[nodiscard]] amrex::IntVect get_numprocs() const {return numprocs;}
792
794 void ComputeSpaceChargeField (bool reset_fields);
795
796 // Magnetostatic Solver Interface
804 amrex::Real required_precision=amrex::Real(1.e-11),
805 amrex::Real absolute_tolerance=amrex::Real(0.0),
806 int max_iters=200,
807 int verbosity=2); // const;
808
810
830 const std::variant<warpx::fields::FieldType, std::string>& field,
831 amrex::ParserExecutor<4> const& fx_parser,
832 amrex::ParserExecutor<4> const& fy_parser,
833 amrex::ParserExecutor<4> const& fz_parser,
834 int lev, PatchType patch_type,
835 amrex::Vector<std::array< std::unique_ptr<amrex::iMultiFab>,3 > > const& eb_update_field,
836 bool use_eb_flags = true);
837
842 void LoadExternalFields (int lev);
843
849 const std::string& read_fields_from_path, amrex::MultiFab* mf,
850 const std::string& F_name, const std::string& F_component);
851
860 void InitializeEBGridData(int lev);
861
868
869 void ApplyFilterandSumBoundaryRho (int lev, int glev, amrex::MultiFab& rho, int icomp, int ncomp);
870
871 void ApplyFilterMF (
873 int lev,
874 int idim);
875
876 void ApplyFilterMF (
878 int lev);
879
880 // Device vectors of stencil coefficients used for finite-order centering of fields
884
885 // Device vectors of stencil coefficients used for finite-order centering of currents
889
890 // This needs to be public for CUDA.
892 void ErrorEst (int lev, amrex::TagBoxArray& tags, amrex::Real time, int /*ngrow*/) final;
893
894 // Return the accelerator lattice instance defined at the given refinement level
896
897 // for cuda
898 void BuildBufferMasksInBox ( amrex::Box tbx, amrex::IArrayBox &buffer_mask,
899 const amrex::IArrayBox &guard_mask, int ng );
900#ifdef AMREX_USE_EB
901 [[nodiscard]] amrex::EBFArrayBoxFactory const& fieldEBFactory (int lev) const noexcept {
902 return static_cast<amrex::EBFArrayBoxFactory const&>(*m_field_factory[lev]);
903 }
904#endif
905
906 void InitEB ();
907
911 void ComputeDistanceToEB ();
916 void ComputeFaceExtensions();
920 void ComputeOneWayExtensions();
924 void ComputeEightWaysExtensions();
925
926#ifdef WARPX_USE_FFT
927 auto& get_spectral_solver_fp (int lev) {return *spectral_solver_fp[lev];}
928#endif
929
931
932 // Field container
935
938 void PostProcessBaseGrids (amrex::BoxArray& ba0) const final;
939
940protected:
941
967 void InitLevelData (int lev, amrex::Real time);
968
970 [[nodiscard]] amrex::DistributionMapping
971 MakeDistributionMap (int lev, amrex::BoxArray const& ba) final;
972
976 void MakeNewLevelFromScratch (int lev, amrex::Real time, const amrex::BoxArray& new_grids,
977 const amrex::DistributionMapping& new_dmap) final;
978
982 void MakeNewLevelFromCoarse (int /*lev*/, amrex::Real /*time*/, const amrex::BoxArray& /*ba*/,
983 const amrex::DistributionMapping& /*dm*/) final;
984
988 void RemakeLevel (int lev, amrex::Real time, const amrex::BoxArray& ba,
989 const amrex::DistributionMapping& dm) final;
990
992 void ClearLevel (int lev) final;
993
994private:
995
1002 WarpX ();
1003
1008 static void MakeWarpX ();
1009
1010 // Singleton is used when the code is run from python
1012
1014 void HandleSignals ();
1015
1016 void FillBoundaryB (int lev, PatchType patch_type, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
1017 void FillBoundaryE (int lev, PatchType patch_type, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
1018 void FillBoundaryF (int lev, PatchType patch_type, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
1019 void FillBoundaryG (int lev, PatchType patch_type, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
1020
1021 void FillBoundaryB_avg (int lev, PatchType patch_type, amrex::IntVect ng);
1022 void FillBoundaryE_avg (int lev, PatchType patch_type, amrex::IntVect ng);
1023
1024 void AddExternalFields (int lev);
1025
1030 void OneStep (
1031 amrex::Real a_cur_time,
1032 amrex::Real a_dt,
1033 int a_step
1034 );
1035
1036 void OneStep_nosub (amrex::Real cur_time);
1037 void OneStep_sub1 (amrex::Real cur_time);
1038
1042 void OneStep_JRhom (amrex::Real cur_time);
1043
1047 int lev);
1052 int lev);
1053 void SumBoundaryJ (
1055 int lev,
1056 int idim,
1057 const amrex::Periodicity& period);
1058 void SumBoundaryJ (
1060 int lev,
1061 const amrex::Periodicity& period);
1062
1063 void RestrictRhoFromFineToCoarsePatch (int lev );
1067 int lev,
1068 PatchType patch_type,
1069 int icomp,
1070 int ncomp);
1074 ablastr::fields::MultiLevelScalarField const & charge_buffer,
1075 int lev,
1076 int icomp,
1077 int ncomp);
1078
1079 void ReadParameters ();
1080
1083 void BackwardCompatibility ();
1084
1086
1087 void AllocLevelData (int lev, const amrex::BoxArray& ba,
1088 const amrex::DistributionMapping& dm);
1089
1090 [[nodiscard]] amrex::DistributionMapping
1091 GetRestartDMap (const std::string& chkfile, const amrex::BoxArray& ba, int lev) const;
1092
1093 void InitFromCheckpoint ();
1095
1096 void InitPML ();
1098
1099 void InitFilter ();
1100
1102
1104
1110
1111 void BuildBufferMasks ();
1112
1113 [[nodiscard]] const amrex::iMultiFab* getCurrentBufferMasks (int lev) const {
1114 return current_buffer_masks[lev].get();
1115 }
1116
1117 [[nodiscard]] const amrex::iMultiFab* getGatherBufferMasks (int lev) const
1118 {
1119 return gather_buffer_masks[lev].get();
1120 }
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, bool aux_is_nodal);
1126
1127#ifdef WARPX_USE_FFT
1128# ifdef WARPX_DIM_RZ
1129 void AllocLevelSpectralSolverRZ (amrex::Vector<std::unique_ptr<SpectralSolverRZ>>& spectral_solver,
1130 int lev,
1131 const amrex::BoxArray& realspace_ba,
1133 const std::array<amrex::Real,3>& dx);
1134# else
1135 void AllocLevelSpectralSolver (amrex::Vector<std::unique_ptr<SpectralSolver>>& spectral_solver,
1136 int lev,
1137 const amrex::BoxArray& realspace_ba,
1139 const std::array<amrex::Real,3>& dx,
1140 bool pml_flag=false);
1141# endif
1142#endif
1143
1145 std::string m_authors;
1146
1148 amrex::Vector<int> nsubsteps; // how many substeps on each level?
1149
1153 utils::parser::IntervalsParser m_dt_update_interval = utils::parser::IntervalsParser{}; // How often to update the timestep when using adaptive timestepping
1154
1156
1157 // Particle container
1158 std::unique_ptr<MultiParticleContainer> mypc;
1159 std::unique_ptr<MultiDiagnostics> multi_diags;
1160
1167
1168 // Fluid container
1169 bool do_fluid_species = false;
1170 std::unique_ptr<MultiFluidContainer> myfl;
1171
1174
1179
1180 //
1181 // Fields: First array for level, second for direction
1182 //
1183
1184 // Masks for computing dot product and global moments of fields when using grids that
1185 // have shared locations across different ranks (e.g., a Yee grid)
1190
1196
1203
1218
1223
1224 // Copy of the coarse aux
1227
1228 // PML
1229 int do_pml = 0;
1231 int pml_ncell = 10;
1232 int pml_delta = 10;
1237 bool do_pml_dive_cleaning; // default set in WarpX.cpp
1238 bool do_pml_divb_cleaning; // default set in WarpX.cpp
1242#if (defined WARPX_DIM_RZ) && (defined WARPX_USE_FFT)
1244#endif
1245 amrex::Real v_particle_pml;
1246
1247 // Insulator boundary conditions
1248 std::unique_ptr<PEC_Insulator> pec_insulator_boundary;
1249
1250 // External fields parameters
1251 std::unique_ptr<ExternalFieldParams> m_p_ext_field_params;
1252
1253 amrex::Real moving_window_x = std::numeric_limits<amrex::Real>::max();
1254
1255 // Mirrors
1260
1261 // Plasma injection parameters
1265
1266 // Timestepping parameters
1267 std::optional<amrex::Real> m_const_dt;
1268 std::optional<amrex::Real> m_max_dt;
1269
1270 // whether to use subcycling
1271 bool m_do_subcycling = false;
1272
1276
1277 // Macroscopic properties
1278 std::unique_ptr<MacroscopicProperties> m_macroscopic_properties;
1279
1280 // Electrostatic solver
1281 std::unique_ptr<ElectrostaticSolver> m_electrostatic_solver;
1282
1283 // Hybrid PIC algorithm parameters
1284 std::unique_ptr<HybridPICModel> m_hybrid_pic_model;
1285
1286 // Load balancing
1299 amrex::Real load_balance_knapsack_factor = amrex::Real(1.24);
1305 amrex::Real load_balance_efficiency_ratio_threshold = amrex::Real(1.1);
1313 amrex::Real costs_heuristic_cells_wt = amrex::Real(0);
1319 amrex::Real costs_heuristic_particles_wt = amrex::Real(0);
1320
1321 // Determines timesteps for override sync
1323
1324 // Other runtime parameters
1325 int verbose = 1;
1327
1328 bool use_hybrid_QED = false;
1329
1330 int max_step = std::numeric_limits<int>::max();
1331 amrex::Real stop_time = std::numeric_limits<amrex::Real>::max();
1332
1336 std::optional<amrex::Real> m_zmax_plasma_to_compute_max_step = std::nullopt;
1337
1338 int regrid_int = -1;
1339
1340 amrex::Real cfl = amrex::Real(0.999);
1341
1342 std::string restart_chkfile;
1343
1346
1348
1349 bool use_single_read = true;
1350 bool use_single_write = true;
1354
1358 std::unique_ptr<amrex::Parser> ref_patch_parser;
1359
1361
1362 // Synchronization of nodal points
1363 static constexpr bool sync_nodal_points = true;
1364
1366
1367 // Slice Parameters
1372
1374 int nox_fft = 16;
1375 int noy_fft = 16;
1376 int noz_fft = 16;
1377
1378
1379
1381#if defined(AMREX_USE_CUDA)
1383#else
1385#endif
1386
1389
1393
1396
1398 std::unique_ptr<ParticleBoundaryBuffer> m_particle_boundary_buffer;
1399
1400 // Accelerator lattice elements
1402
1403 //
1404 // Embedded Boundary
1405 //
1406
1407 // Factory for field data
1409
1413
1416 [[nodiscard]]
1417 bool checkStopSimulation (amrex::Real cur_time);
1418
1427 void HandleParticlesAtBoundaries (int step, amrex::Real cur_time, int num_moved);
1428
1435
1440
1441 void PushPSATD (amrex::Real start_time);
1442
1443#ifdef WARPX_USE_FFT
1444
1449
1455
1473
1484 std::string const & J_fp_string,
1485 std::string const & J_cp_string,
1486 bool apply_kspace_filter=true);
1487
1495 std::string const & J_fp_string,
1496 std::string const & J_cp_string);
1497
1510 std::string const & charge_fp_string,
1511 std::string const & charge_cp_string,
1512 int icomp, int dcomp, bool apply_kspace_filter=true);
1513
1518
1522 void PSATDMoveJNewToJOld ();
1523
1528
1532 void PSATDMoveJNewToJMid ();
1533
1537 void PSATDForwardTransformF ();
1538
1543
1547 void PSATDForwardTransformG ();
1548
1553
1558
1564 void PSATDScaleAverageFields (amrex::Real scale_factor);
1565
1570
1571# ifdef WARPX_DIM_RZ
1574# else
1577# endif
1578
1579#endif
1580
1583
1584 // implicit solver object
1585 std::unique_ptr<ImplicitSolver> m_implicit_solver;
1586
1588 bool m_JRhom = false;
1590
1598};
1599
1600#endif
#define AMREX_D_DECL(a, b, c)
@ WarpX
Definition FilterFunctors.H:25
EvolveScheme
struct to select the overall evolve scheme
Definition WarpXAlgorithmSelection.H:37
@ Default
Definition WarpXAlgorithmSelection.H:37
@ Default
Definition WarpXAlgorithmSelection.H:120
@ Default
Definition WarpXAlgorithmSelection.H:106
@ Default
Definition WarpXAlgorithmSelection.H:58
@ Default
Definition WarpXAlgorithmSelection.H:66
@ Default
Definition WarpXAlgorithmSelection.H:90
@ Default
Definition WarpXAlgorithmSelection.H:86
@ Default
Definition WarpXAlgorithmSelection.H:79
MacroscopicSolverAlgo
struct to select algorithm for macroscopic Maxwell solver LaxWendroff (semi-implicit) represents sigm...
Definition WarpXAlgorithmSelection.H:48
@ Default
Definition WarpXAlgorithmSelection.H:48
MediumForEM
struct to determine the computational medium, i.e., vacuum or material/macroscopic default is vacuum.
Definition WarpXAlgorithmSelection.H:27
@ Default
Definition WarpXAlgorithmSelection.H:27
@ Default
Definition WarpXAlgorithmSelection.H:72
PositionPushType
For advanced collision algorithms that split the particle push in substeps.
Definition WarpXAlgorithmSelection.H:181
@ Full
Definition WarpXAlgorithmSelection.H:181
PSATDSolutionType
Definition WarpXAlgorithmSelection.H:100
@ Default
Definition WarpXAlgorithmSelection.H:100
@ Default
Definition WarpXAlgorithmSelection.H:95
MomentumPushType
For advanced collision algorithms that split the particle push in substeps.
Definition WarpXAlgorithmSelection.H:189
@ Full
Definition WarpXAlgorithmSelection.H:189
@ Default
Definition WarpXAlgorithmSelection.H:112
SubcyclingHalf
Subcycling half selector.
Definition WarpXAlgorithmSelection.H:166
@ None
Definition WarpXAlgorithmSelection.H:166
Definition AcceleratorLattice.H:21
Definition BilinearFilter.H:17
Base class for Electrostatic Solver.
Definition ElectrostaticSolver.H:25
Top-level class for the electromagnetic finite-difference solver.
Definition FiniteDifferenceSolver.H:40
This class contains the parameters needed to evaluate hybrid field solutions (kinetic ions with fluid...
Definition HybridPICModel.H:41
Definition MagnetostaticSolver.H:23
This class contains a vector of all diagnostics in the simulation.
Definition MultiDiagnostics.H:19
Definition MultiFluidContainer.H:36
Definition MultiParticleContainer.H:68
Definition PML_RZ.H:33
Definition PML.H:138
Definition ParticleBoundaryBuffer.H:24
std::unique_ptr< ParticleBoundaryBuffer > m_particle_boundary_buffer
particle buffer for scraped particles on the boundaries
Definition WarpX.H:1398
void PSATDMoveRhoNewToRhoOld()
Copy rho_new to rho_old in spectral space (when rho is linear in time)
Definition WarpXPushFieldsEM.cpp:646
static auto field_gathering_algo
Integer that corresponds to the field gathering algorithm (energy-conserving, momentum-conserving)
Definition WarpX.H:182
static int field_centering_nox
Order of finite centering of fields (from staggered grid to nodal grid), along x.
Definition WarpX.H:271
static auto particle_pusher_algo
Integer that corresponds to the particle push algorithm (Boris, Vay, Higuera-Cary)
Definition WarpX.H:184
amrex::Vector< std::unique_ptr< amrex::iMultiFab > > m_eb_reduce_particle_shape
Definition WarpX.H:1202
amrex::Vector< std::unique_ptr< amrex::LayoutData< amrex::Real > > > costs
Definition WarpX.H:1292
void LoadExternalFields(int lev)
Load field values from a user-specified openPMD file, for the fields Ex, Ey, Ez, Bx,...
int maxlevel_extEMfield_init
Definition WarpX.H:174
std::unique_ptr< PEC_Insulator > pec_insulator_boundary
Definition WarpX.H:1248
amrex::Gpu::DeviceVector< amrex::Real > device_field_centering_stencil_coeffs_y
Definition WarpX.H:882
static int moving_window_dir
Definition WarpX.H:759
amrex::Gpu::DeviceVector< amrex::Real > device_current_centering_stencil_coeffs_x
Definition WarpX.H:886
amrex::Real m_quantum_xi_c2
Definition WarpX.H:512
void InitFilter()
void BuildBufferMasks()
Definition WarpX.cpp:3399
void PSATDMoveJNewToJMid()
Copy J_new to J_mid in spectral space (when J is quadratic in time)
Definition WarpXPushFieldsEM.cpp:698
void SaveParticlesAtImplicitStepStart()
Definition WarpXImplicitOps.cpp:131
HybridPICModel * get_pointer_HybridPICModel() const
Definition WarpX.H:156
static auto poisson_solver_id
Definition WarpX.H:744
void PushPSATD(amrex::Real start_time)
Definition WarpXPushFieldsEM.cpp:771
bool use_hybrid_QED
Definition WarpX.H:1328
static bool do_dive_cleaning
Definition WarpX.H:256
bool DoFluidSpecies() const
Definition WarpX.H:388
std::unique_ptr< MacroscopicProperties > m_macroscopic_properties
Definition WarpX.H:1278
bool DoPML() const
Definition WarpX.H:387
void ProjectionCleanDivB()
Definition ProjectionDivCleaner.cpp:397
static constexpr bool sync_nodal_points
Definition WarpX.H:1363
int pml_delta
Definition WarpX.H:1232
amrex::Vector< std::unique_ptr< amrex::FabFactory< amrex::FArrayBox > > > m_field_factory
Definition WarpX.H:1408
bool getis_synchronized() const
Definition WarpX.H:708
void PSATDBackwardTransformJ(std::string const &J_fp_string, std::string const &J_cp_string)
Backward FFT of J on all mesh refinement levels.
Definition WarpXPushFieldsEM.cpp:545
int do_pml_j_damping
Definition WarpX.H:1234
EvolveScheme evolve_scheme
Integer that corresponds to the evolve scheme (explicit, semi_implicit_em, theta_implicit_em)
Definition WarpX.H:188
int noy_fft
Definition WarpX.H:1375
amrex::Vector< amrex::Real > m_v_galilean
Definition WarpX.H:405
void ResetProbDomain(const amrex::RealBox &rb)
Definition WarpXMovingWindow.cpp:760
static amrex::Array< ParticleBoundaryType, 3 > particle_boundary_hi
Definition WarpX.H:213
amrex::Vector< std::unique_ptr< amrex::iMultiFab > > gather_buffer_masks
Definition WarpX.H:1226
void updateStopTime(const amrex::Real new_stop_time)
Definition WarpX.H:713
void OneStep_nosub(amrex::Real cur_time)
Perform one PIC iteration, without subcycling i.e. all levels/patches use the same timestep (that of ...
Definition WarpXEvolve.cpp:485
void RestrictCurrentFromFineToCoarsePatch(const ablastr::fields::MultiLevelVectorField &J_fp, const ablastr::fields::MultiLevelVectorField &J_cp, int lev)
Fills the values of the current on the coarse patch by averaging the values of the current of the fin...
Definition WarpXComm.cpp:1399
static amrex::Real zmin_domain_boost_step_0
Definition WarpX.H:318
ParticleBoundaryBuffer & GetParticleBoundaryBuffer()
Definition WarpX.H:158
void PSATDBackwardTransformEBavg(ablastr::fields::MultiLevelVectorField const &E_avg_fp, ablastr::fields::MultiLevelVectorField const &B_avg_fp, ablastr::fields::MultiLevelVectorField const &E_avg_cp, ablastr::fields::MultiLevelVectorField const &B_avg_cp)
Backward FFT of averaged E,B on all mesh refinement levels.
Definition WarpXPushFieldsEM.cpp:349
amrex::Vector< std::array< std::unique_ptr< amrex::iMultiFab >, 3 > > & GetEBUpdateEFlag()
Definition WarpX.H:159
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:330
void SyncMassMatricesPC()
Definition WarpXComm.cpp:1289
static int n_field_gather_buffer
Definition WarpX.H:337
amrex::Vector< amrex::Real > t_new
Definition WarpX.H:1150
static bool do_single_precision_comms
perform field communications in single precision
Definition WarpX.H:234
amrex::IntVect slice_cr_ratio
Definition WarpX.H:1371
int field_io_nfiles
Definition WarpX.H:1352
amrex::Vector< int > getnsubsteps() const
Definition WarpX.H:694
guardCellManager guard_cells
Definition WarpX.H:1365
int magnetostatic_solver_verbosity
Definition WarpX.H:799
static void ComputeDivB(amrex::MultiFab &divB, int dcomp, ablastr::fields::VectorField const &B, const std::array< amrex::Real, 3 > &dx)
Definition WarpX.cpp:3212
void UpdateDtFromParticleSpeeds()
Definition WarpXComputeDt.cpp:115
static bool do_shared_mem_charge_deposition
used shared memory algorithm for charge deposition
Definition WarpX.H:237
void ComputeMagnetostaticField()
Definition MagnetostaticSolver.cpp:62
amrex::Real stop_time
Definition WarpX.H:1331
void EvolveG(amrex::Real dt)
Definition WarpXPushFieldsEM.cpp:1141
static amrex::Vector< int > boost_direction
Direction of the Lorentz transform that defines the boosted frame of the simulation.
Definition WarpX.H:119
void ComputeDt()
Definition WarpXComputeDt.cpp:45
bool m_exit_loop_due_to_interrupt_signal
Definition WarpX.H:1412
static bool use_fdtd_nci_corr
Definition WarpX.H:287
FiniteDifferenceSolver * get_pointer_fdtd_solver_fp(int lev)
Definition WarpX.H:930
amrex::IntVect m_sort_idx_type
Specifies the type of grid used for the above sorting, i.e. cell-centered, nodal, or mixed.
Definition WarpX.H:1388
static amrex::Real moving_window_v
Definition WarpX.H:760
static bool do_shared_mem_current_deposition
use shared memory algorithm for current deposition
Definition WarpX.H:240
const AcceleratorLattice & get_accelerator_lattice(int lev)
Definition WarpX.H:895
amrex::Vector< amrex::IntVect > do_pml_Hi
Definition WarpX.H:1240
std::string GetAuthors() const
If an authors' string is specified in the inputfile, this method returns that string....
Definition WarpX.H:168
void setistep(int lev, int ii)
Definition WarpX.H:698
void CheckLoadBalance(int step)
Definition WarpXRegrid.cpp:58
static auto load_balance_costs_update_algo
Definition WarpX.H:192
static bool fft_do_time_averaging
Definition WarpX.H:761
void PSATDForwardTransformEB()
Forward FFT of E,B on all mesh refinement levels.
Definition WarpXPushFieldsEM.cpp:267
amrex::Vector< std::unique_ptr< PML > > pml
Definition WarpX.H:1241
void OneStep_JRhom(amrex::Real cur_time)
Perform one PIC iteration, with the multiple J deposition per time step.
Definition WarpXEvolve.cpp:779
void FillBoundaryE_avg(amrex::IntVect ng)
Definition WarpXComm.cpp:724
static amrex::Array< ParticleBoundaryType, 3 > particle_boundary_lo
Definition WarpX.H:207
amrex::RealVect fine_tag_lo
Definition WarpX.H:1355
void SumBoundaryJ(const ablastr::fields::MultiLevelVectorField &current, int lev, int idim, const amrex::Periodicity &period)
Definition WarpXComm.cpp:1450
std::string restart_chkfile
Definition WarpX.H:1342
static WarpX * m_instance
Definition WarpX.H:1011
void HybridPICInitializeRhoJandB()
Hybrid-PIC initial deposition function. The hybrid-PIC algorithm uses the charge and current density ...
Definition WarpXPushFieldsHybridPIC.cpp:286
int m_current_centering_noz
Order of finite centering of currents (from nodal grid to staggered grid), along z.
Definition WarpX.H:1166
static bool do_dynamic_scheduling
Definition WarpX.H:323
void computeVectorPotential(ablastr::fields::MultiLevelVectorField const &curr, ablastr::fields::MultiLevelVectorField const &A, amrex::Real required_precision=amrex::Real(1.e-11), amrex::Real absolute_tolerance=amrex::Real(0.0), int max_iters=200, int verbosity=2)
Definition MagnetostaticSolver.cpp:165
void PostRestart()
void InitFromCheckpoint()
Definition WarpXIO.cpp:95
std::unique_ptr< amrex::Parser > ref_patch_parser
User-defined parser to define refinement patches.
Definition WarpX.H:1358
amrex::Gpu::DeviceVector< amrex::Real > device_field_centering_stencil_coeffs_z
Definition WarpX.H:883
amrex::Real stopTime() const
Definition WarpX.H:712
amrex::Vector< std::unique_ptr< PML_RZ > > pml_rz
Definition WarpX.H:1243
void FillBoundaryE(amrex::IntVect ng, std::optional< bool > nodal_sync=std::nullopt)
Definition WarpXComm.cpp:688
amrex::Vector< amrex::Real > m_v_comoving
Definition WarpX.H:408
void InitData()
std::unique_ptr< MultiFluidContainer > myfl
Definition WarpX.H:1170
void PSATDBackwardTransformG()
Backward FFT of G on all mesh refinement levels.
Definition WarpXPushFieldsEM.cpp:445
amrex::Array< amrex::Real, 3 > m_galilean_shift
Definition WarpX.H:406
amrex::Gpu::DeviceVector< amrex::Real > device_field_centering_stencil_coeffs_x
Definition WarpX.H:881
std::unique_ptr< HybridPICModel > m_hybrid_pic_model
Definition WarpX.H:1284
amrex::Vector< amrex::Real > getdt() const
Definition WarpX.H:704
bool m_safe_guard_cells
Definition WarpX.H:1155
static int noz
Order of the particle shape factors (splines) along z.
Definition WarpX.H:265
amrex::Gpu::DeviceVector< amrex::Real > device_current_centering_stencil_coeffs_z
Definition WarpX.H:888
int mffile_nstreams
Definition WarpX.H:1351
void AddMagnetostaticFieldLabFrame()
Definition MagnetostaticSolver.cpp:75
void SpectralSourceFreeFieldAdvance(amrex::Real start_time)
Definition WarpXImplicitOps.cpp:93
bool m_JRhom
PSATD JRhom algorithm.
Definition WarpX.H:1588
bool do_pml_divb_cleaning
Definition WarpX.H:1238
int magnetostatic_solver_max_iters
Definition WarpX.H:798
static auto time_dependency_J
Definition WarpX.H:217
static amrex::Array< FieldBoundaryType, 3 > field_boundary_lo
Definition WarpX.H:196
void ReadParameters()
Definition WarpX.cpp:540
amrex::Vector< amrex::Real > gett_old() const
Definition WarpX.H:699
void setVectorPotentialBC(ablastr::fields::MultiLevelVectorField const &A) const
Definition MagnetostaticSolver.cpp:241
static void ResetInstance()
Definition WarpX.cpp:308
int verbose
Definition WarpX.H:1325
amrex::Gpu::DeviceVector< amrex::Real > device_current_centering_stencil_coeffs_y
Definition WarpX.H:887
void InitDiagnostics()
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...
static auto electromagnetic_solver_id
Integer that corresponds to the type of Maxwell solver (Yee, CKC, PSATD, ECT)
Definition WarpX.H:186
amrex::Real load_balance_knapsack_factor
Definition WarpX.H:1299
int MoveWindow(int step, bool move_j)
Move the moving window.
Definition WarpXMovingWindow.cpp:357
amrex::Vector< amrex::Real > load_balance_efficiency
Definition WarpX.H:1307
static amrex::IntVect sort_bin_size
Definition WarpX.H:327
amrex::IntVect m_rho_nodal_flag
Definition WarpX.H:348
void PSATDMoveRhoNewToRhoMid()
Copy rho_new to rho_mid in spectral space (when rho is quadratic in time)
Definition WarpXPushFieldsEM.cpp:662
utils::parser::IntervalsParser load_balance_intervals
Definition WarpX.H:1289
amrex::Vector< std::array< std::unique_ptr< amrex::iMultiFab >, 3 > > m_flag_ext_face
Definition WarpX.H:1217
amrex::IntVect getngEB() const
Definition WarpX.H:777
utils::parser::IntervalsParser override_sync_intervals
Definition WarpX.H:1322
static auto charge_deposition_algo
Integer that corresponds to the charge deposition algorithm (only standard deposition)
Definition WarpX.H:180
amrex::Vector< std::array< std::unique_ptr< amrex::iMultiFab >, 3 > > Efield_dotMask
Definition WarpX.H:1186
utils::parser::IntervalsParser get_load_balance_intervals() const
returns the load balance interval
Definition WarpX.H:536
void ComputeCostsHeuristic(amrex::Vector< std::unique_ptr< amrex::LayoutData< amrex::Real > > > &costs)
adds particle and cell contributions in cells to compute heuristic cost in each box on each level,...
Definition WarpXRegrid.cpp:331
amrex::Real gett_old(int lev) const
Definition WarpX.H:700
static int do_moving_window
Definition WarpX.H:746
amrex::Real moving_window_x
Definition WarpX.H:1253
void EvolveF(amrex::Real dt, int const rho_comp)
Definition WarpXPushFieldsEM.cpp:1087
amrex::Vector< std::array< std::unique_ptr< amrex::iMultiFab >, 3 > > & GetEBUpdateBFlag()
Definition WarpX.H:160
int maxStep() const
Definition WarpX.H:710
static int nox
Order of the particle shape factors (splines) along x.
Definition WarpX.H:261
int getnsubsteps(int lev) const
Definition WarpX.H:695
WarpX(WarpX const &)=delete
amrex::Vector< int > getistep() const
Definition WarpX.H:696
void InitFromScratch()
bool synchronize_velocity_for_diagnostics
Definition WarpX.H:1347
PSATDSolutionType m_psatd_solution_type
Definition WarpX.H:1439
amrex::Vector< int > m_mirror_z_npoints
Definition WarpX.H:1259
amrex::Vector< std::array< std::unique_ptr< amrex::iMultiFab >, 3 > > m_flag_info_face
Definition WarpX.H:1210
void updateMaxStep(const int new_max_step)
Definition WarpX.H:711
void UpdateMagneticFieldAndApplyBCs(ablastr::fields::MultiLevelVectorField const &a_Bn, amrex::Real a_thetadt, amrex::Real start_time)
Definition WarpXImplicitOps.cpp:65
void PSATDMoveJNewToJOld()
Copy J_new to J_old in spectral space (when J is linear in time)
Definition WarpXPushFieldsEM.cpp:678
static bool serialize_initial_conditions
If true, the initial conditions from random number generators are serialized (useful for reproducible...
Definition WarpX.H:307
std::optional< amrex::Real > m_zmax_plasma_to_compute_max_step
Definition WarpX.H:1336
amrex::Vector< std::unique_ptr< SpectralSolverRZ > > spectral_solver_fp
Definition WarpX.H:1572
static amrex::IntVect m_fill_guards_fields
Whether to fill guard cells when computing inverse FFTs of fields.
Definition WarpX.H:249
MacroscopicSolverAlgo m_macroscopic_solver_algo
Definition WarpX.H:1178
void SynchronizeVelocityWithPosition()
Definition WarpXEvolve.cpp:112
ablastr::fields::MultiFabRegister & GetMultiFabRegister()
Definition WarpX.H:934
void EvolveB(amrex::Real dt, SubcyclingHalf subcycling_half, amrex::Real start_time)
Definition WarpXPushFieldsEM.cpp:946
static bool use_filter_compensation
If true, a compensation step is added to the bilinear filtering of charge and currents.
Definition WarpX.H:304
amrex::Vector< std::array< std::unique_ptr< amrex::LayoutData< FaceInfoBox > >, 3 > > m_borrowing
Definition WarpX.H:1222
void HybridPICDepositRhoAndJ()
Hybrid-PIC deposition function. Helper function to contain all the needed logic to deposit charge and...
Definition WarpXPushFieldsHybridPIC.cpp:233
void PSATDPushSpectralFields()
Update all necessary fields in spectral space.
Definition WarpXPushFieldsEM.cpp:632
amrex::Real cfl
Definition WarpX.H:1340
bool m_sort_particles_for_deposition
If true, particles will be sorted in the order x -> y -> z -> ppc for faster deposition.
Definition WarpX.H:1384
amrex::Real gett_new(int lev) const
Definition WarpX.H:702
amrex::Vector< amrex::Real > dt
Definition WarpX.H:1152
MultiFluidContainer & GetFluidContainer()
Definition WarpX.H:154
void HybridPICEvolveFields()
Hybrid-PIC field evolve function. This function contains the logic involved in evolving the electric ...
Definition WarpXPushFieldsHybridPIC.cpp:25
int nox_fft
Definition WarpX.H:1374
int particle_io_nfiles
Definition WarpX.H:1353
void AllocInitMultiFab(std::unique_ptr< amrex::iMultiFab > &mf, const amrex::BoxArray &ba, const amrex::DistributionMapping &dm, int ncomp, const amrex::IntVect &ngrow, int level, const std::string &name, std::optional< const int > initial_value={})
Allocate and optionally initialize the iMultiFab. This also adds the iMultiFab to the map of MultiFab...
Definition WarpX.cpp:3485
static WarpX & GetInstance()
Definition WarpX.cpp:299
static auto grid_type
Definition WarpX.H:345
void AddCurrentFromFineLevelandSumBoundary(const ablastr::fields::MultiLevelVectorField &J_fp, const ablastr::fields::MultiLevelVectorField &J_cp, const ablastr::fields::MultiLevelVectorField &J_buffer, int lev)
Update the currents of lev by adding the currents from particles that are in the mesh refinement patc...
Definition WarpXComm.cpp:1517
amrex::RealVect fine_tag_hi
Definition WarpX.H:1356
amrex::IntVect get_ng_fieldgather() const
Definition WarpX.H:782
amrex::IntVect get_ng_depos_rho() const
Definition WarpX.H:781
const amrex::iMultiFab * getFieldDotMaskPointer(warpx::fields::FieldType field_type, int lev, ablastr::fields::Direction dir) const
Get pointer to the amrex::MultiFab containing the dotMask for the specified field.
Definition WarpX.cpp:3532
static int start_moving_window_step
Definition WarpX.H:747
amrex::Vector< std::array< std::unique_ptr< amrex::iMultiFab >, 3 > > Afield_dotMask
Definition WarpX.H:1188
const amrex::iMultiFab * getCurrentBufferMasks(int lev) const
Definition WarpX.H:1113
void OneStep_sub1(amrex::Real cur_time)
Perform one PIC iteration, with subcycling i.e. The fine patch uses a smaller timestep (and steps mor...
Definition WarpXEvolve.cpp:999
void PSATDForwardTransformF()
Forward FFT of F on all mesh refinement levels.
Definition WarpXPushFieldsEM.cpp:375
int do_silver_mueller
Definition WarpX.H:1230
void RescaleCosts(int step)
Definition WarpXRegrid.cpp:381
amrex::Vector< int > istep
Definition WarpX.H:1147
bool m_do_initial_div_cleaning
Definition WarpX.H:1392
void PrintMainPICparameters()
const amrex::Array< FieldBoundaryType, 3 > & GetFieldBoundaryHi() const
Definition WarpX.H:120
void FillBoundaryB(amrex::IntVect ng, std::optional< bool > nodal_sync=std::nullopt)
Definition WarpXComm.cpp:679
void HandleSignals()
Complete the asynchronous broadcast of signal flags, and initiate a checkpoint if requested.
Definition WarpXEvolve.cpp:1423
static int n_current_deposition_buffer
Definition WarpX.H:341
void HandleParticlesAtBoundaries(int step, amrex::Real cur_time, int num_moved)
Definition WarpXEvolve.cpp:655
int Verbose() const
Definition WarpX.H:113
bool m_verboncoeur_axis_correction
Definition WarpX.H:1275
void PSATDScaleAverageFields(amrex::Real scale_factor)
Scale averaged E,B fields to account for time integration.
Definition WarpXPushFieldsEM.cpp:744
amrex::DistributionMapping GetRestartDMap(const std::string &chkfile, const amrex::BoxArray &ba, int lev) const
Definition WarpXIO.cpp:62
amrex::Vector< std::array< std::unique_ptr< amrex::iMultiFab >, 3 > > Bfield_dotMask
Definition WarpX.H:1187
void ShiftGalileanBoundary()
This function shifts the boundary of the grid by 'm_v_galilean*dt'. In doding so, only positions attr...
Definition WarpXMovingWindow.cpp:703
amrex::Vector< int > injected_plasma_species
Definition WarpX.H:1264
void ApplyFilterMF(const ablastr::fields::MultiLevelVectorField &mfvec, int lev, int idim)
Definition WarpXComm.cpp:1421
bool m_is_synchronized
Definition WarpX.H:1360
void Evolve(int numsteps=-1)
Definition WarpXEvolve.cpp:145
static bool use_kspace_filter
If true, the bilinear filtering of charge and currents is done in Fourier space.
Definition WarpX.H:302
void InitNCICorrector()
void FinishImplicitField(const ablastr::fields::MultiLevelVectorField &Field_fp, const ablastr::fields::MultiLevelVectorField &Field_n, amrex::Real theta)
Definition WarpXImplicitOps.cpp:286
int getistep(int lev) const
Definition WarpX.H:697
std::unique_ptr< MultiDiagnostics > multi_diags
Definition WarpX.H:1159
static int noy
Order of the particle shape factors (splines) along y.
Definition WarpX.H:263
amrex::Vector< int > nsubsteps
Definition WarpX.H:1148
amrex::Vector< amrex::Real > gett_new() const
Definition WarpX.H:701
void ComputeMaxStep()
Compute the last time step of the simulation Calls computeMaxStepBoostAccelerator() if required.
int noz_fft
Definition WarpX.H:1376
static int field_centering_noz
Order of finite centering of fields (from staggered grid to nodal grid), along z.
Definition WarpX.H:275
void sett_new(int lev, amrex::Real time)
Definition WarpX.H:703
amrex::Real load_balance_efficiency_ratio_threshold
Definition WarpX.H:1305
ElectrostaticSolver & GetElectrostaticSolver()
Definition WarpX.H:155
amrex::IntVect getngF() const
Definition WarpX.H:778
static std::string PicsarVersion()
Version of PICSAR dependency.
Definition WarpXVersion.cpp:28
static amrex::Real beta_boost
Beta value corresponding to the Lorentz factor of the boosted frame of the simulation.
Definition WarpX.H:312
void FillBoundaryB_avg(amrex::IntVect ng)
Definition WarpXComm.cpp:715
bool do_fluid_species
Definition WarpX.H:1169
MultiParticleContainer & GetPartContainer()
Definition WarpX.H:153
std::unique_ptr< ImplicitSolver > m_implicit_solver
Definition WarpX.H:1585
void FinishMagneticFieldAndApplyBCs(ablastr::fields::MultiLevelVectorField const &a_Bn, amrex::Real a_theta, amrex::Real a_time)
Definition WarpXImplicitOps.cpp:82
void InitializeEBGridData(int lev)
This function initializes and calculates grid quantities used along with EBs such as edge lengths,...
void CheckGuardCells()
Check that the number of guard cells is smaller than the number of valid cells, for all available Mul...
static auto current_deposition_algo
Integer that corresponds to the current deposition algorithm (Esirkepov, direct, Vay,...
Definition WarpX.H:178
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:258
static auto electrostatic_solver_id
Definition WarpX.H:743
int load_balance_with_sfc
Definition WarpX.H:1294
bool m_collisions_split_position_push
WarpX class attribute that controls whether collisions are placed in the middle of the position push ...
Definition WarpX.H:1597
void RestrictRhoFromFineToCoarsePatch(int lev)
Definition WarpXComm.cpp:1595
std::unique_ptr< MultiParticleContainer > mypc
Definition WarpX.H:1158
int m_current_centering_noy
Order of finite centering of currents (from nodal grid to staggered grid), along y.
Definition WarpX.H:1164
static bool use_filter
If true, a bilinear filter is used to smooth charge and currents.
Definition WarpX.H:300
void AddExternalFields(int lev)
void MacroscopicEvolveE(amrex::Real dt, amrex::Real start_time)
Definition WarpXPushFieldsEM.cpp:1193
static amrex::IntVect m_fill_guards_current
Whether to fill guard cells when computing inverse FFTs of currents.
Definition WarpX.H:252
void ComputeExternalFieldOnGridUsingParser(const std::variant< warpx::fields::FieldType, std::string > &field, amrex::ParserExecutor< 4 > const &fx_parser, amrex::ParserExecutor< 4 > const &fy_parser, amrex::ParserExecutor< 4 > const &fz_parser, int lev, PatchType patch_type, amrex::Vector< std::array< std::unique_ptr< amrex::iMultiFab >, 3 > > const &eb_update_field, bool use_eb_flags=true)
This function computes the E, B, and J fields on each level using the parser and the user-defined fun...
void CalculateExternalCurlA()
Definition WarpXPushFieldsHybridPIC.cpp:349
MagnetostaticSolver::VectorPoissonBoundaryHandler m_vector_poisson_boundary_handler
Definition WarpX.H:797
static amrex::IntVect shared_tilesize
tileSize to use for shared current deposition operations
Definition WarpX.H:246
amrex::Vector< std::unique_ptr< FiniteDifferenceSolver > > m_fdtd_solver_fp
Definition WarpX.H:1581
std::unique_ptr< ElectrostaticSolver > m_electrostatic_solver
Definition WarpX.H:1281
void ExplicitFillBoundaryEBUpdateAux()
Definition WarpXEvolve.cpp:595
const amrex::iMultiFab * getGatherBufferMasks(int lev) const
Definition WarpX.H:1117
int m_current_centering_nox
Order of finite centering of currents (from nodal grid to staggered grid), along x.
Definition WarpX.H:1162
amrex::IntVect getngUpdateAux() const
Definition WarpX.H:779
static void MakeWarpX()
This method creates a new instance of the WarpX class.
Definition WarpX.cpp:274
amrex::Vector< amrex::Real > m_mirror_z_width
Definition WarpX.H:1258
int slice_plot_int
Definition WarpX.H:1369
void BackwardCompatibility()
Definition WarpX.cpp:1918
void EvolveE(amrex::Real dt, amrex::Real start_time)
Definition WarpXPushFieldsEM.cpp:1000
int num_injected_species
Definition WarpX.H:1263
MediumForEM m_em_solver_medium
Integer that corresponds to electromagnetic Maxwell solver (vacuum - 0, macroscopic - 1)
Definition WarpX.H:1173
amrex::Vector< amrex::Real > t_old
Definition WarpX.H:1151
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:332
int regrid_int
Definition WarpX.H:1338
bool use_single_write
Definition WarpX.H:1350
static bool refine_plasma
Definition WarpX.H:324
void PSATDForwardTransformRho(std::string const &charge_fp_string, std::string const &charge_cp_string, int icomp, int dcomp, bool apply_kspace_filter=true)
Forward FFT of rho on all mesh refinement levels, with k-space filtering (if needed)
Definition WarpXPushFieldsEM.cpp:589
static amrex::Array< FieldBoundaryType, 3 > field_boundary_hi
Definition WarpX.H:201
void PSATDForwardTransformJ(std::string const &J_fp_string, std::string const &J_cp_string, bool apply_kspace_filter=true)
Forward FFT of J on all mesh refinement levels, with k-space filtering (if needed)
Definition WarpXPushFieldsEM.cpp:476
bool use_single_read
Definition WarpX.H:1349
amrex::IntVect numprocs
Domain decomposition on Level 0.
Definition WarpX.H:1395
static int ncomps
Definition WarpX.H:283
std::map< std::string, amrex::iMultiFab * > imultifab_map
Definition WarpX.H:378
static int moving_window_active(int const step)
Definition WarpX.H:754
void PSATDForwardTransformG()
Forward FFT of G on all mesh refinement levels.
Definition WarpXPushFieldsEM.cpp:425
const amrex::Array< FieldBoundaryType, 3 > & GetFieldBoundaryLo() const
Definition WarpX.H:115
bool m_limit_verbose_step
Definition WarpX.H:1326
int warpx_do_continuous_injection
Definition WarpX.H:1262
void OneStep(amrex::Real a_cur_time, amrex::Real a_dt, int a_step)
Perform collisions, particle injection, and advance fields and particles by one time step.
Definition WarpXEvolve.cpp:377
void FinishImplicitParticleUpdate()
Definition WarpXImplicitOps.cpp:210
static bool galerkin_interpolation
Definition WarpX.H:297
int do_pml_in_domain
Definition WarpX.H:1235
amrex::Vector< std::array< std::unique_ptr< amrex::iMultiFab >, 3 > > m_eb_update_E
Definition WarpX.H:1194
amrex::Vector< std::unique_ptr< NCIGodfreyFilter > > nci_godfrey_filter_bxbyez
Definition WarpX.H:402
static amrex::IntVect filter_npass_each_dir
Definition WarpX.H:399
void ComputeDivE(amrex::MultiFab &divE, int lev)
Definition WarpX.cpp:3256
amrex::IntVect get_numprocs() const
Definition WarpX.H:791
void AllocLevelData(int lev, const amrex::BoxArray &ba, const amrex::DistributionMapping &dm)
Definition WarpX.cpp:2243
ablastr::fields::MultiFabRegister m_fields
Definition WarpX.H:933
void InitPML()
amrex::Real v_particle_pml
Definition WarpX.H:1245
amrex::Vector< std::array< std::unique_ptr< amrex::iMultiFab >, 3 > > m_eb_update_B
Definition WarpX.H:1195
amrex::IntVect get_ng_depos_J() const
Definition WarpX.H:780
WarpX(WarpX &&)=delete
BilinearFilter bilinear_filter
Definition WarpX.H:400
static int particle_max_grid_crossings
Maximum number of allowed grid crossings for particles.
Definition WarpX.H:268
void FillBoundaryF(amrex::IntVect ng, std::optional< bool > nodal_sync=std::nullopt)
Definition WarpXComm.cpp:697
bool fft_periodic_single_box
Definition WarpX.H:1373
void PSATDBackwardTransformEB()
Backward FFT of E,B on all mesh refinement levels, with field damping in the guard cells (if needed)
Definition WarpXPushFieldsEM.cpp:301
void AddRhoFromFineLevelandSumBoundary(const ablastr::fields::MultiLevelScalarField &charge_fp, const ablastr::fields::MultiLevelScalarField &charge_cp, ablastr::fields::MultiLevelScalarField const &charge_buffer, int lev, int icomp, int ncomp)
Update the charge density of lev by adding the charge density from particles that are in the mesh ref...
Definition WarpXComm.cpp:1651
static int field_centering_noy
Order of finite centering of fields (from staggered grid to nodal grid), along y.
Definition WarpX.H:273
int do_pml
Definition WarpX.H:1229
amrex::Real getdt(int lev) const
Definition WarpX.H:705
int max_step
Definition WarpX.H:1330
bool m_do_subcycling
Definition WarpX.H:1271
amrex::Vector< std::unique_ptr< amrex::iMultiFab > > const & GetEBReduceParticleShapeFlag() const
Definition WarpX.H:161
amrex::Real costs_heuristic_particles_wt
Definition WarpX.H:1319
int pml_has_particles
Definition WarpX.H:1233
amrex::Vector< std::unique_ptr< NCIGodfreyFilter > > nci_godfrey_filter_exeybz
Definition WarpX.H:401
bool do_current_centering
Definition WarpX.H:223
int getdo_moving_window() const
Definition WarpX.H:706
auto & get_spectral_solver_fp(int lev)
Definition WarpX.H:927
int pml_ncell
Definition WarpX.H:1231
static int n_rz_azimuthal_modes
Number of modes for the RZ multi-mode version.
Definition WarpX.H:278
void PSATDBackwardTransformF()
Backward FFT of F on all mesh refinement levels.
Definition WarpXPushFieldsEM.cpp:395
std::unique_ptr< ExternalFieldParams > m_p_ext_field_params
Definition WarpX.H:1251
static amrex::Real gamma_boost
Lorentz factor of the boosted frame in which a boosted-frame simulation is run.
Definition WarpX.H:310
amrex::Vector< std::unique_ptr< amrex::iMultiFab > > phi_dotMask
Definition WarpX.H:1189
static int shared_mem_current_tpb
number of threads to use per block in shared deposition
Definition WarpX.H:243
bool write_diagnostics_on_restart
Definition WarpX.H:1345
int m_num_mirrors
Definition WarpX.H:1256
utils::parser::IntervalsParser m_dt_update_interval
Definition WarpX.H:1153
amrex::Vector< std::unique_ptr< FiniteDifferenceSolver > > m_fdtd_solver_cp
Definition WarpX.H:1582
void ResetCosts()
resets costs to zero
Definition WarpXRegrid.cpp:364
void computeMaxStepBoostAccelerator()
bool checkStopSimulation(amrex::Real cur_time)
Definition WarpXEvolve.cpp:588
std::unique_ptr< MultiReducedDiags > reduced_diags
object with all reduced diagnostics, similar to MultiParticleContainer for species.
Definition WarpX.H:411
amrex::Vector< amrex::Real > m_mirror_z
Definition WarpX.H:1257
std::optional< amrex::Real > m_max_dt
Definition WarpX.H:1268
amrex::Vector< std::unique_ptr< amrex::iMultiFab > > current_buffer_masks
Definition WarpX.H:1225
std::string m_authors
Author of an input file / simulation setup.
Definition WarpX.H:1145
int m_JRhom_subintervals
Definition WarpX.H:1589
int slice_max_grid_size
Definition WarpX.H:1368
void PSATDEraseAverageFields()
Set averaged E,B fields to zero before new iteration.
Definition WarpXPushFieldsEM.cpp:718
void ImplicitComputeRHSE(amrex::Real dt, WarpXSolverVec &a_Erhs_vec)
Definition WarpXImplicitOps.cpp:337
void FillBoundaryG(amrex::IntVect ng, std::optional< bool > nodal_sync=std::nullopt)
Definition WarpXComm.cpp:706
void ApplyFilterandSumBoundaryRho(int lev, int glev, amrex::MultiFab &rho, int icomp, int ncomp)
Definition WarpXComm.cpp:1619
amrex::Vector< std::unique_ptr< AcceleratorLattice > > m_accelerator_lattice
Definition WarpX.H:1401
static auto time_dependency_rho
Definition WarpX.H:218
std::optional< amrex::Real > m_const_dt
Definition WarpX.H:1267
void Hybrid_QED_Push(amrex::Vector< amrex::Real > dt)
Definition WarpX_QED_Field_Pushers.cpp:47
amrex::RealBox slice_realbox
Definition WarpX.H:1370
amrex::Vector< amrex::IntVect > do_pml_Lo
Definition WarpX.H:1239
void applyMirrors(amrex::Real time)
Definition WarpXEvolve.cpp:1362
amrex::Vector< std::unique_ptr< SpectralSolverRZ > > spectral_solver_cp
Definition WarpX.H:1573
amrex::Real getmoving_window_x() const
Definition WarpX.H:707
amrex::Real costs_heuristic_cells_wt
Definition WarpX.H:1313
bool do_pml_dive_cleaning
Definition WarpX.H:1237
bool do_similar_dm_pml
Definition WarpX.H:1236
void SetElectricFieldAndApplyBCs(const WarpXSolverVec &a_E, amrex::Real a_time)
Definition WarpXImplicitOps.cpp:47
static bool compute_max_step_from_btd
If true, the code will compute max_step from the back transformed diagnostics.
Definition WarpX.H:321
bool current_correction
If true, a correction is applied to the current in Fourier space,.
Definition WarpX.H:227
void ComputePMLFactors()
static int end_moving_window_step
Definition WarpX.H:748
static utils::parser::IntervalsParser sort_intervals
Definition WarpX.H:326
bool update_with_rho
Definition WarpX.H:231
void LoadBalance()
perform load balance; compute and communicate new amrex::DistributionMapping
Definition WarpXRegrid.cpp:74
amrex::Real time_of_last_gal_shift
Definition WarpX.H:404
MultiDiagnostics & GetMultiDiags()
Definition WarpX.H:157
This is a wrapper class around a Vector of pointers to MultiFabs that contains basic math operators a...
Definition WarpXSolverVec.H:58
Definition MultiFabRegister.H:71
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 DistributionMapping MakeDistributionMap(int lev, BoxArray const &ba)
virtual void PostProcessBaseGrids(BoxArray &) const
This class computes and stores the number of guard cells needed for the allocation of the MultiFabs a...
Definition GuardCellManager.H:23
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
std::array< amrex::MultiFab *, 3 > VectorField
Definition MultiFabRegister.H:191
amrex::Vector< ScalarField > MultiLevelScalarField
Definition MultiFabRegister.H:200
amrex::Vector< VectorField > MultiLevelVectorField
Definition MultiFabRegister.H:208
@ Default
Definition Enums.H:23
PatchType
Definition Enums.H:30
PODVector< T, ArenaAllocator< T > > DeviceVector
void Finalize()
BoxND< 3 > Box
IntVectND< 3 > IntVect
RealVectND< 3 > RealVect
std::string Version()
std::array< T, N > Array
FieldType
Definition Fields.H:94
Definition ImplicitOptions.H:7
Definition MultiFabRegister.H:262