REMORA
Energy Research and Forecasting: An Atmospheric Modeling Code
ParticleData.H
Go to the documentation of this file.
1 #ifndef _PARTICLE_DATA_H_
2 #define _PARTICLE_DATA_H_
3 
4 #include <string>
5 #include <iostream>
6 
7 #include <IndexDefines.H>
8 #include <AMReX_Particles.H>
9 #include <AMReX_ParmParse.H>
10 #include <AMReX_Print.H>
11 #include <AMReX_Gpu.H>
12 
13 #include <TracerPC.H>
14 
15 /**
16  * Container holding many of the particle-related data and options
17  */
18 
19 struct ParticleData {
20  public:
22  {
23  amrex::ParmParse pp(pp_prefix);
24 
26  pp.query("use_tracer_particles", use_tracer_particles);
27  }
28 
29  void init_particles(amrex::ParGDBBase* a_gdb, const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& z_phys_nd)
30 
31  {
32  // Initialize tracer particles
34  tracer_particles = std::make_unique<TracerPC>(a_gdb);
35  tracer_particles->InitParticles(*z_phys_nd[0]);
36  amrex::Print() << "Initialized " << tracer_particles->TotalNumberOfParticles() << " tracer particles." << std::endl;
37  }
38  }
39 
40  void Checkpoint(const std::string& filename)
41  {
43  tracer_particles->Checkpoint(filename, "tracer_particles", true, tracer_particle_varnames);
44  }
45  }
46 
47  void Restart(amrex::ParGDBBase* a_gdb, std::string& restart_file)
48  {
50  // tracer_particles = std::make_unique<TracerPC>(Geom(0), dmap[0], grids[0]);
51  tracer_particles = std::make_unique<TracerPC>(a_gdb);
52  std::string tracer_file("tracer_particles");
53  tracer_particles->Restart(restart_file, tracer_file);
54  }
55  }
56 
57  void advance_particles(int lev, amrex::Real dt_lev,
58  amrex::MultiFab* xvel, amrex::MultiFab* yvel, amrex::MultiFab* zvel,
59  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& z_phys_nd)
60  {
61  // Update tracer particles
63  amrex::Array<amrex::MultiFab const*, AMREX_SPACEDIM> mac_vel = {xvel, yvel, zvel};
64  bool use_terrain = (z_phys_nd[lev] != nullptr);
65  if (use_terrain) {
66  tracer_particles->AdvectWithUmac(mac_vel, lev, dt_lev, use_terrain, *z_phys_nd[lev]);
67  } else {
68  amrex::MultiFab dummy;
69  tracer_particles->AdvectWithUmac(mac_vel, lev, dt_lev, use_terrain, dummy);
70  }
71  }
72  }
73 
74  void Redistribute()
75  {
77  tracer_particles->Redistribute();
78  }
79  }
80 
81  std::string pp_prefix {"remora"};
82 
84  std::unique_ptr<TracerPC> tracer_particles;
85  amrex::Vector<std::string> tracer_particle_varnames = {AMREX_D_DECL("old_x", "old_y", "old_z")};
86 };
87 #endif
Definition: ParticleData.H:19
void Restart(amrex::ParGDBBase *a_gdb, std::string &restart_file)
Definition: ParticleData.H:47
void Redistribute()
Definition: ParticleData.H:74
void advance_particles(int lev, amrex::Real dt_lev, amrex::MultiFab *xvel, amrex::MultiFab *yvel, amrex::MultiFab *zvel, const amrex::Vector< std::unique_ptr< amrex::MultiFab >> &z_phys_nd)
Definition: ParticleData.H:57
void Checkpoint(const std::string &filename)
Definition: ParticleData.H:40
amrex::Vector< std::string > tracer_particle_varnames
Definition: ParticleData.H:85
std::string pp_prefix
Definition: ParticleData.H:81
void init_particles(amrex::ParGDBBase *a_gdb, const amrex::Vector< std::unique_ptr< amrex::MultiFab >> &z_phys_nd)
Definition: ParticleData.H:29
void init_particle_params()
Definition: ParticleData.H:21
int use_tracer_particles
Definition: ParticleData.H:83
std::unique_ptr< TracerPC > tracer_particles
Definition: ParticleData.H:84