Hipace
MultiLaser.H
Go to the documentation of this file.
1 /* Copyright 2022
2  *
3  * This file is part of HiPACE++.
4  *
5  * Authors: MaxThevenet, AlexanderSinn
6  * Severin Diederichs, atmyers, Angel Ferran Pousa
7  * License: BSD-3-Clause-LBNL
8  */
9 
10 #ifndef MULTILASER_H_
11 #define MULTILASER_H_
12 
13 #include "Laser.H"
14 #include "fields/Fields.H"
15 #include "mg_solver/HpMultiGrid.H"
16 
17 #include <AMReX_MultiFab.H>
18 #include <AMReX_Vector.H>
19 #include <AMReX_AmrCore.H>
20 #include <AMReX_GpuComplex.H>
21 
22 #ifdef AMREX_USE_CUDA
23 # include <cufft.h>
24 #elif defined(AMREX_USE_HIP)
25 # if __has_include(<rocfft/rocfft.h>) // ROCm 5.3+
26 # include <rocfft/rocfft.h>
27 # else
28 # include <rocfft.h>
29 # endif
30 #else
31 # include <fftw3.h>
32 #endif
33 
34 namespace LaserFFT {
35 #ifdef AMREX_USE_CUDA
36  using VendorFFT = cufftHandle;
37  const auto VendorCreate = cufftPlan2d;
38  const auto VendorDestroy = cufftDestroy;
39 # ifdef AMREX_USE_FLOAT
40  const auto VendorExecute = cufftExecC2C;
41  const auto cufft_type = CUFFT_C2C;
42  using cufftComplex = cuComplex;
43 # else
44  const auto VendorExecute = cufftExecZ2Z;
45  const auto cufft_type = CUFFT_Z2Z;
46  using cufftComplex = cuDoubleComplex;
47 # endif
48 #elif defined(AMREX_USE_HIP)
49  using VendorFFT = rocfft_plan;
50  const auto VendorDestroy = rocfft_plan_destroy;
51 // TODO
52 #else
53 # ifdef AMREX_USE_FLOAT
54  using VendorFFT = fftwf_plan;
55  using FFTWComplex = fftwf_complex;
56  const auto VendorCreate = fftwf_plan_dft_2d;
57  const auto VendorExecute = fftwf_execute;
58  const auto VendorDestroy = fftwf_destroy_plan;
59 # else
60  using VendorFFT = fftw_plan;
61  using FFTWComplex = fftw_complex;
62  const auto VendorCreate = fftw_plan_dft_2d;
63  const auto VendorExecute = fftw_execute;
64  const auto VendorDestroy = fftw_destroy_plan;
65 # endif
66 #endif
67 }
68 
70 namespace WhichLaserSlice {
71  // n stands for the time step, j for the longitudinal slice.
72  // n00 is time step n, nm1 is n-1 and np1 is n+1. Similar notation for slice j.
73  enum slice {
92  N
93  };
94 }
95 
96 class Fields;
97 
99 {
100 
102 
103 public:
104 
106  explicit MultiLaser ()
107  {
108  ReadParameters();
109  }
110 
112  {
113  if (!m_use_laser) return;
114  if (m_solver_type == "fft") {
117  }
118  }
119 
120  void ReadParameters ();
121 
124 
126  const amrex::MultiFab& getSlices () const {return m_slices; }
127 
133  void InitData (const amrex::BoxArray& slice_ba,
134  const amrex::DistributionMapping& slice_dm,
135  const amrex::Geometry& geom_3D);
136 
142  void InitSliceEnvelope (const int islice, const int comp);
143 
149 
154  template<typename input_type>
155  void GetEnvelopeFromFile (const amrex::Geometry& gm);
156 
159  void ShiftLaserSlices ();
160 
166  void AdvanceSlice (const Fields& fields, amrex::Real dt, int step);
167 
175  void AdvanceSliceMG (const Fields& fields, amrex::Real dt, int step);
176 
184  void AdvanceSliceFFT (const Fields& fields, amrex::Real dt, int step);
185 
193  void InitLaserSlice (const amrex::Geometry& geom, const int islice, const int comp);
194 
203  void InSituComputeDiags (int step, amrex::Real time, int islice, const amrex::Geometry& geom3D,
204  int max_step, amrex::Real max_time);
205 
213  void InSituWriteToFile (int step, amrex::Real time, const amrex::Geometry& geom3D,
214  int max_step, amrex::Real max_time);
215 
217  amrex::Real GetLambda0 () const { return m_lambda0; }
218 
219  bool m_use_laser {false};
221 private:
222 
226  amrex::Real m_lambda0 {0.};
228  int m_nlasers;
232  std::string m_solver_type = "multigrid";
233  bool m_use_phase {true};
236 
238  bool m_laser_from_file = false;
242  std::string m_input_file_path;
244  std::string m_file_envelope_name = "laserEnvelope";
248  std::string m_file_geometry = "";
249 
252  amrex::Real m_MG_tolerance_rel = 1.e-4;
253  amrex::Real m_MG_tolerance_abs = 0.;
254  int m_MG_verbose = 0;
256  bool m_MG_average_rhs = true;
258  std::unique_ptr<hpmg::MultiGrid> m_mg;
259 
260  // Elements for the FFT-based laser envelope solver
261  // This could belong to AnyFFT etc., with 2 caveats:
262  // - This solver operates on a FArrayBox instead of a MultiFab, which is more adequate
263  // - The array in position space must be Complex rather than real, which takes up quite some
264  // rewriting, see https://github.com/MaxThevenet/hipace/tree/laser_solve,
265  // not sure what the best way to proceed is.
276 #ifdef AMREX_USE_CUDA
277  cufftResult m_result_fwd;
278  cufftResult m_result_bkw;
279 #endif
280 
281  // Data for in-situ diagnostics:
283  static constexpr int m_insitu_nrp = 6;
285  static constexpr int m_insitu_ncp = 1;
296  std::string m_insitu_file_prefix = "diags/laser_insitu";
297 };
298 
299 #endif // MULTILASER_H_
Main class handling all field data structures and operations.
Definition: Fields.H:85
Definition: MultiLaser.H:99
void InitData(const amrex::BoxArray &slice_ba, const amrex::DistributionMapping &slice_dm, const amrex::Geometry &geom_3D)
Allocate laser multifab.
Definition: MultiLaser.cpp:86
amrex::MultiFab & getSlices()
Definition: MultiLaser.H:123
void GetEnvelopeFromFileHelper(const amrex::Geometry &gm)
Read in a laser from an openPMD file.
Definition: MultiLaser.cpp:220
static constexpr int m_insitu_ncp
Definition: MultiLaser.H:285
bool m_laser_from_file
Definition: MultiLaser.H:238
SpectralFieldLoc m_rhs_fourier
Definition: MultiLaser.H:275
amrex::Vector< Laser > m_all_lasers
Definition: MultiLaser.H:229
void AdvanceSliceFFT(const Fields &fields, amrex::Real dt, int step)
Definition: MultiLaser.cpp:744
bool m_use_laser
Definition: MultiLaser.H:219
int m_insitu_period
Definition: MultiLaser.H:288
amrex::Vector< amrex::GpuComplex< amrex::Real > > m_insitu_cdata
Definition: MultiLaser.H:294
amrex::Vector< std::string > m_names
Definition: MultiLaser.H:227
int m_MG_verbose
Definition: MultiLaser.H:254
void ReadParameters()
Definition: MultiLaser.cpp:41
std::string m_file_geometry
Definition: MultiLaser.H:248
std::unique_ptr< hpmg::MultiGrid > m_mg
Definition: MultiLaser.H:258
void InSituComputeDiags(int step, amrex::Real time, int islice, const amrex::Geometry &geom3D, int max_step, amrex::Real max_time)
Definition: MultiLaser.cpp:1070
amrex::FArrayBox m_F_input_file
Definition: MultiLaser.H:240
void InitLaserSlice(const amrex::Geometry &geom, const int islice, const int comp)
Definition: MultiLaser.cpp:1000
MultiLaser()
Definition: MultiLaser.H:106
void AdvanceSlice(const Fields &fields, amrex::Real dt, int step)
Definition: MultiLaser.cpp:537
~MultiLaser()
Definition: MultiLaser.H:111
void InSituWriteToFile(int step, amrex::Real time, const amrex::Geometry &geom3D, int max_step, amrex::Real max_time)
Definition: MultiLaser.cpp:1153
bool m_use_phase
Definition: MultiLaser.H:233
amrex::Real m_MG_tolerance_abs
Definition: MultiLaser.H:253
amrex::Real GetLambda0() const
Definition: MultiLaser.H:217
int m_nlasers
Definition: MultiLaser.H:228
amrex::Real m_lambda0
Definition: MultiLaser.H:226
LaserFFT::VendorFFT m_plan_bkw
Definition: MultiLaser.H:269
std::string m_file_envelope_name
Definition: MultiLaser.H:244
const amrex::MultiFab & getSlices() const
Definition: MultiLaser.H:126
int m_file_num_iteration
Definition: MultiLaser.H:246
amrex::Geometry m_laser_geom_3D
Definition: MultiLaser.H:235
std::string m_solver_type
Definition: MultiLaser.H:232
amrex::IntVect m_slices_nguards
Definition: MultiLaser.H:231
static constexpr int m_insitu_nrp
Definition: MultiLaser.H:283
amrex::Real m_MG_tolerance_rel
Definition: MultiLaser.H:252
SpectralFieldLoc m_rhs
Definition: MultiLaser.H:273
std::string m_insitu_file_prefix
Definition: MultiLaser.H:296
LaserFFT::VendorFFT m_plan_fwd
Definition: MultiLaser.H:267
amrex::Vector< amrex::Real > m_insitu_sum_rdata
Definition: MultiLaser.H:292
amrex::Vector< amrex::Real > m_insitu_rdata
Definition: MultiLaser.H:290
amrex::MultiFab m_slices
Definition: MultiLaser.H:251
void GetEnvelopeFromFile(const amrex::Geometry &gm)
Read in a laser from an openPMD file.
Definition: MultiLaser.cpp:277
void AdvanceSliceMG(const Fields &fields, amrex::Real dt, int step)
Definition: MultiLaser.cpp:552
SpectralFieldLoc m_sol
Definition: MultiLaser.H:271
void InitSliceEnvelope(const int islice, const int comp)
Initialize on slice of the 3D laser field.
Definition: MultiLaser.cpp:201
bool m_MG_average_rhs
Definition: MultiLaser.H:256
void ShiftLaserSlices()
Shift 2D slices in zeta.
Definition: MultiLaser.cpp:503
std::string m_input_file_path
Definition: MultiLaser.H:242
amrex::Box m_slice_box
Definition: MultiLaser.H:234
Definition: MultiLaser.H:34
const auto VendorExecute
Definition: MultiLaser.H:63
fftw_plan VendorFFT
Definition: MultiLaser.H:60
const auto VendorDestroy
Definition: MultiLaser.H:64
fftw_complex FFTWComplex
Definition: MultiLaser.H:61
const auto VendorCreate
Definition: MultiLaser.H:62
describes which slice with respect to the currently calculated is used
Definition: MultiLaser.H:70
slice
Definition: MultiLaser.H:73
@ n00j00_i
Definition: MultiLaser.H:81
@ nm1jp1_r
Definition: MultiLaser.H:76
@ n00jp1_r
Definition: MultiLaser.H:82
@ nm1jp2_r
Definition: MultiLaser.H:78
@ np1jp1_r
Definition: MultiLaser.H:88
@ np1j00_i
Definition: MultiLaser.H:87
@ np1j00_r
Definition: MultiLaser.H:86
@ np1jp2_r
Definition: MultiLaser.H:90
@ n00jp2_i
Definition: MultiLaser.H:85
@ nm1jp1_i
Definition: MultiLaser.H:77
@ np1jp2_i
Definition: MultiLaser.H:91
@ n00jp1_i
Definition: MultiLaser.H:83
@ np1jp1_i
Definition: MultiLaser.H:89
@ nm1j00_i
Definition: MultiLaser.H:75
@ nm1jp2_i
Definition: MultiLaser.H:79
@ n00jp2_r
Definition: MultiLaser.H:84
@ nm1j00_r
Definition: MultiLaser.H:74
@ n00j00_r
Definition: MultiLaser.H:80
@ N
Definition: MultiLaser.H:92