Skip to content

Commit

Permalink
Add conditional emittance output columns.
Browse files Browse the repository at this point in the history
  • Loading branch information
cemitch99 committed Oct 5, 2024
1 parent b922bb4 commit 41bee2b
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 11 deletions.
56 changes: 54 additions & 2 deletions src/particles/diagnostics/DiagnosticOutput.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,14 @@ namespace impactx::diagnostics
if (otype == OutputType::PrintRefParticle) {
file_handler << "step s beta gamma beta_gamma x y z t px py pz pt\n";
} else if (otype == OutputType::PrintReducedBeamCharacteristics) {
file_handler << "step" << " " << "s" << " "

// determine whether to output eigenemittances
amrex::ParmParse pp_diag("diag");
bool compute_eigenemittances = false;
pp_diag.queryAdd("eigenemittances", compute_eigenemittances);

if (compute_eigenemittances) {
file_handler << "step" << " " << "s" << " "
<< "x_mean" << " " << "x_min" << " " << "x_max" << " "
<< "y_mean" << " " << "y_min" << " " << "y_max" << " "
<< "t_mean" << " " << "t_min" << " " << "t_max" << " "
Expand All @@ -57,9 +64,29 @@ namespace impactx::diagnostics
<< "beta_x" << " " << "beta_y" << " " << "beta_t" << " "
<< "dispersion_x" << " " << "dispersion_px" << " "
<< "dispersion_y" << " " << "dispersion_py" << " "
<< "emittance_xn" << " " << "emittance_yn" << " " << "emittance_tn" << " "
<< "emittance_1" << " " << "emittance_2" << " " << "emittance_3" << " "
<< "charge_C" << " "
<< "\n";
} else {
file_handler << "step" << " " << "s" << " "
<< "x_mean" << " " << "x_min" << " " << "x_max" << " "
<< "y_mean" << " " << "y_min" << " " << "y_max" << " "
<< "t_mean" << " " << "t_min" << " " << "t_max" << " "
<< "sig_x" << " " << "sig_y" << " " << "sig_t" << " "
<< "px_mean" << " " << "px_min" << " " << "px_max" << " "
<< "py_mean" << " " << "py_min" << " " << "py_max" << " "
<< "pt_mean" << " " << "pt_min" << " " << "pt_max" << " "
<< "sig_px" << " " << "sig_py" << " " << "sig_pt" << " "
<< "emittance_x" << " " << "emittance_y" << " " << "emittance_t" << " "
<< "alpha_x" << " " << "alpha_y" << " " << "alpha_t" << " "
<< "beta_x" << " " << "beta_y" << " " << "beta_t" << " "
<< "dispersion_x" << " " << "dispersion_px" << " "
<< "dispersion_y" << " " << "dispersion_py" << " "
<< "emittance_xn" << " " << "emittance_yn" << " " << "emittance_tn" << " "
<< "charge_C" << " "
<< "\n";
}
}
}

Expand Down Expand Up @@ -93,7 +120,13 @@ namespace impactx::diagnostics

amrex::ParticleReal const s = pc.GetRefParticle().s;

file_handler << step << " " << s << " "
// determine whether to output eigenemittances
amrex::ParmParse pp_diag("diag");
bool compute_eigenemittances = false;
pp_diag.queryAdd("eigenemittances", compute_eigenemittances);

