-
Notifications
You must be signed in to change notification settings - Fork 20
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Draft] Transport and Covariance Matrices #714
base: development
Are you sure you want to change the base?
Changes from all commits
4e2a733
5d09112
7d95ca5
65c9bd0
2ad47d2
c2fe2be
a5df0a3
b2f158c
0044f78
cd4c989
a9888ce
817cc51
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -9,6 +9,7 @@ | |
*/ | ||
#include "ImpactX.H" | ||
#include "particles/elements/All.H" | ||
#include "particles/elements/mixin/lineartransport.H" | ||
|
||
#include <AMReX.H> | ||
#include <AMReX_BLProfiler.H> | ||
|
@@ -436,6 +437,23 @@ namespace detail | |
read_element(sub_element_name, m_lattice, nslice_default, mapsteps_default); | ||
} | ||
} | ||
} else if (element_type == "linear_map") | ||
{ | ||
auto a = detail::query_alignment(pp_element); | ||
|
||
elements::LinearTransport::Map6x6 transport_map; | ||
for (int i=1; i<=6; ++i) { | ||
for (int j=1; j<=6; ++j) { | ||
Comment on lines
+445
to
+446
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Memo to Axel: default is F-order of |
||
amrex::ParticleReal R_ij = (i == j) ? 1.0 : 0.0; | ||
std::string name = "R" + std::to_string(i) + std::to_string(j); | ||
pp_element.queryAdd(name.c_str(), R_ij); | ||
|
||
transport_map(i, j) = R_ij; | ||
} | ||
} | ||
std::cout << "Caution: A user-provided linear map is used. Transport may not be symplectic." << "\n"; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Here is a good location for the warning manager, using a |
||
|
||
m_lattice.emplace_back(LinearMap(transport_map, a["dx"], a["dy"], a["rotation_degree"]) ); | ||
} else { | ||
amrex::Abort("Unknown type for lattice element " + element_name + ": " + element_type); | ||
} | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
/* Copyright 2022-2024 The Regents of the University of California, through Lawrence | ||
* Berkeley National Laboratory (subject to receipt of any required | ||
* approvals from the U.S. Dept. of Energy). All rights reserved. | ||
* | ||
* This file is part of ImpactX. | ||
* | ||
* Authors: Chad Mitchell, Axel Huebl | ||
* License: BSD-3-Clause-LBNL | ||
*/ | ||
#ifndef IMPACTX_DISTRIBUTION_COVARIANCE_MATRIX_H | ||
#define IMPACTX_DISTRIBUTION_COVARIANCE_MATRIX_H | ||
|
||
#include <AMReX_REAL.H> | ||
#include <AMReX_SmallMatrix.H> | ||
|
||
|
||
namespace impactx | ||
{ | ||
/** this is a 6x6 matrix */ | ||
using CovarianceMatrix = amrex::SmallMatrix<amrex::ParticleReal, 6, 6, amrex::Order::F, 1>; | ||
|
||
} // namespace impactx::distribution | ||
|
||
#endif // IMPACTX_DISTRIBUTION_COVARIANCE_MATRIX_H |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,135 @@ | ||||||||||||||||||||
/* Copyright 2022-2024 The Regents of the University of California, through Lawrence | ||||||||||||||||||||
* Berkeley National Laboratory (subject to receipt of any required | ||||||||||||||||||||
* approvals from the U.S. Dept. of Energy). All rights reserved. | ||||||||||||||||||||
* | ||||||||||||||||||||
* This file is part of ImpactX. | ||||||||||||||||||||
* | ||||||||||||||||||||
* Authors: Chad Mitchell, Axel Huebl | ||||||||||||||||||||
* License: BSD-3-Clause-LBNL | ||||||||||||||||||||
*/ | ||||||||||||||||||||
#ifndef IMPACTX_ELEMENT_LINEAR_MAP_H | ||||||||||||||||||||
#define IMPACTX_ELEMENT_LINEAR_MAP_H | ||||||||||||||||||||
|
||||||||||||||||||||
#include "particles/ImpactXParticleContainer.H" | ||||||||||||||||||||
#include "mixin/alignment.H" | ||||||||||||||||||||
#include "mixin/beamoptic.H" | ||||||||||||||||||||
#include "mixin/lineartransport.H" | ||||||||||||||||||||
#include "mixin/thin.H" | ||||||||||||||||||||
#include "mixin/nofinalize.H" | ||||||||||||||||||||
|
||||||||||||||||||||
#include <AMReX_Extension.H> | ||||||||||||||||||||
#include <AMReX_REAL.H> | ||||||||||||||||||||
|
||||||||||||||||||||
#include <cmath> | ||||||||||||||||||||
|
||||||||||||||||||||
|
||||||||||||||||||||
namespace impactx | ||||||||||||||||||||
{ | ||||||||||||||||||||
struct LinearMap | ||||||||||||||||||||
: public elements::BeamOptic<LinearMap>, | ||||||||||||||||||||
public elements::Thin, | ||||||||||||||||||||
public elements::Alignment, | ||||||||||||||||||||
public elements::LinearTransport, | ||||||||||||||||||||
public elements::NoFinalize | ||||||||||||||||||||
{ | ||||||||||||||||||||
static constexpr auto type = "LinearMap"; | ||||||||||||||||||||
using PType = ImpactXParticleContainer::ParticleType; | ||||||||||||||||||||
|
||||||||||||||||||||
/** A thin element that applies a user-provided linear transport map R | ||||||||||||||||||||
* to the 6-vector of phase space coordinates (x,px,y,py,t,pt). | ||||||||||||||||||||
* Thus x_final = R(1,1)*x + R(1,2)*px + R(1,3)*y + ..., | ||||||||||||||||||||
* px_final = R(2,1)*x + R(2,2)*px + R(2,3)*y + ..., etc. | ||||||||||||||||||||
* | ||||||||||||||||||||
* @param R user-provided transport map | ||||||||||||||||||||
* @param dx horizontal translation error in m | ||||||||||||||||||||
* @param dy vertical translation error in m | ||||||||||||||||||||
* @param rotation_degree rotation error in the transverse plane [degrees] | ||||||||||||||||||||
*/ | ||||||||||||||||||||
LinearMap ( | ||||||||||||||||||||
LinearTransport::Map6x6 const & R, | ||||||||||||||||||||
amrex::ParticleReal dx = 0, | ||||||||||||||||||||
amrex::ParticleReal dy = 0, | ||||||||||||||||||||
amrex::ParticleReal rotation_degree = 0 | ||||||||||||||||||||
) | ||||||||||||||||||||
: Alignment(dx, dy, rotation_degree) | ||||||||||||||||||||
{ | ||||||||||||||||||||
for (int i=1; i<=6; ++i) { | ||||||||||||||||||||
for (int j = 1; j <= 6; ++j) { | ||||||||||||||||||||
m_transport_map(i, j) = R(i, j); | ||||||||||||||||||||
} | ||||||||||||||||||||
} | ||||||||||||||||||||
Comment on lines
+56
to
+60
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||
} | ||||||||||||||||||||
|
||||||||||||||||||||
/** Push all particles */ | ||||||||||||||||||||
using BeamOptic::operator(); | ||||||||||||||||||||
|
||||||||||||||||||||
/** This is a LinearMap functor, so that a variable of this type can be used like a | ||||||||||||||||||||
* LinearMap function. | ||||||||||||||||||||
* | ||||||||||||||||||||
* @param x particle position in x | ||||||||||||||||||||
* @param y particle position in y | ||||||||||||||||||||
* @param t particle position in t (unused) | ||||||||||||||||||||
* @param px particle momentum in x | ||||||||||||||||||||
* @param py particle momentum in y | ||||||||||||||||||||
* @param pt particle momentum in t (unused) | ||||||||||||||||||||
* @param idcpu particle global index | ||||||||||||||||||||
* @param refpart reference particle (unused) | ||||||||||||||||||||
*/ | ||||||||||||||||||||
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE | ||||||||||||||||||||
void operator() ( | ||||||||||||||||||||
amrex::ParticleReal & AMREX_RESTRICT x, | ||||||||||||||||||||
amrex::ParticleReal & AMREX_RESTRICT y, | ||||||||||||||||||||
amrex::ParticleReal & AMREX_RESTRICT t, | ||||||||||||||||||||
amrex::ParticleReal & AMREX_RESTRICT px, | ||||||||||||||||||||
amrex::ParticleReal & AMREX_RESTRICT py, | ||||||||||||||||||||
amrex::ParticleReal & AMREX_RESTRICT pt, | ||||||||||||||||||||
[[maybe_unused]] uint64_t & AMREX_RESTRICT idcpu, | ||||||||||||||||||||
[[maybe_unused]] RefPart const & refpart | ||||||||||||||||||||
) const | ||||||||||||||||||||
{ | ||||||||||||||||||||
using namespace amrex::literals; // for _rt and _prt | ||||||||||||||||||||
|
||||||||||||||||||||
// shift due to alignment errors of the element | ||||||||||||||||||||
shift_in(x, y, px, py); | ||||||||||||||||||||
|
||||||||||||||||||||
// input and output phase space vectors | ||||||||||||||||||||
amrex::Array1D<amrex::ParticleReal,1,6> vectorin; | ||||||||||||||||||||
amrex::Array1D<amrex::ParticleReal,1,6> vectorout; | ||||||||||||||||||||
Comment on lines
+96
to
+97
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can use |
||||||||||||||||||||
vectorin(1) = x; | ||||||||||||||||||||
vectorin(2) = px; | ||||||||||||||||||||
vectorin(3) = y; | ||||||||||||||||||||
vectorin(4) = py; | ||||||||||||||||||||
vectorin(5) = t; | ||||||||||||||||||||
vectorin(6) = pt; | ||||||||||||||||||||
|
||||||||||||||||||||
for (int i=1; i<=6; ++i) { | ||||||||||||||||||||
|
||||||||||||||||||||
vectorout(i) = 0.0; | ||||||||||||||||||||
for (int j = 1; j <= 6; ++j) { | ||||||||||||||||||||
vectorout(i) += m_transport_map(i, j) * vectorin(j); | ||||||||||||||||||||
} | ||||||||||||||||||||
|
||||||||||||||||||||
} | ||||||||||||||||||||
Comment on lines
+105
to
+112
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||
|
||||||||||||||||||||
// assign updated values | ||||||||||||||||||||
x = vectorout(1); | ||||||||||||||||||||
px = vectorout(2); | ||||||||||||||||||||
y = vectorout(3); | ||||||||||||||||||||
py = vectorout(4); | ||||||||||||||||||||
t = vectorout(5); | ||||||||||||||||||||
pt = vectorout(6); | ||||||||||||||||||||
|
||||||||||||||||||||
// undo shift due to alignment errors of the element | ||||||||||||||||||||
shift_out(x, y, px, py); | ||||||||||||||||||||
} | ||||||||||||||||||||
|
||||||||||||||||||||
/** This pushes the reference particle. */ | ||||||||||||||||||||
using Thin::operator(); | ||||||||||||||||||||
|
||||||||||||||||||||
LinearTransport::Map6x6 m_transport_map; // 6x6 transport map | ||||||||||||||||||||
|
||||||||||||||||||||
}; | ||||||||||||||||||||
|
||||||||||||||||||||
} // namespace impactx | ||||||||||||||||||||
|
||||||||||||||||||||
#endif // IMPACTX_ELEMENT_LINEAR_MAP_H |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Memo to Axel: default is F-order of
amrex::Array2D
. Double check loop indices are effective.