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
32
33#ifdef WARPX_USE_FFT
34# ifdef WARPX_DIM_RZ
37# else
39# endif
40#endif
41
43#include "Fields.H"
49#include "Utils/export.H"
51
53#include <ablastr/utils/Enums.H>
55
56#include <AMReX_BaseFwd.H>
57#include <AMReX_AmrCoreFwd.H>
58
59#include <AMReX.H>
60#include <AMReX_AmrCore.H>
61#include <AMReX_Array.H>
62#include <AMReX_Config.H>
63#ifdef AMREX_USE_EB
64# include <AMReX_EBFabFactory.H>
65#endif
66#include <AMReX_GpuContainers.H>
67#include <AMReX_IntVect.H>
68#include <AMReX_LayoutData.H>
69#include <AMReX_Parser.H>
70#include <AMReX_REAL.H>
71#include <AMReX_RealBox.H>
72#include <AMReX_RealVect.H>
73#include <AMReX_Vector.H>
74
75#include <array>
76#include <iostream>
77#include <limits>
78#include <map>
79#include <memory>
80#include <optional>
81#include <string>
82#include <variant>
83#include <vector>
84
85class WARPX_EXPORT WarpX
86 : public amrex::AmrCore
87{
88public:
89 static WarpX& GetInstance ();
90
91 static void ResetInstance ();
92
97 static void Finalize();
98
100 ~WarpX () override;
101
103 WarpX ( WarpX const &) = delete;
105 WarpX& operator= ( WarpX const & ) = delete;
106
108 WarpX ( WarpX && ) = delete;
110 WarpX& operator= ( WarpX && ) = delete;
111
112 static std::string Version ();
113 static std::string PicsarVersion ();
114
115 [[nodiscard]] int Verbose () const { return verbose; }
116
121
123 {
124 return field_boundary_hi;
125 }
126
127 [[nodiscard]] int GetPECInsulator_IsESet ( int bdry_dir,
128 int bdry_side ) const;
129
130 void InitData ();
131
132 void Evolve (int numsteps = -1);
133
138
139 //
140 // Functions used by implicit solvers
141 //
142 void SyncMassMatricesPC ();
145 void SetElectricFieldAndApplyBCs ( const WarpXSolverVec& a_E, amrex::Real a_time );
147 amrex::Real a_thetadt, amrex::Real start_time );
150 amrex::Real a_theta, amrex::Real a_time );
153 amrex::Real theta );
154 void DepositMassMatrices ();
156 void ImplicitComputeRHSE (int lev, amrex::Real dt, WarpXSolverVec& a_Erhs_vec);
157 void ImplicitComputeRHSE (int lev, PatchType patch_type, amrex::Real dt, WarpXSolverVec& a_Erhs_vec);
158
162 [[nodiscard]] HybridPICModel * get_pointer_HybridPICModel () const { return m_hybrid_pic_model.get(); }
168
174 [[nodiscard]] std::string GetAuthors () const { return m_authors; }
175
181
182 // Algorithms
203
208
214
220
225
230
232 // to satisfy the continuity equation and charge conservation
234
237 bool update_with_rho = false;
238
241
244
247
250
253
256
259
262 static bool do_dive_cleaning;
264 static bool do_divb_cleaning;
265
267 static int nox;
269 static int noy;
271 static int noz;
272
275
282
289 static int ncomps;
290
293 static bool use_fdtd_nci_corr;
304
306 static bool use_filter;
308 static bool use_kspace_filter;
311
314
321
325
328
330 static bool refine_plasma;
331
334
339
348
352
353 // Global rho nodal flag to know about rho index type when rho MultiFab is not allocated
355
371 void AllocInitMultiFab (
372 std::unique_ptr<amrex::iMultiFab>& mf,
373 const amrex::BoxArray& ba,
375 int ncomp,
376 const amrex::IntVect& ngrow,
377 int level,
378 const std::string& name,
379 std::optional<const int> initial_value = {});
380
381 // Maps of all of the iMultiFabs used (this can include MFs from other classes)
382 // This is a convenience for the Python interface, allowing all iMultiFabs
383 // to be easily referenced from Python.
384 std::map<std::string, amrex::iMultiFab *> imultifab_map;
385
390 [[nodiscard]] const amrex::iMultiFab*
392
393 [[nodiscard]] bool DoPML () const {return do_pml;}
394 [[nodiscard]] bool DoFluidSpecies () const {return do_fluid_species;}
395
397 [[nodiscard]] std::vector<bool> getPMLdirections() const;
398
399 static amrex::LayoutData<amrex::Real>* getCosts (int lev);
400
401 void setLoadBalanceEfficiency (int lev, amrex::Real efficiency);
402
403 amrex::Real getLoadBalanceEfficiency (int lev);
404
409
413
415
417 std::unique_ptr<MultiReducedDiags> reduced_diags;
418
419 void applyMirrors(amrex::Real time);
420
422 void ComputeDt ();
423
430 void ApplyDtLimiters ();
431
434
441 // Compute max_step automatically for simulations in a boosted frame.
443
448 int MoveWindow (int step, bool move_j);
449
455 void ShiftGalileanBoundary ();
456
457 void ResetProbDomain (const amrex::RealBox& rb);
458 void EvolveE ( amrex::Real dt, amrex::Real start_time);
459 void EvolveE (int lev, amrex::Real dt, amrex::Real start_time);
460 void EvolveB ( amrex::Real dt, SubcyclingHalf subcycling_half, amrex::Real start_time);
461 void EvolveB (int lev, amrex::Real dt, SubcyclingHalf subcycling_half, amrex::Real start_time);
462 void EvolveF ( amrex::Real dt, int rho_comp);
463 void EvolveF (int lev, amrex::Real dt, int rho_comp);
464 void EvolveG ( amrex::Real dt);
465 void EvolveG (int lev, amrex::Real dt);
466 void EvolveB (int lev, PatchType patch_type, amrex::Real dt, SubcyclingHalf subcycling_half, amrex::Real start_time);
467 void EvolveE (int lev, PatchType patch_type, amrex::Real dt, amrex::Real start_time);
468 void EvolveF (int lev, PatchType patch_type, amrex::Real dt, int rho_comp);
469 void EvolveG (int lev, PatchType patch_type, amrex::Real dt);
470
471 void MacroscopicEvolveE ( amrex::Real dt, amrex::Real start_time);
472 void MacroscopicEvolveE (int lev, amrex::Real dt, amrex::Real start_time);
473 void MacroscopicEvolveE (int lev, PatchType patch_type, amrex::Real dt, amrex::Real start_time);
474
480 void HybridPICEvolveFields ();
481
490
498
504
510 void Hybrid_QED_Push (int lev, amrex::Real dt);
511
518 void Hybrid_QED_Push (int lev, PatchType patch_type, amrex::Real dt);
519
521
524 void CheckLoadBalance (int step);
525
528 void LoadBalance ();
529
532 void ResetCosts ();
533
540 void RescaleCosts (int step);
541
548
556 void DampFieldsInGuards (int lev,
557 const ablastr::fields::VectorField& Efield,
558 const ablastr::fields::VectorField& Bfield);
559
567 void DampFieldsInGuards (int lev, amrex::MultiFab* mf);
568
569#if defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
570 void ApplyInverseVolumeScalingToCurrentDensity (amrex::MultiFab* Jx,
571 amrex::MultiFab* Jy,
572 amrex::MultiFab* Jz,
573 int lev) const;
574
575 void ApplyInverseVolumeScalingToMassMatricesPC (amrex::MultiFab* Sxx,
576 amrex::MultiFab* Syy,
577 amrex::MultiFab* Szz,
578 int lev) const;
579
580 void ApplyInverseVolumeScalingToChargeDensity (amrex::MultiFab* Rho,
581 int lev) const;
582#endif
583
589 void ApplyRhofieldBoundary (int lev, amrex::MultiFab* Rho,
590 PatchType patch_type);
591
597 void ApplyJfieldBoundary (int lev, amrex::MultiFab* Jx,
599 PatchType patch_type);
600
601 void ApplyEfieldBoundary (int lev, PatchType patch_type, amrex::Real cur_time);
602 void ApplyBfieldBoundary (int lev, PatchType patch_type, SubcyclingHalf subcycling_half, amrex::Real cur_time);
603
604#if defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
605 // Applies the boundary conditions that are specific to the axis when in RZ.
606 void ApplyFieldBoundaryOnAxis (amrex::MultiFab* Er, amrex::MultiFab* Et, amrex::MultiFab* Ez, int lev) const;
607#endif
608
617 void ApplyElectronPressureBoundary (int lev, PatchType patch_type);
618
619 void DampPML ();
620 void DampPML (int lev);
621 void DampPML (int lev, PatchType patch_type);
622 void DampPML_Cartesian (int lev, PatchType patch_type);
623
624 void DampJPML ();
625 void DampJPML (int lev);
626 void DampJPML (int lev, PatchType patch_type);
627
628 void CopyJPML ();
629
631 static bool isAnyParticleBoundaryThermal();
632
633 PML* GetPML (int lev);
634#if (defined WARPX_DIM_RZ) && (defined WARPX_USE_FFT)
635 PML_RZ* GetPML_RZ (int lev);
636#endif
637
639 void doFieldIonization ();
640
641#ifdef WARPX_QED
643 void doQEDEvents ();
644#endif
645
646 void PushParticlesandDeposit (int lev, amrex::Real cur_time, SubcyclingHalf subcycling_half=SubcyclingHalf::None, bool skip_deposition=false,
647 PositionPushType position_push_type=PositionPushType::Full,
648 MomentumPushType momentum_push_type=MomentumPushType::Full,
649 ImplicitOptions const * implicit_options = nullptr);
650
651 void PushParticlesandDeposit (amrex::Real cur_time, bool skip_deposition=false,
652 PositionPushType position_push_type=PositionPushType::Full,
653 MomentumPushType momentum_push_type=MomentumPushType::Full,
654 ImplicitOptions const * implicit_options = nullptr);
655
656 // This function does aux(lev) = fp(lev) + I(aux(lev-1)-cp(lev)).
657 // Caller must make sure fp and cp have ghost cells filled.
658 void UpdateAuxilaryData ();
659 void UpdateAuxilaryDataStagToNodal ();
660 void UpdateAuxilaryDataSameType ();
661
662 // Fill boundary cells including coarse/fine boundaries
663 void FillBoundaryB (amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
664 void FillBoundaryE (amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
665 void FillBoundaryB_avg (amrex::IntVect ng);
666 void FillBoundaryE_avg (amrex::IntVect ng);
667
668 void FillBoundaryF (amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
669 void FillBoundaryG (amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
670 void FillBoundaryAux (amrex::IntVect ng);
671 void FillBoundaryE (int lev, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
672 void FillBoundaryB (int lev, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
673 void FillBoundaryE_avg (int lev, amrex::IntVect ng);
674 void FillBoundaryB_avg (int lev, amrex::IntVect ng);
675
676 void FillBoundaryF (int lev, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
677 void FillBoundaryG (int lev, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
678 void FillBoundaryAux (int lev, amrex::IntVect ng);
679
686 void SyncCurrentAndRho ();
687
698 void SyncCurrent (const std::string& current_fp_string);
699
700 void SyncRho ();
701
702 void SyncRho (
705 ablastr::fields::MultiLevelScalarField const & charge_buffer);
706
707 [[nodiscard]] amrex::Vector<int> getnsubsteps () const {return nsubsteps;}
708 [[nodiscard]] int getnsubsteps (int lev) const {return nsubsteps[lev];}
709 [[nodiscard]] amrex::Vector<int> getistep () const {return istep;}
710 [[nodiscard]] int getistep (int lev) const {return istep[lev];}
711 void setistep (int lev, int ii) {istep[lev] = ii;}
712 [[nodiscard]] amrex::Vector<amrex::Real> gett_old () const {return t_old;}
713 [[nodiscard]] amrex::Real gett_old (int lev) const {return t_old[lev];}
714 [[nodiscard]] amrex::Vector<amrex::Real> gett_new () const {return t_new;}
715 [[nodiscard]] amrex::Real gett_new (int lev) const {return t_new[lev];}
716 void sett_new (int lev, amrex::Real time) {t_new[lev] = time;}
717 [[nodiscard]] amrex::Vector<amrex::Real> getdt () const {return dt;}
718 [[nodiscard]] amrex::Real getdt (int lev) const {return dt.at(lev);}
719 [[nodiscard]] int getdo_moving_window() const {return do_moving_window;}
720 [[nodiscard]] amrex::Real getmoving_window_x() const {return moving_window_x;}
721 [[nodiscard]] bool getis_synchronized() const {return m_is_synchronized;}
722
723 [[nodiscard]] int maxStep () const {return max_step;}
724 void updateMaxStep (const int new_max_step) {max_step = new_max_step;}
725 [[nodiscard]] amrex::Real stopTime () const {return stop_time;}
726 void updateStopTime (const amrex::Real new_stop_time) {stop_time = new_stop_time;}
727
728 static std::array<amrex::Real,3> CellSize (int lev);
729 static amrex::XDim3 InvCellSize (int lev);
730 static amrex::RealBox getRealBox(const amrex::Box& bx, int lev);
731
740 static amrex::XDim3 LowerCorner (const amrex::Box& bx, int lev, amrex::Real time_shift_delta);
749 static amrex::XDim3 UpperCorner (const amrex::Box& bx, int lev, amrex::Real time_shift_delta);
750
751 static amrex::IntVect RefRatio (int lev);
752
753 static const amrex::iMultiFab* CurrentBufferMasks (int lev);
754 static const amrex::iMultiFab* GatherBufferMasks (int lev);
755
758
759 static int do_moving_window; // boolean
760 static int start_moving_window_step; // the first step to move window
761 static int end_moving_window_step; // the last step to move window
767 static int moving_window_active (int const step) {
768 bool const step_before_end = (step < end_moving_window_step) || (end_moving_window_step < 0);
769 bool const step_after_start = (step >= start_moving_window_step);
770 return do_moving_window && step_before_end && step_after_start;
771 }
775
776 // these should be private, but can't due to Cuda limitations
777 static void ComputeDivB (amrex::MultiFab& divB, int dcomp,
779 const std::array<amrex::Real,3>& dx);
780
781 static void ComputeDivB (amrex::MultiFab& divB, int dcomp,
783 const std::array<amrex::Real,3>& dx, amrex::IntVect ngrow);
784
785 void ComputeDivE(amrex::MultiFab& divE, int lev);
786
787 void ProjectionCleanDivB ();
789
790 [[nodiscard]] amrex::IntVect getngEB() const { return guard_cells.ng_alloc_EB; }
791 [[nodiscard]] amrex::IntVect getngF() const { return guard_cells.ng_alloc_F; }
792 [[nodiscard]] amrex::IntVect getngUpdateAux() const { return guard_cells.ng_UpdateAux; }
793 [[nodiscard]] amrex::IntVect get_ng_depos_J() const {return guard_cells.ng_depos_J;}
794 [[nodiscard]] amrex::IntVect get_ng_depos_rho() const {return guard_cells.ng_depos_rho;}
795 [[nodiscard]] amrex::IntVect get_ng_fieldgather () const {return guard_cells.ng_FieldGather;}
796
804 [[nodiscard]] amrex::IntVect get_numprocs() const {return numprocs;}
805
807 void ComputeSpaceChargeField (bool reset_fields);
808
809 // Magnetostatic Solver Interface
819 amrex::Real required_precision=amrex::Real(1.e-11),
820 amrex::Real absolute_tolerance=amrex::Real(0.0),
821 int max_iters=200,
822 int verbosity=2); // const;
823
825
845 const std::variant<warpx::fields::FieldType, std::string>& field,
846 amrex::ParserExecutor<4> const& fx_parser,
847 amrex::ParserExecutor<4> const& fy_parser,
848 amrex::ParserExecutor<4> const& fz_parser,
849 int lev, PatchType patch_type,
850 amrex::Vector<std::array< std::unique_ptr<amrex::iMultiFab>,3 > > const& eb_update_field,
851 bool use_eb_flags = true);
852
857 void LoadExternalFields (int lev);
858
864 const std::string& read_fields_from_path, amrex::MultiFab* mf,
865 const std::string& F_name, const std::string& F_component, int dest_comp = 0);
866
875 void InitializeEBGridData(int lev);
876
883
884 void ApplyFilterandSumBoundaryRho (int lev, int glev, amrex::MultiFab& rho, int icomp, int ncomp);
885
886 void ApplyFilterMF (
888 int lev,
889 int idim);
890
891 void ApplyFilterMF (
893 int lev);
894
895 // Device vectors of stencil coefficients used for finite-order centering of fields
899
900 // Device vectors of stencil coefficients used for finite-order centering of currents
904
905 // This needs to be public for CUDA.
907 void ErrorEst (int lev, amrex::TagBoxArray& tags, amrex::Real time, int /*ngrow*/) final;
908
909 // Return the accelerator lattice instance defined at the given refinement level
911
912 // for cuda
913 void BuildBufferMasksInBox ( amrex::Box tbx, amrex::IArrayBox &buffer_mask,
914 const amrex::IArrayBox &guard_mask, int ng );
915#ifdef AMREX_USE_EB
916 [[nodiscard]] amrex::EBFArrayBoxFactory const& fieldEBFactory (int lev) const noexcept {
917 return static_cast<amrex::EBFArrayBoxFactory const&>(*m_field_factory[lev]);
918 }
919#endif
920
921 void InitEB ();
922
926 void ComputeDistanceToEB ();
931 void ComputeFaceExtensions();
935 void ComputeOneWayExtensions();
939 void ComputeEightWaysExtensions();
940
941#ifdef WARPX_USE_FFT
942 auto& get_spectral_solver_fp (int lev) {return *spectral_solver_fp[lev];}
943#endif
944
946
947 // Field container
950
953 void PostProcessBaseGrids (amrex::BoxArray& ba0) const final;
954
955protected:
956
982 void InitLevelData (int lev, amrex::Real time);
983
985 [[nodiscard]] amrex::DistributionMapping
986 MakeDistributionMap (int lev, amrex::BoxArray const& ba) final;
987
991 void MakeNewLevelFromScratch (int lev, amrex::Real time, const amrex::BoxArray& new_grids,
992 const amrex::DistributionMapping& new_dmap) final;
993
997 void MakeNewLevelFromCoarse (int /*lev*/, amrex::Real /*time*/, const amrex::BoxArray& /*ba*/,
998 const amrex::DistributionMapping& /*dm*/) final;
999
1003 void RemakeLevel (int lev, amrex::Real time, const amrex::BoxArray& ba,
1004 const amrex::DistributionMapping& dm) final;
1005
1007 void ClearLevel (int lev) final;
1008
1009private:
1010
1017 WarpX ();
1018
1023 static void MakeWarpX ();
1024
1025 // Singleton is used when the code is run from python
1027
1029 void HandleSignals ();
1030
1031 void FillBoundaryB (int lev, PatchType patch_type, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
1032 void FillBoundaryE (int lev, PatchType patch_type, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
1033 void FillBoundaryF (int lev, PatchType patch_type, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
1034 void FillBoundaryG (int lev, PatchType patch_type, amrex::IntVect ng, std::optional<bool> nodal_sync = std::nullopt);
1035
1036 void FillBoundaryB_avg (int lev, PatchType patch_type, amrex::IntVect ng);
1037 void FillBoundaryE_avg (int lev, PatchType patch_type, amrex::IntVect ng);
1038
1039 void AddExternalFields (int lev);
1040
1045 void OneStep (
1046 amrex::Real a_cur_time,
1047 amrex::Real a_dt,
1048 int a_step
1049 );
1050
1051 void OneStep_nosub (
1052 amrex::Real a_cur_time,
1053 amrex::Real a_dt,
1054 int a_step
1055 );
1056
1057 void OneStep_sub1 (amrex::Real cur_time);
1058
1062 void OneStep_JRhom (amrex::Real cur_time);
1063
1067 int lev);
1072 int lev);
1073 void SumBoundaryJ (
1075 int lev,
1076 int idim,
1077 const amrex::Periodicity& period);
1078 void SumBoundaryJ (
1080 int lev,
1081 const amrex::Periodicity& period);
1082
1083 void RestrictRhoFromFineToCoarsePatch (int lev );
1087 int lev,
1088 PatchType patch_type,
1089 int icomp,
1090 int ncomp);
1094 ablastr::fields::MultiLevelScalarField const & charge_buffer,
1095 int lev,
1096 int icomp,
1097 int ncomp);
1098
1099 void ReadParameters ();
1100
1103 void BackwardCompatibility ();
1104
1106
1107 void AllocLevelData (int lev, const amrex::BoxArray& ba,
1108 const amrex::DistributionMapping& dm);
1109
1110 [[nodiscard]] amrex::DistributionMapping
1111 GetRestartDMap (const std::string& chkfile, const amrex::BoxArray& ba, int lev) const;
1112
1113 void InitFromCheckpoint ();
1115
1116 void InitPML ();
1118
1119 void InitFilter ();
1120
1122
1124
1130
1131 void BuildBufferMasks ();
1132
1133 [[nodiscard]] const amrex::iMultiFab* getCurrentBufferMasks (int lev) const {
1134 return current_buffer_masks[lev].get();
1135 }
1136
1137 [[nodiscard]] const amrex::iMultiFab* getGatherBufferMasks (int lev) const
1138 {
1139 return gather_buffer_masks[lev].get();
1140 }
1141
1142 void AllocLevelMFs (int lev, const amrex::BoxArray& ba, const amrex::DistributionMapping& dm,
1143 const amrex::IntVect& ngEB, amrex::IntVect& ngJ,
1144 const amrex::IntVect& ngRho, const amrex::IntVect& ngF,
1145 const amrex::IntVect& ngG, bool aux_is_nodal);
1146
1147#ifdef WARPX_USE_FFT
1148# ifdef WARPX_DIM_RZ
1149 void AllocLevelSpectralSolverRZ (amrex::Vector<std::unique_ptr<SpectralSolverRZ>>& spectral_solver,
1150 int lev,
1151 const amrex::BoxArray& realspace_ba,
1153 const std::array<amrex::Real,3>& dx);
1154# else
1155 void AllocLevelSpectralSolver (amrex::Vector<std::unique_ptr<SpectralSolver>>& spectral_solver,
1156 int lev,
1157 const amrex::BoxArray& realspace_ba,
1159 const std::array<amrex::Real,3>& dx,
1160 bool pml_flag=false);
1161# endif
1162#endif
1163
1165 std::string m_authors;
1166
1168 amrex::Vector<int> nsubsteps; // how many substeps on each level?
1169
1173 // How often to update the timestep when using adaptive timestepping
1176
1178
1179 // Particle container
1180 std::unique_ptr<MultiParticleContainer> mypc;
1181 std::unique_ptr<MultiDiagnostics> multi_diags;
1182
1183 // Particle thermalizer configuration (constructed from inputs)
1185
1192
1193 // Fluid container
1194 bool do_fluid_species = false;
1195 std::unique_ptr<MultiFluidContainer> myfl;
1196
1199
1204
1205 //
1206 // Fields: First array for level, second for direction
1207 //
1208
1209 // Masks for computing dot product and global moments of fields when using grids that
1210 // have shared locations across different ranks (e.g., a Yee grid)
1215
1221
1228
1243
1248
1249 // Copy of the coarse aux
1252
1253 // PML
1254 int do_pml = 0;
1256 int pml_ncell = 10;
1257 int pml_delta = 10;
1262 bool do_pml_dive_cleaning; // default set in WarpX.cpp
1263 bool do_pml_divb_cleaning; // default set in WarpX.cpp
1267#if (defined WARPX_DIM_RZ) && (defined WARPX_USE_FFT)
1269#endif
1271
1272 // Insulator boundary conditions
1273 std::unique_ptr<PEC_Insulator> pec_insulator_boundary;
1274
1275 // External fields parameters
1276 std::unique_ptr<ExternalFieldParams> m_p_ext_field_params;
1277
1278 amrex::Real moving_window_x = std::numeric_limits<amrex::Real>::max();
1279
1280 // Mirrors
1285
1286 // Plasma injection parameters
1290
1291 // Timestepping parameters
1292 std::optional<amrex::Real> m_const_dt;
1293 std::optional<amrex::Real> m_max_dt;
1294 std::optional<amrex::Real> m_max_omegap_dt;
1295 std::optional<amrex::Real> m_max_omegac_dt;
1296
1297 // whether to use subcycling
1298 bool m_do_subcycling = false;
1299
1303
1304 // Macroscopic properties
1305 std::unique_ptr<MacroscopicProperties> m_macroscopic_properties;
1306
1307 // Electrostatic solver
1308 std::unique_ptr<ElectrostaticSolver> m_electrostatic_solver;
1309
1310 // Hybrid PIC algorithm parameters
1311 std::unique_ptr<HybridPICModel> m_hybrid_pic_model;
1312
1313 // Load balancing
1347
1348 // Determines timesteps for override sync
1350
1351 // Other runtime parameters
1352 int verbose = 1;
1354
1355 bool use_hybrid_QED = false;
1356
1357 int max_step = std::numeric_limits<int>::max();
1358 amrex::Real stop_time = std::numeric_limits<amrex::Real>::max();
1359
1363 std::optional<amrex::Real> m_zmax_plasma_to_compute_max_step = std::nullopt;
1364
1365 int regrid_int = -1;
1366
1368
1369 std::string restart_chkfile;
1370
1373
1375
1376 bool use_single_read = true;
1377 bool use_single_write = true;
1381
1385 std::unique_ptr<amrex::Parser> ref_patch_parser;
1386
1388
1389 // Synchronization of nodal points
1390 static constexpr bool sync_nodal_points = true;
1391
1393
1394 // Slice Parameters
1399
1401 int nox_fft = 16;
1402 int noy_fft = 16;
1403 int noz_fft = 16;
1404
1405
1406
1408#if defined(AMREX_USE_CUDA)
1410#else
1412#endif
1413
1416
1420
1423
1425 std::unique_ptr<ParticleBoundaryBuffer> m_particle_boundary_buffer;
1426
1427 // Accelerator lattice elements
1429
1430 //
1431 // Embedded Boundary
1432 //
1433
1434 // Factory for field data
1436
1440
1443 [[nodiscard]]
1444 bool checkStopSimulation (amrex::Real cur_time);
1445
1454 void HandleParticlesAtBoundaries (int step, amrex::Real cur_time, int num_moved);
1455
1462
1467
1468 void PushPSATD (amrex::Real start_time);
1469
1470#ifdef WARPX_USE_FFT
1471
1476
1482
1500
1511 std::string const & J_fp_string,
1512 std::string const & J_cp_string,
1513 bool apply_kspace_filter=true);
1514
1522 std::string const & J_fp_string,
1523 std::string const & J_cp_string);
1524
1537 std::string const & charge_fp_string,
1538 std::string const & charge_cp_string,
1539 int icomp, int dcomp, bool apply_kspace_filter=true);
1540
1545
1549 void PSATDMoveJNewToJOld ();
1550
1555
1559 void PSATDMoveJNewToJMid ();
1560
1564 void PSATDForwardTransformF ();
1565
1570
1574 void PSATDForwardTransformG ();
1575
1580
1585
1591 void PSATDScaleAverageFields (amrex::Real scale_factor);
1592
1597
1598# ifdef WARPX_DIM_RZ
1601# else
1604# endif
1605
1606#endif
1607
1610
1611 // implicit solver object
1612 std::unique_ptr<ImplicitSolver> m_implicit_solver;
1613
1615 bool m_JRhom = false;
1617
1625};
1626
1627#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:180
@ Full
Definition WarpXAlgorithmSelection.H:180
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:69
Definition PML_RZ.H:33
Definition PML.H:138
Definition ParticleBoundaryBuffer.H:23
Definition ParticleThermalizer.H:20
std::unique_ptr< ParticleBoundaryBuffer > m_particle_boundary_buffer
particle buffer for scraped particles on the boundaries
Definition WarpX.H:1425
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:188
static int field_centering_nox
Order of finite centering of fields (from staggered grid to nodal grid), along x.
Definition WarpX.H:277
static auto particle_pusher_algo
Integer that corresponds to the particle push algorithm (Boris, Vay, Higuera-Cary)
Definition WarpX.H:190
amrex::Vector< std::unique_ptr< amrex::iMultiFab > > m_eb_reduce_particle_shape
Definition WarpX.H:1227
amrex::Vector< std::unique_ptr< amrex::LayoutData< amrex::Real > > > costs
Definition WarpX.H:1319
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:180
std::unique_ptr< PEC_Insulator > pec_insulator_boundary
Definition WarpX.H:1273
amrex::Gpu::DeviceVector< amrex::Real > device_field_centering_stencil_coeffs_y
Definition WarpX.H:897
static int moving_window_dir
Definition WarpX.H:772
amrex::Gpu::DeviceVector< amrex::Real > device_current_centering_stencil_coeffs_x
Definition WarpX.H:901
amrex::Real m_quantum_xi_c2
Definition WarpX.H:520
ablastr::utils::text::IntervalsParser override_sync_intervals
Definition WarpX.H:1349
void InitFilter()
void BuildBufferMasks()
Definition WarpX.cpp:3471
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:162
static auto poisson_solver_id
Definition WarpX.H:757
void PushPSATD(amrex::Real start_time)
Definition WarpXPushFieldsEM.cpp:771
bool use_hybrid_QED
Definition WarpX.H:1355
static bool do_dive_cleaning
Definition WarpX.H:262
bool DoFluidSpecies() const
Definition WarpX.H:394
amrex::Real ParticleGridSpeedMax()
Definition WarpXComputeDt.cpp:121
std::unique_ptr< MacroscopicProperties > m_macroscopic_properties
Definition WarpX.H:1305
bool DoPML() const
Definition WarpX.H:393
void ProjectionCleanDivB()
Definition ProjectionDivCleaner.cpp:397
static constexpr bool sync_nodal_points
Definition WarpX.H:1390
int pml_delta
Definition WarpX.H:1257
amrex::Real magnetostatic_solver_required_precision
Definition WarpX.H:811
amrex::Vector< std::unique_ptr< amrex::FabFactory< amrex::FArrayBox > > > m_field_factory
Definition WarpX.H:1435
bool getis_synchronized() const
Definition WarpX.H:721
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:1259
EvolveScheme evolve_scheme
Integer that corresponds to the evolve scheme (explicit, semi_implicit_em, theta_implicit_em)
Definition WarpX.H:194
int noy_fft
Definition WarpX.H:1402
amrex::Vector< amrex::Real > m_v_galilean
Definition WarpX.H:411
void ResetProbDomain(const amrex::RealBox &rb)
Definition WarpXMovingWindow.cpp:760
static amrex::Array< ParticleBoundaryType, 3 > particle_boundary_hi
Definition WarpX.H:219
amrex::Vector< std::unique_ptr< amrex::iMultiFab > > gather_buffer_masks
Definition WarpX.H:1251
void updateStopTime(const amrex::Real new_stop_time)
Definition WarpX.H:726
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:1457
static amrex::Real zmin_domain_boost_step_0
Definition WarpX.H:324
ParticleBoundaryBuffer & GetParticleBoundaryBuffer()
Definition WarpX.H:164
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:165
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
void SyncMassMatricesPC()
Definition WarpXComm.cpp:1347
static int n_field_gather_buffer
Definition WarpX.H:343
amrex::Vector< amrex::Real > t_new
Definition WarpX.H:1170
static bool do_single_precision_comms
perform field communications in single precision
Definition WarpX.H:240
amrex::IntVect slice_cr_ratio
Definition WarpX.H:1398
int field_io_nfiles
Definition WarpX.H:1379
amrex::Vector< int > getnsubsteps() const
Definition WarpX.H:707
guardCellManager guard_cells
Definition WarpX.H:1392
int magnetostatic_solver_verbosity
Definition WarpX.H:814
static void ComputeDivB(amrex::MultiFab &divB, int dcomp, ablastr::fields::VectorField const &B, const std::array< amrex::Real, 3 > &dx)
Definition WarpX.cpp:3284
static bool do_shared_mem_charge_deposition
used shared memory algorithm for charge deposition
Definition WarpX.H:243
void ComputeMagnetostaticField()
Definition MagnetostaticSolver.cpp:62
amrex::Real stop_time
Definition WarpX.H:1358
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:51
bool m_exit_loop_due_to_interrupt_signal
Definition WarpX.H:1439
static bool use_fdtd_nci_corr
Definition WarpX.H:293
FiniteDifferenceSolver * get_pointer_fdtd_solver_fp(int lev)
Definition WarpX.H:945
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:1415
static amrex::Real moving_window_v
Definition WarpX.H:773
static bool do_shared_mem_current_deposition
use shared memory algorithm for current deposition
Definition WarpX.H:246
const AcceleratorLattice & get_accelerator_lattice(int lev)
Definition WarpX.H:910
amrex::Vector< amrex::IntVect > do_pml_Hi
Definition WarpX.H:1265
std::string GetAuthors() const
If an authors' string is specified in the inputfile, this method returns that string....
Definition WarpX.H:174
void setistep(int lev, int ii)
Definition WarpX.H:711
void CheckLoadBalance(int step)
Definition WarpXRegrid.cpp:58
static auto load_balance_costs_update_algo
Definition WarpX.H:198
static bool fft_do_time_averaging
Definition WarpX.H:774
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:1266
void OneStep_JRhom(amrex::Real cur_time)
Perform one PIC iteration, with the multiple J deposition per time step.
Definition WarpXEvolve.cpp:843
void FillBoundaryE_avg(amrex::IntVect ng)
Definition WarpXComm.cpp:748
static amrex::Array< ParticleBoundaryType, 3 > particle_boundary_lo
Definition WarpX.H:213
amrex::RealVect fine_tag_lo
Definition WarpX.H:1382
void SumBoundaryJ(const ablastr::fields::MultiLevelVectorField &current, int lev, int idim, const amrex::Periodicity &period)
Definition WarpXComm.cpp:1508
std::string restart_chkfile
Definition WarpX.H:1369
static WarpX * m_instance
Definition WarpX.H:1026
void HybridPICInitializeRhoJandB()
Hybrid-PIC initial deposition function. The hybrid-PIC algorithm uses the charge and current density ...
Definition WarpXPushFieldsHybridPIC.cpp:314
void ReadExternalFieldFromFile(const std::string &read_fields_from_path, amrex::MultiFab *mf, const std::string &F_name, const std::string &F_component, int dest_comp=0)
Load field values from a user-specified openPMD file for a specific field (specified by F_name)
int m_current_centering_noz
Order of finite centering of currents (from nodal grid to staggered grid), along z.
Definition WarpX.H:1191
static bool do_dynamic_scheduling
Definition WarpX.H:329
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:154
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:1385
amrex::Gpu::DeviceVector< amrex::Real > device_field_centering_stencil_coeffs_z
Definition WarpX.H:898
amrex::Real stopTime() const
Definition WarpX.H:725
amrex::Vector< std::unique_ptr< PML_RZ > > pml_rz
Definition WarpX.H:1268
void FillBoundaryE(amrex::IntVect ng, std::optional< bool > nodal_sync=std::nullopt)
Definition WarpXComm.cpp:712
amrex::Vector< amrex::Real > m_v_comoving
Definition WarpX.H:414
void InitData()
std::unique_ptr< MultiFluidContainer > myfl
Definition WarpX.H:1195
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:412
amrex::Gpu::DeviceVector< amrex::Real > device_field_centering_stencil_coeffs_x
Definition WarpX.H:896
std::unique_ptr< HybridPICModel > m_hybrid_pic_model
Definition WarpX.H:1311
amrex::Vector< amrex::Real > getdt() const
Definition WarpX.H:717
bool m_safe_guard_cells
Definition WarpX.H:1177
static int noz
Order of the particle shape factors (splines) along z.
Definition WarpX.H:271
amrex::Gpu::DeviceVector< amrex::Real > device_current_centering_stencil_coeffs_z
Definition WarpX.H:903
int mffile_nstreams
Definition WarpX.H:1378
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:1615
bool do_pml_divb_cleaning
Definition WarpX.H:1263
int magnetostatic_solver_max_iters
Definition WarpX.H:813
static auto time_dependency_J
Definition WarpX.H:223
static amrex::Array< FieldBoundaryType, 3 > field_boundary_lo
Definition WarpX.H:202
void ReadParameters()
Definition WarpX.cpp:547
amrex::Vector< amrex::Real > gett_old() const
Definition WarpX.H:712
void setVectorPotentialBC(ablastr::fields::MultiLevelVectorField const &A) const
Definition MagnetostaticSolver.cpp:230
static void ResetInstance()
Definition WarpX.cpp:308
int verbose
Definition WarpX.H:1352
amrex::Gpu::DeviceVector< amrex::Real > device_current_centering_stencil_coeffs_y
Definition WarpX.H:902
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:192
amrex::Real load_balance_knapsack_factor
Definition WarpX.H:1326
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:1334
static amrex::IntVect sort_bin_size
Definition WarpX.H:333
amrex::IntVect m_rho_nodal_flag
Definition WarpX.H:354
void PSATDMoveRhoNewToRhoMid()
Copy rho_new to rho_mid in spectral space (when rho is quadratic in time)
Definition WarpXPushFieldsEM.cpp:662
amrex::Vector< std::array< std::unique_ptr< amrex::iMultiFab >, 3 > > m_flag_ext_face
Definition WarpX.H:1242
std::optional< amrex::Real > m_max_omegap_dt
Definition WarpX.H:1294
amrex::IntVect getngEB() const
Definition WarpX.H:790
static auto charge_deposition_algo
Integer that corresponds to the charge deposition algorithm (only standard deposition)
Definition WarpX.H:186
amrex::Vector< std::array< std::unique_ptr< amrex::iMultiFab >, 3 > > Efield_dotMask
Definition WarpX.H:1211
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:337
amrex::Real gett_old(int lev) const
Definition WarpX.H:713
static int do_moving_window
Definition WarpX.H:759
amrex::Real moving_window_x
Definition WarpX.H:1278
amrex::Vector< std::array< std::unique_ptr< amrex::iMultiFab >, 3 > > & GetEBUpdateBFlag()
Definition WarpX.H:166
int maxStep() const
Definition WarpX.H:723
static int nox
Order of the particle shape factors (splines) along x.
Definition WarpX.H:267
int getnsubsteps(int lev) const
Definition WarpX.H:708
WarpX(WarpX const &)=delete
amrex::Vector< int > getistep() const
Definition WarpX.H:709
void InitFromScratch()
ablastr::utils::text::IntervalsParser m_dt_update_interval
Definition WarpX.H:1174
bool synchronize_velocity_for_diagnostics
Definition WarpX.H:1374
void DepositMassMatrices()
Definition WarpXImplicitOps.cpp:281
PSATDSolutionType m_psatd_solution_type
Definition WarpX.H:1466
amrex::Vector< int > m_mirror_z_npoints
Definition WarpX.H:1284
amrex::Vector< std::array< std::unique_ptr< amrex::iMultiFab >, 3 > > m_flag_info_face
Definition WarpX.H:1235
void updateMaxStep(const int new_max_step)
Definition WarpX.H:724
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:313
static ablastr::utils::text::IntervalsParser sort_intervals
Definition WarpX.H:332
std::optional< amrex::Real > m_zmax_plasma_to_compute_max_step
Definition WarpX.H:1363
amrex::Vector< std::unique_ptr< SpectralSolverRZ > > spectral_solver_fp
Definition WarpX.H:1599
static amrex::IntVect m_fill_guards_fields
Whether to fill guard cells when computing inverse FFTs of fields.
Definition WarpX.H:255
MacroscopicSolverAlgo m_macroscopic_solver_algo
Definition WarpX.H:1203
void SynchronizeVelocityWithPosition()
Definition WarpXEvolve.cpp:114
ablastr::fields::MultiFabRegister & GetMultiFabRegister()
Definition WarpX.H:949
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:310
amrex::Vector< std::array< std::unique_ptr< amrex::LayoutData< FaceInfoBox > >, 3 > > m_borrowing
Definition WarpX.H:1247
void HybridPICDepositRhoAndJ()
Hybrid-PIC deposition function. Helper function to contain all the needed logic to deposit charge and...
Definition WarpXPushFieldsHybridPIC.cpp:261
void PSATDPushSpectralFields()
Update all necessary fields in spectral space.
Definition WarpXPushFieldsEM.cpp:632
amrex::Real cfl
Definition WarpX.H:1367
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:1411
amrex::Real gett_new(int lev) const
Definition WarpX.H:715
amrex::Vector< amrex::Real > dt
Definition WarpX.H:1172
MultiFluidContainer & GetFluidContainer()
Definition WarpX.H:160
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:1401
int particle_io_nfiles
Definition WarpX.H:1380
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:3557
static WarpX & GetInstance()
Definition WarpX.cpp:299
static auto grid_type
Definition WarpX.H:351
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:1575
amrex::RealVect fine_tag_hi
Definition WarpX.H:1383
amrex::IntVect get_ng_fieldgather() const
Definition WarpX.H:795
amrex::IntVect get_ng_depos_rho() const
Definition WarpX.H:794
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:3615
static int start_moving_window_step
Definition WarpX.H:760
amrex::Vector< std::array< std::unique_ptr< amrex::iMultiFab >, 3 > > Afield_dotMask
Definition WarpX.H:1213
const amrex::iMultiFab * getCurrentBufferMasks(int lev) const
Definition WarpX.H:1133
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:1063
void PSATDForwardTransformF()
Forward FFT of F on all mesh refinement levels.
Definition WarpXPushFieldsEM.cpp:375
int do_silver_mueller
Definition WarpX.H:1255
void RescaleCosts(int step)
Definition WarpXRegrid.cpp:387
amrex::Vector< int > istep
Definition WarpX.H:1167
bool m_do_initial_div_cleaning
Definition WarpX.H:1419
void PrintMainPICparameters()
const amrex::Array< FieldBoundaryType, 3 > & GetFieldBoundaryHi() const
Definition WarpX.H:122
void FillBoundaryB(amrex::IntVect ng, std::optional< bool > nodal_sync=std::nullopt)
Definition WarpXComm.cpp:703
void HandleSignals()
Complete the asynchronous broadcast of signal flags, and initiate a checkpoint if requested.
Definition WarpXEvolve.cpp:1497
static int n_current_deposition_buffer
Definition WarpX.H:347
void HandleParticlesAtBoundaries(int step, amrex::Real cur_time, int num_moved)
Definition WarpXEvolve.cpp:716
int Verbose() const
Definition WarpX.H:115
bool m_verboncoeur_axis_correction
Definition WarpX.H:1302
void ApplyDtLimiters()
Definition WarpXComputeDt.cpp:237
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:1212
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::Real magnetostatic_solver_absolute_tolerance
Definition WarpX.H:812
amrex::Vector< int > injected_plasma_species
Definition WarpX.H:1289
void ApplyFilterMF(const ablastr::fields::MultiLevelVectorField &mfvec, int lev, int idim)
Definition WarpXComm.cpp:1479
bool m_is_synchronized
Definition WarpX.H:1387
void Evolve(int numsteps=-1)
Definition WarpXEvolve.cpp:148
static bool use_kspace_filter
If true, the bilinear filtering of charge and currents is done in Fourier space.
Definition WarpX.H:308
void InitNCICorrector()
void FinishImplicitField(const ablastr::fields::MultiLevelVectorField &Field_fp, const ablastr::fields::MultiLevelVectorField &Field_n, amrex::Real theta)
Definition WarpXImplicitOps.cpp:230
int getistep(int lev) const
Definition WarpX.H:710
std::unique_ptr< MultiDiagnostics > multi_diags
Definition WarpX.H:1181
static int noy
Order of the particle shape factors (splines) along y.
Definition WarpX.H:269
amrex::Vector< int > nsubsteps
Definition WarpX.H:1168
amrex::Vector< amrex::Real > gett_new() const
Definition WarpX.H:714
void ComputeMaxStep()
Compute the last time step of the simulation Calls computeMaxStepBoostAccelerator() if required.
int noz_fft
Definition WarpX.H:1403
std::optional< amrex::Real > m_max_omegac_dt
Definition WarpX.H:1295
static int field_centering_noz
Order of finite centering of fields (from staggered grid to nodal grid), along z.
Definition WarpX.H:281
void sett_new(int lev, amrex::Real time)
Definition WarpX.H:716
amrex::Real load_balance_efficiency_ratio_threshold
Definition WarpX.H:1332
ElectrostaticSolver & GetElectrostaticSolver()
Definition WarpX.H:161
amrex::IntVect getngF() const
Definition WarpX.H:791
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:318
void FillBoundaryB_avg(amrex::IntVect ng)
Definition WarpXComm.cpp:739
bool do_fluid_species
Definition WarpX.H:1194
MultiParticleContainer & GetPartContainer()
Definition WarpX.H:159
std::unique_ptr< ImplicitSolver > m_implicit_solver
Definition WarpX.H:1612
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:184
static bool do_divb_cleaning
Solve additional Maxwell equation for G in order to control errors in magnetic Gauss' law.
Definition WarpX.H:264
static auto electrostatic_solver_id
Definition WarpX.H:756
int load_balance_with_sfc
Definition WarpX.H:1321
void RestrictRhoFromFineToCoarsePatch(int lev)
Definition WarpXComm.cpp:1653
std::unique_ptr< MultiParticleContainer > mypc
Definition WarpX.H:1180
int m_current_centering_noy
Order of finite centering of currents (from nodal grid to staggered grid), along y.
Definition WarpX.H:1189
static bool use_filter
If true, a bilinear filter is used to smooth charge and currents.
Definition WarpX.H:306
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:258
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:377
MagnetostaticSolver::VectorPoissonBoundaryHandler m_vector_poisson_boundary_handler
Definition WarpX.H:810
bool m_collisions_split_momentum_push
WarpX class attribute that controls whether collisions are placed in the middle of the position push ...
Definition WarpX.H:1624
static amrex::IntVect shared_tilesize
tileSize to use for shared current deposition operations
Definition WarpX.H:252
amrex::Vector< std::unique_ptr< FiniteDifferenceSolver > > m_fdtd_solver_fp
Definition WarpX.H:1608
std::unique_ptr< ElectrostaticSolver > m_electrostatic_solver
Definition WarpX.H:1308
void ExplicitFillBoundaryEBUpdateAux()
Definition WarpXEvolve.cpp:655
const amrex::iMultiFab * getGatherBufferMasks(int lev) const
Definition WarpX.H:1137
int m_current_centering_nox
Order of finite centering of currents (from nodal grid to staggered grid), along x.
Definition WarpX.H:1187
amrex::IntVect getngUpdateAux() const
Definition WarpX.H:792
static void MakeWarpX()
This method creates a new instance of the WarpX class.
Definition WarpX.cpp:274
ablastr::utils::text::IntervalsParser load_balance_intervals
Definition WarpX.H:1316
amrex::Vector< amrex::Real > m_mirror_z_width
Definition WarpX.H:1283
int slice_plot_int
Definition WarpX.H:1396
void BackwardCompatibility()
Definition WarpX.cpp:1957
void FinishImplicitParticleUpdate(amrex::Real a_time)
Definition WarpXImplicitOps.cpp:210
void EvolveE(amrex::Real dt, amrex::Real start_time)
Definition WarpXPushFieldsEM.cpp:1000
int num_injected_species
Definition WarpX.H:1288
MediumForEM m_em_solver_medium
Integer that corresponds to electromagnetic Maxwell solver (vacuum - 0, macroscopic - 1)
Definition WarpX.H:1198
amrex::Vector< amrex::Real > t_old
Definition WarpX.H:1171
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
int regrid_int
Definition WarpX.H:1365
bool use_single_write
Definition WarpX.H:1377
static bool refine_plasma
Definition WarpX.H:330
ablastr::utils::text::IntervalsParser get_load_balance_intervals() const
returns the load balance interval
Definition WarpX.H:544
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:207
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:1376
amrex::IntVect numprocs
Domain decomposition on Level 0.
Definition WarpX.H:1422
static int ncomps
Definition WarpX.H:289
std::map< std::string, amrex::iMultiFab * > imultifab_map
Definition WarpX.H:384
static int moving_window_active(int const step)
Definition WarpX.H:767
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:117
bool m_limit_verbose_step
Definition WarpX.H:1353
int warpx_do_continuous_injection
Definition WarpX.H:1287
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:392
static bool galerkin_interpolation
Definition WarpX.H:303
int do_pml_in_domain
Definition WarpX.H:1260
amrex::Vector< std::array< std::unique_ptr< amrex::iMultiFab >, 3 > > m_eb_update_E
Definition WarpX.H:1219
amrex::Vector< std::unique_ptr< NCIGodfreyFilter > > nci_godfrey_filter_bxbyez
Definition WarpX.H:408
static amrex::IntVect filter_npass_each_dir
Definition WarpX.H:405
void ComputeDivE(amrex::MultiFab &divE, int lev)
Definition WarpX.cpp:3328
amrex::IntVect get_numprocs() const
Definition WarpX.H:804
amrex::Real GlobalCyclotronFrequencyMax()
Definition WarpXComputeDt.cpp:140
void AllocLevelData(int lev, const amrex::BoxArray &ba, const amrex::DistributionMapping &dm)
Definition WarpX.cpp:2291
ablastr::fields::MultiFabRegister m_fields
Definition WarpX.H:948
void InitPML()
amrex::Real v_particle_pml
Definition WarpX.H:1270
amrex::Vector< std::array< std::unique_ptr< amrex::iMultiFab >, 3 > > m_eb_update_B
Definition WarpX.H:1220
amrex::IntVect get_ng_depos_J() const
Definition WarpX.H:793
WarpX(WarpX &&)=delete
BilinearFilter bilinear_filter
Definition WarpX.H:406
static int particle_max_grid_crossings
Maximum number of allowed grid crossings for particles.
Definition WarpX.H:274
void FillBoundaryF(amrex::IntVect ng, std::optional< bool > nodal_sync=std::nullopt)
Definition WarpXComm.cpp:721
bool fft_periodic_single_box
Definition WarpX.H:1400
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:1709
static int field_centering_noy
Order of finite centering of fields (from staggered grid to nodal grid), along y.
Definition WarpX.H:279
int do_pml
Definition WarpX.H:1254
amrex::Real getdt(int lev) const
Definition WarpX.H:718
int max_step
Definition WarpX.H:1357
bool m_do_subcycling
Definition WarpX.H:1298
ParticleThermalizer m_particle_thermalizer
Definition WarpX.H:1184
amrex::Vector< std::unique_ptr< amrex::iMultiFab > > const & GetEBReduceParticleShapeFlag() const
Definition WarpX.H:167
amrex::Real costs_heuristic_particles_wt
Definition WarpX.H:1346
int pml_has_particles
Definition WarpX.H:1258
amrex::Vector< std::unique_ptr< NCIGodfreyFilter > > nci_godfrey_filter_exeybz
Definition WarpX.H:407
bool do_current_centering
Definition WarpX.H:229
std::string m_dt_update_diagnostic_file
Definition WarpX.H:1175
int getdo_moving_window() const
Definition WarpX.H:719
auto & get_spectral_solver_fp(int lev)
Definition WarpX.H:942
int pml_ncell
Definition WarpX.H:1256
static int n_rz_azimuthal_modes
Number of modes for the RZ multi-mode version.
Definition WarpX.H:284
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:1276
static amrex::Real gamma_boost
Lorentz factor of the boosted frame in which a boosted-frame simulation is run.
Definition WarpX.H:316
amrex::Vector< std::unique_ptr< amrex::iMultiFab > > phi_dotMask
Definition WarpX.H:1214
static int shared_mem_current_tpb
number of threads to use per block in shared deposition
Definition WarpX.H:249
bool write_diagnostics_on_restart
Definition WarpX.H:1372
int m_num_mirrors
Definition WarpX.H:1281
amrex::Vector< std::unique_ptr< FiniteDifferenceSolver > > m_fdtd_solver_cp
Definition WarpX.H:1609
void ResetCosts()
resets costs to zero
Definition WarpXRegrid.cpp:370
void computeMaxStepBoostAccelerator()
bool checkStopSimulation(amrex::Real cur_time)
Definition WarpXEvolve.cpp:648
std::unique_ptr< MultiReducedDiags > reduced_diags
object with all reduced diagnostics, similar to MultiParticleContainer for species.
Definition WarpX.H:417
amrex::Vector< amrex::Real > m_mirror_z
Definition WarpX.H:1282
std::optional< amrex::Real > m_max_dt
Definition WarpX.H:1293
amrex::Vector< std::unique_ptr< amrex::iMultiFab > > current_buffer_masks
Definition WarpX.H:1250
std::string m_authors
Author of an input file / simulation setup.
Definition WarpX.H:1165
int m_JRhom_subintervals
Definition WarpX.H:1616
int slice_max_grid_size
Definition WarpX.H:1395
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:297
void FillBoundaryG(amrex::IntVect ng, std::optional< bool > nodal_sync=std::nullopt)
Definition WarpXComm.cpp:730
void ApplyFilterandSumBoundaryRho(int lev, int glev, amrex::MultiFab &rho, int icomp, int ncomp)
Definition WarpXComm.cpp:1677
void OneStep_nosub(amrex::Real a_cur_time, amrex::Real a_dt, int a_step)
Perform one PIC iteration, without subcycling i.e. all levels/patches use the same timestep (that of ...
Definition WarpXEvolve.cpp:507
amrex::Vector< std::unique_ptr< AcceleratorLattice > > m_accelerator_lattice
Definition WarpX.H:1428
static auto time_dependency_rho
Definition WarpX.H:224
std::optional< amrex::Real > m_const_dt
Definition WarpX.H:1292
void Hybrid_QED_Push(amrex::Vector< amrex::Real > dt)
Definition WarpX_QED_Field_Pushers.cpp:47
amrex::RealBox slice_realbox
Definition WarpX.H:1397
amrex::Vector< amrex::IntVect > do_pml_Lo
Definition WarpX.H:1264
void applyMirrors(amrex::Real time)
Definition WarpXEvolve.cpp:1436
amrex::Vector< std::unique_ptr< SpectralSolverRZ > > spectral_solver_cp
Definition WarpX.H:1600
amrex::Real getmoving_window_x() const
Definition WarpX.H:720
amrex::Real costs_heuristic_cells_wt
Definition WarpX.H:1340
bool do_pml_dive_cleaning
Definition WarpX.H:1262
amrex::Real GlobalPlasmaFrequencyMax()
Definition WarpXComputeDt.cpp:132
bool do_similar_dm_pml
Definition WarpX.H:1261
void EvolveF(amrex::Real dt, int rho_comp)
Definition WarpXPushFieldsEM.cpp:1087
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:327
bool current_correction
If true, a correction is applied to the current in Fourier space,.
Definition WarpX.H:233
void ComputePMLFactors()
static int end_moving_window_step
Definition WarpX.H:761
bool update_with_rho
Definition WarpX.H:237
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:410
MultiDiagnostics & GetMultiDiags()
Definition WarpX.H:163
This is a wrapper class around a Vector of pointers to MultiFabs that contains basic math operators a...
Definition WarpXSolverVec.H:56
Definition MultiFabRegister.H:71
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:105
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 &box_array) const
This class computes and stores the number of guard cells needed for the allocation of the MultiFabs a...
Definition GuardCellManager.H:23
amrex_real Real
PODVector< T, ArenaAllocator< T > > DeviceVector
std::array< T, N > Array
std::array< amrex::MultiFab *, 3 > VectorField
Definition MultiFabRegister.H:201
amrex::Vector< ScalarField > MultiLevelScalarField
Definition MultiFabRegister.H:210
amrex::Vector< VectorField > MultiLevelVectorField
Definition MultiFabRegister.H:218
@ Default
Definition Enums.H:23
PatchType
Definition Enums.H:30
void Finalize()
BoxND< 3 > Box
IntVectND< 3 > IntVect
RealVectND< 3 > RealVect
std::string Version()
FieldType
Definition Fields.H:97
Definition ImplicitOptions.H:7
Definition MultiFabRegister.H:272