Skip to content
Snippets Groups Projects
Commit 6f93e245 authored by zhang's avatar zhang
Browse files

08/04/2011

Add the interface to read .fe and .fe files, and also to read parameters for orbit corrections.
parent 67c2b293
No related branches found
No related tags found
No related merge requests found
......@@ -18,23 +18,19 @@ extern bool freq_map;
//****************************************************************************************
int main(int argc, char *argv[]) {
/* for time handling */
uint32_t start, stop;
/*set the random value for random generator*/
const long seed = 1121; //the default random seed number
iniranf(seed); //initialize the seed
setrancut(2.0); //default value of the normal cut for the normal distribution
// turn on globval.Cavity_on and globval.radiation to get proper synchr radiation damping
// IDs accounted too if: wiggler model and symplectic integrator (method = 1)
globval.H_exact = false;
/*The following values are set in the Read_lattice( ) in soleilcommon.cc*/
// globval.quad_fringe = false; // quadrupole fringe field
// globval.radiation = false; // synchrotron radiation
// globval.emittance = false; // emittance
// globval.pathlength = false;
// globval.bpm = 0;
/* parameters to read the user input script .prm */
long i=0L; //initilize the for loop to read command string
char CommandStr[max_str];
double nux = 0, nuy = 0, ksix = 0, ksiy = 0;
......@@ -50,10 +46,6 @@ int main(int argc, char *argv[]) {
UserCommand UserCommandFlag[500];
// for time handling
uint32_t start, stop;
/************************************************************************
read in files and flags
*************************************************************************/
......@@ -66,16 +58,47 @@ int main(int argc, char *argv[]) {
exit_(1);
}
/* get the family index of the special elements, prepare for printglob()*/
if(strcmp(bpm_name,"")==0)
globval.bpm = 0;
else
globval.bpm = ElemIndex(bpm_name);
if(strcmp(skew_quad_name,"")==0)
globval.qt = 0;
else
globval.qt = ElemIndex(skew_quad_name);
if(strcmp(hcorr_name,"")==0)
globval.hcorr = 0;
else
globval.hcorr = ElemIndex(hcorr_name);
if(strcmp(vcorr_name,"")==0)
globval.vcorr = 0;
else
globval.vcorr = ElemIndex(vcorr_name);
if(strcmp(gs_name,"")==0)
globval.gs = 0;
else
globval.gs = ElemIndex(gs_name);
if(strcmp(ge_name,"")==0)
globval.ge = 0;
else
globval.ge = ElemIndex(ge_name);
// globval.g = ElemIndex("g"); /* get family index of girder*/
/* print the summary of the element in lattice */
printglob();
/************************************************************************
print files, very important file for debug
*************************************************************************/
//print flat file with all the design values of the lattice,
prtmfile("flat_file.dat");
// print close orbit to a file
// print location, twiss parameters and close orbit at all elements position to a file
getcod(dP, lastpos);
prt_cod("cod.out", globval.bpm, true);
//get_matching_params_scl(); // get tunes and beta functions at entrance
// compute up to 3rd order momentum compact factor
get_alphac2();
......@@ -85,28 +108,18 @@ int main(int argc, char *argv[]) {
// Flag factory
/*********************************************************************
Flag factory
*********************************************************************/
for(i=0; i<=CommandNo; i++){//read user defined command by sequence
//assign user defined command
strcpy(CommandStr,UserCommandFlag[i].CommandStr);
//print the twiss paramters in a file defined by the name
if(strcmp(CommandStr,"PrintTwissFlag") == 0) {
cout << "\n";
cout << "print the twiss parameters to file: "<< twiss_file << "\n";
printlatt(twiss_file);
}
//print the close orbit
else if(strcmp(CommandStr,"PrintCODFlag") == 0) {
cout << "\n";
cout << "print the close orbit to file: "<< cod_file << "\n";
getcod(dP, lastpos);
prt_cod(cod_file, globval.bpm, true);
}
//turn on flag for quadrupole fringe field
else if(strcmp(CommandStr,"QuadFringeOnFlag") == 0) {
if(strcmp(CommandStr,"QuadFringeOnFlag") == 0) {
globval.quad_fringe = true;
cout << "\n";
cout << "globval.quad_fringe is " << globval.quad_fringe << "\n";
......@@ -124,11 +137,159 @@ int main(int argc, char *argv[]) {
// Chamber factory
else if(strcmp(CommandStr,"ReadChamberFlag") == 0) {
ReadCh(chamber_file); /* read vacuum chamber from a file "Apertures.dat" , soleil version*/
ReadCh(UserCommandFlag[i].chamber_file); /* read vacuum chamber from a file "Apertures.dat" , soleil version*/
PrintCh(); // print chamber into chamber.out
}
// read the misalignment errors to the elements, then do COD correction
// using SVD method.
// Based on the function error_and_correction() in nsls-ii_lib_templ.h
// else if(strcmp(ReadaefileFlag, "") != 0){
else if (strcmp(CommandStr,"ReadaefileFlag") == 0) {
// ***** Apply corrections and output flatfile for n_stat sets of random #'s
bool cod;
int k;
FILE *hOrbitFile, *vOrbitFile ;
int hcorrIdx[nCOR], vcorrIdx[nCOR]; //list of corr for orbit correction
//initialize the corrector list
for ( k = 0; k < nCOR; k++){
hcorrIdx[k] = -1;
vcorrIdx[k] = -1;
}
//Get response matrix between bpm and correctors, and then print the SVD setting to the files
if (n_orbit!=0 || n_scale!=0) {
// select correctors to be used
readCorrectorList(hcorr_file, vcorr_file, hcorrIdx, vcorrIdx);
fprintf(stdout, "\n\nSVD correction setting:\n");
fprintf(stdout, "H-plane %d singular values:\n", nwh);
fprintf(stdout, "V-plane %d singular values:\n\n",nwv);
// compute beam response matrix
printf("\n");
printf("Computing beam response matrix\n");
//get the response matrix between bpm and correctors
gcmats(globval.bpm, globval.hcorr, 1, hcorrIdx);
gcmats(globval.bpm, globval.vcorr, 2, vcorrIdx);
/* gcmat(globval.bpm, globval.hcorr, 1);
gcmat(globval.bpm, globval.vcorr, 2);*/
// print response matrices to files 'svdh.out' and file 'svdv.out'
prt_gcmat(globval.bpm, globval.hcorr, 1);
prt_gcmat(globval.bpm, globval.vcorr, 2);
}
//print the statistics of orbit in file 'OrbScanFile.out'
OrbScanFile = file_write(OrbScanFileName);
//write files with orbits at all element locations
hOrbitFile = file_write(hOrbitFileName);
vOrbitFile = file_write(vOrbitFileName);
fprintf(hOrbitFile, "# First line: s-location (m) \n");
fprintf(hOrbitFile, "# After orbit correction: Horizontal closed orbit at all element locations (with %3d BPMs) at different loop\n", GetnKid(globval.bpm));
fprintf(vOrbitFile, "# First line s-location (m) \n");
fprintf(vOrbitFile, "# After orbit correction: Vertical closed orbit at all element locations (with %3d BPMs) at different loop\n", GetnKid(globval.bpm));
for (k = 0; k < globval.Cell_nLoc; k++){
fprintf(hOrbitFile, "% 9.3e ", Cell[k].S);
fprintf(vOrbitFile, "% 9.3e ", Cell[k].S);
} // end for
fprintf(hOrbitFile, "\n");
fprintf(vOrbitFile, "\n");
for (k = 1; k <= n_stat; k++) {// loop for n_stat sets of errors
if (n_orbit!=0 || n_scale!=0) {
cod =
CorrectCOD_Ns(hOrbitFile, vOrbitFile, UserCommandFlag[i].ae_file,
n_orbit,n_scale,k,nwh,nwv, hcorrIdx, vcorrIdx);
/* cod = CorrectCOD_N(ae_file, n_orbit, n_scale, k);*/
printf("\n");
if (cod){
/* printf("done with orbit correction, now do coupling",
" correction plus vert. disp\n");*/
if(n_orbit == 0)
printf("iter # %3d n_obit = 0, no orbit correction \n",k);
else
printf("iter # %3d Orbit correction succeeded\n", k);
}
else
chk_cod(cod, "iter # %3d error_and_correction");
}
// Ring_GetTwiss(chroma, dp);
Ring_GetTwiss(true, 0.0);
// print flat lattice
// sprintf(mfile_name, "flat_file.%03d.dat",k);
// prtmfile(mfile_name);
}
prt_cod("corr_after.out", globval.bpm, true);
// close file giving orbit at BPM location
fclose(hOrbitFile);
fclose(vOrbitFile);
fclose(OrbScanFile);
}
// set the field error into the lattice
// The coresponding field error is replaced by the new value.
// This feature is generatic, works for all lattice
else if (strcmp(CommandStr,"ReadfefileFlag") == 0) {
fprintf(stdout,"\n Read field error from fe_file: \n");
LoadFieldErrs(UserCommandFlag[i].fe_file, true, 1.0, true, 1);
Ring_GetTwiss(true, 0.0);
prtmfile("flat_file_fefile.dat");
}
// read multipole error from a file; specfic for soleil lattice
else if(strcmp(CommandStr,"ReadMultipoleFlag") == 0) {
fprintf(stdout,"\n Read Multipoles file for lattice with thick sextupoles, specific for SOLEIL lattice: \n");
ReadFieldErr(multipole_file);
//first print the full lattice with error as a flat file
prtmfile("flat_file_errmultipole.dat"); // writes flat file with all element errors /* very important file for debug*/
Ring_GetTwiss(chroma = true, 0.0); /* Compute and get Twiss parameters */
printglob();
}
//print the twiss paramters in a file defined by the name
else if(strcmp(CommandStr,"PrintTwissFlag") == 0) {
cout << "\n";
cout << "print the twiss parameters to file: "<< twiss_file << "\n";
printlatt(twiss_file);
}
//print the close orbit
else if(strcmp(CommandStr,"PrintCODFlag") == 0) {
cout << "\n";
cout << "print the close orbit to file: "<< cod_file << "\n";
getcod(dP, lastpos);
prt_cod(cod_file, globval.bpm, true);
}
//print the girder
// else if(strcmp(CommandStr,"PrintGirderFlag") == 0) {
// cout << "\n";
// cout << "print the information of girder to file: "<< girder_file << "\n";
// getcod(dP, lastpos);
// prt_cod(cod_file, globval.bpm, true);
// }
// compute tunes by tracking (should be the same as by tps)
else if (strcmp(CommandStr,"TuneTracFlag") == 0) {
GetTuneTrac(1026L, 0.0, &nux, &nuy);
......@@ -282,16 +443,7 @@ int main(int argc, char *argv[]) {
printglob(); /* print parameter list */
}
//set multipoles in all magnets
// read multipole error from a file
else if(strcmp(CommandStr,"ReadMultipoleFlag") == 0) {
fprintf(stdout,"\n Read Multipoles file for lattice with thick sextupoles \n");
ReadFieldErr(multipole_file);
//first print the full lattice with error as a flat file
prtmfile("flat_file_errmultipole.dat"); // writes flat file with all element errors /* very important file for debug*/
Ring_GetTwiss(chroma = true, 0.0); /* Compute and get Twiss parameters */
printglob();
}
......@@ -515,7 +667,7 @@ int main(int argc, char *argv[]) {
// finally, write the momentum acceptance to file "mom_aper.out".
if (strcmp(CommandStr,"TousTrackFlag") == 0) {
globval.Aperture_on = true;
ReadCh(chamber_file);
ReadCh(UserCommandFlag[i].chamber_file);
// LoadApers("/home/simon/projects/src/lattice/Apertures.dat", 1, 1);
tau = Touschek(Qb, globval.delta_RF, false, globval.eps[X_],
globval.eps[Y_], sigma_delta, sigma_s, n_turns, true, sum_delta,
......@@ -536,6 +688,7 @@ int main(int argc, char *argv[]) {
}//end of looking for user defined flag
return 0;
}//end of main()
......@@ -4,8 +4,19 @@
public:
char CommandStr[max_str]; // bool flag name
/* parameters */
/***** parameters *******/
//RFVoltFlag
double RFvolt; // RF voltage
//chamber file
char chamber_file[max_str];
// misalignment error file
char ae_file[max_str];
// field error file
char fe_file[max_str];
// FitTuneFlag ;
char qf[max_str],qd[max_str];
double targetnux, targetnuz;
......@@ -80,8 +91,6 @@
/* random rotation coupling error*/
err_seed=0L; err_rms=0.0;
/* momentum acceptance */
TrackDim[3] = '6D';
_MomentumAccFlag_istart=1L, _MomentumAccFlag_istop=108L,
......@@ -96,23 +105,37 @@
_Phase_Dim[3]='4D';
_Phase_Damping = false;
/* fit tunes for full quadrupole*/
targetnux = 0.0, targetnuz = 0.0;
/* fit charomaticities*/
targetksix = 0.0, targetksiz = 0.0;
};
};
// file names
/***** file names************/
//files with multipole errors
extern char fic_hcorr[max_str],fic_vcorr[max_str], fic_skew[max_str];
extern char multipole_file[max_str];
extern char chamber_file[max_str];
extern char twiss_file[max_str];
extern char cod_file[max_str];
extern char girder_file[max_str];
//files with the status of hcorr/vcorr status, to choose which correctors are used for orbit correction
extern char hcorr_file[max_str], vcorr_file[max_str];
// extern char fe_file[max_str]; //the same as multipole_file[max_str]?????
//COD correction
extern int nwh, nwv;
extern char hcorr_name[max_str], vcorr_name[max_str];
extern char skew_quad_name[max_str], bpm_name[max_str];
extern char gs_name[max_str], ge_name[max_str];
// function
void read_script(const char *param_file_name, bool rd_lat,long& CommNo, UserCommand UserCommandFlag[]);
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment