From 77e7d0e489721e623a887324c3409e5318fe505f Mon Sep 17 00:00:00 2001 From: Lee Carver Date: Tue, 14 Jan 2025 11:06:54 +0100 Subject: [PATCH 1/6] temp storage --- atintegrators/BeamLoadingCavityPass.c | 17 ++++++++++++----- pyat/at/collective/beam_loading.py | 6 ++++-- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/atintegrators/BeamLoadingCavityPass.c b/atintegrators/BeamLoadingCavityPass.c index ed239a298..c296ef668 100644 --- a/atintegrators/BeamLoadingCavityPass.c +++ b/atintegrators/BeamLoadingCavityPass.c @@ -30,6 +30,7 @@ struct elem double Rshunt; double Beta; double phis; + double detune_angle; double *vbunch; double *vbeam_phasor; double *vbeam; @@ -82,6 +83,7 @@ void BeamLoadingCavityPass(double *r_in,int num_particles,int nbunch, double *vbeamk = Elem->vbeam; double *vcavk = Elem->vcav; double *vgenk = Elem->vgen; + double detune_angle = Elem->detune_angle; double tot_current=0.0; int i; size_t sz = nslice*nbunch*sizeof(double) + num_particles*sizeof(int); @@ -103,7 +105,7 @@ void BeamLoadingCavityPass(double *r_in,int num_particles,int nbunch, psi = vgenk[1]; } /*Track RF cavity is always done. */ - trackRFCavity(r_in,le,vgen/energy,rffreq,harmn,tlag,-psi,nturn,circumference/C0,num_particles); + trackRFCavity(r_in,le,vgen/energy,rffreq,harmn,tlag,-psi-detune_angle,nturn,circumference/C0,num_particles); /*Only allocate memory if current is > 0*/ if(tot_current>0){ @@ -167,7 +169,7 @@ ExportMode struct elem *trackFunction(const atElem *ElemData,struct elem *Elem, double *vbeam_buffer; double *vbunch_buffer; double *z_cuts; - double Energy, Frequency, TimeLag, Length; + double Energy, Frequency, TimeLag, Length, detune_angle; double qfactor,rshunt,beta; double *vbunch; double *vbeam_phasor; @@ -204,7 +206,8 @@ ExportMode struct elem *trackFunction(const atElem *ElemData,struct elem *Elem, /*optional attributes*/ Energy=atGetOptionalDouble(ElemData,"Energy",Param->energy); check_error(); z_cuts=atGetOptionalDoubleArray(ElemData,"ZCuts"); check_error(); - + detune_angle=atGetOptionalDouble(ElemData,"detune_angle", 0); check_error(); + int dimsth[] = {Param->nbunch*nslice*nturns, 4}; atCheckArrayDims(ElemData,"_turnhistory", 2, dimsth); check_error(); int dimsvb[] = {Param->nbunch, 2}; @@ -238,6 +241,7 @@ ExportMode struct elem *trackFunction(const atElem *ElemData,struct elem *Elem, Elem->vgen_buffer = vgen_buffer; Elem->vbeam_buffer = vbeam_buffer; Elem->vbunch_buffer = vbunch_buffer; + Elem->detune_angle = detune_angle; } energy = atEnergy(Param->energy, Elem->Energy); @@ -322,7 +326,8 @@ void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) /*optional attributes*/ Energy=atGetOptionalDouble(ElemData,"Energy",0.0); check_error(); z_cuts=atGetOptionalDoubleArray(ElemData,"ZCuts"); check_error(); - + detune_angle=atGetOptionalDouble(ElemData,"detune_angle"); check_error(); + Elem = (struct elem*)atMalloc(sizeof(struct elem)); Elem->Length=Length; Elem->blmode=blmode; @@ -350,6 +355,7 @@ void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) Elem->vgen_buffer = vgen_buffer; Elem->vbeam_buffer = vbeam_buffer; Elem->vbunch_buffer = vbunch_buffer; + Elem->detune_angle = detune_angle; if (nrhs > 2) atProperties(prhs[2], &Energy, &rest_energy, &charge); if (mxGetM(prhs[1]) != 6) mexErrMsgIdAndTxt("AT:WrongArg","Second argument must be a 6 x N matrix"); @@ -390,9 +396,10 @@ void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) mxSetCell(plhs[0],23,mxCreateString("_buffersize")); if(nlhs>1) /* optional fields */ { - plhs[1] = mxCreateCellMatrix(2,1); + plhs[1] = mxCreateCellMatrix(3,1); mxSetCell(plhs[1],0,mxCreateString("TimeLag")); mxSetCell(plhs[0],1,mxCreateString("ZCuts")); + mxSetCell(plhs[1],2,mxCreateString("detune_angle")); } } else diff --git a/pyat/at/collective/beam_loading.py b/pyat/at/collective/beam_loading.py index d39f24c71..205f3e09c 100644 --- a/pyat/at/collective/beam_loading.py +++ b/pyat/at/collective/beam_loading.py @@ -154,6 +154,8 @@ def __init__(self, family_name: str, length: float, voltage: float, cavitymode (CavityMode): Is cavity ACTIVE (default) or PASSIVE buffersize (int): Size of the history buffer for vbeam, vgen, vbunch (default 0) + detune_angle: Fixed detuning from optimal tuning angle. [rad] + Returns: bl_elem (Element): beam loading element """ @@ -165,9 +167,9 @@ def __init__(self, family_name: str, length: float, voltage: float, raise TypeError('cavitymode has to be an ' + 'instance of CavityMode') zcuts = kwargs.pop('ZCuts', None) - phil = kwargs.pop('phil', 0) energy = ring.energy harmonic_number = numpy.round(frequency*ring.circumference/clight) + self.detune_angle = kwargs.pop('detune_angle', 0) self.Rshunt = rshunt self.Qfactor = qfactor self.NormFact = kwargs.pop('NormFact', 1.0) @@ -199,7 +201,7 @@ def __init__(self, family_name: str, length: float, voltage: float, self._vbeam = numpy.zeros(2) self._vgen = numpy.zeros(2) self._vcav = numpy.array([self.Voltage, - numpy.pi/2-self._phis-phil]) + numpy.pi/2-self._phis-self.detune_angle]) self.clear_history(ring=ring) def is_compatible(self, other): From c2be1bcfcf9b470e985ac82911dff5add8152d54 Mon Sep 17 00:00:00 2001 From: Lee Carver Date: Thu, 6 Mar 2025 11:03:28 +0100 Subject: [PATCH 2/6] Add possibility for detuning away from optimum for active cavities --- atintegrators/BeamLoadingCavityPass.c | 4 ++-- atintegrators/atimplib.c | 4 ++-- pyat/at/collective/beam_loading.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/atintegrators/BeamLoadingCavityPass.c b/atintegrators/BeamLoadingCavityPass.c index c296ef668..f66c36ef4 100644 --- a/atintegrators/BeamLoadingCavityPass.c +++ b/atintegrators/BeamLoadingCavityPass.c @@ -105,7 +105,7 @@ void BeamLoadingCavityPass(double *r_in,int num_particles,int nbunch, psi = vgenk[1]; } /*Track RF cavity is always done. */ - trackRFCavity(r_in,le,vgen/energy,rffreq,harmn,tlag,-psi-detune_angle,nturn,circumference/C0,num_particles); + trackRFCavity(r_in,le,vgen/energy,rffreq,harmn,tlag,-psi+detune_angle,nturn,circumference/C0,num_particles); /*Only allocate memory if current is > 0*/ if(tot_current>0){ @@ -141,7 +141,7 @@ void BeamLoadingCavityPass(double *r_in,int num_particles,int nbunch, } } if(cavitymode==1){ - update_vgen(vbeamk,vcavk,vgenk,phasegain,voltgain); + update_vgen(vbeamk,vcavk,vgenk,phasegain,voltgain,detune_angle); } if(buffersize>0){ write_buffer(vbeamk, vbeam_buffer, 2, buffersize); diff --git a/atintegrators/atimplib.c b/atintegrators/atimplib.c index 44e4fd55b..880bdad71 100644 --- a/atintegrators/atimplib.c +++ b/atintegrators/atimplib.c @@ -451,7 +451,7 @@ static void compute_kicks_phasor(int nslice, int nbunch, int nturns, double *tur }; -static void update_vgen(double *vbeam,double *vcav,double *vgen,double voltgain,double phasegain){ +static void update_vgen(double *vbeam,double *vcav,double *vgen,double voltgain,double phasegain,double detune_angle){ double vbeamr = vbeam[0]*cos(vbeam[1]); double vbeami = vbeam[0]*sin(vbeam[1]); double vcavr = vcav[0]*cos(vcav[1]); @@ -459,7 +459,7 @@ static void update_vgen(double *vbeam,double *vcav,double *vgen,double voltgain, double vgenr = vcavr - vbeamr; double vgeni = vcavi - vbeami; double vga = sqrt(vgenr*vgenr+vgeni*vgeni); - double vgp = atan2(vgeni,vgenr)-vcav[1]; + double vgp = atan2(vgeni,vgenr)-vcav[1]+detune_angle; vgen[0] += (vga-vgen[0])*voltgain; vgen[1] += (vgp-vgen[1])*phasegain; } diff --git a/pyat/at/collective/beam_loading.py b/pyat/at/collective/beam_loading.py index 205f3e09c..c9b53cf66 100644 --- a/pyat/at/collective/beam_loading.py +++ b/pyat/at/collective/beam_loading.py @@ -201,7 +201,7 @@ def __init__(self, family_name: str, length: float, voltage: float, self._vbeam = numpy.zeros(2) self._vgen = numpy.zeros(2) self._vcav = numpy.array([self.Voltage, - numpy.pi/2-self._phis-self.detune_angle]) + numpy.pi/2-self._phis]) self.clear_history(ring=ring) def is_compatible(self, other): From 286b5ffb48c03fdb938cfb6c11f450c88681324a Mon Sep 17 00:00:00 2001 From: Lee Carver Date: Thu, 6 Mar 2025 11:09:32 +0100 Subject: [PATCH 3/6] fix matlab build --- atintegrators/BeamLoadingCavityPass.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/atintegrators/BeamLoadingCavityPass.c b/atintegrators/BeamLoadingCavityPass.c index f66c36ef4..666357bc3 100644 --- a/atintegrators/BeamLoadingCavityPass.c +++ b/atintegrators/BeamLoadingCavityPass.c @@ -326,7 +326,7 @@ void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) /*optional attributes*/ Energy=atGetOptionalDouble(ElemData,"Energy",0.0); check_error(); z_cuts=atGetOptionalDoubleArray(ElemData,"ZCuts"); check_error(); - detune_angle=atGetOptionalDouble(ElemData,"detune_angle"); check_error(); + detune_angle=atGetOptionalDouble(ElemData,"detune_angle",0.0); check_error(); Elem = (struct elem*)atMalloc(sizeof(struct elem)); Elem->Length=Length; From 52a526d7fefb7c6b255b709c85b0fe11ffbcf801 Mon Sep 17 00:00:00 2001 From: Lee Carver Date: Thu, 6 Mar 2025 11:23:11 +0100 Subject: [PATCH 4/6] test matlab --- atintegrators/BeamLoadingCavityPass.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/atintegrators/BeamLoadingCavityPass.c b/atintegrators/BeamLoadingCavityPass.c index 666357bc3..146223da8 100644 --- a/atintegrators/BeamLoadingCavityPass.c +++ b/atintegrators/BeamLoadingCavityPass.c @@ -398,7 +398,7 @@ void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { plhs[1] = mxCreateCellMatrix(3,1); mxSetCell(plhs[1],0,mxCreateString("TimeLag")); - mxSetCell(plhs[0],1,mxCreateString("ZCuts")); + mxSetCell(plhs[1],1,mxCreateString("ZCuts")); mxSetCell(plhs[1],2,mxCreateString("detune_angle")); } } From 06e8587bedc57263c42a888c9895f4275dc51327 Mon Sep 17 00:00:00 2001 From: Lee Carver Date: Thu, 6 Mar 2025 11:34:54 +0100 Subject: [PATCH 5/6] Fix matlab build --- atintegrators/BeamLoadingCavityPass.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/atintegrators/BeamLoadingCavityPass.c b/atintegrators/BeamLoadingCavityPass.c index 146223da8..ed9001e80 100644 --- a/atintegrators/BeamLoadingCavityPass.c +++ b/atintegrators/BeamLoadingCavityPass.c @@ -287,7 +287,7 @@ void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) double normfact, phasegain, voltgain; double *turnhistory; double *z_cuts; - double Energy, Frequency, TimeLag, Length; + double Energy, Frequency, TimeLag, Length, detune_angle; double qfactor,rshunt,beta; double *vbunch; double *vbeam_phasor; From 62a655a62a636b82f5dfc63ae13a3d36ab4e93a9 Mon Sep 17 00:00:00 2001 From: Lee Carver Date: Thu, 6 Mar 2025 12:32:21 +0100 Subject: [PATCH 6/6] fix atmeall --- atmat/atmexall.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/atmat/atmexall.m b/atmat/atmexall.m index eb7b3f6a1..6425dd6d2 100644 --- a/atmat/atmexall.m +++ b/atmat/atmexall.m @@ -149,7 +149,7 @@ function atmexall(varargin) compile(compargs, pmeth); catch errcomp if fail - rethrow(err); + rethrow(errcomp); else fprintf(2, 'Could not compile %s:\n%s\n', pmeth, errcomp.message); end