WarpX
BackTransformedDiagnostic.H
Go to the documentation of this file.
1 /* Copyright 2019 Andrew Myers, Axel Huebl, Maxence Thevenet
2  * Revathi Jambunathan, Weiqun Zhang
3  *
4  * This file is part of WarpX.
5  *
6  * License: BSD-3-Clause-LBNL
7  */
8 #ifndef WARPX_BackTransformedDiagnostic_H_
9 #define WARPX_BackTransformedDiagnostic_H_
10 
12 
15 
16 #include <AMReX_Box.H>
17 #include <AMReX_IntVect.H>
18 #include <AMReX_MultiFab.H>
19 #include <AMReX_REAL.H>
20 #include <AMReX_RealBox.H>
21 #include <AMReX_Vector.H>
22 
23 #include <AMReX_BaseFwd.H>
24 
25 #include <map>
26 #include <memory>
27 #include <string>
28 #include <vector>
29 
50 class LabFrameDiag {
51  public:
52  std::string m_file_name;
53  amrex::Real m_t_lab;
58 
59  amrex::Real m_current_z_lab;
60  amrex::Real m_current_z_boost;
61  amrex::Real m_inv_gamma_boost_;
62  amrex::Real m_inv_beta_boost_;
63  amrex::Real m_dz_lab_;
65 
67  std::vector<std::string> m_mesh_field_names_;
68 
70 
71  // For back-transformed diagnostics of grid fields, data_buffer_
72  // stores a buffer of the fields in the lab frame (in a MultiFab, i.e.
73  // with all box data etc.). When the buffer if full, dump to file.
74  std::unique_ptr<amrex::MultiFab> m_data_buffer_;
75  // particles_buffer_ is currently blind to refinement level.
76  // particles_buffer_[j] is a WarpXParticleContainer::DiagnosticParticleData
77  // where - j is the species number for the current diag
79  // buff_counter_ is the number of z slices in data_buffer_
81  int m_num_buffer_ = 256;
82  int m_max_box_size = 256;
83  void updateCurrentZPositions(amrex::Real t_boost, amrex::Real inv_gamma,
84  amrex::Real inv_beta);
85 
87 
88  void writeLabFrameHeader();
89 
96  virtual void AddDataToBuffer(amrex::MultiFab& /*tmp_slice_ptr*/, int /*i_lab*/,
97  amrex::Vector<int> const& /*map_actual_fields_to_dump*/){}
98 
107  int /*nSpeciesBoostedFrame*/) {}
108 
109  // The destructor should also be a virtual function, so that
110  // a pointer to subclass of `LabFrameDiag` actually calls the subclass's destructor.
111  virtual ~LabFrameDiag() = default;
112 };
113 
124  public:
125  LabFrameSnapShot(amrex::Real t_lab_in, amrex::Real t_boost,
126  amrex::Real inv_gamma_boost_in, amrex::Real inv_beta_boost_in,
127  amrex::Real dz_lab_in, amrex::RealBox prob_domain_lab,
128  amrex::IntVect prob_ncells_lab, int ncomp_to_dump,
129  std::vector<std::string> mesh_field_names,
130  amrex::RealBox diag_domain_lab,
131  amrex::Box diag_box, int file_num_in, const int max_box_size,
132  const int buffer_size);
133  void AddDataToBuffer( amrex::MultiFab& tmp_slice, int k_lab,
134  amrex::Vector<int> const& map_actual_fields_to_dump) override;
137  int nSpeciesBoostedFrame) override;
138 };
139 
140 
150 class LabFrameSlice : public LabFrameDiag {
151  public:
152  LabFrameSlice(amrex::Real t_lab_in, amrex::Real t_boost,
153  amrex::Real inv_gamma_boost_in, amrex::Real inv_beta_boost_in,
154  amrex::Real dz_lab_in, amrex::RealBox prob_domain_lab,
155  amrex::IntVect prob_ncells_lab, int ncomp_to_dump,
156  std::vector<std::string> mesh_field_names,
157  amrex::RealBox diag_domain_lab,
158  amrex::Box diag_box, int file_num_in,
159  amrex::Real particle_slice_dx_lab,
160  const int max_box_size,
161  const int buffer_size);
162  void AddDataToBuffer( amrex::MultiFab& tmp_slice_ptr, int i_lab,
163  amrex::Vector<int> const& map_actual_fields_to_dump) override;
166  int nSpeciesBoostedFrame) override;
167 };
168 
186 
187 public:
188 
189  BackTransformedDiagnostic (amrex::Real zmin_lab, amrex::Real zmax_lab,
190  amrex::Real v_window_lab, amrex::Real dt_snapshots_lab,
191  int N_snapshots, amrex::Real dt_slice_snapshots_lab,
192  int N_slice_snapshots, amrex::Real gamma_boost,
193  amrex::Real t_boost, amrex::Real dt_boost,
194  int boost_direction, const amrex::Geometry& geom,
195  amrex::RealBox& slice_realbox,
196  amrex::Real particle_slice_width_lab);
197 
200  void Flush (const amrex::Geometry& geom);
201 
224  void writeLabFrameData (const amrex::MultiFab* cell_centered_data,
225  const MultiParticleContainer& mypc,
226  const amrex::Geometry& geom,
227  const amrex::Real t_boost, const amrex::Real dt);
229  void writeMetaData ();
230 
231 private:
232  amrex::Real m_gamma_boost_;
233  amrex::Real m_inv_gamma_boost_;
234  amrex::Real m_beta_boost_;
235  amrex::Real m_inv_beta_boost_;
236  amrex::Real m_dz_lab_;
237  amrex::Real m_inv_dz_lab_;
238  amrex::Real m_dt_snapshots_lab_;
239  amrex::Real m_dt_boost_;
245 
246  int m_num_buffer_ = 256;
247  int m_max_box_size_ = 256;
248 
249  std::vector<std::unique_ptr<LabFrameDiag> > m_LabFrameDiags_;
250 
251  void writeParticleData (
253  const std::string& name, const int i_lab);
254 
255 #ifdef WARPX_USE_HDF5
256  void writeParticleDataHDF5(
258  const std::string& name, const std::string& species_name);
259 #endif
260  // Map field names and component number in cell_centered_data
261  std::map<std::string, int> m_possible_fields_to_dump = {
262  {"Ex" , 0},
263  {"Ey" , 1},
264  {"Ez" , 2},
265  {"Bx" , 3},
266  {"By" , 4},
267  {"Bz" , 5},
268  {"jx" , 6},
269  {"jy" , 7},
270  {"jz" , 8},
271  {"rho", 9} };
272 
273  // maps field index in data_buffer_[i] -> cell_centered_data for
274  // snapshots i. By default, all fields in cell_centered_data are dumped.
275  // Needs to be amrex::Vector because used in a ParallelFor kernel.
277  // Name of fields to dump. By default, all fields in cell_centered_data.
278  // Needed for file headers only.
279  std::vector<std::string> m_mesh_field_names = {"Ex", "Ey", "Ez",
280  "Bx", "By", "Bz",
281  "jx", "jy", "jz", "rho"};
282  int m_ncomp_to_dump = 10;
283 
284 
285 };
286 
287 #endif
amrex::Real m_particle_slice_width_lab_
Definition: BackTransformedDiagnostic.H:244
BackTransformedDiagnostic class handles the back-transformation of data when running simulations in a...
Definition: BackTransformedDiagnostic.H:185
int m_ncomp_to_dump_
Definition: BackTransformedDiagnostic.H:66
void updateCurrentZPositions(amrex::Real t_boost, amrex::Real inv_gamma, amrex::Real inv_beta)
Definition: BackTransformedDiagnostic.cpp:1236
amrex::Vector< int > map_actual_fields_to_dump
Definition: BackTransformedDiagnostic.H:276
LabFrameSnapShot stores the back-transformed lab-frame metadata corresponding to a single time snapsh...
Definition: BackTransformedDiagnostic.H:123
amrex::Real m_current_z_lab
Definition: BackTransformedDiagnostic.H:59
int m_buff_counter_
Definition: BackTransformedDiagnostic.H:80
amrex::Real m_inv_beta_boost_
Definition: BackTransformedDiagnostic.H:235
int gamma_boost
Definition: compute_domain.py:41
amrex::IntVect m_prob_ncells_lab_
Definition: BackTransformedDiagnostic.H:55
std::vector< std::string > m_mesh_field_names_
Definition: BackTransformedDiagnostic.H:67
amrex::Box m_buff_box_
Definition: BackTransformedDiagnostic.H:57
Definition: MultiParticleContainer.H:64
amrex::Real m_inv_beta_boost_
Definition: BackTransformedDiagnostic.H:62
int dt
Definition: Stencil.py:468
int m_N_snapshots_
Definition: BackTransformedDiagnostic.H:240
LabFrameSlice stores the back-transformed metadata corresponding to a single time at the user-defined...
Definition: BackTransformedDiagnostic.H:150
void writeLabFrameHeader()
Definition: BackTransformedDiagnostic.cpp:1329
amrex::Real m_current_z_boost
Definition: BackTransformedDiagnostic.H:60
amrex::Real m_dt_boost_
Definition: BackTransformedDiagnostic.H:239
amrex::Real m_t_lab
Definition: BackTransformedDiagnostic.H:53
amrex::Real m_beta_boost_
Definition: BackTransformedDiagnostic.H:234
amrex::Real m_dz_lab_
Definition: BackTransformedDiagnostic.H:63
virtual void AddDataToBuffer(amrex::MultiFab &, int, amrex::Vector< int > const &)
Definition: BackTransformedDiagnostic.H:96
std::string m_file_name
Definition: BackTransformedDiagnostic.H:52
virtual void AddPartDataToParticleBuffer(amrex::Vector< WarpXParticleContainer::DiagnosticParticleData > const &, int)
Definition: BackTransformedDiagnostic.H:105
amrex::Real m_inv_gamma_boost_
Definition: BackTransformedDiagnostic.H:233
amrex::RealBox m_prob_domain_lab_
Definition: BackTransformedDiagnostic.H:54
void createLabFrameDirectories()
Definition: BackTransformedDiagnostic.cpp:1244
The capability for back-transformed lab-frame data is implemented to generate the full diagnostic sna...
Definition: BackTransformedDiagnostic.H:50
std::unique_ptr< amrex::MultiFab > m_data_buffer_
Definition: BackTransformedDiagnostic.H:74
int m_max_box_size
Definition: BackTransformedDiagnostic.H:82
int m_num_buffer_
Definition: BackTransformedDiagnostic.H:81
std::vector< std::unique_ptr< LabFrameDiag > > m_LabFrameDiags_
Definition: BackTransformedDiagnostic.H:249
int m_N_slice_snapshots_
Definition: BackTransformedDiagnostic.H:242
amrex::Real m_inv_gamma_boost_
Definition: BackTransformedDiagnostic.H:61
int m_file_num
Definition: BackTransformedDiagnostic.H:69
amrex::Real m_dt_slice_snapshots_lab_
Definition: BackTransformedDiagnostic.H:243
amrex::Vector< WarpXParticleContainer::DiagnosticParticleData > m_particles_buffer_
Definition: BackTransformedDiagnostic.H:78
amrex::Real m_dt_snapshots_lab_
Definition: BackTransformedDiagnostic.H:238
string name
Definition: Stencil.py:485
amrex::Real m_particle_slice_dx_lab_
Definition: BackTransformedDiagnostic.H:64
amrex::RealBox m_diag_domain_lab_
Definition: BackTransformedDiagnostic.H:56
virtual ~LabFrameDiag()=default
amrex::Real m_gamma_boost_
Definition: BackTransformedDiagnostic.H:232
amrex::Real m_dz_lab_
Definition: BackTransformedDiagnostic.H:236
amrex::Real m_inv_dz_lab_
Definition: BackTransformedDiagnostic.H:237
int m_boost_direction_
Definition: BackTransformedDiagnostic.H:241