XGC1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
diagnostics.hpp
Go to the documentation of this file.
1 #ifndef DIAGNOSTICS_HPP
2 #define DIAGNOSTICS_HPP
3 
4 #include "push_diagnostic.hpp"
5 #include "heat_diagnostics.hpp"
7 #include "tracer_diag.hpp"
8 #include "loop_voltage_diag.hpp"
9 #include "diag_f0_df.hpp"
10 #include "diag_1d.hpp"
11 #include "particle_stream.hpp"
12 #include <mpi.h>
13 
14 /* Contains all the diagnostics */
15 struct Diagnostics{
24 
25  // Make these use Diagnostic class
26  bool diag_3d_on;
28 
30 
32 
35  const Grid<DeviceType>& grid, const VelocityGrid& vgrid, int f_source_period,
36  bool overwrite_existing){
37 
38  nlr.use_namelist("diag_param");
39  int diag_1d_period = nlr.get<int>("diag_1d_period",10);
40  diag_3d_on = nlr.get<bool>("diag_3d_on",true);
41  diag_3d_period = nlr.get<int>("diag_3d_period",diag_1d_period);
42 
43  bool heat_diag_is_on = nlr.get<bool>("diag_heat_on", false);
44 
45  nlr.use_namelist("sml_param");
46  int special = nlr.get<int>("sml_special",0);
47  diag_poincare = (special==4);
48 
49 
50  // Construct each diagnostic
51  if(heat_diag_is_on){
52  heat_diag.init(nlr, magnetic_field, grid, plasma.nspecies);
53  }
55 
56  diag_f0_df.init(nlr, sml, grid, plasma, f_source_period);
57 
58 #ifdef GB2024
59  particle_stream = ParticleStream(nlr, magnetic_field);
60 #endif
61 #ifndef NO_PETSC
62  if (vgrid.pseudo_inv_on){
63  pseudo_inv_diag.init(nlr, f_source_period, "pseudo_inv_diag");
64  }
65  if (sml.current_drive_on){
66  loop_vol_diag.init(nlr, f_source_period,"loop_vol_diag");
67  }
68 #endif
69 #ifdef ESC_PTL
70  tracer_diag.init("tracer_diag");
71 #endif
72 
73 
74  diag_1d.init(nlr, grid, magnetic_field, plasma, sml.deltaf);
75 
76  // Open file streams for diagnostics
77  open_streams(overwrite_existing);
78  }
79 
80  void open_streams(bool overwrite_existing){
81  XGC_IO_Mode mode = (overwrite_existing ? XGC_IO_Mode::Write : XGC_IO_Mode::Append);
82  if(heat_diag.is_on){
83  if(heat_diag.mode==1) heat_diag.open_stream("xgc.heatdiag.bp", mode);
84  else heat_diag.open_stream("xgc.heatdiag2.bp", mode);
85  }
86 #ifdef XGCA
87  // XGC1 uses a different file for each step. This is kept for back compatibility, but should be consolidated.
88  if(diag_f0_df.is_on){
89  diag_f0_df.open_stream("xgc.fsourcediag.bp", mode);
90  }
91 #endif
93  pseudo_inv_diag.open_stream("xgc.pseudo_inv.bp", mode);
94  }
95  if(loop_vol_diag.is_on){
96 #ifdef USE_MPI
97  loop_vol_diag.open_stream("xgc.loop_vol.bp", mode, MPI_COMM_SELF);
98 #endif
99  }
100  if(tracer_diag.is_on){
101  tracer_diag.open_stream("xgc.particle_stream.bp", XGC_IO_Mode::Write);
102  }
103  if(diag_1d.is_on){
104  diag_1d.open_stream("xgc.oneddiag.bp", mode);
105  }
106  }
107 
109 #ifdef XGCA
111 #endif
117  }
118 };
119 
120 #endif
int diag_3d_period
How many steps between diag_3d output.
Definition: diagnostics.hpp:27
T get(const string &param, const T default_val, int val_ind=0)
Definition: NamelistReader.hpp:373
Definition: diag_f0_df.hpp:9
bool pseudo_inv_on
whether pseudo-inverse interpolation is used in velocity space
Definition: velocity_grid.hpp:24
TracerDiagnostics tracer_diag
Definition: diagnostics.hpp:19
Definition: velocity_grid.hpp:8
Definition: diagnostics.hpp:15
Definition: sml.hpp:8
void init(NLReader::NamelistReader &nlr, const MagneticField< Device > &magnetic_field, const Grid< Device > &grid, int nspecies)
subroutine plasma(grid, itr, p, dene_out, deni_out, Te_out, Ti_out, Vparai_out)
Calculate the plasma density, temperature, and parallel velocity for a point in triangle itr using pl...
Definition: neutral_totalf.F90:1230
Definition: NamelistReader.hpp:193
Definition: magnetic_field.hpp:12
Diagnostics()
Definition: diagnostics.hpp:31
LoopVolDiagnostics loop_vol_diag
Definition: diagnostics.hpp:20
PseudoInvDiagnostics pseudo_inv_diag
Definition: diagnostics.hpp:18
void init(NLReader::NamelistReader &nlr, const Simulation< DeviceType > &sml, const Grid< DeviceType > &grid, const Plasma &plasma, int f_source_period)
Definition: diag_f0_df.hpp:45
Diag1D diag_1d
Definition: diagnostics.hpp:23
bool is_on
Definition: diagnostic.hpp:20
PushDiagnostic< DeviceType > push_diag
Definition: diagnostics.hpp:16
int nthreads
Number of OMP threads on the host.
Definition: sml.hpp:68
Definition: diag_1d.hpp:9
Diagnostics(NLReader::NamelistReader &nlr, const Simulation< DeviceType > &sml, const MagneticField< DeviceType > &magnetic_field, const Plasma &plasma, const Grid< DeviceType > &grid, const VelocityGrid &vgrid, int f_source_period, bool overwrite_existing)
Definition: diagnostics.hpp:33
void close_stream()
Definition: diagnostic.hpp:90
void init(NLReader::NamelistReader &nlr, const Grid< DeviceType > &grid, const MagneticField< DeviceType > &magnetic_field, const Plasma &plasma, bool allocate_df_diagnostic)
Definition: diag_1d.cpp:182
void use_namelist(const string &namelist)
Definition: NamelistReader.hpp:355
Definition: pseudo_inverse_diag.hpp:26
bool deltaf
Whether some species is deltaf.
Definition: sml.hpp:60
void open_stream(const std::string &filename, const XGC_IO_Mode &mode)
Definition: diagnostic.hpp:66
int npsi_surf2
Definition: grid.hpp:197
Definition: tracer_diag.hpp:12
int nspecies
Number of species including electrons.
Definition: plasma.hpp:91
int n_nonadiabatic_species
Number of nonadiabatic species.
Definition: plasma.hpp:92
XGC_IO_Mode
Definition: xgc_io.hpp:17
void init(NLReader::NamelistReader &nlr, int f_source_period, const std::string &name)
Definition: loop_voltage_diag.hpp:26
void open_streams(bool overwrite_existing)
Definition: diagnostics.hpp:80
Definition: magnetic_field.F90:1
void close_streams()
Definition: diagnostics.hpp:108
bool diag_poincare
Whether to do poincare output.
Definition: diagnostics.hpp:29
HeatDiagnostics< DeviceType > heat_diag
Definition: diagnostics.hpp:17
bool current_drive_on
Definition: sml.hpp:191
Definition: plasma.hpp:14
ParticleStream particle_stream
Definition: diagnostics.hpp:21
Definition: particle_stream.hpp:6
bool diag_3d_on
Whether diag_3d is output.
Definition: diagnostics.hpp:26
void init(NLReader::NamelistReader &nlr, int f_source_period, const std::string &name)
Definition: pseudo_inverse_diag.hpp:32
Definition: loop_voltage_diag.hpp:20
DiagF0DF diag_f0_df
Definition: diagnostics.hpp:22
int mode
Using mode 1 or mode 2.
Definition: heat_diagnostics.hpp:32
void init(const std::string &name)
Definition: tracer_diag.hpp:18