diff --git a/atintegrators/BeamLoadingCavityPass.c b/atintegrators/BeamLoadingCavityPass.c index c5029fc16..f3f7f30a9 100644 --- a/atintegrators/BeamLoadingCavityPass.c +++ b/atintegrators/BeamLoadingCavityPass.c @@ -234,11 +234,7 @@ ExportMode struct elem *trackFunction(const atElem *ElemData,struct elem *Elem, feedback_angle_offset=atGetOptionalDouble(ElemData,"feedback_angle_offset", 0.0); check_error(); /* Check energy */ - Energy = atEnergy(Param->energy, Energy); - if (Energy == 0) { - atError("Energy needs to be defined. Check lattice parameters or pass method options.\n"); - check_error(); - } + Energy = atEnergy(Param->energy, Energy); check_error(); int dimsth[] = {Param->nbunch*nslice*nturns, 4}; atCheckArrayDims(ElemData,"_turnhistory", 2, dimsth); check_error(); @@ -279,7 +275,7 @@ ExportMode struct elem *trackFunction(const atElem *ElemData,struct elem *Elem, Elem->ts = ts; Elem->system_harmonic = system_harmonic; } - energy = atEnergy(Param->energy, Elem->Energy); + energy = atEnergy(Param->energy, Elem->Energy); check_error(); if(num_particlesnbunch){ atError("Number of particles has to be greater or equal to the number of bunches."); check_error(); diff --git a/atintegrators/BndMPoleSymplectic4E2RadPass.c b/atintegrators/BndMPoleSymplectic4E2RadPass.c index d446a4330..ad5e1c161 100644 --- a/atintegrators/BndMPoleSymplectic4E2RadPass.c +++ b/atintegrators/BndMPoleSymplectic4E2RadPass.c @@ -233,11 +233,7 @@ ExportMode struct elem *trackFunction(const atElem *ElemData,struct elem *Elem, KickAngle=atGetOptionalDoubleArray(ElemData,"KickAngle"); check_error(); /* Check energy */ - Energy = atEnergy(Param->energy, Energy); - if (Energy == 0) { - atError("Energy needs to be defined. Check lattice parameters or pass method options.\n"); - check_error(); - } + Energy = atEnergy(Param->energy, Energy); check_error(); Elem = (struct elem*)atMalloc(sizeof(struct elem)); Elem->Length=Length; @@ -265,7 +261,7 @@ ExportMode struct elem *trackFunction(const atElem *ElemData,struct elem *Elem, Elem->KickAngle=KickAngle; } irho = Elem->BendingAngle/Elem->Length; - energy = atEnergy(Param->energy, Elem->Energy); + energy = atEnergy(Param->energy, Elem->Energy); check_error(); BndMPoleSymplectic4E2RadPass(r_in, Elem->Length, irho, Elem->PolynomA, Elem->PolynomB, Elem->MaxOrder, Elem->NumIntSteps, Elem->EntranceAngle, Elem->ExitAngle, diff --git a/atintegrators/BndMPoleSymplectic4QuantPass.c b/atintegrators/BndMPoleSymplectic4QuantPass.c index d94586046..059becdbe 100644 --- a/atintegrators/BndMPoleSymplectic4QuantPass.c +++ b/atintegrators/BndMPoleSymplectic4QuantPass.c @@ -216,11 +216,7 @@ ExportMode struct elem *trackFunction(const atElem *ElemData,struct elem *Elem, KickAngle=atGetOptionalDoubleArray(ElemData,"KickAngle"); check_error(); /* Check energy */ - Energy = atEnergy(Param->energy, Energy); - if (Energy == 0) { - atError("Energy needs to be defined. Check lattice parameters or pass method options.\n"); - check_error(); - } + Energy = atEnergy(Param->energy, Energy); check_error(); Elem = (struct elem*)atMalloc(sizeof(struct elem)); Elem->Length=Length; @@ -252,7 +248,7 @@ ExportMode struct elem *trackFunction(const atElem *ElemData,struct elem *Elem, Elem->KickAngle=KickAngle; } irho = Elem->BendingAngle/Elem->Length; - energy = atEnergy(Param->energy, Elem->Energy); + energy = atEnergy(Param->energy, Elem->Energy); check_error(); BndMPoleSymplectic4QuantPass(r_in, Elem->Length, irho, Elem->PolynomA, Elem->PolynomB, Elem->MaxOrder, Elem->NumIntSteps, Elem->EntranceAngle, Elem->ExitAngle, diff --git a/atintegrators/BndMPoleSymplectic4RadPass.c b/atintegrators/BndMPoleSymplectic4RadPass.c index 7d6042cbb..897906ff9 100644 --- a/atintegrators/BndMPoleSymplectic4RadPass.c +++ b/atintegrators/BndMPoleSymplectic4RadPass.c @@ -169,11 +169,7 @@ ExportMode struct elem *trackFunction(const atElem *ElemData,struct elem *Elem, KickAngle=atGetOptionalDoubleArray(ElemData,"KickAngle"); check_error(); /* Check energy */ - Energy = atEnergy(Param->energy, Energy); - if (Energy == 0) { - atError("Energy needs to be defined. Check lattice parameters or pass method options.\n"); - check_error(); - } + Energy = atEnergy(Param->energy, Energy); check_error(); Elem = (struct elem*)atMalloc(sizeof(struct elem)); Elem->Length=Length; @@ -205,7 +201,7 @@ ExportMode struct elem *trackFunction(const atElem *ElemData,struct elem *Elem, Elem->KickAngle=KickAngle; } irho = Elem->BendingAngle/Elem->Length; - gamma = atGamma(Param->energy, Elem->Energy, Param->rest_energy); + gamma = atGamma(Param->energy, Elem->Energy, Param->rest_energy); check_error(); BndMPoleSymplectic4RadPass(r_in, Elem->Length, irho, Elem->PolynomA, Elem->PolynomB, Elem->MaxOrder, Elem->NumIntSteps, Elem->EntranceAngle, Elem->ExitAngle, diff --git a/atintegrators/CrabCavityPass.c b/atintegrators/CrabCavityPass.c index d03686752..cde2c1fdc 100644 --- a/atintegrators/CrabCavityPass.c +++ b/atintegrators/CrabCavityPass.c @@ -102,11 +102,7 @@ ExportMode struct elem *trackFunction(const atElem *ElemData,struct elem *Elem, SigVV = atGetOptionalDouble(ElemData,"SigVV",0.0); check_error(); /* Check energy */ - Energy = atEnergy(Param->energy, Energy); - if (Energy == 0) { - atError("Energy needs to be defined. Check lattice parameters or pass method options.\n"); - check_error(); - } + Energy = atEnergy(Param->energy, Energy); check_error(); Elem = (struct elem*)atMalloc(sizeof(struct elem)); Elem->Length=Length; @@ -125,7 +121,7 @@ ExportMode struct elem *trackFunction(const atElem *ElemData,struct elem *Elem, SigPhi=Elem->SigPhi; SigVV=Elem->SigVV; } - energy = atEnergy(Param->energy, Elem->Energy); + energy = atEnergy(Param->energy, Elem->Energy); check_error(); check_error(); nvx = Elem->Vx; nvy = Elem->Vy; diff --git a/atintegrators/ExactMultipoleRadPass.c b/atintegrators/ExactMultipoleRadPass.c index 3beab66f4..e4a2f1a94 100644 --- a/atintegrators/ExactMultipoleRadPass.c +++ b/atintegrators/ExactMultipoleRadPass.c @@ -164,7 +164,7 @@ ExportMode struct elem *trackFunction(const atElem *ElemData, struct elem *Elem, Elem->RApertures = RApertures; Elem->KickAngle = KickAngle; } - gamma = atGamma(Param->energy, Elem->Energy, Param->rest_energy); + gamma = atGamma(Param->energy, Elem->Energy, Param->rest_energy); check_error(); multipole_pass(r_in, Elem->Length, Elem->PolynomA, Elem->PolynomB, Elem->MaxOrder, Elem->NumIntSteps, diff --git a/atintegrators/ExactRectBendRadPass.c b/atintegrators/ExactRectBendRadPass.c index 723e10047..203385f0d 100644 --- a/atintegrators/ExactRectBendRadPass.c +++ b/atintegrators/ExactRectBendRadPass.c @@ -174,11 +174,7 @@ ExportMode struct elem *trackFunction(const atElem *ElemData,struct elem *Elem, } /* Check energy */ - Energy = atEnergy(Param->energy, Energy); - if (Energy == 0) { - atError("Energy needs to be defined. Check lattice parameters or pass method options.\n"); - check_error(); - } + Energy = atEnergy(Param->energy, Energy); check_error(); Elem = (struct elem*)atMalloc(sizeof(struct elem)); Elem->Length=Length; @@ -207,7 +203,7 @@ ExportMode struct elem *trackFunction(const atElem *ElemData,struct elem *Elem, Elem->RApertures=RApertures; Elem->KickAngle=KickAngle; } - gamma = atGamma(Param->energy, Elem->Energy, Param->rest_energy); + gamma = atGamma(Param->energy, Elem->Energy, Param->rest_energy); check_error(); ExactRectangularBendRad(r_in, Elem->Length, Elem->BendingAngle, Elem->PolynomA, Elem->PolynomB, diff --git a/atintegrators/ExactRectangularBendRadPass.c b/atintegrators/ExactRectangularBendRadPass.c index dff706fb9..66f2d9d61 100644 --- a/atintegrators/ExactRectangularBendRadPass.c +++ b/atintegrators/ExactRectangularBendRadPass.c @@ -176,11 +176,7 @@ ExportMode struct elem *trackFunction(const atElem *ElemData,struct elem *Elem, } /* Check energy */ - Energy = atEnergy(Param->energy, Energy); - if (Energy == 0) { - atError("Energy needs to be defined. Check lattice parameters or pass method options.\n"); - check_error(); - } + Energy = atEnergy(Param->energy, Energy); check_error(); Elem = (struct elem*)atMalloc(sizeof(struct elem)); Elem->Length=Length; @@ -209,7 +205,7 @@ ExportMode struct elem *trackFunction(const atElem *ElemData,struct elem *Elem, Elem->RApertures=RApertures; Elem->KickAngle=KickAngle; } - gamma = atGamma(Param->energy, Elem->Energy, Param->rest_energy); + gamma = atGamma(Param->energy, Elem->Energy, Param->rest_energy); check_error(); ExactRectangularBendRad(r_in, Elem->Length, Elem->BendingAngle, Elem->PolynomA, Elem->PolynomB, Elem->MaxOrder, Elem->NumIntSteps, Elem->EntranceAngle, Elem->ExitAngle, diff --git a/atintegrators/ExactSectorBendRadPass.c b/atintegrators/ExactSectorBendRadPass.c index e194b9438..d4ed0b06b 100644 --- a/atintegrators/ExactSectorBendRadPass.c +++ b/atintegrators/ExactSectorBendRadPass.c @@ -161,11 +161,7 @@ ExportMode struct elem *trackFunction(const atElem *ElemData,struct elem *Elem, } /* Check energy */ - Energy = atEnergy(Param->energy, Energy); - if (Energy == 0) { - atError("Energy needs to be defined. Check lattice parameters or pass method options.\n"); - check_error(); - } + Energy = atEnergy(Param->energy, Energy); check_error(); Elem = (struct elem*)atMalloc(sizeof(struct elem)); Elem->Length=Length; @@ -193,7 +189,7 @@ ExportMode struct elem *trackFunction(const atElem *ElemData,struct elem *Elem, Elem->KickAngle=KickAngle; } irho = Elem->BendingAngle/Elem->Length; - gamma = atGamma(Param->energy, Elem->Energy, Param->rest_energy); + gamma = atGamma(Param->energy, Elem->Energy, Param->rest_energy); check_error(); ExactSectorBendRad(r_in, Elem->Length, irho, Elem->PolynomA, Elem->PolynomB, diff --git a/atintegrators/GWigSymplecticPass.c b/atintegrators/GWigSymplecticPass.c index dcc40b619..d8501bdb4 100644 --- a/atintegrators/GWigSymplecticPass.c +++ b/atintegrators/GWigSymplecticPass.c @@ -145,11 +145,7 @@ ExportMode struct elem *trackFunction(const atElem *ElemData,struct elem *Elem, T2 = atGetOptionalDoubleArray(ElemData, "T2"); check_error(); /* Check energy */ - Energy = atEnergy(Param->energy, Energy); - if (Energy == 0) { - atError("Energy needs to be defined. Check lattice parameters or pass method options.\n"); - check_error(); - } + Energy = atEnergy(Param->energy, Energy); check_error(); Elem = (struct elem*)atMalloc(sizeof(struct elem)); Elem->Energy=Energy; @@ -168,7 +164,7 @@ ExportMode struct elem *trackFunction(const atElem *ElemData,struct elem *Elem, Elem->T1=T1; Elem->T2=T2; } - gamma = atGamma(Param->energy, Elem->Energy, Param->rest_energy); + gamma = atGamma(Param->energy, Elem->Energy, Param->rest_energy); check_error(); GWigSymplecticPass(r_in, gamma, Elem->Length, Elem->Lw, Elem->Bmax, Elem->Nstep, Elem->Nmeth, Elem->NHharm, Elem->NVharm, diff --git a/atintegrators/GWigSymplecticRadPass.c b/atintegrators/GWigSymplecticRadPass.c index 577389640..8df2d7c03 100644 --- a/atintegrators/GWigSymplecticRadPass.c +++ b/atintegrators/GWigSymplecticRadPass.c @@ -271,11 +271,7 @@ ExportMode struct elem *trackFunction(const atElem *ElemData,struct elem *Elem, T2 = atGetOptionalDoubleArray(ElemData, "T2"); check_error(); /* Check energy */ - Energy = atEnergy(Param->energy, Energy); - if (Energy == 0) { - atError("Energy needs to be defined. Check lattice parameters or pass method options.\n"); - check_error(); - } + Energy = atEnergy(Param->energy, Energy); check_error(); Elem = (struct elem*)atMalloc(sizeof(struct elem)); Elem->Energy=Energy; @@ -294,7 +290,7 @@ ExportMode struct elem *trackFunction(const atElem *ElemData,struct elem *Elem, Elem->T1=T1; Elem->T2=T2; } - gamma = atGamma(Param->energy, Elem->Energy, Param->rest_energy); + gamma = atGamma(Param->energy, Elem->Energy, Param->rest_energy); check_error(); GWigSymplecticRadPass(r_in, gamma, Elem->Length, Elem->Lw, Elem->Bmax, Elem->Nstep, Elem->Nmeth, Elem->NHharm, Elem->NVharm, diff --git a/atintegrators/RFCavityPass.c b/atintegrators/RFCavityPass.c index f12e9fe7e..8a365432b 100755 --- a/atintegrators/RFCavityPass.c +++ b/atintegrators/RFCavityPass.c @@ -49,11 +49,7 @@ ExportMode struct elem *trackFunction(const atElem *ElemData,struct elem *Elem, PhaseLag=atGetOptionalDouble(ElemData,"PhaseLag",0); check_error(); /* Check energy */ - Energy = atEnergy(Param->energy, Energy); - if (Energy == 0) { - atError("Energy needs to be defined. Check lattice parameters or pass method options.\n"); - check_error(); - } + Energy = atEnergy(Param->energy, Energy); check_error(); Elem = (struct elem*)atMalloc(sizeof(struct elem)); Elem->Length=Length; @@ -64,7 +60,7 @@ ExportMode struct elem *trackFunction(const atElem *ElemData,struct elem *Elem, Elem->TimeLag=TimeLag; Elem->PhaseLag=PhaseLag; } - energy = atEnergy(energy, Elem->Energy); + energy = atEnergy(energy, Elem->Energy); check_error(); RFCavityPass(r_in, Elem->Length, Elem->Voltage/energy, Elem->Frequency, Elem->HarmNumber, Elem->TimeLag, Elem->PhaseLag, nturn, T0, num_particles); diff --git a/atintegrators/StrMPoleSymplectic4QuantPass.c b/atintegrators/StrMPoleSymplectic4QuantPass.c index 00b1eab6c..d2bcbe79b 100644 --- a/atintegrators/StrMPoleSymplectic4QuantPass.c +++ b/atintegrators/StrMPoleSymplectic4QuantPass.c @@ -185,11 +185,7 @@ ExportMode struct elem *trackFunction(const atElem *ElemData,struct elem *Elem, KickAngle=atGetOptionalDoubleArray(ElemData,"KickAngle"); check_error(); /* Check energy */ - Energy = atEnergy(Param->energy, Energy); - if (Energy == 0) { - atError("Energy needs to be defined. Check lattice parameters or pass method options.\n"); - check_error(); - } + Energy = atEnergy(Param->energy, Energy); check_error(); Elem = (struct elem*)atMalloc(sizeof(struct elem)); Elem->Length=Length; @@ -212,7 +208,7 @@ ExportMode struct elem *trackFunction(const atElem *ElemData,struct elem *Elem, Elem->RApertures=RApertures; Elem->KickAngle=KickAngle; } - energy = atEnergy(Param->energy, Elem->Energy); + energy = atEnergy(Param->energy, Elem->Energy); check_error(); StrMPoleSymplectic4QuantPass(r_in, Elem->Length, Elem->PolynomA, Elem->PolynomB, Elem->MaxOrder, Elem->NumIntSteps, diff --git a/atintegrators/StrMPoleSymplectic4RadPass.c b/atintegrators/StrMPoleSymplectic4RadPass.c index c292829d4..546ad8b78 100644 --- a/atintegrators/StrMPoleSymplectic4RadPass.c +++ b/atintegrators/StrMPoleSymplectic4RadPass.c @@ -145,11 +145,7 @@ ExportMode struct elem *trackFunction(const atElem *ElemData,struct elem *Elem, KickAngle=atGetOptionalDoubleArray(ElemData,"KickAngle"); check_error(); /* Check energy */ - Energy = atEnergy(Param->energy, Energy); - if (Energy == 0) { - atError("Energy needs to be defined. Check lattice parameters or pass method options.\n"); - check_error(); - } + Energy = atEnergy(Param->energy, Energy); check_error(); Elem = (struct elem*)atMalloc(sizeof(struct elem)); Elem->Length=Length; @@ -172,7 +168,7 @@ ExportMode struct elem *trackFunction(const atElem *ElemData,struct elem *Elem, Elem->RApertures=RApertures; Elem->KickAngle=KickAngle; } - gamma = atGamma(Param->energy, Elem->Energy, Param->rest_energy); + gamma = atGamma(Param->energy, Elem->Energy, Param->rest_energy); check_error(); StrMPoleSymplectic4RadPass(r_in, Elem->Length, Elem->PolynomA, Elem->PolynomB, Elem->MaxOrder, Elem->NumIntSteps, diff --git a/atintegrators/atelem.c b/atintegrators/atelem.c index 8b597af37..71d323898 100755 --- a/atintegrators/atelem.c +++ b/atintegrators/atelem.c @@ -76,26 +76,17 @@ typedef mxArray atElem; double atEnergy(double ringenergy, double elemenergy) { - if (ringenergy!=0.0) + if (ringenergy > 0.0) return ringenergy; else - if (elemenergy!=0.0) + if (elemenergy > 0.0) return elemenergy; else { - atError("Energy not defined."); + atError("Energy must be positive. Check lattice or passmethod parameters."); return 0.0; /* Never reached but makes the compiler happy */ } } -double atGamma(double ringenergy, double elemenergy, double rest_energy) -{ - double energy = atEnergy(ringenergy, elemenergy); - if (rest_energy == 0.0) - return 1.0E-9 * energy / __E0; - else - return energy / rest_energy; -} - static mxArray *get_field(const mxArray *pm, const char *fieldname) { mxArray *field; @@ -206,11 +197,19 @@ typedef PyObject atElem; #define atError(...) PyErr_Format(PyExc_ValueError, __VA_ARGS__) #define atWarning(...) PyErr_WarnFormat(PyExc_RuntimeWarning, 0, __VA_ARGS__) #define atPrintf(...) PySys_WriteStdout(__VA_ARGS__) -#define atEnergy(ringenergy,elemenergy) (ringenergy) -#define atGamma(ringenergy,elemenergy,rest_energy) ((rest_energy) == 0.0 ? 1.0E-9*(ringenergy)/__E0 : (ringenergy)/(rest_energy)) static int array_imported = 0; +double atEnergy(double ringenergy, double elemenergy) +{ + if (ringenergy > 0.0) + return ringenergy; + else { + atError("Energy must be positive. Check lattice or set the track() keyword argument."); + return 0.0; /* Never reached but makes the compiler happy */ + } +} + static NUMPY_IMPORT_ARRAY_TYPE init_numpy(void) { import_array(); @@ -362,6 +361,15 @@ static double *atGetOptionalDoubleArray(const PyObject *element, char *name) #define C_LINK #endif +double atGamma(double ringenergy, double elemenergy, double rest_energy) +{ + double energy = atEnergy(ringenergy, elemenergy); + if (rest_energy == 0.0) + return 1.0E-9 * energy / __E0; + else + return energy / rest_energy; +} + C_LINK ExportMode struct elem *trackFunction(const atElem *ElemData, struct elem *Elem, double *r_in, int num_particles, struct parameters *Param); diff --git a/atintegrators/ringproperties.c b/atintegrators/ringproperties.c index baabef3db..47a1aec84 100644 --- a/atintegrators/ringproperties.c +++ b/atintegrators/ringproperties.c @@ -28,7 +28,11 @@ static void atProperties(const mxArray *opts, double *energy, double *rest_energ field = mxGetField(opts, 0, "Energy"); if (field) { double ener = mxGetScalar(field); - if (ener != 0.0) *energy = ener; + if (ener > 0.0) { + *energy = ener; + }else{ + mexErrMsgIdAndTxt("Atpass:WrongParameter", "Energy must be positive. Check lattice or passmethod parameters."); + } atParticle(opts, rest_energy, charge); } }