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 #include "Utils/WarpXConst.H"
13 
14 #include <AMReX_Geometry.H>
15 #include <AMReX_ParallelDescriptor.H>
16 #include <AMReX_PlotFileUtil.H>
17 #include <AMReX_VisMF.H>
18 
19 #include <map>
20 #include <vector>
21 
22 
43 class LabFrameDiag {
44  public:
45  std::string m_file_name;
46  amrex::Real m_t_lab;
47  amrex::RealBox m_prob_domain_lab_;
48  amrex::IntVect m_prob_ncells_lab_;
49  amrex::RealBox m_diag_domain_lab_;
50  amrex::Box m_buff_box_;
51 
52  amrex::Real m_current_z_lab;
53  amrex::Real m_current_z_boost;
54  amrex::Real m_inv_gamma_boost_;
55  amrex::Real m_inv_beta_boost_;
56  amrex::Real m_dz_lab_;
58 
60  std::vector<std::string> m_mesh_field_names_;
61 
64 
65  // For back-transformed diagnostics of grid fields, data_buffer_
66  // stores a buffer of the fields in the lab frame (in a MultiFab, i.e.
67  // with all box data etc.). When the buffer if full, dump to file.
68  std::unique_ptr<amrex::MultiFab> m_data_buffer_;
69  // particles_buffer_ is currently blind to refinement level.
70  // particles_buffer_[j] is a WarpXParticleContainer::DiagnosticParticleData
71  // where - j is the species number for the current diag
72  amrex::Vector<WarpXParticleContainer::DiagnosticParticleData> m_particles_buffer_;
73  // buff_counter_ is the number of z slices in data_buffer_
75  int m_num_buffer_ = 256;
76  int m_max_box_size = 256;
77  void updateCurrentZPositions(amrex::Real t_boost, amrex::Real inv_gamma,
78  amrex::Real inv_beta);
79 
81 
82  void writeLabFrameHeader();
83 
90  virtual void AddDataToBuffer(amrex::MultiFab& /*tmp_slice_ptr*/, int /*i_lab*/,
91  amrex::Vector<int> const& /*map_actual_fields_to_dump*/){}
92 
100  amrex::Vector<WarpXParticleContainer::DiagnosticParticleData> const& /*tmp_particle_buffer*/,
101  int /*nSpeciesBoostedFrame*/) {}
102 
103  // The destructor should also be a virtual function, so that
104  // a pointer to subclass of `LabFrameDiag` actually calls the subclass's destructor.
105  virtual ~LabFrameDiag() = default;
106 };
107 
118  public:
119  LabFrameSnapShot(amrex::Real t_lab_in, amrex::Real t_boost,
120  amrex::Real inv_gamma_boost_in, amrex::Real inv_beta_boost_in,
121  amrex::Real dz_lab_in, amrex::RealBox prob_domain_lab,
122  amrex::IntVect prob_ncells_lab, int ncomp_to_dump,
123  std::vector<std::string> mesh_field_names,
124  amrex::RealBox diag_domain_lab,
125  amrex::Box diag_box, int file_num_in);
126  void AddDataToBuffer( amrex::MultiFab& tmp_slice, int k_lab,
127  amrex::Vector<int> const& map_actual_fields_to_dump) override;
129  amrex::Vector<WarpXParticleContainer::DiagnosticParticleData> const& tmp_particle_buffer,
130  int nSpeciesBoostedFrame) override;
131 };
132 
133 
143 class LabFrameSlice : public LabFrameDiag {
144  public:
145  LabFrameSlice(amrex::Real t_lab_in, amrex::Real t_boost,
146  amrex::Real inv_gamma_boost_in, amrex::Real inv_beta_boost_in,
147  amrex::Real dz_lab_in, amrex::RealBox prob_domain_lab,
148  amrex::IntVect prob_ncells_lab, int ncomp_to_dump,
149  std::vector<std::string> mesh_field_names,
150  amrex::RealBox diag_domain_lab,
151  amrex::Box diag_box, int file_num_in,
152  amrex::Real particle_slice_dx_lab);
153  void AddDataToBuffer( amrex::MultiFab& tmp_slice_ptr, int i_lab,
154  amrex::Vector<int> const& map_actual_fields_to_dump) override;
156  amrex::Vector<WarpXParticleContainer::DiagnosticParticleData> const& tmp_particle_buffer,
157  int nSpeciesBoostedFrame) override;
158 };
159 
177 
178 public:
179 
180  BackTransformedDiagnostic(amrex::Real zmin_lab, amrex::Real zmax_lab,
181  amrex::Real v_window_lab, amrex::Real dt_snapshots_lab,
182  int N_snapshots, amrex::Real dt_slice_snapshots_lab,
183  int N_slice_snapshots, amrex::Real gamma_boost,
184  amrex::Real t_boost, amrex::Real dt_boost,
185  int boost_direction, const amrex::Geometry& geom,
186  amrex::RealBox& slice_realbox,
187  amrex::Real particle_slice_width_lab);
188 
191  void Flush(const amrex::Geometry& geom);
192 
215  void writeLabFrameData(const amrex::MultiFab* cell_centered_data,
216  const MultiParticleContainer& mypc,
217  const amrex::Geometry& geom,
218  const amrex::Real t_boost, const amrex::Real dt);
220  void writeMetaData();
221 
222 private:
223  amrex::Real m_gamma_boost_;
224  amrex::Real m_inv_gamma_boost_;
225  amrex::Real m_beta_boost_;
226  amrex::Real m_inv_beta_boost_;
227  amrex::Real m_dz_lab_;
228  amrex::Real m_inv_dz_lab_;
229  amrex::Real m_dt_snapshots_lab_;
230  amrex::Real m_dt_boost_;
236 
237  int m_num_buffer_ = 256;
238  int m_max_box_size_ = 256;
239 
240  std::vector<std::unique_ptr<LabFrameDiag> > m_LabFrameDiags_;
241 
242  void writeParticleData(
244  const std::string& name, const int i_lab);
245 
246 #ifdef WARPX_USE_HDF5
247  void writeParticleDataHDF5(
249  const std::string& name, const std::string& species_name);
250 #endif
251  // Map field names and component number in cell_centered_data
252  std::map<std::string, int> m_possible_fields_to_dump = {
253  {"Ex" , 0},
254  {"Ey" , 1},
255  {"Ez" , 2},
256  {"Bx" , 3},
257  {"By" , 4},
258  {"Bz" , 5},
259  {"jx" , 6},
260  {"jy" , 7},
261  {"jz" , 8},
262  {"rho", 9} };
263 
264  // maps field index in data_buffer_[i] -> cell_centered_data for
265  // snapshots i. By default, all fields in cell_centered_data are dumped.
266  // Needs to be amrex::Vector because used in a ParallelFor kernel.
267  amrex::Vector<int> map_actual_fields_to_dump;
268  // Name of fields to dump. By default, all fields in cell_centered_data.
269  // Needed for file headers only.
270  std::vector<std::string> m_mesh_field_names = {"Ex", "Ey", "Ez",
271  "Bx", "By", "Bz",
272  "jx", "jy", "jz", "rho"};
273  int m_ncomp_to_dump = 10;
274 
275 
276 };
277 
278 #endif
amrex::Real m_particle_slice_width_lab_
Definition: BackTransformedDiagnostic.H:235
BackTransformedDiagnostic class handles the back-transformation of data when running simulations in a...
Definition: BackTransformedDiagnostic.H:176
int m_ncomp_to_dump_
Definition: BackTransformedDiagnostic.H:59
void updateCurrentZPositions(amrex::Real t_boost, amrex::Real inv_gamma, amrex::Real inv_beta)
Definition: BackTransformedDiagnostic.cpp:1152
amrex::Vector< int > map_actual_fields_to_dump
Definition: BackTransformedDiagnostic.H:267
LabFrameSnapShot stores the back-transformed lab-frame metadata corresponding to a single time snapsh...
Definition: BackTransformedDiagnostic.H:117
amrex::Real m_current_z_lab
Definition: BackTransformedDiagnostic.H:52
int m_buff_counter_
Definition: BackTransformedDiagnostic.H:74
amrex::Real m_inv_beta_boost_
Definition: BackTransformedDiagnostic.H:226
int gamma_boost
Definition: compute_domain.py:41
amrex::IntVect m_prob_ncells_lab_
Definition: BackTransformedDiagnostic.H:48
std::vector< std::string > m_mesh_field_names_
Definition: BackTransformedDiagnostic.H:60
amrex::Box m_buff_box_
Definition: BackTransformedDiagnostic.H:50
Definition: MultiParticleContainer.H:53
amrex::Real m_inv_beta_boost_
Definition: BackTransformedDiagnostic.H:55
int m_N_snapshots_
Definition: BackTransformedDiagnostic.H:231
LabFrameSlice stores the back-transformed metadata corresponding to a single time at the user-defined...
Definition: BackTransformedDiagnostic.H:143
void writeLabFrameHeader()
Definition: BackTransformedDiagnostic.cpp:1241
amrex::Real m_current_z_boost
Definition: BackTransformedDiagnostic.H:53
amrex::Real m_dt_boost_
Definition: BackTransformedDiagnostic.H:230
amrex::Real m_t_lab
Definition: BackTransformedDiagnostic.H:46
amrex::Real m_beta_boost_
Definition: BackTransformedDiagnostic.H:225
amrex::Real m_dz_lab_
Definition: BackTransformedDiagnostic.H:56
virtual void AddDataToBuffer(amrex::MultiFab &, int, amrex::Vector< int > const &)
Definition: BackTransformedDiagnostic.H:90
std::string m_file_name
Definition: BackTransformedDiagnostic.H:45
virtual void AddPartDataToParticleBuffer(amrex::Vector< WarpXParticleContainer::DiagnosticParticleData > const &, int)
Definition: BackTransformedDiagnostic.H:99
amrex::Real m_inv_gamma_boost_
Definition: BackTransformedDiagnostic.H:224
amrex::StructOfArrays< DiagIdx::nattribs, 0 > DiagnosticParticleData
Definition: WarpXParticleContainer.H:142
amrex::RealBox m_prob_domain_lab_
Definition: BackTransformedDiagnostic.H:47
void createLabFrameDirectories()
Definition: BackTransformedDiagnostic.cpp:1160
The capability for back-transformed lab-frame data is implemented to generate the full diagnostic sna...
Definition: BackTransformedDiagnostic.H:43
std::unique_ptr< amrex::MultiFab > m_data_buffer_
Definition: BackTransformedDiagnostic.H:68
int m_max_box_size
Definition: BackTransformedDiagnostic.H:76
int m_num_buffer_
Definition: BackTransformedDiagnostic.H:75
std::vector< std::unique_ptr< LabFrameDiag > > m_LabFrameDiags_
Definition: BackTransformedDiagnostic.H:240
int m_N_slice_snapshots_
Definition: BackTransformedDiagnostic.H:233
amrex::Real m_inv_gamma_boost_
Definition: BackTransformedDiagnostic.H:54
name
Definition: run_automated.py:204
int m_initial_i
Definition: BackTransformedDiagnostic.H:63
int m_file_num
Definition: BackTransformedDiagnostic.H:62
amrex::Real m_dt_slice_snapshots_lab_
Definition: BackTransformedDiagnostic.H:234
amrex::Vector< WarpXParticleContainer::DiagnosticParticleData > m_particles_buffer_
Definition: BackTransformedDiagnostic.H:72
amrex::Real m_dt_snapshots_lab_
Definition: BackTransformedDiagnostic.H:229
amrex::Real m_particle_slice_dx_lab_
Definition: BackTransformedDiagnostic.H:57
amrex::RealBox m_diag_domain_lab_
Definition: BackTransformedDiagnostic.H:49
virtual ~LabFrameDiag()=default
amrex::Real m_gamma_boost_
Definition: BackTransformedDiagnostic.H:223
amrex::Real m_dz_lab_
Definition: BackTransformedDiagnostic.H:227
amrex::Real m_inv_dz_lab_
Definition: BackTransformedDiagnostic.H:228
int m_boost_direction_
Definition: BackTransformedDiagnostic.H:232