if (compute_eigenemittances) {
file_handler << step << " " << s << " "
<< rbc.at("x_mean") << " " << rbc.at("x_min") << " " << rbc.at("x_max") << " "
<< rbc.at("y_mean") << " " << rbc.at("y_min") << " " << rbc.at("y_max") << " "
<< rbc.at("t_mean") << " " << rbc.at("t_min") << " " << rbc.at("t_max") << " "
Expand All @@ -107,8 +140,27 @@ namespace impactx::diagnostics
<< rbc.at("beta_x") << " " << rbc.at("beta_y") << " " << rbc.at("beta_t") << " "
<< rbc.at("dispersion_x") << " " << rbc.at("dispersion_px") << " "
<< rbc.at("dispersion_y") << " " << rbc.at("dispersion_py") << " "
<< rbc.at("emittance_xn") << " " << rbc.at("emittance_yn") << " " << rbc.at("emittance_tn") << " "
<< rbc.at("emittance_1") << " " << rbc.at("emittance_2") << " " << rbc.at("emittance_3") << " "
<< rbc.at("charge_C") << "\n";
} else {
file_handler << step << " " << s << " "
<< rbc.at("x_mean") << " " << rbc.at("x_min") << " " << rbc.at("x_max") << " "
<< rbc.at("y_mean") << " " << rbc.at("y_min") << " " << rbc.at("y_max") << " "
<< rbc.at("t_mean") << " " << rbc.at("t_min") << " " << rbc.at("t_max") << " "
<< rbc.at("sig_x") << " " << rbc.at("sig_y") << " " << rbc.at("sig_t") << " "
<< rbc.at("px_mean") << " " << rbc.at("px_min") << " " << rbc.at("px_max") << " "
<< rbc.at("py_mean") << " " << rbc.at("py_min") << " " << rbc.at("py_max") << " "
<< rbc.at("pt_mean") << " " << rbc.at("pt_min") << " " << rbc.at("pt_max") << " "
<< rbc.at("sig_px") << " " << rbc.at("sig_py") << " " << rbc.at("sig_pt") << " "
<< rbc.at("emittance_x") << " " << rbc.at("emittance_y") << " " << rbc.at("emittance_t") << " "
<< rbc.at("alpha_x") << " " << rbc.at("alpha_y") << " " << rbc.at("alpha_t") << " "
<< rbc.at("beta_x") << " " << rbc.at("beta_y") << " " << rbc.at("beta_t") << " "
<< rbc.at("dispersion_x") << " " << rbc.at("dispersion_px") << " "
<< rbc.at("dispersion_y") << " " << rbc.at("dispersion_py") << " "
<< rbc.at("emittance_xn") << " " << rbc.at("emittance_yn") << " " << rbc.at("emittance_tn") << " "
<< rbc.at("charge_C") << "\n";
}
} // if( otype == OutputType::PrintReducedBeamCharacteristics)

// TODO: add as an option to the monitor element
Expand Down
26 changes: 17 additions & 9 deletions src/particles/diagnostics/ReducedBeamCharacteristics.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -305,19 +305,22 @@ namespace impactx::diagnostics
amrex::ParticleReal const alpha_y = - ypy_d / emittance_yd;
amrex::ParticleReal const alpha_t = - tpt / emittance_t;

// Calculate eigenemittances (optional)
amrex::Array2D<amrex::ParticleReal, 1, 6, 1, 6> Sigma;
amrex::ParticleReal emittance_1 = emittance_x * bg;
amrex::ParticleReal emittance_2 = emittance_y * bg;
amrex::ParticleReal emittance_3 = emittance_t * bg;
// Calculate normalized emittances
amrex::ParticleReal emittance_xn = emittance_x * bg;
amrex::ParticleReal emittance_yn = emittance_y * bg;
amrex::ParticleReal emittance_tn = emittance_t * bg;

// Parse the diagnostic parameters
// Determine whether to calculate eigenemittances, and initialize
amrex::ParmParse pp_diag("diag");
bool compute_eigenemittances = false;
pp_diag.queryAdd("eigenemittances", compute_eigenemittances);
amrex::ParticleReal emittance_1 = emittance_xn;
amrex::ParticleReal emittance_2 = emittance_yn;
amrex::ParticleReal emittance_3 = emittance_tn;

if (compute_eigenemittances) {
// Store the covariance matrix in dynamical variables:
amrex::Array2D<amrex::ParticleReal, 1, 6, 1, 6> Sigma;
Sigma(1,1) = x_ms;
Sigma(1,2) = xpx * bg;
Sigma(1,3) = xy;
Expand Down Expand Up @@ -400,9 +403,14 @@ namespace impactx::diagnostics
data["dispersion_y"] = dispersion_y;
data["dispersion_py"] = dispersion_py;
data["charge_C"] = charge;
data["emittance_1"] = emittance_1;
data["emittance_2"] = emittance_2;
data["emittance_3"] = emittance_3;
data["emittance_xn"] = emittance_xn;
data["emittance_yn"] = emittance_yn;
data["emittance_tn"] = emittance_tn;
if (compute_eigenemittances) {
data["emittance_1"] = emittance_1;
data["emittance_2"] = emittance_2;
data["emittance_3"] = emittance_3;
}

return data;
}
Expand Down

0 comments on commit 41bee2b

Please sign in to comment.