Skip to content

Commit 56c9052

Browse files
committed
Added ThinMPole pass and fix
1 parent f4fb310 commit 56c9052

File tree

2 files changed

+100
-0
lines changed

2 files changed

+100
-0
lines changed

atgpu/ThinMPolePass.cpp

+73
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
#include "ThinMPolePass.h"
2+
#include "AbstractGPU.h"
3+
#include "PassMethodFactory.h"
4+
5+
using namespace std;
6+
7+
ThinMPolePass::ThinMPolePass() noexcept : StrMPoleSymplectic4Pass() {
8+
BendingAngle = nullptr;
9+
}
10+
11+
ThinMPolePass::~ThinMPolePass() noexcept {
12+
}
13+
14+
void ThinMPolePass::getParameters(AbstractInterface *param, PassMethodInfo *info) {
15+
16+
// Retrieve param from super class
17+
StrMPoleSymplectic4Pass::getParameters(param,info);
18+
19+
elemData.Type = THINMPOLEPASS;
20+
param->getOptional1DArray(&BendingAngle,"BendingAngle",&BendingAngleSize);
21+
22+
}
23+
24+
void ThinMPolePass::generateCode(std::string& code, PassMethodInfo *info,SymplecticIntegrator &integrator) noexcept {
25+
26+
generateEnter(code,info);
27+
generateApertures(code,info);
28+
29+
code.append(" switch(elem->SubType) {\n");
30+
code.append(" case 1:\n");
31+
code.append(" quadthinkick(r6,elem->mpole.PolynomA[0],elem->mpole.PolynomB[0],elem->mpole.K,(AT_FLOAT)1);\n");
32+
code.append(" break;\n");
33+
code.append(" case 2:\n");
34+
code.append(" sextuthinkick(r6,elem->mpole.PolynomA[0],elem->mpole.PolynomB[0],elem->mpole.K,(AT_FLOAT)1);\n");
35+
code.append(" break;\n");
36+
code.append(" case 3:\n");
37+
code.append(" octuthinkick(r6,elem->mpole.PolynomA[0],elem->mpole.PolynomB[0],elem->mpole.K,(AT_FLOAT)1);\n");
38+
code.append(" break;\n");
39+
code.append(" default:\n");
40+
code.append(" strthinkick(r6,elem->mpole.PolynomA,elem->mpole.PolynomB,(AT_FLOAT)1,elem->mpole.MaxOrder);\n");
41+
code.append(" }\n");
42+
43+
code.append(" r6[1] += elem->mpole.thin.bax*r6[4];\n");
44+
code.append(" r6[3] -= elem->mpole.thin.bay*r6[4];\n");
45+
// Path lengthening
46+
code.append(" r6[5] -= elem->mpole.thin.bax*r6[0]-elem->mpole.thin.bay*r6[2];\n");
47+
48+
generateApertures(code,info);
49+
generateExit(code,info);
50+
51+
}
52+
53+
void ThinMPolePass::fillGPUMemory(uint8_t *startAdd,ELEMENT *elemMem,uint64_t *offset) {
54+
55+
// Store an offset from the beginning of gpuRing memory in ELEMENT
56+
// for mapping buffers in GPU memory address space (see Lattice::mapBuffers)
57+
58+
StrMPoleSymplectic4Pass::fillGPUMemory(startAdd,elemMem,offset);
59+
60+
if(BendingAngle) {
61+
if(BendingAngleSize>=1) elemData.mpole.thin.bax = BendingAngle[0];
62+
if(BendingAngleSize>=2) elemData.mpole.thin.bay = BendingAngle[1];
63+
}
64+
65+
// Update modified field in buffer
66+
elemMem->mpole.thin.bax = elemData.mpole.thin.bax;
67+
elemMem->mpole.thin.bay = elemData.mpole.thin.bay;
68+
69+
}
70+
71+
void ThinMPolePass::generateUtilsFunction(std::string& code, PassMethodInfo *info) noexcept {
72+
73+
}

atgpu/ThinMPolePass.h

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#ifndef AT_GPU_THINMPOLEPASS_H
2+
#define AT_GPU_THINMPOLEPASS_H
3+
4+
#include "StrMPoleSymplectic4Pass.h"
5+
6+
class ThinMPolePass: public StrMPoleSymplectic4Pass {
7+
8+
public:
9+
// Construct a thin multipole pass (single kick)
10+
explicit ThinMPolePass() noexcept;
11+
~ThinMPolePass() noexcept override;
12+
13+
// Retrieve parameters from upper layer (Python, Matlab)
14+
void getParameters(AbstractInterface *param, PassMethodInfo *info) override;
15+
void fillGPUMemory(uint8_t *startAdd,ELEMENT *elemMem,uint64_t *offset) override;
16+
17+
// Generic code generation
18+
static void generateCode(std::string& code, PassMethodInfo *info,SymplecticIntegrator &integrator) noexcept;
19+
static void generateUtilsFunction(std::string& code, PassMethodInfo *info) noexcept;
20+
21+
protected:
22+
AT_FLOAT *BendingAngle; // BendingAngle
23+
int BendingAngleSize; // 1-> BAx 2-> BAx,BAy
24+
25+
};
26+
27+
#endif //AT_GPU_THINMPOLEPASS_H

0 commit comments

Comments
 (0)