Open TeresiaOlsson opened 4 years ago
I think ringpara computes correctly the radiation integrals, at least without wigglers. But I agree, we can write a function just for the radiation integrals and then use it everywhere they have to be computed. What functions did you use for the radiation integrals?
Hi @TeresiaOlsson,
Have you taken a look at #121 yet, it might address some of the problems you mention? It incorporates some work I did last year to try and get the updated (and hopefully numerically correct) GWigSymplecticPass
and GWigSymplecticRadPass
methods working with AT2.0 and pyAT. The last I heard the changes had been passed to the Diamond AP group for testing, but I am unsure if they concluded whether the functions were accurate or not; @willrogers may have a better idea of their status.
Hi,
I'm in the Diamond AP group and we are testing it now. So far it seems like the passmethods are working correctly, but other functions need updating to output correct numbers when including them in the lattice.
We tried atsummary, atx and ringpara and none seem to include the effect of the wigglers on the global parameters. The cause seems to be that the calculation of the radiation integrals doesn't include it. There are also other functions like atsetRFCavity, atenergy etc that needs updating to work correctly with wigglers.
Then we will take a look at it and propose changes.
dear @TeresiaOlsson
Can you send us an full example for helping us to debug ?
Laurent.
I am glad to hear that it is being worked on and that the pass methods are correct.
I definitely agree that all the functions should be consistent and centralising the calculation of the radiation integrals would be sensible.
I am not surprised that atsummary
, atx
, and the other functions do not provide the correct numbers as they were not updated for wigglers. I am, however, concerned that ringpara
doesn't function correctly, as it was updated to use RadIntegrals.m
to calculate the added effects of the wigglers on the radiation integrals.
Could be that I'm wrong and ringpara is working better than the other functions. I'll have a look at RadIntegrals.m and see if that could be used to solve the the problems with the other functions.
We will prepare an example.
Hi guys, I have prepared an example with one ID in a Diamond-II lattice. It's a SCW working at 4.2T so the effect should be quite evident, I am trying to upload the *.m but does not seem to support the type. How can I share it with you?
Marco
I do not knwo why you cannot download the file. You can email me directly nadolski@synchrotron-soleil.fr
@marlibgin, for future reference, you should be able to attach the file here if you change the extension to .txt
by renaming the file.
@marlibgin, for future reference, you should be able to attach the file here if you change the extension to
.txt
by renaming the file. Hi @T-Nicholls , yes ... I thought it after, but wasn't sure about it, thanks for clarifying.
Marco
I'm sorry to see that at the moment no function in AT computes properly the radiation integrals.
First, atx
(based on ohmienvelope
) cannot be compared with the other functions: ohmienvelope
neither computes nor uses any radiation integral. It computes equilibrium emittances and damping times. This has advantages:
And a drawback:
findmpoleraddiffmatrix
must be modified.On the other side, atsummary
and ringpara
compute radiation integrals. These are based on beta and dispersion functions, so keep in mind that this needs:
There is no check for these conditions, so you have to be careful ! I know that atlinopt
gives numbers with cavities and radiation, but you should not rely on those.
In addition, both functions (including the modified version of ringpara
in #121) are imprecise because the radiation from dipoles is computed by splitting the dipole in slices instead of using the analytical integral (see the python version). Depending on the way you describe the bending magnets (explicitly splitted or not), you get different results.
So I agree with the idea of factorising the computation of radiation integrals in a single function, but using the analytical integral of I5 in dipoles. And for a more general computation, one might look at the computation of the diffusion matrix to allow wigglers in ohmienvelope
.
@lfarv Do I understand you correctly that the radiation integrals are calculated in a better way in pyAT? It was my feeling that it might be the case, but I wasn't sure.
I also think it's a good idea to make a function that calculates the analytic integral. Not at least because it's a very good tool for quickly benchmarking what happens when you put in IDs against other codes such as Elegant. However, eventually we would also like to do collective effects simulations including the effects of the IDs and that requires atfastring.
Would that require the changes you mention to the diffusion matrix?
@TeresiaOlsson: Yes, pyAT is (slightly) better since the numerical integration in the dipoles is replaced by the analytical integration. But IDs are not yet included. And at the moment it suffers from bug #164 appearing for non-zero closed orbit (corrected soon).
For integration in wigglers, I am not aware of any analytical integration, so we have to use the numerical integration as done in RadIntegrals.m
(I did not check it yet). Both in Matlab and Python!
On the other hand, atfastring
is based on the same formalism as ohmienvelope
: it does not compute or use radiation integrals. So you are right, taking wigglers into account needs modifying findmpoleraddiffmatrix
. Or more exactly, writing a new "findwigglerraddiffmatrix.c
" function.
Hello @lfarv, I think there is a bug in DipoleRadiation.m. The function looks for the field K of the dipoles, but K is not a mandatory field. Now ringpara fails with the ESRF lattice, because the K value is not found in the dipoles. The old ringpara was looking at both K and polynomB(2), if I remember well, and then it was giving a warning in case the two were different.
The calculation of synchrotron radiation integrals doesn't seem to be done consistently in all functions resulting in different output depending on which function you use. Especially output like energy loss etc is no longer correct when including IDs using the GWigSymplecticRadPass function.
I suggest to implement a function that calculates the radiation integrals correctly and then call that function from all other functions that use the radiation integrals.