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
+ }
0 commit comments